[
  {
    "path": ".gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\n#env/\n#bin/\nbuild/\ndevelop-eggs/\ndist/\neggs/\nlib64/\nparts/\nsdist/\nvar/\n*.egg-info/\n.installed.cfg\n*.egg\n#test\ntemp/\noutput/\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.coverage\nnosetests.xml\ncoverage.xml\n\n# Translations\n*.mo\n\n# Mr Developer\n.mr.developer.cfg\n.project\n.pydevproject\n\n# Rope\n.ropeproject\n\n# Django stuff:\n*.log\n*.pot\n\n# Sphinx documentation\n#docs/_build/\n\n# CTag\n.tags*\n\n# mac\n.DS_Store\n\n#pycharm\n.idea/\n\n#policy\nscanpolicy/\n\n#plugins\nplugins/"
  },
  {
    "path": "README.md",
    "content": "![](https://github.com/blackye/lalascan/blob/master/logo.png)\r\nWhat's lalascan?\r\n===================================  \r\nWeb vulnerability scanner framework\r\n\r\nBasic usage\r\n===================================  \r\n\r\n```\r\n _          _\r\n| |    __ _| | __ _ ___  ___ __ _ _ __\r\n| |   / _` | |/ _` / __|/ __/ _` | '_ \\\r\n| |__| (_| | | (_| \\__ \\ (_| (_| | | | |\r\n|_____\\__,_|_|\\__,_|___/\\___\\__,_|_| |_|\r\n\r\nLalaScan WebApplication vul scanner!\r\nusage:\r\n\r\noptional arguments:\r\n  -h, --help            Show help message and exit\r\n  --version             Show program's version number and exit\r\n\r\n[ Targets ]:\r\n  -u URL, --url URL     Target URL (e.g. \"http://www.lalascan.com/\")\r\n  -t PROCESS_NUM, --threads PROCESS_NUM\r\n                        max number of process, default cpu number\r\n\r\n[ Resource Found ]:\r\n  -S, --spider          Enable user Spider\r\n\r\n[ Plugin Option ]:\r\n  -e PLUGIN, --enable-plugin PLUGIN\r\n                        enable a plugin\r\n\r\n[ Request Option ]:\r\n  --data POST DATA      HTTP Post data\r\n  --cookie COOKIE       HTTP Cookie header value\r\n  --referer REFERER     HTTP Referer header value\r\n  --user-agent AGENT    HTTP User-Agent header value\r\n  --random-agent        Use randomly selected HTTP User-Agent header value\r\n  --proxy PROXY         Use a proxy to connect to the target URL\r\n  --timeout TIMEOUT     Seconds to wait before timeout connection (default 30)\r\n  --retry RETRY         Time out retrials times.\r\n\r\n```\r\n\r\n###正在开发中........\r\n\r\n"
  },
  {
    "path": "bin/__init__.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n"
  },
  {
    "path": "cache/__init__.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n"
  },
  {
    "path": "cache/leakinfo.json",
    "content": "{\"sqli\":\n      {\"risk_level\": 4,\n       \"description\": \"\\u6076\\u610f\\u7528\\u6237\\u53ef\\u4ee5\\u5229\\u7528\\u8be5\\u6f0f\\u6d1e\\u6267\\u884c\\u4efb\\u610fSQL\\u8bed\\u53e5,\\u53ef\\u4ee5\\u9020\\u6210\\u5982\\u4e0b\\u5371\\u5bb3\\uff1a\\u672a\\u7ecf\\u8fc7\\u6388\\u6743\\u64cd\\u4f5c\\u6570\\u636e\\u5e93\\u4e2d\\u7684\\u6570\\u636e,\\u6076\\u610f\\u7be1\\u6539\\u6570\\u636e\\u5e93\\u5185\\u5bb9,\\u6dfb\\u52a0\\u7cfb\\u7edf\\u5e10\\u53f7\\u6216\\u6570\\u636e\\u5e93\\u5e10\\u53f7\\uff0c\\u8fdb\\u884c\\u63d0\\u6743\\uff0c\\u8fdb\\u800c\\u5bfc\\u81f4\\u7f51\\u7ad9\\u670d\\u52a1\\u5668\\u88ab\\u5165\\u4fb5\",\n        \"leak_name\": \"sqli\",\n        \"fix_content\": \"\",\n        \"id\": 1,\n        \"spt_id\": 1,\n        \"leak_name_cn\": \"SQL\\u6ce8\\u5165\"\n      },\n  \"any_file_read\":\n      {\"risk_level\": 4,\n        \"description\": \"\\u6cc4\\u6f0f\\u670d\\u52a1\\u5668\\u4e0a\\u7684\\u4efb\\u610f\\u6587\\u4ef6\\u5185\\u5bb9\\uff0c\\u66b4\\u9732web\\u670d\\u52a1\\u5668\\u7684\\u6587\\u4ef6\\u7cfb\\u7edf\\u7ed3\\u6784\\u548c\\u5185\\u5bb9\\uff0c\\u53ef\\u5bfc\\u81f4\\u7f51\\u7ad9\\u670d\\u52a1\\u5668\\u88ab\\u5165\\u4fb5\",\n        \"leak_name\": \"any_file_read\",\n        \"fix_content\": \"\",\n        \"id\": 4,\n        \"spt_id\": 1,\n        \"leak_name_cn\": \"\\u4efb\\u610f\\u6587\\u4ef6\\u8bfb\\u53d6\"\n      },\n  \"reflect_xss\":\n      {\"risk_level\": 3,\n        \"description\": \"\\u5ba2\\u53ef\\u4ee5\\u5229\\u7528\\u8be5\\u6f0f\\u6d1e\\u6267\\u884c\\u4efb\\u610fHTML/JS\\u4ee3\\u7801\\uff0c\\u53ef\\u5bfc\\u81f4\\u5982\\u4e0b\\u5371\\u5bb3\\uff1a\\u7a83\\u53d6\\u7528\\u6237cookie\\u4fe1\\u606f\\uff0c\\u4f20\\u64ad\\u8815\\u866b\\u7b49\",\n        \"leak_name\": \"reflect_xss\",\n        \"fix_content\": \"\",\n        \"id\": 2,\n        \"spt_id\" : 1,\n        \"leak_name_cn\": \"\\u53cd\\u5c04-XSS\"\n      },\n  \"dom_xss\":\n      {\"risk_level\": 3,\n        \"description\": \"\\u5ba2\\u53ef\\u4ee5\\u5229\\u7528\\u8be5\\u6f0f\\u6d1e\\u6267\\u884c\\u4efb\\u610fHTML/JS\\u4ee3\\u7801\\uff0c\\u53ef\\u5bfc\\u81f4\\u5982\\u4e0b\\u5371\\u5bb3\\uff1a\\u7a83\\u53d6\\u7528\\u6237cookie\\u4fe1\\u606f\\uff0c\\u4f20\\u64ad\\u8815\\u866b\\u7b49\",\n        \"leak_name\": \"dom_xss\",\n        \"fix_content\": \"\",\n        \"id\": 3,\n        \"spt_id\" : 1,\n        \"leak_name_cn\": \"DOM-XSS\"\n      },\n  \"cmd_inject\":\n      {\"risk_level\": 4,\n        \"description\": \"\\u6267\\u884c\\u4efb\\u610f\\u7cfb\\u7edf\\u547d\\u4ee4,\\u4f8b\\u5982systerm(),eval(),exec()\\u7b49\\u547d\\u4ee4\\uff0c\\u53ef\\u4ee5\\u5bfc\\u81f4\\u7f51\\u7ad9\\u670d\\u52a1\\u5668\\u88ab\\u5165\\u4fb5\",\n        \"leak_name\": \"cmd_inject\",\n        \"fix_content\": \"\",\n        \"id\": 5,\n        \"spt_id\" : 1,\n        \"leak_name_cn\": \"\\u547d\\u4ee4\\u6ce8\\u5165\"}\n}"
  },
  {
    "path": "conf.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nimport os\nimport sys\n\nimport sys\n\n\ndirname_path_func = os.path.dirname\nabspath_path_func = os.path.abspath\njoin_path_func    = os.path.join\n\nBASEDIR = os.path.dirname(__file__)\n\nLIBDIR = BASEDIR + '/lib'\nPLUGINDIR = BASEDIR + '/plugins'\nCACHEDIR = BASEDIR + '/cache'\nCACHELOG = CACHEDIR + '/scanlog'\n\n# system path\nif BASEDIR not in sys.path:\n\tsys.path.append(BASEDIR)\nif LIBDIR not in sys.path:\n\tsys.path.append(LIBDIR)\nif PLUGINDIR not in sys.path:\n\tsys.path.append(PLUGINDIR)\n\n#mysql config\nDB_MYSQL_HOST = 'localhost'\nDB_MYSQL_USER = 'root'\nDB_MYSQL_PWD = ''\nDB_MYSQL_PORT = 3306\nDB_MYSQL_DATABASE = 'lalascan'\n\n#webvul leakinfo\nLEAK_JSON_FILE = 'leakinfo.json'"
  },
  {
    "path": "lalascan/__init__.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n"
  },
  {
    "path": "lalascan/api/__init__.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n"
  },
  {
    "path": "lalascan/api/exception.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nException Base class\n\"\"\"\n\n__all__ = [\"LalascanBaseException\",\n           \"LalascanDataException\",\n           \"LalascanSystemException\",\n           \"LalascanThreadException\",\n           \"LalascanNetworkException\",\n           \"LalascanNetworkOutOfScope\",\n           \"LalascanNotImplementedError\",\n           \"LalascanAttributeError\",\n           \"LalascanTypeError\",\n           \"LalascanValueError\",\n           \"LalascanFileNotFoundException\"]\n\n\n\nclass LalascanBaseException(Exception):\n    pass\n\nclass LalascanDataException(LalascanBaseException):\n    pass\n\nclass LalascanSystemException(LalascanBaseException):\n    pass\n\nclass LalascanThreadException(LalascanBaseException):\n    pass\n\nclass LalascanNetworkException(LalascanBaseException):\n    \"\"\"\n    Network connection errors.\n    \"\"\"\n    pass\n\n#------------------------------------------------------------------------------\nclass LalascanNetworkOutOfScope(LalascanNetworkException):\n    \"\"\"\n    Resource is out of audit scope.\n    \"\"\"\n    pass\n\n\nclass LalascanNotImplementedError(NotImplementedError):\n    pass\n\nclass LalascanAttributeError(AttributeError):\n    pass\n\nclass LalascanTypeError(TypeError):\n    pass\n\nclass LalascanValueError(ValueError):\n    pass\n\nclass LalascanFileNotFoundException(LalascanBaseException):\n    pass"
  },
  {
    "path": "lalascan/api/option.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nfrom lalascan.models.auditdb import AuditMysqlDB\nfrom lalascan.utils.mytime import MyTime\n\nfrom conf import CACHEDIR, LEAK_JSON_FILE, join_path_func\nimport json\nimport copy\n\ndef generate_leak_info():\n    with AuditMysqlDB() as auditdb:\n        leak_json = {}\n        all_leak_data = auditdb.get_alldata(audit_table = \"webvul_leak_info\")\n        for _ in all_leak_data:\n            s = copy.copy(_).pop('leak_name')\n            leak_json[s] = _\n        with open(join_path_func(CACHEDIR, LEAK_JSON_FILE), 'w') as f:\n            f.write(json.dumps(leak_json))\n\n\ndef generate_vul_policy():\n    with AuditMysqlDB() as auditdb:\n        pass\n\ndef _sava_policy2db():\n    with AuditMysqlDB() as auditdb:\n        from scanpolicy.policy import ALL_LIST\n        for _ in ALL_LIST:\n           test_case_module = \"from scanpolicy.policy import %s\" % _\n           exec test_case_module\n           try:\n               module = eval(_)\n               for test_case in module:\n                   test_case.pop('case_id')\n                   new_test_case = {}\n                   new_test_case['spt_id'] = 1\n                   new_test_case['sli_id'] = 2\n                   new_test_case['policy_name'] = _.replace('_detect_test_cases', '')\n                   new_test_case['content'] = str(test_case)\n                   new_test_case['insert_time'] = MyTime.get_current_datetime()\n                   new_test_case['update_time'] = MyTime.get_current_datetime()\n\n                   auditdb().insert_by_dict('scan_leak_policy', new_test_case)\n\n           except Exception,e:\n               print str(e)\n               print 'error'"
  },
  {
    "path": "lalascan/api/proxycrawl.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\n"
  },
  {
    "path": "lalascan/cache/__init__.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n"
  },
  {
    "path": "lalascan/data/__init__.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\n__all__ = [\n\n    # Base class for all data objects.\n    \"Data\",\n]\n\n\n#------------------------------------------------------------------------------\nclass Data(object):\n    \"\"\"\n    Base class for all data entities.\n    This is the common interface for Information, Resource and Vulnerability.\n    \"\"\"\n    #--------------------------------------------------------------------------\n    # Data types\n\n    TYPE_UNKNOWN = 0      # not a real type! only used in get_accepted_types()\n\n    TYPE_INFORMATION   = 1\n    TYPE_VULNERABILITY = 2\n    TYPE_RESOURCE      = 3\n\n    data_type = TYPE_UNKNOWN\n\n\n    #--------------------------------------------------------------------------\n    def __init__(self):\n       pass\n\n\n    def is_instance(self, clazz):\n        try:\n            data_type    = clazz.data_type\n            data_subtype = clazz.data_subtype\n        except AttributeError:\n            return False\n        return self.data_type    == data_type    and \\\n               self.data_subtype == data_subtype\n"
  },
  {
    "path": "lalascan/data/datatype.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nimport copy\nimport types\n\nfrom lalascan.api.exception import LalascanDataException\n\n\nclass AttribDict(dict):\n\n    \"\"\"\n    >>> foo = AttribDict()\n    >>> foo.bar = 1\n    >>> foo.bar\n    1\n    \"\"\"\n\n    def __init__(self, indict=None, attribute=None):\n        if indict is None:\n            indict = {}\n\n        # Set any attributes here - before initialisation\n        # these remain as normal attributes\n        self.attribute = attribute\n        dict.__init__(self, indict)\n        self.__initialised = True\n\n        # After initialisation, setting attributes\n        # is the same as setting an item\n\n    def __getattr__(self, item):\n        \"\"\"\n        Maps values to attributes\n        Only called if there *is NOT* an attribute with this name\n        \"\"\"\n\n        try:\n            return self.__getitem__(item)\n        except KeyError:\n            raise LalascanDataException(\"unable to access item '%s'\" % item)\n\n    def __setattr__(self, item, value):\n        \"\"\"\n        Maps attributes to values\n        Only if we are initialised\n        \"\"\"\n\n        # This test allows attributes to be set in the __init__ method\n        if \"_AttribDict__initialised\" not in self.__dict__:\n            return dict.__setattr__(self, item, value)\n\n        # Any normal attributes are handled normally\n        elif item in self.__dict__:\n            dict.__setattr__(self, item, value)\n\n        else:\n            self.__setitem__(item, value)\n\n    def __getstate__(self):\n        return self.__dict__\n\n    def __setstate__(self, dict):\n        self.__dict__ = dict\n\n    def __deepcopy__(self, memo):\n        retVal = self.__class__()\n        memo[id(self)] = retVal\n\n        for attr in dir(self):\n            if not attr.startswith('_'):\n                value = getattr(self, attr)\n                if not isinstance(value, (types.BuiltinFunctionType, types.FunctionType, types.MethodType)):\n                    setattr(retVal, attr, copy.deepcopy(value, memo))\n\n        for key, value in self.items():\n            retVal.__setitem__(key, copy.deepcopy(value, memo))\n\n        return retVal\n"
  },
  {
    "path": "lalascan/data/enum.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nclass CUSTOM_LOGGING:\n    SYSINFO = 9\n    SUCCESS = 8\n    ERROR = 7\n    WARNING = 6\n\n\nclass RISK_LEVEL:\n    HIGH   = u'High'\n    MIDDLE = u'Middle'\n    LOW    = u'Low'\n    INFO   = u'Info'"
  },
  {
    "path": "lalascan/data/http.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nHTTP requests and responses.\n\"\"\"\n\n__all__ = [\"HTTP_Request\", \"HTTP_Response\"]\n\nfrom lalascan.data.information import Capture\nfrom lalascan.utils.text_utils import to_utf8\nfrom lalascan.libs.net.web_utils import ParsedURL, generate_user_agent\nfrom lalascan.libs.core.globaldata import conf\n\nimport re\nimport httplib\n\n\n#------------------------------------------------------------------------------\nclass HTTP_Headers (object):\n    \"\"\"\n    HTTP headers.\n\n    Unlike other methods of storing HTTP headers in Python this class preserves\n    the original order of the headers, doesn't remove duplicated headers,\n    preserves the original case but still letting your access them in a\n    case-insensitive manner, and is read-only.\n\n    Also see: parse_headers\n    \"\"\"\n\n    # Also see: https://en.wikipedia.org/wiki/List_of_HTTP_header_fields\n\n\n    #--------------------------------------------------------------------------\n    def __init__(self, raw_headers):\n        \"\"\"\n        :param raw_headers: Raw headers to parse.\n        :type raw_headers: str\n        \"\"\"\n        self.__raw_headers = to_utf8(raw_headers)\n        self.__headers, self.__cache = self.parse_headers(raw_headers)\n\n\n    #--------------------------------------------------------------------------\n    @staticmethod\n    def from_items(items):\n        \"\"\"\n        Get HTTP headers in pre-parsed form.\n\n        This is useful for integrating with other libraries that have\n        already parsed the HTTP headers in their own way.\n\n        :param items: Iterable of key/value pairs.\n        :type items: iterable( tuple(str, str) )\n        \"\"\"\n\n        # Reconstruct the raw headers the best we can.\n        # reconstructed = [\n        #     \"%s: %s\" % (to_utf8(name),\n        #                 (to_utf8(value)\n        #                  if value.endswith(\"\\r\\n\")\n        #                  else value + \"\\r\\n\")\n        #                 )\n        #     for name, value in items\n        # ]\n\n        reconstructed = []\n\n        for name,value in items:\n            # because the cookie type is a dict\n            if name == 'Cookie':\n                value=\";\".join([\"%s=%s\" %\n                               (k,v) for k,v in value.items() ] )\n\n            if not value.endswith(\"\\r\\n\"):\n                value = value + \"\\r\\n\"\n\n            reconstructed.append(\"%s: %s\" %\n                             (to_utf8(name),to_utf8(value)))\n\n        reconstructed.append(\"\\r\\n\")\n        raw_headers = \"\".join(reconstructed)\n\n        # Return an HTTP_Headers object using the reconstructed raw headers.\n        return HTTP_Headers(raw_headers)\n\n\n    #--------------------------------------------------------------------------\n    @staticmethod\n    def parse_headers(raw_headers):\n        \"\"\"\n        Parse HTTP headers.\n\n        :param raw_headers: Raw headers to parse.\n        :type raw_headers: str\n\n        :returns: Parsed headers in original and simplified forms.\n        :rtype: tuple( tuple(tuple(str, str)), dict(str -> str) )\n        \"\"\"\n\n        # Split the headers into lines and parse each line.\n        original = []\n        parsed = {}\n        last_name = None\n        for line in to_utf8(raw_headers).split(\"\\r\\n\"):\n\n            # If we find an empty line, stop processing.\n            if not line:\n                break\n\n            # If the line begins with whitespace, it's a continuation.\n            if line[0] in \" \\t\":\n                if last_name is None:\n                    break                              # broken headers\n                line = line.strip()\n                parsed[last_name] += \" \" + line\n                item = original[-1]\n                item = (item[0], item[1] + \" \" + line)\n                original[-1] = item\n                continue                               # next line\n\n            # Split the name and value pairs.\n            name, value = line.split(\":\", 1)\n\n            # Strip the leading and trailing whitespace.\n            name  = name.strip()\n            value = value.strip()\n\n            # Convert the name to lowercase.\n            name_lower = name.lower()\n\n            # Remember the last name we've seen.\n            last_name = name_lower\n\n            # Add the headers to the parsed form.\n            # If the name already exists, merge the headers.\n            # If not, add a new one.\n            if name_lower in parsed:\n                parsed[name_lower] += \", \" + value\n            else:\n                parsed[name_lower] = value\n\n            # Add the headers to the original form.\n            original.append( (name, value) )\n\n        # Convert the original headers list into a tuple to make it\n        # read-only, then return the tuple and the dictionary.\n        return tuple(original), parsed\n\n\n    #--------------------------------------------------------------------------\n    def __str__(self):\n        return self.__raw_headers\n\n    #--------------------------------------------------------------------------\n    def get_headers(self):\n        return str(self.__raw_headers)\n\n    #--------------------------------------------------------------------------\n    def __repr__(self):\n        return \"<%s headers=%r>\" % (self.__class__.__name__, self.__headers)\n\n\n    #--------------------------------------------------------------------------\n    def to_tuple(self):\n        \"\"\"\n        Convert the headers to Python tuples of strings.\n\n        :returns: Headers.\n        :rtype: tuple( tuple(str, str) )\n        \"\"\"\n\n        # Immutable object, we can return it directly.\n        return self.__headers\n\n\n    #--------------------------------------------------------------------------\n    def to_dict(self):\n        \"\"\"\n        Convert the headers to a Python dictionary.\n\n        :returns: Headers.\n        :rtype: dict(str -> str)\n        \"\"\"\n\n        # Mutable object, we need to make a new one.\n        return dict(self.to_tuple())\n\n\n    #--------------------------------------------------------------------------\n    def __iter__(self):\n        \"\"\"\n        When iterated, whole header lines are returned.\n        To iterate header names and values use iterkeys(), itervalues()\n        or iteritems().\n\n        :returns: Iterator of header lines.\n        :rtype: iter(str)\n        \"\"\"\n        return (\"%s: %s\\r\\n\" % item for item in self.__headers)\n\n\n    #--------------------------------------------------------------------------\n    def iteritems(self):\n        \"\"\"\n        When iterating, the original case and order of the headers\n        is preserved. This means some headers may be repeated.\n\n        :returns: Iterator of header names and values.\n        :rtype: iter( tuple(str, str) )\n        \"\"\"\n        return self.__headers.__iter__()\n\n\n    #--------------------------------------------------------------------------\n    def iterkeys(self):\n        \"\"\"\n        When iterating, the original case and order of the headers\n        is preserved. This means some headers may be repeated.\n\n        :returns: Iterator of header names.\n        :rtype: iter(str)\n        \"\"\"\n        return (name for name, _ in self.__headers)\n\n\n    #--------------------------------------------------------------------------\n    def itervalues(self):\n        \"\"\"\n        When iterating, the original case and order of the headers\n        is preserved. This means some headers may be repeated.\n\n        :returns: Iterator of header values.\n        :rtype: iter(str)\n        \"\"\"\n        return (value for _, value in self.__headers)\n\n\n    #--------------------------------------------------------------------------\n    def __getitem__(self, key):\n        \"\"\"\n        The [] operator works both for index lookups and key lookups.\n\n        When provided with an index, the whole header line is returned.\n\n        When provided with a header name, the value is looked up.\n        Only the first header of that name is returned. Comparisons\n        are case-insensitive.\n\n        :param key: Index or header name.\n        :type key: int | str\n\n        :returns: Header line (for indices) or value (for names).\n        :rtype: str\n        \"\"\"\n        if type(key) in (int, long):\n            return \"%s: %s\\r\\n\" % self.__headers[key]\n        try:\n            key = key.lower()\n        except AttributeError:\n            raise TypeError(\"Expected str, got %s\" % type(key))\n        return self.__cache[key]\n\n\n    #--------------------------------------------------------------------------\n    def get(self, name, default = None):\n        \"\"\"\n        Get a header by name.\n\n        Comparisons are case-insensitive. When more than one header has\n        the requested name, only the first one is returned.\n\n        :param name: Header name.\n        :type name: str\n\n        :returns: Header value.\n        :rtype: str\n        \"\"\"\n        try:\n            name = to_utf8(name)\n            if \":\" in name:\n                name = name.split(\":\", 1)[0]\n            name = name.strip().lower()\n        except AttributeError:\n            raise TypeError(\"Expected str, got %s\" % type(name))\n        try:\n            return self.__cache[name]\n        except KeyError:\n            return default\n\n\n    #--------------------------------------------------------------------------\n    def __getslice__(self, start = None, end = None):\n        \"\"\"\n        When sliced, whole header lines are returned in a single string.\n\n        :param start: Start of the slice.\n        :type start: int | None\n\n        :param end: End of the slice.\n        :type end: int | None\n\n        :returns: The requested header lines merged into a single string.\n        :rtype: str\n        \"\"\"\n        return \"\".join(\n            \"%s: %s\\r\\n\" % item\n            for item in self.__headers[start:end]\n        )\n\n\n    #--------------------------------------------------------------------------\n    def has_key(self, name):\n        \"\"\"\n        Test the presence of a header.\n        Comparisons are case-insensitive.\n\n        :param name: Header name.\n        :type name: str\n\n        :returns: True if present, False otherwise.\n        :rtype: bool\n        \"\"\"\n        try:\n            name = to_utf8(name)\n            if \":\" in name:\n                name = name.split(\":\", 1)[0]\n            name = name.strip().lower()\n        except AttributeError:\n            raise TypeError(\"Expected str, got %s\" % type(name))\n        return name in self.__cache\n\n    # Alias.\n    __contains__ = has_key\n\n\n    #--------------------------------------------------------------------------\n    def items(self):\n        \"\"\"\n        The original case and order of the headers is preserved.\n        This means some headers may be repeated.\n\n        :returns: Header names and values.\n        :rtype: list( tuple(str, str) )\n        \"\"\"\n        return list(self.iteritems())\n\n\n    #--------------------------------------------------------------------------\n    def keys(self):\n        \"\"\"\n        The original case and order of the headers is preserved.\n        This means some headers may be repeated.\n\n        :returns: Header names.\n        :rtype: list(str)\n        \"\"\"\n        return list(self.iterkeys())\n\n\n    #--------------------------------------------------------------------------\n    def values(self):\n        \"\"\"\n        The original case and order of the headers is preserved.\n        This means some headers may be repeated.\n\n        :returns: Header values.\n        :rtype: list(str)\n        \"\"\"\n        return list(self.itervalues())\n\n\n#------------------------------------------------------------------------------\nclass HTTP_Request (Capture):\n    \"\"\"\n    HTTP request information.\n    \"\"\"\n\n    data_subtype = \"http_request\"\n\n\n    #\n    # TODO:\n    #   + Allow multipart file uploads.\n    #   + Parse and reconstruct requests as it's done with responses.\n    #     It may be useful one day, for example, for HTTP proxying.\n    #\n\n\n    # Default user agent string.\n    DEFAULT_USER_AGENT = \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36 luscan\"\n\n    # Default headers to use in HTTP requests.\n    DEFAULT_HEADERS = (\n        (\"Accept-Language\", \"en-US\"),\n        (\"Accept\", \"*/*\"),\n        (\"Cache-Control\", \"no-store\"),\n        (\"Pragma\", \"no-cache\"),\n        (\"Expires\", \"0\"),\n        (\"Connection\", \"Close\")\n    )\n\n\n    #--------------------------------------------------------------------------\n    def __init__(self, url, headers = None, post_data = None, method = None, protocol = \"HTTP\", version = \"1.1\", referer = None, user_agent = None):\n        \"\"\"\n        :param url: Absolute URL to connect to.\n        :type url: str\n\n        :param headers: HTTP headers, in raw or parsed form.\n            Defaults to DEFAULT_HEADERS.\n        :type headers: HTTP_Headers | dict(str -> str) | tuple( tuple(str, str) ) | str | None\n\n        :param post_data: Optional POST data.\n            If used, the Content-Type and Content-Length headers are populated automatically,\n            unless already present in \"headers\".\n        :type post_data: str | None\n\n        :param method: HTTP method.\n            Defaults to POST if post_data is used, or to GET if no post_data is used.\n        :type method: str\n\n        :param protocol: Protocol name.\n        :type protocol: str\n\n        :param version: Protocol version.\n        :type version: str\n\n        :param referer: Optional referer. Ignored if already present in \"headers\".\n        :type referer: str\n\n        :param user_agent: Optional user-agent string. Ignored if already present in \"headers\".\n            Defaults to DEFAULT_USER_AGENT.\n        :type user_agent: str | None\n        \"\"\"\n\n        # Default method.\n        if not method:\n            method = \"POST\" if post_data else \"GET\"\n\n        # HTTP method, protocol and version.\n        self.__method   = to_utf8(method.upper())      # Not sure about upper() here...\n        self.__protocol = to_utf8(protocol.upper())    # Not sure about upper() here...\n        self.__version  = to_utf8(version)\n\n        # POST data.\n        self.__post_data = post_data\n\n        # URL.\n        self.__parsed_url = ParsedURL(url)\n        self.__url = self.__parsed_url.url\n\n        # Cookie header value.\n        try:\n            if conf is not None and conf.has_key('cookie'):\n                cookie = conf.cookie\n            else:\n                cookie = None\n        except Exception:\n            cookie = None\n\n        # User-Agent header value.\n        if user_agent:\n            if user_agent.lower() == \"random\":\n                user_agent = generate_user_agent()\n            else:\n                user_agent = to_utf8(user_agent)\n        else:\n            user_agent = self.DEFAULT_USER_AGENT\n\n        # Referer header value.\n        if referer:\n            referer = to_utf8(referer)\n        else:\n            referer = None\n\n        # HTTP headers.\n        if headers is None:\n            headers = self.DEFAULT_HEADERS\n            if version == \"1.1\":\n                headers = ((\"Host\", self.__parsed_url.host),) + headers\n            if post_data:\n                headers = headers + ((\"Content-Type\", \"application/x-www-form-urlencoded\"),\n                                     (\"Content-Length\", str(len(post_data))))\n            if cookie:\n                headers = headers + ((\"Cookie\", cookie),)\n            if referer:\n                headers = headers + ((\"Referer\", referer),)\n            if user_agent:\n                headers = headers + ((\"User-Agent\", user_agent),)\n            headers = headers + ((\"Connection\" , \"close\"),)  #ADD By BlackYe. Deal Caused by NewConnectionError\n            headers = HTTP_Headers.from_items(headers)\n        elif not isinstance(headers, HTTP_Headers):\n            headers = to_utf8(headers)\n            if type(headers) == str:             # raw headers\n                headers = HTTP_Headers(headers)\n            elif hasattr(headers, \"items\"):      # dictionary\n                headers = HTTP_Headers.from_items(sorted(headers.items()))\n            else:                                # dictionary items\n                headers = HTTP_Headers.from_items(sorted(headers))\n            if cookie or referer or user_agent:\n                headers = headers.to_tuple()\n                if cookie and not any(x[0].lower() == \"cookie\" for x in headers):\n                    headers = headers + ((\"Cookie\", cookie),)\n                if referer and not any(x[0].lower() == \"referer\" for x in headers):\n                    headers = headers + ((\"Referer\", referer),)\n                if user_agent and not any(x[0].lower() == \"user-agent\" for x in headers):\n                    headers = headers + ((\"User-Agent\", user_agent),)\n                headers = HTTP_Headers.from_items(headers)\n        self.__headers = headers\n\n        # Call the parent constructor.\n        super(HTTP_Request, self).__init__()\n\n\n    ##--------------------------------------------------------------------------\n    #@staticmethod\n    #def from_form(form, data):\n        #\"\"\"\n        #Get the HTTP request needed to send form data.\n\n        #:param form: HTML form.\n        #:type form: Form\n\n        #:param data: Mapping of key/value pairs.\n        #:type data: dict(str -> str)\n\n        #:returns: HTTP request ready to send the form data.\n        #:rtype: HTTP_Request\n        #\"\"\"\n        #if set(form.parameters) != set(data.keys()):\n            #raise ValueError(\"Form data doesn't match form parameters\")\n        #return HTTP_Request(url       = form.url,\n                            #method    = form.method,\n                            #post_data = data)\n\n\n    #--------------------------------------------------------------------------\n\n    @property\n    def method(self):\n        \"\"\"\n        :returns: HTTP method.\n        :rtype: str\n        \"\"\"\n        return self.__method\n\n    @property\n    def url(self):\n        \"\"\"\n        :returns: URL.\n        :rtype: str\n        \"\"\"\n        return self.__url\n\n    @property\n    def protocol(self):\n        \"\"\"\n        :returns: Protocol name.\n        :rtype: str\n        \"\"\"\n        return self.__protocol\n\n    @property\n    def version(self):\n        \"\"\"\n        :returns: Protocol version.\n        :rtype: str\n        \"\"\"\n        return self.__version\n\n    @property\n    def headers(self):\n        \"\"\"\n        :return: HTTP headers.\n        :rtype: HTTP_Headers\n        \"\"\"\n        return self.__headers\n\n    @property\n    def post_data(self):\n        \"\"\"\n        :return: POST data.\n        :rtype: str | None\n        \"\"\"\n        return self.__post_data\n\n\n    #--------------------------------------------------------------------------\n\n    @property\n    def parsed_url(self):\n        \"\"\"\n        :returns: URL split to its components.\n        :rtype: ParsedURL\n        \"\"\"\n        return self.__parsed_url\n\n    @property\n    def request_uri(self):\n        \"\"\"\n        :return: Request URI.\n        :rtype: str\n        \"\"\"\n        return self.__parsed_url.request_uri\n\n    @property\n    def hostname(self):\n        \"\"\"\n        :return: 'Host' HTTP header.\n        :rtype: str | None\n        \"\"\"\n        return self.__headers.get('Host')\n\n    @property\n    def user_agent(self):\n        \"\"\"\n        :return: 'User-Agent' HTTP header.\n        :rtype: str | None\n        \"\"\"\n        return self.__headers.get('User-Agent')\n\n    @user_agent.setter\n    def user_agent(self, user_agent):\n        \"\"\"\n        Set 'User-Agent' HTTP header.\n\n        :param user_agent: String with the user agent\n        :type user_agent: str\n        \"\"\"\n        self.__headers['User-Agent'] = user_agent\n\n\n    @property\n    def accept_language(self):\n        \"\"\"\n        :return: 'Accept-Language' HTTP header.\n        :rtype: str | None\n        \"\"\"\n        return self.__headers.get('Accept-Language')\n\n    @property\n    def accept(self):\n        \"\"\"\n        :return: 'Accept' HTTP header.\n        :rtype: str | None\n        \"\"\"\n        return self.__headers.get('Accept')\n\n    @property\n    def referer(self):\n        \"\"\"\n        :return: 'Referer' HTTP header.\n        :rtype: str\n        \"\"\"\n        return self.__headers.get('Referer')\n\n    @property\n    def cookie(self):\n        \"\"\"\n        :return: 'Cookie' HTTP header.\n        :rtype: str | None\n        \"\"\"\n        return self.__headers.get('Cookie')\n\n    @property\n    def content_type(self):\n        \"\"\"\n        :return: 'Content-Type' HTTP header.\n        :rtype: str | None\n        \"\"\"\n        return self.__headers.get('Content-Type')\n\n    @property\n    def content_length(self):\n        \"\"\"\n        :return: 'Content-Length' HTTP header.\n        :rtype: int | None\n        \"\"\"\n        try:\n            return int(self.__headers.get('Content-Length'))\n        except Exception:\n            pass\n\n\n#------------------------------------------------------------------------------\nclass HTTP_Raw_Request (Capture):\n    \"\"\"\n    Raw HTTP request information.\n    \"\"\"\n\n    data_subtype = \"http_raw_request\"\n\n\n    #--------------------------------------------------------------------------\n    def __init__(self, raw_request):\n        \"\"\"\n        :param raw_request: Raw HTTP request.\n        :type raw_request: str\n        \"\"\"\n        self.__raw_request = to_utf8(raw_request)\n        super(HTTP_Raw_Request, self).__init__()\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def raw_request(self):\n        \"\"\"\n        :returns: Raw HTTP request.\n        :rtype: str\n        \"\"\"\n        return self.__raw_request\n\n\n#------------------------------------------------------------------------------\nclass HTTP_Response (Capture):\n    \"\"\"\n    HTTP response information.\n\n    Typically plugins don't directly instance these objects,\n    but receive them from the HTTP API.\n    \"\"\"\n\n    data_subtype = \"http_response\"\n    min_informations = 1\n\n\n    #--------------------------------------------------------------------------\n    def __init__(self, request, **kwargs):\n        \"\"\"\n        All optional arguments must be passed as keywords.\n\n        :param request: HTTP request that originated this response.\n        :type request: HTTP_Request | HTTP_Raw_Request\n\n        :param raw_response: (Optional) Raw bytes received from the server.\n        :type raw_response: str\n\n        :param status: (Optional) HTTP status code. Defaults to \"200\".\n        :type status: str\n\n        :param reason: (Optional) HTTP reason message.\n        :type reason: str\n\n        :param protocol: (Optional) Protocol name. Defaults to \"HTTP\".\n        :type protocol: str\n\n        :param version: (Optional) Protocol version. Defaults to \"1.1\".\n        :type version: str\n\n        :param raw_headers: (Optional) Raw HTTP headers.\n        :type raw_headers: str\n\n        :param headers: (Optional) Parsed HTTP headers.\n        :type headers: HTTP_Headers | dict(str -> str) | tuple( tuple(str, str) )\n\n        :param data: (Optional) Raw data that followed the response headers.\n        :type data: str\n\n        :param elapsed: (Optional) Time elapsed in milliseconds since the request\n                        was sent until the response was received.\n        :type elapsed: int\n        \"\"\"\n\n        # Initialize everything.\n        self.__request      = request\n        self.__raw_response = None\n        self.__raw_headers  = None\n        self.__status       = None\n        self.__reason       = None\n        self.__protocol     = getattr(request, \"protocol\", \"HTTP\")\n        self.__version      = getattr(request, \"version\",  \"1.1\")\n        self.__headers      = None\n        self.__data         = None\n        self.__elapsed      = None\n\n        # Raw response bytes.\n        self.__raw_response = kwargs.get(\"raw_response\", None)\n        if self.__raw_response:\n            self.__parse_raw_response(request)\n\n        # Status line.\n        self.__status   = to_utf8( kwargs.get(\"status\",   self.__status)   )\n        self.__reason   = to_utf8( kwargs.get(\"reason\",   self.__reason)   )\n        self.__protocol = to_utf8( kwargs.get(\"protocol\", self.__protocol) )\n        self.__version  = to_utf8( kwargs.get(\"version\",  self.__version)  )\n        if self.__status and not self.__reason:\n            try:\n                self.__reason = httplib.responses[self.__status]\n            except Exception:\n                pass\n        elif not self.__status and self.__reason:\n            lower_reason = self.__reason.strip().lower()\n            for code, text in httplib.responses.iteritems():\n                if text.lower() == lower_reason:\n                    self.__status = str(code)\n                    break\n        elif not self.__status:\n            self.__status = \"200\"\n            self.__reason = \"OK\"\n\n        # HTTP headers.\n        self.__raw_headers = to_utf8( kwargs.get(\"raw_headers\", self.__raw_headers) )\n        self.__headers = kwargs.get(\"headers\", self.__headers)\n        if self.__headers:\n            if not isinstance(self.__headers, HTTP_Headers):\n                if hasattr(self.__headers, \"items\"):\n                    self.__headers = HTTP_Headers.from_items(sorted(self.__headers.items()))\n                else:\n                    self.__headers = HTTP_Headers.from_items(sorted(self.__headers))\n            if not self.__raw_headers:\n                self.__reconstruct_raw_headers()\n        elif self.__raw_headers and not self.__headers:\n            self.__parse_raw_headers()\n\n        # Data.\n        self.__data = to_utf8( kwargs.get(\"data\", self.__data) )\n\n        # Reconstruct the raw response if needed.\n        if not self.__raw_response:\n            self.__reconstruct_raw_response()\n\n        # Response time.\n        self.elapsed = kwargs.get(\"elapsed\", None)\n\n        # Call the parent constructor.\n        super(HTTP_Response, self).__init__()\n\n        # Link this response to the request that originated it.\n        #self.add_link(request)\n\n\n    #--------------------------------------------------------------------------\n\n    '''\n    @keep_newer  # TODO: maybe the times should be collected and/or averaged instead?\n    '''\n    @property\n    def elapsed(self):\n        \"\"\"\n        :returns: Time elapsed in seconds since the request was sent\n                  until the response was received. None if not available.\n        :rtype: float | None\n        \"\"\"\n        return self.__elapsed\n\n    @elapsed.setter\n    def elapsed(self, elapsed):\n        \"\"\"\n        :param elapsed: Time elapsed in seconds since the request was\n            sent until the response was received. None if not available.\n        :type elapsed: float | None\n        \"\"\"\n        self.__elapsed = float(elapsed) if elapsed is not None else None\n\n\n    #--------------------------------------------------------------------------\n\n    @property\n    def raw_response(self):\n        \"\"\"\n        :returns: Raw HTTP response.\n        :rtype: str | None\n        \"\"\"\n        return self.__raw_response\n\n\n    #--------------------------------------------------------------------------\n\n    @property\n    def status(self):\n        \"\"\"\n        :returns: HTTP status code.\n        :rtype: str | None\n        \"\"\"\n        return self.__status\n\n    @property\n    def reason(self):\n        \"\"\"\n        :returns: HTTP reason message.\n        :rtype: str | None\n        \"\"\"\n        return self.__reason\n\n    @property\n    def protocol(self):\n        \"\"\"\n        :returns: Protocol name.\n        :rtype: str | None\n        \"\"\"\n        return self.__protocol\n\n    @property\n    def version(self):\n        \"\"\"\n        :returns: Protocol version.\n        :rtype: str | None\n        \"\"\"\n        return self.__version\n\n    @property\n    def headers(self):\n        \"\"\"\n        :return: HTTP headers.\n        :rtype: dict(str -> str) | None\n        \"\"\"\n        return self.__headers\n\n    @property\n    def raw_headers(self):\n        \"\"\"\n        :returns: HTTP method used for this request.\n        :rtype: str | None\n        \"\"\"\n        return self.__raw_headers\n\n    @property\n    def data(self):\n        \"\"\"\n        :return: Response data.\n        :rtype: str | None\n        \"\"\"\n        return self.__data\n\n    @property\n    def content_length(self):\n        \"\"\"\n        :return: 'Content-Length' HTTP header.\n        :rtype: int | None\n        \"\"\"\n        try:\n            return int(self.__headers.get('Content-Length'))\n        except Exception:\n            pass\n\n    @property\n    def content_type(self):\n        \"\"\"\n        :return: 'Content-Type' HTTP header.\n        :rtype: str | None\n        \"\"\"\n        return self.__headers.get('Content-Type')\n\n    @property\n    def content_disposition(self):\n        \"\"\"\n        :return: 'Content-Disposition' HTTP header.\n        :rtype: str | None\n        \"\"\"\n        if self.__headers:\n            return self.__headers.get('Content-Disposition')\n\n    @property\n    def transport_encoding(self):\n        \"\"\"\n        :return: 'Transport-Encoding' HTTP header.\n        :rtype: str | None\n        \"\"\"\n        if self.__headers:\n            return self.__headers.get('Transport-Encoding')\n\n    @property\n    def cookie(self):\n        \"\"\"\n        :return: 'Set-Cookie' HTTP header.\n        :rtype: str | None\n        \"\"\"\n        if self.__headers:\n            return self.__headers.get('Set-Cookie')\n\n    set_cookie = cookie\n\n    @property\n    def server(self):\n        \"\"\"\n        :return: 'Server' HTTP header.\n        :rtype: str | None\n        \"\"\"\n        if self.__headers:\n            return self.__headers.get('Server')\n\n\n    #--------------------------------------------------------------------------\n    def __parse_raw_response(self, request):\n\n        # Special case: if parsing HTTP/0.9, everything is data.\n        if getattr(request, \"version\", None) == \"0.9\":\n            self.__protocol = \"HTTP\"\n            self.__version  = \"0.9\"\n            self.__status   = \"200\"\n            self.__reason   = httplib.responses[200]\n            self.__data     = self.__raw_response\n            return\n\n        # Split the response from the data.\n        response, data = self.__raw_response.split(\"\\r\\n\\r\\n\", 1)\n        response = response + \"\\r\\n\\r\\n\"\n\n        # Split the response line from the headers.\n        raw_line, raw_headers = response.split(\"\\r\\n\", 1)\n\n        # Split the response line into its components.\n        try:\n            proto_version, status, reason = re.split(\"[ \\t]+\", raw_line, 2)\n        except Exception:\n            proto_version, status = re.split(\"[ \\t]+\", raw_line, 1)\n            try:\n                reason = httplib.responses[int(status)]\n            except Exception:\n                reason = None\n        if \"/\" in proto_version:\n            protocol, version = proto_version.split(\"/\")\n        else:\n            protocol = proto_version\n            version  = None\n\n        # Set missing components to None.\n        if not status:\n            status = None\n        if not reason:\n            reason = None\n        if not protocol:\n            protocol = None\n        if not data:\n            data = None\n\n        # Store the components.\n        self.__protocol    = protocol\n        self.__version     = version\n        self.__status      = status\n        self.__reason      = reason\n        self.__raw_headers = raw_headers\n        self.__data        = data\n\n        # Parse the raw headers.\n        self.__parse_raw_headers()\n\n\n    #--------------------------------------------------------------------------\n    def __reconstruct_raw_response(self):\n\n        # Special case: if parsing HTTP/0.9, everything is data.\n        if self.__version == \"0.9\":\n            self.__raw_response = self.__data\n            return\n\n        # FIXME: not sure how Requests handles content encoding,\n        # it may be possible to generate broken raw responses if\n        # the content is decoded automatically behind our backs\n\n        # Reconstruct the response line.\n        if self.__protocol and self.__version:\n            proto_ver = \"%s/%s \" % (self.__protocol, self.__version)\n        elif self.__protocol:\n            proto_ver = self.__protocol + \" \"\n        elif self.__version:\n            proto_ver = self.__version + \" \"\n        else:\n            proto_ver = \"\"\n        if self.__status and self.__reason:\n            status_line = \"%s%s %s\\r\\n\" % (proto_ver, self.__status, self.__reason)\n        elif self.__status:\n            status_line = \"%s%s\\r\\n\" % (proto_ver, self.__status)\n        elif self.__reason:\n            status_line = \"%s%s\\r\\n\" % (proto_ver, self.__reason)\n\n        # Reconstruct the headers.\n        raw_headers = self.__raw_headers\n        if not raw_headers:\n            if self.__headers:\n                self.__reconstruct_raw_headers()\n                raw_headers = self.__raw_headers\n            else:\n                raw_headers = \"\"\n\n        # Get the data if available.\n        if self.__data:\n            data = self.__data\n        else:\n            data = \"\"\n\n        # Store the reconstructed raw response.\n        self.__raw_response = \"%s%s%s\" % (status_line, raw_headers, data)\n\n\n    #--------------------------------------------------------------------------\n    def __parse_raw_headers(self):\n        self.__headers = HTTP_Headers(self.__raw_headers)\n\n\n    #--------------------------------------------------------------------------\n    def __reconstruct_raw_headers(self):\n        self.__raw_headers = str(self.__headers)\n\n\n    #add by blackye\n    @property\n    def raw_request(self):\n        return self.__request"
  },
  {
    "path": "lalascan/data/information/__init__.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nInformation types.\n\"\"\"\n\n__license__ = \"\"\"\nGoLismero 2.0 - The web knife - Copyright (C) 2011-2014\n\nGolismero project site: https://github.com/golismero\nGolismero project mail: contact@golismero-project.com\n\nThis program is free software; you can redistribute it and/or\nmodify it under the terms of the GNU General Public License\nas published by the Free Software Foundation; either version 2\nof the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program; if not, write to the Free Software\nFoundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n\"\"\"\n\n__all__ = [\"Information\", \"File\", \"Asset\", \"Capture\", \"Fingerprint\"]\n\nfrom .. import Data\n\n\n#------------------------------------------------------------------------------\nclass Information(Data):\n    \"\"\"\n    Base class for informational results.\n    \"\"\"\n\n    # Categories of informational data.\n    CATEGORY_UNKNOWN     = 0    # Not a real value!\n    CATEGORY_FILE        = 1\n    CATEGORY_CAPTURE     = 2\n    CATEGORY_FINGERPRINT = 3\n\n    data_type = Data.TYPE_INFORMATION\n    data_subtype = \"information/abstract\"\n    information_category = CATEGORY_UNKNOWN\n\n\n#------------------------------------------------------------------------------\nclass File(Information):\n    \"\"\"\n    File Data: raw file contents.\n    \"\"\"\n\n    data_subtype = \"information/abstract\"\n    information_category = Information.CATEGORY_FILE\n\n\n#------------------------------------------------------------------------------\nclass Capture(Information):\n    \"\"\"\n    Protocol captures: raw network protocol dumps.\n    \"\"\"\n\n    data_subtype = \"information/abstract\"\n    information_category = Information.CATEGORY_CAPTURE\n\n\n#------------------------------------------------------------------------------\nclass Fingerprint(Information):\n    \"\"\"\n    Fingerprints: reconnaissance results.\n    \"\"\"\n\n    data_subtype = \"information/abstract\"\n    information_category = Information.CATEGORY_FINGERPRINT\n"
  },
  {
    "path": "lalascan/data/information/banner.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nService banner.\n\"\"\"\n\n\n__all__ = [\"Banner\"]\n\nfrom . import Fingerprint\nfrom .. import identity\nfrom ..resource.domain import Domain\nfrom ..resource.ip import IP\nfrom ...text.text_utils import to_utf8\n\nfrom warnings import warn\n\n\n#------------------------------------------------------------------------------\nclass Banner(Fingerprint):\n    \"\"\"\n    Service banner.\n    \"\"\"\n\n    min_resources = 1\n\n\n    #--------------------------------------------------------------------------\n    def __init__(self, host, banner, port):\n        \"\"\"\n        :param host: IP address or domain name where the banner was found.\n        :type host: IP | Domain\n\n        :param banner: Banner of the service.\n        :type banner: str\n\n        :param port: Port number of the service.\n        :type port: int\n        \"\"\"\n\n        # Sanitize the properties.\n        if not isinstance(host, IP) and not isinstance(host, Domain):\n            host = to_utf8(host)\n            if isinstance(host, basestring):\n                warn(\"Expected IP or Domain, got string instead\",\n                     RuntimeWarning)\n                try:\n                    host = IP(host)\n                except Exception:\n                    host = Domain(host)\n            else:\n                raise TypeError(\n                    \"Expected IP or Domain, got %r instead\" % type(host))\n        banner = to_utf8(banner)\n        if type(banner) is not str:\n            raise TypeError(\"Expected str, got %r instead\" % type(banner))\n        port = int(port)\n        if port <= 0 or port >= 65536:\n            raise ValueError(\"Invalid port number: %d\" % port)\n\n        # Save the properties.\n        self.__banner = banner\n        self.__port   = port\n\n        # Parent constructor.\n        super(Banner, self).__init__()\n\n        # Link the banner to the host.\n        host.add_information(self)\n\n\n    #--------------------------------------------------------------------------\n    @identity\n    def banner(self):\n        \"\"\"\n        :returns: Banner of the service.\n        :rtype: str\n        \"\"\"\n        return self.__banner\n\n\n    #--------------------------------------------------------------------------\n    @identity\n    def port(self):\n        \"\"\"\n        :returns: Port number of the service.\n        :type port: int\n        \"\"\"\n        return self.__port\n\n\n    #--------------------------------------------------------------------------\n    def get_ip_addresses(self):\n        \"\"\"\n        :returns: Set of IP addresses where this banner was found.\n        :rtype: set(str)\n        \"\"\"\n        return {\n            ip.address\n            for ip in self.get_associated_resources_by_category(\n                          IP.data_subtype)\n        }\n\n\n    #--------------------------------------------------------------------------\n    def get_domains(self):\n        \"\"\"\n        :returns: Set of domains where this banner was found.\n        :rtype: set(str)\n        \"\"\"\n        return {\n            domain.name\n            for domain in self.get_associated_resources_by_category(\n                          Domain.data_subtype)\n        }\n\n\n    #--------------------------------------------------------------------------\n    def get_hosts(self):\n        \"\"\"\n        :returns: Set of IP addresses and domains where this banner was found.\n        :rtype: set(str)\n        \"\"\"\n        s = self.get_ip_addresses()\n        s.update(self.get_domains())\n        return s\n"
  },
  {
    "path": "lalascan/data/information/html.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nHTML document.\n\"\"\"\n\n__all__ = [\"HTML\"]\n\nfrom lalascan.data.information import File\nfrom lalascan.libs.net.web_utils import HTMLParser\nfrom lalascan.utils.text_utils import to_utf8\n\n\n#------------------------------------------------------------------------------\nclass HTML(File):\n    \"\"\"\n    HTML document.\n\n    This object contains all of relevant tags of a HTML document:\n\n    - title\n    - links\n    - forms\n    - images\n    - objects\n    - metas\n    - css_links\n    - css_embedded\n    - javascript_links\n    \"\"\"\n\n    #--------------------------------------------------------------------------\n    def __init__(self, data):\n        \"\"\"\n        :param data: Raw HTML content.\n        :type data: str\n        \"\"\"\n\n        # Raw HTML content\n        self.__raw_data = to_utf8(data)\n\n        # Parent constructor\n        super(HTML, self).__init__()\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def display_name(self):\n        return \"HTML Content\"\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def raw_data(self):\n        \"\"\"\n        :return: Raw HTML content.\n        :rtype: str\n        \"\"\"\n        return self.__raw_data\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def elements(self):\n        \"\"\"\n        :return: All HTML elements.\n        :rtype: list(HTMLElement)\n        \"\"\"\n        return HTMLParser(self.raw_data).elements\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def forms(self):\n        \"\"\"\n        :return: HTML form tags.\n        :rtype: list(HTMLElement)\n        \"\"\"\n        return HTMLParser(self.raw_data).forms\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def images(self):\n        \"\"\"\n        :return: Image tags.\n        :rtype: list(HTMLElement)\n        \"\"\"\n        return HTMLParser(self.raw_data).images\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def url_links(self):\n        \"\"\"\n        :return: Link tags.\n        :rtype: list(HTMLElement)\n        \"\"\"\n        return HTMLParser(self.raw_data).url_links\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def css_links(self):\n        \"\"\"\n        :return: CSS links.\n        :rtype: list(HTMLElement)\n        \"\"\"\n        return HTMLParser(self.raw_data).css_links\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def javascript_links(self):\n        \"\"\"\n        :return: JavaScript links.\n        :rtype: list(HTMLElement)\n        \"\"\"\n        return HTMLParser(self.raw_data).javascript_links\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def css_embedded(self):\n        \"\"\"\n        :return: Embedded CSS.\n        :rtype: list(HTMLElement)\n        \"\"\"\n        return HTMLParser(self.raw_data).css_embedded\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def javascript_embedded(self):\n        \"\"\"\n        :return: Embedded JavaScript.\n        :rtype: list(HTMLElement)\n        \"\"\"\n        return HTMLParser(self.raw_data).javascript_embedded\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def metas(self):\n        \"\"\"\n        :return: Meta tags.\n        :rtype: list(HTMLElement)\n        \"\"\"\n        return HTMLParser(self.raw_data).metas\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def title(self):\n        \"\"\"\n        :return: Document title.\n        :rtype: HTMLElement\n        \"\"\"\n        return HTMLParser(self.raw_data).title\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def objects(self):\n        \"\"\"\n        :return: Object tags.\n        :rtype: list(HTMLElement)\n        \"\"\"\n        return HTMLParser(self.raw_data).objects\n"
  },
  {
    "path": "lalascan/data/information/portscan.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nPortscan results.\n\"\"\"\n\n__all__ = [\"Portscan\"]\n\nfrom . import Fingerprint\nfrom ..resource.ip import IP\n\nfrom lalascan.api.exception import LalascanTypeError, LalascanValueError\n\n#------------------------------------------------------------------------------\nclass PortScanFingerprint(Fingerprint):\n    \"\"\"\n    Portscan results.\n    \"\"\"\n\n    #--------------------------------------------------------------------------\n    def __init__(self, ip, ports):\n        \"\"\"\n        :param ip: Scanned host's IP address.\n        :type ip: IP\n\n        :param ports: Portscan results.\n            A set of tuples, each tuple containing the following data for\n            each scanned port: state, protocol, port. The state is a string\n            with one of the following values: \"OPEN, \"CLOSED\" or \"FILTERED\".\n            The protocol is a string with one of the following values: \"TCP\"\n            or \"UDP\". The port is an integer from 0 to 65536, not included.\n        :type ports: set( tuple(int, str), ... )\n\n        \"\"\"\n\n        # Sanitize and store the properties.\n        try:\n            assert isinstance(ip, IP), type(ip)\n            self.__address   = ip.address\n            sane    = set()\n            visited = set()\n            for port, service in ports:\n                port     = int(port)\n                service  = str(service.upper())\n\n                if port <= 0 or port > 65535:\n                    raise LalascanValueError(\"Invalid port number: %d\" % port)\n                key = (port, service)\n                if key not in visited:\n                    visited.add(key)\n                    sane.add( (port, service) )\n            self.__ports = frozenset(sane)\n        except Exception:\n            ##raise # XXX DEBUG\n            raise LalascanValueError(\"Malformed portscan results!\")\n\n        # Call the superclass constructor.\n        super(PortScanFingerprint, self).__init__()\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def address(self):\n        \"\"\"\n        :returns: Scanned host's IP address.\n        :rtype: str\n        \"\"\"\n        return self.__address\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def ports(self):\n        \"\"\"\n        :returns: Portscan results.\n            A set of tuples, each tuple containing the following data for\n            each scanned port: service.\n        :rtype: frozenset( tuple(int, str), ... )\n        \"\"\"\n        return self.__ports\n\n\n    #--------------------------------------------------------------------------\n    def __repr__(self):\n        return \"<%s name=%s port=%d service=%s\" % (\n            self.__class__.__name__, self.name, self.port, self.protocol\n        )\n\n\n    #--------------------------------------------------------------------------\n    def __str__(self):\n        return \"\\n\".join(\"%-8s %-3s %d\" % p for p in sorted(self.ports))\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def display_name(self):\n        return \"Port Scan Results\"\n\n"
  },
  {
    "path": "lalascan/data/information/webservice.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\n\nfrom . import Fingerprint\nfrom ...utils.text_utils import to_utf8\n\n#------------------------------------------------------------------------------\nclass WebServiceFingerprint(Fingerprint):\n    \"\"\"\n    Fingerprint information for a particular host and web server.\n    \"\"\"\n\n    data_subtype = \"webservice\"\n\n\n    #--------------------------------------------------------------------------\n    def __init__(self, name, version, banner, canonical_name, related = None, others = None):\n        \"\"\"\n        :param name: Web server name. Example: \"Apache\".\n        :type name: str\n\n        :param version: Web server version. Example: \"2.2.23\".\n        :type version: str\n\n        :param banner: Web server banner. Example:\n            \"Apache 2.2.23 ((Unix) mod_ssl/2.2.23 OpenSSL/1.0.1e-fips)\".\n        :type banner: str\n\n        :param canonical_name: Web server name, in lowercase.\n            The name will be one of the file:\n            'wordlist/fingerprint/webservers_keywords.txt'.\n            Example: \"apache\".\n        :type canonical_name: str\n\n        :param related: Alternative brands for this web server.\n        :type related: set(str)\n\n        :param others: Map of other possible web servers by name and their probabilities of being correct [0.0 ~ 1.0].\n        :type others: dict( str -> float )\n        \"\"\"\n\n        # Sanitize the strings.\n        name           = to_utf8(name)\n        version        = to_utf8(version)\n        banner         = to_utf8(banner)\n        canonical_name = to_utf8(canonical_name)\n\n        # Check the data types.\n        if not isinstance(name, str):\n            raise TypeError(\"Expected str, got %r instead\" % type(name))\n        if not isinstance(version, str):\n            raise TypeError(\"Expected str, got %r instead\" % type(version))\n        if not isinstance(banner, str):\n            raise TypeError(\"Expected str, got %r instead\" % type(banner))\n        if not isinstance(canonical_name, str):\n            raise TypeError(\"Expected str, got %r instead\" % type(canonical_name))\n\n        # Save the identity properties.\n        self.__name           = name\n        self.__version        = version\n        self.__banner         = banner\n        self.__canonical_name = canonical_name\n\n        # Save the mergeable properties.\n        self.related          = related\n        self.others           = others\n\n        # Parent constructor.\n        super(WebServiceFingerprint, self).__init__()\n\n\n    #--------------------------------------------------------------------------\n    def __repr__(self):\n        return \"<WebServerFingerprint server='%s-%s' banner='%s'>\" % (\n            self.__name,\n            self.__version,\n            self.__banner,\n        )\n\n\n    #--------------------------------------------------------------------------\n    def __str__(self):\n        return self.__banner\n\n\n    #--------------------------------------------------------------------------\n    def to_dict(self):\n        d = super(WebServiceFingerprint, self).to_dict()\n        d[\"others\"] = { k: list(v) for (k,v) in self.others.iteritems() }\n        return d\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def display_properties(self):\n        others = []\n        for k in sorted(self.others.iterkeys()):\n            others.append(\"%s:\" % k)\n            for v in sorted(self.others[k]):\n                others.append(\"  %s\" % v)\n        props = super(WebServiceFingerprint, self).display_properties\n        props[\"[DEFAULT]\"][\"Others\"] = \"\\n\".join(others)\n        return props\n\n\n    #--------------------------------------------------------------------------\n    @identity\n    def name(self):\n        \"\"\"\n        :return: Web server name. Example: \"Apache\".\n        :rtype: str\n        \"\"\"\n        return self.__name\n\n\n    #--------------------------------------------------------------------------\n    @identity\n    def version(self):\n        \"\"\"\n        :return: Web server version. Example: \"2.2.3\".\n        :rtype: str\n        \"\"\"\n        return self.__version\n\n\n    #--------------------------------------------------------------------------\n    @identity\n    def banner(self):\n        \"\"\"\n        :return: Web server banner. Example:\n            \"Apache 2.2.23 ((Unix) mod_ssl/2.2.23 OpenSSL/1.0.1e-fips)\".\n        :rtype: str\n        \"\"\"\n        return self.__banner\n\n\n    #--------------------------------------------------------------------------\n    @identity\n    def canonical_name(self):\n        \"\"\"\n        :return: Web server name, in lowercase.\n            The full list of names is taken from the file:\n            'wordlist/fingerprint/webservers_keywords.txt'.\n            Example: \"apache\".\n        :rtype: str\n        \"\"\"\n        return self.__canonical_name\n\n\n    #--------------------------------------------------------------------------\n    @merge\n    def others(self):\n        \"\"\"\n        :return: Map of other possible web servers by name and their\n            probabilities of being correct [0.0 ~ 1.0].\n        :rtype: dict( str -> float )\n        \"\"\"\n        return self.__others\n\n\n    #--------------------------------------------------------------------------\n    @others.setter\n    def others(self, others):\n        \"\"\"\n        :param others: Map of other possible web servers by name and their\n            probabilities of being correct [0.0 ~ 1.0].\n        :type others: dict( str -> float )\n        \"\"\"\n        if others:\n            if not isinstance(others, dict):\n                raise TypeError(\"Expected dict, got %r instead\" % type(others))\n            others = {\n                to_utf8(k): float(v)\n                for k,v in others.iteritems()\n            }\n            for k in others.iterkeys():\n                if not isinstance(k, str):\n                    raise TypeError(\"Expected str, got %r instead\" % type(k))\n        else:\n            others = {}\n        self.__others = others\n\n\n    #--------------------------------------------------------------------------\n    @merge\n    def related(self):\n        \"\"\"\n        :return: Alternative brands for this web server.\n        :rtype: set(str)\n        \"\"\"\n        return self.__related\n\n\n    #--------------------------------------------------------------------------\n    @related.setter\n    def related(self, related):\n        \"\"\"\n        :param related: Alternative brands for this web server.\n        :type related: set(str)\n        \"\"\"\n        if related:\n            if not isinstance(related, set):\n                raise TypeError(\"Expected set, got %r instead\" % type(related))\n            related = { to_utf8(v) for v in related }\n            for v in related:\n                if not isinstance(v, str):\n                    raise TypeError(\"Expected str, got %r instead\" % type(v))\n        else:\n            related = {}\n        self.__related = related\n"
  },
  {
    "path": "lalascan/data/resource/__init__.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nResource types.\n\"\"\"\n\n__all__ = [\"Resource\"]\n\nfrom .. import Data\n\n\n#------------------------------------------------------------------------------\nclass Resource(Data):\n    \"\"\"\n    Base class for resources.\n    \"\"\"\n\n    data_type = Data.TYPE_RESOURCE\n    data_subtype = \"resource/abstract\"\n"
  },
  {
    "path": "lalascan/data/resource/domain.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nDomain name.\n\"\"\"\n\n__all__ = [\"Domain\", \"RootDomain\"]\n\nfrom . import Resource\nfrom ...libs.net.web_utils import split_hostname\nfrom ...utils.text_utils import to_utf8\n\nfrom netaddr import IPAddress\n\nimport re\n\n\n#------------------------------------------------------------------------------\nclass Domain(Resource):\n    \"\"\"\n    Domain name.\n\n    This data type maps the root domain names\n    to the IP addresses they resolve to.\n    \"\"\"\n\n    data_subtype = \"domain\"\n\n    _re_is_domain = re.compile(r\"^[A-Za-z0-9][A-Za-z0-9\\_\\-\\.]*[A-Za-z0-9]$\")\n\n\n    #--------------------------------------------------------------------------\n    def __init__(self, hostname):\n        \"\"\"\n        :param hostname: Domain name.\n        :type hostname: str\n        \"\"\"\n\n        hostname = to_utf8(hostname)\n        if not isinstance(hostname, str):\n            raise TypeError(\n                \"Expected string, got %r instead\" % type(hostname))\n        if not hostname:\n            raise ValueError(\"Missing hostname\")\n\n        # Check we've not confused an IP address for a hostname.\n        try:\n            if hostname.startswith(\"[\") and hostname.endswith(\"]\"):\n                IPAddress(hostname[1:-1], version=6)\n            else:\n                IPAddress(hostname)\n        except Exception:\n            pass\n        else:\n            raise ValueError(\n                \"This is an IP address (%s) not a domain!\" % hostname)\n\n        # Make sure the hostname is valid.\n        if not self._re_is_domain.match(hostname):\n            raise ValueError(\"Invalid domain name: %r\" % hostname)\n\n        # Domain name.\n        self.__hostname = hostname\n\n        # Parent constructor.\n        super(Domain, self).__init__()\n\n        # Reset the crawling depth.\n        self.depth = 0\n\n\n    #--------------------------------------------------------------------------\n    def __str__(self):\n        return self.hostname\n\n\n    #--------------------------------------------------------------------------\n    def __repr__(self):\n        return \"<Domain name=%r>\" % self.hostname\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def display_name(self):\n        return \"Domain Name\"\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def hostname(self):\n        \"\"\"\n        :return: Domain name.\n        :rtype: str\n        \"\"\"\n        return self.__hostname\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def root(self):\n        \"\"\"\n        :return: Root domain. i.e: www.mysite.com -> mysite.com\n        :rtype: str\n        \"\"\"\n        _, domain, suffix = split_hostname(self.hostname)\n        if suffix:\n            return \"%s.%s\" % (domain, suffix)\n        return domain\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def discovered(self):\n        domain = self.hostname\n        result = [RootDomain(self.root)]\n        subdomain, domain, suffix = split_hostname(domain)\n        if subdomain:\n            prefix = \".\".join( (domain, suffix) )\n            '''\n            for part in reversed(subdomain.split(\".\")):\n                if prefix in Config.audit_scope:\n                    result.append( Domain(prefix) )\n                prefix = \".\".join( (part, prefix) )\n            '''\n        return result\n\n\n#------------------------------------------------------------------------------\nclass RootDomain(Domain):\n    \"\"\"\n    Root domain name.\n\n    This data type maps the domain names to the IP addresses they resolve to.\n    \"\"\"\n\n    data_subtype = \"root_domain\"\n\n\n    #--------------------------------------------------------------------------\n    def __init__(self, hostname):\n\n        # Parent constructor.\n        super(RootDomain, self).__init__(hostname)\n\n        # Make sure it's really a root domain.\n        if self.hostname != self.root:\n            raise ValueError(\n                \"Domain %s is not a root domain\" % self.hostname)\n\n\n    #--------------------------------------------------------------------------\n    def __repr__(self):\n        return \"<Root Domain name=%r>\" % self.hostname\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def display_name(self):\n        return \"Root Domain Name\"\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def root(self):\n        \"\"\"\n        Alias of \"hostname\", to ensure both Domain and RootDomain have\n        the same interface.\n\n        :return: Root domain.\n        :rtype: str\n        \"\"\"\n        return self.hostname\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def discovered(self):\n        return [Domain(self.hostname)]\n"
  },
  {
    "path": "lalascan/data/resource/ip.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nIP address.\n\"\"\"\n\n__all__ = [\"IP\"]\n\nfrom . import Resource\nfrom ...utils.text_utils import to_utf8\n\nfrom ...api.exception import LalascanValueError\n\nfrom netaddr import IPAddress\n\n\n\n#------------------------------------------------------------------------------\nclass IP(Resource):\n    \"\"\"\n    IP address.\n    \"\"\"\n\n\n    #--------------------------------------------------------------------------\n    def __init__(self, address):\n        \"\"\"\n        :param address: IP address.\n        :type address: str\n        \"\"\"\n\n        address = to_utf8(address)\n        if not isinstance(address, str):\n            raise TypeError(\"Expected str, got %r instead\" % type(address))\n\n        try:\n            if address.startswith(\"[\") and address.endswith(\"]\"):\n                parsed  = IPAddress(address[1:-1], version=6)\n                address = address[1:-1]\n            else:\n                parsed  = IPAddress(address)\n            version = int( parsed.version )\n        except Exception:\n            raise LalascanValueError(\"Invalid IP address: %s\" % address)\n\n        # IP address and protocol version.\n        self.__address = address\n        self.__version = version\n\n        # Parent constructor.\n        super(IP, self).__init__()\n\n\n    #--------------------------------------------------------------------------\n    def __str__(self):\n        return self.address\n\n\n    #--------------------------------------------------------------------------\n    def __repr__(self):\n        return \"<IPv%s address=%r>\" % (self.version, self.address)\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def display_name(self):\n        return \"IP info\"\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def address(self):\n        \"\"\"\n        :return: IP address.\n        :rtype: str\n        \"\"\"\n        return self.__address\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def version(self):\n        \"\"\"\n        :return: version of IP protocol: 4 or 6.\n        :rtype: int(4|6)\n        \"\"\"\n        return self.__version\n"
  },
  {
    "path": "lalascan/data/resource/url.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nUniversal Resource Locator (URL).\n\"\"\"\n\n__all__ = [\"BaseURL\", \"FolderURL\", \"URL\", \"SpiderURL\"]\n\nfrom . import Resource\nfrom .domain import Domain\nfrom .ip import IP\nfrom ...libs.net.web_utils import parse_url\nfrom ...utils.text_utils import to_utf8\n\nfrom urllib import quote\n\n\n#------------------------------------------------------------------------------\nclass _AbstractURL(Resource):\n    \"\"\"\n    Abstract class for all URL based resources.\n    \"\"\"\n\n    # Not true, but this bypasses an integrity check in the metaclass.\n    data_subtype = \"resource/abstract\"\n\n\n    #--------------------------------------------------------------------------\n    def __init__(self, url):\n        \"\"\"\n        :param url: Absolute URL.\n        :type url: str\n\n        :raises ValueError: Relative URLs are not allowed.\n        \"\"\"\n\n        # Parse, verify and canonicalize the URL.\n        # TODO: if relative, make it absolute using the referer when available.\n        parsed = parse_url(url)\n        if not parsed.host or not parsed.scheme:\n            raise ValueError(\"Only absolute URLs must be used! Got: %r\" % url)\n        if parsed.scheme == \"mailto\":\n            raise ValueError(\"For emails use the Email type instead! Got: %r\" % url)\n        if parsed.scheme not in (\"http\", \"https\", \"ftp\"):\n            raise ValueError(\"URL scheme not supported: %r\" % parsed.scheme)\n        url = parsed.url\n\n        # URL.\n        self.__url = url\n\n        # Parsed URL.\n        self.__parsed_url = parsed\n\n        # Parent constructor.\n        super(_AbstractURL, self).__init__()\n\n\n    #--------------------------------------------------------------------------\n\n    @property\n    def url(self):\n        \"\"\"\n        :return: URL in canonical form.\n        :rtype: str\n        \"\"\"\n        return self.__url\n\n\n    #--------------------------------------------------------------------------\n\n    @property\n    def parsed_url(self):\n        \"\"\"\n        :return: URL in parsed form.\n        :rtype: ParsedURL\n        \"\"\"\n        return self.__parsed_url\n\n    @property\n    def hostname(self):\n        \"\"\"\n        :return: Hostname this URL points to.\n        :rtype: str\n        \"\"\"\n        return self.parsed_url.hostname\n\n    @property\n    def path(self):\n        \"\"\"\n        :return: Path component of the URL.\n        :rtype: str\n        \"\"\"\n        return self.parsed_url.path\n\n    @property\n    def is_https(self):\n        \"\"\"\n        :return: True if it's HTTPS, False otherwise.\n        :rtype: bool\n        \"\"\"\n        return self.parsed_url.scheme == \"https\"\n\n\n    #--------------------------------------------------------------------------\n    def __str__(self):\n        return self.url\n\n\n    #--------------------------------------------------------------------------\n    def __repr__(self):\n        cls = self.__class__.__name__\n        if \".\" in cls:\n            cls = cls[ cls.rfind(\".\") + 1 : ]\n        return \"<%s url=%r>\" % (cls, self.url)\n\n\n#------------------------------------------------------------------------------\nclass URL(_AbstractURL):\n    \"\"\"\n    Universal Resource Locator (URL).\n\n    You can get the URL in canonical form:\n\n    - url\n\n    In deconstructed form:\n\n    - parsed_url\n\n    The current crawling depth level:\n\n    - depth\n\n    And some extra information needed to build an HTTP request:\n\n    - method\n    - url_params\n    - post_params\n    - referer\n    \"\"\"\n\n    data_subtype = \"url\"\n\n\n    #--------------------------------------------------------------------------\n    def __init__(self, url, method = \"GET\", post_params = None, referer = None, urlencode = True, **kwargs):\n        \"\"\"\n        :param url: Absolute URL.\n        :type url: str\n\n        :param method: HTTP method.\n        :type method: str\n\n        :param post_params: POST parameters or raw data.\n        :type post_params: dict(str -> str) | str\n\n        :param referer: Referrer URL.\n        :type referer: str\n\n        :param urlencode: POST|GET Data urlencode\n        :type urlencode: bool\n\n        :raises ValueError: Currently, relative URLs are not allowed.\n        \"\"\"\n\n        # Validate the arguments.\n        if method:\n            method = to_utf8(method)\n        else:\n            method = \"GET\"\n        if referer:\n            referer = to_utf8(referer)\n        else:\n            referer = None\n        if not isinstance(method, str):\n            raise TypeError(\"Expected string, got %r instead\" % type(method))\n        if post_params is not None and not isinstance(post_params, dict):\n            raise TypeError(\"Expected dict, got %r instead\" % type(post_params))\n        if referer is not None and not isinstance(referer, str):\n            raise TypeError(\"Expected string, got %r instead\" % type(referer))\n        if post_params:\n            if hasattr(post_params, \"iteritems\"):\n                post_params = {\n                    to_utf8(k): to_utf8(v) for k,v in post_params.iteritems()\n                }\n                if urlencode:\n                    post_data = '&'.join(\n                        '%s=%s' % ( quote(k, safe=''), quote(v, safe='') )\n                        for (k, v) in sorted(post_params.iteritems())\n                    )\n                else:\n                    post_data = '&'.join(\n                        '%s=%s' % ( k, v ) for (k, v) in sorted(post_params.iteritems())\n                    )\n            else:\n                post_data   = to_utf8(post_params)\n                post_params = None\n        else:\n            post_data   = None\n            post_params = None\n\n            '''\n            # Checks for get param\n            url_params = kwargs.get('url_params', None)\n\n            if url_params is not None:\n                if hasattr(url_params, \"iteritems\"):\n                    url_params = {\n                        to_utf8(k): to_utf8(v) for k, v in url_params.iteritems()\n                    }\n                    query_param = '&'.join(\n                        '%s=%s' % ( quote(k, safe=''), quote(v, safe='') )\n                        for (k, v) in sorted(url_params.iteritems())\n                    )\n                    url = url + '?' + query_param\n            '''\n\n        #bug solved by blackye\n        #solve get_param bug\n        #http://www.baidu.com/index.php?id=1 POST: a=1\n        # Checks for get param\n        url_params = kwargs.get('url_params', None)\n\n        if url_params is not None:\n            if hasattr(url_params, \"iteritems\"):\n                url_params = {\n                    to_utf8(k): to_utf8(v) for k, v in url_params.iteritems()\n                }\n                if urlencode:\n                     query_param = '&'.join(\n                    '%s=%s' % ( quote(k, safe=''), quote(v, safe='') )\n                    for (k, v) in sorted(url_params.iteritems()))\n                else:\n                    query_param = '&'.join(\n                        '%s=%s' % ( k, v)\n                        for (k, v) in sorted(url_params.iteritems())\n                    )\n                url = url + '?' + query_param\n                if \"sysdate\" in query_param and \"limit\" in query_param:\n                    print url, 'fuck!!'\n\n\n        # Save the properties.\n        self.__method      = method\n        self.__post_data   = post_data\n        self.__post_params = post_params\n        self.__referer     = parse_url(referer).url if referer else None\n\n        # Call the parent constructor.\n        super(URL, self).__init__(url)\n\n\n    #--------------------------------------------------------------------------\n    def __repr__(self):\n        s = \"<URL url=%r, method=%r, params=%r, referer=%r>\"\n        s %= (self.url, self.method, self.post_params, self.referer)\n        return s\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def display_name(self):\n        return \"URL\"\n\n\n    #--------------------------------------------------------------------------\n\n    @property\n    def method(self):\n        \"\"\"\n        :return: HTTP method.\n        :rtype: str\n        \"\"\"\n        return self.__method\n\n    @property\n    def post_data(self):\n        \"\"\"\n        :return: POST data.\n        :rtype: str\n        \"\"\"\n        return self.__post_data\n\n\n    #--------------------------------------------------------------------------\n\n    @property\n    def url_params(self):\n        \"\"\"\n        :return: GET parameters.\n        :rtype: dict(str -> str)\n        \"\"\"\n        query_params = self.parsed_url.query_params\n        if query_params:\n            return query_params\n        return {}\n\n    @property\n    def has_url_params(self):\n        \"\"\"\n        :return: True if there are GET parameters, False otherwise.\n        :rtype: bool\n        \"\"\"\n        return bool(self.url_params)\n\n    @property\n    def post_params(self):\n        \"\"\"\n        :return: POST parameters.\n        :rtype: dict(str -> str)\n        \"\"\"\n        if self.__post_params:\n            return self.__post_params.copy()\n        return {}\n\n    @property\n    def has_post_params(self):\n        \"\"\"\n        :return: True if there are POST parameters, False otherwise.\n        :rtype: bool\n        \"\"\"\n        return bool(self.post_params)\n\n    @property\n    def referer(self):\n        \"\"\"\n        :return: Referer for this URL.\n        :rtype: str\n        \"\"\"\n        return self.__referer\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def discovered(self):\n        if self.is_in_scope():\n            result = FolderURL.from_url(self.url)\n            result.append( BaseURL(self.url) )\n            try:\n                result.append( IP(self.hostname) )\n            except ValueError:\n                result.append( Domain(self.hostname) )\n            return result\n        return []\n\n\n#------------------------------------------------------------------------------\nclass BaseURL(_AbstractURL):\n    \"\"\"\n    Base URL.\n\n    Unlike the URL type, which refers to any URL, this type is strictly for\n    root level URLs in a web server. Plugins that only run once per web server\n    should probably receive this data type.\n\n    For example, a plugin receiving both BaseURL and URL may get this input:\n\n    - BaseURL(\"http://www.example.com/\")\n    - URL(\"http://www.example.com/\")\n    - URL(\"http://www.example.com/index.php\")\n    - URL(\"http://www.example.com/admin.php\")\n    - URL(\"http://www.example.com/login.php\")\n\n    Notice how the root level URL is sent twice,\n    once as BaseURL and again the more generic URL.\n    \"\"\"\n\n    data_subtype = \"base_url\"\n\n\n    #--------------------------------------------------------------------------\n    def __init__(self, url):\n        \"\"\"\n        :param url: Any **absolute** URL. The base will be extracted from it.\n        :type url: str\n\n        :raises ValueError: Only absolute URLs must be used.\n        \"\"\"\n\n        # Parse, verify and canonicalize the URL.\n        parsed = parse_url(url)\n        if not parsed.host or not parsed.scheme:\n            raise ValueError(\"Only absolute URLs must be used! Got: %r\" % url)\n\n        # Convert it into a base URL.\n        parsed.auth = None\n        parsed.path = \"/\"\n        parsed.fragment = None\n        parsed.query = None\n        parsed.query_char = None\n        url = parsed.url\n\n        # Call the parent constructor.\n        super(BaseURL, self).__init__(url)\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def display_name(self):\n        return \"Base URL\"\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def discovered(self):\n        if self.is_in_scope():\n            try:\n                return [IP(self.hostname)]\n            except ValueError:\n                return [Domain(self.hostname)]\n        return []\n\n\n#------------------------------------------------------------------------------\nclass FolderURL(_AbstractURL):\n    \"\"\"\n    Folder URL.\n\n    Unlike the URL type, which refers to an URL that's linked or somehow found\n    to be valid, the FolderURL type refers to inferred URLs to folders detected\n    within another URL.\n\n    This makes it semantically different, since there's no guarantee that the\n    URL actually points to a valid resource, nor that it belongs to the normal\n    web access flow.\n\n    For example, a plugin receiving both FolderURL and URL may get this input:\n\n    - URL(\"http://www.example.com/wp-content/uploads/2013/06/attachment.pdf\")\n    - FolderURL(\"http://www.example.com/wp-content/uploads/2013/06/\")\n    - FolderURL(\"http://www.example.com/wp-content/uploads/2013/\")\n    - FolderURL(\"http://www.example.com/wp-content/uploads/\")\n    - FolderURL(\"http://www.example.com/wp-content/\")\n\n    Note that the folder URLs may or may not be sent again as an URL object.\n    For example, for a site that has a link to the \"incoming\" directory in its\n    index page, we may get something like this:\n\n    - URL(\"http://www.example.com/index.html\")\n    - URL(\"http://www.example.com/incoming/\")\n    - FolderURL(\"http://www.example.com/incoming/\")\n\n    FolderURL objects are never sent for the root folder of a web site.\n    For that, see the BaseURL data type.\n    \"\"\"\n\n    data_subtype = \"folder_url\"\n\n\n    #--------------------------------------------------------------------------\n    def __init__(self, url):\n        \"\"\"\n        :param url: Absolute URL to a folder.\n        :type url: str\n\n        :raises ValueError: The URL wasn't absolute or didn't point to a folder.\n        \"\"\"\n\n        # Parse, verify and canonicalize the URL.\n        parsed = parse_url(url)\n        if not parsed.host or not parsed.scheme:\n            raise ValueError(\"Only absolute URLs must be used! Got: %r\" % url)\n        if not parsed.path.endswith(\"/\"):\n            raise ValueError(\"URL does not point to a folder! Got: %r\" % url)\n\n        # Call the parent constructor.\n        super(FolderURL, self).__init__(parsed.url)\n\n\n    #--------------------------------------------------------------------------\n    @staticmethod\n    def from_url(url):\n        \"\"\"\n        :param url: Any **absolute** URL. The folder will be extracted from it.\n        :type url: str\n\n        :returns: Inferred folder URLs.\n        :rtype: list(FolderURL)\n\n        :raises ValueError: Only absolute URLs must be used.\n        \"\"\"\n        assert isinstance(url, basestring)\n\n        # Parse, verify and canonicalize the URL.\n        parsed = parse_url(url)\n        if not parsed.host or not parsed.scheme:\n            raise ValueError(\"Only absolute URLs must be used! Got: %r\" % url)\n\n        # Extract the folders from the path.\n        path = parsed.path\n        folders = path.split(\"/\")\n        if not path.endswith(\"/\"):\n            folders.pop()\n\n        # Convert the URL to a base URL.\n        parsed.auth = None\n        parsed.path = \"/\"\n        parsed.fragment = None\n        parsed.query = None\n        parsed.query_char = None\n\n        # Generate a new folder URL for each folder.\n        folder_urls = {parsed.url}\n        for folder in folders:\n            if folder:\n                parsed.path += folder + \"/\"\n                folder_urls.add(parsed.url)\n\n        # Return the generated URLs.\n        return [FolderURL(x) for x in folder_urls]\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def display_name(self):\n        return \"Folder URL\"\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def discovered(self):\n        if self.is_in_scope():\n            result = [ BaseURL(self.url) ]\n            try:\n                result.append( IP(self.hostname) )\n            except ValueError:\n                result.append( Domain(self.hostname) )\n            return result\n        return []\n\n\n#------------------------------------------------------------------------------\nclass SpiderURL(_AbstractURL):\n    \"\"\"\n    Spider URL.\n\n    Unlike the URL type, which refers to any URL, this type is strictly for\n    root level URLs in a web server. Plugins that only run once per web server\n    should probably receive this data type.\n\n    For example, a plugin receiving both BaseURL and URL may get this input:\n\n    - BaseURL(\"http://www.example.com/\")\n    - URL(\"http://www.example.com/\")\n    - URL(\"http://www.example.com/index.php\")\n    - URL(\"http://www.example.com/admin.php\")\n    - URL(\"http://www.example.com/login.php\")\n\n    Notice how the root level URL is sent twice,\n    once as BaseURL and again the more generic URL.\n    \"\"\"\n\n    data_subtype = \"spider_url\"\n\n\n    #--------------------------------------------------------------------------\n    def __init__(self, url):\n        \"\"\"\n        :param url: Any **absolute** URL. The base will be extracted from it.\n        :type url: str\n\n        :raises ValueError: Only absolute URLs must be used.\n        \"\"\"\n        # Call the parent constructor.\n        super(SpiderURL, self).__init__(url)\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def display_name(self):\n        return \"Spider URL\"\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def discovered(self):\n        if self.is_in_scope():\n            try:\n                return [IP(self.hostname)]\n            except ValueError:\n                return [Domain(self.hostname)]\n        return []"
  },
  {
    "path": "lalascan/data/vuln/__init__.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n__author__ = 'BlackYe.'\n"
  },
  {
    "path": "lalascan/data/vuln/vulnerability.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nVulnerability types.\n\"\"\"\n\n__author__ = 'BlackYe.'\n\n__all__ = [\n    \"Vulnerability\",\n    \"WebVulnerability\",\n]\n\nfrom .. import Data\nfrom ..resource import Resource\nfrom ..resource.url import BaseURL, FolderURL, URL\nfrom lalascan.utils.text_utils import to_utf8\nfrom ...api.exception import LalascanSystemException\nfrom ...data.enum import RISK_LEVEL\n\nfrom conf import CACHEDIR, LEAK_JSON_FILE, join_path_func\n\nfrom collections import defaultdict\nfrom inspect import getmro\nfrom textwrap import dedent\nfrom warnings import warn\nimport json\n\n\n#------------------------------------------------------------------------------\n# Base class for all vulnerabilities.\n\nclass Vulnerability(Data):\n    \"\"\"\n    Vulnerability Base Class\n    \"\"\"\n\n    max_vulnerabilities = 0\n\n    # Vulnerability levels.\n    VULN_LEVELS = (\"informational\", \"low\", \"middle\", \"high\", \"critical\")\n\n    # Default vuln properties.\n    # Note: plugin_id and custom_id must NOT be defined here.\n    DEFAULTS = {\n        \"level\":          \"low\",\n        \"impact\":           0,\n        \"severity\":         0,\n        \"risk\":             0,\n        \"title\":            None,  # special value, do not change!\n        \"description\":      None,  # special value, do not change!\n        \"solution\":         None,  # special value, do not change!\n        \"references\":       (),\n    }\n\n    def __init__(self, target, **kwargs):\n        pass\n\n\n#------------------------------------------------------------------------------\nclass WebVulnerability(Vulnerability):\n    \"\"\"\n    Base class for web vulnerabilities\n    \"\"\"\n\n    # Vulnerability levels.\n    VULN_LEVELS = (\"informational\", \"low\", \"middle\", \"high\")\n\n    # Default vuln properties.\n    # Note: plugin_id and custom_id must NOT be defined here.\n    DEFAULTS = {\n        \"level\":            \"low\",\n        \"impact\":           0,\n        \"severity\":         0,\n        \"risk\":             0,\n        \"title\":            None,  # special value, do not change!\n        \"description\":      None,  # special value, do not change!\n        \"solution\":         None,  # special value, do not change!\n        \"references\":       (),\n    }\n\n\n    #--------------------------------------------------------------------------\n    def __init__(self, target, **kwargs):\n\n        # Sanitize the \"target\" argument.\n        target = self._sanitize_url(self, target)\n\n        self._leak_info = self._load_leakinfo()\n\n        # Save the raw URL.\n        self.__url = target.url\n\n        # Save the Method\n        self.__vul_method = kwargs.get('method')\n\n        #vul params point key\n        self.__vulparam_point = kwargs.get('vulparam_point')\n\n        #test case payload\n        self.__payload = kwargs.get('payload')\n\n        #vul type\n        self.__vul_type = kwargs.get('injection_type')\n\n        #response info\n        self.__vul_response = kwargs.get('vul_response')\n\n        # Parent constructor.\n        super(WebVulnerability, self).__init__(target, **kwargs)\n\n\n    #--------------------------------------------------------------------------\n    @staticmethod\n    def _sanitize_url(self, url, stacklevel = 2):\n        if (\n            not isinstance(url, URL) and\n            not isinstance(url, FolderURL) and\n            not isinstance(url, BaseURL)\n        ):\n            if isinstance(url, basestring):\n                msg = \"You should pass an URL object\" \\\n                      \" to %s instead of a string!\"\n                msg %= self.__class__.__name__\n                url = URL(str(url))\n            elif hasattr(url, \"url\"):\n                try:\n                    t = url.__class__.__name__\n                except Exception:\n                    t = str(type(url))\n                msg = \"You should pass an URL object to %s instead of %s!\"\n                msg %= (self.__class__.__name__, t)\n                url = url.url\n                if isinstance(url, basestring):\n                    url = URL(str(url))\n                elif not isinstance(url, URL):\n                    raise TypeError(\"Expected URL, got %r instead\" % t)\n            warn(msg, RuntimeWarning, stacklevel=stacklevel+1)\n        return url\n\n    def _load_leakinfo(self):\n        #TODO Get Content from leak Json\n        with open(join_path_func(CACHEDIR, LEAK_JSON_FILE)) as f:\n            _json_content = f.read()\n            try:\n                leak_json = json.loads(_json_content)\n                return leak_json\n            except Exception,e:\n                raise LalascanSystemException(e)\n\n    #--------------------------------------------------------------------------\n    def __str__(self):\n        return self.url\n\n\n    #--------------------------------------------------------------------------\n    '''\n    def __repr__(self):\n        return \"<%s url=%r plugin_id=%r level=%r desc=%r>\" % (\n            self.__class__.__name__,\n            self.url,\n            self.level,\n            self.description,\n        )\n    '''\n\n    #--------------------------------------------------------------------------\n    @property\n    def url(self):\n        \"\"\"\n        :return: Raw URL where the vuln was found.\n        :rtype: str\n        \"\"\"\n        return self.__url\n\n\n    #--------------------------------------------------------------------------\n    def __get_default_text(self, propname):\n        text = self.DEFAULTS.get(propname, None)\n        return text\n\n    @property\n    def injection_type(self):\n        if self._leak_info.has_key('%s' % self.__vul_type):\n            leak_info = self._leak_info['%s' % self.__vul_type]\n            if leak_info is not None:\n                self.__risk_level = int(leak_info['risk_level'])\n                if self.__risk_level == 4:\n                    self.__risk_level_desc = RISK_LEVEL.HIGH\n                elif self.__risk_level == 3:\n                    self.__risk_level_desc = RISK_LEVEL.MIDDLE\n                elif self.__risk_level == 2:\n                    self.__risk_level_desc = RISK_LEVEL.LOW\n                elif self.__risk_level == 1:\n                    self.__risk_level_desc = RISK_LEVEL.INFO\n\n                self.__sli_id = int(leak_info['id'])\n\n                return leak_info['leak_name']\n\n    #maybe UnicodeEncodeError\n    def get_injection_type_desc(self):\n        if self._leak_info.has_key('%s' % self.__vul_type):\n            leak_info = self._leak_info['%s' % self.__vul_type]\n            if leak_info is not None:\n                return leak_info['leak_name_cn']\n\n    @property\n    def vul_method(self):\n        return self.__vul_method\n\n    @property\n    def vulparam_point(self):\n        return self.__vulparam_point\n\n    @property\n    def payload(self):\n        return self.__payload\n\n    @property\n    def vul_response(self):\n        return self.__vul_response\n\n    @property\n    def vul_risk(self):\n        return self.__risk_level\n\n    @property\n    def vul_risk_desc(self):\n        return self.__risk_level_desc\n\n    @property\n    def vul_sli_id(self):\n        return self.__sli_id"
  },
  {
    "path": "lalascan/launcher.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nfrom lalascan.libs.core.pluginmanager import PluginManager, PluginImporter\nfrom lalascan.libs.core.common import readfile, post_query, cookie_query\nfrom lalascan.libs.core.globaldata import register_plugins, conf, db_audit, vulresult, source_result\nfrom lalascan.libs.core.report import TextReport\nfrom lalascan.libs.core.scope import AuditScope, DummyScope\nfrom lalascan.libs.core.spider import spider_task\nfrom lalascan.libs.core.threads import plugin_run_thread, execute_plugin, MyResourcePool, MyGeventPool\n\nfrom lalascan.data.resource.url import URL\nfrom lalascan.data.resource.domain import Domain\n\nfrom lalascan.models.scan_task import ScanTask\n\nfrom lalascan.utils.mytime import MyTime\n\n\ndef init():\n\n    source_result.start_time = MyTime.get_current_datetime()\n\n    http_req_initoption()\n    get_multiple_target()\n\ndef run():\n    report = TextReport()\n\n    pluginmanager = PluginManager()\n    pluginmanager.set_plugin()\n\n    proPool = MyResourcePool(4)\n    for m_resource in conf.targets:\n        print '*' * 50\n        proPool.apply_async(execute_plugin, (register_plugins, m_resource,))\n\n    proPool.close()\n    try:\n        proPool.join()\n    except KeyboardInterrupt,e:\n        print 'fuck!'\n\n    source_result.end_time = MyTime.get_current_datetime()\n    report.generate_report()\n\ndef get_multiple_target():\n\n    #TODO infocollect\n\n    #add scan task into db\n    scan_task_model = ScanTask(audit_name = conf.audit_name, scan_url = conf.url, starttime = MyTime.get_current_datetime(), finishtime = MyTime.get_current_datetime())\n    db_audit.session.add(scan_task_model)\n    db_audit.session.commit()\n    _set_task_id(source_result, scan_task_model.id)\n\n    if conf.bspider:\n        spider_task(conf.audit_name)\n\n    else:\n        if conf.post_data is not None:\n            m_resource = URL(url = conf.url , post_params = post_query(conf.post_data), method = 'POST')\n        else:\n            m_resource = URL(url = conf.url, method = 'GET')\n        conf.targets.append(m_resource)\n\n    conf.audit_scope.roots = ['www.baidu.com', 'bbs.baidu.com']\n    conf.audit_scope.domains = 'www.baidu.com'\n    conf.audit_scope.addresses = '192.168.0.1'\n    conf.audit_scope.web_pages = \"http://www.baidu.com\"\n\n    #scan_task_model = ScanTask(audit_name = conf.audit_name, scan_url = conf.url, starttime = MyTime.get_current_datetime(), finishtime = MyTime.get_current_datetime())\n    #db_audit.session.add(scan_task_model)\n    #db_audit.session.commit()\n\ndef init_report():\n    report = TextReport()\n    report.generate_report()\n\ndef http_req_initoption():\n    _set_http_useragnet()\n    _set_http_cookie()\n\ndef _set_http_useragnet():\n    pass\n\ndef _set_http_cookie():\n    conf.cookie = cookie_query(conf.cookie)\n\ndef _set_http_referer():\n    pass\n\ndef _set_http_proxy():\n    pass\n\ndef _set_http_timeout():\n    pass\n\n\ndef _set_task_id(source_result, task_id):\n\n    source_result.task_id = task_id\n    return source_result"
  },
  {
    "path": "lalascan/libs/__init__.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n"
  },
  {
    "path": "lalascan/libs/core/__init__.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n"
  },
  {
    "path": "lalascan/libs/core/common.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nimport os\n\n\nfrom lalascan.api.exception import LalascanTypeError, LalascanValueError\n\nfrom lalascan.libs.core.settings import BANNER\nfrom lalascan.libs.core.settings import BANNER, UNICODE_ENCODING\nfrom lalascan.libs.core.logger import LOGGER_HANDLER\n\nfrom lalascan.data.enum import CUSTOM_LOGGING\nfrom lalascan.utils.text_utils import to_utf8\n\nfrom lalascan.api.exception import LalascanSystemException\n\nfrom thirdparty_libs.colorizer import colored\n\nfrom urllib import quote, quote_plus, unquote, unquote_plus\nimport sys\nimport re\nimport datetime, time\nimport random\nimport hashlib\nimport urllib\n\ndef banner():\n    \"\"\"\n    Function prints lalascan banner with its version\n    \"\"\"\n    _ = BANNER\n    #if not getattr(LOGGER_HANDLER, \"is_tty\", False):\n    #    _ = re.sub(\"\\033.+?m\", \"\", _)\n    #dataToStdout(_)\n    print _\n\n\ndef console_output(data, bold = True):\n    \"\"\"\n    Writes text to the stdout (console) stream\n    \"\"\"\n\n    if isinstance(data, unicode):\n        message = _stdoutencode(data)\n    else:\n        message = data\n\n    sys.stdout.write(_setColor(message, bold))\n\n    try:\n        sys.stdout.flush()\n    except IOError:\n        pass\n\n    return\n\n\ndef _stdoutencode(data):\n    retVal = None\n\n    try:\n        data = data or \"\"\n        retVal = data.encode(sys.stdout.encoding)\n    except:\n        retVal = data.encode(UNICODE_ENCODING) if isinstance(data, unicode) else data\n\n    return retVal\n\ndef _setColor(message, bold=False):\n    retVal = message\n\n    if message and getattr(LOGGER_HANDLER, \"is_tty\", False):  # colorizing handler\n        if bold:\n            retVal = colored(message, color= None, on_color=None, attrs=(\"bold\",))\n    return retVal\n\n\ntry:\n    # The fastest JSON parser available for Python.\n    from cjson import decode as json_decode\n    from cjson import encode as json_encode\nexcept ImportError:\n    try:\n        # Faster than the built-in module, usually found.\n        from simplejson import loads as json_decode\n        from simplejson import dumps as json_encode\n    except ImportError:\n        # Built-in module since Python 2.6, very very slow!\n        from json import loads as json_decode\n        from json import dumps as json_encode\n\n# Remove the docstrings. This prevents errors when generating the API docs.\ntry:\n    json_encode.__doc__ = \"\"\nexcept Exception:\n    _orig_json_encode = json_encode\n    def json_encode(*args, **kwargs):\n        return _orig_json_encode(*args, **kwargs)\ntry:\n    json_decode.__doc__ = \"\"\nexcept Exception:\n    _orig_json_decode = json_decode\n    def json_decode(*args, **kwargs):\n        return _orig_json_decode(*args, **kwargs)\n\n\ndef readfile(filename):\n    try:\n        with open(filename) as f:\n            retval = f.read()\n        return retval\n    except IOError, ex:\n        errMsg = \"something went wrong while trying to read \"\n        errMsg += \"the input file ('%s')\" % ex\n        raise LalascanSystemException(errMsg)\n\n\ndef multiple_replace(text, adict):\n    rx = re.compile(\"|\".join(map(re.escape, adict)))\n\n    def oneXlat(match):\n        return adict[match.group(0)]\n    return rx.sub(oneXlat, text)\n\n#--------------------------------------------------------\n# http option\n\ndef get_domain(url):\n    if isinstance(url, str):\n        try:\n            protocol, __ = urllib.splittype(url)\n            host = urllib.splitnport(urllib.splithost(__)[0])\n            return host[0]\n        except Exception:\n            return None\n\n\n\ndef post_query(query):\n\n    try:\n        # much faster than parse_qsl()\n        query_params = dict(( map(unquote_plus, (to_utf8(token) + '=').split('=', 2)[:2])\n                              for token in query.split('&') ))\n        if len(query_params) == 1 and not query_params.values()[0]:\n            query_params = {}\n        else:\n            query = None\n    except Exception:\n        ##raise   # XXX DEBUG\n        query_params = {}\n    return query_params\n\ndef cookie_query(cookie_query):\n    try:\n        # much faster than parse_qsl()\n        cookie_params = dict(( map(unquote_plus, (to_utf8(token) + '=').split('=', 2)[:2])\n                              for token in cookie_query.split(';') ))\n        if len(cookie_params) == 1 and not cookie_params.values()[0]:\n            cookie_params = {}\n        else:\n            query = None\n    except Exception:\n        ##raise   # XXX DEBUG\n        cookie_params = {}\n    return cookie_params\n\n#---------------------------------------------\n\ndef generate_audit_name(url):\n\n    if not isinstance(url, str):\n        raise LalascanTypeError('target url %s must bu STR_Object' % url)\n\n    domain = get_domain(url)\n    if domain is not None:\n        cur_time =  str(int(time.mktime(datetime.datetime.now().timetuple())))\n        seed =  ''.join(random.sample('abcdefghijklmnopqrstuvwxyz!@#$%^&*', 5))\n        __ = hashlib.md5()\n        __.update(cur_time + seed)\n        return '{0}_{1}'.format(domain, __.hexdigest())\n    else:\n        raise LalascanValueError('target audit_name type error!')\n\n\n"
  },
  {
    "path": "lalascan/libs/core/globaldata.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\n'''\nglobal var data\n'''\n\nfrom lalascan.libs.core.logger import _ScanLog\nfrom lalascan.data.datatype import AttribDict\nfrom lalascan.models import _DBConfig\nfrom multiprocessing import Queue\n\n# object to share within function and classes command\n# line options and settings\nconf = AttribDict()\n\nsource_result = AttribDict()\nconf.audit_scope = AttribDict()\n\n# logger\nclass L(object):\n    logger = None\n\n    @classmethod\n    def set_logfilepath(cls, audit_name):\n        L.logger = _ScanLog(audit_name)\n\ndb_audit = _DBConfig()\n\n#global multiprocessing result var\nvulresult = Queue()\n\n# Dictionary storing\n# (1)targets, (2)registeredPocs, (3) bruteMode\n# (4)results, (5)pocFiles\n# (6)multiThreadMode \\ threadContinue \\ threadException\n#kb = AttribDict()\n\ncmdLineOptions = AttribDict()\n\nregister_plugins = AttribDict()\n#registeredPocs = {}\n\n\n#defaults = AttribDict(defaults)\n\n"
  },
  {
    "path": "lalascan/libs/core/logger.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\n#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\nimport logging\nimport sys\n\nfrom lalascan.data.enum import CUSTOM_LOGGING\nfrom lalascan.libs.core.singletonclass import Singleton\nfrom conf import CACHELOG, join_path_func\n\nlogging.addLevelName(CUSTOM_LOGGING.SYSINFO, \"*\")\nlogging.addLevelName(CUSTOM_LOGGING.SUCCESS, \"+\")\nlogging.addLevelName(CUSTOM_LOGGING.ERROR, \"-\")\nlogging.addLevelName(CUSTOM_LOGGING.WARNING, \"!\")\n\nLOGGER = logging.getLogger(\"lalascan\")\n\nLOGGER_HANDLER = None\nLOGGER_FILE_HANDLER = None\n\ntry:\n    from thirdparty_libs.ansistrm.ansistrm import ColorizingStreamHandler\n\n    disableColor = False\n\n    for argument in sys.argv:\n        if \"disable-col\" in argument:\n            disableColor = True\n            break\n\n    if disableColor:\n        LOGGER_HANDLER = logging.StreamHandler(sys.stdout)\n    else:\n        LOGGER_HANDLER = ColorizingStreamHandler(sys.stdout)\n        LOGGER_HANDLER.level_map[logging.getLevelName(\"*\")] = (None, \"cyan\", False)\n        LOGGER_HANDLER.level_map[logging.getLevelName(\"+\")] = (None, \"green\", False)\n        LOGGER_HANDLER.level_map[logging.getLevelName(\"-\")] = (None, \"red\", False)\n        LOGGER_HANDLER.level_map[logging.getLevelName(\"!\")] = (None, \"yellow\", False)\nexcept ImportError, e:\n    print str(e)\n    LOGGER_HANDLER = logging.StreamHandler(sys.stdout)\n\nFORMATTER = logging.Formatter(\"\\r[%(asctime)s] [%(levelname)s] %(name)s: %(message)s\", datefmt = \"%Y-%m-%d %H:%M:%S\")\n\nLOGGER_HANDLER.setFormatter(FORMATTER)\nLOGGER.addHandler(LOGGER_HANDLER)\nLOGGER.setLevel(CUSTOM_LOGGING.WARNING)\n\n\nclass _ScanLog(Singleton):\n\n    def __init__(self, audit_name):\n        #写入磁盘cache目录下\n        bcahce_log = True\n        if bcahce_log:\n            LOGGER_FILE_HANDLER = logging.FileHandler(join_path_func(CACHELOG, audit_name))\n            LOGGER_FILE_HANDLER.setFormatter(FORMATTER)\n            LOGGER.addHandler(LOGGER_FILE_HANDLER)\n        super(Singleton, self).__init__()\n\n    def log_verbose(self, msg):\n        LOGGER.log(CUSTOM_LOGGING.SYSINFO ,msg)\n\n    def log_warning(self, msg):\n        LOGGER.log(CUSTOM_LOGGING.WARNING, msg)\n\n    def log_success(self, msg):\n        LOGGER.log(CUSTOM_LOGGING.SUCCESS, msg)\n\n    def log_error(self, msg):\n        LOGGER.log(CUSTOM_LOGGING.ERROR, msg)\n\n\n"
  },
  {
    "path": "lalascan/libs/core/plugin.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nfrom lalascan.api.exception import LalascanNotImplementedError\n\nfrom lalascan.libs.net.web_mutants import get_request\nfrom lalascan.libs.core.globaldata import conf\n\nfrom lalascan.data.resource import Data\nfrom lalascan.data.resource.url import URL\n\nfrom inspect import isclass\nfrom time import sleep\n\nclass PluginBase(object):\n\n    def __init__(self):\n        pass\n\n    def get_accepted_types(self):\n        raise LalascanNotImplementedError()\n\n    def run(self, info):\n        raise LalascanNotImplementedError()\n\n    def run_plugin(self, resource_input, resource_method , resource_param):\n\n        #gevent pool run scan policy\n        if isinstance(resource_input, Data):\n            data = resource_input\n\n            try:\n                accepted_info = self.get_accepted_types()\n                if isclass(accepted_info):\n                    found = data.is_instance(accepted_info)\n                else:\n                    found = False\n                    for clazz in accepted_info:\n                        if data.is_instance(clazz):\n                            found = True\n                            break\n\n                if not found:\n                    msg = \"Plugin %s cannot process data of type %s\"\n                    raise TypeError(msg % ('sqli', type(data)))\n\n                if isinstance(data, URL):\n                    #test url whether access\n                    if get_request(url = data, allow_redirects = False) is None:\n                        return\n\n                # Call the plugin.\n                print resource_param\n                result = self.run(data, method = resource_method, param = resource_param)\n                sleep(0.05)\n                return result\n\n            except LalascanNotImplementedError:\n                pass"
  },
  {
    "path": "lalascan/libs/core/pluginmanager.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\n\nfrom lalascan.libs.core.globaldata import conf, L\nfrom lalascan.data.enum import CUSTOM_LOGGING\nfrom lalascan.libs.core.common import readfile, multiple_replace\nfrom lalascan.libs.core.settings import PLUGIN_SUFFIX\n\nfrom lalascan.api.exception import LalascanFileNotFoundException, LalascanSystemException, LalascanValueError\nfrom conf import PLUGINDIR\n\nfrom .settings import PLUGIN_IMPORTDICT\nfrom .settings import PLUGIN_CLASSNAME_REGEX\nfrom .settings import PLUGIN_REGISTER_REGEX\nfrom .settings import PLUGIN_REGISTER_STRING\n\n\nimport sys\nimport os\nimport re\nimport imp\nimport marshal\n\nclass PluginManager(object):\n\n    def __init__(self, audit = None):\n\n        self.__audit = audit\n\n        self.__all_plugin_name = set()  #contains sqli,reflect_xss\n        self.__all_fplugin = set()\n\n        #或许所有的插件\n        self.__get_all_plugin()\n\n    def set_plugin(self):\n        \"\"\"\n        @function 设置载入的plugin\n        \"\"\"\n        if conf.plugins is not None:\n            if len(conf.plugins.split(\",\")) > 1:\n                for _ in conf.plugins.split(\",\"):\n                    plugin_name = _.strip(' ')\n                    retval = self._load_plugin_by_name(plugin_name)\n            else:\n                plugin_name = conf.plugins\n                self._load_plugin_by_name(plugin_name)\n\n        else:\n            # all plugin load\n            # conf.pocFile = None\n            self._load_all_plugin()\n\n    def _load_all_plugin(self):\n        for plugin_name in self.__all_plugin_name:\n            try:\n                self._load_plugin_by_name(plugin_name)\n            except LalascanFileNotFoundException,e:\n                L.logger.log_error(str(e))\n            except LalascanSystemException,e:\n                L.logger.log_error(str(e))\n\n            except ImportError, ex:\n                errmsg = \"%s register failed \\\"%s\\\"\" % (plugin_name, str(ex))\n                L.logger.log_error(errmsg)\n\n    def _load_plugin_by_name(self, plugin_name):\n        try:\n            fplugin = self.__get_plugin_by_name(plugin_name)\n\n            plugin_module = plugin_name + PLUGIN_SUFFIX\n            retval = self.__load_plugin(plugin_module, fplugin)\n            #print retval[plugin_module]\n\n            if retval[plugin_module] != '':\n                importer = PluginImporter(plugin_name, retval[plugin_module])\n                importer.load_module(plugin_name)\n\n        except LalascanFileNotFoundException,e:\n            L.logger.log_error(str(e))\n\n        except LalascanSystemException,e:\n            L.logger.log_error(str(e))\n\n        except ImportError, ex:\n            errmsg = \"%s register failed \\\"%s\\\"\" % (plugin_name, str(ex))\n            L.logger.log_error(errmsg)\n            #logger.log(CUSTOM_LOGGING.ERROR, errMsg)\n\n        return\n\n    def __get_plugin_by_name(self, plugin_name):\n        for fplugin in self.__all_fplugin:\n            try:\n                plugin_module = plugin_name + PLUGIN_SUFFIX\n                if plugin_module == fplugin[fplugin.rindex('/') + 1:]:\n                     return fplugin\n            except LalascanValueError:\n                pass\n        raise LalascanFileNotFoundException(\"%s plugin not found\" % plugin_name)\n\n\n    def __get_all_plugin(self):\n        #for plugin_path in os.walk(PLUGINDIR):\n        plugin_path = [plugin for plugin in os.walk(PLUGINDIR)]\n        for plugin_folder, folder_list , fplugin_list in plugin_path:\n            for each_file in fplugin_list:\n                if each_file != '__init__.py' and '.pyc' not in each_file and each_file.endswith(PLUGIN_SUFFIX):\n                    self.__all_plugin_name.add(each_file.strip(PLUGIN_SUFFIX))\n                    self.__all_fplugin.add(os.path.join(plugin_folder, each_file))\n\n\n    def __load_plugin(self, plugin_name, fplugin):\n\n        try:\n            plugin_content = readfile(fplugin)\n        except LalascanSystemException:\n            raise LalascanSystemException(\"%s plugin file can not be read\" % plugin_name)\n\n        if plugin_content is not None:\n\n            #TODO need check get_accept_type and run method\n\n            if not re.search(PLUGIN_REGISTER_REGEX, plugin_content):\n                #not register, plugin is enable\n\n                #className = self.__get_plugin_classname(plugin_content)\n                #plugin_content += PLUGIN_REGISTER_STRING.format(className)\n\n                warnmsg = \"plugin: %s not register\" % plugin_name\n                L.logger.log_warning(warnmsg)\n                retval = ''\n            else:\n                #retval = multiple_replace(plugin_content, PLUGIN_IMPORTDICT)\n                retval = plugin_content\n\n        return {plugin_name: retval}\n\n\n    def __get_plugin_classname(self, poc):\n        try:\n            className = re.search(PLUGIN_CLASSNAME_REGEX, poc).group(1)\n        except:\n            className = \"\"\n        return className\n\n\nclass PluginImporter(object):\n\n    \"\"\"\n    Use custom meta hook to import modules available as strings.\n    Cp. PEP 302 http://www.python.org/dev/peps/pep-0302/#specification-part-2-registering-hooks\n    \"\"\"\n\n    def __init__(self, fullname, contents):\n        self.fullname = fullname\n        self.contents = contents\n\n    def load_module(self, fullname):\n        if fullname in sys.modules:\n            return sys.modules[fullname]\n\n        mod = sys.modules.setdefault(fullname, imp.new_module(fullname))\n        mod.__file__ = \"<%s>\" % fullname\n        mod.__loader__ = self\n        if False: #conf.isPycFile\n            code = marshal.loads(self.contents[8:])\n        else:\n            code = compile(self.contents, mod.__file__, \"exec\")\n        exec code in mod.__dict__\n        return mod\n\n    @classmethod\n    def del_module(cls, modname):\n        from sys import modules\n        try:\n            thismod = modules[modname]\n        except KeyError:\n            raise ValueError(modname)\n        these_symbols = dir(thismod)\n        del modules[modname]\n        for mod in modules.values():\n            try:\n                delattr(mod, modname)\n            except AttributeError:\n                pass"
  },
  {
    "path": "lalascan/libs/core/pluginregister.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nfrom .globaldata import register_plugins\n\ndef reg_instance_plugin(plugin_class):\n    module = plugin_class.__module__.split('.')[-1]\n    if module in register_plugins:\n        return\n\n    register_plugins[module] = plugin_class()\n"
  },
  {
    "path": "lalascan/libs/core/report.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nfrom ...libs.core.globaldata import conf, vulresult, source_result, db_audit\nfrom ...models.auditdb import AuditMysqlDB\nfrom ...models.scan_vuldetail import ScanVulDetail\nfrom ...data import Data\nfrom ...data.resource.domain import Domain\nfrom ...data.resource.ip import IP\nfrom ...data.resource.url import BaseURL, URL\nfrom ...data.vuln.vulnerability import WebVulnerability\n\nfrom ...utils.console_utils import get_terminal_size, colorize_substring, colorize\nfrom ...utils.mytime import MyTime\nfrom ...utils import _str2bs64\n\nfrom thirdparty_libs.texttable import Texttable\nfrom thirdparty_libs.prettytable.prettytable import PrettyTable\n\n\nimport sys\nfrom collections import defaultdict\n\nclass TextReport():\n\n    #--------------------------------------------------------------------------\n    def generate_report(self):\n        self.__show_data = True\n        self.__console = True\n        self.__color   = True #Console.use_colors\n        self.__width   = max(0, get_terminal_size()[0])\n        self.__fd      = sys.stdout\n        self.__write_report()\n\n    #--------------------------------------------------------------------------\n    def __write_report(self):\n\n        # Header\n        print >>self.__fd, \"\"\n        print >>self.__fd, \"--= %s =--\" % self.__colorize(\"Report\", \"cyan\")\n        print >>self.__fd, \"\"\n\n        # Summary\n        #start_time, stop_time, run_time = parse_audit_times( *get_audit_times() )\n        start_time, stop_time, run_time = MyTime.parse_audit_times(source_result.start_time, source_result.end_time)\n\n        #host_count  = Database.count(Data.TYPE_RESOURCE, Domain.data_subtype)\n        #host_count += Database.count(Data.TYPE_RESOURCE, IP.data_subtype)\n        #vuln_count  = Database.count(Data.TYPE_VULNERABILITY)\n        host_count = 2\n        #vuln_count = 3\n        print >>self.__fd, \"-# %s #- \" % self.__colorize(\"Summary\", \"yellow\")\n        print >>self.__fd, \"\"\n        print >>self.__fd, \"Audit started:   %s\" % self.__colorize(start_time, \"yellow\")\n        print >>self.__fd, \"Audit ended:     %s\" % self.__colorize(stop_time, \"yellow\")\n        print >>self.__fd, \"Execution time:  %s\" % self.__colorize(run_time, \"yellow\")\n        print >>self.__fd, \"\"\n        print >>self.__fd, \"Scanned hosts:   %s\" % self.__colorize(str(host_count), \"yellow\")\n        #print >>self.__fd, \"Vulnerabilities: %s\" % self.__colorize(str(vuln_count), \"red\" if vuln_count else \"yellow\")\n        print >>self.__fd, \"\"\n\n        '''\n        # Audit scope\n        if self.__show_data or not self.__console:\n            table = Texttable()\n            scope_domains = conf.audit_scope.roots\n            if conf.audit_scope.addresses:\n                table.add_row((\"IP addresses\", conf.audit_scope.addresses))\n            if scope_domains:\n                table.add_row((\"Domains\", scope_domains))\n            if conf.audit_scope.web_pages:\n                table.add_row((\"Web pages\", conf.audit_scope.web_pages))\n\n            if table._rows:\n                self.__fix_table_width(table)\n                print >>self.__fd, \"-# %s #- \" % self.__colorize(\"Audit Scope\", \"yellow\")\n                print >>self.__fd, \"\"\n                print >>self.__fd, table.draw()\n                print >>self.__fd, \"\"\n        '''\n        '''\n        # Discovered hosts\n        if self.__show_data:\n            need_header = True\n            for domain in self.__iterate(Data.TYPE_RESOURCE, Domain.data_subtype):\n                table = Texttable()\n                #self.__add_related(table, domain, Data.TYPE_INFORMATION, Geolocation.data_subtype, \"Location\")\n                #self.__add_related(table, domain, Data.TYPE_INFORMATION, WebServerFingerprint.data_subtype, \"Web Server\")\n                #self.__add_related(table, domain, Data.TYPE_INFORMATION, OSFingerprint.data_subtype, \"OS Fingerprint\")\n                if table._rows:\n                    if need_header:\n                        need_header = False\n                        print >>self.__fd, \"-# %s #- \" % self.__colorize(\"Hosts\", \"yellow\")\n                        print >>self.__fd, \"\"\n                    table.header((\"Domain Name\", domain.hostname))\n                    self.__fix_table_width(table)\n                    text = table.draw()\n                    if self.__color:\n                        text = colorize_substring(text, domain.hostname, \"red\" if domain.get_links(Data.TYPE_VULNERABILITY) else \"green\")\n                    print >>self.__fd, text\n                    print >>self.__fd, \"\"\n            for ip in self.__iterate(Data.TYPE_RESOURCE, IP.data_subtype):\n                table = Texttable()\n                self.__add_related(table, ip, Data.TYPE_RESOURCE, Domain.data_subtype, \"Domain Name\")\n                if table._rows:\n                    if need_header:\n                        need_header = False\n                        print >>self.__fd, \"-# %s #- \" % self.__colorize(\"Hosts\", \"yellow\")\n                        print >>self.__fd, \"\"\n                    table.header((\"IP Address\", ip.address))\n                    self.__fix_table_width(table)\n                    text = table.draw()\n                    if self.__color:\n                        text = colorize_substring(text, ip.address, \"red\" if ip.get_links(Data.TYPE_VULNERABILITY) else \"green\")\n                    print >>self.__fd, text\n                    print >>self.__fd, \"\"\n\n        # Web servers\n        if self.__show_data and 1:\n            print >>self.__fd, \"-# %s #- \" % self.__colorize(\"Web Servers\", \"yellow\")\n            print >>self.__fd, \"\"\n            crawled = defaultdict(list)\n            vulnerable = []\n            for url in self.__iterate(Data.TYPE_RESOURCE, URL.data_subtype):\n                crawled[url.hostname].append(url.url)\n                if self.__color and url.get_links(Data.TYPE_VULNERABILITY):\n                    vulnerable.append(url)\n            for url in self.__iterate(Data.TYPE_RESOURCE, BaseURL.data_subtype):\n                table = Texttable()\n                table.header((\"Base URL\", url.url))\n                #self.__add_related(table, url, Data.TYPE_INFORMATION, WebServerFingerprint.data_subtype, \"Server\")\n                #self.__add_related(table, url, Data.TYPE_INFORMATION, OSFingerprint.data_subtype, \"Platform\")\n                urls = crawled[url.hostname]\n                if urls:\n                    urls.sort()\n                    table.add_row((\"Visited URLs\", \"\\n\".join(urls)))\n                if table._rows:\n                    self.__fix_table_width(table)\n                    text = table.draw()\n                    if self.__color:\n                        p = text.find(\"\\n\")\n                        p = text.find(\"\\n\", p + 1)\n                        p = text.find(\"\\n\", p + 1)\n                        if p > 0:\n                            text = colorize_substring(text[:p], url.url, \"red\" if url.get_links(Data.TYPE_VULNERABILITY) else \"green\") + text[p:]\n                        for u in vulnerable:\n                            if u != url.url:\n                                text = colorize_substring(text, u, \"red\")\n                    print >>self.__fd, text\n                    print >>self.__fd, \"\"\n        '''\n\n        # Vulnerabilities\n        print >>self.__fd, \"-# %s #- \" % self.__colorize(\"Vulnerabilities\", \"yellow\")\n        print >>self.__fd, \"\"\n        #count = Database.count(Data.TYPE_VULNERABILITY)\n        count = vulresult.qsize()\n        if count:\n            if self.__show_data:\n                print >>self.__fd, self.__colorize(\"%d vulnerabilities found!\" % count, \"red\")\n                print >>self.__fd, \"\"\n\n            if vulresult.qsize() > 0:\n                table = Texttable()\n                table.add_row([\"Vul Type\", \"Vul Url\", \"Vul Parameter\", \"Payload\", \"Method\", \"Risk Level\"])\n\n                while vulresult.qsize() > 0:\n                    _ = vulresult.get()\n                    table.add_row([_.injection_type,\n                                   _.url,\n                                   _.vulparam_point,\n                                   _.payload,\n                                   _.vul_method,\n                                   _.vul_risk_desc]\n                                  )\n\n                    #audit_db insert scan result into db\n                    vul_detail = ScanVulDetail(st_id          = source_result.task_id,\n                                               sli_id         = _.vul_sli_id,\n                                               url            = _.url,\n                                               vulparam_point = _.vulparam_point,\n                                               method         = _.vul_method,\n                                               payload        = _.payload,\n                                               get_param      = None,\n                                               post_param     = None,\n                                               ori_req_header = _str2bs64(_.vul_response.raw_request.headers.get_headers()),\n                                               ori_resp_header= _str2bs64(str(_.vul_response.headers.get_headers())),\n                                               ori_resp_body  = _str2bs64(_.vul_response.data),\n                                               insert_time    = MyTime.get_current_datetime()\n                                             )\n                    db_audit.session.add(vul_detail)\n                    db_audit.session.commit()\n\n                self.__fix_vul_table_width(table)\n                text = table.draw()\n\n                print >>self.__fd, text\n                print >>self.__fd, \"\"\n\n        else:\n            print >>self.__fd, self.__colorize(\"No vulnerabilities found.\", \"green\")\n            print >>self.__fd, \"\"\n\n\n    #--------------------------------------------------------------------------\n    def __gather_vulnerable_resources(self, vuln):\n        vulnerable = []\n        visited = set()\n        queue = [vuln]\n        while queue:\n            data = queue.pop()\n            identity = data.identity\n            if identity not in visited:\n                visited.add(identity)\n                if data.data_type == Data.TYPE_RESOURCE:\n                    vulnerable.append(str(data))\n                else:\n                    queue.extend(data.linked_data)\n        visited.clear()\n        return vulnerable\n\n    #--------------------------------------------------------------------------\n    def __colorize(self, txt, level_or_color):\n        if self.__color:\n            return colorize(txt, level_or_color)\n        return txt\n\n    #--------------------------------------------------------------------------\n    def __fix_table_width(self, table):\n        if self.__width > 0:\n            if hasattr(table, \"_hline_string\"):\n                table._hline_string = \"\" # workaround for bug in texttable\n            assert all(len(x) == 2 for x in table._rows), table._rows\n            w = max( len(x[0]) for x in table._rows )\n            if table._header:\n                assert len(table._header) == 2, len(table._header)\n                w = max( w, len(table._header[0]) )\n            m = w + 8\n            if self.__width > m:\n                table.set_cols_width((w, self.__width - m))\n\n    def __fix_vul_table_width(self, table):\n        if self.__width > 0:\n            if hasattr(table, \"_hline_string\"):\n                table._hline_string = \"\" # workaround for bug in texttable\n            assert all(len(x) == 6 for x in table._rows), table._rows\n            w = max( len(x[0]) for x in table._rows )\n            if table._header:\n                assert len(table._header) == 6, len(table._header)\n                w = max( w, len(table._header[0]) )\n            m = w + 8\n            if self.__width > m:\n                vulurl_width    = m + 40\n                parameter_width = 20\n                payload_width   = 10\n                method_width    = 10\n                risk_width      = 10\n                table.set_cols_width((w, vulurl_width, parameter_width, payload_width, method_width, risk_width))\n\n"
  },
  {
    "path": "lalascan/libs/core/scope.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\n__all__ = [\"AuditScope\"]\n\nfrom lalascan.libs.net.web_utils import ParsedURL\nfrom lalascan.data.resource.ip import IP\nfrom lalascan.data.resource.domain import Domain\nfrom lalascan.data.resource.url import URL, SpiderURL\nfrom lalascan.api.exception import LalascanNotImplementedError\n\nimport re\nfrom netaddr import IPNetwork, IPAddress\n\nclass AbstractScope(object):\n    '''\n    abstract scope base class\n    '''\n    def __init__(self):\n        raise LalascanNotImplementedError()\n\n    @property\n    def addresses(self):\n        raise LalascanNotImplementedError()\n\n    @property\n    def domains(self):\n        raise LalascanNotImplementedError()\n\n    @property\n    def target_url(self):\n        raise LalascanNotImplementedError()\n\n    def add_target(self):\n\n        raise LalascanNotImplementedError()\n\n    def get_target(self):\n\n        raise LalascanNotImplementedError()\n\n    def __str__(self):\n        return \"<%s>\" % self\n\n    def __contains__(self, target):\n        raise LalascanNotImplementedError()\n\n    def get_targets(self):\n        \"\"\"\n        Get the audit targets as Data objects.\n\n        :returns: Data objects.\n        :rtype: list(Data)\n        \"\"\"\n        result = []\n        result.extend( IP(address) for address in self.addresses )\n        result.extend( Domain(domain) for domain in self.domains )\n        result.extend( Domain(root) for root in self.roots )\n        result.extend( URL(url) for url in self.web_pages )\n        #----------ADD By BlackYe\n        result.extend( SpiderURL(url) for url in self.target_url)\n        return result\n\nclass AuditScope(AbstractScope):\n\n    _re_is_domain = re.compile(r\"^[A-Za-z0-9][A-Za-z0-9\\_\\-\\.]*[A-Za-z0-9]$\")\n\n    def __init__(self):\n        self.__domains   = set()   # Domain names.\n        self.__roots     = set()   # Domain names for subdomain matching.\n        self.__addresses = set()   # IP addresses.\n        self.__web_pages = set()   # URLs.\n        self.__target_url = set()\n\n    #--------------------------------------------------------------------------\n    @property\n    def addresses(self):\n        return sorted(self.__addresses)\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def domains(self):\n        return sorted(self.__domains)\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def roots(self):\n        return sorted(self.__roots)\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def web_pages(self):\n        return sorted(self.__web_pages)\n\n\n    # Add By BlackYe.\n    #--------------------------------------------------------------------------\n    @property\n    def target_url(self):\n        return sorted(self.__target_url)\n\n\n    def add_target(self, target):\n\n        try:\n            IP(target)\n            address = target\n        except Exception:\n            address = None\n        if address is not None:\n            # Keep the IP address.\n            self.__addresses.add(address)\n            # If it's an IP network...\n        else:\n            try:\n                network = IPNetwork(target)\n            except Exception:\n                ##raise  # XXX DEBUG\n                network = None\n            if network is not None:\n                # For each host IP address in range...\n                for address in network.iter_hosts():\n                    address = str(address)\n                    # Keep the IP address.\n                    self.__addresses.add(address)\n\n            #domain\n            elif self._re_is_domain.match(target):\n                target = target.lower()\n                if target not in self.__domains:\n                    # Keep the domain name.\n                    self.__domains.add(target)\n            else:\n                try:\n                    parsed_url = ParsedURL(target)\n                    url = parsed_url.url\n                except Exception:\n                    url = None\n                if url is not None:\n                    self.__web_pages.add(url)\n                    self.__target_url.add(url)\n                    host = parsed_url.host\n                    try:\n                        if host.startswith(\"[\") and host.endswith(\"]\"):\n                            IPAddress(host[1:-1], version=6)\n                            host = host[1:-1]\n                        else:\n                            IPAddress(host)\n                        self.__addresses.add(host)\n                    except Exception:\n                        ##raise  # XXX DEBUG\n                        host = host.lower()\n                        if host not in self.__domains:\n                            self.__domains.add(host)\n                else:\n                    raise ValueError(\"I don't know what to do with this: %s\" % target)\n\n\n     #--------------------------------------------------------------------------\n    def __str__(self):\n        result = [\"Audit scope:\\n\"]\n        addresses = self.addresses\n        if addresses:\n            result.append(\"\\nIP addresses:\\n\")\n            for address in addresses:\n                result.append(\"    %s\\n\" % address)\n        domains = [\"*.\" + domain for domain in self.roots]\n        domains.extend(self.domains)\n        if domains:\n            result.append(\"\\nDomains:\\n\")\n            for domain in domains:\n                result.append(\"    %s\\n\" % domain)\n        web_pages = self.web_pages\n        if web_pages:\n            result.append(\"\\nWeb pages:\\n\")\n            for url in web_pages:\n                result.append(\"    %s\\n\" % url)\n        return \"\".join(result)\n\n\n\nclass DummyScope (AbstractScope):\n    \"\"\"\n    Dummy scope tells you everything is in scope, all the time.\n    \"\"\"\n\n    def __init__(self):\n        pass\n\n    @property\n    def has_scope(self):\n        return False\n\n    @property\n    def addresses(self):\n        return []\n\n    @property\n    def domains(self):\n        return []\n\n    @property\n    def roots(self):\n        return []\n\n    @property\n    def web_pages(self):\n        return []\n\n    def get_targets(self):\n        return []\n\n    def __contains__(self, target):\n        return True\n\n    def __str__(self):\n        return (\n            \"Audit scope:\\n\"\n            \"\\n\"\n            \"IP addresses:\\n\"\n            \"    *\\n\"\n            \"\\n\"\n            \"Domains:\\n\"\n            \"    *\\n\"\n            \"\\n\"\n            \"Web pages:\\n\"\n            \"    *\\n\"\n        )\n"
  },
  {
    "path": "lalascan/libs/core/settings.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\n\n\nBANNER = '''\n _          _\n| |    __ _| | __ _ ___  ___ __ _ _ __\n| |   / _` | |/ _` / __|/ __/ _` | '_ \\\\\n| |__| (_| | | (_| \\__ \\ (_| (_| | | | |\n|_____\\__,_|_|\\__,_|___/\\___\\__,_|_| |_|\n\nLalaScan WebApplication vul scanner! '''\n\nUSAGE  = \"Fuck\"\n\nVERSION = \"1.0\"\n\n\nUNICODE_ENCODING = \"utf-8\"\n\n\nPLUGIN_IMPORTDICT = {\n    \"from pocsuite.net import\": \"from pocsuite.lib.request.basic import\",\n    \"from pocsuite.poc import\": \"from pocsuite.lib.core.poc import\",\n    \"from pocsuite.utils import register\": \"from pocsuite.lib.core.register import registerPoc as register\",\n}\n\nPLUGIN_REGISTER_STRING = \"\\nfrom lalascan.libs.core.plugin.pluginregister import reg_instance_plugin\\nreg_instance_plugin({})\"\nPLUGIN_REGISTER_REGEX = \"reg_instance_plugin\\(.*\\)\"\nPLUGIN_CLASSNAME_REGEX = \"class\\s+(.*?)\\(PluginBase\\)\"\n\n\nPLUGIN_SUFFIX = '.py'\n\nNGX_HTTP_CODE = {\n    'NGX_HTTP_ERROR'     : 500,\n    'NGX_HTTP_FORBIDDEN' : 403,\n    'NGX_HTTP_NOT_FOUND' : 404,\n    'NGX_HTTP_AUTH'      : 401,\n    'NGX_HTTP_REDIRECT'  : 301\n}\n\n\n"
  },
  {
    "path": "lalascan/libs/core/singletonclass.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n\"\"\"\n 单例模式基类\n\"\"\"\n\n__author__ = 'BlackYe.'\n\n\nclass Singleton (object):\n    \"\"\"\n    Implementation of the Singleton pattern.\n    \"\"\"\n    _instance = None\n\n    def __new__(cls, *args, **kw):\n\n        # If the singleton has already been instanced, return it.\n        if cls._instance is not None:\n            return cls._instance\n\n        # Create the singleton's instance.\n        cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)\n\n        # Call the constructor.\n        cls.__init__(cls._instance, *args, **kw)\n\n        # Delete the constructor so it won't be called again.\n        cls._instance.__init__ = object.__init__\n        cls.__init__ = object.__init__\n\n        # Return the instance.\n        return cls._instance"
  },
  {
    "path": "lalascan/libs/core/spider.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nfrom lalascan.libs.core.plugin import PluginBase\nfrom lalascan.libs.core.pluginregister import reg_instance_plugin\nfrom lalascan.libs.core.globaldata import L, conf\n\nfrom lalascan.libs.net.web_utils import parse_url, argument_query, get_request\nfrom lalascan.libs.net.web_mutants import payload_muntants\n\nfrom lalascan.data.resource.url import URL, SpiderURL\nfrom lalascan.utils.text_utils import to_utf8\n\nfrom thirdparty_libs.wvs_spider.run import start_wvs_spider_dispatch\n\nimport json\n\ndef spider_task(audit_name):\n    cookie_param = None\n\n    cookie_dict = conf.cookie if conf is not None and conf.has_key('cookie') else None\n\n    m_url = conf.url\n\n    if cookie_dict != None:\n        if hasattr(cookie_dict, \"iteritems\"):\n                cookie_params = {\n                    to_utf8(k): to_utf8(v) for k, v in cookie_dict.iteritems()\n                }\n                cookie_param = ';'.join(\n                    '%s=%s' % (k ,v) for (k, v) in sorted(cookie_params.iteritems())\n                )\n\n    __ = start_wvs_spider_dispatch(m_url, audit_name, cookie_param, L.logger)\n    #__  = test_start_wvs_spider_dispatch('www.bbktel.com.cn_d2cc49d948a8589628d260faa6ba41a4')\n\n    json_content = json.loads(__)\n\n    for urls in json_content['info']:\n        #print item\n        L.logger.log_verbose(\"Web Spider:found url %s\" % urls['fullurl'])\n        m_resource = URL(url = urls['fullurl'])\n        conf.targets.append(m_resource)\n        for item_url in urls['content']:\n            post_param = item_url['param_data']\n            if \"AcunetixBoundary_\" in post_param:  #multipart/form-data\n                method = 'FILE_UPLOAD'\n            else:\n                method = item_url['method']\n\n            if method == \"POST\":\n                post_param_dict = argument_query(item_url['param_data'])\n                m_resource = URL(url = item_url['url'], method = \"POST\", post_params = post_param_dict, referer= urls['fullurl'])\n            else:\n                m_resource = URL(url = item_url['url'], method = method,  referer = urls['fullurl'])\n            L.logger.log_verbose(\"Web Spider:found url %s\" % item_url['url'])\n            conf.targets.append(m_resource)"
  },
  {
    "path": "lalascan/libs/core/threads.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nfrom lalascan.libs.core.plugin import PluginBase\nfrom lalascan.libs.core.globaldata import vulresult\nfrom lalascan.utils.text_utils import to_utf8\nfrom lalascan.data.resource import Resource\n\nimport multiprocessing\nimport multiprocessing.pool\nfrom multiprocessing import Process\nfrom multiprocessing import cpu_count\nimport gevent\nfrom gevent.pool import Pool\n#from gevent.threadpool import ThreadPool\n\nfrom gevent import monkey\n\nmonkey.patch_socket()\n\n\nclass NoDaemonProcess(multiprocessing.Process):\n    # make 'daemon' attribute always return False\n    def _get_daemon(self):\n        return False\n    def _set_daemon(self, value):\n        pass\n    daemon = property(_get_daemon, _set_daemon)\n\nclass MyResourcePool(multiprocessing.pool.Pool):\n    Process = NoDaemonProcess\n# ------------------------------\n\nclass MyGeventPool(gevent.pool.Pool):\n\n    def _wait(self):\n        gevent.wait()\n\n\n\ndef plugin_run_thread(plugin_name, pluginheader, info, method, **kwargs):\n    #if issubclass(pluginheader, PluginBase):\n    #print '1'\n    p = pluginheader\n    print type(p)\n    p.run_plugin(info, resource_method = method , resource_param = kwargs)\n\n\ndef execute_plugin(register_plugins, m_resource):\n    pluginPool = MyGeventPool(30)\n    for key, plugin in register_plugins.iteritems():\n        ##proPool.apply_async(plugin_run_thread, (key, plugin, m_resource))\n\n        if isinstance(m_resource, Resource):\n            if m_resource.has_url_params:\n                param_dict = m_resource.url_params\n                method = 'GET'\n            if m_resource.has_post_params:\n                param_dict = m_resource.post_params\n                method = 'POST'\n\n            for k, v in param_dict.iteritems():\n                param_key   = to_utf8(k)\n                param_value = to_utf8(v)\n                pluginPool.spawn(plugin_run_thread, key, plugin, m_resource, method = method, param_key = param_key, param_value = param_value)\n\n    pluginPool.join()"
  },
  {
    "path": "lalascan/libs/net/__init__.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nNetwork protocols API.\n\"\"\""
  },
  {
    "path": "lalascan/libs/net/dns.py",
    "content": "#!/usr/bin/python\n# -*- coding: utf-8 -*-\n\n# Required since \"dns\" is both an external module and the name of this file.\nfrom __future__ import absolute_import\n\n__license__ = \"\"\"\nGoLismero 2.0 - The web knife - Copyright (C) 2011-2014\n\nGolismero project site: http://golismero-project.com\nGolismero project mail: contact@golismero-project.com\n\n\nThis program is free software; you can redistribute it and/or\nmodify it under the terms of the GNU General Public License\nas published by the Free Software Foundation; either version 2\nof the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program; if not, write to the Free Software\nFoundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n\"\"\"\n\n__all__ = [\"DNS\"]\n\nfrom ..data.information.dns import *  # noqa\nfrom ..data import LocalDataCache\nfrom ...common import Singleton\n\nimport dns.query\nimport dns.resolver\nimport dns.reversename\nimport socket\n\nfrom dns.zone import *\nfrom netaddr import IPAddress\nfrom netaddr.core import AddrFormatError\n\n\n#------------------------------------------------------------------------------\nclass _DNS(Singleton):\n    # Some code borrowed from the dnsrecon project:\n    # https://github.com/darkoperator/dnsrecon\n\n    REQUEST_TIMEOUT = 2.0 # In seconds\n\n    # Public list of free DNS servers.\n    #\n    # This list was taken from:\n    #\n    # http://pcsupport.about.com/od/tipstricks/a/free-public-dns-servers.htm\n    #\n    PUBLIC_NAMESERVERS = [\n        # Level 3 (http://www.level3.com/)\n        \"209.244.0.3\",\n        \"209.244.0.4\",\n\n        # Google\n        \"8.8.8.8\",\n        \"8.8.4.4\",\n\n        # Security (http://www.securly.com/)\n        \"184.169.143.224\",\n        \"184.169.161.155\",\n\n        # Comodo Secure DNS (http://www.comodo.com/secure-dns/)\n        \"8.26.56.26\",\n        \"8.20.247.20\",\n\n        # OpenDNS Home (http://www.opendns.com/)\n        \"208.67.222.222\",\n        \"208.67.220.220\",\n\n        # DNS Advantage (http://www.neustar.biz/enterprise/dns-services/free-recursive-dns)\n        \"156.154.70.1\",\n        \"156.154.71.1\",\n\n        # Norton ConnectSafe (https://dns.norton.com/dnsweb/faq.do)\n        \"198.153.192.40\",\n        \"198.153.194.40\",\n\n        # SafeDNS (https://www.safedns.com/features/)\n        \"195.46.39.39\",\n        \"195.46.39.40\",\n\n        # OpenNIC (http://www.opennicproject.org/)\n        \"74.207.247.4\",\n        \"64.0.55.201\",\n\n        # Public -Root (http://public-root.com/root-server-check/index.htm)\n        \"199.5.157.131\",\n        \"208.71.35.137\",\n\n        # SmartViper (http://www.markosweb.com/free-dns/)\n        \"208.76.50.50\",\n        \"208.76.51.51\",\n\n        # Dyn (http://dyn.com/support/internet-guide-setup/)\n        \"216.146.35.35\",\n        \"216.146.36.36\",\n\n        # Hurricane Electric (http://he.net/)\n        \"74.82.42.42\",\n\n        # puntCAT (http://www.servidordenoms.cat/)\n        \"109.69.8.51\",\n    ]\n\n\n    #--------------------------------------------------------------------------\n    def check_tcp_dns(self, address, dns_port=53):\n        \"\"\"\n        Function to check if a server is listening at port 53 TCP. This\n        will aid in IDS/IPS detection since a AXFR will not be tried if\n        TCP port 53 is found to be closed.\n\n        :param address: IP address or domain name.\n        :type address: str\n\n        :param dns_port: Port number to connect to the server.\n        :type dns_port: int\n\n        :return: True if server accepts TCP connections, False otherwise.\n        :rtype: bool\n        \"\"\"\n        if not isinstance(address, basestring):\n            raise TypeError(\"Expected basestring, got '%s'\" % type(address))\n\n        if not isinstance(dns_port, int):\n            raise TypeError(\"Expected int, got '%s'\" % type(dns_port))\n        if dns_port < 1:\n            raise ValueError(\"Port number must be greater than 0.\")\n\n        s = socket.socket()\n        s.settimeout(self.REQUEST_TIMEOUT)\n\n        try:\n            s.connect((address, dns_port))\n        except Exception:\n            return False\n        else:\n            return True\n        finally:\n            s.close()\n\n\n    #--------------------------------------------------------------------------\n    def resolve(self, target, type, nameservers=None):\n        \"\"\"\n        Function for performing general resolution types.\n\n        Special type of register is \"ALL\", that returns all of the registers\n        returned by the query.\n\n        :param target: Name to resolve.\n        :type target: str\n\n        :param type: Type of query: ALL, A, AAAA, NS, PTR...\n        :type type: int | str\n\n        :param nameservers: Nameservers to use.\n        :type nameservers: list(str)\n\n        :return: DNS registers.\n        :rtype: list(DnsRegister)\n        \"\"\"\n        return self._make_request(type, target, nameservers)\n\n\n    #--------------------------------------------------------------------------\n    def get_a(self, host, nameservers=None, also_CNAME=False):\n        \"\"\"\n        Resolve the A records for a given host.\n\n        :param host: Target hostname.\n        :type host: str\n\n        :param nameservers: Nameservers to use.\n        :type nameservers: list(str)\n\n        :param also_CNAME: Set this var to True if you want to return also the CNAME Registers returned by the query.\n        :tyep algo_CNAME: bool\n\n        :return: Type A registers.\n        :rtype: list(DnsRegisterA)\n        \"\"\"\n\n        # Special case for localhost\n        if host.lower() == \"localhost\":\n            return [DnsRegisterA(\"127.0.0.1\")]\n\n        r = self._make_request(\"A\", host, nameservers, auto_resolve=not also_CNAME)\n\n        # Get all the register: CNAME and A\n        if also_CNAME:\n            m_return         = []\n            if not isinstance(r, list):\n                m_return.extend(self._dnslib2register(\"ALL\", r))\n            else:\n                m_return_extend = m_return.extend\n                for lr in r:\n                    m_return_extend(self._dnslib2register(\"ALL\", lr))\n\n            return m_return\n        else:\n            return r\n\n\n    #--------------------------------------------------------------------------\n    def get_aaaa(self, host, nameservers=None, also_CNAME=False):\n        \"\"\"\n        Resolve the A Record for a given host.\n\n        :param host: Target hostname.\n        :type host: str\n\n        :param nameservers: Nameservers to use.\n        :type nameservers: list(str)\n\n        :param also_CNAME: Set this var to True if you want to return also the CNAME Registers returned by the query.\n        :tyep algo_CNAME: bool\n\n        :return: AAAA registers.\n        :rtype: list(DnsRegisterAAAA)\n        \"\"\"\n\n        # Special case for localhost\n        if host.lower() == \"localhost\":\n            return [DnsRegisterAAAA(\"::1\")]\n\n        r = self._make_request(\"AAAA\", host, nameservers, auto_resolve=not also_CNAME)\n\n        if also_CNAME:\n            # Get all the register: CNAME and A\n            m_return         = []\n            if not isinstance(r, list):\n                m_return.extend(self._dnslib2register(\"ALL\", r))\n            else:\n                m_return_extend = m_return.extend\n                for lr in r:\n                    m_return_extend(self._dnslib2register(\"ALL\", lr))\n\n\n            return m_return\n        else:\n            return r\n\n\n    #--------------------------------------------------------------------------\n    def get_mx(self, host, nameservers=None):\n        \"\"\"\n        Resolve the MX records for a given host.\n\n        :param host: Target hostname.\n        :type host: str\n\n        :param nameservers: Nameservers to use.\n        :type nameservers: list(str)\n\n        :return: MX registers.\n        :rtype: list(DnsRegisterMX)\n        \"\"\"\n        return self._make_request(\"MX\", host, nameservers)\n\n\n    #--------------------------------------------------------------------------\n    def get_ns(self, host, nameservers=None):\n        \"\"\"\n        Returns all NS records. Also returns the IP\n        address of the host both in IPv4 and IPv6.\n\n        :param host: Target hostname.\n        :type host: str\n\n        :param nameservers: Nameservers to use.\n        :type nameservers: list(str)\n\n        :return: NS registers.\n        :rtype: list(DnsRegisterNS)\n        \"\"\"\n        return self._make_request(\"NS\", host, nameservers)\n\n\n    #--------------------------------------------------------------------------\n    def get_soa(self, host, nameservers=None):\n        \"\"\"\n        Returns all SOA records. Also returns the IP\n        address of the host both in IPv4 and IPv6.\n\n        :param host: Target hostname.\n        :type host: str\n\n        :param nameservers: Nameservers to use.\n        :type nameservers: list(str)\n\n        :return: SOA registers.\n        :rtype: list(DnsRegisterSOA)\n        \"\"\"\n        return self._make_request(\"SOA\", host, nameservers)\n\n\n    #--------------------------------------------------------------------------\n    def get_spf(self, host, nameservers=None):\n        \"\"\"\n        Resolve SPF records.\n\n        :param host: the target to make the request.\n        :type host: str\n\n        :param nameservers: nameserver to use.\n        :type nameservers: list(str)\n\n        :return: SPF registers.\n        :rtype: list(DnsRegisterSPF)\n        \"\"\"\n        return self._make_request(\"SPF\", host, nameservers)\n\n\n    #--------------------------------------------------------------------------\n    def get_txt(self, host, nameservers=None):\n        \"\"\"\n        Resolve TXT records.\n\n        :param host: Target hostname.\n        :type host: str\n\n        :param nameservers: Nameservers to use.\n        :type nameservers: list(str)\n\n        :return: TXT registers.\n        :rtype: list(DnsRegisterTXT)\n        \"\"\"\n        return self._make_request(\"TXT\", host, nameservers)\n\n\n    #--------------------------------------------------------------------------\n    def get_ptr(self, ipaddress, nameservers=None):\n        \"\"\"\n        Resolve PTR records given it's IPv4 or IPv6 address.\n\n        :param ipaddress: Target IP address.\n        :type ipaddress: str\n\n        :param nameservers: Nameservers to use.\n        :type nameservers: list(str)\n\n        :return: PTR registers.\n        :rtype: list(DnsRegisterPTR)\n        \"\"\"\n        if not isinstance(ipaddress, basestring):\n            raise TypeError(\"Expected basestring, got '%s'\" % type(ipaddress))\n\n        # Detect the IP address version\n        m_ipobj = None\n        try:\n            m_ipobj = IPAddress(ipaddress)\n        except AddrFormatError:\n            raise ValueError(\"Wrong IP address\")\n\n        # Make the query\n        m_ip = str(dns.reversename.from_address(ipaddress))\n\n        # Get the IPs\n        if m_ip:\n            if m_ipobj.version == \"4\":\n                m_name = m_ip.replace(\".in-addr.arpa.\", \"\")\n            else:\n                m_name = m_ip.replace(\"ip6.arpa.\", \"\")\n\n            return self._make_request(\"PTR\", m_name, nameservers)\n        else:\n            return []\n\n\n    #--------------------------------------------------------------------------\n    def get_srv(self, host, nameservers=None):\n        \"\"\"\n        Function for resolving SRV Records.\n\n        :param host: Target hostname.\n        :type host: str\n\n        :param nameservers: Nameservers to use.\n        :type nameservers: list(str)\n\n        :return: SRV registers.\n        :rtype: list(DnsRegisterSRV)\n        \"\"\"\n        return self._make_request(\"SRV\", host, nameservers)\n\n\n    #--------------------------------------------------------------------------\n    def get_nsec(self, host, nameservers=None):\n        \"\"\"\n        Function for querying for a NSEC record and retriving the rdata object.\n        This function is used mostly for performing a Zone Walk against a zone.\n\n        :param host: Target hostname.\n        :type host: str\n\n        :param nameservers: Nameservers to use.\n        :type nameservers: list(str)\n\n        :return: NSEC registers.\n        :rtype: list(DnsRegisterNSEC)\n        \"\"\"\n        return self._make_request(\"NSEC\", host, nameservers)\n\n\n    #--------------------------------------------------------------------------\n    def zone_transfer(self, domain, nameservers = None, ns_allowed_zone_transfer=False):\n        \"\"\"\n        Function for testing for zone transfers on a given Domain.\n\n        :param domain: Target hostname.\n        :type domain: str\n\n        :param nameservers: Alternate nameservers.\n        :type nameservers: list(str)\n\n        :param ns_allowed_zone_transfer: is set to True, this funcion will return the list of\n                                         nameservers with zone transfer enabled.\n        :type ns_allowed_zone_transfer: bool\n\n        :return: If successful, a list of DnsRegister objects.\n                 Otherwise, an empty list. If ns_allowed_zone_transfer is enabled, it will\n                 return a tuple as format: (set(servers with zone transfer enabled), list(DnsRegister))\n        :rtype: list(DnsRegister) | (set(str), list(DnsRegister))\n        \"\"\"\n        if not isinstance(domain, basestring):\n            raise TypeError(\"Expected basestring, got '%s'\" % type(domain))\n        if nameservers:\n            if isinstance(nameservers, list):\n                for n in nameservers:\n                    if not isinstance(n, basestring):\n                        raise TypeError(\"Expected basestring, got '%s'\" % type(n))\n            else:\n                raise TypeError(\"Expected list, got '%s'\" % type(nameservers))\n\n        # Results of zone transfer\n        zone_records        = []\n        zone_records_append = zone_records.append\n\n        ns_zone_enabled     = set()\n\n        # Availabe DNS servers\n        ns_records   = None\n\n        # If nameservers specified -> use it\n        if nameservers:\n            ns_records = set(nameservers)\n\n        else: # Looking for nameservers for the domain\n\n            #Find NS for domains\n            ns_tmp     = self.get_ns(domain)\n            #\n            # Check the input domain\n            #\n            # If name server of the domain is NOT empty -> the domain is NOT a nameserver\n            if ns_tmp:\n                # Mark for not tracking\n                map(LocalDataCache.on_autogeneration, ns_tmp)\n\n                # Store only the IP address of the DNS servers\n                l_dns        = set()\n                l_dns_append = l_dns.add\n                for d in ns_tmp:\n                    for t in self.get_ips(d):\n                        l_dns_append(t.address)\n\n                        # Mark for not tracking\n                        LocalDataCache.on_autogeneration(t)\n\n                # Find SOA for Domain\n                for d in self.get_soa(domain):\n                    for t in self.get_ips(d):\n                        l_dns_append(t.address)\n\n                        # Mark for not tracking\n                        LocalDataCache.on_autogeneration(t)\n                    # Mark for not tracking\n                    LocalDataCache.on_autogeneration(d)\n\n                ns_records = l_dns\n\n            else:\n                # The domain is an DNS server\n                ns_records = set((domain,))\n\n        #\n        # Make the transfer for each NS Server\n        #\n        for ns_srv in ns_records:\n            if self.check_tcp_dns(ns_srv):\n                try:\n                    zone = self._from_wire(dns.query.xfr(where=ns_srv, zone=domain, timeout=10))\n\n                    # Store the ns used to the zone transfer\n                    if ns_allowed_zone_transfer:\n                        ns_zone_enabled.add(ns_srv)\n\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.SOA):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"SOA\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.NS):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"NS\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.TXT):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"TXT\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.SPF):\n                        zone_records_append(self._dnslib2register(\"SPF\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.PTR):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"PTR\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.MX):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"MX\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.AAAA):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"AAAA\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.A):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"A\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.CNAME):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"CNAME\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.SRV):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"SRV\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.HINFO):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"HINFO\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.WKS):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"WKS\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.RP):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"RP\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.AFSDB):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"AFSDB\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.LOC):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"LOC\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.X25):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"X25\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.ISDN):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"ISDN\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.RT):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"X25\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.NSAP):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"NSAP\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.NAPTR):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"NAPTR\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.CERT):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"CERT\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.SIG):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"SIG\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.RRSIG):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"RRSIG\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.DNSKEY):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"DNSKEY\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.DS):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"DS\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.NSEC):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"NSEC\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.NSEC3):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"NSEC3\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.NSEC3PARAM):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"NSEC3PARAM\",rdata))\n\n                    for (name, rdataset) in zone.iterate_rdatasets(dns.rdatatype.IPSECKEY):\n                        for rdata in rdataset:\n                            zone_records_append(self._dnslib2register(\"IPSECKEY\",rdata))\n\n                except:\n                    pass\n\n        if ns_allowed_zone_transfer:\n            return (ns_zone_enabled, zone_records)\n        else:\n            return zone_records\n\n\n    #--------------------------------------------------------------------------\n    #\n    # Helpers\n    #\n    #--------------------------------------------------------------------------\n    #\n    # This method has been taken directly (with some changes) from dns recon project\n    #\n    def _from_wire(self, xfr, zone_factory=Zone, relativize=True):\n        \"\"\"\n        Method for turning returned data from a DNS AXFR to RRSET.\n\n        This method will not perform a check origin on the zone data\n        as the method included with dnspython.\n        \"\"\"\n        z = None\n\n        for r in xfr:\n            if z is None:\n                if relativize:\n                    origin = r.origin\n                else:\n                    origin = r.answer[0].name\n                rdclass = r.answer[0].rdclass\n                z = zone_factory(origin, rdclass, relativize=relativize)\n            for rrset in r.answer:\n                znode = z.nodes.get(rrset.name)\n                if not znode:\n                    znode = z.node_factory()\n                    z.nodes[rrset.name] = znode\n                zrds = znode.find_rdataset(rrset.rdclass, rrset.rdtype,\n                                           rrset.covers, True)\n                zrds.update_ttl(rrset.ttl)\n                for rd in rrset:\n                    rd.choose_relativity(z.origin, relativize)\n                    zrds.add(rd)\n\n        return z\n\n\n    #--------------------------------------------------------------------------\n    def get_ips(self, register):\n        \"\"\"\n        Get the list of IPs associated the register as parameter.\n\n        If you pass CNAME register, you get an A/AAAA register:\n            >> cname = DnsRegisterCNAME(\"myalias.mysite.com\")\n            >> a = Dns.get_ips(cname)\n            >> print a\n            [<DnsRegisterA object at 0x103ad9a50>]\n            >> print a[0]\n            <DnsRegisterA object at 0x103ad9a50>\n            >> print a[0].target\n            127.0.0.1\n\n        :param register: A DNS Register.\n            Valid registers are: DnsRegisterA, DnsRegisterAAAA,\n            DnsRegisterCNAME DnsRegisterISDN, DnsRegisterNS,\n            DnsRegisterNSAP, DnsRegisterPTR, DnsRegisterSOA,\n            DnsRegisterSRV, DnsRegisterWKS, DnsRegisterX25\n        :type register: DnsRegister\n\n        :return: A list with the A and AAAA registers.\n        :rtype : list(DnsRegisterA|DnsRegisterAAAA)\n        \"\"\"\n        if not isinstance(register, DnsRegister):\n            raise TypeError(\"Expected DnsRegister, got '%s'\" % type(register))\n\n        PROP = self.PROPERTIES_WITH_IP_ADDRESSES\n\n        if register.type not in PROP:\n            return []\n\n        if register.type in (\"A\", \"AAAA\"):\n            return [register]\n\n        m_return = []\n\n        target = getattr(register, PROP[register.type])\n\n        # IPv4 address\n        m_return.extend(self.get_a(target))\n\n        # IPv6 address\n        m_return.extend(self.get_aaaa(target))\n\n        return m_return\n\n    PROPERTIES_WITH_IP_ADDRESSES = {\n        \"A\":\"target\",\n        \"AAAA\":\"target\",\n        \"CNAME\":\"target\",\n        \"ISDN\":\"address\",\n        \"NS\":\"target\",\n        \"NSAP\":\"address\",\n        \"PTR\":\"target\",\n        \"SOA\":\"mname\",\n        \"SRV\":\"target\",\n        \"WKS\":\"address\",\n        \"X25\":\"address\"\n    }\n\n\n    #--------------------------------------------------------------------------\n    def _dnslib2register(self, type, answer_in):\n        \"\"\"\n        Creates a DnsRegister from a dnslib register.\n\n        Special type of register \"ALL\" that converts all the types of the\n        registers.\n\n        :param type: Type of response to get: A, AAAA, CNAME...\n        :type type: str\n\n        :param answer_in: Object with the answer from dnslib.\n        :type answer_in: dns.resolver.Answer\n\n        :return: DNS register.\n        :rtype: list(DnsRegister)\n        \"\"\"\n\n        m_return        = []\n        m_return_append = m_return.append\n\n        if isinstance(answer_in, dns.resolver.Answer):\n\n            for ardata in answer_in.response.answer:\n                for rdata in ardata:\n\n                    register_type = DnsRegister.id2name(rdata.rdtype)\n\n                    # If register it different that we are looking for, skip it.\n                    if type != register_type and type != \"ALL\":\n                        continue\n\n\n                    m_return_append(self.__dnsregister2golismeroregister(register_type, rdata))\n        else:\n            register_type = DnsRegister.id2name(answer_in.rdtype)\n            m_return_append(self.__dnsregister2golismeroregister(register_type, answer_in))\n\n        return m_return\n\n\n    #--------------------------------------------------------------------------\n    def __dnsregister2golismeroregister(self, register_type, answer):\n        \"\"\"\n        Transform a dnslib register into a DnsRegister.\n\n        :param register_type: Type of register.\n        :type register_type: str\n\n        :param answer: dnslib object with a DNS register data.\n        :type answer: object\n\n        :return: DNS register.\n        :rtype: DnsRegister\n        \"\"\"\n        m_return = None\n\n        if register_type == \"A\":\n            m_return = DnsRegisterA(answer.address)\n\n        elif register_type == \"AAAA\":\n            m_return = DnsRegisterAAAA(answer.address)\n\n        elif register_type == \"AFSDB\":\n            m_return = DnsRegisterAFSDB(answer.subtype, answer.hostname.to_text()[:-1])\n\n        elif register_type == \"CERT\":\n            m_return = DnsRegisterCERT(answer.algorithm,\n                                       answer.certificate,\n                                       answer.certificate_type,\n                                       answer.key_tag)\n\n        elif register_type == \"CNAME\":\n            m_return = DnsRegisterCNAME(answer.target.to_text()[:-1])\n\n        elif register_type == \"DNSKEY\":\n            m_return = DnsRegisterDNSKEY(answer.algorithm,\n                                         answer.flags,\n                                         dns.rdata._hexify(answer.key),\n                                         answer.protocol)\n\n        elif register_type == \"DS\":\n            m_return = DnsRegisterDS(answer.algorithm,\n                                     dns.rdata._hexify(answer.digest),\n                                     answer.digest_type,\n                                     answer.key_tag)\n\n        elif register_type == \"HINFO\":\n            m_return = DnsRegisterHINFO(answer.cpu,\n                                        answer.os)\n\n        elif register_type == \"IPSECKEY\":\n            m_return = DnsRegisterIPSECKEY(answer.algorithm,\n                                           answer.gateway,\n                                           answer.gateway_type,\n                                           answer.key,\n                                           answer.precedence)\n\n        elif register_type == \"ISDN\":\n            m_return = DnsRegisterISDN(answer.address,\n                                       answer.subaddress)\n\n        elif register_type == \"LOC\":\n            m_return = DnsRegisterLOC(answer.latitude,\n                                      answer.longitude,\n                                      answer.altitude,\n                                      answer.to_text())\n\n        elif register_type == \"MX\":\n            m_return = DnsRegisterMX(answer.exchange.to_text()[:-1],\n                                     answer.preference)\n\n        elif register_type == \"NAPTR\":\n            m_return = DnsRegisterNAPTR(answer.order,\n                                        answer.preference,\n                                        answer.regexp,\n                                        answer.replacement.to_text()[:-1],\n                                        answer.service)\n\n        elif register_type == \"NS\":\n            m_return = DnsRegisterNS(answer.target.to_text()[:-1])\n\n        elif register_type == \"NSAP\":\n            m_return = DnsRegisterNSAP(answer.address)\n\n        elif register_type == \"NSEC\":\n            m_return = DnsRegisterNSEC(answer.next.to_text()[:-1])\n\n        elif register_type == \"NSEC3\":\n            m_return = DnsRegisterNSEC3(answer.algorithm,\n                                        answer.flags,\n                                        answer.iterations,\n                                        dns.rdata._hexify(answer.salt))\n\n        elif register_type == \"NSEC3PARAM\":\n            m_return = DnsRegisterNSEC3PARAM(answer.algorithm,\n                                             answer.flags,\n                                             answer.iterations,\n                                             dns.rdata._hexify(answer.salt))\n\n        elif register_type == \"PTR\":\n            m_return = DnsRegisterPTR(answer.target.to_text()[:-1])\n\n        elif register_type == \"RP\":\n            m_return = DnsRegisterRP(answer.mbox.to_text()[:-1],\n                                     answer.txt.to_text()[:-1])\n\n        elif register_type == \"RPSIG\":\n            m_return = DnsRegisterRRSIG(answer.algorithm,\n                                        answer.expiration,\n                                        answer.interception,\n                                        answer.key_tag,\n                                        answer.labels,\n                                        answer.original_ttl,\n                                        answer.signer,\n                                        answer.type_coverded)\n\n        elif register_type == \"SIG\":\n            m_return = DnsRegisterSIG(answer.algorithm,\n                                      answer.expiration,\n                                      answer.interception,\n                                      answer.key_tag,\n                                      answer.labels,\n                                      answer.original_ttl,\n                                      answer.signer,\n                                      answer.type_coverded)\n\n        elif register_type == \"SOA\":\n            m_return = DnsRegisterSOA(answer.mname.to_text()[:-1],\n                                      answer.rname.to_text()[:-1],\n                                      answer.refresh,\n                                      answer.expire)\n\n        elif register_type == \"SPF\":\n            m_return = DnsRegisterSPF(answer.strings)\n\n        elif register_type == \"SRV\":\n            m_return = DnsRegisterSRV(answer.target.to_text()[:-1],\n                                      answer.priority,\n                                      answer.weight,\n                                      answer.port)\n\n        elif register_type == \"TXT\":\n            m_return = DnsRegisterTXT(answer.strings)\n\n        elif register_type == \"WKS\":\n            m_return = DnsRegisterWKS(answer.address,\n                                      answer.protocol,\n                                      answer.bitmap)\n\n        elif register_type == \"X25\":\n            m_return = DnsRegisterX25(answer.address)\n\n        else:\n            raise ValueError(\"DNS register type '%s' is incorrect.\" % register_type)\n\n        return m_return\n\n\n    #--------------------------------------------------------------------------\n    def _make_request(self, register_type, host, nameservers=None, auto_resolve=True):\n        \"\"\"\n        Make a request using dnslib, and return a DNS register.\n\n        :param: register_type: Type of query: A, AAAA, CNAME...\n        :type register_type: str\n\n        :param host: Target host for the request.\n        :type host: str\n\n        :param nameservers: Custom name servers.\n        :type nameservers: list(str)\n\n        :param auto_resolve: configure this function to transform de dnslib register to the golismero register.\n        :type auto_resolve: bool\n\n        :return: a list with the DnsRegisters. Returned list can be empty, if a error has occurred.\n        :type: list(DnsRegister)\n        \"\"\"\n        if not isinstance(register_type, basestring):\n            raise TypeError(\"Expected str, got '%s'\" % type(type))\n        if not isinstance(host, basestring):\n            raise TypeError(\"Expected basestring, got '%s'\" % type(host))\n        if nameservers:\n            if isinstance(nameservers, list):\n                for n in nameservers:\n                    if not isinstance(n, basestring):\n                        raise TypeError(\"Expected basestring, got '%s'\" % type(n))\n            else:\n                raise TypeError(\"Expected list, got '%s'\" % type(nameservers))\n\n        m_query_obj = None\n\n        if nameservers:\n            m_query_obj             = dns.resolver.Resolver(configure=False)\n            m_query_obj.nameservers = nameservers\n        else:\n            m_query_obj             = dns.resolver.Resolver(configure=True)\n\n            # Append the free public DNS servers for avoid errors when the DNS servers\n            # configured in /etc/resolv.conf fails.\n            m_query_obj.nameservers.extend(self.PUBLIC_NAMESERVERS)\n\n        # Set timeouts\n        m_query_obj.timeout         = self.REQUEST_TIMEOUT\n        m_query_obj.lifetime        = self.REQUEST_TIMEOUT\n\n        try:\n            answer = m_query_obj.query(host, register_type)\n        except Exception:\n            return []\n\n        if auto_resolve:\n            return self._dnslib2register(register_type, answer)\n        else:\n            return answer\n\n# Instance the singleton.\nDNS = _DNS()\n"
  },
  {
    "path": "lalascan/libs/net/http.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nHTTP protocol API for GoLismero.\n\"\"\"\n\n__all__ = [\"HTTP\"]\n\nfrom lalascan.api.exception import LalascanNetworkException, LalascanNetworkOutOfScope\nfrom .web_utils import detect_auth_method, get_auth_obj\nfrom ...data.http import HTTP_Request, HTTP_Response, HTTP_Raw_Request\nfrom ...data.resource.url import URL\nfrom ..core.singletonclass import Singleton\nfrom ...libs.core.globaldata import conf\n\nfrom hashlib import md5\nfrom os import environ\nfrom os.path import join\nfrom requests import Session\nfrom requests.cookies import cookiejar_from_dict\nfrom requests.exceptions import RequestException\nfrom socket import socket, error, getaddrinfo, SOCK_STREAM\nfrom ssl import wrap_socket\nfrom StringIO import StringIO\nfrom time import time\n\n\n#------------------------------------------------------------------------------\nclass _HTTP(Singleton):\n    \"\"\"\n    HTTP protocol API for GoLismero.\n    \"\"\"\n\n\n    #--------------------------------------------------------------------------\n    def __init__(self):\n        self.__session = None\n\n\n    #--------------------------------------------------------------------------\n    def _initialize(self):\n        \"\"\"\n        .. http request init\n        \"\"\"\n\n        # Start a new session.\n        self.__session = Session()\n\n        # Load the proxy settings.\n        if conf is not None and conf.has_key('proxy_addr') and conf.has_key('proxy_port'):\n            proxy_addr = conf.proxy_addr\n            if proxy_addr:\n                proxy_port = conf.proxy_port\n                if proxy_port:\n                    proxy_addr = \"%s:%s\" % (proxy_addr, proxy_port)\n\n                '''\n                auth_user = Config.audit_config.proxy_user\n                auth_pass = Config.audit_config.proxy_pass\n                auth, _ = detect_auth_method(proxy_addr)\n                self.__session.auth = get_auth_obj(auth, auth_user, auth_pass)\n                '''\n                self.__session.proxies = {\n                    \"http\":  proxy_addr,\n                    \"https\": proxy_addr,\n                    \"ftp\":   proxy_addr,\n                }\n\n        # Load the cookies.\n        if conf is not None and conf.has_key('cookie'):\n            cookie = conf.cookie\n            if cookie:\n                self.__session.cookies = cookiejar_from_dict(cookie)\n\n        # Set User Agent\n        if conf is not None and conf.has_key('user_agent'):\n            self.__user_agent = conf.user_agent\n\n\n    #--------------------------------------------------------------------------\n    def _finalize(self):\n        '''\n        clean session headers\n        :return:\n        '''\n\n        self.__session = None\n\n\n    #--------------------------------------------------------------------------\n    def get_url(self, url, method = \"GET\", callback = None, timeout = 30.0, allow_redirects = True):\n        \"\"\"\n        Send a simple HTTP request to the server and get the response back.\n\n        :param url: URL to request.\n        :type url: str\n\n        :param method: HTTP method.\n        :type method: str\n\n        :param callback: Callback function.\n        :type callback: callable\n\n        :param timeout: Timeout in seconds.\n            The minimum value is 0.5 and the maximum is 100.0. Any other values\n            will be silently converted to either one of them.\n        :type timeout: int | float\n\n        :param allow_redirects: True to follow redirections, False otherwise.\n        :type allow_redirects: bool\n\n        :returns: HTTP response, or None if the request was cancelled.\n        :rtype: HTTP_Response | None\n\n        :raises NetworkOutOfScope: The resource is out of the audit scope.\n            Note that this can happen even if the URL has been checked against\n            Config.audit_scope -- if the server responds with a\n            redirection against another URL that's out of scope.\n        :raises NetworkException: A network error occurred.\n        \"\"\"\n        request = HTTP_Request(url, method = method, user_agent=self.__user_agent)\n        return self.make_request(request, callback = callback, timeout = timeout, allow_redirects = allow_redirects)\n\n\n    #--------------------------------------------------------------------------\n    def make_request(self, request, callback = None, timeout = 30.0, allow_redirects = True):\n        \"\"\"\n        Send an HTTP request to the server and get the response back.\n\n        :param request: HTTP request to send.\n        :type request: HTTP_Request\n\n        :param callback: Callback function.\n        :type callback: callable\n\n        :param timeout: Timeout in seconds.\n            The minimum value is 0.5 and the maximum is 100.0. Any other values\n            will be silently converted to either one of them.\n        :type timeout: int | float\n\n        :param allow_redirects: True to follow redirections, False otherwise.\n        :type allow_redirects: bool\n\n        :returns: HTTP response, or None if the request was cancelled.\n        :rtype: HTTP_Response | None\n\n        :raises NetworkOutOfScope: The resource is out of the audit scope.\n        :raises NetworkException: A network error occurred.\n        \"\"\"\n\n        # Check initialization.\n        if self.__session is None:\n            self._initialize()\n\n        # Check the arguments.\n        if not isinstance(request, HTTP_Request):\n            raise TypeError(\"Expected HTTP_Request, got %r instead\" % type(request))\n        if callback is not None and not callable(callback):\n            raise TypeError(\n                \"Expected callable (function, class, instance with __call__),\"\n                \" got %r instead\" % type(callback)\n            )\n\n        # Sanitize the timeout value.\n        if timeout:\n            timeout = float(timeout)\n            if timeout > 100.0:\n                timeout = 100.0\n            elif timeout < 0.5:\n                timeout = 0.5\n        else:\n            timeout = 0.5\n\n\n        # Filter the Host header to work around a Requests quirk.\n        headers = request.headers.to_dict()\n        try:\n            del headers['host']\n        except KeyError:\n            pass\n\n        # Send the request.\n        try:\n            t1 = time()\n            resp = self.__session.request(\n                method  = request.method,\n                url     = request.url,\n                headers = headers,\n                data    = request.post_data,\n                ##files   = request.files,   # not supported yet!\n                verify  = False,\n                stream  = True,\n                timeout = timeout,\n                allow_redirects = allow_redirects,\n            )\n            t2 = time()\n        except RequestException, e:\n            #print str(e)\n            raise LalascanNetworkException(str(e))\n\n        try:\n            # Get the response properties.\n            url = resp.url\n            status_code  = str(resp.status_code)\n            content_type = resp.headers.get(\"Content-Type\")\n            try:\n                content_length = int(resp.headers[\"Content-Length\"])\n            except Exception:\n                content_length = None\n\n            # If the final URL is different from the request URL,\n            # abort if the new URL is out of scope.\n            if url != request.url:\n                raise LalascanNetworkOutOfScope(\"URL out of scope: %s\" % url)\n\n            # Call the user-defined callback, and cancel if requested.\n            if callback is not None:\n                cont = callback(request, url, status_code, content_length, content_type)\n                if not cont:\n                    return\n\n            # Autogenerate an URL object.\n            # XXX FIXME: the depth level is broken!!!\n            url_obj = None\n            if url != request.url:\n                url_obj = URL(\n                    url         = url,\n                    method      = request.method,\n                    post_params = request.post_data,\n                    referer     = request.referer,\n                )\n\n            # Download the contents.\n            try:\n                t3 = time()\n                data = resp.content\n                t4 = time()\n            except RequestException, e:\n                raise LalascanNetworkException(str(e))\n\n            # Calculate the elapsed time.\n            elapsed = (t2 - t1) + (t4 - t3)\n\n            # Build an HTTP_Response object.\n            # Since the requests library won't let us access the raw\n            # response bytes, we have to \"reconstruct\" them.\n            response = HTTP_Response(\n                request = request,\n                status  = status_code,\n                headers = resp.headers,\n                data    = data,\n                elapsed = elapsed,\n            )\n\n            # Link it to the originating URL.\n            #if url_obj is not None:\n            #    response.add_resource(url_obj)\n\n\n            # Return the HTTP_Response object.\n            return response\n\n        finally:\n\n            # Close the connection.\n            resp.close()\n\n\n    #--------------------------------------------------------------------------\n    def make_raw_request(self, raw_request, host, port = 80, proto = \"http\",\n                 callback = None, timeout = 30.0):\n        \"\"\"\n        Send a raw HTTP request to the server and get the response back.\n\n        .. note: This method does not support the use of the cache or a proxy.\n\n        .. warning::\n           This method only returns the HTTP response headers, **NOT THE CONTENT**.\n\n        :param raw_request: Raw HTTP request to send.\n        :type raw_request: HTTP_Raw_Request\n\n        :param host: Hostname or IP address to connect to.\n        :type host: str\n\n        :param port: TCP port to connect to.\n        :type port: int\n\n        :param proto: Network protocol (that is, the URL scheme).\n        :type proto: str\n\n        :param callback: Callback function.\n        :type callback: callable\n\n        :param timeout: Timeout in seconds.\n            The minimum value is 0.5 and the maximum is 100.0. Any other values\n            will be silently converted to either one of them.\n        :type timeout: int | float\n\n        :param use_cache: Control the use of the cache.\n                          Use True to force the use of the cache,\n                          False to force not to use it,\n                          or None for automatic.\n        :type use_cache: bool | None\n\n        :returns: HTTP response, or None if the request was cancelled.\n        :rtype: HTTP_Response | None\n\n        :raises NetworkOutOfScope: The resource is out of the audit scope.\n        :raises NetworkException: A network error occurred.\n        \"\"\"\n\n        # Abort if a proxy is configured, because we don't support this yet.\n        if conf.audit_config.proxy_addr:\n            raise NotImplementedError(\"Proxy not yet supported\")\n\n        # Check the arguments.\n        if type(raw_request) is str:\n            raw_request = HTTP_Raw_Request(raw_request)\n        elif not isinstance(raw_request, HTTP_Raw_Request):\n            raise TypeError(\"Expected HTTP_Raw_Request, got %r instead\" % type(raw_request))\n        if type(host) == unicode:\n            raise NotImplementedError(\"Unicode hostnames not yet supported\")\n        if type(host) != str:\n            raise TypeError(\"Expected str, got %r instead\" % type(host))\n        if proto not in (\"http\", \"https\"):\n            raise ValueError(\"Protocol must be 'http' or 'https', not %r\" % proto)\n        if port is None:\n            if proto == \"http\":\n                port = 80\n            elif proto == \"https\":\n                port = 443\n            else:\n                assert False, \"internal error!\"\n        elif type(port) not in (int, long):\n            raise TypeError(\"Expected int, got %r instead\" % type(port))\n        if port < 1 or port > 32767:\n            raise ValueError(\"Invalid port number: %d\" % port)\n        if callback is not None and not callable(callback):\n            raise TypeError(\n                \"Expected callable (function, class, instance with __call__),\"\n                \" got %r instead\" % type(callback)\n            )\n\n\n        # Sanitize the timeout value.\n        if timeout:\n            timeout = float(timeout)\n            if timeout > 100.0:\n                timeout = 100.0\n            elif timeout < 0.5:\n                timeout = 0.5\n        else:\n            timeout = 0.5\n\n        # Resolve the hostname.\n        # FIXME: we're only using the first item, but we could use more\n        #        than one, for example iterate through them if they fail.\n        family, socktype, proto, canonname, sockaddr = \\\n            getaddrinfo(host, port, 0, SOCK_STREAM)[0]\n\n        # Start the timer.\n        t1 = time()\n\n        try:\n            s = socket(family, socktype, proto)\n            try:\n                s.settimeout(timeout)\n                s.connect(sockaddr)\n                try:\n                    if proto == \"https\":\n                        s = wrap_socket(s)\n\n                    # Send the HTTP request.\n                    s.sendall(raw_request.raw_request)\n\n                    # Get the HTTP response headers.\n                    raw_response = StringIO()\n                    while True:\n                        data = s.recv(1)\n                        if not data:\n                            raise LalascanNetworkException(\n                                \"Server has closed the connection\")\n                        raw_response.write(data)\n                        if raw_response.getvalue().endswith(\"\\r\\n\\r\\n\"):\n                            break   # full HTTP headers received\n                        if len(raw_response.getvalue()) > 65536:\n                            raise LalascanNetworkException(\n                                \"Response headers too long\")\n\n                    # Stop the timer.\n                    t2 = time()\n\n                    # Call the user-defined callback,\n                    # and cancel if requested.\n                    if callback is not None:\n                        temp_request  = HTTP_Raw_Request(\n                            raw_request.raw_request)\n                        temp_response = HTTP_Response(\n                            temp_request,\n                            raw_response = raw_response.getvalue()\n                        )\n                        cont = callback(temp_request, temp_response)\n                        if not cont:\n                            return\n                        del temp_request\n                        del temp_response\n\n                    # Start the timer.\n                    t3 = time()\n\n                    # Download the contents.\n                    #\n                    #\n                    #\n                    # XXX TODO\n                    #\n                    #\n                    #\n\n                    # Stop the timer.\n                    t4 = time()\n\n                    # Return the HTTP_Response object.\n                    return HTTP_Response(\n                        request      = raw_request,\n                        raw_response = raw_response.getvalue(),\n                        elapsed      = (t2 - t1) + (t4 - t3),\n                    )\n\n                # Close the connection and clean up the socket.\n                finally:\n                    try:\n                        s.shutdown(2)\n                    except Exception:\n                        pass\n            finally:\n                try:\n                    s.close()\n                except Exception:\n                    pass\n\n        # On socket errors, send an exception.\n        except error, e:\n            raise LalascanNetworkException(str(e))\n\n\n#------------------------------------------------------------------------------\n\n# Singleton pattern.\nHTTP = _HTTP()\n"
  },
  {
    "path": "lalascan/libs/net/scraper.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nURL scraping API.\n\nThis module contains utility functions to extract (scrape) URLs from data.\nCurrently only HTML and plain text data are supported.\n\"\"\"\n\n__all__ = [\n\n    # Generic entry point.\n    \"extract\",\n\n    # Specific parsers for each data format.\n    \"extract_from_text\",\n    \"extract_from_html\",\n\n    # Helper functions.\n    \"is_link\",\n]\n\nfrom .web_utils import parse_url, urldefrag, urljoin\n\nfrom BeautifulSoup import BeautifulSoup\nfrom warnings import warn\n\nimport re\nfrom codecs import decode\nfrom chardet import detect\n\n\n#------------------------------------------------------------------------------\n# URL detection regex, by John Gruber.\n# http://daringfireball.net/2010/07/improved_regex_for_matching_urls\n_re_url_readable = re.compile(r\"\"\"(?i)\\b((?:[a-z][\\w-]+:(?:/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))\"\"\", re.I)\n\n\n#------------------------------------------------------------------------------\n# Wrappers for URIs in plain text\n# http://www.w3.org/Addressing/URL/url-spec.txt\n_re_url_rfc = re.compile(r\"\"\"\\\\<([^\\\\>]+\\\\:\\\\/\\\\/[^\\\\>]+)\\\\>\"\"\", re.I)\n\n\n#------------------------------------------------------------------------------\ndef is_link(url, base_url):\n    \"\"\"\n    Determines if an URL is a link to another resource.\n\n    :param url: URL to test.\n    :type url: str\n\n    :param base_url: Base URL for the current document.\n        Must not contain a fragment.\n    :type base_url: str\n\n    :returns: True if the URL points to another page or resource,\n        False otherwise.\n    :rtype: bool\n    \"\"\"\n    try:\n\n        # Parse the URL. If it can't be parsed, it's not a link.\n        parsed = parse_url(url, base_url)\n\n        # URLs that point to the same page\n        # in a different fragment are not links.\n        parsed.fragment = \"\"\n        if parsed.url == base_url:\n            return False\n\n        # All other URLs are links.\n        return True\n\n    # On any parsing error assume it's not a link.\n    except Exception:\n        return False\n\n\n#------------------------------------------------------------------------------\ndef extract_from_text(text, base_url = None, only_links = True):\n    \"\"\"\n    Extract URLs from text.\n\n    Implementation notes:\n\n    - Unicode URLs are currently not supported.\n\n    :param text: Text.\n    :type text: str\n\n    :param base_url: Base URL for the current document.\n        If not specified, relative URLs are ignored.\n    :type base_url: str\n\n    :param only_links: If True, only extract links to other resources.\n        If False, extract all URLs.\n    :type only_links: bool\n\n    :returns: Extracted URLs.\n    :rtype: set(str)\n    \"\"\"\n\n    # Trivial case.\n    if not text:\n        return set()\n\n    # Check the type.\n    if not isinstance(text, basestring):\n        raise TypeError(\"Expected string, got %r instead\" % type(text))\n\n    # Set where the URLs will be collected.\n    result = set()\n\n    # Remove the fragment from the base URL.\n    if base_url:\n        base_url = urldefrag(base_url)[0]\n\n    # Look for URLs using regular expressions.\n    for regex in (_re_url_rfc, _re_url_readable):\n        for url in regex.findall(text):\n            url = url[0]\n\n            # Skip if we've already seen it.\n            if url in result:\n                continue\n\n            # XXX FIXME\n            # Make sure the text is really ASCII text.\n            # We don't support Unicode yet.\n            try:\n                url = str(url)\n            except Exception:\n                warn(\"Unicode URLs not yet supported: %r\" % url)\n                continue\n\n            # If a base URL was given...\n            if base_url:\n\n                # Canonicalize the URL.\n                # Discard it on parse error.\n                try:\n                    url = urljoin(base_url, url.strip())\n                except Exception:\n                    continue\n\n                # Skip if we've already seen it.\n                if url in result:\n                    continue\n\n                # Discard URLs that are not links to other pages or resources,\n                # and URLs we've already seen.\n                if only_links and (url in result or\n                                       not is_link(url, base_url = base_url)):\n                    continue\n\n            # If a base URL was NOT given...\n            else:\n\n                # Discard relative URLs.\n                # Also discard them on parse error.\n                try:\n                    parsed = parse_url(url)\n                    if not parsed.scheme or not parsed.netloc:\n                        continue\n                except Exception:\n                    raise\n                    continue\n\n            # Add the URL to the set.\n            result.add(url)\n\n    # Return the set of collected URLs.\n    return result\n\n\n#------------------------------------------------------------------------------\ndef extract_forms_from_html(raw_html, base_url):\n    \"\"\"\n    Extract forms info from HTML.\n\n    :param raw_html: Raw HTML data.\n    :type raw_html: str\n\n    :param base_url: Base URL for the current document.\n    :type base_url: str\n\n    :returns: Extracted form info.\n    :rtype: list((URL, METHOD, list({ \"name\" : PARAM_NAME, \"value\" : PARAM_VALUE, \"type\" : PARAM_TYPE})))\n    \"\"\"\n\n    # Set where the URLs will be collected.\n    result = list()\n    result_append = result.append\n\n    # Remove the fragment from the base URL.\n    base_url = urldefrag(base_url)[0]\n\n    # Parse the raw HTML.\n    bs = BeautifulSoup(decode(raw_html, detect(raw_html)[\"encoding\"]))\n\n    for form in bs.findAll(\"form\"):\n        target = form.get(\"action\", None)\n        method = form.get(\"method\", \"POST\").upper()\n\n        if not target:\n            continue\n\n        try:\n            target = str(target)\n        except Exception:\n            warn(\"Unicode URLs not yet supported: %r\" % target)\n            continue\n\n        # Canonicalize the URL.\n        try:\n            target = urljoin(base_url, target.strip())\n        except Exception:\n            continue\n\n        form_params = []\n        form_params_append = form_params.append\n        for params in form.findAll(\"input\"):\n            if params.get(\"type\") == \"submit\":\n                continue\n\n            form_params_append({\n                \"name\": params.get(\"name\", \"NAME\"),\n                \"value\": params.get(\"value\", \"VALUE\"),\n                \"type\": params.get(\"type\", \"TYPE\")})\n\n        # Add to results\n        result_append((target, method, form_params))\n\n    return  result\n\n\n#------------------------------------------------------------------------------\ndef extract_from_html(raw_html, base_url, only_links = True):\n    \"\"\"\n    Extract URLs from HTML.\n\n    Implementation notes:\n\n    - The current implementation is fault tolerant, meaning it will try\n      to extract URLs even if the HTML is malformed and browsers wouldn't\n      normally see those links. This may therefore result in some false\n      positives.\n\n    - HTML5 tags are supported, including tags not currently supported by\n      any major browser.\n\n    :param raw_html: Raw HTML data.\n    :type raw_html: str\n\n    :param base_url: Base URL for the current document.\n    :type base_url: str\n\n    :param only_links: If True, only extract links to other resources.\n        If False, extract all URLs.\n    :type only_links: bool\n\n    :returns: Extracted URLs.\n    :rtype: set(str)\n    \"\"\"\n\n    # Set where the URLs will be collected.\n    result = set()\n    add_result = result.add\n\n    # Remove the fragment from the base URL.\n    base_url = urldefrag(base_url)[0]\n\n    # Parse the raw HTML.\n    bs = BeautifulSoup(decode(raw_html, detect(raw_html)[\"encoding\"]),\n                       convertEntities = BeautifulSoup.ALL_ENTITIES)\n\n    # Some sets of tags and attributes to look for.\n    href_tags = {\"a\", \"link\", \"area\"}\n    src_tags = {\"script\", \"img\", \"iframe\", \"frame\", \"embed\", \"source\", \"track\"}\n    param_names = {\"movie\", \"href\", \"link\", \"src\", \"url\", \"uri\"}\n\n    # Iterate once through all tags...\n    for tag in bs.findAll():\n\n        # Get the tag name, case insensitive.\n        name = tag.name.lower()\n\n        # Extract the URL from each tag that has one.\n        url = None\n        if name in href_tags:\n            url = tag.get(\"href\", None)\n        elif name in src_tags:\n            url = tag.get(\"src\", None)\n        elif name == \"param\":\n            name = tag.get(\"name\", \"\").lower().strip()\n            if name in param_names:\n                url = tag.get(\"value\", None)\n        ##elif name == \"form\":\n        ##    url = tag.get(\"action\", None)\n        elif name == \"object\":\n            url = tag.get(\"data\", None)\n        elif name == \"applet\":\n            url = tag.get(\"code\", None)\n        elif name == \"meta\":\n            name = tag.get(\"name\", \"\").lower().strip()\n            if name == \"http-equiv\":\n                content = tag.get(\"content\", \"\")\n                p = content.find(\";\")\n                if p >= 0:\n                    url = content[ p + 1 : ]\n        elif name == \"base\":\n            url = tag.get(\"href\", None)\n            if url is not None:\n\n                # XXX FIXME\n                # Unicode URLs are not supported.\n                try:\n                    url = str(url)\n                except Exception:\n                    warn(\"Unicode URLs not yet supported: %r\" % url)\n                    continue\n\n                # Update the base URL.\n                try:\n                    base_url = urljoin(base_url, url.strip(),\n                                       allow_fragments = False)\n                except Exception:\n                    continue\n\n        # If we found an URL in this tag...\n        if url is not None:\n\n            # XXX FIXME\n            # Unicode URLs are not supported.\n            try:\n                url = str(url)\n            except Exception:\n                warn(\"Unicode URLs not yet supported: %r\" % url)\n                continue\n\n            # Canonicalize the URL.\n            try:\n                url = urljoin(base_url, url.strip())\n            except Exception:\n                continue\n\n            # Discard URLs that are not links to other pages or resources.\n            if not only_links or is_link(url, base_url = base_url):\n\n                # Add the URL to the set.\n                add_result(url)\n\n    # Return the set of collected URLs.\n    return result\n\n\n#------------------------------------------------------------------------------\ndef extract(raw_data, content_type, base_url, only_links = True):\n    \"\"\"\n    Extract URLs from raw data.\n\n    Implementation notes:\n\n    - Unicode URLs are currently not supported.\n\n    - The current implementation is fault tolerant, meaning it will try\n      to extract URLs even if the HTML is malformed and browsers wouldn't\n      normally see those links. This may therefore result in some false\n      positives.\n\n    - HTML5 tags are supported, including tags not currently supported by\n      any major browser.\n\n    :param raw_data: Raw data.\n    :type raw_data: str\n\n    :param content_type: MIME content type.\n    :type content_type: str\n\n    :param base_url: Base URL for the current document.\n    :type base_url: str\n\n    :param only_links: If True, only extract links to other resources.\n        If False, extract all URLs.\n    :type only_links: bool\n\n    :returns: Extracted URLs.\n    :rtype: set(str)\n    \"\"\"\n\n    # Sanitize the content type.\n    content_type = content_type.strip().lower()\n    if \";\" in content_type:\n        content_type = content_type[ content_type.find(\";\") : ].strip()\n\n    # HTML parser.\n    if content_type == \"text/html\":\n        urls = extract_from_html(raw_data, base_url, only_links)\n        urls.update( extract_from_text(raw_data, base_url, only_links) )\n        return urls\n\n    # Generic plain text parser.\n    if content_type.startswith(\"text/\"):\n        return extract_from_text(raw_data, base_url, only_links)\n\n    # Unsupported content type.\n    return set()\n"
  },
  {
    "path": "lalascan/libs/net/web_mutants.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n\"\"\"\nWeb muntants API.\n\nPackage payload to URL request, and Get Response info data from payload requests\n\"\"\"\n\n__author__ = 'BlackYe.'\n\nfrom lalascan.api.exception import LalascanBaseException, LalascanDataException, LalascanValueError\nfrom lalascan.data.information.html import HTML\nfrom lalascan.data.resource.url import URL\nfrom lalascan.libs.core.globaldata import L\nfrom lalascan.libs.net.scraper import extract_from_html, extract_from_text, extract_forms_from_html\nfrom lalascan.libs.net.web_utils import parse_url, argument_query, get_request\nfrom lalascan.utils.text_utils import to_utf8\nimport time\nfrom copy import copy\n\nimport inspect\n\ndef payload_muntants(url_info, payload = {}, bmethod = 'GET', exclude_cgi_suffix = ['css', 'js', 'jpeg', 'jpg', 'png', 'gif', 'svg', 'txt'],\n                     use_cache = None, timeout = 30.0 , payload_encode = True, bcheck_use_orig_body = True, req_header = {},\n                     resp_code = '200', resp_header = {}, **kwargs):\n\n    '''\n\n    :param url_info:\n    :param payload: {'k':'id', 'pos': 1, 'payload':str, 'type': 0}  (pos:0 key, pos:1 value) (type:0 append, type:1 replace)\n    :param exclude_cgi_suffix:\n    :param depth:\n    :param bcheck_use_orig_body:\n    :param req_header:\n    :param resp_code:\n    :param resp_header:\n    :param kwargs:\n    :return:\n    '''\n\n    if not isinstance(url_info , URL):\n        raise TypeError(\"Expected url object, type:%s\" % type(url_info))\n\n    if not isinstance(payload, dict):\n        raise TypeError(\"Excepted payload object, type:%s\" % type(payload))\n\n    if url_info.parsed_url.extension[1:] in exclude_cgi_suffix:\n        L.logger.log_verbose(\"Skipping URL: %s\" % url_info.url)\n\n    m_url_info = copy(url_info)\n    if  bmethod == \"GET\":\n        param_dict = copy(m_url_info.url_params)\n    elif bmethod == \"POST\":\n        param_dict = copy(m_url_info.post_params)\n\n    if len(param_dict) == None and len(param_dict) == 0:\n        return None\n\n    __ = parse_url(m_url_info.url)\n\n    k = payload['k']\n    if payload['pos'] == 1:\n        #value\n        if payload['type'] == 0:  #append\n            param_dict[k] = param_dict[k] + payload['payload']\n        elif payload['type'] == 1:  #replace\n            param_dict[k] = payload['payload']\n    else:\n        #key 先不考虑key值\n        if payload['type'] == 0:\n            param_dict.update(k = param_dict.pop(k))\n\n        # TODO GET/POST param key need deal\n        raise LalascanValueError(\"GET/POST param key payload is not support!\")\n\n    if bmethod == \"GET\":\n        m_resource_url_payload = URL(url = __.request_cgi, method = bmethod, referer = m_url_info.referer, url_params= param_dict, post_params = m_url_info.post_params, urlencode = payload_encode)\n        try:\n            L.logger.log_verbose('[webvul:%s] [+] %s' % (get_curmodule(), m_resource_url_payload.url))\n        except LalascanBaseException:\n            L.logger.log_verbose('[+] %s' %  m_resource_url_payload.url)\n\n    elif bmethod == \"POST\":\n        m_resource_url_payload = URL(url = __.request_cgi, method = bmethod, referer = m_url_info.referer, url_params= m_url_info.url_params, post_params= param_dict, urlencode = payload_encode)\n        try:\n            L.logger.log_verbose('[webvul:%s] [+] %s %s' % (get_curmodule(), m_resource_url_payload.url, param_dict))\n        except LalascanBaseException:\n            L.logger.log_verbose('[+] %s %s' %  (m_resource_url_payload.url, param_dict))\n\n    return get_request(url = m_resource_url_payload, allow_redirects=False, use_cache = use_cache, timeout = timeout), m_resource_url_payload\n\n\ndef request_muntants(url, timeout = 30.0, allow_redirects = True, allow_out_of_scope = False):\n\n    if not isinstance(url , URL):\n        raise TypeError(\"Expected url object, type:%s\" % type(url))\n\n    L.logger.log_verbose('[requets_url:%s] [+] %s' % (get_curmodule(), url.url))\n    return get_request(url = url, allow_redirects=False, timeout = timeout)\n\n\ndef get_curmodule():\n    try:\n        return inspect.stack()[2][1]\n    except LalascanBaseException,e:\n        raise LalascanDataException(\"Get Request Module is Error! Reason:%s\" % str(e))\n"
  },
  {
    "path": "lalascan/libs/net/web_utils.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nWeb utilities API.\n\"\"\"\n\n__all__ = [\n    \"download\", \"data_from_http_response\", \"generate_user_agent\",\n    \"fix_url\", \"check_auth\", \"get_auth_obj\", \"detect_auth_method\",\n    \"split_hostname\", \"generate_error_page_url\", \"get_error_page\",\n    \"ParsedURL\", \"parse_url\", \"urlparse\", \"urldefrag\", \"urljoin\",\n    \"json_decode\", \"json_encode\",\n]\n\n\nfrom ...api.exception import LalascanNetworkOutOfScope, LalascanNetworkException\n#from ..data import LocalDataCache, discard_data\nfrom ...utils.text_utils import generate_random_string, split_first, to_utf8\n#from ..text.matching_analyzer import get_diff_ratio\nfrom ..core.common import json_decode, json_encode\nfrom ..core.settings import NGX_HTTP_CODE\nfrom ..core.globaldata import L\n\nfrom BeautifulSoup import BeautifulSoup\nfrom copy import deepcopy\nfrom posixpath import join, splitext, split\nfrom random import randint\nfrom requests import Request, Session, codes\nfrom requests.auth import HTTPBasicAuth, HTTPDigestAuth\nfrom thirdparty_libs.requests_ntlm import HttpNtlmAuth\nfrom thirdparty_libs.tldextract import TLDExtract\nfrom urllib import quote, quote_plus, unquote, unquote_plus\nfrom urlparse import urljoin as original_urljoin\nfrom warnings import warn\n\nimport re, time\nfrom urlparse import urlparse\n\n#------------------------------------------------------------------------------\n# URL class from urllib3 renamed as Urllib3_Url to avoid confusion.\n\ntry:\n    from requests.packages.urllib3.util import Url as Urllib3_Url\nexcept ImportError:\n    from urllib3.util import Url as Urllib3_Url\n\n\n#------------------------------------------------------------------------------\n__user_agents = (\n    \"Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.5.22 Version/10.50\",\n    \"Mozilla/6.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:2.0.0.0) Gecko/20061028 Firefox/3.0\",\n    \"Mozilla/6.0 (Windows NT 6.2; WOW64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1\",\n    \"Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20100101 Firefox/13.0.1\",\n    \"Mozilla/5.0 (X11; Linux i686; rv:6.0) Gecko/20100101 Firefox/6.0\",\n    \"Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120724 Debian Iceweasel/15.0\",\n    \"Mozilla/5.0 (X11; Linux) KHTML/4.9.1 (like Gecko) Konqueror/4.9\",\n    \"Lynx/2.8.8dev.3 libwww-FM/2.14 SSL-MM/1.4.1\",\n    \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.60 Safari/537.17\",\n    \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.6 Safari/537.11\",\n    \"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1\",\n    \"Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)\",\n    \"Mozilla/5.0 (compatible; MSIE 10.6; Windows NT 6.1; Trident/5.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727) 3gpp-gba UNTRUSTED/1.0\",\n    \"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; GTB7.4; InfoPath.2; SV1; .NET CLR 3.3.69573; WOW64; en-US)\",\n    \"Mozilla/4.0(compatible; MSIE 7.0b; Windows NT 6.0)\",\n    \"Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5\",\n    \"Mozilla/5.0 (Linux; U; Android 4.0.3; ko-kr; LG-L160L Build/IML74K) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30\",\n    \"Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.346 Mobile Safari/534.11+\",\n    \"Mozilla/5.0 (PLAYSTATION 3; 3.55)\",\n    \"Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)\"\n    \"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)\",\n    \"Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)\",\n    \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.13+ (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2\",\n    \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-us) AppleWebKit/534.16+ (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\",\n    \"Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25\"\n)\n\n# This var contains names of vars uses by most commont web servers. This will be used by\n# all of injection tools, that can skip these vars.\nWEB_SERVERS_VARS = [\"__utma\",\n                    \"__utmb\",\n                    \"__utmc\",\n                    \"__utmz\",\n                    \"JSESSIONID\",\n                    \"PHPSESSID\",\n                    \"ASPSESSIONID\"]\n\ndef generate_user_agent():\n    \"\"\"\n    :returns: A valid user agent string, randomly chosen from a predefined list.\n    :rtype: str\n    \"\"\"\n    return __user_agents[randint(0, len(__user_agents) - 1)]\n\n\n#------------------------------------------------------------------------------\ndef data_from_http_response(response):\n    \"\"\"\n    Extracts data from an HTTP response.\n\n    :param response: HTTP response.\n    :type response: HTTP_Response\n\n    :returns: Extracted data, or None if no data was found.\n    :rtype: Data | None\n    \"\"\"\n\n    # If we have no data, return None.\n    if not response.data:\n        return None\n\n    # Get the MIME content type.\n    content_type = response.content_type\n\n    # Strip the content type modifiers.\n    if \";\" in content_type:\n        content_type = content_type[:content_type.find(\";\")]\n\n    # Sanitize the content type.\n    content_type = content_type.strip().lower()\n    if \"/\" not in content_type:\n        return None\n\n    # Parse the data.\n    data = None\n    try:\n\n        # HTML pages.\n        if content_type == \"text/html\":\n            from ...data.information.html import HTML\n            data = HTML(response.data)\n\n        # Plain text data.\n        elif content_type.startswith(\"text/\"):\n            from ...data.information.text import Text\n            data = Text(response.data, response.content_type)\n\n        # Image files.\n        elif content_type.startswith(\"image/\"):\n            from ...data.information.image import Image\n            data = Image(response.data, response.content_type)\n\n    # Catch errors and throw warnings instead.\n    except Exception, e:\n        ##raise # XXX DEBUG\n        warn(str(e), RuntimeWarning)\n\n    # Anything we don't know how to parse we treat as binary.\n    if data is None:\n        from ...data.information.binary import Binary\n        data = Binary(response.data, response.content_type)\n\n    # Associate the data to the response.\n    data.add_information(response)\n\n    # Return the data.\n    return data\n\n\n#---------------------------------------------------\n# Add By BlackYe\n#TODO fix\ndef get_request(url, timeout = 30.0, allow_redirects = True,\n             allow_out_of_scope = False, use_cache = None):\n    \"\"\"\n    request the given URL.\n\n    :param url: URL to download.\n    :type url: Url\n\n    :param timeout: Timeout in seconds.\n            The minimum value is 0.5 and the maximum is 100.0. Any other values\n            will be silently converted to either one of them.\n    :type timeout: int | float\n\n    :param allow_redirects: True to follow redirections, False otherwise.\n    :type allow_redirects: bool\n\n    :param allow_out_of_scope: True to allow download of URLs out of scope,\n                               False otherwise.\n    :type allow_out_of_scope: bool\n\n    :returns: Downloaded data as an object of the GoLismero data model,\n              or None if cancelled.\n    :rtype: File | None\n\n    :raises NetworkOutOfScope: The resource is out of the audit scope.\n    :raises NetworkException: A network error occurred during download.\n    :raises NotImplementedError: The network protocol is not supported.\n    \"\"\"\n\n    # Autogenerate an URL object if a string is given (common mistake).\n    from ...data.resource.url import URL\n    if not isinstance(url, URL):\n        url = URL(url)\n        parsed = url.parsed_url\n        if not parsed.hostname or not parsed.scheme:\n            raise ValueError(\"Only absolute URLs must be used!\")\n\n    # Validate the protocol.\n    # TODO: add support for FTP\n    scheme = url.parsed_url.scheme\n    if scheme not in (\"http\", \"https\"):\n        raise NotImplementedError(\"Protocol not supported: %s\" % scheme)\n\n    # Autogenerate the HTTP request object.\n    from ...data.http import HTTP_Request\n    request = HTTP_Request( url         = url.url,\n                            method      = url.method,\n                            post_data   = url.post_params,\n                            referer     = url.referer,\n                            user_agent  = None)\n\n    # Send the request and get the response.\n    from .http import HTTP\n\n    retry_cnt = 0\n\n    while retry_cnt < 3:\n        try:\n            response = HTTP.make_request(request,\n                                         callback = None,\n                                         timeout = timeout,\n                                         allow_redirects = allow_redirects)\n\n            _status_code = int(response.status)\n\n            if _status_code >= NGX_HTTP_CODE['NGX_HTTP_ERROR']:\n                retry_cnt += 1\n                time.sleep(0.5)\n                L.logger.log_error(\"Error while processing %r: Return Http Code:%d\" % (url.url, _status_code))\n            elif (_status_code >= NGX_HTTP_CODE['NGX_HTTP_NOT_FOUND'] and _status_code < NGX_HTTP_CODE['NGX_HTTP_ERROR']): #404\n                L.logger.log_error(\"Error while processing %r: Return Http Code:%d\" % (url.url, _status_code))\n                return None\n            else:\n                return response\n        except LalascanNetworkException, e:\n            retry_cnt += 1\n            time.sleep(0.5)\n            L.logger.log_error(\"Error while processing %r: %s\" % (url.url, str(e)))\n        except LalascanNetworkOutOfScope, e:\n            retry_cnt += 1\n            time.sleep(0.5)\n            L.logger.log_error(\"Error while processing %r: %s\" % (url.url, str(e)))\n\n    return None\n\n\n\n#------------------------------------------------------------------------------\ndef fix_url(url, base_url=None):\n    \"\"\"\n    Parse a URL input from a user and convert it to a canonical URL.\n\n    Relative URLs are converted to absolute URLs if the base URL is given.\n\n    .. warning:\n       This function may be removed in future versions of GoLismero.\n\n    Example:\n\n    >>> fix_url(\"www.site.com\")\n    http://www.site.com\n    >>> fix_url(url=\"/contact\", base_url=\"www.site.com\")\n    http://www.site.com/contact\n\n    :param url: URL\n    :type url: str\n\n    :param base_url: (Optional) Base URL.\n    :type base_url: str\n\n    :return: Canonical URL.\n    :rtype: str\n    \"\"\"\n\n    url      = to_utf8(url)\n    base_url = to_utf8(base_url)\n\n    parsed = ParsedURL(url)\n    if not parsed.scheme:\n        parsed.scheme = 'http://'\n\n    if base_url:\n        # Remove the fragment from the base URL.\n        base_url = urldefrag(base_url)[0]\n        # Canonicalize the URL.\n        return urljoin(base_url, parsed.url.strip())\n    else:\n        return parsed.url\n\n\n#------------------------------------------------------------------------------\ndef check_auth(url, user, password):\n    \"\"\"\n    Check the auth for and specified url.\n\n    .. warning:\n       This function may be removed in future versions of GoLismero.\n\n    :param url: String with url.\n    :type url: str\n\n    :param user: string with user text\n    :type user: str\n\n    :param password: string with password text\n    :type password: str\n\n    :return: True if authentication is successful, False otherwise.\n    :rtype: bool\n    \"\"\"\n\n    # Check trivial case.\n    if not url:\n        return False\n\n    # Sanitize URL string.\n    url = to_utf8(url)\n\n    # Get authentication method.\n    auth, _ = detect_auth_method(url)\n\n    # Is authentication required?\n    if auth:\n\n        # Get authentication object.\n        m_auth_obj = get_auth_obj(auth, user, password)\n\n        # Try the request.\n        req = Request(url = url, auth = m_auth_obj)\n        p = req.prepare()\n        s = Session()\n        r = s.send(p)\n\n        # Check if authentication was successful.\n        return r.status_code == codes.ok\n\n    # No authentication is required.\n    return True\n\n\n#------------------------------------------------------------------------------\ndef get_auth_obj(method, user, password):\n    \"\"\"\n    Generates an authentication code object depending of method as parameter:\n\n    * \"basic\"\n    * \"digest\"\n    * \"ntlm\"\n\n    .. warning:\n       This function may be removed in future versions of GoLismero.\n\n    :param method: Auth method: basic, digest, ntlm.\n    :type method: str\n\n    :param user: string with user text\n    :type user: str\n\n    :param password: string with password text\n    :type password: str\n\n    :return: an object with authentication or None if error/problem.\n    \"\"\"\n    m_auth_obj = None\n\n    if method:\n\n        m_method = method.lower()\n        if m_method == \"basic\":\n            m_auth_obj = HTTPBasicAuth(user, password)\n        elif m_method == \"digest\":\n            m_auth_obj = HTTPDigestAuth(user, password)\n        elif m_method == \"ntlm\":\n            m_auth_obj = HttpNtlmAuth(user, password)\n\n    return m_auth_obj\n\n\n#------------------------------------------------------------------------------\ndef detect_auth_method(url):\n    \"\"\"\n    Detects authentication method/type for an URL.\n\n    .. warning:\n       This function may be removed in future versions of GoLismero.\n\n    :param url: url to test authentication.\n    :type url: str.\n\n    :return: (scheme, realm) if auth required. None otherwise.\n    \"\"\"\n\n    url = to_utf8(url)\n    req = Request(url=url)\n\n    p = req.prepare()\n    s = Session()\n    r = s.send(p)\n\n    if 'www-authenticate' in r.headers:\n        authline = r.headers['www-authenticate']\n        authobj  = re.compile(\n            r'''(?:\\s*www-authenticate\\s*:)?\\s*(\\w*)\\s+realm=['\"]([^'\"]+)['\"]''',\n            re.IGNORECASE)\n        matchobj = authobj.match(authline)\n\n        if matchobj:\n            scheme = matchobj.group(1)\n            realm  = matchobj.group(2)\n            return scheme, realm\n\n    return None, None\n\n\n#------------------------------------------------------------------------------\ndef split_hostname(hostname):\n    \"\"\"\n    Splits a hostname into its subdomain, domain and TLD parts.\n\n    For example:\n\n    >>> d = ParsedURL(\"http://www.example.com/\")\n    >>> d.split_hostname()\n    ('www', 'example', 'com')\n    >>> d = ParsedURL(\"http://some.subdomain.of.example.co.uk/\")\n    >>> d.split_hostname()\n    ('some.subdomain.of', 'example', 'co.uk')\n    >>> '.'.join(d.split_hostname())\n    'some.subdomain.of.example.co.uk'\n\n    :param hostname: Hostname to split.\n    :type hostname: str\n\n    :returns: Subdomain, domain and TLD.\n    :rtype: tuple(str, str, str)\n    \"\"\"\n    extract = TLDExtract(fetch = False)\n    result  = extract( to_utf8(hostname) )\n    return result.subdomain, result.domain, result.suffix\n\n\n#------------------------------------------------------------------------------\ndef generate_error_page_url(url):\n    \"\"\"\n    Takes an URL to an existing document and generates a random URL\n    to a nonexisting document, to trigger a server error.\n\n    Example:\n\n    >>> generate_error_page_url(\"http://www.site.com/index.php\")\n    'http://www.site.com/index.php.19ds_8vjX'\n\n    :param url: Original URL. It must point to an existing document.\n    :type  url: str\n\n    :return: Generated URL.\n    :rtype: str\n    \"\"\"\n    m_parsed_url = ParsedURL(url)\n    m_parsed_url.path = m_parsed_url.path + generate_random_string()\n    return m_parsed_url.url\n\n\n#------------------------------------------------------------------------------\ndef get_error_page(url):\n    \"\"\"\n    Takes an URL to an existing document and generates a random URL\n    to a nonexisting document, then uses it to trigger a server error.\n    Returns the error page as a File object (typically this would be\n    an HTML object, but it may be something else).\n\n    :param url: Original URL. It must point to an existing document.\n    :type  url: str\n\n    :returns: Downloaded data as an object of the GoLismero data model,\n              or None on error.\n    :rtype: File | None\n\n    :raises: ValueError\n    \"\"\"\n\n    # Make the URL.\n    m_error_url = generate_error_page_url(url)\n\n    # Get the error page.\n    try:\n        m_error_response = get_request(m_error_url)\n    except Exception:\n        raise ValueError(\"Can't get error page.\")\n\n    # Mark the error page as discarded. Most likely the plugin won't need to\n    # send this back as a result.\n    #discard_data(m_error_response)\n\n    # Return the error page.\n    return m_error_response\n\n\n#------------------------------------------------------------------------------\ndef parse_url(url, base_url = None):\n    \"\"\"\n    Parse an URL and return a mutable object with all its parts.\n\n    For more details see: ParsedURL\n\n    :param url: URL to parse.\n    :type url: str\n\n    :param base_url: Optional base URL.\n    :type base_url: str\n\n    :returns: Mutable object with access to the URL parts.\n    :rtype: ParsedURL\n    \"\"\"\n    return ParsedURL(url, base_url)\n\n\n#------------------------------------------------------------------------------\n# Emulate the standard URL parser with our own.\n\ndef urlparse(url):\n    return parse_url(url)\n\ndef urldefrag(url):\n    p = parse_url(url)\n    f = p.fragment\n    p.fragment = \"\"\n    return p.url, f\n\ndef urljoin(base_url, url, allow_fragments = True):\n    if not allow_fragments:\n        url = urldefrag(url)\n        base_url = urldefrag(base_url)\n    return parse_url(url, base_url).url\n\n\n#-------------------\n# Add By BlackYe\n# post argument str => dict\n# a=1&b=2  ==> {'a':'1', 'b':'2'}\n\ndef argument_query(query_str):\n    if query_str and query_str.startswith('?'):\n        warn(\"You don't need to use a leading '?' when setting the query\"\n         \" string, this may be an error!\", stacklevel=3)\n    if not query_str:\n        query_params = {}\n    else:\n        try:\n            # much faster than parse_qsl()\n            query_params = dict(( map(unquote_plus, (to_utf8(token) + '=').split('=', 2)[:2])\n                                  for token in query_str.split('&') ))\n            if len(query_params) == 1 and not query_params.values()[0]:\n                query_params = {}\n            else:\n                query = None\n        except Exception:\n            ##raise   # XXX DEBUG\n            query_params = {}\n    return query_params\n\n\n#------------------------------------------------------------------------------\nclass ParsedURL (object):\n    \"\"\"\n    Parse an URL and return a mutable object with all its parts.\n\n    For example, the following URL:\n\n    http://user:pass@www.site.com/folder/index.php?param1=val1&b#anchor\n\n    Is broken down to the following properties:\n\n    + url          = 'http://user:pass@www.site.com/folder/index.php?param1=val1&b#anchor'\n    + base_url     = 'http://user:pass@www.site.com'\n    + request_uri  = '/folder/index.php?b=&param1=val1\n    + scheme       = 'http'\n    + host         = 'www.site.com'\n    + port         = 80\n    + username     = 'user'\n    + password     = 'pass'\n    + auth         = 'user:pass'\n    + netloc       = 'user:pass@www.site.com'\n    + path         = '/folder/index.php'\n    + directory    = '/folder'\n    + filename     = 'index.php'\n    + filebase     = 'index'\n    + extension    = '.php'\n    + query        = 'b=&param1=val1'\n    + query_params = { 'param1' : 'val1', 'b' : '' }\n    + fragment     = 'anchor'\n\n    The url property contains the normalized form of the URL, mostly\n    preserving semantics (the query parameters may be sorted, and empty\n    URL components are removed).\n    For more details see: https://en.wikipedia.org/wiki/URL_normalization\n\n    Changes to the values of these properties will be reflected in all\n    other relevant properties. The url and request_uri properties are\n    read-only, however.\n\n    **Missing properties are returned as empty strings**, except for the port\n    and query_params properties: port is an integer from 1 to 65535 when\n    found, or None when it's missing and can't be guessed; query_params is\n    a dictionary that may be empty when missing, or None when the query\n    string could not be parsed as standard key/value pairs.\n\n    Rebuilding the URL may result in a slightly different, but\n    equivalent URL, if the URL that was parsed originally had\n    unnecessary delimiters (for example, a ? with an empty query;\n    the RFC states that these are equivalent).\n\n    Example:\n\n    >>> url=\"http://user:pass@www.site.com/folder/index.php?param1=val1&b#anchor\"\n    >>> r = ParsedURL(url)\n    >>> r.scheme\n    'http'\n    >>> r.filename\n    'index.php'\n    >>> r.hostname\n    'www.site.com'\n\n    .. warning::\n       The url, request_uri, query, netloc and auth properties are URL-encoded.\n       All other properties are URL-decoded.\n\n    .. warning::\n       Unicode is currently *NOT* supported.\n    \"\"\"\n\n\n    #--------------------------------------------------------------------------\n    # TODO: for the time being we're using the buggy quote and unquote\n    # implementations from urllib, but we'll have to roll our own to\n    # properly support Unicode (urllib does a mess of it!).\n    #--------------------------------------------------------------------------\n\n\n    #--------------------------------------------------------------------------\n    # Dictionary of default port numbers per each supported scheme.\n    # The keys of this dictionary are also used to check if a given\n    # scheme is supported by this class.\n\n    default_ports = {\n        'http'      : 80,        # http://www.example.com/\n        'https'     : 443,       # https://secure.example.com/\n        'ftp'       : 21,        # ftp://ftp.example.com/file.txt\n        'mailto'    : 25,        # mailto://user@example.com?subject=Hi!\n        ##'callto'    : None,      # callto:+34666131313\n        ##'file'      : None,      # file://C:\\Windows\\System32\\calc.exe\n        ##'data'      : None,      # data:data:image/png;base64,iVBORw0KGgoA...\n        ##'javascript': None,      # javascript:alert('XSS')\n        ##'vbscript'  : None,      # vbscript:alert('XSS')\n        ##'magnet'    : None,      # magnet:?xt=urn:sha1:YNCKHTQCWBTRNJIV4WN...\n    }\n\n    # See also:\n    # https://code.google.com/p/fuzzdb/source/browse/trunk/attack-payloads/http-protocol/known-uri-types.fuzz\n\n\n    #--------------------------------------------------------------------------\n    # List of schemes that require :// instead of just :\n\n    __two_dashes_required = (\n        'http', 'https', 'ftp', #'file',\n    )\n\n\n    #--------------------------------------------------------------------------\n    # The constructor has code borrowed from the urllib3 project, then\n    # adapted and expanded to fit the needs of GoLismero.\n    #\n    # Urllib3 is copyright 2008-2012 Andrey Petrov and contributors (see\n    # CONTRIBUTORS.txt) and is released under the MIT License:\n    # http://www.opensource.org/licenses/mit-license.php\n    # http://raw.github.com/shazow/urllib3/master/CONTRIBUTORS.txt\n    #\n    def __init__(self, url, base_url = None):\n        \"\"\"\n        :param url: URL to parse.\n        :type url: str\n\n        :param base_url: Optional base URL.\n        :type base_url: str\n        \"\"\"\n\n        url      = to_utf8(url)\n        base_url = to_utf8(base_url)\n\n        if not isinstance(url, str):\n            raise TypeError(\"Expected string, got %r instead\" % type(url))\n        if base_url is not None and not isinstance(base_url, str):\n            raise TypeError(\"Expected string, got %r instead\" % type(base_url))\n\n        original_url = url\n\n        self.__query_char = '?'\n\n        scheme   = ''\n        auth     = ''\n        host     = ''\n        port     = None\n        path     = ''\n        query    = ''\n        fragment = ''\n\n        if base_url:\n            url = original_urljoin(base_url, url, allow_fragments=True)\n\n        # Scheme\n        if ':' in url:\n            if '://' in url:\n                scheme, url = url.split('://', 1)\n            else:\n                scheme, url = url.split(':', 1)\n                if scheme in self.__two_dashes_required:\n                    raise ValueError(\"Failed to parse: %s\" % original_url)\n\n            # we sanitize it here to prevent errors down below\n            scheme = scheme.strip().lower()\n            if '%' in scheme or '+' in scheme:\n                scheme = unquote_plus(scheme)\n            if scheme not in self.default_ports:\n                raise ValueError(\"Failed to parse: %s\" % original_url)\n\n        # Find the earliest Authority Terminator\n        # (http://tools.ietf.org/html/rfc3986#section-3.2)\n\n        url, path_, delim = split_first(url, ['/', '?', '#'])\n\n        if delim:\n            # Reassemble the path\n            path = delim + path_\n\n        # Auth\n        if '@' in url:\n            auth, url = url.split('@', 1)\n\n        # IPv6\n        if url and url[0] == '[':\n            host, url = url[1:].split(']', 1)\n            host = \"[%s]\" % host  # we need to remember it's IPv6\n\n        # Port\n        if ':' in url:\n            _host, port = url.split(':', 1)\n\n            if not host:\n                host = _host\n\n            if '%' in port:\n                port = unquote(port)\n\n            if not port.isdigit():\n                raise ValueError(\"Failed to parse: %s\" % original_url)\n\n            port = int(port)\n\n        elif not host and url:\n            host = url\n\n        if path:\n\n            # Fragment\n            if '#' in path:\n                path, fragment = path.split('#', 1)\n\n            # Query\n            if '?' in path:\n                path, query = path.split('?', 1)\n            else:\n                # Fix path for values like:\n                # http://www.site.com/folder/value_id=0\n                p = path.rfind('/') + 1\n                if p > 0:\n                    _path = path[:p]\n                    _query = path[p:]\n                else:\n                    _path = '/'\n                    _query = path\n                if '=' in _query:\n                    path, query = _path, _query\n                    self.__query_char = '/'\n\n        if auth:\n            auth = unquote_plus(auth)\n        if host:\n            host = unquote_plus(host)\n        if path:\n            path = unquote_plus(path)\n        if fragment:\n            fragment = unquote_plus(fragment)\n\n        self.__scheme = scheme  # already sanitized\n        self.auth = auth\n        self.host = host\n        self.port = port\n        self.path = path\n        self.query = query\n        self.fragment = fragment\n\n\n    #--------------------------------------------------------------------------\n    def __str__(self):\n        return self.url\n\n\n    #--------------------------------------------------------------------------\n    def copy(self):\n        \"\"\"\n        :returns: A copy of this object.\n        :rtype: ParsedURL\n        \"\"\"\n        return deepcopy(self)\n\n\n    #--------------------------------------------------------------------------\n    def to_urlsplit(self):\n        \"Convert to a tuple that can be passed to urlparse.urlunstrip().\"\n        # Do not document the return type!\n        return (\n            self.__scheme,\n            self.netloc,\n            self.__path,\n            self.query,\n            self.__fragment\n        )\n\n\n    #--------------------------------------------------------------------------\n    def to_urlparse(self):\n        \"Convert to a tuple that can be passed to urlparse.urlunparse().\"\n        # Do not document the return type!\n        return (\n            self.__scheme,\n            self.netloc,\n            self.__path,\n            None,\n            self.query,\n            self.__fragment\n        )\n\n\n    #--------------------------------------------------------------------------\n    def to_urllib3(self):\n        \"Convert to a named tuple as returned by urllib3.parse_url().\"\n        # Do not document the return type!\n        return Urllib3_Url(self.__scheme, self.auth, self.__host, self.port,\n                           self.__path, self.query, self.__fragment)\n\n\n    #--------------------------------------------------------------------------\n    def match_extension(self, extension,\n                        directory_allowed = True,\n                        double_allowed    = True,\n                        case_insensitive  = True):\n        \"\"\"\n        Tries to match the given extension against the URL path.\n\n        By default every component of the path is tested:\n\n        >>> d = ParsedURL(\"http://www.example.com/download.php/filename/file.pdf\")\n        >>> d.match_extension(\".php\")\n        True\n        >>> d.match_extension(\".pdf\")\n        True\n        >>> d.match_extension(\".exe\")\n        False\n\n        However you can set the 'directory_allowed' to False to check only the last component:\n\n        >>> d = ParsedURL(\"http://www.example.com/download.php/filename/file.pdf\")\n        >>> d.match_extension(\".php\", directory_allowed = True)\n        True\n        >>> d.match_extension(\".php\", directory_allowed = False)\n        False\n\n        Double extension is supported, as it can come in handy when analyzing malware URLs:\n\n        >>> d = ParsedURL(\"http://www.example.com/malicious.pdf.exe\")\n        >>> d.filebase\n        'malicious.pdf'\n        >>> d.extension\n        '.exe'\n        >>> d.match_extension(\".pdf\")\n        True\n        >>> d.match_extension(\".exe\")\n        True\n\n        The double extension support can be disabled by setting the 'double_allowed' argument to False:\n\n        >>> d = ParsedURL(\"http://www.example.com/malicious.pdf.exe\")\n        >>> d.match_extension(\".pdf\", double_allowed = True)\n        True\n        >>> d.match_extension(\".pdf\", double_allowed = False)\n        False\n\n        String comparisons are case insensitive by default:\n\n        >>> d = ParsedURL(\"http://www.example.com/index.html\")\n        >>> d.match_extension(\".html\")\n        True\n        >>> d.match_extension(\".HTML\")\n        True\n\n        This too can be configured, just set 'case_insensitive' to False:\n\n        >>> d = ParsedURL(\"http://www.example.com/index.html\")\n        >>> d.match_extension(\".HTML\", case_insensitive = True)\n        True\n        >>> d.match_extension(\".HTML\", case_insensitive = False)\n        False\n\n        :param extension: Extension to match.\n        :type extension: str\n\n        :param directory_allowed: True to match extensions in all path components, False to match only the last one.\n        :type directory_allowed: bool\n\n        :param double_allowed: True to support double extensions, False to handle only standard extensions.\n        :type double_allowed: bool\n\n        :param case_insensitive: True for case insensitive string comparisons, False for case sensitive comparisons.\n        :type case_insensitive: bool\n\n        :returns: True if the extension was found, False otherwise.\n        :rtype: bool\n        \"\"\"\n        # TODO: maybe use **kwargs so we can support 'case_sensitive' (common mistake),\n        # but do not document it so people don't get used to it :P\n        if not extension.startswith(\".\"):\n            extension = \".\" + extension\n        if case_insensitive:\n            extension = extension.lower()\n        if directory_allowed:\n            components = self.path.split(\"/\")\n        else:\n            components = [self.filename]\n        for token in components:\n            base, ext = splitext(token)\n            if case_insensitive:\n                ext = ext.lower()\n            if ext == extension:\n                return True\n            if double_allowed:\n                while True:\n                    base, ext = splitext(base)\n                    if not ext: break\n                    if case_insensitive:\n                        ext = ext.lower()\n                    if ext == extension:\n                        return True\n        return False\n\n\n    #--------------------------------------------------------------------------\n    def get_all_extensions(self, directory_allowed = True, double_allowed = True):\n        \"\"\"\n        Tries to find any possible file extensions from the URL path.\n\n        By default every component of the path is parsed:\n\n        >>> d = ParsedURL(\"http://www.example.com/download.php/filename/file.pdf\")\n        >>> d.get_all_extensions()\n        ['.php', '.pdf']\n\n        However you can set the 'directory_allowed' to False to parse only the last component:\n\n        >>> d = ParsedURL(\"http://www.example.com/download.php/filename/file.pdf\")\n        >>> d.get_all_extensions(directory_allowed = False)\n        ['.pdf']\n        >>> d.get_all_extensions(directory_allowed = True)\n        ['.php', '.pdf']\n\n        Double extension is supported, as it can come in handy when analyzing malware URLs:\n\n        >>> d = ParsedURL(\"http://www.example.com/malicious.pdf.exe\")\n        >>> d.filebase\n        'malicious.pdf'\n        >>> d.extension\n        '.exe'\n        >>> d.get_all_extensions()\n        ['.pdf', '.exe']\n\n        The double extension support can be disabled by setting the 'double_allowed' argument to False:\n\n        >>> d = ParsedURL(\"http://www.example.com/malicious.pdf.exe\")\n        >>> d.get_all_extensions(double_allowed = False)\n        ['.exe']\n        >>> d.get_all_extensions(double_allowed = True)\n        ['.pdf', '.exe']\n\n        :param directory_allowed: True to match extensions in all path components, False to match only the last one.\n        :type directory_allowed: bool\n\n        :param double_allowed: True to support double extensions, False to handle only standard extensions.\n        :type double_allowed: bool\n\n        :returns: List of extensions in the order in which they were found.\n        :rtype: list(str)\n        \"\"\"\n        found = []\n        if directory_allowed:\n            components = self.path.split(\"/\")\n        else:\n            components = [self.filename]\n        for token in components:\n            base, ext = splitext(token)\n            pos = len(found)\n            if ext:\n                found.append(ext)\n            if double_allowed:\n                while True:\n                    base, ext = splitext(base)\n                    if not ext: break\n                    found.insert(pos, ext)\n        return found\n\n\n    #--------------------------------------------------------------------------\n    def split_hostname(self):\n        \"\"\"\n        Splits the hostname into the subdomain, domain and TLD parts.\n\n        For example:\n\n        >>> d = ParsedURL(\"http://www.example.com/\")\n        >>> d.split_hostname()\n        ('www', 'example', 'com')\n        >>> d = ParsedURL(\"http://some.subdomain.of.example.co.uk/\")\n        >>> d.split_hostname()\n        ('some.subdomain.of', 'example', 'co.uk')\n        >>> '.'.join(d.split_hostname())\n        'some.subdomain.of.example.co.uk'\n\n        :returns: Subdomain, domain and TLD.\n        :rtype: tuple(str, str, str)\n        \"\"\"\n        return split_hostname(self.hostname)\n\n\n    #--------------------------------------------------------------------------\n    # Read-only properties.\n\n    @property\n    def url(self):\n        scheme = self.__scheme\n        fragment = self.__fragment\n        request_uri = self.request_uri\n        if scheme:\n            scheme += \"://\"\n        if fragment:\n            request_uri = \"%s#%s\" % (request_uri, quote(fragment, safe=''))\n        return \"%s%s%s\" % (scheme, self.netloc, request_uri)\n\n    @property\n    def base_url(self):\n        scheme = self.__scheme\n        if scheme:\n            scheme += \"://\"\n        base_url = scheme + self.netloc\n        if scheme != \"mailto\":\n            base_url += \"/\"\n        return base_url\n\n    @property\n    def request_uri(self):\n        path = quote_plus(self.__path, safe='/')\n        query = self.query\n        if query:\n            char = self.__query_char\n            if path.endswith(char):\n                path = path + query\n            else:\n                path = \"%s%s%s\" % (path, char, query)\n        return path\n\n\n    #--------------------------------------------------------------------------\n    # Read-write properties.\n\n    @property\n    def scheme(self):\n        return self.__scheme\n\n    @scheme.setter\n    def scheme(self, scheme):\n        if scheme:\n            scheme = to_utf8( scheme.strip().lower() )\n            if scheme.endswith('://'):\n                scheme = scheme[:-3].strip()\n            if scheme and scheme not in self.default_ports:\n                raise ValueError(\"URL scheme not supported: %s\" % scheme)\n        else:\n            scheme = ''\n        self.__scheme = scheme\n\n    @property\n    def username(self):\n        return self.__username\n\n    @username.setter\n    def username(self, username):\n        if not username:\n            username = ''\n        else:\n            username = to_utf8(username)\n        self.__username = username\n\n    @property\n    def password(self):\n        return self.__password\n\n    @password.setter\n    def password(self, password):\n        if not password:\n            password = ''\n        else:\n            password = to_utf8(password)\n        self.__password = password\n\n    @property\n    def host(self):\n        return self.__host\n\n    @host.setter\n    def host(self, host):\n        if not host:\n            host = ''\n        else:\n            host = to_utf8(host)\n            if host.startswith('[') and host.endswith(']'):\n                host = host.upper()\n            else:\n                host = host.strip().lower()\n        self.__host = host\n\n    @property\n    def port(self):\n        port = self.__port\n        if not port:\n            port = self.default_ports.get(self.__scheme, None)\n        return port\n\n    @port.setter\n    def port(self, port):\n        if not port:\n            port = None\n        elif not 1 <= port <= 65535:\n            raise ValueError(\"Bad port number: %r\" % port)\n        self.__port = port\n\n    @property\n    def path(self):\n        return self.__path\n\n    @path.setter\n    def path(self, path):\n        if not path:\n            path = '/'\n        else:\n            path = to_utf8(path)\n        if not path.startswith('/'):\n            path = '/' + path\n        if path == '/' and self.__scheme == 'mailto':\n            path = ''\n        self.__path = path\n\n    #-------Add By BlackYe. 请求的cgi\n    @property\n    def request_cgi(self):\n        if self.port != 80:\n            return self.scheme + '://' + self.host + \":\" + str(self.port) + self.path\n        else:\n            return self.scheme + '://' + self.host + self.path\n\n    @property\n    def fragment(self):\n        return self.__fragment\n\n    @fragment.setter\n    def fragment(self, fragment):\n        if not fragment:\n            fragment = ''\n        else:\n            fragment = to_utf8(fragment)\n            if fragment.startswith('#'):\n                warn(\"You don't need to use a leading '#' when setting the\"\n                     \" fragment, this may be an error!\", stacklevel=3)\n        self.__fragment = fragment\n\n    @property\n    def query_char(self):\n        return self.__query_char\n\n    @query_char.setter\n    def query_char(self, query_char):\n        if not query_char:\n            query_char = '?'\n        else:\n            query_char = to_utf8(query_char)\n            if query_char not in ('?', '/'):\n                raise ValueError(\n                    \"Invalid query separator character: %r\" % query_char)\n        self.__query_char = query_char\n\n    @property\n    def query(self):\n        # TODO: according to this: https://en.wikipedia.org/wiki/URL_normalization\n        # sorting the query parameters may break semantics. To fix this we may want\n        # to try to preserve the original order when possible. The problem then is\n        # we'd \"see\" URLs with the same parameters in different order as different.\n        if not self.__query_params:\n            if self.__query is not None:  # when it can't be parsed\n                return self.__query\n            return ''\n        return '&'.join( '%s=%s' % ( quote(k, safe=''), quote(v, safe='') )\n                         for (k, v) in sorted(self.__query_params.iteritems()) )\n\n    @query.setter\n    def query(self, query):\n        if query and query.startswith('?'):\n            warn(\"You don't need to use a leading '?' when setting the query\"\n                 \" string, this may be an error!\", stacklevel=3)\n        if not query:\n            query_params = {}\n        else:\n            try:\n                # much faster than parse_qsl()\n                query_params = dict(( map(unquote_plus, (to_utf8(token) + '=').split('=', 2)[:2])\n                                      for token in query.split('&') ))\n                if len(query_params) == 1 and not query_params.values()[0]:\n                    query_params = {}\n                else:\n                    query = None\n            except Exception:\n                ##raise   # XXX DEBUG\n                query_params = {}\n        self.__query, self.__query_params = query, query_params\n\n    @property\n    def query_params(self):\n        return self.__query_params\n\n    @query_params.setter\n    def query_params(self, query_params):\n        if query_params is None:\n            self.__query = None\n            self.__query_params = {}\n        else:\n            query_params = dict(query_params)\n            self.__query = None\n            self.__query_params = query_params\n            self.__query = self.query\n\n\n    #--------------------------------------------------------------------------\n    # Aliases.\n\n    @property\n    def all_extensions(self):\n        \"\"\"\n        When the filename of an URL has a double extension, this property\n        will give you all of them instead of just the last one (as\n        'extension' does).\n\n        Example:\n\n        >>> d = ParsedURL(\"http://www.example.com/malicious.pdf.exe\")\n        >>> d.filename\n        'malicious.pdf.exe'\n        >>> d.filebase\n        'malicious.pdf'\n        >>> d.extension\n        '.exe'\n        >>> d.minimal_filebase\n        'malicious'\n        >>> d.all_extensions\n        '.pdf.exe'\n        >>> d.extension = '.test'\n        >>> d.filename\n        'malicious.pdf.test'\n        >>> d.all_extensions = '.malware'\n        >>> d.filename\n        'malicious.malware'\n        \"\"\"\n        ext = self.filename\n        pos = ext.find(\".\")\n        if pos > 0:\n            return ext[ pos : ]\n        return \"\"\n\n    @all_extensions.setter\n    def all_extensions(self, extension):\n        filename  = self.filename\n        dot_pos   = filename.find(\".\")\n        filebase  = filename[ : dot_pos ] if dot_pos > 0 else filename\n        if extension and extension[0] != \".\":\n            extension = \".\" + extension\n        self.path = join(self.directory, filebase + extension)\n\n    @property\n    def minimal_filebase(self):\n        \":see: all_extensions\"\n        return self.filename[ : -len(self.all_extensions) ]\n\n    @minimal_filebase.setter\n    def minimal_filebase(self, filebase):\n        self.filename = filebase + self.all_extensions\n\n    @property\n    def directory(self):\n        return split(self.__path)[0]\n\n    @directory.setter\n    def directory(self, directory):\n        self.path = join(directory, self.filename)\n\n    hostname = host\n    folder = directory\n\n    @property\n    def filename(self):\n        return split(self.__path)[1]\n\n    @filename.setter\n    def filename(self, filename):\n        self.path = join(self.directory, filename)\n\n    @property\n    def filebase(self):\n        return splitext(self.filename)[0]\n\n    @filebase.setter\n    def filebase(self, filebase):\n        self.path = join(self.directory, filebase + self.extension)\n\n    @property\n    def extension(self):\n        return splitext(self.filename)[1]\n\n    @extension.setter\n    def extension(self, extension):\n        if extension:\n            if \".\" in extension[1:]:\n                raise ValueError(\"To set a double extension use the all_extensions property instead\")\n            self.path = join(self.directory, self.filebase + (extension if extension[0] == \".\" else \".\" + extension))\n        else:\n            self.path = join(self.directory, self.filebase)\n\n    @property\n    def netloc(self):\n        host = self.__host\n        if not (host.startswith('[') and host.endswith(']')):\n            host = quote(host, safe='.')\n        port = self.port\n        auth = self.auth\n        if port and port in self.default_ports.values():\n            port = None\n        if auth:\n            host = \"%s@%s\" % (auth, host)\n        if port:\n            host = \"%s:%s\" % (host, port)\n        return host\n\n    @netloc.setter\n    def netloc(self, netloc):\n        if '@' in netloc:\n            auth, host = netloc.split('@', 1)\n        else:\n            auth, host = None, netloc\n        port = ''\n        if host and host[0] == '[':\n            host, port = host[1:].split(']', 1)\n            if ':' in port:\n                _host, port = port.split(':', 1)\n                if not host:\n                    host = _host\n        elif ':' in host:\n            host, port = host.split(':', 1)\n        if '%' in port:\n            port = unquote(port)\n        if port:\n            port = int(port)\n        if host:\n            host = unquote_plus(host)\n        self.auth = auth  # TODO: roll back changes if it fails\n        self.host = host\n        self.port = port\n\n    @property\n    def auth(self):\n        auth = ''\n        username = self.__username\n        password = self.__password\n        if username:\n            if password:\n                auth = \"%s:%s\" % (quote(username, safe=''), quote(password, safe=''))\n            else:\n                auth = quote(username, safe='')\n        elif password:\n            auth = \":%s\" % quote(password, safe='')\n        return auth\n\n    @auth.setter\n    def auth(self, auth):\n        if auth:\n            if ':' in auth:\n                username, password = auth.split(':', 1)\n                self.__username = unquote_plus(username)\n                self.__password = unquote_plus(password)\n            else:\n                self.__username = unquote_plus(auth)\n                self.__password = ''\n        else:\n            self.__username = ''\n            self.__password = ''\n\n    @property\n    def subdomain(self):\n        return self.split_hostname()[0]\n\n    @subdomain.setter\n    def subdomain(self, subdomain):\n        _, domain, tld = self.split_hostname()\n        self.hostname = \".\".join((subdomain, domain, tld))\n\n    @property\n    def domain(self):\n        return self.split_hostname()[1]\n\n    @domain.setter\n    def domain(self, domain):\n        subdomain, _, tld = self.split_hostname()\n        self.hostname = \".\".join((subdomain, domain, tld))\n\n    @property\n    def tld(self):\n        return self.split_hostname()[2]\n\n    @tld.setter\n    def tld(self, tld):\n        subdomain, domain, _ = self.split_hostname()\n        self.hostname = \".\".join((subdomain, domain, tld))\n\n\n#------------------------------------------------------------------------------\nclass HTMLElement (object):\n    \"\"\"\n    HTML element object.\n    \"\"\"\n\n\n    #--------------------------------------------------------------------------\n    def __init__(self, tag_name, attrs, content):\n        \"\"\"\n        :param tag_name: HTML tag name.\n        :type tag_name: str\n\n        :param attr: HTML tag attributes.\n        :type attr: dict(str -> str)\n\n        :param content: Raw HTML.\n        :type content: str\n        \"\"\"\n        self.__tag_name = to_utf8(tag_name)\n        self.__content  = to_utf8(content)\n        self.__attrs = {\n            to_utf8(k): to_utf8(v)\n            for k,v in attrs.iteritems()\n        }\n\n\n    #--------------------------------------------------------------------------\n    def __str__(self):\n        return \"%s:%s\" % (self.__tag_name, str(self.__attrs))\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def tag_name(self):\n        \"\"\"\n        :returns: HTML tag name.\n        :rtype: str\n        \"\"\"\n        return self.__tag_name\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def attrs(self):\n        \"\"\"\n        :returns: HTML tag attributes.\n        :rtype: dict(str -> str)\n        \"\"\"\n        return self.__attrs\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def content(self):\n        \"\"\"\n        :returns: Raw HTML.\n        :rtype: str\n        \"\"\"\n        return self.__content\n\n\n#------------------------------------------------------------------------------\nclass HTMLParser(object):\n    \"\"\"\n    HTML parser.\n\n    HTMLParser is a transparent wrapper for the other libraries.\n    This parser aims to simplify the logic of HTML parsing.\n\n    .. warning::\n       You should use this function instead of calling other libraries to ensure\n       your plugin remains compatible with future versions of GoLismero.\n\n    Example:\n\n    >>> html_info = \"<html>fuck!</html>\"\n    ...\n    >>> html_parsed = HTMLParser(html_info)\n    >>> html_parsed.links\n    [<golismero.api.net.web_utils.HTMLElement object at 0x109ca8b50>]\n    >>> html_parsed.links[0].tag_name\n    'a'\n    >>> html_parsed.links[0].tag_content\n    'Link 1'\n    >>> html_parsed.links[0].attrs\n    {'href': 'http://www.mywebsitelink.com'}\n    >>> html_parsed.images[0].tag_name\n    'img'\n    >>> html_parsed.images[0].tag_content\n    ''\n    \"\"\"\n\n\n    #--------------------------------------------------------------------------\n    def __init__(self, data):\n        \"\"\"\n        :param data: Raw HTML content.\n        :type data: str\n        \"\"\"\n\n        # Raw HTML content\n        self.__raw_data = to_utf8(data)\n\n        # Init parser\n        self.__html_parser = BeautifulSoup(self.__raw_data)\n\n        #\n        # Parsed HTML elementes\n        #\n\n        # All elements\n        self.__all_elements = None\n\n        # HTML forms\n        self.__html_forms = None\n\n        # Images in HTML\n        self.__html_images = None\n\n        # Links in HTML\n        self.__html_links = None\n\n        # CSS links\n        self.__html_css = None\n\n        # CSS embedded\n        self.__html_css_embedded = None\n\n        # Javascript\n        self.__html_javascript = None\n\n        # Javascript embedded\n        self.__html_javascript_embedded = None\n\n        # Objects\n        self.__html_objects = None\n\n        # Metas\n        self.__html_metas = None\n\n        # Title\n        self.__html_title = None\n\n\n    #--------------------------------------------------------------------------\n    def __convert_to_HTMLElements(self, data):\n        \"\"\"\n        Convert parser format to list of HTML Elements.\n\n        :return: list of HTMLElements\n        \"\"\"\n        return [\n            HTMLElement(\n                x.name.encode(\"utf-8\"),\n                { v[0].encode(\"utf-8\"): v[1].encode(\"utf-8\") for v in x.attrs},\n                \"\".join(( str(item) for item in x.contents if item != \"\\n\"))\n                ) for x in data\n        ]\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def raw_data(self):\n        \"\"\"\n        :return: Get raw HTML code\n        :rtype: str\n        \"\"\"\n        return self.__raw_data\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def elements(self):\n        \"\"\"\n        :return: Get all HTML elements as a list of HTMLElement objects\n        :rtype: list(HTMLElement)\n        \"\"\"\n        if self.__all_elements is None:\n            m_result = self.__html_parser.findAll()\n            self.__all_elements = self.__convert_to_HTMLElements(m_result)\n        return self.__all_elements\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def forms(self):\n        \"\"\"\n        :return: Get forms from HTML as a list of HTMLElement objects\n        :rtype: HTMLElement\n        \"\"\"\n        if self.__html_forms is None:\n            m_elem = self.__html_parser.findAll(\"form\")\n            self.__html_forms = self.__convert_to_HTMLElements(m_elem)\n        return self.__html_forms\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def images(self):\n        \"\"\"\n        :return: Get images from HTML as a list of HTMLElement objects\n        :rtype: HTMLElement\n        \"\"\"\n        if self.__html_images is None:\n            m_elem = self.__html_parser.findAll(\"img\")\n            self.__html_images = self.__convert_to_HTMLElements(m_elem)\n        return self.__html_images\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def url_links(self):\n        \"\"\"\n        :return: Get links from HTML as a list of HTMLElement objects\n        :rtype: HTMLElement\n        \"\"\"\n        if self.__html_links is None:\n            m_elem = self.__html_parser.findAll(\"a\")\n            self.__html_links = self.__convert_to_HTMLElements(m_elem)\n        return self.__html_links\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def css_links(self):\n        \"\"\"\n        :return: Get CSS links from HTML as a list of HTMLElement objects\n        :rtype: HTMLElement\n        \"\"\"\n        if self.__html_css is None:\n            m_elem = self.__html_parser.findAll(name=\"link\", attrs={\"rel\":\"stylesheet\"})\n            self.__html_css = self.__convert_to_HTMLElements(m_elem)\n        return self.__html_css\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def javascript_links(self):\n        \"\"\"\n        :return: Get JavaScript links from HTML as a list of HTMLElement objects\n        :rtype: HTMLElement\n        \"\"\"\n        if self.__html_javascript is None:\n            m_elem = self.__html_parser.findAll(name=\"script\", attrs={\"src\": True})\n            self.__html_javascript = self.__convert_to_HTMLElements(m_elem)\n        return self.__html_javascript\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def css_embedded(self):\n        \"\"\"\n        :return: Get embedded CSS from HTML as a list of HTMLElement objects\n        :rtype: HTMLElement\n        \"\"\"\n        if self.__html_css_embedded is None:\n            m_elem = self.__html_parser.findAll(\"style\")\n            self.__html_css_embedded = self.__convert_to_HTMLElements(m_elem)\n        return self.__html_css_embedded\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def javascript_embedded(self):\n        \"\"\"\n        :return: Get embedded JavaScript from HTML as a list of HTMLElement objects\n        :rtype: HTMLElement\n        \"\"\"\n        if self.__html_javascript_embedded is None:\n            m_elem = self.__html_parser.findAll(name=\"script\", attrs={\"src\": False})\n            self.__html_javascript_embedded = self.__convert_to_HTMLElements(m_elem)\n        return self.__html_javascript_embedded\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def metas(self):\n        \"\"\"\n        :return: Get meta tags from HTML as a list of HTMLElement objects\n        :rtype: HTMLElement\n        \"\"\"\n        if self.__html_metas is None:\n            m_elem = self.__html_parser.findAll(name=\"meta\")\n            self.__html_metas = self.__convert_to_HTMLElements(m_elem)\n        return self.__html_metas\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def title(self):\n        \"\"\"\n        :return: Get title from HTML as a HTMLElement object\n        :rtype: HTMLElement\n        \"\"\"\n        if self.__html_title is None:\n            m_elem = self.__html_parser.findAll(name=\"title\", recursive=False, limit=1)\n            self.__html_title = m_elem.name.encode(\"utf-8\")\n        return self.__html_title\n\n\n    #--------------------------------------------------------------------------\n    @property\n    def objects(self):\n        \"\"\"\n        :return: Get object tags from HTML as a list of HTMLElement objects\n        :rtype: HTMLElement\"\"\"\n\n        if self.__html_objects is None:\n            m_elem = self.__html_parser.findAll(name=\"object\")\n\n            m_result = []\n            m_result_append_bind = m_result.append\n\n            for obj in m_elem:\n                # Get attrs\n                m_ojb_attr = { v[0].encode(\"utf-8\"): v[1].encode(\"utf-8\") for v in obj.attrs }\n\n                # Add param attr\n                m_ojb_attr[\"param\"] = {}\n\n                # Add value for params\n                update = m_ojb_attr[\"param\"].update\n                for param in obj.findAllNext(\"param\"):\n                    update({ k[0].encode(\"utf-8\"): k[1].encode(\"utf-8\") for k in param.attrs})\n\n                m_raw_content = \"\".join((str(item) for item in obj.contents if item != \"\\n\"))\n\n                m_result_append_bind(HTMLElement(obj.name.encode(\"utf-8\"), m_ojb_attr, m_raw_content))\n\n            self.__html_objects = m_result\n\n        return self.__html_objects\n"
  },
  {
    "path": "lalascan/models/__init__.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nfrom lalascan.libs.core.singletonclass import Singleton\nfrom conf import DB_MYSQL_HOST, DB_MYSQL_USER, DB_MYSQL_PORT, DB_MYSQL_PWD, DB_MYSQL_DATABASE\n\nimport sqlalchemy\nfrom sqlalchemy import create_engine\nfrom sqlalchemy.orm import sessionmaker\nfrom sqlalchemy.ext.declarative import declarative_base\n\n\nclass _DBConfig(Singleton):\n\n    def __init__(self, max_overflow = 10):\n        conn = \"mysql+pymysql://{0}@{1}:{2}/{3}?charset=utf8\".format(DB_MYSQL_USER, DB_MYSQL_HOST, DB_MYSQL_PORT, DB_MYSQL_DATABASE)\n        engine  = create_engine(conn, max_overflow = max_overflow)\n        Session = sessionmaker(bind=engine)\n\n        self.session = Session()\n\nBaseModel = declarative_base()\n"
  },
  {
    "path": "lalascan/models/auditdb.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nfrom lalascan.api.exception import LalascanNotImplementedError\nfrom conf import DB_MYSQL_HOST, DB_MYSQL_USER, DB_MYSQL_PWD, DB_MYSQL_PORT, DB_MYSQL_DATABASE\n\nfrom thirdparty_libs.torndb import Connection\n\nclass BaseDB(object):\n\n    def __enter__(self):\n        return self\n\n    def __exit__(self, exc_type, exc_val, exc_tb):\n        self.close()\n\n    def query(self):\n        raise LalascanNotImplementedError(\"Subclasses MUST implement this method! Method:execute\")\n\n    def close(self):\n        raise LalascanNotImplementedError(\"Subclasses MUST implement this method! Method:close\")\n\n\nclass AuditMysqlDB(BaseDB):\n\n    #====================\n    def __init__(self):\n        self.auditdb = Connection( host = DB_MYSQL_HOST, user = DB_MYSQL_USER, password = DB_MYSQL_PWD, database = DB_MYSQL_DATABASE)\n\n\n    def __initdb(self):\n        pass\n\n\n    def query(self, sql):\n        return self.auditdb.query(sql)\n\n    def get_alldata(self, audit_table, **kwargs):\n        if kwargs is not None:\n            condition = '1 = 1'\n            for table_column, content in kwargs.iteritems():\n                condition += \" and `%s` = '%s'\" % (table_column, content)\n            sql = \"select * from %s where %s\" % (audit_table, condition)\n        else:\n            sql = \"select * from %s\" % audit_table\n\n        return self.auditdb.query(sql)\n\n    def close(self):\n        self.auditdb.close()\n\n    def __call__(self, *args, **kwargs):\n        return self.auditdb"
  },
  {
    "path": "lalascan/models/scan_task.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nfrom . import BaseModel\n\nfrom sqlalchemy import Column, Integer, String, DateTime\n\nclass ScanTask(BaseModel):\n\n    __tablename__ = 'scan_task'\n\n    id         = Column(Integer, primary_key = True, autoincrement=True)\n    audit_name = Column(String(100), nullable = False)\n    scan_url   = Column(String(200), nullable = False)\n    starttime  = Column(DateTime, nullable = False)\n    finishtime = Column(DateTime)\n    user       = Column(String(10))\n\n    def __repr__(self):\n        return \"<ScanTask(audit_name='%s')>\" % self.audit_name"
  },
  {
    "path": "lalascan/models/scan_vuldetail.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nfrom . import BaseModel\n\nfrom sqlalchemy import Column, Integer, String, DateTime, Text\nfrom sqlalchemy.dialects.mysql.base import LONGTEXT\n\nclass ScanVulDetail(BaseModel):\n\n    __tablename__ = 'scan_vul_detail'\n\n    id              = Column(Integer, primary_key = True, autoincrement=True)\n    st_id           = Column(Integer, nullable = False)\n    sli_id          = Column(Integer, nullable = False)\n    url             = Column(Text, nullable = False)\n    vulparam_point  = Column(String(10))\n    method          = Column(String(5))\n    payload         = Column(Text, nullable = False)\n    get_param       = Column(Text)\n    post_param      = Column(Text)\n    ori_req_header  = Column(Text)\n    ori_resp_header = Column(Text)\n    ori_resp_body   = Column(LONGTEXT)\n    insert_time     = Column(DateTime, nullable = False)\n\n    def __repr__(self):\n        return \"<ScanVulDetail(url='%s')>\" % self.url"
  },
  {
    "path": "lalascan/utils/__init__.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nimport base64\n\ndef _str2bs64(str):\n    return base64.b64encode(str)\n"
  },
  {
    "path": "lalascan/utils/console_utils.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nfrom thirdparty_libs.colorizer import colored\n\n# Color names mapped to themselves.\nm_colors = {\n    None        : None,\n    'blue'      : 'blue',\n    'green'     : 'green',\n    'cyan'      : 'cyan',\n    'magenta'   : 'magenta',\n    'grey'      : 'grey',\n    'gray'      : 'grey',  # tomayto, tomahto...\n    'red'       : 'red',\n    'yellow'    : 'yellow',\n    'white'     : 'white',\n\n    # String log levels to color names.\n    'informational' : 'blue',\n    'low'           : 'cyan',\n    'middle'        : None,\n    'high'          : 'magenta',\n    'critical'      : 'red',\n\n    # Integer log levels to color names.\n    0 : 'blue',\n    1 : 'cyan',\n    2 : None,\n    3 : 'red',\n    4 : 'yellow',\n}\n\n# Colors that need an increase in brightness.\nm_make_brighter = ['blue', 'grey', 'red']\n\n\ndef get_terminal_size():\n    import platform\n    current_os = platform.system()\n    tuple_xy=None\n    if current_os == 'Windows':\n        tuple_xy = _get_terminal_size_windows()\n        if tuple_xy is None:\n            tuple_xy = _get_terminal_size_tput()\n            # needed for window's python in cygwin's xterm!\n    if current_os == 'Linux' or current_os == 'Darwin' or  current_os.startswith('CYGWIN'):\n        tuple_xy = _get_terminal_size_linux()\n    if tuple_xy is None:\n        tuple_xy = (80, 25)      # default value\n    return tuple_xy\n\n\ndef _get_terminal_size_windows():\n    res=None\n    try:\n        from ctypes import windll, create_string_buffer\n\n        # stdin handle is -10\n        # stdout handle is -11\n        # stderr handle is -12\n\n        h = windll.kernel32.GetStdHandle(-12)\n        csbi = create_string_buffer(22)\n        res = windll.kernel32.GetConsoleScreenBufferInfo(h, csbi)\n    except:\n        return None\n    if res:\n        import struct\n        (bufx, bufy, curx, cury, wattr,\n         left, top, right, bottom, maxx, maxy) = struct.unpack(\"hhhhHhhhhhh\", csbi.raw)\n        sizex = right - left + 1\n        sizey = bottom - top + 1\n        return sizex, sizey\n    else:\n        return None\n\ndef _get_terminal_size_tput():\n    # get terminal width\n    # src: http://stackoverflow.com/questions/263890/how-do-i-find-the-width-height-of-a-terminal-window\n    try:\n        import subprocess\n        proc=subprocess.Popen([\"tput\", \"cols\"],stdin=subprocess.PIPE,stdout=subprocess.PIPE)\n        output=proc.communicate(input=None)\n        cols=int(output[0])\n        proc=subprocess.Popen([\"tput\", \"lines\"],stdin=subprocess.PIPE,stdout=subprocess.PIPE)\n        output=proc.communicate(input=None)\n        rows=int(output[0])\n        return (cols,rows)\n    except:\n        return None\n\ndef _get_terminal_size_linux():\n    def ioctl_GWINSZ(fd):\n        try:\n            import fcntl, termios, struct\n            cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ,'1234'))\n        except:\n            return None\n        return cr\n    cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2)\n    if not cr:\n        try:\n            import os\n            fd = os.open(os.ctermid(), os.O_RDONLY)\n            cr = ioctl_GWINSZ(fd)\n            os.close(fd)\n        except:\n            pass\n    if not cr:\n        try:\n            import os\n            env = os.environ\n            cr = (env['LINES'], env['COLUMNS'])\n        except:\n            return None\n    return int(cr[1]), int(cr[0])\n\n#------------------------------------------------------------------------------\ndef colorize_substring(text, substring, level_or_color):\n    \"\"\"\n    Colorize a substring within a text to be displayed on the console.\n\n    :param text: Full text.\n    :type text: str\n\n    :param substring: Text to find and colorize.\n    :type substring: str\n\n    :param level_or_color:\n        Color name or risk level name.\n        See the documentation for colorize() for more details.\n    :type level_or_color: str\n\n    :returns: Colorized text.\n    :rtype: str\n    \"\"\"\n\n    #\n    # XXX TODO:\n    #\n    # We also probably need to parse existing ANSI escape codes\n    # to know what's the color of the surrounding text, otherwise\n    # we'll only properly colorize substrings in non colored text.\n    #\n    # Maybe we can settle with this: indicate a color for the text\n    # and a color for the substring. Should work in all situations\n    # we _currently_ need to handle.\n    #\n\n    # Check for trivial cases.\n    if text and substring and True:\n\n        # Loop for each occurrence of the substring.\n        m_pos = 0\n        while 1:\n\n            # Find the substring in the text.\n            m_pos = text.find(substring, m_pos)\n\n            # If not found, break out of the loop.\n            if m_pos < 0:\n                break\n\n            # Split the text where the substring was found.\n            m_prefix  = text[:m_pos]\n            m_content = text[m_pos: m_pos + len(substring)]\n            m_suffix  = text[m_pos + len(substring):]\n\n            # Patch the text to colorize the substring.\n            m_content = colorize(m_content, level_or_color)\n            text = \"%s%s%s\" % (m_prefix, m_content, m_suffix)\n\n            # Update the current position and keep searching.\n            m_pos = len(m_prefix) + len(m_content)\n\n    # Return the patched text.\n    return text\n\n#------------------------------------------------------------------------------\ndef colorize(text, level_or_color):\n    \"\"\"\n    Colorize a text to be displayed on the console.\n\n    The following color names may be used:\n\n     - Blue\n     - Cyan\n     - Green\n     - Grey (or gray)\n     - Magenta\n     - Red\n     - Yellow\n     - White\n\n    The following risk levels may be used in lieu of colors:\n\n     - Informational (0)\n     - Low (1)\n     - Middle (2)\n     - High (3)\n     - Critical (4)\n\n    :param text: Text to colorize.\n    :type text: str\n\n    :param level_or_color: Color name or risk level name.\n    :type level_or_color: str\n\n    :returns: Colorized text.\n    :rtype: str\n    \"\"\"\n\n    # Check if colors are enabled.\n    if True:\n\n        # Parse the color name or level into\n        # a color value that colored() expects.\n        try:\n            level_or_color = level_or_color.lower()\n        except AttributeError:\n            pass\n        color = m_colors[level_or_color]\n\n        # Colorize the text.\n        if color:\n            if color in m_make_brighter:\n                text = colored(text, color, attrs=[\"bold\"])\n            else:\n                text = colored(text, color)\n\n    # Return the text.\n    return text"
  },
  {
    "path": "lalascan/utils/mymath.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\n'''\nMath Common Class\n'''\n\nfrom lalascan.api.exception import LalascanTypeError\n\nfrom math import sqrt\n\nclass LalaMath(object):\n\n    @classmethod\n    def average(cls, values):\n\n        '''\n        :param cls:\n        :param values: dict\n        :return:\n\n        >>> average([0.9, 0.9, 0.9, 1.0, 0.8, 0.9])\n        0.9\n        '''\n        if isinstance(values, list):\n            return (sum(values) / len(values)) if values else None\n        else:\n            raise LalascanTypeError(\"The average method of the math class must pass in a variable of the type List!\")\n\n\n    @classmethod\n    def stdev(cls, values):\n        \"\"\"\n        Computes standard deviation of a list of numbers.\n        >>> stdev([0.9, 0.9, 0.9, 1.0, 0.8, 0.9])\n        0.06324555320336757\n        \"\"\"\n\n        if not isinstance(values, list):\n            raise LalascanTypeError(\"The stdev method of the math class must pass in a variable of the type List!\")\n\n        if not values or len(values) < 2:\n            return None\n\n        key = (values[0], values[-1], len(values))\n\n\n        avg = LalaMath.average(values)\n        _ = reduce(lambda x, y: x + pow((y or 0) - avg, 2), values, 0.0)\n        return sqrt(_ / (len(values) - 1))\n"
  },
  {
    "path": "lalascan/utils/mytime.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n\"\"\"\n封装常用的时间函数\n\"\"\"\n\n__author__ = 'BlackYe.'\n\nfrom lalascan.api.exception import LalascanDataException\n\nimport time\nfrom datetime import datetime\n\nclass MyTime(object):\n\n    format_datetime = \"%Y-%m-%d %H:%M:%S\"\n\n    @classmethod\n    def get_current_datetime(cls):\n        return time.strftime(cls.format_datetime, time.localtime(time.time()))\n\n\n    @classmethod\n    def parse_audit_times(cls, start_time, stop_time):\n        \"\"\"\n        Converts the audit start and stop times into human readable strings.\n\n        :param start_time: Audit start time,\n        :type start_time: float | None\n\n        :param stop_time: Audit stop time\n        :type stop_time: float | None\n\n        :returns: Audit start and stop times, total execution time.\n        :rtype: tuple(str, str, str)\n        \"\"\"\n        if start_time and stop_time:\n\n            start = time.mktime(time.strptime(start_time, cls.format_datetime))\n            end   = time.mktime(time.strptime(stop_time, cls.format_datetime))\n\n            _start_time = datetime.fromtimestamp(start)\n            _end_time  = datetime.fromtimestamp(end)\n            if _start_time <= _end_time:\n                td       = _end_time - _start_time\n                days     = td.days\n                hours    = td.seconds // 3600\n                minutes  = (td.seconds // 60) % 60\n                seconds  = td.seconds % 60\n                run_time = \"%d days, %d hours, %d minutes and %d seconds\" % \\\n                    (days, hours, minutes, seconds)\n                return start_time, stop_time, run_time\n\n        raise LalascanDataException('Run time can not be calculated, please check the incoming time parameters!')"
  },
  {
    "path": "lalascan/utils/text_utils.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nText manipulation utilities.\n\"\"\"\n\n__all__ = [\n    \"char_count\", \"line_count\", \"word_count\", \"generate_random_string\",\n    \"uncamelcase\", \"hexdump\", \"to_utf8\", \"split_first\",\n]\n\nimport re\n\nfrom random import choice\nfrom re import finditer\nfrom string import ascii_letters, digits, printable\n\n\n#------------------------------------------------------------------------------\ndef char_count(text):\n    \"\"\"\n    :param text: Text.\n    :type text: str\n\n    :returns: Number of printable characters in text.\n    :rtype: int\n\n    :raises: TypeError\n    \"\"\"\n    return sum(1 for _ in finditer(r\"\\w\", text))\n\n\n#------------------------------------------------------------------------------\ndef line_count(text):\n    \"\"\"\n    :param text: Text.\n    :type text: str\n\n    :returns: Number of lines in text.\n    :rtype: int\n\n    :raises: TypeError\n    \"\"\"\n    if not isinstance(text, basestring):\n        raise TypeError(\"Expected basestring, got '%s' instead\" % type(text))\n\n    count = text.count(\"\\n\")\n    if not text.endswith(\"\\n\"):\n        count += 1\n    return count\n\n\n#------------------------------------------------------------------------------\ndef word_count(text):\n    \"\"\"\n    :param text: Text.\n    :type text: str\n\n    :returns: Number of words in text.\n    :rtype: int\n\n    :raises: TypeError\n    \"\"\"\n    return sum(1 for _ in finditer(r\"\\w+\", text))\n\n\n#------------------------------------------------------------------------------\ndef generate_random_string(length = 30):\n    \"\"\"\n    Generates a random string of the specified length.\n\n    The key space used to generate random strings are:\n\n    - ASCII letters (both lowercase and uppercase).\n    - Digits (0-9).\n\n    >>> from golismero.api.text.text_utils import generate_random_string\n    >>> generate_random_string(10)\n    Asi91Ujsn5\n    >>> generate_random_string(30)\n    8KNLs981jc0h1ls8b2ks01bc7slgu2\n\n    :param length: Desired string length.\n    :type length: int\n\n    :raises: TypeError\n    \"\"\"\n\n    m_available_chars = ascii_letters + digits\n\n    return \"\".join(choice(m_available_chars) for _ in xrange(length))\n\n\n#------------------------------------------------------------------------------\n# Adapted from: http://stackoverflow.com/a/2560017/426293\n__uncamelcase_re = re.compile(\"%s|%s|%s\" % (\n    r\"(?<=[A-Z])(?=[A-Z][a-z])\",\n    r\"(?<=[^A-Z])(?=[A-Z])\",\n    r\"(?<=[A-Za-z])(?=[^A-Za-z])\",\n))\ndef uncamelcase(string):\n    \"\"\"\n    Converts a CamelCase string into a human-readable string.\n\n    Examples::\n        >>> uncamelcase(\"lowercase\")\n        'lowercase'\n        >>> uncamelcase(\"Class\")\n        'Class'\n        >>> uncamelcase(\"MyClass\")\n        'My Class'\n        >>> uncamelcase(\"HTML\")\n        'HTML'\n        >>> uncamelcase(\"PDFLoader\")\n        'PDF Loader'\n        >>> uncamelcase(\"AString\")\n        'A String'\n        >>> uncamelcase(\"SimpleXMLParser\")\n        'Simple XML Parser'\n        >>> uncamelcase(\"GL11Version\")\n        'GL 11 Version'\n        >>> uncamelcase(\"99Bottles\")\n        '99 Bottles'\n        >>> uncamelcase(\"May5\")\n        'May 5'\n        >>> uncamelcase(\"BFG9000\")\n        'BFG 9000'\n\n    :param string: CamelCase string.\n    :type string: str\n\n    :returns: Human-readable string.\n    :rtype: str\n\n    :raises: TypeError\n    \"\"\"\n    if not isinstance(string, basestring):\n        raise TypeError(\"Expected basestring, got '%s' instead\" % type(string))\n\n    string = string.replace(\"_\", \" \")\n    string = __uncamelcase_re.sub(\" \", string)\n    while \"  \" in string:\n        string = string.replace(\"  \", \" \")\n    return string\n\n\n#------------------------------------------------------------------------------\ndef hexdump(s):\n    \"\"\"\n    Produce an hexadecimal output from a binary string.\n\n    :param s: Binary string to dump.\n    :type s: str\n\n    :returns: Hexadecimal output.\n    :rtype: str\n\n    :raises: TypeError\n    \"\"\"\n    if not isinstance(s, basestring):\n        raise TypeError(\"Expected basestring, got '%s' instead\" % type(s))\n\n    a = []\n    for i in xrange(0, len(s), 16):\n        h1 = \" \".join(\"%.2x\" % ord(c) for c in s[i:i+8])\n        h2 = \" \".join(\"%.2x\" % ord(c) for c in s[i+8:i+16])\n        d = \"\".join(c if c in printable else \".\" for c in s[i:i+16])\n        a.append(\"%-32s-%-32s %s\\n\" % (h1, h2, d))\n    return \"\".join(a)\n\n\n#------------------------------------------------------------------------------\ndef to_utf8(s):\n    \"\"\"\n    Convert the given Unicode string into an UTF-8 encoded string.\n\n    If the argument is already a normal Python string, nothing is done.\n    So this function can be used as a filter to normalize string arguments.\n\n    :param s: Unicode string to convert.\n    :type s: basestring\n\n    :returns: Converted string.\n    :rtype: str\n    \"\"\"\n    if isinstance(s, unicode):\n        return s.encode(\"UTF-8\")\n    if type(s) is not str and isinstance(s, str):\n        return str(s)\n    return s\n\n\n#------------------------------------------------------------------------------\n# This function was borrowed from the urllib3 project.\n#\n# Urllib3 is copyright 2008-2012 Andrey Petrov and contributors (see\n# CONTRIBUTORS.txt) and is released under the MIT License:\n# http://www.opensource.org/licenses/mit-license.php\n# http://raw.github.com/shazow/urllib3/master/CONTRIBUTORS.txt\n#\ndef split_first(s, delims):\n    \"\"\"\n    Given a string and an another delimiters as strings, split on the first found\n    delimiter. Return the two split parts and the matched delimiter.\n\n    If not found, then the first part is the full input string.\n\n    Example: ::\n\n        >>> split_first('foo/bar?baz', '?/=')\n        ('foo', 'bar?baz', '/')\n        >>> split_first('foo/bar?baz', '123')\n        ('foo/bar?baz', '', None)\n\n    Scales linearly with number of delimiters.\n    Not ideal for a large number of delimiters.\n\n    .. warning: This function was borrowed from the urllib3 project.\n                It may be removed in future versions of GoLismero.\n        \n    :param s: string to delimit to. \n    :type s: str\n    \n    :param delims: string with delimits characters \n    :type delims: str\n    \n    :return: a tuple as format: (FIRST_OCCURRENCE, REST_OF_TEXT, MATCHING_CHAR)\n    :rtype: (str, str, str|None)\n\n    :raises: TypeError\n    \"\"\"\n    min_idx = None\n    min_delim = None\n    for d in delims:\n        idx = s.find(d)\n        if idx < 0:\n            continue\n\n        if min_idx is None or idx < min_idx:\n            min_idx = idx\n            min_delim = d\n\n    if min_idx is None or min_idx < 0:\n        return s, '', None\n\n    return s[:min_idx], s[min_idx+1:], min_delim\n\n"
  },
  {
    "path": "lalascan.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nfrom thirdparty_libs.argparse import argparse\nfrom lalascan.libs.core.settings import USAGE, VERSION, UNICODE_ENCODING\nfrom lalascan.libs.core.common import banner, console_output, generate_audit_name\nfrom lalascan.libs.core.globaldata import cmdLineOptions, conf, L\nfrom lalascan.data.datatype import AttribDict\nfrom lalascan.data.enum import CUSTOM_LOGGING\nfrom lalascan.api.exception import LalascanDataException\nfrom lalascan.launcher import init, run\n\nfrom multiprocessing import cpu_count\n\nimport sys, time\n\ndef parse_cmd_options():\n    parser = argparse.ArgumentParser(usage=USAGE, formatter_class=argparse.RawTextHelpFormatter, add_help=False)\n\n    parser.add_argument(\"-h\", \"--help\", action=\"help\",\n                        help=\"Show help message and exit\")\n\n    parser.add_argument(\"--version\", action=\"version\",\n                        version=VERSION, help=\"Show program's version number and exit\")\n\n    target = parser.add_argument_group('[ Targets ]')\n\n    target.add_argument(\"-u\", \"--url\", dest=\"url\",\n                        help=\"Target URL (e.g. \\\"http://www.lalascan.com/\\\")\")\n\n    target.add_argument(\"-t\", \"--threads\", dest = \"process_num\",\n                        help=\"max number of process, default cpu number\")\n\n    target = parser.add_argument_group('[ Resource Found ]')\n    target.add_argument(\"-S\", \"--spider\", dest=\"bspider\", default = False, action = \"store_true\",\n                        help=\"Enable user Spider\")\n\n    plugin = parser.add_argument_group('[ Plugin Option ]')\n\n    plugin.add_argument(\"-e\", \"--enable-plugin\", dest = \"plugin\", default = None,\n                        help = \"enable a plugin\")\n\n    request = parser.add_argument_group('[ Request Option ]')\n\n    request.add_argument(\"--data\", dest=\"post_data\",\n                         help=\"HTTP Post data\")\n\n    request.add_argument(\"--cookie\", dest=\"cookie\",\n                         help=\"HTTP Cookie header value\")\n\n    request.add_argument(\"--referer\", dest=\"referer\",\n                         help=\"HTTP Referer header value\")\n\n    request.add_argument(\"--user-agent\", dest=\"agent\",\n                         help=\"HTTP User-Agent header value\")\n\n    request.add_argument(\"--random-agent\", dest=\"randomAgent\", action=\"store_true\", default=False,\n                         help=\"Use randomly selected HTTP User-Agent header value\")\n\n    request.add_argument(\"--proxy\", dest=\"proxy\",\n                         help=\"Use a proxy to connect to the target URL\")\n\n    request.add_argument(\"--timeout\", dest=\"timeout\",\n                         help=\"Seconds to wait before timeout connection (default 30)\")\n\n    request.add_argument(\"--retry\", dest=\"retry\", default=False,\n                         help=\"Time out retrials times.\")\n\n    request = parser.add_argument_group('[ API Conf Option ]')\n    request.add_argument(\"--update-leakinfo\", dest=\"leakinfo\", action=\"store_true\", default=False,\n                         help=\"Update or Generate webvulleak info.\")\n\n    request.add_argument(\"--update-policy\", dest=\"policy\", action=\"store_true\", default = False,\n                         help=\"Update or Generate vulnerability policy.\")\n\n    args = parser.parse_args()\n\n    return args.__dict__\n\ndef initOptions(inputOptions = AttribDict()):\n\n    try:\n        #========================\n        # api interface must be first\n        if inputOptions['leakinfo']:\n            from lalascan.api.option import generate_leak_info\n            generate_leak_info()\n\n        if inputOptions['policy']:\n            from lalascan.api.option import _sava_policy2db\n            _sava_policy2db()\n\n\n        conf.url = inputOptions.url\n        if conf.url is None:\n            #L.logger.log_error(\"no target resource!\")\n            console_output(data = \"[-] no target resource, lalascan over!\\n\")\n            sys.exit()\n\n        conf.audit_name = generate_audit_name(conf.url)\n        L.set_logfilepath(conf.audit_name)  #设置扫描日志存放文件\n\n        if inputOptions['process_num'] is not None:\n            conf.threads = inputOptions.process_num\n        else:\n            conf.threads = cpu_count()\n\n        if inputOptions['plugin'] is not None:\n            conf.plugins = inputOptions.plugin\n        else:\n            conf.plugins = None\n\n        #conf.audit_conf.cookie = inputOptions['cookie'] if inputOptions['cookie'] is not None else None\n\n        conf.post_data = inputOptions['post_data'] if inputOptions['post_data'] is not None else None\n        conf.cookie = inputOptions['cookie'] if inputOptions['cookie'] is not None else None\n\n        conf.bspider = inputOptions['bspider']\n        conf.targets = []\n    except LalascanDataException:\n        L.logger.log_error(\"init args option error!\")\n        sys.exit()\n\ndef main():\n\n    banner()\n    option_args = parse_cmd_options()\n    cmdLineOptions.update(option_args)\n    initOptions(cmdLineOptions)\n\n    console_output(\"[*] Lalascanner starting at %s\\n\\n\" % time.strftime(\"%X\"))\n\n    init()\n    run()\n\nif __name__  == '__main__': main()"
  },
  {
    "path": "requirement.txt",
    "content": "futures\nargparse\nbeautifulsoup4\nnetaddr\npython-nmap\ndnspython\nrequests\nparamiko\npymongo\neasywebdav\npyquery\nPyYAML\nre2\ncelery\npymysql\nsqlalchemy"
  },
  {
    "path": "tests/__init__.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n"
  },
  {
    "path": "tests/unittest/__init__.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n"
  },
  {
    "path": "tests/unittest/console_output.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\n\nimport sys\nsys.path.append(\"/root/python/lalascan-devel/\")\n\nfrom lalascan.libs.core.report import TextReport\nfrom lalascan.libs.core.globaldata import conf\n\nconf.audit_scope.roots = ['www.baidu.com', 'bbs.baidu.com']\nconf.audit_scope.domains = 'www.baidu.com'\nconf.audit_scope.addresses = '192.168.0.1'\nconf.audit_scope.web_pages = \"http://www.baidu.com\"\n\np = TextReport()\np.generate_report()\n"
  },
  {
    "path": "tests/unittest/db_test.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nimport sys\nsys.path.append(\"/root/python/lalascan-devel/\")\n\nfrom lalascan.utils.mymath import LalaMath\n\ndef main():\n    #with AuditMysqlDB() as auditdb:\n    #    print auditdb.get_alldata(audit_table = \"webvul_leak_info\", risk_level = 4)\n\n    s = [2.3, 4.1, 6.2, 8.7]\n    stdev = LalaMath.stdev(s)\n    print stdev\n    average = LalaMath.average(s)\n    print average - 7 * stdev\n\nif __name__ == '__main__': main()"
  },
  {
    "path": "tests/unittest/ip_resource.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\n\nimport os, sys\n\nsys.path.append(\"/root/python/lalascan-devel/\")\n\nfrom lalascan.data.resource.ip import IP\n\ntry:\n    print IP(\"192.168.0.1\").address\nexcept Exception:\n    print 'fuck'"
  },
  {
    "path": "tests/unittest/scope_test.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nimport sys\nsys.path.append(\"/root/python/lalascan-devel/\")\n\nfrom lalascan.libs.core.scope import AuditScope, DummyScope\nfrom lalascan.data.resource.domain import Domain\n\n\np = AuditScope()\naudit_scope = DummyScope()\np.add_target(\"http://www.baidu.com/?id=1&p=3\")\naudit_scope = p\n"
  },
  {
    "path": "tests/unittest/t_attribdict.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nCopyright (c) 2014-2016 pocsuite developers (https://seebug.org)\nSee the file 'docs/COPYING' for copying permission\n\"\"\"\n\nimport copy\nimport types\n\n#from pocsuite.lib.core.exception import PocsuiteDataException\n\n\nclass AttribDict(dict):\n\n    \"\"\"\n    >>> foo = AttribDict()\n    >>> foo.bar = 1\n    >>> foo.bar\n    1\n    \"\"\"\n\n    def __init__(self, indict=None, attribute=None):\n        if indict is None:\n            indict = {}\n\n        # Set any attributes here - before initialisation\n        # these remain as normal attributes\n        self.attribute = attribute\n        dict.__init__(self, indict)\n        self.__initialised = True\n\n        # After initialisation, setting attributes\n        # is the same as setting an item\n\n    def __getattr__(self, item):\n        \"\"\"\n        Maps values to attributes\n        Only called if there *is NOT* an attribute with this name\n        \"\"\"\n\n        try:\n            return self.__getitem__(item)\n        except KeyError:\n            #raise PocsuiteDataException(\"unable to access item '%s'\" % item)\n            raise Exception(\"unable to access item '%s'\" % item)\n\n    def __setattr__(self, item, value):\n        \"\"\"\n        Maps attributes to values\n        Only if we are initialised\n        \"\"\"\n\n        # This test allows attributes to be set in the __init__ method\n        if \"_AttribDict__initialised\" not in self.__dict__:\n            return dict.__setattr__(self, item, value)\n\n        # Any normal attributes are handled normally\n        elif item in self.__dict__:\n            dict.__setattr__(self, item, value)\n\n        else:\n            self.__setitem__(item, value)\n\n    def __getstate__(self):\n        return self.__dict__\n\n    def __setstate__(self, dict):\n        self.__dict__ = dict\n\n    def __deepcopy__(self, memo):\n        retVal = self.__class__()\n        memo[id(self)] = retVal\n\n        for attr in dir(self):\n            if not attr.startswith('_'):\n                value = getattr(self, attr)\n                if not isinstance(value, (types.BuiltinFunctionType, types.FunctionType, types.MethodType)):\n                    setattr(retVal, attr, copy.deepcopy(value, memo))\n\n        for key, value in self.items():\n            retVal.__setitem__(key, copy.deepcopy(value, memo))\n\n        return retVal\n\ndef main():\n    defaults = {\n        \"threads\": 1,\n        \"timeout\": 10\n    }\n\n    print type(defaults)\n    defaults = AttribDict(defaults)\n    defaults.s = 1\n    print defaults\n\nif __name__  == '__main__':\n    main()"
  },
  {
    "path": "tests/unittest/t_pluginmanager.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\n\nimport sys\nsys.path.append(\"/root/python/lalascan-devel/\")\n\n\nfrom lalascan.libs.core.pluginmanager import PluginManager, PluginImporter\nfrom lalascan.libs.core.common import readfile\nfrom lalascan.libs.core.globaldata import register_plugins, conf, vulresult\nfrom lalascan.libs.core.report import TextReport\n\nfrom lalascan.data.resource.url import URL\n\nfrom lalascan.libs.core.scope import AuditScope, DummyScope\nfrom lalascan.data.resource.domain import Domain\n\nfrom lalascan.libs.core.spider import spider_task\nfrom lalascan.libs.core.threads import plugin_run_thread, execute_plugin, MyResourcePool, MyGeventPool\n\nfrom thirdparty_libs.oset.pyoset import oset\n\nconf.audit_config = None\nconf.plugin = \"sqli,reflect_xss,any_file_read\" #逗号中间不能有空格\n#conf.plugin = \"sqli\"\nconf.targets = []\n\n#output result\nconf.audit_scope.roots = ['www.baidu.com', 'bbs.baidu.com']\nconf.audit_scope.domains = 'www.baidu.com'\nconf.audit_scope.addresses = '192.168.0.1'\nconf.audit_scope.web_pages = \"http://www.baidu.com\"\n\nreport = TextReport()\n\n#-------\n#m_resource = URL(url = \"http://weiyun.city.qq.com/dayueshop/wx.php?redirect_url=12&r=wegoApi%2Fcookie&_=1473047775677&token=ryhfgs1407576378&callbackparam=success_jsonpCallback\")\n#m_resource = URL(url = \"http://demo.aisec.cn:80/demo/aisec/post_link.php?id=1\")\nm_resource_1 = URL(url = 'http://172.16.203.129/wooyun_test2/vul/sqlinject/search.php', post_params = {\"keyword\":\"12\"})\n#m_resource = URL(url = \"http://login.qidian.com/Login.php?appId=17&target=1&unionlogin=1&areaId=1&pm=1&popup=2&style=2&returnURL=http://avd.qidian.com/OALoginJump.aspx?returnURL=http://game.qidian.com/game/cqby/client/ServerList.aspx\")\n\n#conf.targets.append(m_resource)\n\n#t = StringImporter()\n#moduleName = 'reflect_xss'\n\n#conf.target = 'http://demo.aisec.cn/demo/aisec/'\nconf.target = 'http://172.16.203.129/wooyun_test2/'\n\n#爬虫\n#spider_task()\nconf.targets = [m_resource_1]\n\np = PluginManager()\np.set_plugin()\n#print type(register_plugins)\n#register_plugins['sqli'].run_plugin(m_resource)\n\nproPool = MyResourcePool(4)\n\n\n'''\ndef execute_plugin(m_resource):\n    pluginPool = MyGeventPool(5)\n    for key, plugin in register_plugins.iteritems():\n        ##proPool.apply_async(plugin_run_thread, (key, plugin, m_resource))\n        #pluginPool.spawn(plugin_run_thread, key, plugin, m_resource)\n\n    #pluginPool.join()\n'''\n\nfor m_resource in conf.targets:\n    print '*' * 50\n    proPool.apply_async(execute_plugin, (register_plugins, m_resource,))\n\n\nproPool.close()\ntry:\n    proPool.join()\nexcept KeyboardInterrupt,e:\n    print 'fuck!'\n\n\nreport.generate_report()\n\n#PluginImporter.delModule('sqli')\n#print register_plugins['sqli'].run('222')"
  },
  {
    "path": "tests/unittest/test_func.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\n\n\ndef f():\n\n    s = ['']\n    def g():\n        s[0] = 'eeff'\n\n    print s\n    g()\n    print 'fuck!'\n    print s, type(s)\n\nf()"
  },
  {
    "path": "tests/unittest/thread_test.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nimport multiprocessing\nimport multiprocessing.pool\nfrom multiprocessing import Process\nfrom multiprocessing import cpu_count\nfrom multiprocessing import Queue\nfrom gevent import pool\nfrom gevent import monkey\nimport time\nimport requests\n\nmonkey.patch_socket()\n\n\nresult = Queue(100)\n\n\n# ----------------------------------------------------------------------------------------------------\nclass NoDaemonProcess(multiprocessing.Process):\n    # make 'daemon' attribute always return False\n    def _get_daemon(self):\n        return False\n    def _set_daemon(self, value):\n        pass\n    daemon = property(_get_daemon, _set_daemon)\n\n# We sub-class multiprocessing.pool.Pool instead of multiprocessing.Pool\n# because the latter is only a wrapper function, not a proper class.\nclass MyPool(multiprocessing.pool.Pool):\n    Process = NoDaemonProcess\n# ------------------------------\n\n\ndef procFunc(url):\n    #print url\n    global result\n    try:\n        req = requests.get(url = url, timeout = 10)\n        if req.status_code == 200:\n            print '%s header:%s' % (url, req.headers)\n            result.put(url)\n    except Exception,e:\n        print str(e)\n        #return False\n\n    #time.sleep(0.5)\n\ndef process_url(url_list):\n    g = pool.Pool(5)\n    #print 'fuck!!!'\n    #for url in url_list:\n    #    g.spawn(procFunc, url)\n    g.map(procFunc, url_list)\n    g.join()\n\n\ndef main():\n    start = time.clock()\n    proPool = MyPool(cpu_count())\n    url_list = []\n    for i in range(1, 100):\n        url = \"http://www.freebuf.com/news/%s.html\" % i\n        url_list.append(url)\n        if i % 50 == 0:\n            #print url_list\n            proPool.apply_async(process_url,(url_list,))\n            url_list = []\n\n    proPool.close()\n    try:\n        proPool.join()\n    except KeyboardInterrupt,e:\n        print ('Caught KeyboardInterrupt, terminating workers')\n\n    end = time.clock()\n    print \"scan time:%f s\" % (end - start)\n\nif __name__  == '__main__':\n    main()\n    print result.qsize()\n    #start = time.clock()\n    #process_url([ 'http://www.freebuf.com/news/%s.html'  % i for i in range(1, 1200)])\n    #end = time.clock()\n    #print \"scan time:%f s\" % (end - start)"
  },
  {
    "path": "thirdparty_libs/__init__.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n"
  },
  {
    "path": "thirdparty_libs/ansistrm/__init__.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nCopyright (c) 2014-2015 pocsuite developers (http://seebug.org)\nSee the file 'docs/COPYING' for copying permission\n\"\"\"\n"
  },
  {
    "path": "thirdparty_libs/ansistrm/ansistrm.py",
    "content": "#\n# Copyright (C) 2010-2012 Vinay Sajip. All rights reserved. Licensed under the new BSD license.\n#\nimport logging\nimport os\nimport re\n\nclass ColorizingStreamHandler(logging.StreamHandler):\n    # color names to indices\n    color_map = {\n        'black': 0,\n        'red': 1,\n        'green': 2,\n        'yellow': 3,\n        'blue': 4,\n        'magenta': 5,\n        'cyan': 6,\n        'white': 7,\n    }\n\n    # levels to (background, foreground, bold/intense)\n    if os.name == 'nt':\n        level_map = {\n            logging.DEBUG: (None, 'blue', False),\n            logging.INFO: (None, 'green', False),\n            logging.WARNING: (None, 'yellow', False),\n            logging.ERROR: (None, 'red', False),\n            logging.CRITICAL: ('red', 'white', False)\n        }\n    else:\n        level_map = {\n            logging.DEBUG: (None, 'blue', False),\n            logging.INFO: (None, 'green', False),\n            logging.WARNING: (None, 'yellow', False),\n            logging.ERROR: (None, 'red', False),\n            logging.CRITICAL: ('red', 'white', False)\n        }\n    csi = '\\x1b['\n    reset = '\\x1b[0m'\n    disable_coloring = False\n\n    @property\n    def is_tty(self):\n        isatty = getattr(self.stream, 'isatty', None)\n        return isatty and isatty() and not self.disable_coloring\n\n    '''\n    def emit(self, record):\n        try:\n            message = _stdoutencode(self.format(record))\n            stream = self.stream\n\n            if not self.is_tty:\n                if message and message[0] == \"\\r\":\n                    message = message[1:]\n                stream.write(message)\n            else:\n                self.output_colorized(message)\n            stream.write(getattr(self, 'terminator', '\\n'))\n\n            self.flush()\n        except (KeyboardInterrupt, SystemExit):\n            raise\n        except IOError:\n            pass\n        except:\n            self.handleError(record)\n    '''\n\n    if os.name != 'nt':\n        def output_colorized(self, message):\n            self.stream.write(message)\n    else:\n        ansi_esc = re.compile(r'\\x1b\\[((?:\\d+)(?:;(?:\\d+))*)m')\n\n        nt_color_map = {\n            0: 0x00,    # black\n            1: 0x04,    # red\n            2: 0x02,    # green\n            3: 0x06,    # yellow\n            4: 0x01,    # blue\n            5: 0x05,    # magenta\n            6: 0x03,    # cyan\n            7: 0x07,    # white\n        }\n\n        def output_colorized(self, message):\n            import ctypes\n\n            parts = self.ansi_esc.split(message)\n            write = self.stream.write\n            h = None\n            fd = getattr(self.stream, 'fileno', None)\n\n            if fd is not None:\n                fd = fd()\n\n                if fd in (1, 2): # stdout or stderr\n                    h = ctypes.windll.kernel32.GetStdHandle(-10 - fd)\n\n            while parts:\n                text = parts.pop(0)\n\n                if text:\n                    write(text)\n\n                if parts:\n                    params = parts.pop(0)\n\n                    if h is not None:\n                        params = [int(p) for p in params.split(';')]\n                        color = 0\n\n                        for p in params:\n                            if 40 <= p <= 47:\n                                color |= self.nt_color_map[p - 40] << 4\n                            elif 30 <= p <= 37:\n                                color |= self.nt_color_map[p - 30]\n                            elif p == 1:\n                                color |= 0x08 # foreground intensity on\n                            elif p == 0: # reset to default color\n                                color = 0x07\n                            else:\n                                pass # error condition ignored\n\n                        ctypes.windll.kernel32.SetConsoleTextAttribute(h, color)\n\n    def colorize(self, message, record):\n        if record.levelno in self.level_map and self.is_tty:\n            bg, fg, bold = self.level_map[record.levelno]\n            params = []\n\n            if bg in self.color_map:\n                params.append(str(self.color_map[bg] + 40))\n\n            if fg in self.color_map:\n                params.append(str(self.color_map[fg] + 30))\n\n            if bold:\n                params.append('1')\n\n            if params and message:\n                if message.lstrip() != message:\n                    prefix = re.search(r\"\\s+\", message).group(0)\n                    message = message[len(prefix):]\n                else:\n                    prefix = \"\"\n\n                message = \"%s%s\" % (prefix, ''.join((self.csi, ';'.join(params),\n                                   'm', message, self.reset)))\n\n        return message\n\n    def format(self, record):\n        message = logging.StreamHandler.format(self, record)\n        return self.colorize(message, record)\n"
  },
  {
    "path": "thirdparty_libs/argparse/__init__.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n"
  },
  {
    "path": "thirdparty_libs/argparse/argparse.py",
    "content": "# Author: Steven J. Bethard <steven.bethard@gmail.com>.\n# Maintainer: Thomas Waldmann <tw@waldmann-edv.de>\n\n\"\"\"Command-line parsing library\n\nThis module is an optparse-inspired command-line parsing library that:\n\n    - handles both optional and positional arguments\n    - produces highly informative usage messages\n    - supports parsers that dispatch to sub-parsers\n\nThe following is a simple usage example that sums integers from the\ncommand-line and writes the result to a file::\n\n    parser = argparse.ArgumentParser(\n        description='sum the integers at the command line')\n    parser.add_argument(\n        'integers', metavar='int', nargs='+', type=int,\n        help='an integer to be summed')\n    parser.add_argument(\n        '--log', default=sys.stdout, type=argparse.FileType('w'),\n        help='the file where the sum should be written')\n    args = parser.parse_args()\n    args.log.write('%s' % sum(args.integers))\n    args.log.close()\n\nThe module contains the following public classes:\n\n    - ArgumentParser -- The main entry point for command-line parsing. As the\n        example above shows, the add_argument() method is used to populate\n        the parser with actions for optional and positional arguments. Then\n        the parse_args() method is invoked to convert the args at the\n        command-line into an object with attributes.\n\n    - ArgumentError -- The exception raised by ArgumentParser objects when\n        there are errors with the parser's actions. Errors raised while\n        parsing the command-line are caught by ArgumentParser and emitted\n        as command-line messages.\n\n    - FileType -- A factory for defining types of files to be created. As the\n        example above shows, instances of FileType are typically passed as\n        the type= argument of add_argument() calls.\n\n    - Action -- The base class for parser actions. Typically actions are\n        selected by passing strings like 'store_true' or 'append_const' to\n        the action= argument of add_argument(). However, for greater\n        customization of ArgumentParser actions, subclasses of Action may\n        be defined and passed as the action= argument.\n\n    - HelpFormatter, RawDescriptionHelpFormatter, RawTextHelpFormatter,\n        ArgumentDefaultsHelpFormatter -- Formatter classes which\n        may be passed as the formatter_class= argument to the\n        ArgumentParser constructor. HelpFormatter is the default,\n        RawDescriptionHelpFormatter and RawTextHelpFormatter tell the parser\n        not to change the formatting for help text, and\n        ArgumentDefaultsHelpFormatter adds information about argument defaults\n        to the help.\n\nAll other classes in this module are considered implementation details.\n(Also note that HelpFormatter and RawDescriptionHelpFormatter are only\nconsidered public as object names -- the API of the formatter objects is\nstill considered an implementation detail.)\n\"\"\"\n\n__version__ = '1.4.0'  # we use our own version number independant of the\n                       # one in stdlib and we release this on pypi.\n\n__external_lib__ = True  # to make sure the tests really test THIS lib,\n                         # not the builtin one in Python stdlib\n\n__all__ = [\n    'ArgumentParser',\n    'ArgumentError',\n    'ArgumentTypeError',\n    'FileType',\n    'HelpFormatter',\n    'ArgumentDefaultsHelpFormatter',\n    'RawDescriptionHelpFormatter',\n    'RawTextHelpFormatter',\n    'Namespace',\n    'Action',\n    'ONE_OR_MORE',\n    'OPTIONAL',\n    'PARSER',\n    'REMAINDER',\n    'SUPPRESS',\n    'ZERO_OR_MORE',\n]\n\n\nimport copy as _copy\nimport os as _os\nimport re as _re\nimport sys as _sys\nimport textwrap as _textwrap\n\nfrom gettext import gettext as _\n\ntry:\n    set\nexcept NameError:\n    # for python < 2.4 compatibility (sets module is there since 2.3):\n    from sets import Set as set\n\ntry:\n    basestring\nexcept NameError:\n    basestring = str\n\ntry:\n    sorted\nexcept NameError:\n    # for python < 2.4 compatibility:\n    def sorted(iterable, reverse=False):\n        result = list(iterable)\n        result.sort()\n        if reverse:\n            result.reverse()\n        return result\n\n\ndef _callable(obj):\n    return hasattr(obj, '__call__') or hasattr(obj, '__bases__')\n\n\nSUPPRESS = '==SUPPRESS=='\n\nOPTIONAL = '?'\nZERO_OR_MORE = '*'\nONE_OR_MORE = '+'\nPARSER = 'A...'\nREMAINDER = '...'\n_UNRECOGNIZED_ARGS_ATTR = '_unrecognized_args'\n\n# =============================\n# Utility functions and classes\n# =============================\n\nclass _AttributeHolder(object):\n    \"\"\"Abstract base class that provides __repr__.\n\n    The __repr__ method returns a string in the format::\n        ClassName(attr=name, attr=name, ...)\n    The attributes are determined either by a class-level attribute,\n    '_kwarg_names', or by inspecting the instance __dict__.\n    \"\"\"\n\n    def __repr__(self):\n        type_name = type(self).__name__\n        arg_strings = []\n        for arg in self._get_args():\n            arg_strings.append(repr(arg))\n        for name, value in self._get_kwargs():\n            arg_strings.append('%s=%r' % (name, value))\n        return '%s(%s)' % (type_name, ', '.join(arg_strings))\n\n    def _get_kwargs(self):\n        return sorted(self.__dict__.items())\n\n    def _get_args(self):\n        return []\n\n\ndef _ensure_value(namespace, name, value):\n    if getattr(namespace, name, None) is None:\n        setattr(namespace, name, value)\n    return getattr(namespace, name)\n\n\n# ===============\n# Formatting Help\n# ===============\n\nclass HelpFormatter(object):\n    \"\"\"Formatter for generating usage messages and argument help strings.\n\n    Only the name of this class is considered a public API. All the methods\n    provided by the class are considered an implementation detail.\n    \"\"\"\n\n    def __init__(self,\n                 prog,\n                 indent_increment=2,\n                 max_help_position=24,\n                 width=None):\n\n        # default setting for width\n        if width is None:\n            try:\n                width = int(_os.environ['COLUMNS'])\n            except (KeyError, ValueError):\n                width = 80\n            width -= 2\n\n        self._prog = prog\n        self._indent_increment = indent_increment\n        self._max_help_position = max_help_position\n        self._width = width\n\n        self._current_indent = 0\n        self._level = 0\n        self._action_max_length = 0\n\n        self._root_section = self._Section(self, None)\n        self._current_section = self._root_section\n\n        self._whitespace_matcher = _re.compile(r'\\s+')\n        self._long_break_matcher = _re.compile(r'\\n\\n\\n+')\n\n    # ===============================\n    # Section and indentation methods\n    # ===============================\n    def _indent(self):\n        self._current_indent += self._indent_increment\n        self._level += 1\n\n    def _dedent(self):\n        self._current_indent -= self._indent_increment\n        assert self._current_indent >= 0, 'Indent decreased below 0.'\n        self._level -= 1\n\n    class _Section(object):\n\n        def __init__(self, formatter, parent, heading=None):\n            self.formatter = formatter\n            self.parent = parent\n            self.heading = heading\n            self.items = []\n\n        def format_help(self):\n            # format the indented section\n            if self.parent is not None:\n                self.formatter._indent()\n            join = self.formatter._join_parts\n            for func, args in self.items:\n                func(*args)\n            item_help = join([func(*args) for func, args in self.items])\n            if self.parent is not None:\n                self.formatter._dedent()\n\n            # return nothing if the section was empty\n            if not item_help:\n                return ''\n\n            # add the heading if the section was non-empty\n            if self.heading is not SUPPRESS and self.heading is not None:\n                current_indent = self.formatter._current_indent\n                heading = '%*s%s:\\n' % (current_indent, '', self.heading)\n            else:\n                heading = ''\n\n            # join the section-initial newline, the heading and the help\n            return join(['\\n', heading, item_help, '\\n'])\n\n    def _add_item(self, func, args):\n        self._current_section.items.append((func, args))\n\n    # ========================\n    # Message building methods\n    # ========================\n    def start_section(self, heading):\n        self._indent()\n        section = self._Section(self, self._current_section, heading)\n        self._add_item(section.format_help, [])\n        self._current_section = section\n\n    def end_section(self):\n        self._current_section = self._current_section.parent\n        self._dedent()\n\n    def add_text(self, text):\n        if text is not SUPPRESS and text is not None:\n            self._add_item(self._format_text, [text])\n\n    def add_usage(self, usage, actions, groups, prefix=None):\n        if usage is not SUPPRESS:\n            args = usage, actions, groups, prefix\n            self._add_item(self._format_usage, args)\n\n    def add_argument(self, action):\n        if action.help is not SUPPRESS:\n\n            # find all invocations\n            get_invocation = self._format_action_invocation\n            invocations = [get_invocation(action)]\n            for subaction in self._iter_indented_subactions(action):\n                invocations.append(get_invocation(subaction))\n\n            # update the maximum item length\n            invocation_length = max([len(s) for s in invocations])\n            action_length = invocation_length + self._current_indent\n            self._action_max_length = max(self._action_max_length,\n                                          action_length)\n\n            # add the item to the list\n            self._add_item(self._format_action, [action])\n\n    def add_arguments(self, actions):\n        for action in actions:\n            self.add_argument(action)\n\n    # =======================\n    # Help-formatting methods\n    # =======================\n    def format_help(self):\n        help = self._root_section.format_help()\n        if help:\n            help = self._long_break_matcher.sub('\\n\\n', help)\n            help = help.strip('\\n') + '\\n'\n        return help\n\n    def _join_parts(self, part_strings):\n        return ''.join([part\n                        for part in part_strings\n                        if part and part is not SUPPRESS])\n\n    def _format_usage(self, usage, actions, groups, prefix):\n        if prefix is None:\n            prefix = _('usage: ')\n\n        # if usage is specified, use that\n        if usage is not None:\n            usage = usage % dict(prog=self._prog)\n\n        # if no optionals or positionals are available, usage is just prog\n        elif usage is None and not actions:\n            usage = '%(prog)s' % dict(prog=self._prog)\n\n        # if optionals and positionals are available, calculate usage\n        elif usage is None:\n            prog = '%(prog)s' % dict(prog=self._prog)\n\n            # split optionals from positionals\n            optionals = []\n            positionals = []\n            for action in actions:\n                if action.option_strings:\n                    optionals.append(action)\n                else:\n                    positionals.append(action)\n\n            # build full usage string\n            format = self._format_actions_usage\n            action_usage = format(optionals + positionals, groups)\n            usage = ' '.join([s for s in [prog, action_usage] if s])\n\n            # wrap the usage parts if it's too long\n            text_width = self._width - self._current_indent\n            if len(prefix) + len(usage) > text_width:\n\n                # break usage into wrappable parts\n                part_regexp = r'\\(.*?\\)+|\\[.*?\\]+|\\S+'\n                opt_usage = format(optionals, groups)\n                pos_usage = format(positionals, groups)\n                opt_parts = _re.findall(part_regexp, opt_usage)\n                pos_parts = _re.findall(part_regexp, pos_usage)\n                assert ' '.join(opt_parts) == opt_usage\n                assert ' '.join(pos_parts) == pos_usage\n\n                # helper for wrapping lines\n                def get_lines(parts, indent, prefix=None):\n                    lines = []\n                    line = []\n                    if prefix is not None:\n                        line_len = len(prefix) - 1\n                    else:\n                        line_len = len(indent) - 1\n                    for part in parts:\n                        if line_len + 1 + len(part) > text_width:\n                            lines.append(indent + ' '.join(line))\n                            line = []\n                            line_len = len(indent) - 1\n                        line.append(part)\n                        line_len += len(part) + 1\n                    if line:\n                        lines.append(indent + ' '.join(line))\n                    if prefix is not None:\n                        lines[0] = lines[0][len(indent):]\n                    return lines\n\n                # if prog is short, follow it with optionals or positionals\n                if len(prefix) + len(prog) <= 0.75 * text_width:\n                    indent = ' ' * (len(prefix) + len(prog) + 1)\n                    if opt_parts:\n                        lines = get_lines([prog] + opt_parts, indent, prefix)\n                        lines.extend(get_lines(pos_parts, indent))\n                    elif pos_parts:\n                        lines = get_lines([prog] + pos_parts, indent, prefix)\n                    else:\n                        lines = [prog]\n\n                # if prog is long, put it on its own line\n                else:\n                    indent = ' ' * len(prefix)\n                    parts = opt_parts + pos_parts\n                    lines = get_lines(parts, indent)\n                    if len(lines) > 1:\n                        lines = []\n                        lines.extend(get_lines(opt_parts, indent))\n                        lines.extend(get_lines(pos_parts, indent))\n                    lines = [prog] + lines\n\n                # join lines into usage\n                usage = '\\n'.join(lines)\n\n        # prefix with 'usage:'\n        return '%s%s\\n\\n' % (prefix, usage)\n\n    def _format_actions_usage(self, actions, groups):\n        # find group indices and identify actions in groups\n        group_actions = set()\n        inserts = {}\n        for group in groups:\n            try:\n                start = actions.index(group._group_actions[0])\n            except ValueError:\n                continue\n            else:\n                end = start + len(group._group_actions)\n                if actions[start:end] == group._group_actions:\n                    for action in group._group_actions:\n                        group_actions.add(action)\n                    if not group.required:\n                        if start in inserts:\n                            inserts[start] += ' ['\n                        else:\n                            inserts[start] = '['\n                        inserts[end] = ']'\n                    else:\n                        if start in inserts:\n                            inserts[start] += ' ('\n                        else:\n                            inserts[start] = '('\n                        inserts[end] = ')'\n                    for i in range(start + 1, end):\n                        inserts[i] = '|'\n\n        # collect all actions format strings\n        parts = []\n        for i, action in enumerate(actions):\n\n            # suppressed arguments are marked with None\n            # remove | separators for suppressed arguments\n            if action.help is SUPPRESS:\n                parts.append(None)\n                if inserts.get(i) == '|':\n                    inserts.pop(i)\n                elif inserts.get(i + 1) == '|':\n                    inserts.pop(i + 1)\n\n            # produce all arg strings\n            elif not action.option_strings:\n                part = self._format_args(action, action.dest)\n\n                # if it's in a group, strip the outer []\n                if action in group_actions:\n                    if part[0] == '[' and part[-1] == ']':\n                        part = part[1:-1]\n\n                # add the action string to the list\n                parts.append(part)\n\n            # produce the first way to invoke the option in brackets\n            else:\n                option_string = action.option_strings[0]\n\n                # if the Optional doesn't take a value, format is:\n                #    -s or --long\n                if action.nargs == 0:\n                    part = '%s' % option_string\n\n                # if the Optional takes a value, format is:\n                #    -s ARGS or --long ARGS\n                else:\n                    default = action.dest.upper()\n                    args_string = self._format_args(action, default)\n                    part = '%s %s' % (option_string, args_string)\n\n                # make it look optional if it's not required or in a group\n                if not action.required and action not in group_actions:\n                    part = '[%s]' % part\n\n                # add the action string to the list\n                parts.append(part)\n\n        # insert things at the necessary indices\n        for i in sorted(inserts, reverse=True):\n            parts[i:i] = [inserts[i]]\n\n        # join all the action items with spaces\n        text = ' '.join([item for item in parts if item is not None])\n\n        # clean up separators for mutually exclusive groups\n        open = r'[\\[(]'\n        close = r'[\\])]'\n        text = _re.sub(r'(%s) ' % open, r'\\1', text)\n        text = _re.sub(r' (%s)' % close, r'\\1', text)\n        text = _re.sub(r'%s *%s' % (open, close), r'', text)\n        text = _re.sub(r'\\(([^|]*)\\)', r'\\1', text)\n        text = text.strip()\n\n        # return the text\n        return text\n\n    def _format_text(self, text):\n        if '%(prog)' in text:\n            text = text % dict(prog=self._prog)\n        text_width = self._width - self._current_indent\n        indent = ' ' * self._current_indent\n        return self._fill_text(text, text_width, indent) + '\\n\\n'\n\n    def _format_action(self, action):\n        # determine the required width and the entry label\n        help_position = min(self._action_max_length + 2,\n                            self._max_help_position)\n        help_width = self._width - help_position\n        action_width = help_position - self._current_indent - 2\n        action_header = self._format_action_invocation(action)\n\n        # ho nelp; start on same line and add a final newline\n        if not action.help:\n            tup = self._current_indent, '', action_header\n            action_header = '%*s%s\\n' % tup\n\n        # short action name; start on the same line and pad two spaces\n        elif len(action_header) <= action_width:\n            tup = self._current_indent, '', action_width, action_header\n            action_header = '%*s%-*s  ' % tup\n            indent_first = 0\n\n        # long action name; start on the next line\n        else:\n            tup = self._current_indent, '', action_header\n            action_header = '%*s%s\\n' % tup\n            indent_first = help_position\n\n        # collect the pieces of the action help\n        parts = [action_header]\n\n        # if there was help for the action, add lines of help text\n        if action.help:\n            help_text = self._expand_help(action)\n            help_lines = self._split_lines(help_text, help_width)\n            parts.append('%*s%s\\n' % (indent_first, '', help_lines[0]))\n            for line in help_lines[1:]:\n                parts.append('%*s%s\\n' % (help_position, '', line))\n\n        # or add a newline if the description doesn't end with one\n        elif not action_header.endswith('\\n'):\n            parts.append('\\n')\n\n        # if there are any sub-actions, add their help as well\n        for subaction in self._iter_indented_subactions(action):\n            parts.append(self._format_action(subaction))\n\n        # return a single string\n        return self._join_parts(parts)\n\n    def _format_action_invocation(self, action):\n        if not action.option_strings:\n            metavar, = self._metavar_formatter(action, action.dest)(1)\n            return metavar\n\n        else:\n            parts = []\n\n            # if the Optional doesn't take a value, format is:\n            #    -s, --long\n            if action.nargs == 0:\n                parts.extend(action.option_strings)\n\n            # if the Optional takes a value, format is:\n            #    -s ARGS, --long ARGS\n            else:\n                default = action.dest.upper()\n                args_string = self._format_args(action, default)\n                for option_string in action.option_strings:\n                    parts.append('%s %s' % (option_string, args_string))\n\n            return ', '.join(parts)\n\n    def _metavar_formatter(self, action, default_metavar):\n        if action.metavar is not None:\n            result = action.metavar\n        elif action.choices is not None:\n            choice_strs = [str(choice) for choice in action.choices]\n            result = '{%s}' % ','.join(choice_strs)\n        else:\n            result = default_metavar\n\n        def format(tuple_size):\n            if isinstance(result, tuple):\n                return result\n            else:\n                return (result, ) * tuple_size\n        return format\n\n    def _format_args(self, action, default_metavar):\n        get_metavar = self._metavar_formatter(action, default_metavar)\n        if action.nargs is None:\n            result = '%s' % get_metavar(1)\n        elif action.nargs == OPTIONAL:\n            result = '[%s]' % get_metavar(1)\n        elif action.nargs == ZERO_OR_MORE:\n            result = '[%s [%s ...]]' % get_metavar(2)\n        elif action.nargs == ONE_OR_MORE:\n            result = '%s [%s ...]' % get_metavar(2)\n        elif action.nargs == REMAINDER:\n            result = '...'\n        elif action.nargs == PARSER:\n            result = '%s ...' % get_metavar(1)\n        else:\n            formats = ['%s' for _ in range(action.nargs)]\n            result = ' '.join(formats) % get_metavar(action.nargs)\n        return result\n\n    def _expand_help(self, action):\n        params = dict(vars(action), prog=self._prog)\n        for name in list(params):\n            if params[name] is SUPPRESS:\n                del params[name]\n        for name in list(params):\n            if hasattr(params[name], '__name__'):\n                params[name] = params[name].__name__\n        if params.get('choices') is not None:\n            choices_str = ', '.join([str(c) for c in params['choices']])\n            params['choices'] = choices_str\n        return self._get_help_string(action) % params\n\n    def _iter_indented_subactions(self, action):\n        try:\n            get_subactions = action._get_subactions\n        except AttributeError:\n            pass\n        else:\n            self._indent()\n            for subaction in get_subactions():\n                yield subaction\n            self._dedent()\n\n    def _split_lines(self, text, width):\n        text = self._whitespace_matcher.sub(' ', text).strip()\n        return _textwrap.wrap(text, width)\n\n    def _fill_text(self, text, width, indent):\n        text = self._whitespace_matcher.sub(' ', text).strip()\n        return _textwrap.fill(text, width, initial_indent=indent,\n                                           subsequent_indent=indent)\n\n    def _get_help_string(self, action):\n        return action.help\n\n\nclass RawDescriptionHelpFormatter(HelpFormatter):\n    \"\"\"Help message formatter which retains any formatting in descriptions.\n\n    Only the name of this class is considered a public API. All the methods\n    provided by the class are considered an implementation detail.\n    \"\"\"\n\n    def _fill_text(self, text, width, indent):\n        return ''.join([indent + line for line in text.splitlines(True)])\n\n\nclass RawTextHelpFormatter(RawDescriptionHelpFormatter):\n    \"\"\"Help message formatter which retains formatting of all help text.\n\n    Only the name of this class is considered a public API. All the methods\n    provided by the class are considered an implementation detail.\n    \"\"\"\n\n    def _split_lines(self, text, width):\n        return text.splitlines()\n\n\nclass ArgumentDefaultsHelpFormatter(HelpFormatter):\n    \"\"\"Help message formatter which adds default values to argument help.\n\n    Only the name of this class is considered a public API. All the methods\n    provided by the class are considered an implementation detail.\n    \"\"\"\n\n    def _get_help_string(self, action):\n        help = action.help\n        if '%(default)' not in action.help:\n            if action.default is not SUPPRESS:\n                defaulting_nargs = [OPTIONAL, ZERO_OR_MORE]\n                if action.option_strings or action.nargs in defaulting_nargs:\n                    help += ' (default: %(default)s)'\n        return help\n\n\n# =====================\n# Options and Arguments\n# =====================\n\ndef _get_action_name(argument):\n    if argument is None:\n        return None\n    elif argument.option_strings:\n        return  '/'.join(argument.option_strings)\n    elif argument.metavar not in (None, SUPPRESS):\n        return argument.metavar\n    elif argument.dest not in (None, SUPPRESS):\n        return argument.dest\n    else:\n        return None\n\n\nclass ArgumentError(Exception):\n    \"\"\"An error from creating or using an argument (optional or positional).\n\n    The string value of this exception is the message, augmented with\n    information about the argument that caused it.\n    \"\"\"\n\n    def __init__(self, argument, message):\n        self.argument_name = _get_action_name(argument)\n        self.message = message\n\n    def __str__(self):\n        if self.argument_name is None:\n            format = '%(message)s'\n        else:\n            format = 'argument %(argument_name)s: %(message)s'\n        return format % dict(message=self.message,\n                             argument_name=self.argument_name)\n\n\nclass ArgumentTypeError(Exception):\n    \"\"\"An error from trying to convert a command line string to a type.\"\"\"\n    pass\n\n\n# ==============\n# Action classes\n# ==============\n\nclass Action(_AttributeHolder):\n    \"\"\"Information about how to convert command line strings to Python objects.\n\n    Action objects are used by an ArgumentParser to represent the information\n    needed to parse a single argument from one or more strings from the\n    command line. The keyword arguments to the Action constructor are also\n    all attributes of Action instances.\n\n    Keyword Arguments:\n\n        - option_strings -- A list of command-line option strings which\n            should be associated with this action.\n\n        - dest -- The name of the attribute to hold the created object(s)\n\n        - nargs -- The number of command-line arguments that should be\n            consumed. By default, one argument will be consumed and a single\n            value will be produced.  Other values include:\n                - N (an integer) consumes N arguments (and produces a list)\n                - '?' consumes zero or one arguments\n                - '*' consumes zero or more arguments (and produces a list)\n                - '+' consumes one or more arguments (and produces a list)\n            Note that the difference between the default and nargs=1 is that\n            with the default, a single value will be produced, while with\n            nargs=1, a list containing a single value will be produced.\n\n        - const -- The value to be produced if the option is specified and the\n            option uses an action that takes no values.\n\n        - default -- The value to be produced if the option is not specified.\n\n        - type -- The type which the command-line arguments should be converted\n            to, should be one of 'string', 'int', 'float', 'complex' or a\n            callable object that accepts a single string argument. If None,\n            'string' is assumed.\n\n        - choices -- A container of values that should be allowed. If not None,\n            after a command-line argument has been converted to the appropriate\n            type, an exception will be raised if it is not a member of this\n            collection.\n\n        - required -- True if the action must always be specified at the\n            command line. This is only meaningful for optional command-line\n            arguments.\n\n        - help -- The help string describing the argument.\n\n        - metavar -- The name to be used for the option's argument with the\n            help string. If None, the 'dest' value will be used as the name.\n    \"\"\"\n\n    def __init__(self,\n                 option_strings,\n                 dest,\n                 nargs=None,\n                 const=None,\n                 default=None,\n                 type=None,\n                 choices=None,\n                 required=False,\n                 help=None,\n                 metavar=None):\n        self.option_strings = option_strings\n        self.dest = dest\n        self.nargs = nargs\n        self.const = const\n        self.default = default\n        self.type = type\n        self.choices = choices\n        self.required = required\n        self.help = help\n        self.metavar = metavar\n\n    def _get_kwargs(self):\n        names = [\n            'option_strings',\n            'dest',\n            'nargs',\n            'const',\n            'default',\n            'type',\n            'choices',\n            'help',\n            'metavar',\n        ]\n        return [(name, getattr(self, name)) for name in names]\n\n    def __call__(self, parser, namespace, values, option_string=None):\n        raise NotImplementedError(_('.__call__() not defined'))\n\n\nclass _StoreAction(Action):\n\n    def __init__(self,\n                 option_strings,\n                 dest,\n                 nargs=None,\n                 const=None,\n                 default=None,\n                 type=None,\n                 choices=None,\n                 required=False,\n                 help=None,\n                 metavar=None):\n        if nargs == 0:\n            raise ValueError('nargs for store actions must be > 0; if you '\n                             'have nothing to store, actions such as store '\n                             'true or store const may be more appropriate')\n        if const is not None and nargs != OPTIONAL:\n            raise ValueError('nargs must be %r to supply const' % OPTIONAL)\n        super(_StoreAction, self).__init__(\n            option_strings=option_strings,\n            dest=dest,\n            nargs=nargs,\n            const=const,\n            default=default,\n            type=type,\n            choices=choices,\n            required=required,\n            help=help,\n            metavar=metavar)\n\n    def __call__(self, parser, namespace, values, option_string=None):\n        setattr(namespace, self.dest, values)\n\n\nclass _StoreConstAction(Action):\n\n    def __init__(self,\n                 option_strings,\n                 dest,\n                 const,\n                 default=None,\n                 required=False,\n                 help=None,\n                 metavar=None):\n        super(_StoreConstAction, self).__init__(\n            option_strings=option_strings,\n            dest=dest,\n            nargs=0,\n            const=const,\n            default=default,\n            required=required,\n            help=help)\n\n    def __call__(self, parser, namespace, values, option_string=None):\n        setattr(namespace, self.dest, self.const)\n\n\nclass _StoreTrueAction(_StoreConstAction):\n\n    def __init__(self,\n                 option_strings,\n                 dest,\n                 default=False,\n                 required=False,\n                 help=None):\n        super(_StoreTrueAction, self).__init__(\n            option_strings=option_strings,\n            dest=dest,\n            const=True,\n            default=default,\n            required=required,\n            help=help)\n\n\nclass _StoreFalseAction(_StoreConstAction):\n\n    def __init__(self,\n                 option_strings,\n                 dest,\n                 default=True,\n                 required=False,\n                 help=None):\n        super(_StoreFalseAction, self).__init__(\n            option_strings=option_strings,\n            dest=dest,\n            const=False,\n            default=default,\n            required=required,\n            help=help)\n\n\nclass _AppendAction(Action):\n\n    def __init__(self,\n                 option_strings,\n                 dest,\n                 nargs=None,\n                 const=None,\n                 default=None,\n                 type=None,\n                 choices=None,\n                 required=False,\n                 help=None,\n                 metavar=None):\n        if nargs == 0:\n            raise ValueError('nargs for append actions must be > 0; if arg '\n                             'strings are not supplying the value to append, '\n                             'the append const action may be more appropriate')\n        if const is not None and nargs != OPTIONAL:\n            raise ValueError('nargs must be %r to supply const' % OPTIONAL)\n        super(_AppendAction, self).__init__(\n            option_strings=option_strings,\n            dest=dest,\n            nargs=nargs,\n            const=const,\n            default=default,\n            type=type,\n            choices=choices,\n            required=required,\n            help=help,\n            metavar=metavar)\n\n    def __call__(self, parser, namespace, values, option_string=None):\n        items = _copy.copy(_ensure_value(namespace, self.dest, []))\n        items.append(values)\n        setattr(namespace, self.dest, items)\n\n\nclass _AppendConstAction(Action):\n\n    def __init__(self,\n                 option_strings,\n                 dest,\n                 const,\n                 default=None,\n                 required=False,\n                 help=None,\n                 metavar=None):\n        super(_AppendConstAction, self).__init__(\n            option_strings=option_strings,\n            dest=dest,\n            nargs=0,\n            const=const,\n            default=default,\n            required=required,\n            help=help,\n            metavar=metavar)\n\n    def __call__(self, parser, namespace, values, option_string=None):\n        items = _copy.copy(_ensure_value(namespace, self.dest, []))\n        items.append(self.const)\n        setattr(namespace, self.dest, items)\n\n\nclass _CountAction(Action):\n\n    def __init__(self,\n                 option_strings,\n                 dest,\n                 default=None,\n                 required=False,\n                 help=None):\n        super(_CountAction, self).__init__(\n            option_strings=option_strings,\n            dest=dest,\n            nargs=0,\n            default=default,\n            required=required,\n            help=help)\n\n    def __call__(self, parser, namespace, values, option_string=None):\n        new_count = _ensure_value(namespace, self.dest, 0) + 1\n        setattr(namespace, self.dest, new_count)\n\n\nclass _HelpAction(Action):\n\n    def __init__(self,\n                 option_strings,\n                 dest=SUPPRESS,\n                 default=SUPPRESS,\n                 help=None):\n        super(_HelpAction, self).__init__(\n            option_strings=option_strings,\n            dest=dest,\n            default=default,\n            nargs=0,\n            help=help)\n\n    def __call__(self, parser, namespace, values, option_string=None):\n        parser.print_help()\n        parser.exit()\n\n\nclass _VersionAction(Action):\n\n    def __init__(self,\n                 option_strings,\n                 version=None,\n                 dest=SUPPRESS,\n                 default=SUPPRESS,\n                 help=\"show program's version number and exit\"):\n        super(_VersionAction, self).__init__(\n            option_strings=option_strings,\n            dest=dest,\n            default=default,\n            nargs=0,\n            help=help)\n        self.version = version\n\n    def __call__(self, parser, namespace, values, option_string=None):\n        version = self.version\n        if version is None:\n            version = parser.version\n        formatter = parser._get_formatter()\n        formatter.add_text(version)\n        parser.exit(message=formatter.format_help())\n\n\nclass _SubParsersAction(Action):\n\n    class _ChoicesPseudoAction(Action):\n\n        def __init__(self, name, aliases, help):\n            metavar = dest = name\n            if aliases:\n                metavar += ' (%s)' % ', '.join(aliases)\n            sup = super(_SubParsersAction._ChoicesPseudoAction, self)\n            sup.__init__(option_strings=[], dest=dest, help=help,\n                        metavar=metavar)\n\n    def __init__(self,\n                 option_strings,\n                 prog,\n                 parser_class,\n                 dest=SUPPRESS,\n                 help=None,\n                 metavar=None):\n\n        self._prog_prefix = prog\n        self._parser_class = parser_class\n        self._name_parser_map = {}\n        self._choices_actions = []\n\n        super(_SubParsersAction, self).__init__(\n            option_strings=option_strings,\n            dest=dest,\n            nargs=PARSER,\n            choices=self._name_parser_map,\n            help=help,\n            metavar=metavar)\n\n    def add_parser(self, name, **kwargs):\n        # set prog from the existing prefix\n        if kwargs.get('prog') is None:\n            kwargs['prog'] = '%s %s' % (self._prog_prefix, name)\n\n        aliases = kwargs.pop('aliases', ())\n\n        # create a pseudo-action to hold the choice help\n        if 'help' in kwargs:\n            help = kwargs.pop('help')\n            choice_action = self._ChoicesPseudoAction(name, aliases, help)\n            self._choices_actions.append(choice_action)\n\n        # create the parser and add it to the map\n        parser = self._parser_class(**kwargs)\n        self._name_parser_map[name] = parser\n\n        # make parser available under aliases also\n        for alias in aliases:\n            self._name_parser_map[alias] = parser\n\n        return parser\n\n    def _get_subactions(self):\n        return self._choices_actions\n\n    def __call__(self, parser, namespace, values, option_string=None):\n        parser_name = values[0]\n        arg_strings = values[1:]\n\n        # set the parser name if requested\n        if self.dest is not SUPPRESS:\n            setattr(namespace, self.dest, parser_name)\n\n        # select the parser\n        try:\n            parser = self._name_parser_map[parser_name]\n        except KeyError:\n            tup = parser_name, ', '.join(self._name_parser_map)\n            msg = _('unknown parser %r (choices: %s)' % tup)\n            raise ArgumentError(self, msg)\n\n        # parse all the remaining options into the namespace\n        # store any unrecognized options on the object, so that the top\n        # level parser can decide what to do with them\n        namespace, arg_strings = parser.parse_known_args(arg_strings, namespace)\n        if arg_strings:\n            vars(namespace).setdefault(_UNRECOGNIZED_ARGS_ATTR, [])\n            getattr(namespace, _UNRECOGNIZED_ARGS_ATTR).extend(arg_strings)\n\n\n# ==============\n# Type classes\n# ==============\n\nclass FileType(object):\n    \"\"\"Factory for creating file object types\n\n    Instances of FileType are typically passed as type= arguments to the\n    ArgumentParser add_argument() method.\n\n    Keyword Arguments:\n        - mode -- A string indicating how the file is to be opened. Accepts the\n            same values as the builtin open() function.\n        - bufsize -- The file's desired buffer size. Accepts the same values as\n            the builtin open() function.\n    \"\"\"\n\n    def __init__(self, mode='r', bufsize=None):\n        self._mode = mode\n        self._bufsize = bufsize\n\n    def __call__(self, string):\n        # the special argument \"-\" means sys.std{in,out}\n        if string == '-':\n            if 'r' in self._mode:\n                return _sys.stdin\n            elif 'w' in self._mode:\n                return _sys.stdout\n            else:\n                msg = _('argument \"-\" with mode %r' % self._mode)\n                raise ValueError(msg)\n\n        try:\n            # all other arguments are used as file names\n            if self._bufsize:\n                return open(string, self._mode, self._bufsize)\n            else:\n                return open(string, self._mode)\n        except IOError:\n            err = _sys.exc_info()[1]\n            message = _(\"can't open '%s': %s\")\n            raise ArgumentTypeError(message % (string, err))\n\n    def __repr__(self):\n        args = [self._mode, self._bufsize]\n        args_str = ', '.join([repr(arg) for arg in args if arg is not None])\n        return '%s(%s)' % (type(self).__name__, args_str)\n\n# ===========================\n# Optional and Positional Parsing\n# ===========================\n\nclass Namespace(_AttributeHolder):\n    \"\"\"Simple object for storing attributes.\n\n    Implements equality by attribute names and values, and provides a simple\n    string representation.\n    \"\"\"\n\n    def __init__(self, **kwargs):\n        for name in kwargs:\n            setattr(self, name, kwargs[name])\n\n    __hash__ = None\n\n    def __eq__(self, other):\n        return vars(self) == vars(other)\n\n    def __ne__(self, other):\n        return not (self == other)\n\n    def __contains__(self, key):\n        return key in self.__dict__\n\n\nclass _ActionsContainer(object):\n\n    def __init__(self,\n                 description,\n                 prefix_chars,\n                 argument_default,\n                 conflict_handler):\n        super(_ActionsContainer, self).__init__()\n\n        self.description = description\n        self.argument_default = argument_default\n        self.prefix_chars = prefix_chars\n        self.conflict_handler = conflict_handler\n\n        # set up registries\n        self._registries = {}\n\n        # register actions\n        self.register('action', None, _StoreAction)\n        self.register('action', 'store', _StoreAction)\n        self.register('action', 'store_const', _StoreConstAction)\n        self.register('action', 'store_true', _StoreTrueAction)\n        self.register('action', 'store_false', _StoreFalseAction)\n        self.register('action', 'append', _AppendAction)\n        self.register('action', 'append_const', _AppendConstAction)\n        self.register('action', 'count', _CountAction)\n        self.register('action', 'help', _HelpAction)\n        self.register('action', 'version', _VersionAction)\n        self.register('action', 'parsers', _SubParsersAction)\n\n        # raise an exception if the conflict handler is invalid\n        self._get_handler()\n\n        # action storage\n        self._actions = []\n        self._option_string_actions = {}\n\n        # groups\n        self._action_groups = []\n        self._mutually_exclusive_groups = []\n\n        # defaults storage\n        self._defaults = {}\n\n        # determines whether an \"option\" looks like a negative number\n        self._negative_number_matcher = _re.compile(r'^-\\d+$|^-\\d*\\.\\d+$')\n\n        # whether or not there are any optionals that look like negative\n        # numbers -- uses a list so it can be shared and edited\n        self._has_negative_number_optionals = []\n\n    # ====================\n    # Registration methods\n    # ====================\n    def register(self, registry_name, value, object):\n        registry = self._registries.setdefault(registry_name, {})\n        registry[value] = object\n\n    def _registry_get(self, registry_name, value, default=None):\n        return self._registries[registry_name].get(value, default)\n\n    # ==================================\n    # Namespace default accessor methods\n    # ==================================\n    def set_defaults(self, **kwargs):\n        self._defaults.update(kwargs)\n\n        # if these defaults match any existing arguments, replace\n        # the previous default on the object with the new one\n        for action in self._actions:\n            if action.dest in kwargs:\n                action.default = kwargs[action.dest]\n\n    def get_default(self, dest):\n        for action in self._actions:\n            if action.dest == dest and action.default is not None:\n                return action.default\n        return self._defaults.get(dest, None)\n\n\n    # =======================\n    # Adding argument actions\n    # =======================\n    def add_argument(self, *args, **kwargs):\n        \"\"\"\n        add_argument(dest, ..., name=value, ...)\n        add_argument(option_string, option_string, ..., name=value, ...)\n        \"\"\"\n\n        # if no positional args are supplied or only one is supplied and\n        # it doesn't look like an option string, parse a positional\n        # argument\n        chars = self.prefix_chars\n        if not args or len(args) == 1 and args[0][0] not in chars:\n            if args and 'dest' in kwargs:\n                raise ValueError('dest supplied twice for positional argument')\n            kwargs = self._get_positional_kwargs(*args, **kwargs)\n\n        # otherwise, we're adding an optional argument\n        else:\n            kwargs = self._get_optional_kwargs(*args, **kwargs)\n\n        # if no default was supplied, use the parser-level default\n        if 'default' not in kwargs:\n            dest = kwargs['dest']\n            if dest in self._defaults:\n                kwargs['default'] = self._defaults[dest]\n            elif self.argument_default is not None:\n                kwargs['default'] = self.argument_default\n\n        # create the action object, and add it to the parser\n        action_class = self._pop_action_class(kwargs)\n        if not _callable(action_class):\n            raise ValueError('unknown action \"%s\"' % action_class)\n        action = action_class(**kwargs)\n\n        # raise an error if the action type is not callable\n        type_func = self._registry_get('type', action.type, action.type)\n        if not _callable(type_func):\n            raise ValueError('%r is not callable' % type_func)\n\n        return self._add_action(action)\n\n    def add_argument_group(self, *args, **kwargs):\n        group = _ArgumentGroup(self, *args, **kwargs)\n        self._action_groups.append(group)\n        return group\n\n    def add_mutually_exclusive_group(self, **kwargs):\n        group = _MutuallyExclusiveGroup(self, **kwargs)\n        self._mutually_exclusive_groups.append(group)\n        return group\n\n    def _add_action(self, action):\n        # resolve any conflicts\n        self._check_conflict(action)\n\n        # add to actions list\n        self._actions.append(action)\n        action.container = self\n\n        # index the action by any option strings it has\n        for option_string in action.option_strings:\n            self._option_string_actions[option_string] = action\n\n        # set the flag if any option strings look like negative numbers\n        for option_string in action.option_strings:\n            if self._negative_number_matcher.match(option_string):\n                if not self._has_negative_number_optionals:\n                    self._has_negative_number_optionals.append(True)\n\n        # return the created action\n        return action\n\n    def _remove_action(self, action):\n        self._actions.remove(action)\n\n    def _add_container_actions(self, container):\n        # collect groups by titles\n        title_group_map = {}\n        for group in self._action_groups:\n            if group.title in title_group_map:\n                msg = _('cannot merge actions - two groups are named %r')\n                raise ValueError(msg % (group.title))\n            title_group_map[group.title] = group\n\n        # map each action to its group\n        group_map = {}\n        for group in container._action_groups:\n\n            # if a group with the title exists, use that, otherwise\n            # create a new group matching the container's group\n            if group.title not in title_group_map:\n                title_group_map[group.title] = self.add_argument_group(\n                    title=group.title,\n                    description=group.description,\n                    conflict_handler=group.conflict_handler)\n\n            # map the actions to their new group\n            for action in group._group_actions:\n                group_map[action] = title_group_map[group.title]\n\n        # add container's mutually exclusive groups\n        # NOTE: if add_mutually_exclusive_group ever gains title= and\n        # description= then this code will need to be expanded as above\n        for group in container._mutually_exclusive_groups:\n            mutex_group = self.add_mutually_exclusive_group(\n                required=group.required)\n\n            # map the actions to their new mutex group\n            for action in group._group_actions:\n                group_map[action] = mutex_group\n\n        # add all actions to this container or their group\n        for action in container._actions:\n            group_map.get(action, self)._add_action(action)\n\n    def _get_positional_kwargs(self, dest, **kwargs):\n        # make sure required is not specified\n        if 'required' in kwargs:\n            msg = _(\"'required' is an invalid argument for positionals\")\n            raise TypeError(msg)\n\n        # mark positional arguments as required if at least one is\n        # always required\n        if kwargs.get('nargs') not in [OPTIONAL, ZERO_OR_MORE]:\n            kwargs['required'] = True\n        if kwargs.get('nargs') == ZERO_OR_MORE and 'default' not in kwargs:\n            kwargs['required'] = True\n\n        # return the keyword arguments with no option strings\n        return dict(kwargs, dest=dest, option_strings=[])\n\n    def _get_optional_kwargs(self, *args, **kwargs):\n        # determine short and long option strings\n        option_strings = []\n        long_option_strings = []\n        for option_string in args:\n            # error on strings that don't start with an appropriate prefix\n            if not option_string[0] in self.prefix_chars:\n                msg = _('invalid option string %r: '\n                        'must start with a character %r')\n                tup = option_string, self.prefix_chars\n                raise ValueError(msg % tup)\n\n            # strings starting with two prefix characters are long options\n            option_strings.append(option_string)\n            if option_string[0] in self.prefix_chars:\n                if len(option_string) > 1:\n                    if option_string[1] in self.prefix_chars:\n                        long_option_strings.append(option_string)\n\n        # infer destination, '--foo-bar' -> 'foo_bar' and '-x' -> 'x'\n        dest = kwargs.pop('dest', None)\n        if dest is None:\n            if long_option_strings:\n                dest_option_string = long_option_strings[0]\n            else:\n                dest_option_string = option_strings[0]\n            dest = dest_option_string.lstrip(self.prefix_chars)\n            if not dest:\n                msg = _('dest= is required for options like %r')\n                raise ValueError(msg % option_string)\n            dest = dest.replace('-', '_')\n\n        # return the updated keyword arguments\n        return dict(kwargs, dest=dest, option_strings=option_strings)\n\n    def _pop_action_class(self, kwargs, default=None):\n        action = kwargs.pop('action', default)\n        return self._registry_get('action', action, action)\n\n    def _get_handler(self):\n        # determine function from conflict handler string\n        handler_func_name = '_handle_conflict_%s' % self.conflict_handler\n        try:\n            return getattr(self, handler_func_name)\n        except AttributeError:\n            msg = _('invalid conflict_resolution value: %r')\n            raise ValueError(msg % self.conflict_handler)\n\n    def _check_conflict(self, action):\n\n        # find all options that conflict with this option\n        confl_optionals = []\n        for option_string in action.option_strings:\n            if option_string in self._option_string_actions:\n                confl_optional = self._option_string_actions[option_string]\n                confl_optionals.append((option_string, confl_optional))\n\n        # resolve any conflicts\n        if confl_optionals:\n            conflict_handler = self._get_handler()\n            conflict_handler(action, confl_optionals)\n\n    def _handle_conflict_error(self, action, conflicting_actions):\n        message = _('conflicting option string(s): %s')\n        conflict_string = ', '.join([option_string\n                                     for option_string, action\n                                     in conflicting_actions])\n        raise ArgumentError(action, message % conflict_string)\n\n    def _handle_conflict_resolve(self, action, conflicting_actions):\n\n        # remove all conflicting options\n        for option_string, action in conflicting_actions:\n\n            # remove the conflicting option\n            action.option_strings.remove(option_string)\n            self._option_string_actions.pop(option_string, None)\n\n            # if the option now has no option string, remove it from the\n            # container holding it\n            if not action.option_strings:\n                action.container._remove_action(action)\n\n\nclass _ArgumentGroup(_ActionsContainer):\n\n    def __init__(self, container, title=None, description=None, **kwargs):\n        # add any missing keyword arguments by checking the container\n        update = kwargs.setdefault\n        update('conflict_handler', container.conflict_handler)\n        update('prefix_chars', container.prefix_chars)\n        update('argument_default', container.argument_default)\n        super_init = super(_ArgumentGroup, self).__init__\n        super_init(description=description, **kwargs)\n\n        # group attributes\n        self.title = title\n        self._group_actions = []\n\n        # share most attributes with the container\n        self._registries = container._registries\n        self._actions = container._actions\n        self._option_string_actions = container._option_string_actions\n        self._defaults = container._defaults\n        self._has_negative_number_optionals = \\\n            container._has_negative_number_optionals\n\n    def _add_action(self, action):\n        action = super(_ArgumentGroup, self)._add_action(action)\n        self._group_actions.append(action)\n        return action\n\n    def _remove_action(self, action):\n        super(_ArgumentGroup, self)._remove_action(action)\n        self._group_actions.remove(action)\n\n\nclass _MutuallyExclusiveGroup(_ArgumentGroup):\n\n    def __init__(self, container, required=False):\n        super(_MutuallyExclusiveGroup, self).__init__(container)\n        self.required = required\n        self._container = container\n\n    def _add_action(self, action):\n        if action.required:\n            msg = _('mutually exclusive arguments must be optional')\n            raise ValueError(msg)\n        action = self._container._add_action(action)\n        self._group_actions.append(action)\n        return action\n\n    def _remove_action(self, action):\n        self._container._remove_action(action)\n        self._group_actions.remove(action)\n\n\nclass ArgumentParser(_AttributeHolder, _ActionsContainer):\n    \"\"\"Object for parsing command line strings into Python objects.\n\n    Keyword Arguments:\n        - prog -- The name of the program (default: sys.argv[0])\n        - usage -- A usage message (default: auto-generated from arguments)\n        - description -- A description of what the program does\n        - epilog -- Text following the argument descriptions\n        - parents -- Parsers whose arguments should be copied into this one\n        - formatter_class -- HelpFormatter class for printing help messages\n        - prefix_chars -- Characters that prefix optional arguments\n        - fromfile_prefix_chars -- Characters that prefix files containing\n            additional arguments\n        - argument_default -- The default value for all arguments\n        - conflict_handler -- String indicating how to handle conflicts\n        - add_help -- Add a -h/-help option\n    \"\"\"\n\n    def __init__(self,\n                 prog=None,\n                 usage=None,\n                 description=None,\n                 epilog=None,\n                 version=None,\n                 parents=[],\n                 formatter_class=HelpFormatter,\n                 prefix_chars='-',\n                 fromfile_prefix_chars=None,\n                 argument_default=None,\n                 conflict_handler='error',\n                 add_help=True):\n\n        if version is not None:\n            import warnings\n            warnings.warn(\n                \"\"\"The \"version\" argument to ArgumentParser is deprecated. \"\"\"\n                \"\"\"Please use \"\"\"\n                \"\"\"\"add_argument(..., action='version', version=\"N\", ...)\" \"\"\"\n                \"\"\"instead\"\"\", DeprecationWarning)\n\n        superinit = super(ArgumentParser, self).__init__\n        superinit(description=description,\n                  prefix_chars=prefix_chars,\n                  argument_default=argument_default,\n                  conflict_handler=conflict_handler)\n\n        # default setting for prog\n        if prog is None:\n            prog = _os.path.basename(_sys.argv[0])\n\n        self.prog = prog\n        self.usage = usage\n        self.epilog = epilog\n        self.version = version\n        self.formatter_class = formatter_class\n        self.fromfile_prefix_chars = fromfile_prefix_chars\n        self.add_help = add_help\n\n        add_group = self.add_argument_group\n        self._positionals = add_group(_('positional arguments'))\n        self._optionals = add_group(_('optional arguments'))\n        self._subparsers = None\n\n        # register types\n        def identity(string):\n            return string\n        self.register('type', None, identity)\n\n        # add help and version arguments if necessary\n        # (using explicit default to override global argument_default)\n        if '-' in prefix_chars:\n            default_prefix = '-'\n        else:\n            default_prefix = prefix_chars[0]\n        if self.add_help:\n            self.add_argument(\n                default_prefix+'h', default_prefix*2+'help',\n                action='help', default=SUPPRESS,\n                help=_('show this help message and exit'))\n        if self.version:\n            self.add_argument(\n                default_prefix+'v', default_prefix*2+'version',\n                action='version', default=SUPPRESS,\n                version=self.version,\n                help=_(\"show program's version number and exit\"))\n\n        # add parent arguments and defaults\n        for parent in parents:\n            self._add_container_actions(parent)\n            try:\n                defaults = parent._defaults\n            except AttributeError:\n                pass\n            else:\n                self._defaults.update(defaults)\n\n    # =======================\n    # Pretty __repr__ methods\n    # =======================\n    def _get_kwargs(self):\n        names = [\n            'prog',\n            'usage',\n            'description',\n            'version',\n            'formatter_class',\n            'conflict_handler',\n            'add_help',\n        ]\n        return [(name, getattr(self, name)) for name in names]\n\n    # ==================================\n    # Optional/Positional adding methods\n    # ==================================\n    def add_subparsers(self, **kwargs):\n        if self._subparsers is not None:\n            self.error(_('cannot have multiple subparser arguments'))\n\n        # add the parser class to the arguments if it's not present\n        kwargs.setdefault('parser_class', type(self))\n\n        if 'title' in kwargs or 'description' in kwargs:\n            title = _(kwargs.pop('title', 'subcommands'))\n            description = _(kwargs.pop('description', None))\n            self._subparsers = self.add_argument_group(title, description)\n        else:\n            self._subparsers = self._positionals\n\n        # prog defaults to the usage message of this parser, skipping\n        # optional arguments and with no \"usage:\" prefix\n        if kwargs.get('prog') is None:\n            formatter = self._get_formatter()\n            positionals = self._get_positional_actions()\n            groups = self._mutually_exclusive_groups\n            formatter.add_usage(self.usage, positionals, groups, '')\n            kwargs['prog'] = formatter.format_help().strip()\n\n        # create the parsers action and add it to the positionals list\n        parsers_class = self._pop_action_class(kwargs, 'parsers')\n        action = parsers_class(option_strings=[], **kwargs)\n        self._subparsers._add_action(action)\n\n        # return the created parsers action\n        return action\n\n    def _add_action(self, action):\n        if action.option_strings:\n            self._optionals._add_action(action)\n        else:\n            self._positionals._add_action(action)\n        return action\n\n    def _get_optional_actions(self):\n        return [action\n                for action in self._actions\n                if action.option_strings]\n\n    def _get_positional_actions(self):\n        return [action\n                for action in self._actions\n                if not action.option_strings]\n\n    # =====================================\n    # Command line argument parsing methods\n    # =====================================\n    def parse_args(self, args=None, namespace=None):\n        args, argv = self.parse_known_args(args, namespace)\n        if argv:\n            msg = _('unrecognized arguments: %s')\n            self.error(msg % ' '.join(argv))\n        return args\n\n    def parse_known_args(self, args=None, namespace=None):\n        # args default to the system args\n        if args is None:\n            args = _sys.argv[1:]\n\n        # default Namespace built from parser defaults\n        if namespace is None:\n            namespace = Namespace()\n\n        # add any action defaults that aren't present\n        for action in self._actions:\n            if action.dest is not SUPPRESS:\n                if not hasattr(namespace, action.dest):\n                    if action.default is not SUPPRESS:\n                        setattr(namespace, action.dest, action.default)\n\n        # add any parser defaults that aren't present\n        for dest in self._defaults:\n            if not hasattr(namespace, dest):\n                setattr(namespace, dest, self._defaults[dest])\n\n        # parse the arguments and exit if there are any errors\n        try:\n            namespace, args = self._parse_known_args(args, namespace)\n            if hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR):\n                args.extend(getattr(namespace, _UNRECOGNIZED_ARGS_ATTR))\n                delattr(namespace, _UNRECOGNIZED_ARGS_ATTR)\n            return namespace, args\n        except ArgumentError:\n            err = _sys.exc_info()[1]\n            self.error(str(err))\n\n    def _parse_known_args(self, arg_strings, namespace):\n        # replace arg strings that are file references\n        if self.fromfile_prefix_chars is not None:\n            arg_strings = self._read_args_from_files(arg_strings)\n\n        # map all mutually exclusive arguments to the other arguments\n        # they can't occur with\n        action_conflicts = {}\n        for mutex_group in self._mutually_exclusive_groups:\n            group_actions = mutex_group._group_actions\n            for i, mutex_action in enumerate(mutex_group._group_actions):\n                conflicts = action_conflicts.setdefault(mutex_action, [])\n                conflicts.extend(group_actions[:i])\n                conflicts.extend(group_actions[i + 1:])\n\n        # find all option indices, and determine the arg_string_pattern\n        # which has an 'O' if there is an option at an index,\n        # an 'A' if there is an argument, or a '-' if there is a '--'\n        option_string_indices = {}\n        arg_string_pattern_parts = []\n        arg_strings_iter = iter(arg_strings)\n        for i, arg_string in enumerate(arg_strings_iter):\n\n            # all args after -- are non-options\n            if arg_string == '--':\n                arg_string_pattern_parts.append('-')\n                for arg_string in arg_strings_iter:\n                    arg_string_pattern_parts.append('A')\n\n            # otherwise, add the arg to the arg strings\n            # and note the index if it was an option\n            else:\n                option_tuple = self._parse_optional(arg_string)\n                if option_tuple is None:\n                    pattern = 'A'\n                else:\n                    option_string_indices[i] = option_tuple\n                    pattern = 'O'\n                arg_string_pattern_parts.append(pattern)\n\n        # join the pieces together to form the pattern\n        arg_strings_pattern = ''.join(arg_string_pattern_parts)\n\n        # converts arg strings to the appropriate and then takes the action\n        seen_actions = set()\n        seen_non_default_actions = set()\n\n        def take_action(action, argument_strings, option_string=None):\n            seen_actions.add(action)\n            argument_values = self._get_values(action, argument_strings)\n\n            # error if this argument is not allowed with other previously\n            # seen arguments, assuming that actions that use the default\n            # value don't really count as \"present\"\n            if argument_values is not action.default:\n                seen_non_default_actions.add(action)\n                for conflict_action in action_conflicts.get(action, []):\n                    if conflict_action in seen_non_default_actions:\n                        msg = _('not allowed with argument %s')\n                        action_name = _get_action_name(conflict_action)\n                        raise ArgumentError(action, msg % action_name)\n\n            # take the action if we didn't receive a SUPPRESS value\n            # (e.g. from a default)\n            if argument_values is not SUPPRESS:\n                action(self, namespace, argument_values, option_string)\n\n        # function to convert arg_strings into an optional action\n        def consume_optional(start_index):\n\n            # get the optional identified at this index\n            option_tuple = option_string_indices[start_index]\n            action, option_string, explicit_arg = option_tuple\n\n            # identify additional optionals in the same arg string\n            # (e.g. -xyz is the same as -x -y -z if no args are required)\n            match_argument = self._match_argument\n            action_tuples = []\n            while True:\n\n                # if we found no optional action, skip it\n                if action is None:\n                    extras.append(arg_strings[start_index])\n                    return start_index + 1\n\n                # if there is an explicit argument, try to match the\n                # optional's string arguments to only this\n                if explicit_arg is not None:\n                    arg_count = match_argument(action, 'A')\n\n                    # if the action is a single-dash option and takes no\n                    # arguments, try to parse more single-dash options out\n                    # of the tail of the option string\n                    chars = self.prefix_chars\n                    if arg_count == 0 and option_string[1] not in chars:\n                        action_tuples.append((action, [], option_string))\n                        char = option_string[0]\n                        option_string = char + explicit_arg[0]\n                        new_explicit_arg = explicit_arg[1:] or None\n                        optionals_map = self._option_string_actions\n                        if option_string in optionals_map:\n                            action = optionals_map[option_string]\n                            explicit_arg = new_explicit_arg\n                        else:\n                            msg = _('ignored explicit argument %r')\n                            raise ArgumentError(action, msg % explicit_arg)\n\n                    # if the action expect exactly one argument, we've\n                    # successfully matched the option; exit the loop\n                    elif arg_count == 1:\n                        stop = start_index + 1\n                        args = [explicit_arg]\n                        action_tuples.append((action, args, option_string))\n                        break\n\n                    # error if a double-dash option did not use the\n                    # explicit argument\n                    else:\n                        msg = _('ignored explicit argument %r')\n                        raise ArgumentError(action, msg % explicit_arg)\n\n                # if there is no explicit argument, try to match the\n                # optional's string arguments with the following strings\n                # if successful, exit the loop\n                else:\n                    start = start_index + 1\n                    selected_patterns = arg_strings_pattern[start:]\n                    arg_count = match_argument(action, selected_patterns)\n                    stop = start + arg_count\n                    args = arg_strings[start:stop]\n                    action_tuples.append((action, args, option_string))\n                    break\n\n            # add the Optional to the list and return the index at which\n            # the Optional's string args stopped\n            assert action_tuples\n            for action, args, option_string in action_tuples:\n                take_action(action, args, option_string)\n            return stop\n\n        # the list of Positionals left to be parsed; this is modified\n        # by consume_positionals()\n        positionals = self._get_positional_actions()\n\n        # function to convert arg_strings into positional actions\n        def consume_positionals(start_index):\n            # match as many Positionals as possible\n            match_partial = self._match_arguments_partial\n            selected_pattern = arg_strings_pattern[start_index:]\n            arg_counts = match_partial(positionals, selected_pattern)\n\n            # slice off the appropriate arg strings for each Positional\n            # and add the Positional and its args to the list\n            for action, arg_count in zip(positionals, arg_counts):\n                args = arg_strings[start_index: start_index + arg_count]\n                start_index += arg_count\n                take_action(action, args)\n\n            # slice off the Positionals that we just parsed and return the\n            # index at which the Positionals' string args stopped\n            positionals[:] = positionals[len(arg_counts):]\n            return start_index\n\n        # consume Positionals and Optionals alternately, until we have\n        # passed the last option string\n        extras = []\n        start_index = 0\n        if option_string_indices:\n            max_option_string_index = max(option_string_indices)\n        else:\n            max_option_string_index = -1\n        while start_index <= max_option_string_index:\n\n            # consume any Positionals preceding the next option\n            next_option_string_index = min([\n                index\n                for index in option_string_indices\n                if index >= start_index])\n            if start_index != next_option_string_index:\n                positionals_end_index = consume_positionals(start_index)\n\n                # only try to parse the next optional if we didn't consume\n                # the option string during the positionals parsing\n                if positionals_end_index > start_index:\n                    start_index = positionals_end_index\n                    continue\n                else:\n                    start_index = positionals_end_index\n\n            # if we consumed all the positionals we could and we're not\n            # at the index of an option string, there were extra arguments\n            if start_index not in option_string_indices:\n                strings = arg_strings[start_index:next_option_string_index]\n                extras.extend(strings)\n                start_index = next_option_string_index\n\n            # consume the next optional and any arguments for it\n            start_index = consume_optional(start_index)\n\n        # consume any positionals following the last Optional\n        stop_index = consume_positionals(start_index)\n\n        # if we didn't consume all the argument strings, there were extras\n        extras.extend(arg_strings[stop_index:])\n\n        # if we didn't use all the Positional objects, there were too few\n        # arg strings supplied.\n        if positionals:\n            self.error(_('too few arguments'))\n\n        # make sure all required actions were present, and convert defaults.\n        for action in self._actions:\n            if action not in seen_actions:\n                if action.required:\n                    name = _get_action_name(action)\n                    self.error(_('argument %s is required') % name)\n                else:\n                    # Convert action default now instead of doing it before\n                    # parsing arguments to avoid calling convert functions\n                    # twice (which may fail) if the argument was given, but\n                    # only if it was defined already in the namespace\n                    if (action.default is not None and\n                            isinstance(action.default, basestring) and\n                            hasattr(namespace, action.dest) and\n                            action.default is getattr(namespace, action.dest)):\n                        setattr(namespace, action.dest,\n                                self._get_value(action, action.default))\n\n        # make sure all required groups had one option present\n        for group in self._mutually_exclusive_groups:\n            if group.required:\n                for action in group._group_actions:\n                    if action in seen_non_default_actions:\n                        break\n\n                # if no actions were used, report the error\n                else:\n                    names = [_get_action_name(action)\n                             for action in group._group_actions\n                             if action.help is not SUPPRESS]\n                    msg = _('one of the arguments %s is required')\n                    self.error(msg % ' '.join(names))\n\n        # return the updated namespace and the extra arguments\n        return namespace, extras\n\n    def _read_args_from_files(self, arg_strings):\n        # expand arguments referencing files\n        new_arg_strings = []\n        for arg_string in arg_strings:\n\n            # for regular arguments, just add them back into the list\n            if arg_string[0] not in self.fromfile_prefix_chars:\n                new_arg_strings.append(arg_string)\n\n            # replace arguments referencing files with the file content\n            else:\n                try:\n                    args_file = open(arg_string[1:])\n                    try:\n                        arg_strings = []\n                        for arg_line in args_file.read().splitlines():\n                            for arg in self.convert_arg_line_to_args(arg_line):\n                                arg_strings.append(arg)\n                        arg_strings = self._read_args_from_files(arg_strings)\n                        new_arg_strings.extend(arg_strings)\n                    finally:\n                        args_file.close()\n                except IOError:\n                    err = _sys.exc_info()[1]\n                    self.error(str(err))\n\n        # return the modified argument list\n        return new_arg_strings\n\n    def convert_arg_line_to_args(self, arg_line):\n        return [arg_line]\n\n    def _match_argument(self, action, arg_strings_pattern):\n        # match the pattern for this action to the arg strings\n        nargs_pattern = self._get_nargs_pattern(action)\n        match = _re.match(nargs_pattern, arg_strings_pattern)\n\n        # raise an exception if we weren't able to find a match\n        if match is None:\n            nargs_errors = {\n                None: _('expected one argument'),\n                OPTIONAL: _('expected at most one argument'),\n                ONE_OR_MORE: _('expected at least one argument'),\n            }\n            default = _('expected %s argument(s)') % action.nargs\n            msg = nargs_errors.get(action.nargs, default)\n            raise ArgumentError(action, msg)\n\n        # return the number of arguments matched\n        return len(match.group(1))\n\n    def _match_arguments_partial(self, actions, arg_strings_pattern):\n        # progressively shorten the actions list by slicing off the\n        # final actions until we find a match\n        result = []\n        for i in range(len(actions), 0, -1):\n            actions_slice = actions[:i]\n            pattern = ''.join([self._get_nargs_pattern(action)\n                               for action in actions_slice])\n            match = _re.match(pattern, arg_strings_pattern)\n            if match is not None:\n                result.extend([len(string) for string in match.groups()])\n                break\n\n        # return the list of arg string counts\n        return result\n\n    def _parse_optional(self, arg_string):\n        # if it's an empty string, it was meant to be a positional\n        if not arg_string:\n            return None\n\n        # if it doesn't start with a prefix, it was meant to be positional\n        if not arg_string[0] in self.prefix_chars:\n            return None\n\n        # if the option string is present in the parser, return the action\n        if arg_string in self._option_string_actions:\n            action = self._option_string_actions[arg_string]\n            return action, arg_string, None\n\n        # if it's just a single character, it was meant to be positional\n        if len(arg_string) == 1:\n            return None\n\n        # if the option string before the \"=\" is present, return the action\n        if '=' in arg_string:\n            option_string, explicit_arg = arg_string.split('=', 1)\n            if option_string in self._option_string_actions:\n                action = self._option_string_actions[option_string]\n                return action, option_string, explicit_arg\n\n        # search through all possible prefixes of the option string\n        # and all actions in the parser for possible interpretations\n        option_tuples = self._get_option_tuples(arg_string)\n\n        # if multiple actions match, the option string was ambiguous\n        if len(option_tuples) > 1:\n            options = ', '.join([option_string\n                for action, option_string, explicit_arg in option_tuples])\n            tup = arg_string, options\n            self.error(_('ambiguous option: %s could match %s') % tup)\n\n        # if exactly one action matched, this segmentation is good,\n        # so return the parsed action\n        elif len(option_tuples) == 1:\n            option_tuple, = option_tuples\n            return option_tuple\n\n        # if it was not found as an option, but it looks like a negative\n        # number, it was meant to be positional\n        # unless there are negative-number-like options\n        if self._negative_number_matcher.match(arg_string):\n            if not self._has_negative_number_optionals:\n                return None\n\n        # if it contains a space, it was meant to be a positional\n        if ' ' in arg_string:\n            return None\n\n        # it was meant to be an optional but there is no such option\n        # in this parser (though it might be a valid option in a subparser)\n        return None, arg_string, None\n\n    def _get_option_tuples(self, option_string):\n        result = []\n\n        # option strings starting with two prefix characters are only\n        # split at the '='\n        chars = self.prefix_chars\n        if option_string[0] in chars and option_string[1] in chars:\n            if '=' in option_string:\n                option_prefix, explicit_arg = option_string.split('=', 1)\n            else:\n                option_prefix = option_string\n                explicit_arg = None\n            for option_string in self._option_string_actions:\n                if option_string.startswith(option_prefix):\n                    action = self._option_string_actions[option_string]\n                    tup = action, option_string, explicit_arg\n                    result.append(tup)\n\n        # single character options can be concatenated with their arguments\n        # but multiple character options always have to have their argument\n        # separate\n        elif option_string[0] in chars and option_string[1] not in chars:\n            option_prefix = option_string\n            explicit_arg = None\n            short_option_prefix = option_string[:2]\n            short_explicit_arg = option_string[2:]\n\n            for option_string in self._option_string_actions:\n                if option_string == short_option_prefix:\n                    action = self._option_string_actions[option_string]\n                    tup = action, option_string, short_explicit_arg\n                    result.append(tup)\n                elif option_string.startswith(option_prefix):\n                    action = self._option_string_actions[option_string]\n                    tup = action, option_string, explicit_arg\n                    result.append(tup)\n\n        # shouldn't ever get here\n        else:\n            self.error(_('unexpected option string: %s') % option_string)\n\n        # return the collected option tuples\n        return result\n\n    def _get_nargs_pattern(self, action):\n        # in all examples below, we have to allow for '--' args\n        # which are represented as '-' in the pattern\n        nargs = action.nargs\n\n        # the default (None) is assumed to be a single argument\n        if nargs is None:\n            nargs_pattern = '(-*A-*)'\n\n        # allow zero or one arguments\n        elif nargs == OPTIONAL:\n            nargs_pattern = '(-*A?-*)'\n\n        # allow zero or more arguments\n        elif nargs == ZERO_OR_MORE:\n            nargs_pattern = '(-*[A-]*)'\n\n        # allow one or more arguments\n        elif nargs == ONE_OR_MORE:\n            nargs_pattern = '(-*A[A-]*)'\n\n        # allow any number of options or arguments\n        elif nargs == REMAINDER:\n            nargs_pattern = '([-AO]*)'\n\n        # allow one argument followed by any number of options or arguments\n        elif nargs == PARSER:\n            nargs_pattern = '(-*A[-AO]*)'\n\n        # all others should be integers\n        else:\n            nargs_pattern = '(-*%s-*)' % '-*'.join('A' * nargs)\n\n        # if this is an optional action, -- is not allowed\n        if action.option_strings:\n            nargs_pattern = nargs_pattern.replace('-*', '')\n            nargs_pattern = nargs_pattern.replace('-', '')\n\n        # return the pattern\n        return nargs_pattern\n\n    # ========================\n    # Value conversion methods\n    # ========================\n    def _get_values(self, action, arg_strings):\n        # for everything but PARSER args, strip out '--'\n        if action.nargs not in [PARSER, REMAINDER]:\n            arg_strings = [s for s in arg_strings if s != '--']\n\n        # optional argument produces a default when not present\n        if not arg_strings and action.nargs == OPTIONAL:\n            if action.option_strings:\n                value = action.const\n            else:\n                value = action.default\n            if isinstance(value, basestring):\n                value = self._get_value(action, value)\n                self._check_value(action, value)\n\n        # when nargs='*' on a positional, if there were no command-line\n        # args, use the default if it is anything other than None\n        elif (not arg_strings and action.nargs == ZERO_OR_MORE and\n              not action.option_strings):\n            if action.default is not None:\n                value = action.default\n            else:\n                value = arg_strings\n            self._check_value(action, value)\n\n        # single argument or optional argument produces a single value\n        elif len(arg_strings) == 1 and action.nargs in [None, OPTIONAL]:\n            arg_string, = arg_strings\n            value = self._get_value(action, arg_string)\n            self._check_value(action, value)\n\n        # REMAINDER arguments convert all values, checking none\n        elif action.nargs == REMAINDER:\n            value = [self._get_value(action, v) for v in arg_strings]\n\n        # PARSER arguments convert all values, but check only the first\n        elif action.nargs == PARSER:\n            value = [self._get_value(action, v) for v in arg_strings]\n            self._check_value(action, value[0])\n\n        # all other types of nargs produce a list\n        else:\n            value = [self._get_value(action, v) for v in arg_strings]\n            for v in value:\n                self._check_value(action, v)\n\n        # return the converted value\n        return value\n\n    def _get_value(self, action, arg_string):\n        type_func = self._registry_get('type', action.type, action.type)\n        if not _callable(type_func):\n            msg = _('%r is not callable')\n            raise ArgumentError(action, msg % type_func)\n\n        # convert the value to the appropriate type\n        try:\n            result = type_func(arg_string)\n\n        # ArgumentTypeErrors indicate errors\n        except ArgumentTypeError:\n            name = getattr(action.type, '__name__', repr(action.type))\n            msg = str(_sys.exc_info()[1])\n            raise ArgumentError(action, msg)\n\n        # TypeErrors or ValueErrors also indicate errors\n        except (TypeError, ValueError):\n            name = getattr(action.type, '__name__', repr(action.type))\n            msg = _('invalid %s value: %r')\n            raise ArgumentError(action, msg % (name, arg_string))\n\n        # return the converted value\n        return result\n\n    def _check_value(self, action, value):\n        # converted value must be one of the choices (if specified)\n        if action.choices is not None and value not in action.choices:\n            tup = value, ', '.join(map(repr, action.choices))\n            msg = _('invalid choice: %r (choose from %s)') % tup\n            raise ArgumentError(action, msg)\n\n    # =======================\n    # Help-formatting methods\n    # =======================\n    def format_usage(self):\n        formatter = self._get_formatter()\n        formatter.add_usage(self.usage, self._actions,\n                            self._mutually_exclusive_groups)\n        return formatter.format_help()\n\n    def format_help(self):\n        formatter = self._get_formatter()\n\n        # usage\n        formatter.add_usage(self.usage, self._actions,\n                            self._mutually_exclusive_groups)\n\n        # description\n        formatter.add_text(self.description)\n\n        # positionals, optionals and user-defined groups\n        for action_group in self._action_groups:\n            formatter.start_section(action_group.title)\n            formatter.add_text(action_group.description)\n            formatter.add_arguments(action_group._group_actions)\n            formatter.end_section()\n\n        # epilog\n        formatter.add_text(self.epilog)\n\n        # determine help from format above\n        return formatter.format_help()\n\n    def format_version(self):\n        import warnings\n        warnings.warn(\n            'The format_version method is deprecated -- the \"version\" '\n            'argument to ArgumentParser is no longer supported.',\n            DeprecationWarning)\n        formatter = self._get_formatter()\n        formatter.add_text(self.version)\n        return formatter.format_help()\n\n    def _get_formatter(self):\n        return self.formatter_class(prog=self.prog)\n\n    # =====================\n    # Help-printing methods\n    # =====================\n    def print_usage(self, file=None):\n        if file is None:\n            file = _sys.stdout\n        self._print_message(self.format_usage(), file)\n\n    def print_help(self, file=None):\n        if file is None:\n            file = _sys.stdout\n        self._print_message(self.format_help(), file)\n\n    def print_version(self, file=None):\n        import warnings\n        warnings.warn(\n            'The print_version method is deprecated -- the \"version\" '\n            'argument to ArgumentParser is no longer supported.',\n            DeprecationWarning)\n        self._print_message(self.format_version(), file)\n\n    def _print_message(self, message, file=None):\n        if message:\n            if file is None:\n                file = _sys.stderr\n            file.write(message)\n\n    # ===============\n    # Exiting methods\n    # ===============\n    def exit(self, status=0, message=None):\n        if message:\n            self._print_message(message, _sys.stderr)\n        _sys.exit(status)\n\n    def error(self, message):\n        \"\"\"error(message: string)\n\n        Prints a usage message incorporating the message to stderr and\n        exits.\n\n        If you override this in a subclass, it should not return -- it\n        should either exit or raise an exception.\n        \"\"\"\n        self.print_usage(_sys.stderr)\n        self.exit(2, _('%s: error: %s\\n') % (self.prog, message))\n"
  },
  {
    "path": "thirdparty_libs/bind_sql_inject/__init__.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n"
  },
  {
    "path": "thirdparty_libs/bind_sql_inject/diff.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nimport difflib\n\n\ndef diff(a, b):\n    \"\"\"\n    :param a: A string\n    :param b: A string (similar to a)\n    :return: Two strings (a_mod, b_mod) which are basically:\n                a_mod = a - (a intersection b)\n                b_mod = b - (a intersection b)\n             Or if you want to see it in another way, the results are the\n             parts of the string that make it unique between each other.\n\n    >>> diff('123456', '123a56')\n    ('4', 'a')\n\n    >>> diff('yes 123abc', 'no 123abc')\n    ('yes', 'no')\n\n    >>> diff('123abc yes', '123abc no')\n    ('yes', 'no')\n\n    >>> diff('123abc yes', 'no 123abc no')\n    ('yes', 'no no')\n    \"\"\"\n    matching_blocks = difflib.SequenceMatcher(None, a, b).get_matching_blocks()\n    removed_a = 0\n    removed_b = 0\n\n    for block in matching_blocks:\n        a_index, b_index, size = block\n        a = a[:a_index - removed_a] + a[a_index - removed_a + size:]\n        b = b[:b_index - removed_b] + b[b_index - removed_b + size:]\n        removed_a += size\n        removed_b += size\n\n    return a, b\n"
  },
  {
    "path": "thirdparty_libs/bind_sql_inject/fuzzy_string_cmp.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nimport difflib\nimport pprint\n\nfrom upper_bounds import UPPER_BOUNDS\n\ndef relative_distance_boolean(a_str, b_str, threshold=0.6):\n    \"\"\"\n    Indicates if the strings to compare are similar enough. This (optimized)\n    function is equivalent to the expression:\n        relative_distance(x, y) > threshold\n\n    :param a_str: A string object\n    :param b_str: A string object\n    :param threshold: Float value indicating the expected \"similarity\". Must be\n                      0 <= threshold <= 1.0\n    :return: A boolean value\n    \"\"\"\n\n    if threshold == 0:\n        return True\n    elif threshold == 1.0:\n        return a_str == b_str\n\n    # First we need b_str to be the longer of both\n    if len(b_str) < len(a_str):\n        a_str, b_str = b_str, a_str\n\n    alen = len(a_str)\n    blen = len(b_str)\n\n    if blen == 0 or alen == 0:\n        return alen == blen\n\n    if blen == alen and a_str == b_str and threshold <= 1.0:\n        return True\n\n    ratio = float(blen) / alen\n\n    last_ratio, last_bound = UPPER_BOUNDS[-1]\n\n    if threshold < last_bound:\n        # Bad, we can't optimize anything here\n        return relative_distance(a_str, b_str) >= threshold\n    else:\n        if last_ratio < ratio:\n            # Good, we know the upper bound\n            return False\n        else:\n            # We have to step through\n            for size_ratio, bound in UPPER_BOUNDS:\n                if size_ratio > ratio:\n                    # Bad: we have to do the relative_distance\n                    #print relative_distance(a_str, b_str)\n                    return relative_distance(a_str, b_str) >= threshold\n                elif bound < threshold:\n                    # Good: We found an upper bound\n                    return False\n\n\ndef fuzzy_equal(a_str, b_str, threshold=0.6):\n    \"\"\"\n    Indicates if the 'similarity' index between strings\n    is *greater equal* than 'threshold'. See 'relative_distance_boolean'.\n    \"\"\"\n    return relative_distance_boolean(a_str, b_str, threshold)\n\n\ndef fuzzy_not_equal(a_str, b_str, threshold=0.6):\n    \"\"\"\n    Indicates if the 'similarity' index between strings\n    is *less than* 'threshold'\n    \"\"\"\n    return not relative_distance_boolean(a_str, b_str, threshold)\n\n\ndef relative_distance(a_str, b_str):\n    \"\"\"\n    Measures the \"similarity\" of the strings.\n\n    Depends on the algorithm we finally implement, but usually a return value\n    over 0.6 means the strings are close matches.\n\n    :param a_str: A string object\n    :param b_str: A string object\n    :return: A float with the distance\n    \"\"\"\n    set_a = set(a_str.split(' '))\n    set_b = set(b_str.split(' '))\n\n    if min(len(set_a), len(set_b)) in (0, 1):\n        #\n        #   This is a rare case, where the http response body is one long\n        #   non-space separated string.\n        #\n        return difflib.SequenceMatcher(None, a_str, b_str).quick_ratio()\n\n    return 1.0 * len(set_a.intersection(set_b)) / max(len(set_a), len(set_b))\n\n\ndef _generate_upper_bounds():\n    \"\"\"\n    This function can be used to produce new upper bounds,\n    but shouldn't be used in productive code. Simply run this\n    command once and then hardcode the list.\n    \"\"\"\n\n    left_max = 40\n    right_max = 30\n\n    UPPER_BOUNDS = set()\n    UPPER_BOUNDS.add((1.0, 1.0))\n\n    def add_to_bounds(a, b):\n        size = float(len(b)) / len(a)\n        upper_bound = relative_distance(a, b)\n        UPPER_BOUNDS.add((size, upper_bound))\n\n    for k in range(1, left_max):\n        for i in range(1, right_max):\n            if k == i == 1:\n                continue\n            atest = 'm' * k\n            btest = 'm' * k + 'm' * (i - 1)\n            add_to_bounds(atest, btest)\n\n    # Remove duplicates\n    UPPER_BOUNDS = list(UPPER_BOUNDS)\n\n    # Sort\n    UPPER_BOUNDS.sort(lambda x, y: cmp(x[0], y[0]))\n\n    fp = file(\"upper_bounds.py\", \"w\")\n    fp.write(\"UPPER_BOUNDS = \")\n    pprint.pprint(UPPER_BOUNDS, fp)\n    fp.close()\n\n\nif __name__ == \"__main__\":\n    # Uncomment next function call to generate 'upper_bounds.py' module\n    #_generate_upper_bounds()\n\n    # These tests should be reallocated in a test module.\n    import time\n    import urllib2\n\n    performance_tests = []\n\n    #performance_tests.append(('a'*25000,'a'*25000,0.999 ))\n    #performance_tests.append(('a'*12000, 'a'*25000, 0.9999))\n    #performance_tests.append(('a'*20000, 'a'*25000, 0.1))\n\n    #google = urllib2.urlopen(\"http://demo.aisec.cn/demo/aisec/html_link.php?id=2\").read()\n    #google2 = urllib2.urlopen(\"http://demo.aisec.cn/demo/aisec/html_link.php?id=2%27\").read()\n\n    '''\n    yahoo = urllib2.urlopen(\"http://www.yahoo.com/\").read()\n    yahoo2 = urllib2.urlopen(\"http://uk.yahoo.com/\").read()\n\n    bing = urllib2.urlopen(\"http://www.bing.com/\").read()\n    bing2 = urllib2.urlopen(\"http://www.bing.com/?cc=gb\").read()\n\n    '''\n    #True\n    #performance_tests.append((google, google, 0.99999999))\n    print relative_distance_boolean(\"ecd\", \"ckdp\", 0.6)\n    #print relative_distance_boolean(google, google2, 0.66)\n"
  },
  {
    "path": "thirdparty_libs/bind_sql_inject/upper_bounds.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nUPPER_BOUNDS = [(1.0, 1.0),\n                (1.0256410256410255, 0.98734177215189878),\n                (1.0263157894736843, 0.98701298701298701),\n                (1.027027027027027, 0.98666666666666669),\n                (1.0277777777777777, 0.98630136986301364),\n                (1.0285714285714285, 0.9859154929577465),\n                (1.0294117647058822, 0.98550724637681164),\n                (1.0303030303030303, 0.9850746268656716),\n                (1.03125, 0.98461538461538467),\n                (1.032258064516129, 0.98412698412698407),\n                (1.0333333333333334, 0.98360655737704916),\n                (1.0344827586206897, 0.98305084745762716),\n                (1.0357142857142858, 0.98245614035087714),\n                (1.037037037037037, 0.98181818181818181),\n                (1.0384615384615385, 0.98113207547169812),\n                (1.04, 0.98039215686274506),\n                (1.0416666666666667, 0.97959183673469385),\n                (1.0434782608695652, 0.97872340425531912),\n                (1.0454545454545454, 0.97777777777777775),\n                (1.0476190476190477, 0.97674418604651159),\n                (1.05, 0.97560975609756095),\n                (1.0512820512820513, 0.97499999999999998),\n                (1.0526315789473684, 0.97435897435897434),\n                (1.0540540540540539, 0.97368421052631582),\n                (1.0555555555555556, 0.97297297297297303),\n                (1.0571428571428572, 0.97222222222222221),\n                (1.0588235294117647, 0.97142857142857142),\n                (1.0606060606060606, 0.97058823529411764),\n                (1.0625, 0.96969696969696972),\n                (1.064516129032258, 0.96875),\n                (1.0666666666666667, 0.967741935483871),\n                (1.0689655172413792, 0.96666666666666667),\n                (1.0714285714285714, 0.96551724137931039),\n                (1.0740740740740742, 0.9642857142857143),\n                (1.0769230769230769, 0.96296296296296291),\n                (1.0789473684210527, 0.96202531645569622),\n                (1.0800000000000001, 0.96153846153846156),\n                (1.0810810810810811, 0.96103896103896103),\n                (1.0833333333333333, 0.95999999999999996),\n                (1.0857142857142856, 0.95890410958904104),\n                (1.0869565217391304, 0.95833333333333337),\n                (1.088235294117647, 0.95774647887323938),\n                (1.0909090909090908, 0.95652173913043481),\n                (1.09375, 0.95522388059701491),\n                (1.0952380952380953, 0.95454545454545459),\n                (1.096774193548387, 0.9538461538461539),\n                (1.1000000000000001, 0.95238095238095233),\n                (1.1025641025641026, 0.95121951219512191),\n                (1.103448275862069, 0.95081967213114749),\n                (1.1052631578947369, 0.94999999999999996),\n                (1.1071428571428572, 0.94915254237288138),\n                (1.1081081081081081, 0.94871794871794868),\n                (1.1111111111111112, 0.94736842105263153),\n                (1.1142857142857143, 0.94594594594594594),\n                (1.1153846153846154, 0.94545454545454544),\n                (1.1176470588235294, 0.94444444444444442),\n                (1.1200000000000001, 0.94339622641509435),\n                (1.1212121212121211, 0.94285714285714284),\n                (1.125, 0.94117647058823528),\n                (1.1282051282051282, 0.93975903614457834),\n                (1.1290322580645162, 0.93939393939393945),\n                (1.1304347826086956, 0.93877551020408168),\n                (1.131578947368421, 0.93827160493827155),\n                (1.1333333333333333, 0.9375),\n                (1.1351351351351351, 0.93670886075949367),\n                (1.1363636363636365, 0.93617021276595747),\n                (1.1379310344827587, 0.93548387096774188),\n                (1.1388888888888888, 0.93506493506493504),\n                (1.1428571428571428, 0.93333333333333335),\n                (1.1470588235294117, 0.93150684931506844),\n                (1.1481481481481481, 0.93103448275862066),\n                (1.1499999999999999, 0.93023255813953487),\n                (1.1515151515151516, 0.92957746478873238),\n                (1.1538461538461537, 0.9285714285714286),\n                (1.15625, 0.92753623188405798),\n                (1.1578947368421053, 0.92682926829268297),\n                (1.1599999999999999, 0.92592592592592593),\n                (1.1612903225806452, 0.92537313432835822),\n                (1.1621621621621621, 0.92500000000000004),\n                (1.1666666666666667, 0.92307692307692313),\n                (1.1714285714285715, 0.92105263157894735),\n                (1.1724137931034482, 0.92063492063492058),\n                (1.173913043478261, 0.92000000000000004),\n                (1.1764705882352942, 0.91891891891891897),\n                (1.1785714285714286, 0.91803278688524592),\n                (1.1794871794871795, 0.91764705882352937),\n                (1.1818181818181819, 0.91666666666666663),\n                (1.1842105263157894, 0.91566265060240959),\n                (1.1851851851851851, 0.9152542372881356),\n                (1.1875, 0.91428571428571426),\n                (1.1891891891891893, 0.9135802469135802),\n                (1.1904761904761905, 0.91304347826086951),\n                (1.1923076923076923, 0.91228070175438591),\n                (1.1935483870967742, 0.91176470588235292),\n                (1.1944444444444444, 0.91139240506329111),\n                (1.2, 0.90909090909090906),\n                (1.2051282051282051, 0.90697674418604646),\n                (1.2058823529411764, 0.90666666666666662),\n                (1.2068965517241379, 0.90625),\n                (1.2083333333333333, 0.90566037735849059),\n                (1.2105263157894737, 0.90476190476190477),\n                (1.2121212121212122, 0.90410958904109584),\n (1.2142857142857142, 0.90322580645161288),\n (1.2162162162162162, 0.90243902439024393),\n (1.2173913043478262, 0.90196078431372551),\n (1.21875, 0.90140845070422537),\n (1.2222222222222223, 0.90000000000000002),\n (1.2258064516129032, 0.89855072463768115),\n (1.2272727272727273, 0.89795918367346939),\n (1.2285714285714286, 0.89743589743589747),\n (1.2307692307692308, 0.89655172413793105),\n (1.2333333333333334, 0.89552238805970152),\n (1.2352941176470589, 0.89473684210526316),\n (1.236842105263158, 0.89411764705882357),\n (1.2380952380952381, 0.8936170212765957),\n (1.24, 0.8928571428571429),\n (1.2413793103448276, 0.89230769230769236),\n (1.2424242424242424, 0.89189189189189189),\n (1.2432432432432432, 0.89156626506024095),\n (1.25, 0.88888888888888884),\n (1.2564102564102564, 0.88636363636363635),\n (1.2571428571428571, 0.88607594936708856),\n (1.2580645161290323, 0.88571428571428568),\n (1.2592592592592593, 0.88524590163934425),\n (1.2608695652173914, 0.88461538461538458),\n (1.263157894736842, 0.88372093023255816),\n (1.2647058823529411, 0.88311688311688308),\n (1.2666666666666666, 0.88235294117647056),\n (1.2692307692307692, 0.88135593220338981),\n (1.2702702702702702, 0.88095238095238093),\n (1.2727272727272727, 0.88),\n (1.2758620689655173, 0.87878787878787878),\n (1.2777777777777777, 0.87804878048780488),\n (1.28, 0.8771929824561403),\n (1.28125, 0.87671232876712324),\n (1.2820512820512822, 0.8764044943820225),\n (1.2857142857142858, 0.875),\n (1.2894736842105263, 0.87356321839080464),\n (1.2903225806451613, 0.87323943661971826),\n (1.2916666666666667, 0.87272727272727268),\n (1.2941176470588236, 0.87179487179487181),\n (1.2962962962962963, 0.87096774193548387),\n (1.2972972972972974, 0.87058823529411766),\n (1.3, 0.86956521739130432),\n (1.303030303030303, 0.86842105263157898),\n (1.3043478260869565, 0.86792452830188682),\n (1.3055555555555556, 0.86746987951807231),\n (1.3076923076923077, 0.8666666666666667),\n (1.3103448275862069, 0.86567164179104472),\n (1.3125, 0.86486486486486491),\n (1.3142857142857143, 0.86419753086419748),\n (1.3157894736842106, 0.86363636363636365),\n (1.3181818181818181, 0.86274509803921573),\n (1.3200000000000001, 0.86206896551724133),\n (1.3214285714285714, 0.86153846153846159),\n (1.3225806451612903, 0.86111111111111116),\n (1.3235294117647058, 0.86075949367088611),\n (1.3243243243243243, 0.86046511627906974),\n (1.3333333333333333, 0.8571428571428571),\n (1.3421052631578947, 0.8539325842696629),\n (1.3428571428571427, 0.85365853658536583),\n (1.34375, 0.85333333333333339),\n (1.3448275862068966, 0.8529411764705882),\n (1.3461538461538463, 0.85245901639344257),\n (1.3478260869565217, 0.85185185185185186),\n (1.3500000000000001, 0.85106382978723405),\n (1.3513513513513513, 0.85057471264367812),\n (1.3529411764705883, 0.84999999999999998),\n (1.3548387096774193, 0.84931506849315064),\n (1.3571428571428572, 0.84848484848484851),\n (1.358974358974359, 0.84782608695652173),\n (1.3600000000000001, 0.84745762711864403),\n (1.3611111111111112, 0.84705882352941175),\n (1.3636363636363635, 0.84615384615384615),\n (1.3666666666666667, 0.84507042253521125),\n (1.368421052631579, 0.84444444444444444),\n (1.3703703703703705, 0.84375),\n (1.3714285714285714, 0.84337349397590367),\n (1.375, 0.84210526315789469),\n (1.3783783783783783, 0.84090909090909094),\n (1.3793103448275863, 0.84057971014492749),\n (1.3809523809523809, 0.83999999999999997),\n (1.3823529411764706, 0.83950617283950613),\n (1.3846153846153846, 0.83870967741935487),\n (1.3870967741935485, 0.83783783783783783),\n (1.3888888888888888, 0.83720930232558144),\n (1.3913043478260869, 0.83636363636363631),\n (1.3928571428571428, 0.83582089552238803),\n (1.393939393939394, 0.83544303797468356),\n (1.3947368421052631, 0.8351648351648352),\n (1.3999999999999999, 0.83333333333333337),\n (1.4054054054054055, 0.8314606741573034),\n (1.40625, 0.83116883116883122),\n (1.4074074074074074, 0.83076923076923082),\n (1.4090909090909092, 0.83018867924528306),\n (1.4102564102564104, 0.82978723404255317),\n (1.411764705882353, 0.82926829268292679),\n (1.4137931034482758, 0.82857142857142863),\n (1.4166666666666667, 0.82758620689655171),\n (1.4193548387096775, 0.82666666666666666),\n (1.4210526315789473, 0.82608695652173914),\n (1.4230769230769231, 0.82539682539682535),\n (1.4242424242424243, 0.82499999999999996),\n (1.4285714285714286, 0.82352941176470584),\n (1.4324324324324325, 0.82222222222222219),\n (1.4333333333333333, 0.82191780821917804),\n (1.4347826086956521, 0.8214285714285714),\n (1.4358974358974359, 0.82105263157894737),\n (1.4375, 0.82051282051282048),\n (1.4399999999999999, 0.81967213114754101),\n (1.4411764705882353, 0.81927710843373491),\n (1.4444444444444444, 0.81818181818181823),\n (1.4473684210526316, 0.81720430107526887),\n (1.4482758620689655, 0.81690140845070425),\n (1.45, 0.81632653061224492),\n (1.4516129032258065, 0.81578947368421051),\n (1.4545454545454546, 0.81481481481481477),\n (1.4571428571428571, 0.81395348837209303),\n (1.4583333333333333, 0.81355932203389836),\n (1.4594594594594594, 0.81318681318681318),\n (1.4615384615384615, 0.8125),\n (1.4642857142857142, 0.81159420289855078),\n (1.4666666666666666, 0.81081081081081086),\n (1.46875, 0.810126582278481),\n (1.4705882352941178, 0.80952380952380953),\n (1.4722222222222223, 0.8089887640449438),\n (1.4736842105263157, 0.80851063829787229),\n (1.4761904761904763, 0.80769230769230771),\n (1.4782608695652173, 0.80701754385964908),\n (1.48, 0.80645161290322576),\n (1.4814814814814814, 0.80597014925373134),\n (1.4827586206896552, 0.80555555555555558),\n (1.4838709677419355, 0.80519480519480524),\n (1.4848484848484849, 0.80487804878048785),\n (1.4857142857142858, 0.8045977011494253),\n (1.4864864864864864, 0.80434782608695654),\n (1.4871794871794872, 0.80412371134020622),\n (1.5, 0.80000000000000004),\n (1.5128205128205128, 0.79591836734693877),\n (1.5135135135135136, 0.79569892473118276),\n (1.5142857142857142, 0.79545454545454541),\n (1.5151515151515151, 0.79518072289156627),\n (1.5161290322580645, 0.79487179487179482),\n (1.5172413793103448, 0.79452054794520544),\n (1.5185185185185186, 0.79411764705882348),\n (1.52, 0.79365079365079361),\n (1.5217391304347827, 0.7931034482758621),\n (1.5238095238095237, 0.79245283018867929),\n (1.5263157894736843, 0.79166666666666663),\n (1.5277777777777777, 0.79120879120879117),\n (1.5294117647058822, 0.79069767441860461),\n (1.53125, 0.79012345679012341),\n (1.5333333333333334, 0.78947368421052633),\n (1.5357142857142858, 0.78873239436619713),\n (1.5384615384615385, 0.78787878787878785),\n (1.5405405405405406, 0.78723404255319152),\n (1.5416666666666667, 0.78688524590163933),\n (1.5428571428571429, 0.7865168539325843),\n (1.5454545454545454, 0.7857142857142857),\n (1.5483870967741935, 0.78481012658227844),\n (1.55, 0.78431372549019607),\n (1.5517241379310345, 0.78378378378378377),\n (1.5526315789473684, 0.78350515463917525),\n (1.5555555555555556, 0.78260869565217395),\n (1.5588235294117647, 0.7816091954022989),\n (1.5600000000000001, 0.78125),\n (1.5625, 0.78048780487804881),\n (1.5641025641025641, 0.78000000000000003),\n (1.5652173913043479, 0.77966101694915257),\n (1.5666666666666667, 0.77922077922077926),\n (1.5675675675675675, 0.77894736842105261),\n (1.5714285714285714, 0.77777777777777779),\n (1.5757575757575757, 0.77647058823529413),\n (1.5769230769230769, 0.77611940298507465),\n (1.5789473684210527, 0.77551020408163263),\n (1.5806451612903225, 0.77500000000000002),\n (1.5833333333333333, 0.77419354838709675),\n (1.5862068965517242, 0.77333333333333332),\n (1.588235294117647, 0.77272727272727271),\n (1.5897435897435896, 0.7722772277227723),\n (1.5909090909090908, 0.77192982456140347),\n (1.5925925925925926, 0.77142857142857146),\n (1.59375, 0.77108433734939763),\n (1.5945945945945945, 0.77083333333333337),\n (1.6000000000000001, 0.76923076923076927),\n (1.6052631578947369, 0.76767676767676762),\n (1.606060606060606, 0.76744186046511631),\n (1.6071428571428572, 0.76712328767123283),\n (1.6086956521739131, 0.76666666666666672),\n (1.6111111111111112, 0.76595744680851063),\n (1.6129032258064515, 0.76543209876543206),\n (1.6153846153846154, 0.76470588235294112),\n (1.6176470588235294, 0.7640449438202247),\n (1.6190476190476191, 0.76363636363636367),\n (1.6206896551724137, 0.76315789473684215),\n (1.6216216216216217, 0.76288659793814428),\n (1.625, 0.76190476190476186),\n (1.6285714285714286, 0.76086956521739135),\n (1.6296296296296295, 0.76056338028169013),\n (1.631578947368421, 0.76000000000000001),\n (1.6333333333333333, 0.759493670886076),\n (1.6363636363636365, 0.75862068965517238),\n (1.6388888888888888, 0.75789473684210529),\n (1.6399999999999999, 0.75757575757575757),\n (1.641025641025641, 0.75728155339805825),\n (1.6428571428571428, 0.7567567567567568),\n (1.6451612903225807, 0.75609756097560976),\n (1.6470588235294117, 0.75555555555555554),\n (1.6486486486486487, 0.75510204081632648),\n (1.6499999999999999, 0.75471698113207553),\n (1.6521739130434783, 0.75409836065573765),\n (1.6538461538461537, 0.75362318840579712),\n (1.6551724137931034, 0.75324675324675328),\n (1.65625, 0.75294117647058822),\n (1.6571428571428573, 0.75268817204301075),\n (1.6578947368421053, 0.75247524752475248),\n (1.6666666666666667, 0.75),\n (1.6756756756756757, 0.74747474747474751),\n (1.6764705882352942, 0.74725274725274726),\n (1.6774193548387097, 0.74698795180722888),\n (1.6785714285714286, 0.7466666666666667),\n (1.6799999999999999, 0.74626865671641796),\n (1.6818181818181819, 0.74576271186440679),\n (1.6842105263157894, 0.74509803921568629),\n (1.6857142857142857, 0.74468085106382975),\n (1.6875, 0.7441860465116279),\n (1.6896551724137931, 0.74358974358974361),\n (1.6923076923076923, 0.74285714285714288),\n (1.6944444444444444, 0.74226804123711343),\n (1.6956521739130435, 0.74193548387096775),\n (1.696969696969697, 0.7415730337078652),\n (1.7, 0.7407407407407407),\n (1.7027027027027026, 0.73999999999999999),\n (1.7037037037037037, 0.73972602739726023),\n (1.7058823529411764, 0.73913043478260865),\n (1.7083333333333333, 0.7384615384615385),\n (1.7096774193548387, 0.73809523809523814),\n (1.7105263157894737, 0.73786407766990292),\n (1.7142857142857142, 0.73684210526315785),\n (1.7179487179487178, 0.73584905660377353),\n (1.71875, 0.73563218390804597),\n (1.72, 0.73529411764705888),\n (1.7222222222222223, 0.73469387755102045),\n (1.7241379310344827, 0.73417721518987344),\n (1.7272727272727273, 0.73333333333333328),\n (1.7297297297297298, 0.73267326732673266),\n (1.7307692307692308, 0.73239436619718312),\n (1.7333333333333334, 0.73170731707317072),\n (1.7352941176470589, 0.73118279569892475),\n (1.736842105263158, 0.73076923076923073),\n (1.7391304347826086, 0.73015873015873012),\n (1.7407407407407407, 0.72972972972972971),\n (1.7419354838709677, 0.72941176470588232),\n (1.7428571428571429, 0.72916666666666663),\n (1.75, 0.72727272727272729),\n (1.7567567567567568, 0.72549019607843135),\n (1.7575757575757576, 0.72527472527472525),\n (1.7586206896551724, 0.72499999999999998),\n (1.76, 0.72463768115942029),\n (1.7619047619047619, 0.72413793103448276),\n (1.7647058823529411, 0.72340425531914898),\n (1.7666666666666666, 0.72289156626506024),\n (1.7692307692307692, 0.72222222222222221),\n (1.7714285714285714, 0.72164948453608246),\n (1.7727272727272727, 0.72131147540983609),\n (1.7741935483870968, 0.72093023255813948),\n (1.7777777777777777, 0.71999999999999997),\n (1.78125, 0.7191011235955056),\n (1.7826086956521738, 0.71875),\n (1.7857142857142858, 0.71794871794871795),\n (1.7878787878787878, 0.71739130434782605),\n (1.7894736842105263, 0.71698113207547165),\n (1.7916666666666667, 0.71641791044776115),\n (1.7931034482758621, 0.71604938271604934),\n (1.7941176470588236, 0.71578947368421053),\n (1.8, 0.7142857142857143),\n (1.8064516129032258, 0.71264367816091956),\n (1.8076923076923077, 0.71232876712328763),\n (1.8095238095238095, 0.71186440677966101),\n (1.8125, 0.71111111111111114),\n (1.8148148148148149, 0.71052631578947367),\n (1.8181818181818181, 0.70967741935483875),\n (1.8214285714285714, 0.70886075949367089),\n (1.8235294117647058, 0.70833333333333337),\n (1.826086956521739, 0.70769230769230773),\n (1.8275862068965518, 0.70731707317073167),\n (1.8333333333333333, 0.70588235294117652),\n (1.8387096774193548, 0.70454545454545459),\n (1.8400000000000001, 0.70422535211267601),\n (1.8421052631578947, 0.70370370370370372),\n (1.84375, 0.70329670329670335),\n (1.8461538461538463, 0.70270270270270274),\n (1.8484848484848484, 0.7021276595744681),\n (1.8500000000000001, 0.70175438596491224),\n (1.8518518518518519, 0.70129870129870131),\n (1.8571428571428572, 0.69999999999999996),\n (1.8620689655172413, 0.6987951807228916),\n (1.8636363636363635, 0.69841269841269837),\n (1.8666666666666667, 0.69767441860465118),\n (1.8695652173913044, 0.69696969696969702),\n (1.8709677419354838, 0.6966292134831461),\n (1.875, 0.69565217391304346),\n (1.8799999999999999, 0.69444444444444442),\n (1.8823529411764706, 0.69387755102040816),\n (1.8846153846153846, 0.69333333333333336),\n (1.8888888888888888, 0.69230769230769229),\n (1.8928571428571428, 0.69135802469135799),\n (1.8947368421052631, 0.69090909090909092),\n (1.896551724137931, 0.69047619047619047),\n (1.8999999999999999, 0.68965517241379315),\n (1.903225806451613, 0.68888888888888888),\n (1.9047619047619047, 0.68852459016393441),\n (1.9090909090909092, 0.6875),\n (1.9130434782608696, 0.68656716417910446),\n (1.9166666666666667, 0.68571428571428572),\n (1.9199999999999999, 0.68493150684931503),\n (1.9230769230769231, 0.68421052631578949),\n (1.9259259259259258, 0.68354430379746833),\n (1.9285714285714286, 0.68292682926829273),\n (1.9310344827586208, 0.68235294117647061),\n (1.9333333333333333, 0.68181818181818177),\n (1.9375, 0.68085106382978722),\n (1.9411764705882353, 0.68000000000000005),\n (1.9444444444444444, 0.67924528301886788),\n (1.9473684210526316, 0.6785714285714286),\n (1.95, 0.67796610169491522),\n (1.9523809523809523, 0.67741935483870963),\n (1.9545454545454546, 0.67692307692307696),\n (1.9565217391304348, 0.67647058823529416),\n (1.9583333333333333, 0.676056338028169),\n (1.96, 0.67567567567567566),\n (1.9615384615384615, 0.67532467532467533),\n (1.962962962962963, 0.67500000000000004),\n (1.9642857142857142, 0.67469879518072284),\n (1.9655172413793103, 0.67441860465116277),\n (2.0, 0.66666666666666663),\n (2.0370370370370372, 0.65853658536585369),\n (2.0384615384615383, 0.65822784810126578),\n (2.04, 0.65789473684210531),\n (2.0416666666666665, 0.65753424657534243),\n (2.0434782608695654, 0.65714285714285714),\n (2.0454545454545454, 0.65671641791044777),\n (2.0476190476190474, 0.65625),\n (2.0499999999999998, 0.65573770491803274),\n (2.0526315789473686, 0.65517241379310343),\n (2.0555555555555554, 0.65454545454545454),\n (2.0588235294117645, 0.65384615384615385),\n (2.0625, 0.65306122448979587),\n (2.0666666666666669, 0.65217391304347827),\n (2.0714285714285716, 0.65116279069767447),\n (2.0769230769230771, 0.65000000000000002),\n (2.0800000000000001, 0.64935064935064934),\n (2.0833333333333335, 0.64864864864864868),\n (2.0869565217391304, 0.647887323943662),\n (2.0909090909090908, 0.6470588235294118),\n (2.0952380952380953, 0.64615384615384619),\n (2.1000000000000001, 0.64516129032258063),\n (2.1052631578947367, 0.64406779661016944),\n (2.1111111111111112, 0.6428571428571429),\n (2.1176470588235294, 0.64150943396226412),\n (2.1200000000000001, 0.64102564102564108),\n (2.125, 0.64000000000000001),\n (2.1304347826086958, 0.63888888888888884),\n (2.1333333333333333, 0.63829787234042556),\n (2.1363636363636362, 0.6376811594202898),\n (2.1428571428571428, 0.63636363636363635),\n (2.1499999999999999, 0.63492063492063489),\n (2.1538461538461537, 0.63414634146341464),\n (2.1578947368421053, 0.6333333333333333),\n (2.1666666666666665, 0.63157894736842102),\n (2.1739130434782608, 0.63013698630136983),\n (2.1764705882352939, 0.62962962962962965),\n (2.1818181818181817, 0.62857142857142856),\n (2.1875, 0.62745098039215685),\n (2.1904761904761907, 0.62686567164179108),\n (2.2000000000000002, 0.625),\n (2.2105263157894739, 0.62295081967213117),\n (2.2142857142857144, 0.62222222222222223),\n (2.2173913043478262, 0.6216216216216216),\n (2.2222222222222223, 0.62068965517241381),\n (2.2272727272727271, 0.61971830985915488),\n (2.2307692307692308, 0.61904761904761907),\n (2.2352941176470589, 0.61818181818181817),\n (2.2380952380952381, 0.61764705882352944),\n (2.25, 0.61538461538461542),\n (2.263157894736842, 0.61290322580645162),\n (2.2666666666666666, 0.61224489795918369),\n (2.2727272727272729, 0.61111111111111116),\n (2.2777777777777777, 0.61016949152542377),\n (2.2857142857142856, 0.60869565217391308),\n (2.2941176470588234, 0.6071428571428571),\n (2.2999999999999998, 0.60606060606060608),\n (2.3076923076923075, 0.60465116279069764),\n (2.3125, 0.60377358490566035),\n (2.3157894736842106, 0.60317460317460314),\n (2.3333333333333335, 0.59999999999999998),\n (2.3500000000000001, 0.59701492537313428),\n (2.3529411764705883, 0.59649122807017541),\n (2.3571428571428572, 0.5957446808510638),\n (2.3636363636363638, 0.59459459459459463),\n (2.3684210526315788, 0.59375),\n (2.375, 0.59259259259259256),\n (2.3846153846153846, 0.59090909090909094),\n (2.3888888888888888, 0.5901639344262295),\n (2.3999999999999999, 0.58823529411764708),\n (2.4117647058823528, 0.58620689655172409),\n (2.4166666666666665, 0.58536585365853655),\n (2.4210526315789473, 0.58461538461538465),\n (2.4285714285714284, 0.58333333333333337),\n (2.4375, 0.58181818181818179),\n (2.4444444444444446, 0.58064516129032262),\n (2.4545454545454546, 0.57894736842105265),\n (2.4615384615384617, 0.57777777777777772),\n (2.4666666666666668, 0.57692307692307687),\n (2.4705882352941178, 0.57627118644067798),\n (2.4736842105263159, 0.5757575757575758),\n (2.5, 0.5714285714285714),\n (2.5294117647058822, 0.56666666666666665),\n (2.5333333333333332, 0.56603773584905659),\n (2.5384615384615383, 0.56521739130434778),\n (2.5454545454545454, 0.5641025641025641),\n (2.5555555555555554, 0.5625),\n (2.5625, 0.56140350877192979),\n (2.5714285714285716, 0.56000000000000005),\n (2.5833333333333335, 0.55813953488372092),\n (2.5882352941176472, 0.55737704918032782),\n (2.6000000000000001, 0.55555555555555558),\n (2.6153846153846154, 0.55319148936170215),\n (2.625, 0.55172413793103448),\n (2.6363636363636362, 0.55000000000000004),\n (2.6428571428571428, 0.5490196078431373),\n (2.6470588235294117, 0.54838709677419351),\n (2.6666666666666665, 0.54545454545454541),\n (2.6875, 0.5423728813559322),\n (2.6923076923076925, 0.54166666666666663),\n (2.7000000000000002, 0.54054054054054057),\n (2.7142857142857144, 0.53846153846153844),\n (2.7272727272727271, 0.53658536585365857),\n (2.7333333333333334, 0.5357142857142857),\n (2.75, 0.53333333333333333),\n (2.7692307692307692, 0.53061224489795922),\n (2.7777777777777777, 0.52941176470588236),\n (2.7857142857142856, 0.52830188679245282),\n (2.7999999999999998, 0.52631578947368418),\n (2.8181818181818183, 0.52380952380952384),\n (2.8333333333333335, 0.52173913043478259),\n (2.8461538461538463, 0.52000000000000002),\n (2.8571428571428572, 0.51851851851851849),\n (2.8666666666666667, 0.51724137931034486),\n (2.875, 0.5161290322580645),\n (2.8888888888888888, 0.51428571428571423),\n (2.8999999999999999, 0.51282051282051277),\n (2.9090909090909092, 0.51162790697674421),\n (2.9166666666666665, 0.51063829787234039),\n (2.9230769230769229, 0.50980392156862742),\n (2.9285714285714284, 0.50909090909090904),\n (3.0, 0.5),\n (3.0769230769230771, 0.49056603773584906),\n (3.0833333333333335, 0.48979591836734693),\n (3.0909090909090908, 0.48888888888888887),\n (3.1000000000000001, 0.48780487804878048),\n (3.1111111111111112, 0.48648648648648651),\n (3.125, 0.48484848484848486),\n (3.1428571428571428, 0.48275862068965519),\n (3.1538461538461537, 0.48148148148148145),\n (3.1666666666666665, 0.47999999999999998),\n (3.1818181818181817, 0.47826086956521741),\n (3.2000000000000002, 0.47619047619047616),\n (3.2222222222222223, 0.47368421052631576),\n (3.25, 0.47058823529411764),\n (3.2727272727272729, 0.46808510638297873),\n (3.2857142857142856, 0.46666666666666667),\n (3.2999999999999998, 0.46511627906976744),\n (3.3333333333333335, 0.46153846153846156),\n (3.3636363636363638, 0.45833333333333331),\n (3.375, 0.45714285714285713),\n (3.3999999999999999, 0.45454545454545453),\n (3.4285714285714284, 0.45161290322580644),\n (3.4444444444444446, 0.45000000000000001),\n (3.4545454545454546, 0.44897959183673469),\n (3.5, 0.44444444444444442),\n (3.5454545454545454, 0.44),\n (3.5555555555555554, 0.43902439024390244),\n (3.5714285714285716, 0.4375),\n (3.6000000000000001, 0.43478260869565216),\n (3.625, 0.43243243243243246),\n (3.6666666666666665, 0.42857142857142855),\n (3.7000000000000002, 0.42553191489361702),\n (3.7142857142857144, 0.42424242424242425),\n (3.75, 0.42105263157894735),\n (3.7777777777777777, 0.41860465116279072),\n (3.7999999999999998, 0.41666666666666669),\n (3.8333333333333335, 0.41379310344827586),\n (3.8571428571428572, 0.41176470588235292),\n (3.875, 0.41025641025641024),\n (3.8888888888888888, 0.40909090909090912),\n (4.0, 0.40000000000000002),\n (4.1111111111111107, 0.39130434782608697),\n (4.125, 0.3902439024390244),\n (4.1428571428571432, 0.3888888888888889),\n (4.166666666666667, 0.38709677419354838),\n (4.2000000000000002, 0.38461538461538464),\n (4.25, 0.38095238095238093),\n (4.2857142857142856, 0.3783783783783784),\n (4.333333333333333, 0.375),\n (4.375, 0.37209302325581395),\n (4.4000000000000004, 0.37037037037037035),\n (4.4285714285714288, 0.36842105263157893),\n (4.5, 0.36363636363636365),\n (4.5714285714285712, 0.35897435897435898),\n (4.5999999999999996, 0.35714285714285715),\n (4.666666666666667, 0.35294117647058826),\n (4.7142857142857144, 0.34999999999999998),\n (4.75, 0.34782608695652173),\n (4.7999999999999998, 0.34482758620689657),\n (4.833333333333333, 0.34285714285714286),\n (4.8571428571428568, 0.34146341463414637),\n (5.0, 0.33333333333333331),\n (5.166666666666667, 0.32432432432432434),\n (5.2000000000000002, 0.32258064516129031),\n (5.25, 0.32000000000000001),\n (5.333333333333333, 0.31578947368421051),\n (5.4000000000000004, 0.3125),\n (5.5, 0.30769230769230771),\n (5.5999999999999996, 0.30303030303030304),\n (5.666666666666667, 0.29999999999999999),\n (5.75, 0.29629629629629628),\n (5.7999999999999998, 0.29411764705882354),\n (6.0, 0.2857142857142857),\n (6.2000000000000002, 0.27777777777777779),\n (6.25, 0.27586206896551724),\n (6.333333333333333, 0.27272727272727271),\n (6.4000000000000004, 0.27027027027027029),\n (6.5, 0.26666666666666666),\n (6.5999999999999996, 0.26315789473684209),\n (6.666666666666667, 0.2608695652173913),\n (6.75, 0.25806451612903225),\n (7.0, 0.25),\n (7.25, 0.24242424242424243),\n (7.333333333333333, 0.23999999999999999),\n (7.5, 0.23529411764705882),\n (7.666666666666667, 0.23076923076923078),\n (7.75, 0.22857142857142856),\n (8.0, 0.22222222222222221),\n (8.3333333333333339, 0.21428571428571427),\n (8.5, 0.21052631578947367),\n (8.6666666666666661, 0.20689655172413793),\n (9.0, 0.20000000000000001),\n (9.3333333333333339, 0.19354838709677419),\n (9.5, 0.19047619047619047),\n (9.6666666666666661, 0.1875),\n (10.0, 0.18181818181818182),\n (10.333333333333334, 0.17647058823529413),\n (10.5, 0.17391304347826086),\n (11.0, 0.16666666666666666),\n (11.5, 0.16),\n (12.0, 0.15384615384615385),\n (12.5, 0.14814814814814814),\n (13.0, 0.14285714285714285),\n (13.5, 0.13793103448275862),\n (14.0, 0.13333333333333333),\n (14.5, 0.12903225806451613),\n (15.0, 0.125),\n (16.0, 0.11764705882352941),\n (17.0, 0.1111111111111111),\n (18.0, 0.10526315789473684),\n (19.0, 0.10000000000000001),\n (20.0, 0.095238095238095233),\n (21.0, 0.090909090909090912),\n (22.0, 0.086956521739130432),\n (23.0, 0.083333333333333329),\n (24.0, 0.080000000000000002),\n (25.0, 0.076923076923076927),\n (26.0, 0.07407407407407407),\n (27.0, 0.071428571428571425),\n (28.0, 0.068965517241379309),\n (29.0, 0.066666666666666666)]\n"
  },
  {
    "path": "thirdparty_libs/colorizer/__init__.py",
    "content": "from .initialise import init, deinit, reinit\nfrom .ansi import Fore, Back, Style\nfrom .ansitowin32 import AnsiToWin32\nfrom .termcolor import *\n\nVERSION = '0.2.5'\n\ninit()"
  },
  {
    "path": "thirdparty_libs/colorizer/ansi.py",
    "content": "'''\r\nThis module generates ANSI character codes to printing colors to terminals.\r\nSee: http://en.wikipedia.org/wiki/ANSI_escape_code\r\n'''\r\n\r\nCSI = '\\033['\r\n\r\ndef code_to_chars(code):\r\n    return CSI + str(code) + 'm'\r\n\r\nclass AnsiCodes(object):\r\n    def __init__(self, codes):\r\n        for name in dir(codes):\r\n            if not name.startswith('_'):\r\n                value = getattr(codes, name)\r\n                setattr(self, name, code_to_chars(value))\r\n\r\nclass AnsiFore:\r\n    BLACK   = 30\r\n    RED     = 31\r\n    GREEN   = 32\r\n    YELLOW  = 33\r\n    BLUE    = 34\r\n    MAGENTA = 35\r\n    CYAN    = 36\r\n    WHITE   = 37\r\n    RESET   = 39\r\n\r\nclass AnsiBack:\r\n    BLACK   = 40\r\n    RED     = 41\r\n    GREEN   = 42\r\n    YELLOW  = 43\r\n    BLUE    = 44\r\n    MAGENTA = 45\r\n    CYAN    = 46\r\n    WHITE   = 47\r\n    RESET   = 49\r\n\r\nclass AnsiStyle:\r\n    BRIGHT    = 1\r\n    DIM       = 2\r\n    NORMAL    = 22\r\n    RESET_ALL = 0\r\n\r\nFore = AnsiCodes( AnsiFore )\r\nBack = AnsiCodes( AnsiBack )\r\nStyle = AnsiCodes( AnsiStyle )\r\n\r\n"
  },
  {
    "path": "thirdparty_libs/colorizer/ansitowin32.py",
    "content": "\r\nimport re\r\nimport sys\r\n\r\nfrom .ansi import AnsiFore, AnsiBack, AnsiStyle, Style\r\nfrom .winterm import WinTerm, WinColor, WinStyle\r\nfrom .win32 import windll\r\n\r\n\r\nif windll is not None:\r\n    winterm = WinTerm()\r\n\r\n\r\ndef is_a_tty(stream):\r\n    return hasattr(stream, 'isatty') and stream.isatty()\r\n\r\n\r\nclass StreamWrapper(object):\r\n    '''\r\n    Wraps a stream (such as stdout), acting as a transparent proxy for all\r\n    attribute access apart from method 'write()', which is delegated to our\r\n    Converter instance.\r\n    '''\r\n    def __init__(self, wrapped, converter):\r\n        # double-underscore everything to prevent clashes with names of\r\n        # attributes on the wrapped stream object.\r\n        self.__wrapped = wrapped\r\n        self.__convertor = converter\r\n\r\n    def __getattr__(self, name):\r\n        return getattr(self.__wrapped, name)\r\n\r\n    def write(self, text):\r\n        self.__convertor.write(text)\r\n\r\n\r\nclass AnsiToWin32(object):\r\n    '''\r\n    Implements a 'write()' method which, on Windows, will strip ANSI character\r\n    sequences from the text, and if outputting to a tty, will convert them into\r\n    win32 function calls.\r\n    '''\r\n    ANSI_RE = re.compile('\\033\\[((?:\\d|;)*)([a-zA-Z])')\r\n\r\n    def __init__(self, wrapped, convert=None, strip=None, autoreset=False):\r\n        # The wrapped stream (normally sys.stdout or sys.stderr)\r\n        self.wrapped = wrapped\r\n\r\n        # should we reset colors to defaults after every .write()\r\n        self.autoreset = autoreset\r\n\r\n        # create the proxy wrapping our output stream\r\n        self.stream = StreamWrapper(wrapped, self)\r\n\r\n        on_windows = sys.platform.startswith('win')\r\n\r\n        # should we strip ANSI sequences from our output?\r\n        if strip is None:\r\n            strip = on_windows\r\n        self.strip = strip\r\n\r\n        # should we should convert ANSI sequences into win32 calls?\r\n        if convert is None:\r\n            convert = on_windows and is_a_tty(wrapped)\r\n        self.convert = convert\r\n\r\n        # dict of ansi codes to win32 functions and parameters\r\n        self.win32_calls = self.get_win32_calls()\r\n\r\n        # are we wrapping stderr?\r\n        self.on_stderr = self.wrapped is sys.stderr\r\n\r\n\r\n    def should_wrap(self):\r\n        '''\r\n        True if this class is actually needed. If false, then the output\r\n        stream will not be affected, nor will win32 calls be issued, so\r\n        wrapping stdout is not actually required. This will generally be\r\n        False on non-Windows platforms, unless optional functionality like\r\n        autoreset has been requested using kwargs to init()\r\n        '''\r\n        return self.convert or self.strip or self.autoreset\r\n\r\n\r\n    def get_win32_calls(self):\r\n        if self.convert and winterm:\r\n            return {\r\n                AnsiStyle.RESET_ALL: (winterm.reset_all, ),\r\n                AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT),\r\n                AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL),\r\n                AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL),\r\n                AnsiFore.BLACK: (winterm.fore, WinColor.BLACK),\r\n                AnsiFore.RED: (winterm.fore, WinColor.RED),\r\n                AnsiFore.GREEN: (winterm.fore, WinColor.GREEN),\r\n                AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW),\r\n                AnsiFore.BLUE: (winterm.fore, WinColor.BLUE),\r\n                AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA),\r\n                AnsiFore.CYAN: (winterm.fore, WinColor.CYAN),\r\n                AnsiFore.WHITE: (winterm.fore, WinColor.GREY),\r\n                AnsiFore.RESET: (winterm.fore, ),\r\n                AnsiBack.BLACK: (winterm.back, WinColor.BLACK),\r\n                AnsiBack.RED: (winterm.back, WinColor.RED),\r\n                AnsiBack.GREEN: (winterm.back, WinColor.GREEN),\r\n                AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW),\r\n                AnsiBack.BLUE: (winterm.back, WinColor.BLUE),\r\n                AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA),\r\n                AnsiBack.CYAN: (winterm.back, WinColor.CYAN),\r\n                AnsiBack.WHITE: (winterm.back, WinColor.GREY),\r\n                AnsiBack.RESET: (winterm.back, ),\r\n            }\r\n\r\n\r\n    def write(self, text):\r\n        if self.strip or self.convert:\r\n            self.write_and_convert(text)\r\n        else:\r\n            self.wrapped.write(text)\r\n            self.wrapped.flush()\r\n        if self.autoreset:\r\n            self.reset_all()\r\n\r\n\r\n    def reset_all(self):\r\n        if self.convert:\r\n            self.call_win32('m', (0,))\r\n        elif is_a_tty(self.wrapped):\r\n            self.wrapped.write(Style.RESET_ALL)\r\n\r\n\r\n    def write_and_convert(self, text):\r\n        '''\r\n        Write the given text to our wrapped stream, stripping any ANSI\r\n        sequences from the text, and optionally converting them into win32\r\n        calls.\r\n        '''\r\n        cursor = 0\r\n        for match in self.ANSI_RE.finditer(text):\r\n            start, end = match.span()\r\n            self.write_plain_text(text, cursor, start)\r\n            self.convert_ansi(*match.groups())\r\n            cursor = end\r\n        self.write_plain_text(text, cursor, len(text))\r\n\r\n\r\n    def write_plain_text(self, text, start, end):\r\n        if start < end:\r\n            self.wrapped.write(text[start:end])\r\n            self.wrapped.flush()\r\n\r\n\r\n    def convert_ansi(self, paramstring, command):\r\n        if self.convert:\r\n            params = self.extract_params(paramstring)\r\n            self.call_win32(command, params)\r\n\r\n\r\n    def extract_params(self, paramstring):\r\n        def split(paramstring):\r\n            for p in paramstring.split(';'):\r\n                if p != '':\r\n                    yield int(p)\r\n        return tuple(split(paramstring))\r\n\r\n\r\n    def call_win32(self, command, params):\r\n        if params == []:\r\n            params = [0]\r\n        if command == 'm':\r\n            for param in params:\r\n                if param in self.win32_calls:\r\n                    func_args = self.win32_calls[param]\r\n                    func = func_args[0]\r\n                    args = func_args[1:]\r\n                    kwargs = dict(on_stderr=self.on_stderr)\r\n                    func(*args, **kwargs)\r\n        elif command in ('H', 'f'): # set cursor position\r\n            func = winterm.set_cursor_position\r\n            func(params, on_stderr=self.on_stderr)\r\n        elif command in ('J'):\r\n            func = winterm.erase_data\r\n            func(params, on_stderr=self.on_stderr)\r\n        elif command == 'A':\r\n            if params == () or params == None:\r\n                num_rows = 1\r\n            else:\r\n                num_rows = params[0]\r\n            func = winterm.cursor_up\r\n            func(num_rows, on_stderr=self.on_stderr)\r\n\r\n"
  },
  {
    "path": "thirdparty_libs/colorizer/initialise.py",
    "content": "import atexit\r\nimport sys\r\n\r\nfrom .ansitowin32 import AnsiToWin32\r\n\r\n\r\norig_stdout = sys.stdout\r\norig_stderr = sys.stderr\r\n\r\nwrapped_stdout = sys.stdout\r\nwrapped_stderr = sys.stderr\r\n\r\natexit_done = False\r\n\r\n\r\ndef reset_all():\r\n    AnsiToWin32(orig_stdout).reset_all()\r\n\r\n\r\ndef init(autoreset=False, convert=None, strip=None, wrap=True):\r\n\r\n    if not wrap and any([autoreset, convert, strip]):\r\n        raise ValueError('wrap=False conflicts with any other arg=True')\r\n\r\n    global wrapped_stdout, wrapped_stderr\r\n    sys.stdout = wrapped_stdout = \\\r\n        wrap_stream(orig_stdout, convert, strip, autoreset, wrap)\r\n    sys.stderr = wrapped_stderr = \\\r\n        wrap_stream(orig_stderr, convert, strip, autoreset, wrap)\r\n\r\n    global atexit_done\r\n    if not atexit_done:\r\n        atexit.register(reset_all)\r\n        atexit_done = True\r\n\r\n\r\ndef deinit():\r\n    sys.stdout = orig_stdout\r\n    sys.stderr = orig_stderr\r\n\r\n\r\ndef reinit():\r\n    sys.stdout = wrapped_stdout\r\n    sys.stderr = wrapped_stdout\r\n\r\n\r\ndef wrap_stream(stream, convert, strip, autoreset, wrap):\r\n    if wrap:\r\n        wrapper = AnsiToWin32(stream,\r\n            convert=convert, strip=strip, autoreset=autoreset)\r\n        if wrapper.should_wrap():\r\n            stream = wrapper.stream\r\n    return stream\r\n\r\n\r\n"
  },
  {
    "path": "thirdparty_libs/colorizer/termcolor.py",
    "content": "# coding: utf-8\n# Copyright (c) 2008-2011 Volvox Development Team\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to deal\n# in the Software without restriction, including without limitation the rights\n# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n# copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n# THE SOFTWARE.\n#\n# Author: Konstantin Lepa <konstantin.lepa@gmail.com>\n\n\"\"\"ANSII Color formatting for output in terminal.\"\"\"\n\nfrom __future__ import print_function\nimport os\n\n\n__ALL__ = [ 'colored', 'cprint' ]\n\nVERSION = (1, 1, 0)\n\nATTRIBUTES = dict(\n        list(zip([\n            'bold',\n            'dark',\n            '',\n            'underline',\n            'blink',\n            '',\n            'reverse',\n            'concealed'\n            ],\n            list(range(1, 9))\n            ))\n        )\ndel ATTRIBUTES['']\n\n\nHIGHLIGHTS = dict(\n        list(zip([\n            'on_grey',\n            'on_red',\n            'on_green',\n            'on_yellow',\n            'on_blue',\n            'on_magenta',\n            'on_cyan',\n            'on_white'\n            ],\n            list(range(40, 48))\n            ))\n        )\n\n\nCOLORS = dict(\n        list(zip([\n            'grey',\n            'red',\n            'green',\n            'yellow',\n            'blue',\n            'magenta',\n            'cyan',\n            'white',\n            ],\n            list(range(30, 38))\n            ))\n        )\n\n\nRESET = '\\033[0m'\n\n\ndef colored(text, color=None, on_color=None, attrs=None):\n    \"\"\"Colorize text.\n\n    Available text colors:\n        red, green, yellow, blue, magenta, cyan, white.\n\n    Available text highlights:\n        on_red, on_green, on_yellow, on_blue, on_magenta, on_cyan, on_white.\n\n    Available attributes:\n        bold, dark, underline, blink, reverse, concealed.\n\n    Example:\n        colored('Hello, World!', 'red', 'on_grey', ['blue', 'blink'])\n        colored('Hello, World!', 'green')\n    \"\"\"\n    if os.getenv('ANSI_COLORS_DISABLED') is None:\n        fmt_str = '\\033[%dm%s'\n        if color is not None:\n            text = fmt_str % (COLORS[color], text)\n\n        if on_color is not None:\n            text = fmt_str % (HIGHLIGHTS[on_color], text)\n\n        if attrs is not None:\n            for attr in attrs:\n                text = fmt_str % (ATTRIBUTES[attr], text)\n\n        text += RESET\n    return text\n\n\ndef cprint(text, color=None, on_color=None, attrs=None, **kwargs):\n    \"\"\"Print colorize text.\n\n    It accepts arguments of print function.\n    \"\"\"\n\n    print((colored(text, color, on_color, attrs)), **kwargs)\n\n\nif __name__ == '__main__':\n    print('Current terminal type: %s' % os.getenv('TERM'))\n    print('Test basic colors:')\n    cprint('Grey color', 'grey')\n    cprint('Red color', 'red')\n    cprint('Green color', 'green')\n    cprint('Yellow color', 'yellow')\n    cprint('Blue color', 'blue')\n    cprint('Magenta color', 'magenta')\n    cprint('Cyan color', 'cyan')\n    cprint('White color', 'white')\n    print(('-' * 78))\n\n    print('Test highlights:')\n    cprint('On grey color', on_color='on_grey')\n    cprint('On red color', on_color='on_red')\n    cprint('On green color', on_color='on_green')\n    cprint('On yellow color', on_color='on_yellow')\n    cprint('On blue color', on_color='on_blue')\n    cprint('On magenta color', on_color='on_magenta')\n    cprint('On cyan color', on_color='on_cyan')\n    cprint('On white color', color='grey', on_color='on_white')\n    print('-' * 78)\n\n    print('Test attributes:')\n    cprint('Bold grey color', 'grey', attrs=['bold'])\n    cprint('Dark red color', 'red', attrs=['dark'])\n    cprint('Underline green color', 'green', attrs=['underline'])\n    cprint('Blink yellow color', 'yellow', attrs=['blink'])\n    cprint('Reversed blue color', 'blue', attrs=['reverse'])\n    cprint('Concealed Magenta color', 'magenta', attrs=['concealed'])\n    cprint('Bold underline reverse cyan color', 'cyan',\n            attrs=['bold', 'underline', 'reverse'])\n    cprint('Dark blink concealed white color', 'white',\n            attrs=['dark', 'blink', 'concealed'])\n    print(('-' * 78))\n\n    print('Test mixing:')\n    cprint('Underline red on grey color', 'red', 'on_grey',\n            ['underline'])\n    cprint('Reversed green on red color', 'green', 'on_red', ['reverse'])\n\n"
  },
  {
    "path": "thirdparty_libs/colorizer/win32.py",
    "content": "\r\n# from winbase.h\r\nSTDOUT = -11\r\nSTDERR = -12\r\n\r\ntry:\r\n    from ctypes import windll\r\nexcept ImportError:\r\n    windll = None\r\n    SetConsoleTextAttribute = lambda *_: None\r\nelse:\r\n    from ctypes import (\r\n        byref, Structure, c_char, c_short, c_uint32, c_ushort\r\n    )\r\n\r\n    handles = {\r\n        STDOUT: windll.kernel32.GetStdHandle(STDOUT),\r\n        STDERR: windll.kernel32.GetStdHandle(STDERR),\r\n    }\r\n\r\n    SHORT = c_short\r\n    WORD = c_ushort\r\n    DWORD = c_uint32\r\n    TCHAR = c_char\r\n\r\n    class COORD(Structure):\r\n        \"\"\"struct in wincon.h\"\"\"\r\n        _fields_ = [\r\n            ('X', SHORT),\r\n            ('Y', SHORT),\r\n        ]\r\n\r\n    class  SMALL_RECT(Structure):\r\n        \"\"\"struct in wincon.h.\"\"\"\r\n        _fields_ = [\r\n            (\"Left\", SHORT),\r\n            (\"Top\", SHORT),\r\n            (\"Right\", SHORT),\r\n            (\"Bottom\", SHORT),\r\n        ]\r\n\r\n    class CONSOLE_SCREEN_BUFFER_INFO(Structure):\r\n        \"\"\"struct in wincon.h.\"\"\"\r\n        _fields_ = [\r\n            (\"dwSize\", COORD),\r\n            (\"dwCursorPosition\", COORD),\r\n            (\"wAttributes\", WORD),\r\n            (\"srWindow\", SMALL_RECT),\r\n            (\"dwMaximumWindowSize\", COORD),\r\n        ]\r\n        def __str__(self):\r\n            return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % (\r\n                self.dwSize.Y, self.dwSize.X\r\n                , self.dwCursorPosition.Y, self.dwCursorPosition.X\r\n                , self.wAttributes\r\n                , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right\r\n                , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X\r\n            )\r\n\r\n    def GetConsoleScreenBufferInfo(stream_id=STDOUT):\r\n        handle = handles[stream_id]\r\n        csbi = CONSOLE_SCREEN_BUFFER_INFO()\r\n        success = windll.kernel32.GetConsoleScreenBufferInfo(\r\n            handle, byref(csbi))\r\n        return csbi\r\n\r\n\r\n    def SetConsoleTextAttribute(stream_id, attrs):\r\n        handle = handles[stream_id]\r\n        return windll.kernel32.SetConsoleTextAttribute(handle, attrs)\r\n\r\n\r\n    def SetConsoleCursorPosition(stream_id, position):\r\n        position = COORD(*position)\r\n        # If the position is out of range, do nothing.\r\n        if position.Y <= 0 or position.X <= 0:\r\n            return\r\n        # Adjust for Windows' SetConsoleCursorPosition:\r\n        #    1. being 0-based, while ANSI is 1-based.\r\n        #    2. expecting (x,y), while ANSI uses (y,x).\r\n        adjusted_position = COORD(position.Y - 1, position.X - 1)\r\n        # Adjust for viewport's scroll position\r\n        sr = GetConsoleScreenBufferInfo(STDOUT).srWindow\r\n        adjusted_position.Y += sr.Top\r\n        adjusted_position.X += sr.Left\r\n        # Resume normal processing\r\n        handle = handles[stream_id]\r\n        return windll.kernel32.SetConsoleCursorPosition(handle, adjusted_position)\r\n\r\n    def FillConsoleOutputCharacter(stream_id, char, length, start):\r\n        handle = handles[stream_id]\r\n        char = TCHAR(char)\r\n        length = DWORD(length)\r\n        num_written = DWORD(0)\r\n        # Note that this is hard-coded for ANSI (vs wide) bytes.\r\n        success = windll.kernel32.FillConsoleOutputCharacterA(\r\n            handle, char, length, start, byref(num_written))\r\n        return num_written.value\r\n\r\n    def FillConsoleOutputAttribute(stream_id, attr, length, start):\r\n        ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )'''\r\n        handle = handles[stream_id]\r\n        attribute = WORD(attr)\r\n        length = DWORD(length)\r\n        num_written = DWORD(0)\r\n        # Note that this is hard-coded for ANSI (vs wide) bytes.\r\n        return windll.kernel32.FillConsoleOutputAttribute(\r\n            handle, attribute, length, start, byref(num_written))\r\n\r\n"
  },
  {
    "path": "thirdparty_libs/colorizer/winterm.py",
    "content": "\r\nfrom . import win32\r\n\r\n\r\n# from wincon.h\r\nclass WinColor(object):\r\n    BLACK   = 0\r\n    BLUE    = 1\r\n    GREEN   = 2\r\n    CYAN    = 3\r\n    RED     = 4\r\n    MAGENTA = 5\r\n    YELLOW  = 6\r\n    GREY    = 7\r\n\r\n# from wincon.h\r\nclass WinStyle(object):\r\n    NORMAL = 0x00 # dim text, dim background\r\n    BRIGHT = 0x08 # bright text, dim background\r\n\r\n\r\nclass WinTerm(object):\r\n\r\n    def __init__(self):\r\n        self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes\r\n        self.set_attrs(self._default)\r\n        self._default_fore = self._fore\r\n        self._default_back = self._back\r\n        self._default_style = self._style\r\n\r\n    def get_attrs(self):\r\n        return self._fore + self._back * 16 + self._style\r\n\r\n    def set_attrs(self, value):\r\n        self._fore = value & 7\r\n        self._back = (value >> 4) & 7\r\n        self._style = value & WinStyle.BRIGHT\r\n\r\n    def reset_all(self, on_stderr=None):\r\n        self.set_attrs(self._default)\r\n        self.set_console(attrs=self._default)\r\n\r\n    def fore(self, fore=None, on_stderr=False):\r\n        if fore is None:\r\n            fore = self._default_fore\r\n        self._fore = fore\r\n        self.set_console(on_stderr=on_stderr)\r\n\r\n    def back(self, back=None, on_stderr=False):\r\n        if back is None:\r\n            back = self._default_back\r\n        self._back = back\r\n        self.set_console(on_stderr=on_stderr)\r\n\r\n    def style(self, style=None, on_stderr=False):\r\n        if style is None:\r\n            style = self._default_style\r\n        self._style = style\r\n        self.set_console(on_stderr=on_stderr)\r\n\r\n    def set_console(self, attrs=None, on_stderr=False):\r\n        if attrs is None:\r\n            attrs = self.get_attrs()\r\n        handle = win32.STDOUT\r\n        if on_stderr:\r\n            handle = win32.STDERR\r\n        win32.SetConsoleTextAttribute(handle, attrs)\r\n\r\n    def get_position(self, handle):\r\n        position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition\r\n        # Because Windows coordinates are 0-based,\r\n        # and win32.SetConsoleCursorPosition expects 1-based.\r\n        position.X += 1\r\n        position.Y += 1\r\n        return position\r\n    \r\n    def set_cursor_position(self, position=None, on_stderr=False):\r\n        if position is None:\r\n            #I'm not currently tracking the position, so there is no default.\r\n            #position = self.get_position()\r\n            return\r\n        handle = win32.STDOUT\r\n        if on_stderr:\r\n            handle = win32.STDERR\r\n        win32.SetConsoleCursorPosition(handle, position)\r\n\r\n    def cursor_up(self, num_rows=0, on_stderr=False):\r\n        if num_rows == 0:\r\n            return\r\n        handle = win32.STDOUT\r\n        if on_stderr:\r\n            handle = win32.STDERR\r\n        position = self.get_position(handle)\r\n        adjusted_position = (position.Y - num_rows, position.X)\r\n        self.set_cursor_position(adjusted_position, on_stderr)\r\n\r\n    def erase_data(self, mode=0, on_stderr=False):\r\n        # 0 (or None) should clear from the cursor to the end of the screen.\r\n        # 1 should clear from the cursor to the beginning of the screen.\r\n        # 2 should clear the entire screen. (And maybe move cursor to (1,1)?)\r\n        #\r\n        # At the moment, I only support mode 2. From looking at the API, it\r\n        #    should be possible to calculate a different number of bytes to clear,\r\n        #    and to do so relative to the cursor position.\r\n        if mode[0] not in (2,):\r\n            return\r\n        handle = win32.STDOUT\r\n        if on_stderr:\r\n            handle = win32.STDERR\r\n        # here's where we'll home the cursor\r\n        coord_screen = win32.COORD(0,0)\r\n        csbi = win32.GetConsoleScreenBufferInfo(handle)\r\n        # get the number of character cells in the current buffer\r\n        dw_con_size = csbi.dwSize.X * csbi.dwSize.Y\r\n        # fill the entire screen with blanks\r\n        win32.FillConsoleOutputCharacter(handle, ' ', dw_con_size, coord_screen)\r\n        # now set the buffer's attributes accordingly\r\n        win32.FillConsoleOutputAttribute(handle, self.get_attrs(), dw_con_size, coord_screen );\r\n        # put the cursor at (0, 0)\r\n        win32.SetConsoleCursorPosition(handle, (coord_screen.X, coord_screen.Y))\r\n"
  },
  {
    "path": "thirdparty_libs/oset/LICENSE.txt",
    "content": "License\n=======\n\nCopyright (c) 2009, Raymond Hettinger, and others\nAll rights reserved.\n\nPackage structured based on the one developed to odict\nCopyright (c) 2010, BlueDynamics Alliance, Austria\n\n\n* Redistributions of source code must retain the above copyright notice, this \n  list of conditions and the following disclaimer.\n* Redistributions in binary form must reproduce the above copyright notice, this \n  list of conditions and the following disclaimer in the documentation and/or \n  other materials provided with the distribution.\n* Neither the name of the BlueDynamics Alliance nor the names of its \n  contributors may be used to endorse or promote products derived from this \n  software without specific prior written permission.\n      \nTHIS SOFTWARE IS PROVIDED BY BlueDynamics Alliance ``AS IS`` AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL BlueDynamics Alliance BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "thirdparty_libs/oset/__init__.py",
    "content": "\"\"\"Main Ordered Set module \"\"\"\n\nfrom pyoset import oset\n"
  },
  {
    "path": "thirdparty_libs/oset/_abc.py",
    "content": "#!/usr/bin/env python\n# -*- mode:python; tab-width: 2; coding: utf-8 -*-\n\n\"\"\"Partially backported python ABC classes\"\"\"\n\nfrom __future__ import absolute_import\n\nimport sys\nimport types\n\nif sys.version_info > (2, 6):\n    raise ImportError(\"Use native ABC classes istead of this one.\")\n\n\n# Instance of old-style class\nclass _C:\n    pass\n\n_InstanceType = type(_C())\n\n\ndef abstractmethod(funcobj):\n    \"\"\"A decorator indicating abstract methods.\n\n    Requires that the metaclass is ABCMeta or derived from it.  A\n    class that has a metaclass derived from ABCMeta cannot be\n    instantiated unless all of its abstract methods are overridden.\n    The abstract methods can be called using any of the normal\n    'super' call mechanisms.\n\n    Usage:\n\n        class C:\n            __metaclass__ = ABCMeta\n            @abstractmethod\n            def my_abstract_method(self, ...):\n                ...\n    \"\"\"\n    funcobj.__isabstractmethod__ = True\n    return funcobj\n\n\nclass ABCMeta(type):\n\n    \"\"\"Metaclass for defining Abstract Base Classes (ABCs).\n\n    Use this metaclass to create an ABC.  An ABC can be subclassed\n    directly, and then acts as a mix-in class.  You can also register\n    unrelated concrete classes (even built-in classes) and unrelated\n    ABCs as 'virtual subclasses' -- these and their descendants will\n    be considered subclasses of the registering ABC by the built-in\n    issubclass() function, but the registering ABC won't show up in\n    their MRO (Method Resolution Order) nor will method\n    implementations defined by the registering ABC be callable (not\n    even via super()).\n\n    \"\"\"\n\n    # A global counter that is incremented each time a class is\n    # registered as a virtual subclass of anything.  It forces the\n    # negative cache to be cleared before its next use.\n    _abc_invalidation_counter = 0\n\n    def __new__(mcls, name, bases, namespace):\n        cls = super(ABCMeta, mcls).__new__(mcls, name, bases, namespace)\n        # Compute set of abstract method names\n        abstracts = set(name\n                     for name, value in namespace.items()\n                     if getattr(value, \"__isabstractmethod__\", False))\n        for base in bases:\n            for name in getattr(base, \"__abstractmethods__\", set()):\n                value = getattr(cls, name, None)\n                if getattr(value, \"__isabstractmethod__\", False):\n                    abstracts.add(name)\n        cls.__abstractmethods__ = frozenset(abstracts)\n        # Set up inheritance registry\n        cls._abc_registry = set()\n        cls._abc_cache = set()\n        cls._abc_negative_cache = set()\n        cls._abc_negative_cache_version = ABCMeta._abc_invalidation_counter\n        return cls\n\n    def register(cls, subclass):\n        \"\"\"Register a virtual subclass of an ABC.\"\"\"\n        if not isinstance(subclass, (type, types.ClassType)):\n            raise TypeError(\"Can only register classes\")\n        if issubclass(subclass, cls):\n            return  # Already a subclass\n        # Subtle: test for cycles *after* testing for \"already a subclass\";\n        # this means we allow X.register(X) and interpret it as a no-op.\n        if issubclass(cls, subclass):\n            # This would create a cycle, which is bad for the algorithm below\n            raise RuntimeError(\"Refusing to create an inheritance cycle\")\n        cls._abc_registry.add(subclass)\n        ABCMeta._abc_invalidation_counter += 1  # Invalidate negative cache\n\n    def _dump_registry(cls, file=None):\n        \"\"\"Debug helper to print the ABC registry.\"\"\"\n        print >> file, \"Class: %s.%s\" % (cls.__module__, cls.__name__)\n        print >> file, \"Inv.counter: %s\" % ABCMeta._abc_invalidation_counter\n        for name in sorted(cls.__dict__.keys()):\n            if name.startswith(\"_abc_\"):\n                value = getattr(cls, name)\n                print >> file, \"%s: %r\" % (name, value)\n\n    def __instancecheck__(cls, instance):\n        \"\"\"Override for isinstance(instance, cls).\"\"\"\n        # Inline the cache checking when it's simple.\n        subclass = getattr(instance, '__class__', None)\n        if subclass in cls._abc_cache:\n            return True\n        subtype = type(instance)\n        # Old-style instances\n        if subtype is _InstanceType:\n            subtype = subclass\n        if subtype is subclass or subclass is None:\n            if (cls._abc_negative_cache_version ==\n                ABCMeta._abc_invalidation_counter and\n                subtype in cls._abc_negative_cache):\n                return False\n            # Fall back to the subclass check.\n            return cls.__subclasscheck__(subtype)\n        return (cls.__subclasscheck__(subclass) or\n                cls.__subclasscheck__(subtype))\n\n    def __subclasscheck__(cls, subclass):\n        \"\"\"Override for issubclass(subclass, cls).\"\"\"\n        # Check cache\n        if subclass in cls._abc_cache:\n            return True\n        # Check negative cache; may have to invalidate\n        if cls._abc_negative_cache_version < ABCMeta._abc_invalidation_counter:\n            # Invalidate the negative cache\n            cls._abc_negative_cache = set()\n            cls._abc_negative_cache_version = ABCMeta._abc_invalidation_counter\n        elif subclass in cls._abc_negative_cache:\n            return False\n        # Check the subclass hook\n        ok = cls.__subclasshook__(subclass)\n        if ok is not NotImplemented:\n            assert isinstance(ok, bool)\n            if ok:\n                cls._abc_cache.add(subclass)\n            else:\n                cls._abc_negative_cache.add(subclass)\n            return ok\n        # Check if it's a direct subclass\n        if cls in getattr(subclass, '__mro__', ()):\n            cls._abc_cache.add(subclass)\n            return True\n        # Check if it's a subclass of a registered class (recursive)\n        for rcls in cls._abc_registry:\n            if issubclass(subclass, rcls):\n                cls._abc_cache.add(subclass)\n                return True\n        # Check if it's a subclass of a subclass (recursive)\n        for scls in cls.__subclasses__():\n            if issubclass(subclass, scls):\n                cls._abc_cache.add(subclass)\n                return True\n        # No dice; update negative cache\n        cls._abc_negative_cache.add(subclass)\n        return False\n\n\ndef _hasattr(C, attr):\n    try:\n        return any(attr in B.__dict__ for B in C.__mro__)\n    except AttributeError:\n        # Old-style class\n        return hasattr(C, attr)\n\n\nclass Sized:\n    __metaclass__ = ABCMeta\n\n    @abstractmethod\n    def __len__(self):\n        return 0\n\n    @classmethod\n    def __subclasshook__(cls, C):\n        if cls is Sized:\n            if _hasattr(C, \"__len__\"):\n                return True\n        return NotImplemented\n\n\nclass Container:\n    __metaclass__ = ABCMeta\n\n    @abstractmethod\n    def __contains__(self, x):\n        return False\n\n    @classmethod\n    def __subclasshook__(cls, C):\n        if cls is Container:\n            if _hasattr(C, \"__contains__\"):\n                return True\n        return NotImplemented\n\n\nclass Iterable:\n    __metaclass__ = ABCMeta\n\n    @abstractmethod\n    def __iter__(self):\n        while False:\n            yield None\n\n    @classmethod\n    def __subclasshook__(cls, C):\n        if cls is Iterable:\n            if _hasattr(C, \"__iter__\"):\n                return True\n        return NotImplemented\n\nIterable.register(str)\n\n\nclass Set(Sized, Iterable, Container):\n    \"\"\"A set is a finite, iterable container.\n\n    This class provides concrete generic implementations of all\n    methods except for __contains__, __iter__ and __len__.\n\n    To override the comparisons (presumably for speed, as the\n    semantics are fixed), all you have to do is redefine __le__ and\n    then the other operations will automatically follow suit.\n    \"\"\"\n\n    def __le__(self, other):\n        if not isinstance(other, Set):\n            return NotImplemented\n        if len(self) > len(other):\n            return False\n        for elem in self:\n            if elem not in other:\n                return False\n        return True\n\n    def __lt__(self, other):\n        if not isinstance(other, Set):\n            return NotImplemented\n        return len(self) < len(other) and self.__le__(other)\n\n    def __gt__(self, other):\n        if not isinstance(other, Set):\n            return NotImplemented\n        return other < self\n\n    def __ge__(self, other):\n        if not isinstance(other, Set):\n            return NotImplemented\n        return other <= self\n\n    def __eq__(self, other):\n        if not isinstance(other, Set):\n            return NotImplemented\n        return len(self) == len(other) and self.__le__(other)\n\n    def __ne__(self, other):\n        return not (self == other)\n\n    @classmethod\n    def _from_iterable(cls, it):\n        '''Construct an instance of the class from any iterable input.\n\n        Must override this method if the class constructor signature\n        does not accept an iterable for an input.\n        '''\n        return cls(it)\n\n    def __and__(self, other):\n        if not isinstance(other, Iterable):\n            return NotImplemented\n        return self._from_iterable(value for value in other if value in self)\n\n    def isdisjoint(self, other):\n        for value in other:\n            if value in self:\n                return False\n        return True\n\n    def __or__(self, other):\n        if not isinstance(other, Iterable):\n            return NotImplemented\n        chain = (e for s in (self, other) for e in s)\n        return self._from_iterable(chain)\n\n    def __sub__(self, other):\n        if not isinstance(other, Set):\n            if not isinstance(other, Iterable):\n                return NotImplemented\n            other = self._from_iterable(other)\n        return self._from_iterable(value for value in self\n                                   if value not in other)\n\n    def __xor__(self, other):\n        if not isinstance(other, Set):\n            if not isinstance(other, Iterable):\n                return NotImplemented\n            other = self._from_iterable(other)\n        return (self - other) | (other - self)\n\n    # Sets are not hashable by default, but subclasses can change this\n    __hash__ = None\n\n    def _hash(self):\n        \"\"\"Compute the hash value of a set.\n\n        Note that we don't define __hash__: not all sets are hashable.\n        But if you define a hashable set type, its __hash__ should\n        call this function.\n\n        This must be compatible __eq__.\n\n        All sets ought to compare equal if they contain the same\n        elements, regardless of how they are implemented, and\n        regardless of the order of the elements; so there's not much\n        freedom for __eq__ or __hash__.  We match the algorithm used\n        by the built-in frozenset type.\n        \"\"\"\n        MAX = sys.maxint\n        MASK = 2 * MAX + 1\n        n = len(self)\n        h = 1927868237 * (n + 1)\n        h &= MASK\n        for x in self:\n            hx = hash(x)\n            h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167\n            h &= MASK\n        h = h * 69069 + 907133923\n        h &= MASK\n        if h > MAX:\n            h -= MASK + 1\n        if h == -1:\n            h = 590923713\n        return h\n\nSet.register(frozenset)\n\n\nclass MutableSet(Set):\n\n    @abstractmethod\n    def add(self, value):\n        \"\"\"Add an element.\"\"\"\n        raise NotImplementedError\n\n    @abstractmethod\n    def discard(self, value):\n        \"\"\"Remove an element.  Do not raise an exception if absent.\"\"\"\n        raise NotImplementedError\n\n    def remove(self, value):\n        \"\"\"Remove an element. If not a member, raise a KeyError.\"\"\"\n        if value not in self:\n            raise KeyError(value)\n        self.discard(value)\n\n    def pop(self):\n        \"\"\"Return the popped value.  Raise KeyError if empty.\"\"\"\n        it = iter(self)\n        try:\n            value = it.next()\n        except StopIteration:\n            raise KeyError\n        self.discard(value)\n        return value\n\n    def clear(self):\n        \"\"\"This is slow (creates N new iterators!) but effective.\"\"\"\n        try:\n            while True:\n                self.pop()\n        except KeyError:\n            pass\n\n    def __ior__(self, it):\n        for value in it:\n            self.add(value)\n        return self\n\n    def __iand__(self, it):\n        for value in (self - it):\n            self.discard(value)\n        return self\n\n    def __ixor__(self, it):\n        if not isinstance(it, Set):\n            it = self._from_iterable(it)\n        for value in it:\n            if value in self:\n                self.discard(value)\n            else:\n                self.add(value)\n        return self\n\n    def __isub__(self, it):\n        for value in it:\n            self.discard(value)\n        return self\n\nMutableSet.register(set)\n\n\nclass OrderedSet(MutableSet):\n\n    def __init__(self, iterable=None):\n        self.end = end = []\n        end += [None, end, end]         # sentinel node for doubly linked list\n        self.map = {}                   # key --> [key, prev, next]\n        if iterable is not None:\n            self |= iterable\n\n    def __len__(self):\n        return len(self.map)\n\n    def __contains__(self, key):\n        return key in self.map\n\n    def __getitem__(self, key):\n        return list(self)[key]\n\n    def add(self, key):\n        if key not in self.map:\n            end = self.end\n            curr = end[PREV]\n            curr[NEXT] = end[PREV] = self.map[key] = [key, curr, end]\n\n    def discard(self, key):\n        if key in self.map:\n            key, prev, next = self.map.pop(key)\n            prev[NEXT] = next\n            next[PREV] = prev\n\n    def __iter__(self):\n        end = self.end\n        curr = end[NEXT]\n        while curr is not end:\n            yield curr[KEY]\n            curr = curr[NEXT]\n\n    def __reversed__(self):\n        end = self.end\n        curr = end[PREV]\n        while curr is not end:\n            yield curr[KEY]\n            curr = curr[PREV]\n\n    def pop(self, last=True):\n        if not self:\n            raise KeyError('set is empty')\n        key = reversed(self).next() if last else iter(self).next()\n        self.discard(key)\n        return key\n\n    def __repr__(self):\n        if not self:\n            return '%s()' % (self.__class__.__name__,)\n        return '%s(%r)' % (self.__class__.__name__, list(self))\n\n    def __eq__(self, other):\n        if isinstance(other, OrderedSet):\n            return len(self) == len(other) and list(self) == list(other)\n        return set(self) == set(other)\n\n    def __del__(self):\n        if all([KEY, PREV, NEXT]):\n            self.clear()                    # remove circular references\n\nif __name__ == '__main__':\n    print(OrderedSet('abracadaba'))\n    print(OrderedSet('simsalabim'))\n"
  },
  {
    "path": "thirdparty_libs/oset/pyoset.py",
    "content": "#!/usr/bin/env python\n# -*- mode:python; tab-width: 2; coding: utf-8 -*-\n\n\"\"\"Partially backported python ABC classes\"\"\"\n\nfrom __future__ import absolute_import\n\ntry:\n    from collections import MutableSet\nexcept ImportError:\n    # Running in Python <= 2.5\n    from ._abc import MutableSet\n\n\nKEY, PREV, NEXT = range(3)\n\n\nclass OrderedSet(MutableSet):\n\n    def __init__(self, iterable=None):\n        self.end = end = []\n        end += [None, end, end]         # sentinel node for doubly linked list\n        self.map = {}                   # key --> [key, prev, next]\n        if iterable is not None:\n            self |= iterable\n\n    def __len__(self):\n        return len(self.map)\n\n    def __contains__(self, key):\n        return key in self.map\n\n    def __getitem__(self, key):\n        return list(self)[key]\n\n    def add(self, key):\n        if key not in self.map:\n            end = self.end\n            curr = end[PREV]\n            curr[NEXT] = end[PREV] = self.map[key] = [key, curr, end]\n\n    def discard(self, key):\n        if key in self.map:\n            key, prev, next = self.map.pop(key)\n            prev[NEXT] = next\n            next[PREV] = prev\n\n    def __iter__(self):\n        end = self.end\n        curr = end[NEXT]\n        while curr is not end:\n            yield curr[KEY]\n            curr = curr[NEXT]\n\n    def __reversed__(self):\n        end = self.end\n        curr = end[PREV]\n        while curr is not end:\n            yield curr[KEY]\n            curr = curr[PREV]\n\n    def pop(self, last=True):\n        if not self:\n            raise KeyError('set is empty')\n        key = reversed(self).next() if last else iter(self).next()\n        self.discard(key)\n        return key\n\n    def __repr__(self):\n        if not self:\n            return '%s()' % (self.__class__.__name__,)\n        return '%s(%r)' % (self.__class__.__name__, list(self))\n\n    def __eq__(self, other):\n        if isinstance(other, OrderedSet):\n            return len(self) == len(other) and list(self) == list(other)\n        return set(self) == set(other)\n\n    def __del__(self):\n        if all([KEY, PREV, NEXT]):\n            self.clear()                    # remove circular references\n\noset = OrderedSet\n"
  },
  {
    "path": "thirdparty_libs/prettytable/CHANGELOG",
    "content": "########## PrettyTable 0.7 - Feb 17, 2013 ###########\n\n* Improved Python 2 and 3 compatibility (2.4-3.2).\n* Improved support for non-Latin characters.  Table widths should\n  now be calculated correctly for tables with e.g. Japanese text.\n* Table contents can now be read in from a .csv file\n* Table contents can now be read in from a DB-API compatible cursor\n* Table contents can now be read in from a string containing a\n  HTML table (thanks to Christoph Robbert for submitting this patch!)\n* new valign attribute controls vertical alignment of text when\n  some cells in a row have multiple lines of text and others don't.\n  (thanks to Google Code user maartendb for submitting this patch!)\n* hrules attribute can now be set to HEADER, which draws a rule only\n  under the header row\n* new vrules attribute controls drawing of vertical rules and can\n  be set to FRAME, ALL or NONE\n* new header_style attribute controls formatting of text in table\n  headers and can be set to \"cap\", \"title\", \"upper\", \"lower\" or None\n* Fixed a simple bug regarding validation of max_width (thanks to\n  Anthony Toole for pointing out this bug and providing a patch).\n* Fixed a simple bug regarding initialisation of int_format value\n  for new tables (thanks to Ingo Schmiegel for pointing out this\n  bug!)\n* Fixed a bug regarding some constructor keywords, such as \"border\",\n  being ignored (thanks to Google Code user antonio.s.messina for\n  reporting this bug).\n\n########## PrettyTable 0.6 - May 5, 2012 ##########\n\n* Code is now simultaneously compatible with Python 2 and 3\n* Replaced all setter methods with managed attributes\n* All styling options can now be set persistently as managed attributes\n* Added \"add_style\" method to make setting style options easily\n* Added \"del_row\", \"clear_rows\" and \"clear\" methods to facilitate\n  removal of data from table.\n* Added \"copy\" method to facilitate cloning of a table.\n* Removed caching functionality, which added complexity and fragility\n  for relatively little gain\n* Removed methods that just printed strings produced by get_string and\n  get_html_string - just use inbuilt print!\n* Improved unicode support (thanks to Google Code user ru.w31rd0 for\n  patch!)\n* Added support for decimal and floating point number formatting\n  support (thanks to Google Code user willfurnass for the suggestion!)\n* Added support for using a custom key sorting methods (thanks to\n  Google Code user amannijhawan for the suggestion!)\n* Added support for line breaks in data (suggested and implemented by\n  Klein Stephane)\n* Added support for max column widths (thanks to Tibor Arpas for the\n  suggestion!)\n* Fixed table slicing\n* Fixed bug where closing <tr/> tags in HTML tables were not printed\n  (thanks to Google Code user kehander for reporting this bug!)\n* Fixed HTML table sorting bug (thanks to Google Code user dougbeal\n  for reporting this bug!)\n* Fixed bug whereby changing field_names did not recompute widths\n  (thanks to Google Code user denilsonsa for reporting this bug!)\n\n########## PrettyTable 0.5 - May 26, 2009 ##########\n\n* Fixed a bug whereby printing with headers=False and border=False \n  would introduce an extraneous newline. Thanks to Alexander Lamaison \n  for reporting this bug. \n* When printing with headers=False, column widths will now be reduced \n  as appropriate in columns where the field name is wider than the \n  data. Thanks to Alexander Lamaison for suggesting this behaviour. \n* Support for Unicode has improved. Thanks to Chris Clark for \n  submitting this improvement. \n* The value of the \"border\" argument now correctly controls the \n  presence of a border when printing HTML tables with print_html or \n  get_html_string, instead of being incorrectly ignored. Thanks to \n  Chris Clark for fixing this. \n* The print_html and get_html_string methods now accept an \n  \"attributes\" argument which is a dictionary of name/value pairs to be \n  placed inside the <table> tag (so you can, e.g. set class, name or id \n  values in order to style your table with CSS). Thanks to Chris Clark \n  for submitting this feature. \n* The print_html and get_html_string methods now, by default, do their \n  best to match the various formatting options in their HTML output. \n  They use inline CSS to adjust the alignment of data in columns, the \n  padding widths of columns and in some cases the border settings. You \n  can give either method a \"format=False\" attribute to turn this \n  behaviour off if you want to do your own styling. With \"format=False\" \n  the methods print a \"bare bones\" table, similar to the default \n  behaviour in 0.4.\n\n########## PrettyTable 0.4 - May 13, 2009 ##########\n\n* Added \"add_column\" method to enable building tables up column-by-column.\n* Added \"print_HTML\" and \"get_HTML_string\" methods to enable HTML table\n  production.\n* Added \"set_border_chars\" method to enable control over characters used to\n  draw the table border.\n* Added \"set_left_padding\" and \"set_right_padding\" methods to allow\n  independent padding control for both sides of a column.\n* Added \"sortby\" option to enable column sorting.\n* Added \"header\" option to enable switching off field name printing at top of\n  table.\n* Modified \"hrules\" option to enable greater control over presence of\n  horizontal lines.\n* Added \"border\" option to enable switching off all line printing.\n\nThanks to Tim Cera, Chris Clark, Alexander Lamaison for suggesting and helping\nto test many of the new features in this release.\n\n########## PrettyTable 0.3 - May 01, 2009 ##########\n\n* Added \"padding_width\" option to control the number of spaces between the\n  vertical line rules at the edges of a column and its content.  This can be\n  set as a keyword argument to the constructor or after instantiation using\n  the \"set_padding_width\" method.  The value is set to 1 by defaut.  If your\n  table is too wide for a small screen with this value, setting it to 0 might\n  help you squeeze it in.\n\nThanks to Chris Clark for contributing a patch against 0.2.1 to add this\nfeature!\n\n########## PrettyTable 0.2.1 - April 29, 2009 ##########\n\n* Caching no longer breaks when using the \"printt(fields=[...])\" syntax.  The\n  list of fields was not hashable and hence could not be used as a dictionary\n  key.  I fixed this using the output of the \"cPickle\" module's \"dumps\"\n  function as the dictionary key instead.\n* Horizontal lines are now the appropriate length when the above syntax is\n  used.\n\nThanks to Julien Koesten for reporting these bugs and testing the fixes almost\nimmediately after the release of 0.2!\n\n########## PrettyTable 0.2 - April 29, 2009 ##########\n\n* Added \"get_string\" method.\n* Added \"__str__\" method (which just calls \"get_string\") to enable nice\n \"print x\" syntax. \n* Can now pass field names as a constructor argument.\n* Return values of \"get_string\" are cached in a dictionary that is only\n  cleared after a call to \"add_row\" or something else which invalidates the\n  cache.\n\n########## PrettyTable 0.1 - February 26, 2009 #########\n\n* Original release\n"
  },
  {
    "path": "thirdparty_libs/prettytable/COPYING",
    "content": "# Copyright (c) 2009-2013 Luke Maurits <luke@maurits.id.au>\n# All rights reserved.\n# With contributions from:\n#  * Chris Clark\n#  * Christoph Robbert\n#  * Klein Stephane\n#  * \"maartendb\"\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are met:\n#\n# * Redistributions of source code must retain the above copyright notice,\n#   this list of conditions and the following disclaimer.\n# * Redistributions in binary form must reproduce the above copyright notice,\n#   this list of conditions and the following disclaimer in the documentation\n#   and/or other materials provided with the distribution.\n# * The name of the author may not be used to endorse or promote products\n#   derived from this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n# POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "thirdparty_libs/prettytable/MANIFEST.in",
    "content": "include COPYING\ninclude CHANGELOG\ninclude README\ninclude prettytable_test.py\n"
  },
  {
    "path": "thirdparty_libs/prettytable/PKG-INFO",
    "content": "Metadata-Version: 1.0\nName: prettytable\nVersion: 0.7.2\nSummary: A simple Python library for easily displaying tabular data in a visually appealing ASCII table format\nHome-page: http://code.google.com/p/prettytable\nAuthor: Luke Maurits\nAuthor-email: luke@maurits.id.au\nLicense: BSD (3 clause)\nDescription: UNKNOWN\nPlatform: UNKNOWN\nClassifier: Programming Language :: Python\nClassifier: Programming Language :: Python :: 2.4\nClassifier: Programming Language :: Python :: 2.5\nClassifier: Programming Language :: Python :: 2.6\nClassifier: Programming Language :: Python :: 2.7\nClassifier: Programming Language :: Python :: 3\nClassifier: License :: OSI Approved :: BSD License\nClassifier: Topic :: Text Processing\n"
  },
  {
    "path": "thirdparty_libs/prettytable/README",
    "content": "TUTORIAL ON HOW TO USE THE PRETTYTABLE 0.6+ API\n\n*** This tutorial is distributed with PrettyTable and is meant to serve\nas a \"quick start\" guide for the lazy or impatient.  It is not an\nexhaustive description of the whole API, and it is not guaranteed to be\n100% up to date.  For more complete and update documentation, check the\nPrettyTable wiki at http://code.google.com/p/prettytable/w/list ***\n\n= Getting your data into (and out of) the table =\n\nLet's suppose you have a shiny new PrettyTable:\n\nfrom prettytable import PrettyTable\nx = PrettyTable()\n\nand you want to put some data into it.  You have a few options.\n\n== Row by row ==\n\nYou can add data one row at a time.  To do this you can set the field names \nfirst using the `field_names` attribute, and then add the rows one at a time \nusing the `add_row` method:\n\nx.field_names = [\"City name\", \"Area\", \"Population\", \"Annual Rainfall\"]\nx.add_row([\"Adelaide\",1295, 1158259, 600.5])\nx.add_row([\"Brisbane\",5905, 1857594, 1146.4])\nx.add_row([\"Darwin\", 112, 120900, 1714.7])\nx.add_row([\"Hobart\", 1357, 205556, 619.5])\nx.add_row([\"Sydney\", 2058, 4336374, 1214.8])\nx.add_row([\"Melbourne\", 1566, 3806092, 646.9])\nx.add_row([\"Perth\", 5386, 1554769, 869.4])\n\n== Column by column ==\n\nYou can add data one column at a time as well.  To do this you use the \n`add_column` method, which takes two arguments - a string which is the name for \nthe field the column you are adding corresponds to, and a list or tuple which \ncontains the column data\"\n\nx.add_column(\"City name\", \n[\"Adelaide\",\"Brisbane\",\"Darwin\",\"Hobart\",\"Sydney\",\"Melbourne\",\"Perth\"])\nx.add_column(\"Area\", [1295, 5905, 112, 1357, 2058, 1566, 5386])\nx.add_column(\"Population\", [1158259, 1857594, 120900, 205556, 4336374, 3806092, \n1554769])\nx.add_column(\"Annual Rainfall\",[600.5, 1146.4, 1714.7, 619.5, 1214.8, 646.9, \n869.4])\n\n== Mixing and matching ==\n\nIf you really want to, you can even mix and match `add_row` and `add_column` \nand build some of your table in one way and some of it in the other.  There's a \nunit test which makes sure that doing things this way will always work out \nnicely as if you'd done it using just one of the two approaches.  Tables built \nthis way are kind of confusing for other people to read, though, so don't do \nthis unless you have a good reason.\n\n== Importing data from a CSV file ==\n\nIf you have your table data in a comma separated values file (.csv), you can\nread this data into a PrettyTable like this:\n\nfrom prettytable import from_csv\nfp = open(\"myfile.csv\", \"r\")\nmytable = from_csv(fp)\nfp.close()\n\n== Importing data from a HTML string ==\n\nIf you have a string containing a HTML <table>, you can read this data into a\nPrettyTable like this:\n\nfrom prettytable import from_html\nmytable = from_html(html_string)\n\n== Importing data from a database cursor ==\n\nIf you have your table data in a database which you can access using a library\nwhich confirms to the Python DB-API (e.g. an SQLite database accessible using\nthe sqlite module), then you can build a PrettyTable using a cursor object,\nlike this:\n\nimport sqlite3\nfrom prettytable import from_db_cursor\n\nconnection = sqlite3.connect(\"mydb.db\")\ncursor = connection.cursor()\ncursor.execute(\"SELECT field1, field2, field3 FROM my_table\")\nmytable = from_db_cursor(cursor)\n\n== Getting data out ==\n\nThere are three ways to get data out of a PrettyTable, in increasing order of \ncompleteness:\n\n  * The `del_row` method takes an integer index of a single row to delete.\n  * The `clear_rows` method takes no arguments and deletes all the rows in the \ntable - but keeps the field names as they were so you that you can repopulate \nit with the same kind of data.\n  * The `clear` method takes no arguments and deletes all rows and all field \nnames.  It's not quite the same as creating a fresh table instance, though - \nstyle related settings, discussed later, are maintained.\n\n= Displaying your table in ASCII form =\n\nPrettyTable's main goal is to let you print tables in an attractive ASCII form, \nlike this:\n\n+-----------+------+------------+-----------------+\n| City name | Area | Population | Annual Rainfall |\n+-----------+------+------------+-----------------+\n| Adelaide  | 1295 |  1158259   |      600.5      |\n| Brisbane  | 5905 |  1857594   |      1146.4     |\n| Darwin    | 112  |   120900   |      1714.7     |\n| Hobart    | 1357 |   205556   |      619.5      |\n| Melbourne | 1566 |  3806092   |      646.9      |\n| Perth     | 5386 |  1554769   |      869.4      |\n| Sydney    | 2058 |  4336374   |      1214.8     |\n+-----------+------+------------+-----------------+\n\nYou can print tables like this to `stdout` or get string representations of \nthem.\n\n== Printing ==\n\nTo print a table in ASCII form, you can just do this:\n\nprint x\n\nin Python 2.x or:\n\nprint(x)\n\nin Python 3.x.\n\nThe old x.printt() method from versions 0.5 and earlier has been removed.\n\nTo pass options changing the look of the table, use the get_string() method\ndocumented below:\n\nprint x.get_string()\n\n== Stringing ==\n\nIf you don't want to actually print your table in ASCII form but just get a \nstring containing what _would_ be printed if you use \"print x\", you can use \nthe `get_string` method:\n\nmystring = x.get_string()\n\nThis string is guaranteed to look exactly the same as what would be printed by \ndoing \"print x\".  You can now do all the usual things you can do with a \nstring, like write your table to a file or insert it into a GUI.\n\n== Controlling which data gets displayed ==\n\nIf you like, you can restrict the output of `print x` or `x.get_string` to\nonly the fields or rows you like.\n\nThe `fields` argument to these methods takes a list of field names to be \nprinted:\n\nprint x.get_string(fields=[\"City name\", \"Population\"])\n\ngives:\n\n+-----------+------------+\n| City name | Population |\n+-----------+------------+\n| Adelaide  |  1158259   |\n| Brisbane  |  1857594   |\n| Darwin    |   120900   |\n| Hobart    |   205556   |\n| Melbourne |  3806092   |\n| Perth     |  1554769   |\n| Sydney    |  4336374   |\n+-----------+------------+\n\nThe `start` and `end` arguments take the index of the first and last row to \nprint respectively.  Note that the indexing works like Python list slicing - to \nprint the 2nd, 3rd and 4th rows of the table, set `start` to 1 (the first row \nis row 0, so the second is row 1) and set `end` to 4 (the index of the 4th row, \nplus 1):\n\nprint x.get_string(start=1,end=4)\n\nprints:\n\n+-----------+------+------------+-----------------+\n| City name | Area | Population | Annual Rainfall |\n+-----------+------+------------+-----------------+\n| Brisbane  | 5905 |    1857594 | 1146.4          |\n| Darwin    | 112  |     120900 | 1714.7          |\n| Hobart    | 1357 |     205556 | 619.5           |\n+-----------+------+------------+-----------------+\n\n== Changing the alignment of columns ==\n\nBy default, all columns in a table are centre aligned.\n\n=== All columns at once ===\n\nYou can change the alignment of all the columns in a table at once by assigning \na one character string to the `align` attribute.  The allowed strings are \"l\", \n\"r\" and \"c\" for left, right and centre alignment, respectively:\n\nx.align = \"r\"\nprint x\n\ngives:\n\n+-----------+------+------------+-----------------+\n| City name | Area | Population | Annual Rainfall |\n+-----------+------+------------+-----------------+\n|  Adelaide | 1295 |    1158259 |           600.5 |\n|  Brisbane | 5905 |    1857594 |          1146.4 |\n|    Darwin |  112 |     120900 |          1714.7 |\n|    Hobart | 1357 |     205556 |           619.5 |\n| Melbourne | 1566 |    3806092 |           646.9 |\n|     Perth | 5386 |    1554769 |           869.4 |\n|    Sydney | 2058 |    4336374 |          1214.8 |\n+-----------+------+------------+-----------------+\n\n=== One column at a time ===\n\nYou can also change the alignment of individual columns based on the \ncorresponding field name by treating the `align` attribute as if it were a \ndictionary.\n\nx.align[\"City name\"] = \"l\"\nx.align[\"Area\"] = \"c\"\nx.align[\"Population\"] = \"r\"\nx.align[\"Annual Rainfall\"] = \"c\"\nprint x\n\ngives:\n\n+-----------+------+------------+-----------------+\n| City name | Area | Population | Annual Rainfall |\n+-----------+------+------------+-----------------+\n| Adelaide  | 1295 |    1158259 |      600.5      |\n| Brisbane  | 5905 |    1857594 |      1146.4     |\n| Darwin    | 112  |     120900 |      1714.7     |\n| Hobart    | 1357 |     205556 |      619.5      |\n| Melbourne | 1566 |    3806092 |      646.9      |\n| Perth     | 5386 |    1554769 |      869.4      |\n| Sydney    | 2058 |    4336374 |      1214.8     |\n+-----------+------+------------+-----------------+\n\n== Sorting your table by a field ==\n\nYou can make sure that your ASCII tables are produced with the data sorted by \none particular field by giving `get_string` a `sortby` keyword argument, which\n must be a string containing the name of one field.\n\nFor example, to print the example table we built earlier of Australian capital \ncity data, so that the most populated city comes last, we can do this:\n\nprint x.get_string(sortby=\"Population\")\n\nto get\n\n+-----------+------+------------+-----------------+\n| City name | Area | Population | Annual Rainfall |\n+-----------+------+------------+-----------------+\n| Darwin    | 112  |   120900   |      1714.7     |\n| Hobart    | 1357 |   205556   |      619.5      |\n| Adelaide  | 1295 |  1158259   |      600.5      |\n| Perth     | 5386 |  1554769   |      869.4      |\n| Brisbane  | 5905 |  1857594   |      1146.4     |\n| Melbourne | 1566 |  3806092   |      646.9      |\n| Sydney    | 2058 |  4336374   |      1214.8     |\n+-----------+------+------------+-----------------+\n\nIf we want the most populated city to come _first_, we can also give a \n`reversesort=True` argument.\n\nIf you _always_ want your tables to be sorted in a certain way, you can make \nthe setting long term like this:\n\nx.sortby = \"Population\"\nprint x\nprint x\nprint x\n\nAll three tables printed by this code will be sorted by population (you could \ndo `x.reversesort = True` as well, if you wanted).  The behaviour will persist \nuntil you turn it off:\n\nx.sortby = None\n\nIf you want to specify a custom sorting function, you can use the `sort_key`\nkeyword argument.  Pass this a function which accepts two lists of values\nand returns a negative or positive value depending on whether the first list\nshould appeare before or after the second one.  If your table has n columns,\neach list will have n+1 elements.  Each list corresponds to one row of the\ntable.  The first element will be whatever data is in the relevant row, in\nthe column specified by the `sort_by` argument.  The remaining n elements\nare the data in each of the table's columns, in order, including a repeated\ninstance of the data in the `sort_by` column.\n\n= Changing the appearance of your table - the easy way =\n\nBy default, PrettyTable produces ASCII tables that look like the ones used in \nSQL database shells.  But if can print them in a variety of other formats as \nwell.  If the format you want to use is common, PrettyTable makes this very \neasy for you to do using the `set_style` method.  If you want to produce an \nuncommon table, you'll have to do things slightly harder (see later).\n\n== Setting a table style ==\n\nYou can set the style for your table using the `set_style` method before any \ncalls to `print` or `get_string`.  Here's how to print a table in a format \nwhich works nicely with Microsoft Word's \"Convert to table\" feature:\n\nfrom prettytable import MSWORD_FRIENDLY\nx.set_style(MSWORD_FRIENDLY)\nprint x\n\nIn addition to `MSWORD_FRIENDLY` there are currently two other in-built styles \nyou can use for your tables:\n\n  * `DEFAULT` - The default look, used to undo any style changes you may have \nmade\n  * `PLAIN_COLUMN` - A borderless style that works well with command line \nprograms for columnar data\n\nOther styles are likely to appear in future releases.\n\n= Changing the appearance of your table - the hard way =\n\nIf you want to display your table in a style other than one of the in-built \nstyles listed above, you'll have to set things up the hard way.\n\nDon't worry, it's not really that hard!\n\n== Style options ==\n\nPrettyTable has a number of style options which control various aspects of how \ntables are displayed.  You have the freedom to set each of these options \nindividually to whatever you prefer.  The `set_style` method just does this \nautomatically for you.\n\nThe options are these:\n\n  * `border` - A boolean option (must be `True` or `False`).  Controls whether \n    or not a border is drawn around the table.\n  * `header` - A boolean option (must be `True` or `False`).  Controls whether \n    or not the first row of the table is a header showing the names of all the \n    fields.\n  * `hrules` - Controls printing of horizontal rules after rows.  Allowed \n    values: FRAME, HEADER, ALL, NONE - note that these are variables defined\n    inside the `prettytable` module so make sure you import them or use\n    `prettytable.FRAME` etc.\n  * `vrules` - Controls printing of vertical rules between columns.  Allowed \n    values: FRAME, ALL, NONE.\n  * `int_format` - A string which controls the way integer data is printed.\n    This works like: print \"%<int_format>d\" % data\n  * `float_format` - A string which controls the way floating point data is\n     printed.  This works like: print \"%<int_format>f\" % data\n  * `padding_width` - Number of spaces on either side of column data (only used \n    if left and right paddings are None).\n  * `left_padding_width` - Number of spaces on left hand side of column data.\n  * `right_padding_width` - Number of spaces on right hand side of column data.\n  * `vertical_char` - Single character string used to draw vertical lines.  \n     Default is `|`.\n  * `horizontal_char` - Single character string used to draw horizontal lines.  \n     Default is `-`.\n  * `junction_char` - Single character string used to draw line junctions.  \n     Default is `+`.\n\nYou can set the style options to your own settings in two ways:\n\n== Setting style options for the long term ==\n\nIf you want to print your table with a different style several times, you can \nset your option for the \"long term\" just by changing the appropriate \nattributes.  If you never want your tables to have borders you can do this:\n\nx.border = False\nprint x\nprint x\nprint x\n\nNeither of the 3 tables printed by this will have borders, even if you do \nthings like add extra rows inbetween them.  The lack of borders will last until \nyou do:\n\nx.border = True\n\nto turn them on again.  This sort of long term setting is exactly how \n`set_style` works.  `set_style` just sets a bunch of attributes to pre-set \nvalues for you.\n\nNote that if you know what style options you want at the moment you are \ncreating your table, you can specify them using keyword arguments to the \nconstructor.  For example, the following two code blocks are equivalent:\n\nx = PrettyTable()\nx.border = False\nx.header = False\nx.padding_width = 5\n\nx = PrettyTable(border=False, header=False, padding_width=5)\n\n== Changing style options just once ==\n\nIf you don't want to make long term style changes by changing an attribute like \nin the previous section, you can make changes that last for just one \n``get_string`` by giving those methods keyword arguments.  To print two \n\"normal\" tables with one borderless table between them, you could do this:\n\nprint x\nprint x.get_string(border=False)\nprint x\n\n= Displaying your table in HTML form =\n\nPrettyTable will also print your tables in HTML form, as `<table>`s.  Just like \nin ASCII form, you can actually print your table - just use `print_html()` - or \nget a string representation - just use `get_html_string()`.  HTML printing \nsupports the `fields`, `start`, `end`, `sortby` and `reversesort` arguments in \nexactly the same way as ASCII printing.\n\n== Styling HTML tables ==\n\nBy default, PrettyTable outputs HTML for \"vanilla\" tables.  The HTML code is \nquite simple.  It looks like this:\n\n<table>\n    <tr>\n        <th>City name</th>\n        <th>Area</th>\n        <th>Population</th>\n        <th>Annual Rainfall</th>\n    </tr>\n    <tr>\n        <td>Adelaide</td>\n        <td>1295</td>\n        <td>1158259</td>\n        <td>600.5</td>\n    <tr>\n        <td>Brisbane</td>\n        <td>5905</td>\n        <td>1857594</td>\n        <td>1146.4</td>\n    ...\n    ...\n    ...\n</table>\n\nIf you like, you can ask PrettyTable to do its best to mimick the style options \nthat your table has set using inline CSS.  This is done by giving a \n`format=True` keyword argument to either the `print_html` or `get_html_string` \nmethods.  Note that if you _always_ want to print formatted HTML you can do:\n\nx.format = True\n\nand the setting will persist until you turn it off.\n\nJust like with ASCII tables, if you want to change the table's style for just \none `print_html` or one `get_html_string` you can pass those methods keyword \narguments - exactly like `print` and `get_string`.\n\n== Setting HTML attributes ==\n\nYou can provide a dictionary of HTML attribute name/value pairs to the \n`print_html` and `get_html_string` methods using the `attributes` keyword \nargument.  This lets you specify common HTML attributes like `name`, `id` and \n`class` that can be used for linking to your tables or customising their \nappearance using CSS.  For example:\n\nx.print_html(attributes={\"name\":\"my_table\", \"class\":\"red_table\"})\n\nwill print:\n\n<table name=\"my_table\" class=\"red_table\">\n    <tr>\n        <th>City name</th>\n        <th>Area</th>\n        <th>Population</th>\n        <th>Annual Rainfall</th>\n    </tr>\n    ...\n    ...\n    ...\n</table>\n\n= Miscellaneous things =\n\n== Copying a table ==\n\nYou can call the `copy` method on a PrettyTable object without arguments to \nreturn an identical independent copy of the table.\n\nIf you want a copy of a PrettyTable object with just a subset of the rows,\nyou can use list slicing notation:\n\nnew_table = old_table[0:5]\n"
  },
  {
    "path": "thirdparty_libs/prettytable/__init__.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nCopyright (c) 2014-2015 pocsuite developers (http://seebug.org)\nSee the file 'docs/COPYING' for copying permission\n\"\"\"\n"
  },
  {
    "path": "thirdparty_libs/prettytable/prettytable.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright (c) 2009-2013, Luke Maurits <luke@maurits.id.au>\n# All rights reserved.\n# With contributions from:\n#  * Chris Clark\n#  * Klein Stephane\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are met:\n#\n# * Redistributions of source code must retain the above copyright notice,\n#   this list of conditions and the following disclaimer.\n# * Redistributions in binary form must reproduce the above copyright notice,\n#   this list of conditions and the following disclaimer in the documentation\n#   and/or other materials provided with the distribution.\n# * The name of the author may not be used to endorse or promote products\n#   derived from this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n# POSSIBILITY OF SUCH DAMAGE.\n\n__version__ = \"0.7.2\"\n\nimport copy\nimport csv\nimport random\nimport re\nimport sys\nimport textwrap\nimport itertools\nimport unicodedata\n\npy3k = sys.version_info[0] >= 3\nif py3k:\n    unicode = str\n    basestring = str\n    itermap = map\n    iterzip = zip\n    uni_chr = chr\n    from html.parser import HTMLParser\nelse: \n    itermap = itertools.imap\n    iterzip = itertools.izip\n    uni_chr = unichr\n    from HTMLParser import HTMLParser\n\nif py3k and sys.version_info[1] >= 2:\n    from html import escape\nelse:\n    from cgi import escape\n\n# hrule styles\nFRAME = 0\nALL   = 1\nNONE  = 2\nHEADER = 3\n\n# Table styles\nDEFAULT = 10\nMSWORD_FRIENDLY = 11\nPLAIN_COLUMNS = 12\nRANDOM = 20\n\n_re = re.compile(\"\\033\\[[0-9;]*m\")\n\ndef _get_size(text):\n    lines = text.split(\"\\n\")\n    height = len(lines)\n    width = max([_str_block_width(line) for line in lines])\n    return (width, height)\n        \nclass PrettyTable(object):\n\n    def __init__(self, field_names=None, **kwargs):\n\n        \"\"\"Return a new PrettyTable instance\n\n        Arguments:\n\n        encoding - Unicode encoding scheme used to decode any encoded input\n        field_names - list or tuple of field names\n        fields - list or tuple of field names to include in displays\n        start - index of first data row to include in output\n        end - index of last data row to include in output PLUS ONE (list slice style)\n        header - print a header showing field names (True or False)\n        header_style - stylisation to apply to field names in header (\"cap\", \"title\", \"upper\", \"lower\" or None)\n        border - print a border around the table (True or False)\n        hrules - controls printing of horizontal rules after rows.  Allowed values: FRAME, HEADER, ALL, NONE\n        vrules - controls printing of vertical rules between columns.  Allowed values: FRAME, ALL, NONE\n        int_format - controls formatting of integer data\n        float_format - controls formatting of floating point data\n        padding_width - number of spaces on either side of column data (only used if left and right paddings are None)\n        left_padding_width - number of spaces on left hand side of column data\n        right_padding_width - number of spaces on right hand side of column data\n        vertical_char - single character string used to draw vertical lines\n        horizontal_char - single character string used to draw horizontal lines\n        junction_char - single character string used to draw line junctions\n        sortby - name of field to sort rows by\n        sort_key - sorting key function, applied to data points before sorting\n        valign - default valign for each row (None, \"t\", \"m\" or \"b\")\n        reversesort - True or False to sort in descending or ascending order\"\"\"\n\n        self.encoding = kwargs.get(\"encoding\", \"UTF-8\")\n\n        # Data\n        self._field_names = []\n        self._align = {}\n        self._valign = {}\n        self._max_width = {}\n        self._rows = []\n        if field_names:\n            self.field_names = field_names\n        else:\n            self._widths = []\n\n        # Options\n        self._options = \"start end fields header border sortby reversesort sort_key attributes format hrules vrules\".split()\n        self._options.extend(\"int_format float_format padding_width left_padding_width right_padding_width\".split())\n        self._options.extend(\"vertical_char horizontal_char junction_char header_style valign xhtml print_empty\".split())\n        for option in self._options:\n            if option in kwargs:\n                self._validate_option(option, kwargs[option])\n            else:\n                kwargs[option] = None\n\n        self._start = kwargs[\"start\"] or 0\n        self._end = kwargs[\"end\"] or None\n        self._fields = kwargs[\"fields\"] or None\n\n        if kwargs[\"header\"] in (True, False):\n            self._header = kwargs[\"header\"]\n        else:\n            self._header = True\n        self._header_style = kwargs[\"header_style\"] or None\n        if kwargs[\"border\"] in (True, False):\n            self._border = kwargs[\"border\"]\n        else:\n            self._border = True\n        self._hrules = kwargs[\"hrules\"] or FRAME\n        self._vrules = kwargs[\"vrules\"] or ALL\n\n        self._sortby = kwargs[\"sortby\"] or None\n        if kwargs[\"reversesort\"] in (True, False):\n            self._reversesort = kwargs[\"reversesort\"]\n        else:\n            self._reversesort = False\n        self._sort_key = kwargs[\"sort_key\"] or (lambda x: x)\n\n        self._int_format = kwargs[\"int_format\"] or {}\n        self._float_format = kwargs[\"float_format\"] or {}\n        self._padding_width = kwargs[\"padding_width\"] or 1\n        self._left_padding_width = kwargs[\"left_padding_width\"] or None\n        self._right_padding_width = kwargs[\"right_padding_width\"] or None\n\n        self._vertical_char = kwargs[\"vertical_char\"] or self._unicode(\"|\")\n        self._horizontal_char = kwargs[\"horizontal_char\"] or self._unicode(\"-\")\n        self._junction_char = kwargs[\"junction_char\"] or self._unicode(\"+\")\n        \n        if kwargs[\"print_empty\"] in (True, False):\n            self._print_empty = kwargs[\"print_empty\"]\n        else:\n            self._print_empty = True\n        self._format = kwargs[\"format\"] or False\n        self._xhtml = kwargs[\"xhtml\"] or False\n        self._attributes = kwargs[\"attributes\"] or {}\n   \n    def _unicode(self, value):\n        if not isinstance(value, basestring):\n            value = str(value)\n        if not isinstance(value, unicode):\n            value = unicode(value, self.encoding, \"strict\")\n        return value\n\n    def _justify(self, text, width, align):\n        excess = width - _str_block_width(text)\n        if align == \"l\":\n            return text + excess * \" \"\n        elif align == \"r\":\n            return excess * \" \" + text\n        else:\n            if excess % 2:\n                # Uneven padding\n                # Put more space on right if text is of odd length...\n                if _str_block_width(text) % 2:\n                    return (excess//2)*\" \" + text + (excess//2 + 1)*\" \"\n                # and more space on left if text is of even length\n                else:\n                    return (excess//2 + 1)*\" \" + text + (excess//2)*\" \"\n                # Why distribute extra space this way?  To match the behaviour of\n                # the inbuilt str.center() method.\n            else:\n                # Equal padding on either side\n                return (excess//2)*\" \" + text + (excess//2)*\" \"\n\n    def __getattr__(self, name):\n\n        if name == \"rowcount\":\n            return len(self._rows)\n        elif name == \"colcount\":\n            if self._field_names:\n                return len(self._field_names)\n            elif self._rows:\n                return len(self._rows[0])\n            else:\n                return 0\n        else:\n            raise AttributeError(name)\n \n    def __getitem__(self, index):\n\n        new = PrettyTable()\n        new.field_names = self.field_names\n        for attr in self._options:\n            setattr(new, \"_\"+attr, getattr(self, \"_\"+attr))\n        setattr(new, \"_align\", getattr(self, \"_align\"))\n        if isinstance(index, slice):\n            for row in self._rows[index]:\n                new.add_row(row)\n        elif isinstance(index, int):\n            new.add_row(self._rows[index])\n        else:\n            raise Exception(\"Index %s is invalid, must be an integer or slice\" % str(index))\n        return new\n\n    if py3k:\n        def __str__(self):\n           return self.__unicode__()\n    else:\n        def __str__(self):\n           return self.__unicode__().encode(self.encoding)\n\n    def __unicode__(self):\n        return self.get_string()\n\n    ##############################\n    # ATTRIBUTE VALIDATORS       #\n    ##############################\n\n    # The method _validate_option is all that should be used elsewhere in the code base to validate options.\n    # It will call the appropriate validation method for that option.  The individual validation methods should\n    # never need to be called directly (although nothing bad will happen if they *are*).\n    # Validation happens in TWO places.\n    # Firstly, in the property setters defined in the ATTRIBUTE MANAGMENT section.\n    # Secondly, in the _get_options method, where keyword arguments are mixed with persistent settings\n\n    def _validate_option(self, option, val):\n        if option in (\"field_names\"):\n            self._validate_field_names(val)\n        elif option in (\"start\", \"end\", \"max_width\", \"padding_width\", \"left_padding_width\", \"right_padding_width\", \"format\"):\n            self._validate_nonnegative_int(option, val)\n        elif option in (\"sortby\"):\n            self._validate_field_name(option, val)\n        elif option in (\"sort_key\"):\n            self._validate_function(option, val)\n        elif option in (\"hrules\"):\n            self._validate_hrules(option, val)\n        elif option in (\"vrules\"):\n            self._validate_vrules(option, val)\n        elif option in (\"fields\"):\n            self._validate_all_field_names(option, val)\n        elif option in (\"header\", \"border\", \"reversesort\", \"xhtml\", \"print_empty\"):\n            self._validate_true_or_false(option, val)\n        elif option in (\"header_style\"):\n            self._validate_header_style(val)\n        elif option in (\"int_format\"):\n            self._validate_int_format(option, val)\n        elif option in (\"float_format\"):\n            self._validate_float_format(option, val)\n        elif option in (\"vertical_char\", \"horizontal_char\", \"junction_char\"):\n            self._validate_single_char(option, val)\n        elif option in (\"attributes\"):\n            self._validate_attributes(option, val)\n        else:\n            raise Exception(\"Unrecognised option: %s!\" % option)\n\n    def _validate_field_names(self, val):\n        # Check for appropriate length\n        if self._field_names:\n            try:\n               assert len(val) == len(self._field_names)\n            except AssertionError:\n               raise Exception(\"Field name list has incorrect number of values, (actual) %d!=%d (expected)\" % (len(val), len(self._field_names)))\n        if self._rows:\n            try:\n               assert len(val) == len(self._rows[0])\n            except AssertionError:\n               raise Exception(\"Field name list has incorrect number of values, (actual) %d!=%d (expected)\" % (len(val), len(self._rows[0])))\n        # Check for uniqueness\n        try:\n            assert len(val) == len(set(val))\n        except AssertionError:\n            raise Exception(\"Field names must be unique!\")\n\n    def _validate_header_style(self, val):\n        try:\n            assert val in (\"cap\", \"title\", \"upper\", \"lower\", None)\n        except AssertionError:\n            raise Exception(\"Invalid header style, use cap, title, upper, lower or None!\")\n\n    def _validate_align(self, val):\n        try:\n            assert val in [\"l\",\"c\",\"r\"]\n        except AssertionError:\n            raise Exception(\"Alignment %s is invalid, use l, c or r!\" % val)\n\n    def _validate_valign(self, val):\n        try:\n            assert val in [\"t\",\"m\",\"b\",None]\n        except AssertionError:\n            raise Exception(\"Alignment %s is invalid, use t, m, b or None!\" % val)\n\n    def _validate_nonnegative_int(self, name, val):\n        try:\n            assert int(val) >= 0\n        except AssertionError:\n            raise Exception(\"Invalid value for %s: %s!\" % (name, self._unicode(val)))\n\n    def _validate_true_or_false(self, name, val):\n        try:\n            assert val in (True, False)\n        except AssertionError:\n            raise Exception(\"Invalid value for %s!  Must be True or False.\" % name)\n\n    def _validate_int_format(self, name, val):\n        if val == \"\":\n            return\n        try:\n            assert type(val) in (str, unicode)\n            assert val.isdigit()\n        except AssertionError:\n            raise Exception(\"Invalid value for %s!  Must be an integer format string.\" % name)\n\n    def _validate_float_format(self, name, val):\n        if val == \"\":\n            return\n        try:\n            assert type(val) in (str, unicode)\n            assert \".\" in val\n            bits = val.split(\".\")\n            assert len(bits) <= 2\n            assert bits[0] == \"\" or bits[0].isdigit()\n            assert bits[1] == \"\" or bits[1].isdigit()\n        except AssertionError:\n            raise Exception(\"Invalid value for %s!  Must be a float format string.\" % name)\n\n    def _validate_function(self, name, val):\n        try:\n            assert hasattr(val, \"__call__\")\n        except AssertionError:\n            raise Exception(\"Invalid value for %s!  Must be a function.\" % name)\n\n    def _validate_hrules(self, name, val):\n        try:\n            assert val in (ALL, FRAME, HEADER, NONE)\n        except AssertionError:\n            raise Exception(\"Invalid value for %s!  Must be ALL, FRAME, HEADER or NONE.\" % name)\n\n    def _validate_vrules(self, name, val):\n        try:\n            assert val in (ALL, FRAME, NONE)\n        except AssertionError:\n            raise Exception(\"Invalid value for %s!  Must be ALL, FRAME, or NONE.\" % name)\n\n    def _validate_field_name(self, name, val):\n        try:\n            assert (val in self._field_names) or (val is None)\n        except AssertionError:\n            raise Exception(\"Invalid field name: %s!\" % val)\n\n    def _validate_all_field_names(self, name, val):\n        try:\n            for x in val:\n                self._validate_field_name(name, x)\n        except AssertionError:\n            raise Exception(\"fields must be a sequence of field names!\")\n\n    def _validate_single_char(self, name, val):\n        try:\n            assert _str_block_width(val) == 1\n        except AssertionError:\n            raise Exception(\"Invalid value for %s!  Must be a string of length 1.\" % name)\n\n    def _validate_attributes(self, name, val):\n        try:\n            assert isinstance(val, dict)\n        except AssertionError:\n            raise Exception(\"attributes must be a dictionary of name/value pairs!\")\n\n    ##############################\n    # ATTRIBUTE MANAGEMENT       #\n    ##############################\n\n    def _get_field_names(self):\n        return self._field_names\n        \"\"\"The names of the fields\n\n        Arguments:\n\n        fields - list or tuple of field names\"\"\"\n    def _set_field_names(self, val):\n        val = [self._unicode(x) for x in val]\n        self._validate_option(\"field_names\", val)\n        if self._field_names:\n            old_names = self._field_names[:]\n        self._field_names = val\n        if self._align and old_names:\n            for old_name, new_name in zip(old_names, val):\n                self._align[new_name] = self._align[old_name]\n            for old_name in old_names:\n                if old_name not in self._align:\n                    self._align.pop(old_name)\n        else:\n            for field in self._field_names:\n                self._align[field] = \"c\"\n        if self._valign and old_names:\n            for old_name, new_name in zip(old_names, val):\n                self._valign[new_name] = self._valign[old_name]\n            for old_name in old_names:\n                if old_name not in self._valign:\n                    self._valign.pop(old_name)\n        else:\n            for field in self._field_names:\n                self._valign[field] = \"t\"\n    field_names = property(_get_field_names, _set_field_names)\n\n    def _get_align(self):\n        return self._align\n    def _set_align(self, val):\n        self._validate_align(val)\n        for field in self._field_names:\n            self._align[field] = val\n    align = property(_get_align, _set_align)\n\n    def _get_valign(self):\n        return self._valign\n    def _set_valign(self, val):\n        self._validate_valign(val)\n        for field in self._field_names:\n            self._valign[field] = val\n    valign = property(_get_valign, _set_valign)\n\n    def _get_max_width(self):\n        return self._max_width\n    def _set_max_width(self, val):\n        self._validate_option(\"max_width\", val)\n        for field in self._field_names:\n            self._max_width[field] = val\n    max_width = property(_get_max_width, _set_max_width)\n    \n    def _get_fields(self):\n        \"\"\"List or tuple of field names to include in displays\n\n        Arguments:\n\n        fields - list or tuple of field names to include in displays\"\"\"\n        return self._fields\n    def _set_fields(self, val):\n        self._validate_option(\"fields\", val)\n        self._fields = val\n    fields = property(_get_fields, _set_fields)\n\n    def _get_start(self):\n        \"\"\"Start index of the range of rows to print\n\n        Arguments:\n\n        start - index of first data row to include in output\"\"\"\n        return self._start\n\n    def _set_start(self, val):\n        self._validate_option(\"start\", val)\n        self._start = val\n    start = property(_get_start, _set_start)\n\n    def _get_end(self):\n        \"\"\"End index of the range of rows to print\n\n        Arguments:\n\n        end - index of last data row to include in output PLUS ONE (list slice style)\"\"\"\n        return self._end\n    def _set_end(self, val):\n        self._validate_option(\"end\", val)\n        self._end = val\n    end = property(_get_end, _set_end)\n\n    def _get_sortby(self):\n        \"\"\"Name of field by which to sort rows\n\n        Arguments:\n\n        sortby - field name to sort by\"\"\"\n        return self._sortby\n    def _set_sortby(self, val):\n        self._validate_option(\"sortby\", val)\n        self._sortby = val\n    sortby = property(_get_sortby, _set_sortby)\n\n    def _get_reversesort(self):\n        \"\"\"Controls direction of sorting (ascending vs descending)\n\n        Arguments:\n\n        reveresort - set to True to sort by descending order, or False to sort by ascending order\"\"\"\n        return self._reversesort\n    def _set_reversesort(self, val):\n        self._validate_option(\"reversesort\", val)\n        self._reversesort = val\n    reversesort = property(_get_reversesort, _set_reversesort)\n\n    def _get_sort_key(self):\n        \"\"\"Sorting key function, applied to data points before sorting\n\n        Arguments:\n\n        sort_key - a function which takes one argument and returns something to be sorted\"\"\"\n        return self._sort_key\n    def _set_sort_key(self, val):\n        self._validate_option(\"sort_key\", val)\n        self._sort_key = val\n    sort_key = property(_get_sort_key, _set_sort_key)\n \n    def _get_header(self):\n        \"\"\"Controls printing of table header with field names\n\n        Arguments:\n\n        header - print a header showing field names (True or False)\"\"\"\n        return self._header\n    def _set_header(self, val):\n        self._validate_option(\"header\", val)\n        self._header = val\n    header = property(_get_header, _set_header)\n\n    def _get_header_style(self):\n        \"\"\"Controls stylisation applied to field names in header\n\n        Arguments:\n\n        header_style - stylisation to apply to field names in header (\"cap\", \"title\", \"upper\", \"lower\" or None)\"\"\"\n        return self._header_style\n    def _set_header_style(self, val):\n        self._validate_header_style(val)\n        self._header_style = val\n    header_style = property(_get_header_style, _set_header_style)\n\n    def _get_border(self):\n        \"\"\"Controls printing of border around table\n\n        Arguments:\n\n        border - print a border around the table (True or False)\"\"\"\n        return self._border\n    def _set_border(self, val):\n        self._validate_option(\"border\", val)\n        self._border = val\n    border = property(_get_border, _set_border)\n\n    def _get_hrules(self):\n        \"\"\"Controls printing of horizontal rules after rows\n\n        Arguments:\n\n        hrules - horizontal rules style.  Allowed values: FRAME, ALL, HEADER, NONE\"\"\"\n        return self._hrules\n    def _set_hrules(self, val):\n        self._validate_option(\"hrules\", val)\n        self._hrules = val\n    hrules = property(_get_hrules, _set_hrules)\n\n    def _get_vrules(self):\n        \"\"\"Controls printing of vertical rules between columns\n\n        Arguments:\n\n        vrules - vertical rules style.  Allowed values: FRAME, ALL, NONE\"\"\"\n        return self._vrules\n    def _set_vrules(self, val):\n        self._validate_option(\"vrules\", val)\n        self._vrules = val\n    vrules = property(_get_vrules, _set_vrules)\n\n    def _get_int_format(self):\n        \"\"\"Controls formatting of integer data\n        Arguments:\n\n        int_format - integer format string\"\"\"\n        return self._int_format\n    def _set_int_format(self, val):\n#        self._validate_option(\"int_format\", val)\n        for field in self._field_names:\n            self._int_format[field] = val\n    int_format = property(_get_int_format, _set_int_format)\n\n    def _get_float_format(self):\n        \"\"\"Controls formatting of floating point data\n        Arguments:\n\n        float_format - floating point format string\"\"\"\n        return self._float_format\n    def _set_float_format(self, val):\n#        self._validate_option(\"float_format\", val)\n        for field in self._field_names:\n            self._float_format[field] = val\n    float_format = property(_get_float_format, _set_float_format)\n\n    def _get_padding_width(self):\n        \"\"\"The number of empty spaces between a column's edge and its content\n\n        Arguments:\n\n        padding_width - number of spaces, must be a positive integer\"\"\"\n        return self._padding_width\n    def _set_padding_width(self, val):\n        self._validate_option(\"padding_width\", val)\n        self._padding_width = val\n    padding_width = property(_get_padding_width, _set_padding_width)\n\n    def _get_left_padding_width(self):\n        \"\"\"The number of empty spaces between a column's left edge and its content\n\n        Arguments:\n\n        left_padding - number of spaces, must be a positive integer\"\"\"\n        return self._left_padding_width\n    def _set_left_padding_width(self, val):\n        self._validate_option(\"left_padding_width\", val)\n        self._left_padding_width = val\n    left_padding_width = property(_get_left_padding_width, _set_left_padding_width)\n\n    def _get_right_padding_width(self):\n        \"\"\"The number of empty spaces between a column's right edge and its content\n\n        Arguments:\n\n        right_padding - number of spaces, must be a positive integer\"\"\"\n        return self._right_padding_width\n    def _set_right_padding_width(self, val):\n        self._validate_option(\"right_padding_width\", val)\n        self._right_padding_width = val\n    right_padding_width = property(_get_right_padding_width, _set_right_padding_width)\n\n    def _get_vertical_char(self):\n        \"\"\"The charcter used when printing table borders to draw vertical lines\n\n        Arguments:\n\n        vertical_char - single character string used to draw vertical lines\"\"\"\n        return self._vertical_char\n    def _set_vertical_char(self, val):\n        val = self._unicode(val)\n        self._validate_option(\"vertical_char\", val)\n        self._vertical_char = val\n    vertical_char = property(_get_vertical_char, _set_vertical_char)\n\n    def _get_horizontal_char(self):\n        \"\"\"The charcter used when printing table borders to draw horizontal lines\n\n        Arguments:\n\n        horizontal_char - single character string used to draw horizontal lines\"\"\"\n        return self._horizontal_char\n    def _set_horizontal_char(self, val):\n        val = self._unicode(val)\n        self._validate_option(\"horizontal_char\", val)\n        self._horizontal_char = val\n    horizontal_char = property(_get_horizontal_char, _set_horizontal_char)\n\n    def _get_junction_char(self):\n        \"\"\"The charcter used when printing table borders to draw line junctions\n\n        Arguments:\n\n        junction_char - single character string used to draw line junctions\"\"\"\n        return self._junction_char\n    def _set_junction_char(self, val):\n        val = self._unicode(val)\n        self._validate_option(\"vertical_char\", val)\n        self._junction_char = val\n    junction_char = property(_get_junction_char, _set_junction_char)\n\n    def _get_format(self):\n        \"\"\"Controls whether or not HTML tables are formatted to match styling options\n\n        Arguments:\n\n        format - True or False\"\"\"\n        return self._format\n    def _set_format(self, val):\n        self._validate_option(\"format\", val)\n        self._format = val\n    format = property(_get_format, _set_format)\n\n    def _get_print_empty(self):\n        \"\"\"Controls whether or not empty tables produce a header and frame or just an empty string\n\n        Arguments:\n\n        print_empty - True or False\"\"\"\n        return self._print_empty\n    def _set_print_empty(self, val):\n        self._validate_option(\"print_empty\", val)\n        self._print_empty = val\n    print_empty = property(_get_print_empty, _set_print_empty)\n\n    def _get_attributes(self):\n        \"\"\"A dictionary of HTML attribute name/value pairs to be included in the <table> tag when printing HTML\n\n        Arguments:\n\n        attributes - dictionary of attributes\"\"\"\n        return self._attributes\n    def _set_attributes(self, val):\n        self._validate_option(\"attributes\", val)\n        self._attributes = val\n    attributes = property(_get_attributes, _set_attributes)\n\n    ##############################\n    # OPTION MIXER               #\n    ##############################\n\n    def _get_options(self, kwargs):\n\n        options = {}\n        for option in self._options:\n            if option in kwargs:\n                self._validate_option(option, kwargs[option])\n                options[option] = kwargs[option]\n            else:\n                options[option] = getattr(self, \"_\"+option)\n        return options\n\n    ##############################\n    # PRESET STYLE LOGIC         #\n    ##############################\n\n    def set_style(self, style):\n\n        if style == DEFAULT:\n            self._set_default_style()\n        elif style == MSWORD_FRIENDLY:\n            self._set_msword_style()\n        elif style == PLAIN_COLUMNS:\n            self._set_columns_style()\n        elif style == RANDOM:\n            self._set_random_style()\n        else:\n            raise Exception(\"Invalid pre-set style!\")\n\n    def _set_default_style(self):\n\n        self.header = True\n        self.border = True\n        self._hrules = FRAME\n        self._vrules = ALL\n        self.padding_width = 1\n        self.left_padding_width = 1\n        self.right_padding_width = 1\n        self.vertical_char = \"|\"\n        self.horizontal_char = \"-\"\n        self.junction_char = \"+\"\n\n    def _set_msword_style(self):\n\n        self.header = True\n        self.border = True\n        self._hrules = NONE\n        self.padding_width = 1\n        self.left_padding_width = 1\n        self.right_padding_width = 1\n        self.vertical_char = \"|\"\n\n    def _set_columns_style(self):\n\n        self.header = True\n        self.border = False\n        self.padding_width = 1\n        self.left_padding_width = 0\n        self.right_padding_width = 8\n\n    def _set_random_style(self):\n\n        # Just for fun!\n        self.header = random.choice((True, False))\n        self.border = random.choice((True, False))\n        self._hrules = random.choice((ALL, FRAME, HEADER, NONE))\n        self._vrules = random.choice((ALL, FRAME, NONE))\n        self.left_padding_width = random.randint(0,5)\n        self.right_padding_width = random.randint(0,5)\n        self.vertical_char = random.choice(\"~!@#$%^&*()_+|-=\\{}[];':\\\",./;<>?\")\n        self.horizontal_char = random.choice(\"~!@#$%^&*()_+|-=\\{}[];':\\\",./;<>?\")\n        self.junction_char = random.choice(\"~!@#$%^&*()_+|-=\\{}[];':\\\",./;<>?\")\n\n    ##############################\n    # DATA INPUT METHODS         #\n    ##############################\n\n    def add_row(self, row):\n\n        \"\"\"Add a row to the table\n\n        Arguments:\n\n        row - row of data, should be a list with as many elements as the table\n        has fields\"\"\"\n\n        if self._field_names and len(row) != len(self._field_names):\n            raise Exception(\"Row has incorrect number of values, (actual) %d!=%d (expected)\" %(len(row),len(self._field_names)))\n        if not self._field_names:\n            self.field_names = [(\"Field %d\" % (n+1)) for n in range(0,len(row))]\n        self._rows.append(list(row))\n\n    def del_row(self, row_index):\n\n        \"\"\"Delete a row to the table\n\n        Arguments:\n\n        row_index - The index of the row you want to delete.  Indexing starts at 0.\"\"\"\n\n        if row_index > len(self._rows)-1:\n            raise Exception(\"Cant delete row at index %d, table only has %d rows!\" % (row_index, len(self._rows)))\n        del self._rows[row_index]\n\n    def add_column(self, fieldname, column, align=\"c\", valign=\"t\"):\n\n        \"\"\"Add a column to the table.\n\n        Arguments:\n\n        fieldname - name of the field to contain the new column of data\n        column - column of data, should be a list with as many elements as the\n        table has rows\n        align - desired alignment for this column - \"l\" for left, \"c\" for centre and \"r\" for right\n        valign - desired vertical alignment for new columns - \"t\" for top, \"m\" for middle and \"b\" for bottom\"\"\"\n\n        if len(self._rows) in (0, len(column)):\n            self._validate_align(align)\n            self._validate_valign(valign)\n            self._field_names.append(fieldname)\n            self._align[fieldname] = align\n            self._valign[fieldname] = valign\n            for i in range(0, len(column)):\n                if len(self._rows) < i+1:\n                    self._rows.append([])\n                self._rows[i].append(column[i])\n        else:\n            raise Exception(\"Column length %d does not match number of rows %d!\" % (len(column), len(self._rows)))\n\n    def clear_rows(self):\n\n        \"\"\"Delete all rows from the table but keep the current field names\"\"\"\n\n        self._rows = []\n\n    def clear(self):\n\n        \"\"\"Delete all rows and field names from the table, maintaining nothing but styling options\"\"\"\n\n        self._rows = []\n        self._field_names = []\n        self._widths = []\n\n    ##############################\n    # MISC PUBLIC METHODS        #\n    ##############################\n\n    def copy(self):\n        return copy.deepcopy(self)\n\n    ##############################\n    # MISC PRIVATE METHODS       #\n    ##############################\n\n    def _format_value(self, field, value):\n        if isinstance(value, int) and field in self._int_format:\n            value = self._unicode((\"%%%sd\" % self._int_format[field]) % value)\n        elif isinstance(value, float) and field in self._float_format:\n            value = self._unicode((\"%%%sf\" % self._float_format[field]) % value)\n        return self._unicode(value)\n\n    def _compute_widths(self, rows, options):\n        if options[\"header\"]:\n            widths = [_get_size(field)[0] for field in self._field_names]\n        else:\n            widths = len(self.field_names) * [0]\n        for row in rows:\n            for index, value in enumerate(row):\n                fieldname = self.field_names[index]\n                if fieldname in self.max_width:\n                    widths[index] = max(widths[index], min(_get_size(value)[0], self.max_width[fieldname]))\n                else:\n                    widths[index] = max(widths[index], _get_size(value)[0])\n        self._widths = widths\n\n    def _get_padding_widths(self, options):\n\n        if options[\"left_padding_width\"] is not None:\n            lpad = options[\"left_padding_width\"]\n        else:\n            lpad = options[\"padding_width\"]\n        if options[\"right_padding_width\"] is not None:\n            rpad = options[\"right_padding_width\"]\n        else:\n            rpad = options[\"padding_width\"]\n        return lpad, rpad\n\n    def _get_rows(self, options):\n        \"\"\"Return only those data rows that should be printed, based on slicing and sorting.\n\n        Arguments:\n\n        options - dictionary of option settings.\"\"\"\n       \n        # Make a copy of only those rows in the slice range \n        rows = copy.deepcopy(self._rows[options[\"start\"]:options[\"end\"]])\n        # Sort if necessary\n        if options[\"sortby\"]:\n            sortindex = self._field_names.index(options[\"sortby\"])\n            # Decorate\n            rows = [[row[sortindex]]+row for row in rows]\n            # Sort\n            rows.sort(reverse=options[\"reversesort\"], key=options[\"sort_key\"])\n            # Undecorate\n            rows = [row[1:] for row in rows]\n        return rows\n        \n    def _format_row(self, row, options):\n        return [self._format_value(field, value) for (field, value) in zip(self._field_names, row)]\n\n    def _format_rows(self, rows, options):\n        return [self._format_row(row, options) for row in rows]\n \n    ##############################\n    # PLAIN TEXT STRING METHODS  #\n    ##############################\n\n    def get_string(self, **kwargs):\n\n        \"\"\"Return string representation of table in current state.\n\n        Arguments:\n\n        start - index of first data row to include in output\n        end - index of last data row to include in output PLUS ONE (list slice style)\n        fields - names of fields (columns) to include\n        header - print a header showing field names (True or False)\n        border - print a border around the table (True or False)\n        hrules - controls printing of horizontal rules after rows.  Allowed values: ALL, FRAME, HEADER, NONE\n        vrules - controls printing of vertical rules between columns.  Allowed values: FRAME, ALL, NONE\n        int_format - controls formatting of integer data\n        float_format - controls formatting of floating point data\n        padding_width - number of spaces on either side of column data (only used if left and right paddings are None)\n        left_padding_width - number of spaces on left hand side of column data\n        right_padding_width - number of spaces on right hand side of column data\n        vertical_char - single character string used to draw vertical lines\n        horizontal_char - single character string used to draw horizontal lines\n        junction_char - single character string used to draw line junctions\n        sortby - name of field to sort rows by\n        sort_key - sorting key function, applied to data points before sorting\n        reversesort - True or False to sort in descending or ascending order\n        print empty - if True, stringify just the header for an empty table, if False return an empty string \"\"\"\n\n        options = self._get_options(kwargs)\n\n        lines = []\n\n        # Don't think too hard about an empty table\n        # Is this the desired behaviour?  Maybe we should still print the header?\n        if self.rowcount == 0 and (not options[\"print_empty\"] or not options[\"border\"]):\n            return \"\"\n\n        # Get the rows we need to print, taking into account slicing, sorting, etc.\n        rows = self._get_rows(options)\n\n        # Turn all data in all rows into Unicode, formatted as desired\n        formatted_rows = self._format_rows(rows, options)\n\n        # Compute column widths\n        self._compute_widths(formatted_rows, options)\n\n        # Add header or top of border\n        self._hrule = self._stringify_hrule(options)\n        if options[\"header\"]:\n            lines.append(self._stringify_header(options))\n        elif options[\"border\"] and options[\"hrules\"] in (ALL, FRAME):\n            lines.append(self._hrule)\n\n        # Add rows\n        for row in formatted_rows:\n            lines.append(self._stringify_row(row, options))\n\n        # Add bottom of border\n        if options[\"border\"] and options[\"hrules\"] == FRAME:\n            lines.append(self._hrule)\n        \n        return self._unicode(\"\\n\").join(lines)\n\n    def _stringify_hrule(self, options):\n\n        if not options[\"border\"]:\n            return \"\"\n        lpad, rpad = self._get_padding_widths(options)\n        if options['vrules'] in (ALL, FRAME):\n            bits = [options[\"junction_char\"]]\n        else:\n            bits = [options[\"horizontal_char\"]]\n        # For tables with no data or fieldnames\n        if not self._field_names:\n                bits.append(options[\"junction_char\"])\n                return \"\".join(bits)\n        for field, width in zip(self._field_names, self._widths):\n            if options[\"fields\"] and field not in options[\"fields\"]:\n                continue\n            bits.append((width+lpad+rpad)*options[\"horizontal_char\"])\n            if options['vrules'] == ALL:\n                bits.append(options[\"junction_char\"])\n            else:\n                bits.append(options[\"horizontal_char\"])\n        if options[\"vrules\"] == FRAME:\n            bits.pop()\n            bits.append(options[\"junction_char\"])\n        return \"\".join(bits)\n\n    def _stringify_header(self, options):\n\n        bits = []\n        lpad, rpad = self._get_padding_widths(options)\n        if options[\"border\"]:\n            if options[\"hrules\"] in (ALL, FRAME):\n                bits.append(self._hrule)\n                bits.append(\"\\n\")\n            if options[\"vrules\"] in (ALL, FRAME):\n                bits.append(options[\"vertical_char\"])\n            else:\n                bits.append(\" \")\n        # For tables with no data or field names\n        if not self._field_names:\n            if options[\"vrules\"] in (ALL, FRAME):\n                bits.append(options[\"vertical_char\"])\n            else:\n                bits.append(\" \")\n        for field, width, in zip(self._field_names, self._widths):\n            if options[\"fields\"] and field not in options[\"fields\"]:\n                continue\n            if self._header_style == \"cap\":\n                fieldname = field.capitalize()\n            elif self._header_style == \"title\":\n                fieldname = field.title()\n            elif self._header_style == \"upper\":\n                fieldname = field.upper()\n            elif self._header_style == \"lower\":\n                fieldname = field.lower()\n            else:\n                fieldname = field\n            bits.append(\" \" * lpad + self._justify(fieldname, width, self._align[field]) + \" \" * rpad)\n            if options[\"border\"]:\n                if options[\"vrules\"] == ALL:\n                    bits.append(options[\"vertical_char\"])\n                else:\n                    bits.append(\" \")\n        # If vrules is FRAME, then we just appended a space at the end\n        # of the last field, when we really want a vertical character\n        if options[\"border\"] and options[\"vrules\"] == FRAME:\n            bits.pop()\n            bits.append(options[\"vertical_char\"])\n        if options[\"border\"] and options[\"hrules\"] != NONE:\n            bits.append(\"\\n\")\n            bits.append(self._hrule)\n        return \"\".join(bits)\n\n    def _stringify_row(self, row, options):\n       \n        for index, field, value, width, in zip(range(0,len(row)), self._field_names, row, self._widths):\n            # Enforce max widths\n            lines = value.split(\"\\n\")\n            new_lines = []\n            for line in lines: \n                if _str_block_width(line) > width:\n                    line = textwrap.fill(line, width)\n                new_lines.append(line)\n            lines = new_lines\n            value = \"\\n\".join(lines)\n            row[index] = value\n\n        row_height = 0\n        for c in row:\n            h = _get_size(c)[1]\n            if h > row_height:\n                row_height = h\n\n        bits = []\n        lpad, rpad = self._get_padding_widths(options)\n        for y in range(0, row_height):\n            bits.append([])\n            if options[\"border\"]:\n                if options[\"vrules\"] in (ALL, FRAME):\n                    bits[y].append(self.vertical_char)\n                else:\n                    bits[y].append(\" \")\n\n        for field, value, width, in zip(self._field_names, row, self._widths):\n\n            valign = self._valign[field]\n            lines = value.split(\"\\n\")\n            dHeight = row_height - len(lines)\n            if dHeight:\n                if valign == \"m\":\n                  lines = [\"\"] * int(dHeight / 2) + lines + [\"\"] * (dHeight - int(dHeight / 2))\n                elif valign == \"b\":\n                  lines = [\"\"] * dHeight + lines\n                else:\n                  lines = lines + [\"\"] * dHeight\n\n            y = 0\n            for l in lines:\n                if options[\"fields\"] and field not in options[\"fields\"]:\n                    continue\n\n                bits[y].append(\" \" * lpad + self._justify(l, width, self._align[field]) + \" \" * rpad)\n                if options[\"border\"]:\n                    if options[\"vrules\"] == ALL:\n                        bits[y].append(self.vertical_char)\n                    else:\n                        bits[y].append(\" \")\n                y += 1\n\n        # If vrules is FRAME, then we just appended a space at the end\n        # of the last field, when we really want a vertical character\n        for y in range(0, row_height):\n            if options[\"border\"] and options[\"vrules\"] == FRAME:\n                bits[y].pop()\n                bits[y].append(options[\"vertical_char\"])\n        \n        if options[\"border\"] and options[\"hrules\"]== ALL:\n            bits[row_height-1].append(\"\\n\")\n            bits[row_height-1].append(self._hrule)\n\n        for y in range(0, row_height):\n            bits[y] = \"\".join(bits[y])\n\n        return \"\\n\".join(bits)\n\n    ##############################\n    # HTML STRING METHODS        #\n    ##############################\n\n    def get_html_string(self, **kwargs):\n\n        \"\"\"Return string representation of HTML formatted version of table in current state.\n\n        Arguments:\n\n        start - index of first data row to include in output\n        end - index of last data row to include in output PLUS ONE (list slice style)\n        fields - names of fields (columns) to include\n        header - print a header showing field names (True or False)\n        border - print a border around the table (True or False)\n        hrules - controls printing of horizontal rules after rows.  Allowed values: ALL, FRAME, HEADER, NONE\n        vrules - controls printing of vertical rules between columns.  Allowed values: FRAME, ALL, NONE\n        int_format - controls formatting of integer data\n        float_format - controls formatting of floating point data\n        padding_width - number of spaces on either side of column data (only used if left and right paddings are None)\n        left_padding_width - number of spaces on left hand side of column data\n        right_padding_width - number of spaces on right hand side of column data\n        sortby - name of field to sort rows by\n        sort_key - sorting key function, applied to data points before sorting\n        attributes - dictionary of name/value pairs to include as HTML attributes in the <table> tag\n        xhtml - print <br/> tags if True, <br> tags if false\"\"\"\n\n        options = self._get_options(kwargs)\n\n        if options[\"format\"]:\n            string = self._get_formatted_html_string(options)\n        else:\n            string = self._get_simple_html_string(options)\n\n        return string\n\n    def _get_simple_html_string(self, options):\n\n        lines = []\n        if options[\"xhtml\"]:\n            linebreak = \"<br/>\"\n        else:\n            linebreak = \"<br>\"\n\n        open_tag = []\n        open_tag.append(\"<table\")\n        if options[\"attributes\"]:\n            for attr_name in options[\"attributes\"]:\n                open_tag.append(\" %s=\\\"%s\\\"\" % (attr_name, options[\"attributes\"][attr_name]))\n        open_tag.append(\">\")\n        lines.append(\"\".join(open_tag))\n\n        # Headers\n        if options[\"header\"]:\n            lines.append(\"    <tr>\")\n            for field in self._field_names:\n                if options[\"fields\"] and field not in options[\"fields\"]:\n                    continue\n                lines.append(\"        <th>%s</th>\" % escape(field).replace(\"\\n\", linebreak))\n            lines.append(\"    </tr>\")\n\n        # Data\n        rows = self._get_rows(options)\n        formatted_rows = self._format_rows(rows, options)\n        for row in formatted_rows:\n            lines.append(\"    <tr>\")\n            for field, datum in zip(self._field_names, row):\n                if options[\"fields\"] and field not in options[\"fields\"]:\n                    continue\n                lines.append(\"        <td>%s</td>\" % escape(datum).replace(\"\\n\", linebreak))\n            lines.append(\"    </tr>\")\n\n        lines.append(\"</table>\")\n\n        return self._unicode(\"\\n\").join(lines)\n\n    def _get_formatted_html_string(self, options):\n\n        lines = []\n        lpad, rpad = self._get_padding_widths(options)\n        if options[\"xhtml\"]:\n            linebreak = \"<br/>\"\n        else:\n            linebreak = \"<br>\"\n\n        open_tag = []\n        open_tag.append(\"<table\")\n        if options[\"border\"]:\n            if options[\"hrules\"] == ALL and options[\"vrules\"] == ALL:\n                open_tag.append(\" frame=\\\"box\\\" rules=\\\"all\\\"\")\n            elif options[\"hrules\"] == FRAME and options[\"vrules\"] == FRAME:\n                open_tag.append(\" frame=\\\"box\\\"\")\n            elif options[\"hrules\"] == FRAME and options[\"vrules\"] == ALL:\n                open_tag.append(\" frame=\\\"box\\\" rules=\\\"cols\\\"\")\n            elif options[\"hrules\"] == FRAME:\n                open_tag.append(\" frame=\\\"hsides\\\"\")\n            elif options[\"hrules\"] == ALL:\n                open_tag.append(\" frame=\\\"hsides\\\" rules=\\\"rows\\\"\")\n            elif options[\"vrules\"] == FRAME:\n                open_tag.append(\" frame=\\\"vsides\\\"\")\n            elif options[\"vrules\"] == ALL:\n                open_tag.append(\" frame=\\\"vsides\\\" rules=\\\"cols\\\"\")\n        if options[\"attributes\"]:\n            for attr_name in options[\"attributes\"]:\n                open_tag.append(\" %s=\\\"%s\\\"\" % (attr_name, options[\"attributes\"][attr_name]))\n        open_tag.append(\">\")\n        lines.append(\"\".join(open_tag))\n\n        # Headers\n        if options[\"header\"]:\n            lines.append(\"    <tr>\")\n            for field in self._field_names:\n                if options[\"fields\"] and field not in options[\"fields\"]:\n                    continue\n                lines.append(\"        <th style=\\\"padding-left: %dem; padding-right: %dem; text-align: center\\\">%s</th>\" % (lpad, rpad, escape(field).replace(\"\\n\", linebreak)))\n            lines.append(\"    </tr>\")\n\n        # Data\n        rows = self._get_rows(options)\n        formatted_rows = self._format_rows(rows, options)\n        aligns = []\n        valigns = []\n        for field in self._field_names:\n            aligns.append({ \"l\" : \"left\", \"r\" : \"right\", \"c\" : \"center\" }[self._align[field]])\n            valigns.append({\"t\" : \"top\", \"m\" : \"middle\", \"b\" : \"bottom\"}[self._valign[field]])\n        for row in formatted_rows:\n            lines.append(\"    <tr>\")\n            for field, datum, align, valign in zip(self._field_names, row, aligns, valigns):\n                if options[\"fields\"] and field not in options[\"fields\"]:\n                    continue\n                lines.append(\"        <td style=\\\"padding-left: %dem; padding-right: %dem; text-align: %s; vertical-align: %s\\\">%s</td>\" % (lpad, rpad, align, valign, escape(datum).replace(\"\\n\", linebreak)))\n            lines.append(\"    </tr>\")\n        lines.append(\"</table>\")\n\n        return self._unicode(\"\\n\").join(lines)\n\n##############################\n# UNICODE WIDTH FUNCTIONS    #\n##############################\n\ndef _char_block_width(char):\n    # Basic Latin, which is probably the most common case\n    #if char in xrange(0x0021, 0x007e):\n    #if char >= 0x0021 and char <= 0x007e:\n    if 0x0021 <= char <= 0x007e:\n        return 1\n    # Chinese, Japanese, Korean (common)\n    if 0x4e00 <= char <= 0x9fff:\n        return 2\n    # Hangul\n    if 0xac00 <= char <= 0xd7af:\n        return 2\n    # Combining?\n    if unicodedata.combining(uni_chr(char)):\n        return 0\n    # Hiragana and Katakana\n    if 0x3040 <= char <= 0x309f or 0x30a0 <= char <= 0x30ff:\n        return 2\n    # Full-width Latin characters\n    if 0xff01 <= char <= 0xff60:\n        return 2\n    # CJK punctuation\n    if 0x3000 <= char <= 0x303e:\n        return 2\n    # Backspace and delete\n    if char in (0x0008, 0x007f):\n        return -1\n    # Other control characters\n    elif char in (0x0000, 0x001f):\n        return 0\n    # Take a guess\n    return 1\n\ndef _str_block_width(val):\n\n    return sum(itermap(_char_block_width, itermap(ord, _re.sub(\"\", val))))\n\n##############################\n# TABLE FACTORIES            #\n##############################\n\ndef from_csv(fp, field_names = None, **kwargs):\n\n    dialect = csv.Sniffer().sniff(fp.read(1024))\n    fp.seek(0)\n    reader = csv.reader(fp, dialect)\n\n    table = PrettyTable(**kwargs)\n    if field_names:\n        table.field_names = field_names\n    else:\n        if py3k:\n            table.field_names = [x.strip() for x in next(reader)]\n        else:\n            table.field_names = [x.strip() for x in reader.next()]\n\n    for row in reader:\n        table.add_row([x.strip() for x in row])\n\n    return table\n\ndef from_db_cursor(cursor, **kwargs):\n\n    if cursor.description:\n        table = PrettyTable(**kwargs)\n        table.field_names = [col[0] for col in cursor.description]\n        for row in cursor.fetchall():\n            table.add_row(row)\n        return table\n\nclass TableHandler(HTMLParser):\n\n    def __init__(self, **kwargs):\n        HTMLParser.__init__(self)\n        self.kwargs = kwargs\n        self.tables = []\n        self.last_row = []\n        self.rows = []\n        self.max_row_width = 0\n        self.active = None\n        self.last_content = \"\"\n        self.is_last_row_header = False\n\n    def handle_starttag(self,tag, attrs):\n        self.active = tag\n        if tag == \"th\":\n            self.is_last_row_header = True\n\n    def handle_endtag(self,tag):\n        if tag in [\"th\", \"td\"]:\n            stripped_content = self.last_content.strip()\n            self.last_row.append(stripped_content)\n        if tag == \"tr\":\n            self.rows.append(\n                (self.last_row, self.is_last_row_header))\n            self.max_row_width = max(self.max_row_width, len(self.last_row))\n            self.last_row = []\n            self.is_last_row_header = False\n        if tag == \"table\":\n            table = self.generate_table(self.rows)\n            self.tables.append(table)\n            self.rows = []\n        self.last_content = \" \"\n        self.active = None\n\n\n    def handle_data(self, data):\n        self.last_content += data\n\n    def generate_table(self, rows):\n        \"\"\"\n        Generates from a list of rows a PrettyTable object.\n        \"\"\"\n        table = PrettyTable(**self.kwargs)\n        for row in self.rows:\n            if len(row[0]) < self.max_row_width:\n                appends = self.max_row_width - len(row[0])\n                for i in range(1,appends):\n                    row[0].append(\"-\")\n\n            if row[1] == True:\n                self.make_fields_unique(row[0])\n                table.field_names = row[0]\n            else:\n                table.add_row(row[0])\n        return table\n\n    def make_fields_unique(self, fields):\n        \"\"\"\n        iterates over the row and make each field unique\n        \"\"\"\n        for i in range(0, len(fields)):\n            for j in range(i+1, len(fields)):\n                if fields[i] == fields[j]:\n                    fields[j] += \"'\"\n\ndef from_html(html_code, **kwargs):\n    \"\"\"\n    Generates a list of PrettyTables from a string of HTML code. Each <table> in\n    the HTML becomes one PrettyTable object.\n    \"\"\"\n\n    parser = TableHandler(**kwargs)\n    parser.feed(html_code)\n    return parser.tables\n\ndef from_html_one(html_code, **kwargs):\n    \"\"\"\n    Generates a PrettyTables from a string of HTML code which contains only a\n    single <table>\n    \"\"\"\n\n    tables = from_html(html_code, **kwargs)\n    try:\n        assert len(tables) == 1\n    except AssertionError:\n        raise Exception(\"More than one <table> in provided HTML code!  Use from_html instead.\")\n    return tables[0]\n\n##############################\n# MAIN (TEST FUNCTION)       #\n##############################\n\ndef main():\n\n    x = PrettyTable([\"City name\", \"Area\", \"Population\", \"Annual Rainfall\"])\n    x.sortby = \"Population\"\n    x.reversesort = True\n    x.int_format[\"Area\"] = \"04d\"\n    x.float_format = \"6.1f\"\n    x.align[\"City name\"] = \"l\" # Left align city names\n    x.add_row([\"Adelaide\", 1295, 1158259, 600.5])\n    x.add_row([\"Brisbane\", 5905, 1857594, 1146.4])\n    x.add_row([\"Darwin\", 112, 120900, 1714.7])\n    x.add_row([\"Hobart\", 1357, 205556, 619.5])\n    x.add_row([\"Sydney\", 2058, 4336374, 1214.8])\n    x.add_row([\"Melbourne\", 1566, 3806092, 646.9])\n    x.add_row([\"Perth\", 5386, 1554769, 869.4])\n    print(x)\n    \nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "thirdparty_libs/requests/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n\n#   __\n#  /__)  _  _     _   _ _/   _\n# / (   (- (/ (/ (- _)  /  _)\n#          /\n\n\"\"\"\nrequests HTTP library\n~~~~~~~~~~~~~~~~~~~~~\n\nRequests is an HTTP library, written in Python, for human beings. Basic GET\nusage:\n\n   >>> import requests\n   >>> r = requests.get('http://python.org')\n   >>> r.status_code\n   200\n   >>> 'Python is a programming language' in r.content\n   True\n\n... or POST:\n\n   >>> payload = dict(key1='value1', key2='value2')\n   >>> r = requests.post(\"http://httpbin.org/post\", data=payload)\n   >>> print r.text\n   {\n     ...\n     \"form\": {\n       \"key2\": \"value2\",\n       \"key1\": \"value1\"\n     },\n     ...\n   }\n\nThe other HTTP methods are supported - see `requests.api`. Full documentation\nis at <http://python-requests.org>.\n\n:copyright: (c) 2013 by Kenneth Reitz.\n:license: Apache 2.0, see LICENSE for more details.\n\n\"\"\"\n\n__title__ = 'requests'\n__version__ = '1.2.3'\n__build__ = 0x010203\n__author__ = 'Kenneth Reitz'\n__license__ = 'Apache 2.0'\n__copyright__ = 'Copyright 2013 Kenneth Reitz'\n\n# Attempt to enable urllib3's SNI support, if possible\ntry:\n    from requests.packages.urllib3.contrib import pyopenssl\n    pyopenssl.inject_into_urllib3()\nexcept ImportError:\n    pass\n\nfrom . import utils\nfrom .models import Request, Response, PreparedRequest\nfrom .api import request, get, head, post, patch, put, delete, options\nfrom .sessions import session, Session\nfrom .status_codes import codes\nfrom .exceptions import (\n    RequestException, Timeout, URLRequired,\n    TooManyRedirects, HTTPError, ConnectionError\n)\n\n# Set default logging handler to avoid \"No handler found\" warnings.\nimport logging\ntry:  # Python 2.7+\n    from logging import NullHandler\nexcept ImportError:\n    class NullHandler(logging.Handler):\n        def emit(self, record):\n            pass\n\nlogging.getLogger(__name__).addHandler(NullHandler())\n"
  },
  {
    "path": "thirdparty_libs/requests/adapters.py",
    "content": "# -*- coding: utf-8 -*-\n\n\"\"\"\nrequests.adapters\n~~~~~~~~~~~~~~~~~\n\nThis module contains the transport adapters that Requests uses to define\nand maintain connections.\n\"\"\"\n\nimport socket\n\nfrom .models import Response\nfrom .packages.urllib3.poolmanager import PoolManager, ProxyManager\nfrom .packages.urllib3.response import HTTPResponse\nfrom .compat import urlparse, basestring, urldefrag, unquote\nfrom .utils import (DEFAULT_CA_BUNDLE_PATH, get_encoding_from_headers,\n                    prepend_scheme_if_needed, get_auth_from_url)\nfrom .structures import CaseInsensitiveDict\nfrom .packages.urllib3.exceptions import MaxRetryError\nfrom .packages.urllib3.exceptions import TimeoutError\nfrom .packages.urllib3.exceptions import SSLError as _SSLError\nfrom .packages.urllib3.exceptions import HTTPError as _HTTPError\nfrom .cookies import extract_cookies_to_jar\nfrom .exceptions import ConnectionError, Timeout, SSLError\nfrom .auth import _basic_auth_str\n\nDEFAULT_POOLBLOCK = False\nDEFAULT_POOLSIZE = 10\nDEFAULT_RETRIES = 0\n\n\nclass BaseAdapter(object):\n    \"\"\"The Base Transport Adapter\"\"\"\n\n    def __init__(self):\n        super(BaseAdapter, self).__init__()\n\n    def send(self):\n        raise NotImplementedError\n\n    def close(self):\n        raise NotImplementedError\n\n\nclass HTTPAdapter(BaseAdapter):\n    \"\"\"The built-in HTTP Adapter for urllib3.\n\n    Provides a general-case interface for Requests sessions to contact HTTP and\n    HTTPS urls by implementing the Transport Adapter interface. This class will\n    usually be created by the :class:`Session <Session>` class under the\n    covers.\n\n    :param pool_connections: The number of urllib3 connection pools to cache.\n    :param pool_maxsize: The maximum number of connections to save in the pool.\n    :param max_retries: The maximum number of retries each connection should attempt.\n    :param pool_block: Whether the connection pool should block for connections.\n\n    Usage::\n\n      >>> import requests\n      >>> s = requests.Session()\n      >>> a = requests.adapters.HTTPAdapter()\n      >>> s.mount('http://', a)\n    \"\"\"\n    __attrs__ = ['max_retries', 'config', '_pool_connections', '_pool_maxsize',\n                 '_pool_block']\n\n    def __init__(self, pool_connections=DEFAULT_POOLSIZE,\n                 pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES,\n                 pool_block=DEFAULT_POOLBLOCK):\n        self.max_retries = max_retries\n        self.config = {}\n\n        super(HTTPAdapter, self).__init__()\n\n        self._pool_connections = pool_connections\n        self._pool_maxsize = pool_maxsize\n        self._pool_block = pool_block\n\n        self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block)\n\n    def __getstate__(self):\n        return dict((attr, getattr(self, attr, None)) for attr in\n                    self.__attrs__)\n\n    def __setstate__(self, state):\n        for attr, value in state.items():\n            setattr(self, attr, value)\n\n        self.init_poolmanager(self._pool_connections, self._pool_maxsize,\n                              block=self._pool_block)\n\n    def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK):\n        \"\"\"Initializes a urllib3 PoolManager. This method should not be called\n        from user code, and is only exposed for use when subclassing the\n        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.\n\n        :param connections: The number of urllib3 connection pools to cache.\n        :param maxsize: The maximum number of connections to save in the pool.\n        :param block: Block when no free connections are available.\n        \"\"\"\n        # save these values for pickling\n        self._pool_connections = connections\n        self._pool_maxsize = maxsize\n        self._pool_block = block\n\n        self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize,\n                                       block=block)\n\n    def cert_verify(self, conn, url, verify, cert):\n        \"\"\"Verify a SSL certificate. This method should not be called from user\n        code, and is only exposed for use when subclassing the\n        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.\n\n        :param conn: The urllib3 connection object associated with the cert.\n        :param url: The requested URL.\n        :param verify: Whether we should actually verify the certificate.\n        :param cert: The SSL certificate to verify.\n        \"\"\"\n        if url.lower().startswith('https') and verify:\n\n            cert_loc = None\n\n            # Allow self-specified cert location.\n            if verify is not True:\n                cert_loc = verify\n\n            if not cert_loc:\n                cert_loc = DEFAULT_CA_BUNDLE_PATH\n\n            if not cert_loc:\n                raise Exception(\"Could not find a suitable SSL CA certificate bundle.\")\n\n            conn.cert_reqs = 'CERT_REQUIRED'\n            conn.ca_certs = cert_loc\n        else:\n            conn.cert_reqs = 'CERT_NONE'\n            conn.ca_certs = None\n\n        if cert:\n            if not isinstance(cert, basestring):\n                conn.cert_file = cert[0]\n                conn.key_file = cert[1]\n            else:\n                conn.cert_file = cert\n\n    def build_response(self, req, resp):\n        \"\"\"Builds a :class:`Response <requests.Response>` object from a urllib3\n        response. This should not be called from user code, and is only exposed\n        for use when subclassing the\n        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`\n\n        :param req: The :class:`PreparedRequest <PreparedRequest>` used to generate the response.\n        :param resp: The urllib3 response object.\n        \"\"\"\n        response = Response()\n\n        # Fallback to None if there's no status_code, for whatever reason.\n        response.status_code = getattr(resp, 'status', None)\n\n        # Make headers case-insensitive.\n        response.headers = CaseInsensitiveDict(getattr(resp, 'headers', {}))\n\n        # Set encoding.\n        response.encoding = get_encoding_from_headers(response.headers)\n        response.raw = resp\n        response.reason = response.raw.reason\n\n        if isinstance(req.url, bytes):\n            response.url = req.url.decode('utf-8')\n        else:\n            response.url = req.url\n\n        # Add new cookies from the server.\n        extract_cookies_to_jar(response.cookies, req, resp)\n\n        # Give the Response some context.\n        response.request = req\n        response.connection = self\n\n        return response\n\n    def get_connection(self, url, proxies=None):\n        \"\"\"Returns a urllib3 connection for the given URL. This should not be\n        called from user code, and is only exposed for use when subclassing the\n        :class:`HTTPAdapter <reqeusts.adapters.HTTPAdapter>`.\n\n        :param url: The URL to connect to.\n        :param proxies: (optional) A Requests-style dictionary of proxies used on this request.\n        \"\"\"\n        proxies = proxies or {}\n        proxy = proxies.get(urlparse(url.lower()).scheme)\n\n        if proxy:\n            proxy = prepend_scheme_if_needed(proxy, urlparse(url.lower()).scheme)\n            conn = ProxyManager(self.poolmanager.connection_from_url(proxy))\n        else:\n            conn = self.poolmanager.connection_from_url(url.lower())\n\n        return conn\n\n    def close(self):\n        \"\"\"Disposes of any internal state.\n\n        Currently, this just closes the PoolManager, which closes pooled\n        connections.\n        \"\"\"\n        self.poolmanager.clear()\n\n    def request_url(self, request, proxies):\n        \"\"\"Obtain the url to use when making the final request.\n\n        If the message is being sent through a proxy, the full URL has to be\n        used. Otherwise, we should only use the path portion of the URL.\n\n        This should not be called from user code, and is only exposed for use\n        when subclassing the\n        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.\n\n        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.\n        :param proxies: A dictionary of schemes to proxy URLs.\n        \"\"\"\n        proxies = proxies or {}\n        proxy = proxies.get(urlparse(request.url).scheme)\n\n        if proxy:\n            url, _ = urldefrag(request.url)\n        else:\n            url = request.path_url\n\n        return url\n\n    def add_headers(self, request, **kwargs):\n        \"\"\"Add any headers needed by the connection. Currently this adds a\n        Proxy-Authorization header.\n\n        This should not be called from user code, and is only exposed for use\n        when subclassing the\n        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.\n\n        :param request: The :class:`PreparedRequest <PreparedRequest>` to add headers to.\n        :param kwargs: The keyword arguments from the call to send().\n        \"\"\"\n        proxies = kwargs.get('proxies', {})\n\n        if proxies is None:\n            proxies = {}\n\n        proxy = proxies.get(urlparse(request.url).scheme)\n        username, password = get_auth_from_url(proxy)\n\n        if username and password:\n            # Proxy auth usernames and passwords will be urlencoded, we need\n            # to decode them.\n            username = unquote(username)\n            password = unquote(password)\n            request.headers['Proxy-Authorization'] = _basic_auth_str(username,\n                                                                     password)\n\n    def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None):\n        \"\"\"Sends PreparedRequest object. Returns Response object.\n\n        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.\n        :param stream: (optional) Whether to stream the request content.\n        :param timeout: (optional) The timeout on the request.\n        :param verify: (optional) Whether to verify SSL certificates.\n        :param vert: (optional) Any user-provided SSL certificate to be trusted.\n        :param proxies: (optional) The proxies dictionary to apply to the request.\n        \"\"\"\n\n        conn = self.get_connection(request.url, proxies)\n\n        self.cert_verify(conn, request.url, verify, cert)\n        url = self.request_url(request, proxies)\n        self.add_headers(request, proxies=proxies)\n\n        chunked = not (request.body is None or 'Content-Length' in request.headers)\n\n        try:\n            if not chunked:\n                resp = conn.urlopen(\n                    method=request.method,\n                    url=url,\n                    body=request.body,\n                    headers=request.headers,\n                    redirect=False,\n                    assert_same_host=False,\n                    preload_content=False,\n                    decode_content=False,\n                    retries=self.max_retries,\n                    timeout=timeout\n                )\n\n            # Send the request.\n            else:\n                if hasattr(conn, 'proxy_pool'):\n                    conn = conn.proxy_pool\n\n                low_conn = conn._get_conn(timeout=timeout)\n                low_conn.putrequest(request.method, url, skip_accept_encoding=True)\n\n                for header, value in request.headers.items():\n                    low_conn.putheader(header, value)\n\n                low_conn.endheaders()\n\n                for i in request.body:\n                    low_conn.send(hex(len(i))[2:].encode('utf-8'))\n                    low_conn.send(b'\\r\\n')\n                    low_conn.send(i)\n                    low_conn.send(b'\\r\\n')\n                low_conn.send(b'0\\r\\n\\r\\n')\n\n                r = low_conn.getresponse()\n                resp = HTTPResponse.from_httplib(r,\n                    pool=conn,\n                    connection=low_conn,\n                    preload_content=False,\n                    decode_content=False\n                )\n\n        except socket.error as sockerr:\n            raise ConnectionError(sockerr)\n\n        except MaxRetryError as e:\n            raise ConnectionError(e)\n\n        except (_SSLError, _HTTPError) as e:\n            if isinstance(e, _SSLError):\n                raise SSLError(e)\n            elif isinstance(e, TimeoutError):\n                raise Timeout(e)\n            else:\n                raise\n\n        r = self.build_response(request, resp)\n\n        if not stream:\n            r.content\n\n        return r\n"
  },
  {
    "path": "thirdparty_libs/requests/api.py",
    "content": "# -*- coding: utf-8 -*-\n\n\"\"\"\nrequests.api\n~~~~~~~~~~~~\n\nThis module implements the Requests API.\n\n:copyright: (c) 2012 by Kenneth Reitz.\n:license: Apache2, see LICENSE for more details.\n\n\"\"\"\n\nfrom . import sessions\n\n\ndef request(method, url, **kwargs):\n    \"\"\"Constructs and sends a :class:`Request <Request>`.\n    Returns :class:`Response <Response>` object.\n\n    :param method: method for the new :class:`Request` object.\n    :param url: URL for the new :class:`Request` object.\n    :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`.\n    :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.\n    :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`.\n    :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`.\n    :param files: (optional) Dictionary of 'name': file-like-objects (or {'name': ('filename', fileobj)}) for multipart encoding upload.\n    :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth.\n    :param timeout: (optional) Float describing the timeout of the request.\n    :param allow_redirects: (optional) Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.\n    :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy.\n    :param verify: (optional) if ``True``, the SSL cert will be verified. A CA_BUNDLE path can also be provided.\n    :param stream: (optional) if ``False``, the response content will be immediately downloaded.\n    :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair.\n\n    Usage::\n\n      >>> import requests\n      >>> req = requests.request('GET', 'http://httpbin.org/get')\n      <Response [200]>\n    \"\"\"\n\n    session = sessions.Session()\n    return session.request(method=method, url=url, **kwargs)\n\n\ndef get(url, **kwargs):\n    \"\"\"Sends a GET request. Returns :class:`Response` object.\n\n    :param url: URL for the new :class:`Request` object.\n    :param \\*\\*kwargs: Optional arguments that ``request`` takes.\n    \"\"\"\n\n    kwargs.setdefault('allow_redirects', True)\n    return request('get', url, **kwargs)\n\n\ndef options(url, **kwargs):\n    \"\"\"Sends a OPTIONS request. Returns :class:`Response` object.\n\n    :param url: URL for the new :class:`Request` object.\n    :param \\*\\*kwargs: Optional arguments that ``request`` takes.\n    \"\"\"\n\n    kwargs.setdefault('allow_redirects', True)\n    return request('options', url, **kwargs)\n\n\ndef head(url, **kwargs):\n    \"\"\"Sends a HEAD request. Returns :class:`Response` object.\n\n    :param url: URL for the new :class:`Request` object.\n    :param \\*\\*kwargs: Optional arguments that ``request`` takes.\n    \"\"\"\n\n    kwargs.setdefault('allow_redirects', False)\n    return request('head', url, **kwargs)\n\n\ndef post(url, data=None, **kwargs):\n    \"\"\"Sends a POST request. Returns :class:`Response` object.\n\n    :param url: URL for the new :class:`Request` object.\n    :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.\n    :param \\*\\*kwargs: Optional arguments that ``request`` takes.\n    \"\"\"\n\n    return request('post', url, data=data, **kwargs)\n\n\ndef put(url, data=None, **kwargs):\n    \"\"\"Sends a PUT request. Returns :class:`Response` object.\n\n    :param url: URL for the new :class:`Request` object.\n    :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.\n    :param \\*\\*kwargs: Optional arguments that ``request`` takes.\n    \"\"\"\n\n    return request('put', url, data=data, **kwargs)\n\n\ndef patch(url, data=None, **kwargs):\n    \"\"\"Sends a PATCH request. Returns :class:`Response` object.\n\n    :param url: URL for the new :class:`Request` object.\n    :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.\n    :param \\*\\*kwargs: Optional arguments that ``request`` takes.\n    \"\"\"\n\n    return request('patch', url,  data=data, **kwargs)\n\n\ndef delete(url, **kwargs):\n    \"\"\"Sends a DELETE request. Returns :class:`Response` object.\n\n    :param url: URL for the new :class:`Request` object.\n    :param \\*\\*kwargs: Optional arguments that ``request`` takes.\n    \"\"\"\n\n    return request('delete', url, **kwargs)\n"
  },
  {
    "path": "thirdparty_libs/requests/auth.py",
    "content": "# -*- coding: utf-8 -*-\n\n\"\"\"\nrequests.auth\n~~~~~~~~~~~~~\n\nThis module contains the authentication handlers for Requests.\n\"\"\"\n\nimport os\nimport re\nimport time\nimport hashlib\nimport logging\n\nfrom base64 import b64encode\n\nfrom .compat import urlparse, str\nfrom .utils import parse_dict_header\n\n\nlog = logging.getLogger(__name__)\n\nCONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded'\nCONTENT_TYPE_MULTI_PART = 'multipart/form-data'\n\n\ndef _basic_auth_str(username, password):\n    \"\"\"Returns a Basic Auth string.\"\"\"\n\n    return 'Basic ' + b64encode(('%s:%s' % (username, password)).encode('latin1')).strip().decode('latin1')\n\n\nclass AuthBase(object):\n    \"\"\"Base class that all auth implementations derive from\"\"\"\n\n    def __call__(self, r):\n        raise NotImplementedError('Auth hooks must be callable.')\n\n\nclass HTTPBasicAuth(AuthBase):\n    \"\"\"Attaches HTTP Basic Authentication to the given Request object.\"\"\"\n    def __init__(self, username, password):\n        self.username = username\n        self.password = password\n\n    def __call__(self, r):\n        r.headers['Authorization'] = _basic_auth_str(self.username, self.password)\n        return r\n\n\nclass HTTPProxyAuth(HTTPBasicAuth):\n    \"\"\"Attaches HTTP Proxy Authentication to a given Request object.\"\"\"\n    def __call__(self, r):\n        r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password)\n        return r\n\n\nclass HTTPDigestAuth(AuthBase):\n    \"\"\"Attaches HTTP Digest Authentication to the given Request object.\"\"\"\n    def __init__(self, username, password):\n        self.username = username\n        self.password = password\n        self.last_nonce = ''\n        self.nonce_count = 0\n        self.chal = {}\n\n    def build_digest_header(self, method, url):\n\n        realm = self.chal['realm']\n        nonce = self.chal['nonce']\n        qop = self.chal.get('qop')\n        algorithm = self.chal.get('algorithm')\n        opaque = self.chal.get('opaque')\n\n        if algorithm is None:\n            _algorithm = 'MD5'\n        else:\n            _algorithm = algorithm.upper()\n        # lambdas assume digest modules are imported at the top level\n        if _algorithm == 'MD5':\n            def md5_utf8(x):\n                if isinstance(x, str):\n                    x = x.encode('utf-8')\n                return hashlib.md5(x).hexdigest()\n            hash_utf8 = md5_utf8\n        elif _algorithm == 'SHA':\n            def sha_utf8(x):\n                if isinstance(x, str):\n                    x = x.encode('utf-8')\n                return hashlib.sha1(x).hexdigest()\n            hash_utf8 = sha_utf8\n        # XXX MD5-sess\n        KD = lambda s, d: hash_utf8(\"%s:%s\" % (s, d))\n\n        if hash_utf8 is None:\n            return None\n\n        # XXX not implemented yet\n        entdig = None\n        p_parsed = urlparse(url)\n        path = p_parsed.path\n        if p_parsed.query:\n            path += '?' + p_parsed.query\n\n        A1 = '%s:%s:%s' % (self.username, realm, self.password)\n        A2 = '%s:%s' % (method, path)\n\n        if qop == 'auth':\n            if nonce == self.last_nonce:\n                self.nonce_count += 1\n            else:\n                self.nonce_count = 1\n\n            ncvalue = '%08x' % self.nonce_count\n            s = str(self.nonce_count).encode('utf-8')\n            s += nonce.encode('utf-8')\n            s += time.ctime().encode('utf-8')\n            s += os.urandom(8)\n\n            cnonce = (hashlib.sha1(s).hexdigest()[:16])\n            noncebit = \"%s:%s:%s:%s:%s\" % (nonce, ncvalue, cnonce, qop, hash_utf8(A2))\n            respdig = KD(hash_utf8(A1), noncebit)\n        elif qop is None:\n            respdig = KD(hash_utf8(A1), \"%s:%s\" % (nonce, hash_utf8(A2)))\n        else:\n            # XXX handle auth-int.\n            return None\n\n        self.last_nonce = nonce\n\n        # XXX should the partial digests be encoded too?\n        base = 'username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"%s\", ' \\\n               'response=\"%s\"' % (self.username, realm, nonce, path, respdig)\n        if opaque:\n            base += ', opaque=\"%s\"' % opaque\n        if algorithm:\n            base += ', algorithm=\"%s\"' % algorithm\n        if entdig:\n            base += ', digest=\"%s\"' % entdig\n        if qop:\n            base += ', qop=auth, nc=%s, cnonce=\"%s\"' % (ncvalue, cnonce)\n\n        return 'Digest %s' % (base)\n\n    def handle_401(self, r, **kwargs):\n        \"\"\"Takes the given response and tries digest-auth, if needed.\"\"\"\n\n        num_401_calls = getattr(self, 'num_401_calls', 1)\n        s_auth = r.headers.get('www-authenticate', '')\n\n        if 'digest' in s_auth.lower() and num_401_calls < 2:\n\n            setattr(self, 'num_401_calls', num_401_calls + 1)\n            pat = re.compile(r'digest ', flags=re.IGNORECASE)\n            self.chal = parse_dict_header(pat.sub('', s_auth, count=1))\n\n            # Consume content and release the original connection\n            # to allow our new request to reuse the same one.\n            r.content\n            r.raw.release_conn()\n\n            r.request.headers['Authorization'] = self.build_digest_header(r.request.method, r.request.url)\n            _r = r.connection.send(r.request, **kwargs)\n            _r.history.append(r)\n\n            return _r\n\n        setattr(self, 'num_401_calls', 1)\n        return r\n\n    def __call__(self, r):\n        # If we have a saved nonce, skip the 401\n        if self.last_nonce:\n            r.headers['Authorization'] = self.build_digest_header(r.method, r.url)\n        r.register_hook('response', self.handle_401)\n        return r\n"
  },
  {
    "path": "thirdparty_libs/requests/cacert.pem",
    "content": "##\n## ca-bundle.crt -- Bundle of CA Root Certificates\n##\n## Certificate data from Mozilla as of: Wed Jan 18 00:04:16 2012\n##\n## This is a bundle of X.509 certificates of public Certificate Authorities\n## (CA). These were automatically extracted from Mozilla's root certificates\n## file (certdata.txt).  This file can be found in the mozilla source tree:\n## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1\n##\n## It contains the certificates in PEM format and therefore\n## can be directly used with curl / libcurl / php_curl, or with\n## an Apache+mod_ssl webserver for SSL client authentication.\n## Just configure this file as the SSLCACertificateFile.\n##\n\n# ***** BEGIN LICENSE BLOCK *****\n# Version: MPL 1.1/GPL 2.0/LGPL 2.1\n#\n# The contents of this file are subject to the Mozilla Public License Version\n# 1.1 (the \"License\"); you may not use this file except in compliance with\n# the License. You may obtain a copy of the License at\n# http://www.mozilla.org/MPL/\n#\n# Software distributed under the License is distributed on an \"AS IS\" basis,\n# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License\n# for the specific language governing rights and limitations under the\n# License.\n#\n# The Original Code is the Netscape security libraries.\n#\n# The Initial Developer of the Original Code is\n# Netscape Communications Corporation.\n# Portions created by the Initial Developer are Copyright (C) 1994-2000\n# the Initial Developer. All Rights Reserved.\n#\n# Contributor(s):\n#\n# Alternatively, the contents of this file may be used under the terms of\n# either the GNU General Public License Version 2 or later (the \"GPL\"), or\n# the GNU Lesser General Public License Version 2.1 or later (the \"LGPL\"),\n# in which case the provisions of the GPL or the LGPL are applicable instead\n# of those above. If you wish to allow use of your version of this file only\n# under the terms of either the GPL or the LGPL, and not to allow others to\n# use your version of this file under the terms of the MPL, indicate your\n# decision by deleting the provisions above and replace them with the notice\n# and other provisions required by the GPL or the LGPL. If you do not delete\n# the provisions above, a recipient may use your version of this file under\n# the terms of any one of the MPL, the GPL or the LGPL.\n#\n# ***** END LICENSE BLOCK *****\n# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.81 $ $Date: 2012/01/17 22:02:37 $\n\nGTE CyberTrust Global Root\n==========================\n-----BEGIN CERTIFICATE-----\nMIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg\nQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG\nA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz\nMjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL\nEx5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0\nIEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u\nsJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql\nHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID\nAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW\nM4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF\nNMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/\n-----END CERTIFICATE-----\n\nThawte Server CA\n================\n-----BEGIN CERTIFICATE-----\nMIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT\nDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs\ndGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE\nAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j\nb20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV\nBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u\nc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG\nA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0\nZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl\n/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7\n1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR\nMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J\nGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ\nGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc=\n-----END CERTIFICATE-----\n\nThawte Premium Server CA\n========================\n-----BEGIN CERTIFICATE-----\nMIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT\nDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs\ndGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE\nAxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl\nckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT\nAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU\nVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2\naXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ\ncHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2\naovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh\nUdib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/\nqgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm\nSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf\n8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t\nUCemDaYj+bvLpgcUQg==\n-----END CERTIFICATE-----\n\nEquifax Secure CA\n=================\n-----BEGIN CERTIFICATE-----\nMIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE\nChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5\nMB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT\nB0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB\nnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR\nfM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW\n8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG\nA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE\nCxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG\nA1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS\nspXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB\nAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961\nzgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB\nBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95\n70+sB3c4\n-----END CERTIFICATE-----\n\nDigital Signature Trust Co. Global CA 1\n=======================================\n-----BEGIN CERTIFICATE-----\nMIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE\nChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy\nMTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs\nIFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA\nA4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE\nNySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i\no74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo\nBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0\ndXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw\nIoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY\nMBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM\nBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB\nACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq\nkzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4\nRbyhkwS7hp86W0N6w4pl\n-----END CERTIFICATE-----\n\nDigital Signature Trust Co. Global CA 3\n=======================================\n-----BEGIN CERTIFICATE-----\nMIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE\nChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy\nMDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs\nIFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA\nA4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD\nVvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS\nxhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo\nBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0\ndXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw\nIoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY\nMBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM\nBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB\nAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi\nup/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1\nmPnHfxsb1gYgAlihw6ID\n-----END CERTIFICATE-----\n\nVerisign Class 3 Public Primary Certification Authority\n=======================================================\n-----BEGIN CERTIFICATE-----\nMIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx\nFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5\nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow\nXzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz\nIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA\nA4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94\nf56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol\nhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA\nTxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah\nWM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf\nTqj/ZA1k\n-----END CERTIFICATE-----\n\nVerisign Class 3 Public Primary Certification Authority - G2\n============================================================\n-----BEGIN CERTIFICATE-----\nMIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT\nMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy\neSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln\nbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz\ndCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT\nMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy\neSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln\nbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz\ndCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO\nFoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71\nlSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB\nMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT\n1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD\nOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9\n-----END CERTIFICATE-----\n\nGlobalSign Root CA\n==================\n-----BEGIN CERTIFICATE-----\nMIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx\nGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds\nb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV\nBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD\nVQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa\nDuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc\nTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb\nKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP\nc1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX\ngzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\nHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF\nAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj\nY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG\nj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH\nhm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC\nX4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==\n-----END CERTIFICATE-----\n\nGlobalSign Root CA - R2\n=======================\n-----BEGIN CERTIFICATE-----\nMIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv\nYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh\nbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT\naWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln\nbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6\nErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp\ns6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN\nS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL\nTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C\nygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E\nFgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i\nYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN\nBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp\n9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu\n01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7\n9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7\nTBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==\n-----END CERTIFICATE-----\n\nValiCert Class 1 VA\n===================\n-----BEGIN CERTIFICATE-----\nMIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp\nb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs\nYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh\nbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy\nMjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0\nd29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg\nUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0\nLmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA\nA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi\nGQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm\nDuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG\nlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX\nicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP\nOrf1LXLI\n-----END CERTIFICATE-----\n\nValiCert Class 2 VA\n===================\n-----BEGIN CERTIFICATE-----\nMIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp\nb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs\nYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh\nbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw\nMTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0\nd29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg\nUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0\nLmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA\nA4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC\nCSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf\nZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ\nSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV\nUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8\nW9ViH0Pd\n-----END CERTIFICATE-----\n\nRSA Root Certificate 1\n======================\n-----BEGIN CERTIFICATE-----\nMIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp\nb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs\nYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh\nbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw\nMjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0\nd29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg\nUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0\nLmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA\nA4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td\n3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H\nBFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs\n3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF\nV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r\non+jjBXu\n-----END CERTIFICATE-----\n\nVerisign Class 3 Public Primary Certification Authority - G3\n============================================================\n-----BEGIN CERTIFICATE-----\nMIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV\nUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv\ncmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl\nIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh\ndGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw\nCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy\ndXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv\ncml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg\nQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1\nEUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc\ncLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw\nEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj\n055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA\nERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f\nj267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC\n/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0\nxuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa\nt20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==\n-----END CERTIFICATE-----\n\nVerisign Class 4 Public Primary Certification Authority - G3\n============================================================\n-----BEGIN CERTIFICATE-----\nMIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV\nUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv\ncmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl\nIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh\ndGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw\nCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy\ndXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv\ncml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg\nQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS\ntBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM\n8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW\nLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX\nRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA\nj/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt\nmhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm\nfjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd\nRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG\nUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==\n-----END CERTIFICATE-----\n\nEntrust.net Secure Server CA\n============================\n-----BEGIN CERTIFICATE-----\nMIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV\nBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg\ncmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl\nZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv\ncml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG\nA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi\neSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p\ndGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0\naG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ\naO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5\ngXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw\nggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw\nCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l\ndC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF\nbnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl\ncnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu\ndHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw\nNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow\nHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA\nBAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN\nEwr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9\nn9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=\n-----END CERTIFICATE-----\n\nEntrust.net Premium 2048 Secure Server CA\n=========================================\n-----BEGIN CERTIFICATE-----\nMIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u\nZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp\nbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV\nBAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx\nNzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3\nd3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl\nMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u\nZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\nMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL\nGp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr\nhRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW\nnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi\nVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC\nAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER\ngL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B\nAQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo\noPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS\no8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z\n2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX\nOP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ==\n-----END CERTIFICATE-----\n\nBaltimore CyberTrust Root\n=========================\n-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE\nChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li\nZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC\nSUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs\ndGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME\nuyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB\nUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C\nG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9\nXbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr\nl3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI\nVDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB\nBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh\ncL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5\nhbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa\nY71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H\nRCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp\n-----END CERTIFICATE-----\n\nEquifax Secure Global eBusiness CA\n==================================\n-----BEGIN CERTIFICATE-----\nMIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT\nRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp\nbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx\nHDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds\nb2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV\nPEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN\nqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn\nhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j\nBBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs\nMA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN\nI7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY\nNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV\n-----END CERTIFICATE-----\n\nEquifax Secure eBusiness CA 1\n=============================\n-----BEGIN CERTIFICATE-----\nMIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT\nRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB\nLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE\nChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz\nIENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ\n1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a\nIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk\nMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW\nNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF\nAAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5\nlSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+\nKpYrtWKmpj29f5JZzVoqgrI3eQ==\n-----END CERTIFICATE-----\n\nEquifax Secure eBusiness CA 2\n=============================\n-----BEGIN CERTIFICATE-----\nMIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE\nChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y\nMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT\nDkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB\nnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn\n2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5\nBxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG\nA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx\nJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG\nA1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e\nuSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB\nAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1\njokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia\n78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm\nV+GRMOrN\n-----END CERTIFICATE-----\n\nAddTrust Low-Value Services Root\n================================\n-----BEGIN CERTIFICATE-----\nMIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML\nQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU\ncnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw\nCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO\nZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB\nAQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6\n54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr\noulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1\nZmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui\nGMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w\nHQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD\nAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT\nRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw\nHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt\nZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph\niVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY\neDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr\nmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj\nccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=\n-----END CERTIFICATE-----\n\nAddTrust External Root\n======================\n-----BEGIN CERTIFICATE-----\nMIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML\nQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD\nVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw\nNDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU\ncnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg\nUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821\n+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw\nTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo\naSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy\n2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7\n7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P\nBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL\nVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk\nVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB\nIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl\nj7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5\n6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355\ne6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u\nG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=\n-----END CERTIFICATE-----\n\nAddTrust Public Services Root\n=============================\n-----BEGIN CERTIFICATE-----\nMIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML\nQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU\ncnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ\nBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l\ndHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu\nnyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i\nd9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG\nAa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw\nHM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G\nA1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB\n/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux\nFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G\nA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4\nJNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL\n+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao\nGEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9\nYjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H\nEufOX1362KqxMy3ZdvJOOjMMK7MtkAY=\n-----END CERTIFICATE-----\n\nAddTrust Qualified Certificates Root\n====================================\n-----BEGIN CERTIFICATE-----\nMIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML\nQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU\ncnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx\nCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ\nIE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG\n9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx\n64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3\nKP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o\nL/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR\nwVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU\nMIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/\nBAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE\nBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y\nazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD\nggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG\nGuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X\ndgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze\nRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB\niFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=\n-----END CERTIFICATE-----\n\nEntrust Root Certification Authority\n====================================\n-----BEGIN CERTIFICATE-----\nMIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV\nBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw\nb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG\nA1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0\nMloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu\nMTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu\nY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v\ndCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz\nA9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww\nCj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68\nj6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN\nrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw\nDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1\nMzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH\nhmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA\nA4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM\nY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa\nv52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS\nW3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0\ntHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8\n-----END CERTIFICATE-----\n\nRSA Security 2048 v3\n====================\n-----BEGIN CERTIFICATE-----\nMIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK\nExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy\nMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb\nBgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\nAQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7\nJylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb\nWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH\nKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP\n+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/\nMA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E\nFgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY\nv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj\n0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj\nVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395\nnzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA\npKnXwiJPZ9d37CAFYd4=\n-----END CERTIFICATE-----\n\nGeoTrust Global CA\n==================\n-----BEGIN CERTIFICATE-----\nMIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK\nEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw\nMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j\nLjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\nCgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo\nBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet\n8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc\nT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU\nvTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD\nAQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk\nDBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q\nzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4\nd0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2\nmqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p\nXE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm\nMw==\n-----END CERTIFICATE-----\n\nGeoTrust Global CA 2\n====================\n-----BEGIN CERTIFICATE-----\nMIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN\nR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw\nMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j\nLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw\nggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/\nNTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k\nLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA\nVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b\nHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF\nMAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH\nK266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7\nsrJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh\nZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL\nOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC\nx1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF\nH4z1Ir+rzoPz4iIprn2DQKi6bA==\n-----END CERTIFICATE-----\n\nGeoTrust Universal CA\n=====================\n-----BEGIN CERTIFICATE-----\nMIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN\nR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1\nMDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu\nYy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP\nADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t\nJPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e\nRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs\n7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d\n8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V\nqnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga\nRr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB\nZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu\nKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08\nni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0\nXG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB\nhjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc\naanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2\nqaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL\noJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK\nxr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF\nKyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2\nDFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK\nxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU\np8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI\nP/rmMuGNG2+k5o7Y+SlIis5z/iw=\n-----END CERTIFICATE-----\n\nGeoTrust Universal CA 2\n=======================\n-----BEGIN CERTIFICATE-----\nMIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN\nR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0\nMDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg\nSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA\nA4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0\nDE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17\nj1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q\nJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a\nQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2\nWP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP\n20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn\nZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC\nSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG\n8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2\n+/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E\nBAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z\ndXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ\n4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+\nmbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq\nA1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg\nY+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP\npm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d\nFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp\ngn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm\nX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS\n-----END CERTIFICATE-----\n\nAmerica Online Root Certification Authority 1\n=============================================\n-----BEGIN CERTIFICATE-----\nMIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT\nQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp\nY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG\nA1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg\nT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD\nggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG\nv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z\nDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh\nsCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP\n8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T\nAQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z\no/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf\nGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF\nVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft\n3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g\nKd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds\nsPmuujz9dLQR6FgNgLzTqIA6me11zEZ7\n-----END CERTIFICATE-----\n\nAmerica Online Root Certification Authority 2\n=============================================\n-----BEGIN CERTIFICATE-----\nMIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT\nQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp\nY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG\nA1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg\nT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD\nggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en\nfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8\nf3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO\nqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN\nRvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0\ngBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn\n6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid\nFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6\nKc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj\nB453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op\naaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE\nAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY\nT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p\n+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg\nJXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy\nzH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO\nZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh\n1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf\nGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff\nZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP\ncX/9XhmgD0uRuMRUvAawRY8mkaKO/qk=\n-----END CERTIFICATE-----\n\nVisa eCommerce Root\n===================\n-----BEGIN CERTIFICATE-----\nMIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG\nEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug\nQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2\nWhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm\nVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv\nbW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL\nF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b\nRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0\nTP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI\n/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs\nGHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG\nMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc\nCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW\nYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz\nzkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu\nYQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt\n398znM/jra6O1I7mT1GvFpLgXPYHDw==\n-----END CERTIFICATE-----\n\nCertum Root CA\n==============\n-----BEGIN CERTIFICATE-----\nMIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK\nExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla\nFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u\nby4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x\nwS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL\nkKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ\n89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K\nUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P\nNSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq\nhkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+\nGXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg\nGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/\n0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS\nqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==\n-----END CERTIFICATE-----\n\nComodo AAA Services root\n========================\n-----BEGIN CERTIFICATE-----\nMIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS\nR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg\nTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw\nMFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl\nc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV\nBAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG\nC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs\ni14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW\nY19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH\nYpy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK\nIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f\nBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl\ncy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz\nLmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm\n7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz\nRt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z\n8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C\n12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==\n-----END CERTIFICATE-----\n\nComodo Secure Services root\n===========================\n-----BEGIN CERTIFICATE-----\nMIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS\nR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg\nTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw\nMDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu\nY2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi\nBgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP\nADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP\n9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc\nrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC\noznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V\np6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E\nFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w\ngYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj\nYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm\naWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm\n4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj\nZ55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL\nDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw\npCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H\nRR3B7Hzs/Sk=\n-----END CERTIFICATE-----\n\nComodo Trusted Services root\n============================\n-----BEGIN CERTIFICATE-----\nMIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS\nR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg\nTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw\nMDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h\nbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw\nIwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7\n3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y\n/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6\njuljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS\nivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud\nDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB\n/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp\nZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl\ncnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw\nuleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32\npSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA\nBHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l\nR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O\n9y5Xt5hwXsjEeLBi\n-----END CERTIFICATE-----\n\nQuoVadis Root CA\n================\n-----BEGIN CERTIFICATE-----\nMIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE\nChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0\neTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz\nMTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp\ncyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD\nEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk\nJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL\nF8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL\nYzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen\nAScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w\nPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y\nZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7\nMIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj\nYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs\nZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh\nY3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW\nFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu\nBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw\nFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0\naG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6\ntlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo\nfFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul\nLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x\ngI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi\n5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi\n5nrQNiOKSnQ2+Q==\n-----END CERTIFICATE-----\n\nQuoVadis Root CA 2\n==================\n-----BEGIN CERTIFICATE-----\nMIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT\nEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx\nODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM\naW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC\nDwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6\nXJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk\nlvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB\nlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy\nlZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt\n66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn\nwQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh\nD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy\nBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie\nJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud\nDgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU\na6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT\nElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv\nZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3\nUIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm\nVjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK\n+JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW\nIozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1\nWVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X\nf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II\n4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8\nVCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u\n-----END CERTIFICATE-----\n\nQuoVadis Root CA 3\n==================\n-----BEGIN CERTIFICATE-----\nMIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT\nEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx\nOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM\naW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC\nDwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg\nDhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij\nKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K\nDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv\nBNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp\np5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8\nnT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX\nMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM\nGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz\nuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT\nBgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj\nYXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0\naWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB\nBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD\nVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4\nywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE\nAxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV\nqyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s\nhvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z\nPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2\nPb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp\n8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC\nbjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu\ng/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p\nvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr\nqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=\n-----END CERTIFICATE-----\n\nSecurity Communication Root CA\n==============================\n-----BEGIN CERTIFICATE-----\nMIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP\nU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw\nHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP\nU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw\n8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM\nDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX\n5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd\nDJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2\nJChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw\nDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g\n0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a\nmCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ\ns58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ\n6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi\nFL39vmwLAw==\n-----END CERTIFICATE-----\n\nSonera Class 2 Root CA\n======================\n-----BEGIN CERTIFICATE-----\nMIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG\nU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw\nNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh\nIENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3\n/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT\ndXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG\nf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P\ntOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH\nnfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT\nXjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt\n0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI\ncbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph\nOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx\nEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH\nllpwrN9M\n-----END CERTIFICATE-----\n\nStaat der Nederlanden Root CA\n=============================\n-----BEGIN CERTIFICATE-----\nMIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE\nChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g\nUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w\nHAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh\nbmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt\nvsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P\njLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca\nC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth\nvJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6\n22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV\nHSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v\ndC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN\nBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR\nEytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw\nMVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y\nnGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR\niJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==\n-----END CERTIFICATE-----\n\nUTN DATACorp SGC Root CA\n========================\n-----BEGIN CERTIFICATE-----\nMIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE\nBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl\nIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ\nBgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa\nMIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w\nHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy\ndXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys\nraP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo\nwHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA\n9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv\n33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud\nDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9\nBgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD\nLmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3\nDQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft\nGzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0\nI3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx\nEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP\nDPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI\n-----END CERTIFICATE-----\n\nUTN USERFirst Hardware Root CA\n==============================\n-----BEGIN CERTIFICATE-----\nMIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE\nBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl\nIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd\nBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx\nOTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0\neTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz\nZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3\nDQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI\nwrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd\ntqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8\ni4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf\nPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw\ngbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF\nlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF\nUkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF\nBwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM\n//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW\nXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2\nlzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn\niCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67\nnfhmqA==\n-----END CERTIFICATE-----\n\nCamerfirma Chambers of Commerce Root\n====================================\n-----BEGIN CERTIFICATE-----\nMIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe\nQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i\nZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx\nNjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp\ncm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn\nMSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC\nAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU\nxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH\nNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW\nDA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV\nd9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud\nEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v\ncmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P\nAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh\nbWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD\nVR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz\naWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi\nfJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD\nL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN\nUPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n\nADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1\nerfutGWaIZDgqtCYvDi1czyL+Nw=\n-----END CERTIFICATE-----\n\nCamerfirma Global Chambersign Root\n==================================\n-----BEGIN CERTIFICATE-----\nMIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe\nQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i\nZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx\nNDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt\nYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg\nMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw\nggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J\n1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O\nby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl\n6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c\n8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/\nBAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j\naGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B\nAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj\naGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y\nZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh\nbWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA\nPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y\ngOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ\nPJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4\nIBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes\nt2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==\n-----END CERTIFICATE-----\n\nNetLock Notary (Class A) Root\n=============================\n-----BEGIN CERTIFICATE-----\nMIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI\nEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6\ndG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j\nayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX\nDTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH\nEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD\nVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz\ncyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM\nD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ\nz+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC\n/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7\ntqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6\n4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG\nA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC\nAk1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv\nbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu\nIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn\nLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0\nZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz\nIGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh\nIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu\nb3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh\nbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg\nQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp\nbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5\nayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP\nytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB\nCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr\nKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM\n8CgHrTwXZoi1/baI\n-----END CERTIFICATE-----\n\nNetLock Business (Class B) Root\n===============================\n-----BEGIN CERTIFICATE-----\nMIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT\nCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV\nBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg\nVGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD\nVQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv\nbnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg\nVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB\niQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S\no/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr\n1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV\nHQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ\nRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh\ndGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0\nZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv\nc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg\nYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh\nc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz\nOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA\nbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl\nIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2\nYWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj\ncHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM\n43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR\nstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI\n-----END CERTIFICATE-----\n\nNetLock Express (Class C) Root\n==============================\n-----BEGIN CERTIFICATE-----\nMIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT\nCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV\nBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD\nKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ\nBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6\ndG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j\nayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB\njQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z\nW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63\neuyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw\nDgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN\nRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn\nYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB\nIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i\naXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0\nZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs\nZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo\ndHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y\nemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k\nIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ\nUyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg\nYXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2\nxJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW\ngyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A==\n-----END CERTIFICATE-----\n\nXRamp Global CA Root\n====================\n-----BEGIN CERTIFICATE-----\nMIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE\nBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj\ndXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB\ndXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx\nHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg\nU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp\ndHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu\nIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx\nfoArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE\nzG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs\nAxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry\nxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud\nEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap\noCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC\nAQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc\n/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt\nqZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n\nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz\n8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=\n-----END CERTIFICATE-----\n\nGo Daddy Class 2 CA\n===================\n-----BEGIN CERTIFICATE-----\nMIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY\nVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp\nZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG\nA1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g\nRGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD\nggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv\n2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32\nqRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j\nYGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY\nvLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O\nBBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o\natTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu\nMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG\nA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim\nPQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt\nI3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ\nHmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI\nLs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b\nvZ8=\n-----END CERTIFICATE-----\n\nStarfield Class 2 CA\n====================\n-----BEGIN CERTIFICATE-----\nMIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc\nU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg\nQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo\nMQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG\nA1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG\nSIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY\nbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ\nJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm\nepsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN\nF4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF\nMIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f\nhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo\nbm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g\nQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs\nafPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM\nPUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl\nxy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD\nKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3\nQBFGmh95DmK/D5fs4C8fF5Q=\n-----END CERTIFICATE-----\n\nStartCom Certification Authority\n================================\n-----BEGIN CERTIFICATE-----\nMIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN\nU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu\nZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0\nNjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk\nLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg\nU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw\nggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y\no4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/\nHo/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d\neMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt\n2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z\n6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ\nosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/\nuntp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc\nUjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT\n37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE\nFE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0\nY29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj\nYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH\nAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw\nOi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg\nU3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5\nLCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl\ncnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh\ncnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT\ndGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC\nAgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh\n3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm\nvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk\nfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3\nfsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ\nEoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq\nyvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl\n1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/\nlwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro\ng14=\n-----END CERTIFICATE-----\n\nTaiwan GRCA\n===========\n-----BEGIN CERTIFICATE-----\nMIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG\nEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X\nDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv\ndmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD\nggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN\nw8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5\nBtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O\n1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO\nhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov\nJ5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7\nQ3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t\nB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB\nO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8\nlSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV\nHRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2\n09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ\nTulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj\nZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2\nNe//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU\nD7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz\nDxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk\nZ6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk\n7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ\nCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy\n+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS\n-----END CERTIFICATE-----\n\nFirmaprofesional Root CA\n========================\n-----BEGIN CERTIFICATE-----\nMIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT\nGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp\nY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA\nZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL\nMAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT\nOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2\nODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB\nAQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V\nj1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH\nlShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf\n3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8\nNeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww\nKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG\nAQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud\nDwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD\nggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq\nu00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf\nwUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm\n7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG\nVM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA=\n-----END CERTIFICATE-----\n\nWells Fargo Root CA\n===================\n-----BEGIN CERTIFICATE-----\nMIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV\nBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv\ncml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN\nMDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl\nbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv\nMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG\nSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX\nx3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3\nE48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5\nOEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j\nsNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj\nYTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF\nBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD\nggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv\nm+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R\nOhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx\nx32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023\ntqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s=\n-----END CERTIFICATE-----\n\nSwisscom Root CA 1\n==================\n-----BEGIN CERTIFICATE-----\nMIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG\nEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy\ndmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4\nMTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln\naXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC\nIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM\nMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF\nNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe\nAR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC\nb6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn\n7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN\ncA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp\nWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5\nhaa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY\nMUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw\nHQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j\nBBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9\nMA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn\njgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ\nMbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H\nVtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl\nvrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl\nOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3\n1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq\nnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy\nx/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW\nNY6E0F/6MBr1mmz0DlP5OlvRHA==\n-----END CERTIFICATE-----\n\nDigiCert Assured ID Root CA\n===========================\n-----BEGIN CERTIFICATE-----\nMIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw\nIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx\nMTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL\nExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO\n9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy\nUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW\n/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy\noeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf\nGHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF\n66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq\nhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc\nEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn\nSbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i\n8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe\n+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==\n-----END CERTIFICATE-----\n\nDigiCert Global Root CA\n=======================\n-----BEGIN CERTIFICATE-----\nMIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw\nHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw\nMDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3\ndy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq\nhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn\nTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5\nBmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H\n4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y\n7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB\no2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm\n8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF\nBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr\nEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt\ntep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886\nUAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\nCAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\n-----END CERTIFICATE-----\n\nDigiCert High Assurance EV Root CA\n==================================\n-----BEGIN CERTIFICATE-----\nMIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw\nKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw\nMFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ\nMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu\nY2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t\nMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS\nOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3\nMRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ\nNAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe\nh10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB\nAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY\nJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ\nV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp\nmyPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK\nmNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe\nvEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K\n-----END CERTIFICATE-----\n\nCertplus Class 2 Primary CA\n===========================\n-----BEGIN CERTIFICATE-----\nMIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE\nBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN\nOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy\ndHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\nADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR\n5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ\nVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO\nYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e\ne++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME\nCDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ\nYIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t\nL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD\nP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R\nTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+\n7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW\n//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7\nl7+ijrRU\n-----END CERTIFICATE-----\n\nDST Root CA X3\n==============\n-----BEGIN CERTIFICATE-----\nMIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK\nExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X\nDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1\ncmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD\nggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT\nrE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9\nUL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy\nxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d\nutolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T\nAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ\nMA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug\ndB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE\nGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw\nRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS\nfZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ\n-----END CERTIFICATE-----\n\nDST ACES CA X6\n==============\n-----BEGIN CERTIFICATE-----\nMIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG\nEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT\nMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha\nMFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE\nCxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI\nDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa\npCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow\nGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy\nMjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud\nEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu\nY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy\ndXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU\nCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2\n5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t\nFr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq\nnExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs\nvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3\noKfN5XozNmr6mis=\n-----END CERTIFICATE-----\n\nSwissSign Gold CA - G2\n======================\n-----BEGIN CERTIFICATE-----\nMIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw\nEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN\nMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp\nc3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B\nAQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq\nt2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C\njCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg\nvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF\nylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR\nAiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend\njIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO\npeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR\n7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi\nGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw\nAwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64\nOfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov\nL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm\n5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr\n44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf\nMke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m\nGu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp\nmo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk\nvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf\nKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br\nNU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj\nviOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ\n-----END CERTIFICATE-----\n\nSwissSign Silver CA - G2\n========================\n-----BEGIN CERTIFICATE-----\nMIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT\nBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X\nDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3\naXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG\n9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644\nN0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm\n+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH\n6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu\nMGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h\nqAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5\nFZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs\nROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc\ncelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X\nCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/\nBAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB\ntjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0\ncDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P\n4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F\nkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L\n3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx\n/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa\nDGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP\ne97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu\nWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ\nDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub\nDgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u\n-----END CERTIFICATE-----\n\nGeoTrust Primary Certification Authority\n========================================\n-----BEGIN CERTIFICATE-----\nMIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG\nEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD\nZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx\nCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ\ncmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\nCgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN\nb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9\nnceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge\nRwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt\ntm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\nAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI\nhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K\nTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN\nNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa\nFloxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG\n1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=\n-----END CERTIFICATE-----\n\nthawte Primary Root CA\n======================\n-----BEGIN CERTIFICATE-----\nMIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE\nBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2\naWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv\ncml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3\nMDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg\nSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv\nKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT\nFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs\noPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ\n1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc\nq/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K\naAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p\nafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD\nVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF\nAAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE\nuzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX\nxPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89\njxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH\nz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==\n-----END CERTIFICATE-----\n\nVeriSign Class 3 Public Primary Certification Authority - G5\n============================================================\n-----BEGIN CERTIFICATE-----\nMIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE\nBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO\nZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk\nIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp\nZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB\nyjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln\nbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh\ndXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt\nYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw\nggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz\nj/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD\nY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/\nArr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r\nfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/\nBAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv\nZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy\naXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG\nSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+\nX6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE\nKQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC\nKm0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE\nZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq\n-----END CERTIFICATE-----\n\nSecureTrust CA\n==============\n-----BEGIN CERTIFICATE-----\nMIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG\nEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy\ndXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe\nBgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC\nASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX\nOZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t\nDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH\nGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b\n01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH\nursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/\nBAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj\naHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ\nKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu\nSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf\nmbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ\nnMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR\n3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=\n-----END CERTIFICATE-----\n\nSecure Global CA\n================\n-----BEGIN CERTIFICATE-----\nMIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG\nEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH\nbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg\nMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg\nQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx\nYDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ\nbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g\n8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV\nHDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi\n0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud\nEwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn\noCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA\nMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+\nOYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn\nCDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5\n3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc\nf8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW\n-----END CERTIFICATE-----\n\nCOMODO Certification Authority\n==============================\n-----BEGIN CERTIFICATE-----\nMIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE\nBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG\nA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1\ndGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb\nMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD\nT01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH\n+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww\nxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV\n4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA\n1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI\nrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E\nBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k\nb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC\nAQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP\nOGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/\nRxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc\nIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN\n+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==\n-----END CERTIFICATE-----\n\nNetwork Solutions Certificate Authority\n=======================================\n-----BEGIN CERTIFICATE-----\nMIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG\nEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr\nIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx\nMjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu\nMTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G\nCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx\njOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT\naaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT\ncrA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc\n/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB\nAAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP\nBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv\nbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA\nA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q\n4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/\nGGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv\nwKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD\nydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey\n-----END CERTIFICATE-----\n\nWellsSecure Public Root Certificate Authority\n=============================================\n-----BEGIN CERTIFICATE-----\nMIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM\nF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw\nNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN\nMDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl\nbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD\nVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G\nCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1\niGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13\ni0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8\nbJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB\nK0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB\nAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu\ncGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm\nlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB\ni6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww\nGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg\nUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI\nK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0\nbh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj\nqHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es\nE2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ\ntylv2G0xffX8oRAHh84vWdw+WNs=\n-----END CERTIFICATE-----\n\nCOMODO ECC Certification Authority\n==================================\n-----BEGIN CERTIFICATE-----\nMIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC\nR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE\nChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB\ndXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix\nGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR\nQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo\nb3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X\n4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni\nwz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E\nBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG\nFAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA\nU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=\n-----END CERTIFICATE-----\n\nIGC/A\n=====\n-----BEGIN CERTIFICATE-----\nMIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD\nVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE\nQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy\nMB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI\nEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT\nSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB\nIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2\nTqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW\nSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy\nHF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd\nfrGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ\ntQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB\negF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC\niQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK\nq89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q\nMZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg\nCrpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI\nlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF\n0mBWWg==\n-----END CERTIFICATE-----\n\nSecurity Communication EV RootCA1\n=================================\n-----BEGIN CERTIFICATE-----\nMIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc\nU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh\ndGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE\nBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl\nY3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC\nAQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO\n/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX\nWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z\nZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4\nbepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK\n9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG\nSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm\niEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG\nAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW\nmHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW\nT1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490\n-----END CERTIFICATE-----\n\nOISTE WISeKey Global Root GA CA\n===============================\n-----BEGIN CERTIFICATE-----\nMIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE\nBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG\nA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH\nbG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD\nVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw\nIAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5\nIEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9\nNt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg\nAsj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD\nd50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ\n/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R\nLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw\nAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ\nKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm\nMMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4\n+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa\nhNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY\nokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=\n-----END CERTIFICATE-----\n\nMicrosec e-Szigno Root CA\n=========================\n-----BEGIN CERTIFICATE-----\nMIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE\nBhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL\nEwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0\nMDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz\ndDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT\nGU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB\nAQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG\nd36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N\noqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc\nQR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ\nPqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb\nMFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG\nIWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD\nVR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3\nLmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A\ndAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn\nAGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA\n4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg\nAGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA\negBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6\nLy93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO\nPU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv\nc2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h\ncnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw\nIQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT\nWjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV\nMIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER\nMA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp\nZ25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal\nHCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT\nnGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE\naGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a\n86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK\nyVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB\nS6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=\n-----END CERTIFICATE-----\n\nCertigna\n========\n-----BEGIN CERTIFICATE-----\nMIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw\nEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3\nMDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI\nQ2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q\nXOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH\nGxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p\nogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg\nDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf\nIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ\ntCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ\nBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J\nSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA\nhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+\nImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu\nPBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY\n1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw\nWyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==\n-----END CERTIFICATE-----\n\nAC Ra\\xC3\\xADz Certic\\xC3\\xA1mara S.A.\n======================================\n-----BEGIN CERTIFICATE-----\nMIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT\nAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg\nLSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w\nHhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+\nU29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh\nIFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B\nAQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN\nyu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU\n2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3\n4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP\n2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm\n8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf\nHjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa\nMh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK\n5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b\nczwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE\nAwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g\nADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF\nBQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug\ncHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf\nAygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX\nEpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v\n/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3\nMGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4\n3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk\neZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f\n/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h\nRqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU\nIw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ==\n-----END CERTIFICATE-----\n\nTC TrustCenter Class 2 CA II\n============================\n-----BEGIN CERTIFICATE-----\nMIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC\nREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy\nIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw\nMTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1\nc3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE\nAxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC\nAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw\nIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2\nxgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ\nXa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u\nSNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB\n/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB\n7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90\nY19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU\ncnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i\nSCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u\nTGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G\ndXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ\nKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj\nTYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP\nJOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk\nvQ==\n-----END CERTIFICATE-----\n\nTC TrustCenter Class 3 CA II\n============================\n-----BEGIN CERTIFICATE-----\nMIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC\nREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy\nIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw\nMTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1\nc3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE\nAxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC\nAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W\nyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo\n6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ\nuV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk\n2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB\n/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB\n7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90\nY19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU\ncnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i\nSCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u\nTGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE\nO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8\nyRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9\nIJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal\n092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc\n5A==\n-----END CERTIFICATE-----\n\nTC TrustCenter Universal CA I\n=============================\n-----BEGIN CERTIFICATE-----\nMIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC\nREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy\nIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN\nMDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg\nVHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw\nJAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD\nggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC\nqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv\nxrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw\nag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O\ngdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j\nBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\nAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG\n1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy\nvwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3\nghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT\nujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a\n7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY\n-----END CERTIFICATE-----\n\nDeutsche Telekom Root CA 2\n==========================\n-----BEGIN CERTIFICATE-----\nMIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT\nRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG\nA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5\nMjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G\nA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS\nb290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5\nbzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI\nKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY\nAUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK\nSe5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV\njlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV\nHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr\nE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy\nzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8\nrZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G\ndyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU\nCm26OWMohpLzGITY+9HPBVZkVw==\n-----END CERTIFICATE-----\n\nComSign Secured CA\n==================\n-----BEGIN CERTIFICATE-----\nMIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE\nAxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w\nNDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD\nQTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw\nggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs\n49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH\n7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB\nkMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1\n9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw\nAwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t\nU2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA\nj8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC\nAQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a\nBijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp\nFhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP\n51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz\nOjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw==\n-----END CERTIFICATE-----\n\nCybertrust Global Root\n======================\n-----BEGIN CERTIFICATE-----\nMIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li\nZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4\nMDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD\nExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW\n0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL\nAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin\n89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT\n8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP\nBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2\nMDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G\nA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO\nlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi\n5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2\nhO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T\nX3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW\nWL1WMRJOEcgh4LMRkWXbtKaIOM5V\n-----END CERTIFICATE-----\n\nePKI Root Certification Authority\n=================================\n-----BEGIN CERTIFICATE-----\nMIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG\nEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg\nUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx\nMjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq\nMCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B\nAQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs\nIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi\nlTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv\nqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX\n12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O\nWQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+\nETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao\nlQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/\nvv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi\nZo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi\nMAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH\nClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0\n1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq\nKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV\nxrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP\nNXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r\nGNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE\nxJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx\ngMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy\nsP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD\nBCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=\n-----END CERTIFICATE-----\n\nT\\xc3\\x9c\\x42\\xC4\\xB0TAK UEKAE K\\xC3\\xB6k Sertifika Hizmet Sa\\xC4\\x9Flay\\xc4\\xb1\\x63\\xc4\\xb1s\\xc4\\xb1 - S\\xC3\\xBCr\\xC3\\xBCm 3\n=============================================================================================================================\n-----BEGIN CERTIFICATE-----\nMIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH\nDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q\naWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry\nb25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV\nBAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg\nS8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4\nMjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl\nIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF\nn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl\nIEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft\ndSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl\ncnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B\nAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO\nEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1\nxnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR\n6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL\nhmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd\nBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF\nMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4\nN5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT\ny9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh\nLBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M\ndqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=\n-----END CERTIFICATE-----\n\nBuypass Class 2 CA 1\n====================\n-----BEGIN CERTIFICATE-----\nMIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU\nQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2\nMTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh\nc3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M\ncXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83\n0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4\n0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R\nuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC\nMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P\nAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV\n1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt\n7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2\nfZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w\nwDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho\n-----END CERTIFICATE-----\n\nBuypass Class 3 CA 1\n====================\n-----BEGIN CERTIFICATE-----\nMIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU\nQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1\nMDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh\nc3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx\nifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0\nn6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia\nAJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c\n1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC\nMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P\nAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7\npYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA\nEllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5\nhtOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj\nel/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915\n-----END CERTIFICATE-----\n\nEBG Elektronik Sertifika Hizmet Sa\\xC4\\x9Flay\\xc4\\xb1\\x63\\xc4\\xb1s\\xc4\\xb1\n==========================================================================\n-----BEGIN CERTIFICATE-----\nMIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF\nbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg\nQmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe\nFw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p\nayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt\nIFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG\nSIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by\nX3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b\ngmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr\neYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ\nTqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy\nY5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn\nuqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI\nqkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm\nExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0\nNokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB\n/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW\nZ5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t\nFcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm\nzJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k\nXPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT\nbCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU\nRT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK\n1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt\n2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ\nY9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9\nAahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT\n-----END CERTIFICATE-----\n\ncertSIGN ROOT CA\n================\n-----BEGIN CERTIFICATE-----\nMIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD\nVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa\nFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE\nCxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I\nJUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH\nrfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2\nssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD\n0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943\nAAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B\nAf8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB\nAQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8\nSG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0\nx2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt\nvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz\nTogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD\n-----END CERTIFICATE-----\n\nCNNIC ROOT\n==========\n-----BEGIN CERTIFICATE-----\nMIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE\nChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw\nOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD\no+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz\nVHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT\nVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or\nczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK\ny5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC\nwQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S\nlgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5\nGv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM\nO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8\nBS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2\nG8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m\nmxE=\n-----END CERTIFICATE-----\n\nApplicationCA - Japanese Government\n===================================\n-----BEGIN CERTIFICATE-----\nMIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT\nSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw\nMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl\ncm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\nCgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4\nfl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN\nwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE\njP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu\nnyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU\nWssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV\nBAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD\nvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs\no2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g\n/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD\nio+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW\ndupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL\nrosot4LKGAfmt1t06SAZf7IbiVQ=\n-----END CERTIFICATE-----\n\nGeoTrust Primary Certification Authority - G3\n=============================================\n-----BEGIN CERTIFICATE-----\nMIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE\nBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0\nIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy\neSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz\nNTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo\nYykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT\nLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j\nK/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE\nc5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C\nIShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu\ndlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC\nMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr\n2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9\ncr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE\nAp7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD\nAWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s\nt/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt\n-----END CERTIFICATE-----\n\nthawte Primary Root CA - G2\n===========================\n-----BEGIN CERTIFICATE-----\nMIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC\nVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu\nIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg\nQ0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV\nMBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG\nb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt\nIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS\nLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5\n8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU\nmtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN\nG4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K\nrr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==\n-----END CERTIFICATE-----\n\nthawte Primary Root CA - G3\n===========================\n-----BEGIN CERTIFICATE-----\nMIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE\nBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2\naWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv\ncml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w\nODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh\nd3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD\nVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG\nA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\nMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At\nP0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC\n+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY\n7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW\nvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E\nBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ\nKoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK\nA3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu\nt8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC\n8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm\ner/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=\n-----END CERTIFICATE-----\n\nGeoTrust Primary Certification Authority - G2\n=============================================\n-----BEGIN CERTIFICATE-----\nMIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC\nVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu\nYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD\nZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1\nOVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg\nMjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl\nb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG\nBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc\nKiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD\nVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+\nEVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m\nndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2\nnpaqBA+K\n-----END CERTIFICATE-----\n\nVeriSign Universal Root Certification Authority\n===============================================\n-----BEGIN CERTIFICATE-----\nMIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE\nBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO\nZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk\nIHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u\nIEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV\nUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv\ncmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl\nIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0\naG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj\n1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP\nMiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72\n9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I\nAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR\ntPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G\nCCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O\na8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud\nDgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3\nY8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx\nY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx\nP/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P\nwGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4\nmJO37M2CYfE45k+XmCpajQ==\n-----END CERTIFICATE-----\n\nVeriSign Class 3 Public Primary Certification Authority - G4\n============================================================\n-----BEGIN CERTIFICATE-----\nMIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC\nVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3\nb3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz\nZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj\nYXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL\nMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU\ncnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo\nb3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5\nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8\nUtpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz\nrl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB\n/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw\nHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u\nY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD\nA2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx\nAJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==\n-----END CERTIFICATE-----\n\nNetLock Arany (Class Gold) Főtanúsítvány\n============================================\n-----BEGIN CERTIFICATE-----\nMIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G\nA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610\ndsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB\ncmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx\nMjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO\nZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv\nbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6\nc8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu\n0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw\n/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk\nH3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw\nfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1\nneWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB\nBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW\nqZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta\nYtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC\nbLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna\nNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu\ndZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=\n-----END CERTIFICATE-----\n\nStaat der Nederlanden Root CA - G2\n==================================\n-----BEGIN CERTIFICATE-----\nMIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE\nCgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g\nUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC\nTkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l\nZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ\n5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn\nvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj\nCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil\ne7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR\nOME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI\nCT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65\n48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi\ntrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737\nqWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB\nAAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC\nARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV\nHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA\nA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz\n+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj\nf/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN\nkqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk\nCpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF\nURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb\nCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h\noKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV\nIPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm\n66+KAQ==\n-----END CERTIFICATE-----\n\nCA Disig\n========\n-----BEGIN CERTIFICATE-----\nMIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK\nQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw\nMzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz\nbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3\nDQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm\nGErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD\nPw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo\nhwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt\nymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w\ngfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P\nAQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz\naWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff\nZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa\nBgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t\nWDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3\nmkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/\nCBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K\nezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA\n4Z7CRneC9VkGjCFMhwnN5ag=\n-----END CERTIFICATE-----\n\nJuur-SK\n=======\n-----BEGIN CERTIFICATE-----\nMIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA\nc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw\nDgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG\nSIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy\naW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf\nTQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC\n+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw\nUR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa\nTpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF\nMAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD\nHoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh\nAHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA\ncwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr\nAGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw\ncy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE\nFASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G\nA1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo\nERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL\nabVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678\nIIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh\nMp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2\nyyqcjg==\n-----END CERTIFICATE-----\n\nHongkong Post Root CA 1\n=======================\n-----BEGIN CERTIFICATE-----\nMIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT\nDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx\nNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n\nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1\nApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr\nauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh\nqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY\nV18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV\nHRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i\nh9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio\nl7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei\nIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps\nT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT\nc4afU9hDDl3WY4JxHYB0yvbiAmvZWg==\n-----END CERTIFICATE-----\n\nSecureSign RootCA11\n===================\n-----BEGIN CERTIFICATE-----\nMIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi\nSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS\nb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw\nKQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1\ncmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL\nTJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO\nwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq\ng6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP\nO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA\nbpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX\nt94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh\nOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r\nbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ\nOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01\ny8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061\nlgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=\n-----END CERTIFICATE-----\n\nACEDICOM Root\n=============\n-----BEGIN CERTIFICATE-----\nMIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD\nT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4\nMDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG\nA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF\nAAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk\nWLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD\nYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew\nMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb\nm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk\nHQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT\nxKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2\n3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9\n2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq\nTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz\n4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU\n9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv\nbS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg\naHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP\neGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk\nzQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1\nThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI\nKiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq\nnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE\nI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp\nMCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o\ntkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA==\n-----END CERTIFICATE-----\n\nVerisign Class 3 Public Primary Certification Authority\n=======================================================\n-----BEGIN CERTIFICATE-----\nMIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx\nFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5\nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow\nXzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz\nIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA\nA4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94\nf56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol\nhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky\nCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX\nbj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/\nD/xwzoiQ\n-----END CERTIFICATE-----\n\nMicrosec e-Szigno Root CA 2009\n==============================\n-----BEGIN CERTIFICATE-----\nMIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER\nMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv\nc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o\ndTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE\nBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt\nU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA\nfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG\n0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA\npxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm\n1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC\nAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf\nQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE\nFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o\nlZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX\nI/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775\ntyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02\nyULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi\nLXpUq3DDfSJlgnCW\n-----END CERTIFICATE-----\n\nE-Guven Kok Elektronik Sertifika Hizmet Saglayicisi\n===================================================\n-----BEGIN CERTIFICATE-----\nMIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG\nEwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz\nZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3\nMDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0\ncm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u\naWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC\nAQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY\n8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y\njfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI\nJjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk\n9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD\nAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG\nSIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d\nF4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq\nD2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4\nVwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq\nfJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX\n-----END CERTIFICATE-----\n\nGlobalSign Root CA - R3\n=======================\n-----BEGIN CERTIFICATE-----\nMIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv\nYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh\nbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT\naWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln\nbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt\niHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ\n0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3\nrHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl\nOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2\nxmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\nFI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7\nlgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8\nEpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E\nbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18\nYIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r\nkpeDMdmztcpHWD9f\n-----END CERTIFICATE-----\n\nTC TrustCenter Universal CA III\n===============================\n-----BEGIN CERTIFICATE-----\nMIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC\nREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy\nIFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe\nFw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU\nQyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex\nKDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB\nAQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt\nQCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO\njuT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut\nCHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1\nM4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G\nA1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/\nBAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA\ng8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+\nKGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK\nBgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV\nCIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq\nwoIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg==\n-----END CERTIFICATE-----\n\nAutoridad de Certificacion Firmaprofesional CIF A62634068\n=========================================================\n-----BEGIN CERTIFICATE-----\nMIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA\nBgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2\nMjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw\nQAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB\nNjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD\nUtd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P\nB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY\n7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH\nECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI\nplD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX\nMbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX\nLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK\nbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU\nvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud\nEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH\nDhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp\ncm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA\nbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx\nADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx\n51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk\nR71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP\nT481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f\nJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl\nosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR\ncrHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR\nsaS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD\nKCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi\n6Et8Vcad+qMUu2WFbm5PEn4KPJ2V\n-----END CERTIFICATE-----\n\nIzenpe.com\n==========\n-----BEGIN CERTIFICATE-----\nMIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG\nEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz\nMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu\nQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ\n03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK\nClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU\n+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC\nPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT\nOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK\nF7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK\n0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+\n0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB\nleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID\nAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+\nSVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG\nNjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx\nMCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O\nBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l\nFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga\nkEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q\nhT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs\ng1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5\naTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5\nnXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC\nClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo\nQ0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z\nWrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==\n-----END CERTIFICATE-----\n\nChambers of Commerce Root - 2008\n================================\n-----BEGIN CERTIFICATE-----\nMIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD\nMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv\nbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu\nQS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy\nMjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl\nZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF\nEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl\ncnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC\nAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA\nXuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj\nh40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/\nikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk\nNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g\nD2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331\nlubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ\n0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj\nya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2\nEQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI\nG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ\nBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh\nbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh\nbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC\nCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH\nAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1\nwqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH\n3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU\nRWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6\nM6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1\nYJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF\n9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK\nzBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG\nnrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg\nOGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ\n-----END CERTIFICATE-----\n\nGlobal Chambersign Root - 2008\n==============================\n-----BEGIN CERTIFICATE-----\nMIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD\nMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv\nbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu\nQS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx\nNDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg\nY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ\nQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD\naGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf\nVtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf\nXjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0\nZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB\n/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA\nTH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M\nH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe\nOx2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF\nHTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh\nwZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB\nAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT\nBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE\nBhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm\naXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm\naXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp\n1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0\ndHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG\n/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6\nReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s\ndZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg\n9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH\nfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du\nqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr\nP3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq\nc5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z\n09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B\n-----END CERTIFICATE-----\n\nGo Daddy Root Certificate Authority - G2\n========================================\n-----BEGIN CERTIFICATE-----\nMIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT\nB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu\nMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5\nMDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6\nb25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G\nA1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq\n9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD\n+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd\nfMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl\nNAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC\nMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9\nBUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac\nvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r\n5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV\nN8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO\nLPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1\n-----END CERTIFICATE-----\n\nStarfield Root Certificate Authority - G2\n=========================================\n-----BEGIN CERTIFICATE-----\nMIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT\nB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s\nb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0\neSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw\nDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg\nVGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB\ndXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv\nW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs\nbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk\nN3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf\nZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU\nJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\nAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol\nTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx\n4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw\nF5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K\npL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ\nc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0\n-----END CERTIFICATE-----\n\nStarfield Services Root Certificate Authority - G2\n==================================================\n-----BEGIN CERTIFICATE-----\nMIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT\nB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s\nb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl\nIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV\nBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT\ndGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg\nUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC\nAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2\nh/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa\nhHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP\nLJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB\nrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw\nAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG\nSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP\nE95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy\nxQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd\niEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza\nYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6\n-----END CERTIFICATE-----\n\nAffirmTrust Commercial\n======================\n-----BEGIN CERTIFICATE-----\nMIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS\nBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw\nMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly\nbVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb\nDuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV\nC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6\nBfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww\nMmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV\nHQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\nAQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG\nhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi\nqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv\n0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh\nsUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=\n-----END CERTIFICATE-----\n\nAffirmTrust Networking\n======================\n-----BEGIN CERTIFICATE-----\nMIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS\nBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw\nMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly\nbVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE\nHi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI\ndIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24\n/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb\nh+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV\nHQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\nAQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu\nUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6\n12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23\nWJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9\n/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=\n-----END CERTIFICATE-----\n\nAffirmTrust Premium\n===================\n-----BEGIN CERTIFICATE-----\nMIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS\nBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy\nOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy\ndXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A\nMIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn\nBKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV\n5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs\n+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd\nGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R\np9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI\nS+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04\n6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5\n/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo\n+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB\n/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv\nMiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg\nNt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC\n6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S\nL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK\n+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV\nBtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg\nIxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60\ng2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb\nzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==\n-----END CERTIFICATE-----\n\nAffirmTrust Premium ECC\n=======================\n-----BEGIN CERTIFICATE-----\nMIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV\nBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx\nMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U\ncnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA\nIgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ\nN8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW\nBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK\nBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X\n57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM\neQ==\n-----END CERTIFICATE-----\n\nCertum Trusted Network CA\n=========================\n-----BEGIN CERTIFICATE-----\nMIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK\nExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv\nbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy\nMTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU\nZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5\nMSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC\nl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J\nJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4\nfOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0\ncvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB\nAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw\nDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj\njSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1\nmS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj\nZt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI\n03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=\n-----END CERTIFICATE-----\n\nCertinomis - Autorité Racine\n=============================\n-----BEGIN CERTIFICATE-----\nMIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK\nQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg\nLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG\nA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw\nJAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD\nggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa\nwE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly\nLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw\n2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N\njMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q\nc1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC\nlrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb\nxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g\n530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna\n4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G\nA1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ\nKoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x\nWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva\nR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40\nnJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B\nCxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv\nJL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE\nqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b\nWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE\nwk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/\nvgt2Fl43N+bYdJeimUV5\n-----END CERTIFICATE-----\n\nRoot CA Generalitat Valenciana\n==============================\n-----BEGIN CERTIFICATE-----\nMIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE\nChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290\nIENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3\nWjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE\nCxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G\nCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2\nF0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B\nZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ\nD0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte\nJajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB\nAAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n\ndmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB\nADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl\nAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA\nYQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy\nAGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA\naQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt\nAGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA\nYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu\nAHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA\nOgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0\ndHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV\nBgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G\nA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S\nb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh\nTvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz\nCkj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63\nNI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH\niJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt\n+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=\n-----END CERTIFICATE-----\n\nA-Trust-nQual-03\n================\n-----BEGIN CERTIFICATE-----\nMIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE\nCgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy\na2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R\ndWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw\nRgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0\nZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1\nc3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA\nzewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n\nyfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE\nSU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4\niHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V\ncuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV\neRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40\nozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr\nsQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd\nJXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS\nmYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6\nahq97BvIxYSazQ==\n-----END CERTIFICATE-----\n\nTWCA Root Certification Authority\n=================================\n-----BEGIN CERTIFICATE-----\nMIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ\nVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh\ndGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG\nEwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB\nIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK\nAoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx\nQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC\noi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP\n4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r\ny+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB\nBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG\n9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC\nmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW\nQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY\nT0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny\nYh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==\n-----END CERTIFICATE-----\n\nSecurity Communication RootCA2\n==============================\n-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc\nU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh\ndGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC\nSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy\naXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++\n+T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R\n3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV\nspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K\nEOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8\nQIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB\nCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj\nu/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk\n3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q\ntnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29\nmvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03\n-----END CERTIFICATE-----\n\nEC-ACC\n======\n-----BEGIN CERTIFICATE-----\nMIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE\nBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w\nODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD\nVQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE\nCxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT\nBkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7\nMDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt\nSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl\nZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh\ncnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK\nw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT\nae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4\nHvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a\nE9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw\n0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E\nBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD\nVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0\nLm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l\ndC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ\nlF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa\nAl6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe\nl+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2\nE/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D\n5EI=\n-----END CERTIFICATE-----\n\nHellenic Academic and Research Institutions RootCA 2011\n=======================================================\n-----BEGIN CERTIFICATE-----\nMIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT\nO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y\naXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z\nIFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT\nAkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z\nIENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo\nIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI\n1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa\n71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u\n8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH\n3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/\nMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8\nMAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu\nb3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt\nXdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8\nTqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD\n/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N\n7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "thirdparty_libs/requests/certs.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\ncerts.py\n~~~~~~~~\n\nThis module returns the preferred default CA certificate bundle.\n\nIf you are packaging Requests, e.g., for a Linux distribution or a managed\nenvironment, you can change the definition of where() to return a separately\npackaged CA bundle.\n\"\"\"\n\nimport os.path\n\n\ndef where():\n    \"\"\"Return the preferred certificate bundle.\"\"\"\n    # vendored bundle inside Requests\n    return os.path.join(os.path.dirname(__file__), 'cacert.pem')\n\nif __name__ == '__main__':\n    print(where())\n"
  },
  {
    "path": "thirdparty_libs/requests/compat.py",
    "content": "# -*- coding: utf-8 -*-\n\n\"\"\"\npythoncompat\n\"\"\"\n\nfrom .packages import charade as chardet\n\nimport sys\n\n# -------\n# Pythons\n# -------\n\n# Syntax sugar.\n_ver = sys.version_info\n\n#: Python 2.x?\nis_py2 = (_ver[0] == 2)\n\n#: Python 3.x?\nis_py3 = (_ver[0] == 3)\n\n#: Python 3.0.x\nis_py30 = (is_py3 and _ver[1] == 0)\n\n#: Python 3.1.x\nis_py31 = (is_py3 and _ver[1] == 1)\n\n#: Python 3.2.x\nis_py32 = (is_py3 and _ver[1] == 2)\n\n#: Python 3.3.x\nis_py33 = (is_py3 and _ver[1] == 3)\n\n#: Python 3.4.x\nis_py34 = (is_py3 and _ver[1] == 4)\n\n#: Python 2.7.x\nis_py27 = (is_py2 and _ver[1] == 7)\n\n#: Python 2.6.x\nis_py26 = (is_py2 and _ver[1] == 6)\n\n#: Python 2.5.x\nis_py25 = (is_py2 and _ver[1] == 5)\n\n#: Python 2.4.x\nis_py24 = (is_py2 and _ver[1] == 4)   # I'm assuming this is not by choice.\n\n\n# ---------\n# Platforms\n# ---------\n\n\n# Syntax sugar.\n_ver = sys.version.lower()\n\nis_pypy = ('pypy' in _ver)\nis_jython = ('jython' in _ver)\nis_ironpython = ('iron' in _ver)\n\n# Assume CPython, if nothing else.\nis_cpython = not any((is_pypy, is_jython, is_ironpython))\n\n# Windows-based system.\nis_windows = 'win32' in str(sys.platform).lower()\n\n# Standard Linux 2+ system.\nis_linux = ('linux' in str(sys.platform).lower())\nis_osx = ('darwin' in str(sys.platform).lower())\nis_hpux = ('hpux' in str(sys.platform).lower())   # Complete guess.\nis_solaris = ('solar==' in str(sys.platform).lower())   # Complete guess.\n\ntry:\n    import simplejson as json\nexcept ImportError:\n    import json\n\n# ---------\n# Specifics\n# ---------\n\nif is_py2:\n    from urllib import quote, unquote, quote_plus, unquote_plus, urlencode, getproxies, proxy_bypass\n    from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag\n    from urllib2 import parse_http_list\n    import cookielib\n    from Cookie import Morsel\n    from StringIO import StringIO\n    from .packages.urllib3.packages.ordered_dict import OrderedDict\n    from httplib import IncompleteRead\n\n    builtin_str = str\n    bytes = str\n    str = unicode\n    basestring = basestring\n    numeric_types = (int, long, float)\n\n\nelif is_py3:\n    from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag\n    from urllib.request import parse_http_list, getproxies, proxy_bypass\n    from http import cookiejar as cookielib\n    from http.cookies import Morsel\n    from io import StringIO\n    from collections import OrderedDict\n    from http.client import IncompleteRead\n\n    builtin_str = str\n    str = str\n    bytes = bytes\n    basestring = (str, bytes)\n    numeric_types = (int, float)\n"
  },
  {
    "path": "thirdparty_libs/requests/cookies.py",
    "content": "# -*- coding: utf-8 -*-\n\n\"\"\"\nCompatibility code to be able to use `cookielib.CookieJar` with requests.\n\nrequests.utils imports from here, so be careful with imports.\n\"\"\"\n\nimport time\nimport collections\nfrom .compat import cookielib, urlparse, Morsel\n\ntry:\n    import threading\n    # grr, pyflakes: this fixes \"redefinition of unused 'threading'\"\n    threading\nexcept ImportError:\n    import dummy_threading as threading\n\n\nclass MockRequest(object):\n    \"\"\"Wraps a `requests.Request` to mimic a `urllib2.Request`.\n\n    The code in `cookielib.CookieJar` expects this interface in order to correctly\n    manage cookie policies, i.e., determine whether a cookie can be set, given the\n    domains of the request and the cookie.\n\n    The original request object is read-only. The client is responsible for collecting\n    the new headers via `get_new_headers()` and interpreting them appropriately. You\n    probably want `get_cookie_header`, defined below.\n    \"\"\"\n\n    def __init__(self, request):\n        self._r = request\n        self._new_headers = {}\n        self.type = urlparse(self._r.url).scheme\n\n    def get_type(self):\n        return self.type\n\n    def get_host(self):\n        return urlparse(self._r.url).netloc\n\n    def get_origin_req_host(self):\n        return self.get_host()\n\n    def get_full_url(self):\n        return self._r.url\n\n    def is_unverifiable(self):\n        return True\n\n    def has_header(self, name):\n        return name in self._r.headers or name in self._new_headers\n\n    def get_header(self, name, default=None):\n        return self._r.headers.get(name, self._new_headers.get(name, default))\n\n    def add_header(self, key, val):\n        \"\"\"cookielib has no legitimate use for this method; add it back if you find one.\"\"\"\n        raise NotImplementedError(\"Cookie headers should be added with add_unredirected_header()\")\n\n    def add_unredirected_header(self, name, value):\n        self._new_headers[name] = value\n\n    def get_new_headers(self):\n        return self._new_headers\n\n    @property\n    def unverifiable(self):\n        return self.is_unverifiable()\n\n    @property\n    def origin_req_host(self):\n        return self.get_origin_req_host()\n\n    @property\n    def host(self):\n        return self.get_host()\n\n\nclass MockResponse(object):\n    \"\"\"Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`.\n\n    ...what? Basically, expose the parsed HTTP headers from the server response\n    the way `cookielib` expects to see them.\n    \"\"\"\n\n    def __init__(self, headers):\n        \"\"\"Make a MockResponse for `cookielib` to read.\n\n        :param headers: a httplib.HTTPMessage or analogous carrying the headers\n        \"\"\"\n        self._headers = headers\n\n    def info(self):\n        return self._headers\n\n    def getheaders(self, name):\n        self._headers.getheaders(name)\n\n\ndef extract_cookies_to_jar(jar, request, response):\n    \"\"\"Extract the cookies from the response into a CookieJar.\n\n    :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar)\n    :param request: our own requests.Request object\n    :param response: urllib3.HTTPResponse object\n    \"\"\"\n    if not (hasattr(response, '_original_response') and\n            response._original_response):\n        return\n    # the _original_response field is the wrapped httplib.HTTPResponse object,\n    req = MockRequest(request)\n    # pull out the HTTPMessage with the headers and put it in the mock:\n    res = MockResponse(response._original_response.msg)\n    jar.extract_cookies(res, req)\n\n\ndef get_cookie_header(jar, request):\n    \"\"\"Produce an appropriate Cookie header string to be sent with `request`, or None.\"\"\"\n    r = MockRequest(request)\n    jar.add_cookie_header(r)\n    return r.get_new_headers().get('Cookie')\n\n\ndef remove_cookie_by_name(cookiejar, name, domain=None, path=None):\n    \"\"\"Unsets a cookie by name, by default over all domains and paths.\n\n    Wraps CookieJar.clear(), is O(n).\n    \"\"\"\n    clearables = []\n    for cookie in cookiejar:\n        if cookie.name == name:\n            if domain is None or domain == cookie.domain:\n                if path is None or path == cookie.path:\n                    clearables.append((cookie.domain, cookie.path, cookie.name))\n\n    for domain, path, name in clearables:\n        cookiejar.clear(domain, path, name)\n\n\nclass CookieConflictError(RuntimeError):\n    \"\"\"There are two cookies that meet the criteria specified in the cookie jar.\n    Use .get and .set and include domain and path args in order to be more specific.\"\"\"\n\n\nclass RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping):\n    \"\"\"Compatibility class; is a cookielib.CookieJar, but exposes a dict interface.\n\n    This is the CookieJar we create by default for requests and sessions that\n    don't specify one, since some clients may expect response.cookies and\n    session.cookies to support dict operations.\n\n    Don't use the dict interface internally; it's just for compatibility with\n    with external client code. All `requests` code should work out of the box\n    with externally provided instances of CookieJar, e.g., LWPCookieJar and\n    FileCookieJar.\n\n    Caution: dictionary operations that are normally O(1) may be O(n).\n\n    Unlike a regular CookieJar, this class is pickleable.\n    \"\"\"\n\n    def get(self, name, default=None, domain=None, path=None):\n        \"\"\"Dict-like get() that also supports optional domain and path args in\n        order to resolve naming collisions from using one cookie jar over\n        multiple domains. Caution: operation is O(n), not O(1).\"\"\"\n        try:\n            return self._find_no_duplicates(name, domain, path)\n        except KeyError:\n            return default\n\n    def set(self, name, value, **kwargs):\n        \"\"\"Dict-like set() that also supports optional domain and path args in\n        order to resolve naming collisions from using one cookie jar over\n        multiple domains.\"\"\"\n        # support client code that unsets cookies by assignment of a None value:\n        if value is None:\n            remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path'))\n            return\n\n        if isinstance(value, Morsel):\n            c = morsel_to_cookie(value)\n        else:\n            c = create_cookie(name, value, **kwargs)\n        self.set_cookie(c)\n        return c\n\n    def keys(self):\n        \"\"\"Dict-like keys() that returns a list of names of cookies from the jar.\n        See values() and items().\"\"\"\n        keys = []\n        for cookie in iter(self):\n            keys.append(cookie.name)\n        return keys\n\n    def values(self):\n        \"\"\"Dict-like values() that returns a list of values of cookies from the jar.\n        See keys() and items().\"\"\"\n        values = []\n        for cookie in iter(self):\n            values.append(cookie.value)\n        return values\n\n    def items(self):\n        \"\"\"Dict-like items() that returns a list of name-value tuples from the jar.\n        See keys() and values(). Allows client-code to call \"dict(RequestsCookieJar)\n        and get a vanilla python dict of key value pairs.\"\"\"\n        items = []\n        for cookie in iter(self):\n            items.append((cookie.name, cookie.value))\n        return items\n\n    def list_domains(self):\n        \"\"\"Utility method to list all the domains in the jar.\"\"\"\n        domains = []\n        for cookie in iter(self):\n            if cookie.domain not in domains:\n                domains.append(cookie.domain)\n        return domains\n\n    def list_paths(self):\n        \"\"\"Utility method to list all the paths in the jar.\"\"\"\n        paths = []\n        for cookie in iter(self):\n            if cookie.path not in paths:\n                paths.append(cookie.path)\n        return paths\n\n    def multiple_domains(self):\n        \"\"\"Returns True if there are multiple domains in the jar.\n        Returns False otherwise.\"\"\"\n        domains = []\n        for cookie in iter(self):\n            if cookie.domain is not None and cookie.domain in domains:\n                return True\n            domains.append(cookie.domain)\n        return False  # there is only one domain in jar\n\n    def get_dict(self, domain=None, path=None):\n        \"\"\"Takes as an argument an optional domain and path and returns a plain old\n        Python dict of name-value pairs of cookies that meet the requirements.\"\"\"\n        dictionary = {}\n        for cookie in iter(self):\n            if (domain is None or cookie.domain == domain) and (path is None\n                                                or cookie.path == path):\n                dictionary[cookie.name] = cookie.value\n        return dictionary\n\n    def __getitem__(self, name):\n        \"\"\"Dict-like __getitem__() for compatibility with client code. Throws exception\n        if there are more than one cookie with name. In that case, use the more\n        explicit get() method instead. Caution: operation is O(n), not O(1).\"\"\"\n\n        return self._find_no_duplicates(name)\n\n    def __setitem__(self, name, value):\n        \"\"\"Dict-like __setitem__ for compatibility with client code. Throws exception\n        if there is already a cookie of that name in the jar. In that case, use the more\n        explicit set() method instead.\"\"\"\n\n        self.set(name, value)\n\n    def __delitem__(self, name):\n        \"\"\"Deletes a cookie given a name. Wraps cookielib.CookieJar's remove_cookie_by_name().\"\"\"\n        remove_cookie_by_name(self, name)\n\n    def set_cookie(self, cookie, *args, **kwargs):\n        if cookie.value.startswith('\"') and cookie.value.endswith('\"'):\n            cookie.value = cookie.value.replace('\\\\\"', '')\n        return super(RequestsCookieJar, self).set_cookie(cookie, *args, **kwargs)\n\n    def update(self, other):\n        \"\"\"Updates this jar with cookies from another CookieJar or dict-like\"\"\"\n        if isinstance(other, cookielib.CookieJar):\n            for cookie in other:\n                self.set_cookie(cookie)\n        else:\n            super(RequestsCookieJar, self).update(other)\n\n    def _find(self, name, domain=None, path=None):\n        \"\"\"Requests uses this method internally to get cookie values. Takes as args name\n        and optional domain and path. Returns a cookie.value. If there are conflicting cookies,\n        _find arbitrarily chooses one. See _find_no_duplicates if you want an exception thrown\n        if there are conflicting cookies.\"\"\"\n        for cookie in iter(self):\n            if cookie.name == name:\n                if domain is None or cookie.domain == domain:\n                    if path is None or cookie.path == path:\n                        return cookie.value\n\n        raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path))\n\n    def _find_no_duplicates(self, name, domain=None, path=None):\n        \"\"\"__get_item__ and get call _find_no_duplicates -- never used in Requests internally.\n        Takes as args name and optional domain and path. Returns a cookie.value.\n        Throws KeyError if cookie is not found and CookieConflictError if there are\n        multiple cookies that match name and optionally domain and path.\"\"\"\n        toReturn = None\n        for cookie in iter(self):\n            if cookie.name == name:\n                if domain is None or cookie.domain == domain:\n                    if path is None or cookie.path == path:\n                        if toReturn is not None:  # if there are multiple cookies that meet passed in criteria\n                            raise CookieConflictError('There are multiple cookies with name, %r' % (name))\n                        toReturn = cookie.value  # we will eventually return this as long as no cookie conflict\n\n        if toReturn:\n            return toReturn\n        raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path))\n\n    def __getstate__(self):\n        \"\"\"Unlike a normal CookieJar, this class is pickleable.\"\"\"\n        state = self.__dict__.copy()\n        # remove the unpickleable RLock object\n        state.pop('_cookies_lock')\n        return state\n\n    def __setstate__(self, state):\n        \"\"\"Unlike a normal CookieJar, this class is pickleable.\"\"\"\n        self.__dict__.update(state)\n        if '_cookies_lock' not in self.__dict__:\n            self._cookies_lock = threading.RLock()\n\n    def copy(self):\n        \"\"\"Return a copy of this RequestsCookieJar.\"\"\"\n        new_cj = RequestsCookieJar()\n        new_cj.update(self)\n        return new_cj\n\n\ndef create_cookie(name, value, **kwargs):\n    \"\"\"Make a cookie from underspecified parameters.\n\n    By default, the pair of `name` and `value` will be set for the domain ''\n    and sent on every request (this is sometimes called a \"supercookie\").\n    \"\"\"\n    result = dict(\n        version=0,\n        name=name,\n        value=value,\n        port=None,\n        domain='',\n        path='/',\n        secure=False,\n        expires=None,\n        discard=True,\n        comment=None,\n        comment_url=None,\n        rest={'HttpOnly': None},\n        rfc2109=False,)\n\n    badargs = set(kwargs) - set(result)\n    if badargs:\n        err = 'create_cookie() got unexpected keyword arguments: %s'\n        raise TypeError(err % list(badargs))\n\n    result.update(kwargs)\n    result['port_specified'] = bool(result['port'])\n    result['domain_specified'] = bool(result['domain'])\n    result['domain_initial_dot'] = result['domain'].startswith('.')\n    result['path_specified'] = bool(result['path'])\n\n    return cookielib.Cookie(**result)\n\n\ndef morsel_to_cookie(morsel):\n    \"\"\"Convert a Morsel object into a Cookie containing the one k/v pair.\"\"\"\n    expires = None\n    if morsel[\"max-age\"]:\n        expires = time.time() + morsel[\"max-age\"]\n    elif morsel['expires']:\n        expires = morsel['expires']\n        if type(expires) == type(\"\"):\n            time_template = \"%a, %d-%b-%Y %H:%M:%S GMT\"\n            expires = time.mktime(time.strptime(expires, time_template))\n    c = create_cookie(\n        name=morsel.key,\n        value=morsel.value,\n        version=morsel['version'] or 0,\n        port=None,\n        domain=morsel['domain'],\n        path=morsel['path'],\n        secure=bool(morsel['secure']),\n        expires=expires,\n        discard=False,\n        comment=morsel['comment'],\n        comment_url=bool(morsel['comment']),\n        rest={'HttpOnly': morsel['httponly']},\n        rfc2109=False,)\n    return c\n\n\ndef cookiejar_from_dict(cookie_dict, cookiejar=None):\n    \"\"\"Returns a CookieJar from a key/value dictionary.\n\n    :param cookie_dict: Dict of key/values to insert into CookieJar.\n    \"\"\"\n    if cookiejar is None:\n        cookiejar = RequestsCookieJar()\n\n    if cookie_dict is not None:\n        for name in cookie_dict:\n            cookiejar.set_cookie(create_cookie(name, cookie_dict[name]))\n    return cookiejar\n"
  },
  {
    "path": "thirdparty_libs/requests/exceptions.py",
    "content": "# -*- coding: utf-8 -*-\n\n\"\"\"\nrequests.exceptions\n~~~~~~~~~~~~~~~~~~~\n\nThis module contains the set of Requests' exceptions.\n\n\"\"\"\n\n\nclass RequestException(RuntimeError):\n    \"\"\"There was an ambiguous exception that occurred while handling your\n    request.\"\"\"\n\n\nclass HTTPError(RequestException):\n    \"\"\"An HTTP error occurred.\"\"\"\n\n    def __init__(self, *args, **kwargs):\n        \"\"\" Initializes HTTPError with optional `response` object. \"\"\"\n        self.response = kwargs.pop('response', None)\n        super(HTTPError, self).__init__(*args, **kwargs)\n\n\nclass ConnectionError(RequestException):\n    \"\"\"A Connection error occurred.\"\"\"\n\n\nclass SSLError(ConnectionError):\n    \"\"\"An SSL error occurred.\"\"\"\n\n\nclass Timeout(RequestException):\n    \"\"\"The request timed out.\"\"\"\n\n\nclass URLRequired(RequestException):\n    \"\"\"A valid URL is required to make a request.\"\"\"\n\n\nclass TooManyRedirects(RequestException):\n    \"\"\"Too many redirects.\"\"\"\n\n\nclass MissingSchema(RequestException, ValueError):\n    \"\"\"The URL schema (e.g. http or https) is missing.\"\"\"\n\n\nclass InvalidSchema(RequestException, ValueError):\n    \"\"\"See defaults.py for valid schemas.\"\"\"\n\n\nclass InvalidURL(RequestException, ValueError):\n    \"\"\" The URL provided was somehow invalid. \"\"\"\n\n\nclass ChunkedEncodingError(RequestException):\n    \"\"\"The server declared chunked encoding but sent an invalid chunk.\"\"\"\n"
  },
  {
    "path": "thirdparty_libs/requests/hooks.py",
    "content": "# -*- coding: utf-8 -*-\n\n\"\"\"\nrequests.hooks\n~~~~~~~~~~~~~~\n\nThis module provides the capabilities for the Requests hooks system.\n\nAvailable hooks:\n\n``response``:\n    The response generated from a Request.\n\n\"\"\"\n\n\nHOOKS = ['response']\n\n\ndef default_hooks():\n    hooks = {}\n    for event in HOOKS:\n        hooks[event] = []\n    return hooks\n\n# TODO: response is the only one\n\n\ndef dispatch_hook(key, hooks, hook_data, **kwargs):\n    \"\"\"Dispatches a hook dictionary on a given piece of data.\"\"\"\n\n    hooks = hooks or dict()\n\n    if key in hooks:\n        hooks = hooks.get(key)\n\n        if hasattr(hooks, '__call__'):\n            hooks = [hooks]\n\n        for hook in hooks:\n            _hook_data = hook(hook_data, **kwargs)\n            if _hook_data is not None:\n                hook_data = _hook_data\n\n    return hook_data\n"
  },
  {
    "path": "thirdparty_libs/requests/models.py",
    "content": "# -*- coding: utf-8 -*-\n\n\"\"\"\nrequests.models\n~~~~~~~~~~~~~~~\n\nThis module contains the primary objects that power Requests.\n\"\"\"\n\nimport collections\nimport logging\nimport datetime\n\nfrom io import BytesIO\nfrom .hooks import default_hooks\nfrom .structures import CaseInsensitiveDict\n\nfrom .auth import HTTPBasicAuth\nfrom .cookies import cookiejar_from_dict, get_cookie_header\nfrom .packages.urllib3.filepost import encode_multipart_formdata\nfrom .packages.urllib3.util import parse_url\nfrom .exceptions import (\n    HTTPError, RequestException, MissingSchema, InvalidURL,\n    ChunkedEncodingError)\nfrom .utils import (\n    guess_filename, get_auth_from_url, requote_uri,\n    stream_decode_response_unicode, to_key_val_list, parse_header_links,\n    iter_slices, guess_json_utf, super_len)\nfrom .compat import (\n    cookielib, urlunparse, urlsplit, urlencode, str, bytes, StringIO,\n    is_py2, chardet, json, builtin_str, basestring, IncompleteRead)\n\nCONTENT_CHUNK_SIZE = 10 * 1024\nITER_CHUNK_SIZE = 512\n\nlog = logging.getLogger(__name__)\n\n\nclass RequestEncodingMixin(object):\n    @property\n    def path_url(self):\n        \"\"\"Build the path URL to use.\"\"\"\n\n        url = []\n\n        p = urlsplit(self.url)\n\n        path = p.path\n        if not path:\n            path = '/'\n\n        url.append(path)\n\n        query = p.query\n        if query:\n            url.append('?')\n            url.append(query)\n\n        return ''.join(url)\n\n    @staticmethod\n    def _encode_params(data):\n        \"\"\"Encode parameters in a piece of data.\n\n        Will successfully encode parameters when passed as a dict or a list of\n        2-tuples. Order is retained if data is a list of 2-tuples but arbitrary\n        if parameters are supplied as a dict.\n        \"\"\"\n\n        if isinstance(data, (str, bytes)):\n            return data\n        elif hasattr(data, 'read'):\n            return data\n        elif hasattr(data, '__iter__'):\n            result = []\n            for k, vs in to_key_val_list(data):\n                if isinstance(vs, basestring) or not hasattr(vs, '__iter__'):\n                    vs = [vs]\n                for v in vs:\n                    if v is not None:\n                        result.append(\n                            (k.encode('utf-8') if isinstance(k, str) else k,\n                             v.encode('utf-8') if isinstance(v, str) else v))\n            return urlencode(result, doseq=True)\n        else:\n            return data\n\n    @staticmethod\n    def _encode_files(files, data):\n        \"\"\"Build the body for a multipart/form-data request.\n\n        Will successfully encode files when passed as a dict or a list of\n        2-tuples. Order is retained if data is a list of 2-tuples but abritrary\n        if parameters are supplied as a dict.\n\n        \"\"\"\n        if (not files) or isinstance(data, str):\n            return None\n\n        new_fields = []\n        fields = to_key_val_list(data or {})\n        files = to_key_val_list(files or {})\n\n        for field, val in fields:\n            if isinstance(val, basestring) or not hasattr(val, '__iter__'):\n                val = [val]\n            for v in val:\n                if v is not None:\n                    new_fields.append(\n                        (field.decode('utf-8') if isinstance(field, bytes) else field,\n                         v.encode('utf-8') if isinstance(v, str) else v))\n\n        for (k, v) in files:\n            # support for explicit filename\n            ft = None\n            if isinstance(v, (tuple, list)):\n                if len(v) == 2:\n                    fn, fp = v\n                else:\n                    fn, fp, ft = v\n            else:\n                fn = guess_filename(v) or k\n                fp = v\n            if isinstance(fp, str):\n                fp = StringIO(fp)\n            if isinstance(fp, bytes):\n                fp = BytesIO(fp)\n\n            if ft:\n                new_v = (fn, fp.read(), ft)\n            else:\n                new_v = (fn, fp.read())\n            new_fields.append((k, new_v))\n\n        body, content_type = encode_multipart_formdata(new_fields)\n\n        return body, content_type\n\n\nclass RequestHooksMixin(object):\n    def register_hook(self, event, hook):\n        \"\"\"Properly register a hook.\"\"\"\n\n        if isinstance(hook, collections.Callable):\n            self.hooks[event].append(hook)\n        elif hasattr(hook, '__iter__'):\n            self.hooks[event].extend(h for h in hook if isinstance(h, collections.Callable))\n\n    def deregister_hook(self, event, hook):\n        \"\"\"Deregister a previously registered hook.\n        Returns True if the hook existed, False if not.\n        \"\"\"\n\n        try:\n            self.hooks[event].remove(hook)\n            return True\n        except ValueError:\n            return False\n\n\nclass Request(RequestHooksMixin):\n    \"\"\"A user-created :class:`Request <Request>` object.\n\n    Used to prepare a :class:`PreparedRequest <PreparedRequest>`, which is sent to the server.\n\n    :param method: HTTP method to use.\n    :param url: URL to send.\n    :param headers: dictionary of headers to send.\n    :param files: dictionary of {filename: fileobject} files to multipart upload.\n    :param data: the body to attach the request. If a dictionary is provided, form-encoding will take place.\n    :param params: dictionary of URL parameters to append to the URL.\n    :param auth: Auth handler or (user, pass) tuple.\n    :param cookies: dictionary or CookieJar of cookies to attach to this request.\n    :param hooks: dictionary of callback hooks, for internal usage.\n\n    Usage::\n\n      >>> import requests\n      >>> req = requests.Request('GET', 'http://httpbin.org/get')\n      >>> req.prepare()\n      <PreparedRequest [GET]>\n\n    \"\"\"\n    def __init__(self,\n        method=None,\n        url=None,\n        headers=None,\n        files=None,\n        data=dict(),\n        params=dict(),\n        auth=None,\n        cookies=None,\n        hooks=None):\n\n        # Default empty dicts for dict params.\n        data = [] if data is None else data\n        files = [] if files is None else files\n        headers = {} if headers is None else headers\n        params = {} if params is None else params\n        hooks = {} if hooks is None else hooks\n\n        self.hooks = default_hooks()\n        for (k, v) in list(hooks.items()):\n            self.register_hook(event=k, hook=v)\n\n        self.method = method\n        self.url = url\n        self.headers = headers\n        self.files = files\n        self.data = data\n        self.params = params\n        self.auth = auth\n        self.cookies = cookies\n\n    def __repr__(self):\n        return '<Request [%s]>' % (self.method)\n\n    def prepare(self):\n        \"\"\"Constructs a :class:`PreparedRequest <PreparedRequest>` for transmission and returns it.\"\"\"\n        p = PreparedRequest()\n        p.prepare(\n            method=self.method,\n            url=self.url,\n            headers=self.headers,\n            files=self.files,\n            data=self.data,\n            params=self.params,\n            auth=self.auth,\n            cookies=self.cookies,\n            hooks=self.hooks,\n        )\n        return p\n\n\nclass PreparedRequest(RequestEncodingMixin, RequestHooksMixin):\n    \"\"\"The fully mutable :class:`PreparedRequest <PreparedRequest>` object,\n    containing the exact bytes that will be sent to the server.\n\n    Generated from either a :class:`Request <Request>` object or manually.\n\n    Usage::\n\n      >>> import requests\n      >>> req = requests.Request('GET', 'http://httpbin.org/get')\n      >>> r = req.prepare()\n      <PreparedRequest [GET]>\n\n      >>> s = requests.Session()\n      >>> s.send(r)\n      <Response [200]>\n\n    \"\"\"\n\n    def __init__(self):\n        #: HTTP verb to send to the server.\n        self.method = None\n        #: HTTP URL to send the request to.\n        self.url = None\n        #: dictionary of HTTP headers.\n        self.headers = None\n        #: request body to send to the server.\n        self.body = None\n        #: dictionary of callback hooks, for internal usage.\n        self.hooks = default_hooks()\n\n    def prepare(self, method=None, url=None, headers=None, files=None,\n                data=None, params=None, auth=None, cookies=None, hooks=None):\n        \"\"\"Prepares the the entire request with the given parameters.\"\"\"\n\n        self.prepare_method(method)\n        self.prepare_url(url, params)\n        self.prepare_headers(headers)\n        self.prepare_cookies(cookies)\n        self.prepare_body(data, files)\n        self.prepare_auth(auth, url)\n        # Note that prepare_auth must be last to enable authentication schemes\n        # such as OAuth to work on a fully prepared request.\n\n        # This MUST go after prepare_auth. Authenticators could add a hook\n        self.prepare_hooks(hooks)\n\n    def __repr__(self):\n        return '<PreparedRequest [%s]>' % (self.method)\n\n    def copy(self):\n        p = PreparedRequest()\n        p.method = self.method\n        p.url = self.url\n        p.headers = self.headers\n        p.body = self.body\n        p.hooks = self.hooks\n        return p\n\n    def prepare_method(self, method):\n        \"\"\"Prepares the given HTTP method.\"\"\"\n        self.method = method\n        if self.method is not None:\n            self.method = self.method.upper()\n\n    def prepare_url(self, url, params):\n        \"\"\"Prepares the given HTTP URL.\"\"\"\n        #: Accept objects that have string representations.\n        try:\n            url = unicode(url)\n        except NameError:\n            # We're on Python 3.\n            url = str(url)\n        except UnicodeDecodeError:\n            pass\n\n        # Support for unicode domain names and paths.\n        scheme, auth, host, port, path, query, fragment = parse_url(url)\n\n        if not scheme:\n            raise MissingSchema(\"Invalid URL %r: No schema supplied\" % url)\n\n        if not host:\n            raise InvalidURL(\"Invalid URL %r: No host supplied\" % url)\n\n        # Only want to apply IDNA to the hostname\n        try:\n            host = host.encode('idna').decode('utf-8')\n        except UnicodeError:\n            raise InvalidURL('URL has an invalid label.')\n\n        # Carefully reconstruct the network location\n        netloc = auth or ''\n        if netloc:\n            netloc += '@'\n        netloc += host\n        if port:\n            netloc += ':' + str(port)\n\n        # Bare domains aren't valid URLs.\n        if not path:\n            path = '/'\n\n        if is_py2:\n            if isinstance(scheme, str):\n                scheme = scheme.encode('utf-8')\n            if isinstance(netloc, str):\n                netloc = netloc.encode('utf-8')\n            if isinstance(path, str):\n                path = path.encode('utf-8')\n            if isinstance(query, str):\n                query = query.encode('utf-8')\n            if isinstance(fragment, str):\n                fragment = fragment.encode('utf-8')\n\n        enc_params = self._encode_params(params)\n        if enc_params:\n            if query:\n                query = '%s&%s' % (query, enc_params)\n            else:\n                query = enc_params\n\n        url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment]))\n        self.url = url\n\n    def prepare_headers(self, headers):\n        \"\"\"Prepares the given HTTP headers.\"\"\"\n\n        if headers:\n            headers = dict((name.encode('ascii'), value) for name, value in headers.items())\n            self.headers = CaseInsensitiveDict(headers)\n        else:\n            self.headers = CaseInsensitiveDict()\n\n    def prepare_body(self, data, files):\n        \"\"\"Prepares the given HTTP body data.\"\"\"\n\n        # Check if file, fo, generator, iterator.\n        # If not, run through normal process.\n\n        # Nottin' on you.\n        body = None\n        content_type = None\n        length = None\n\n        is_stream = all([\n            hasattr(data, '__iter__'),\n            not isinstance(data, basestring),\n            not isinstance(data, list),\n            not isinstance(data, dict)\n        ])\n\n        try:\n            length = super_len(data)\n        except (TypeError, AttributeError):\n            length = None\n\n        if is_stream:\n            body = data\n\n            if files:\n                raise NotImplementedError('Streamed bodies and files are mutually exclusive.')\n\n            if length is not None:\n                self.headers['Content-Length'] = str(length)\n            else:\n                self.headers['Transfer-Encoding'] = 'chunked'\n        else:\n            # Multi-part file uploads.\n            if files:\n                (body, content_type) = self._encode_files(files, data)\n            else:\n                if data:\n                    body = self._encode_params(data)\n                    if isinstance(data, str) or isinstance(data, builtin_str) or hasattr(data, 'read'):\n                        content_type = None\n                    else:\n                        content_type = 'application/x-www-form-urlencoded'\n\n            self.prepare_content_length(body)\n\n            # Add content-type if it wasn't explicitly provided.\n            if (content_type) and (not 'content-type' in self.headers):\n                self.headers['Content-Type'] = content_type\n\n        self.body = body\n\n    def prepare_content_length(self, body):\n        if hasattr(body, 'seek') and hasattr(body, 'tell'):\n            body.seek(0, 2)\n            self.headers['Content-Length'] = str(body.tell())\n            body.seek(0, 0)\n        elif body is not None:\n            l = super_len(body)\n            if l:\n                self.headers['Content-Length'] = str(l)\n        elif self.method not in ('GET', 'HEAD'):\n            self.headers['Content-Length'] = '0'\n\n    def prepare_auth(self, auth, url=''):\n        \"\"\"Prepares the given HTTP auth data.\"\"\"\n\n        # If no Auth is explicitly provided, extract it from the URL first.\n        if auth is None:\n            url_auth = get_auth_from_url(self.url)\n            auth = url_auth if any(url_auth) else None\n\n        if auth:\n            if isinstance(auth, tuple) and len(auth) == 2:\n                # special-case basic HTTP auth\n                auth = HTTPBasicAuth(*auth)\n\n            # Allow auth to make its changes.\n            r = auth(self)\n\n            # Update self to reflect the auth changes.\n            self.__dict__.update(r.__dict__)\n\n            # Recompute Content-Length\n            self.prepare_content_length(self.body)\n\n    def prepare_cookies(self, cookies):\n        \"\"\"Prepares the given HTTP cookie data.\"\"\"\n\n        if isinstance(cookies, cookielib.CookieJar):\n            cookies = cookies\n        else:\n            cookies = cookiejar_from_dict(cookies)\n\n        if 'cookie' not in self.headers:\n            cookie_header = get_cookie_header(cookies, self)\n            if cookie_header is not None:\n                self.headers['Cookie'] = cookie_header\n\n    def prepare_hooks(self, hooks):\n        \"\"\"Prepares the given hooks.\"\"\"\n        for event in hooks:\n            self.register_hook(event, hooks[event])\n\n\nclass Response(object):\n    \"\"\"The :class:`Response <Response>` object, which contains a\n    server's response to an HTTP request.\n    \"\"\"\n\n    def __init__(self):\n        super(Response, self).__init__()\n\n        self._content = False\n        self._content_consumed = False\n\n        #: Integer Code of responded HTTP Status.\n        self.status_code = None\n\n        #: Case-insensitive Dictionary of Response Headers.\n        #: For example, ``headers['content-encoding']`` will return the\n        #: value of a ``'Content-Encoding'`` response header.\n        self.headers = CaseInsensitiveDict()\n\n        #: File-like object representation of response (for advanced usage).\n        #: Requires that ``stream=True` on the request.\n        # This requirement does not apply for use internally to Requests.\n        self.raw = None\n\n        #: Final URL location of Response.\n        self.url = None\n\n        #: Encoding to decode with when accessing r.text.\n        self.encoding = None\n\n        #: A list of :class:`Response <Response>` objects from\n        #: the history of the Request. Any redirect responses will end\n        #: up here. The list is sorted from the oldest to the most recent request.\n        self.history = []\n\n        self.reason = None\n\n        #: A CookieJar of Cookies the server sent back.\n        self.cookies = cookiejar_from_dict({})\n\n        #: The amount of time elapsed between sending the request\n        #: and the arrival of the response (as a timedelta)\n        self.elapsed = datetime.timedelta(0)\n\n    def __repr__(self):\n        return '<Response [%s]>' % (self.status_code)\n\n    def __bool__(self):\n        \"\"\"Returns true if :attr:`status_code` is 'OK'.\"\"\"\n        return self.ok\n\n    def __nonzero__(self):\n        \"\"\"Returns true if :attr:`status_code` is 'OK'.\"\"\"\n        return self.ok\n\n    def __iter__(self):\n        \"\"\"Allows you to use a response as an iterator.\"\"\"\n        return self.iter_content(128)\n\n    @property\n    def ok(self):\n        try:\n            self.raise_for_status()\n        except RequestException:\n            return False\n        return True\n\n    @property\n    def apparent_encoding(self):\n        \"\"\"The apparent encoding, provided by the lovely Charade library\n        (Thanks, Ian!).\"\"\"\n        return chardet.detect(self.content)['encoding']\n\n    def iter_content(self, chunk_size=1, decode_unicode=False):\n        \"\"\"Iterates over the response data.  When stream=True is set on the\n        request, this avoids reading the content at once into memory for\n        large responses.  The chunk size is the number of bytes it should\n        read into memory.  This is not necessarily the length of each item\n        returned as decoding can take place.\n        \"\"\"\n        if self._content_consumed:\n            # simulate reading small chunks of the content\n            return iter_slices(self._content, chunk_size)\n\n        def generate():\n            try:\n                # Special case for urllib3.\n                try:\n                    for chunk in self.raw.stream(chunk_size,\n                                                 decode_content=True):\n                        yield chunk\n                except IncompleteRead as e:\n                    raise ChunkedEncodingError(e)\n            except AttributeError:\n                # Standard file-like object.\n                while 1:\n                    chunk = self.raw.read(chunk_size)\n                    if not chunk:\n                        break\n                    yield chunk\n\n            self._content_consumed = True\n\n        gen = generate()\n\n        if decode_unicode:\n            gen = stream_decode_response_unicode(gen, self)\n\n        return gen\n\n    def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=None):\n        \"\"\"Iterates over the response data, one line at a time.  When\n        stream=True is set on the request, this avoids reading the\n        content at once into memory for large responses.\n        \"\"\"\n\n        pending = None\n\n        for chunk in self.iter_content(chunk_size=chunk_size,\n                                       decode_unicode=decode_unicode):\n\n            if pending is not None:\n                chunk = pending + chunk\n            lines = chunk.splitlines()\n\n            if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]:\n                pending = lines.pop()\n            else:\n                pending = None\n\n            for line in lines:\n                yield line\n\n        if pending is not None:\n            yield pending\n\n    @property\n    def content(self):\n        \"\"\"Content of the response, in bytes.\"\"\"\n\n        if self._content is False:\n            # Read the contents.\n            try:\n                if self._content_consumed:\n                    raise RuntimeError(\n                        'The content for this response was already consumed')\n\n                if self.status_code == 0:\n                    self._content = None\n                else:\n                    self._content = bytes().join(self.iter_content(CONTENT_CHUNK_SIZE)) or bytes()\n\n            except AttributeError:\n                self._content = None\n\n        self._content_consumed = True\n        # don't need to release the connection; that's been handled by urllib3\n        # since we exhausted the data.\n        return self._content\n\n    @property\n    def text(self):\n        \"\"\"Content of the response, in unicode.\n\n        if Response.encoding is None and chardet module is available, encoding\n        will be guessed.\n        \"\"\"\n\n        # Try charset from content-type\n        content = None\n        encoding = self.encoding\n\n        if not self.content:\n            return str('')\n\n        # Fallback to auto-detected encoding.\n        if self.encoding is None:\n            encoding = self.apparent_encoding\n\n        # Decode unicode from given encoding.\n        try:\n            content = str(self.content, encoding, errors='replace')\n        except (LookupError, TypeError):\n            # A LookupError is raised if the encoding was not found which could\n            # indicate a misspelling or similar mistake.\n            #\n            # A TypeError can be raised if encoding is None\n            #\n            # So we try blindly encoding.\n            content = str(self.content, errors='replace')\n\n        return content\n\n    def json(self, **kwargs):\n        \"\"\"Returns the json-encoded content of a response, if any.\n\n        :param \\*\\*kwargs: Optional arguments that ``json.loads`` takes.\n        \"\"\"\n\n        if not self.encoding and len(self.content) > 3:\n            # No encoding set. JSON RFC 4627 section 3 states we should expect\n            # UTF-8, -16 or -32. Detect which one to use; If the detection or\n            # decoding fails, fall back to `self.text` (using chardet to make\n            # a best guess).\n            encoding = guess_json_utf(self.content)\n            if encoding is not None:\n                return json.loads(self.content.decode(encoding), **kwargs)\n        return json.loads(self.text or self.content, **kwargs)\n\n    @property\n    def links(self):\n        \"\"\"Returns the parsed header links of the response, if any.\"\"\"\n\n        header = self.headers.get('link')\n\n        # l = MultiDict()\n        l = {}\n\n        if header:\n            links = parse_header_links(header)\n\n            for link in links:\n                key = link.get('rel') or link.get('url')\n                l[key] = link\n\n        return l\n\n    def raise_for_status(self):\n        \"\"\"Raises stored :class:`HTTPError`, if one occurred.\"\"\"\n\n        http_error_msg = ''\n\n        if 400 <= self.status_code < 500:\n            http_error_msg = '%s Client Error: %s' % (self.status_code, self.reason)\n\n        elif 500 <= self.status_code < 600:\n            http_error_msg = '%s Server Error: %s' % (self.status_code, self.reason)\n\n        if http_error_msg:\n            raise HTTPError(http_error_msg, response=self)\n\n    def close(self):\n        \"\"\"Closes the underlying file descriptor and releases the connection\n        back to the pool.\n\n        *Note: Should not normally need to be called explicitly.*\n        \"\"\"\n        return self.raw.release_conn()\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/__init__.py",
    "content": "from __future__ import absolute_import\n\nfrom . import urllib3\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/__init__.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n#\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\n__version__ = \"1.0.3\"\r\nfrom sys import version_info\r\n\r\n\r\ndef detect(aBuf):\r\n    if ((version_info < (3, 0) and isinstance(aBuf, unicode)) or\r\n            (version_info >= (3, 0) and not isinstance(aBuf, bytes))):\r\n        raise ValueError('Expected a bytes object, not a unicode object')\r\n\r\n    from . import universaldetector\r\n    u = universaldetector.UniversalDetector()\r\n    u.reset()\r\n    u.feed(aBuf)\r\n    u.close()\r\n    return u.result\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/big5freq.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\n# The Original Code is Mozilla Communicator client code.\n#\n# The Initial Developer of the Original Code is\n# Netscape Communications Corporation.\n# Portions created by the Initial Developer are Copyright (C) 1998\n# the Initial Developer. All Rights Reserved.\n#\n# Contributor(s):\n#   Mark Pilgrim - port to Python\n#\n# This library is free software; you can redistribute it and/or\n# modify it under the terms of the GNU Lesser General Public\n# License as published by the Free Software Foundation; either\n# version 2.1 of the License, or (at your option) any later version.\n#\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# Lesser General Public License for more details.\n#\n# You should have received a copy of the GNU Lesser General Public\n# License along with this library; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n# 02110-1301  USA\n######################### END LICENSE BLOCK #########################\n\n# Big5 frequency table\n# by Taiwan's Mandarin Promotion Council\n# <http://www.edu.tw:81/mandr/>\n#\n# 128  --> 0.42261\n# 256  --> 0.57851\n# 512  --> 0.74851\n# 1024 --> 0.89384\n# 2048 --> 0.97583\n#\n# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98\n# Random Distribution Ration = 512/(5401-512)=0.105\n#\n# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR\n\nBIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75\n\n#Char to FreqOrder table\nBIG5_TABLE_SIZE = 5376\n\nBig5CharToFreqOrder = (\n   1,1801,1506, 255,1431, 198,   9,  82,   6,5008, 177, 202,3681,1256,2821, 110, #   16\n3814,  33,3274, 261,  76,  44,2114,  16,2946,2187,1176, 659,3971,  26,3451,2653, #   32\n1198,3972,3350,4202, 410,2215, 302, 590, 361,1964,   8, 204,  58,4510,5009,1932, #   48\n  63,5010,5011, 317,1614,  75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, #   64\n3682,   3,  10,3973,1471,  29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, #   80\n4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947,  34,3556,3204,  64, 604, #   96\n5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337,  72, 406,5017,  80, #  112\n 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449,  69,2987, 591, #  128\n 179,2096, 471, 115,2035,1844,  60,  50,2988, 134, 806,1869, 734,2036,3454, 180, #  144\n 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, #  160\n2502,  90,2716,1338, 663,  11, 906,1099,2553,  20,2441, 182, 532,1716,5019, 732, #  176\n1376,4204,1311,1420,3206,  25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, #  192\n3276, 475,1447,3683,5020, 117,  21, 656, 810,1297,2300,2334,3557,5021, 126,4205, #  208\n 706, 456, 150, 613,4513,  71,1118,2037,4206, 145,3092,  85, 835, 486,2115,1246, #  224\n1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, #  240\n3558,3135,5023,1956,1153,4207,  83, 296,1199,3093, 192, 624,  93,5024, 822,1898, #  256\n2823,3136, 795,2065, 991,1554,1542,1592,  27,  43,2867, 859, 139,1456, 860,4514, #  272\n 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, #  288\n3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, #  304\n1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, #  320\n5026,5027,2176,3207,3685,2682, 593, 845,1062,3277,  88,1723,2038,3978,1951, 212, #  336\n 266, 152, 149, 468,1899,4208,4516,  77, 187,5028,3038,  37,   5,2990,5029,3979, #  352\n5030,5031,  39,2524,4517,2908,3208,2079,  55, 148,  74,4518, 545, 483,1474,1029, #  368\n1665, 217,1870,1531,3138,1104,2655,4209,  24, 172,3562, 900,3980,3563,3564,4519, #  384\n  32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683,   4,3039,3351,1427,1789, #  400\n 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, #  416\n3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439,  38,5037,1063,5038, 794, #  432\n3982,1435,2301,  46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804,  35, 707, #  448\n 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, #  464\n2129,1363,3689,1423, 697, 100,3094,  48,  70,1231, 495,3139,2196,5043,1294,5044, #  480\n2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, #  496\n 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, #  512\n 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, #  528\n3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, #  544\n1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, #  560\n1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, #  576\n1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381,   7, #  592\n2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, #  608\n 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, #  624\n4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, #  640\n1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, #  656\n5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, #  672\n2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, #  688\n 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, #  704\n  98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, #  720\n 523,2789,2790,2658,5061, 141,2235,1333,  68, 176, 441, 876, 907,4220, 603,2602, #  736\n 710, 171,3464, 404, 549,  18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, #  752\n5063,2991, 368,5064, 146, 366,  99, 871,3693,1543, 748, 807,1586,1185,  22,2263, #  768\n 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, #  784\n1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068,  59,5069, #  800\n 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, #  816\n 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, #  832\n5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, #  848\n1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, #  864\n 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, #  880\n3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, #  896\n4224,  57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, #  912\n3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, #  928\n 279,3145,  51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, #  944\n 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, #  960\n1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, #  976\n4227,2475,1436, 953,4228,2055,4545, 671,2400,  79,4229,2446,3285, 608, 567,2689, #  992\n3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008\n3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024\n2402,5097,5098,5099,4232,3045,   0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040\n5101, 233,4233,3697,1819,4550,4551,5102,  96,1777,1315,2083,5103, 257,5104,1810, # 1056\n3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072\n5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088\n1484,5110,1712, 127,  67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104\n2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120\n1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136\n  78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152\n1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168\n4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184\n3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200\n 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216\n 165, 243,4559,3703,2528, 123, 683,4239, 764,4560,  36,3998,1793, 589,2916, 816, # 1232\n 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248\n2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264\n5122, 611,1156, 854,2386,1316,2875,   2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280\n1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296\n2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312\n1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328\n1994,5135,4564,5136,5137,2198,  13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344\n5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360\n5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376\n5149, 128,2133,  92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392\n3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408\n4567,2252,  94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424\n4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440\n2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456\n5163,2337,2068,  23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472\n3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488\n 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504\n5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863,  41, # 1520\n5170,5171,4575,5172,1657,2338,  19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536\n1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552\n2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568\n3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584\n4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600\n5182,2692, 733,  40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616\n3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632\n4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648\n1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664\n1871,2762,3004,5187, 435,5188, 343,1108, 596,  17,1751,4579,2239,3477,3709,5189, # 1680\n4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696\n1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712\n 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728\n1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744\n1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760\n3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776\n 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792\n5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808\n2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824\n1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840\n1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551,  30,2268,4266, # 1856\n5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872\n 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888\n4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904\n 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920\n2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936\n 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952\n1041,3005, 293,1168,  87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968\n1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984\n 730,1515, 184,2840,  66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000\n4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016\n4021,5231,5232,1186,  15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032\n1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048\n3596,1342,1681,1718, 766,3297, 286,  89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064\n5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080\n5240,3298, 310, 313,3482,2304, 770,4278,  54,3054, 189,4611,3105,3848,4025,5241, # 2096\n1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112\n2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128\n1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144\n3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160\n2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176\n3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192\n2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208\n4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224\n4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240\n3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256\n  97,  81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272\n3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288\n 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304\n3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320\n4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336\n3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352\n1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368\n5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384\n 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400\n5286, 587,  14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416\n1702,1226, 102,1547,  62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432\n 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448\n4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294,  86,1494,1730, # 2464\n4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480\n 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496\n2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512\n2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885,  28,2695, # 2528\n3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544\n1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560\n4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576\n2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592\n1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608\n1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624\n2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640\n3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656\n1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672\n5313,3493,5314,5315,5316,3310,2698,1433,3311, 131,  95,1504,4049, 723,4303,3166, # 2688\n1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704\n4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654,  53,5320,3014,5321, # 2720\n1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736\n 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752\n1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768\n4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784\n4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800\n2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816\n1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832\n4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848\n 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864\n5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880\n2322,3316,5346,5347,4308,5348,4309,  84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896\n3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912\n4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928\n 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944\n5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960\n5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976\n1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992\n4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008\n4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024\n2699,1516,3614,1121,1082,1329,3317,4073,1449,3873,  65,1128,2848,2927,2769,1590, # 3040\n3874,5370,5371,  12,2668,  45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056\n3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072\n2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088\n1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104\n4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120\n3736,1859,  91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136\n3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152\n2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168\n4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771,  61,4079,3738,1823,4080, # 3184\n5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200\n3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216\n2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232\n3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248\n1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264\n2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280\n3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296\n4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063,  56,1396,3113, # 3312\n2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328\n2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344\n5418,1076,  49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360\n1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376\n2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392\n1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408\n3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424\n4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629,  31,2851, # 3440\n2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456\n3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472\n3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488\n2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504\n4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520\n2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536\n3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552\n4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568\n5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584\n3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600\n 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616\n1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412,  42,3119, 464,5455,2642, # 3632\n4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648\n1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664\n4701,5462,3020, 962, 588,3629, 289,3250,2644,1116,  52,5463,3067,1797,5464,5465, # 3680\n5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696\n 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712\n5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728\n5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744\n2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760\n3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776\n2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792\n2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808\n 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824\n1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840\n4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856\n3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872\n3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888\n 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904\n2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920\n 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936\n2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952\n4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968\n1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984\n4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000\n1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016\n3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032\n 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048\n3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064\n5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080\n5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096\n3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112\n3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128\n1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144\n2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160\n5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176\n1561,2674,1452,4113,1375,5549,5550,  47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192\n1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208\n3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224\n 919,2352,2975,2353,1270,4727,4115,  73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240\n1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256\n4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272\n5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288\n2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304\n3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320\n 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336\n1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352\n2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368\n2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384\n5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400\n5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416\n5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432\n2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448\n2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464\n1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480\n4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496\n3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512\n3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528\n4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544\n4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560\n2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576\n2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592\n5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608\n4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624\n5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640\n4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656\n 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672\n 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688\n1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704\n3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720\n4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736\n1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752\n5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768\n2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784\n2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800\n3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816\n5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832\n1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848\n3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864\n5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880\n1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896\n5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912\n2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928\n3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944\n2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960\n3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976\n3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992\n3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008\n4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024\n 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040\n2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056\n4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072\n3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088\n5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104\n1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120\n5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136\n 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152\n1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168\n 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184\n4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200\n1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216\n4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232\n1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248\n 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264\n3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280\n4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296\n5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312\n 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328\n3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344\n 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360\n2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376  #last 512\n#Everything below is of no interest for detection purpose\n2522,1613,4812,5799,3345,3945,2523,5800,4162,5801,1637,4163,2471,4813,3946,5802, # 5392\n2500,3034,3800,5803,5804,2195,4814,5805,2163,5806,5807,5808,5809,5810,5811,5812, # 5408\n5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828, # 5424\n5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844, # 5440\n5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860, # 5456\n5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,5875,5876, # 5472\n5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889,5890,5891,5892, # 5488\n5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5906,5907,5908, # 5504\n5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,5921,5922,5923,5924, # 5520\n5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940, # 5536\n5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952,5953,5954,5955,5956, # 5552\n5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5972, # 5568\n5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984,5985,5986,5987,5988, # 5584\n5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004, # 5600\n6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020, # 5616\n6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036, # 5632\n6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052, # 5648\n6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068, # 5664\n6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084, # 5680\n6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100, # 5696\n6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116, # 5712\n6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,6132, # 5728\n6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,6145,6146,6147,6148, # 5744\n6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,6164, # 5760\n6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,6180, # 5776\n6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196, # 5792\n6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212, # 5808\n6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,3670,6224,6225,6226,6227, # 5824\n6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243, # 5840\n6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259, # 5856\n6260,6261,6262,6263,6264,6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275, # 5872\n6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,4815,6286,6287,6288,6289,6290, # 5888\n6291,6292,4816,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305, # 5904\n6306,6307,6308,6309,6310,6311,4817,4818,6312,6313,6314,6315,6316,6317,6318,4819, # 5920\n6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334, # 5936\n6335,6336,6337,4820,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349, # 5952\n6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365, # 5968\n6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381, # 5984\n6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397, # 6000\n6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,3441,6411,6412, # 6016\n6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,4440,6426,6427, # 6032\n6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443, # 6048\n6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,4821,6455,6456,6457,6458, # 6064\n6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474, # 6080\n6475,6476,6477,3947,3948,6478,6479,6480,6481,3272,4441,6482,6483,6484,6485,4442, # 6096\n6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,4822,6497,6498,6499,6500, # 6112\n6501,6502,6503,6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516, # 6128\n6517,6518,6519,6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532, # 6144\n6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548, # 6160\n6549,6550,6551,6552,6553,6554,6555,6556,2784,6557,4823,6558,6559,6560,6561,6562, # 6176\n6563,6564,6565,6566,6567,6568,6569,3949,6570,6571,6572,4824,6573,6574,6575,6576, # 6192\n6577,6578,6579,6580,6581,6582,6583,4825,6584,6585,6586,3950,2785,6587,6588,6589, # 6208\n6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605, # 6224\n6606,6607,6608,6609,6610,6611,6612,4826,6613,6614,6615,4827,6616,6617,6618,6619, # 6240\n6620,6621,6622,6623,6624,6625,4164,6626,6627,6628,6629,6630,6631,6632,6633,6634, # 6256\n3547,6635,4828,6636,6637,6638,6639,6640,6641,6642,3951,2984,6643,6644,6645,6646, # 6272\n6647,6648,6649,4165,6650,4829,6651,6652,4830,6653,6654,6655,6656,6657,6658,6659, # 6288\n6660,6661,6662,4831,6663,6664,6665,6666,6667,6668,6669,6670,6671,4166,6672,4832, # 6304\n3952,6673,6674,6675,6676,4833,6677,6678,6679,4167,6680,6681,6682,3198,6683,6684, # 6320\n6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,4834,6698,6699, # 6336\n6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715, # 6352\n6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731, # 6368\n6732,6733,6734,4443,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,4444, # 6384\n6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761, # 6400\n6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777, # 6416\n6778,6779,6780,6781,4168,6782,6783,3442,6784,6785,6786,6787,6788,6789,6790,6791, # 6432\n4169,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806, # 6448\n6807,6808,6809,6810,6811,4835,6812,6813,6814,4445,6815,6816,4446,6817,6818,6819, # 6464\n6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834,6835, # 6480\n3548,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,4836,6847,6848,6849, # 6496\n6850,6851,6852,6853,6854,3953,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864, # 6512\n6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,3199,6878,6879, # 6528\n6880,6881,6882,4447,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894, # 6544\n6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,4170,6905,6906,6907,6908,6909, # 6560\n6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925, # 6576\n6926,6927,4837,6928,6929,6930,6931,6932,6933,6934,6935,6936,3346,6937,6938,4838, # 6592\n6939,6940,6941,4448,6942,6943,6944,6945,6946,4449,6947,6948,6949,6950,6951,6952, # 6608\n6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968, # 6624\n6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984, # 6640\n6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,3671,6995,6996,6997,6998,4839, # 6656\n6999,7000,7001,7002,3549,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013, # 6672\n7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029, # 6688\n7030,4840,7031,7032,7033,7034,7035,7036,7037,7038,4841,7039,7040,7041,7042,7043, # 6704\n7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059, # 6720\n7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,2985,7071,7072,7073,7074, # 6736\n7075,7076,7077,7078,7079,7080,4842,7081,7082,7083,7084,7085,7086,7087,7088,7089, # 6752\n7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105, # 6768\n7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,4450,7119,7120, # 6784\n7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136, # 6800\n7137,7138,7139,7140,7141,7142,7143,4843,7144,7145,7146,7147,7148,7149,7150,7151, # 6816\n7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167, # 6832\n7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183, # 6848\n7184,7185,7186,7187,7188,4171,4172,7189,7190,7191,7192,7193,7194,7195,7196,7197, # 6864\n7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213, # 6880\n7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229, # 6896\n7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245, # 6912\n7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261, # 6928\n7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277, # 6944\n7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293, # 6960\n7294,7295,7296,4844,7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308, # 6976\n7309,7310,7311,7312,7313,7314,7315,7316,4451,7317,7318,7319,7320,7321,7322,7323, # 6992\n7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339, # 7008\n7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,4173,7354, # 7024\n7355,4845,7356,7357,7358,7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369, # 7040\n7370,7371,7372,7373,7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385, # 7056\n7386,7387,7388,4846,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400, # 7072\n7401,7402,7403,7404,7405,3672,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415, # 7088\n7416,7417,7418,7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431, # 7104\n7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447, # 7120\n7448,7449,7450,7451,7452,7453,4452,7454,3200,7455,7456,7457,7458,7459,7460,7461, # 7136\n7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,4847,7475,7476, # 7152\n7477,3133,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491, # 7168\n7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,3347,7503,7504,7505,7506, # 7184\n7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,4848, # 7200\n7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537, # 7216\n7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,3801,4849,7550,7551, # 7232\n7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, # 7248\n7568,7569,3035,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582, # 7264\n7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598, # 7280\n7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614, # 7296\n7615,7616,4850,7617,7618,3802,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628, # 7312\n7629,7630,7631,7632,4851,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643, # 7328\n7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659, # 7344\n7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,4453,7671,7672,7673,7674, # 7360\n7675,7676,7677,7678,7679,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690, # 7376\n7691,7692,7693,7694,7695,7696,7697,3443,7698,7699,7700,7701,7702,4454,7703,7704, # 7392\n7705,7706,7707,7708,7709,7710,7711,7712,7713,2472,7714,7715,7716,7717,7718,7719, # 7408\n7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,3954,7732,7733,7734, # 7424\n7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750, # 7440\n3134,7751,7752,4852,7753,7754,7755,4853,7756,7757,7758,7759,7760,4174,7761,7762, # 7456\n7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778, # 7472\n7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794, # 7488\n7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,4854,7806,7807,7808,7809, # 7504\n7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825, # 7520\n4855,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7536\n7841,7842,7843,7844,7845,7846,7847,3955,7848,7849,7850,7851,7852,7853,7854,7855, # 7552\n7856,7857,7858,7859,7860,3444,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870, # 7568\n7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886, # 7584\n7887,7888,7889,7890,7891,4175,7892,7893,7894,7895,7896,4856,4857,7897,7898,7899, # 7600\n7900,2598,7901,7902,7903,7904,7905,7906,7907,7908,4455,7909,7910,7911,7912,7913, # 7616\n7914,3201,7915,7916,7917,7918,7919,7920,7921,4858,7922,7923,7924,7925,7926,7927, # 7632\n7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943, # 7648\n7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7958,7959, # 7664\n7960,7961,7962,7963,7964,7965,7966,7967,7968,7969,7970,7971,7972,7973,7974,7975, # 7680\n7976,7977,7978,7979,7980,7981,4859,7982,7983,7984,7985,7986,7987,7988,7989,7990, # 7696\n7991,7992,7993,7994,7995,7996,4860,7997,7998,7999,8000,8001,8002,8003,8004,8005, # 7712\n8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,4176,8017,8018,8019,8020, # 7728\n8021,8022,8023,4861,8024,8025,8026,8027,8028,8029,8030,8031,8032,8033,8034,8035, # 7744\n8036,4862,4456,8037,8038,8039,8040,4863,8041,8042,8043,8044,8045,8046,8047,8048, # 7760\n8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,8064, # 7776\n8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080, # 7792\n8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096, # 7808\n8097,8098,8099,4864,4177,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110, # 7824\n8111,8112,8113,8114,8115,8116,8117,8118,8119,8120,4178,8121,8122,8123,8124,8125, # 7840\n8126,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141, # 7856\n8142,8143,8144,8145,4865,4866,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155, # 7872\n8156,8157,8158,8159,8160,8161,8162,8163,8164,8165,4179,8166,8167,8168,8169,8170, # 7888\n8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,4457,8182,8183,8184,8185, # 7904\n8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201, # 7920\n8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213,8214,8215,8216,8217, # 7936\n8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229,8230,8231,8232,8233, # 7952\n8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245,8246,8247,8248,8249, # 7968\n8250,8251,8252,8253,8254,8255,8256,3445,8257,8258,8259,8260,8261,8262,4458,8263, # 7984\n8264,8265,8266,8267,8268,8269,8270,8271,8272,4459,8273,8274,8275,8276,3550,8277, # 8000\n8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,4460,8290,8291,8292, # 8016\n8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,4867, # 8032\n8308,8309,8310,8311,8312,3551,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322, # 8048\n8323,8324,8325,8326,4868,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337, # 8064\n8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353, # 8080\n8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,4869,4461,8364,8365,8366,8367, # 8096\n8368,8369,8370,4870,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382, # 8112\n8383,8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398, # 8128\n8399,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,4871,8411,8412,8413, # 8144\n8414,8415,8416,8417,8418,8419,8420,8421,8422,4462,8423,8424,8425,8426,8427,8428, # 8160\n8429,8430,8431,8432,8433,2986,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443, # 8176\n8444,8445,8446,8447,8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459, # 8192\n8460,8461,8462,8463,8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475, # 8208\n8476,8477,8478,4180,8479,8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490, # 8224\n8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506, # 8240\n8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522, # 8256\n8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538, # 8272\n8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554, # 8288\n8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,4872,8565,8566,8567,8568,8569, # 8304\n8570,8571,8572,8573,4873,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584, # 8320\n8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600, # 8336\n8601,8602,8603,8604,8605,3803,8606,8607,8608,8609,8610,8611,8612,8613,4874,3804, # 8352\n8614,8615,8616,8617,8618,8619,8620,8621,3956,8622,8623,8624,8625,8626,8627,8628, # 8368\n8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,2865,8639,8640,8641,8642,8643, # 8384\n8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,4463,8657,8658, # 8400\n8659,4875,4876,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672, # 8416\n8673,8674,8675,8676,8677,8678,8679,8680,8681,4464,8682,8683,8684,8685,8686,8687, # 8432\n8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, # 8448\n8704,8705,8706,8707,8708,8709,2261,8710,8711,8712,8713,8714,8715,8716,8717,8718, # 8464\n8719,8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,4181, # 8480\n8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749, # 8496\n8750,8751,8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,4877,8764, # 8512\n8765,8766,8767,8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780, # 8528\n8781,8782,8783,8784,8785,8786,8787,8788,4878,8789,4879,8790,8791,8792,4880,8793, # 8544\n8794,8795,8796,8797,8798,8799,8800,8801,4881,8802,8803,8804,8805,8806,8807,8808, # 8560\n8809,8810,8811,8812,8813,8814,8815,3957,8816,8817,8818,8819,8820,8821,8822,8823, # 8576\n8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839, # 8592\n8840,8841,8842,8843,8844,8845,8846,8847,4882,8848,8849,8850,8851,8852,8853,8854, # 8608\n8855,8856,8857,8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870, # 8624\n8871,8872,8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,3202,8885, # 8640\n8886,8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901, # 8656\n8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917, # 8672\n8918,8919,8920,8921,8922,8923,8924,4465,8925,8926,8927,8928,8929,8930,8931,8932, # 8688\n4883,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,2214,8944,8945,8946, # 8704\n8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962, # 8720\n8963,8964,8965,4884,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977, # 8736\n8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,4885, # 8752\n8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008, # 8768\n9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,4182,9022,9023, # 8784\n9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039, # 8800\n9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055, # 8816\n9056,9057,9058,9059,9060,9061,9062,9063,4886,9064,9065,9066,9067,9068,9069,4887, # 8832\n9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085, # 8848\n9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101, # 8864\n9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117, # 8880\n9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133, # 8896\n9134,9135,9136,9137,9138,9139,9140,9141,3958,9142,9143,9144,9145,9146,9147,9148, # 8912\n9149,9150,9151,4888,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163, # 8928\n9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,4889,9176,9177,9178, # 8944\n9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194, # 8960\n9195,9196,9197,9198,9199,9200,9201,9202,9203,4890,9204,9205,9206,9207,9208,9209, # 8976\n9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,4466,9223,9224, # 8992\n9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240, # 9008\n9241,9242,9243,9244,9245,4891,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255, # 9024\n9256,9257,4892,9258,9259,9260,9261,4893,4894,9262,9263,9264,9265,9266,9267,9268, # 9040\n9269,9270,9271,9272,9273,4467,9274,9275,9276,9277,9278,9279,9280,9281,9282,9283, # 9056\n9284,9285,3673,9286,9287,9288,9289,9290,9291,9292,9293,9294,9295,9296,9297,9298, # 9072\n9299,9300,9301,9302,9303,9304,9305,9306,9307,9308,9309,9310,9311,9312,9313,9314, # 9088\n9315,9316,9317,9318,9319,9320,9321,9322,4895,9323,9324,9325,9326,9327,9328,9329, # 9104\n9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345, # 9120\n9346,9347,4468,9348,9349,9350,9351,9352,9353,9354,9355,9356,9357,9358,9359,9360, # 9136\n9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9372,9373,4896,9374,4469, # 9152\n9375,9376,9377,9378,9379,4897,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389, # 9168\n9390,9391,9392,9393,9394,9395,9396,9397,9398,9399,9400,9401,9402,9403,9404,9405, # 9184\n9406,4470,9407,2751,9408,9409,3674,3552,9410,9411,9412,9413,9414,9415,9416,9417, # 9200\n9418,9419,9420,9421,4898,9422,9423,9424,9425,9426,9427,9428,9429,3959,9430,9431, # 9216\n9432,9433,9434,9435,9436,4471,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446, # 9232\n9447,9448,9449,9450,3348,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,9461, # 9248\n9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472,4899,9473,9474,9475,9476, # 9264\n9477,4900,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,3349,9489,9490, # 9280\n9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506, # 9296\n9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,4901,9521, # 9312\n9522,9523,9524,9525,9526,4902,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536, # 9328\n9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,9551,9552, # 9344\n9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568, # 9360\n9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584, # 9376\n3805,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599, # 9392\n9600,9601,9602,4903,9603,9604,9605,9606,9607,4904,9608,9609,9610,9611,9612,9613, # 9408\n9614,4905,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627,9628, # 9424\n9629,9630,9631,9632,4906,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642,9643, # 9440\n4907,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9656,9657,9658, # 9456\n9659,9660,9661,9662,9663,9664,9665,9666,9667,9668,9669,9670,9671,9672,4183,9673, # 9472\n9674,9675,9676,9677,4908,9678,9679,9680,9681,4909,9682,9683,9684,9685,9686,9687, # 9488\n9688,9689,9690,4910,9691,9692,9693,3675,9694,9695,9696,2945,9697,9698,9699,9700, # 9504\n9701,9702,9703,9704,9705,4911,9706,9707,9708,9709,9710,9711,9712,9713,9714,9715, # 9520\n9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,9728,9729,9730,9731, # 9536\n9732,9733,9734,9735,4912,9736,9737,9738,9739,9740,4913,9741,9742,9743,9744,9745, # 9552\n9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,4914,9759,9760, # 9568\n9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776, # 9584\n9777,9778,9779,9780,9781,9782,4915,9783,9784,9785,9786,9787,9788,9789,9790,9791, # 9600\n9792,9793,4916,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806, # 9616\n9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822, # 9632\n9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838, # 9648\n9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854, # 9664\n9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867,9868,4917,9869, # 9680\n9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885, # 9696\n9886,9887,9888,9889,9890,9891,9892,4472,9893,9894,9895,9896,9897,3806,9898,9899, # 9712\n9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,4918, # 9728\n9915,9916,9917,4919,9918,9919,9920,9921,4184,9922,9923,9924,9925,9926,9927,9928, # 9744\n9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944, # 9760\n9945,9946,4920,9947,9948,9949,9950,9951,9952,9953,9954,9955,4185,9956,9957,9958, # 9776\n9959,9960,9961,9962,9963,9964,9965,4921,9966,9967,9968,4473,9969,9970,9971,9972, # 9792\n9973,9974,9975,9976,9977,4474,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987, # 9808\n9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001,10002,10003, # 9824\n10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,10014,10015,10016,10017,10018,10019, # 9840\n10020,10021,4922,10022,4923,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033, # 9856\n10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,4924, # 9872\n10049,10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10060,10061,10062,10063,10064, # 9888\n10065,10066,10067,10068,10069,10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080, # 9904\n10081,10082,10083,10084,10085,10086,10087,4475,10088,10089,10090,10091,10092,10093,10094,10095, # 9920\n10096,10097,4476,10098,10099,10100,10101,10102,10103,10104,10105,10106,10107,10108,10109,10110, # 9936\n10111,2174,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121,10122,10123,10124,10125, # 9952\n10126,10127,10128,10129,10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,3807, # 9968\n4186,4925,10141,10142,10143,10144,10145,10146,10147,4477,4187,10148,10149,10150,10151,10152, # 9984\n10153,4188,10154,10155,10156,10157,10158,10159,10160,10161,4926,10162,10163,10164,10165,10166, #10000\n10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177,10178,10179,10180,10181,10182, #10016\n10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,3203,10193,10194,10195,10196,10197, #10032\n10198,10199,10200,4478,10201,10202,10203,10204,4479,10205,10206,10207,10208,10209,10210,10211, #10048\n10212,10213,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,10226,10227, #10064\n10228,10229,10230,10231,10232,10233,10234,4927,10235,10236,10237,10238,10239,10240,10241,10242, #10080\n10243,10244,10245,10246,10247,10248,10249,10250,10251,10252,10253,10254,10255,10256,10257,10258, #10096\n10259,10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,4480, #10112\n4928,4929,10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,10286,10287, #10128\n10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300,10301,10302,10303, #10144\n10304,10305,10306,10307,10308,10309,10310,10311,10312,10313,10314,10315,10316,10317,10318,10319, #10160\n10320,10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,10334,4930, #10176\n10335,10336,10337,10338,10339,10340,10341,10342,4931,10343,10344,10345,10346,10347,10348,10349, #10192\n10350,10351,10352,10353,10354,10355,3088,10356,2786,10357,10358,10359,10360,4189,10361,10362, #10208\n10363,10364,10365,10366,10367,10368,10369,10370,10371,10372,10373,10374,10375,4932,10376,10377, #10224\n10378,10379,10380,10381,10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,4933, #10240\n10393,10394,10395,4934,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,10406,10407, #10256\n10408,10409,10410,10411,10412,3446,10413,10414,10415,10416,10417,10418,10419,10420,10421,10422, #10272\n10423,4935,10424,10425,10426,10427,10428,10429,10430,4936,10431,10432,10433,10434,10435,10436, #10288\n10437,10438,10439,10440,10441,10442,10443,4937,10444,10445,10446,10447,4481,10448,10449,10450, #10304\n10451,10452,10453,10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,10466, #10320\n10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481,10482, #10336\n10483,10484,10485,10486,10487,10488,10489,10490,10491,10492,10493,10494,10495,10496,10497,10498, #10352\n10499,10500,10501,10502,10503,10504,10505,4938,10506,10507,10508,10509,10510,2552,10511,10512, #10368\n10513,10514,10515,10516,3447,10517,10518,10519,10520,10521,10522,10523,10524,10525,10526,10527, #10384\n10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543, #10400\n4482,10544,4939,10545,10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557, #10416\n10558,10559,10560,10561,10562,10563,10564,10565,10566,10567,3676,4483,10568,10569,10570,10571, #10432\n10572,3448,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586, #10448\n10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602, #10464\n10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613,10614,10615,10616,10617,10618, #10480\n10619,10620,10621,10622,10623,10624,10625,10626,10627,4484,10628,10629,10630,10631,10632,4940, #10496\n10633,10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648, #10512\n10649,10650,10651,10652,10653,10654,10655,10656,4941,10657,10658,10659,2599,10660,10661,10662, #10528\n10663,10664,10665,10666,3089,10667,10668,10669,10670,10671,10672,10673,10674,10675,10676,10677, #10544\n10678,10679,10680,4942,10681,10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692, #10560\n10693,10694,10695,10696,10697,4485,10698,10699,10700,10701,10702,10703,10704,4943,10705,3677, #10576\n10706,10707,10708,10709,10710,10711,10712,4944,10713,10714,10715,10716,10717,10718,10719,10720, #10592\n10721,10722,10723,10724,10725,10726,10727,10728,4945,10729,10730,10731,10732,10733,10734,10735, #10608\n10736,10737,10738,10739,10740,10741,10742,10743,10744,10745,10746,10747,10748,10749,10750,10751, #10624\n10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,4946,10762,10763,10764,10765,10766, #10640\n10767,4947,4948,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780, #10656\n10781,10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796, #10672\n10797,10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812, #10688\n10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828, #10704\n10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844, #10720\n10845,10846,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860, #10736\n10861,10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876, #10752\n10877,10878,4486,10879,10880,10881,10882,10883,10884,10885,4949,10886,10887,10888,10889,10890, #10768\n10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906, #10784\n10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,4487,10920,10921, #10800\n10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,4950,10933,10934,10935,10936, #10816\n10937,10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949,4488,10950,10951, #10832\n10952,10953,10954,10955,10956,10957,10958,10959,4190,10960,10961,10962,10963,10964,10965,10966, #10848\n10967,10968,10969,10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,10982, #10864\n10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998, #10880\n10999,11000,11001,11002,11003,11004,11005,11006,3960,11007,11008,11009,11010,11011,11012,11013, #10896\n11014,11015,11016,11017,11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029, #10912\n11030,11031,11032,4951,11033,11034,11035,11036,11037,11038,11039,11040,11041,11042,11043,11044, #10928\n11045,11046,11047,4489,11048,11049,11050,11051,4952,11052,11053,11054,11055,11056,11057,11058, #10944\n4953,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,11070,11071,4954,11072, #10960\n11073,11074,11075,11076,11077,11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088, #10976\n11089,11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,11102,11103,11104, #10992\n11105,11106,11107,11108,11109,11110,11111,11112,11113,11114,11115,3808,11116,11117,11118,11119, #11008\n11120,11121,11122,11123,11124,11125,11126,11127,11128,11129,11130,11131,11132,11133,11134,4955, #11024\n11135,11136,11137,11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,11150, #11040\n11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161,4956,11162,11163,11164,11165, #11056\n11166,11167,11168,11169,11170,11171,11172,11173,11174,11175,11176,11177,11178,11179,11180,4957, #11072\n11181,11182,11183,11184,11185,11186,4958,11187,11188,11189,11190,11191,11192,11193,11194,11195, #11088\n11196,11197,11198,11199,11200,3678,11201,11202,11203,11204,11205,11206,4191,11207,11208,11209, #11104\n11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225, #11120\n11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237,11238,11239,11240,11241, #11136\n11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,4959,11252,11253,11254,11255,11256, #11152\n11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272, #11168\n11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288, #11184\n11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304, #11200\n11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,3679,11315,11316,11317,11318,4490, #11216\n11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334, #11232\n11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,4960,11348,11349, #11248\n11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365, #11264\n11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,3961,4961,11378,11379, #11280\n11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395, #11296\n11396,11397,4192,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410, #11312\n11411,4962,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425, #11328\n11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441, #11344\n11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457, #11360\n11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,4963,11470,11471,4491, #11376\n11472,11473,11474,11475,4964,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486, #11392\n11487,11488,11489,11490,11491,11492,4965,11493,11494,11495,11496,11497,11498,11499,11500,11501, #11408\n11502,11503,11504,11505,11506,11507,11508,11509,11510,11511,11512,11513,11514,11515,11516,11517, #11424\n11518,11519,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,3962,11530,11531,11532, #11440\n11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548, #11456\n11549,11550,11551,11552,11553,11554,11555,11556,11557,11558,11559,11560,11561,11562,11563,11564, #11472\n4193,4194,11565,11566,11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578, #11488\n11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,4966,4195,11592, #11504\n11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,3090,11605,11606,11607, #11520\n11608,11609,11610,4967,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622, #11536\n11623,11624,11625,11626,11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638, #11552\n11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650,11651,11652,11653,11654, #11568\n11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670, #11584\n11671,11672,11673,11674,4968,11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685, #11600\n11686,11687,11688,11689,11690,11691,11692,11693,3809,11694,11695,11696,11697,11698,11699,11700, #11616\n11701,11702,11703,11704,11705,11706,11707,11708,11709,11710,11711,11712,11713,11714,11715,11716, #11632\n11717,11718,3553,11719,11720,11721,11722,11723,11724,11725,11726,11727,11728,11729,11730,4969, #11648\n11731,11732,11733,11734,11735,11736,11737,11738,11739,11740,4492,11741,11742,11743,11744,11745, #11664\n11746,11747,11748,11749,11750,11751,11752,4970,11753,11754,11755,11756,11757,11758,11759,11760, #11680\n11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,11776, #11696\n11777,11778,11779,11780,11781,11782,11783,11784,11785,11786,11787,11788,11789,11790,4971,11791, #11712\n11792,11793,11794,11795,11796,11797,4972,11798,11799,11800,11801,11802,11803,11804,11805,11806, #11728\n11807,11808,11809,11810,4973,11811,11812,11813,11814,11815,11816,11817,11818,11819,11820,11821, #11744\n11822,11823,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833,11834,3680,3810,11835, #11760\n11836,4974,11837,11838,11839,11840,11841,11842,11843,11844,11845,11846,11847,11848,11849,11850, #11776\n11851,11852,11853,11854,11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866, #11792\n11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878,11879,11880,11881,11882, #11808\n11883,11884,4493,11885,11886,11887,11888,11889,11890,11891,11892,11893,11894,11895,11896,11897, #11824\n11898,11899,11900,11901,11902,11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913, #11840\n11914,11915,4975,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,11927,11928, #11856\n11929,11930,11931,11932,11933,11934,11935,11936,11937,11938,11939,11940,11941,11942,11943,11944, #11872\n11945,11946,11947,11948,11949,4976,11950,11951,11952,11953,11954,11955,11956,11957,11958,11959, #11888\n11960,11961,11962,11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,11975, #11904\n11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,4196,11988,11989,11990, #11920\n11991,11992,4977,11993,11994,11995,11996,11997,11998,11999,12000,12001,12002,12003,12004,12005, #11936\n12006,12007,12008,12009,12010,12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021, #11952\n12022,12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034,12035,12036,12037, #11968\n12038,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12049,12050,12051,12052,12053, #11984\n12054,12055,12056,12057,12058,12059,12060,12061,4978,12062,12063,12064,12065,12066,12067,12068, #12000\n12069,12070,12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084, #12016\n12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097,12098,12099,12100, #12032\n12101,12102,12103,12104,12105,12106,12107,12108,12109,12110,12111,12112,12113,12114,12115,12116, #12048\n12117,12118,12119,12120,12121,12122,12123,4979,12124,12125,12126,12127,12128,4197,12129,12130, #12064\n12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,12143,12144,12145,12146, #12080\n12147,12148,12149,12150,12151,12152,12153,12154,4980,12155,12156,12157,12158,12159,12160,4494, #12096\n12161,12162,12163,12164,3811,12165,12166,12167,12168,12169,4495,12170,12171,4496,12172,12173, #12112\n12174,12175,12176,3812,12177,12178,12179,12180,12181,12182,12183,12184,12185,12186,12187,12188, #12128\n12189,12190,12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,12203,12204, #12144\n12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217,12218,12219,12220, #12160\n12221,4981,12222,12223,12224,12225,12226,12227,12228,12229,12230,12231,12232,12233,12234,12235, #12176\n4982,12236,12237,12238,12239,12240,12241,12242,12243,12244,12245,4983,12246,12247,12248,12249, #12192\n4984,12250,12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262,12263,12264, #12208\n4985,12265,4497,12266,12267,12268,12269,12270,12271,12272,12273,12274,12275,12276,12277,12278, #12224\n12279,12280,12281,12282,12283,12284,12285,12286,12287,4986,12288,12289,12290,12291,12292,12293, #12240\n12294,12295,12296,2473,12297,12298,12299,12300,12301,12302,12303,12304,12305,12306,12307,12308, #12256\n12309,12310,12311,12312,12313,12314,12315,12316,12317,12318,12319,3963,12320,12321,12322,12323, #12272\n12324,12325,12326,12327,12328,12329,12330,12331,12332,4987,12333,12334,12335,12336,12337,12338, #12288\n12339,12340,12341,12342,12343,12344,12345,12346,12347,12348,12349,12350,12351,12352,12353,12354, #12304\n12355,12356,12357,12358,12359,3964,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369, #12320\n12370,3965,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384, #12336\n12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400, #12352\n12401,12402,12403,12404,12405,12406,12407,12408,4988,12409,12410,12411,12412,12413,12414,12415, #12368\n12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431, #12384\n12432,12433,12434,12435,12436,12437,12438,3554,12439,12440,12441,12442,12443,12444,12445,12446, #12400\n12447,12448,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462, #12416\n12463,12464,4989,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477, #12432\n12478,12479,12480,4990,12481,12482,12483,12484,12485,12486,12487,12488,12489,4498,12490,12491, #12448\n12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507, #12464\n12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523, #12480\n12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12539, #12496\n12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550,12551,4991,12552,12553,12554, #12512\n12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570, #12528\n12571,12572,12573,12574,12575,12576,12577,12578,3036,12579,12580,12581,12582,12583,3966,12584, #12544\n12585,12586,12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598,12599,12600, #12560\n12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616, #12576\n12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632, #12592\n12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,4499,12647, #12608\n12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663, #12624\n12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679, #12640\n12680,12681,12682,12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694,12695, #12656\n12696,12697,12698,4992,12699,12700,12701,12702,12703,12704,12705,12706,12707,12708,12709,12710, #12672\n12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726, #12688\n12727,12728,12729,12730,12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742, #12704\n12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754,12755,12756,12757,12758, #12720\n12759,12760,12761,12762,12763,12764,12765,12766,12767,12768,12769,12770,12771,12772,12773,12774, #12736\n12775,12776,12777,12778,4993,2175,12779,12780,12781,12782,12783,12784,12785,12786,4500,12787, #12752\n12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,12803, #12768\n12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819, #12784\n12820,12821,12822,12823,12824,12825,12826,4198,3967,12827,12828,12829,12830,12831,12832,12833, #12800\n12834,12835,12836,12837,12838,12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849, #12816\n12850,12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,4199,12862,12863,12864, #12832\n12865,12866,12867,12868,12869,12870,12871,12872,12873,12874,12875,12876,12877,12878,12879,12880, #12848\n12881,12882,12883,12884,12885,12886,12887,4501,12888,12889,12890,12891,12892,12893,12894,12895, #12864\n12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911, #12880\n12912,4994,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,12924,12925,12926, #12896\n12927,12928,12929,12930,12931,12932,12933,12934,12935,12936,12937,12938,12939,12940,12941,12942, #12912\n12943,12944,12945,12946,12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,1772,12957, #12928\n12958,12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970,12971,12972,12973, #12944\n12974,12975,12976,12977,12978,12979,12980,12981,12982,12983,12984,12985,12986,12987,12988,12989, #12960\n12990,12991,12992,12993,12994,12995,12996,12997,4502,12998,4503,12999,13000,13001,13002,13003, #12976\n4504,13004,13005,13006,13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018, #12992\n13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,3449,13030,13031,13032,13033, #13008\n13034,13035,13036,13037,13038,13039,13040,13041,13042,13043,13044,13045,13046,13047,13048,13049, #13024\n13050,13051,13052,13053,13054,13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065, #13040\n13066,13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,13079,13080,13081, #13056\n13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093,13094,13095,13096,13097, #13072\n13098,13099,13100,13101,13102,13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113, #13088\n13114,13115,13116,13117,13118,3968,13119,4995,13120,13121,13122,13123,13124,13125,13126,13127, #13104\n4505,13128,13129,13130,13131,13132,13133,13134,4996,4506,13135,13136,13137,13138,13139,4997, #13120\n13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150,13151,13152,13153,13154,13155, #13136\n13156,13157,13158,13159,4998,13160,13161,13162,13163,13164,13165,13166,13167,13168,13169,13170, #13152\n13171,13172,13173,13174,13175,13176,4999,13177,13178,13179,13180,13181,13182,13183,13184,13185, #13168\n13186,13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,13199,13200,13201, #13184\n13202,13203,13204,13205,13206,5000,13207,13208,13209,13210,13211,13212,13213,13214,13215,13216, #13200\n13217,13218,13219,13220,13221,13222,13223,13224,13225,13226,13227,4200,5001,13228,13229,13230, #13216\n13231,13232,13233,13234,13235,13236,13237,13238,13239,13240,3969,13241,13242,13243,13244,3970, #13232\n13245,13246,13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258,13259,13260, #13248\n13261,13262,13263,13264,13265,13266,13267,13268,3450,13269,13270,13271,13272,13273,13274,13275, #13264\n13276,5002,13277,13278,13279,13280,13281,13282,13283,13284,13285,13286,13287,13288,13289,13290, #13280\n13291,13292,13293,13294,13295,13296,13297,13298,13299,13300,13301,13302,3813,13303,13304,13305, #13296\n13306,13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321, #13312\n13322,13323,13324,13325,13326,13327,13328,4507,13329,13330,13331,13332,13333,13334,13335,13336, #13328\n13337,13338,13339,13340,13341,5003,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351, #13344\n13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367, #13360\n5004,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382, #13376\n13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398, #13392\n13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414, #13408\n13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430, #13424\n13431,13432,4508,13433,13434,13435,4201,13436,13437,13438,13439,13440,13441,13442,13443,13444, #13440\n13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,5005,13458,13459, #13456\n13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,4509,13471,13472,13473,13474, #13472\n13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490, #13488\n13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506, #13504\n13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522, #13520\n13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538, #13536\n13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554, #13552\n13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570, #13568\n13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586, #13584\n13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602, #13600\n13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618, #13616\n13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634, #13632\n13635,13636,13637,13638,13639,13640,13641,13642,5006,13643,13644,13645,13646,13647,13648,13649, #13648\n13650,13651,5007,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664, #13664\n13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680, #13680\n13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696, #13696\n13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712, #13712\n13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728, #13728\n13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744, #13744\n13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760, #13760\n13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,3273,13775, #13776\n13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791, #13792\n13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807, #13808\n13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823, #13824\n13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839, #13840\n13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855, #13856\n13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871, #13872\n13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887, #13888\n13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903, #13904\n13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919, #13920\n13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935, #13936\n13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951, #13952\n13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967, #13968\n13968,13969,13970,13971,13972) #13973\n\n# flake8: noqa\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/big5prober.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is Mozilla Communicator client code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 1998\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n#\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\nfrom .mbcharsetprober import MultiByteCharSetProber\r\nfrom .codingstatemachine import CodingStateMachine\r\nfrom .chardistribution import Big5DistributionAnalysis\r\nfrom .mbcssm import Big5SMModel\r\n\r\n\r\nclass Big5Prober(MultiByteCharSetProber):\r\n    def __init__(self):\r\n        MultiByteCharSetProber.__init__(self)\r\n        self._mCodingSM = CodingStateMachine(Big5SMModel)\r\n        self._mDistributionAnalyzer = Big5DistributionAnalysis()\r\n        self.reset()\r\n\r\n    def get_charset_name(self):\r\n        return \"Big5\"\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/chardistribution.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is Mozilla Communicator client code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 1998\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n#\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\nfrom .euctwfreq import (EUCTWCharToFreqOrder, EUCTW_TABLE_SIZE,\r\n                        EUCTW_TYPICAL_DISTRIBUTION_RATIO)\r\nfrom .euckrfreq import (EUCKRCharToFreqOrder, EUCKR_TABLE_SIZE,\r\n                        EUCKR_TYPICAL_DISTRIBUTION_RATIO)\r\nfrom .gb2312freq import (GB2312CharToFreqOrder, GB2312_TABLE_SIZE,\r\n                         GB2312_TYPICAL_DISTRIBUTION_RATIO)\r\nfrom .big5freq import (Big5CharToFreqOrder, BIG5_TABLE_SIZE,\r\n                       BIG5_TYPICAL_DISTRIBUTION_RATIO)\r\nfrom .jisfreq import (JISCharToFreqOrder, JIS_TABLE_SIZE,\r\n                      JIS_TYPICAL_DISTRIBUTION_RATIO)\r\nfrom .compat import wrap_ord\r\n\r\nENOUGH_DATA_THRESHOLD = 1024\r\nSURE_YES = 0.99\r\nSURE_NO = 0.01\r\nMINIMUM_DATA_THRESHOLD = 3\r\n\r\n\r\nclass CharDistributionAnalysis:\r\n    def __init__(self):\r\n        # Mapping table to get frequency order from char order (get from\r\n        # GetOrder())\r\n        self._mCharToFreqOrder = None\r\n        self._mTableSize = None  # Size of above table\r\n        # This is a constant value which varies from language to language,\r\n        # used in calculating confidence.  See\r\n        # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html\r\n        # for further detail.\r\n        self._mTypicalDistributionRatio = None\r\n        self.reset()\r\n\r\n    def reset(self):\r\n        \"\"\"reset analyser, clear any state\"\"\"\r\n        # If this flag is set to True, detection is done and conclusion has\r\n        # been made\r\n        self._mDone = False\r\n        self._mTotalChars = 0  # Total characters encountered\r\n        # The number of characters whose frequency order is less than 512\r\n        self._mFreqChars = 0\r\n\r\n    def feed(self, aBuf, aCharLen):\r\n        \"\"\"feed a character with known length\"\"\"\r\n        if aCharLen == 2:\r\n            # we only care about 2-bytes character in our distribution analysis\r\n            order = self.get_order(aBuf)\r\n        else:\r\n            order = -1\r\n        if order >= 0:\r\n            self._mTotalChars += 1\r\n            # order is valid\r\n            if order < self._mTableSize:\r\n                if 512 > self._mCharToFreqOrder[order]:\r\n                    self._mFreqChars += 1\r\n\r\n    def get_confidence(self):\r\n        \"\"\"return confidence based on existing data\"\"\"\r\n        # if we didn't receive any character in our consideration range,\r\n        # return negative answer\r\n        if self._mTotalChars <= 0 or self._mFreqChars <= MINIMUM_DATA_THRESHOLD:\r\n            return SURE_NO\r\n\r\n        if self._mTotalChars != self._mFreqChars:\r\n            r = (self._mFreqChars / ((self._mTotalChars - self._mFreqChars)\r\n                 * self._mTypicalDistributionRatio))\r\n            if r < SURE_YES:\r\n                return r\r\n\r\n        # normalize confidence (we don't want to be 100% sure)\r\n        return SURE_YES\r\n\r\n    def got_enough_data(self):\r\n        # It is not necessary to receive all data to draw conclusion.\r\n        # For charset detection, certain amount of data is enough\r\n        return self._mTotalChars > ENOUGH_DATA_THRESHOLD\r\n\r\n    def get_order(self, aBuf):\r\n        # We do not handle characters based on the original encoding string,\r\n        # but convert this encoding string to a number, here called order.\r\n        # This allows multiple encodings of a language to share one frequency\r\n        # table.\r\n        return -1\r\n\r\n\r\nclass EUCTWDistributionAnalysis(CharDistributionAnalysis):\r\n    def __init__(self):\r\n        CharDistributionAnalysis.__init__(self)\r\n        self._mCharToFreqOrder = EUCTWCharToFreqOrder\r\n        self._mTableSize = EUCTW_TABLE_SIZE\r\n        self._mTypicalDistributionRatio = EUCTW_TYPICAL_DISTRIBUTION_RATIO\r\n\r\n    def get_order(self, aBuf):\r\n        # for euc-TW encoding, we are interested\r\n        #   first  byte range: 0xc4 -- 0xfe\r\n        #   second byte range: 0xa1 -- 0xfe\r\n        # no validation needed here. State machine has done that\r\n        first_char = wrap_ord(aBuf[0])\r\n        if first_char >= 0xC4:\r\n            return 94 * (first_char - 0xC4) + wrap_ord(aBuf[1]) - 0xA1\r\n        else:\r\n            return -1\r\n\r\n\r\nclass EUCKRDistributionAnalysis(CharDistributionAnalysis):\r\n    def __init__(self):\r\n        CharDistributionAnalysis.__init__(self)\r\n        self._mCharToFreqOrder = EUCKRCharToFreqOrder\r\n        self._mTableSize = EUCKR_TABLE_SIZE\r\n        self._mTypicalDistributionRatio = EUCKR_TYPICAL_DISTRIBUTION_RATIO\r\n\r\n    def get_order(self, aBuf):\r\n        # for euc-KR encoding, we are interested\r\n        #   first  byte range: 0xb0 -- 0xfe\r\n        #   second byte range: 0xa1 -- 0xfe\r\n        # no validation needed here. State machine has done that\r\n        first_char = wrap_ord(aBuf[0])\r\n        if first_char >= 0xB0:\r\n            return 94 * (first_char - 0xB0) + wrap_ord(aBuf[1]) - 0xA1\r\n        else:\r\n            return -1\r\n\r\n\r\nclass GB2312DistributionAnalysis(CharDistributionAnalysis):\r\n    def __init__(self):\r\n        CharDistributionAnalysis.__init__(self)\r\n        self._mCharToFreqOrder = GB2312CharToFreqOrder\r\n        self._mTableSize = GB2312_TABLE_SIZE\r\n        self._mTypicalDistributionRatio = GB2312_TYPICAL_DISTRIBUTION_RATIO\r\n\r\n    def get_order(self, aBuf):\r\n        # for GB2312 encoding, we are interested\r\n        #  first  byte range: 0xb0 -- 0xfe\r\n        #  second byte range: 0xa1 -- 0xfe\r\n        # no validation needed here. State machine has done that\r\n        first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1])\r\n        if (first_char >= 0xB0) and (second_char >= 0xA1):\r\n            return 94 * (first_char - 0xB0) + second_char - 0xA1\r\n        else:\r\n            return -1\r\n\r\n\r\nclass Big5DistributionAnalysis(CharDistributionAnalysis):\r\n    def __init__(self):\r\n        CharDistributionAnalysis.__init__(self)\r\n        self._mCharToFreqOrder = Big5CharToFreqOrder\r\n        self._mTableSize = BIG5_TABLE_SIZE\r\n        self._mTypicalDistributionRatio = BIG5_TYPICAL_DISTRIBUTION_RATIO\r\n\r\n    def get_order(self, aBuf):\r\n        # for big5 encoding, we are interested\r\n        #   first  byte range: 0xa4 -- 0xfe\r\n        #   second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe\r\n        # no validation needed here. State machine has done that\r\n        first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1])\r\n        if first_char >= 0xA4:\r\n            if second_char >= 0xA1:\r\n                return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63\r\n            else:\r\n                return 157 * (first_char - 0xA4) + second_char - 0x40\r\n        else:\r\n            return -1\r\n\r\n\r\nclass SJISDistributionAnalysis(CharDistributionAnalysis):\r\n    def __init__(self):\r\n        CharDistributionAnalysis.__init__(self)\r\n        self._mCharToFreqOrder = JISCharToFreqOrder\r\n        self._mTableSize = JIS_TABLE_SIZE\r\n        self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO\r\n\r\n    def get_order(self, aBuf):\r\n        # for sjis encoding, we are interested\r\n        #   first  byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe\r\n        #   second byte range: 0x40 -- 0x7e,  0x81 -- oxfe\r\n        # no validation needed here. State machine has done that\r\n        first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1])\r\n        if (first_char >= 0x81) and (first_char <= 0x9F):\r\n            order = 188 * (first_char - 0x81)\r\n        elif (first_char >= 0xE0) and (first_char <= 0xEF):\r\n            order = 188 * (first_char - 0xE0 + 31)\r\n        else:\r\n            return -1\r\n        order = order + second_char - 0x40\r\n        if second_char > 0x7F:\r\n            order = -1\r\n        return order\r\n\r\n\r\nclass EUCJPDistributionAnalysis(CharDistributionAnalysis):\r\n    def __init__(self):\r\n        CharDistributionAnalysis.__init__(self)\r\n        self._mCharToFreqOrder = JISCharToFreqOrder\r\n        self._mTableSize = JIS_TABLE_SIZE\r\n        self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO\r\n\r\n    def get_order(self, aBuf):\r\n        # for euc-JP encoding, we are interested\r\n        #   first  byte range: 0xa0 -- 0xfe\r\n        #   second byte range: 0xa1 -- 0xfe\r\n        # no validation needed here. State machine has done that\r\n        char = wrap_ord(aBuf[0])\r\n        if char >= 0xA0:\r\n            return 94 * (char - 0xA1) + wrap_ord(aBuf[1]) - 0xa1\r\n        else:\r\n            return -1\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/charsetgroupprober.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is Mozilla Communicator client code.\r\n# \r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 1998\r\n# the Initial Developer. All Rights Reserved.\r\n# \r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n# \r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n# \r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\nfrom . import constants\r\nimport sys\r\nfrom .charsetprober import CharSetProber\r\n\r\n\r\nclass CharSetGroupProber(CharSetProber):\r\n    def __init__(self):\r\n        CharSetProber.__init__(self)\r\n        self._mActiveNum = 0\r\n        self._mProbers = []\r\n        self._mBestGuessProber = None\r\n\r\n    def reset(self):\r\n        CharSetProber.reset(self)\r\n        self._mActiveNum = 0\r\n        for prober in self._mProbers:\r\n            if prober:\r\n                prober.reset()\r\n                prober.active = True\r\n                self._mActiveNum += 1\r\n        self._mBestGuessProber = None\r\n\r\n    def get_charset_name(self):\r\n        if not self._mBestGuessProber:\r\n            self.get_confidence()\r\n            if not self._mBestGuessProber:\r\n                return None\r\n#                self._mBestGuessProber = self._mProbers[0]\r\n        return self._mBestGuessProber.get_charset_name()\r\n\r\n    def feed(self, aBuf):\r\n        for prober in self._mProbers:\r\n            if not prober:\r\n                continue\r\n            if not prober.active:\r\n                continue\r\n            st = prober.feed(aBuf)\r\n            if not st:\r\n                continue\r\n            if st == constants.eFoundIt:\r\n                self._mBestGuessProber = prober\r\n                return self.get_state()\r\n            elif st == constants.eNotMe:\r\n                prober.active = False\r\n                self._mActiveNum -= 1\r\n                if self._mActiveNum <= 0:\r\n                    self._mState = constants.eNotMe\r\n                    return self.get_state()\r\n        return self.get_state()\r\n\r\n    def get_confidence(self):\r\n        st = self.get_state()\r\n        if st == constants.eFoundIt:\r\n            return 0.99\r\n        elif st == constants.eNotMe:\r\n            return 0.01\r\n        bestConf = 0.0\r\n        self._mBestGuessProber = None\r\n        for prober in self._mProbers:\r\n            if not prober:\r\n                continue\r\n            if not prober.active:\r\n                if constants._debug:\r\n                    sys.stderr.write(prober.get_charset_name()\r\n                                     + ' not active\\n')\r\n                continue\r\n            cf = prober.get_confidence()\r\n            if constants._debug:\r\n                sys.stderr.write('%s confidence = %s\\n' %\r\n                                 (prober.get_charset_name(), cf))\r\n            if bestConf < cf:\r\n                bestConf = cf\r\n                self._mBestGuessProber = prober\r\n        if not self._mBestGuessProber:\r\n            return 0.0\r\n        return bestConf\r\n#        else:\r\n#            self._mBestGuessProber = self._mProbers[0]\r\n#            return self._mBestGuessProber.get_confidence()\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/charsetprober.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\n# The Original Code is Mozilla Universal charset detector code.\n#\n# The Initial Developer of the Original Code is\n# Netscape Communications Corporation.\n# Portions created by the Initial Developer are Copyright (C) 2001\n# the Initial Developer. All Rights Reserved.\n#\n# Contributor(s):\n#   Mark Pilgrim - port to Python\n#   Shy Shalom - original C code\n#\n# This library is free software; you can redistribute it and/or\n# modify it under the terms of the GNU Lesser General Public\n# License as published by the Free Software Foundation; either\n# version 2.1 of the License, or (at your option) any later version.\n#\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# Lesser General Public License for more details.\n#\n# You should have received a copy of the GNU Lesser General Public\n# License along with this library; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n# 02110-1301  USA\n######################### END LICENSE BLOCK #########################\n\nfrom . import constants\nimport re\n\n\nclass CharSetProber:\n    def __init__(self):\n        pass\n\n    def reset(self):\n        self._mState = constants.eDetecting\n\n    def get_charset_name(self):\n        return None\n\n    def feed(self, aBuf):\n        pass\n\n    def get_state(self):\n        return self._mState\n\n    def get_confidence(self):\n        return 0.0\n\n    def filter_high_bit_only(self, aBuf):\n        aBuf = re.sub(b'([\\x00-\\x7F])+', b' ', aBuf)\n        return aBuf\n\n    def filter_without_english_letters(self, aBuf):\n        aBuf = re.sub(b'([A-Za-z])+', b' ', aBuf)\n        return aBuf\n\n    def filter_with_english_letters(self, aBuf):\n        # TODO\n        return aBuf\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/codingstatemachine.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is mozilla.org code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 1998\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n#\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\nfrom .constants import eStart\r\nfrom .compat import wrap_ord\r\n\r\n\r\nclass CodingStateMachine:\r\n    def __init__(self, sm):\r\n        self._mModel = sm\r\n        self._mCurrentBytePos = 0\r\n        self._mCurrentCharLen = 0\r\n        self.reset()\r\n\r\n    def reset(self):\r\n        self._mCurrentState = eStart\r\n\r\n    def next_state(self, c):\r\n        # for each byte we get its class\r\n        # if it is first byte, we also get byte length\r\n        # PY3K: aBuf is a byte stream, so c is an int, not a byte\r\n        byteCls = self._mModel['classTable'][wrap_ord(c)]\r\n        if self._mCurrentState == eStart:\r\n            self._mCurrentBytePos = 0\r\n            self._mCurrentCharLen = self._mModel['charLenTable'][byteCls]\r\n        # from byte's class and stateTable, we get its next state\r\n        curr_state = (self._mCurrentState * self._mModel['classFactor']\r\n                      + byteCls)\r\n        self._mCurrentState = self._mModel['stateTable'][curr_state]\r\n        self._mCurrentBytePos += 1\r\n        return self._mCurrentState\r\n\r\n    def get_current_charlen(self):\r\n        return self._mCurrentCharLen\r\n\r\n    def get_coding_state_machine(self):\r\n        return self._mModel['name']\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/compat.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\n# Contributor(s):\n#   Ian Cordasco - port to Python\n#\n# This library is free software; you can redistribute it and/or\n# modify it under the terms of the GNU Lesser General Public\n# License as published by the Free Software Foundation; either\n# version 2.1 of the License, or (at your option) any later version.\n#\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# Lesser General Public License for more details.\n#\n# You should have received a copy of the GNU Lesser General Public\n# License along with this library; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n# 02110-1301  USA\n######################### END LICENSE BLOCK #########################\n\nimport sys\n\n\nif sys.version_info < (3, 0):\n    base_str = (str, unicode)\nelse:\n    base_str = (bytes, str)\n\n\ndef wrap_ord(a):\n    if sys.version_info < (3, 0) and isinstance(a, base_str):\n        return ord(a)\n    else:\n        return a\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/constants.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is Mozilla Universal charset detector code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 2001\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#   Shy Shalom - original C code\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n# \r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n# \r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\n_debug = 0\r\n\r\neDetecting = 0\r\neFoundIt = 1\r\neNotMe = 2\r\n\r\neStart = 0\r\neError = 1\r\neItsMe = 2\r\n\r\nSHORTCUT_THRESHOLD = 0.95\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/cp949prober.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is mozilla.org code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 1998\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n#\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\nfrom .mbcharsetprober import MultiByteCharSetProber\r\nfrom .codingstatemachine import CodingStateMachine\r\nfrom .chardistribution import EUCKRDistributionAnalysis\r\nfrom .mbcssm import CP949SMModel\r\n\r\n\r\nclass CP949Prober(MultiByteCharSetProber):\r\n    def __init__(self):\r\n        MultiByteCharSetProber.__init__(self)\r\n        self._mCodingSM = CodingStateMachine(CP949SMModel)\r\n        # NOTE: CP949 is a superset of EUC-KR, so the distribution should be\r\n        #       not different.\r\n        self._mDistributionAnalyzer = EUCKRDistributionAnalysis()\r\n        self.reset()\r\n\r\n    def get_charset_name(self):\r\n        return \"CP949\"\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/escprober.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is mozilla.org code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 1998\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n#\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\nfrom . import constants\r\nfrom .escsm import (HZSMModel, ISO2022CNSMModel, ISO2022JPSMModel,\r\n                    ISO2022KRSMModel)\r\nfrom .charsetprober import CharSetProber\r\nfrom .codingstatemachine import CodingStateMachine\r\nfrom .compat import wrap_ord\r\n\r\n\r\nclass EscCharSetProber(CharSetProber):\r\n    def __init__(self):\r\n        CharSetProber.__init__(self)\r\n        self._mCodingSM = [\r\n            CodingStateMachine(HZSMModel),\r\n            CodingStateMachine(ISO2022CNSMModel),\r\n            CodingStateMachine(ISO2022JPSMModel),\r\n            CodingStateMachine(ISO2022KRSMModel)\r\n        ]\r\n        self.reset()\r\n\r\n    def reset(self):\r\n        CharSetProber.reset(self)\r\n        for codingSM in self._mCodingSM:\r\n            if not codingSM:\r\n                continue\r\n            codingSM.active = True\r\n            codingSM.reset()\r\n        self._mActiveSM = len(self._mCodingSM)\r\n        self._mDetectedCharset = None\r\n\r\n    def get_charset_name(self):\r\n        return self._mDetectedCharset\r\n\r\n    def get_confidence(self):\r\n        if self._mDetectedCharset:\r\n            return 0.99\r\n        else:\r\n            return 0.00\r\n\r\n    def feed(self, aBuf):\r\n        for c in aBuf:\r\n            # PY3K: aBuf is a byte array, so c is an int, not a byte\r\n            for codingSM in self._mCodingSM:\r\n                if not codingSM:\r\n                    continue\r\n                if not codingSM.active:\r\n                    continue\r\n                codingState = codingSM.next_state(wrap_ord(c))\r\n                if codingState == constants.eError:\r\n                    codingSM.active = False\r\n                    self._mActiveSM -= 1\r\n                    if self._mActiveSM <= 0:\r\n                        self._mState = constants.eNotMe\r\n                        return self.get_state()\r\n                elif codingState == constants.eItsMe:\r\n                    self._mState = constants.eFoundIt\r\n                    self._mDetectedCharset = codingSM.get_coding_state_machine()  # nopep8\r\n                    return self.get_state()\r\n\r\n        return self.get_state()\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/escsm.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is mozilla.org code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 1998\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n#\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\nfrom .constants import eStart, eError, eItsMe\r\n\r\nHZ_cls = (\r\n1,0,0,0,0,0,0,0,  # 00 - 07\r\n0,0,0,0,0,0,0,0,  # 08 - 0f\r\n0,0,0,0,0,0,0,0,  # 10 - 17\r\n0,0,0,1,0,0,0,0,  # 18 - 1f\r\n0,0,0,0,0,0,0,0,  # 20 - 27\r\n0,0,0,0,0,0,0,0,  # 28 - 2f\r\n0,0,0,0,0,0,0,0,  # 30 - 37\r\n0,0,0,0,0,0,0,0,  # 38 - 3f\r\n0,0,0,0,0,0,0,0,  # 40 - 47\r\n0,0,0,0,0,0,0,0,  # 48 - 4f\r\n0,0,0,0,0,0,0,0,  # 50 - 57\r\n0,0,0,0,0,0,0,0,  # 58 - 5f\r\n0,0,0,0,0,0,0,0,  # 60 - 67\r\n0,0,0,0,0,0,0,0,  # 68 - 6f\r\n0,0,0,0,0,0,0,0,  # 70 - 77\r\n0,0,0,4,0,5,2,0,  # 78 - 7f\r\n1,1,1,1,1,1,1,1,  # 80 - 87\r\n1,1,1,1,1,1,1,1,  # 88 - 8f\r\n1,1,1,1,1,1,1,1,  # 90 - 97\r\n1,1,1,1,1,1,1,1,  # 98 - 9f\r\n1,1,1,1,1,1,1,1,  # a0 - a7\r\n1,1,1,1,1,1,1,1,  # a8 - af\r\n1,1,1,1,1,1,1,1,  # b0 - b7\r\n1,1,1,1,1,1,1,1,  # b8 - bf\r\n1,1,1,1,1,1,1,1,  # c0 - c7\r\n1,1,1,1,1,1,1,1,  # c8 - cf\r\n1,1,1,1,1,1,1,1,  # d0 - d7\r\n1,1,1,1,1,1,1,1,  # d8 - df\r\n1,1,1,1,1,1,1,1,  # e0 - e7\r\n1,1,1,1,1,1,1,1,  # e8 - ef\r\n1,1,1,1,1,1,1,1,  # f0 - f7\r\n1,1,1,1,1,1,1,1,  # f8 - ff\r\n)\r\n\r\nHZ_st = (\r\neStart,eError,     3,eStart,eStart,eStart,eError,eError,# 00-07\r\neError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f\r\neItsMe,eItsMe,eError,eError,eStart,eStart,     4,eError,# 10-17\r\n     5,eError,     6,eError,     5,     5,     4,eError,# 18-1f\r\n     4,eError,     4,     4,     4,eError,     4,eError,# 20-27\r\n     4,eItsMe,eStart,eStart,eStart,eStart,eStart,eStart,# 28-2f\r\n)\r\n\r\nHZCharLenTable = (0, 0, 0, 0, 0, 0)\r\n\r\nHZSMModel = {'classTable': HZ_cls,\r\n             'classFactor': 6,\r\n             'stateTable': HZ_st,\r\n             'charLenTable': HZCharLenTable,\r\n             'name': \"HZ-GB-2312\"}\r\n\r\nISO2022CN_cls = (\r\n2,0,0,0,0,0,0,0,  # 00 - 07\r\n0,0,0,0,0,0,0,0,  # 08 - 0f\r\n0,0,0,0,0,0,0,0,  # 10 - 17\r\n0,0,0,1,0,0,0,0,  # 18 - 1f\r\n0,0,0,0,0,0,0,0,  # 20 - 27\r\n0,3,0,0,0,0,0,0,  # 28 - 2f\r\n0,0,0,0,0,0,0,0,  # 30 - 37\r\n0,0,0,0,0,0,0,0,  # 38 - 3f\r\n0,0,0,4,0,0,0,0,  # 40 - 47\r\n0,0,0,0,0,0,0,0,  # 48 - 4f\r\n0,0,0,0,0,0,0,0,  # 50 - 57\r\n0,0,0,0,0,0,0,0,  # 58 - 5f\r\n0,0,0,0,0,0,0,0,  # 60 - 67\r\n0,0,0,0,0,0,0,0,  # 68 - 6f\r\n0,0,0,0,0,0,0,0,  # 70 - 77\r\n0,0,0,0,0,0,0,0,  # 78 - 7f\r\n2,2,2,2,2,2,2,2,  # 80 - 87\r\n2,2,2,2,2,2,2,2,  # 88 - 8f\r\n2,2,2,2,2,2,2,2,  # 90 - 97\r\n2,2,2,2,2,2,2,2,  # 98 - 9f\r\n2,2,2,2,2,2,2,2,  # a0 - a7\r\n2,2,2,2,2,2,2,2,  # a8 - af\r\n2,2,2,2,2,2,2,2,  # b0 - b7\r\n2,2,2,2,2,2,2,2,  # b8 - bf\r\n2,2,2,2,2,2,2,2,  # c0 - c7\r\n2,2,2,2,2,2,2,2,  # c8 - cf\r\n2,2,2,2,2,2,2,2,  # d0 - d7\r\n2,2,2,2,2,2,2,2,  # d8 - df\r\n2,2,2,2,2,2,2,2,  # e0 - e7\r\n2,2,2,2,2,2,2,2,  # e8 - ef\r\n2,2,2,2,2,2,2,2,  # f0 - f7\r\n2,2,2,2,2,2,2,2,  # f8 - ff\r\n)\r\n\r\nISO2022CN_st = (\r\neStart,     3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07\r\neStart,eError,eError,eError,eError,eError,eError,eError,# 08-0f\r\neError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17\r\neItsMe,eItsMe,eItsMe,eError,eError,eError,     4,eError,# 18-1f\r\neError,eError,eError,eItsMe,eError,eError,eError,eError,# 20-27\r\n     5,     6,eError,eError,eError,eError,eError,eError,# 28-2f\r\neError,eError,eError,eItsMe,eError,eError,eError,eError,# 30-37\r\neError,eError,eError,eError,eError,eItsMe,eError,eStart,# 38-3f\r\n)\r\n\r\nISO2022CNCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0)\r\n\r\nISO2022CNSMModel = {'classTable': ISO2022CN_cls,\r\n                    'classFactor': 9,\r\n                    'stateTable': ISO2022CN_st,\r\n                    'charLenTable': ISO2022CNCharLenTable,\r\n                    'name': \"ISO-2022-CN\"}\r\n\r\nISO2022JP_cls = (\r\n2,0,0,0,0,0,0,0,  # 00 - 07\r\n0,0,0,0,0,0,2,2,  # 08 - 0f\r\n0,0,0,0,0,0,0,0,  # 10 - 17\r\n0,0,0,1,0,0,0,0,  # 18 - 1f\r\n0,0,0,0,7,0,0,0,  # 20 - 27\r\n3,0,0,0,0,0,0,0,  # 28 - 2f\r\n0,0,0,0,0,0,0,0,  # 30 - 37\r\n0,0,0,0,0,0,0,0,  # 38 - 3f\r\n6,0,4,0,8,0,0,0,  # 40 - 47\r\n0,9,5,0,0,0,0,0,  # 48 - 4f\r\n0,0,0,0,0,0,0,0,  # 50 - 57\r\n0,0,0,0,0,0,0,0,  # 58 - 5f\r\n0,0,0,0,0,0,0,0,  # 60 - 67\r\n0,0,0,0,0,0,0,0,  # 68 - 6f\r\n0,0,0,0,0,0,0,0,  # 70 - 77\r\n0,0,0,0,0,0,0,0,  # 78 - 7f\r\n2,2,2,2,2,2,2,2,  # 80 - 87\r\n2,2,2,2,2,2,2,2,  # 88 - 8f\r\n2,2,2,2,2,2,2,2,  # 90 - 97\r\n2,2,2,2,2,2,2,2,  # 98 - 9f\r\n2,2,2,2,2,2,2,2,  # a0 - a7\r\n2,2,2,2,2,2,2,2,  # a8 - af\r\n2,2,2,2,2,2,2,2,  # b0 - b7\r\n2,2,2,2,2,2,2,2,  # b8 - bf\r\n2,2,2,2,2,2,2,2,  # c0 - c7\r\n2,2,2,2,2,2,2,2,  # c8 - cf\r\n2,2,2,2,2,2,2,2,  # d0 - d7\r\n2,2,2,2,2,2,2,2,  # d8 - df\r\n2,2,2,2,2,2,2,2,  # e0 - e7\r\n2,2,2,2,2,2,2,2,  # e8 - ef\r\n2,2,2,2,2,2,2,2,  # f0 - f7\r\n2,2,2,2,2,2,2,2,  # f8 - ff\r\n)\r\n\r\nISO2022JP_st = (\r\neStart,     3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07\r\neStart,eStart,eError,eError,eError,eError,eError,eError,# 08-0f\r\neError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17\r\neItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,# 18-1f\r\neError,     5,eError,eError,eError,     4,eError,eError,# 20-27\r\neError,eError,eError,     6,eItsMe,eError,eItsMe,eError,# 28-2f\r\neError,eError,eError,eError,eError,eError,eItsMe,eItsMe,# 30-37\r\neError,eError,eError,eItsMe,eError,eError,eError,eError,# 38-3f\r\neError,eError,eError,eError,eItsMe,eError,eStart,eStart,# 40-47\r\n)\r\n\r\nISO2022JPCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\r\n\r\nISO2022JPSMModel = {'classTable': ISO2022JP_cls,\r\n                    'classFactor': 10,\r\n                    'stateTable': ISO2022JP_st,\r\n                    'charLenTable': ISO2022JPCharLenTable,\r\n                    'name': \"ISO-2022-JP\"}\r\n\r\nISO2022KR_cls = (\r\n2,0,0,0,0,0,0,0,  # 00 - 07\r\n0,0,0,0,0,0,0,0,  # 08 - 0f\r\n0,0,0,0,0,0,0,0,  # 10 - 17\r\n0,0,0,1,0,0,0,0,  # 18 - 1f\r\n0,0,0,0,3,0,0,0,  # 20 - 27\r\n0,4,0,0,0,0,0,0,  # 28 - 2f\r\n0,0,0,0,0,0,0,0,  # 30 - 37\r\n0,0,0,0,0,0,0,0,  # 38 - 3f\r\n0,0,0,5,0,0,0,0,  # 40 - 47\r\n0,0,0,0,0,0,0,0,  # 48 - 4f\r\n0,0,0,0,0,0,0,0,  # 50 - 57\r\n0,0,0,0,0,0,0,0,  # 58 - 5f\r\n0,0,0,0,0,0,0,0,  # 60 - 67\r\n0,0,0,0,0,0,0,0,  # 68 - 6f\r\n0,0,0,0,0,0,0,0,  # 70 - 77\r\n0,0,0,0,0,0,0,0,  # 78 - 7f\r\n2,2,2,2,2,2,2,2,  # 80 - 87\r\n2,2,2,2,2,2,2,2,  # 88 - 8f\r\n2,2,2,2,2,2,2,2,  # 90 - 97\r\n2,2,2,2,2,2,2,2,  # 98 - 9f\r\n2,2,2,2,2,2,2,2,  # a0 - a7\r\n2,2,2,2,2,2,2,2,  # a8 - af\r\n2,2,2,2,2,2,2,2,  # b0 - b7\r\n2,2,2,2,2,2,2,2,  # b8 - bf\r\n2,2,2,2,2,2,2,2,  # c0 - c7\r\n2,2,2,2,2,2,2,2,  # c8 - cf\r\n2,2,2,2,2,2,2,2,  # d0 - d7\r\n2,2,2,2,2,2,2,2,  # d8 - df\r\n2,2,2,2,2,2,2,2,  # e0 - e7\r\n2,2,2,2,2,2,2,2,  # e8 - ef\r\n2,2,2,2,2,2,2,2,  # f0 - f7\r\n2,2,2,2,2,2,2,2,  # f8 - ff\r\n)\r\n\r\nISO2022KR_st = (\r\neStart,     3,eError,eStart,eStart,eStart,eError,eError,# 00-07\r\neError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f\r\neItsMe,eItsMe,eError,eError,eError,     4,eError,eError,# 10-17\r\neError,eError,eError,eError,     5,eError,eError,eError,# 18-1f\r\neError,eError,eError,eItsMe,eStart,eStart,eStart,eStart,# 20-27\r\n)\r\n\r\nISO2022KRCharLenTable = (0, 0, 0, 0, 0, 0)\r\n\r\nISO2022KRSMModel = {'classTable': ISO2022KR_cls,\r\n                    'classFactor': 6,\r\n                    'stateTable': ISO2022KR_st,\r\n                    'charLenTable': ISO2022KRCharLenTable,\r\n                    'name': \"ISO-2022-KR\"}\r\n\r\n# flake8: noqa\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/eucjpprober.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is mozilla.org code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 1998\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n#\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\nimport sys\r\nfrom . import constants\r\nfrom .mbcharsetprober import MultiByteCharSetProber\r\nfrom .codingstatemachine import CodingStateMachine\r\nfrom .chardistribution import EUCJPDistributionAnalysis\r\nfrom .jpcntx import EUCJPContextAnalysis\r\nfrom .mbcssm import EUCJPSMModel\r\n\r\n\r\nclass EUCJPProber(MultiByteCharSetProber):\r\n    def __init__(self):\r\n        MultiByteCharSetProber.__init__(self)\r\n        self._mCodingSM = CodingStateMachine(EUCJPSMModel)\r\n        self._mDistributionAnalyzer = EUCJPDistributionAnalysis()\r\n        self._mContextAnalyzer = EUCJPContextAnalysis()\r\n        self.reset()\r\n\r\n    def reset(self):\r\n        MultiByteCharSetProber.reset(self)\r\n        self._mContextAnalyzer.reset()\r\n\r\n    def get_charset_name(self):\r\n        return \"EUC-JP\"\r\n\r\n    def feed(self, aBuf):\r\n        aLen = len(aBuf)\r\n        for i in range(0, aLen):\r\n            # PY3K: aBuf is a byte array, so aBuf[i] is an int, not a byte\r\n            codingState = self._mCodingSM.next_state(aBuf[i])\r\n            if codingState == constants.eError:\r\n                if constants._debug:\r\n                    sys.stderr.write(self.get_charset_name()\r\n                                     + ' prober hit error at byte ' + str(i)\r\n                                     + '\\n')\r\n                self._mState = constants.eNotMe\r\n                break\r\n            elif codingState == constants.eItsMe:\r\n                self._mState = constants.eFoundIt\r\n                break\r\n            elif codingState == constants.eStart:\r\n                charLen = self._mCodingSM.get_current_charlen()\r\n                if i == 0:\r\n                    self._mLastChar[1] = aBuf[0]\r\n                    self._mContextAnalyzer.feed(self._mLastChar, charLen)\r\n                    self._mDistributionAnalyzer.feed(self._mLastChar, charLen)\r\n                else:\r\n                    self._mContextAnalyzer.feed(aBuf[i - 1:i + 1], charLen)\r\n                    self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1],\r\n                                                     charLen)\r\n\r\n        self._mLastChar[0] = aBuf[aLen - 1]\r\n\r\n        if self.get_state() == constants.eDetecting:\r\n            if (self._mContextAnalyzer.got_enough_data() and\r\n               (self.get_confidence() > constants.SHORTCUT_THRESHOLD)):\r\n                self._mState = constants.eFoundIt\r\n\r\n        return self.get_state()\r\n\r\n    def get_confidence(self):\r\n        contxtCf = self._mContextAnalyzer.get_confidence()\r\n        distribCf = self._mDistributionAnalyzer.get_confidence()\r\n        return max(contxtCf, distribCf)\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/euckrfreq.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\n# The Original Code is Mozilla Communicator client code.\n#\n# The Initial Developer of the Original Code is\n# Netscape Communications Corporation.\n# Portions created by the Initial Developer are Copyright (C) 1998\n# the Initial Developer. All Rights Reserved.\n#\n# Contributor(s):\n#   Mark Pilgrim - port to Python\n#\n# This library is free software; you can redistribute it and/or\n# modify it under the terms of the GNU Lesser General Public\n# License as published by the Free Software Foundation; either\n# version 2.1 of the License, or (at your option) any later version.\n# \n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# Lesser General Public License for more details.\n# \n# You should have received a copy of the GNU Lesser General Public\n# License along with this library; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n# 02110-1301  USA\n######################### END LICENSE BLOCK #########################\n\n# Sampling from about 20M text materials include literature and computer technology\n\n# 128  --> 0.79\n# 256  --> 0.92\n# 512  --> 0.986\n# 1024 --> 0.99944\n# 2048 --> 0.99999\n#\n# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24\n# Random Distribution Ration = 512 / (2350-512) = 0.279.\n# \n# Typical Distribution Ratio  \n\nEUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0\n\nEUCKR_TABLE_SIZE = 2352\n\n# Char to FreqOrder table , \nEUCKRCharToFreqOrder = ( \\\n  13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722,  87,\n1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398,\n1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488,  20,1733,1269,1734,\n 945,1400,1735,  47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739,\n 116, 987, 813,1401, 683,  75,1204, 145,1740,1741,1742,1743,  16, 847, 667, 622,\n 708,1744,1745,1746, 966, 787, 304, 129,1747,  60, 820, 123, 676,1748,1749,1750,\n1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856,\n 344,1763,1764,1765,1766,  89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205,\n 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779,\n1780, 337, 751,1058,  28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782,  19,\n1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567,\n1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797,\n1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802,\n1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899,\n 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818,\n1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409,\n1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697,\n1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770,\n1412,1837,1838,  39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723,\n 544,1023,1081, 869,  91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416,\n1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300,\n 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083,\n 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857,\n1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871,\n 282,  96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420,\n1421, 268,1877,1422,1878,1879,1880, 308,1881,   2, 537,1882,1883,1215,1884,1885,\n 127, 791,1886,1273,1423,1887,  34, 336, 404, 643,1888, 571, 654, 894, 840,1889,\n   0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893,\n1894,1123,  48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317,\n1899, 694,1900, 909, 734,1424, 572, 866,1425, 691,  85, 524,1010, 543, 394, 841,\n1901,1902,1903,1026,1904,1905,1906,1907,1908,1909,  30, 451, 651, 988, 310,1910,\n1911,1426, 810,1216,  93,1912,1913,1277,1217,1914, 858, 759,  45,  58, 181, 610,\n 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375,\n1919, 359,1920, 687,1921, 822,1922, 293,1923,1924,  40, 662, 118, 692,  29, 939,\n 887, 640, 482, 174,1925,  69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870,\n 217, 854,1163, 823,1927,1928,1929,1930, 834,1931,  78,1932, 859,1933,1063,1934,\n1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888,\n1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950,\n1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065,\n1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002,\n1283,1222,1960,1961,1962,1963,  36, 383, 228, 753, 247, 454,1964, 876, 678,1965,\n1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467,\n  50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285,\n 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971,   7,\n 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979,\n1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985,\n 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994,\n1995, 560, 223,1287,  98,   8, 189, 650, 978,1288,1996,1437,1997,  17, 345, 250,\n 423, 277, 234, 512, 226,  97, 289,  42, 167,1998, 201,1999,2000, 843, 836, 824,\n 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003,\n2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008,  71,1440, 745,\n 619, 688,2009, 829,2010,2011, 147,2012,  33, 948,2013,2014,  74, 224,2015,  61,\n 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023,\n2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591,  52, 724, 246,2031,2032,\n2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912,\n2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224,\n 719,1170, 959, 440, 437, 534,  84, 388, 480,1131, 159, 220, 198, 679,2044,1012,\n 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050,\n2051,2052,2053,  59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681,\n 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414,\n1444,2064,2065,  41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068,\n2069,1292,2070,2071,1445,2072,1446,2073,2074,  55, 588,  66,1447, 271,1092,2075,\n1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850,\n2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606,\n2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449,\n1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452,\n 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112,\n2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121,\n2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130,\n  22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174,  73,1096, 231, 274,\n 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139,\n2141,2142,2143,2144,  11, 374, 844,2145, 154,1232,  46,1461,2146, 838, 830, 721,\n1233, 106,2147,  90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298,\n2150,1462, 761, 565,2151, 686,2152, 649,2153,  72, 173,2154, 460, 415,2155,1463,\n2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747,\n2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177,  23, 530, 285,\n2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187,\n2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193,  10,\n2194, 613, 424,2195, 979, 108, 449, 589,  27, 172,  81,1031,  80, 774, 281, 350,\n1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201,\n2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972,\n2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219,\n2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233,\n2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242,\n2243, 521, 486, 548,2244,2245,2246,1473,1300,  53, 549, 137, 875,  76, 158,2247,\n1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178,\n1475,2249,  82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255,\n2256,  18, 450, 206,2257, 290, 292,1142,2258, 511, 162,  99, 346, 164, 735,2259,\n1476,1477,   4, 554, 343, 798,1099,2260,1100,2261,  43, 171,1303, 139, 215,2262,\n2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702,\n1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272,  67,2273,\n 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541,\n2282,2283,2284,2285,2286,  70, 852,1071,2287,2288,2289,2290,  21,  56, 509, 117,\n 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187,\n2294,1046,1479,2295, 340,2296,  63,1047, 230,2297,2298,1305, 763,1306, 101, 800,\n 808, 494,2299,2300,2301, 903,2302,  37,1072,  14,   5,2303,  79, 675,2304, 312,\n2305,2306,2307,2308,2309,1480,   6,1307,2310,2311,2312,   1, 470,  35,  24, 229,\n2313, 695, 210,  86, 778,  15, 784, 592, 779,  32,  77, 855, 964,2314, 259,2315,\n 501, 380,2316,2317,  83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484,\n2320,2321,2322,2323,2324,2325,1485,2326,2327, 128,  57,  68, 261,1048, 211, 170,\n1240,  31,2328,  51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335,\n 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601,\n1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395,\n2351,1490,1491,  62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354,\n1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476,\n2361,2362, 332,  12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035,\n 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498,\n2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310,\n1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389,\n2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504,\n1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505,\n2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145,\n1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624,\n 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700,\n2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221,\n2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377,\n 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448,\n 915, 489,2449,1514,1184,2450,2451, 515,  64, 427, 495,2452, 583,2453, 483, 485,\n1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705,\n1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465,\n 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471,\n2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997,\n2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486,\n 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187,  65,2494,\n 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771,\n 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323,\n2499,2500,  49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491,\n  95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510,\n 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519,\n2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532,\n2533,  25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199,\n 704, 504, 468, 758, 657,1528, 196,  44, 839,1246, 272, 750,2543, 765, 862,2544,\n2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247,\n1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441,\n 249,1075,2556,2557,2558, 466, 743,2559,2560,2561,  92, 514, 426, 420, 526,2562,\n2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362,\n2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583,\n2584,1532,  54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465,\n   3, 458,   9,  38,2588, 107, 110, 890, 209,  26, 737, 498,2589,1534,2590, 431,\n 202,  88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151,\n 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596,\n2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601,  94, 175, 197, 406,\n2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611,\n2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619,\n1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628,\n2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042,\n 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642,  # 512, 256\n#Everything below is of no interest for detection purpose\n2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658,\n2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,\n2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,\n2691,2692,2693,2694,2695,2696,2697,2698,2699,1542, 880,2700,2701,2702,2703,2704,\n2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,\n2721,2722,2723,2724,2725,1543,2726,2727,2728,2729,2730,2731,2732,1544,2733,2734,\n2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,\n2751,2752,2753,2754,1545,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,\n2766,1546,2767,1547,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,\n2780,2781,2782,2783,2784,2785,2786,1548,2787,2788,2789,1109,2790,2791,2792,2793,\n2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,\n2810,2811,2812,1329,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,\n2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,\n2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,\n1549,2857,2858,2859,2860,1550,2861,2862,1551,2863,2864,2865,2866,2867,2868,2869,\n2870,2871,2872,2873,2874,1110,1330,2875,2876,2877,2878,2879,2880,2881,2882,2883,\n2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,\n2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,\n2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,1331,\n2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,1552,2944,2945,\n2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,\n2962,2963,2964,1252,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,\n2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,\n2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,\n3009,3010,3011,3012,1553,3013,3014,3015,3016,3017,1554,3018,1332,3019,3020,3021,\n3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,\n3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,1555,3051,3052,\n3053,1556,1557,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,\n3067,1558,3068,3069,3070,3071,3072,3073,3074,3075,3076,1559,3077,3078,3079,3080,\n3081,3082,3083,1253,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,\n3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,1152,3109,3110,\n3111,3112,3113,1560,3114,3115,3116,3117,1111,3118,3119,3120,3121,3122,3123,3124,\n3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,\n3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,\n3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,\n3173,3174,3175,3176,1333,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,\n3188,3189,1561,3190,3191,1334,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201,\n3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217,\n3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,\n3234,1562,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,\n3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264,\n3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,1563,3278,3279,\n3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295,\n3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,\n3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327,\n3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343,\n3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,\n3360,3361,3362,3363,3364,1335,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,\n3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,1336,3388,3389,\n3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405,\n3406,3407,3408,3409,3410,3411,3412,3413,3414,1337,3415,3416,3417,3418,3419,1338,\n3420,3421,3422,1564,1565,3423,3424,3425,3426,3427,3428,3429,3430,3431,1254,3432,\n3433,3434,1339,3435,3436,3437,3438,3439,1566,3440,3441,3442,3443,3444,3445,3446,\n3447,3448,3449,3450,3451,3452,3453,3454,1255,3455,3456,3457,3458,3459,1567,1191,\n3460,1568,1569,3461,3462,3463,1570,3464,3465,3466,3467,3468,1571,3469,3470,3471,\n3472,3473,1572,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,\n1340,3487,3488,3489,3490,3491,3492,1021,3493,3494,3495,3496,3497,3498,1573,3499,\n1341,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,1342,3512,3513,\n3514,3515,3516,1574,1343,3517,3518,3519,1575,3520,1576,3521,3522,3523,3524,3525,\n3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541,\n3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557,\n3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573,\n3574,3575,3576,3577,3578,3579,3580,1577,3581,3582,1578,3583,3584,3585,3586,3587,\n3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,\n3604,1579,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,\n3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,1580,3630,3631,1581,3632,\n3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648,\n3649,3650,3651,3652,3653,3654,3655,3656,1582,3657,3658,3659,3660,3661,3662,3663,\n3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,\n3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695,\n3696,3697,3698,3699,3700,1192,3701,3702,3703,3704,1256,3705,3706,3707,3708,1583,\n1257,3709,3710,3711,3712,3713,3714,3715,3716,1584,3717,3718,3719,3720,3721,3722,\n3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738,\n3739,3740,3741,3742,3743,3744,3745,1344,3746,3747,3748,3749,3750,3751,3752,3753,\n3754,3755,3756,1585,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,1586,3767,\n3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,1345,3779,3780,3781,3782,\n3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,1346,1587,3796,\n3797,1588,3798,3799,3800,3801,3802,3803,3804,3805,3806,1347,3807,3808,3809,3810,\n3811,1589,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,1590,3822,3823,1591,\n1348,3824,3825,3826,3827,3828,3829,3830,1592,3831,3832,1593,3833,3834,3835,3836,\n3837,3838,3839,3840,3841,3842,3843,3844,1349,3845,3846,3847,3848,3849,3850,3851,\n3852,3853,3854,3855,3856,3857,3858,1594,3859,3860,3861,3862,3863,3864,3865,3866,\n3867,3868,3869,1595,3870,3871,3872,3873,1596,3874,3875,3876,3877,3878,3879,3880,\n3881,3882,3883,3884,3885,3886,1597,3887,3888,3889,3890,3891,3892,3893,3894,3895,\n1598,3896,3897,3898,1599,1600,3899,1350,3900,1351,3901,3902,1352,3903,3904,3905,\n3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921,\n3922,3923,3924,1258,3925,3926,3927,3928,3929,3930,3931,1193,3932,1601,3933,3934,\n3935,3936,3937,3938,3939,3940,3941,3942,3943,1602,3944,3945,3946,3947,3948,1603,\n3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,\n3965,1604,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,1353,3978,\n3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,1354,3992,3993,\n3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,\n4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,1355,4024,\n4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040,\n1605,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055,\n4056,4057,4058,4059,4060,1606,4061,4062,4063,4064,1607,4065,4066,4067,4068,4069,\n4070,4071,4072,4073,4074,4075,4076,1194,4077,4078,1608,4079,4080,4081,4082,4083,\n4084,4085,4086,4087,1609,4088,4089,4090,4091,4092,4093,4094,4095,4096,4097,4098,\n4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,1259,4109,4110,4111,4112,4113,\n4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,1195,4125,4126,4127,1610,\n4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,1356,4138,4139,4140,4141,4142,\n4143,4144,1611,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157,\n4158,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4170,4171,4172,4173,\n4174,4175,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188,4189,\n4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205,\n4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,1612,4220,\n4221,4222,4223,4224,4225,4226,4227,1357,4228,1613,4229,4230,4231,4232,4233,4234,\n4235,4236,4237,4238,4239,4240,4241,4242,4243,1614,4244,4245,4246,4247,4248,4249,\n4250,4251,4252,4253,4254,4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,\n4266,4267,4268,4269,4270,1196,1358,4271,4272,4273,4274,4275,4276,4277,4278,4279,\n4280,4281,4282,4283,4284,4285,4286,4287,1615,4288,4289,4290,4291,4292,4293,4294,\n4295,4296,4297,4298,4299,4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310,\n4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,\n4327,4328,4329,4330,4331,4332,4333,4334,1616,4335,4336,4337,4338,4339,4340,4341,\n4342,4343,4344,4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357,\n4358,4359,4360,1617,4361,4362,4363,4364,4365,1618,4366,4367,4368,4369,4370,4371,\n4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387,\n4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,\n4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,1619,4417,4418,\n4419,4420,4421,4422,4423,4424,4425,1112,4426,4427,4428,4429,4430,1620,4431,4432,\n4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,1260,1261,4443,4444,4445,4446,\n4447,4448,4449,4450,4451,4452,4453,4454,4455,1359,4456,4457,4458,4459,4460,4461,\n4462,4463,4464,4465,1621,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476,\n4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,1055,4490,4491,\n4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507,\n4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,1622,4519,4520,4521,1623,\n4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,1360,4536,\n4537,4538,4539,4540,4541,4542,4543, 975,4544,4545,4546,4547,4548,4549,4550,4551,\n4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567,\n4568,4569,4570,4571,1624,4572,4573,4574,4575,4576,1625,4577,4578,4579,4580,4581,\n4582,4583,4584,1626,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,1627,\n4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611,\n4612,4613,4614,4615,1628,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626,\n4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642,\n4643,4644,4645,4646,4647,4648,4649,1361,4650,4651,4652,4653,4654,4655,4656,4657,\n4658,4659,4660,4661,1362,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672,\n4673,4674,4675,4676,4677,4678,4679,4680,4681,4682,1629,4683,4684,4685,4686,4687,\n1630,4688,4689,4690,4691,1153,4692,4693,4694,1113,4695,4696,4697,4698,4699,4700,\n4701,4702,4703,4704,4705,4706,4707,4708,4709,4710,4711,1197,4712,4713,4714,4715,\n4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,\n4732,4733,4734,4735,1631,4736,1632,4737,4738,4739,4740,4741,4742,4743,4744,1633,\n4745,4746,4747,4748,4749,1262,4750,4751,4752,4753,4754,1363,4755,4756,4757,4758,\n4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,1634,4769,4770,4771,4772,4773,\n4774,4775,4776,4777,4778,1635,4779,4780,4781,4782,4783,4784,4785,4786,4787,4788,\n4789,1636,4790,4791,4792,4793,4794,4795,4796,4797,4798,4799,4800,4801,4802,4803,\n4804,4805,4806,1637,4807,4808,4809,1638,4810,4811,4812,4813,4814,4815,4816,4817,\n4818,1639,4819,4820,4821,4822,4823,4824,4825,4826,4827,4828,4829,4830,4831,4832,\n4833,1077,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847,\n4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863,\n4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879,\n4880,4881,4882,4883,1640,4884,4885,1641,4886,4887,4888,4889,4890,4891,4892,4893,\n4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909,\n4910,4911,1642,4912,4913,4914,1364,4915,4916,4917,4918,4919,4920,4921,4922,4923,\n4924,4925,4926,4927,4928,4929,4930,4931,1643,4932,4933,4934,4935,4936,4937,4938,\n4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954,\n4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970,\n4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,1644,4981,4982,4983,4984,1645,\n4985,4986,1646,4987,4988,4989,4990,4991,4992,4993,4994,4995,4996,4997,4998,4999,\n5000,5001,5002,5003,5004,5005,1647,5006,1648,5007,5008,5009,5010,5011,5012,1078,\n5013,5014,5015,5016,5017,5018,5019,5020,5021,5022,5023,5024,5025,5026,5027,5028,\n1365,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,1649,5040,5041,5042,\n5043,5044,5045,1366,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,1650,5056,\n5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,\n5073,5074,5075,5076,5077,1651,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,\n5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103,\n5104,5105,5106,5107,5108,5109,5110,1652,5111,5112,5113,5114,5115,5116,5117,5118,\n1367,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,1653,5130,5131,5132,\n5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,\n5149,1368,5150,1654,5151,1369,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161,\n5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177,\n5178,1370,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192,\n5193,5194,5195,5196,5197,5198,1655,5199,5200,5201,5202,1656,5203,5204,5205,5206,\n1371,5207,1372,5208,5209,5210,5211,1373,5212,5213,1374,5214,5215,5216,5217,5218,\n5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,\n5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,1657,5248,5249,\n5250,5251,1658,1263,5252,5253,5254,5255,5256,1375,5257,5258,5259,5260,5261,5262,\n5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,\n5279,5280,5281,5282,5283,1659,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,\n5294,5295,5296,5297,5298,5299,5300,1660,5301,5302,5303,5304,5305,5306,5307,5308,\n5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,1376,5322,5323,\n5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,1198,5334,5335,5336,5337,5338,\n5339,5340,5341,5342,5343,1661,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353,\n5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369,\n5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385,\n5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,1264,5399,5400,\n5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,1662,5413,5414,5415,\n5416,1663,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430,\n5431,5432,5433,5434,5435,5436,5437,5438,1664,5439,5440,5441,5442,5443,5444,5445,\n5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461,\n5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477,\n5478,1154,5479,5480,5481,5482,5483,5484,5485,1665,5486,5487,5488,5489,5490,5491,\n5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507,\n5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523,\n5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539,\n5540,5541,5542,5543,5544,5545,5546,5547,5548,1377,5549,5550,5551,5552,5553,5554,\n5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570,\n1114,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585,\n5586,5587,5588,5589,5590,5591,5592,1378,5593,5594,5595,5596,5597,5598,5599,5600,\n5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,1379,5615,\n5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,\n5632,5633,5634,1380,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,\n5647,5648,5649,1381,1056,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,\n1666,5661,5662,5663,5664,5665,5666,5667,5668,1667,5669,1668,5670,5671,5672,5673,\n5674,5675,5676,5677,5678,1155,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688,\n5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,1669,5699,5700,5701,5702,5703,\n5704,5705,1670,5706,5707,5708,5709,5710,1671,5711,5712,5713,5714,1382,5715,5716,\n5717,5718,5719,5720,5721,5722,5723,5724,5725,1672,5726,5727,1673,1674,5728,5729,\n5730,5731,5732,5733,5734,5735,5736,1675,5737,5738,5739,5740,5741,5742,5743,5744,\n1676,5745,5746,5747,5748,5749,5750,5751,1383,5752,5753,5754,5755,5756,5757,5758,\n5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,1677,5769,5770,5771,5772,5773,\n1678,5774,5775,5776, 998,5777,5778,5779,5780,5781,5782,5783,5784,5785,1384,5786,\n5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799,5800,1679,5801,\n5802,5803,1115,1116,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815,\n5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831,\n5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847,\n5848,5849,5850,5851,5852,5853,5854,5855,1680,5856,5857,5858,5859,5860,5861,5862,\n5863,5864,1681,5865,5866,5867,1682,5868,5869,5870,5871,5872,5873,5874,5875,5876,\n5877,5878,5879,1683,5880,1684,5881,5882,5883,5884,1685,5885,5886,5887,5888,5889,\n5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,\n5906,5907,1686,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,\n5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,1687,\n5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,\n5952,1688,1689,5953,1199,5954,5955,5956,5957,5958,5959,5960,5961,1690,5962,5963,\n5964,5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,\n5980,5981,1385,5982,1386,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993,\n5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009,\n6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025,\n6026,6027,1265,6028,6029,1691,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039,\n6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055,\n6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071,\n6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,1692,6085,6086,\n6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100,6101,6102,\n6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116,6117,6118,\n6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,1693,6132,6133,\n6134,6135,6136,1694,6137,6138,6139,6140,6141,1695,6142,6143,6144,6145,6146,6147,\n6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,\n6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,\n6180,6181,6182,6183,6184,6185,1696,6186,6187,6188,6189,6190,6191,6192,6193,6194,\n6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,\n6211,6212,6213,6214,6215,6216,6217,6218,6219,1697,6220,6221,6222,6223,6224,6225,\n6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,\n6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,1698,6254,6255,6256,\n6257,6258,6259,6260,6261,6262,6263,1200,6264,6265,6266,6267,6268,6269,6270,6271,  #1024\n6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287,\n6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,1699,\n6303,6304,1700,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6315,6316,6317,\n6318,6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,\n6334,6335,6336,6337,6338,6339,1701,6340,6341,6342,6343,6344,1387,6345,6346,6347,\n6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,\n6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,\n6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,\n6396,6397,6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411,\n6412,6413,1702,6414,6415,6416,6417,6418,6419,6420,6421,6422,1703,6423,6424,6425,\n6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,1704,6439,6440,\n6441,6442,6443,6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456,\n6457,6458,6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,\n6473,6474,6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488,\n6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,1266,\n6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,\n6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534,6535,\n6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551,\n1705,1706,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565,\n6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579,6580,6581,\n6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597,\n6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609,6610,6611,6612,6613,\n6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624,6625,6626,6627,6628,6629,\n6630,6631,6632,6633,6634,6635,6636,6637,1388,6638,6639,6640,6641,6642,6643,6644,\n1707,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,6655,6656,6657,6658,6659,\n6660,6661,6662,6663,1708,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674,\n1201,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684,6685,6686,6687,6688,6689,\n6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705,\n6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721,\n6722,6723,6724,6725,1389,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736,\n1390,1709,6737,6738,6739,6740,6741,6742,1710,6743,6744,6745,6746,1391,6747,6748,\n6749,6750,6751,6752,6753,6754,6755,6756,6757,1392,6758,6759,6760,6761,6762,6763,\n6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779,\n6780,1202,6781,6782,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6794,\n6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,1711,\n6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820,6821,6822,6823,6824,6825,\n6826,6827,6828,6829,6830,6831,6832,6833,6834,6835,6836,1393,6837,6838,6839,6840,\n6841,6842,6843,6844,6845,6846,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856,\n6857,6858,6859,6860,6861,6862,6863,6864,6865,6866,6867,6868,6869,6870,6871,6872,\n6873,6874,6875,6876,6877,6878,6879,6880,6881,6882,6883,6884,6885,6886,6887,6888,\n6889,6890,6891,6892,6893,6894,6895,6896,6897,6898,6899,6900,6901,6902,1712,6903,\n6904,6905,6906,6907,6908,6909,6910,1713,6911,6912,6913,6914,6915,6916,6917,6918,\n6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,\n6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950,\n6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,\n6967,6968,6969,6970,6971,6972,6973,6974,1714,6975,6976,6977,6978,6979,6980,6981,\n6982,6983,6984,6985,6986,6987,6988,1394,6989,6990,6991,6992,6993,6994,6995,6996,\n6997,6998,6999,7000,1715,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011,\n7012,7013,7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,\n7028,1716,7029,7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042,\n7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,\n7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074,\n7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,7090,\n7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106,\n7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122,\n7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138,\n7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154,\n7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167,7168,7169,7170,\n7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186,\n7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202,\n7203,7204,7205,7206,7207,1395,7208,7209,7210,7211,7212,7213,1717,7214,7215,7216,\n7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229,7230,7231,7232,\n7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245,7246,7247,7248,\n7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261,7262,7263,7264,\n7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280,\n7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,7296,\n7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308,7309,7310,7311,7312,\n7313,1718,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327,\n7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343,\n7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358,7359,\n7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373,7374,7375,\n7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391,\n7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407,\n7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,7419,7420,7421,7422,7423,\n7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439,\n7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455,\n7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,\n7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,\n7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,\n7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,\n7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,\n7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551,\n7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567,\n7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583,\n7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599,\n7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615,\n7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631,\n7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647,\n7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663,\n7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679,\n7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695,\n7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711,\n7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727,\n7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743,\n7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759,\n7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,\n7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,\n7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807,\n7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,\n7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,\n7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,\n7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,\n7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,\n7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,\n7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,\n7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935,\n7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951,\n7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967,\n7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983,\n7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999,\n8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,\n8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031,\n8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047,\n8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,\n8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,\n8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,\n8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111,\n8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127,\n8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,\n8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,\n8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,\n8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,\n8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,\n8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,\n8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,\n8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,\n8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,\n8272,8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,\n8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,\n8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,\n8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,\n8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,\n8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,\n8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,\n8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,\n8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,\n8416,8417,8418,8419,8420,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,\n8432,8433,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,\n8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,\n8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,\n8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,\n8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,\n8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,\n8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,\n8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,\n8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,\n8576,8577,8578,8579,8580,8581,8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,\n8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,\n8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,\n8624,8625,8626,8627,8628,8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,\n8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,\n8656,8657,8658,8659,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,\n8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,\n8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,\n8704,8705,8706,8707,8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,\n8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,\n8736,8737,8738,8739,8740,8741)\n\n# flake8: noqa\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/euckrprober.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is mozilla.org code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 1998\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n#\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\nfrom .mbcharsetprober import MultiByteCharSetProber\r\nfrom .codingstatemachine import CodingStateMachine\r\nfrom .chardistribution import EUCKRDistributionAnalysis\r\nfrom .mbcssm import EUCKRSMModel\r\n\r\n\r\nclass EUCKRProber(MultiByteCharSetProber):\r\n    def __init__(self):\r\n        MultiByteCharSetProber.__init__(self)\r\n        self._mCodingSM = CodingStateMachine(EUCKRSMModel)\r\n        self._mDistributionAnalyzer = EUCKRDistributionAnalysis()\r\n        self.reset()\r\n\r\n    def get_charset_name(self):\r\n        return \"EUC-KR\"\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/euctwfreq.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\n# The Original Code is Mozilla Communicator client code.\n#\n# The Initial Developer of the Original Code is\n# Netscape Communications Corporation.\n# Portions created by the Initial Developer are Copyright (C) 1998\n# the Initial Developer. All Rights Reserved.\n#\n# Contributor(s):\n#   Mark Pilgrim - port to Python\n#\n# This library is free software; you can redistribute it and/or\n# modify it under the terms of the GNU Lesser General Public\n# License as published by the Free Software Foundation; either\n# version 2.1 of the License, or (at your option) any later version.\n#\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# Lesser General Public License for more details.\n#\n# You should have received a copy of the GNU Lesser General Public\n# License along with this library; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n# 02110-1301  USA\n######################### END LICENSE BLOCK #########################\n\n# EUCTW frequency table\n# Converted from big5 work\n# by Taiwan's Mandarin Promotion Council\n# <http:#www.edu.tw:81/mandr/>\n\n# 128  --> 0.42261\n# 256  --> 0.57851\n# 512  --> 0.74851\n# 1024 --> 0.89384\n# 2048 --> 0.97583\n#\n# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98\n# Random Distribution Ration = 512/(5401-512)=0.105\n#\n# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR\n\nEUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75\n\n# Char to FreqOrder table ,\nEUCTW_TABLE_SIZE = 8102\n\nEUCTWCharToFreqOrder = (\n   1,1800,1506, 255,1431, 198,   9,  82,   6,7310, 177, 202,3615,1256,2808, 110, # 2742\n3735,  33,3241, 261,  76,  44,2113,  16,2931,2184,1176, 659,3868,  26,3404,2643, # 2758\n1198,3869,3313,4060, 410,2211, 302, 590, 361,1963,   8, 204,  58,4296,7311,1931, # 2774\n  63,7312,7313, 317,1614,  75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790\n3616,   3,  10,3870,1471,  29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806\n4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932,  34,3501,3173,  64, 604, # 2822\n7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337,  72, 406,7319,  80, # 2838\n 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449,  69,2969, 591, # 2854\n 179,2095, 471, 115,2034,1843,  60,  50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870\n 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886\n2495,  90,2707,1338, 663,  11, 906,1099,2545,  20,2436, 182, 532,1716,7321, 732, # 2902\n1376,4062,1311,1420,3175,  25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918\n3243, 475,1447,3617,7322, 117,  21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934\n 706, 456, 150, 613,4299,  71,1118,2036,4064, 145,3069,  85, 835, 486,2114,1246, # 2950\n1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966\n3503,3110,7325,1955,1153,4065,  83, 296,1199,3070, 192, 624,  93,7326, 822,1897, # 2982\n2810,3111, 795,2064, 991,1554,1542,1592,  27,  43,2853, 859, 139,1456, 860,4300, # 2998\n 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014\n3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030\n1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046\n7328,7329,2173,3176,3619,2673, 593, 845,1062,3244,  88,1723,2037,3875,1950, 212, # 3062\n 266, 152, 149, 468,1898,4066,4302,  77, 187,7330,3018,  37,   5,2972,7331,3876, # 3078\n7332,7333,  39,2517,4303,2894,3177,2078,  55, 148,  74,4304, 545, 483,1474,1029, # 3094\n1665, 217,1869,1531,3113,1104,2645,4067,  24, 172,3507, 900,3877,3508,3509,4305, # 3110\n  32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674,   4,3019,3314,1427,1788, # 3126\n 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142\n3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439,  38,7339,1063,7340, 794, # 3158\n3879,1435,2296,  46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804,  35, 707, # 3174\n 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190\n2128,1363,3623,1423, 697, 100,3071,  48,  70,1231, 495,3114,2193,7345,1294,7346, # 3206\n2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222\n 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238\n 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254\n3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270\n1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286\n1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302\n1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381,   7, # 3318\n2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334\n 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350\n4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366\n1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382\n7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398\n2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414\n 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430\n  98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446\n 523,2776,2777,2648,7364, 141,2231,1333,  68, 176, 441, 876, 907,4077, 603,2592, # 3462\n 710, 171,3417, 404, 549,  18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478\n7366,2973, 368,7367, 146, 366,  99, 871,3627,1543, 748, 807,1586,1185,  22,2258, # 3494\n 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510\n1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371,  59,7372, # 3526\n 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542\n 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558\n7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574\n1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590\n 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606\n3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622\n4081,  57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638\n3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654\n 279,3120,  51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670\n 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686\n1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702\n4084,2468,1436, 953,4085,2054,4331, 671,2395,  79,4086,2441,3252, 608, 567,2680, # 3718\n3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734\n3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750\n2397,7400,7401,7402,4089,3025,   0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766\n7404, 233,4090,3631,1818,4336,4337,7405,  96,1776,1315,2082,7406, 257,7407,1809, # 3782\n3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798\n7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814\n1484,7413,1712, 127,  67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830\n2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846\n1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862\n  78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878\n1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894\n4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910\n3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926\n 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942\n 165, 243,4345,3637,2521, 123, 683,4096, 764,4346,  36,3895,1792, 589,2902, 816, # 3958\n 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974\n2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990\n7425, 611,1156, 854,2381,1316,2861,   2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006\n1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022\n2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038\n1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054\n1993,7438,4350,7439,7440,2195,  13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070\n7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086\n7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102\n7452, 128,2132,  92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118\n3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134\n4353,2248,  94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150\n1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166\n7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182\n2332,2067,  23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198\n7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214\n3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230\n3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863,  41,7473, # 4246\n7474,4361,7475,1657,2333,  19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262\n2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278\n7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294\n 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310\n4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326\n2683, 733,  40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342\n7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358\n3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374\n2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390\n2752,2986,7490, 435,7491, 343,1108, 596,  17,1751,4365,2235,3430,3643,7492,4366, # 4406\n 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422\n2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438\n1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454\n1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470\n2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486\n1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502\n7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518\n7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534\n2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550\n4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566\n1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551,  30,2263,4122, # 4582\n7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598\n 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614\n4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630\n 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646\n2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662\n 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678\n1041,2987, 293,1168,  87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694\n1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710\n 730,1515, 184,2827,  66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726\n3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742\n3918,7535,7536,1186,  15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758\n1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774\n3541,1342,1681,1718, 766,3264, 286,  89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790\n7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806\n7544,3265, 310, 313,3435,2299, 770,4134,  54,3034, 189,4397,3082,3769,3922,7545, # 4822\n1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838\n2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854\n1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870\n3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886\n2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902\n3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918\n2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934\n4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950\n4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966\n3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982\n  97,  81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998\n3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014\n 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030\n3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046\n3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062\n3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078\n1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094\n7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110\n 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126\n7590, 587,  14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142\n1702,1226, 102,1547,  62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158\n 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174\n4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598,  86,1494,1730, # 5190\n3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206\n 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222\n2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238\n2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885,  28,2686, # 5254\n3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270\n1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286\n4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302\n2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318\n1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334\n1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350\n2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366\n3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382\n1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398\n7617,3446,7618,7619,7620,3277,2689,1433,3278, 131,  95,1504,3946, 723,4159,3141, # 5414\n1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430\n4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654,  53,7624,2996,7625, # 5446\n1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462\n 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478\n1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494\n3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510\n3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526\n2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542\n1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558\n4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574\n 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590\n7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606\n2317,3283,7650,7651,4164,7652,4165,  84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622\n3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638\n4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654\n 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670\n7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686\n7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702\n1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718\n4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734\n3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750\n2690,1516,3559,1121,1082,1329,3284,3970,1449,3794,  65,1128,2835,2913,2759,1590, # 5766\n3795,7674,7675,  12,2658,  45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782\n3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798\n2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814\n1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830\n4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846\n3670,1858,  91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862\n3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878\n2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894\n4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761,  61,3976,3672,1822,3977, # 5910\n7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926\n3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942\n2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958\n3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974\n1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990\n2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006\n3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022\n4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043,  56,1396,3090, # 6038\n2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054\n2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070\n7722,1076,  49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086\n1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102\n2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118\n1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134\n3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150\n4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629,  31,2838, # 6166\n2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182\n3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198\n3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214\n2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230\n4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246\n2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262\n3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278\n4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294\n7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310\n3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326\n 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342\n1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412,  42,3096, 464,7759,2632, # 6358\n4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374\n1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390\n4487,7766,3002, 962, 588,3574, 289,3219,2634,1116,  52,7767,3047,1796,7768,7769, # 6406\n7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422\n 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438\n7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454\n2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470\n1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486\n1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502\n3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518\n 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534\n 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550\n 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566\n3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582\n2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598\n 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614\n7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630\n1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646\n3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662\n7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678\n1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694\n7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710\n4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726\n1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742\n2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758\n2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774\n4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790\n 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806\n 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822\n3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838\n3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854\n1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870\n2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886\n7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902\n1561,2664,1452,4010,1375,7855,7856,  47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918\n1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934\n3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950\n 919,2347,2960,2348,1270,4511,4012,  73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966\n1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982\n4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998\n7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014\n2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030\n3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046\n 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062\n1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078\n2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094\n2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110\n7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126\n7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142\n7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158\n2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174\n2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190\n1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206\n4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222\n3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238\n3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254\n4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270\n4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286\n2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302\n2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318\n7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334\n4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350\n7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366\n2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382\n1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398\n3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414\n4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430\n2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446\n 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462\n2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478\n1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494\n2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510\n2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526\n4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542\n7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558\n1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574\n3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590\n7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606\n1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622\n8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638\n2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654\n8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670\n2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686\n2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702\n8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718\n8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734\n8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750\n 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766\n8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782\n4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798\n3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814\n8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830\n1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846\n8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862\n 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878\n1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894\n 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910\n4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926\n1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942\n4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958\n1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974\n 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990\n3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006\n4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022\n8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038\n 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054\n3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070\n 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086\n2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102\n#Everything below is of no interest for detection purpose\n2515,1613,4582,8119,3312,3866,2516,8120,4058,8121,1637,4059,2466,4583,3867,8122, # 8118\n2493,3016,3734,8123,8124,2192,8125,8126,2162,8127,8128,8129,8130,8131,8132,8133, # 8134\n8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,8144,8145,8146,8147,8148,8149, # 8150\n8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,8160,8161,8162,8163,8164,8165, # 8166\n8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181, # 8182\n8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197, # 8198\n8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213, # 8214\n8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229, # 8230\n8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245, # 8246\n8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257,8258,8259,8260,8261, # 8262\n8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,8273,8274,8275,8276,8277, # 8278\n8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,8290,8291,8292,8293, # 8294\n8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,8308,8309, # 8310\n8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322,8323,8324,8325, # 8326\n8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337,8338,8339,8340,8341, # 8342\n8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353,8354,8355,8356,8357, # 8358\n8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373, # 8374\n8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389, # 8390\n8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405, # 8406\n8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421, # 8422\n8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437, # 8438\n8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452,8453, # 8454\n8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8468,8469, # 8470\n8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482,8483,8484,8485, # 8486\n8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501, # 8502\n8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517, # 8518\n8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533, # 8534\n8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549, # 8550\n8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565, # 8566\n8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581, # 8582\n8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597, # 8598\n8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613, # 8614\n8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629, # 8630\n8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645, # 8646\n8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661, # 8662\n8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677, # 8678\n8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,8693, # 8694\n8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709, # 8710\n8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725, # 8726\n8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741) # 8742\n\n# flake8: noqa\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/euctwprober.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is mozilla.org code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 1998\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n# \r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n# \r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\nfrom .mbcharsetprober import MultiByteCharSetProber\r\nfrom .codingstatemachine import CodingStateMachine\r\nfrom .chardistribution import EUCTWDistributionAnalysis\r\nfrom .mbcssm import EUCTWSMModel\r\n\r\nclass EUCTWProber(MultiByteCharSetProber):\r\n    def __init__(self):\r\n        MultiByteCharSetProber.__init__(self)\r\n        self._mCodingSM = CodingStateMachine(EUCTWSMModel)\r\n        self._mDistributionAnalyzer = EUCTWDistributionAnalysis()\r\n        self.reset()\r\n\r\n    def get_charset_name(self):\r\n        return \"EUC-TW\"\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/gb2312freq.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\n# The Original Code is Mozilla Communicator client code.\n#\n# The Initial Developer of the Original Code is\n# Netscape Communications Corporation.\n# Portions created by the Initial Developer are Copyright (C) 1998\n# the Initial Developer. All Rights Reserved.\n#\n# Contributor(s):\n#   Mark Pilgrim - port to Python\n#\n# This library is free software; you can redistribute it and/or\n# modify it under the terms of the GNU Lesser General Public\n# License as published by the Free Software Foundation; either\n# version 2.1 of the License, or (at your option) any later version.\n#\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# Lesser General Public License for more details.\n#\n# You should have received a copy of the GNU Lesser General Public\n# License along with this library; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n# 02110-1301  USA\n######################### END LICENSE BLOCK #########################\n\n# GB2312 most frequently used character table\n#\n# Char to FreqOrder table , from hz6763\n\n# 512  --> 0.79  -- 0.79\n# 1024 --> 0.92  -- 0.13\n# 2048 --> 0.98  -- 0.06\n# 6768 --> 1.00  -- 0.02\n#\n# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79\n# Random Distribution Ration = 512 / (3755 - 512) = 0.157\n#\n# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR\n\nGB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9\n\nGB2312_TABLE_SIZE = 3760\n\nGB2312CharToFreqOrder = (\n1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205,\n2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842,\n2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409,\n 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670,\n1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820,\n1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585,\n 152,1687,1539, 738,1559,  59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566,\n1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850,  70,3285,2729,3534,3575,\n2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853,\n3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061,\n 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155,\n1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406,\n 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816,\n2534,1546,2393,2760, 737,2494,  13, 447, 245,2747,  38,2765,2129,2589,1079, 606,\n 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023,\n2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414,\n1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513,\n3195,4115,5627,2489,2991,  24,2065,2697,1087,2719,  48,1634, 315,  68, 985,2052,\n 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570,\n1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575,\n 253,3099,  32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250,\n2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506,\n1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563,  26,\n3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835,\n1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686,\n2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054,\n1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894,\n 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105,\n3777,3657, 643,2298,1148,1779, 190, 989,3544, 414,  11,2135,2063,2979,1471, 403,\n3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694,\n 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873,\n3651, 210,  33,1608,2516, 200,1520, 415, 102,   0,3389,1287, 817,  91,3299,2940,\n 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687,  20,1819, 121,\n1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648,\n3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992,\n2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680,  72, 842,1990, 212,1233,\n1154,1586,  75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157,\n 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807,\n1910, 534, 529,3309,1721,1660, 274,  39,2827, 661,2670,1578, 925,3248,3815,1094,\n4278,4901,4252,  41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258,\n 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478,\n3568, 194,5062,  15, 961,3870,1241,1192,2664,  66,5215,3260,2111,1295,1127,2152,\n3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426,  53,2909,\n 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272,\n1272,2363, 284,1753,3679,4064,1695,  81, 815,2677,2757,2731,1386, 859, 500,4221,\n2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252,\n1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301,\n1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254,\n 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070,\n3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461,\n3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640,  67,2360,\n4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124,\n 296,3979,1739,1611,3684,  23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535,\n3116,  17,1074, 467,2692,2201, 387,2922,  45,1326,3055,1645,3659,2817, 958, 243,\n1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713,\n1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071,\n4046,3572,2399,1571,3281,  79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442,\n 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946,\n 814,4968,3487,1548,2644,1567,1285,   2, 295,2636,  97, 946,3576, 832, 141,4257,\n3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180,\n1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427,\n 602,1525,2608,1605,1639,3175, 694,3064,  10, 465,  76,2000,4846,4208, 444,3781,\n1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724,\n2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844,  89, 937,\n 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943,\n 432, 445,2811, 206,4136,1472, 730, 349,  73, 397,2802,2547, 998,1637,1167, 789,\n 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552,\n3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246,\n4996, 371,1575,2436,1621,2210, 984,4033,1734,2638,  16,4529, 663,2755,3255,1451,\n3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310,\n 750,2058, 165,  80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860,\n2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297,\n2357, 395,3740, 137,2075, 944,4089,2584,1267,3802,  62,1533,2285, 178, 176, 780,\n2440, 201,3707, 590, 478,1560,4354,2117,1075,  30,  74,4643,4004,1635,1441,2745,\n 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936,\n2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032,\n 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669,  43,2523,1657,\n 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414,\n 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976,\n3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436,\n2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254,\n2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024,  40,3240,1536,\n1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238,\n  18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059,\n2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741,\n  90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447,\n 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601,\n1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269,\n1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076,  46,4253,2873,1889,1894,\n 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173,\n 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994,\n1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956,\n2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437,\n3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154,\n2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240,\n2269,2246,1446,  36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143,\n2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634,\n3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472,\n1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906,  51, 369, 170,3541,\n1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143,\n2101,2730,2490,  82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312,\n1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414,\n3750,2289,2795, 813,3123,2610,1136,4368,   5,3391,4541,2174, 420, 429,1728, 754,\n1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424,\n1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302,\n3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739,\n 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004,\n2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484,\n1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739,\n4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535,\n1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641,\n1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307,\n3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573,\n1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533,\n  47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965,\n 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096,  99,\n1397,1769,2300,4428,1643,3455,1978,1757,3718,1440,  35,4879,3742,1296,4228,2280,\n 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505,\n1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012,\n1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039,\n 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982,\n3708, 135,2131,  87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530,\n4314,   9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392,\n3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656,\n2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220,\n2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766,\n1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535,\n3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728,\n2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338,\n1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627,\n1505,1911,1883,3526, 698,3629,3456,1833,1431, 746,  77,1261,2017,2296,1977,1885,\n 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411,\n2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671,\n2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162,\n3192,2910,2010, 140,2395,2859,  55,1082,2012,2901, 662, 419,2081,1438, 680,2774,\n4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524,\n3399,  98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346,\n 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040,\n3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188,\n2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280,\n1086,1974,2034, 630, 257,3338,2788,4903,1017,  86,4790, 966,2789,1995,1696,1131,\n 259,3095,4188,1308, 179,1463,5257, 289,4107,1248,  42,3413,1725,2288, 896,1947,\n 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970,\n3034,3310, 540,2370,1562,1288,2990, 502,4765,1147,   4,1853,2708, 207, 294,2814,\n4078,2902,2509, 684,  34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557,\n2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997,\n1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972,\n1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369,\n 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376,\n1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196,  19, 941,3624,3480,\n3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610,\n 955,1089,3103,1053,  96,  88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128,\n 642,4006, 903,2539,1877,2082, 596,  29,4066,1790, 722,2157, 130, 995,1569, 769,\n1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445,  50, 625, 487,2207,\n  57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392,\n1783, 362,   8,3433,3422, 610,2793,3277,1390,1284,1654,  21,3823, 734, 367, 623,\n 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782,\n2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650,\n 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478,\n2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773,\n2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007,\n1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323,\n1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598,\n2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961,\n 819,1541, 142,2284,  44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302,\n1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409,\n1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683,\n2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191,\n2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434,  92,1466,4920,2616,\n3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302,\n1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774,\n4462,  64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147,\n 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731,\n 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464,\n3264,2855,2722,1952,1029,2839,2467,  84,4383,2215, 820,1391,2015,2448,3672, 377,\n1948,2168, 797,2545,3536,2578,2645,  94,2874,1678, 405,1259,3071, 771, 546,1315,\n 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928,  14,2594, 557,\n3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903,\n1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060,\n4031,2641,4067,3145,1870,  37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261,\n1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092,\n2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810,\n1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708,\n 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658,\n1178,2639,2351,  93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871,\n3341,1618,4126,2595,2334, 603, 651,  69, 701, 268,2662,3411,2555,1380,1606, 503,\n 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229,\n2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112,\n 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504,\n1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389,\n1281,  52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169,  27,\n1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542,\n3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861,\n2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845,\n3891,2868,3621,2254,  58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700,\n3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469,\n3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582,\n 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999,\n2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274,\n 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020,\n2724,1927,2333,4440, 567,  22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601,\n  12, 974,3783,4391, 951,1412,   1,3720, 453,4608,4041, 528,1041,1027,3230,2628,\n1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040,  31,\n 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668,\n 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778,\n1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169,\n3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667,\n3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118,  63,2076, 314,1881,\n1348,1061, 172, 978,3515,1747, 532, 511,3970,   6, 601, 905,2699,3300,1751, 276,\n1467,3725,2668,  65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320,\n3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751,\n2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432,\n2754,  95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772,\n1985, 244,2546, 474, 495,1046,2611,1851,2061,  71,2089,1675,2590, 742,3758,2843,\n3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116,\n 451,   3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904,\n4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652,\n1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664,\n2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078,  49,3770,\n3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283,\n3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626,\n1197,1663,4476,3127,  85,4240,2528,  25,1111,1181,3673, 407,3470,4561,2679,2713,\n 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333,\n 391,2963, 187,  61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062,\n2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555,\n 931, 317,2517,3027, 325, 569, 686,2107,3084,  60,1042,1333,2794, 264,3177,4014,\n1628, 258,3712,   7,4464,1176,1043,1778, 683, 114,1975,  78,1492, 383,1886, 510,\n 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015,\n1282,1289,4609, 697,1453,3044,2666,3611,1856,2412,  54, 719,1330, 568,3778,2459,\n1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390,\n1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238,\n1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421,  56,1908,1640,2387,2232,\n1917,1874,2477,4921, 148,  83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624,\n 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189,\n 852,1221,1400,1486, 882,2299,4036, 351,  28,1122, 700,6479,6480,6481,6482,6483,  # last 512\n#Everything below is of no interest for detection purpose\n5508,6484,3900,3414,3974,4441,4024,3537,4037,5628,5099,3633,6485,3148,6486,3636,\n5509,3257,5510,5973,5445,5872,4941,4403,3174,4627,5873,6276,2286,4230,5446,5874,\n5122,6102,6103,4162,5447,5123,5323,4849,6277,3980,3851,5066,4246,5774,5067,6278,\n3001,2807,5695,3346,5775,5974,5158,5448,6487,5975,5976,5776,3598,6279,5696,4806,\n4211,4154,6280,6488,6489,6490,6281,4212,5037,3374,4171,6491,4562,4807,4722,4827,\n5977,6104,4532,4079,5159,5324,5160,4404,3858,5359,5875,3975,4288,4610,3486,4512,\n5325,3893,5360,6282,6283,5560,2522,4231,5978,5186,5449,2569,3878,6284,5401,3578,\n4415,6285,4656,5124,5979,2506,4247,4449,3219,3417,4334,4969,4329,6492,4576,4828,\n4172,4416,4829,5402,6286,3927,3852,5361,4369,4830,4477,4867,5876,4173,6493,6105,\n4657,6287,6106,5877,5450,6494,4155,4868,5451,3700,5629,4384,6288,6289,5878,3189,\n4881,6107,6290,6495,4513,6496,4692,4515,4723,5100,3356,6497,6291,3810,4080,5561,\n3570,4430,5980,6498,4355,5697,6499,4724,6108,6109,3764,4050,5038,5879,4093,3226,\n6292,5068,5217,4693,3342,5630,3504,4831,4377,4466,4309,5698,4431,5777,6293,5778,\n4272,3706,6110,5326,3752,4676,5327,4273,5403,4767,5631,6500,5699,5880,3475,5039,\n6294,5562,5125,4348,4301,4482,4068,5126,4593,5700,3380,3462,5981,5563,3824,5404,\n4970,5511,3825,4738,6295,6501,5452,4516,6111,5881,5564,6502,6296,5982,6503,4213,\n4163,3454,6504,6112,4009,4450,6113,4658,6297,6114,3035,6505,6115,3995,4904,4739,\n4563,4942,4110,5040,3661,3928,5362,3674,6506,5292,3612,4791,5565,4149,5983,5328,\n5259,5021,4725,4577,4564,4517,4364,6298,5405,4578,5260,4594,4156,4157,5453,3592,\n3491,6507,5127,5512,4709,4922,5984,5701,4726,4289,6508,4015,6116,5128,4628,3424,\n4241,5779,6299,4905,6509,6510,5454,5702,5780,6300,4365,4923,3971,6511,5161,3270,\n3158,5985,4100, 867,5129,5703,6117,5363,3695,3301,5513,4467,6118,6512,5455,4232,\n4242,4629,6513,3959,4478,6514,5514,5329,5986,4850,5162,5566,3846,4694,6119,5456,\n4869,5781,3779,6301,5704,5987,5515,4710,6302,5882,6120,4392,5364,5705,6515,6121,\n6516,6517,3736,5988,5457,5989,4695,2457,5883,4551,5782,6303,6304,6305,5130,4971,\n6122,5163,6123,4870,3263,5365,3150,4871,6518,6306,5783,5069,5706,3513,3498,4409,\n5330,5632,5366,5458,5459,3991,5990,4502,3324,5991,5784,3696,4518,5633,4119,6519,\n4630,5634,4417,5707,4832,5992,3418,6124,5993,5567,4768,5218,6520,4595,3458,5367,\n6125,5635,6126,4202,6521,4740,4924,6307,3981,4069,4385,6308,3883,2675,4051,3834,\n4302,4483,5568,5994,4972,4101,5368,6309,5164,5884,3922,6127,6522,6523,5261,5460,\n5187,4164,5219,3538,5516,4111,3524,5995,6310,6311,5369,3181,3386,2484,5188,3464,\n5569,3627,5708,6524,5406,5165,4677,4492,6312,4872,4851,5885,4468,5996,6313,5709,\n5710,6128,2470,5886,6314,5293,4882,5785,3325,5461,5101,6129,5711,5786,6525,4906,\n6526,6527,4418,5887,5712,4808,2907,3701,5713,5888,6528,3765,5636,5331,6529,6530,\n3593,5889,3637,4943,3692,5714,5787,4925,6315,6130,5462,4405,6131,6132,6316,5262,\n6531,6532,5715,3859,5716,5070,4696,5102,3929,5788,3987,4792,5997,6533,6534,3920,\n4809,5000,5998,6535,2974,5370,6317,5189,5263,5717,3826,6536,3953,5001,4883,3190,\n5463,5890,4973,5999,4741,6133,6134,3607,5570,6000,4711,3362,3630,4552,5041,6318,\n6001,2950,2953,5637,4646,5371,4944,6002,2044,4120,3429,6319,6537,5103,4833,6538,\n6539,4884,4647,3884,6003,6004,4758,3835,5220,5789,4565,5407,6540,6135,5294,4697,\n4852,6320,6321,3206,4907,6541,6322,4945,6542,6136,6543,6323,6005,4631,3519,6544,\n5891,6545,5464,3784,5221,6546,5571,4659,6547,6324,6137,5190,6548,3853,6549,4016,\n4834,3954,6138,5332,3827,4017,3210,3546,4469,5408,5718,3505,4648,5790,5131,5638,\n5791,5465,4727,4318,6325,6326,5792,4553,4010,4698,3439,4974,3638,4335,3085,6006,\n5104,5042,5166,5892,5572,6327,4356,4519,5222,5573,5333,5793,5043,6550,5639,5071,\n4503,6328,6139,6551,6140,3914,3901,5372,6007,5640,4728,4793,3976,3836,4885,6552,\n4127,6553,4451,4102,5002,6554,3686,5105,6555,5191,5072,5295,4611,5794,5296,6556,\n5893,5264,5894,4975,5466,5265,4699,4976,4370,4056,3492,5044,4886,6557,5795,4432,\n4769,4357,5467,3940,4660,4290,6141,4484,4770,4661,3992,6329,4025,4662,5022,4632,\n4835,4070,5297,4663,4596,5574,5132,5409,5895,6142,4504,5192,4664,5796,5896,3885,\n5575,5797,5023,4810,5798,3732,5223,4712,5298,4084,5334,5468,6143,4052,4053,4336,\n4977,4794,6558,5335,4908,5576,5224,4233,5024,4128,5469,5225,4873,6008,5045,4729,\n4742,4633,3675,4597,6559,5897,5133,5577,5003,5641,5719,6330,6560,3017,2382,3854,\n4406,4811,6331,4393,3964,4946,6561,2420,3722,6562,4926,4378,3247,1736,4442,6332,\n5134,6333,5226,3996,2918,5470,4319,4003,4598,4743,4744,4485,3785,3902,5167,5004,\n5373,4394,5898,6144,4874,1793,3997,6334,4085,4214,5106,5642,4909,5799,6009,4419,\n4189,3330,5899,4165,4420,5299,5720,5227,3347,6145,4081,6335,2876,3930,6146,3293,\n3786,3910,3998,5900,5300,5578,2840,6563,5901,5579,6147,3531,5374,6564,6565,5580,\n4759,5375,6566,6148,3559,5643,6336,6010,5517,6337,6338,5721,5902,3873,6011,6339,\n6567,5518,3868,3649,5722,6568,4771,4947,6569,6149,4812,6570,2853,5471,6340,6341,\n5644,4795,6342,6012,5723,6343,5724,6013,4349,6344,3160,6150,5193,4599,4514,4493,\n5168,4320,6345,4927,3666,4745,5169,5903,5005,4928,6346,5725,6014,4730,4203,5046,\n4948,3395,5170,6015,4150,6016,5726,5519,6347,5047,3550,6151,6348,4197,4310,5904,\n6571,5581,2965,6152,4978,3960,4291,5135,6572,5301,5727,4129,4026,5905,4853,5728,\n5472,6153,6349,4533,2700,4505,5336,4678,3583,5073,2994,4486,3043,4554,5520,6350,\n6017,5800,4487,6351,3931,4103,5376,6352,4011,4321,4311,4190,5136,6018,3988,3233,\n4350,5906,5645,4198,6573,5107,3432,4191,3435,5582,6574,4139,5410,6353,5411,3944,\n5583,5074,3198,6575,6354,4358,6576,5302,4600,5584,5194,5412,6577,6578,5585,5413,\n5303,4248,5414,3879,4433,6579,4479,5025,4854,5415,6355,4760,4772,3683,2978,4700,\n3797,4452,3965,3932,3721,4910,5801,6580,5195,3551,5907,3221,3471,3029,6019,3999,\n5908,5909,5266,5267,3444,3023,3828,3170,4796,5646,4979,4259,6356,5647,5337,3694,\n6357,5648,5338,4520,4322,5802,3031,3759,4071,6020,5586,4836,4386,5048,6581,3571,\n4679,4174,4949,6154,4813,3787,3402,3822,3958,3215,3552,5268,4387,3933,4950,4359,\n6021,5910,5075,3579,6358,4234,4566,5521,6359,3613,5049,6022,5911,3375,3702,3178,\n4911,5339,4521,6582,6583,4395,3087,3811,5377,6023,6360,6155,4027,5171,5649,4421,\n4249,2804,6584,2270,6585,4000,4235,3045,6156,5137,5729,4140,4312,3886,6361,4330,\n6157,4215,6158,3500,3676,4929,4331,3713,4930,5912,4265,3776,3368,5587,4470,4855,\n3038,4980,3631,6159,6160,4132,4680,6161,6362,3923,4379,5588,4255,6586,4121,6587,\n6363,4649,6364,3288,4773,4774,6162,6024,6365,3543,6588,4274,3107,3737,5050,5803,\n4797,4522,5589,5051,5730,3714,4887,5378,4001,4523,6163,5026,5522,4701,4175,2791,\n3760,6589,5473,4224,4133,3847,4814,4815,4775,3259,5416,6590,2738,6164,6025,5304,\n3733,5076,5650,4816,5590,6591,6165,6592,3934,5269,6593,3396,5340,6594,5804,3445,\n3602,4042,4488,5731,5732,3525,5591,4601,5196,6166,6026,5172,3642,4612,3202,4506,\n4798,6366,3818,5108,4303,5138,5139,4776,3332,4304,2915,3415,4434,5077,5109,4856,\n2879,5305,4817,6595,5913,3104,3144,3903,4634,5341,3133,5110,5651,5805,6167,4057,\n5592,2945,4371,5593,6596,3474,4182,6367,6597,6168,4507,4279,6598,2822,6599,4777,\n4713,5594,3829,6169,3887,5417,6170,3653,5474,6368,4216,2971,5228,3790,4579,6369,\n5733,6600,6601,4951,4746,4555,6602,5418,5475,6027,3400,4665,5806,6171,4799,6028,\n5052,6172,3343,4800,4747,5006,6370,4556,4217,5476,4396,5229,5379,5477,3839,5914,\n5652,5807,4714,3068,4635,5808,6173,5342,4192,5078,5419,5523,5734,6174,4557,6175,\n4602,6371,6176,6603,5809,6372,5735,4260,3869,5111,5230,6029,5112,6177,3126,4681,\n5524,5915,2706,3563,4748,3130,6178,4018,5525,6604,6605,5478,4012,4837,6606,4534,\n4193,5810,4857,3615,5479,6030,4082,3697,3539,4086,5270,3662,4508,4931,5916,4912,\n5811,5027,3888,6607,4397,3527,3302,3798,2775,2921,2637,3966,4122,4388,4028,4054,\n1633,4858,5079,3024,5007,3982,3412,5736,6608,3426,3236,5595,3030,6179,3427,3336,\n3279,3110,6373,3874,3039,5080,5917,5140,4489,3119,6374,5812,3405,4494,6031,4666,\n4141,6180,4166,6032,5813,4981,6609,5081,4422,4982,4112,3915,5653,3296,3983,6375,\n4266,4410,5654,6610,6181,3436,5082,6611,5380,6033,3819,5596,4535,5231,5306,5113,\n6612,4952,5918,4275,3113,6613,6376,6182,6183,5814,3073,4731,4838,5008,3831,6614,\n4888,3090,3848,4280,5526,5232,3014,5655,5009,5737,5420,5527,6615,5815,5343,5173,\n5381,4818,6616,3151,4953,6617,5738,2796,3204,4360,2989,4281,5739,5174,5421,5197,\n3132,5141,3849,5142,5528,5083,3799,3904,4839,5480,2880,4495,3448,6377,6184,5271,\n5919,3771,3193,6034,6035,5920,5010,6036,5597,6037,6378,6038,3106,5422,6618,5423,\n5424,4142,6619,4889,5084,4890,4313,5740,6620,3437,5175,5307,5816,4199,5198,5529,\n5817,5199,5656,4913,5028,5344,3850,6185,2955,5272,5011,5818,4567,4580,5029,5921,\n3616,5233,6621,6622,6186,4176,6039,6379,6380,3352,5200,5273,2908,5598,5234,3837,\n5308,6623,6624,5819,4496,4323,5309,5201,6625,6626,4983,3194,3838,4167,5530,5922,\n5274,6381,6382,3860,3861,5599,3333,4292,4509,6383,3553,5481,5820,5531,4778,6187,\n3955,3956,4324,4389,4218,3945,4325,3397,2681,5923,4779,5085,4019,5482,4891,5382,\n5383,6040,4682,3425,5275,4094,6627,5310,3015,5483,5657,4398,5924,3168,4819,6628,\n5925,6629,5532,4932,4613,6041,6630,4636,6384,4780,4204,5658,4423,5821,3989,4683,\n5822,6385,4954,6631,5345,6188,5425,5012,5384,3894,6386,4490,4104,6632,5741,5053,\n6633,5823,5926,5659,5660,5927,6634,5235,5742,5824,4840,4933,4820,6387,4859,5928,\n4955,6388,4143,3584,5825,5346,5013,6635,5661,6389,5014,5484,5743,4337,5176,5662,\n6390,2836,6391,3268,6392,6636,6042,5236,6637,4158,6638,5744,5663,4471,5347,3663,\n4123,5143,4293,3895,6639,6640,5311,5929,5826,3800,6189,6393,6190,5664,5348,3554,\n3594,4749,4603,6641,5385,4801,6043,5827,4183,6642,5312,5426,4761,6394,5665,6191,\n4715,2669,6643,6644,5533,3185,5427,5086,5930,5931,5386,6192,6044,6645,4781,4013,\n5745,4282,4435,5534,4390,4267,6045,5746,4984,6046,2743,6193,3501,4087,5485,5932,\n5428,4184,4095,5747,4061,5054,3058,3862,5933,5600,6646,5144,3618,6395,3131,5055,\n5313,6396,4650,4956,3855,6194,3896,5202,4985,4029,4225,6195,6647,5828,5486,5829,\n3589,3002,6648,6397,4782,5276,6649,6196,6650,4105,3803,4043,5237,5830,6398,4096,\n3643,6399,3528,6651,4453,3315,4637,6652,3984,6197,5535,3182,3339,6653,3096,2660,\n6400,6654,3449,5934,4250,4236,6047,6401,5831,6655,5487,3753,4062,5832,6198,6199,\n6656,3766,6657,3403,4667,6048,6658,4338,2897,5833,3880,2797,3780,4326,6659,5748,\n5015,6660,5387,4351,5601,4411,6661,3654,4424,5935,4339,4072,5277,4568,5536,6402,\n6662,5238,6663,5349,5203,6200,5204,6201,5145,4536,5016,5056,4762,5834,4399,4957,\n6202,6403,5666,5749,6664,4340,6665,5936,5177,5667,6666,6667,3459,4668,6404,6668,\n6669,4543,6203,6670,4276,6405,4480,5537,6671,4614,5205,5668,6672,3348,2193,4763,\n6406,6204,5937,5602,4177,5669,3419,6673,4020,6205,4443,4569,5388,3715,3639,6407,\n6049,4058,6206,6674,5938,4544,6050,4185,4294,4841,4651,4615,5488,6207,6408,6051,\n5178,3241,3509,5835,6208,4958,5836,4341,5489,5278,6209,2823,5538,5350,5206,5429,\n6675,4638,4875,4073,3516,4684,4914,4860,5939,5603,5389,6052,5057,3237,5490,3791,\n6676,6409,6677,4821,4915,4106,5351,5058,4243,5539,4244,5604,4842,4916,5239,3028,\n3716,5837,5114,5605,5390,5940,5430,6210,4332,6678,5540,4732,3667,3840,6053,4305,\n3408,5670,5541,6410,2744,5240,5750,6679,3234,5606,6680,5607,5671,3608,4283,4159,\n4400,5352,4783,6681,6411,6682,4491,4802,6211,6412,5941,6413,6414,5542,5751,6683,\n4669,3734,5942,6684,6415,5943,5059,3328,4670,4144,4268,6685,6686,6687,6688,4372,\n3603,6689,5944,5491,4373,3440,6416,5543,4784,4822,5608,3792,4616,5838,5672,3514,\n5391,6417,4892,6690,4639,6691,6054,5673,5839,6055,6692,6056,5392,6212,4038,5544,\n5674,4497,6057,6693,5840,4284,5675,4021,4545,5609,6418,4454,6419,6213,4113,4472,\n5314,3738,5087,5279,4074,5610,4959,4063,3179,4750,6058,6420,6214,3476,4498,4716,\n5431,4960,4685,6215,5241,6694,6421,6216,6695,5841,5945,6422,3748,5946,5179,3905,\n5752,5545,5947,4374,6217,4455,6423,4412,6218,4803,5353,6696,3832,5280,6219,4327,\n4702,6220,6221,6059,4652,5432,6424,3749,4751,6425,5753,4986,5393,4917,5948,5030,\n5754,4861,4733,6426,4703,6697,6222,4671,5949,4546,4961,5180,6223,5031,3316,5281,\n6698,4862,4295,4934,5207,3644,6427,5842,5950,6428,6429,4570,5843,5282,6430,6224,\n5088,3239,6060,6699,5844,5755,6061,6431,2701,5546,6432,5115,5676,4039,3993,3327,\n4752,4425,5315,6433,3941,6434,5677,4617,4604,3074,4581,6225,5433,6435,6226,6062,\n4823,5756,5116,6227,3717,5678,4717,5845,6436,5679,5846,6063,5847,6064,3977,3354,\n6437,3863,5117,6228,5547,5394,4499,4524,6229,4605,6230,4306,4500,6700,5951,6065,\n3693,5952,5089,4366,4918,6701,6231,5548,6232,6702,6438,4704,5434,6703,6704,5953,\n4168,6705,5680,3420,6706,5242,4407,6066,3812,5757,5090,5954,4672,4525,3481,5681,\n4618,5395,5354,5316,5955,6439,4962,6707,4526,6440,3465,4673,6067,6441,5682,6708,\n5435,5492,5758,5683,4619,4571,4674,4804,4893,4686,5493,4753,6233,6068,4269,6442,\n6234,5032,4705,5146,5243,5208,5848,6235,6443,4963,5033,4640,4226,6236,5849,3387,\n6444,6445,4436,4437,5850,4843,5494,4785,4894,6709,4361,6710,5091,5956,3331,6237,\n4987,5549,6069,6711,4342,3517,4473,5317,6070,6712,6071,4706,6446,5017,5355,6713,\n6714,4988,5436,6447,4734,5759,6715,4735,4547,4456,4754,6448,5851,6449,6450,3547,\n5852,5318,6451,6452,5092,4205,6716,6238,4620,4219,5611,6239,6072,4481,5760,5957,\n5958,4059,6240,6453,4227,4537,6241,5761,4030,4186,5244,5209,3761,4457,4876,3337,\n5495,5181,6242,5959,5319,5612,5684,5853,3493,5854,6073,4169,5613,5147,4895,6074,\n5210,6717,5182,6718,3830,6243,2798,3841,6075,6244,5855,5614,3604,4606,5496,5685,\n5118,5356,6719,6454,5960,5357,5961,6720,4145,3935,4621,5119,5962,4261,6721,6455,\n4786,5963,4375,4582,6245,6246,6247,6076,5437,4877,5856,3376,4380,6248,4160,6722,\n5148,6456,5211,6457,6723,4718,6458,6724,6249,5358,4044,3297,6459,6250,5857,5615,\n5497,5245,6460,5498,6725,6251,6252,5550,3793,5499,2959,5396,6461,6462,4572,5093,\n5500,5964,3806,4146,6463,4426,5762,5858,6077,6253,4755,3967,4220,5965,6254,4989,\n5501,6464,4352,6726,6078,4764,2290,5246,3906,5438,5283,3767,4964,2861,5763,5094,\n6255,6256,4622,5616,5859,5860,4707,6727,4285,4708,4824,5617,6257,5551,4787,5212,\n4965,4935,4687,6465,6728,6466,5686,6079,3494,4413,2995,5247,5966,5618,6729,5967,\n5764,5765,5687,5502,6730,6731,6080,5397,6467,4990,6258,6732,4538,5060,5619,6733,\n4719,5688,5439,5018,5149,5284,5503,6734,6081,4607,6259,5120,3645,5861,4583,6260,\n4584,4675,5620,4098,5440,6261,4863,2379,3306,4585,5552,5689,4586,5285,6735,4864,\n6736,5286,6082,6737,4623,3010,4788,4381,4558,5621,4587,4896,3698,3161,5248,4353,\n4045,6262,3754,5183,4588,6738,6263,6739,6740,5622,3936,6741,6468,6742,6264,5095,\n6469,4991,5968,6743,4992,6744,6083,4897,6745,4256,5766,4307,3108,3968,4444,5287,\n3889,4343,6084,4510,6085,4559,6086,4898,5969,6746,5623,5061,4919,5249,5250,5504,\n5441,6265,5320,4878,3242,5862,5251,3428,6087,6747,4237,5624,5442,6266,5553,4539,\n6748,2585,3533,5398,4262,6088,5150,4736,4438,6089,6267,5505,4966,6749,6268,6750,\n6269,5288,5554,3650,6090,6091,4624,6092,5690,6751,5863,4270,5691,4277,5555,5864,\n6752,5692,4720,4865,6470,5151,4688,4825,6753,3094,6754,6471,3235,4653,6755,5213,\n5399,6756,3201,4589,5865,4967,6472,5866,6473,5019,3016,6757,5321,4756,3957,4573,\n6093,4993,5767,4721,6474,6758,5625,6759,4458,6475,6270,6760,5556,4994,5214,5252,\n6271,3875,5768,6094,5034,5506,4376,5769,6761,2120,6476,5253,5770,6762,5771,5970,\n3990,5971,5557,5558,5772,6477,6095,2787,4641,5972,5121,6096,6097,6272,6763,3703,\n5867,5507,6273,4206,6274,4789,6098,6764,3619,3646,3833,3804,2394,3788,4936,3978,\n4866,4899,6099,6100,5559,6478,6765,3599,5868,6101,5869,5870,6275,6766,4527,6767)\n\n# flake8: noqa\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/gb2312prober.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is mozilla.org code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 1998\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n# \r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n# \r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\nfrom .mbcharsetprober import MultiByteCharSetProber\r\nfrom .codingstatemachine import CodingStateMachine\r\nfrom .chardistribution import GB2312DistributionAnalysis\r\nfrom .mbcssm import GB2312SMModel\r\n\r\nclass GB2312Prober(MultiByteCharSetProber):\r\n    def __init__(self):\r\n        MultiByteCharSetProber.__init__(self)\r\n        self._mCodingSM = CodingStateMachine(GB2312SMModel)\r\n        self._mDistributionAnalyzer = GB2312DistributionAnalysis()\r\n        self.reset()\r\n\r\n    def get_charset_name(self):\r\n        return \"GB2312\"\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/hebrewprober.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is Mozilla Universal charset detector code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n#          Shy Shalom\r\n# Portions created by the Initial Developer are Copyright (C) 2005\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n#\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\nfrom .charsetprober import CharSetProber\r\nfrom .constants import eNotMe, eDetecting\r\nfrom .compat import wrap_ord\r\n\r\n# This prober doesn't actually recognize a language or a charset.\r\n# It is a helper prober for the use of the Hebrew model probers\r\n\r\n### General ideas of the Hebrew charset recognition ###\r\n#\r\n# Four main charsets exist in Hebrew:\r\n# \"ISO-8859-8\" - Visual Hebrew\r\n# \"windows-1255\" - Logical Hebrew\r\n# \"ISO-8859-8-I\" - Logical Hebrew\r\n# \"x-mac-hebrew\" - ?? Logical Hebrew ??\r\n#\r\n# Both \"ISO\" charsets use a completely identical set of code points, whereas\r\n# \"windows-1255\" and \"x-mac-hebrew\" are two different proper supersets of\r\n# these code points. windows-1255 defines additional characters in the range\r\n# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific\r\n# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6.\r\n# x-mac-hebrew defines similar additional code points but with a different\r\n# mapping.\r\n#\r\n# As far as an average Hebrew text with no diacritics is concerned, all four\r\n# charsets are identical with respect to code points. Meaning that for the\r\n# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters\r\n# (including final letters).\r\n#\r\n# The dominant difference between these charsets is their directionality.\r\n# \"Visual\" directionality means that the text is ordered as if the renderer is\r\n# not aware of a BIDI rendering algorithm. The renderer sees the text and\r\n# draws it from left to right. The text itself when ordered naturally is read\r\n# backwards. A buffer of Visual Hebrew generally looks like so:\r\n# \"[last word of first line spelled backwards] [whole line ordered backwards\r\n# and spelled backwards] [first word of first line spelled backwards]\r\n# [end of line] [last word of second line] ... etc' \"\r\n# adding punctuation marks, numbers and English text to visual text is\r\n# naturally also \"visual\" and from left to right.\r\n#\r\n# \"Logical\" directionality means the text is ordered \"naturally\" according to\r\n# the order it is read. It is the responsibility of the renderer to display\r\n# the text from right to left. A BIDI algorithm is used to place general\r\n# punctuation marks, numbers and English text in the text.\r\n#\r\n# Texts in x-mac-hebrew are almost impossible to find on the Internet. From\r\n# what little evidence I could find, it seems that its general directionality\r\n# is Logical.\r\n#\r\n# To sum up all of the above, the Hebrew probing mechanism knows about two\r\n# charsets:\r\n# Visual Hebrew - \"ISO-8859-8\" - backwards text - Words and sentences are\r\n#    backwards while line order is natural. For charset recognition purposes\r\n#    the line order is unimportant (In fact, for this implementation, even\r\n#    word order is unimportant).\r\n# Logical Hebrew - \"windows-1255\" - normal, naturally ordered text.\r\n#\r\n# \"ISO-8859-8-I\" is a subset of windows-1255 and doesn't need to be\r\n#    specifically identified.\r\n# \"x-mac-hebrew\" is also identified as windows-1255. A text in x-mac-hebrew\r\n#    that contain special punctuation marks or diacritics is displayed with\r\n#    some unconverted characters showing as question marks. This problem might\r\n#    be corrected using another model prober for x-mac-hebrew. Due to the fact\r\n#    that x-mac-hebrew texts are so rare, writing another model prober isn't\r\n#    worth the effort and performance hit.\r\n#\r\n#### The Prober ####\r\n#\r\n# The prober is divided between two SBCharSetProbers and a HebrewProber,\r\n# all of which are managed, created, fed data, inquired and deleted by the\r\n# SBCSGroupProber. The two SBCharSetProbers identify that the text is in\r\n# fact some kind of Hebrew, Logical or Visual. The final decision about which\r\n# one is it is made by the HebrewProber by combining final-letter scores\r\n# with the scores of the two SBCharSetProbers to produce a final answer.\r\n#\r\n# The SBCSGroupProber is responsible for stripping the original text of HTML\r\n# tags, English characters, numbers, low-ASCII punctuation characters, spaces\r\n# and new lines. It reduces any sequence of such characters to a single space.\r\n# The buffer fed to each prober in the SBCS group prober is pure text in\r\n# high-ASCII.\r\n# The two SBCharSetProbers (model probers) share the same language model:\r\n# Win1255Model.\r\n# The first SBCharSetProber uses the model normally as any other\r\n# SBCharSetProber does, to recognize windows-1255, upon which this model was\r\n# built. The second SBCharSetProber is told to make the pair-of-letter\r\n# lookup in the language model backwards. This in practice exactly simulates\r\n# a visual Hebrew model using the windows-1255 logical Hebrew model.\r\n#\r\n# The HebrewProber is not using any language model. All it does is look for\r\n# final-letter evidence suggesting the text is either logical Hebrew or visual\r\n# Hebrew. Disjointed from the model probers, the results of the HebrewProber\r\n# alone are meaningless. HebrewProber always returns 0.00 as confidence\r\n# since it never identifies a charset by itself. Instead, the pointer to the\r\n# HebrewProber is passed to the model probers as a helper \"Name Prober\".\r\n# When the Group prober receives a positive identification from any prober,\r\n# it asks for the name of the charset identified. If the prober queried is a\r\n# Hebrew model prober, the model prober forwards the call to the\r\n# HebrewProber to make the final decision. In the HebrewProber, the\r\n# decision is made according to the final-letters scores maintained and Both\r\n# model probers scores. The answer is returned in the form of the name of the\r\n# charset identified, either \"windows-1255\" or \"ISO-8859-8\".\r\n\r\n# windows-1255 / ISO-8859-8 code points of interest\r\nFINAL_KAF = 0xea\r\nNORMAL_KAF = 0xeb\r\nFINAL_MEM = 0xed\r\nNORMAL_MEM = 0xee\r\nFINAL_NUN = 0xef\r\nNORMAL_NUN = 0xf0\r\nFINAL_PE = 0xf3\r\nNORMAL_PE = 0xf4\r\nFINAL_TSADI = 0xf5\r\nNORMAL_TSADI = 0xf6\r\n\r\n# Minimum Visual vs Logical final letter score difference.\r\n# If the difference is below this, don't rely solely on the final letter score\r\n# distance.\r\nMIN_FINAL_CHAR_DISTANCE = 5\r\n\r\n# Minimum Visual vs Logical model score difference.\r\n# If the difference is below this, don't rely at all on the model score\r\n# distance.\r\nMIN_MODEL_DISTANCE = 0.01\r\n\r\nVISUAL_HEBREW_NAME = \"ISO-8859-8\"\r\nLOGICAL_HEBREW_NAME = \"windows-1255\"\r\n\r\n\r\nclass HebrewProber(CharSetProber):\r\n    def __init__(self):\r\n        CharSetProber.__init__(self)\r\n        self._mLogicalProber = None\r\n        self._mVisualProber = None\r\n        self.reset()\r\n\r\n    def reset(self):\r\n        self._mFinalCharLogicalScore = 0\r\n        self._mFinalCharVisualScore = 0\r\n        # The two last characters seen in the previous buffer,\r\n        # mPrev and mBeforePrev are initialized to space in order to simulate\r\n        # a word delimiter at the beginning of the data\r\n        self._mPrev = ' '\r\n        self._mBeforePrev = ' '\r\n        # These probers are owned by the group prober.\r\n\r\n    def set_model_probers(self, logicalProber, visualProber):\r\n        self._mLogicalProber = logicalProber\r\n        self._mVisualProber = visualProber\r\n\r\n    def is_final(self, c):\r\n        return wrap_ord(c) in [FINAL_KAF, FINAL_MEM, FINAL_NUN, FINAL_PE,\r\n                               FINAL_TSADI]\r\n\r\n    def is_non_final(self, c):\r\n        # The normal Tsadi is not a good Non-Final letter due to words like\r\n        # 'lechotet' (to chat) containing an apostrophe after the tsadi. This\r\n        # apostrophe is converted to a space in FilterWithoutEnglishLetters\r\n        # causing the Non-Final tsadi to appear at an end of a word even\r\n        # though this is not the case in the original text.\r\n        # The letters Pe and Kaf rarely display a related behavior of not being\r\n        # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak'\r\n        # for example legally end with a Non-Final Pe or Kaf. However, the\r\n        # benefit of these letters as Non-Final letters outweighs the damage\r\n        # since these words are quite rare.\r\n        return wrap_ord(c) in [NORMAL_KAF, NORMAL_MEM, NORMAL_NUN, NORMAL_PE]\r\n\r\n    def feed(self, aBuf):\r\n        # Final letter analysis for logical-visual decision.\r\n        # Look for evidence that the received buffer is either logical Hebrew\r\n        # or visual Hebrew.\r\n        # The following cases are checked:\r\n        # 1) A word longer than 1 letter, ending with a final letter. This is\r\n        #    an indication that the text is laid out \"naturally\" since the\r\n        #    final letter really appears at the end. +1 for logical score.\r\n        # 2) A word longer than 1 letter, ending with a Non-Final letter. In\r\n        #    normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi,\r\n        #    should not end with the Non-Final form of that letter. Exceptions\r\n        #    to this rule are mentioned above in isNonFinal(). This is an\r\n        #    indication that the text is laid out backwards. +1 for visual\r\n        #    score\r\n        # 3) A word longer than 1 letter, starting with a final letter. Final\r\n        #    letters should not appear at the beginning of a word. This is an\r\n        #    indication that the text is laid out backwards. +1 for visual\r\n        #    score.\r\n        #\r\n        # The visual score and logical score are accumulated throughout the\r\n        # text and are finally checked against each other in GetCharSetName().\r\n        # No checking for final letters in the middle of words is done since\r\n        # that case is not an indication for either Logical or Visual text.\r\n        #\r\n        # We automatically filter out all 7-bit characters (replace them with\r\n        # spaces) so the word boundary detection works properly. [MAP]\r\n\r\n        if self.get_state() == eNotMe:\r\n            # Both model probers say it's not them. No reason to continue.\r\n            return eNotMe\r\n\r\n        aBuf = self.filter_high_bit_only(aBuf)\r\n\r\n        for cur in aBuf:\r\n            if cur == ' ':\r\n                # We stand on a space - a word just ended\r\n                if self._mBeforePrev != ' ':\r\n                    # next-to-last char was not a space so self._mPrev is not a\r\n                    # 1 letter word\r\n                    if self.is_final(self._mPrev):\r\n                        # case (1) [-2:not space][-1:final letter][cur:space]\r\n                        self._mFinalCharLogicalScore += 1\r\n                    elif self.is_non_final(self._mPrev):\r\n                        # case (2) [-2:not space][-1:Non-Final letter][\r\n                        #  cur:space]\r\n                        self._mFinalCharVisualScore += 1\r\n            else:\r\n                # Not standing on a space\r\n                if ((self._mBeforePrev == ' ') and\r\n                        (self.is_final(self._mPrev)) and (cur != ' ')):\r\n                    # case (3) [-2:space][-1:final letter][cur:not space]\r\n                    self._mFinalCharVisualScore += 1\r\n            self._mBeforePrev = self._mPrev\r\n            self._mPrev = cur\r\n\r\n        # Forever detecting, till the end or until both model probers return\r\n        # eNotMe (handled above)\r\n        return eDetecting\r\n\r\n    def get_charset_name(self):\r\n        # Make the decision: is it Logical or Visual?\r\n        # If the final letter score distance is dominant enough, rely on it.\r\n        finalsub = self._mFinalCharLogicalScore - self._mFinalCharVisualScore\r\n        if finalsub >= MIN_FINAL_CHAR_DISTANCE:\r\n            return LOGICAL_HEBREW_NAME\r\n        if finalsub <= -MIN_FINAL_CHAR_DISTANCE:\r\n            return VISUAL_HEBREW_NAME\r\n\r\n        # It's not dominant enough, try to rely on the model scores instead.\r\n        modelsub = (self._mLogicalProber.get_confidence()\r\n                    - self._mVisualProber.get_confidence())\r\n        if modelsub > MIN_MODEL_DISTANCE:\r\n            return LOGICAL_HEBREW_NAME\r\n        if modelsub < -MIN_MODEL_DISTANCE:\r\n            return VISUAL_HEBREW_NAME\r\n\r\n        # Still no good, back to final letter distance, maybe it'll save the\r\n        # day.\r\n        if finalsub < 0.0:\r\n            return VISUAL_HEBREW_NAME\r\n\r\n        # (finalsub > 0 - Logical) or (don't know what to do) default to\r\n        # Logical.\r\n        return LOGICAL_HEBREW_NAME\r\n\r\n    def get_state(self):\r\n        # Remain active as long as any of the model probers are active.\r\n        if (self._mLogicalProber.get_state() == eNotMe) and \\\r\n           (self._mVisualProber.get_state() == eNotMe):\r\n            return eNotMe\r\n        return eDetecting\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/jisfreq.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\n# The Original Code is Mozilla Communicator client code.\n#\n# The Initial Developer of the Original Code is\n# Netscape Communications Corporation.\n# Portions created by the Initial Developer are Copyright (C) 1998\n# the Initial Developer. All Rights Reserved.\n#\n# Contributor(s):\n#   Mark Pilgrim - port to Python\n#\n# This library is free software; you can redistribute it and/or\n# modify it under the terms of the GNU Lesser General Public\n# License as published by the Free Software Foundation; either\n# version 2.1 of the License, or (at your option) any later version.\n#\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# Lesser General Public License for more details.\n#\n# You should have received a copy of the GNU Lesser General Public\n# License along with this library; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n# 02110-1301  USA\n######################### END LICENSE BLOCK #########################\n\n# Sampling from about 20M text materials include literature and computer technology\n#\n# Japanese frequency table, applied to both S-JIS and EUC-JP\n# They are sorted in order.\n\n# 128  --> 0.77094\n# 256  --> 0.85710\n# 512  --> 0.92635\n# 1024 --> 0.97130\n# 2048 --> 0.99431\n#\n# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58\n# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191\n#\n# Typical Distribution Ratio, 25% of IDR\n\nJIS_TYPICAL_DISTRIBUTION_RATIO = 3.0\n\n# Char to FreqOrder table ,\nJIS_TABLE_SIZE = 4368\n\nJISCharToFreqOrder = (\n  40,   1,   6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, #   16\n3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247,  18, 179,5071, 856,1661, #   32\n1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, #   48\n2042,1061,1062,  48,  49,  44,  45, 433, 434,1040,1041, 996, 787,2997,1255,4305, #   64\n2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, #   80\n5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, #   96\n1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, #  112\n5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, #  128\n5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, #  144\n5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, #  160\n5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, #  176\n5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, #  192\n5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, #  208\n1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, #  224\n1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, #  240\n1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, #  256\n2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, #  272\n3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161,  26,3377,   2,3929,  20, #  288\n3691,  47,4100,  50,  17,  16,  35, 268,  27, 243,  42, 155,  24, 154,  29, 184, #  304\n   4,  91,  14,  92,  53, 396,  33, 289,   9,  37,  64, 620,  21,  39, 321,   5, #  320\n  12,  11,  52,  13,   3, 208, 138,   0,   7,  60, 526, 141, 151,1069, 181, 275, #  336\n1591,  83, 132,1475, 126, 331, 829,  15,  69, 160,  59,  22, 157,  55,1079, 312, #  352\n 109,  38,  23,  25,  10,  19,  79,5195,  61, 382,1124,   8,  30,5196,5197,5198, #  368\n5199,5200,5201,5202,5203,5204,5205,5206,  89,  62,  74,  34,2416, 112, 139, 196, #  384\n 271, 149,  84, 607, 131, 765,  46,  88, 153, 683,  76, 874, 101, 258,  57,  80, #  400\n  32, 364, 121,1508, 169,1547,  68, 235, 145,2999,  41, 360,3027,  70,  63,  31, #  416\n  43, 259, 262,1383,  99, 533, 194,  66,  93, 846, 217, 192,  56, 106,  58, 565, #  432\n 280, 272, 311, 256, 146,  82, 308,  71, 100, 128, 214, 655, 110, 261, 104,1140, #  448\n  54,  51,  36,  87,  67,3070, 185,2618,2936,2020,  28,1066,2390,2059,5207,5208, #  464\n5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, #  480\n5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, #  496\n5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, #  512\n4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, #  528\n5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, #  544\n5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, #  560\n5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, #  576\n5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, #  592\n5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, #  608\n5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, #  624\n5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, #  640\n5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, #  656\n5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, #  672\n3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, #  688\n5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, #  704\n5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, #  720\n5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, #  736\n5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, #  752\n5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, #  768\n5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, #  784\n5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, #  800\n5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, #  816\n5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, #  832\n5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, #  848\n5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, #  864\n5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, #  880\n5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, #  896\n5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, #  912\n5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, #  928\n5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, #  944\n5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, #  960\n5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, #  976\n5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, #  992\n5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008\n5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024\n5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040\n5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056\n5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072\n5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088\n5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104\n5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120\n5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136\n5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152\n5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168\n5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184\n5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200\n5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216\n5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232\n5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248\n5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264\n5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280\n5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296\n6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312\n6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328\n6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344\n6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360\n6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376\n6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392\n6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408\n6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424\n4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440\n 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456\n 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472\n1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619,  65,3302,2045, # 1488\n1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504\n 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520\n3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536\n3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552\n 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568\n3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584\n3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600\n 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616\n2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632\n 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648\n3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664\n1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680\n 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696\n1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712\n 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728\n2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744\n2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760\n2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776\n2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792\n1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808\n1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824\n1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840\n1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856\n2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872\n1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888\n2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904\n1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920\n1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936\n1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952\n1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968\n1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984\n1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000\n 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016\n 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032\n1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048\n2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064\n2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080\n2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096\n3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112\n3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128\n 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144\n3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160\n1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876,  78,2287,1482,1277, # 2176\n 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192\n2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208\n1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224\n 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240\n3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256\n4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272\n2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288\n1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304\n2601,1919,1078,  75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320\n1075, 292,3818,1756,2602, 317,  98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336\n 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352\n 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368\n1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384\n2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400\n2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416\n2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432\n3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448\n1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464\n2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480\n 359,2291,1676,  73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496\n 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512\n 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528\n1209,  96, 587,2166,1032, 260,1072,2153, 173,  94, 226,3244, 819,2006,4642,4114, # 2544\n2203, 231,1744, 782,  97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560\n 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576\n1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592\n1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608\n 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624\n1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640\n1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656\n1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672\n 764,2861,1853, 688,2429,1920,1462,  77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688\n2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704\n 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720\n2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736\n3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752\n2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768\n1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784\n6147, 441, 762,1771,3447,3607,3608,1904, 840,3037,  86, 939,1385, 572,1370,2445, # 2800\n1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816\n2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832\n1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848\n 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864\n  72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880\n3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896\n3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912\n1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928\n1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944\n1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960\n1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976\n 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992\n 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008\n2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024\n 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040\n3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056\n2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072\n 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088\n1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104\n2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120\n 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136\n1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152\n 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168\n4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184\n2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200\n1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216\n 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232\n1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248\n2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264\n 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280\n6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296\n1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312\n1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328\n2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344\n3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360\n 914,2550,2587,  81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376\n3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392\n1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408\n 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424\n1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440\n 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456\n3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472\n 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488\n2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504\n 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520\n4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536\n2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552\n1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568\n1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584\n1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600\n 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616\n1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632\n3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648\n1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664\n3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680\n 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696\n 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712\n 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728\n2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744\n1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760\n 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776\n1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792\n 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808\n1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824\n 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840\n 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856\n 480,2083,1774,3458, 923,2279,1350, 221,3086,  85,2233,2234,3835,1585,3010,2147, # 3872\n1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888\n1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904\n2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920\n4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936\n 227,1351,1645,2453,2193,1421,2887, 812,2121, 634,  95,2435, 201,2312,4665,1646, # 3952\n1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968\n 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984\n1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000\n3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016\n1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032\n2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048\n2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064\n1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080\n1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096\n2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112\n 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128\n2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144\n1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160\n1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176\n1279,2136,1697,2335, 204, 721,2097,3838,  90,6186,2085,2505, 191,3967, 124,2148, # 4192\n1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208\n3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224\n2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240\n2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256\n 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272\n3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288\n3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304\n1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320\n2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336\n1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352\n2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368  #last 512\n#Everything below is of no interest for detection purpose\n2138,2122,3730,2888,1995,1820,1044,6190,6191,6192,6193,6194,6195,6196,6197,6198, # 4384\n6199,6200,6201,6202,6203,6204,6205,4670,6206,6207,6208,6209,6210,6211,6212,6213, # 4400\n6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229, # 4416\n6230,6231,6232,6233,6234,6235,6236,6237,3187,6238,6239,3969,6240,6241,6242,6243, # 4432\n6244,4671,6245,6246,4672,6247,6248,4133,6249,6250,4364,6251,2923,2556,2613,4673, # 4448\n4365,3970,6252,6253,6254,6255,4674,6256,6257,6258,2768,2353,4366,4675,4676,3188, # 4464\n4367,3463,6259,4134,4677,4678,6260,2267,6261,3842,3332,4368,3543,6262,6263,6264, # 4480\n3013,1954,1928,4135,4679,6265,6266,2478,3091,6267,4680,4369,6268,6269,1699,6270, # 4496\n3544,4136,4681,6271,4137,6272,4370,2804,6273,6274,2593,3971,3972,4682,6275,2236, # 4512\n4683,6276,6277,4684,6278,6279,4138,3973,4685,6280,6281,3258,6282,6283,6284,6285, # 4528\n3974,4686,2841,3975,6286,6287,3545,6288,6289,4139,4687,4140,6290,4141,6291,4142, # 4544\n6292,6293,3333,6294,6295,6296,4371,6297,3399,6298,6299,4372,3976,6300,6301,6302, # 4560\n4373,6303,6304,3843,3731,6305,4688,4374,6306,6307,3259,2294,6308,3732,2530,4143, # 4576\n6309,4689,6310,6311,6312,3048,6313,6314,4690,3733,2237,6315,6316,2282,3334,6317, # 4592\n6318,3844,6319,6320,4691,6321,3400,4692,6322,4693,6323,3049,6324,4375,6325,3977, # 4608\n6326,6327,6328,3546,6329,4694,3335,6330,4695,4696,6331,6332,6333,6334,4376,3978, # 4624\n6335,4697,3979,4144,6336,3980,4698,6337,6338,6339,6340,6341,4699,4700,4701,6342, # 4640\n6343,4702,6344,6345,4703,6346,6347,4704,6348,4705,4706,3135,6349,4707,6350,4708, # 4656\n6351,4377,6352,4709,3734,4145,6353,2506,4710,3189,6354,3050,4711,3981,6355,3547, # 4672\n3014,4146,4378,3735,2651,3845,3260,3136,2224,1986,6356,3401,6357,4712,2594,3627, # 4688\n3137,2573,3736,3982,4713,3628,4714,4715,2682,3629,4716,6358,3630,4379,3631,6359, # 4704\n6360,6361,3983,6362,6363,6364,6365,4147,3846,4717,6366,6367,3737,2842,6368,4718, # 4720\n2628,6369,3261,6370,2386,6371,6372,3738,3984,4719,3464,4720,3402,6373,2924,3336, # 4736\n4148,2866,6374,2805,3262,4380,2704,2069,2531,3138,2806,2984,6375,2769,6376,4721, # 4752\n4722,3403,6377,6378,3548,6379,6380,2705,3092,1979,4149,2629,3337,2889,6381,3338, # 4768\n4150,2557,3339,4381,6382,3190,3263,3739,6383,4151,4723,4152,2558,2574,3404,3191, # 4784\n6384,6385,4153,6386,4724,4382,6387,6388,4383,6389,6390,4154,6391,4725,3985,6392, # 4800\n3847,4155,6393,6394,6395,6396,6397,3465,6398,4384,6399,6400,6401,6402,6403,6404, # 4816\n4156,6405,6406,6407,6408,2123,6409,6410,2326,3192,4726,6411,6412,6413,6414,4385, # 4832\n4157,6415,6416,4158,6417,3093,3848,6418,3986,6419,6420,3849,6421,6422,6423,4159, # 4848\n6424,6425,4160,6426,3740,6427,6428,6429,6430,3987,6431,4727,6432,2238,6433,6434, # 4864\n4386,3988,6435,6436,3632,6437,6438,2843,6439,6440,6441,6442,3633,6443,2958,6444, # 4880\n6445,3466,6446,2364,4387,3850,6447,4388,2959,3340,6448,3851,6449,4728,6450,6451, # 4896\n3264,4729,6452,3193,6453,4389,4390,2706,3341,4730,6454,3139,6455,3194,6456,3051, # 4912\n2124,3852,1602,4391,4161,3853,1158,3854,4162,3989,4392,3990,4731,4732,4393,2040, # 4928\n4163,4394,3265,6457,2807,3467,3855,6458,6459,6460,3991,3468,4733,4734,6461,3140, # 4944\n2960,6462,4735,6463,6464,6465,6466,4736,4737,4738,4739,6467,6468,4164,2403,3856, # 4960\n6469,6470,2770,2844,6471,4740,6472,6473,6474,6475,6476,6477,6478,3195,6479,4741, # 4976\n4395,6480,2867,6481,4742,2808,6482,2493,4165,6483,6484,6485,6486,2295,4743,6487, # 4992\n6488,6489,3634,6490,6491,6492,6493,6494,6495,6496,2985,4744,6497,6498,4745,6499, # 5008\n6500,2925,3141,4166,6501,6502,4746,6503,6504,4747,6505,6506,6507,2890,6508,6509, # 5024\n6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,3469,4167,6520,6521,6522,4748, # 5040\n4396,3741,4397,4749,4398,3342,2125,4750,6523,4751,4752,4753,3052,6524,2961,4168, # 5056\n6525,4754,6526,4755,4399,2926,4169,6527,3857,6528,4400,4170,6529,4171,6530,6531, # 5072\n2595,6532,6533,6534,6535,3635,6536,6537,6538,6539,6540,6541,6542,4756,6543,6544, # 5088\n6545,6546,6547,6548,4401,6549,6550,6551,6552,4402,3405,4757,4403,6553,6554,6555, # 5104\n4172,3742,6556,6557,6558,3992,3636,6559,6560,3053,2726,6561,3549,4173,3054,4404, # 5120\n6562,6563,3993,4405,3266,3550,2809,4406,6564,6565,6566,4758,4759,6567,3743,6568, # 5136\n4760,3744,4761,3470,6569,6570,6571,4407,6572,3745,4174,6573,4175,2810,4176,3196, # 5152\n4762,6574,4177,6575,6576,2494,2891,3551,6577,6578,3471,6579,4408,6580,3015,3197, # 5168\n6581,3343,2532,3994,3858,6582,3094,3406,4409,6583,2892,4178,4763,4410,3016,4411, # 5184\n6584,3995,3142,3017,2683,6585,4179,6586,6587,4764,4412,6588,6589,4413,6590,2986, # 5200\n6591,2962,3552,6592,2963,3472,6593,6594,4180,4765,6595,6596,2225,3267,4414,6597, # 5216\n3407,3637,4766,6598,6599,3198,6600,4415,6601,3859,3199,6602,3473,4767,2811,4416, # 5232\n1856,3268,3200,2575,3996,3997,3201,4417,6603,3095,2927,6604,3143,6605,2268,6606, # 5248\n3998,3860,3096,2771,6607,6608,3638,2495,4768,6609,3861,6610,3269,2745,4769,4181, # 5264\n3553,6611,2845,3270,6612,6613,6614,3862,6615,6616,4770,4771,6617,3474,3999,4418, # 5280\n4419,6618,3639,3344,6619,4772,4182,6620,2126,6621,6622,6623,4420,4773,6624,3018, # 5296\n6625,4774,3554,6626,4183,2025,3746,6627,4184,2707,6628,4421,4422,3097,1775,4185, # 5312\n3555,6629,6630,2868,6631,6632,4423,6633,6634,4424,2414,2533,2928,6635,4186,2387, # 5328\n6636,4775,6637,4187,6638,1891,4425,3202,3203,6639,6640,4776,6641,3345,6642,6643, # 5344\n3640,6644,3475,3346,3641,4000,6645,3144,6646,3098,2812,4188,3642,3204,6647,3863, # 5360\n3476,6648,3864,6649,4426,4001,6650,6651,6652,2576,6653,4189,4777,6654,6655,6656, # 5376\n2846,6657,3477,3205,4002,6658,4003,6659,3347,2252,6660,6661,6662,4778,6663,6664, # 5392\n6665,6666,6667,6668,6669,4779,4780,2048,6670,3478,3099,6671,3556,3747,4004,6672, # 5408\n6673,6674,3145,4005,3748,6675,6676,6677,6678,6679,3408,6680,6681,6682,6683,3206, # 5424\n3207,6684,6685,4781,4427,6686,4782,4783,4784,6687,6688,6689,4190,6690,6691,3479, # 5440\n6692,2746,6693,4428,6694,6695,6696,6697,6698,6699,4785,6700,6701,3208,2727,6702, # 5456\n3146,6703,6704,3409,2196,6705,4429,6706,6707,6708,2534,1996,6709,6710,6711,2747, # 5472\n6712,6713,6714,4786,3643,6715,4430,4431,6716,3557,6717,4432,4433,6718,6719,6720, # 5488\n6721,3749,6722,4006,4787,6723,6724,3644,4788,4434,6725,6726,4789,2772,6727,6728, # 5504\n6729,6730,6731,2708,3865,2813,4435,6732,6733,4790,4791,3480,6734,6735,6736,6737, # 5520\n4436,3348,6738,3410,4007,6739,6740,4008,6741,6742,4792,3411,4191,6743,6744,6745, # 5536\n6746,6747,3866,6748,3750,6749,6750,6751,6752,6753,6754,6755,3867,6756,4009,6757, # 5552\n4793,4794,6758,2814,2987,6759,6760,6761,4437,6762,6763,6764,6765,3645,6766,6767, # 5568\n3481,4192,6768,3751,6769,6770,2174,6771,3868,3752,6772,6773,6774,4193,4795,4438, # 5584\n3558,4796,4439,6775,4797,6776,6777,4798,6778,4799,3559,4800,6779,6780,6781,3482, # 5600\n6782,2893,6783,6784,4194,4801,4010,6785,6786,4440,6787,4011,6788,6789,6790,6791, # 5616\n6792,6793,4802,6794,6795,6796,4012,6797,6798,6799,6800,3349,4803,3483,6801,4804, # 5632\n4195,6802,4013,6803,6804,4196,6805,4014,4015,6806,2847,3271,2848,6807,3484,6808, # 5648\n6809,6810,4441,6811,4442,4197,4443,3272,4805,6812,3412,4016,1579,6813,6814,4017, # 5664\n6815,3869,6816,2964,6817,4806,6818,6819,4018,3646,6820,6821,4807,4019,4020,6822, # 5680\n6823,3560,6824,6825,4021,4444,6826,4198,6827,6828,4445,6829,6830,4199,4808,6831, # 5696\n6832,6833,3870,3019,2458,6834,3753,3413,3350,6835,4809,3871,4810,3561,4446,6836, # 5712\n6837,4447,4811,4812,6838,2459,4448,6839,4449,6840,6841,4022,3872,6842,4813,4814, # 5728\n6843,6844,4815,4200,4201,4202,6845,4023,6846,6847,4450,3562,3873,6848,6849,4816, # 5744\n4817,6850,4451,4818,2139,6851,3563,6852,6853,3351,6854,6855,3352,4024,2709,3414, # 5760\n4203,4452,6856,4204,6857,6858,3874,3875,6859,6860,4819,6861,6862,6863,6864,4453, # 5776\n3647,6865,6866,4820,6867,6868,6869,6870,4454,6871,2869,6872,6873,4821,6874,3754, # 5792\n6875,4822,4205,6876,6877,6878,3648,4206,4455,6879,4823,6880,4824,3876,6881,3055, # 5808\n4207,6882,3415,6883,6884,6885,4208,4209,6886,4210,3353,6887,3354,3564,3209,3485, # 5824\n2652,6888,2728,6889,3210,3755,6890,4025,4456,6891,4825,6892,6893,6894,6895,4211, # 5840\n6896,6897,6898,4826,6899,6900,4212,6901,4827,6902,2773,3565,6903,4828,6904,6905, # 5856\n6906,6907,3649,3650,6908,2849,3566,6909,3567,3100,6910,6911,6912,6913,6914,6915, # 5872\n4026,6916,3355,4829,3056,4457,3756,6917,3651,6918,4213,3652,2870,6919,4458,6920, # 5888\n2438,6921,6922,3757,2774,4830,6923,3356,4831,4832,6924,4833,4459,3653,2507,6925, # 5904\n4834,2535,6926,6927,3273,4027,3147,6928,3568,6929,6930,6931,4460,6932,3877,4461, # 5920\n2729,3654,6933,6934,6935,6936,2175,4835,2630,4214,4028,4462,4836,4215,6937,3148, # 5936\n4216,4463,4837,4838,4217,6938,6939,2850,4839,6940,4464,6941,6942,6943,4840,6944, # 5952\n4218,3274,4465,6945,6946,2710,6947,4841,4466,6948,6949,2894,6950,6951,4842,6952, # 5968\n4219,3057,2871,6953,6954,6955,6956,4467,6957,2711,6958,6959,6960,3275,3101,4843, # 5984\n6961,3357,3569,6962,4844,6963,6964,4468,4845,3570,6965,3102,4846,3758,6966,4847, # 6000\n3878,4848,4849,4029,6967,2929,3879,4850,4851,6968,6969,1733,6970,4220,6971,6972, # 6016\n6973,6974,6975,6976,4852,6977,6978,6979,6980,6981,6982,3759,6983,6984,6985,3486, # 6032\n3487,6986,3488,3416,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,4853, # 6048\n6998,6999,4030,7000,7001,3211,7002,7003,4221,7004,7005,3571,4031,7006,3572,7007, # 6064\n2614,4854,2577,7008,7009,2965,3655,3656,4855,2775,3489,3880,4222,4856,3881,4032, # 6080\n3882,3657,2730,3490,4857,7010,3149,7011,4469,4858,2496,3491,4859,2283,7012,7013, # 6096\n7014,2365,4860,4470,7015,7016,3760,7017,7018,4223,1917,7019,7020,7021,4471,7022, # 6112\n2776,4472,7023,7024,7025,7026,4033,7027,3573,4224,4861,4034,4862,7028,7029,1929, # 6128\n3883,4035,7030,4473,3058,7031,2536,3761,3884,7032,4036,7033,2966,2895,1968,4474, # 6144\n3276,4225,3417,3492,4226,2105,7034,7035,1754,2596,3762,4227,4863,4475,3763,4864, # 6160\n3764,2615,2777,3103,3765,3658,3418,4865,2296,3766,2815,7036,7037,7038,3574,2872, # 6176\n3277,4476,7039,4037,4477,7040,7041,4038,7042,7043,7044,7045,7046,7047,2537,7048, # 6192\n7049,7050,7051,7052,7053,7054,4478,7055,7056,3767,3659,4228,3575,7057,7058,4229, # 6208\n7059,7060,7061,3660,7062,3212,7063,3885,4039,2460,7064,7065,7066,7067,7068,7069, # 6224\n7070,7071,7072,7073,7074,4866,3768,4867,7075,7076,7077,7078,4868,3358,3278,2653, # 6240\n7079,7080,4479,3886,7081,7082,4869,7083,7084,7085,7086,7087,7088,2538,7089,7090, # 6256\n7091,4040,3150,3769,4870,4041,2896,3359,4230,2930,7092,3279,7093,2967,4480,3213, # 6272\n4481,3661,7094,7095,7096,7097,7098,7099,7100,7101,7102,2461,3770,7103,7104,4231, # 6288\n3151,7105,7106,7107,4042,3662,7108,7109,4871,3663,4872,4043,3059,7110,7111,7112, # 6304\n3493,2988,7113,4873,7114,7115,7116,3771,4874,7117,7118,4232,4875,7119,3576,2336, # 6320\n4876,7120,4233,3419,4044,4877,4878,4482,4483,4879,4484,4234,7121,3772,4880,1045, # 6336\n3280,3664,4881,4882,7122,7123,7124,7125,4883,7126,2778,7127,4485,4486,7128,4884, # 6352\n3214,3887,7129,7130,3215,7131,4885,4045,7132,7133,4046,7134,7135,7136,7137,7138, # 6368\n7139,7140,7141,7142,7143,4235,7144,4886,7145,7146,7147,4887,7148,7149,7150,4487, # 6384\n4047,4488,7151,7152,4888,4048,2989,3888,7153,3665,7154,4049,7155,7156,7157,7158, # 6400\n7159,7160,2931,4889,4890,4489,7161,2631,3889,4236,2779,7162,7163,4891,7164,3060, # 6416\n7165,1672,4892,7166,4893,4237,3281,4894,7167,7168,3666,7169,3494,7170,7171,4050, # 6432\n7172,7173,3104,3360,3420,4490,4051,2684,4052,7174,4053,7175,7176,7177,2253,4054, # 6448\n7178,7179,4895,7180,3152,3890,3153,4491,3216,7181,7182,7183,2968,4238,4492,4055, # 6464\n7184,2990,7185,2479,7186,7187,4493,7188,7189,7190,7191,7192,4896,7193,4897,2969, # 6480\n4494,4898,7194,3495,7195,7196,4899,4495,7197,3105,2731,7198,4900,7199,7200,7201, # 6496\n4056,7202,3361,7203,7204,4496,4901,4902,7205,4497,7206,7207,2315,4903,7208,4904, # 6512\n7209,4905,2851,7210,7211,3577,7212,3578,4906,7213,4057,3667,4907,7214,4058,2354, # 6528\n3891,2376,3217,3773,7215,7216,7217,7218,7219,4498,7220,4908,3282,2685,7221,3496, # 6544\n4909,2632,3154,4910,7222,2337,7223,4911,7224,7225,7226,4912,4913,3283,4239,4499, # 6560\n7227,2816,7228,7229,7230,7231,7232,7233,7234,4914,4500,4501,7235,7236,7237,2686, # 6576\n7238,4915,7239,2897,4502,7240,4503,7241,2516,7242,4504,3362,3218,7243,7244,7245, # 6592\n4916,7246,7247,4505,3363,7248,7249,7250,7251,3774,4506,7252,7253,4917,7254,7255, # 6608\n3284,2991,4918,4919,3219,3892,4920,3106,3497,4921,7256,7257,7258,4922,7259,4923, # 6624\n3364,4507,4508,4059,7260,4240,3498,7261,7262,4924,7263,2992,3893,4060,3220,7264, # 6640\n7265,7266,7267,7268,7269,4509,3775,7270,2817,7271,4061,4925,4510,3776,7272,4241, # 6656\n4511,3285,7273,7274,3499,7275,7276,7277,4062,4512,4926,7278,3107,3894,7279,7280, # 6672\n4927,7281,4513,7282,7283,3668,7284,7285,4242,4514,4243,7286,2058,4515,4928,4929, # 6688\n4516,7287,3286,4244,7288,4517,7289,7290,7291,3669,7292,7293,4930,4931,4932,2355, # 6704\n4933,7294,2633,4518,7295,4245,7296,7297,4519,7298,7299,4520,4521,4934,7300,4246, # 6720\n4522,7301,7302,7303,3579,7304,4247,4935,7305,4936,7306,7307,7308,7309,3777,7310, # 6736\n4523,7311,7312,7313,4248,3580,7314,4524,3778,4249,7315,3581,7316,3287,7317,3221, # 6752\n7318,4937,7319,7320,7321,7322,7323,7324,4938,4939,7325,4525,7326,7327,7328,4063, # 6768\n7329,7330,4940,7331,7332,4941,7333,4526,7334,3500,2780,1741,4942,2026,1742,7335, # 6784\n7336,3582,4527,2388,7337,7338,7339,4528,7340,4250,4943,7341,7342,7343,4944,7344, # 6800\n7345,7346,3020,7347,4945,7348,7349,7350,7351,3895,7352,3896,4064,3897,7353,7354, # 6816\n7355,4251,7356,7357,3898,7358,3779,7359,3780,3288,7360,7361,4529,7362,4946,4530, # 6832\n2027,7363,3899,4531,4947,3222,3583,7364,4948,7365,7366,7367,7368,4949,3501,4950, # 6848\n3781,4951,4532,7369,2517,4952,4252,4953,3155,7370,4954,4955,4253,2518,4533,7371, # 6864\n7372,2712,4254,7373,7374,7375,3670,4956,3671,7376,2389,3502,4065,7377,2338,7378, # 6880\n7379,7380,7381,3061,7382,4957,7383,7384,7385,7386,4958,4534,7387,7388,2993,7389, # 6896\n3062,7390,4959,7391,7392,7393,4960,3108,4961,7394,4535,7395,4962,3421,4536,7396, # 6912\n4963,7397,4964,1857,7398,4965,7399,7400,2176,3584,4966,7401,7402,3422,4537,3900, # 6928\n3585,7403,3782,7404,2852,7405,7406,7407,4538,3783,2654,3423,4967,4539,7408,3784, # 6944\n3586,2853,4540,4541,7409,3901,7410,3902,7411,7412,3785,3109,2327,3903,7413,7414, # 6960\n2970,4066,2932,7415,7416,7417,3904,3672,3424,7418,4542,4543,4544,7419,4968,7420, # 6976\n7421,4255,7422,7423,7424,7425,7426,4067,7427,3673,3365,4545,7428,3110,2559,3674, # 6992\n7429,7430,3156,7431,7432,3503,7433,3425,4546,7434,3063,2873,7435,3223,4969,4547, # 7008\n4548,2898,4256,4068,7436,4069,3587,3786,2933,3787,4257,4970,4971,3788,7437,4972, # 7024\n3064,7438,4549,7439,7440,7441,7442,7443,4973,3905,7444,2874,7445,7446,7447,7448, # 7040\n3021,7449,4550,3906,3588,4974,7450,7451,3789,3675,7452,2578,7453,4070,7454,7455, # 7056\n7456,4258,3676,7457,4975,7458,4976,4259,3790,3504,2634,4977,3677,4551,4260,7459, # 7072\n7460,7461,7462,3907,4261,4978,7463,7464,7465,7466,4979,4980,7467,7468,2213,4262, # 7088\n7469,7470,7471,3678,4981,7472,2439,7473,4263,3224,3289,7474,3908,2415,4982,7475, # 7104\n4264,7476,4983,2655,7477,7478,2732,4552,2854,2875,7479,7480,4265,7481,4553,4984, # 7120\n7482,7483,4266,7484,3679,3366,3680,2818,2781,2782,3367,3589,4554,3065,7485,4071, # 7136\n2899,7486,7487,3157,2462,4072,4555,4073,4985,4986,3111,4267,2687,3368,4556,4074, # 7152\n3791,4268,7488,3909,2783,7489,2656,1962,3158,4557,4987,1963,3159,3160,7490,3112, # 7168\n4988,4989,3022,4990,4991,3792,2855,7491,7492,2971,4558,7493,7494,4992,7495,7496, # 7184\n7497,7498,4993,7499,3426,4559,4994,7500,3681,4560,4269,4270,3910,7501,4075,4995, # 7200\n4271,7502,7503,4076,7504,4996,7505,3225,4997,4272,4077,2819,3023,7506,7507,2733, # 7216\n4561,7508,4562,7509,3369,3793,7510,3590,2508,7511,7512,4273,3113,2994,2616,7513, # 7232\n7514,7515,7516,7517,7518,2820,3911,4078,2748,7519,7520,4563,4998,7521,7522,7523, # 7248\n7524,4999,4274,7525,4564,3682,2239,4079,4565,7526,7527,7528,7529,5000,7530,7531, # 7264\n5001,4275,3794,7532,7533,7534,3066,5002,4566,3161,7535,7536,4080,7537,3162,7538, # 7280\n7539,4567,7540,7541,7542,7543,7544,7545,5003,7546,4568,7547,7548,7549,7550,7551, # 7296\n7552,7553,7554,7555,7556,5004,7557,7558,7559,5005,7560,3795,7561,4569,7562,7563, # 7312\n7564,2821,3796,4276,4277,4081,7565,2876,7566,5006,7567,7568,2900,7569,3797,3912, # 7328\n7570,7571,7572,4278,7573,7574,7575,5007,7576,7577,5008,7578,7579,4279,2934,7580, # 7344\n7581,5009,7582,4570,7583,4280,7584,7585,7586,4571,4572,3913,7587,4573,3505,7588, # 7360\n5010,7589,7590,7591,7592,3798,4574,7593,7594,5011,7595,4281,7596,7597,7598,4282, # 7376\n5012,7599,7600,5013,3163,7601,5014,7602,3914,7603,7604,2734,4575,4576,4577,7605, # 7392\n7606,7607,7608,7609,3506,5015,4578,7610,4082,7611,2822,2901,2579,3683,3024,4579, # 7408\n3507,7612,4580,7613,3226,3799,5016,7614,7615,7616,7617,7618,7619,7620,2995,3290, # 7424\n7621,4083,7622,5017,7623,7624,7625,7626,7627,4581,3915,7628,3291,7629,5018,7630, # 7440\n7631,7632,7633,4084,7634,7635,3427,3800,7636,7637,4582,7638,5019,4583,5020,7639, # 7456\n3916,7640,3801,5021,4584,4283,7641,7642,3428,3591,2269,7643,2617,7644,4585,3592, # 7472\n7645,4586,2902,7646,7647,3227,5022,7648,4587,7649,4284,7650,7651,7652,4588,2284, # 7488\n7653,5023,7654,7655,7656,4589,5024,3802,7657,7658,5025,3508,4590,7659,7660,7661, # 7504\n1969,5026,7662,7663,3684,1821,2688,7664,2028,2509,4285,7665,2823,1841,7666,2689, # 7520\n3114,7667,3917,4085,2160,5027,5028,2972,7668,5029,7669,7670,7671,3593,4086,7672, # 7536\n4591,4087,5030,3803,7673,7674,7675,7676,7677,7678,7679,4286,2366,4592,4593,3067, # 7552\n2328,7680,7681,4594,3594,3918,2029,4287,7682,5031,3919,3370,4288,4595,2856,7683, # 7568\n3509,7684,7685,5032,5033,7686,7687,3804,2784,7688,7689,7690,7691,3371,7692,7693, # 7584\n2877,5034,7694,7695,3920,4289,4088,7696,7697,7698,5035,7699,5036,4290,5037,5038, # 7600\n5039,7700,7701,7702,5040,5041,3228,7703,1760,7704,5042,3229,4596,2106,4089,7705, # 7616\n4597,2824,5043,2107,3372,7706,4291,4090,5044,7707,4091,7708,5045,3025,3805,4598, # 7632\n4292,4293,4294,3373,7709,4599,7710,5046,7711,7712,5047,5048,3806,7713,7714,7715, # 7648\n5049,7716,7717,7718,7719,4600,5050,7720,7721,7722,5051,7723,4295,3429,7724,7725, # 7664\n7726,7727,3921,7728,3292,5052,4092,7729,7730,7731,7732,7733,7734,7735,5053,5054, # 7680\n7736,7737,7738,7739,3922,3685,7740,7741,7742,7743,2635,5055,7744,5056,4601,7745, # 7696\n7746,2560,7747,7748,7749,7750,3923,7751,7752,7753,7754,7755,4296,2903,7756,7757, # 7712\n7758,7759,7760,3924,7761,5057,4297,7762,7763,5058,4298,7764,4093,7765,7766,5059, # 7728\n3925,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,3595,7777,4299,5060,4094, # 7744\n7778,3293,5061,7779,7780,4300,7781,7782,4602,7783,3596,7784,7785,3430,2367,7786, # 7760\n3164,5062,5063,4301,7787,7788,4095,5064,5065,7789,3374,3115,7790,7791,7792,7793, # 7776\n7794,7795,7796,3597,4603,7797,7798,3686,3116,3807,5066,7799,7800,5067,7801,7802, # 7792\n4604,4302,5068,4303,4096,7803,7804,3294,7805,7806,5069,4605,2690,7807,3026,7808, # 7808\n7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824, # 7824\n7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7840\n7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856, # 7856\n7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872, # 7872\n7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888, # 7888\n7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904, # 7904\n7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920, # 7920\n7921,7922,7923,7924,3926,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, # 7936\n7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, # 7952\n7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, # 7968\n7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, # 7984\n7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, # 8000\n8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, # 8016\n8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, # 8032\n8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, # 8048\n8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, # 8064\n8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, # 8080\n8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, # 8096\n8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, # 8112\n8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, # 8128\n8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, # 8144\n8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, # 8160\n8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, # 8176\n8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, # 8192\n8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, # 8208\n8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, # 8224\n8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, # 8240\n8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, # 8256\n8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271) # 8272\n\n# flake8: noqa\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/jpcntx.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is Mozilla Communicator client code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 1998\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n#\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\nfrom .compat import wrap_ord\r\n\r\nNUM_OF_CATEGORY = 6\r\nDONT_KNOW = -1\r\nENOUGH_REL_THRESHOLD = 100\r\nMAX_REL_THRESHOLD = 1000\r\nMINIMUM_DATA_THRESHOLD = 4\r\n\r\n# This is hiragana 2-char sequence table, the number in each cell represents its frequency category\r\njp2CharContext = (\r\n(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1),\r\n(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4),\r\n(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2),\r\n(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4),\r\n(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),\r\n(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4),\r\n(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),\r\n(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3),\r\n(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),\r\n(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4),\r\n(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4),\r\n(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3),\r\n(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3),\r\n(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3),\r\n(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4),\r\n(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3),\r\n(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4),\r\n(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3),\r\n(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5),\r\n(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3),\r\n(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5),\r\n(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4),\r\n(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4),\r\n(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3),\r\n(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3),\r\n(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3),\r\n(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5),\r\n(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4),\r\n(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5),\r\n(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3),\r\n(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4),\r\n(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4),\r\n(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4),\r\n(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1),\r\n(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0),\r\n(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3),\r\n(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0),\r\n(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3),\r\n(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3),\r\n(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5),\r\n(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4),\r\n(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5),\r\n(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3),\r\n(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3),\r\n(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3),\r\n(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3),\r\n(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4),\r\n(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4),\r\n(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2),\r\n(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3),\r\n(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3),\r\n(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3),\r\n(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3),\r\n(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4),\r\n(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3),\r\n(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4),\r\n(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3),\r\n(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3),\r\n(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4),\r\n(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4),\r\n(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3),\r\n(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4),\r\n(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4),\r\n(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3),\r\n(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4),\r\n(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4),\r\n(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4),\r\n(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3),\r\n(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2),\r\n(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2),\r\n(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3),\r\n(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3),\r\n(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5),\r\n(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3),\r\n(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4),\r\n(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4),\r\n(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4),\r\n(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),\r\n(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3),\r\n(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1),\r\n(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2),\r\n(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3),\r\n(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1),\r\n)\r\n\r\nclass JapaneseContextAnalysis:\r\n    def __init__(self):\r\n        self.reset()\r\n\r\n    def reset(self):\r\n        self._mTotalRel = 0  # total sequence received\r\n        # category counters, each interger counts sequence in its category\r\n        self._mRelSample = [0] * NUM_OF_CATEGORY\r\n        # if last byte in current buffer is not the last byte of a character,\r\n        # we need to know how many bytes to skip in next buffer\r\n        self._mNeedToSkipCharNum = 0\r\n        self._mLastCharOrder = -1  # The order of previous char\r\n        # If this flag is set to True, detection is done and conclusion has\r\n        # been made\r\n        self._mDone = False\r\n\r\n    def feed(self, aBuf, aLen):\r\n        if self._mDone:\r\n            return\r\n\r\n        # The buffer we got is byte oriented, and a character may span in more than one\r\n        # buffers. In case the last one or two byte in last buffer is not\r\n        # complete, we record how many byte needed to complete that character\r\n        # and skip these bytes here.  We can choose to record those bytes as\r\n        # well and analyse the character once it is complete, but since a\r\n        # character will not make much difference, by simply skipping\r\n        # this character will simply our logic and improve performance.\r\n        i = self._mNeedToSkipCharNum\r\n        while i < aLen:\r\n            order, charLen = self.get_order(aBuf[i:i + 2])\r\n            i += charLen\r\n            if i > aLen:\r\n                self._mNeedToSkipCharNum = i - aLen\r\n                self._mLastCharOrder = -1\r\n            else:\r\n                if (order != -1) and (self._mLastCharOrder != -1):\r\n                    self._mTotalRel += 1\r\n                    if self._mTotalRel > MAX_REL_THRESHOLD:\r\n                        self._mDone = True\r\n                        break\r\n                    self._mRelSample[jp2CharContext[self._mLastCharOrder][order]] += 1\r\n                self._mLastCharOrder = order\r\n\r\n    def got_enough_data(self):\r\n        return self._mTotalRel > ENOUGH_REL_THRESHOLD\r\n\r\n    def get_confidence(self):\r\n        # This is just one way to calculate confidence. It works well for me.\r\n        if self._mTotalRel > MINIMUM_DATA_THRESHOLD:\r\n            return (self._mTotalRel - self._mRelSample[0]) / self._mTotalRel\r\n        else:\r\n            return DONT_KNOW\r\n\r\n    def get_order(self, aBuf):\r\n        return -1, 1\r\n\r\nclass SJISContextAnalysis(JapaneseContextAnalysis):\r\n    def get_order(self, aBuf):\r\n        if not aBuf:\r\n            return -1, 1\r\n        # find out current char's byte length\r\n        first_char = wrap_ord(aBuf[0])\r\n        if ((0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC)):\r\n            charLen = 2\r\n        else:\r\n            charLen = 1\r\n\r\n        # return its order if it is hiragana\r\n        if len(aBuf) > 1:\r\n            second_char = wrap_ord(aBuf[1])\r\n            if (first_char == 202) and (0x9F <= second_char <= 0xF1):\r\n                return second_char - 0x9F, charLen\r\n\r\n        return -1, charLen\r\n\r\nclass EUCJPContextAnalysis(JapaneseContextAnalysis):\r\n    def get_order(self, aBuf):\r\n        if not aBuf:\r\n            return -1, 1\r\n        # find out current char's byte length\r\n        first_char = wrap_ord(aBuf[0])\r\n        if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE):\r\n            charLen = 2\r\n        elif first_char == 0x8F:\r\n            charLen = 3\r\n        else:\r\n            charLen = 1\r\n\r\n        # return its order if it is hiragana\r\n        if len(aBuf) > 1:\r\n            second_char = wrap_ord(aBuf[1])\r\n            if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3):\r\n                return second_char - 0xA1, charLen\r\n\r\n        return -1, charLen\r\n\r\n# flake8: noqa\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/langbulgarianmodel.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is Mozilla Communicator client code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 1998\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n#\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\n# 255: Control characters that usually does not exist in any text\r\n# 254: Carriage/Return\r\n# 253: symbol (punctuation) that does not belong to word\r\n# 252: 0 - 9\r\n\r\n# Character Mapping Table:\r\n# this table is modified base on win1251BulgarianCharToOrderMap, so\r\n# only number <64 is sure valid\r\n\r\nLatin5_BulgarianCharToOrderMap = (\r\n255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00\r\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10\r\n253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20\r\n252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30\r\n253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82,  # 40\r\n110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253,  # 50\r\n253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71,  # 60\r\n116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253,  # 70\r\n194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,  # 80\r\n210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,  # 90\r\n 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238,  # a0\r\n 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30,  # b0\r\n 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56,  # c0\r\n  1, 18,  9, 20, 11,  3, 23, 15,  2, 26, 12, 10, 14,  6,  4, 13,  # d0\r\n  7,  8,  5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16,  # e0\r\n 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253,  # f0\r\n)\r\n\r\nwin1251BulgarianCharToOrderMap = (\r\n255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00\r\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10\r\n253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20\r\n252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30\r\n253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82,  # 40\r\n110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253,  # 50\r\n253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71,  # 60\r\n116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253,  # 70\r\n206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220,  # 80\r\n221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229,  # 90\r\n 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240,  # a0\r\n 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250,  # b0\r\n 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30,  # c0\r\n 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56,  # d0\r\n  1, 18,  9, 20, 11,  3, 23, 15,  2, 26, 12, 10, 14,  6,  4, 13,  # e0\r\n  7,  8,  5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16,  # f0\r\n)\r\n\r\n# Model Table:\r\n# total sequences: 100%\r\n# first 512 sequences: 96.9392%\r\n# first 1024 sequences:3.0618%\r\n# rest  sequences:     0.2992%\r\n# negative sequences:  0.0020%\r\nBulgarianLangModel = (\r\n0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3,\r\n3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2,\r\n3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1,\r\n0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,\r\n3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0,\r\n0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,\r\n3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0,\r\n0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0,\r\n0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0,\r\n0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,\r\n3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0,\r\n0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,\r\n3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0,\r\n0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,\r\n3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0,\r\n0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,\r\n3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0,\r\n1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,\r\n3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0,\r\n0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,\r\n3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0,\r\n0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,\r\n3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0,\r\n0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,\r\n3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0,\r\n0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,\r\n3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1,\r\n0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,\r\n3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0,\r\n0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,\r\n3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0,\r\n0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,\r\n3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0,\r\n0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0,\r\n0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,\r\n3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,\r\n3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,\r\n3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0,\r\n0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,\r\n3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3,\r\n2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1,\r\n3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,\r\n3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2,\r\n1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0,\r\n3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1,\r\n1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0,\r\n2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2,\r\n2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0,\r\n3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2,\r\n1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0,\r\n2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2,\r\n2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0,\r\n3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2,\r\n1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0,\r\n2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2,\r\n2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0,\r\n2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2,\r\n1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0,\r\n2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2,\r\n1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0,\r\n3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2,\r\n1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0,\r\n3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1,\r\n1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0,\r\n2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1,\r\n1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0,\r\n2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2,\r\n1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0,\r\n2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1,\r\n1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0,\r\n3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,\r\n1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2,\r\n1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1,\r\n2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2,\r\n1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,\r\n2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2,\r\n1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,\r\n1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1,\r\n0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,\r\n1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2,\r\n1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,\r\n2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1,\r\n1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,\r\n1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1,\r\n0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,\r\n1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1,\r\n0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,\r\n2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,\r\n0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,\r\n2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0,\r\n1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,\r\n0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,\r\n0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,\r\n1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1,\r\n1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,\r\n1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,\r\n2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,\r\n)\r\n\r\nLatin5BulgarianModel = {\r\n  'charToOrderMap': Latin5_BulgarianCharToOrderMap,\r\n  'precedenceMatrix': BulgarianLangModel,\r\n  'mTypicalPositiveRatio': 0.969392,\r\n  'keepEnglishLetter': False,\r\n  'charsetName': \"ISO-8859-5\"\r\n}\r\n\r\nWin1251BulgarianModel = {\r\n  'charToOrderMap': win1251BulgarianCharToOrderMap,\r\n  'precedenceMatrix': BulgarianLangModel,\r\n  'mTypicalPositiveRatio': 0.969392,\r\n  'keepEnglishLetter': False,\r\n  'charsetName': \"windows-1251\"\r\n}\r\n\r\n\r\n# flake8: noqa\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/langcyrillicmodel.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is Mozilla Communicator client code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 1998\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n#\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\n# KOI8-R language model\r\n# Character Mapping Table:\r\nKOI8R_CharToOrderMap = (\r\n255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00\r\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10\r\n253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20\r\n252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30\r\n253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40\r\n155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50\r\n253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60\r\n 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70\r\n191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,  # 80\r\n207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,  # 90\r\n223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237,  # a0\r\n238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,  # b0\r\n 27,  3, 21, 28, 13,  2, 39, 19, 26,  4, 23, 11,  8, 12,  5,  1,  # c0\r\n 15, 16,  9,  7,  6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54,  # d0\r\n 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34,  # e0\r\n 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70,  # f0\r\n)\r\n\r\nwin1251_CharToOrderMap = (\r\n255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00\r\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10\r\n253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20\r\n252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30\r\n253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40\r\n155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50\r\n253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60\r\n 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70\r\n191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,\r\n207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,\r\n223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,\r\n239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253,\r\n 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,\r\n 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,\r\n  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,\r\n  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,\r\n)\r\n\r\nlatin5_CharToOrderMap = (\r\n255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00\r\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10\r\n253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20\r\n252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30\r\n253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40\r\n155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50\r\n253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60\r\n 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70\r\n191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,\r\n207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,\r\n223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,\r\n 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,\r\n 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,\r\n  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,\r\n  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,\r\n239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255,\r\n)\r\n\r\nmacCyrillic_CharToOrderMap = (\r\n255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00\r\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10\r\n253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20\r\n252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30\r\n253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40\r\n155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50\r\n253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60\r\n 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70\r\n 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,\r\n 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,\r\n191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,\r\n207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,\r\n223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,\r\n239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16,\r\n  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,\r\n  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255,\r\n)\r\n\r\nIBM855_CharToOrderMap = (\r\n255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00\r\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10\r\n253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20\r\n252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30\r\n253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40\r\n155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50\r\n253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60\r\n 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70\r\n191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205,\r\n206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70,\r\n  3, 37, 21, 44, 28, 58, 13, 41,  2, 48, 39, 53, 19, 46,218,219,\r\n220,221,222,223,224, 26, 55,  4, 42,225,226,227,228, 23, 60,229,\r\n230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243,\r\n  8, 49, 12, 38,  5, 31,  1, 34, 15,244,245,246,247, 35, 16,248,\r\n 43,  9, 45,  7, 32,  6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249,\r\n250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255,\r\n)\r\n\r\nIBM866_CharToOrderMap = (\r\n255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00\r\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10\r\n253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20\r\n252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30\r\n253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40\r\n155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50\r\n253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60\r\n 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70\r\n 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,\r\n 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,\r\n  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,\r\n191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,\r\n207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,\r\n223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,\r\n  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,\r\n239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255,\r\n)\r\n\r\n# Model Table:\r\n# total sequences: 100%\r\n# first 512 sequences: 97.6601%\r\n# first 1024 sequences: 2.3389%\r\n# rest  sequences:      0.1237%\r\n# negative sequences:   0.0009%\r\nRussianLangModel = (\r\n0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3,\r\n3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2,\r\n3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0,\r\n0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0,\r\n0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1,\r\n0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1,\r\n0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0,\r\n0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,\r\n3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0,\r\n0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,\r\n3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0,\r\n0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,\r\n3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0,\r\n0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0,\r\n0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0,\r\n0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,\r\n3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0,\r\n0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0,\r\n0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0,\r\n0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,\r\n3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0,\r\n0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0,\r\n0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0,\r\n0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0,\r\n0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0,\r\n0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,\r\n3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0,\r\n0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,\r\n2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0,\r\n0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0,\r\n0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0,\r\n0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0,\r\n0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0,\r\n0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,\r\n3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0,\r\n0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1,\r\n1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,\r\n2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1,\r\n1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0,\r\n2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1,\r\n1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0,\r\n3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1,\r\n1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0,\r\n2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2,\r\n1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1,\r\n1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1,\r\n1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,\r\n2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1,\r\n1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0,\r\n3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2,\r\n1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,\r\n2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1,\r\n1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0,\r\n2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0,\r\n0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1,\r\n1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0,\r\n1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1,\r\n1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0,\r\n3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1,\r\n2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1,\r\n3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1,\r\n1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,\r\n1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1,\r\n0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,\r\n2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1,\r\n1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0,\r\n1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,\r\n0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,\r\n1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1,\r\n1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,\r\n2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2,\r\n2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1,\r\n1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0,\r\n1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0,\r\n2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,\r\n0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,\r\n1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,\r\n0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,\r\n2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1,\r\n1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1,\r\n1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,\r\n0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,\r\n0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1,\r\n0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,\r\n1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,\r\n0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,\r\n1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,\r\n0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,\r\n1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1,\r\n0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,\r\n2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,\r\n1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,\r\n2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,\r\n1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,\r\n1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,\r\n1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0,\r\n0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,\r\n)\r\n\r\nKoi8rModel = {\r\n  'charToOrderMap': KOI8R_CharToOrderMap,\r\n  'precedenceMatrix': RussianLangModel,\r\n  'mTypicalPositiveRatio': 0.976601,\r\n  'keepEnglishLetter': False,\r\n  'charsetName': \"KOI8-R\"\r\n}\r\n\r\nWin1251CyrillicModel = {\r\n  'charToOrderMap': win1251_CharToOrderMap,\r\n  'precedenceMatrix': RussianLangModel,\r\n  'mTypicalPositiveRatio': 0.976601,\r\n  'keepEnglishLetter': False,\r\n  'charsetName': \"windows-1251\"\r\n}\r\n\r\nLatin5CyrillicModel = {\r\n  'charToOrderMap': latin5_CharToOrderMap,\r\n  'precedenceMatrix': RussianLangModel,\r\n  'mTypicalPositiveRatio': 0.976601,\r\n  'keepEnglishLetter': False,\r\n  'charsetName': \"ISO-8859-5\"\r\n}\r\n\r\nMacCyrillicModel = {\r\n  'charToOrderMap': macCyrillic_CharToOrderMap,\r\n  'precedenceMatrix': RussianLangModel,\r\n  'mTypicalPositiveRatio': 0.976601,\r\n  'keepEnglishLetter': False,\r\n  'charsetName': \"MacCyrillic\"\r\n};\r\n\r\nIbm866Model = {\r\n  'charToOrderMap': IBM866_CharToOrderMap,\r\n  'precedenceMatrix': RussianLangModel,\r\n  'mTypicalPositiveRatio': 0.976601,\r\n  'keepEnglishLetter': False,\r\n  'charsetName': \"IBM866\"\r\n}\r\n\r\nIbm855Model = {\r\n  'charToOrderMap': IBM855_CharToOrderMap,\r\n  'precedenceMatrix': RussianLangModel,\r\n  'mTypicalPositiveRatio': 0.976601,\r\n  'keepEnglishLetter': False,\r\n  'charsetName': \"IBM855\"\r\n}\r\n\r\n# flake8: noqa\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/langgreekmodel.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is Mozilla Communicator client code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 1998\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n#\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\n# 255: Control characters that usually does not exist in any text\r\n# 254: Carriage/Return\r\n# 253: symbol (punctuation) that does not belong to word\r\n# 252: 0 - 9\r\n\r\n# Character Mapping Table:\r\nLatin7_CharToOrderMap = (\r\n255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00\r\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10\r\n253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20\r\n252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30\r\n253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85,  # 40\r\n 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253,  # 50\r\n253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55,  # 60\r\n 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253,  # 70\r\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 80\r\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 90\r\n253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253,  # a0\r\n253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123,  # b0\r\n110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39,  # c0\r\n 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15,  # d0\r\n124,  1, 29, 20, 21,  3, 32, 13, 25,  5, 11, 16, 10,  6, 30,  4,  # e0\r\n  9,  8, 14,  7,  2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253,  # f0\r\n)\r\n\r\nwin1253_CharToOrderMap = (\r\n255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00\r\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10\r\n253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20\r\n252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30\r\n253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85,  # 40\r\n 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253,  # 50\r\n253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55,  # 60\r\n 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253,  # 70\r\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 80\r\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 90\r\n253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253,  # a0\r\n253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123,  # b0\r\n110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39,  # c0\r\n 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15,  # d0\r\n124,  1, 29, 20, 21,  3, 32, 13, 25,  5, 11, 16, 10,  6, 30,  4,  # e0\r\n  9,  8, 14,  7,  2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253,  # f0\r\n)\r\n\r\n# Model Table:\r\n# total sequences: 100%\r\n# first 512 sequences: 98.2851%\r\n# first 1024 sequences:1.7001%\r\n# rest  sequences:     0.0359%\r\n# negative sequences:  0.0148%\r\nGreekLangModel = (\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0,\r\n3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0,\r\n2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,\r\n0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0,\r\n2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0,\r\n0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0,\r\n2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,\r\n0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0,\r\n2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0,\r\n0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0,\r\n2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0,\r\n0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0,\r\n3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0,\r\n3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0,\r\n2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0,\r\n2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0,\r\n0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0,\r\n0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0,\r\n0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0,\r\n0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2,\r\n0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0,\r\n0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2,\r\n0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0,\r\n0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2,\r\n0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2,\r\n0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,\r\n0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2,\r\n0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0,\r\n0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,\r\n0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0,\r\n0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,\r\n0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,\r\n0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0,\r\n0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2,\r\n0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0,\r\n0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2,\r\n0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0,\r\n0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2,\r\n0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,\r\n0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2,\r\n0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,\r\n0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1,\r\n0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,\r\n0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2,\r\n0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,\r\n0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2,\r\n0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2,\r\n0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,\r\n0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0,\r\n0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,\r\n0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,\r\n0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0,\r\n0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0,\r\n0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n)\r\n\r\nLatin7GreekModel = {\r\n  'charToOrderMap': Latin7_CharToOrderMap,\r\n  'precedenceMatrix': GreekLangModel,\r\n  'mTypicalPositiveRatio': 0.982851,\r\n  'keepEnglishLetter': False,\r\n  'charsetName': \"ISO-8859-7\"\r\n}\r\n\r\nWin1253GreekModel = {\r\n  'charToOrderMap': win1253_CharToOrderMap,\r\n  'precedenceMatrix': GreekLangModel,\r\n  'mTypicalPositiveRatio': 0.982851,\r\n  'keepEnglishLetter': False,\r\n  'charsetName': \"windows-1253\"\r\n}\r\n\r\n# flake8: noqa\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/langhebrewmodel.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is Mozilla Universal charset detector code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n#          Simon Montagu\r\n# Portions created by the Initial Developer are Copyright (C) 2005\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#   Shy Shalom - original C code\r\n#   Shoshannah Forbes - original C code (?)\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n#\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\n# 255: Control characters that usually does not exist in any text\r\n# 254: Carriage/Return\r\n# 253: symbol (punctuation) that does not belong to word\r\n# 252: 0 - 9\r\n\r\n# Windows-1255 language model\r\n# Character Mapping Table:\r\nwin1255_CharToOrderMap = (\r\n255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00\r\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10\r\n253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20\r\n252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30\r\n253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85,  # 40\r\n 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253,  # 50\r\n253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49,  # 60\r\n 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253,  # 70\r\n124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214,\r\n215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221,\r\n 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227,\r\n106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234,\r\n 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237,\r\n238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250,\r\n  9,  8, 20, 16,  3,  2, 24, 14, 22,  1, 25, 15,  4, 11,  6, 23,\r\n 12, 19, 13, 26, 18, 27, 21, 17,  7, 10,  5,251,252,128, 96,253,\r\n)\r\n\r\n# Model Table:\r\n# total sequences: 100%\r\n# first 512 sequences: 98.4004%\r\n# first 1024 sequences: 1.5981%\r\n# rest  sequences:      0.087%\r\n# negative sequences:   0.0015%\r\nHebrewLangModel = (\r\n0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0,\r\n3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1,\r\n3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,\r\n1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,\r\n3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,\r\n1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,\r\n3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3,\r\n1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0,\r\n3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2,\r\n1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,\r\n3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2,\r\n1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,\r\n3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2,\r\n0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,\r\n3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2,\r\n0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,\r\n3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2,\r\n1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,\r\n3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2,\r\n0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0,\r\n3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1,\r\n0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,\r\n3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0,\r\n0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,\r\n0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,\r\n3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2,\r\n0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,\r\n3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2,\r\n0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,\r\n3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2,\r\n0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,\r\n3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2,\r\n0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,\r\n3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2,\r\n0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,\r\n3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1,\r\n0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,\r\n3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2,\r\n0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0,\r\n3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2,\r\n0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,\r\n3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2,\r\n0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,\r\n3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2,\r\n0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,\r\n3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0,\r\n1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2,\r\n0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,\r\n3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0,\r\n0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,\r\n3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3,\r\n0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,\r\n2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0,\r\n0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0,\r\n0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,\r\n0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0,\r\n0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,\r\n0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0,\r\n2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0,\r\n0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1,\r\n0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1,\r\n0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,\r\n0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,\r\n3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0,\r\n0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1,\r\n2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1,\r\n2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1,\r\n1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1,\r\n0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1,\r\n2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1,\r\n1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1,\r\n1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1,\r\n2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1,\r\n1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1,\r\n1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1,\r\n2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1,\r\n2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,\r\n0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1,\r\n1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1,\r\n0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0,\r\n)\r\n\r\nWin1255HebrewModel = {\r\n  'charToOrderMap': win1255_CharToOrderMap,\r\n  'precedenceMatrix': HebrewLangModel,\r\n  'mTypicalPositiveRatio': 0.984004,\r\n  'keepEnglishLetter': False,\r\n  'charsetName': \"windows-1255\"\r\n}\r\n\r\n# flake8: noqa\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/langhungarianmodel.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is Mozilla Communicator client code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 1998\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n#\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\n# 255: Control characters that usually does not exist in any text\r\n# 254: Carriage/Return\r\n# 253: symbol (punctuation) that does not belong to word\r\n# 252: 0 - 9\r\n\r\n# Character Mapping Table:\r\nLatin2_HungarianCharToOrderMap = (\r\n255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00\r\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10\r\n253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20\r\n252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30\r\n253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47,\r\n 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253,\r\n253,  2, 18, 26, 17,  1, 27, 12, 20,  9, 22,  7,  6, 13,  4,  8,\r\n 23, 67, 10,  5,  3, 21, 19, 65, 62, 16, 11,253,253,253,253,253,\r\n159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,\r\n175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,\r\n191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205,\r\n 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,\r\n221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231,\r\n232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241,\r\n 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85,\r\n245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253,\r\n)\r\n\r\nwin1250HungarianCharToOrderMap = (\r\n255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00\r\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10\r\n253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20\r\n252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30\r\n253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47,\r\n 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253,\r\n253,  2, 18, 26, 17,  1, 27, 12, 20,  9, 22,  7,  6, 13,  4,  8,\r\n 23, 67, 10,  5,  3, 21, 19, 65, 62, 16, 11,253,253,253,253,253,\r\n161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,\r\n177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190,\r\n191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205,\r\n 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,\r\n221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231,\r\n232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241,\r\n 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87,\r\n245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253,\r\n)\r\n\r\n# Model Table:\r\n# total sequences: 100%\r\n# first 512 sequences: 94.7368%\r\n# first 1024 sequences:5.2623%\r\n# rest  sequences:     0.8894%\r\n# negative sequences:  0.0009%\r\nHungarianLangModel = (\r\n0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,\r\n3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2,\r\n3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,\r\n3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,\r\n3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3,\r\n0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,\r\n3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2,\r\n0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,\r\n3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3,\r\n0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,\r\n3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2,\r\n0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,\r\n3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1,\r\n0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,\r\n3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,\r\n3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,\r\n3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3,\r\n0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0,\r\n3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2,\r\n0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,\r\n3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2,\r\n0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,\r\n3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2,\r\n0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,\r\n3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2,\r\n0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,\r\n3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2,\r\n0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,\r\n3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2,\r\n0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,\r\n3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1,\r\n0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,\r\n3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2,\r\n0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,\r\n3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,\r\n3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3,\r\n0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,\r\n3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1,\r\n0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,\r\n1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,\r\n2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1,\r\n0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,\r\n3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0,\r\n1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0,\r\n1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0,\r\n1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1,\r\n3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1,\r\n2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1,\r\n2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1,\r\n2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1,\r\n2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0,\r\n2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1,\r\n3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1,\r\n2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1,\r\n2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1,\r\n2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,\r\n1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1,\r\n1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1,\r\n3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0,\r\n1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1,\r\n1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1,\r\n2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1,\r\n2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0,\r\n2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1,\r\n3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1,\r\n2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1,\r\n1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0,\r\n1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0,\r\n2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1,\r\n2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1,\r\n1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0,\r\n1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1,\r\n2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0,\r\n1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0,\r\n1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0,\r\n2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1,\r\n2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1,\r\n2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1,\r\n1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1,\r\n1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1,\r\n1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0,\r\n0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0,\r\n2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1,\r\n2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1,\r\n1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1,\r\n2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,\r\n1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0,\r\n1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0,\r\n2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0,\r\n2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1,\r\n2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0,\r\n1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,\r\n2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0,\r\n0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,\r\n1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,\r\n0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,\r\n1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,\r\n0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,\r\n0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,\r\n2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,\r\n)\r\n\r\nLatin2HungarianModel = {\r\n  'charToOrderMap': Latin2_HungarianCharToOrderMap,\r\n  'precedenceMatrix': HungarianLangModel,\r\n  'mTypicalPositiveRatio': 0.947368,\r\n  'keepEnglishLetter': True,\r\n  'charsetName': \"ISO-8859-2\"\r\n}\r\n\r\nWin1250HungarianModel = {\r\n  'charToOrderMap': win1250HungarianCharToOrderMap,\r\n  'precedenceMatrix': HungarianLangModel,\r\n  'mTypicalPositiveRatio': 0.947368,\r\n  'keepEnglishLetter': True,\r\n  'charsetName': \"windows-1250\"\r\n}\r\n\r\n# flake8: noqa\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/langthaimodel.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is Mozilla Communicator client code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 1998\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n#\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\n# 255: Control characters that usually does not exist in any text\r\n# 254: Carriage/Return\r\n# 253: symbol (punctuation) that does not belong to word\r\n# 252: 0 - 9\r\n\r\n# The following result for thai was collected from a limited sample (1M).\r\n\r\n# Character Mapping Table:\r\nTIS620CharToOrderMap = (\r\n255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00\r\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10\r\n253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20\r\n252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30\r\n253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111,  # 40\r\n188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253,  # 50\r\n253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82,  # 60\r\n 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253,  # 70\r\n209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222,\r\n223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235,\r\n236,  5, 30,237, 24,238, 75,  8, 26, 52, 34, 51,119, 47, 58, 57,\r\n 49, 53, 55, 43, 20, 19, 44, 14, 48,  3, 17, 25, 39, 62, 31, 54,\r\n 45,  9, 16,  2, 61, 15,239, 12, 42, 46, 18, 21, 76,  4, 66, 63,\r\n 22, 10,  1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244,\r\n 11, 28, 41, 29, 33,245, 50, 37,  6,  7, 67, 77, 38, 93,246,247,\r\n 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253,\r\n)\r\n\r\n# Model Table:\r\n# total sequences: 100%\r\n# first 512 sequences: 92.6386%\r\n# first 1024 sequences:7.3177%\r\n# rest  sequences:     1.0230%\r\n# negative sequences:  0.0436%\r\nThaiLangModel = (\r\n0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3,\r\n0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2,\r\n3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3,\r\n0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,\r\n3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2,\r\n3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1,\r\n3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2,\r\n3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1,\r\n3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1,\r\n3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,\r\n3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1,\r\n2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1,\r\n3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1,\r\n0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,\r\n3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1,\r\n0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,\r\n3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2,\r\n1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0,\r\n3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3,\r\n3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0,\r\n1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2,\r\n0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,\r\n2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3,\r\n0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0,\r\n3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1,\r\n2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,\r\n3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2,\r\n0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2,\r\n3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,\r\n3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0,\r\n2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,\r\n3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1,\r\n2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1,\r\n3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1,\r\n3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0,\r\n3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1,\r\n3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,\r\n3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1,\r\n3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1,\r\n1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2,\r\n0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,\r\n3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3,\r\n0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,\r\n3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0,\r\n3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1,\r\n1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0,\r\n3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1,\r\n3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2,\r\n0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,\r\n0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0,\r\n0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0,\r\n1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1,\r\n1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1,\r\n3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1,\r\n0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,\r\n0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0,\r\n0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,\r\n3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0,\r\n3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0,\r\n0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1,\r\n0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0,\r\n0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1,\r\n0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,\r\n0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0,\r\n0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1,\r\n0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,\r\n3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0,\r\n0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0,\r\n0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,\r\n3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1,\r\n2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,\r\n0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0,\r\n3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0,\r\n0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,\r\n2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0,\r\n1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3,\r\n1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0,\r\n1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,\r\n1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,\r\n2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0,\r\n2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,\r\n1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n)\r\n\r\nTIS620ThaiModel = {\r\n  'charToOrderMap': TIS620CharToOrderMap,\r\n  'precedenceMatrix': ThaiLangModel,\r\n  'mTypicalPositiveRatio': 0.926386,\r\n  'keepEnglishLetter': False,\r\n  'charsetName': \"TIS-620\"\r\n}\r\n\r\n# flake8: noqa\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/latin1prober.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is Mozilla Universal charset detector code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 2001\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#   Shy Shalom - original C code\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n#\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\nfrom .charsetprober import CharSetProber\r\nfrom .constants import eNotMe\r\nfrom .compat import wrap_ord\r\n\r\nFREQ_CAT_NUM = 4\r\n\r\nUDF = 0  # undefined\r\nOTH = 1  # other\r\nASC = 2  # ascii capital letter\r\nASS = 3  # ascii small letter\r\nACV = 4  # accent capital vowel\r\nACO = 5  # accent capital other\r\nASV = 6  # accent small vowel\r\nASO = 7  # accent small other\r\nCLASS_NUM = 8  # total classes\r\n\r\nLatin1_CharToClass = (\r\n    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 00 - 07\r\n    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 08 - 0F\r\n    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 10 - 17\r\n    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 18 - 1F\r\n    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 20 - 27\r\n    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 28 - 2F\r\n    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 30 - 37\r\n    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 38 - 3F\r\n    OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 40 - 47\r\n    ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 48 - 4F\r\n    ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 50 - 57\r\n    ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH,   # 58 - 5F\r\n    OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 60 - 67\r\n    ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 68 - 6F\r\n    ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 70 - 77\r\n    ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH,   # 78 - 7F\r\n    OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH,   # 80 - 87\r\n    OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF,   # 88 - 8F\r\n    UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 90 - 97\r\n    OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO,   # 98 - 9F\r\n    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # A0 - A7\r\n    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # A8 - AF\r\n    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # B0 - B7\r\n    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # B8 - BF\r\n    ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO,   # C0 - C7\r\n    ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV,   # C8 - CF\r\n    ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH,   # D0 - D7\r\n    ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO,   # D8 - DF\r\n    ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO,   # E0 - E7\r\n    ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV,   # E8 - EF\r\n    ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH,   # F0 - F7\r\n    ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO,   # F8 - FF\r\n)\r\n\r\n# 0 : illegal\r\n# 1 : very unlikely\r\n# 2 : normal\r\n# 3 : very likely\r\nLatin1ClassModel = (\r\n    # UDF OTH ASC ASS ACV ACO ASV ASO\r\n    0,  0,  0,  0,  0,  0,  0,  0,  # UDF\r\n    0,  3,  3,  3,  3,  3,  3,  3,  # OTH\r\n    0,  3,  3,  3,  3,  3,  3,  3,  # ASC\r\n    0,  3,  3,  3,  1,  1,  3,  3,  # ASS\r\n    0,  3,  3,  3,  1,  2,  1,  2,  # ACV\r\n    0,  3,  3,  3,  3,  3,  3,  3,  # ACO\r\n    0,  3,  1,  3,  1,  1,  1,  3,  # ASV\r\n    0,  3,  1,  3,  1,  1,  3,  3,  # ASO\r\n)\r\n\r\n\r\nclass Latin1Prober(CharSetProber):\r\n    def __init__(self):\r\n        CharSetProber.__init__(self)\r\n        self.reset()\r\n\r\n    def reset(self):\r\n        self._mLastCharClass = OTH\r\n        self._mFreqCounter = [0] * FREQ_CAT_NUM\r\n        CharSetProber.reset(self)\r\n\r\n    def get_charset_name(self):\r\n        return \"windows-1252\"\r\n\r\n    def feed(self, aBuf):\r\n        aBuf = self.filter_with_english_letters(aBuf)\r\n        for c in aBuf:\r\n            charClass = Latin1_CharToClass[wrap_ord(c)]\r\n            freq = Latin1ClassModel[(self._mLastCharClass * CLASS_NUM)\r\n                                    + charClass]\r\n            if freq == 0:\r\n                self._mState = eNotMe\r\n                break\r\n            self._mFreqCounter[freq] += 1\r\n            self._mLastCharClass = charClass\r\n\r\n        return self.get_state()\r\n\r\n    def get_confidence(self):\r\n        if self.get_state() == eNotMe:\r\n            return 0.01\r\n\r\n        total = sum(self._mFreqCounter)\r\n        if total < 0.01:\r\n            confidence = 0.0\r\n        else:\r\n            confidence = ((self._mFreqCounter[3] / total)\r\n                          - (self._mFreqCounter[1] * 20.0 / total))\r\n        if confidence < 0.0:\r\n            confidence = 0.0\r\n        # lower the confidence of latin1 so that other more accurate\r\n        # detector can take priority.\r\n        confidence = confidence * 0.5\r\n        return confidence\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/mbcharsetprober.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is Mozilla Universal charset detector code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 2001\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#   Shy Shalom - original C code\r\n#   Proofpoint, Inc.\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n#\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\nimport sys\r\nfrom . import constants\r\nfrom .charsetprober import CharSetProber\r\n\r\n\r\nclass MultiByteCharSetProber(CharSetProber):\r\n    def __init__(self):\r\n        CharSetProber.__init__(self)\r\n        self._mDistributionAnalyzer = None\r\n        self._mCodingSM = None\r\n        self._mLastChar = [0, 0]\r\n\r\n    def reset(self):\r\n        CharSetProber.reset(self)\r\n        if self._mCodingSM:\r\n            self._mCodingSM.reset()\r\n        if self._mDistributionAnalyzer:\r\n            self._mDistributionAnalyzer.reset()\r\n        self._mLastChar = [0, 0]\r\n\r\n    def get_charset_name(self):\r\n        pass\r\n\r\n    def feed(self, aBuf):\r\n        aLen = len(aBuf)\r\n        for i in range(0, aLen):\r\n            codingState = self._mCodingSM.next_state(aBuf[i])\r\n            if codingState == constants.eError:\r\n                if constants._debug:\r\n                    sys.stderr.write(self.get_charset_name()\r\n                                     + ' prober hit error at byte ' + str(i)\r\n                                     + '\\n')\r\n                self._mState = constants.eNotMe\r\n                break\r\n            elif codingState == constants.eItsMe:\r\n                self._mState = constants.eFoundIt\r\n                break\r\n            elif codingState == constants.eStart:\r\n                charLen = self._mCodingSM.get_current_charlen()\r\n                if i == 0:\r\n                    self._mLastChar[1] = aBuf[0]\r\n                    self._mDistributionAnalyzer.feed(self._mLastChar, charLen)\r\n                else:\r\n                    self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1],\r\n                                                     charLen)\r\n\r\n        self._mLastChar[0] = aBuf[aLen - 1]\r\n\r\n        if self.get_state() == constants.eDetecting:\r\n            if (self._mDistributionAnalyzer.got_enough_data() and\r\n                    (self.get_confidence() > constants.SHORTCUT_THRESHOLD)):\r\n                self._mState = constants.eFoundIt\r\n\r\n        return self.get_state()\r\n\r\n    def get_confidence(self):\r\n        return self._mDistributionAnalyzer.get_confidence()\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/mbcsgroupprober.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is Mozilla Universal charset detector code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 2001\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#   Shy Shalom - original C code\r\n#   Proofpoint, Inc.\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n#\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\nfrom .charsetgroupprober import CharSetGroupProber\r\nfrom .utf8prober import UTF8Prober\r\nfrom .sjisprober import SJISProber\r\nfrom .eucjpprober import EUCJPProber\r\nfrom .gb2312prober import GB2312Prober\r\nfrom .euckrprober import EUCKRProber\r\nfrom .cp949prober import CP949Prober\r\nfrom .big5prober import Big5Prober\r\nfrom .euctwprober import EUCTWProber\r\n\r\n\r\nclass MBCSGroupProber(CharSetGroupProber):\r\n    def __init__(self):\r\n        CharSetGroupProber.__init__(self)\r\n        self._mProbers = [\r\n            UTF8Prober(),\r\n            SJISProber(),\r\n            EUCJPProber(),\r\n            GB2312Prober(),\r\n            EUCKRProber(),\r\n            CP949Prober(),\r\n            Big5Prober(),\r\n            EUCTWProber()\r\n        ]\r\n        self.reset()\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/mbcssm.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is mozilla.org code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 1998\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n#\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\nfrom .constants import eStart, eError, eItsMe\r\n\r\n# BIG5\r\n\r\nBIG5_cls = (\r\n    1,1,1,1,1,1,1,1,  # 00 - 07    #allow 0x00 as legal value\r\n    1,1,1,1,1,1,0,0,  # 08 - 0f\r\n    1,1,1,1,1,1,1,1,  # 10 - 17\r\n    1,1,1,0,1,1,1,1,  # 18 - 1f\r\n    1,1,1,1,1,1,1,1,  # 20 - 27\r\n    1,1,1,1,1,1,1,1,  # 28 - 2f\r\n    1,1,1,1,1,1,1,1,  # 30 - 37\r\n    1,1,1,1,1,1,1,1,  # 38 - 3f\r\n    2,2,2,2,2,2,2,2,  # 40 - 47\r\n    2,2,2,2,2,2,2,2,  # 48 - 4f\r\n    2,2,2,2,2,2,2,2,  # 50 - 57\r\n    2,2,2,2,2,2,2,2,  # 58 - 5f\r\n    2,2,2,2,2,2,2,2,  # 60 - 67\r\n    2,2,2,2,2,2,2,2,  # 68 - 6f\r\n    2,2,2,2,2,2,2,2,  # 70 - 77\r\n    2,2,2,2,2,2,2,1,  # 78 - 7f\r\n    4,4,4,4,4,4,4,4,  # 80 - 87\r\n    4,4,4,4,4,4,4,4,  # 88 - 8f\r\n    4,4,4,4,4,4,4,4,  # 90 - 97\r\n    4,4,4,4,4,4,4,4,  # 98 - 9f\r\n    4,3,3,3,3,3,3,3,  # a0 - a7\r\n    3,3,3,3,3,3,3,3,  # a8 - af\r\n    3,3,3,3,3,3,3,3,  # b0 - b7\r\n    3,3,3,3,3,3,3,3,  # b8 - bf\r\n    3,3,3,3,3,3,3,3,  # c0 - c7\r\n    3,3,3,3,3,3,3,3,  # c8 - cf\r\n    3,3,3,3,3,3,3,3,  # d0 - d7\r\n    3,3,3,3,3,3,3,3,  # d8 - df\r\n    3,3,3,3,3,3,3,3,  # e0 - e7\r\n    3,3,3,3,3,3,3,3,  # e8 - ef\r\n    3,3,3,3,3,3,3,3,  # f0 - f7\r\n    3,3,3,3,3,3,3,0  # f8 - ff\r\n)\r\n\r\nBIG5_st = (\r\n    eError,eStart,eStart,     3,eError,eError,eError,eError,#00-07\r\n    eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,#08-0f\r\n    eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart#10-17\r\n)\r\n\r\nBig5CharLenTable = (0, 1, 1, 2, 0)\r\n\r\nBig5SMModel = {'classTable': BIG5_cls,\r\n               'classFactor': 5,\r\n               'stateTable': BIG5_st,\r\n               'charLenTable': Big5CharLenTable,\r\n               'name': 'Big5'}\r\n\r\n# CP949\r\n\r\nCP949_cls  = (\r\n    1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,  # 00 - 0f\r\n    1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1,  # 10 - 1f\r\n    1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,  # 20 - 2f\r\n    1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,  # 30 - 3f\r\n    1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,  # 40 - 4f\r\n    4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1,  # 50 - 5f\r\n    1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,  # 60 - 6f\r\n    5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1,  # 70 - 7f\r\n    0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,  # 80 - 8f\r\n    6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,  # 90 - 9f\r\n    6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8,  # a0 - af\r\n    7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,  # b0 - bf\r\n    7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2,  # c0 - cf\r\n    2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,  # d0 - df\r\n    2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,  # e0 - ef\r\n    2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0,  # f0 - ff\r\n)\r\n\r\nCP949_st = (\r\n#cls=    0      1      2      3      4      5      6      7      8      9  # previous state =\r\n    eError,eStart,     3,eError,eStart,eStart,     4,     5,eError,     6, # eStart\r\n    eError,eError,eError,eError,eError,eError,eError,eError,eError,eError, # eError\r\n    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe, # eItsMe\r\n    eError,eError,eStart,eStart,eError,eError,eError,eStart,eStart,eStart, # 3\r\n    eError,eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart, # 4\r\n    eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart, # 5\r\n    eError,eStart,eStart,eStart,eStart,eError,eError,eStart,eStart,eStart, # 6\r\n)\r\n\r\nCP949CharLenTable = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2)\r\n\r\nCP949SMModel = {'classTable': CP949_cls,\r\n                'classFactor': 10,\r\n                'stateTable': CP949_st,\r\n                'charLenTable': CP949CharLenTable,\r\n                'name': 'CP949'}\r\n\r\n# EUC-JP\r\n\r\nEUCJP_cls = (\r\n    4,4,4,4,4,4,4,4,  # 00 - 07\r\n    4,4,4,4,4,4,5,5,  # 08 - 0f\r\n    4,4,4,4,4,4,4,4,  # 10 - 17\r\n    4,4,4,5,4,4,4,4,  # 18 - 1f\r\n    4,4,4,4,4,4,4,4,  # 20 - 27\r\n    4,4,4,4,4,4,4,4,  # 28 - 2f\r\n    4,4,4,4,4,4,4,4,  # 30 - 37\r\n    4,4,4,4,4,4,4,4,  # 38 - 3f\r\n    4,4,4,4,4,4,4,4,  # 40 - 47\r\n    4,4,4,4,4,4,4,4,  # 48 - 4f\r\n    4,4,4,4,4,4,4,4,  # 50 - 57\r\n    4,4,4,4,4,4,4,4,  # 58 - 5f\r\n    4,4,4,4,4,4,4,4,  # 60 - 67\r\n    4,4,4,4,4,4,4,4,  # 68 - 6f\r\n    4,4,4,4,4,4,4,4,  # 70 - 77\r\n    4,4,4,4,4,4,4,4,  # 78 - 7f\r\n    5,5,5,5,5,5,5,5,  # 80 - 87\r\n    5,5,5,5,5,5,1,3,  # 88 - 8f\r\n    5,5,5,5,5,5,5,5,  # 90 - 97\r\n    5,5,5,5,5,5,5,5,  # 98 - 9f\r\n    5,2,2,2,2,2,2,2,  # a0 - a7\r\n    2,2,2,2,2,2,2,2,  # a8 - af\r\n    2,2,2,2,2,2,2,2,  # b0 - b7\r\n    2,2,2,2,2,2,2,2,  # b8 - bf\r\n    2,2,2,2,2,2,2,2,  # c0 - c7\r\n    2,2,2,2,2,2,2,2,  # c8 - cf\r\n    2,2,2,2,2,2,2,2,  # d0 - d7\r\n    2,2,2,2,2,2,2,2,  # d8 - df\r\n    0,0,0,0,0,0,0,0,  # e0 - e7\r\n    0,0,0,0,0,0,0,0,  # e8 - ef\r\n    0,0,0,0,0,0,0,0,  # f0 - f7\r\n    0,0,0,0,0,0,0,5  # f8 - ff\r\n)\r\n\r\nEUCJP_st = (\r\n          3,     4,     3,     5,eStart,eError,eError,eError,#00-07\r\n     eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f\r\n     eItsMe,eItsMe,eStart,eError,eStart,eError,eError,eError,#10-17\r\n     eError,eError,eStart,eError,eError,eError,     3,eError,#18-1f\r\n          3,eError,eError,eError,eStart,eStart,eStart,eStart#20-27\r\n)\r\n\r\nEUCJPCharLenTable = (2, 2, 2, 3, 1, 0)\r\n\r\nEUCJPSMModel = {'classTable': EUCJP_cls,\r\n                'classFactor': 6,\r\n                'stateTable': EUCJP_st,\r\n                'charLenTable': EUCJPCharLenTable,\r\n                'name': 'EUC-JP'}\r\n\r\n# EUC-KR\r\n\r\nEUCKR_cls  = (\r\n    1,1,1,1,1,1,1,1,  # 00 - 07\r\n    1,1,1,1,1,1,0,0,  # 08 - 0f\r\n    1,1,1,1,1,1,1,1,  # 10 - 17\r\n    1,1,1,0,1,1,1,1,  # 18 - 1f\r\n    1,1,1,1,1,1,1,1,  # 20 - 27\r\n    1,1,1,1,1,1,1,1,  # 28 - 2f\r\n    1,1,1,1,1,1,1,1,  # 30 - 37\r\n    1,1,1,1,1,1,1,1,  # 38 - 3f\r\n    1,1,1,1,1,1,1,1,  # 40 - 47\r\n    1,1,1,1,1,1,1,1,  # 48 - 4f\r\n    1,1,1,1,1,1,1,1,  # 50 - 57\r\n    1,1,1,1,1,1,1,1,  # 58 - 5f\r\n    1,1,1,1,1,1,1,1,  # 60 - 67\r\n    1,1,1,1,1,1,1,1,  # 68 - 6f\r\n    1,1,1,1,1,1,1,1,  # 70 - 77\r\n    1,1,1,1,1,1,1,1,  # 78 - 7f\r\n    0,0,0,0,0,0,0,0,  # 80 - 87\r\n    0,0,0,0,0,0,0,0,  # 88 - 8f\r\n    0,0,0,0,0,0,0,0,  # 90 - 97\r\n    0,0,0,0,0,0,0,0,  # 98 - 9f\r\n    0,2,2,2,2,2,2,2,  # a0 - a7\r\n    2,2,2,2,2,3,3,3,  # a8 - af\r\n    2,2,2,2,2,2,2,2,  # b0 - b7\r\n    2,2,2,2,2,2,2,2,  # b8 - bf\r\n    2,2,2,2,2,2,2,2,  # c0 - c7\r\n    2,3,2,2,2,2,2,2,  # c8 - cf\r\n    2,2,2,2,2,2,2,2,  # d0 - d7\r\n    2,2,2,2,2,2,2,2,  # d8 - df\r\n    2,2,2,2,2,2,2,2,  # e0 - e7\r\n    2,2,2,2,2,2,2,2,  # e8 - ef\r\n    2,2,2,2,2,2,2,2,  # f0 - f7\r\n    2,2,2,2,2,2,2,0   # f8 - ff\r\n)\r\n\r\nEUCKR_st = (\r\n    eError,eStart,     3,eError,eError,eError,eError,eError,#00-07\r\n    eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart #08-0f\r\n)\r\n\r\nEUCKRCharLenTable = (0, 1, 2, 0)\r\n\r\nEUCKRSMModel = {'classTable': EUCKR_cls,\r\n                'classFactor': 4,\r\n                'stateTable': EUCKR_st,\r\n                'charLenTable': EUCKRCharLenTable,\r\n                'name': 'EUC-KR'}\r\n\r\n# EUC-TW\r\n\r\nEUCTW_cls = (\r\n    2,2,2,2,2,2,2,2,  # 00 - 07\r\n    2,2,2,2,2,2,0,0,  # 08 - 0f\r\n    2,2,2,2,2,2,2,2,  # 10 - 17\r\n    2,2,2,0,2,2,2,2,  # 18 - 1f\r\n    2,2,2,2,2,2,2,2,  # 20 - 27\r\n    2,2,2,2,2,2,2,2,  # 28 - 2f\r\n    2,2,2,2,2,2,2,2,  # 30 - 37\r\n    2,2,2,2,2,2,2,2,  # 38 - 3f\r\n    2,2,2,2,2,2,2,2,  # 40 - 47\r\n    2,2,2,2,2,2,2,2,  # 48 - 4f\r\n    2,2,2,2,2,2,2,2,  # 50 - 57\r\n    2,2,2,2,2,2,2,2,  # 58 - 5f\r\n    2,2,2,2,2,2,2,2,  # 60 - 67\r\n    2,2,2,2,2,2,2,2,  # 68 - 6f\r\n    2,2,2,2,2,2,2,2,  # 70 - 77\r\n    2,2,2,2,2,2,2,2,  # 78 - 7f\r\n    0,0,0,0,0,0,0,0,  # 80 - 87\r\n    0,0,0,0,0,0,6,0,  # 88 - 8f\r\n    0,0,0,0,0,0,0,0,  # 90 - 97\r\n    0,0,0,0,0,0,0,0,  # 98 - 9f\r\n    0,3,4,4,4,4,4,4,  # a0 - a7\r\n    5,5,1,1,1,1,1,1,  # a8 - af\r\n    1,1,1,1,1,1,1,1,  # b0 - b7\r\n    1,1,1,1,1,1,1,1,  # b8 - bf\r\n    1,1,3,1,3,3,3,3,  # c0 - c7\r\n    3,3,3,3,3,3,3,3,  # c8 - cf\r\n    3,3,3,3,3,3,3,3,  # d0 - d7\r\n    3,3,3,3,3,3,3,3,  # d8 - df\r\n    3,3,3,3,3,3,3,3,  # e0 - e7\r\n    3,3,3,3,3,3,3,3,  # e8 - ef\r\n    3,3,3,3,3,3,3,3,  # f0 - f7\r\n    3,3,3,3,3,3,3,0   # f8 - ff\r\n)\r\n\r\nEUCTW_st = (\r\n    eError,eError,eStart,     3,     3,     3,     4,eError,#00-07\r\n    eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f\r\n    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eStart,eError,#10-17\r\n    eStart,eStart,eStart,eError,eError,eError,eError,eError,#18-1f\r\n         5,eError,eError,eError,eStart,eError,eStart,eStart,#20-27\r\n    eStart,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f\r\n)\r\n\r\nEUCTWCharLenTable = (0, 0, 1, 2, 2, 2, 3)\r\n\r\nEUCTWSMModel = {'classTable': EUCTW_cls,\r\n                'classFactor': 7,\r\n                'stateTable': EUCTW_st,\r\n                'charLenTable': EUCTWCharLenTable,\r\n                'name': 'x-euc-tw'}\r\n\r\n# GB2312\r\n\r\nGB2312_cls = (\r\n    1,1,1,1,1,1,1,1,  # 00 - 07\r\n    1,1,1,1,1,1,0,0,  # 08 - 0f\r\n    1,1,1,1,1,1,1,1,  # 10 - 17\r\n    1,1,1,0,1,1,1,1,  # 18 - 1f\r\n    1,1,1,1,1,1,1,1,  # 20 - 27\r\n    1,1,1,1,1,1,1,1,  # 28 - 2f\r\n    3,3,3,3,3,3,3,3,  # 30 - 37\r\n    3,3,1,1,1,1,1,1,  # 38 - 3f\r\n    2,2,2,2,2,2,2,2,  # 40 - 47\r\n    2,2,2,2,2,2,2,2,  # 48 - 4f\r\n    2,2,2,2,2,2,2,2,  # 50 - 57\r\n    2,2,2,2,2,2,2,2,  # 58 - 5f\r\n    2,2,2,2,2,2,2,2,  # 60 - 67\r\n    2,2,2,2,2,2,2,2,  # 68 - 6f\r\n    2,2,2,2,2,2,2,2,  # 70 - 77\r\n    2,2,2,2,2,2,2,4,  # 78 - 7f\r\n    5,6,6,6,6,6,6,6,  # 80 - 87\r\n    6,6,6,6,6,6,6,6,  # 88 - 8f\r\n    6,6,6,6,6,6,6,6,  # 90 - 97\r\n    6,6,6,6,6,6,6,6,  # 98 - 9f\r\n    6,6,6,6,6,6,6,6,  # a0 - a7\r\n    6,6,6,6,6,6,6,6,  # a8 - af\r\n    6,6,6,6,6,6,6,6,  # b0 - b7\r\n    6,6,6,6,6,6,6,6,  # b8 - bf\r\n    6,6,6,6,6,6,6,6,  # c0 - c7\r\n    6,6,6,6,6,6,6,6,  # c8 - cf\r\n    6,6,6,6,6,6,6,6,  # d0 - d7\r\n    6,6,6,6,6,6,6,6,  # d8 - df\r\n    6,6,6,6,6,6,6,6,  # e0 - e7\r\n    6,6,6,6,6,6,6,6,  # e8 - ef\r\n    6,6,6,6,6,6,6,6,  # f0 - f7\r\n    6,6,6,6,6,6,6,0   # f8 - ff\r\n)\r\n\r\nGB2312_st = (\r\n    eError,eStart,eStart,eStart,eStart,eStart,     3,eError,#00-07\r\n    eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f\r\n    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,#10-17\r\n         4,eError,eStart,eStart,eError,eError,eError,eError,#18-1f\r\n    eError,eError,     5,eError,eError,eError,eItsMe,eError,#20-27\r\n    eError,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f\r\n)\r\n\r\n# To be accurate, the length of class 6 can be either 2 or 4.\r\n# But it is not necessary to discriminate between the two since\r\n# it is used for frequency analysis only, and we are validing\r\n# each code range there as well. So it is safe to set it to be\r\n# 2 here.\r\nGB2312CharLenTable = (0, 1, 1, 1, 1, 1, 2)\r\n\r\nGB2312SMModel = {'classTable': GB2312_cls,\r\n                  'classFactor': 7,\r\n                  'stateTable': GB2312_st,\r\n                  'charLenTable': GB2312CharLenTable,\r\n                  'name': 'GB2312'}\r\n\r\n# Shift_JIS\r\n\r\nSJIS_cls = (\r\n    1,1,1,1,1,1,1,1,  # 00 - 07\r\n    1,1,1,1,1,1,0,0,  # 08 - 0f\r\n    1,1,1,1,1,1,1,1,  # 10 - 17\r\n    1,1,1,0,1,1,1,1,  # 18 - 1f\r\n    1,1,1,1,1,1,1,1,  # 20 - 27\r\n    1,1,1,1,1,1,1,1,  # 28 - 2f\r\n    1,1,1,1,1,1,1,1,  # 30 - 37\r\n    1,1,1,1,1,1,1,1,  # 38 - 3f\r\n    2,2,2,2,2,2,2,2,  # 40 - 47\r\n    2,2,2,2,2,2,2,2,  # 48 - 4f\r\n    2,2,2,2,2,2,2,2,  # 50 - 57\r\n    2,2,2,2,2,2,2,2,  # 58 - 5f\r\n    2,2,2,2,2,2,2,2,  # 60 - 67\r\n    2,2,2,2,2,2,2,2,  # 68 - 6f\r\n    2,2,2,2,2,2,2,2,  # 70 - 77\r\n    2,2,2,2,2,2,2,1,  # 78 - 7f\r\n    3,3,3,3,3,3,3,3,  # 80 - 87\r\n    3,3,3,3,3,3,3,3,  # 88 - 8f\r\n    3,3,3,3,3,3,3,3,  # 90 - 97\r\n    3,3,3,3,3,3,3,3,  # 98 - 9f\r\n    #0xa0 is illegal in sjis encoding, but some pages does\r\n    #contain such byte. We need to be more error forgiven.\r\n    2,2,2,2,2,2,2,2,  # a0 - a7\r\n    2,2,2,2,2,2,2,2,  # a8 - af\r\n    2,2,2,2,2,2,2,2,  # b0 - b7\r\n    2,2,2,2,2,2,2,2,  # b8 - bf\r\n    2,2,2,2,2,2,2,2,  # c0 - c7\r\n    2,2,2,2,2,2,2,2,  # c8 - cf\r\n    2,2,2,2,2,2,2,2,  # d0 - d7\r\n    2,2,2,2,2,2,2,2,  # d8 - df\r\n    3,3,3,3,3,3,3,3,  # e0 - e7\r\n    3,3,3,3,3,4,4,4,  # e8 - ef\r\n    4,4,4,4,4,4,4,4,  # f0 - f7\r\n    4,4,4,4,4,0,0,0   # f8 - ff\r\n)\r\n\r\n\r\nSJIS_st = (\r\n    eError,eStart,eStart,     3,eError,eError,eError,eError,#00-07\r\n    eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f\r\n    eItsMe,eItsMe,eError,eError,eStart,eStart,eStart,eStart #10-17\r\n)\r\n\r\nSJISCharLenTable = (0, 1, 1, 2, 0, 0)\r\n\r\nSJISSMModel = {'classTable': SJIS_cls,\r\n               'classFactor': 6,\r\n               'stateTable': SJIS_st,\r\n               'charLenTable': SJISCharLenTable,\r\n               'name': 'Shift_JIS'}\r\n\r\n# UCS2-BE\r\n\r\nUCS2BE_cls = (\r\n    0,0,0,0,0,0,0,0,  # 00 - 07\r\n    0,0,1,0,0,2,0,0,  # 08 - 0f\r\n    0,0,0,0,0,0,0,0,  # 10 - 17\r\n    0,0,0,3,0,0,0,0,  # 18 - 1f\r\n    0,0,0,0,0,0,0,0,  # 20 - 27\r\n    0,3,3,3,3,3,0,0,  # 28 - 2f\r\n    0,0,0,0,0,0,0,0,  # 30 - 37\r\n    0,0,0,0,0,0,0,0,  # 38 - 3f\r\n    0,0,0,0,0,0,0,0,  # 40 - 47\r\n    0,0,0,0,0,0,0,0,  # 48 - 4f\r\n    0,0,0,0,0,0,0,0,  # 50 - 57\r\n    0,0,0,0,0,0,0,0,  # 58 - 5f\r\n    0,0,0,0,0,0,0,0,  # 60 - 67\r\n    0,0,0,0,0,0,0,0,  # 68 - 6f\r\n    0,0,0,0,0,0,0,0,  # 70 - 77\r\n    0,0,0,0,0,0,0,0,  # 78 - 7f\r\n    0,0,0,0,0,0,0,0,  # 80 - 87\r\n    0,0,0,0,0,0,0,0,  # 88 - 8f\r\n    0,0,0,0,0,0,0,0,  # 90 - 97\r\n    0,0,0,0,0,0,0,0,  # 98 - 9f\r\n    0,0,0,0,0,0,0,0,  # a0 - a7\r\n    0,0,0,0,0,0,0,0,  # a8 - af\r\n    0,0,0,0,0,0,0,0,  # b0 - b7\r\n    0,0,0,0,0,0,0,0,  # b8 - bf\r\n    0,0,0,0,0,0,0,0,  # c0 - c7\r\n    0,0,0,0,0,0,0,0,  # c8 - cf\r\n    0,0,0,0,0,0,0,0,  # d0 - d7\r\n    0,0,0,0,0,0,0,0,  # d8 - df\r\n    0,0,0,0,0,0,0,0,  # e0 - e7\r\n    0,0,0,0,0,0,0,0,  # e8 - ef\r\n    0,0,0,0,0,0,0,0,  # f0 - f7\r\n    0,0,0,0,0,0,4,5   # f8 - ff\r\n)\r\n\r\nUCS2BE_st  = (\r\n          5,     7,     7,eError,     4,     3,eError,eError,#00-07\r\n     eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f\r\n     eItsMe,eItsMe,     6,     6,     6,     6,eError,eError,#10-17\r\n          6,     6,     6,     6,     6,eItsMe,     6,     6,#18-1f\r\n          6,     6,     6,     6,     5,     7,     7,eError,#20-27\r\n          5,     8,     6,     6,eError,     6,     6,     6,#28-2f\r\n          6,     6,     6,     6,eError,eError,eStart,eStart #30-37\r\n)\r\n\r\nUCS2BECharLenTable = (2, 2, 2, 0, 2, 2)\r\n\r\nUCS2BESMModel = {'classTable': UCS2BE_cls,\r\n                 'classFactor': 6,\r\n                 'stateTable': UCS2BE_st,\r\n                 'charLenTable': UCS2BECharLenTable,\r\n                 'name': 'UTF-16BE'}\r\n\r\n# UCS2-LE\r\n\r\nUCS2LE_cls = (\r\n    0,0,0,0,0,0,0,0,  # 00 - 07\r\n    0,0,1,0,0,2,0,0,  # 08 - 0f\r\n    0,0,0,0,0,0,0,0,  # 10 - 17\r\n    0,0,0,3,0,0,0,0,  # 18 - 1f\r\n    0,0,0,0,0,0,0,0,  # 20 - 27\r\n    0,3,3,3,3,3,0,0,  # 28 - 2f\r\n    0,0,0,0,0,0,0,0,  # 30 - 37\r\n    0,0,0,0,0,0,0,0,  # 38 - 3f\r\n    0,0,0,0,0,0,0,0,  # 40 - 47\r\n    0,0,0,0,0,0,0,0,  # 48 - 4f\r\n    0,0,0,0,0,0,0,0,  # 50 - 57\r\n    0,0,0,0,0,0,0,0,  # 58 - 5f\r\n    0,0,0,0,0,0,0,0,  # 60 - 67\r\n    0,0,0,0,0,0,0,0,  # 68 - 6f\r\n    0,0,0,0,0,0,0,0,  # 70 - 77\r\n    0,0,0,0,0,0,0,0,  # 78 - 7f\r\n    0,0,0,0,0,0,0,0,  # 80 - 87\r\n    0,0,0,0,0,0,0,0,  # 88 - 8f\r\n    0,0,0,0,0,0,0,0,  # 90 - 97\r\n    0,0,0,0,0,0,0,0,  # 98 - 9f\r\n    0,0,0,0,0,0,0,0,  # a0 - a7\r\n    0,0,0,0,0,0,0,0,  # a8 - af\r\n    0,0,0,0,0,0,0,0,  # b0 - b7\r\n    0,0,0,0,0,0,0,0,  # b8 - bf\r\n    0,0,0,0,0,0,0,0,  # c0 - c7\r\n    0,0,0,0,0,0,0,0,  # c8 - cf\r\n    0,0,0,0,0,0,0,0,  # d0 - d7\r\n    0,0,0,0,0,0,0,0,  # d8 - df\r\n    0,0,0,0,0,0,0,0,  # e0 - e7\r\n    0,0,0,0,0,0,0,0,  # e8 - ef\r\n    0,0,0,0,0,0,0,0,  # f0 - f7\r\n    0,0,0,0,0,0,4,5   # f8 - ff\r\n)\r\n\r\nUCS2LE_st = (\r\n          6,     6,     7,     6,     4,     3,eError,eError,#00-07\r\n     eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f\r\n     eItsMe,eItsMe,     5,     5,     5,eError,eItsMe,eError,#10-17\r\n          5,     5,     5,eError,     5,eError,     6,     6,#18-1f\r\n          7,     6,     8,     8,     5,     5,     5,eError,#20-27\r\n          5,     5,     5,eError,eError,eError,     5,     5,#28-2f\r\n          5,     5,     5,eError,     5,eError,eStart,eStart #30-37\r\n)\r\n\r\nUCS2LECharLenTable = (2, 2, 2, 2, 2, 2)\r\n\r\nUCS2LESMModel = {'classTable': UCS2LE_cls,\r\n                 'classFactor': 6,\r\n                 'stateTable': UCS2LE_st,\r\n                 'charLenTable': UCS2LECharLenTable,\r\n                 'name': 'UTF-16LE'}\r\n\r\n# UTF-8\r\n\r\nUTF8_cls = (\r\n    1,1,1,1,1,1,1,1,  # 00 - 07  #allow 0x00 as a legal value\r\n    1,1,1,1,1,1,0,0,  # 08 - 0f\r\n    1,1,1,1,1,1,1,1,  # 10 - 17\r\n    1,1,1,0,1,1,1,1,  # 18 - 1f\r\n    1,1,1,1,1,1,1,1,  # 20 - 27\r\n    1,1,1,1,1,1,1,1,  # 28 - 2f\r\n    1,1,1,1,1,1,1,1,  # 30 - 37\r\n    1,1,1,1,1,1,1,1,  # 38 - 3f\r\n    1,1,1,1,1,1,1,1,  # 40 - 47\r\n    1,1,1,1,1,1,1,1,  # 48 - 4f\r\n    1,1,1,1,1,1,1,1,  # 50 - 57\r\n    1,1,1,1,1,1,1,1,  # 58 - 5f\r\n    1,1,1,1,1,1,1,1,  # 60 - 67\r\n    1,1,1,1,1,1,1,1,  # 68 - 6f\r\n    1,1,1,1,1,1,1,1,  # 70 - 77\r\n    1,1,1,1,1,1,1,1,  # 78 - 7f\r\n    2,2,2,2,3,3,3,3,  # 80 - 87\r\n    4,4,4,4,4,4,4,4,  # 88 - 8f\r\n    4,4,4,4,4,4,4,4,  # 90 - 97\r\n    4,4,4,4,4,4,4,4,  # 98 - 9f\r\n    5,5,5,5,5,5,5,5,  # a0 - a7\r\n    5,5,5,5,5,5,5,5,  # a8 - af\r\n    5,5,5,5,5,5,5,5,  # b0 - b7\r\n    5,5,5,5,5,5,5,5,  # b8 - bf\r\n    0,0,6,6,6,6,6,6,  # c0 - c7\r\n    6,6,6,6,6,6,6,6,  # c8 - cf\r\n    6,6,6,6,6,6,6,6,  # d0 - d7\r\n    6,6,6,6,6,6,6,6,  # d8 - df\r\n    7,8,8,8,8,8,8,8,  # e0 - e7\r\n    8,8,8,8,8,9,8,8,  # e8 - ef\r\n    10,11,11,11,11,11,11,11,  # f0 - f7\r\n    12,13,13,13,14,15,0,0    # f8 - ff\r\n)\r\n\r\nUTF8_st = (\r\n    eError,eStart,eError,eError,eError,eError,     12,   10,#00-07\r\n         9,     11,     8,     7,     6,     5,     4,    3,#08-0f\r\n    eError,eError,eError,eError,eError,eError,eError,eError,#10-17\r\n    eError,eError,eError,eError,eError,eError,eError,eError,#18-1f\r\n    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#20-27\r\n    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#28-2f\r\n    eError,eError,     5,     5,     5,     5,eError,eError,#30-37\r\n    eError,eError,eError,eError,eError,eError,eError,eError,#38-3f\r\n    eError,eError,eError,     5,     5,     5,eError,eError,#40-47\r\n    eError,eError,eError,eError,eError,eError,eError,eError,#48-4f\r\n    eError,eError,     7,     7,     7,     7,eError,eError,#50-57\r\n    eError,eError,eError,eError,eError,eError,eError,eError,#58-5f\r\n    eError,eError,eError,eError,     7,     7,eError,eError,#60-67\r\n    eError,eError,eError,eError,eError,eError,eError,eError,#68-6f\r\n    eError,eError,     9,     9,     9,     9,eError,eError,#70-77\r\n    eError,eError,eError,eError,eError,eError,eError,eError,#78-7f\r\n    eError,eError,eError,eError,eError,     9,eError,eError,#80-87\r\n    eError,eError,eError,eError,eError,eError,eError,eError,#88-8f\r\n    eError,eError,    12,    12,    12,    12,eError,eError,#90-97\r\n    eError,eError,eError,eError,eError,eError,eError,eError,#98-9f\r\n    eError,eError,eError,eError,eError,    12,eError,eError,#a0-a7\r\n    eError,eError,eError,eError,eError,eError,eError,eError,#a8-af\r\n    eError,eError,    12,    12,    12,eError,eError,eError,#b0-b7\r\n    eError,eError,eError,eError,eError,eError,eError,eError,#b8-bf\r\n    eError,eError,eStart,eStart,eStart,eStart,eError,eError,#c0-c7\r\n    eError,eError,eError,eError,eError,eError,eError,eError #c8-cf\r\n)\r\n\r\nUTF8CharLenTable = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6)\r\n\r\nUTF8SMModel = {'classTable': UTF8_cls,\r\n               'classFactor': 16,\r\n               'stateTable': UTF8_st,\r\n               'charLenTable': UTF8CharLenTable,\r\n               'name': 'UTF-8'}\r\n\r\n# flake8: noqa\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/sbcharsetprober.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is Mozilla Universal charset detector code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 2001\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#   Shy Shalom - original C code\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n#\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\nimport sys\r\nfrom . import constants\r\nfrom .charsetprober import CharSetProber\r\nfrom .compat import wrap_ord\r\n\r\nSAMPLE_SIZE = 64\r\nSB_ENOUGH_REL_THRESHOLD = 1024\r\nPOSITIVE_SHORTCUT_THRESHOLD = 0.95\r\nNEGATIVE_SHORTCUT_THRESHOLD = 0.05\r\nSYMBOL_CAT_ORDER = 250\r\nNUMBER_OF_SEQ_CAT = 4\r\nPOSITIVE_CAT = NUMBER_OF_SEQ_CAT - 1\r\n#NEGATIVE_CAT = 0\r\n\r\n\r\nclass SingleByteCharSetProber(CharSetProber):\r\n    def __init__(self, model, reversed=False, nameProber=None):\r\n        CharSetProber.__init__(self)\r\n        self._mModel = model\r\n        # TRUE if we need to reverse every pair in the model lookup\r\n        self._mReversed = reversed\r\n        # Optional auxiliary prober for name decision\r\n        self._mNameProber = nameProber\r\n        self.reset()\r\n\r\n    def reset(self):\r\n        CharSetProber.reset(self)\r\n        # char order of last character\r\n        self._mLastOrder = 255\r\n        self._mSeqCounters = [0] * NUMBER_OF_SEQ_CAT\r\n        self._mTotalSeqs = 0\r\n        self._mTotalChar = 0\r\n        # characters that fall in our sampling range\r\n        self._mFreqChar = 0\r\n\r\n    def get_charset_name(self):\r\n        if self._mNameProber:\r\n            return self._mNameProber.get_charset_name()\r\n        else:\r\n            return self._mModel['charsetName']\r\n\r\n    def feed(self, aBuf):\r\n        if not self._mModel['keepEnglishLetter']:\r\n            aBuf = self.filter_without_english_letters(aBuf)\r\n        aLen = len(aBuf)\r\n        if not aLen:\r\n            return self.get_state()\r\n        for c in aBuf:\r\n            order = self._mModel['charToOrderMap'][wrap_ord(c)]\r\n            if order < SYMBOL_CAT_ORDER:\r\n                self._mTotalChar += 1\r\n            if order < SAMPLE_SIZE:\r\n                self._mFreqChar += 1\r\n                if self._mLastOrder < SAMPLE_SIZE:\r\n                    self._mTotalSeqs += 1\r\n                    if not self._mReversed:\r\n                        i = (self._mLastOrder * SAMPLE_SIZE) + order\r\n                        model = self._mModel['precedenceMatrix'][i]\r\n                    else:  # reverse the order of the letters in the lookup\r\n                        i = (order * SAMPLE_SIZE) + self._mLastOrder\r\n                        model = self._mModel['precedenceMatrix'][i]\r\n                    self._mSeqCounters[model] += 1\r\n            self._mLastOrder = order\r\n\r\n        if self.get_state() == constants.eDetecting:\r\n            if self._mTotalSeqs > SB_ENOUGH_REL_THRESHOLD:\r\n                cf = self.get_confidence()\r\n                if cf > POSITIVE_SHORTCUT_THRESHOLD:\r\n                    if constants._debug:\r\n                        sys.stderr.write('%s confidence = %s, we have a'\r\n                                         'winner\\n' %\r\n                                         (self._mModel['charsetName'], cf))\r\n                    self._mState = constants.eFoundIt\r\n                elif cf < NEGATIVE_SHORTCUT_THRESHOLD:\r\n                    if constants._debug:\r\n                        sys.stderr.write('%s confidence = %s, below negative'\r\n                                         'shortcut threshhold %s\\n' %\r\n                                         (self._mModel['charsetName'], cf,\r\n                                          NEGATIVE_SHORTCUT_THRESHOLD))\r\n                    self._mState = constants.eNotMe\r\n\r\n        return self.get_state()\r\n\r\n    def get_confidence(self):\r\n        r = 0.01\r\n        if self._mTotalSeqs > 0:\r\n            r = ((1.0 * self._mSeqCounters[POSITIVE_CAT]) / self._mTotalSeqs\r\n                 / self._mModel['mTypicalPositiveRatio'])\r\n            r = r * self._mFreqChar / self._mTotalChar\r\n            if r >= 1.0:\r\n                r = 0.99\r\n        return r\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/sbcsgroupprober.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is Mozilla Universal charset detector code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 2001\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#   Shy Shalom - original C code\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n#\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\nfrom .charsetgroupprober import CharSetGroupProber\r\nfrom .sbcharsetprober import SingleByteCharSetProber\r\nfrom .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel,\r\n                                Latin5CyrillicModel, MacCyrillicModel,\r\n                                Ibm866Model, Ibm855Model)\r\nfrom .langgreekmodel import Latin7GreekModel, Win1253GreekModel\r\nfrom .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel\r\nfrom .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel\r\nfrom .langthaimodel import TIS620ThaiModel\r\nfrom .langhebrewmodel import Win1255HebrewModel\r\nfrom .hebrewprober import HebrewProber\r\n\r\n\r\nclass SBCSGroupProber(CharSetGroupProber):\r\n    def __init__(self):\r\n        CharSetGroupProber.__init__(self)\r\n        self._mProbers = [\r\n            SingleByteCharSetProber(Win1251CyrillicModel),\r\n            SingleByteCharSetProber(Koi8rModel),\r\n            SingleByteCharSetProber(Latin5CyrillicModel),\r\n            SingleByteCharSetProber(MacCyrillicModel),\r\n            SingleByteCharSetProber(Ibm866Model),\r\n            SingleByteCharSetProber(Ibm855Model),\r\n            SingleByteCharSetProber(Latin7GreekModel),\r\n            SingleByteCharSetProber(Win1253GreekModel),\r\n            SingleByteCharSetProber(Latin5BulgarianModel),\r\n            SingleByteCharSetProber(Win1251BulgarianModel),\r\n            SingleByteCharSetProber(Latin2HungarianModel),\r\n            SingleByteCharSetProber(Win1250HungarianModel),\r\n            SingleByteCharSetProber(TIS620ThaiModel),\r\n        ]\r\n        hebrewProber = HebrewProber()\r\n        logicalHebrewProber = SingleByteCharSetProber(Win1255HebrewModel,\r\n                                                      False, hebrewProber)\r\n        visualHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, True,\r\n                                                     hebrewProber)\r\n        hebrewProber.set_model_probers(logicalHebrewProber, visualHebrewProber)\r\n        self._mProbers.extend([hebrewProber, logicalHebrewProber,\r\n                               visualHebrewProber])\r\n\r\n        self.reset()\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/sjisprober.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is mozilla.org code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 1998\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n#\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\nimport sys\r\nfrom .mbcharsetprober import MultiByteCharSetProber\r\nfrom .codingstatemachine import CodingStateMachine\r\nfrom .chardistribution import SJISDistributionAnalysis\r\nfrom .jpcntx import SJISContextAnalysis\r\nfrom .mbcssm import SJISSMModel\r\nfrom . import constants\r\n\r\n\r\nclass SJISProber(MultiByteCharSetProber):\r\n    def __init__(self):\r\n        MultiByteCharSetProber.__init__(self)\r\n        self._mCodingSM = CodingStateMachine(SJISSMModel)\r\n        self._mDistributionAnalyzer = SJISDistributionAnalysis()\r\n        self._mContextAnalyzer = SJISContextAnalysis()\r\n        self.reset()\r\n\r\n    def reset(self):\r\n        MultiByteCharSetProber.reset(self)\r\n        self._mContextAnalyzer.reset()\r\n\r\n    def get_charset_name(self):\r\n        return \"SHIFT_JIS\"\r\n\r\n    def feed(self, aBuf):\r\n        aLen = len(aBuf)\r\n        for i in range(0, aLen):\r\n            codingState = self._mCodingSM.next_state(aBuf[i])\r\n            if codingState == constants.eError:\r\n                if constants._debug:\r\n                    sys.stderr.write(self.get_charset_name()\r\n                                     + ' prober hit error at byte ' + str(i)\r\n                                     + '\\n')\r\n                self._mState = constants.eNotMe\r\n                break\r\n            elif codingState == constants.eItsMe:\r\n                self._mState = constants.eFoundIt\r\n                break\r\n            elif codingState == constants.eStart:\r\n                charLen = self._mCodingSM.get_current_charlen()\r\n                if i == 0:\r\n                    self._mLastChar[1] = aBuf[0]\r\n                    self._mContextAnalyzer.feed(self._mLastChar[2 - charLen:],\r\n                                                charLen)\r\n                    self._mDistributionAnalyzer.feed(self._mLastChar, charLen)\r\n                else:\r\n                    self._mContextAnalyzer.feed(aBuf[i + 1 - charLen:i + 3\r\n                                                     - charLen], charLen)\r\n                    self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1],\r\n                                                     charLen)\r\n\r\n        self._mLastChar[0] = aBuf[aLen - 1]\r\n\r\n        if self.get_state() == constants.eDetecting:\r\n            if (self._mContextAnalyzer.got_enough_data() and\r\n               (self.get_confidence() > constants.SHORTCUT_THRESHOLD)):\r\n                self._mState = constants.eFoundIt\r\n\r\n        return self.get_state()\r\n\r\n    def get_confidence(self):\r\n        contxtCf = self._mContextAnalyzer.get_confidence()\r\n        distribCf = self._mDistributionAnalyzer.get_confidence()\r\n        return max(contxtCf, distribCf)\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/universaldetector.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is Mozilla Universal charset detector code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 2001\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#   Shy Shalom - original C code\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n#\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\nfrom . import constants\r\nimport sys\r\nimport codecs\r\nfrom .latin1prober import Latin1Prober  # windows-1252\r\nfrom .mbcsgroupprober import MBCSGroupProber  # multi-byte character sets\r\nfrom .sbcsgroupprober import SBCSGroupProber  # single-byte character sets\r\nfrom .escprober import EscCharSetProber  # ISO-2122, etc.\r\nimport re\r\n\r\nMINIMUM_THRESHOLD = 0.20\r\nePureAscii = 0\r\neEscAscii = 1\r\neHighbyte = 2\r\n\r\n\r\nclass UniversalDetector:\r\n    def __init__(self):\r\n        self._highBitDetector = re.compile(b'[\\x80-\\xFF]')\r\n        self._escDetector = re.compile(b'(\\033|~{)')\r\n        self._mEscCharSetProber = None\r\n        self._mCharSetProbers = []\r\n        self.reset()\r\n\r\n    def reset(self):\r\n        self.result = {'encoding': None, 'confidence': 0.0}\r\n        self.done = False\r\n        self._mStart = True\r\n        self._mGotData = False\r\n        self._mInputState = ePureAscii\r\n        self._mLastChar = b''\r\n        if self._mEscCharSetProber:\r\n            self._mEscCharSetProber.reset()\r\n        for prober in self._mCharSetProbers:\r\n            prober.reset()\r\n\r\n    def feed(self, aBuf):\r\n        if self.done:\r\n            return\r\n\r\n        aLen = len(aBuf)\r\n        if not aLen:\r\n            return\r\n\r\n        if not self._mGotData:\r\n            # If the data starts with BOM, we know it is UTF\r\n            if aBuf[:3] == codecs.BOM:\r\n                # EF BB BF  UTF-8 with BOM\r\n                self.result = {'encoding': \"UTF-8\", 'confidence': 1.0}\r\n            elif aBuf[:4] == codecs.BOM_UTF32_LE:\r\n                # FF FE 00 00  UTF-32, little-endian BOM\r\n                self.result = {'encoding': \"UTF-32LE\", 'confidence': 1.0}\r\n            elif aBuf[:4] == codecs.BOM_UTF32_BE:\r\n                # 00 00 FE FF  UTF-32, big-endian BOM\r\n                self.result = {'encoding': \"UTF-32BE\", 'confidence': 1.0}\r\n            elif aBuf[:4] == b'\\xFE\\xFF\\x00\\x00':\r\n                # FE FF 00 00  UCS-4, unusual octet order BOM (3412)\r\n                self.result = {\r\n                    'encoding': \"X-ISO-10646-UCS-4-3412\",\r\n                    'confidence': 1.0\r\n                }\r\n            elif aBuf[:4] == b'\\x00\\x00\\xFF\\xFE':\r\n                # 00 00 FF FE  UCS-4, unusual octet order BOM (2143)\r\n                self.result = {\r\n                    'encoding': \"X-ISO-10646-UCS-4-2143\",\r\n                    'confidence': 1.0\r\n                }\r\n            elif aBuf[:2] == codecs.BOM_LE:\r\n                # FF FE  UTF-16, little endian BOM\r\n                self.result = {'encoding': \"UTF-16LE\", 'confidence': 1.0}\r\n            elif aBuf[:2] == codecs.BOM_BE:\r\n                # FE FF  UTF-16, big endian BOM\r\n                self.result = {'encoding': \"UTF-16BE\", 'confidence': 1.0}\r\n\r\n        self._mGotData = True\r\n        if self.result['encoding'] and (self.result['confidence'] > 0.0):\r\n            self.done = True\r\n            return\r\n\r\n        if self._mInputState == ePureAscii:\r\n            if self._highBitDetector.search(aBuf):\r\n                self._mInputState = eHighbyte\r\n            elif ((self._mInputState == ePureAscii) and\r\n                    self._escDetector.search(self._mLastChar + aBuf)):\r\n                self._mInputState = eEscAscii\r\n\r\n        self._mLastChar = aBuf[-1:]\r\n\r\n        if self._mInputState == eEscAscii:\r\n            if not self._mEscCharSetProber:\r\n                self._mEscCharSetProber = EscCharSetProber()\r\n            if self._mEscCharSetProber.feed(aBuf) == constants.eFoundIt:\r\n                self.result = {\r\n                    'encoding': self._mEscCharSetProber.get_charset_name(),\r\n                    'confidence': self._mEscCharSetProber.get_confidence()\r\n                }\r\n                self.done = True\r\n        elif self._mInputState == eHighbyte:\r\n            if not self._mCharSetProbers:\r\n                self._mCharSetProbers = [MBCSGroupProber(), SBCSGroupProber(),\r\n                                         Latin1Prober()]\r\n            for prober in self._mCharSetProbers:\r\n                if prober.feed(aBuf) == constants.eFoundIt:\r\n                    self.result = {'encoding': prober.get_charset_name(),\r\n                                   'confidence': prober.get_confidence()}\r\n                    self.done = True\r\n                    break\r\n\r\n    def close(self):\r\n        if self.done:\r\n            return\r\n        if not self._mGotData:\r\n            if constants._debug:\r\n                sys.stderr.write('no data received!\\n')\r\n            return\r\n        self.done = True\r\n\r\n        if self._mInputState == ePureAscii:\r\n            self.result = {'encoding': 'ascii', 'confidence': 1.0}\r\n            return self.result\r\n\r\n        if self._mInputState == eHighbyte:\r\n            proberConfidence = None\r\n            maxProberConfidence = 0.0\r\n            maxProber = None\r\n            for prober in self._mCharSetProbers:\r\n                if not prober:\r\n                    continue\r\n                proberConfidence = prober.get_confidence()\r\n                if proberConfidence > maxProberConfidence:\r\n                    maxProberConfidence = proberConfidence\r\n                    maxProber = prober\r\n            if maxProber and (maxProberConfidence > MINIMUM_THRESHOLD):\r\n                self.result = {'encoding': maxProber.get_charset_name(),\r\n                               'confidence': maxProber.get_confidence()}\r\n                return self.result\r\n\r\n        if constants._debug:\r\n            sys.stderr.write('no probers hit minimum threshhold\\n')\r\n            for prober in self._mCharSetProbers[0].mProbers:\r\n                if not prober:\r\n                    continue\r\n                sys.stderr.write('%s confidence = %s\\n' %\r\n                                 (prober.get_charset_name(),\r\n                                  prober.get_confidence()))\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/charade/utf8prober.py",
    "content": "######################## BEGIN LICENSE BLOCK ########################\r\n# The Original Code is mozilla.org code.\r\n#\r\n# The Initial Developer of the Original Code is\r\n# Netscape Communications Corporation.\r\n# Portions created by the Initial Developer are Copyright (C) 1998\r\n# the Initial Developer. All Rights Reserved.\r\n#\r\n# Contributor(s):\r\n#   Mark Pilgrim - port to Python\r\n#\r\n# This library is free software; you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation; either\r\n# version 2.1 of the License, or (at your option) any later version.\r\n#\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\r\n# 02110-1301  USA\r\n######################### END LICENSE BLOCK #########################\r\n\r\nfrom . import constants\r\nfrom .charsetprober import CharSetProber\r\nfrom .codingstatemachine import CodingStateMachine\r\nfrom .mbcssm import UTF8SMModel\r\n\r\nONE_CHAR_PROB = 0.5\r\n\r\n\r\nclass UTF8Prober(CharSetProber):\r\n    def __init__(self):\r\n        CharSetProber.__init__(self)\r\n        self._mCodingSM = CodingStateMachine(UTF8SMModel)\r\n        self.reset()\r\n\r\n    def reset(self):\r\n        CharSetProber.reset(self)\r\n        self._mCodingSM.reset()\r\n        self._mNumOfMBChar = 0\r\n\r\n    def get_charset_name(self):\r\n        return \"utf-8\"\r\n\r\n    def feed(self, aBuf):\r\n        for c in aBuf:\r\n            codingState = self._mCodingSM.next_state(c)\r\n            if codingState == constants.eError:\r\n                self._mState = constants.eNotMe\r\n                break\r\n            elif codingState == constants.eItsMe:\r\n                self._mState = constants.eFoundIt\r\n                break\r\n            elif codingState == constants.eStart:\r\n                if self._mCodingSM.get_current_charlen() >= 2:\r\n                    self._mNumOfMBChar += 1\r\n\r\n        if self.get_state() == constants.eDetecting:\r\n            if self.get_confidence() > constants.SHORTCUT_THRESHOLD:\r\n                self._mState = constants.eFoundIt\r\n\r\n        return self.get_state()\r\n\r\n    def get_confidence(self):\r\n        unlike = 0.99\r\n        if self._mNumOfMBChar < 6:\r\n            for i in range(0, self._mNumOfMBChar):\r\n                unlike = unlike * ONE_CHAR_PROB\r\n            return 1.0 - unlike\r\n        else:\r\n            return unlike\r\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/urllib3/__init__.py",
    "content": "# urllib3/__init__.py\n# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt)\n#\n# This module is part of urllib3 and is released under\n# the MIT License: http://www.opensource.org/licenses/mit-license.php\n\n\"\"\"\nurllib3 - Thread-safe connection pooling and re-using.\n\"\"\"\n\n__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)'\n__license__ = 'MIT'\n__version__ = 'dev'\n\n\nfrom .connectionpool import (\n    HTTPConnectionPool,\n    HTTPSConnectionPool,\n    connection_from_url\n)\n\nfrom . import exceptions\nfrom .filepost import encode_multipart_formdata\nfrom .poolmanager import PoolManager, ProxyManager, proxy_from_url\nfrom .response import HTTPResponse\nfrom .util import make_headers, get_host\n\n\n# Set default logging handler to avoid \"No handler found\" warnings.\nimport logging\ntry:  # Python 2.7+\n    from logging import NullHandler\nexcept ImportError:\n    class NullHandler(logging.Handler):\n        def emit(self, record):\n            pass\n\nlogging.getLogger(__name__).addHandler(NullHandler())\n\ndef add_stderr_logger(level=logging.DEBUG):\n    \"\"\"\n    Helper for quickly adding a StreamHandler to the logger. Useful for\n    debugging.\n\n    Returns the handler after adding it.\n    \"\"\"\n    # This method needs to be in this __init__.py to get the __name__ correct\n    # even if urllib3 is vendored within another package.\n    logger = logging.getLogger(__name__)\n    handler = logging.StreamHandler()\n    handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s'))\n    logger.addHandler(handler)\n    logger.setLevel(level)\n    logger.debug('Added an stderr logging handler to logger: %s' % __name__)\n    return handler\n\n# ... Clean up.\ndel NullHandler\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/urllib3/_collections.py",
    "content": "# urllib3/_collections.py\n# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt)\n#\n# This module is part of urllib3 and is released under\n# the MIT License: http://www.opensource.org/licenses/mit-license.php\n\nfrom collections import MutableMapping\nfrom threading import RLock\n\ntry: # Python 2.7+\n    from collections import OrderedDict\nexcept ImportError:\n    from .packages.ordered_dict import OrderedDict\n\n\n__all__ = ['RecentlyUsedContainer']\n\n\n_Null = object()\n\n\nclass RecentlyUsedContainer(MutableMapping):\n    \"\"\"\n    Provides a thread-safe dict-like container which maintains up to\n    ``maxsize`` keys while throwing away the least-recently-used keys beyond\n    ``maxsize``.\n\n    :param maxsize:\n        Maximum number of recent elements to retain.\n\n    :param dispose_func:\n        Every time an item is evicted from the container,\n        ``dispose_func(value)`` is called.  Callback which will get called\n    \"\"\"\n\n    ContainerCls = OrderedDict\n\n    def __init__(self, maxsize=10, dispose_func=None):\n        self._maxsize = maxsize\n        self.dispose_func = dispose_func\n\n        self._container = self.ContainerCls()\n        self.lock = RLock()\n\n    def __getitem__(self, key):\n        # Re-insert the item, moving it to the end of the eviction line.\n        with self.lock:\n            item = self._container.pop(key)\n            self._container[key] = item\n            return item\n\n    def __setitem__(self, key, value):\n        evicted_value = _Null\n        with self.lock:\n            # Possibly evict the existing value of 'key'\n            evicted_value = self._container.get(key, _Null)\n            self._container[key] = value\n\n            # If we didn't evict an existing value, we might have to evict the\n            # least recently used item from the beginning of the container.\n            if len(self._container) > self._maxsize:\n                _key, evicted_value = self._container.popitem(last=False)\n\n        if self.dispose_func and evicted_value is not _Null:\n            self.dispose_func(evicted_value)\n\n    def __delitem__(self, key):\n        with self.lock:\n            value = self._container.pop(key)\n\n        if self.dispose_func:\n            self.dispose_func(value)\n\n    def __len__(self):\n        with self.lock:\n            return len(self._container)\n\n    def __iter__(self):\n        raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.')\n\n    def clear(self):\n        with self.lock:\n            # Copy pointers to all values, then wipe the mapping\n            # under Python 2, this copies the list of values twice :-|\n            values = list(self._container.values())\n            self._container.clear()\n\n        if self.dispose_func:\n            for value in values:\n                self.dispose_func(value)\n\n    def keys(self):\n        with self.lock:\n            return self._container.keys()\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/urllib3/connectionpool.py",
    "content": "# urllib3/connectionpool.py\n# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt)\n#\n# This module is part of urllib3 and is released under\n# the MIT License: http://www.opensource.org/licenses/mit-license.php\n\nimport logging\nimport socket\nimport errno\n\nfrom socket import error as SocketError, timeout as SocketTimeout\nfrom .util import resolve_cert_reqs, resolve_ssl_version, assert_fingerprint\n\ntry: # Python 3\n    from http.client import HTTPConnection, HTTPException\n    from http.client import HTTP_PORT, HTTPS_PORT\nexcept ImportError:\n    from httplib import HTTPConnection, HTTPException\n    from httplib import HTTP_PORT, HTTPS_PORT\n\ntry: # Python 3\n    from queue import LifoQueue, Empty, Full\nexcept ImportError:\n    from Queue import LifoQueue, Empty, Full\n\n\ntry: # Compiled with SSL?\n    HTTPSConnection = object\n\n    class BaseSSLError(BaseException):\n        pass\n\n    ssl = None\n\n    try: # Python 3\n        from http.client import HTTPSConnection\n    except ImportError:\n        from httplib import HTTPSConnection\n\n    import ssl\n    BaseSSLError = ssl.SSLError\n\nexcept (ImportError, AttributeError): # Platform-specific: No SSL.\n    pass\n\n\nfrom .request import RequestMethods\nfrom .response import HTTPResponse\nfrom .util import get_host, is_connection_dropped, ssl_wrap_socket\nfrom .exceptions import (\n    ClosedPoolError,\n    EmptyPoolError,\n    HostChangedError,\n    MaxRetryError,\n    SSLError,\n    TimeoutError,\n)\n\nfrom .packages.ssl_match_hostname import match_hostname, CertificateError\nfrom .packages import six\n\n\nxrange = six.moves.xrange\n\nlog = logging.getLogger(__name__)\n\n_Default = object()\n\nport_by_scheme = {\n    'http': HTTP_PORT,\n    'https': HTTPS_PORT,\n}\n\n\n## Connection objects (extension of httplib)\n\nclass VerifiedHTTPSConnection(HTTPSConnection):\n    \"\"\"\n    Based on httplib.HTTPSConnection but wraps the socket with\n    SSL certification.\n    \"\"\"\n    cert_reqs = None\n    ca_certs = None\n    ssl_version = None\n\n    def set_cert(self, key_file=None, cert_file=None,\n                 cert_reqs=None, ca_certs=None,\n                 assert_hostname=None, assert_fingerprint=None):\n\n        self.key_file = key_file\n        self.cert_file = cert_file\n        self.cert_reqs = cert_reqs\n        self.ca_certs = ca_certs\n        self.assert_hostname = assert_hostname\n        self.assert_fingerprint = assert_fingerprint\n\n    def connect(self):\n        # Add certificate verification\n        sock = socket.create_connection((self.host, self.port), self.timeout)\n\n        resolved_cert_reqs = resolve_cert_reqs(self.cert_reqs)\n        resolved_ssl_version = resolve_ssl_version(self.ssl_version)\n\n        # Wrap socket using verification with the root certs in\n        # trusted_root_certs\n        self.sock = ssl_wrap_socket(sock, self.key_file, self.cert_file,\n                                    cert_reqs=resolved_cert_reqs,\n                                    ca_certs=self.ca_certs,\n                                    server_hostname=self.host,\n                                    ssl_version=resolved_ssl_version)\n\n        if resolved_cert_reqs != ssl.CERT_NONE:\n            if self.assert_fingerprint:\n                assert_fingerprint(self.sock.getpeercert(binary_form=True),\n                                   self.assert_fingerprint)\n            elif self.assert_hostname is not False:\n                match_hostname(self.sock.getpeercert(),\n                               self.assert_hostname or self.host)\n\n## Pool objects\n\nclass ConnectionPool(object):\n    \"\"\"\n    Base class for all connection pools, such as\n    :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`.\n    \"\"\"\n\n    scheme = None\n    QueueCls = LifoQueue\n\n    def __init__(self, host, port=None):\n        self.host = host\n        self.port = port\n\n    def __str__(self):\n        return '%s(host=%r, port=%r)' % (type(self).__name__,\n                                         self.host, self.port)\n\n\nclass HTTPConnectionPool(ConnectionPool, RequestMethods):\n    \"\"\"\n    Thread-safe connection pool for one host.\n\n    :param host:\n        Host used for this HTTP Connection (e.g. \"localhost\"), passed into\n        :class:`httplib.HTTPConnection`.\n\n    :param port:\n        Port used for this HTTP Connection (None is equivalent to 80), passed\n        into :class:`httplib.HTTPConnection`.\n\n    :param strict:\n        Causes BadStatusLine to be raised if the status line can't be parsed\n        as a valid HTTP/1.0 or 1.1 status line, passed into\n        :class:`httplib.HTTPConnection`.\n\n    :param timeout:\n        Socket timeout in seconds for each individual connection, can be\n        a float. None disables timeout.\n\n    :param maxsize:\n        Number of connections to save that can be reused. More than 1 is useful\n        in multithreaded situations. If ``block`` is set to false, more\n        connections will be created but they will not be saved once they've\n        been used.\n\n    :param block:\n        If set to True, no more than ``maxsize`` connections will be used at\n        a time. When no free connections are available, the call will block\n        until a connection has been released. This is a useful side effect for\n        particular multithreaded situations where one does not want to use more\n        than maxsize connections per host to prevent flooding.\n\n    :param headers:\n        Headers to include with all requests, unless other headers are given\n        explicitly.\n    \"\"\"\n\n    scheme = 'http'\n\n    def __init__(self, host, port=None, strict=False, timeout=None, maxsize=1,\n                 block=False, headers=None):\n        ConnectionPool.__init__(self, host, port)\n        RequestMethods.__init__(self, headers)\n\n        self.strict = strict\n        self.timeout = timeout\n        self.pool = self.QueueCls(maxsize)\n        self.block = block\n\n        # Fill the queue up so that doing get() on it will block properly\n        for _ in xrange(maxsize):\n            self.pool.put(None)\n\n        # These are mostly for testing and debugging purposes.\n        self.num_connections = 0\n        self.num_requests = 0\n\n    def _new_conn(self):\n        \"\"\"\n        Return a fresh :class:`httplib.HTTPConnection`.\n        \"\"\"\n        self.num_connections += 1\n        log.info(\"Starting new HTTP connection (%d): %s\" %\n                 (self.num_connections, self.host))\n        return HTTPConnection(host=self.host,\n                              port=self.port,\n                              strict=self.strict)\n\n    def _get_conn(self, timeout=None):\n        \"\"\"\n        Get a connection. Will return a pooled connection if one is available.\n\n        If no connections are available and :prop:`.block` is ``False``, then a\n        fresh connection is returned.\n\n        :param timeout:\n            Seconds to wait before giving up and raising\n            :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and\n            :prop:`.block` is ``True``.\n        \"\"\"\n        conn = None\n        try:\n            conn = self.pool.get(block=self.block, timeout=timeout)\n\n        except AttributeError: # self.pool is None\n            raise ClosedPoolError(self, \"Pool is closed.\")\n\n        except Empty:\n            if self.block:\n                raise EmptyPoolError(self,\n                                     \"Pool reached maximum size and no more \"\n                                     \"connections are allowed.\")\n            pass  # Oh well, we'll create a new connection then\n\n        # If this is a persistent connection, check if it got disconnected\n        if conn and is_connection_dropped(conn):\n            log.info(\"Resetting dropped connection: %s\" % self.host)\n            conn.close()\n\n        return conn or self._new_conn()\n\n    def _put_conn(self, conn):\n        \"\"\"\n        Put a connection back into the pool.\n\n        :param conn:\n            Connection object for the current host and port as returned by\n            :meth:`._new_conn` or :meth:`._get_conn`.\n\n        If the pool is already full, the connection is closed and discarded\n        because we exceeded maxsize. If connections are discarded frequently,\n        then maxsize should be increased.\n\n        If the pool is closed, then the connection will be closed and discarded.\n        \"\"\"\n        try:\n            self.pool.put(conn, block=False)\n            return # Everything is dandy, done.\n        except AttributeError:\n            # self.pool is None.\n            pass\n        except Full:\n            # This should never happen if self.block == True\n            log.warning(\"HttpConnectionPool is full, discarding connection: %s\"\n                        % self.host)\n\n        # Connection never got put back into the pool, close it.\n        conn.close()\n\n    def _make_request(self, conn, method, url, timeout=_Default,\n                      **httplib_request_kw):\n        \"\"\"\n        Perform a request on a given httplib connection object taken from our\n        pool.\n        \"\"\"\n        self.num_requests += 1\n\n        if timeout is _Default:\n            timeout = self.timeout\n\n        conn.timeout = timeout # This only does anything in Py26+\n        conn.request(method, url, **httplib_request_kw)\n\n        # Set timeout\n        sock = getattr(conn, 'sock', False) # AppEngine doesn't have sock attr.\n        if sock:\n            sock.settimeout(timeout)\n\n        try: # Python 2.7+, use buffering of HTTP responses\n            httplib_response = conn.getresponse(buffering=True)\n        except TypeError: # Python 2.6 and older\n            httplib_response = conn.getresponse()\n\n        # AppEngine doesn't have a version attr.\n        http_version = getattr(conn, '_http_vsn_str', 'HTTP/?')\n        log.debug(\"\\\"%s %s %s\\\" %s %s\" % (method, url, http_version,\n                                          httplib_response.status,\n                                          httplib_response.length))\n        return httplib_response\n\n    def close(self):\n        \"\"\"\n        Close all pooled connections and disable the pool.\n        \"\"\"\n        # Disable access to the pool\n        old_pool, self.pool = self.pool, None\n\n        try:\n            while True:\n                conn = old_pool.get(block=False)\n                if conn:\n                    conn.close()\n\n        except Empty:\n            pass # Done.\n\n    def is_same_host(self, url):\n        \"\"\"\n        Check if the given ``url`` is a member of the same host as this\n        connection pool.\n        \"\"\"\n        if url.startswith('/'):\n            return True\n\n        # TODO: Add optional support for socket.gethostbyname checking.\n        scheme, host, port = get_host(url)\n\n        if self.port and not port:\n            # Use explicit default port for comparison when none is given.\n            port = port_by_scheme.get(scheme)\n\n        return (scheme, host, port) == (self.scheme, self.host, self.port)\n\n    def urlopen(self, method, url, body=None, headers=None, retries=3,\n                redirect=True, assert_same_host=True, timeout=_Default,\n                pool_timeout=None, release_conn=None, **response_kw):\n        \"\"\"\n        Get a connection from the pool and perform an HTTP request. This is the\n        lowest level call for making a request, so you'll need to specify all\n        the raw details.\n\n        .. note::\n\n           More commonly, it's appropriate to use a convenience method provided\n           by :class:`.RequestMethods`, such as :meth:`request`.\n\n        .. note::\n\n           `release_conn` will only behave as expected if\n           `preload_content=False` because we want to make\n           `preload_content=False` the default behaviour someday soon without\n           breaking backwards compatibility.\n\n        :param method:\n            HTTP request method (such as GET, POST, PUT, etc.)\n\n        :param body:\n            Data to send in the request body (useful for creating\n            POST requests, see HTTPConnectionPool.post_url for\n            more convenience).\n\n        :param headers:\n            Dictionary of custom headers to send, such as User-Agent,\n            If-None-Match, etc. If None, pool headers are used. If provided,\n            these headers completely replace any pool-specific headers.\n\n        :param retries:\n            Number of retries to allow before raising a MaxRetryError exception.\n\n        :param redirect:\n            If True, automatically handle redirects (status codes 301, 302,\n            303, 307). Each redirect counts as a retry.\n\n        :param assert_same_host:\n            If ``True``, will make sure that the host of the pool requests is\n            consistent else will raise HostChangedError. When False, you can\n            use the pool on an HTTP proxy and request foreign hosts.\n\n        :param timeout:\n            If specified, overrides the default timeout for this one request.\n            It may be a float (in seconds).\n\n        :param pool_timeout:\n            If set and the pool is set to block=True, then this method will\n            block for ``pool_timeout`` seconds and raise EmptyPoolError if no\n            connection is available within the time period.\n\n        :param release_conn:\n            If False, then the urlopen call will not release the connection\n            back into the pool once a response is received (but will release if\n            you read the entire contents of the response such as when\n            `preload_content=True`). This is useful if you're not preloading\n            the response's content immediately. You will need to call\n            ``r.release_conn()`` on the response ``r`` to return the connection\n            back into the pool. If None, it takes the value of\n            ``response_kw.get('preload_content', True)``.\n\n        :param \\**response_kw:\n            Additional parameters are passed to\n            :meth:`urllib3.response.HTTPResponse.from_httplib`\n        \"\"\"\n        if headers is None:\n            headers = self.headers\n\n        if retries < 0:\n            raise MaxRetryError(self, url)\n\n        if timeout is _Default:\n            timeout = self.timeout\n\n        if release_conn is None:\n            release_conn = response_kw.get('preload_content', True)\n\n        # Check host\n        if assert_same_host and not self.is_same_host(url):\n            raise HostChangedError(self, url, retries - 1)\n\n        conn = None\n\n        try:\n            # Request a connection from the queue\n            conn = self._get_conn(timeout=pool_timeout)\n\n            # Make the request on the httplib connection object\n            httplib_response = self._make_request(conn, method, url,\n                                                  timeout=timeout,\n                                                  body=body, headers=headers)\n\n            # If we're going to release the connection in ``finally:``, then\n            # the request doesn't need to know about the connection. Otherwise\n            # it will also try to release it and we'll have a double-release\n            # mess.\n            response_conn = not release_conn and conn\n\n            # Import httplib's response into our own wrapper object\n            response = HTTPResponse.from_httplib(httplib_response,\n                                                 pool=self,\n                                                 connection=response_conn,\n                                                 **response_kw)\n\n            # else:\n            #     The connection will be put back into the pool when\n            #     ``response.release_conn()`` is called (implicitly by\n            #     ``response.read()``)\n\n        except Empty as e:\n            # Timed out by queue\n            raise TimeoutError(self, url,\n                               \"Request timed out. (pool_timeout=%s)\" %\n                               pool_timeout)\n\n        except SocketTimeout as e:\n            # Timed out by socket\n            raise TimeoutError(self, url,\n                               \"Request timed out. (timeout=%s)\" %\n                               timeout)\n\n        except BaseSSLError as e:\n            # SSL certificate error\n            raise SSLError(e)\n\n        except CertificateError as e:\n            # Name mismatch\n            raise SSLError(e)\n\n        except (HTTPException, SocketError) as e:\n            # Connection broken, discard. It will be replaced next _get_conn().\n            conn = None\n            # This is necessary so we can access e below\n            err = e\n\n            if retries == 0:\n                raise MaxRetryError(self, url, e)\n\n        finally:\n            if release_conn:\n                # Put the connection back to be reused. If the connection is\n                # expired then it will be None, which will get replaced with a\n                # fresh connection during _get_conn.\n                self._put_conn(conn)\n\n        if not conn:\n            # Try again\n            log.warn(\"Retrying (%d attempts remain) after connection \"\n                     \"broken by '%r': %s\" % (retries, err, url))\n            return self.urlopen(method, url, body, headers, retries - 1,\n                                redirect, assert_same_host,\n                                timeout=timeout, pool_timeout=pool_timeout,\n                                release_conn=release_conn, **response_kw)\n\n        # Handle redirect?\n        redirect_location = redirect and response.get_redirect_location()\n        if redirect_location:\n            if response.status == 303:\n                method = 'GET'\n            log.info(\"Redirecting %s -> %s\" % (url, redirect_location))\n            return self.urlopen(method, redirect_location, body, headers,\n                                retries - 1, redirect, assert_same_host,\n                                timeout=timeout, pool_timeout=pool_timeout,\n                                release_conn=release_conn, **response_kw)\n\n        return response\n\n\nclass HTTPSConnectionPool(HTTPConnectionPool):\n    \"\"\"\n    Same as :class:`.HTTPConnectionPool`, but HTTPS.\n\n    When Python is compiled with the :mod:`ssl` module, then\n    :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates,\n    instead of :class:`httplib.HTTPSConnection`.\n\n    :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``,\n    ``assert_hostname`` and ``host`` in this order to verify connections.\n    If ``assert_hostname`` is False, no verification is done.\n\n    The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs`` and\n    ``ssl_version`` are only used if :mod:`ssl` is available and are fed into\n    :meth:`urllib3.util.ssl_wrap_socket` to upgrade the connection socket\n    into an SSL socket.\n    \"\"\"\n\n    scheme = 'https'\n\n    def __init__(self, host, port=None,\n                 strict=False, timeout=None, maxsize=1,\n                 block=False, headers=None,\n                 key_file=None, cert_file=None, cert_reqs=None,\n                 ca_certs=None, ssl_version=None,\n                 assert_hostname=None, assert_fingerprint=None):\n\n        HTTPConnectionPool.__init__(self, host, port,\n                                    strict, timeout, maxsize,\n                                    block, headers)\n        self.key_file = key_file\n        self.cert_file = cert_file\n        self.cert_reqs = cert_reqs\n        self.ca_certs = ca_certs\n        self.ssl_version = ssl_version\n        self.assert_hostname = assert_hostname\n        self.assert_fingerprint = assert_fingerprint\n\n    def _new_conn(self):\n        \"\"\"\n        Return a fresh :class:`httplib.HTTPSConnection`.\n        \"\"\"\n        self.num_connections += 1\n        log.info(\"Starting new HTTPS connection (%d): %s\"\n                 % (self.num_connections, self.host))\n\n        if not ssl:  # Platform-specific: Python compiled without +ssl\n            if not HTTPSConnection or HTTPSConnection is object:\n                raise SSLError(\"Can't connect to HTTPS URL because the SSL \"\n                               \"module is not available.\")\n\n            return HTTPSConnection(host=self.host,\n                                   port=self.port,\n                                   strict=self.strict)\n\n        connection = VerifiedHTTPSConnection(host=self.host,\n                                             port=self.port,\n                                             strict=self.strict)\n        connection.set_cert(key_file=self.key_file, cert_file=self.cert_file,\n                            cert_reqs=self.cert_reqs, ca_certs=self.ca_certs,\n                            assert_hostname=self.assert_hostname,\n                            assert_fingerprint=self.assert_fingerprint)\n\n        connection.ssl_version = self.ssl_version\n\n        return connection\n\n\ndef connection_from_url(url, **kw):\n    \"\"\"\n    Given a url, return an :class:`.ConnectionPool` instance of its host.\n\n    This is a shortcut for not having to parse out the scheme, host, and port\n    of the url before creating an :class:`.ConnectionPool` instance.\n\n    :param url:\n        Absolute URL string that must include the scheme. Port is optional.\n\n    :param \\**kw:\n        Passes additional parameters to the constructor of the appropriate\n        :class:`.ConnectionPool`. Useful for specifying things like\n        timeout, maxsize, headers, etc.\n\n    Example: ::\n\n        >>> conn = connection_from_url('http://google.com/')\n        >>> r = conn.request('GET', '/')\n    \"\"\"\n    scheme, host, port = get_host(url)\n    if scheme == 'https':\n        return HTTPSConnectionPool(host, port=port, **kw)\n    else:\n        return HTTPConnectionPool(host, port=port, **kw)\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/urllib3/exceptions.py",
    "content": "# urllib3/exceptions.py\n# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt)\n#\n# This module is part of urllib3 and is released under\n# the MIT License: http://www.opensource.org/licenses/mit-license.php\n\n\n## Base Exceptions\n\nclass HTTPError(Exception):\n    \"Base exception used by this module.\"\n    pass\n\n\nclass PoolError(HTTPError):\n    \"Base exception for errors caused within a pool.\"\n    def __init__(self, pool, message):\n        self.pool = pool\n        HTTPError.__init__(self, \"%s: %s\" % (pool, message))\n\n    def __reduce__(self):\n        # For pickling purposes.\n        return self.__class__, (None, None)\n\n\nclass RequestError(PoolError):\n    \"Base exception for PoolErrors that have associated URLs.\"\n    def __init__(self, pool, url, message):\n        self.url = url\n        PoolError.__init__(self, pool, message)\n\n    def __reduce__(self):\n        # For pickling purposes.\n        return self.__class__, (None, self.url, None)\n\n\nclass SSLError(HTTPError):\n    \"Raised when SSL certificate fails in an HTTPS connection.\"\n    pass\n\n\nclass DecodeError(HTTPError):\n    \"Raised when automatic decoding based on Content-Type fails.\"\n    pass\n\n\n## Leaf Exceptions\n\nclass MaxRetryError(RequestError):\n    \"Raised when the maximum number of retries is exceeded.\"\n\n    def __init__(self, pool, url, reason=None):\n        self.reason = reason\n\n        message = \"Max retries exceeded with url: %s\" % url\n        if reason:\n            message += \" (Caused by %s: %s)\" % (type(reason), reason)\n        else:\n            message += \" (Caused by redirect)\"\n\n        RequestError.__init__(self, pool, url, message)\n\n\nclass HostChangedError(RequestError):\n    \"Raised when an existing pool gets a request for a foreign host.\"\n\n    def __init__(self, pool, url, retries=3):\n        message = \"Tried to open a foreign host with url: %s\" % url\n        RequestError.__init__(self, pool, url, message)\n        self.retries = retries\n\n\nclass TimeoutError(RequestError):\n    \"Raised when a socket timeout occurs.\"\n    pass\n\n\nclass EmptyPoolError(PoolError):\n    \"Raised when a pool runs out of connections and no more are allowed.\"\n    pass\n\n\nclass ClosedPoolError(PoolError):\n    \"Raised when a request enters a pool after the pool has been closed.\"\n    pass\n\n\nclass LocationParseError(ValueError, HTTPError):\n    \"Raised when get_host or similar fails to parse the URL input.\"\n\n    def __init__(self, location):\n        message = \"Failed to parse: %s\" % location\n        HTTPError.__init__(self, message)\n\n        self.location = location\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/urllib3/filepost.py",
    "content": "# urllib3/filepost.py\n# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt)\n#\n# This module is part of urllib3 and is released under\n# the MIT License: http://www.opensource.org/licenses/mit-license.php\n\nimport codecs\nimport mimetypes\n\nfrom uuid import uuid4\nfrom io import BytesIO\n\nfrom .packages import six\nfrom .packages.six import b\n\nwriter = codecs.lookup('utf-8')[3]\n\n\ndef choose_boundary():\n    \"\"\"\n    Our embarassingly-simple replacement for mimetools.choose_boundary.\n    \"\"\"\n    return uuid4().hex\n\n\ndef get_content_type(filename):\n    return mimetypes.guess_type(filename)[0] or 'application/octet-stream'\n\n\ndef iter_fields(fields):\n    \"\"\"\n    Iterate over fields.\n\n    Supports list of (k, v) tuples and dicts.\n    \"\"\"\n    if isinstance(fields, dict):\n        return ((k, v) for k, v in six.iteritems(fields))\n\n    return ((k, v) for k, v in fields)\n\n\ndef encode_multipart_formdata(fields, boundary=None):\n    \"\"\"\n    Encode a dictionary of ``fields`` using the multipart/form-data MIME format.\n\n    :param fields:\n        Dictionary of fields or list of (key, value) or (key, value, MIME type)\n        field tuples.  The key is treated as the field name, and the value as\n        the body of the form-data bytes. If the value is a tuple of two\n        elements, then the first element is treated as the filename of the\n        form-data section and a suitable MIME type is guessed based on the\n        filename. If the value is a tuple of three elements, then the third\n        element is treated as an explicit MIME type of the form-data section.\n\n        Field names and filenames must be unicode.\n\n    :param boundary:\n        If not specified, then a random boundary will be generated using\n        :func:`mimetools.choose_boundary`.\n    \"\"\"\n    body = BytesIO()\n    if boundary is None:\n        boundary = choose_boundary()\n\n    for fieldname, value in iter_fields(fields):\n        body.write(b('--%s\\r\\n' % (boundary)))\n\n        if isinstance(value, tuple):\n            if len(value) == 3:\n                filename, data, content_type = value\n            else:\n                filename, data = value\n                content_type = get_content_type(filename)\n            writer(body).write('Content-Disposition: form-data; name=\"%s\"; '\n                               'filename=\"%s\"\\r\\n' % (fieldname, filename))\n            body.write(b('Content-Type: %s\\r\\n\\r\\n' %\n                       (content_type,)))\n        else:\n            data = value\n            writer(body).write('Content-Disposition: form-data; name=\"%s\"\\r\\n'\n                               % (fieldname))\n            body.write(b'\\r\\n')\n\n        if isinstance(data, int):\n            data = str(data)  # Backwards compatibility\n\n        if isinstance(data, six.text_type):\n            writer(body).write(data)\n        else:\n            body.write(data)\n\n        body.write(b'\\r\\n')\n\n    body.write(b('--%s--\\r\\n' % (boundary)))\n\n    content_type = str('multipart/form-data; boundary=%s' % boundary)\n\n    return body.getvalue(), content_type\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/urllib3/packages/__init__.py",
    "content": "from __future__ import absolute_import\n\nfrom . import ssl_match_hostname\n\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/urllib3/packages/ordered_dict.py",
    "content": "# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy.\n# Passes Python2.7's test suite and incorporates all the latest updates.\n# Copyright 2009 Raymond Hettinger, released under the MIT License.\n# http://code.activestate.com/recipes/576693/\n\ntry:\n    from thread import get_ident as _get_ident\nexcept ImportError:\n    from dummy_thread import get_ident as _get_ident\n\ntry:\n    from _abcoll import KeysView, ValuesView, ItemsView\nexcept ImportError:\n    pass\n\n\nclass OrderedDict(dict):\n    'Dictionary that remembers insertion order'\n    # An inherited dict maps keys to values.\n    # The inherited dict provides __getitem__, __len__, __contains__, and get.\n    # The remaining methods are order-aware.\n    # Big-O running times for all methods are the same as for regular dictionaries.\n\n    # The internal self.__map dictionary maps keys to links in a doubly linked list.\n    # The circular doubly linked list starts and ends with a sentinel element.\n    # The sentinel element never gets deleted (this simplifies the algorithm).\n    # Each link is stored as a list of length three:  [PREV, NEXT, KEY].\n\n    def __init__(self, *args, **kwds):\n        '''Initialize an ordered dictionary.  Signature is the same as for\n        regular dictionaries, but keyword arguments are not recommended\n        because their insertion order is arbitrary.\n\n        '''\n        if len(args) > 1:\n            raise TypeError('expected at most 1 arguments, got %d' % len(args))\n        try:\n            self.__root\n        except AttributeError:\n            self.__root = root = []                     # sentinel node\n            root[:] = [root, root, None]\n            self.__map = {}\n        self.__update(*args, **kwds)\n\n    def __setitem__(self, key, value, dict_setitem=dict.__setitem__):\n        'od.__setitem__(i, y) <==> od[i]=y'\n        # Setting a new item creates a new link which goes at the end of the linked\n        # list, and the inherited dictionary is updated with the new key/value pair.\n        if key not in self:\n            root = self.__root\n            last = root[0]\n            last[1] = root[0] = self.__map[key] = [last, root, key]\n        dict_setitem(self, key, value)\n\n    def __delitem__(self, key, dict_delitem=dict.__delitem__):\n        'od.__delitem__(y) <==> del od[y]'\n        # Deleting an existing item uses self.__map to find the link which is\n        # then removed by updating the links in the predecessor and successor nodes.\n        dict_delitem(self, key)\n        link_prev, link_next, key = self.__map.pop(key)\n        link_prev[1] = link_next\n        link_next[0] = link_prev\n\n    def __iter__(self):\n        'od.__iter__() <==> iter(od)'\n        root = self.__root\n        curr = root[1]\n        while curr is not root:\n            yield curr[2]\n            curr = curr[1]\n\n    def __reversed__(self):\n        'od.__reversed__() <==> reversed(od)'\n        root = self.__root\n        curr = root[0]\n        while curr is not root:\n            yield curr[2]\n            curr = curr[0]\n\n    def clear(self):\n        'od.clear() -> None.  Remove all items from od.'\n        try:\n            for node in self.__map.itervalues():\n                del node[:]\n            root = self.__root\n            root[:] = [root, root, None]\n            self.__map.clear()\n        except AttributeError:\n            pass\n        dict.clear(self)\n\n    def popitem(self, last=True):\n        '''od.popitem() -> (k, v), return and remove a (key, value) pair.\n        Pairs are returned in LIFO order if last is true or FIFO order if false.\n\n        '''\n        if not self:\n            raise KeyError('dictionary is empty')\n        root = self.__root\n        if last:\n            link = root[0]\n            link_prev = link[0]\n            link_prev[1] = root\n            root[0] = link_prev\n        else:\n            link = root[1]\n            link_next = link[1]\n            root[1] = link_next\n            link_next[0] = root\n        key = link[2]\n        del self.__map[key]\n        value = dict.pop(self, key)\n        return key, value\n\n    # -- the following methods do not depend on the internal structure --\n\n    def keys(self):\n        'od.keys() -> list of keys in od'\n        return list(self)\n\n    def values(self):\n        'od.values() -> list of values in od'\n        return [self[key] for key in self]\n\n    def items(self):\n        'od.items() -> list of (key, value) pairs in od'\n        return [(key, self[key]) for key in self]\n\n    def iterkeys(self):\n        'od.iterkeys() -> an iterator over the keys in od'\n        return iter(self)\n\n    def itervalues(self):\n        'od.itervalues -> an iterator over the values in od'\n        for k in self:\n            yield self[k]\n\n    def iteritems(self):\n        'od.iteritems -> an iterator over the (key, value) items in od'\n        for k in self:\n            yield (k, self[k])\n\n    def update(*args, **kwds):\n        '''od.update(E, **F) -> None.  Update od from dict/iterable E and F.\n\n        If E is a dict instance, does:           for k in E: od[k] = E[k]\n        If E has a .keys() method, does:         for k in E.keys(): od[k] = E[k]\n        Or if E is an iterable of items, does:   for k, v in E: od[k] = v\n        In either case, this is followed by:     for k, v in F.items(): od[k] = v\n\n        '''\n        if len(args) > 2:\n            raise TypeError('update() takes at most 2 positional '\n                            'arguments (%d given)' % (len(args),))\n        elif not args:\n            raise TypeError('update() takes at least 1 argument (0 given)')\n        self = args[0]\n        # Make progressively weaker assumptions about \"other\"\n        other = ()\n        if len(args) == 2:\n            other = args[1]\n        if isinstance(other, dict):\n            for key in other:\n                self[key] = other[key]\n        elif hasattr(other, 'keys'):\n            for key in other.keys():\n                self[key] = other[key]\n        else:\n            for key, value in other:\n                self[key] = value\n        for key, value in kwds.items():\n            self[key] = value\n\n    __update = update  # let subclasses override update without breaking __init__\n\n    __marker = object()\n\n    def pop(self, key, default=__marker):\n        '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n        If key is not found, d is returned if given, otherwise KeyError is raised.\n\n        '''\n        if key in self:\n            result = self[key]\n            del self[key]\n            return result\n        if default is self.__marker:\n            raise KeyError(key)\n        return default\n\n    def setdefault(self, key, default=None):\n        'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od'\n        if key in self:\n            return self[key]\n        self[key] = default\n        return default\n\n    def __repr__(self, _repr_running={}):\n        'od.__repr__() <==> repr(od)'\n        call_key = id(self), _get_ident()\n        if call_key in _repr_running:\n            return '...'\n        _repr_running[call_key] = 1\n        try:\n            if not self:\n                return '%s()' % (self.__class__.__name__,)\n            return '%s(%r)' % (self.__class__.__name__, self.items())\n        finally:\n            del _repr_running[call_key]\n\n    def __reduce__(self):\n        'Return state information for pickling'\n        items = [[k, self[k]] for k in self]\n        inst_dict = vars(self).copy()\n        for k in vars(OrderedDict()):\n            inst_dict.pop(k, None)\n        if inst_dict:\n            return (self.__class__, (items,), inst_dict)\n        return self.__class__, (items,)\n\n    def copy(self):\n        'od.copy() -> a shallow copy of od'\n        return self.__class__(self)\n\n    @classmethod\n    def fromkeys(cls, iterable, value=None):\n        '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S\n        and values equal to v (which defaults to None).\n\n        '''\n        d = cls()\n        for key in iterable:\n            d[key] = value\n        return d\n\n    def __eq__(self, other):\n        '''od.__eq__(y) <==> od==y.  Comparison to another OD is order-sensitive\n        while comparison to a regular mapping is order-insensitive.\n\n        '''\n        if isinstance(other, OrderedDict):\n            return len(self)==len(other) and self.items() == other.items()\n        return dict.__eq__(self, other)\n\n    def __ne__(self, other):\n        return not self == other\n\n    # -- the following methods are only used in Python 2.7 --\n\n    def viewkeys(self):\n        \"od.viewkeys() -> a set-like object providing a view on od's keys\"\n        return KeysView(self)\n\n    def viewvalues(self):\n        \"od.viewvalues() -> an object providing a view on od's values\"\n        return ValuesView(self)\n\n    def viewitems(self):\n        \"od.viewitems() -> a set-like object providing a view on od's items\"\n        return ItemsView(self)\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/urllib3/packages/six.py",
    "content": "\"\"\"Utilities for writing code that runs on Python 2 and 3\"\"\"\n\n#Copyright (c) 2010-2011 Benjamin Peterson\n\n#Permission is hereby granted, free of charge, to any person obtaining a copy of\n#this software and associated documentation files (the \"Software\"), to deal in\n#the Software without restriction, including without limitation the rights to\n#use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n#the Software, and to permit persons to whom the Software is furnished to do so,\n#subject to the following conditions:\n\n#The above copyright notice and this permission notice shall be included in all\n#copies or substantial portions of the Software.\n\n#THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n#FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n#COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n#IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n#CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nimport operator\nimport sys\nimport types\n\n__author__ = \"Benjamin Peterson <benjamin@python.org>\"\n__version__ = \"1.2.0\"  # Revision 41c74fef2ded\n\n\n# True if we are running on Python 3.\nPY3 = sys.version_info[0] == 3\n\nif PY3:\n    string_types = str,\n    integer_types = int,\n    class_types = type,\n    text_type = str\n    binary_type = bytes\n\n    MAXSIZE = sys.maxsize\nelse:\n    string_types = basestring,\n    integer_types = (int, long)\n    class_types = (type, types.ClassType)\n    text_type = unicode\n    binary_type = str\n\n    if sys.platform.startswith(\"java\"):\n        # Jython always uses 32 bits.\n        MAXSIZE = int((1 << 31) - 1)\n    else:\n        # It's possible to have sizeof(long) != sizeof(Py_ssize_t).\n        class X(object):\n            def __len__(self):\n                return 1 << 31\n        try:\n            len(X())\n        except OverflowError:\n            # 32-bit\n            MAXSIZE = int((1 << 31) - 1)\n        else:\n            # 64-bit\n            MAXSIZE = int((1 << 63) - 1)\n            del X\n\n\ndef _add_doc(func, doc):\n    \"\"\"Add documentation to a function.\"\"\"\n    func.__doc__ = doc\n\n\ndef _import_module(name):\n    \"\"\"Import module, returning the module after the last dot.\"\"\"\n    __import__(name)\n    return sys.modules[name]\n\n\nclass _LazyDescr(object):\n\n    def __init__(self, name):\n        self.name = name\n\n    def __get__(self, obj, tp):\n        result = self._resolve()\n        setattr(obj, self.name, result)\n        # This is a bit ugly, but it avoids running this again.\n        delattr(tp, self.name)\n        return result\n\n\nclass MovedModule(_LazyDescr):\n\n    def __init__(self, name, old, new=None):\n        super(MovedModule, self).__init__(name)\n        if PY3:\n            if new is None:\n                new = name\n            self.mod = new\n        else:\n            self.mod = old\n\n    def _resolve(self):\n        return _import_module(self.mod)\n\n\nclass MovedAttribute(_LazyDescr):\n\n    def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):\n        super(MovedAttribute, self).__init__(name)\n        if PY3:\n            if new_mod is None:\n                new_mod = name\n            self.mod = new_mod\n            if new_attr is None:\n                if old_attr is None:\n                    new_attr = name\n                else:\n                    new_attr = old_attr\n            self.attr = new_attr\n        else:\n            self.mod = old_mod\n            if old_attr is None:\n                old_attr = name\n            self.attr = old_attr\n\n    def _resolve(self):\n        module = _import_module(self.mod)\n        return getattr(module, self.attr)\n\n\n\nclass _MovedItems(types.ModuleType):\n    \"\"\"Lazy loading of moved objects\"\"\"\n\n\n_moved_attributes = [\n    MovedAttribute(\"cStringIO\", \"cStringIO\", \"io\", \"StringIO\"),\n    MovedAttribute(\"filter\", \"itertools\", \"builtins\", \"ifilter\", \"filter\"),\n    MovedAttribute(\"input\", \"__builtin__\", \"builtins\", \"raw_input\", \"input\"),\n    MovedAttribute(\"map\", \"itertools\", \"builtins\", \"imap\", \"map\"),\n    MovedAttribute(\"reload_module\", \"__builtin__\", \"imp\", \"reload\"),\n    MovedAttribute(\"reduce\", \"__builtin__\", \"functools\"),\n    MovedAttribute(\"StringIO\", \"StringIO\", \"io\"),\n    MovedAttribute(\"xrange\", \"__builtin__\", \"builtins\", \"xrange\", \"range\"),\n    MovedAttribute(\"zip\", \"itertools\", \"builtins\", \"izip\", \"zip\"),\n\n    MovedModule(\"builtins\", \"__builtin__\"),\n    MovedModule(\"configparser\", \"ConfigParser\"),\n    MovedModule(\"copyreg\", \"copy_reg\"),\n    MovedModule(\"http_cookiejar\", \"cookielib\", \"http.cookiejar\"),\n    MovedModule(\"http_cookies\", \"Cookie\", \"http.cookies\"),\n    MovedModule(\"html_entities\", \"htmlentitydefs\", \"html.entities\"),\n    MovedModule(\"html_parser\", \"HTMLParser\", \"html.parser\"),\n    MovedModule(\"http_client\", \"httplib\", \"http.client\"),\n    MovedModule(\"BaseHTTPServer\", \"BaseHTTPServer\", \"http.server\"),\n    MovedModule(\"CGIHTTPServer\", \"CGIHTTPServer\", \"http.server\"),\n    MovedModule(\"SimpleHTTPServer\", \"SimpleHTTPServer\", \"http.server\"),\n    MovedModule(\"cPickle\", \"cPickle\", \"pickle\"),\n    MovedModule(\"queue\", \"Queue\"),\n    MovedModule(\"reprlib\", \"repr\"),\n    MovedModule(\"socketserver\", \"SocketServer\"),\n    MovedModule(\"tkinter\", \"Tkinter\"),\n    MovedModule(\"tkinter_dialog\", \"Dialog\", \"tkinter.dialog\"),\n    MovedModule(\"tkinter_filedialog\", \"FileDialog\", \"tkinter.filedialog\"),\n    MovedModule(\"tkinter_scrolledtext\", \"ScrolledText\", \"tkinter.scrolledtext\"),\n    MovedModule(\"tkinter_simpledialog\", \"SimpleDialog\", \"tkinter.simpledialog\"),\n    MovedModule(\"tkinter_tix\", \"Tix\", \"tkinter.tix\"),\n    MovedModule(\"tkinter_constants\", \"Tkconstants\", \"tkinter.constants\"),\n    MovedModule(\"tkinter_dnd\", \"Tkdnd\", \"tkinter.dnd\"),\n    MovedModule(\"tkinter_colorchooser\", \"tkColorChooser\",\n                \"tkinter.colorchooser\"),\n    MovedModule(\"tkinter_commondialog\", \"tkCommonDialog\",\n                \"tkinter.commondialog\"),\n    MovedModule(\"tkinter_tkfiledialog\", \"tkFileDialog\", \"tkinter.filedialog\"),\n    MovedModule(\"tkinter_font\", \"tkFont\", \"tkinter.font\"),\n    MovedModule(\"tkinter_messagebox\", \"tkMessageBox\", \"tkinter.messagebox\"),\n    MovedModule(\"tkinter_tksimpledialog\", \"tkSimpleDialog\",\n                \"tkinter.simpledialog\"),\n    MovedModule(\"urllib_robotparser\", \"robotparser\", \"urllib.robotparser\"),\n    MovedModule(\"winreg\", \"_winreg\"),\n]\nfor attr in _moved_attributes:\n    setattr(_MovedItems, attr.name, attr)\ndel attr\n\nmoves = sys.modules[__name__ + \".moves\"] = _MovedItems(\"moves\")\n\n\ndef add_move(move):\n    \"\"\"Add an item to six.moves.\"\"\"\n    setattr(_MovedItems, move.name, move)\n\n\ndef remove_move(name):\n    \"\"\"Remove item from six.moves.\"\"\"\n    try:\n        delattr(_MovedItems, name)\n    except AttributeError:\n        try:\n            del moves.__dict__[name]\n        except KeyError:\n            raise AttributeError(\"no such move, %r\" % (name,))\n\n\nif PY3:\n    _meth_func = \"__func__\"\n    _meth_self = \"__self__\"\n\n    _func_code = \"__code__\"\n    _func_defaults = \"__defaults__\"\n\n    _iterkeys = \"keys\"\n    _itervalues = \"values\"\n    _iteritems = \"items\"\nelse:\n    _meth_func = \"im_func\"\n    _meth_self = \"im_self\"\n\n    _func_code = \"func_code\"\n    _func_defaults = \"func_defaults\"\n\n    _iterkeys = \"iterkeys\"\n    _itervalues = \"itervalues\"\n    _iteritems = \"iteritems\"\n\n\ntry:\n    advance_iterator = next\nexcept NameError:\n    def advance_iterator(it):\n        return it.next()\nnext = advance_iterator\n\n\nif PY3:\n    def get_unbound_function(unbound):\n        return unbound\n\n    Iterator = object\n\n    def callable(obj):\n        return any(\"__call__\" in klass.__dict__ for klass in type(obj).__mro__)\nelse:\n    def get_unbound_function(unbound):\n        return unbound.im_func\n\n    class Iterator(object):\n\n        def next(self):\n            return type(self).__next__(self)\n\n    callable = callable\n_add_doc(get_unbound_function,\n         \"\"\"Get the function out of a possibly unbound function\"\"\")\n\n\nget_method_function = operator.attrgetter(_meth_func)\nget_method_self = operator.attrgetter(_meth_self)\nget_function_code = operator.attrgetter(_func_code)\nget_function_defaults = operator.attrgetter(_func_defaults)\n\n\ndef iterkeys(d):\n    \"\"\"Return an iterator over the keys of a dictionary.\"\"\"\n    return iter(getattr(d, _iterkeys)())\n\ndef itervalues(d):\n    \"\"\"Return an iterator over the values of a dictionary.\"\"\"\n    return iter(getattr(d, _itervalues)())\n\ndef iteritems(d):\n    \"\"\"Return an iterator over the (key, value) pairs of a dictionary.\"\"\"\n    return iter(getattr(d, _iteritems)())\n\n\nif PY3:\n    def b(s):\n        return s.encode(\"latin-1\")\n    def u(s):\n        return s\n    if sys.version_info[1] <= 1:\n        def int2byte(i):\n            return bytes((i,))\n    else:\n        # This is about 2x faster than the implementation above on 3.2+\n        int2byte = operator.methodcaller(\"to_bytes\", 1, \"big\")\n    import io\n    StringIO = io.StringIO\n    BytesIO = io.BytesIO\nelse:\n    def b(s):\n        return s\n    def u(s):\n        return unicode(s, \"unicode_escape\")\n    int2byte = chr\n    import StringIO\n    StringIO = BytesIO = StringIO.StringIO\n_add_doc(b, \"\"\"Byte literal\"\"\")\n_add_doc(u, \"\"\"Text literal\"\"\")\n\n\nif PY3:\n    import builtins\n    exec_ = getattr(builtins, \"exec\")\n\n\n    def reraise(tp, value, tb=None):\n        if value.__traceback__ is not tb:\n            raise value.with_traceback(tb)\n        raise value\n\n\n    print_ = getattr(builtins, \"print\")\n    del builtins\n\nelse:\n    def exec_(code, globs=None, locs=None):\n        \"\"\"Execute code in a namespace.\"\"\"\n        if globs is None:\n            frame = sys._getframe(1)\n            globs = frame.f_globals\n            if locs is None:\n                locs = frame.f_locals\n            del frame\n        elif locs is None:\n            locs = globs\n        exec(\"\"\"exec code in globs, locs\"\"\")\n\n\n    exec_(\"\"\"def reraise(tp, value, tb=None):\n    raise tp, value, tb\n\"\"\")\n\n\n    def print_(*args, **kwargs):\n        \"\"\"The new-style print function.\"\"\"\n        fp = kwargs.pop(\"file\", sys.stdout)\n        if fp is None:\n            return\n        def write(data):\n            if not isinstance(data, basestring):\n                data = str(data)\n            fp.write(data)\n        want_unicode = False\n        sep = kwargs.pop(\"sep\", None)\n        if sep is not None:\n            if isinstance(sep, unicode):\n                want_unicode = True\n            elif not isinstance(sep, str):\n                raise TypeError(\"sep must be None or a string\")\n        end = kwargs.pop(\"end\", None)\n        if end is not None:\n            if isinstance(end, unicode):\n                want_unicode = True\n            elif not isinstance(end, str):\n                raise TypeError(\"end must be None or a string\")\n        if kwargs:\n            raise TypeError(\"invalid keyword arguments to print()\")\n        if not want_unicode:\n            for arg in args:\n                if isinstance(arg, unicode):\n                    want_unicode = True\n                    break\n        if want_unicode:\n            newline = unicode(\"\\n\")\n            space = unicode(\" \")\n        else:\n            newline = \"\\n\"\n            space = \" \"\n        if sep is None:\n            sep = space\n        if end is None:\n            end = newline\n        for i, arg in enumerate(args):\n            if i:\n                write(sep)\n            write(arg)\n        write(end)\n\n_add_doc(reraise, \"\"\"Reraise an exception.\"\"\")\n\n\ndef with_metaclass(meta, base=object):\n    \"\"\"Create a base class with a metaclass.\"\"\"\n    return meta(\"NewBase\", (base,), {})\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py",
    "content": "\"\"\"The match_hostname() function from Python 3.2, essential when using SSL.\"\"\"\n\nimport re\n\n__version__ = '3.2.2'\n\nclass CertificateError(ValueError):\n    pass\n\ndef _dnsname_to_pat(dn):\n    pats = []\n    for frag in dn.split(r'.'):\n        if frag == '*':\n            # When '*' is a fragment by itself, it matches a non-empty dotless\n            # fragment.\n            pats.append('[^.]+')\n        else:\n            # Otherwise, '*' matches any dotless fragment.\n            frag = re.escape(frag)\n            pats.append(frag.replace(r'\\*', '[^.]*'))\n    return re.compile(r'\\A' + r'\\.'.join(pats) + r'\\Z', re.IGNORECASE)\n\ndef match_hostname(cert, hostname):\n    \"\"\"Verify that *cert* (in decoded format as returned by\n    SSLSocket.getpeercert()) matches the *hostname*.  RFC 2818 rules\n    are mostly followed, but IP addresses are not accepted for *hostname*.\n\n    CertificateError is raised on failure. On success, the function\n    returns nothing.\n    \"\"\"\n    if not cert:\n        raise ValueError(\"empty or no certificate\")\n    dnsnames = []\n    san = cert.get('subjectAltName', ())\n    for key, value in san:\n        if key == 'DNS':\n            if _dnsname_to_pat(value).match(hostname):\n                return\n            dnsnames.append(value)\n    if not dnsnames:\n        # The subject is only checked when there is no dNSName entry\n        # in subjectAltName\n        for sub in cert.get('subject', ()):\n            for key, value in sub:\n                # XXX according to RFC 2818, the most specific Common Name\n                # must be used.\n                if key == 'commonName':\n                    if _dnsname_to_pat(value).match(hostname):\n                        return\n                    dnsnames.append(value)\n    if len(dnsnames) > 1:\n        raise CertificateError(\"hostname %r \"\n            \"doesn't match either of %s\"\n            % (hostname, ', '.join(map(repr, dnsnames))))\n    elif len(dnsnames) == 1:\n        raise CertificateError(\"hostname %r \"\n            \"doesn't match %r\"\n            % (hostname, dnsnames[0]))\n    else:\n        raise CertificateError(\"no appropriate commonName or \"\n            \"subjectAltName fields were found\")\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/urllib3/poolmanager.py",
    "content": "# urllib3/poolmanager.py\n# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt)\n#\n# This module is part of urllib3 and is released under\n# the MIT License: http://www.opensource.org/licenses/mit-license.php\n\nimport logging\n\ntry:  # Python 3\n    from urllib.parse import urljoin\nexcept ImportError:\n    from urlparse import urljoin\n\nfrom ._collections import RecentlyUsedContainer\nfrom .connectionpool import HTTPConnectionPool, HTTPSConnectionPool\nfrom .connectionpool import connection_from_url, port_by_scheme\nfrom .request import RequestMethods\nfrom .util import parse_url\n\n\n__all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url']\n\n\npool_classes_by_scheme = {\n    'http': HTTPConnectionPool,\n    'https': HTTPSConnectionPool,\n}\n\nlog = logging.getLogger(__name__)\n\nSSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs',\n                'ssl_version')\n\n\nclass PoolManager(RequestMethods):\n    \"\"\"\n    Allows for arbitrary requests while transparently keeping track of\n    necessary connection pools for you.\n\n    :param num_pools:\n        Number of connection pools to cache before discarding the least\n        recently used pool.\n\n    :param headers:\n        Headers to include with all requests, unless other headers are given\n        explicitly.\n\n    :param \\**connection_pool_kw:\n        Additional parameters are used to create fresh\n        :class:`urllib3.connectionpool.ConnectionPool` instances.\n\n    Example: ::\n\n        >>> manager = PoolManager(num_pools=2)\n        >>> r = manager.request('GET', 'http://google.com/')\n        >>> r = manager.request('GET', 'http://google.com/mail')\n        >>> r = manager.request('GET', 'http://yahoo.com/')\n        >>> len(manager.pools)\n        2\n\n    \"\"\"\n\n    def __init__(self, num_pools=10, headers=None, **connection_pool_kw):\n        RequestMethods.__init__(self, headers)\n        self.connection_pool_kw = connection_pool_kw\n        self.pools = RecentlyUsedContainer(num_pools,\n                                           dispose_func=lambda p: p.close())\n\n    def _new_pool(self, scheme, host, port):\n        \"\"\"\n        Create a new :class:`ConnectionPool` based on host, port and scheme.\n\n        This method is used to actually create the connection pools handed out\n        by :meth:`connection_from_url` and companion methods. It is intended\n        to be overridden for customization.\n        \"\"\"\n        pool_cls = pool_classes_by_scheme[scheme]\n        kwargs = self.connection_pool_kw\n        if scheme == 'http':\n            kwargs = self.connection_pool_kw.copy()\n            for kw in SSL_KEYWORDS:\n                kwargs.pop(kw, None)\n\n        return pool_cls(host, port, **kwargs)\n\n    def clear(self):\n        \"\"\"\n        Empty our store of pools and direct them all to close.\n\n        This will not affect in-flight connections, but they will not be\n        re-used after completion.\n        \"\"\"\n        self.pools.clear()\n\n    def connection_from_host(self, host, port=None, scheme='http'):\n        \"\"\"\n        Get a :class:`ConnectionPool` based on the host, port, and scheme.\n\n        If ``port`` isn't given, it will be derived from the ``scheme`` using\n        ``urllib3.connectionpool.port_by_scheme``.\n        \"\"\"\n        scheme = scheme or 'http'\n        port = port or port_by_scheme.get(scheme, 80)\n\n        pool_key = (scheme, host, port)\n\n        with self.pools.lock:\n          # If the scheme, host, or port doesn't match existing open connections,\n          # open a new ConnectionPool.\n          pool = self.pools.get(pool_key)\n          if pool:\n              return pool\n\n          # Make a fresh ConnectionPool of the desired type\n          pool = self._new_pool(scheme, host, port)\n          self.pools[pool_key] = pool\n        return pool\n\n    def connection_from_url(self, url):\n        \"\"\"\n        Similar to :func:`urllib3.connectionpool.connection_from_url` but\n        doesn't pass any additional parameters to the\n        :class:`urllib3.connectionpool.ConnectionPool` constructor.\n\n        Additional parameters are taken from the :class:`.PoolManager`\n        constructor.\n        \"\"\"\n        u = parse_url(url)\n        return self.connection_from_host(u.host, port=u.port, scheme=u.scheme)\n\n    def urlopen(self, method, url, redirect=True, **kw):\n        \"\"\"\n        Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen`\n        with custom cross-host redirect logic and only sends the request-uri\n        portion of the ``url``.\n\n        The given ``url`` parameter must be absolute, such that an appropriate\n        :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it.\n        \"\"\"\n        u = parse_url(url)\n        conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme)\n\n        kw['assert_same_host'] = False\n        kw['redirect'] = False\n        if 'headers' not in kw:\n            kw['headers'] = self.headers\n\n        response = conn.urlopen(method, u.request_uri, **kw)\n\n        redirect_location = redirect and response.get_redirect_location()\n        if not redirect_location:\n            return response\n\n        # Support relative URLs for redirecting.\n        redirect_location = urljoin(url, redirect_location)\n\n        # RFC 2616, Section 10.3.4\n        if response.status == 303:\n            method = 'GET'\n\n        log.info(\"Redirecting %s -> %s\" % (url, redirect_location))\n        kw['retries'] = kw.get('retries', 3) - 1  # Persist retries countdown\n        kw['redirect'] = redirect\n        return self.urlopen(method, redirect_location, **kw)\n\n\nclass ProxyManager(RequestMethods):\n    \"\"\"\n    Given a ConnectionPool to a proxy, the ProxyManager's ``urlopen`` method\n    will make requests to any url through the defined proxy. The ProxyManager\n    class will automatically set the 'Host' header if it is not provided.\n    \"\"\"\n\n    def __init__(self, proxy_pool):\n        self.proxy_pool = proxy_pool\n\n    def _set_proxy_headers(self, url, headers=None):\n        \"\"\"\n        Sets headers needed by proxies: specifically, the Accept and Host\n        headers. Only sets headers not provided by the user.\n        \"\"\"\n        headers_ = {'Accept': '*/*'}\n\n        netloc = parse_url(url).netloc\n        if netloc:\n            headers_['Host'] = netloc\n\n        if headers:\n            headers_.update(headers)\n\n        return headers_\n\n    def urlopen(self, method, url, **kw):\n        \"Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute.\"\n        kw['assert_same_host'] = False\n        kw['headers'] = self._set_proxy_headers(url, headers=kw.get('headers'))\n        return self.proxy_pool.urlopen(method, url, **kw)\n\n\ndef proxy_from_url(url, **pool_kw):\n    proxy_pool = connection_from_url(url, **pool_kw)\n    return ProxyManager(proxy_pool)\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/urllib3/request.py",
    "content": "# urllib3/request.py\n# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt)\n#\n# This module is part of urllib3 and is released under\n# the MIT License: http://www.opensource.org/licenses/mit-license.php\n\ntry:\n    from urllib.parse import urlencode\nexcept ImportError:\n    from urllib import urlencode\n\nfrom .filepost import encode_multipart_formdata\n\n\n__all__ = ['RequestMethods']\n\n\nclass RequestMethods(object):\n    \"\"\"\n    Convenience mixin for classes who implement a :meth:`urlopen` method, such\n    as :class:`~urllib3.connectionpool.HTTPConnectionPool` and\n    :class:`~urllib3.poolmanager.PoolManager`.\n\n    Provides behavior for making webvul types of HTTP request methods and\n    decides which type of request field encoding to use.\n\n    Specifically,\n\n    :meth:`.request_encode_url` is for sending requests whose fields are encoded\n    in the URL (such as GET, HEAD, DELETE).\n\n    :meth:`.request_encode_body` is for sending requests whose fields are\n    encoded in the *body* of the request using multipart or www-form-urlencoded\n    (such as for POST, PUT, PATCH).\n\n    :meth:`.request` is for making any kind of request, it will look up the\n    appropriate encoding format and use one of the above two methods to make\n    the request.\n\n    Initializer parameters:\n\n    :param headers:\n        Headers to include with all requests, unless other headers are given\n        explicitly.\n    \"\"\"\n\n    _encode_url_methods = set(['DELETE', 'GET', 'HEAD', 'OPTIONS'])\n    _encode_body_methods = set(['PATCH', 'POST', 'PUT', 'TRACE'])\n\n    def __init__(self, headers=None):\n        self.headers = headers or {}\n\n    def urlopen(self, method, url, body=None, headers=None,\n                encode_multipart=True, multipart_boundary=None,\n                **kw): # Abstract\n        raise NotImplemented(\"Classes extending RequestMethods must implement \"\n                             \"their own ``urlopen`` method.\")\n\n    def request(self, method, url, fields=None, headers=None, **urlopen_kw):\n        \"\"\"\n        Make a request using :meth:`urlopen` with the appropriate encoding of\n        ``fields`` based on the ``method`` used.\n\n        This is a convenience method that requires the least amount of manual\n        effort. It can be used in most situations, while still having the option\n        to drop down to more specific methods when necessary, such as\n        :meth:`request_encode_url`, :meth:`request_encode_body`,\n        or even the lowest level :meth:`urlopen`.\n        \"\"\"\n        method = method.upper()\n\n        if method in self._encode_url_methods:\n            return self.request_encode_url(method, url, fields=fields,\n                                            headers=headers,\n                                            **urlopen_kw)\n        else:\n            return self.request_encode_body(method, url, fields=fields,\n                                             headers=headers,\n                                             **urlopen_kw)\n\n    def request_encode_url(self, method, url, fields=None, **urlopen_kw):\n        \"\"\"\n        Make a request using :meth:`urlopen` with the ``fields`` encoded in\n        the url. This is useful for request methods like GET, HEAD, DELETE, etc.\n        \"\"\"\n        if fields:\n            url += '?' + urlencode(fields)\n        return self.urlopen(method, url, **urlopen_kw)\n\n    def request_encode_body(self, method, url, fields=None, headers=None,\n                            encode_multipart=True, multipart_boundary=None,\n                            **urlopen_kw):\n        \"\"\"\n        Make a request using :meth:`urlopen` with the ``fields`` encoded in\n        the body. This is useful for request methods like POST, PUT, PATCH, etc.\n\n        When ``encode_multipart=True`` (default), then\n        :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode the\n        payload with the appropriate content type. Otherwise\n        :meth:`urllib.urlencode` is used with the\n        'application/x-www-form-urlencoded' content type.\n\n        Multipart encoding must be used when posting files, and it's reasonably\n        safe to use it in other times too. However, it may break request signing,\n        such as with OAuth.\n\n        Supports an optional ``fields`` parameter of key/value strings AND\n        key/filetuple. A filetuple is a (filename, data, MIME type) tuple where\n        the MIME type is optional. For example: ::\n\n            fields = {\n                'foo': 'bar',\n                'fakefile': ('foofile.txt', 'contents of foofile'),\n                'realfile': ('barfile.txt', open('realfile').read()),\n                'typedfile': ('bazfile.bin', open('bazfile').read(),\n                              'image/jpeg'),\n                'nonamefile': 'contents of nonamefile field',\n            }\n\n        When uploading a file, providing a filename (the first parameter of the\n        tuple) is optional but recommended to best mimick behavior of browsers.\n\n        Note that if ``headers`` are supplied, the 'Content-Type' header will be\n        overwritten because it depends on the dynamic random boundary string\n        which is used to compose the body of the request. The random boundary\n        string can be explicitly set with the ``multipart_boundary`` parameter.\n        \"\"\"\n        if encode_multipart:\n            body, content_type = encode_multipart_formdata(fields or {},\n                                    boundary=multipart_boundary)\n        else:\n            body, content_type = (urlencode(fields or {}),\n                                    'application/x-www-form-urlencoded')\n\n        if headers is None:\n            headers = self.headers\n\n        headers_ = {'Content-Type': content_type}\n        headers_.update(headers)\n\n        return self.urlopen(method, url, body=body, headers=headers_,\n                            **urlopen_kw)\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/urllib3/response.py",
    "content": "# urllib3/response.py\n# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt)\n#\n# This module is part of urllib3 and is released under\n# the MIT License: http://www.opensource.org/licenses/mit-license.php\n\n\nimport logging\nimport zlib\nimport io\n\nfrom .exceptions import DecodeError\nfrom .packages.six import string_types as basestring, binary_type\nfrom .util import is_fp_closed\n\n\nlog = logging.getLogger(__name__)\n\n\nclass DeflateDecoder(object):\n\n    def __init__(self):\n        self._first_try = True\n        self._data = binary_type()\n        self._obj = zlib.decompressobj()\n\n    def __getattr__(self, name):\n        return getattr(self._obj, name)\n\n    def decompress(self, data):\n        if not self._first_try:\n            return self._obj.decompress(data)\n\n        self._data += data\n        try:\n            return self._obj.decompress(data)\n        except zlib.error:\n            self._first_try = False\n            self._obj = zlib.decompressobj(-zlib.MAX_WBITS)\n            try:\n                return self.decompress(self._data)\n            finally:\n                self._data = None\n\n\ndef _get_decoder(mode):\n    if mode == 'gzip':\n        return zlib.decompressobj(16 + zlib.MAX_WBITS)\n\n    return DeflateDecoder()\n\n\nclass HTTPResponse(io.IOBase):\n    \"\"\"\n    HTTP Response container.\n\n    Backwards-compatible to httplib's HTTPResponse but the response ``body`` is\n    loaded and decoded on-demand when the ``data`` property is accessed.\n\n    Extra parameters for behaviour not present in httplib.HTTPResponse:\n\n    :param preload_content:\n        If True, the response's body will be preloaded during construction.\n\n    :param decode_content:\n        If True, attempts to decode specific content-encoding's based on headers\n        (like 'gzip' and 'deflate') will be skipped and raw data will be used\n        instead.\n\n    :param original_response:\n        When this HTTPResponse wrapper is generated from an httplib.HTTPResponse\n        object, it's convenient to include the original for debug purposes. It's\n        otherwise unused.\n    \"\"\"\n\n    CONTENT_DECODERS = ['gzip', 'deflate']\n\n    def __init__(self, body='', headers=None, status=0, version=0, reason=None,\n                 strict=0, preload_content=True, decode_content=True,\n                 original_response=None, pool=None, connection=None):\n        self.headers = headers or {}\n        self.status = status\n        self.version = version\n        self.reason = reason\n        self.strict = strict\n        self.decode_content = decode_content\n\n        self._decoder = None\n        self._body = body if body and isinstance(body, basestring) else None\n        self._fp = None\n        self._original_response = original_response\n\n        self._pool = pool\n        self._connection = connection\n\n        if hasattr(body, 'read'):\n            self._fp = body\n\n        if preload_content and not self._body:\n            self._body = self.read(decode_content=decode_content)\n\n    def get_redirect_location(self):\n        \"\"\"\n        Should we redirect and where to?\n\n        :returns: Truthy redirect location string if we got a redirect status\n            code and valid location. ``None`` if redirect status and no\n            location. ``False`` if not a redirect status code.\n        \"\"\"\n        if self.status in [301, 302, 303, 307]:\n            return self.headers.get('location')\n\n        return False\n\n    def release_conn(self):\n        if not self._pool or not self._connection:\n            return\n\n        self._pool._put_conn(self._connection)\n        self._connection = None\n\n    @property\n    def data(self):\n        # For backwords-compat with earlier urllib3 0.4 and earlier.\n        if self._body:\n            return self._body\n\n        if self._fp:\n            return self.read(cache_content=True)\n\n    def read(self, amt=None, decode_content=None, cache_content=False):\n        \"\"\"\n        Similar to :meth:`httplib.HTTPResponse.read`, but with two additional\n        parameters: ``decode_content`` and ``cache_content``.\n\n        :param amt:\n            How much of the content to read. If specified, caching is skipped\n            because it doesn't make sense to cache partial content as the full\n            response.\n\n        :param decode_content:\n            If True, will attempt to decode the body based on the\n            'content-encoding' header.\n\n        :param cache_content:\n            If True, will save the returned data such that the same result is\n            returned despite of the state of the underlying file object. This\n            is useful if you want the ``.data`` property to continue working\n            after having ``.read()`` the file object. (Overridden if ``amt`` is\n            set.)\n        \"\"\"\n        # Note: content-encoding value should be case-insensitive, per RFC 2616\n        # Section 3.5\n        content_encoding = self.headers.get('content-encoding', '').lower()\n        if self._decoder is None:\n            if content_encoding in self.CONTENT_DECODERS:\n                self._decoder = _get_decoder(content_encoding)\n        if decode_content is None:\n            decode_content = self.decode_content\n\n        if self._fp is None:\n            return\n\n        flush_decoder = False\n\n        try:\n            if amt is None:\n                # cStringIO doesn't like amt=None\n                data = self._fp.read()\n                flush_decoder = True\n            else:\n                cache_content = False\n                data = self._fp.read(amt)\n                if amt != 0 and not data:  # Platform-specific: Buggy versions of Python.\n                    # Close the connection when no data is returned\n                    #\n                    # This is redundant to what httplib/http.client _should_\n                    # already do.  However, versions of python released before\n                    # December 15, 2012 (http://bugs.python.org/issue16298) do not\n                    # properly close the connection in all cases. There is no harm\n                    # in redundantly calling close.\n                    self._fp.close()\n                    flush_decoder = True\n\n            try:\n                if decode_content and self._decoder:\n                    data = self._decoder.decompress(data)\n            except (IOError, zlib.error) as e:\n                raise DecodeError(\n                    \"Received response with content-encoding: %s, but \"\n                    \"failed to decode it.\" % content_encoding,\n                    e)\n\n            if flush_decoder and self._decoder:\n                buf = self._decoder.decompress(binary_type())\n                data += buf + self._decoder.flush()\n\n            if cache_content:\n                self._body = data\n\n            return data\n\n        finally:\n            if self._original_response and self._original_response.isclosed():\n                self.release_conn()\n\n    def stream(self, amt=2**16, decode_content=None):\n        \"\"\"\n        A generator wrapper for the read() method. A call will block until\n        ``amt`` bytes have been read from the connection or until the\n        connection is closed.\n\n        :param amt:\n            How much of the content to read. The generator will return up to\n            much data per iteration, but may return less. This is particularly\n            likely when using compressed data. However, the empty string will\n            never be returned.\n\n        :param decode_content:\n            If True, will attempt to decode the body based on the\n            'content-encoding' header.\n        \"\"\"\n        while not is_fp_closed(self._fp):\n            data = self.read(amt=amt, decode_content=decode_content)\n\n            if data:\n                yield data\n\n\n    @classmethod\n    def from_httplib(ResponseCls, r, **response_kw):\n        \"\"\"\n        Given an :class:`httplib.HTTPResponse` instance ``r``, return a\n        corresponding :class:`urllib3.response.HTTPResponse` object.\n\n        Remaining parameters are passed to the HTTPResponse constructor, along\n        with ``original_response=r``.\n        \"\"\"\n\n        # Normalize headers between different versions of Python\n        headers = {}\n        for k, v in r.getheaders():\n            # Python 3: Header keys are returned capitalised\n            k = k.lower()\n\n            has_value = headers.get(k)\n            if has_value: # Python 3: Repeating header keys are unmerged.\n                v = ', '.join([has_value, v])\n\n            headers[k] = v\n\n        # HTTPResponse objects in Python 3 don't have a .strict attribute\n        strict = getattr(r, 'strict', 0)\n        return ResponseCls(body=r,\n                           headers=headers,\n                           status=r.status,\n                           version=r.version,\n                           reason=r.reason,\n                           strict=strict,\n                           original_response=r,\n                           **response_kw)\n\n    # Backwards-compatibility methods for httplib.HTTPResponse\n    def getheaders(self):\n        return self.headers\n\n    def getheader(self, name, default=None):\n        return self.headers.get(name, default)\n\n    # Overrides from io.IOBase\n    def close(self):\n        if not self.closed:\n            self._fp.close()\n\n    @property\n    def closed(self):\n        if self._fp is None:\n            return True\n        elif hasattr(self._fp, 'closed'):\n            return self._fp.closed\n        elif hasattr(self._fp, 'isclosed'):  # Python 2\n            return self._fp.isclosed()\n        else:\n            return True\n\n    def fileno(self):\n        if self._fp is None:\n            raise IOError(\"HTTPResponse has no file to get a fileno from\")\n        elif hasattr(self._fp, \"fileno\"):\n            return self._fp.fileno()\n        else:\n            raise IOError(\"The file-like object  this HTTPResponse is wrapped \"\n                          \"around has no file descriptor\")\n\n    def flush(self):\n        if self._fp is not None and hasattr(self._fp, 'flush'):\n            return self._fp.flush()\n\n    def readable(self):\n        return True\n"
  },
  {
    "path": "thirdparty_libs/requests/packages/urllib3/util.py",
    "content": "# urllib3/util.py\n# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt)\n#\n# This module is part of urllib3 and is released under\n# the MIT License: http://www.opensource.org/licenses/mit-license.php\n\n\nfrom base64 import b64encode\nfrom collections import namedtuple\nfrom socket import error as SocketError\nfrom hashlib import md5, sha1\nfrom binascii import hexlify, unhexlify\n\ntry:\n    from select import poll, POLLIN\nexcept ImportError:  # `poll` doesn't exist on OSX and other platforms\n    poll = False\n    try:\n        from select import select\n    except ImportError:  # `select` doesn't exist on AppEngine.\n        select = False\n\ntry:  # Test for SSL features\n    SSLContext = None\n    HAS_SNI = False\n\n    import ssl\n    from ssl import wrap_socket, CERT_NONE, PROTOCOL_SSLv23\n    from ssl import SSLContext  # Modern SSL?\n    from ssl import HAS_SNI  # Has SNI?\nexcept ImportError:\n    pass\n\nfrom .packages import six\nfrom .exceptions import LocationParseError, SSLError\n\n\nclass Url(namedtuple('Url', ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'])):\n    \"\"\"\n    Datastructure for representing an HTTP URL. Used as a return value for\n    :func:`parse_url`.\n    \"\"\"\n    slots = ()\n\n    def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, query=None, fragment=None):\n        return super(Url, cls).__new__(cls, scheme, auth, host, port, path, query, fragment)\n\n    @property\n    def hostname(self):\n        \"\"\"For backwards-compatibility with urlparse. We're nice like that.\"\"\"\n        return self.host\n\n    @property\n    def request_uri(self):\n        \"\"\"Absolute path including the query string.\"\"\"\n        uri = self.path or '/'\n\n        if self.query is not None:\n            uri += '?' + self.query\n\n        return uri\n\n    @property\n    def netloc(self):\n        \"\"\"Network location including host and port\"\"\"\n        if self.port:\n            return '%s:%d' % (self.host, self.port)\n        return self.host\n\n\ndef split_first(s, delims):\n    \"\"\"\n    Given a string and an iterable of delimiters, split on the first found\n    delimiter. Return two split parts and the matched delimiter.\n\n    If not found, then the first part is the full input string.\n\n    Example: ::\n\n        >>> split_first('foo/bar?baz', '?/=')\n        ('foo', 'bar?baz', '/')\n        >>> split_first('foo/bar?baz', '123')\n        ('foo/bar?baz', '', None)\n\n    Scales linearly with number of delims. Not ideal for large number of delims.\n    \"\"\"\n    min_idx = None\n    min_delim = None\n    for d in delims:\n        idx = s.find(d)\n        if idx < 0:\n            continue\n\n        if min_idx is None or idx < min_idx:\n            min_idx = idx\n            min_delim = d\n\n    if min_idx is None or min_idx < 0:\n        return s, '', None\n\n    return s[:min_idx], s[min_idx+1:], min_delim\n\n\ndef parse_url(url):\n    \"\"\"\n    Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is\n    performed to parse incomplete urls. Fields not provided will be None.\n\n    Partly backwards-compatible with :mod:`urlparse`.\n\n    Example: ::\n\n        >>> parse_url('http://google.com/mail/')\n        Url(scheme='http', host='google.com', port=None, path='/', ...)\n        >>> parse_url('google.com:80')\n        Url(scheme=None, host='google.com', port=80, path=None, ...)\n        >>> parse_url('/foo?bar')\n        Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...)\n    \"\"\"\n\n    # While this code has overlap with stdlib's urlparse, it is much\n    # simplified for our needs and less annoying.\n    # Additionally, this implementations does silly things to be optimal\n    # on CPython.\n\n    scheme = None\n    auth = None\n    host = None\n    port = None\n    path = None\n    fragment = None\n    query = None\n\n    # Scheme\n    if '://' in url:\n        scheme, url = url.split('://', 1)\n\n    # Find the earliest Authority Terminator\n    # (http://tools.ietf.org/html/rfc3986#section-3.2)\n    url, path_, delim = split_first(url, ['/', '?', '#'])\n\n    if delim:\n        # Reassemble the path\n        path = delim + path_\n\n    # Auth\n    if '@' in url:\n        auth, url = url.split('@', 1)\n\n    # IPv6\n    if url and url[0] == '[':\n        host, url = url.split(']', 1)\n        host += ']'\n\n    # Port\n    if ':' in url:\n        _host, port = url.split(':', 1)\n\n        if not host:\n            host = _host\n\n        if not port.isdigit():\n            raise LocationParseError(\"Failed to parse: %s\" % url)\n\n        port = int(port)\n\n    elif not host and url:\n        host = url\n\n    if not path:\n        return Url(scheme, auth, host, port, path, query, fragment)\n\n    # Fragment\n    if '#' in path:\n        path, fragment = path.split('#', 1)\n\n    # Query\n    if '?' in path:\n        path, query = path.split('?', 1)\n\n    return Url(scheme, auth, host, port, path, query, fragment)\n\n\ndef get_host(url):\n    \"\"\"\n    Deprecated. Use :func:`.parse_url` instead.\n    \"\"\"\n    p = parse_url(url)\n    return p.scheme or 'http', p.hostname, p.port\n\n\ndef make_headers(keep_alive=None, accept_encoding=None, user_agent=None,\n                 basic_auth=None):\n    \"\"\"\n    Shortcuts for generating request headers.\n\n    :param keep_alive:\n        If ``True``, adds 'connection: keep-alive' header.\n\n    :param accept_encoding:\n        Can be a boolean, list, or string.\n        ``True`` translates to 'gzip,deflate'.\n        List will get joined by comma.\n        String will be used as provided.\n\n    :param user_agent:\n        String representing the user-agent you want, such as\n        \"python-urllib3/0.6\"\n\n    :param basic_auth:\n        Colon-separated username:password string for 'authorization: basic ...'\n        auth header.\n\n    Example: ::\n\n        >>> make_headers(keep_alive=True, user_agent=\"Batman/1.0\")\n        {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'}\n        >>> make_headers(accept_encoding=True)\n        {'accept-encoding': 'gzip,deflate'}\n    \"\"\"\n    headers = {}\n    if accept_encoding:\n        if isinstance(accept_encoding, str):\n            pass\n        elif isinstance(accept_encoding, list):\n            accept_encoding = ','.join(accept_encoding)\n        else:\n            accept_encoding = 'gzip,deflate'\n        headers['accept-encoding'] = accept_encoding\n\n    if user_agent:\n        headers['user-agent'] = user_agent\n\n    if keep_alive:\n        headers['connection'] = 'keep-alive'\n\n    if basic_auth:\n        headers['authorization'] = 'Basic ' + \\\n            b64encode(six.b(basic_auth)).decode('utf-8')\n\n    return headers\n\n\ndef is_connection_dropped(conn):  # Platform-specific\n    \"\"\"\n    Returns True if the connection is dropped and should be closed.\n\n    :param conn:\n        :class:`httplib.HTTPConnection` object.\n\n    Note: For platforms like AppEngine, this will always return ``False`` to\n    let the platform handle connection recycling transparently for us.\n    \"\"\"\n    sock = getattr(conn, 'sock', False)\n    if not sock: # Platform-specific: AppEngine\n        return False\n\n    if not poll:\n        if not select: # Platform-specific: AppEngine\n            return False\n\n        try:\n            return select([sock], [], [], 0.0)[0]\n        except SocketError:\n            return True\n\n    # This version is better on platforms that support it.\n    p = poll()\n    p.register(sock, POLLIN)\n    for (fno, ev) in p.poll(0.0):\n        if fno == sock.fileno():\n            # Either data is buffered (bad), or the connection is dropped.\n            return True\n\n\ndef resolve_cert_reqs(candidate):\n    \"\"\"\n    Resolves the argument to a numeric constant, which can be passed to\n    the wrap_socket function/method from the ssl module.\n    Defaults to :data:`ssl.CERT_NONE`.\n    If given a string it is assumed to be the name of the constant in the\n    :mod:`ssl` module or its abbrevation.\n    (So you can specify `REQUIRED` instead of `CERT_REQUIRED`.\n    If it's neither `None` nor a string we assume it is already the numeric\n    constant which can directly be passed to wrap_socket.\n    \"\"\"\n    if candidate is None:\n        return CERT_NONE\n\n    if isinstance(candidate, str):\n        res = getattr(ssl, candidate, None)\n        if res is None:\n            res = getattr(ssl, 'CERT_' + candidate)\n        return res\n\n    return candidate\n\n\ndef resolve_ssl_version(candidate):\n    \"\"\"\n    like resolve_cert_reqs\n    \"\"\"\n    if candidate is None:\n        return PROTOCOL_SSLv23\n\n    if isinstance(candidate, str):\n        res = getattr(ssl, candidate, None)\n        if res is None:\n            res = getattr(ssl, 'PROTOCOL_' + candidate)\n        return res\n\n    return candidate\n\n\ndef assert_fingerprint(cert, fingerprint):\n    \"\"\"\n    Checks if given fingerprint matches the supplied certificate.\n\n    :param cert:\n        Certificate as bytes object.\n    :param fingerprint:\n        Fingerprint as string of hexdigits, can be interspersed by colons.\n    \"\"\"\n\n    # Maps the length of a digest to a possible hash function producing\n    # this digest.\n    hashfunc_map = {\n        16: md5,\n        20: sha1\n    }\n\n    fingerprint = fingerprint.replace(':', '').lower()\n\n    digest_length, rest = divmod(len(fingerprint), 2)\n\n    if rest or digest_length not in hashfunc_map:\n        raise SSLError('Fingerprint is of invalid length.')\n\n    # We need encode() here for py32; works on py2 and p33.\n    fingerprint_bytes = unhexlify(fingerprint.encode())\n\n    hashfunc = hashfunc_map[digest_length]\n\n    cert_digest = hashfunc(cert).digest()\n\n    if not cert_digest == fingerprint_bytes:\n        raise SSLError('Fingerprints did not match. Expected \"{0}\", got \"{1}\".'\n                       .format(hexlify(fingerprint_bytes),\n                               hexlify(cert_digest)))\n\ndef is_fp_closed(obj):\n    \"\"\"\n    Checks whether a given file-like object is closed.\n\n    :param obj:\n        The file-like object to check.\n    \"\"\"\n    if hasattr(obj, 'fp'):\n        # Object is a container for another file-like object that gets released\n        # on exhaustion (e.g. HTTPResponse)\n        return obj.fp is None\n\n    return obj.closed\n\n\nif SSLContext is not None:  # Python 3.2+\n    def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None,\n                        ca_certs=None, server_hostname=None,\n                        ssl_version=None):\n        \"\"\"\n        All arguments except `server_hostname` have the same meaning as for\n        :func:`ssl.wrap_socket`\n\n        :param server_hostname:\n            Hostname of the expected certificate\n        \"\"\"\n        context = SSLContext(ssl_version)\n        context.verify_mode = cert_reqs\n        if ca_certs:\n            try:\n                context.load_verify_locations(ca_certs)\n            # Py32 raises IOError\n            # Py33 raises FileNotFoundError\n            except Exception as e:  # Reraise as SSLError\n                raise SSLError(e)\n        if certfile:\n            # FIXME: This block needs a test.\n            context.load_cert_chain(certfile, keyfile)\n        if HAS_SNI:  # Platform-specific: OpenSSL with enabled SNI\n            return context.wrap_socket(sock, server_hostname=server_hostname)\n        return context.wrap_socket(sock)\n\nelse:  # Python 3.1 and earlier\n    def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None,\n                        ca_certs=None, server_hostname=None,\n                        ssl_version=None):\n        return wrap_socket(sock, keyfile=keyfile, certfile=certfile,\n                           ca_certs=ca_certs, cert_reqs=cert_reqs,\n                           ssl_version=ssl_version)\n"
  },
  {
    "path": "thirdparty_libs/requests/sessions.py",
    "content": "# -*- coding: utf-8 -*-\n\n\"\"\"\nrequests.session\n~~~~~~~~~~~~~~~~\n\nThis module provides a Session object to manage and persist settings across\nrequests (cookies, auth, proxies).\n\n\"\"\"\nimport os\nfrom collections import Mapping\nfrom datetime import datetime\n\nfrom .compat import cookielib, OrderedDict, urljoin, urlparse\nfrom .cookies import cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar\nfrom .models import Request, PreparedRequest\nfrom .hooks import default_hooks, dispatch_hook\nfrom .utils import to_key_val_list, default_headers\nfrom .exceptions import TooManyRedirects, InvalidSchema\nfrom .structures import CaseInsensitiveDict\n\nfrom .adapters import HTTPAdapter\n\nfrom .utils import requote_uri, get_environ_proxies, get_netrc_auth\n\nfrom .status_codes import codes\nREDIRECT_STATI = (\n    codes.moved, # 301\n    codes.found, # 302\n    codes.other, # 303\n    codes.temporary_moved, # 307\n)\nDEFAULT_REDIRECT_LIMIT = 30\n\n\ndef merge_setting(request_setting, session_setting, dict_class=OrderedDict):\n    \"\"\"\n    Determines appropriate setting for a given request, taking into account the\n    explicit setting on that request, and the setting in the session. If a\n    setting is a dictionary, they will be merged together using `dict_class`\n    \"\"\"\n\n    if session_setting is None:\n        return request_setting\n\n    if request_setting is None:\n        return session_setting\n\n    # Bypass if not a dictionary (e.g. verify)\n    if not (\n            isinstance(session_setting, Mapping) and\n            isinstance(request_setting, Mapping)\n    ):\n        return request_setting\n\n    merged_setting = dict_class(to_key_val_list(session_setting))\n    merged_setting.update(to_key_val_list(request_setting))\n\n    # Remove keys that are set to None.\n    for (k, v) in request_setting.items():\n        if v is None:\n            del merged_setting[k]\n\n    return merged_setting\n\n\nclass SessionRedirectMixin(object):\n    def resolve_redirects(self, resp, req, stream=False, timeout=None,\n                          verify=True, cert=None, proxies=None):\n        \"\"\"Receives a Response. Returns a generator of Responses.\"\"\"\n\n        i = 0\n\n        # ((resp.status_code is codes.see_other))\n        while (('location' in resp.headers and resp.status_code in REDIRECT_STATI)):\n            prepared_request = PreparedRequest()\n            prepared_request.body = req.body\n            prepared_request.headers = req.headers.copy()\n            prepared_request.hooks = req.hooks\n\n            resp.content  # Consume socket so it can be released\n\n            if i >= self.max_redirects:\n                raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects)\n\n            # Release the connection back into the pool.\n            resp.close()\n\n            url = resp.headers['location']\n            method = req.method\n\n            # Handle redirection without scheme (see: RFC 1808 Section 4)\n            if url.startswith('//'):\n                parsed_rurl = urlparse(resp.url)\n                url = '%s:%s' % (parsed_rurl.scheme, url)\n\n            # The scheme should be lower case...\n            if '://' in url:\n                scheme, uri = url.split('://', 1)\n                url = '%s://%s' % (scheme.lower(), uri)\n\n            # Facilitate non-RFC2616-compliant 'location' headers\n            # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource')\n            # Compliant with RFC3986, we percent encode the url.\n            if not urlparse(url).netloc:\n                url = urljoin(resp.url, requote_uri(url))\n            else:\n                url = requote_uri(url)\n\n            prepared_request.url = url\n\n            # http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4\n            if (resp.status_code == codes.see_other and\n                    method != 'HEAD'):\n                method = 'GET'\n\n            # Do what the browsers do, despite standards...\n            if (resp.status_code in (codes.moved, codes.found) and\n                    method not in ('GET', 'HEAD')):\n                method = 'GET'\n\n            prepared_request.method = method\n\n            # https://github.com/kennethreitz/requests/issues/1084\n            if resp.status_code not in (codes.temporary, codes.resume):\n                if 'Content-Length' in prepared_request.headers:\n                    del prepared_request.headers['Content-Length']\n\n                prepared_request.body = None\n\n            headers = prepared_request.headers\n            try:\n                del headers['Cookie']\n            except KeyError:\n                pass\n\n            prepared_request.prepare_cookies(self.cookies)\n\n            resp = self.send(\n                prepared_request,\n                stream=stream,\n                timeout=timeout,\n                verify=verify,\n                cert=cert,\n                proxies=proxies,\n                allow_redirects=False,\n            )\n\n            extract_cookies_to_jar(self.cookies, prepared_request, resp.raw)\n\n            i += 1\n            yield resp\n\n\nclass Session(SessionRedirectMixin):\n    \"\"\"A Requests session.\n\n    Provides cookie persistience, connection-pooling, and configuration.\n\n    Basic Usage::\n\n      >>> import requests\n      >>> s = requests.Session()\n      >>> s.get('http://httpbin.org/get')\n      200\n    \"\"\"\n\n    __attrs__ = [\n        'headers', 'cookies', 'auth', 'timeout', 'proxies', 'hooks',\n        'params', 'verify', 'cert', 'prefetch', 'adapters', 'stream',\n        'trust_env', 'max_redirects']\n\n    def __init__(self):\n\n        #: A case-insensitive dictionary of headers to be sent on each\n        #: :class:`Request <Request>` sent from this\n        #: :class:`Session <Session>`.\n        self.headers = default_headers()\n\n        #: Default Authentication tuple or object to attach to\n        #: :class:`Request <Request>`.\n        self.auth = None\n\n        #: Dictionary mapping protocol to the URL of the proxy (e.g.\n        #: {'http': 'foo.bar:3128'}) to be used on each\n        #: :class:`Request <Request>`.\n        self.proxies = {}\n\n        #: Event-handling hooks.\n        self.hooks = default_hooks()\n\n        #: Dictionary of querystring data to attach to each\n        #: :class:`Request <Request>`. The dictionary values may be lists for\n        #: representing multivalued query parameters.\n        self.params = {}\n\n        #: Stream response content default.\n        self.stream = False\n\n        #: SSL Verification default.\n        self.verify = True\n\n        #: SSL certificate default.\n        self.cert = None\n\n        #: Maximum number of redirects allowed. If the request exceeds this\n        #: limit, a :class:`TooManyRedirects` exception is raised.\n        self.max_redirects = DEFAULT_REDIRECT_LIMIT\n\n        #: Should we trust the environment?\n        self.trust_env = True\n\n        #: A CookieJar containing all currently outstanding cookies set on this\n        #: session. By default it is a\n        #: :class:`RequestsCookieJar <requests.cookies.RequestsCookieJar>`, but\n        #: may be any other ``cookielib.CookieJar`` compatible object.\n        self.cookies = cookiejar_from_dict({})\n\n        # Default connection adapters.\n        self.adapters = OrderedDict()\n        self.mount('https://', HTTPAdapter())\n        self.mount('http://', HTTPAdapter())\n\n    def __enter__(self):\n        return self\n\n    def __exit__(self, *args):\n        self.close()\n\n    def prepare_request(self, request):\n        \"\"\"Constructs a :class:`PreparedRequest <PreparedRequest>` for\n        transmission and returns it. The :class:`PreparedRequest` has settings\n        merged from the :class:`Request <Request>` instance and those of the\n        :class:`Session`.\n\n        :param request: :class:`Request` instance to prepare with this\n        session's settings.\n        \"\"\"\n        cookies = request.cookies or {}\n\n        # Bootstrap CookieJar.\n        if not isinstance(cookies, cookielib.CookieJar):\n            cookies = cookiejar_from_dict(cookies)\n\n        # Merge with session cookies\n        merged_cookies = RequestsCookieJar()\n        merged_cookies.update(self.cookies)\n        merged_cookies.update(cookies)\n\n\n        # Set environment's basic authentication if not explicitly set.\n        auth = request.auth\n        if self.trust_env and not auth and not self.auth:\n            auth = get_netrc_auth(request.url)\n\n        p = PreparedRequest()\n        p.prepare(\n            method=request.method.upper(),\n            url=request.url,\n            files=request.files,\n            data=request.data,\n            headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict),\n            params=merge_setting(request.params, self.params),\n            auth=merge_setting(auth, self.auth),\n            cookies=merged_cookies,\n            hooks=merge_setting(request.hooks, self.hooks),\n        )\n        return p\n\n    def request(self, method, url,\n        params=None,\n        data=None,\n        headers=None,\n        cookies=None,\n        files=None,\n        auth=None,\n        timeout=None,\n        allow_redirects=True,\n        proxies=None,\n        hooks=None,\n        stream=None,\n        verify=None,\n        cert=None):\n        \"\"\"Constructs a :class:`Request <Request>`, prepares it and sends it.\n        Returns :class:`Response <Response>` object.\n\n        :param method: method for the new :class:`Request` object.\n        :param url: URL for the new :class:`Request` object.\n        :param params: (optional) Dictionary or bytes to be sent in the query\n            string for the :class:`Request`.\n        :param data: (optional) Dictionary or bytes to send in the body of the\n            :class:`Request`.\n        :param headers: (optional) Dictionary of HTTP Headers to send with the\n            :class:`Request`.\n        :param cookies: (optional) Dict or CookieJar object to send with the\n            :class:`Request`.\n        :param files: (optional) Dictionary of 'filename': file-like-objects\n            for multipart encoding upload.\n        :param auth: (optional) Auth tuple or callable to enable\n            Basic/Digest/Custom HTTP Auth.\n        :param timeout: (optional) Float describing the timeout of the\n            request.\n        :param allow_redirects: (optional) Boolean. Set to True by default.\n        :param proxies: (optional) Dictionary mapping protocol to the URL of\n            the proxy.\n        :param stream: (optional) whether to immediately download the response\n            content. Defaults to ``False``.\n        :param verify: (optional) if ``True``, the SSL cert will be verified.\n            A CA_BUNDLE path can also be provided.\n        :param cert: (optional) if String, path to ssl client cert file (.pem).\n            If Tuple, ('cert', 'key') pair.\n        \"\"\"\n        # Create the Request.\n        req = Request(\n            method = method.upper(),\n            url = url,\n            headers = headers,\n            files = files,\n            data = data or {},\n            params = params or {},\n            auth = auth,\n            cookies = cookies,\n            hooks = hooks,\n        )\n        prep = self.prepare_request(req)\n\n        proxies = proxies or {}\n\n        # Gather clues from the surrounding environment.\n        if self.trust_env:\n            # Set environment's proxies.\n            env_proxies = get_environ_proxies(url) or {}\n            for (k, v) in env_proxies.items():\n                proxies.setdefault(k, v)\n\n            # Look for configuration.\n            if not verify and verify is not False:\n                verify = os.environ.get('REQUESTS_CA_BUNDLE')\n\n            # Curl compatibility.\n            if not verify and verify is not False:\n                verify = os.environ.get('CURL_CA_BUNDLE')\n\n        # Merge all the kwargs.\n        proxies = merge_setting(proxies, self.proxies)\n        stream = merge_setting(stream, self.stream)\n        verify = merge_setting(verify, self.verify)\n        cert = merge_setting(cert, self.cert)\n\n        # Send the request.\n        send_kwargs = {\n            'stream': stream,\n            'timeout': timeout,\n            'verify': verify,\n            'cert': cert,\n            'proxies': proxies,\n            'allow_redirects': allow_redirects,\n        }\n        resp = self.send(prep, **send_kwargs)\n\n        return resp\n\n    def get(self, url, **kwargs):\n        \"\"\"Sends a GET request. Returns :class:`Response` object.\n\n        :param url: URL for the new :class:`Request` object.\n        :param \\*\\*kwargs: Optional arguments that ``request`` takes.\n        \"\"\"\n\n        kwargs.setdefault('allow_redirects', True)\n        return self.request('GET', url, **kwargs)\n\n    def options(self, url, **kwargs):\n        \"\"\"Sends a OPTIONS request. Returns :class:`Response` object.\n\n        :param url: URL for the new :class:`Request` object.\n        :param \\*\\*kwargs: Optional arguments that ``request`` takes.\n        \"\"\"\n\n        kwargs.setdefault('allow_redirects', True)\n        return self.request('OPTIONS', url, **kwargs)\n\n    def head(self, url, **kwargs):\n        \"\"\"Sends a HEAD request. Returns :class:`Response` object.\n\n        :param url: URL for the new :class:`Request` object.\n        :param \\*\\*kwargs: Optional arguments that ``request`` takes.\n        \"\"\"\n\n        kwargs.setdefault('allow_redirects', False)\n        return self.request('HEAD', url, **kwargs)\n\n    def post(self, url, data=None, **kwargs):\n        \"\"\"Sends a POST request. Returns :class:`Response` object.\n\n        :param url: URL for the new :class:`Request` object.\n        :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.\n        :param \\*\\*kwargs: Optional arguments that ``request`` takes.\n        \"\"\"\n\n        return self.request('POST', url, data=data, **kwargs)\n\n    def put(self, url, data=None, **kwargs):\n        \"\"\"Sends a PUT request. Returns :class:`Response` object.\n\n        :param url: URL for the new :class:`Request` object.\n        :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.\n        :param \\*\\*kwargs: Optional arguments that ``request`` takes.\n        \"\"\"\n\n        return self.request('PUT', url, data=data, **kwargs)\n\n    def patch(self, url, data=None, **kwargs):\n        \"\"\"Sends a PATCH request. Returns :class:`Response` object.\n\n        :param url: URL for the new :class:`Request` object.\n        :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.\n        :param \\*\\*kwargs: Optional arguments that ``request`` takes.\n        \"\"\"\n\n        return self.request('PATCH', url,  data=data, **kwargs)\n\n    def delete(self, url, **kwargs):\n        \"\"\"Sends a DELETE request. Returns :class:`Response` object.\n\n        :param url: URL for the new :class:`Request` object.\n        :param \\*\\*kwargs: Optional arguments that ``request`` takes.\n        \"\"\"\n\n        return self.request('DELETE', url, **kwargs)\n\n    def send(self, request, **kwargs):\n        \"\"\"Send a given PreparedRequest.\"\"\"\n        # Set defaults that the hooks can utilize to ensure they always have\n        # the correct parameters to reproduce the previous request.\n        kwargs.setdefault('stream', self.stream)\n        kwargs.setdefault('verify', self.verify)\n        kwargs.setdefault('cert', self.cert)\n        kwargs.setdefault('proxies', self.proxies)\n\n        # It's possible that users might accidentally send a Request object.\n        # Guard against that specific failure case.\n        if not isinstance(request, PreparedRequest):\n            raise ValueError('You can only send PreparedRequests.')\n\n        # Set up variables needed for resolve_redirects and dispatching of\n        # hooks\n        allow_redirects = kwargs.pop('allow_redirects', True)\n        stream = kwargs.get('stream')\n        timeout = kwargs.get('timeout')\n        verify = kwargs.get('verify')\n        cert = kwargs.get('cert')\n        proxies = kwargs.get('proxies')\n        hooks = request.hooks\n\n        # Get the appropriate adapter to use\n        adapter = self.get_adapter(url=request.url)\n\n        # Start time (approximately) of the request\n        start = datetime.utcnow()\n        # Send the request\n        r = adapter.send(request, **kwargs)\n        # Total elapsed time of the request (approximately)\n        r.elapsed = datetime.utcnow() - start\n\n        # Response manipulation hooks\n        r = dispatch_hook('response', hooks, r, **kwargs)\n\n        # Persist cookies\n        extract_cookies_to_jar(self.cookies, request, r.raw)\n\n        # Redirect resolving generator.\n        gen = self.resolve_redirects(r, request, stream=stream,\n                                     timeout=timeout, verify=verify, cert=cert,\n                                     proxies=proxies)\n\n        # Resolve redirects if allowed.\n        history = [resp for resp in gen] if allow_redirects else []\n\n        # Shuffle things around if there's history.\n        if history:\n            # Insert the first (original) request at the start\n            history.insert(0, r)\n            # Get the last request made\n            r = history.pop()\n            r.history = tuple(history)\n\n        return r\n\n    def get_adapter(self, url):\n        \"\"\"Returns the appropriate connnection adapter for the given URL.\"\"\"\n        for (prefix, adapter) in self.adapters.items():\n\n            if url.lower().startswith(prefix):\n                return adapter\n\n        # Nothing matches :-/\n        raise InvalidSchema(\"No connection adapters were found for '%s'\" % url)\n\n    def close(self):\n        \"\"\"Closes all adapters and as such the session\"\"\"\n        for _, v in self.adapters.items():\n            v.close()\n\n    def mount(self, prefix, adapter):\n        \"\"\"Registers a connection adapter to a prefix.\n\n        Adapters are sorted in descending order by key length.\"\"\"\n        self.adapters[prefix] = adapter\n        keys_to_move = [k for k in self.adapters if len(k) < len(prefix)]\n        for key in keys_to_move:\n            self.adapters[key] = self.adapters.pop(key)\n\n    def __getstate__(self):\n        return dict((attr, getattr(self, attr, None)) for attr in self.__attrs__)\n\n    def __setstate__(self, state):\n        for attr, value in state.items():\n            setattr(self, attr, value)\n\n\ndef session():\n    \"\"\"Returns a :class:`Session` for context-management.\"\"\"\n\n    return Session()\n"
  },
  {
    "path": "thirdparty_libs/requests/status_codes.py",
    "content": "# -*- coding: utf-8 -*-\n\nfrom .structures import LookupDict\n\n_codes = {\n\n    # Informational.\n    100: ('continue',),\n    101: ('switching_protocols',),\n    102: ('processing',),\n    103: ('checkpoint',),\n    122: ('uri_too_long', 'request_uri_too_long'),\n    200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\\\o/', '✓'),\n    201: ('created',),\n    202: ('accepted',),\n    203: ('non_authoritative_info', 'non_authoritative_information'),\n    204: ('no_content',),\n    205: ('reset_content', 'reset'),\n    206: ('partial_content', 'partial'),\n    207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'),\n    208: ('already_reported',),\n    226: ('im_used',),\n\n    # Redirection.\n    300: ('multiple_choices',),\n    301: ('moved_permanently', 'moved', '\\\\o-'),\n    302: ('found',),\n    303: ('see_other', 'other'),\n    304: ('not_modified',),\n    305: ('use_proxy',),\n    306: ('switch_proxy',),\n    307: ('temporary_redirect', 'temporary_moved', 'temporary'),\n    308: ('resume_incomplete', 'resume'),\n\n    # Client Error.\n    400: ('bad_request', 'bad'),\n    401: ('unauthorized',),\n    402: ('payment_required', 'payment'),\n    403: ('forbidden',),\n    404: ('not_found', '-o-'),\n    405: ('method_not_allowed', 'not_allowed'),\n    406: ('not_acceptable',),\n    407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'),\n    408: ('request_timeout', 'timeout'),\n    409: ('conflict',),\n    410: ('gone',),\n    411: ('length_required',),\n    412: ('precondition_failed', 'precondition'),\n    413: ('request_entity_too_large',),\n    414: ('request_uri_too_large',),\n    415: ('unsupported_media_type', 'unsupported_media', 'media_type'),\n    416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'),\n    417: ('expectation_failed',),\n    418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'),\n    422: ('unprocessable_entity', 'unprocessable'),\n    423: ('locked',),\n    424: ('failed_dependency', 'dependency'),\n    425: ('unordered_collection', 'unordered'),\n    426: ('upgrade_required', 'upgrade'),\n    428: ('precondition_required', 'precondition'),\n    429: ('too_many_requests', 'too_many'),\n    431: ('header_fields_too_large', 'fields_too_large'),\n    444: ('no_response', 'none'),\n    449: ('retry_with', 'retry'),\n    450: ('blocked_by_windows_parental_controls', 'parental_controls'),\n    451: ('unavailable_for_legal_reasons', 'legal_reasons'),\n    499: ('client_closed_request',),\n\n    # Server Error.\n    500: ('internal_server_error', 'server_error', '/o\\\\', '✗'),\n    501: ('not_implemented',),\n    502: ('bad_gateway',),\n    503: ('service_unavailable', 'unavailable'),\n    504: ('gateway_timeout',),\n    505: ('http_version_not_supported', 'http_version'),\n    506: ('variant_also_negotiates',),\n    507: ('insufficient_storage',),\n    509: ('bandwidth_limit_exceeded', 'bandwidth'),\n    510: ('not_extended',),\n}\n\ncodes = LookupDict(name='status_codes')\n\nfor (code, titles) in list(_codes.items()):\n    for title in titles:\n        setattr(codes, title, code)\n        if not title.startswith('\\\\'):\n            setattr(codes, title.upper(), code)\n"
  },
  {
    "path": "thirdparty_libs/requests/structures.py",
    "content": "# -*- coding: utf-8 -*-\n\n\"\"\"\nrequests.structures\n~~~~~~~~~~~~~~~~~~~\n\nData structures that power Requests.\n\n\"\"\"\n\nimport os\nimport collections\nfrom itertools import islice\n\n\nclass IteratorProxy(object):\n    \"\"\"docstring for IteratorProxy\"\"\"\n    def __init__(self, i):\n        self.i = i\n        # self.i = chain.from_iterable(i)\n\n    def __iter__(self):\n        return self.i\n\n    def __len__(self):\n        if hasattr(self.i, '__len__'):\n            return len(self.i)\n        if hasattr(self.i, 'len'):\n            return self.i.len\n        if hasattr(self.i, 'fileno'):\n            return os.fstat(self.i.fileno()).st_size\n\n    def read(self, n):\n        return \"\".join(islice(self.i, None, n))\n\n\nclass CaseInsensitiveDict(collections.MutableMapping):\n    \"\"\"\n    A case-insensitive ``dict``-like object.\n\n    Implements all methods and operations of\n    ``collections.MutableMapping`` as well as dict's ``copy``. Also\n    provides ``lower_items``.\n\n    All keys are expected to be strings. The structure remembers the\n    case of the last key to be set, and ``iter(instance)``,\n    ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()``\n    will contain case-sensitive keys. However, querying and contains\n    testing is case insensitive:\n\n        cid = CaseInsensitiveDict()\n        cid['Accept'] = 'application/json'\n        cid['aCCEPT'] == 'application/json'  # True\n        list(cid) == ['Accept']  # True\n\n    For example, ``headers['content-encoding']`` will return the\n    value of a ``'Content-Encoding'`` response header, regardless\n    of how the header name was originally stored.\n\n    If the constructor, ``.update``, or equality comparison\n    operations are given keys that have equal ``.lower()``s, the\n    behavior is undefined.\n\n    \"\"\"\n    def __init__(self, data=None, **kwargs):\n        self._store = dict()\n        if data is None:\n            data = {}\n        self.update(data, **kwargs)\n\n    def __setitem__(self, key, value):\n        # Use the lowercased key for lookups, but store the actual\n        # key alongside the value.\n        self._store[key.lower()] = (key, value)\n\n    def __getitem__(self, key):\n        return self._store[key.lower()][1]\n\n    def __delitem__(self, key):\n        del self._store[key.lower()]\n\n    def __iter__(self):\n        return (casedkey for casedkey, mappedvalue in self._store.values())\n\n    def __len__(self):\n        return len(self._store)\n\n    def lower_items(self):\n        \"\"\"Like iteritems(), but with all lowercase keys.\"\"\"\n        return (\n            (lowerkey, keyval[1])\n            for (lowerkey, keyval)\n            in self._store.items()\n        )\n\n    def __eq__(self, other):\n        if isinstance(other, collections.Mapping):\n            other = CaseInsensitiveDict(other)\n        else:\n            return NotImplemented\n        # Compare insensitively\n        return dict(self.lower_items()) == dict(other.lower_items())\n\n    # Copy is required\n    def copy(self):\n        return CaseInsensitiveDict(self._store.values())\n\n    def __repr__(self):\n        return '%s(%r)' % (self.__class__.__name__, dict(self.items()))\n\n\nclass LookupDict(dict):\n    \"\"\"Dictionary lookup object.\"\"\"\n\n    def __init__(self, name=None):\n        self.name = name\n        super(LookupDict, self).__init__()\n\n    def __repr__(self):\n        return '<lookup \\'%s\\'>' % (self.name)\n\n    def __getitem__(self, key):\n        # We allow fall-through here, so values default to None\n\n        return self.__dict__.get(key, None)\n\n    def get(self, key, default=None):\n        return self.__dict__.get(key, default)\n"
  },
  {
    "path": "thirdparty_libs/requests/utils.py",
    "content": "# -*- coding: utf-8 -*-\n\n\"\"\"\nrequests.utils\n~~~~~~~~~~~~~~\n\nThis module provides utility functions that are used within Requests\nthat are also useful for external consumption.\n\n\"\"\"\n\nimport cgi\nimport codecs\nimport collections\nimport os\nimport platform\nimport re\nimport sys\nfrom netrc import netrc, NetrcParseError\n\nfrom . import __version__\nfrom . import certs\nfrom .compat import parse_http_list as _parse_list_header\nfrom .compat import quote, urlparse, bytes, str, OrderedDict, urlunparse\nfrom .compat import getproxies, proxy_bypass\nfrom .cookies import RequestsCookieJar, cookiejar_from_dict\nfrom .structures import CaseInsensitiveDict\n\n_hush_pyflakes = (RequestsCookieJar,)\n\nNETRC_FILES = ('.netrc', '_netrc')\n\nDEFAULT_CA_BUNDLE_PATH = certs.where()\n\n\ndef dict_to_sequence(d):\n    \"\"\"Returns an internal sequence dictionary update.\"\"\"\n\n    if hasattr(d, 'items'):\n        d = d.items()\n\n    return d\n\n\ndef super_len(o):\n    if hasattr(o, '__len__'):\n        return len(o)\n    if hasattr(o, 'len'):\n        return o.len\n    if hasattr(o, 'fileno'):\n        return os.fstat(o.fileno()).st_size\n\n\ndef get_netrc_auth(url):\n    \"\"\"Returns the Requests tuple auth for a given url from netrc.\"\"\"\n\n    try:\n        locations = (os.path.expanduser('~/{0}'.format(f)) for f in NETRC_FILES)\n        netrc_path = None\n\n        for loc in locations:\n            if os.path.exists(loc) and not netrc_path:\n                netrc_path = loc\n\n        # Abort early if there isn't one.\n        if netrc_path is None:\n            return netrc_path\n\n        ri = urlparse(url)\n\n        # Strip port numbers from netloc\n        host = ri.netloc.split(':')[0]\n\n        try:\n            _netrc = netrc(netrc_path).authenticators(host)\n            if _netrc:\n                # Return with login / password\n                login_i = (0 if _netrc[0] else 1)\n                return (_netrc[login_i], _netrc[2])\n        except (NetrcParseError, IOError):\n            # If there was a parsing error or a permissions issue reading the file,\n            # we'll just skip netrc auth\n            pass\n\n    # AppEngine hackiness.\n    except (ImportError, AttributeError):\n        pass\n\n\ndef guess_filename(obj):\n    \"\"\"Tries to guess the filename of the given object.\"\"\"\n    name = getattr(obj, 'name', None)\n    if name and name[0] != '<' and name[-1] != '>':\n        return os.path.basename(name)\n\n\ndef from_key_val_list(value):\n    \"\"\"Take an object and test to see if it can be represented as a\n    dictionary. Unless it can not be represented as such, return an\n    OrderedDict, e.g.,\n\n    ::\n\n        >>> from_key_val_list([('key', 'val')])\n        OrderedDict([('key', 'val')])\n        >>> from_key_val_list('string')\n        ValueError: need more than 1 value to unpack\n        >>> from_key_val_list({'key': 'val'})\n        OrderedDict([('key', 'val')])\n    \"\"\"\n    if value is None:\n        return None\n\n    if isinstance(value, (str, bytes, bool, int)):\n        raise ValueError('cannot encode objects that are not 2-tuples')\n\n    return OrderedDict(value)\n\n\ndef to_key_val_list(value):\n    \"\"\"Take an object and test to see if it can be represented as a\n    dictionary. If it can be, return a list of tuples, e.g.,\n\n    ::\n\n        >>> to_key_val_list([('key', 'val')])\n        [('key', 'val')]\n        >>> to_key_val_list({'key': 'val'})\n        [('key', 'val')]\n        >>> to_key_val_list('string')\n        ValueError: cannot encode objects that are not 2-tuples.\n    \"\"\"\n    if value is None:\n        return None\n\n    if isinstance(value, (str, bytes, bool, int)):\n        raise ValueError('cannot encode objects that are not 2-tuples')\n\n    if isinstance(value, collections.Mapping):\n        value = value.items()\n\n    return list(value)\n\n\n# From mitsuhiko/werkzeug (used with permission).\ndef parse_list_header(value):\n    \"\"\"Parse lists as described by RFC 2068 Section 2.\n\n    In particular, parse comma-separated lists where the elements of\n    the list may include quoted-strings.  A quoted-string could\n    contain a comma.  A non-quoted string could have quotes in the\n    middle.  Quotes are removed automatically after parsing.\n\n    It basically works like :func:`parse_set_header` just that items\n    may appear multiple times and case sensitivity is preserved.\n\n    The return value is a standard :class:`list`:\n\n    >>> parse_list_header('token, \"quoted value\"')\n    ['token', 'quoted value']\n\n    To create a header from the :class:`list` again, use the\n    :func:`dump_header` function.\n\n    :param value: a string with a list header.\n    :return: :class:`list`\n    \"\"\"\n    result = []\n    for item in _parse_list_header(value):\n        if item[:1] == item[-1:] == '\"':\n            item = unquote_header_value(item[1:-1])\n        result.append(item)\n    return result\n\n\n# From mitsuhiko/werkzeug (used with permission).\ndef parse_dict_header(value):\n    \"\"\"Parse lists of key, value pairs as described by RFC 2068 Section 2 and\n    convert them into a python dict:\n\n    >>> d = parse_dict_header('foo=\"is a fish\", bar=\"as well\"')\n    >>> type(d) is dict\n    True\n    >>> sorted(d.items())\n    [('bar', 'as well'), ('foo', 'is a fish')]\n\n    If there is no value for a key it will be `None`:\n\n    >>> parse_dict_header('key_without_value')\n    {'key_without_value': None}\n\n    To create a header from the :class:`dict` again, use the\n    :func:`dump_header` function.\n\n    :param value: a string with a dict header.\n    :return: :class:`dict`\n    \"\"\"\n    result = {}\n    for item in _parse_list_header(value):\n        if '=' not in item:\n            result[item] = None\n            continue\n        name, value = item.split('=', 1)\n        if value[:1] == value[-1:] == '\"':\n            value = unquote_header_value(value[1:-1])\n        result[name] = value\n    return result\n\n\n# From mitsuhiko/werkzeug (used with permission).\ndef unquote_header_value(value, is_filename=False):\n    r\"\"\"Unquotes a header value.  (Reversal of :func:`quote_header_value`).\n    This does not use the real unquoting but what browsers are actually\n    using for quoting.\n\n    :param value: the header value to unquote.\n    \"\"\"\n    if value and value[0] == value[-1] == '\"':\n        # this is not the real unquoting, but fixing this so that the\n        # RFC is met will result in bugs with internet explorer and\n        # probably some other browsers as well.  IE for example is\n        # uploading files with \"C:\\foo\\bar.txt\" as filename\n        value = value[1:-1]\n\n        # if this is a filename and the starting characters look like\n        # a UNC path, then just return the value without quotes.  Using the\n        # replace sequence below on a UNC path has the effect of turning\n        # the leading double slash into a single slash and then\n        # _fix_ie_filename() doesn't work correctly.  See #458.\n        if not is_filename or value[:2] != '\\\\\\\\':\n            return value.replace('\\\\\\\\', '\\\\').replace('\\\\\"', '\"')\n    return value\n\n\ndef dict_from_cookiejar(cj):\n    \"\"\"Returns a key/value dictionary from a CookieJar.\n\n    :param cj: CookieJar object to extract cookies from.\n    \"\"\"\n\n    cookie_dict = {}\n\n    for cookie in cj:\n        cookie_dict[cookie.name] = cookie.value\n\n    return cookie_dict\n\n\ndef add_dict_to_cookiejar(cj, cookie_dict):\n    \"\"\"Returns a CookieJar from a key/value dictionary.\n\n    :param cj: CookieJar to insert cookies into.\n    :param cookie_dict: Dict of key/values to insert into CookieJar.\n    \"\"\"\n\n    cj2 = cookiejar_from_dict(cookie_dict)\n    cj.update(cj2)\n    return cj\n\n\ndef get_encodings_from_content(content):\n    \"\"\"Returns encodings from given content string.\n\n    :param content: bytestring to extract encodings from.\n    \"\"\"\n\n    charset_re = re.compile(r'<meta.*?charset=[\"\\']*(.+?)[\"\\'>]', flags=re.I)\n\n    return charset_re.findall(content)\n\n\ndef get_encoding_from_headers(headers):\n    \"\"\"Returns encodings from given HTTP Header Dict.\n\n    :param headers: dictionary to extract encoding from.\n    \"\"\"\n\n    content_type = headers.get('content-type')\n\n    if not content_type:\n        return None\n\n    content_type, params = cgi.parse_header(content_type)\n\n    if 'charset' in params:\n        return params['charset'].strip(\"'\\\"\")\n\n    if 'text' in content_type:\n        return 'ISO-8859-1'\n\n\ndef stream_decode_response_unicode(iterator, r):\n    \"\"\"Stream decodes a iterator.\"\"\"\n\n    if r.encoding is None:\n        for item in iterator:\n            yield item\n        return\n\n    decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace')\n    for chunk in iterator:\n        rv = decoder.decode(chunk)\n        if rv:\n            yield rv\n    rv = decoder.decode(b'', final=True)\n    if rv:\n        yield rv\n\n\ndef iter_slices(string, slice_length):\n    \"\"\"Iterate over slices of a string.\"\"\"\n    pos = 0\n    while pos < len(string):\n        yield string[pos:pos + slice_length]\n        pos += slice_length\n\n\ndef get_unicode_from_response(r):\n    \"\"\"Returns the requested content back in unicode.\n\n    :param r: Response object to get unicode content from.\n\n    Tried:\n\n    1. charset from content-type\n\n    2. every encodings from ``<meta ... charset=XXX>``\n\n    3. fall back and replace all unicode characters\n\n    \"\"\"\n\n    tried_encodings = []\n\n    # Try charset from content-type\n    encoding = get_encoding_from_headers(r.headers)\n\n    if encoding:\n        try:\n            return str(r.content, encoding)\n        except UnicodeError:\n            tried_encodings.append(encoding)\n\n    # Fall back:\n    try:\n        return str(r.content, encoding, errors='replace')\n    except TypeError:\n        return r.content\n\n\n# The unreserved URI characters (RFC 3986)\nUNRESERVED_SET = frozenset(\n    \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"\n    + \"0123456789-._~\")\n\n\ndef unquote_unreserved(uri):\n    \"\"\"Un-escape any percent-escape sequences in a URI that are unreserved\n    characters. This leaves all reserved, illegal and non-ASCII bytes encoded.\n    \"\"\"\n    parts = uri.split('%')\n    for i in range(1, len(parts)):\n        h = parts[i][0:2]\n        if len(h) == 2 and h.isalnum():\n            c = chr(int(h, 16))\n            if c in UNRESERVED_SET:\n                parts[i] = c + parts[i][2:]\n            else:\n                parts[i] = '%' + parts[i]\n        else:\n            parts[i] = '%' + parts[i]\n    return ''.join(parts)\n\n\ndef requote_uri(uri):\n    \"\"\"Re-quote the given URI.\n\n    This function passes the given URI through an unquote/quote cycle to\n    ensure that it is fully and consistently quoted.\n    \"\"\"\n    # Unquote only the unreserved characters\n    # Then quote only illegal characters (do not quote reserved, unreserved,\n    # or '%')\n    return quote(unquote_unreserved(uri), safe=\"!#$%&'()*+,/:;=?@[]~\")\n\n\ndef get_environ_proxies(url):\n    \"\"\"Return a dict of environment proxies.\"\"\"\n\n    get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper())\n\n    # First check whether no_proxy is defined. If it is, check that the URL\n    # we're getting isn't in the no_proxy list.\n    no_proxy = get_proxy('no_proxy')\n    netloc = urlparse(url).netloc\n    \n    if no_proxy:\n        # We need to check whether we match here. We need to see if we match\n        # the end of the netloc, both with and without the port.\n        no_proxy = no_proxy.split(',')\n        \n        for host in no_proxy:\n            if netloc.endswith(host) or netloc.split(':')[0].endswith(host):\n                # The URL does match something in no_proxy, so we don't want\n                # to apply the proxies on this URL.\n                return {}\n                \n    # If the system proxy settings indicate that this URL should be bypassed,\n    # don't proxy.\n    if proxy_bypass(netloc):\n        return {}\n\n    # If we get here, we either didn't have no_proxy set or we're not going\n    # anywhere that no_proxy applies to, and the system settings don't require\n    # bypassing the proxy for the current URL.\n    return getproxies()\n    \n\ndef default_user_agent():\n    \"\"\"Return a string representing the default user agent.\"\"\"\n    _implementation = platform.python_implementation()\n\n    if _implementation == 'CPython':\n        _implementation_version = platform.python_version()\n    elif _implementation == 'PyPy':\n        _implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major,\n                                                sys.pypy_version_info.minor,\n                                                sys.pypy_version_info.micro)\n        if sys.pypy_version_info.releaselevel != 'final':\n            _implementation_version = ''.join([_implementation_version, sys.pypy_version_info.releaselevel])\n    elif _implementation == 'Jython':\n        _implementation_version = platform.python_version()  # Complete Guess\n    elif _implementation == 'IronPython':\n        _implementation_version = platform.python_version()  # Complete Guess\n    else:\n        _implementation_version = 'Unknown'\n\n    try:\n        p_system = platform.system()\n        p_release = platform.release()\n    except IOError:\n        p_system = 'Unknown'\n        p_release = 'Unknown'\n\n    return \" \".join(['python-requests/%s' % __version__,\n                     '%s/%s' % (_implementation, _implementation_version),\n                     '%s/%s' % (p_system, p_release)])\n\n\ndef default_headers():\n    return CaseInsensitiveDict({\n        'User-Agent': default_user_agent(),\n        'Accept-Encoding': ', '.join(('gzip', 'deflate', 'compress')),\n        'Accept': '*/*'\n    })\n\n\ndef parse_header_links(value):\n    \"\"\"Return a dict of parsed link headers proxies.\n\n    i.e. Link: <http:/.../front.jpeg>; rel=front; type=\"image/jpeg\",<http://.../back.jpeg>; rel=back;type=\"image/jpeg\"\n\n    \"\"\"\n\n    links = []\n\n    replace_chars = \" '\\\"\"\n\n    for val in value.split(\",\"):\n        try:\n            url, params = val.split(\";\", 1)\n        except ValueError:\n            url, params = val, ''\n\n        link = {}\n\n        link[\"url\"] = url.strip(\"<> '\\\"\")\n\n        for param in params.split(\";\"):\n            try:\n                key, value = param.split(\"=\")\n            except ValueError:\n                break\n\n            link[key.strip(replace_chars)] = value.strip(replace_chars)\n\n        links.append(link)\n\n    return links\n\n\n# Null bytes; no need to recreate these on each call to guess_json_utf\n_null = '\\x00'.encode('ascii')  # encoding to ASCII for Python 3\n_null2 = _null * 2\n_null3 = _null * 3\n\n\ndef guess_json_utf(data):\n    # JSON always starts with two ASCII characters, so detection is as\n    # easy as counting the nulls and from their location and count\n    # determine the encoding. Also detect a BOM, if present.\n    sample = data[:4]\n    if sample in (codecs.BOM_UTF32_LE, codecs.BOM32_BE):\n        return 'utf-32'     # BOM included\n    if sample[:3] == codecs.BOM_UTF8:\n        return 'utf-8-sig'  # BOM included, MS style (discouraged)\n    if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE):\n        return 'utf-16'     # BOM included\n    nullcount = sample.count(_null)\n    if nullcount == 0:\n        return 'utf-8'\n    if nullcount == 2:\n        if sample[::2] == _null2:   # 1st and 3rd are null\n            return 'utf-16-be'\n        if sample[1::2] == _null2:  # 2nd and 4th are null\n            return 'utf-16-le'\n        # Did not detect 2 valid UTF-16 ascii-range characters\n    if nullcount == 3:\n        if sample[:3] == _null3:\n            return 'utf-32-be'\n        if sample[1:] == _null3:\n            return 'utf-32-le'\n        # Did not detect a valid UTF-32 ascii-range character\n    return None\n\n\ndef prepend_scheme_if_needed(url, new_scheme):\n    '''Given a URL that may or may not have a scheme, prepend the given scheme.\n    Does not replace a present scheme with the one provided as an argument.'''\n    scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme)\n\n    # urlparse is a finicky beast, and sometimes decides that there isn't a\n    # netloc present. Assume that it's being over-cautious, and switch netloc\n    # and path if urlparse decided there was no netloc.\n    if not netloc:\n        netloc, path = path, netloc\n\n    return urlunparse((scheme, netloc, path, params, query, fragment))\n\n\ndef get_auth_from_url(url):\n    \"\"\"Given a url with authentication components, extract them into a tuple of\n    username,password.\"\"\"\n    if url:\n        parsed = urlparse(url)\n        return (parsed.username, parsed.password)\n    else:\n        return ('', '')\n"
  },
  {
    "path": "thirdparty_libs/requests_ntlm/__init__.py",
    "content": "from requests_ntlm import HttpNtlmAuth\n\n__all__ = [HttpNtlmAuth]"
  },
  {
    "path": "thirdparty_libs/requests_ntlm/ntlm/HTTPNtlmAuthHandler.py",
    "content": "# This library is free software: you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation, either\r\n# version 3 of the License, or (at your option) any later version.\r\n\r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n# \r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library.  If not, see <http://www.gnu.org/licenses/> or <http://www.gnu.org/licenses/lgpl.txt>.\r\n\r\nimport urllib2\r\nimport httplib, socket\r\nfrom urllib import addinfourl\r\nimport ntlm\r\nimport re\r\n\r\nclass AbstractNtlmAuthHandler:\r\n    def __init__(self, password_mgr=None, debuglevel=0):\r\n        \"\"\"Initialize an instance of a AbstractNtlmAuthHandler.\r\n\r\nVerify operation with all default arguments.\r\n>>> abstrct = AbstractNtlmAuthHandler()\r\n\r\nVerify \"normal\" operation.\r\n>>> abstrct = AbstractNtlmAuthHandler(urllib2.HTTPPasswordMgrWithDefaultRealm())\r\n\"\"\"\r\n        if password_mgr is None:\r\n            password_mgr = urllib2.HTTPPasswordMgr()\r\n        self.passwd = password_mgr\r\n        self.add_password = self.passwd.add_password\r\n        self._debuglevel = debuglevel\r\n\r\n    def set_http_debuglevel(self, level):\r\n        self._debuglevel = level\r\n\r\n    def http_error_authentication_required(self, auth_header_field, req, fp, headers):\r\n        auth_header_value = headers.get(auth_header_field, None)\r\n        if auth_header_field:\r\n            if auth_header_value is not None and 'ntlm' in auth_header_value.lower():\r\n                fp.close()\r\n                return self.retry_using_http_NTLM_auth(req, auth_header_field, None, headers)\r\n\r\n    def retry_using_http_NTLM_auth(self, req, auth_header_field, realm, headers):\r\n        user, pw = self.passwd.find_user_password(realm, req.get_full_url())\r\n        if pw is not None:\r\n            user_parts = user.split('\\\\', 1)\r\n            if len(user_parts) == 1:\r\n                UserName = user_parts[0]\r\n                DomainName = ''\r\n                type1_flags = ntlm.NTLM_TYPE1_FLAGS & ~ntlm.NTLM_NegotiateOemDomainSupplied\r\n            else:\r\n                DomainName = user_parts[0].upper()\r\n                UserName = user_parts[1]\r\n                type1_flags = ntlm.NTLM_TYPE1_FLAGS\r\n            # ntlm secures a socket, so we must use the same socket for the complete handshake\r\n            headers = dict(req.headers)\r\n            headers.update(req.unredirected_hdrs)\r\n            auth = 'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(user, type1_flags)\r\n            if req.headers.get(self.auth_header, None) == auth:\r\n                return None\r\n            headers[self.auth_header] = auth\r\n\r\n            host = req.get_host()\r\n            if not host:\r\n                raise urllib2.URLError('no host given')\r\n            h = None\r\n            if req.get_full_url().startswith('https://'):\r\n                h = httplib.HTTPSConnection(host) # will parse host:port\r\n            else:\r\n                h = httplib.HTTPConnection(host) # will parse host:port\r\n            h.set_debuglevel(self._debuglevel)\r\n            # we must keep the connection because NTLM authenticates the connection, not single requests\r\n            headers[\"Connection\"] = \"Keep-Alive\"\r\n            headers = dict((name.title(), val) for name, val in headers.items())\r\n            h.request(req.get_method(), req.get_selector(), req.data, headers)\r\n            r = h.getresponse()\r\n            r.begin()\r\n            r._safe_read(int(r.getheader('content-length')))\r\n            if r.getheader('set-cookie'):\r\n                # this is important for some web applications that store authentication-related info in cookies (it took a long time to figure out)\r\n                headers['Cookie'] = r.getheader('set-cookie')\r\n            r.fp = None # remove the reference to the socket, so that it can not be closed by the response object (we want to keep the socket open)\r\n            auth_header_value = r.getheader(auth_header_field, None)\r\n\r\n            # some Exchange servers send two WWW-Authenticate headers, one with the NTLM challenge\r\n            # and another with the 'Negotiate' keyword - make sure we operate on the right one\r\n            m = re.match('(NTLM [A-Za-z0-9+\\-/=]+)', auth_header_value)\r\n            if m:\r\n                auth_header_value, = m.groups()\r\n\r\n            (ServerChallenge, NegotiateFlags) = ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value[5:])\r\n            auth = 'NTLM %s' % ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge, UserName, DomainName, pw, NegotiateFlags)\r\n            headers[self.auth_header] = auth\r\n            headers[\"Connection\"] = \"Close\"\r\n            headers = dict((name.title(), val) for name, val in headers.items())\r\n            try:\r\n                h.request(req.get_method(), req.get_selector(), req.data, headers)\r\n                # none of the configured handlers are triggered, for example redirect-responses are not handled!\r\n                response = h.getresponse()\r\n                def notimplemented():\r\n                    raise NotImplementedError\r\n                response.readline = notimplemented\r\n                infourl = addinfourl(response, response.msg, req.get_full_url())\r\n                infourl.code = response.status\r\n                infourl.msg = response.reason\r\n                return infourl\r\n            except socket.error, err:\r\n                raise urllib2.URLError(err)\r\n        else:\r\n            return None\r\n\r\n\r\nclass HTTPNtlmAuthHandler(AbstractNtlmAuthHandler, urllib2.BaseHandler):\r\n\r\n    auth_header = 'Authorization'\r\n\r\n    def http_error_401(self, req, fp, code, msg, headers):\r\n        return self.http_error_authentication_required('www-authenticate', req, fp, headers)\r\n\r\n\r\nclass ProxyNtlmAuthHandler(AbstractNtlmAuthHandler, urllib2.BaseHandler):\r\n    \"\"\" \r\n        CAUTION: this class has NOT been tested at all!!! \r\n        use at your own risk\r\n    \"\"\"\r\n    auth_header = 'Proxy-authorization'\r\n\r\n    def http_error_407(self, req, fp, code, msg, headers):\r\n        return self.http_error_authentication_required('proxy-authenticate', req, fp, headers)\r\n\r\n\r\nif __name__ == \"__main__\":\r\n    import doctest\r\n    doctest.testmod()\r\n\r\n### TODO: Move this to the ntlm examples directory.\r\n##if __name__ == \"__main__\":\r\n##    url = \"http://ntlmprotectedserver/securedfile.html\"\r\n##    user = u'DOMAIN\\\\User'\r\n##    password = 'Password'\r\n##\r\n##    passman = urllib2.HTTPPasswordMgrWithDefaultRealm()\r\n##    passman.add_password(None, url, user , password)\r\n##    auth_basic = urllib2.HTTPBasicAuthHandler(passman)\r\n##    auth_digest = urllib2.HTTPDigestAuthHandler(passman)\r\n##    auth_NTLM = HTTPNtlmAuthHandler(passman)\r\n##\r\n##    # disable proxies (just for testing)\r\n##    proxy_handler = urllib2.ProxyHandler({})\r\n##\r\n##    opener = urllib2.build_opener(proxy_handler, auth_NTLM) #, auth_digest, auth_basic)\r\n##\r\n##    urllib2.install_opener(opener)\r\n##\r\n##    response = urllib2.urlopen(url)\r\n##    print(response.read())\r\n"
  },
  {
    "path": "thirdparty_libs/requests_ntlm/ntlm/U32.py",
    "content": "# This file is part of 'NTLM Authorization Proxy Server' http://sourceforge.net/projects/ntlmaps/\r\n# Copyright 2001 Dmitry A. Rozmanov <dima@xenon.spb.ru>\r\n#\r\n# This library is free software: you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation, either\r\n# version 3 of the License, or (at your option) any later version.\r\n \r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n# \r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library.  If not, see <http://www.gnu.org/licenses/> or <http://www.gnu.org/licenses/lgpl.txt>.\r\n\r\n\r\nC = 0x1000000000L\r\n\r\ndef norm(n):\r\n    return n & 0xFFFFFFFFL\r\n\r\n\r\nclass U32:\r\n    v = 0L\r\n\r\n    def __init__(self, value = 0):\r\n        self.v = C + norm(abs(long(value)))\r\n\r\n    def set(self, value = 0):\r\n        self.v = C + norm(abs(long(value)))\r\n\r\n    def __repr__(self):\r\n        return hex(norm(self.v))\r\n\r\n    def __long__(self): return long(norm(self.v))\r\n    def __int__(self): return int(norm(self.v))\r\n    def __chr__(self): return chr(norm(self.v))\r\n\r\n    def __add__(self, b):\r\n        r = U32()\r\n        r.v = C + norm(self.v + b.v)\r\n        return r\r\n\r\n    def __sub__(self, b):\r\n        r = U32()\r\n        if self.v < b.v:\r\n            r.v = C + norm(0x100000000L - (b.v - self.v))\r\n        else: r.v = C + norm(self.v - b.v)\r\n        return r\r\n\r\n    def __mul__(self, b):\r\n        r = U32()\r\n        r.v = C + norm(self.v * b.v)\r\n        return r\r\n\r\n    def __div__(self, b):\r\n        r = U32()\r\n        r.v = C + (norm(self.v) / norm(b.v))\r\n        return r\r\n\r\n    def __mod__(self, b):\r\n        r = U32()\r\n        r.v = C + (norm(self.v) % norm(b.v))\r\n        return r\r\n\r\n    def __neg__(self): return U32(self.v)\r\n    def __pos__(self): return U32(self.v)\r\n    def __abs__(self): return U32(self.v)\r\n\r\n    def __invert__(self):\r\n        r = U32()\r\n        r.v = C + norm(~self.v)\r\n        return r\r\n\r\n    def __lshift__(self, b):\r\n        r = U32()\r\n        r.v = C + norm(self.v << b)\r\n        return r\r\n\r\n    def __rshift__(self, b):\r\n        r = U32()\r\n        r.v = C + (norm(self.v) >> b)\r\n        return r\r\n\r\n    def __and__(self, b):\r\n        r = U32()\r\n        r.v = C + norm(self.v & b.v)\r\n        return r\r\n\r\n    def __or__(self, b):\r\n        r = U32()\r\n        r.v = C + norm(self.v | b.v)\r\n        return r\r\n\r\n    def __xor__(self, b):\r\n        r = U32()\r\n        r.v = C + norm(self.v ^ b.v)\r\n        return r\r\n\r\n    def __not__(self):\r\n        return U32(not norm(self.v))\r\n\r\n    def truth(self):\r\n        return norm(self.v)\r\n\r\n    def __cmp__(self, b):\r\n        if norm(self.v) > norm(b.v): return 1\r\n        elif norm(self.v) < norm(b.v): return -1\r\n        else: return 0\r\n\r\n    def __nonzero__(self):\r\n        return norm(self.v)"
  },
  {
    "path": "thirdparty_libs/requests_ntlm/ntlm/__init__.py",
    "content": ""
  },
  {
    "path": "thirdparty_libs/requests_ntlm/ntlm/des.py",
    "content": "# This file is part of 'NTLM Authorization Proxy Server' http://sourceforge.net/projects/ntlmaps/\r\n# Copyright 2001 Dmitry A. Rozmanov <dima@xenon.spb.ru>\r\n#\r\n# This library is free software: you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation, either\r\n# version 3 of the License, or (at your option) any later version.\r\n \r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n# \r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library.  If not, see <http://www.gnu.org/licenses/> or <http://www.gnu.org/licenses/lgpl.txt>.\r\n\r\nimport des_c\r\n\r\n#---------------------------------------------------------------------\r\nclass DES:\r\n\r\n    des_c_obj = None\r\n\r\n    #-----------------------------------------------------------------\r\n    def __init__(self, key_str):\r\n        \"\"\r\n        k = str_to_key56(key_str)\r\n        k = key56_to_key64(k)\r\n        key_str = ''\r\n        for i in k:\r\n            key_str += chr(i & 0xFF)\r\n        self.des_c_obj = des_c.DES(key_str)\r\n\r\n    #-----------------------------------------------------------------\r\n    def encrypt(self, plain_text):\r\n        \"\"\r\n        return self.des_c_obj.encrypt(plain_text)\r\n\r\n    #-----------------------------------------------------------------\r\n    def decrypt(self, crypted_text):\r\n        \"\"\r\n        return self.des_c_obj.decrypt(crypted_text)\r\n\r\n#---------------------------------------------------------------------\r\n#Some Helpers\r\n#---------------------------------------------------------------------\r\n\r\nDESException = 'DESException'\r\n\r\n#---------------------------------------------------------------------\r\ndef str_to_key56(key_str):\r\n    \"\"\r\n    if type(key_str) != type(''):\r\n        #rise DESException, 'ERROR. Wrong key type.'\r\n        pass\r\n    if len(key_str) < 7:\r\n        key_str = key_str + '\\000\\000\\000\\000\\000\\000\\000'[:(7 - len(key_str))]\r\n    key_56 = []\r\n    for i in key_str[:7]: key_56.append(ord(i))\r\n\r\n    return key_56\r\n\r\n#---------------------------------------------------------------------\r\ndef key56_to_key64(key_56):\r\n    \"\"\r\n    key = []\r\n    for i in range(8): key.append(0)\r\n\r\n    key[0] = key_56[0];\r\n    key[1] = ((key_56[0] << 7) & 0xFF) | (key_56[1] >> 1);\r\n    key[2] = ((key_56[1] << 6) & 0xFF) | (key_56[2] >> 2);\r\n    key[3] = ((key_56[2] << 5) & 0xFF) | (key_56[3] >> 3);\r\n    key[4] = ((key_56[3] << 4) & 0xFF) | (key_56[4] >> 4);\r\n    key[5] = ((key_56[4] << 3) & 0xFF) | (key_56[5] >> 5);\r\n    key[6] = ((key_56[5] << 2) & 0xFF) | (key_56[6] >> 6);\r\n    key[7] =  (key_56[6] << 1) & 0xFF;\r\n\r\n    key = set_key_odd_parity(key)\r\n\r\n    return key\r\n\r\n#---------------------------------------------------------------------\r\ndef set_key_odd_parity(key):\r\n    \"\"\r\n    for i in range(len(key)):\r\n        for k in range(7):\r\n            bit = 0\r\n            t = key[i] >> k\r\n            bit = (t ^ bit) & 0x1\r\n        key[i] = (key[i] & 0xFE) | bit\r\n\r\n    return key\r\n"
  },
  {
    "path": "thirdparty_libs/requests_ntlm/ntlm/des_c.py",
    "content": "# This file is part of 'NTLM Authorization Proxy Server' http://sourceforge.net/projects/ntlmaps/\r\n# Copyright 2001 Dmitry A. Rozmanov <dima@xenon.spb.ru>\r\n#\r\n# This library is free software: you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation, either\r\n# version 3 of the License, or (at your option) any later version.\r\n \r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n# \r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library.  If not, see <http://www.gnu.org/licenses/> or <http://www.gnu.org/licenses/lgpl.txt>.\r\n\r\nfrom U32 import U32\r\n\r\n# --NON ASCII COMMENT ELIDED--\r\n#typedef unsigned char des_cblock[8];\r\n#define HDRSIZE 4\r\n\r\ndef c2l(c):\r\n    \"char[4] to unsigned long\"\r\n    l = U32(c[0])\r\n    l = l | (U32(c[1]) << 8)\r\n    l = l | (U32(c[2]) << 16)\r\n    l = l | (U32(c[3]) << 24)\r\n    return l\r\n\r\ndef c2ln(c,l1,l2,n):\r\n    \"char[n] to two unsigned long???\"\r\n    c = c + n\r\n    l1, l2 = U32(0), U32(0)\r\n\r\n    f = 0\r\n    if n == 8:\r\n        l2 = l2 | (U32(c[7]) << 24)\r\n        f = 1\r\n    if f or (n == 7):\r\n        l2 = l2 | (U32(c[6]) << 16)\r\n        f = 1\r\n    if f or (n == 6):\r\n        l2 = l2 | (U32(c[5]) << 8)\r\n        f = 1\r\n    if f or (n == 5):\r\n        l2 = l2 | U32(c[4])\r\n        f = 1\r\n    if f or (n == 4):\r\n        l1 = l1 | (U32(c[3]) << 24)\r\n        f = 1\r\n    if f or (n == 3):\r\n        l1 = l1 | (U32(c[2]) << 16)\r\n        f = 1\r\n    if f or (n == 2):\r\n        l1 = l1 | (U32(c[1]) << 8)\r\n        f = 1\r\n    if f or (n == 1):\r\n        l1 = l1 | U32(c[0])\r\n    return (l1, l2)\r\n\r\ndef l2c(l):\r\n    \"unsigned long to char[4]\"\r\n    c = []\r\n    c.append(int(l & U32(0xFF)))\r\n    c.append(int((l >> 8) & U32(0xFF)))\r\n    c.append(int((l >> 16) & U32(0xFF)))\r\n    c.append(int((l >> 24) & U32(0xFF)))\r\n    return c\r\n\r\ndef n2l(c, l):\r\n    \"network to host long\"\r\n    l = U32(c[0] << 24)\r\n    l = l | (U32(c[1]) << 16)\r\n    l = l | (U32(c[2]) << 8)\r\n    l = l | (U32(c[3]))\r\n    return l\r\n\r\ndef l2n(l, c):\r\n    \"host to network long\"\r\n    c = []\r\n    c.append(int((l >> 24) & U32(0xFF)))\r\n    c.append(int((l >> 16) & U32(0xFF)))\r\n    c.append(int((l >>  8) & U32(0xFF)))\r\n    c.append(int((l      ) & U32(0xFF)))\r\n    return c\r\n\r\ndef l2cn(l1, l2, c, n):\r\n    \"\"\r\n    for i in range(n): c.append(0x00)\r\n    f = 0\r\n    if f or (n == 8):\r\n        c[7] = int((l2 >> 24) & U32(0xFF))\r\n        f = 1\r\n    if f or (n == 7):\r\n        c[6] = int((l2 >> 16) & U32(0xFF))\r\n        f = 1\r\n    if f or (n == 6):\r\n        c[5] = int((l2 >>  8) & U32(0xFF))\r\n        f = 1\r\n    if f or (n == 5):\r\n        c[4] = int((l2      ) & U32(0xFF))\r\n        f = 1\r\n    if f or (n == 4):\r\n        c[3] = int((l1 >> 24) & U32(0xFF))\r\n        f = 1\r\n    if f or (n == 3):\r\n        c[2] = int((l1 >> 16) & U32(0xFF))\r\n        f = 1\r\n    if f or (n == 2):\r\n        c[1] = int((l1 >>  8) & U32(0xFF))\r\n        f = 1\r\n    if f or (n == 1):\r\n        c[0] = int((l1      ) & U32(0xFF))\r\n        f = 1\r\n    return c[:n]\r\n\r\n# array of data\r\n# static unsigned long des_SPtrans[8][64]={\r\n# static unsigned long des_skb[8][64]={\r\nfrom des_data import des_SPtrans, des_skb\r\n\r\ndef D_ENCRYPT(tup, u, t, s):\r\n    L, R, S = tup\r\n    #print 'LRS1', L, R, S, u, t, '-->',\r\n    u = (R ^ s[S])\r\n    t = R ^ s[S + 1]\r\n    t = ((t >> 4) + (t << 28))\r\n    L = L ^ (des_SPtrans[1][int((t    ) & U32(0x3f))] | \\\r\n        des_SPtrans[3][int((t >>  8) & U32(0x3f))] | \\\r\n        des_SPtrans[5][int((t >> 16) & U32(0x3f))] | \\\r\n        des_SPtrans[7][int((t >> 24) & U32(0x3f))] | \\\r\n        des_SPtrans[0][int((u      ) & U32(0x3f))] | \\\r\n        des_SPtrans[2][int((u >>  8) & U32(0x3f))] | \\\r\n        des_SPtrans[4][int((u >> 16) & U32(0x3f))] | \\\r\n        des_SPtrans[6][int((u >> 24) & U32(0x3f))])\r\n    #print 'LRS:', L, R, S, u, t\r\n    return ((L, R, S), u, t, s)\r\n\r\n\r\ndef PERM_OP (tup, n, m):\r\n    \"tup - (a, b, t)\"\r\n    a, b, t = tup\r\n    t = ((a >> n) ^ b) & m\r\n    b = b ^ t\r\n    a = a ^ (t << n)\r\n    return (a, b, t)\r\n\r\ndef HPERM_OP (tup, n, m):\r\n    \"tup - (a, t)\"\r\n    a, t = tup\r\n    t = ((a << (16 - n)) ^ a) & m\r\n    a = a ^ t ^ (t >> (16 - n))\r\n    return (a, t)\r\n\r\nshifts2 = [0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0]\r\n\r\nclass DES:\r\n    KeySched = None # des_key_schedule\r\n\r\n    def __init__(self, key_str):\r\n        # key - UChar[8]\r\n        key = []\r\n        for i in key_str: key.append(ord(i))\r\n        #print 'key:', key\r\n        self.KeySched = des_set_key(key)\r\n        #print 'schedule:', self.KeySched, len(self.KeySched)\r\n\r\n    def decrypt(self, str):\r\n        # block - UChar[]\r\n        block = []\r\n        for i in str: block.append(ord(i))\r\n        #print block\r\n        block = des_ecb_encrypt(block, self.KeySched, 0)\r\n        res = ''\r\n        for i in block: res = res + (chr(i))\r\n        return res\r\n\r\n    def encrypt(self, str):\r\n        # block - UChar[]\r\n        block = []\r\n        for i in str: block.append(ord(i))\r\n        block = des_ecb_encrypt(block, self.KeySched, 1)\r\n        res = ''\r\n        for i in block: res = res + (chr(i))\r\n        return res\r\n\r\n\r\n\r\n\r\n\r\n\r\n#------------------------\r\ndef des_encript(input, ks, encrypt):\r\n    # input - U32[]\r\n    # output - U32[]\r\n    # ks - des_key_shedule - U32[2][16]\r\n    # encrypt - int\r\n    # l, r, t, u - U32\r\n    # i - int\r\n    # s - U32[]\r\n\r\n    l = input[0]\r\n    r = input[1]\r\n    t = U32(0)\r\n    u = U32(0)\r\n\r\n    r, l, t = PERM_OP((r, l, t),  4, U32(0x0f0f0f0fL))\r\n    l, r, t = PERM_OP((l, r, t), 16, U32(0x0000ffffL))\r\n    r, l, t = PERM_OP((r, l, t),  2, U32(0x33333333L))\r\n    l, r, t = PERM_OP((l, r, t),  8, U32(0x00ff00ffL))\r\n    r, l, t = PERM_OP((r, l, t),  1, U32(0x55555555L))\r\n\r\n    t = (r << 1)|(r >> 31)\r\n    r = (l << 1)|(l >> 31)\r\n    l = t\r\n\r\n    s = ks # ???????????????\r\n    #print l, r\r\n    if(encrypt):\r\n        for i in range(0, 32, 4):\r\n            rtup, u, t, s = D_ENCRYPT((l, r, i + 0), u, t, s)\r\n            l = rtup[0]\r\n            r = rtup[1]\r\n            rtup, u, t, s = D_ENCRYPT((r, l, i + 2), u, t, s)\r\n            r = rtup[0]\r\n            l = rtup[1]\r\n    else:\r\n        for i in range(30, 0, -4):\r\n            rtup, u, t, s = D_ENCRYPT((l, r, i - 0), u, t, s)\r\n            l = rtup[0]\r\n            r = rtup[1]\r\n            rtup, u, t, s = D_ENCRYPT((r, l, i - 2), u, t, s)\r\n            r = rtup[0]\r\n            l = rtup[1]\r\n    #print l, r\r\n    l = (l >> 1)|(l << 31)\r\n    r = (r >> 1)|(r << 31)\r\n\r\n    r, l, t = PERM_OP((r, l, t),  1, U32(0x55555555L))\r\n    l, r, t = PERM_OP((l, r, t),  8, U32(0x00ff00ffL))\r\n    r, l, t = PERM_OP((r, l, t),  2, U32(0x33333333L))\r\n    l, r, t = PERM_OP((l, r, t), 16, U32(0x0000ffffL))\r\n    r, l, t = PERM_OP((r, l, t),  4, U32(0x0f0f0f0fL))\r\n\r\n    output = [l]\r\n    output.append(r)\r\n    l, r, t, u = U32(0), U32(0), U32(0), U32(0)\r\n    return output\r\n\r\ndef des_ecb_encrypt(input, ks, encrypt):\r\n    # input - des_cblock - UChar[8]\r\n    # output - des_cblock - UChar[8]\r\n    # ks - des_key_shedule - U32[2][16]\r\n    # encrypt - int\r\n\r\n    #print input\r\n    l0 = c2l(input[0:4])\r\n    l1 = c2l(input[4:8])\r\n    ll = [l0]\r\n    ll.append(l1)\r\n    #print ll\r\n    ll = des_encript(ll, ks, encrypt)\r\n    #print ll\r\n    l0 = ll[0]\r\n    l1 = ll[1]\r\n    output = l2c(l0)\r\n    output = output + l2c(l1)\r\n    #print output\r\n    l0, l1, ll[0], ll[1] = U32(0), U32(0), U32(0), U32(0)\r\n    return output\r\n\r\ndef des_set_key(key):\r\n    # key - des_cblock - UChar[8]\r\n    # schedule - des_key_schedule\r\n\r\n    # register unsigned long c,d,t,s;\r\n    # register unsigned char *in;\r\n    # register unsigned long *k;\r\n    # register int i;\r\n\r\n    #k = schedule\r\n    # in = key\r\n\r\n    k = []\r\n    c = c2l(key[0:4])\r\n    d = c2l(key[4:8])\r\n    t = U32(0)\r\n\r\n    d, c, t = PERM_OP((d, c, t), 4, U32(0x0f0f0f0fL))\r\n    c, t = HPERM_OP((c, t), -2, U32(0xcccc0000L))\r\n    d, t = HPERM_OP((d, t), -2, U32(0xcccc0000L))\r\n    d, c, t = PERM_OP((d, c, t), 1, U32(0x55555555L))\r\n    c, d, t = PERM_OP((c, d, t), 8, U32(0x00ff00ffL))\r\n    d, c, t = PERM_OP((d, c, t), 1, U32(0x55555555L))\r\n\r\n    d = (((d & U32(0x000000ffL)) << 16)|(d & U32(0x0000ff00L))|((d & U32(0x00ff0000L)) >> 16)|((c & U32(0xf0000000L)) >> 4))\r\n    c  = c & U32(0x0fffffffL)\r\n\r\n    for i in range(16):\r\n        if (shifts2[i]):\r\n            c = ((c >> 2)|(c << 26))\r\n            d = ((d >> 2)|(d << 26))\r\n        else:\r\n            c = ((c >> 1)|(c << 27))\r\n            d = ((d >> 1)|(d << 27))\r\n        c = c & U32(0x0fffffffL)\r\n        d = d & U32(0x0fffffffL)\r\n\r\n        s=  des_skb[0][int((c    ) & U32(0x3f))]|\\\r\n            des_skb[1][int(((c>> 6) & U32(0x03))|((c>> 7) & U32(0x3c)))]|\\\r\n            des_skb[2][int(((c>>13) & U32(0x0f))|((c>>14) & U32(0x30)))]|\\\r\n            des_skb[3][int(((c>>20) & U32(0x01))|((c>>21) & U32(0x06)) | ((c>>22) & U32(0x38)))]\r\n\r\n        t=  des_skb[4][int((d    ) & U32(0x3f)                )]|\\\r\n            des_skb[5][int(((d>> 7) & U32(0x03))|((d>> 8) & U32(0x3c)))]|\\\r\n            des_skb[6][int((d>>15) & U32(0x3f)                )]|\\\r\n            des_skb[7][int(((d>>21) & U32(0x0f))|((d>>22) & U32(0x30)))]\r\n        #print s, t\r\n\r\n        k.append(((t << 16)|(s & U32(0x0000ffffL))) & U32(0xffffffffL))\r\n        s = ((s >> 16)|(t & U32(0xffff0000L)))\r\n        s = (s << 4)|(s >> 28)\r\n        k.append(s & U32(0xffffffffL))\r\n\r\n    schedule = k\r\n\r\n    return schedule\r\n"
  },
  {
    "path": "thirdparty_libs/requests_ntlm/ntlm/des_data.py",
    "content": "# This file is part of 'NTLM Authorization Proxy Server' http://sourceforge.net/projects/ntlmaps/\r\n# Copyright 2001 Dmitry A. Rozmanov <dima@xenon.spb.ru>\r\n#\r\n# This library is free software: you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation, either\r\n# version 3 of the License, or (at your option) any later version.\r\n \r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n# \r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library.  If not, see <http://www.gnu.org/licenses/> or <http://www.gnu.org/licenses/lgpl.txt>.\r\n\r\nfrom U32 import U32\r\n\r\n# static unsigned long des_SPtrans[8][64]={\r\n\r\ndes_SPtrans =\\\r\n[\r\n#nibble 0\r\n[\r\nU32(0x00820200L), U32(0x00020000L), U32(0x80800000L), U32(0x80820200L),\r\nU32(0x00800000L), U32(0x80020200L), U32(0x80020000L), U32(0x80800000L),\r\nU32(0x80020200L), U32(0x00820200L), U32(0x00820000L), U32(0x80000200L),\r\nU32(0x80800200L), U32(0x00800000L), U32(0x00000000L), U32(0x80020000L),\r\nU32(0x00020000L), U32(0x80000000L), U32(0x00800200L), U32(0x00020200L),\r\nU32(0x80820200L), U32(0x00820000L), U32(0x80000200L), U32(0x00800200L),\r\nU32(0x80000000L), U32(0x00000200L), U32(0x00020200L), U32(0x80820000L),\r\nU32(0x00000200L), U32(0x80800200L), U32(0x80820000L), U32(0x00000000L),\r\nU32(0x00000000L), U32(0x80820200L), U32(0x00800200L), U32(0x80020000L),\r\nU32(0x00820200L), U32(0x00020000L), U32(0x80000200L), U32(0x00800200L),\r\nU32(0x80820000L), U32(0x00000200L), U32(0x00020200L), U32(0x80800000L),\r\nU32(0x80020200L), U32(0x80000000L), U32(0x80800000L), U32(0x00820000L),\r\nU32(0x80820200L), U32(0x00020200L), U32(0x00820000L), U32(0x80800200L),\r\nU32(0x00800000L), U32(0x80000200L), U32(0x80020000L), U32(0x00000000L),\r\nU32(0x00020000L), U32(0x00800000L), U32(0x80800200L), U32(0x00820200L),\r\nU32(0x80000000L), U32(0x80820000L), U32(0x00000200L), U32(0x80020200L),\r\n],\r\n\r\n#nibble 1\r\n[\r\nU32(0x10042004L), U32(0x00000000L), U32(0x00042000L), U32(0x10040000L),\r\nU32(0x10000004L), U32(0x00002004L), U32(0x10002000L), U32(0x00042000L),\r\nU32(0x00002000L), U32(0x10040004L), U32(0x00000004L), U32(0x10002000L),\r\nU32(0x00040004L), U32(0x10042000L), U32(0x10040000L), U32(0x00000004L),\r\nU32(0x00040000L), U32(0x10002004L), U32(0x10040004L), U32(0x00002000L),\r\nU32(0x00042004L), U32(0x10000000L), U32(0x00000000L), U32(0x00040004L),\r\nU32(0x10002004L), U32(0x00042004L), U32(0x10042000L), U32(0x10000004L),\r\nU32(0x10000000L), U32(0x00040000L), U32(0x00002004L), U32(0x10042004L),\r\nU32(0x00040004L), U32(0x10042000L), U32(0x10002000L), U32(0x00042004L),\r\nU32(0x10042004L), U32(0x00040004L), U32(0x10000004L), U32(0x00000000L),\r\nU32(0x10000000L), U32(0x00002004L), U32(0x00040000L), U32(0x10040004L),\r\nU32(0x00002000L), U32(0x10000000L), U32(0x00042004L), U32(0x10002004L),\r\nU32(0x10042000L), U32(0x00002000L), U32(0x00000000L), U32(0x10000004L),\r\nU32(0x00000004L), U32(0x10042004L), U32(0x00042000L), U32(0x10040000L),\r\nU32(0x10040004L), U32(0x00040000L), U32(0x00002004L), U32(0x10002000L),\r\nU32(0x10002004L), U32(0x00000004L), U32(0x10040000L), U32(0x00042000L),\r\n],\r\n\r\n#nibble 2\r\n[\r\nU32(0x41000000L), U32(0x01010040L), U32(0x00000040L), U32(0x41000040L),\r\nU32(0x40010000L), U32(0x01000000L), U32(0x41000040L), U32(0x00010040L),\r\nU32(0x01000040L), U32(0x00010000L), U32(0x01010000L), U32(0x40000000L),\r\nU32(0x41010040L), U32(0x40000040L), U32(0x40000000L), U32(0x41010000L),\r\nU32(0x00000000L), U32(0x40010000L), U32(0x01010040L), U32(0x00000040L),\r\nU32(0x40000040L), U32(0x41010040L), U32(0x00010000L), U32(0x41000000L),\r\nU32(0x41010000L), U32(0x01000040L), U32(0x40010040L), U32(0x01010000L),\r\nU32(0x00010040L), U32(0x00000000L), U32(0x01000000L), U32(0x40010040L),\r\nU32(0x01010040L), U32(0x00000040L), U32(0x40000000L), U32(0x00010000L),\r\nU32(0x40000040L), U32(0x40010000L), U32(0x01010000L), U32(0x41000040L),\r\nU32(0x00000000L), U32(0x01010040L), U32(0x00010040L), U32(0x41010000L),\r\nU32(0x40010000L), U32(0x01000000L), U32(0x41010040L), U32(0x40000000L),\r\nU32(0x40010040L), U32(0x41000000L), U32(0x01000000L), U32(0x41010040L),\r\nU32(0x00010000L), U32(0x01000040L), U32(0x41000040L), U32(0x00010040L),\r\nU32(0x01000040L), U32(0x00000000L), U32(0x41010000L), U32(0x40000040L),\r\nU32(0x41000000L), U32(0x40010040L), U32(0x00000040L), U32(0x01010000L),\r\n],\r\n\r\n#nibble 3\r\n[\r\nU32(0x00100402L), U32(0x04000400L), U32(0x00000002L), U32(0x04100402L),\r\nU32(0x00000000L), U32(0x04100000L), U32(0x04000402L), U32(0x00100002L),\r\nU32(0x04100400L), U32(0x04000002L), U32(0x04000000L), U32(0x00000402L),\r\nU32(0x04000002L), U32(0x00100402L), U32(0x00100000L), U32(0x04000000L),\r\nU32(0x04100002L), U32(0x00100400L), U32(0x00000400L), U32(0x00000002L),\r\nU32(0x00100400L), U32(0x04000402L), U32(0x04100000L), U32(0x00000400L),\r\nU32(0x00000402L), U32(0x00000000L), U32(0x00100002L), U32(0x04100400L),\r\nU32(0x04000400L), U32(0x04100002L), U32(0x04100402L), U32(0x00100000L),\r\nU32(0x04100002L), U32(0x00000402L), U32(0x00100000L), U32(0x04000002L),\r\nU32(0x00100400L), U32(0x04000400L), U32(0x00000002L), U32(0x04100000L),\r\nU32(0x04000402L), U32(0x00000000L), U32(0x00000400L), U32(0x00100002L),\r\nU32(0x00000000L), U32(0x04100002L), U32(0x04100400L), U32(0x00000400L),\r\nU32(0x04000000L), U32(0x04100402L), U32(0x00100402L), U32(0x00100000L),\r\nU32(0x04100402L), U32(0x00000002L), U32(0x04000400L), U32(0x00100402L),\r\nU32(0x00100002L), U32(0x00100400L), U32(0x04100000L), U32(0x04000402L),\r\nU32(0x00000402L), U32(0x04000000L), U32(0x04000002L), U32(0x04100400L),\r\n],\r\n\r\n#nibble 4\r\n[\r\nU32(0x02000000L), U32(0x00004000L), U32(0x00000100L), U32(0x02004108L),\r\nU32(0x02004008L), U32(0x02000100L), U32(0x00004108L), U32(0x02004000L),\r\nU32(0x00004000L), U32(0x00000008L), U32(0x02000008L), U32(0x00004100L),\r\nU32(0x02000108L), U32(0x02004008L), U32(0x02004100L), U32(0x00000000L),\r\nU32(0x00004100L), U32(0x02000000L), U32(0x00004008L), U32(0x00000108L),\r\nU32(0x02000100L), U32(0x00004108L), U32(0x00000000L), U32(0x02000008L),\r\nU32(0x00000008L), U32(0x02000108L), U32(0x02004108L), U32(0x00004008L),\r\nU32(0x02004000L), U32(0x00000100L), U32(0x00000108L), U32(0x02004100L),\r\nU32(0x02004100L), U32(0x02000108L), U32(0x00004008L), U32(0x02004000L),\r\nU32(0x00004000L), U32(0x00000008L), U32(0x02000008L), U32(0x02000100L),\r\nU32(0x02000000L), U32(0x00004100L), U32(0x02004108L), U32(0x00000000L),\r\nU32(0x00004108L), U32(0x02000000L), U32(0x00000100L), U32(0x00004008L),\r\nU32(0x02000108L), U32(0x00000100L), U32(0x00000000L), U32(0x02004108L),\r\nU32(0x02004008L), U32(0x02004100L), U32(0x00000108L), U32(0x00004000L),\r\nU32(0x00004100L), U32(0x02004008L), U32(0x02000100L), U32(0x00000108L),\r\nU32(0x00000008L), U32(0x00004108L), U32(0x02004000L), U32(0x02000008L),\r\n],\r\n\r\n#nibble 5\r\n[\r\nU32(0x20000010L), U32(0x00080010L), U32(0x00000000L), U32(0x20080800L),\r\nU32(0x00080010L), U32(0x00000800L), U32(0x20000810L), U32(0x00080000L),\r\nU32(0x00000810L), U32(0x20080810L), U32(0x00080800L), U32(0x20000000L),\r\nU32(0x20000800L), U32(0x20000010L), U32(0x20080000L), U32(0x00080810L),\r\nU32(0x00080000L), U32(0x20000810L), U32(0x20080010L), U32(0x00000000L),\r\nU32(0x00000800L), U32(0x00000010L), U32(0x20080800L), U32(0x20080010L),\r\nU32(0x20080810L), U32(0x20080000L), U32(0x20000000L), U32(0x00000810L),\r\nU32(0x00000010L), U32(0x00080800L), U32(0x00080810L), U32(0x20000800L),\r\nU32(0x00000810L), U32(0x20000000L), U32(0x20000800L), U32(0x00080810L),\r\nU32(0x20080800L), U32(0x00080010L), U32(0x00000000L), U32(0x20000800L),\r\nU32(0x20000000L), U32(0x00000800L), U32(0x20080010L), U32(0x00080000L),\r\nU32(0x00080010L), U32(0x20080810L), U32(0x00080800L), U32(0x00000010L),\r\nU32(0x20080810L), U32(0x00080800L), U32(0x00080000L), U32(0x20000810L),\r\nU32(0x20000010L), U32(0x20080000L), U32(0x00080810L), U32(0x00000000L),\r\nU32(0x00000800L), U32(0x20000010L), U32(0x20000810L), U32(0x20080800L),\r\nU32(0x20080000L), U32(0x00000810L), U32(0x00000010L), U32(0x20080010L),\r\n],\r\n\r\n#nibble 6\r\n[\r\nU32(0x00001000L), U32(0x00000080L), U32(0x00400080L), U32(0x00400001L),\r\nU32(0x00401081L), U32(0x00001001L), U32(0x00001080L), U32(0x00000000L),\r\nU32(0x00400000L), U32(0x00400081L), U32(0x00000081L), U32(0x00401000L),\r\nU32(0x00000001L), U32(0x00401080L), U32(0x00401000L), U32(0x00000081L),\r\nU32(0x00400081L), U32(0x00001000L), U32(0x00001001L), U32(0x00401081L),\r\nU32(0x00000000L), U32(0x00400080L), U32(0x00400001L), U32(0x00001080L),\r\nU32(0x00401001L), U32(0x00001081L), U32(0x00401080L), U32(0x00000001L),\r\nU32(0x00001081L), U32(0x00401001L), U32(0x00000080L), U32(0x00400000L),\r\nU32(0x00001081L), U32(0x00401000L), U32(0x00401001L), U32(0x00000081L),\r\nU32(0x00001000L), U32(0x00000080L), U32(0x00400000L), U32(0x00401001L),\r\nU32(0x00400081L), U32(0x00001081L), U32(0x00001080L), U32(0x00000000L),\r\nU32(0x00000080L), U32(0x00400001L), U32(0x00000001L), U32(0x00400080L),\r\nU32(0x00000000L), U32(0x00400081L), U32(0x00400080L), U32(0x00001080L),\r\nU32(0x00000081L), U32(0x00001000L), U32(0x00401081L), U32(0x00400000L),\r\nU32(0x00401080L), U32(0x00000001L), U32(0x00001001L), U32(0x00401081L),\r\nU32(0x00400001L), U32(0x00401080L), U32(0x00401000L), U32(0x00001001L),\r\n],\r\n\r\n#nibble 7\r\n[\r\nU32(0x08200020L), U32(0x08208000L), U32(0x00008020L), U32(0x00000000L),\r\nU32(0x08008000L), U32(0x00200020L), U32(0x08200000L), U32(0x08208020L),\r\nU32(0x00000020L), U32(0x08000000L), U32(0x00208000L), U32(0x00008020L),\r\nU32(0x00208020L), U32(0x08008020L), U32(0x08000020L), U32(0x08200000L),\r\nU32(0x00008000L), U32(0x00208020L), U32(0x00200020L), U32(0x08008000L),\r\nU32(0x08208020L), U32(0x08000020L), U32(0x00000000L), U32(0x00208000L),\r\nU32(0x08000000L), U32(0x00200000L), U32(0x08008020L), U32(0x08200020L),\r\nU32(0x00200000L), U32(0x00008000L), U32(0x08208000L), U32(0x00000020L),\r\nU32(0x00200000L), U32(0x00008000L), U32(0x08000020L), U32(0x08208020L),\r\nU32(0x00008020L), U32(0x08000000L), U32(0x00000000L), U32(0x00208000L),\r\nU32(0x08200020L), U32(0x08008020L), U32(0x08008000L), U32(0x00200020L),\r\nU32(0x08208000L), U32(0x00000020L), U32(0x00200020L), U32(0x08008000L),\r\nU32(0x08208020L), U32(0x00200000L), U32(0x08200000L), U32(0x08000020L),\r\nU32(0x00208000L), U32(0x00008020L), U32(0x08008020L), U32(0x08200000L),\r\nU32(0x00000020L), U32(0x08208000L), U32(0x00208020L), U32(0x00000000L),\r\nU32(0x08000000L), U32(0x08200020L), U32(0x00008000L), U32(0x00208020L),\r\n],\r\n]\r\n\r\n#static unsigned long des_skb[8][64]={\r\n\r\ndes_skb = \\\r\n[\r\n#for C bits (numbered as per FIPS 46) 1 2 3 4 5 6\r\n[\r\nU32(0x00000000L),U32(0x00000010L),U32(0x20000000L),U32(0x20000010L),\r\nU32(0x00010000L),U32(0x00010010L),U32(0x20010000L),U32(0x20010010L),\r\nU32(0x00000800L),U32(0x00000810L),U32(0x20000800L),U32(0x20000810L),\r\nU32(0x00010800L),U32(0x00010810L),U32(0x20010800L),U32(0x20010810L),\r\nU32(0x00000020L),U32(0x00000030L),U32(0x20000020L),U32(0x20000030L),\r\nU32(0x00010020L),U32(0x00010030L),U32(0x20010020L),U32(0x20010030L),\r\nU32(0x00000820L),U32(0x00000830L),U32(0x20000820L),U32(0x20000830L),\r\nU32(0x00010820L),U32(0x00010830L),U32(0x20010820L),U32(0x20010830L),\r\nU32(0x00080000L),U32(0x00080010L),U32(0x20080000L),U32(0x20080010L),\r\nU32(0x00090000L),U32(0x00090010L),U32(0x20090000L),U32(0x20090010L),\r\nU32(0x00080800L),U32(0x00080810L),U32(0x20080800L),U32(0x20080810L),\r\nU32(0x00090800L),U32(0x00090810L),U32(0x20090800L),U32(0x20090810L),\r\nU32(0x00080020L),U32(0x00080030L),U32(0x20080020L),U32(0x20080030L),\r\nU32(0x00090020L),U32(0x00090030L),U32(0x20090020L),U32(0x20090030L),\r\nU32(0x00080820L),U32(0x00080830L),U32(0x20080820L),U32(0x20080830L),\r\nU32(0x00090820L),U32(0x00090830L),U32(0x20090820L),U32(0x20090830L),\r\n],\r\n\r\n#for C bits (numbered as per FIPS 46) 7 8 10 11 12 13\r\n[\r\nU32(0x00000000L),U32(0x02000000L),U32(0x00002000L),U32(0x02002000L),\r\nU32(0x00200000L),U32(0x02200000L),U32(0x00202000L),U32(0x02202000L),\r\nU32(0x00000004L),U32(0x02000004L),U32(0x00002004L),U32(0x02002004L),\r\nU32(0x00200004L),U32(0x02200004L),U32(0x00202004L),U32(0x02202004L),\r\nU32(0x00000400L),U32(0x02000400L),U32(0x00002400L),U32(0x02002400L),\r\nU32(0x00200400L),U32(0x02200400L),U32(0x00202400L),U32(0x02202400L),\r\nU32(0x00000404L),U32(0x02000404L),U32(0x00002404L),U32(0x02002404L),\r\nU32(0x00200404L),U32(0x02200404L),U32(0x00202404L),U32(0x02202404L),\r\nU32(0x10000000L),U32(0x12000000L),U32(0x10002000L),U32(0x12002000L),\r\nU32(0x10200000L),U32(0x12200000L),U32(0x10202000L),U32(0x12202000L),\r\nU32(0x10000004L),U32(0x12000004L),U32(0x10002004L),U32(0x12002004L),\r\nU32(0x10200004L),U32(0x12200004L),U32(0x10202004L),U32(0x12202004L),\r\nU32(0x10000400L),U32(0x12000400L),U32(0x10002400L),U32(0x12002400L),\r\nU32(0x10200400L),U32(0x12200400L),U32(0x10202400L),U32(0x12202400L),\r\nU32(0x10000404L),U32(0x12000404L),U32(0x10002404L),U32(0x12002404L),\r\nU32(0x10200404L),U32(0x12200404L),U32(0x10202404L),U32(0x12202404L),\r\n],\r\n\r\n#for C bits (numbered as per FIPS 46) 14 15 16 17 19 20\r\n[\r\nU32(0x00000000L),U32(0x00000001L),U32(0x00040000L),U32(0x00040001L),\r\nU32(0x01000000L),U32(0x01000001L),U32(0x01040000L),U32(0x01040001L),\r\nU32(0x00000002L),U32(0x00000003L),U32(0x00040002L),U32(0x00040003L),\r\nU32(0x01000002L),U32(0x01000003L),U32(0x01040002L),U32(0x01040003L),\r\nU32(0x00000200L),U32(0x00000201L),U32(0x00040200L),U32(0x00040201L),\r\nU32(0x01000200L),U32(0x01000201L),U32(0x01040200L),U32(0x01040201L),\r\nU32(0x00000202L),U32(0x00000203L),U32(0x00040202L),U32(0x00040203L),\r\nU32(0x01000202L),U32(0x01000203L),U32(0x01040202L),U32(0x01040203L),\r\nU32(0x08000000L),U32(0x08000001L),U32(0x08040000L),U32(0x08040001L),\r\nU32(0x09000000L),U32(0x09000001L),U32(0x09040000L),U32(0x09040001L),\r\nU32(0x08000002L),U32(0x08000003L),U32(0x08040002L),U32(0x08040003L),\r\nU32(0x09000002L),U32(0x09000003L),U32(0x09040002L),U32(0x09040003L),\r\nU32(0x08000200L),U32(0x08000201L),U32(0x08040200L),U32(0x08040201L),\r\nU32(0x09000200L),U32(0x09000201L),U32(0x09040200L),U32(0x09040201L),\r\nU32(0x08000202L),U32(0x08000203L),U32(0x08040202L),U32(0x08040203L),\r\nU32(0x09000202L),U32(0x09000203L),U32(0x09040202L),U32(0x09040203L),\r\n],\r\n\r\n#for C bits (numbered as per FIPS 46) 21 23 24 26 27 28\r\n[\r\nU32(0x00000000L),U32(0x00100000L),U32(0x00000100L),U32(0x00100100L),\r\nU32(0x00000008L),U32(0x00100008L),U32(0x00000108L),U32(0x00100108L),\r\nU32(0x00001000L),U32(0x00101000L),U32(0x00001100L),U32(0x00101100L),\r\nU32(0x00001008L),U32(0x00101008L),U32(0x00001108L),U32(0x00101108L),\r\nU32(0x04000000L),U32(0x04100000L),U32(0x04000100L),U32(0x04100100L),\r\nU32(0x04000008L),U32(0x04100008L),U32(0x04000108L),U32(0x04100108L),\r\nU32(0x04001000L),U32(0x04101000L),U32(0x04001100L),U32(0x04101100L),\r\nU32(0x04001008L),U32(0x04101008L),U32(0x04001108L),U32(0x04101108L),\r\nU32(0x00020000L),U32(0x00120000L),U32(0x00020100L),U32(0x00120100L),\r\nU32(0x00020008L),U32(0x00120008L),U32(0x00020108L),U32(0x00120108L),\r\nU32(0x00021000L),U32(0x00121000L),U32(0x00021100L),U32(0x00121100L),\r\nU32(0x00021008L),U32(0x00121008L),U32(0x00021108L),U32(0x00121108L),\r\nU32(0x04020000L),U32(0x04120000L),U32(0x04020100L),U32(0x04120100L),\r\nU32(0x04020008L),U32(0x04120008L),U32(0x04020108L),U32(0x04120108L),\r\nU32(0x04021000L),U32(0x04121000L),U32(0x04021100L),U32(0x04121100L),\r\nU32(0x04021008L),U32(0x04121008L),U32(0x04021108L),U32(0x04121108L),\r\n],\r\n\r\n#for D bits (numbered as per FIPS 46) 1 2 3 4 5 6\r\n[\r\nU32(0x00000000L),U32(0x10000000L),U32(0x00010000L),U32(0x10010000L),\r\nU32(0x00000004L),U32(0x10000004L),U32(0x00010004L),U32(0x10010004L),\r\nU32(0x20000000L),U32(0x30000000L),U32(0x20010000L),U32(0x30010000L),\r\nU32(0x20000004L),U32(0x30000004L),U32(0x20010004L),U32(0x30010004L),\r\nU32(0x00100000L),U32(0x10100000L),U32(0x00110000L),U32(0x10110000L),\r\nU32(0x00100004L),U32(0x10100004L),U32(0x00110004L),U32(0x10110004L),\r\nU32(0x20100000L),U32(0x30100000L),U32(0x20110000L),U32(0x30110000L),\r\nU32(0x20100004L),U32(0x30100004L),U32(0x20110004L),U32(0x30110004L),\r\nU32(0x00001000L),U32(0x10001000L),U32(0x00011000L),U32(0x10011000L),\r\nU32(0x00001004L),U32(0x10001004L),U32(0x00011004L),U32(0x10011004L),\r\nU32(0x20001000L),U32(0x30001000L),U32(0x20011000L),U32(0x30011000L),\r\nU32(0x20001004L),U32(0x30001004L),U32(0x20011004L),U32(0x30011004L),\r\nU32(0x00101000L),U32(0x10101000L),U32(0x00111000L),U32(0x10111000L),\r\nU32(0x00101004L),U32(0x10101004L),U32(0x00111004L),U32(0x10111004L),\r\nU32(0x20101000L),U32(0x30101000L),U32(0x20111000L),U32(0x30111000L),\r\nU32(0x20101004L),U32(0x30101004L),U32(0x20111004L),U32(0x30111004L),\r\n],\r\n\r\n#for D bits (numbered as per FIPS 46) 8 9 11 12 13 14\r\n[\r\nU32(0x00000000L),U32(0x08000000L),U32(0x00000008L),U32(0x08000008L),\r\nU32(0x00000400L),U32(0x08000400L),U32(0x00000408L),U32(0x08000408L),\r\nU32(0x00020000L),U32(0x08020000L),U32(0x00020008L),U32(0x08020008L),\r\nU32(0x00020400L),U32(0x08020400L),U32(0x00020408L),U32(0x08020408L),\r\nU32(0x00000001L),U32(0x08000001L),U32(0x00000009L),U32(0x08000009L),\r\nU32(0x00000401L),U32(0x08000401L),U32(0x00000409L),U32(0x08000409L),\r\nU32(0x00020001L),U32(0x08020001L),U32(0x00020009L),U32(0x08020009L),\r\nU32(0x00020401L),U32(0x08020401L),U32(0x00020409L),U32(0x08020409L),\r\nU32(0x02000000L),U32(0x0A000000L),U32(0x02000008L),U32(0x0A000008L),\r\nU32(0x02000400L),U32(0x0A000400L),U32(0x02000408L),U32(0x0A000408L),\r\nU32(0x02020000L),U32(0x0A020000L),U32(0x02020008L),U32(0x0A020008L),\r\nU32(0x02020400L),U32(0x0A020400L),U32(0x02020408L),U32(0x0A020408L),\r\nU32(0x02000001L),U32(0x0A000001L),U32(0x02000009L),U32(0x0A000009L),\r\nU32(0x02000401L),U32(0x0A000401L),U32(0x02000409L),U32(0x0A000409L),\r\nU32(0x02020001L),U32(0x0A020001L),U32(0x02020009L),U32(0x0A020009L),\r\nU32(0x02020401L),U32(0x0A020401L),U32(0x02020409L),U32(0x0A020409L),\r\n],\r\n\r\n#for D bits (numbered as per FIPS 46) 16 17 18 19 20 21\r\n[\r\nU32(0x00000000L),U32(0x00000100L),U32(0x00080000L),U32(0x00080100L),\r\nU32(0x01000000L),U32(0x01000100L),U32(0x01080000L),U32(0x01080100L),\r\nU32(0x00000010L),U32(0x00000110L),U32(0x00080010L),U32(0x00080110L),\r\nU32(0x01000010L),U32(0x01000110L),U32(0x01080010L),U32(0x01080110L),\r\nU32(0x00200000L),U32(0x00200100L),U32(0x00280000L),U32(0x00280100L),\r\nU32(0x01200000L),U32(0x01200100L),U32(0x01280000L),U32(0x01280100L),\r\nU32(0x00200010L),U32(0x00200110L),U32(0x00280010L),U32(0x00280110L),\r\nU32(0x01200010L),U32(0x01200110L),U32(0x01280010L),U32(0x01280110L),\r\nU32(0x00000200L),U32(0x00000300L),U32(0x00080200L),U32(0x00080300L),\r\nU32(0x01000200L),U32(0x01000300L),U32(0x01080200L),U32(0x01080300L),\r\nU32(0x00000210L),U32(0x00000310L),U32(0x00080210L),U32(0x00080310L),\r\nU32(0x01000210L),U32(0x01000310L),U32(0x01080210L),U32(0x01080310L),\r\nU32(0x00200200L),U32(0x00200300L),U32(0x00280200L),U32(0x00280300L),\r\nU32(0x01200200L),U32(0x01200300L),U32(0x01280200L),U32(0x01280300L),\r\nU32(0x00200210L),U32(0x00200310L),U32(0x00280210L),U32(0x00280310L),\r\nU32(0x01200210L),U32(0x01200310L),U32(0x01280210L),U32(0x01280310L),\r\n],\r\n\r\n#for D bits (numbered as per FIPS 46) 22 23 24 25 27 28\r\n[\r\nU32(0x00000000L),U32(0x04000000L),U32(0x00040000L),U32(0x04040000L),\r\nU32(0x00000002L),U32(0x04000002L),U32(0x00040002L),U32(0x04040002L),\r\nU32(0x00002000L),U32(0x04002000L),U32(0x00042000L),U32(0x04042000L),\r\nU32(0x00002002L),U32(0x04002002L),U32(0x00042002L),U32(0x04042002L),\r\nU32(0x00000020L),U32(0x04000020L),U32(0x00040020L),U32(0x04040020L),\r\nU32(0x00000022L),U32(0x04000022L),U32(0x00040022L),U32(0x04040022L),\r\nU32(0x00002020L),U32(0x04002020L),U32(0x00042020L),U32(0x04042020L),\r\nU32(0x00002022L),U32(0x04002022L),U32(0x00042022L),U32(0x04042022L),\r\nU32(0x00000800L),U32(0x04000800L),U32(0x00040800L),U32(0x04040800L),\r\nU32(0x00000802L),U32(0x04000802L),U32(0x00040802L),U32(0x04040802L),\r\nU32(0x00002800L),U32(0x04002800L),U32(0x00042800L),U32(0x04042800L),\r\nU32(0x00002802L),U32(0x04002802L),U32(0x00042802L),U32(0x04042802L),\r\nU32(0x00000820L),U32(0x04000820L),U32(0x00040820L),U32(0x04040820L),\r\nU32(0x00000822L),U32(0x04000822L),U32(0x00040822L),U32(0x04040822L),\r\nU32(0x00002820L),U32(0x04002820L),U32(0x00042820L),U32(0x04042820L),\r\nU32(0x00002822L),U32(0x04002822L),U32(0x00042822L),U32(0x04042822L),\r\n]\r\n\r\n]"
  },
  {
    "path": "thirdparty_libs/requests_ntlm/ntlm/ntlm.py",
    "content": "# This library is free software: you can redistribute it and/or\r\n# modify it under the terms of the GNU Lesser General Public\r\n# License as published by the Free Software Foundation, either\r\n# version 3 of the License, or (at your option) any later version.\r\n \r\n# This library is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# Lesser General Public License for more details.\r\n# \r\n# You should have received a copy of the GNU Lesser General Public\r\n# License along with this library.  If not, see <http://www.gnu.org/licenses/> or <http://www.gnu.org/licenses/lgpl.txt>.\r\n\r\nimport struct\r\nimport base64\r\nimport string\r\nimport des\r\nimport hashlib\r\nimport hmac\r\nimport random\r\nimport re\r\nimport binascii\r\nfrom socket import gethostname\r\n\r\nNTLM_NegotiateUnicode                =  0x00000001\r\nNTLM_NegotiateOEM                    =  0x00000002\r\nNTLM_RequestTarget                   =  0x00000004\r\nNTLM_Unknown9                        =  0x00000008\r\nNTLM_NegotiateSign                   =  0x00000010\r\nNTLM_NegotiateSeal                   =  0x00000020\r\nNTLM_NegotiateDatagram               =  0x00000040\r\nNTLM_NegotiateLanManagerKey          =  0x00000080\r\nNTLM_Unknown8                        =  0x00000100\r\nNTLM_NegotiateNTLM                   =  0x00000200\r\nNTLM_NegotiateNTOnly                 =  0x00000400\r\nNTLM_Anonymous                       =  0x00000800\r\nNTLM_NegotiateOemDomainSupplied      =  0x00001000\r\nNTLM_NegotiateOemWorkstationSupplied =  0x00002000\r\nNTLM_Unknown6                        =  0x00004000\r\nNTLM_NegotiateAlwaysSign             =  0x00008000\r\nNTLM_TargetTypeDomain                =  0x00010000\r\nNTLM_TargetTypeServer                =  0x00020000\r\nNTLM_TargetTypeShare                 =  0x00040000\r\nNTLM_NegotiateExtendedSecurity       =  0x00080000\r\nNTLM_NegotiateIdentify               =  0x00100000\r\nNTLM_Unknown5                        =  0x00200000\r\nNTLM_RequestNonNTSessionKey          =  0x00400000\r\nNTLM_NegotiateTargetInfo             =  0x00800000\r\nNTLM_Unknown4                        =  0x01000000\r\nNTLM_NegotiateVersion                =  0x02000000\r\nNTLM_Unknown3                        =  0x04000000\r\nNTLM_Unknown2                        =  0x08000000\r\nNTLM_Unknown1                        =  0x10000000\r\nNTLM_Negotiate128                    =  0x20000000\r\nNTLM_NegotiateKeyExchange            =  0x40000000\r\nNTLM_Negotiate56                     =  0x80000000\r\n\r\n# we send these flags with our type 1 message\r\nNTLM_TYPE1_FLAGS = (NTLM_NegotiateUnicode | \\\r\n                    NTLM_NegotiateOEM | \\\r\n                    NTLM_RequestTarget | \\\r\n                    NTLM_NegotiateNTLM | \\\r\n                    NTLM_NegotiateOemDomainSupplied | \\\r\n                    NTLM_NegotiateOemWorkstationSupplied | \\\r\n                    NTLM_NegotiateAlwaysSign | \\\r\n                    NTLM_NegotiateExtendedSecurity | \\\r\n                    NTLM_NegotiateVersion | \\\r\n                    NTLM_Negotiate128 | \\\r\n                    NTLM_Negotiate56 )\r\nNTLM_TYPE2_FLAGS = (NTLM_NegotiateUnicode | \\\r\n                    NTLM_RequestTarget | \\\r\n                    NTLM_NegotiateNTLM | \\\r\n                    NTLM_NegotiateAlwaysSign | \\\r\n                    NTLM_NegotiateExtendedSecurity | \\\r\n                    NTLM_NegotiateTargetInfo | \\\r\n                    NTLM_NegotiateVersion | \\\r\n                    NTLM_Negotiate128 | \\\r\n                    NTLM_Negotiate56)\r\n\r\nNTLM_MsvAvEOL             = 0 # Indicates that this is the last AV_PAIR in the list. AvLen MUST be 0. This type of information MUST be present in the AV pair list.\r\nNTLM_MsvAvNbComputerName  = 1 # The server's NetBIOS computer name. The name MUST be in Unicode, and is not null-terminated. This type of information MUST be present in the AV_pair list.\r\nNTLM_MsvAvNbDomainName    = 2 # The server's NetBIOS domain name. The name MUST be in Unicode, and is not null-terminated. This type of information MUST be present in the AV_pair list.\r\nNTLM_MsvAvDnsComputerName = 3 # The server's Active Directory DNS computer name. The name MUST be in Unicode, and is not null-terminated.\r\nNTLM_MsvAvDnsDomainName   = 4 # The server's Active Directory DNS domain name. The name MUST be in Unicode, and is not null-terminated.\r\nNTLM_MsvAvDnsTreeName     = 5 # The server's Active Directory (AD) DNS forest tree name. The name MUST be in Unicode, and is not null-terminated.\r\nNTLM_MsvAvFlags           = 6 # A field containing a 32-bit value indicating server or client configuration. 0x00000001: indicates to the client that the account authentication is constrained. 0x00000002: indicates that the client is providing message integrity in the MIC field (section 2.2.1.3) in the AUTHENTICATE_MESSAGE.\r\nNTLM_MsvAvTimestamp       = 7 # A FILETIME structure ([MS-DTYP] section 2.3.1) in little-endian byte order that contains the server local time.<12>\r\nNTLM_MsAvRestrictions     = 8 #A Restriction_Encoding structure (section 2.2.2.2). The Value field contains a structure representing the integrity level of the security principal, as well as a MachineID created at computer startup to identify the calling machine. <13>\r\n\r\n\r\n\"\"\"\r\nutility functions for Microsoft NTLM authentication\r\n\r\nReferences:\r\n[MS-NLMP]: NT LAN Manager (NTLM) Authentication Protocol Specification\r\nhttp://download.microsoft.com/download/a/e/6/ae6e4142-aa58-45c6-8dcf-a657e5900cd3/%5BMS-NLMP%5D.pdf\r\n\r\n[MS-NTHT]: NTLM Over HTTP Protocol Specification\r\nhttp://download.microsoft.com/download/a/e/6/ae6e4142-aa58-45c6-8dcf-a657e5900cd3/%5BMS-NTHT%5D.pdf\r\n\r\nCntlm Authentication Proxy\r\nhttp://cntlm.awk.cz/\r\n\r\nNTLM Authorization Proxy Server\r\nhttp://sourceforge.net/projects/ntlmaps/\r\n\r\nOptimized Attack for NTLM2 Session Response\r\nhttp://www.blackhat.com/presentations/bh-asia-04/bh-jp-04-pdfs/bh-jp-04-seki.pdf\r\n\"\"\"\r\ndef dump_NegotiateFlags(NegotiateFlags):\r\n    if NegotiateFlags & NTLM_NegotiateUnicode:\r\n        print \"NTLM_NegotiateUnicode set\"\r\n    if NegotiateFlags & NTLM_NegotiateOEM:\r\n        print \"NTLM_NegotiateOEM set\"                   \r\n    if NegotiateFlags & NTLM_RequestTarget:\r\n        print \"NTLM_RequestTarget set\"                  \r\n    if NegotiateFlags & NTLM_Unknown9:\r\n        print \"NTLM_Unknown9 set\"                       \r\n    if NegotiateFlags & NTLM_NegotiateSign:\r\n        print \"NTLM_NegotiateSign set\"                  \r\n    if NegotiateFlags & NTLM_NegotiateSeal:\r\n        print \"NTLM_NegotiateSeal set\"                  \r\n    if NegotiateFlags & NTLM_NegotiateDatagram:\r\n        print \"NTLM_NegotiateDatagram set\"              \r\n    if NegotiateFlags & NTLM_NegotiateLanManagerKey:\r\n        print \"NTLM_NegotiateLanManagerKey set\"\r\n    if NegotiateFlags & NTLM_Unknown8:\r\n        print \"NTLM_Unknown8 set\"                       \r\n    if NegotiateFlags & NTLM_NegotiateNTLM:\r\n        print \"NTLM_NegotiateNTLM set\"                  \r\n    if NegotiateFlags & NTLM_NegotiateNTOnly:\r\n        print \"NTLM_NegotiateNTOnly set\"                \r\n    if NegotiateFlags & NTLM_Anonymous:\r\n        print \"NTLM_Anonymous set\"                      \r\n    if NegotiateFlags & NTLM_NegotiateOemDomainSupplied:\r\n        print \"NTLM_NegotiateOemDomainSupplied set\"     \r\n    if NegotiateFlags & NTLM_NegotiateOemWorkstationSupplied:\r\n        print \"NTLM_NegotiateOemWorkstationSupplied set\"\r\n    if NegotiateFlags & NTLM_Unknown6:\r\n        print \"NTLM_Unknown6 set\"                       \r\n    if NegotiateFlags & NTLM_NegotiateAlwaysSign:\r\n        print \"NTLM_NegotiateAlwaysSign set\"            \r\n    if NegotiateFlags & NTLM_TargetTypeDomain:\r\n        print \"NTLM_TargetTypeDomain set\"               \r\n    if NegotiateFlags & NTLM_TargetTypeServer:\r\n        print \"NTLM_TargetTypeServer set\"               \r\n    if NegotiateFlags & NTLM_TargetTypeShare:\r\n        print \"NTLM_TargetTypeShare set\"                \r\n    if NegotiateFlags & NTLM_NegotiateExtendedSecurity:\r\n        print \"NTLM_NegotiateExtendedSecurity set\"      \r\n    if NegotiateFlags & NTLM_NegotiateIdentify:\r\n        print \"NTLM_NegotiateIdentify set\"              \r\n    if NegotiateFlags & NTLM_Unknown5:\r\n        print \"NTLM_Unknown5 set\"                       \r\n    if NegotiateFlags & NTLM_RequestNonNTSessionKey:\r\n        print \"NTLM_RequestNonNTSessionKey set\"         \r\n    if NegotiateFlags & NTLM_NegotiateTargetInfo:\r\n        print \"NTLM_NegotiateTargetInfo set\"            \r\n    if NegotiateFlags & NTLM_Unknown4:\r\n        print \"NTLM_Unknown4 set\"                       \r\n    if NegotiateFlags & NTLM_NegotiateVersion:\r\n        print \"NTLM_NegotiateVersion set\"               \r\n    if NegotiateFlags & NTLM_Unknown3:\r\n        print \"NTLM_Unknown3 set\"                       \r\n    if NegotiateFlags & NTLM_Unknown2:\r\n        print \"NTLM_Unknown2 set\"                       \r\n    if NegotiateFlags & NTLM_Unknown1:\r\n        print \"NTLM_Unknown1 set\"                       \r\n    if NegotiateFlags & NTLM_Negotiate128:\r\n        print \"NTLM_Negotiate128 set\"                   \r\n    if NegotiateFlags & NTLM_NegotiateKeyExchange:\r\n        print \"NTLM_NegotiateKeyExchange set\"           \r\n    if NegotiateFlags & NTLM_Negotiate56:\r\n        print \"NTLM_Negotiate56 set\"                    \r\n\r\ndef create_NTLM_NEGOTIATE_MESSAGE(user, type1_flags=NTLM_TYPE1_FLAGS):\r\n    BODY_LENGTH = 40\r\n    Payload_start = BODY_LENGTH # in bytes\r\n    protocol = 'NTLMSSP\\0'    #name        \r\n    \r\n    type = struct.pack('<I',1) #type 1\r\n    \r\n    flags =  struct.pack('<I', type1_flags)\r\n    Workstation = gethostname().upper().encode('ascii')\r\n    user_parts = user.split('\\\\', 1)\r\n    DomainName = user_parts[0].upper().encode('ascii')\r\n    EncryptedRandomSessionKey = \"\"\r\n    \r\n    \r\n    WorkstationLen = struct.pack('<H', len(Workstation))\r\n    WorkstationMaxLen = struct.pack('<H', len(Workstation))\r\n    WorkstationBufferOffset = struct.pack('<I', Payload_start)\r\n    Payload_start += len(Workstation)\r\n    DomainNameLen = struct.pack('<H', len(DomainName))\r\n    DomainNameMaxLen = struct.pack('<H', len(DomainName))\r\n    DomainNameBufferOffset = struct.pack('<I',Payload_start)\r\n    Payload_start += len(DomainName)\r\n    ProductMajorVersion = struct.pack('<B', 5)\r\n    ProductMinorVersion = struct.pack('<B', 1)\r\n    ProductBuild = struct.pack('<H', 2600)\r\n    VersionReserved1 = struct.pack('<B', 0)\r\n    VersionReserved2 = struct.pack('<B', 0)\r\n    VersionReserved3 = struct.pack('<B', 0)\r\n    NTLMRevisionCurrent = struct.pack('<B', 15)\r\n    \r\n    msg1 = protocol + type + flags + \\\r\n            DomainNameLen + DomainNameMaxLen + DomainNameBufferOffset + \\\r\n            WorkstationLen + WorkstationMaxLen + WorkstationBufferOffset + \\\r\n            ProductMajorVersion + ProductMinorVersion + ProductBuild + \\\r\n            VersionReserved1 + VersionReserved2 + VersionReserved3 + NTLMRevisionCurrent\r\n    assert BODY_LENGTH==len(msg1), \"BODY_LENGTH: %d != msg1: %d\" % (BODY_LENGTH,len(msg1))\r\n    msg1 += Workstation + DomainName\r\n    msg1 = base64.encodestring(msg1)\r\n    msg1 = string.replace(msg1, '\\n', '')\r\n    return msg1\r\n    \r\ndef parse_NTLM_CHALLENGE_MESSAGE(msg2):\r\n    \"\"\r\n    msg2 = base64.decodestring(msg2)\r\n    Signature = msg2[0:8]\r\n    msg_type = struct.unpack(\"<I\",msg2[8:12])[0]\r\n    assert(msg_type==2)\r\n    TargetNameLen = struct.unpack(\"<H\",msg2[12:14])[0]\r\n    TargetNameMaxLen = struct.unpack(\"<H\",msg2[14:16])[0]\r\n    TargetNameOffset = struct.unpack(\"<I\",msg2[16:20])[0]\r\n    TargetName = msg2[TargetNameOffset:TargetNameOffset+TargetNameMaxLen]\r\n    NegotiateFlags = struct.unpack(\"<I\",msg2[20:24])[0]\r\n    ServerChallenge = msg2[24:32]\r\n    Reserved = msg2[32:40]\r\n    if NegotiateFlags & NTLM_NegotiateTargetInfo:\r\n        TargetInfoLen = struct.unpack(\"<H\",msg2[40:42])[0]\r\n        TargetInfoMaxLen = struct.unpack(\"<H\",msg2[42:44])[0]\r\n        TargetInfoOffset = struct.unpack(\"<I\",msg2[44:48])[0]\r\n        TargetInfo = msg2[TargetInfoOffset:TargetInfoOffset+TargetInfoLen]\r\n        i=0\r\n        TimeStamp = '\\0'*8\r\n        while(i<TargetInfoLen):\r\n            AvId = struct.unpack(\"<H\",TargetInfo[i:i+2])[0]\r\n            AvLen = struct.unpack(\"<H\",TargetInfo[i+2:i+4])[0]\r\n            AvValue = TargetInfo[i+4:i+4+AvLen]\r\n            i = i+4+AvLen\r\n            if AvId == NTLM_MsvAvTimestamp:\r\n                TimeStamp = AvValue \r\n            #~ print AvId, AvValue.decode('utf-16')\r\n    return (ServerChallenge, NegotiateFlags)\r\n\r\ndef create_NTLM_AUTHENTICATE_MESSAGE(nonce, user, domain, password, NegotiateFlags):\r\n    \"\"\r\n    is_unicode  = NegotiateFlags & NTLM_NegotiateUnicode\r\n    is_NegotiateExtendedSecurity = NegotiateFlags & NTLM_NegotiateExtendedSecurity\r\n    \r\n    flags =  struct.pack('<I',NTLM_TYPE2_FLAGS)\r\n\r\n    BODY_LENGTH = 72\r\n    Payload_start = BODY_LENGTH # in bytes\r\n\r\n    Workstation = gethostname().upper()\r\n    DomainName = domain.upper()\r\n    UserName = user\r\n    EncryptedRandomSessionKey = \"\"\r\n    if is_unicode:\r\n        Workstation = Workstation.encode('utf-16-le')\r\n        DomainName = DomainName.encode('utf-16-le')\r\n        UserName = UserName.encode('utf-16-le')\r\n        EncryptedRandomSessionKey = EncryptedRandomSessionKey.encode('utf-16-le')\r\n    LmChallengeResponse = calc_resp(create_LM_hashed_password_v1(password), nonce)\r\n    NtChallengeResponse = calc_resp(create_NT_hashed_password_v1(password), nonce)\r\n    \r\n    if is_NegotiateExtendedSecurity:\r\n        pwhash = create_NT_hashed_password_v1(password, UserName, DomainName)\r\n        ClientChallenge = \"\"\r\n        for i in range(8):\r\n           ClientChallenge+= chr(random.getrandbits(8))\r\n        (NtChallengeResponse, LmChallengeResponse) = ntlm2sr_calc_resp(pwhash, nonce, ClientChallenge) #='\\x39 e3 f4 cd 59 c5 d8 60')\r\n    Signature = 'NTLMSSP\\0'           \r\n    MessageType = struct.pack('<I',3)  #type 3\r\n    \r\n    DomainNameLen = struct.pack('<H', len(DomainName))\r\n    DomainNameMaxLen = struct.pack('<H', len(DomainName))\r\n    DomainNameOffset = struct.pack('<I', Payload_start)\r\n    Payload_start += len(DomainName)\r\n    \r\n    UserNameLen = struct.pack('<H', len(UserName))\r\n    UserNameMaxLen = struct.pack('<H', len(UserName))\r\n    UserNameOffset = struct.pack('<I', Payload_start)\r\n    Payload_start += len(UserName)\r\n    \r\n    WorkstationLen = struct.pack('<H', len(Workstation))\r\n    WorkstationMaxLen = struct.pack('<H', len(Workstation))\r\n    WorkstationOffset = struct.pack('<I', Payload_start)\r\n    Payload_start += len(Workstation)\r\n    \r\n    \r\n    LmChallengeResponseLen = struct.pack('<H', len(LmChallengeResponse))\r\n    LmChallengeResponseMaxLen = struct.pack('<H', len(LmChallengeResponse))\r\n    LmChallengeResponseOffset = struct.pack('<I', Payload_start)\r\n    Payload_start += len(LmChallengeResponse)\r\n    \r\n    NtChallengeResponseLen = struct.pack('<H', len(NtChallengeResponse))\r\n    NtChallengeResponseMaxLen = struct.pack('<H', len(NtChallengeResponse))\r\n    NtChallengeResponseOffset = struct.pack('<I', Payload_start)\r\n    Payload_start += len(NtChallengeResponse)\r\n    \r\n    EncryptedRandomSessionKeyLen = struct.pack('<H', len(EncryptedRandomSessionKey))\r\n    EncryptedRandomSessionKeyMaxLen = struct.pack('<H', len(EncryptedRandomSessionKey))\r\n    EncryptedRandomSessionKeyOffset = struct.pack('<I',Payload_start)\r\n    Payload_start +=  len(EncryptedRandomSessionKey)\r\n    NegotiateFlags = flags\r\n    \r\n    ProductMajorVersion = struct.pack('<B', 5)\r\n    ProductMinorVersion = struct.pack('<B', 1)\r\n    ProductBuild = struct.pack('<H', 2600)\r\n    VersionReserved1 = struct.pack('<B', 0)\r\n    VersionReserved2 = struct.pack('<B', 0)\r\n    VersionReserved3 = struct.pack('<B', 0)\r\n    NTLMRevisionCurrent = struct.pack('<B', 15)\r\n    \r\n    MIC = struct.pack('<IIII',0,0,0,0)\r\n    msg3 = Signature + MessageType + \\\r\n            LmChallengeResponseLen + LmChallengeResponseMaxLen + LmChallengeResponseOffset + \\\r\n            NtChallengeResponseLen + NtChallengeResponseMaxLen + NtChallengeResponseOffset + \\\r\n            DomainNameLen + DomainNameMaxLen + DomainNameOffset + \\\r\n            UserNameLen + UserNameMaxLen + UserNameOffset + \\\r\n            WorkstationLen + WorkstationMaxLen + WorkstationOffset + \\\r\n            EncryptedRandomSessionKeyLen + EncryptedRandomSessionKeyMaxLen + EncryptedRandomSessionKeyOffset + \\\r\n            NegotiateFlags + \\\r\n            ProductMajorVersion + ProductMinorVersion + ProductBuild + \\\r\n            VersionReserved1 + VersionReserved2 + VersionReserved3 + NTLMRevisionCurrent\r\n    assert BODY_LENGTH==len(msg3), \"BODY_LENGTH: %d != msg3: %d\" % (BODY_LENGTH,len(msg3))\r\n    Payload = DomainName + UserName + Workstation + LmChallengeResponse + NtChallengeResponse + EncryptedRandomSessionKey\r\n    msg3 += Payload\r\n    msg3 = base64.encodestring(msg3)\r\n    msg3 = string.replace(msg3, '\\n', '')\r\n    return msg3\r\n            \r\ndef calc_resp(password_hash, server_challenge):\r\n    \"\"\"calc_resp generates the LM response given a 16-byte password hash and the\r\n        challenge from the Type-2 message.\r\n        @param password_hash\r\n            16-byte password hash\r\n        @param server_challenge\r\n            8-byte challenge from Type-2 message\r\n        returns\r\n            24-byte buffer to contain the LM response upon return\r\n    \"\"\"\r\n    # padding with zeros to make the hash 21 bytes long\r\n    password_hash = password_hash + '\\0' * (21 - len(password_hash))\r\n    res = ''\r\n    dobj = des.DES(password_hash[0:7])\r\n    res = res + dobj.encrypt(server_challenge[0:8])\r\n\r\n    dobj = des.DES(password_hash[7:14])\r\n    res = res + dobj.encrypt(server_challenge[0:8])\r\n\r\n    dobj = des.DES(password_hash[14:21])\r\n    res = res + dobj.encrypt(server_challenge[0:8])\r\n    return res\r\n    \r\ndef ComputeResponse(ResponseKeyNT, ResponseKeyLM, ServerChallenge, ServerName, ClientChallenge='\\xaa'*8, Time='\\0'*8):\r\n    LmChallengeResponse = hmac.new(ResponseKeyLM, ServerChallenge+ClientChallenge).digest() + ClientChallenge\r\n    \r\n    Responserversion = '\\x01'\r\n    HiResponserversion = '\\x01'\r\n    temp = Responserversion + HiResponserversion + '\\0'*6 + Time + ClientChallenge + '\\0'*4 + ServerChallenge + '\\0'*4 \r\n    NTProofStr  = hmac.new(ResponseKeyNT, ServerChallenge + temp).digest()\r\n    NtChallengeResponse = NTProofStr + temp\r\n    \r\n    SessionBaseKey = hmac.new(ResponseKeyNT, NTProofStr).digest()\r\n    return (NtChallengeResponse, LmChallengeResponse)\r\n\r\ndef ntlm2sr_calc_resp(ResponseKeyNT, ServerChallenge, ClientChallenge='\\xaa'*8):\r\n    import hashlib\r\n    LmChallengeResponse = ClientChallenge + '\\0'*16\r\n    sess = hashlib.md5(ServerChallenge+ClientChallenge).digest()\r\n    NtChallengeResponse = calc_resp(ResponseKeyNT, sess[0:8])\r\n    return (NtChallengeResponse, LmChallengeResponse)\r\n\r\ndef create_LM_hashed_password_v1(passwd):\r\n    \"setup LanManager password\"\r\n    \"create LanManager hashed password\"\r\n    # if the passwd provided is already a hash, we just return the first half\r\n    if re.match(r'^[\\w]{32}:[\\w]{32}$',passwd):\r\n        return binascii.unhexlify(passwd.split(':')[0])\r\n\r\n    # fix the password length to 14 bytes\r\n    passwd = string.upper(passwd)\r\n    lm_pw = passwd + '\\0' * (14 - len(passwd))\r\n    lm_pw = passwd[0:14]\r\n\r\n    # do hash\r\n    magic_str = \"KGS!@#$%\" # page 57 in [MS-NLMP]\r\n\r\n    res = ''\r\n    dobj = des.DES(lm_pw[0:7])\r\n    res = res + dobj.encrypt(magic_str)\r\n\r\n    dobj = des.DES(lm_pw[7:14])\r\n    res = res + dobj.encrypt(magic_str)\r\n\r\n    return res\r\n    \r\ndef create_NT_hashed_password_v1(passwd, user=None, domain=None):\r\n    \"create NT hashed password\"\r\n    # if the passwd provided is already a hash, we just return the second half\r\n    if re.match(r'^[\\w]{32}:[\\w]{32}$',passwd):\r\n        return binascii.unhexlify(passwd.split(':')[1])\r\n        \r\n    digest = hashlib.new('md4', passwd.encode('utf-16le')).digest()\r\n    return digest\r\n\r\ndef create_NT_hashed_password_v2(passwd, user, domain):\r\n    \"create NT hashed password\"\r\n    digest = create_NT_hashed_password_v1(passwd)\r\n    \r\n    return hmac.new(digest, (user.upper()+domain).encode('utf-16le')).digest()\r\n    return digest\r\n    \r\ndef create_sessionbasekey(password):\r\n    return hashlib.new('md4', create_NT_hashed_password_v1(password)).digest()\r\n\r\nif __name__ == \"__main__\":\r\n    def ByteToHex( byteStr ):\r\n        \"\"\"\r\n        Convert a byte string to it's hex string representation e.g. for output.\r\n        \"\"\"\r\n        return ' '.join( [ \"%02X\" % ord( x ) for x in byteStr ] )\r\n\r\n    def HexToByte( hexStr ):\r\n        \"\"\"\r\n        Convert a string hex byte values into a byte string. The Hex Byte values may\r\n        or may not be space separated.\r\n        \"\"\"\r\n        bytes = []\r\n\r\n        hexStr = ''.join( hexStr.split(\" \") )\r\n\r\n        for i in range(0, len(hexStr), 2):\r\n            bytes.append( chr( int (hexStr[i:i+2], 16 ) ) )\r\n\r\n        return ''.join( bytes )\r\n        \r\n    ServerChallenge = HexToByte(\"01 23 45 67 89 ab cd ef\")\r\n    ClientChallenge = '\\xaa'*8\r\n    Time = '\\x00'*8\r\n    Workstation = \"COMPUTER\".encode('utf-16-le')\r\n    ServerName = \"Server\".encode('utf-16-le')\r\n    User = \"User\"\r\n    Domain = \"Domain\"\r\n    Password = \"Password\"\r\n    RandomSessionKey = '\\55'*16\r\n    assert HexToByte(\"e5 2c ac 67 41 9a 9a 22 4a 3b 10 8f 3f a6 cb 6d\") == create_LM_hashed_password_v1(Password)                  # [MS-NLMP] page 72\r\n    assert HexToByte(\"a4 f4 9c 40 65 10 bd ca b6 82 4e e7 c3 0f d8 52\") == create_NT_hashed_password_v1(Password)    # [MS-NLMP] page 73\r\n    assert HexToByte(\"d8 72 62 b0 cd e4 b1 cb 74 99 be cc cd f1 07 84\") == create_sessionbasekey(Password)\r\n    assert HexToByte(\"67 c4 30 11 f3 02 98 a2 ad 35 ec e6 4f 16 33 1c 44 bd be d9 27 84 1f 94\") == calc_resp(create_NT_hashed_password_v1(Password), ServerChallenge)\r\n    assert HexToByte(\"98 de f7 b8 7f 88 aa 5d af e2 df 77 96 88 a1 72 de f1 1c 7d 5c cd ef 13\") == calc_resp(create_LM_hashed_password_v1(Password), ServerChallenge)\r\n    \r\n    (NTLMv1Response,LMv1Response) = ntlm2sr_calc_resp(create_NT_hashed_password_v1(Password), ServerChallenge, ClientChallenge)\r\n    assert HexToByte(\"aa aa aa aa aa aa aa aa 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\") == LMv1Response  # [MS-NLMP] page 75\r\n    assert HexToByte(\"75 37 f8 03 ae 36 71 28 ca 45 82 04 bd e7 ca f8 1e 97 ed 26 83 26 72 32\") == NTLMv1Response\r\n    \r\n    assert HexToByte(\"0c 86 8a 40 3b fd 7a 93 a3 00 1e f2 2e f0 2e 3f\") == create_NT_hashed_password_v2(Password, User, Domain)    # [MS-NLMP] page 76\r\n    ResponseKeyLM = ResponseKeyNT = create_NT_hashed_password_v2(Password, User, Domain)\r\n    (NTLMv2Response,LMv2Response) = ComputeResponse(ResponseKeyNT, ResponseKeyLM, ServerChallenge, ServerName, ClientChallenge, Time)\r\n    assert HexToByte(\"86 c3 50 97 ac 9c ec 10 25 54 76 4a 57 cc cc 19 aa aa aa aa aa aa aa aa\") == LMv2Response  # [MS-NLMP] page 76\r\n    \r\n    # expected failure\r\n    # According to the spec in section '3.3.2 NTLM v2 Authentication' the NTLMv2Response should be longer than the value given on page 77 (this suggests a mistake in the spec)\r\n    #~ assert HexToByte(\"68 cd 0a b8 51 e5 1c 96 aa bc 92 7b eb ef 6a 1c\") == NTLMv2Response, \"\\nExpected: 68 cd 0a b8 51 e5 1c 96 aa bc 92 7b eb ef 6a 1c\\nActual:   %s\" % ByteToHex(NTLMv2Response) # [MS-NLMP] page 77\r\n    \r\n"
  },
  {
    "path": "thirdparty_libs/requests_ntlm/requests_ntlm.py",
    "content": "from requests.auth import AuthBase\nfrom requests.adapters import HTTPAdapter\nfrom .ntlm import ntlm\n\n\nclass HttpNtlmAuth(AuthBase):\n    \"\"\"HTTP NTLM Authentication Handler for Requests. Supports pass-the-hash.\"\"\"\n\n    def __init__(self, username, password):\n        \"\"\"\n            :username   - Username in 'domain\\\\username' format\n            :password   - Password or hash in \"ABCDABCDABCDABCD:ABCDABCDABCDABCD\" format.\n        \"\"\"\n        if ntlm is None:\n            raise Exception(\"NTLM libraries unavailable\")\n        #parse the username\n        user_parts = username.split('\\\\', 1)\n        self.domain = user_parts[0].upper()\n        self.username = user_parts[1]\n\n        self.password = password\n        self.adapter = HTTPAdapter()\n\n\n    def retry_using_http_NTLM_auth(self, auth_header_field, auth_header, response):\n        \"\"\"Attempts to authenticate using HTTP NTLM challenge/response\"\"\"\n\n        if auth_header in response.request.headers:\n            return response\n\n        request = response.request\n        # initial auth header with username. will result in challenge\n        auth = 'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(\"%s\\\\%s\" % (self.domain,self.username))\n        request.headers[auth_header] = auth\n\n        # we must keep the connection because NTLM authenticates the connection, not single requests\n        request.headers[\"Connection\"] = \"Keep-Alive\"\n\n        response2 = self.adapter.send(request)\n\n        # this is important for some web applications that store authentication-related info in cookies (it took a long time to figure out)\n        if response2.headers.get('set-cookie'):\n            headers['Cookie'] = response2.headers.get('set-cookie')\n\n        # get the challenge\n        auth_header_value = response2.headers[auth_header_field]\n        ServerChallenge, NegotiateFlags = ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value[5:])\n\n        # build response\n        auth = 'NTLM %s' % ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge, self.username, self.domain, self.password, NegotiateFlags)\n        request.headers[auth_header] = auth\n        request.headers[\"Connection\"] = \"Close\"\n\n        response = self.adapter.send(request)\n\n        return response\n\n\n    def response_hook(self,r):\n\n        if r.status_code == 401 and 'ntlm' in r.headers.get('www-authenticate','').lower():\n            return self.retry_using_http_NTLM_auth('www-authenticate', 'Authorization', r)\n\n        if r.status_code == 407 and 'ntlm' in r.headers.get('proxy-authenticate','').lower():\n            return self.retry_using_http_NTLM_auth('proxy-authenticate', 'Proxy-authorization', r)\n\n        return r\n\n\n    def __call__(self,r):\n        r.register_hook('response', self.response_hook)\n        return r\n"
  },
  {
    "path": "thirdparty_libs/termcolor/__init__.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nCopyright (c) 2014-2015 pocsuite developers (http://seebug.org)\nSee the file 'docs/COPYING' for copying permission\n\"\"\"\n"
  },
  {
    "path": "thirdparty_libs/termcolor/termcolor.py",
    "content": "# coding: utf-8\n# Copyright (c) 2008-2011 Volvox Development Team\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to deal\n# in the Software without restriction, including without limitation the rights\n# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n# copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n# THE SOFTWARE.\n#\n# Author: Konstantin Lepa <konstantin.lepa@gmail.com>\n\n\"\"\"ANSII Color formatting for output in terminal.\"\"\"\n\nfrom __future__ import print_function\n\nimport os\n\n__ALL__ = [ 'colored', 'cprint' ]\n\nVERSION = (1, 1, 0)\n\nATTRIBUTES = dict(\n        list(zip([\n            'bold',\n            'dark',\n            '',\n            'underline',\n            'blink',\n            '',\n            'reverse',\n            'concealed'\n            ],\n            list(range(1, 9))\n            ))\n        )\ndel ATTRIBUTES['']\n\n\nHIGHLIGHTS = dict(\n        list(zip([\n            'on_grey',\n            'on_red',\n            'on_green',\n            'on_yellow',\n            'on_blue',\n            'on_magenta',\n            'on_cyan',\n            'on_white'\n            ],\n            list(range(40, 48))\n            ))\n        )\n\n\nCOLORS = dict(\n        list(zip([\n            'grey',\n            'red',\n            'green',\n            'yellow',\n            'blue',\n            'magenta',\n            'cyan',\n            'white',\n            ],\n            list(range(30, 38))\n            ))\n        )\n\n\nRESET = '\\033[0m'\n\n\ndef colored(text, color=None, on_color=None, attrs=None):\n    \"\"\"Colorize text.\n\n    Available text colors:\n        red, green, yellow, blue, magenta, cyan, white.\n\n    Available text highlights:\n        on_red, on_green, on_yellow, on_blue, on_magenta, on_cyan, on_white.\n\n    Available attributes:\n        bold, dark, underline, blink, reverse, concealed.\n\n    Example:\n        colored('Hello, World!', 'red', 'on_grey', ['blue', 'blink'])\n        colored('Hello, World!', 'green')\n    \"\"\"\n    if os.getenv('ANSI_COLORS_DISABLED') is None:\n        fmt_str = '\\033[%dm%s'\n        if color is not None:\n            text = fmt_str % (COLORS[color], text)\n\n        if on_color is not None:\n            text = fmt_str % (HIGHLIGHTS[on_color], text)\n\n        if attrs is not None:\n            for attr in attrs:\n                text = fmt_str % (ATTRIBUTES[attr], text)\n\n        text += RESET\n    return text\n\n\ndef cprint(text, color=None, on_color=None, attrs=None, **kwargs):\n    \"\"\"Print colorize text.\n\n    It accepts arguments of print function.\n    \"\"\"\n\n    print((colored(text, color, on_color, attrs)), **kwargs)\n\n\nif __name__ == '__main__':\n    print('Current terminal type: %s' % os.getenv('TERM'))\n    print('Test basic colors:')\n    cprint('Grey color', 'grey')\n    cprint('Red color', 'red')\n    cprint('Green color', 'green')\n    cprint('Yellow color', 'yellow')\n    cprint('Blue color', 'blue')\n    cprint('Magenta color', 'magenta')\n    cprint('Cyan color', 'cyan')\n    cprint('White color', 'white')\n    print(('-' * 78))\n\n    print('Test highlights:')\n    cprint('On grey color', on_color='on_grey')\n    cprint('On red color', on_color='on_red')\n    cprint('On green color', on_color='on_green')\n    cprint('On yellow color', on_color='on_yellow')\n    cprint('On blue color', on_color='on_blue')\n    cprint('On magenta color', on_color='on_magenta')\n    cprint('On cyan color', on_color='on_cyan')\n    cprint('On white color', color='grey', on_color='on_white')\n    print('-' * 78)\n\n    print('Test attributes:')\n    cprint('Bold grey color', 'grey', attrs=['bold'])\n    cprint('Dark red color', 'red', attrs=['dark'])\n    cprint('Underline green color', 'green', attrs=['underline'])\n    cprint('Blink yellow color', 'yellow', attrs=['blink'])\n    cprint('Reversed blue color', 'blue', attrs=['reverse'])\n    cprint('Concealed Magenta color', 'magenta', attrs=['concealed'])\n    cprint('Bold underline reverse cyan color', 'cyan',\n            attrs=['bold', 'underline', 'reverse'])\n    cprint('Dark blink concealed white color', 'white',\n            attrs=['dark', 'blink', 'concealed'])\n    print(('-' * 78))\n\n    print('Test mixing:')\n    cprint('Underline red on grey color', 'red', 'on_grey',\n            ['underline'])\n    cprint('Reversed green on red color', 'green', 'on_red', ['reverse'])\n"
  },
  {
    "path": "thirdparty_libs/texttable.py",
    "content": "#!/usr/bin/env python\n#\n# texttable - module for creating simple ASCII tables\n# Copyright (C) 2003-2011 Gerome Fournier <jef(at)foutaise.org>\n#\n# This library is free software; you can redistribute it and/or\n# modify it under the terms of the GNU Lesser General Public\n# License as published by the Free Software Foundation; either\n# version 2.1 of the License, or (at your option) any later version.\n#\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# Lesser General Public License for more details.\n#\n# You should have received a copy of the GNU Lesser General Public\n# License along with this library; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n\n\"\"\"module for creating simple ASCII tables\n\n\nExample:\n\n    table = Texttable()\n    table.set_cols_align([\"l\", \"r\", \"c\"])\n    table.set_cols_valign([\"t\", \"m\", \"b\"])\n    table.add_rows([ [\"Name\", \"Age\", \"Nickname\"],\n                     [\"Mr\\\\nXavier\\\\nHuon\", 32, \"Xav'\"],\n                     [\"Mr\\\\nBaptiste\\\\nClement\", 1, \"Baby\"] ])\n    print table.draw() + \"\\\\n\"\n\n    table = Texttable()\n    table.set_deco(Texttable.HEADER)\n    table.set_cols_dtype(['t',  # text\n                          'f',  # float (decimal)\n                          'e',  # float (exponent)\n                          'i',  # integer\n                          'a']) # automatic\n    table.set_cols_align([\"l\", \"r\", \"r\", \"r\", \"l\"])\n    table.add_rows([[\"text\",    \"float\", \"exp\", \"int\", \"auto\"],\n                    [\"abcd\",    \"67\",    654,   89,    128.001],\n                    [\"efghijk\", 67.5434, .654,  89.6,  12800000000000000000000.00023],\n                    [\"lmn\",     5e-78,   5e-78, 89.4,  .000000000000128],\n                    [\"opqrstu\", .023,    5e+78, 92.,   12800000000000000000000]])\n    print table.draw()\n\nResult:\n\n    +----------+-----+----------+\n    |   Name   | Age | Nickname |\n    +==========+=====+==========+\n    | Mr       |     |          |\n    | Xavier   |  32 |          |\n    | Huon     |     |   Xav'   |\n    +----------+-----+----------+\n    | Mr       |     |          |\n    | Baptiste |   1 |          |\n    | Clement  |     |   Baby   |\n    +----------+-----+----------+\n\n    text   float       exp      int     auto\n    ===========================================\n    abcd   67.000   6.540e+02   89    128.001\n    efgh   67.543   6.540e-01   90    1.280e+22\n    ijkl   0.000    5.000e-78   89    0.000\n    mnop   0.023    5.000e+78   92    1.280e+22\n\"\"\"\n\n__all__ = [\"Texttable\", \"ArraySizeError\"]\n\n__author__ = 'Gerome Fournier <jef(at)foutaise.org>'\n__license__ = 'GPL'\n__version__ = '0.8.1'\n__credits__ = \"\"\"\\\nJeff Kowalczyk:\n    - textwrap improved import\n    - comment concerning header output\n\nAnonymous:\n    - add_rows method, for adding rows in one go\n\nSergey Simonenko:\n    - redefined len() function to deal with non-ASCII characters\n\nRoger Lew:\n    - columns datatype specifications\n\nBrian Peterson:\n    - better handling of unicode errors\n\"\"\"\n\nimport sys\nimport string\n\ntry:\n    if sys.version >= '2.3':\n        import textwrap\n    elif sys.version >= '2.2':\n        from optparse import textwrap\n    else:\n        from optik import textwrap\nexcept ImportError:\n    sys.stderr.write(\"Can't import textwrap module!\\n\")\n    raise\n\ntry:\n    True, False\nexcept NameError:\n    (True, False) = (1, 0)\n\ndef len(iterable):\n    \"\"\"Redefining len here so it will be able to work with non-ASCII characters\n    \"\"\"\n    if not isinstance(iterable, str):\n        return iterable.__len__()\n\n    try:\n        return len(unicode(iterable, 'utf'))\n    except:\n        return iterable.__len__()\n\nclass ArraySizeError(Exception):\n    \"\"\"Exception raised when specified rows don't fit the required size\n    \"\"\"\n\n    def __init__(self, msg):\n        self.msg = msg\n        Exception.__init__(self, msg, '')\n\n    def __str__(self):\n        return self.msg\n\nclass bcolors:\n    PURPLE = '\\033[95m'\n    BLUE = '\\033[94m'\n    GREEN = '\\033[92m'\n    YELLOW = '\\033[93m'\n    RED = '\\033[91m'\n    ENDC = '\\033[0m'\n    WHITE = ''\n\ndef bcolors_public_props():\n    return (name for name in dir(bcolors) if not name.startswith('_'))\n\ndef get_color_string(type, string):\n    end = bcolors.ENDC\n    if type == bcolors.WHITE:\n        end = ''\n    return '%s%s%s' % (type, string, end)\n\nclass Texttable:\n\n    BORDER = 1\n    HEADER = 1 << 1\n    HLINES = 1 << 2\n    VLINES = 1 << 3\n\n    def __init__(self, max_width=80):\n        \"\"\"Constructor\n\n        - max_width is an integer, specifying the maximum width of the table\n        - if set to 0, size is unlimited, therefore cells won't be wrapped\n        \"\"\"\n\n        if max_width <= 0:\n            max_width = False\n        self._max_width = max_width\n        self._precision = 3\n\n        self._deco = Texttable.VLINES | Texttable.HLINES | Texttable.BORDER | \\\n            Texttable.HEADER\n        self.set_chars(['-', '|', '+', '='])\n        self.reset()\n\n    def reset(self):\n        \"\"\"Reset the instance\n\n        - reset rows and header\n        \"\"\"\n\n        self._hline_string = None\n        self._row_size = None\n        self._header = []\n        self._rows = []\n\n    def set_chars(self, array):\n        \"\"\"Set the characters used to draw lines between rows and columns\n\n        - the array should contain 4 fields:\n\n            [horizontal, vertical, corner, header]\n\n        - default is set to:\n\n            ['-', '|', '+', '=']\n        \"\"\"\n\n        if len(array) != 4:\n            raise ArraySizeError, \"array should contain 4 characters\"\n        array = [ x[:1] for x in [ str(s) for s in array ] ]\n        (self._char_horiz, self._char_vert,\n            self._char_corner, self._char_header) = array\n\n    def set_deco(self, deco):\n        \"\"\"Set the table decoration\n\n        - 'deco' can be a combinaison of:\n\n            Texttable.BORDER: Border around the table\n            Texttable.HEADER: Horizontal line below the header\n            Texttable.HLINES: Horizontal lines between rows\n            Texttable.VLINES: Vertical lines between columns\n\n           All of them are enabled by default\n\n        - example:\n\n            Texttable.BORDER | Texttable.HEADER\n        \"\"\"\n\n        self._deco = deco\n\n    def set_cols_align(self, array):\n        \"\"\"Set the desired columns alignment\n\n        - the elements of the array should be either \"l\", \"c\" or \"r\":\n\n            * \"l\": column flushed left\n            * \"c\": column centered\n            * \"r\": column flushed right\n        \"\"\"\n\n        self._check_row_size(array)\n        self._align = array\n\n    def set_cols_valign(self, array):\n        \"\"\"Set the desired columns vertical alignment\n\n        - the elements of the array should be either \"t\", \"m\" or \"b\":\n\n            * \"t\": column aligned on the top of the cell\n            * \"m\": column aligned on the middle of the cell\n            * \"b\": column aligned on the bottom of the cell\n        \"\"\"\n\n        self._check_row_size(array)\n        self._valign = array\n\n    def set_cols_dtype(self, array):\n        \"\"\"Set the desired columns datatype for the cols.\n\n        - the elements of the array should be either \"a\", \"t\", \"f\", \"e\" or \"i\":\n\n            * \"a\": automatic (try to use the most appropriate datatype)\n            * \"t\": treat as text\n            * \"f\": treat as float in decimal format\n            * \"e\": treat as float in exponential format\n            * \"i\": treat as int\n\n        - by default, automatic datatyping is used for each column\n        \"\"\"\n\n        self._check_row_size(array)\n        self._dtype = array\n\n    def set_cols_width(self, array):\n        \"\"\"Set the desired columns width\n\n        - the elements of the array should be integers, specifying the\n          width of each column. For example:\n\n                [10, 20, 5]\n        \"\"\"\n        self._check_row_size(array)\n        try:\n            array = map(int, array)\n            if reduce(min, array) <= 0:\n                raise ValueError\n        except ValueError:\n            sys.stderr.write(\"Wrong argument in column width specification\\n\")\n            raise\n        self._width = array\n\n    def set_precision(self, width):\n        \"\"\"Set the desired precision for float/exponential formats\n\n        - width must be an integer >= 0\n\n        - default value is set to 3\n        \"\"\"\n\n        if not type(width) is int or width < 0:\n            raise ValueError('width must be an integer greater then 0')\n        self._precision = width\n\n    def header(self, array):\n        \"\"\"Specify the header of the table\n        \"\"\"\n\n        self._check_row_size(array)\n        self._header = map(str, array)\n\n    def add_row(self, array):\n        \"\"\"Add a row in the rows stack\n\n        - cells can contain newlines and tabs\n        \"\"\"\n\n        self._check_row_size(array)\n\n        if not hasattr(self, \"_dtype\"):\n            self._dtype = [\"a\"] * self._row_size\n\n        cells = []\n        for i,x in enumerate(array):\n            cells.append(self._str(i,x))\n        self._rows.append(cells)\n\n    def add_rows(self, rows, header=True):\n        \"\"\"Add several rows in the rows stack\n\n        - The 'rows' argument can be either an iterator returning arrays,\n          or a by-dimensional array\n        - 'header' specifies if the first row should be used as the header\n          of the table\n        \"\"\"\n\n        # nb: don't use 'iter' on by-dimensional arrays, to get a\n        #     usable code for python 2.1\n        if header:\n            if hasattr(rows, '__iter__') and hasattr(rows, 'next'):\n                self.header(rows.next())\n            else:\n                self.header(rows[0])\n                rows = rows[1:]\n        for row in rows:\n            self.add_row(row)\n\n\n    def draw(self):\n        \"\"\"Draw the table\n\n        - the table is returned as a whole string\n        \"\"\"\n\n        if not self._header and not self._rows:\n            return\n        self._compute_cols_width()\n        self._check_align()\n        out = \"\"\n        if self._has_border():\n            out += self._hline()\n        if self._header:\n            out += self._draw_line(self._header, isheader=True)\n            if self._has_header():\n                out += self._hline_header()\n        length = 0\n        for row in self._rows:\n            length += 1\n            out += self._draw_line(row)\n            if self._has_hlines() and length < len(self._rows):\n                out += self._hline()\n        if self._has_border():\n            out += self._hline()\n        return out[:-1]\n\n    def _str(self, i, x):\n        \"\"\"Handles string formatting of cell data\n\n            i - index of the cell datatype in self._dtype\n            x - cell data to format\n        \"\"\"\n        try:\n            f = float(x)\n        except:\n            return str(x)\n\n        n = self._precision\n        dtype = self._dtype[i]\n\n        if dtype == 'i':\n            return str(int(round(f)))\n        elif dtype == 'f':\n            return '%.*f' % (n, f)\n        elif dtype == 'e':\n            return '%.*e' % (n, f)\n        elif dtype == 't':\n            return str(x)\n        else:\n            if f - round(f) == 0:\n                if abs(f) > 1e8:\n                    return '%.*e' % (n, f)\n                else:\n                    return str(int(round(f)))\n            else:\n                if abs(f) > 1e8:\n                    return '%.*e' % (n, f)\n                else:\n                    return '%.*f' % (n, f)\n\n    def _check_row_size(self, array):\n        \"\"\"Check that the specified array fits the previous rows size\n        \"\"\"\n        if not self._row_size:\n            self._row_size = len(array)\n        elif self._row_size != len(array):\n            raise ArraySizeError, \"array should contain %d elements\" \\\n                % self._row_size\n\n    def _has_vlines(self):\n        \"\"\"Return a boolean, if vlines are required or not\n        \"\"\"\n\n        return self._deco & Texttable.VLINES > 0\n\n    def _has_hlines(self):\n        \"\"\"Return a boolean, if hlines are required or not\n        \"\"\"\n\n        return self._deco & Texttable.HLINES > 0\n\n    def _has_border(self):\n        \"\"\"Return a boolean, if border is required or not\n        \"\"\"\n\n        return self._deco & Texttable.BORDER > 0\n\n    def _has_header(self):\n        \"\"\"Return a boolean, if header line is required or not\n        \"\"\"\n\n        return self._deco & Texttable.HEADER > 0\n\n    def _hline_header(self):\n        \"\"\"Print header's horizontal line\n        \"\"\"\n\n        return self._build_hline(True)\n\n    def _hline(self):\n        \"\"\"Print an horizontal line\n        \"\"\"\n\n        if not self._hline_string:\n            self._hline_string = self._build_hline()\n        return self._hline_string\n\n    def _build_hline(self, is_header=False):\n        \"\"\"Return a string used to separated rows or separate header from\n        rows\n        \"\"\"\n        horiz = self._char_horiz\n        if (is_header):\n            horiz = self._char_header\n        # compute cell separator\n        s = \"%s%s%s\" % (horiz, [horiz, self._char_corner][self._has_vlines()],\n            horiz)\n        # build the line\n        l = string.join([horiz * n for n in self._width], s)\n        # add border if needed\n        if self._has_border():\n            l = \"%s%s%s%s%s\\n\" % (self._char_corner, horiz, l, horiz,\n                self._char_corner)\n        else:\n            l += \"\\n\"\n        return l\n\n    def _len_cell(self, cell):\n        \"\"\"Return the width of the cell\n\n        Special characters are taken into account to return the width of the\n        cell, such like newlines and tabs\n        \"\"\"\n\n        for attr in bcolors_public_props():\n            cell = cell.replace(getattr(bcolors, attr), '').replace(bcolors.ENDC,'')\n\n        cell_lines = cell.split('\\n')\n        maxi = 0\n        for line in cell_lines:\n            length = 0\n            parts = line.split('\\t')\n            for part, i in zip(parts, range(1, len(parts) + 1)):\n                for attr in bcolors_public_props():\n                    part = part.replace(getattr(bcolors, attr), '')\n                length = length + len(part)\n                if i < len(parts):\n                    length = (length/8 + 1) * 8\n            maxi = max(maxi, length)\n        return maxi\n\n    def _compute_cols_width(self):\n        \"\"\"Return an array with the width of each column\n\n        If a specific width has been specified, exit. If the total of the\n        columns width exceed the table desired width, another width will be\n        computed to fit, and cells will be wrapped.\n        \"\"\"\n\n        if hasattr(self, \"_width\"):\n            return\n        maxi = []\n        if self._header:\n            maxi = [ self._len_cell(x) for x in self._header ]\n        for row in self._rows:\n            for cell,i in zip(row, range(len(row))):\n                try:\n                    maxi[i] = max(maxi[i], self._len_cell(cell))\n                except (TypeError, IndexError):\n                    maxi.append(self._len_cell(cell))\n        items = len(maxi)\n        length = reduce(lambda x,y: x+y, maxi)\n        if self._max_width and length + items * 3 + 1 > self._max_width:\n            maxi = [(self._max_width - items * 3 -1) / items \\\n                for n in range(items)]\n        self._width = maxi\n\n    def _check_align(self):\n        \"\"\"Check if alignment has been specified, set default one if not\n        \"\"\"\n\n        if not hasattr(self, \"_align\"):\n            self._align = [\"l\"] * self._row_size\n        if not hasattr(self, \"_valign\"):\n            self._valign = [\"t\"] * self._row_size\n\n    def _draw_line(self, line, isheader=False):\n        \"\"\"Draw a line\n\n        Loop over a single cell length, over all the cells\n        \"\"\"\n\n        line = self._splitit(line, isheader)\n        space = \" \"\n        out  = \"\"\n        for i in range(len(line[0])):\n            if self._has_border():\n                out += \"%s \" % self._char_vert\n            length = 0\n            for cell, width, align in zip(line, self._width, self._align):\n                length += 1\n                cell_line = cell[i]\n                lost_color = bcolors.WHITE\n                original_cell = cell_line\n                for attr in bcolors_public_props():\n                    cell_line = cell_line.replace(\n                        getattr(bcolors, attr), '').replace(bcolors.ENDC,''\n                    )\n                    if cell_line.replace(bcolors.ENDC,'') != original_cell.replace(\n                            bcolors.ENDC,'') and attr != 'ENDC':\n                        if not lost_color:\n                            lost_color = attr\n                fill = width - len(cell_line)\n                try:\n                    cell_line = get_color_string(\n                        getattr(bcolors, lost_color),cell_line\n                    )\n                except AttributeError:\n                    pass\n                if isheader:\n                    align = \"c\"\n                if align == \"r\":\n                    out += \"%s \" % (fill * space + cell_line)\n                elif align == \"c\":\n                    out += \"%s \" % (fill/2 * space + cell_line \\\n                            + (fill/2 + fill%2) * space)\n                else:\n                    out += \"%s \" % (cell_line + fill * space)\n                if length < len(line):\n                    out += \"%s \" % [space, self._char_vert][self._has_vlines()]\n            out += \"%s\\n\" % ['', self._char_vert][self._has_border()]\n        return out\n\n    def _splitit(self, line, isheader):\n        \"\"\"Split each element of line to fit the column width\n\n        Each element is turned into a list, result of the wrapping of the\n        string to the desired width\n        \"\"\"\n\n        line_wrapped = []\n        for cell, width in zip(line, self._width):\n            array = []\n            original_cell = cell\n            lost_color = bcolors.WHITE\n            for attr in bcolors_public_props():\n                cell = cell.replace(\n                    getattr(bcolors, attr), '').replace(bcolors.ENDC,'')\n                if cell.replace(bcolors.ENDC,'') != original_cell.replace(\n                        bcolors.ENDC,'') and attr != 'ENDC':\n                    if not lost_color:\n                        lost_color = attr\n            for c in cell.split('\\n'):\n                try:\n                    c = unicode(c, 'utf')\n                except UnicodeDecodeError, strerror:\n                    sys.stderr.write(\"UnicodeDecodeError exception for string '%s': %s\\n\" % (c, strerror))\n                    c = unicode(c, 'utf', 'replace')\n                try:\n                    array.extend(\n                        [get_color_string(\n                            getattr(bcolors, lost_color),x\n                            ) for x in  textwrap.wrap(c, width)\n                        ]\n                    )\n                except AttributeError:\n                    array.extend(textwrap.wrap(c, width))\n            line_wrapped.append(array)\n        max_cell_lines = reduce(max, map(len, line_wrapped))\n        for cell, valign in zip(line_wrapped, self._valign):\n            if isheader:\n                valign = \"t\"\n            if valign == \"m\":\n                missing = max_cell_lines - len(cell)\n                cell[:0] = [\"\"] * (missing / 2)\n                cell.extend([\"\"] * (missing / 2 + missing % 2))\n            elif valign == \"b\":\n                cell[:0] = [\"\"] * (max_cell_lines - len(cell))\n            else:\n                cell.extend([\"\"] * (max_cell_lines - len(cell)))\n        return line_wrapped\n\nif __name__ == '__main__':\n    table = Texttable()\n    table.set_cols_align([\"l\", \"r\", \"c\"])\n    table.set_cols_valign([\"t\", \"m\", \"b\"])\n    table.add_rows([ [get_color_string(bcolors.GREEN, \"Name Of Person\"), \"Age\", \"Nickname\"],\n                     [\"Mr\\nXavier\\nHuon\", 32, \"Xav'\"],\n                     [get_color_string(bcolors.BLUE,\"Mr\\nBaptiste\\nClement\"), 1, get_color_string(bcolors.RED,\"Baby\")] ])\n    print table.draw() + \"\\n\"\n\n    table = Texttable()\n    table.set_deco(Texttable.HEADER)\n    table.set_cols_dtype(['t',  # text\n                          'f',  # float (decimal)\n                          'e',  # float (exponent)\n                          'i',  # integer\n                          'a']) # automatic\n    table.set_cols_align([\"l\", \"r\", \"r\", \"r\", \"l\"])\n    table.add_rows([['text',    \"float\", \"exp\", \"int\", \"auto\"],\n                    [\"abcd\",    \"67\",    654,   89,    128.001],\n                    [\"efghijk\", 67.5434, .654,  89.6,  12800000000000000000000.00023],\n                    [\"lmn\",     5e-78,   5e-78, 89.4,  .000000000000128],\n                    [\"opqrstu\", .023,    5e+78, 92.,   12800000000000000000000]])\n    print table.draw()\n"
  },
  {
    "path": "thirdparty_libs/tldextract/.tld_set_snapshot",
    "content": "c__builtin__\nfrozenset\np1\n((lp2\nVnaustdal.no\np3\naVmed.ht\np4\naVpodlasie.pl\np5\naVcarraramassa.it\np6\naVworkshop.museum\np7\naVchirurgiens-dentistes.fr\np8\naVthruhere.net\np9\naVpila.pl\np10\naVlikes-pie.com\np11\naVidv.tw\np12\naV\\u516c\\u53f8.hk\np13\naVcontemporary.museum\np14\naVnsw.au\np15\naVelburg.museum\np16\naVis-a-lawyer.com\np17\naVisa.us\np18\naVname.eg\np19\naVsveio.no\np20\naVin-addr.arpa\np21\naVis-a-conservative.com\np22\naVrisor.no\np23\naV*.uy\np24\naVnet.pe\np25\naVbotanicalgarden.museum\np26\naVtvedestrand.no\np27\naVart.ht\np28\naVgov.vc\np29\naVunion.aero\np30\naVbomlo.no\np31\naVski.museum\np32\naVcultural.museum\np33\naV*.tokushima.jp\np34\naVgrane.no\np35\naVis-not-certified.com\np36\naVrahkkeravju.no\np37\naVcasadelamoneda.museum\np38\naVbarrell-of-knowledge.info\np39\naV\\u500b\\u4eba.hk\np40\naVuk.net\np41\naVhomeip.net\np42\naVsch.ae\np43\naVkh.ua\np44\naVwallonie.museum\np45\naVh?.no\np46\naVresearch.museum\np47\naVv?r?y.no\np48\naVorg.gh\np49\naVolecko.pl\np50\naVamericanantiques.museum\np51\naVenvironmentalconservation.museum\np52\naVimb.br\np53\naVlib.mt.us\np54\naVcom.cu\np55\naVhamburg.museum\np56\naVonline.museum\np57\naVfineart.museum\np58\naV!bl.uk\np59\naV\\ud55c\\uad6d\np60\naVgob.cl\np61\naVaosta.it\np62\naVbu.no\np63\naVkarasjohka.no\np64\naVpro.az\np65\naVmil.st\np66\naVmil.sy\np67\naV\\u0c2d\\u0c3e\\u0c30\\u0c24\\u0c4d\np68\naVi.se\np69\naVdnsalias.org\np70\naVfreiburg.museum\np71\naV*.sapporo.jp\np72\naVk-uralsk.ru\np73\naV*.ve\np74\naVesp.br\np75\naVgjovik.no\np76\naVmagadan.ru\np77\naVkm.ua\np78\naVdiscovery.museum\np79\naVdgca.aero\np80\naVcommunity.museum\np81\naVnesoddtangen.no\np82\naVteaches-yoga.com\np83\naVhemnes.no\np84\naVholtalen.no\np85\naVchita.ru\np86\naVwolomin.pl\np87\naVis-a-doctor.com\np88\naVlib.ks.us\np89\naVasia\np90\naVparma.it\np91\naVhistorical.museum\np92\naV!pref.hyogo.jp\np93\naVphilately.museum\np94\naVs?gne.no\np95\naVyouth.museum\np96\naVnet\np97\naVfarmstead.museum\np98\naVnaturalsciences.museum\np99\naVusarts.museum\np100\naVorg.ng\np101\naVnet.ru\np102\naVcatering.aero\np103\naVnet.rw\np104\naVaustevoll.no\np105\naVis-very-sweet.org\np106\naVlib.de.us\np107\naVand.museum\np108\naVgs.hl.no\np109\naVcarrier.museum\np110\naVst.no\np111\naVs?rfold.no\np112\naVnaumburg.museum\np113\naVassociation.aero\np114\naVyk.ca\np115\naViglesias-carbonia.it\np116\naVschool.na\np117\naVmil.az\np118\naVnyc.museum\np119\naVmalvik.no\np120\naVsula.no\np121\naVnom.fr\np122\naVbryansk.ru\np123\naVr.se\np124\naVsch.sa\np125\naVmil.al\np126\naVkr.ua\np127\naVmil.ac\np128\naVmil.ae\np129\naVtt\np130\naVgroks-this.info\np131\naValaska.museum\np132\naVnet.nf\np133\naValto-adige.it\np134\naVunjarga.no\np135\naVpassenger-association.aero\np136\naVfot.br\np137\naVpa.gov.pl\np138\naV!nawrastelecom.om\np139\naVbolzano.it\np140\naVre.it\np141\naVnet.nr\np142\naValvdal.no\np143\naV\\u7d44\\u7e54.tw\np144\naVing.pa\np145\naVorg.sy\np146\naV!pref.hiroshima.jp\np147\naVmedia.aero\np148\naVlib.ky.us\np149\naVbasel.museum\np150\naViq\np151\naVorg.pa\np152\naVtm\np153\naVgroundhandling.aero\np154\naVbristol.museum\np155\naVz.se\np156\naVm.se\np157\naVss.it\np158\naVroma.museum\np159\naVfrom-mn.com\np160\naVtk\np161\naVembroidery.museum\np162\naVgs.hm.no\np163\naVks.us\np164\naVcc.me.us\np165\naVmassacarrara.it\np166\naVnet.lb\np167\naVmonzabrianza.it\np168\naV*.kumamoto.jp\np169\naVint.is\np170\naVseoul.kr\np171\naVmotorcycle.museum\np172\naVstjordal.no\np173\naVme\np174\naVmd\np175\naVpsc.br\np176\naVma\np177\naVhonefoss.no\np178\naVmc\np179\naVorg.sn\np180\naVarkhangelsk.ru\np181\naVml\np182\naVmo\np183\naVmn\np184\naVmh\np185\naVmk\np186\naVtc\np187\naVmu\np188\naVmw\np189\naVmv\np190\naVmq\np191\naVmp\np192\naVms\np193\naVmr\np194\naVin.th\np195\naVphiladelphia.museum\np196\naVmy\np197\naVmx\np198\naVcc.ky.us\np199\naVvoagat.no\np200\naVmytis.ru\np201\naVnet.ly\np202\naVfrom-in.com\np203\naVfrom-wi.com\np204\naVodo.br\np205\naVcom.sb\np206\naVdynalias.com\np207\naVtynset.no\np208\naVbi.it\np209\naVdellogliastra.it\np210\naVmuenchen.museum\np211\naVmonza.it\np212\naVlillehammer.no\np213\naVorg.co\np214\naVorg.cn\np215\naVresistance.museum\np216\naVelvendrell.museum\np217\naVed.pw\np218\naVorg.ci\np219\naVdell-ogliastra.it\np220\naVbj.cn\np221\naVbrasil.museum\np222\naVvv.it\np223\naVkommunalforbund.se\np224\naVid\np225\naVdoomdns.com\np226\naV!mediaphone.om\np227\naVorg.cu\np228\naVlib.wy.us\np229\naVuri.arpa\np230\naVjan-mayen.no\np231\naVhyllestad.no\np232\naVtran?y.no\np233\naVstpetersburg.museum\np234\naVhomeunix.com\np235\naVmelhus.no\np236\naVbr\np237\naVnativeamerican.museum\np238\naVrussia.museum\np239\naVhomeunix.org\np240\naVhorten.no\np241\naVkr.it\np242\naV!city.niigata.jp\np243\naVk12.sd.us\np244\naVhareid.no\np245\naVaoste.it\np246\naVgo.ug\np247\naVriodejaneiro.museum\np248\naVgliding.aero\np249\naVcv.ua\np250\naVo.se\np251\naVagdenes.no\np252\naVcan.br\np253\naVbiz.ki\np254\naVgs.ah.no\np255\naVk12.nc.us\np256\naVport.fr\np257\naVco.bw\np258\naVsydney.museum\np259\naVrv.ua\np260\naVsogndal.no\np261\naVkhakassia.ru\np262\naVrubtsovsk.ru\np263\naVdrobak.no\np264\naVunj?rga.no\np265\naVbaikal.ru\np266\naVisla.pr\np267\naVczest.pl\np268\naVforsand.no\np269\naVgop.pk\np270\naVnaval.museum\np271\naVasso.re\np272\naVgx.cn\np273\naV!city.fukuoka.jp\np274\naVdallas.museum\np275\naVkongsvinger.no\np276\naVbelau.pw\np277\naVcan.museum\np278\naVgjesdal.no\np279\naVporsangu.no\np280\naV*.ar\np281\naV*.mie.jp\np282\naVne.us\np283\naVpodzone.net\np284\naVadm.br\np285\naVcrotone.it\np286\naVsteam.museum\np287\naVtroandin.no\np288\naVexeter.museum\np289\naVnesseby.no\np290\naVmeldal.no\np291\naVcoastaldefence.museum\np292\naVtolga.no\np293\naVaskoy.no\np294\naVamursk.ru\np295\naVdnsdojo.net\np296\naVb?l?t.no\np297\naVpresse.ci\np298\naVbrand.se\np299\naVbuyshouses.net\np300\naVinteractive.museum\np301\naVfe.it\np302\naVmari-el.ru\np303\naVvinnica.ua\np304\naVbolt.hu\np305\naVor.id\np306\naVmedical.museum\np307\naVgov.lr\np308\naVkostroma.ru\np309\naVeidskog.no\np310\naVza.com\np311\naVpubl.pt\np312\naVname.vn\np313\naVharstad.no\np314\naVfrom-la.net\np315\naVedu.lk\np316\naVvladimir.ru\np317\naVngo.ph\np318\naVb?hccavuotna.no\np319\naVedu.la\np320\naVedu.lb\np321\naVedu.lc\np322\naV\\u0e44\\u0e17\\u0e22\np323\naVedu.ly\np324\naVtrani-barletta-andria.it\np325\naVbjerkreim.no\np326\naVkarmoy.no\np327\naVedu.lr\np328\naVwritesthisblog.com\np329\naVedu.lv\np330\naVu.se\np331\naVgs.vf.no\np332\naVaero.tt\np333\naVmil.ba\np334\naVnv.us\np335\naVmil.bo\np336\naVmd.ci\np337\naVcomo.it\np338\naVmil.vc\np339\naVmil.br\np340\naVbuilding.museum\np341\naVgov.ws\np342\naVggf.br\np343\naVmil.by\np344\naVoperaunite.com\np345\naVtw.cn\np346\naVmalbork.pl\np347\naVrw\np348\naV\\u9999\\u6e2f\np349\naVrs\np350\naVaurland.no\np351\naVtheater.museum\np352\naVdoesntexist.org\np353\naVascolipiceno.it\np354\naVgov.la\np355\naV\\u010d?hcesuolo.no\np356\naVgs.aa.no\np357\naVsc.kr\np358\naVberlin.museum\np359\naVde.com\np360\naVgov\np361\naVchernovtsy.ua\np362\naVportlligat.museum\np363\naVfurniture.museum\np364\naV*.nara.jp\np365\naVro.it\np366\naV\\u7db2\\u7edc.hk\np367\naVtm.no\np368\naVsalangen.no\np369\naVgs.jan-mayen.no\np370\naVs.se\np371\naVis-a-llama.com\np372\naVgildeskal.no\np373\naVkatowice.pl\np374\naVgov.az\np375\naVarts.nf\np376\naVcalifornia.museum\np377\naVedunet.tn\np378\naVgov.as\np379\naVname.na\np380\naVoppegard.no\np381\naVsa.edu.au\np382\naVct.it\np383\naVillustration.museum\np384\naVgov.af\np385\naVgov.ae\np386\naVminers.museum\np387\naVgov.ac\np388\naVsopot.pl\np389\naVizhevsk.ru\np390\naVac.mu\np391\naVac.mw\np392\naVpalermo.it\np393\naVveg?rshei.no\np394\naVac.be\np395\naVac.me\np396\naVhjelmeland.no\np397\naVnissedal.no\np398\naVhof.no\np399\naVtel\np400\naVtx.us\np401\naVlikescandy.com\np402\naVsciencehistory.museum\np403\naVcc.dc.us\np404\naVac.pa\np405\naVgr.jp\np406\naVstat.no\np407\naVparoch.k12.ma.us\np408\naVsassari.it\np409\naVoppdal.no\np410\naVis-a-chef.net\np411\naV\\u7f51\\u7edc.cn\np412\naVis-an-actor.com\np413\naVr?ros.no\np414\naVlib.hi.us\np415\naVcheltenham.museum\np416\naVtaxi.aero\np417\naVsld.pa\np418\naVus.com\np419\naVpv.it\np420\naVbieszczady.pl\np421\naVreggioemilia.it\np422\naVsande.more-og-romsdal.no\np423\naVulan-ude.ru\np424\naVroyrvik.no\np425\naVart.museum\np426\naVreklam.hu\np427\naVlib.pa.us\np428\naVcc.ks.us\np429\naVkommune.no\np430\naVtd\np431\naVsvalbard.no\np432\naVinfo.ki\np433\naVsavannahga.museum\np434\naVtysvar.no\np435\naVweb.tj\np436\naVfrom-ut.com\np437\naVbg.it\np438\naVoceanographique.museum\np439\naVtest.ru\np440\naV!parliament.uk\np441\naVis-a-landscaper.com\np442\naVfreemasonry.museum\np443\naVdenmark.museum\np444\naVlakas.hu\np445\naV\\u0633\\u0648\\u0631\\u064a\\u0629\np446\naVeidsberg.no\np447\naVms.it\np448\naVmarburg.museum\np449\naVpasadena.museum\np450\naVbroadcast.museum\np451\naVcatanzaro.it\np452\naVpavia.it\np453\naVmail.pl\np454\naV!pref.ehime.jp\np455\naVloabat.no\np456\naVuniversity.museum\np457\naV\\u0642\\u0637\\u0631\np458\naVvdonsk.ru\np459\naVco.ci\np460\naVgouv.fr\np461\naVco.cr\np462\naVca.us\np463\naVi.bg\np464\naVis-a-teacher.com\np465\naVis-very-good.org\np466\naVmurmansk.ru\np467\naVod.ua\np468\naVorkdal.no\np469\naV\\u0627\\u0645\\u0627\\u0631\\u0627\\u062a\np470\naV*.nagoya.jp\np471\naVtorsken.no\np472\naVnet.ma\np473\naVavocat.fr\np474\naVk12.pr.us\np475\naVnet.me\np476\naVrs.ba\np477\naVnuoro.it\np478\naVk12.mi.us\np479\naVmarine.ru\np480\naVnet.mk\np481\naVnet.ml\np482\naVl?hppi.no\np483\naVnet.mo\np484\naVnebraska.museum\np485\naVptz.ru\np486\naVnet.lr\np487\naVsd.cn\np488\naVnet.mu\np489\naVnet.mv\np490\naVnet.mw\np491\naVnet.mx\np492\naVnet.my\np493\naVbrindisi.it\np494\naVwroc.pl\np495\naVmediocampidano.it\np496\naVorg.ro\np497\naVaircraft.aero\np498\naVcargo.aero\np499\naVfrom-sc.com\np500\naV7.bg\np501\naVgraz.museum\np502\naVfi.cr\np503\naVass.km\np504\naVlib.ar.us\np505\naVpro.na\np506\naVfrancaise.museum\np507\naVcn.it\np508\naVteramo.it\np509\naVum.gov.pl\np510\naVullensaker.no\np511\naVkvits?y.no\np512\naVluster.no\np513\naVfilm.museum\np514\naV*.er\np515\naV*.et\np516\naVr?yrvik.no\np517\naVzaporizhzhe.ua\np518\naVlomza.pl\np519\naVus.na\np520\naVkoenig.ru\np521\naVmeeres.museum\np522\naVeng.pro\np523\naVlatina.it\np524\naVkrasnoyarsk.ru\np525\naVb?.telemark.no\np526\naVplanetarium.museum\np527\naVedu.mw\np528\naVedu.mv\np529\naVflakstad.no\np530\naVconsulado.st\np531\naV*.kagoshima.jp\np532\naVha.no\np533\naVug\np534\naVportland.museum\np535\naVmalselv.no\np536\naVedu.my\np537\naVedu.mx\np538\naVedu.mg\np539\naV6.bg\np540\naVedu.me\np541\naVcom.ph\np542\naVhammerfest.no\np543\naVedu.mo\np544\naVedu.mn\np545\naVedu.ml\np546\naVedu.mk\np547\naVdo\np548\naVdm\np549\naVdj\np550\naVdk\np551\naVplc.co.im\np552\naViamallama.com\np553\naVkarelia.ru\np554\naVde\np555\naVrec.br\np556\naVdz\np557\naVaccident-prevention.aero\np558\naVmuseum.no\np559\naVspy.museum\np560\naVdelmenhorst.museum\np561\naVgr.com\np562\naVcom.na\np563\naVcom.ng\np564\naVorg.do\np565\naVorg.dm\np566\naVslupsk.pl\np567\naVlib.pr.us\np568\naVendoftheinternet.org\np569\naVvologda.ru\np570\naVorg.dz\np571\naVcom.nr\np572\naV?lesund.no\np573\naVklepp.no\np574\naV3.bg\np575\naVcoop.ht\np576\naVslattum.no\np577\naVbarrel-of-knowledge.info\np578\naV!city.kawasaki.jp\np579\naVbar.pro\np580\naVgov.pr\np581\naVbearalvahki.no\np582\naVkazan.ru\np583\naV!pref.fukui.jp\np584\naVsld.do\np585\naVgetmyip.com\np586\naVmidsund.no\np587\naVfrom-ca.com\np588\naVtest.tj\np589\naVis-a-financialadvisor.com\np590\naVvn.ua\np591\naVcouncil.aero\np592\naVarchaeological.museum\np593\naVwestfalen.museum\np594\naVsalem.museum\np595\naVselfip.biz\np596\naVgs.fm.no\np597\naVgroup.aero\np598\naVgov.ps\np599\naVv?gs?y.no\np600\naVfrom-pa.com\np601\naVnewmexico.museum\np602\naVfrom-tx.com\np603\naVsn?ase.no\np604\naVbiz.mv\np605\naVbiz.mw\np606\naVheimatunduhren.museum\np607\naVstore.nf\np608\naVnamsskogan.no\np609\naVbritish.museum\np610\naV2.bg\np611\naVk12.wv.us\np612\naVharvestcelebration.museum\np613\naVtozsde.hu\np614\naVr?holt.no\np615\naVcc.md.us\np616\naVpro.vn\np617\naVviking.museum\np618\naVnysa.pl\np619\naVrybnik.pl\np620\naVqld.gov.au\np621\naVws\np622\naVnewyork.museum\np623\naVh.se\np624\naVtas.gov.au\np625\naV\\u6559\\u80b2.hk\np626\naVnom.pa\np627\naVms.us\np628\naVnrw.museum\np629\naVmi.th\np630\naVne.tz\np631\naVrimini.it\np632\naVlu.it\np633\naVsoc.lk\np634\naV!promocion.ar\np635\naVforli-cesena.it\np636\naVairguard.museum\np637\naVfet.no\np638\naVplc.ly\np639\naVcc.az.us\np640\naVfrogn.no\np641\naVcom\np642\naVutah.museum\np643\naVlib.wa.us\np644\naVnic.tj\np645\naVtatarstan.ru\np646\naVbirkenes.no\np647\naVhobol.no\np648\naVis-found.org\np649\naVdrangedal.no\np650\naVest-mon-blogueur.com\np651\naVaviation.museum\np652\naVgov.mu\np653\naVfirm.ht\np654\naVk12.ms.us\np655\naVvarese.it\np656\naVcounty.museum\np657\naV!pref.okinawa.jp\np658\naVis-a-caterer.com\np659\naVmil.no\np660\naVk12.ia.us\np661\naVg12.br\np662\naVtver.ru\np663\naVheroy.more-og-romsdal.no\np664\naVshop.pl\np665\naVinfo.hu\np666\naVinfo.ht\np667\naV\\u53f0\\u6e7e\np668\naVpro\np669\naVfg.it\np670\naVgov.tt\np671\naVszczytno.pl\np672\naVac.tj\np673\naVdnsdojo.com\np674\naVfm.br\np675\naVbirthplace.museum\np676\naVnet.ps\np677\naVnet.pr\np678\naVforum.hu\np679\naVb?hcavuotna.no\np680\naVmil.co\np681\naVmil.cn\np682\naVpesarourbino.it\np683\naVnet.pk\np684\naVfrom-nh.com\np685\naVnet.ph\np686\naVhomelinux.com\np687\naVnet.pn\np688\naVnet.pl\np689\naVgov.tl\np690\naVnet.pa\np691\naVgov.to\np692\naVkuzbass.ru\np693\naVsor-fron.no\np694\naVoygarden.no\np695\naVpisz.pl\np696\naVlodi.it\np697\naVpilot.aero\np698\naV?stre-toten.no\np699\naVgyeongbuk.kr\np700\naVscienceandindustry.museum\np701\naVrome.it\np702\naVbible.museum\np703\naVwalbrzych.pl\np704\naVudmurtia.ru\np705\naVosteroy.no\np706\naVvf.no\np707\naValabama.museum\np708\naVtrapani.it\np709\naVscrapper-site.net\np710\naVedu.pn\np711\naVaz.us\np712\naViz.hr\np713\naVandria-barletta-trani.it\np714\naVcc.ca.us\np715\naV\\u0440\\u0444\np716\naVvlog.br\np717\naVaskim.no\np718\naVhotel.lk\np719\naVnet.lk\np720\naVorg.sz\np721\naVoksnes.no\np722\naVvaga.no\np723\naVsi.it\np724\naVis\np725\naVir\np726\naVnet.lc\np727\naVit\np728\naVnet.la\np729\naVgaular.no\np730\naVpriv.no\np731\naVorg.la\np732\naVim\np733\naVvanylven.no\np734\naVio\np735\naVin\np736\naVbatsfjord.no\np737\naVnet.lv\np738\naVorg.se\np739\naVorg.sd\np740\naVie\np741\naVre.kr\np742\naVorg.sa\np743\naVurbinopesaro.it\np744\naV\\u062a\\u0648\\u0646\\u0633\np745\naVpro.mv\np746\naVl?dingen.no\np747\naVcc.wa.us\np748\naVgalsa.no\np749\naVk12.ct.us\np750\naVzachpomor.pl\np751\naVculture.museum\np752\naVvestnes.no\np753\naVn??mesjevuemie.no\np754\naVebiz.tw\np755\naVvaler.hedmark.no\np756\naVchukotka.ru\np757\naVk12.gu.us\np758\naVa?roport.ci\np759\naVnaturbruksgymn.se\np760\naVworse-than.tv\np761\naVsiellak.no\np762\naVchocolate.museum\np763\naVvagsoy.no\np764\naVcuneo.it\np765\naVlib.ms.us\np766\naVdr?bak.no\np767\naVsh.cn\np768\naVfr.it\np769\naVpodhale.pl\np770\naVham-radio-op.net\np771\naVmil\np772\naVingatlan.hu\np773\naVmx.na\np774\naVjorpeland.no\np775\naVzagan.pl\np776\naVfedje.no\np777\naVgmina.pl\np778\naVtrader.aero\np779\naVcranbrook.museum\np780\naVfrom-ma.com\np781\naVcpa.pro\np782\naVgen.in\np783\naV?ystre-slidre.no\np784\naVorg.lv\np785\naVulvik.no\np786\naVrec.co\np787\naVjeonnam.kr\np788\naVstjordalshalsen.no\np789\naVis-an-anarchist.com\np790\naVgs.sf.no\np791\naVsebastopol.ua\np792\naVtm.se\np793\naVmincom.tn\np794\naVnet.ng\np795\naVwildlife.museum\np796\naVomasvuotna.no\np797\naVprato.it\np798\naVgov.by\np799\naVnsw.edu.au\np800\naVmessina.it\np801\naVcom.an\np802\naVint.pt\np803\naVcom.al\np804\naVsiedlce.pl\np805\naVcoop.km\np806\naVny.us\np807\naVk12.dc.us\np808\naVcom.ai\np809\naVcom.af\np810\naVcom.ag\np811\naVorg.ec\np812\naVbearalv?hki.no\np813\naVorg.ee\np814\naVcom.ac\np815\naVorg.eg\np816\naVstate.museum\np817\naVits.me\np818\naVpe.ca\np819\naV?fjord.no\np820\naVcom.aw\np821\naVorg.es\np822\naV!omantel.om\np823\naVbalat.no\np824\naVlib.nm.us\np825\naVsumy.ua\np826\naVdovre.no\np827\naV!pref.nara.jp\np828\naVdivttasvuotna.no\np829\naVis-a-republican.com\np830\naV*.shizuoka.jp\np831\naVrep.kp\np832\naVk12.tx.us\np833\naV!pref.miyazaki.jp\np834\naVppg.br\np835\naVhvaler.no\np836\naVleksvik.no\np837\naVao.it\np838\naVskierva.no\np839\naVlillesand.no\np840\naVmodalen.no\np841\naVk12.in.us\np842\naVdyndns-pics.com\np843\naVsciencesnaturelles.museum\np844\naV!pref.kanagawa.jp\np845\naVagriculture.museum\np846\naVrailroad.museum\np847\naVor.us\np848\naVco.lc\np849\naVconference.aero\np850\naVbo.nordland.no\np851\naVrealestate.pl\np852\naVmedio-campidano.it\np853\naVco.ls\np854\naVorg.bs\np855\naVsa.it\np856\naVah.cn\np857\naV\\u7db2\\u8def.tw\np858\naVk12.ca.us\np859\naVsquare.museum\np860\naV\\u81fa\\u7063\np861\naVdyndns.org\np862\naVpublic.museum\np863\naVcieszyn.pl\np864\naVci.it\np865\naVtroms?.no\np866\naVcyber.museum\np867\naVdonostia.museum\np868\naV*.fj\np869\naV*.fk\np870\naVandriatranibarletta.it\np871\naVdyn-o-saur.com\np872\naV\\u0aad\\u0abe\\u0ab0\\u0aa4\np873\naVdr.na\np874\naVm?tta-v?rjjat.no\np875\naV*.okinawa.jp\np876\naVjobs.tt\np877\naVp.se\np878\naVevenassi.no\np879\naVrissa.no\np880\naVor.kr\np881\naVpowiat.pl\np882\naVlouvre.museum\np883\naVl.se\np884\naVrandaberg.no\np885\naVservices.aero\np886\naVarendal.no\np887\naVname.tt\np888\naVasso.bj\np889\naVfuoisku.no\np890\naVlaquila.it\np891\naVquebec.museum\np892\naVcc.or.us\np893\naVberlevag.no\np894\naVna.it\np895\naVis-certified.com\np896\naVcom.sy\np897\naVus.org\np898\naVjewish.museum\np899\naVdelaware.museum\np900\naVgo.it\np901\naVlecco.it\np902\naVcom.st\np903\naVhamar.no\np904\naVlyngdal.no\np905\naVpordenone.it\np906\naVastronomy.museum\np907\naVco.mw\np908\naVcom.sn\np909\naVcom.so\np910\naVru\np911\naVgo.id\np912\naVcom.sc\np913\naVcom.sd\np914\naVedu.jo\np915\naVhere-for-more.info\np916\naVcom.sg\np917\naVcc.mi.us\np918\naVamericanart.museum\np919\naVplaza.museum\np920\naVsorum.no\np921\naVs?lat.no\np922\naVaeroport.fr\np923\naVbrescia.it\np924\naVimageandsound.museum\np925\naVleitungsen.de\np926\naVyaroslavl.ru\np927\naVjelenia-gora.pl\np928\naVweb.co\np929\naV!city.kitakyushu.jp\np930\naVnm.us\np931\naVper.nf\np932\naVsouthwest.museum\np933\naVnovara.it\np934\naVperso.sn\np935\naVzoology.museum\np936\naVstj?rdal.no\np937\naVedu.vn\np938\naVvercelli.it\np939\naVantiques.museum\np940\naVsandnessj?en.no\np941\naVmilano.it\np942\naV!city.hiroshima.jp\np943\naVeastafrica.museum\np944\naVngo.pl\np945\naV!city.sendai.jp\np946\naVif.ua\np947\naVfarmers.museum\np948\naVmodum.no\np949\naVgda.pl\np950\naVco.id\np951\naVpskov.ru\np952\naVostrowiec.pl\np953\naVsettlement.museum\np954\naVmsk.ru\np955\naVtj?me.no\np956\naVru.com\np957\naVscotland.museum\np958\naVfrom-ia.com\np959\naV\\u0627\\u06cc\\u0631\\u0627\\u0646\np960\naVlib.sd.us\np961\naVegyptian.museum\np962\naVmk.ua\np963\naVpc.pl\np964\naVis-very-bad.org\np965\naVlib.in.us\np966\naVustka.pl\np967\naVscienceandhistory.museum\np968\naVschool.museum\np969\naVb?id?r.no\np970\naVaskvoll.no\np971\naVis-a-democrat.com\np972\naVsch.lk\np973\naVendofinternet.net\np974\naVrawa-maz.pl\np975\naVasmatart.museum\np976\naVgov.gr\np977\naVaustralia.museum\np978\naVqc.ca\np979\naVgov.gi\np980\naVgov.gh\np981\naVid.us\np982\naVnf.ca\np983\naVk12.ar.us\np984\naVgov.gn\np985\naVchel.ru\np986\naVwindmill.museum\np987\naVpr.us\np988\naVgov.ge\np989\naVil.us\np990\naVgov.gg\np991\naVtranby.no\np992\naVsurgut.ru\np993\naVrovigo.it\np994\naVac.cn\np995\naVdivtasvuodna.no\np996\naVfed.us\np997\naVfrom-wa.com\np998\naVtula.ru\np999\naVac.ci\np1000\naVzakopane.pl\np1001\naVmb.ca\np1002\naVmobi.na\np1003\naVq.bg\np1004\naVpp.az\np1005\naVpub.sa\np1006\naV\\u654e\\u80b2.hk\np1007\naVnl\np1008\naVresearch.aero\np1009\naVno\np1010\naVm.bg\np1011\naVna\np1012\naVfrom-ny.net\np1013\naVnc\np1014\naVne\np1015\naVnf\np1016\naVstuttgart.museum\np1017\naVhistoryofscience.museum\np1018\naVnr\np1019\naVnaturhistorisches.museum\np1020\naVnu\np1021\naVx.se\np1022\naVky.us\np1023\naVfirm.in\np1024\naVtn.us\np1025\naVhistoire.museum\np1026\naVmil.tj\np1027\naVmoareke.no\np1028\naVkvam.no\np1029\naVmb.it\np1030\naVnom.km\np1031\naV?rsta.no\np1032\naVsor-odal.no\np1033\naVroma.it\np1034\naVgov.ru\np1035\naVjudygarland.museum\np1036\naVstordal.no\np1037\naVtom.ru\np1038\naVlosangeles.museum\np1039\naVis-a-guru.com\np1040\naVlib.mn.us\np1041\naVgniezno.pl\np1042\naVpress.se\np1043\naVind.br\np1044\naVuniv.sn\np1045\naVkomvux.se\np1046\naVgs.nt.no\np1047\naVcesenaforli.it\np1048\naVne.kr\np1049\naVdecorativearts.museum\np1050\naVperm.ru\np1051\naVparagliding.aero\np1052\naVolbia-tempio.it\np1053\naVh?mm?rfeasta.no\np1054\naVnews.hu\np1055\naVfor-better.biz\np1056\naVkhmelnitskiy.ua\np1057\naVis-a-candidate.org\np1058\naVchtr.k12.ma.us\np1059\naVco.no\np1060\naVservebbs.net\np1061\naV!pref.akita.jp\np1062\naVgaivuotna.no\np1063\naVnt.au\np1064\naVoslo.no\np1065\naVlk\np1066\naVcom.tn\np1067\naV\\u09ad\\u09be\\u09b0\\u09a4\np1068\naVwebhop.net\np1069\naVco.me\np1070\naVco.ma\np1071\naVvalley.museum\np1072\naVnh.us\np1073\naVassassination.museum\np1074\naVcc.mn.us\np1075\naVmat.br\np1076\naVgouv.ht\np1077\naV*.gifu.jp\np1078\naVog.it\np1079\naVco.mu\np1080\naVetne.no\np1081\naVte.ua\np1082\naVuscountryestate.museum\np1083\naVrec.ro\np1084\naV!pref.shimane.jp\np1085\naVcoop\np1086\naVnet.kn\np1087\naVb?rum.no\np1088\naVkonin.pl\np1089\naVnet.kg\np1090\naVt.se\np1091\naVco.us\np1092\naVnet.kz\np1093\naV!nic.uk\np1094\naVnet.ky\np1095\naVorg.tn\np1096\naVorg.to\np1097\naV!siemens.om\np1098\naVexhibition.museum\np1099\naVlib.fl.us\np1100\naVhobby-site.com\np1101\naVgeology.museum\np1102\naVvestby.no\np1103\naVstarnberg.museum\np1104\naVwa.gov.au\np1105\naVhumanities.museum\np1106\naVmi.us\np1107\naVcomputer.museum\np1108\naVcc.ma.us\np1109\naVschoenbrunn.museum\np1110\naVlardal.no\np1111\naVfrom-va.com\np1112\naVindian.museum\np1113\naVostrowwlkp.pl\np1114\naVgorlice.pl\np1115\naVirc.pl\np1116\naVri.it\np1117\naVcom.re\np1118\naVoyer.no\np1119\naVgs.nl.no\np1120\naVpadua.it\np1121\naVcom.ro\np1122\naVsandnessjoen.no\np1123\naVasso.ci\np1124\naVor.jp\np1125\naVshow.aero\np1126\naVcom.rw\np1127\naVpresse.fr\np1128\naVcom.ru\np1129\naVof.no\np1130\naVhl.cn\np1131\naVmed.pro\np1132\naVis-an-accountant.com\np1133\naVsalvadordali.museum\np1134\naVdetroit.museum\np1135\naVhemne.no\np1136\naVedu.kp\np1137\naVy.bg\np1138\naVpresidio.museum\np1139\naVusgarden.museum\np1140\naVme.us\np1141\naVedu.ky\np1142\naVnord-aurdal.no\np1143\naVp.bg\np1144\naVascoli-piceno.it\np1145\naVtingvoll.no\np1146\naVpisa.it\np1147\naVarchitecture.museum\np1148\naVedu.kg\np1149\naVvindafjord.no\np1150\naVedu.ki\np1151\naVforgot.her.name\np1152\naVvard?.no\np1153\naVedu.km\np1154\naVcolumbia.museum\np1155\naVedu.kn\np1156\naVtv.br\np1157\naVsantabarbara.museum\np1158\naVdyndns-server.com\np1159\naVk12.vt.us\np1160\naVbh\np1161\naVnx.cn\np1162\naValesund.no\np1163\naVevenes.no\np1164\naVblogdns.com\np1165\naVca.it\np1166\naVsells-for-less.com\np1167\naVfr?ya.no\np1168\naVl?renskog.no\np1169\naVwiki.br\np1170\naVseaport.museum\np1171\naVre\np1172\naVtv.bo\np1173\naVbd.se\np1174\naVfhv.se\np1175\naVbt\np1176\naVsorfold.no\np1177\naVbiella.it\np1178\naVsantafe.museum\np1179\naVportal.museum\np1180\naVnj.us\np1181\naVlogistics.aero\np1182\naVyakutia.ru\np1183\naVskedsmokorset.no\np1184\naVts.it\np1185\naVkunstunddesign.museum\np1186\naVfoundation.museum\np1187\naVn?tter?y.no\np1188\naVl.bg\np1189\naVname.tj\np1190\naVmodena.it\np1191\naVvantaa.museum\np1192\naVmed.ly\np1193\naV2000.hu\np1194\naVgob.mx\np1195\naVsande.m?re-og-romsdal.no\np1196\naVgov.dm\np1197\naVgarden.museum\np1198\naVgov.do\np1199\naVenvironment.museum\np1200\naVtmp.br\np1201\naVis-into-games.com\np1202\naVart.sn\np1203\naVautomotive.museum\np1204\naVbaghdad.museum\np1205\naVkrakow.pl\np1206\naVgov.dz\np1207\naVrc.it\np1208\naVnaroy.no\np1209\naV*.yu\np1210\naVleirfjord.no\np1211\naVlewismiller.museum\np1212\naVname.az\np1213\naVu.bg\np1214\naVlg.jp\np1215\naVlib.mo.us\np1216\naVkazimierz-dolny.pl\np1217\naVlib.or.us\np1218\naVba.it\np1219\naV*.ye\np1220\naVartsandcrafts.museum\np1221\naVnl.ca\np1222\naVbabia-gora.pl\np1223\naVltd.lk\np1224\naVpo.gov.pl\np1225\naV\\u0627\\u0644\\u0633\\u0639\\u0648\\u062f\\u064a\\u0647\np1226\naV!pref.miyagi.jp\np1227\naVbs\np1228\naVgv.at\np1229\naVflekkefjord.no\np1230\naVbygland.no\np1231\naVnnov.ru\np1232\naVgv.ao\np1233\naVhistorisch.museum\np1234\naVmassa-carrara.it\np1235\naVcc.al.us\np1236\naVzarow.pl\np1237\naV!pref.okayama.jp\np1238\naVrepbody.aero\np1239\naVher?y.nordland.no\np1240\naVusenet.pl\np1241\naVcom.ly\np1242\naVcat\np1243\naVsnz.ru\np1244\naV*.gu\np1245\naV*.gt\np1246\naVspace.museum\np1247\naVidrett.no\np1248\naVsm?la.no\np1249\naVnu.ca\np1250\naV*.gunma.jp\np1251\naVis-a-libertarian.com\np1252\naVnt.gov.au\np1253\naVswidnica.pl\np1254\naVfroya.no\np1255\naVplants.museum\np1256\naVsorreisa.no\np1257\naVs?mna.no\np1258\naVnet.tt\np1259\naVmari.ru\np1260\naVnakhodka.ru\np1261\naVac.ru\np1262\naV\\u09ac\\u09be\\u0982\\u09b2\\u09be\np1263\naVac.rw\np1264\naVreggio-emilia.it\np1265\naVasn.lv\np1266\naVpoznan.pl\np1267\naVsa.gov.au\np1268\naVspb.ru\np1269\naVruovat.no\np1270\naVge.it\np1271\naVis-a-soxfan.org\np1272\naVamsterdam.museum\np1273\naVgov.ph\np1274\naVis-a-chef.org\np1275\naVcom.sl\np1276\naVen.it\np1277\naVne.jp\np1278\naVorsta.no\np1279\naVarteducation.museum\np1280\naVest-le-patron.com\np1281\naVhurum.no\np1282\naVbetter-than.tv\np1283\naVpilots.museum\np1284\naVmil.mg\np1285\naV\\u7f51\\u7d61.hk\np1286\naV*.miyagi.jp\np1287\naVbiz.at\np1288\naVatlanta.museum\np1289\naVmil.my\np1290\naVok.us\np1291\naVcom.sa\np1292\naVmil.mv\np1293\naVbiz.az\np1294\naVweb.do\np1295\naVgliwice.pl\np1296\naVolawa.pl\np1297\naVivgu.no\np1298\naVflanders.museum\np1299\naVjar.ru\np1300\naVvefsn.no\np1301\naVusdecorativearts.museum\np1302\naVpulawy.pl\np1303\naVrm.it\np1304\naVsu\np1305\naVjur.pro\np1306\naVsk\np1307\naVol.no\np1308\naVbronnoysund.no\np1309\naVx.bg\np1310\naVso\np1311\naVsn\np1312\naVsm\np1313\naVgd.cn\np1314\naVsc\np1315\naVsb\np1316\naVsa\np1317\naVuk.com\np1318\naV!city.kyoto.jp\np1319\naVkarate.museum\np1320\naVse\np1321\naVsd\np1322\naVbydgoszcz.pl\np1323\naVnet.jo\np1324\naVleasing.aero\np1325\naVct.us\np1326\naVnet.je\np1327\naVpriv.hu\np1328\naVnewjersey.museum\np1329\naV!pref.ishikawa.jp\np1330\naVhattfjelldal.no\np1331\naV!pref.yamaguchi.jp\np1332\naVtrana.no\np1333\naVorg.ua\np1334\naVbrunel.museum\np1335\naV!police.uk\np1336\naVjamal.ru\np1337\naVaero.mv\np1338\naVair-surveillance.aero\np1339\naVnotodden.no\np1340\naVsola.no\np1341\naVis-a-green.com\np1342\naVfrankfurt.museum\np1343\naVwv.us\np1344\naVkuban.ru\np1345\naVl?rdal.no\np1346\naVcopenhagen.museum\np1347\naV!pref.gifu.jp\np1348\naV?rland.no\np1349\naVact.gov.au\np1350\naVedu.rs\np1351\naVest.pr\np1352\naV\\u0441\\u0440\\u0431\np1353\naVfnd.br\np1354\naVvi.it\np1355\naVhomelinux.org\np1356\naVcc.ms.us\np1357\naVjs.cn\np1358\naVmedizinhistorisches.museum\np1359\naVchungnam.kr\np1360\naVpn.it\np1361\naVnowaruda.pl\np1362\naVbrumunddal.no\np1363\naVvoronezh.ru\np1364\naVhokksund.no\np1365\naV!pref.iwate.jp\np1366\naVsaratov.ru\np1367\naVnome.pt\np1368\naVcahcesuolo.no\np1369\naVhuissier-justice.fr\np1370\naVcoloradoplateau.museum\np1371\naVname\np1372\naVpiacenza.it\np1373\naVart.pl\np1374\naVrg.it\np1375\naVorg.sl\np1376\naVgov.ua\np1377\naVfrom-hi.com\np1378\naVlib.ct.us\np1379\naV!nacion.ar\np1380\naVper.sg\np1381\naVoceanographic.museum\np1382\naVt.bg\np1383\naVca.na\np1384\naVsalzburg.museum\np1385\naVlib.az.us\np1386\naVscience.museum\np1387\naVmuseum.mw\np1388\naVee\np1389\naVeg\np1390\naVac.th\np1391\naVis-very-nice.org\np1392\naVec\np1393\naVsex.hu\np1394\naVhornindal.no\np1395\naVeu\np1396\naVk12.nv.us\np1397\naVstuff-4-sale.org\np1398\naVryazan.ru\np1399\naVes\np1400\naVorg.gr\np1401\naVorg.gp\np1402\naVcoop.mw\np1403\naVcoop.mv\np1404\naVcom.cn\np1405\naVcom.co\np1406\naVaa.no\np1407\naVkrager?.no\np1408\naVis-very-evil.org\np1409\naVco.rw\np1410\naVorg.gg\np1411\naVorg.ge\np1412\naVorg.gi\np1413\naVvc.it\np1414\naV?seral.no\np1415\naVorg.gn\np1416\naVbotany.museum\np1417\naVfinnoy.no\np1418\naVrl.no\np1419\naVfilatelia.museum\np1420\naVmantova.it\np1421\naVpd.it\np1422\naV*.miyazaki.jp\np1423\naVestate.museum\np1424\naVd?nna.no\np1425\naVy.se\np1426\naVforlicesena.it\np1427\naVair.museum\np1428\naVorg\np1429\naV!pref.aichi.jp\np1430\naVedu.vc\np1431\naVbern.museum\np1432\naVkiev.ua\np1433\naVporsanger.no\np1434\naVgouv.km\np1435\naVendofinternet.org\np1436\naVco.nl\np1437\naVcc.ok.us\np1438\naVurbino-pesaro.it\np1439\naVco.na\np1440\naVniepce.museum\np1441\naVvestv?g?y.no\np1442\naVisleofman.museum\np1443\naVlaakesvuemie.no\np1444\naVks.ua\np1445\naV!nic.tr\np1446\naVath.cx\np1447\naVdaegu.kr\np1448\naV*.kanagawa.jp\np1449\naV*.okayama.jp\np1450\naVselfip.info\np1451\naVfrom-nv.com\np1452\naV!pref.shizuoka.jp\np1453\naVnic.im\np1454\naVorg.sg\np1455\naVnic.in\np1456\naV!pref.fukushima.jp\np1457\naVodessa.ua\np1458\naVassociation.museum\np1459\naV*.kobe.jp\np1460\naVpu.it\np1461\naVardal.no\np1462\naVsvelvik.no\np1463\naVpharmacy.museum\np1464\naV*.kyoto.jp\np1465\naVogliastra.it\np1466\naVastrakhan.ru\np1467\naVproduction.aero\np1468\naV\\u0639\\u0645\\u0627\\u0646\np1469\naVelverum.no\np1470\naV\\u10d2\\u10d4\np1471\naVint.mv\np1472\naVhb.cn\np1473\naVcng.br\np1474\naVud.it\np1475\naVkvalsund.no\np1476\naVcastle.museum\np1477\naVak.us\np1478\naVgran.no\np1479\naVv?g?.no\np1480\naVloab?t.no\np1481\naVairtraffic.aero\np1482\naVchicago.museum\np1483\naVtgory.pl\np1484\naVcom.ua\np1485\naVrana.no\np1486\naVkharkov.ua\np1487\naVtinn.no\np1488\naVlapy.pl\np1489\naVlerdal.no\np1490\naVor.mu\np1491\naVcr.it\np1492\naVisernia.it\np1493\naVkristiansund.no\np1494\naVkv?fjord.no\np1495\naVstargard.pl\np1496\naVac.tz\np1497\naVgo.kr\np1498\naVcom.uz\np1499\naVtr?na.no\np1500\naVmoss.no\np1501\naVco.ba\np1502\naVedu.ht\np1503\naVsnasa.no\np1504\naVfl?.no\np1505\naVsf.no\np1506\naVjolster.no\np1507\naVsantacruz.museum\np1508\naVedu.hn\np1509\naVvolgograd.ru\np1510\naVedu.hk\np1511\naVclock.museum\np1512\naVorg.sc\np1513\naVsuwalki.pl\np1514\naVphiladelphiaarea.museum\np1515\naVtown.museum\np1516\naVhawaii.museum\np1517\naVisa-geek.com\np1518\naVnature.museum\np1519\naV!uba.ar\np1520\naVkhv.ru\np1521\naVgs.bu.no\np1522\naVdavvesiida.no\np1523\naVnes.akershus.no\np1524\naVis-a-knight.org\np1525\naVcc.sc.us\np1526\naVco.bi\np1527\naVskjervoy.no\np1528\naVorg.sb\np1529\naVfar.br\np1530\naVsuisse.museum\np1531\naVhistoricalsociety.museum\np1532\naVbokn.no\np1533\naVpanama.museum\np1534\naVsmolensk.ru\np1535\naVlib.nc.us\np1536\naVbc.ca\np1537\naVjaworzno.pl\np1538\naVedu.tj\np1539\naVgemological.museum\np1540\naVvikna.no\np1541\naValta.no\np1542\naVedu.to\np1543\naVdavvenj?rga.no\np1544\naVfrom-fl.com\np1545\naVk12.al.us\np1546\naVedu.tw\np1547\naVr?isa.no\np1548\naVmeloy.no\np1549\naVfrom-ms.com\np1550\naVgov.ec\np1551\naVgov.eg\np1552\naVgov.ee\np1553\naV!jet.uk\np1554\naVkarikatur.museum\np1555\naVsor-varanger.no\np1556\naVshell.museum\np1557\naVchernigov.ua\np1558\naVwales.museum\np1559\naVgz.cn\np1560\naVuslivinghistory.museum\np1561\naVj?rpeland.no\np1562\naVut.us\np1563\naV\\u0b9a\\u0bbf\\u0b99\\u0bcd\\u0b95\\u0baa\\u0bcd\\u0baa\\u0bc2\\u0bb0\\u0bcd\np1564\naVhamaroy.no\np1565\naVcapebreton.museum\np1566\naVftpaccess.cc\np1567\naVbahccavuotna.no\np1568\naVlincoln.museum\np1569\naV*.zw\np1570\naVmbone.pl\np1571\naVsciencecenter.museum\np1572\naVafjord.no\np1573\naV*.aichi.jp\np1574\naV*.zm\np1575\naVbiz.nr\np1576\naV*.za\np1577\naVyuzhno-sakhalinsk.ru\np1578\naVtj.cn\np1579\naVencyclopedic.museum\np1580\naVklabu.no\np1581\naVdyndns-mail.com\np1582\naVcampidanomedio.it\np1583\naVbozen.it\np1584\naVinfo.ec\np1585\naVorg.vi\np1586\naVis-a-bookkeeper.com\np1587\naVsk?nit.no\np1588\naVgovernment.aero\np1589\naVhi.us\np1590\naVmazury.pl\np1591\naVdyr?y.no\np1592\naVszex.hu\np1593\naVfm.it\np1594\naVsogne.no\np1595\naVv?gan.no\np1596\naVfauske.no\np1597\naVgok.pk\np1598\naVdnsalias.com\np1599\naV*.shimane.jp\np1600\naVtrentino.it\np1601\naVk12.ut.us\np1602\naVbs.it\np1603\naVk12.co.us\np1604\naVkonyvelo.hu\np1605\naVwebhop.biz\np1606\naVac.se\np1607\naVturin.it\np1608\naVswinoujscie.pl\np1609\naVsc.tz\np1610\naVac.sz\np1611\naVbruxelles.museum\np1612\naVmuseumcenter.museum\np1613\naVeu.com\np1614\naV!nls.uk\np1615\naVlukow.pl\np1616\naVlorenskog.no\np1617\naVnom.mg\np1618\naVlib.ri.us\np1619\naVpalana.ru\np1620\naV\\u7d44\\u7ec7.hk\np1621\naVper.la\np1622\naVgjerstad.no\np1623\naVflog.br\np1624\naVconsultant.aero\np1625\naVwatchandclock.museum\np1626\naVand?y.no\np1627\naVjamison.museum\np1628\naVskjerv?y.no\np1629\naVcc.ct.us\np1630\naVskanit.no\np1631\naVatm.pl\np1632\naVunbi.ba\np1633\naVgateway.museum\np1634\naVis-a-nurse.com\np1635\naVphoenix.museum\np1636\naVl?ns.museum\np1637\naVloten.no\np1638\naVfi.it\np1639\naVtomsk.ru\np1640\naVbiev?t.no\np1641\naVtysnes.no\np1642\naVmaintenance.aero\np1643\naVsamnanger.no\np1644\naVontario.museum\np1645\naVtorino.museum\np1646\naVgamvik.no\np1647\naVorg.vc\np1648\naVorg.vn\np1649\naVpreservation.museum\np1650\naVopoczno.pl\np1651\naVdinosaur.museum\np1652\naV!pref.kagawa.jp\np1653\naVmedecin.km\np1654\naVcc.vt.us\np1655\naVhelsinki.museum\np1656\naVairline.aero\np1657\naVsrv.br\np1658\naVtjome.no\np1659\naV*.sendai.jp\np1660\naVherad.no\np1661\naVgallery.museum\np1662\naVjobs\np1663\naVnet.iq\np1664\naVnet.ir\np1665\naVnet.is\np1666\naVolkusz.pl\np1667\naVsch.ly\np1668\naVjp\np1669\naVissmarterthanyou.com\np1670\naVkragero.no\np1671\naVnet.id\np1672\naVforce.museum\np1673\naVjo\np1674\naVis-a-blogger.com\np1675\naVk12.ks.us\np1676\naVnet.sb\np1677\naV!british-library.uk\np1678\naVje\np1679\naVnet.in\np1680\naVltd.co.im\np1681\naVmesaverde.museum\np1682\naV\\u7ec4\\u7ec7.hk\np1683\naVmyphotos.cc\np1684\naVos.hordaland.no\np1685\naVnov.ru\np1686\naVhs.kr\np1687\naVchungbuk.kr\np1688\naVkoebenhavn.museum\np1689\naVac.at\np1690\naVfigueres.museum\np1691\naVmusic.museum\np1692\naVlund.no\np1693\naVralingen.no\np1694\naV*.akita.jp\np1695\naVens.tn\np1696\naVvladivostok.ru\np1697\naVbielawa.pl\np1698\naVg.se\np1699\naVcom.tj\np1700\naVsurrey.museum\np1701\naVcom.to\np1702\naVasso.mc\np1703\naVsor-aurdal.no\np1704\naVtransport.museum\np1705\naV!rakpetroleum.om\np1706\naVcom.tt\np1707\naVcom.tw\np1708\naVnet.im\np1709\naVgs.tm.no\np1710\naVmuenster.museum\np1711\naVcoldwar.museum\np1712\naVdefense.tn\np1713\naV!nel.uk\np1714\naV!pref.hokkaido.jp\np1715\naVwa.edu.au\np1716\naVedu.is\np1717\naVg?\\u014bgaviika.no\np1718\naVedu.iq\np1719\naV*.kagawa.jp\np1720\naVm?latvuopmi.no\np1721\naVedu.it\np1722\naVverran.no\np1723\naVedu.in\np1724\naVmilitary.museum\np1725\naVk12.nd.us\np1726\naVlowicz.pl\np1727\naVamericana.museum\np1728\naVsnaase.no\np1729\naVglas.museum\np1730\naVac.ae\np1731\naVac.cr\np1732\naVgroks-the.info\np1733\naVaero\np1734\naVriik.ee\np1735\naVbo.it\np1736\naVenebakk.no\np1737\naVint.vn\np1738\naVgs.va.no\np1739\naVbr.com\np1740\naVmobi.tt\np1741\naV\\u0b87\\u0ba8\\u0bcd\\u0ba4\\u0bbf\\u0baf\\u0bbe\np1742\naVk12.il.us\np1743\naVaustrheim.no\np1744\naVcom.bt\np1745\naVcom.bs\np1746\naVcom.br\np1747\naVt?nsberg.no\np1748\naVorg.ht\np1749\naVorg.hu\np1750\naVnet.sg\np1751\naVcom.bz\np1752\naVcom.by\np1753\naVorg.hn\np1754\naVvik.no\np1755\naVorg.hk\np1756\naVcom.ba\np1757\naVcom.bo\np1758\naVcom.bm\np1759\naVtrondheim.no\np1760\naVtjeldsund.no\np1761\naVcom.bi\np1762\naVcom.bh\np1763\naVgrajewo.pl\np1764\naVgov.jo\np1765\naVcarrara-massa.it\np1766\naVor.it\np1767\naVnet.sd\np1768\naVgov.je\np1769\naVcc.ar.us\np1770\naVis-a-player.com\np1771\naVkongsberg.no\np1772\naVto.it\np1773\naVlecce.it\np1774\naV?s.no\np1775\naVr?de.no\np1776\naVinderoy.no\np1777\naVmarylhurst.museum\np1778\naVcc.vi.us\np1779\naVcc.as.us\np1780\naV!omanmobile.om\np1781\naV\\u0a2d\\u0a3e\\u0a30\\u0a24\np1782\naVstockholm.museum\np1783\naVcolumbus.museum\np1784\naVnore-og-uvdal.no\np1785\naVjoshkar-ola.ru\np1786\naVjogasz.hu\np1787\naVnarvik.no\np1788\naVplantation.museum\np1789\naVturen.tn\np1790\naVdc.us\np1791\naVedu.gp\np1792\naVedu.gr\np1793\naVengland.museum\np1794\naVneat-url.com\np1795\naVedu.ge\np1796\naVk12.va.us\np1797\naVla.us\np1798\naVberg.no\np1799\naVcivilization.museum\np1800\naVvossevangen.no\np1801\naVedu.gn\np1802\naVedu.gi\np1803\naVedu.gh\np1804\naVgratangen.no\np1805\naVnet.vn\np1806\naVhalloffame.museum\np1807\naV*.il\np1808\naVfermo.it\np1809\naVporsgrunn.no\np1810\naVtm.mc\np1811\naVis-a-geek.net\np1812\naVcs.it\np1813\naVvegarshei.no\np1814\naVtm.mg\np1815\naVhealth.vn\np1816\naVtempio-olbia.it\np1817\naVkustanai.ru\np1818\naVmarketplace.aero\np1819\naVballooning.aero\np1820\naVkicks-ass.net\np1821\naVwww.ro\np1822\naVbmd.br\np1823\naVmissile.museum\np1824\naVpalmsprings.museum\np1825\naVva.no\np1826\naVtokke.no\np1827\naVbrussel.museum\np1828\naVbjarkoy.no\np1829\naVcc.tn.us\np1830\naVgenoa.it\np1831\naVhome.dyndns.org\np1832\naVbergamo.it\np1833\naVfosnes.no\np1834\naVjessheim.no\np1835\naVclub.tw\np1836\naVbn.it\np1837\naVdurham.museum\np1838\naVrel.pl\np1839\naV?yer.no\np1840\naVuw.gov.pl\np1841\naV\\u0443\\u043a\\u0440\np1842\naVphotography.museum\np1843\naVbodo.no\np1844\naVkutno.pl\np1845\naVkarasjok.no\np1846\naVkarm?y.no\np1847\naVinfo.tt\np1848\naVmiasta.pl\np1849\naVdesign.museum\np1850\naVserveftp.net\np1851\naVeidfjord.no\np1852\naVmalatvuopmi.no\np1853\naVlib.ga.us\np1854\naVlyngen.no\np1855\naVmed.pa\np1856\naVtuva.ru\np1857\naVsiljan.no\np1858\naVco.ug\np1859\naVlt.it\np1860\naVia.us\np1861\naV*.kw\np1862\naVspjelkavik.no\np1863\naVdudinka.ru\np1864\naVis.it\np1865\naVcc.ut.us\np1866\naVmt.it\np1867\naVguovdageaidnu.no\np1868\naVlanbib.se\np1869\naVbeardu.no\np1870\naVcc.ri.us\np1871\naVbale.museum\np1872\naVlib.nv.us\np1873\naVudm.ru\np1874\naVedu.ua\np1875\naVbalsan.it\np1876\naVselje.no\np1877\naVnes.buskerud.no\np1878\naVedu.tt\np1879\naVair-traffic-control.aero\np1880\naVkv?nangen.no\np1881\naVmontreal.museum\np1882\naVtechnology.museum\np1883\naVal.us\np1884\naVtur.br\np1885\naVgs.mr.no\np1886\naVnet.ht\np1887\naVta.it\np1888\naVspydeberg.no\np1889\naVarchaeology.museum\np1890\naV*.ishikawa.jp\np1891\naVhotel.hu\np1892\naVmo.us\np1893\naV6bone.pl\np1894\naVnet.hk\np1895\naVcastres.museum\np1896\naVnet.hn\np1897\naVhn.cn\np1898\naVbergen.no\np1899\naVbenevento.it\np1900\naVgiessen.museum\np1901\naVe164.arpa\np1902\naVv?ler.?stfold.no\np1903\naVlondon.museum\np1904\naVkr?anghke.no\np1905\naVmasoy.no\np1906\naVstrand.no\np1907\naV*.hiroshima.jp\np1908\naVnom.pe\np1909\naVvevelstad.no\np1910\naVfrom-id.com\np1911\naVkepno.pl\np1912\naVis-a-chef.com\np1913\naVb?tsfjord.no\np1914\naVromsa.no\np1915\naVclub.aero\np1916\naVinfo.bb\np1917\naVrnd.ru\np1918\naVinfo.nr\np1919\naV*.niigata.jp\np1920\naVind.in\np1921\naVfrom-mt.com\np1922\naVeigersund.no\np1923\naV\\u7d44\\u7e54.hk\np1924\naVtromsa.no\np1925\naVis-a-anarchist.com\np1926\naV!educ.ar\np1927\naVgov.rw\np1928\naVnc.us\np1929\naVco.uz\np1930\naVelblag.pl\np1931\naVentertainment.aero\np1932\naVselbu.no\np1933\naVeducator.aero\np1934\naVbaths.museum\np1935\naVk?r?\\u0161johka.no\np1936\naVpomorskie.pl\np1937\naVgangwon.kr\np1938\naVres.aero\np1939\naVaip.ee\np1940\naVher?y.m?re-og-romsdal.no\np1941\naVfie.ee\np1942\naVcollection.museum\np1943\naVwebhop.org\np1944\naVhouse.museum\np1945\naV\\u5546\\u696d.tw\np1946\naVoverhalla.no\np1947\naV!mod.uk\np1948\naVnorth.museum\np1949\naVon.ca\np1950\naVshacknet.nu\np1951\naVradoy.no\np1952\naVint.rw\np1953\naVck.ua\np1954\naV*.shiga.jp\np1955\naVpl.ua\np1956\naVos.hedmark.no\np1957\naVethnology.museum\np1958\naVistmein.de\np1959\naVcom.es\np1960\naV*.osaka.jp\np1961\naVaerodrome.aero\np1962\naVsec.ps\np1963\naVorg.iq\np1964\naVyekaterinburg.ru\np1965\naVorg.is\np1966\naVorg.ir\np1967\naVorg.im\np1968\naVcom.ec\np1969\naVfor-our.info\np1970\naVorg.in\np1971\naVcom.eg\np1972\naVtrani-andria-barletta.it\np1973\naVcincinnati.museum\np1974\naVcherkassy.ua\np1975\naVte.it\np1976\naV?k\\u014boluokta.no\np1977\naVae.org\np1978\naVdyndns-wiki.com\np1979\naVin-the-band.net\np1980\naVandria-trani-barletta.it\np1981\naVjuif.museum\np1982\naVroan.no\np1983\naVchildren.museum\np1984\naVluxembourg.museum\np1985\naVartdeco.museum\np1986\naVlangev?g.no\np1987\naVbarletta-trani-andria.it\np1988\naVprochowice.pl\np1989\naVh?bmer.no\np1990\naVco.hu\np1991\naV!national-library-scotland.uk\np1992\naVmining.museum\np1993\naVfylkesbibl.no\np1994\naVfrom-ak.com\np1995\naV\\u7f51\\u7edc.hk\np1996\naVfla.no\np1997\naVoh.us\np1998\naVdontexist.org\np1999\naVaxis.museum\np2000\naVorg.so\np2001\naVvb.it\np2002\naVfrom-wy.com\np2003\naVskanland.no\np2004\naVmallorca.museum\np2005\naVmoscow.museum\np2006\naVgouv.ml\np2007\naVvideo.hu\np2008\naVnu.it\np2009\naVac\np2010\naVpp.se\np2011\naVae\np2012\naVad\np2013\naVag\np2014\naVaf\np2015\naVai\np2016\naVbeiarn.no\np2017\naVedu.dz\np2018\naVavoues.fr\np2019\naVal\np2020\naVao\np2021\naVan\np2022\naVaq\np2023\naVas\np2024\naVat\np2025\naVaw\np2026\naVfh.se\np2027\naVax\np2028\naVaz\np2029\naVsr.gov.pl\np2030\naVedu.dm\np2031\naVedu.do\np2032\naVolsztyn.pl\np2033\naVhl.no\np2034\naVradio.br\np2035\naVprincipe.st\np2036\naV*.jm\np2037\naVhoyanger.no\np2038\naVfinn?y.no\np2039\naVmil.eg\np2040\naVsologne.museum\np2041\naVname.pr\np2042\naVco.tt\np2043\naVgjerdrum.no\np2044\naVrendalen.no\np2045\naVint.tt\np2046\naVbremanger.no\np2047\naVfst.br\np2048\naVco.tz\np2049\naVbarreau.bj\np2050\naVservebbs.com\np2051\naVrollag.no\np2052\naVhalsa.no\np2053\naVsuldal.no\np2054\naVasso.nc\np2055\naVr?yken.no\np2056\naVcom.mw\np2057\naVal.it\np2058\naVindiana.museum\np2059\naVcom.mu\np2060\naVcom.ws\np2061\naV\\u05d9\\u05e8\\u05d5\\u05e9\\u05dc\\u05d9\\u05dd.museum\np2062\naVgenova.it\np2063\naVnordkapp.no\np2064\naVeastcoast.museum\np2065\naVtr.no\np2066\naVc.se\np2067\naVbudejju.no\np2068\naVhemsedal.no\np2069\naVcolonialwilliamsburg.museum\np2070\naVandebu.no\np2071\naVcenter.museum\np2072\naVma.us\np2073\naVk12.la.us\np2074\naVorg.ma\np2075\naVis-a-celticsfan.org\np2076\naVcom.pf\np2077\naVambulance.museum\np2078\naV!city.shizuoka.jp\np2079\naVbiz.bb\np2080\naVlib.co.us\np2081\naVsouthcarolina.museum\np2082\naVint.tj\np2083\naVentomology.museum\np2084\naVorg.me\np2085\naVselfip.org\np2086\naVmil.hn\np2087\naVgrong.no\np2088\naVmeraker.no\np2089\naVgame.tw\np2090\naVrygge.no\np2091\naVflorence.it\np2092\naVk12.wi.us\np2093\naVsa.cr\np2094\naVorg.mg\np2095\naVchesapeakebay.museum\np2096\naVkonskowola.pl\np2097\naVtv\np2098\naVtw\np2099\naVgob.hn\np2100\naV\\u516c\\u53f8.cn\np2101\naVtn\np2102\naVto\np2103\naVtl\np2104\naVin.na\np2105\naVtj\np2106\naValgard.no\np2107\naVth\np2108\naVtf\np2109\naVcom.ci\np2110\naVverbania.it\np2111\naVcnt.br\np2112\naVedu.rw\np2113\naVcoal.museum\np2114\naVedu.ru\np2115\naVgov.km\np2116\naVgov.kn\np2117\naVgov.ki\np2118\naVglass.museum\np2119\naVepilepsy.museum\np2120\naVgov.kg\np2121\naVmaryland.museum\np2122\naVmerseine.nu\np2123\naVsuedtirol.it\np2124\naVfrom-nc.com\np2125\naVmulhouse.museum\np2126\naVgov.ky\np2127\naVorg.mo\np2128\naVgov.kz\np2129\naVoster?y.no\np2130\naVgov.kp\np2131\naVwroclaw.pl\np2132\naVed.jp\np2133\naVro\np2134\naVwatch-and-clock.museum\np2135\naVfrom-ks.com\np2136\naVcorporation.museum\np2137\naVid.ir\np2138\naVpresse.km\np2139\naVstor-elvdal.no\np2140\naVlegnica.pl\np2141\naVar.com\np2142\naVglogow.pl\np2143\naVis-a-photographer.com\np2144\naVbiz.pl\np2145\naVartgallery.museum\np2146\naVbiz.pk\np2147\naVdyndns.biz\np2148\naV*.chiba.jp\np2149\naVdyndns.tv\np2150\naVcontrol.aero\np2151\naVorg.mw\np2152\naVinfo.co\np2153\naVakrehamn.no\np2154\naVorg.mv\np2155\naVambulance.aero\np2156\naVsuli.hu\np2157\naVorg.my\np2158\naVbt.it\np2159\naVkartuzy.pl\np2160\naVmichigan.museum\np2161\naV\\u0645\\u0635\\u0631\np2162\naVsondrio.it\np2163\naVnuremberg.museum\np2164\naVcbg.ru\np2165\naVfrom-or.com\np2166\naVmarnardal.no\np2167\naVs?r-fron.no\np2168\naVluroy.no\np2169\naVaver?y.no\np2170\naVprd.fr\np2171\naVweb.id\np2172\naVgets-it.net\np2173\naVmoma.museum\np2174\naVlel.br\np2175\naVcc.co.us\np2176\naVmuseumvereniging.museum\np2177\naVgotdns.org\np2178\naVpe.kr\np2179\naVkaszuby.pl\np2180\naVcom.bb\np2181\naVsc.cn\np2182\naVbronnoy.no\np2183\naV!retina.ar\np2184\naVmodelling.aero\np2185\naVbashkiria.ru\np2186\naVis-a-rockstar.com\np2187\naVm?lselv.no\np2188\naVraholt.no\np2189\naVoryol.ru\np2190\naVhorology.museum\np2191\naVsyzran.ru\np2192\naVstv.ru\np2193\naVtydal.no\np2194\naVinfo.tn\np2195\naVjournal.aero\np2196\naVjor.br\np2197\naVvads?.no\np2198\naVjewelry.museum\np2199\naVnet.ua\np2200\naVringebu.no\np2201\naVisa-geek.net\np2202\naVstorfjord.no\np2203\naVimperia.it\np2204\naVlib.ma.us\np2205\naVfrom-al.com\np2206\naVpb.ao\np2207\naVtrogstad.no\np2208\naVfor-some.biz\np2209\naVva.us\np2210\naVbarlettatraniandria.it\np2211\naVf.se\np2212\naVromskog.no\np2213\naVsavona.it\np2214\naVgo.dyndns.org\np2215\naVnt.ro\np2216\naVmonza-e-della-brianza.it\np2217\naV!city.yokohama.jp\np2218\naVbotanical.museum\np2219\naVcivilwar.museum\np2220\naVtelevision.museum\np2221\naVflatanger.no\np2222\naV!gobiernoelectronico.ar\np2223\naVvc\np2224\naVsurnadal.no\np2225\naVsosnowiec.pl\np2226\naVbeauxarts.museum\np2227\naVfrom-il.com\np2228\naV*.kawasaki.jp\np2229\naVsanfrancisco.museum\np2230\naVco.ir\np2231\naVasker.no\np2232\naVtrolley.museum\np2233\naVco.it\np2234\naVfuettertdasnetz.de\np2235\naVhistory.museum\np2236\naVk12.de.us\np2237\naVpolkowice.pl\np2238\naVcc.hi.us\np2239\naVis-a-geek.com\np2240\naVsv.it\np2241\naVetnedal.no\np2242\naVfrosinone.it\np2243\naVcrafts.museum\np2244\naVco.in\np2245\naVco.im\np2246\naVlier.no\np2247\naVudine.it\np2248\naVcasino.hu\np2249\naVnet.gy\np2250\naVmil.to\np2251\naVnet.gr\np2252\naVagrinet.tn\np2253\naVnet.gp\np2254\naVnet.gn\np2255\naVmil.tw\np2256\naVtcm.museum\np2257\naVsteiermark.museum\np2258\naVvn\np2259\naVmd.us\np2260\naVpro.ht\np2261\naVnet.gg\np2262\naVmad.museum\np2263\naVnet.ge\np2264\naVmil.tz\np2265\naVserveftp.org\np2266\naVvirtual.museum\np2267\naVgiske.no\np2268\naVzgrad.ru\np2269\naVfirm.co\np2270\naV!congresodelalengua3.ar\np2271\naV\\u0dbd\\u0d82\\u0d9a\\u0dcf\np2272\naVac.gn\np2273\naVs?r-aurdal.no\np2274\naVmaritimo.museum\np2275\naVfor-the.biz\np2276\naVostroda.pl\np2277\naVgjemnes.no\np2278\naVlabour.museum\np2279\naVve.it\np2280\naVrennes?y.no\np2281\naVedu.sc\np2282\naVbergbau.museum\np2283\naVcom.vi\np2284\naVcom.vn\np2285\naVmansions.museum\np2286\naVcom.vc\np2287\naVsarpsborg.no\np2288\naVfrom-wv.com\np2289\naVyork.museum\np2290\naVnet.ki\np2291\naVis-a-liberal.com\np2292\naVlib.al.us\np2293\naVeng.br\np2294\naVfrosta.no\np2295\naVsigdal.no\np2296\naVsr.it\np2297\naVfrom-ga.com\np2298\naVfamily.museum\np2299\naV!pref.nagasaki.jp\np2300\naVvaksdal.no\np2301\naV!pref.ibaraki.jp\np2302\naV?lt?.no\np2303\naVis-a-hard-worker.com\np2304\naVuzhgorod.ua\np2305\naVinder?y.no\np2306\naVof.by\np2307\naVlesja.no\np2308\naVgov.al\np2309\naVstjohn.museum\np2310\naVneues.museum\np2311\naVsvizzera.museum\np2312\naV*.hokkaido.jp\np2313\naVam.br\np2314\naVappspot.com\np2315\naVland-4-sale.us\np2316\naVfr\np2317\naVbroke-it.net\np2318\naV*.uk\np2319\naVtorino.it\np2320\naVbod?.no\np2321\naVtargi.pl\np2322\naVwar.museum\np2323\naVketrzyn.pl\np2324\naVbr?nn?ysund.no\np2325\naVorg.tt\np2326\naVfrog.museum\np2327\naVannefrank.museum\np2328\naVfi\np2329\naVfm\np2330\naVfo\np2331\naVvolda.no\np2332\naVlimanowa.pl\np2333\naVtm.pl\np2334\naVlezajsk.pl\np2335\naVcom.dz\np2336\naVa.bg\np2337\naVb.se\np2338\naVedu.st\np2339\naVcharter.aero\np2340\naVzgora.pl\np2341\naVcom.de\np2342\naVk12.ne.us\np2343\naVorg.jo\np2344\naVsherbrooke.museum\np2345\naVsamara.ru\np2346\naVcom.dm\np2347\naVorg.je\np2348\naVcom.do\np2349\naVtourism.tn\np2350\naVcircus.museum\np2351\naVgov.hk\np2352\naVreadmyblog.org\np2353\naVgwangju.kr\np2354\naVbahn.museum\np2355\naVpsi.br\np2356\naVcom.pl\np2357\naVharam.no\np2358\naVgloppen.no\np2359\naVcc.in.us\np2360\naVint.az\np2361\naVsnillfjord.no\np2362\naVvega.no\np2363\naVname.my\np2364\naVsch.ir\np2365\naVmansion.museum\np2366\naVmidtre-gauldal.no\np2367\naVlierne.no\np2368\naVdyndns.info\np2369\naVpg.it\np2370\naV!songfest.om\np2371\naVyn.cn\np2372\naVivano-frankivsk.ua\np2373\naVbonn.museum\np2374\naVname.mv\np2375\naVname.mk\np2376\naVsch.id\np2377\naVf?rde.no\np2378\naVjerusalem.museum\np2379\naVpalace.museum\np2380\naVandasuolo.no\np2381\naVroros.no\np2382\naVstuff-4-sale.us\np2383\naVhembygdsforbund.museum\np2384\naVedu.es\np2385\naVwarszawa.pl\np2386\naVhistorichouses.museum\np2387\naVkautokeino.no\np2388\naVsaintlouis.museum\np2389\naVhellas.museum\np2390\naVedu.eg\np2391\naVedu.ee\np2392\naVedu.ec\np2393\naVartanddesign.museum\np2394\naVcartoonart.museum\np2395\naVor.na\np2396\naVcagliari.it\np2397\naVs?ndre-land.no\np2398\naVac.ma\np2399\naVedu.kz\np2400\naVbotanicgarden.museum\np2401\naVsandefjord.no\np2402\naVsciences.museum\np2403\naV*.ke\np2404\naVmj?ndalen.no\np2405\naVrailway.museum\np2406\naVap.it\np2407\naVh?yanger.no\np2408\naVmosreg.ru\np2409\naVtm.km\np2410\naV*.kh\np2411\naVfam.pk\np2412\naVe.bg\np2413\naV!pref.nagano.jp\np2414\naViglesiascarbonia.it\np2415\naVlea\\u014bgaviika.no\np2416\naVfrom-mi.com\np2417\naVr?mskog.no\np2418\naVcc.ga.us\np2419\naVkafjord.no\np2420\naVaseral.no\np2421\naVnittedal.no\np2422\naVushistory.museum\np2423\naVlviv.ua\np2424\naVfirm.ro\np2425\naVengineer.aero\np2426\naV?rskog.no\np2427\naVperso.ht\np2428\naVr?lingen.no\np2429\naVjewishart.museum\np2430\naVac.vn\np2431\naVlib.tx.us\np2432\naVdni.us\np2433\naVvenezia.it\np2434\naVsteinkjer.no\np2435\naVadult.ht\np2436\naVest-a-la-masion.com\np2437\naVis-leet.com\np2438\naVcatania.it\np2439\naVa.se\np2440\naVsp.it\np2441\naVinfo.ro\np2442\naVdp.ua\np2443\naVvadso.no\np2444\naVnsn.us\np2445\naVk12.vi.us\np2446\naVjournalist.aero\np2447\naVmil.iq\np2448\naVblogsite.org\np2449\naVsandoy.no\np2450\naVmine.nu\np2451\naVcc.va.us\np2452\naVart.br\np2453\naVgov.mv\np2454\naVavellino.it\np2455\naVnet.ws\np2456\naVce.it\np2457\naVmil.id\np2458\naVgov.st\np2459\naV!pref.tokushima.jp\np2460\naVgeelvinck.museum\np2461\naV1.bg\np2462\naVmil.in\np2463\naVberlev?g.no\np2464\naVecn.br\np2465\naVnorddal.no\np2466\naV\\u0627\\u0644\\u0633\\u0639\\u0648\\u062f\\u064a\\u0629\np2467\naVedu.sl\np2468\naVacademy.museum\np2469\naVedu.sn\np2470\naVedu.sa\np2471\naVza.org\np2472\naVetc.br\np2473\naVedu.sb\np2474\naVedu.sd\np2475\naVedu.sg\np2476\naVoristano.it\np2477\naVedu.sy\np2478\naVcosenza.it\np2479\naVmn.it\np2480\naVdoes-it.net\np2481\naVarboretum.museum\np2482\naVtravel\np2483\naVfolldal.no\np2484\naVlipetsk.ru\np2485\naV\\u4e2a\\u4eba.hk\np2486\naV*.nagano.jp\np2487\naVivanovo.ru\np2488\naVbaseball.museum\np2489\naVgorge.museum\np2490\naVwaw.pl\np2491\naVwebhop.info\np2492\naVchampionship.aero\np2493\naVblogdns.org\np2494\naVhoylandet.no\np2495\naVm?s?y.no\np2496\naV?mot.no\np2497\naVaure.no\np2498\naVsondre-land.no\np2499\naVnaamesjevuemie.no\np2500\naV?lg?rd.no\np2501\naVgov.mg\np2502\naVstryn.no\np2503\naVis-an-engineer.com\np2504\naV*.sch.uk\np2505\naVorenburg.ru\np2506\naVpruszkow.pl\np2507\naVeducation.museum\np2508\naV\\u7db2\\u7d61.hk\np2509\naV*.ibaraki.jp\np2510\naVvrn.ru\np2511\naVnom.re\np2512\naVtychy.pl\np2513\naVkhabarovsk.ru\np2514\naVidv.hk\np2515\naVfc.it\np2516\naVheritage.museum\np2517\naV!pref.tochigi.jp\np2518\naV?ygarden.no\np2519\naVsl\np2520\naVn?r?y.no\np2521\naVnom.ro\np2522\naVcertification.aero\np2523\naVwa.us\np2524\naVbytom.pl\np2525\naVskole.museum\np2526\naVhammarfeasta.no\np2527\naV*.saga.jp\np2528\naVagrigento.it\np2529\naVle.it\np2530\naViraq.museum\np2531\naVflor?.no\np2532\naVkalmykia.ru\np2533\naVberkeley.museum\np2534\naVqh.cn\np2535\naVtana.no\np2536\naVdatabase.museum\np2537\naVrnrt.tn\np2538\naVibestad.no\np2539\naVcc.wy.us\np2540\naVzlg.br\np2541\naVsel.no\np2542\naVcmw.ru\np2543\naVsiena.it\np2544\naVorg.kg\np2545\naVqsl.br\np2546\naVh.bg\np2547\naVsk.ca\np2548\naVsalat.no\np2549\naVat.it\np2550\naVorg.km\np2551\naVorg.ki\np2552\naVtrysil.no\np2553\naVgorizia.it\np2554\naVfrom-co.net\np2555\naVnamdalseid.no\np2556\naVorg.kp\np2557\naVkids.us\np2558\naVbiz.vn\np2559\naVassn.lk\np2560\naVorg.kz\np2561\naVorg.ky\np2562\naVaknoluokta.no\np2563\naVbill.museum\np2564\naVfrom-pr.com\np2565\naVsomna.no\np2566\naVcom.gy\np2567\naVternopil.ua\np2568\naVdyndns.ws\np2569\naVcom.pr\np2570\naVcom.gp\np2571\naVr?d?y.no\np2572\naVcom.gr\np2573\naVsnoasa.no\np2574\naVmo.it\np2575\naVurn.arpa\np2576\naVcom.gn\np2577\naVcom.gh\np2578\naVcom.gi\np2579\naVim.it\np2580\naVcom.ge\np2581\naVg.bg\np2582\naVtysfjord.no\np2583\naVpp.ru\np2584\naVballangen.no\np2585\naVlavangen.no\np2586\naVrel.ht\np2587\naVc.bg\np2588\naVtrustee.museum\np2589\naVhealth.museum\np2590\naVsaves-the-whales.com\np2591\naVovre-eiker.no\np2592\naVostroleka.pl\np2593\naVd.bg\np2594\naVwlocl.pl\np2595\naVit.ao\np2596\naVmuosat.no\np2597\naVac.jp\np2598\naVskierv?.no\np2599\naVnaklo.pl\np2600\naV\\u0b87\\u0bb2\\u0b99\\u0bcd\\u0b95\\u0bc8\np2601\naV*.kochi.jp\np2602\naVtravel.pl\np2603\naVaugustow.pl\np2604\naVco.pl\np2605\naVk12.nm.us\np2606\naVb?jddar.no\np2607\naVtas.edu.au\np2608\naV?mli.no\np2609\naV!pref.saitama.jp\np2610\naVk12.ok.us\np2611\naVki\np2612\naV0.bg\np2613\naVkn\np2614\naVkm\np2615\naVco.jp\np2616\naVkr\np2617\naVv?rgg?t.no\np2618\naVsoftware.aero\np2619\naVlib.ak.us\np2620\naVkz\np2621\naVky\np2622\naVxz.cn\np2623\naVedu.bz\np2624\naVnuernberg.museum\np2625\naVato.br\np2626\naVgo.jp\np2627\naVedu.br\np2628\naVedu.bs\np2629\naVnotaires.km\np2630\naVfrom-ri.com\np2631\naVlucca.it\np2632\naVedu.bt\np2633\naVulsan.kr\np2634\naVedu.bh\np2635\naVedu.bi\np2636\naVedu.bo\np2637\naVedu.bm\np2638\naVb.br\np2639\naVchristiansburg.museum\np2640\naVoffice-on-the.net\np2641\naVedu.ba\np2642\naVconf.lv\np2643\naVparis.museum\np2644\naVis-by.us\np2645\naVfrei.no\np2646\naVsshn.se\np2647\naVdyndns-web.com\np2648\naVco.vi\np2649\naVn?vuotna.no\np2650\naVgouv.sn\np2651\naVyorkshire.museum\np2652\naVlib.wi.us\np2653\naVsos.pl\np2654\naV8.bg\np2655\naVnt.ca\np2656\naVmer?ker.no\np2657\naVnet.sy\np2658\naVveterinaire.km\np2659\naVcom.is\np2660\naVasso.ht\np2661\naVis-a-geek.org\np2662\naVkobierzyce.pl\np2663\naVfarsund.no\np2664\naVtarnobrzeg.pl\np2665\naVulm.museum\np2666\naVplo.ps\np2667\naVamur.ru\np2668\naVmandal.no\np2669\naVcom.io\np2670\naVmisconfused.org\np2671\naVl?ten.no\np2672\naVpk\np2673\naV\\u7ec4\\u7e54.hk\np2674\naVstarostwo.gov.pl\np2675\naVres.in\np2676\naVkomi.ru\np2677\naVnet.sc\np2678\naVk12.mn.us\np2679\naVcc.nm.us\np2680\naVor.pw\np2681\naVlib.me.us\np2682\naV5.bg\np2683\naV\\u65b0\\u52a0\\u5761\np2684\naVkemerovo.ru\np2685\naVis-a-musician.com\np2686\naVsoundandvision.museum\np2687\naVris?r.no\np2688\naVmilan.it\np2689\naVmadrid.museum\np2690\naVk12.id.us\np2691\naVkoeln.museum\np2692\naVnesodden.no\np2693\naVparti.se\np2694\naVhomebuilt.aero\np2695\naVfederation.aero\np2696\naVdoesntexist.com\np2697\naVbykle.no\np2698\naVmil.jo\np2699\naVpc.it\np2700\naVintelligence.museum\np2701\naVac.pr\np2702\naVfrom-me.org\np2703\naVstalbans.museum\np2704\naVuvic.museum\np2705\naVedu.pt\np2706\naVferrara.it\np2707\naVcc.oh.us\np2708\naV\\u0627\\u0644\\u0645\\u063a\\u0631\\u0628\np2709\naVedu.pr\np2710\naVso.gov.pl\np2711\naVgrandrapids.museum\np2712\naVsa.au\np2713\naVstord.no\np2714\naVmypets.ws\np2715\naVnet.so\np2716\naVother.nf\np2717\naVedu.pe\np2718\naVedu.pf\np2719\naVedu.pa\np2720\naVleangaviika.no\np2721\naVedu.pl\np2722\naVrieti.it\np2723\naVltd.gi\np2724\naVvirginia.museum\np2725\naV4.bg\np2726\naVrn.it\np2727\naVf.bg\np2728\naVgov.it\np2729\naVgov.is\np2730\naVgov.ir\np2731\naVgov.iq\np2732\naVgyeonggi.kr\np2733\naVvs.it\np2734\naVaccident-investigation.aero\np2735\naV?krehamn.no\np2736\naVfin.tn\np2737\naVpress.museum\np2738\naVgov.ie\np2739\naVgov.in\np2740\naVgov.im\np2741\naVbiz.pr\np2742\naVlind?s.no\np2743\naVcc.fl.us\np2744\naVagro.pl\np2745\naVslg.br\np2746\naVlib.dc.us\np2747\naVpresse.ml\np2748\naVdyndns-at-work.com\np2749\naVis-into-cartoons.com\np2750\naVaukra.no\np2751\naVcomunica??es.museum\np2752\naVsch.jo\np2753\naVact.edu.au\np2754\naVmosj?en.no\np2755\naVsch.je\np2756\naVcarboniaiglesias.it\np2757\naVeisenbahn.museum\np2758\naVvibo-valentia.it\np2759\naVkolobrzeg.pl\np2760\naVinfo.vn\np2761\naVmagazine.aero\np2762\naVprof.pr\np2763\naVmordovia.ru\np2764\naVinfo.at\np2765\naVceltic.museum\np2766\naVinfo.az\np2767\naVgb.net\np2768\naVk12.mo.us\np2769\naVflight.aero\np2770\naV!nic.ar\np2771\naVvestvagoy.no\np2772\naVbievat.no\np2773\naVstavern.no\np2774\naVsand?y.no\np2775\naVn.se\np2776\naVinf.cu\np2777\naVkids.museum\np2778\naVtyumen.ru\np2779\naVnat.tn\np2780\naVdielddanuorri.no\np2781\naVfrom-mo.com\np2782\naVpr\np2783\naVps\np2784\naVstavanger.no\np2785\naVpw\np2786\naVotago.museum\np2787\naVnom.ad\np2788\naVnom.ag\np2789\naVarts.museum\np2790\naVmed.pl\np2791\naVpa\np2792\naVpf\np2793\naVorg.kn\np2794\naVmil.do\np2795\naVph\np2796\naVpn\np2797\naVco.tj\np2798\naVgs.svalbard.no\np2799\naVsellsyourhome.org\np2800\naVlib.md.us\np2801\naVis-an-actress.com\np2802\naVmed.sd\np2803\naVmed.sa\np2804\naVsalerno.it\np2805\naVverdal.no\np2806\naVvestre-slidre.no\np2807\naVnotteroy.no\np2808\naVk12.ny.us\np2809\naVstudent.aero\np2810\naVkopervik.no\np2811\naVpvt.ge\np2812\naVnational.museum\np2813\naVdesign.aero\np2814\naVbaidar.no\np2815\naVsteigen.no\np2816\naVnaples.it\np2817\naVmacerata.it\np2818\naV*.pg\np2819\naVsanok.pl\np2820\naVk12.me.us\np2821\naVconvent.museum\np2822\naVhanggliding.aero\np2823\naVtelekommunikation.museum\np2824\naVbalestrand.no\np2825\naVlangevag.no\np2826\naVoxford.museum\np2827\naVcc.gu.us\np2828\naV!statecouncil.om\np2829\naV*.saitama.jp\np2830\naVcaltanissetta.it\np2831\naVinfo.sd\np2832\naV*.py\np2833\naVhapmir.no\np2834\naVdyndns-blog.com\np2835\naVpittsburgh.museum\np2836\naVorg.st\np2837\naVviterbo.it\np2838\naV\\u0627\\u064a\\u0631\\u0627\\u0646\np2839\naV!pref.kyoto.jp\np2840\naVac.kr\np2841\naVj.bg\np2842\naVbo.telemark.no\np2843\naVskodje.no\np2844\naVaurskog-holand.no\np2845\naVrovno.ua\np2846\naVb?d?ddj?.no\np2847\naV?ksnes.no\np2848\naVco.kr\np2849\naVgrimstad.no\np2850\naVengerdal.no\np2851\naVind.tn\np2852\naVtysv?r.no\np2853\naVutsira.no\np2854\naVg?ivuotna.no\np2855\naVis-into-cars.com\np2856\naVis-a-linux-user.org\np2857\naVgov.vn\np2858\naVhole.no\np2859\naV\\u0438\\u043a\\u043e\\u043c.museum\np2860\naVcoop.tt\np2861\naVnord-fron.no\np2862\naVflora.no\np2863\naVmicrolight.aero\np2864\naVgol.no\np2865\naViris.arpa\np2866\naVorland.no\np2867\naVcaa.aero\np2868\naVnet.ec\np2869\naVzoological.museum\np2870\naVnet.eg\np2871\naVflesberg.no\np2872\naVrodoy.no\np2873\naVmobi\np2874\naValtai.ru\np2875\naV!city.osaka.jp\np2876\naVcampobasso.it\np2877\naVsn.cn\np2878\naVvaapste.no\np2879\naVmarker.no\np2880\naVlavagis.no\np2881\naVassisi.museum\np2882\naVmosjoen.no\np2883\naVlebtimnetz.de\np2884\naVis-gone.com\np2885\naVs?rreisa.no\np2886\naVnaturalhistory.museum\np2887\naVmc.it\np2888\naVcom.ht\np2889\naVgo.pw\np2890\naVcom.hr\np2891\naVnordre-land.no\np2892\naVcoop.br\np2893\naVgov.sg\np2894\naVlunner.no\np2895\naVsakhalin.ru\np2896\naVdyndns-ip.com\np2897\naVisteingeek.de\np2898\naVturystyka.pl\np2899\naVbl.it\np2900\naVcom.hn\np2901\naValstahaug.no\np2902\naVcom.hk\np2903\naVvillage.museum\np2904\naVomaha.museum\np2905\naVgon.pk\np2906\naVopenair.museum\np2907\naVk.se\np2908\naVnannestad.no\np2909\naVcn.ua\np2910\naVhomeunix.net\np2911\naVgrosseto.it\np2912\naVpoltava.ua\np2913\naV*.hyogo.jp\np2914\naVcc.tx.us\np2915\naVoppeg?rd.no\np2916\naV*.nagasaki.jp\np2917\naVjefferson.museum\np2918\naVschokoladen.museum\np2919\naVtr.it\np2920\naVcim.br\np2921\naVorg.lb\np2922\naVorg.lc\np2923\naVpi.it\np2924\naVirkutsk.ru\np2925\naVstange.no\np2926\naVodda.no\np2927\naVorg.lk\np2928\naVlubin.pl\np2929\naVolbiatempio.it\np2930\naVorg.tw\np2931\naVorg.lr\np2932\naVorg.ls\np2933\naVah.no\np2934\naVbiz\np2935\naVvladikavkaz.ru\np2936\naVtaranto.it\np2937\naVog.ao\np2938\naV\\u0627\\u064a\\u0631\\u0627\\u0646.ir\np2939\naVorg.ly\np2940\naVwilliamsburg.museum\np2941\naVtm.ro\np2942\naVfloro.no\np2943\naVdagestan.ru\np2944\naVbr?nn?y.no\np2945\naVsmola.no\np2946\naVlarsson.museum\np2947\naVcom.fr\np2948\naVhandson.museum\np2949\naVcrimea.ua\np2950\naVvolkenkunde.museum\np2951\naVpro.tt\np2952\naVnordreisa.no\np2953\naVtv.na\np2954\naVsunndal.no\np2955\naVlib.ia.us\np2956\naVscience-fiction.museum\np2957\naVgov.nr\np2958\naValtoadige.it\np2959\naVint.co\np2960\naVundersea.museum\np2961\naVint.ci\np2962\naVrade.no\np2963\naVsandiego.museum\np2964\naVbelgorod.ru\np2965\naVversailles.museum\np2966\naVcechire.com\np2967\naVmolde.no\np2968\naVorg.rs\np2969\naVgov.ng\np2970\naVis-a-cubicle-slave.com\np2971\naVsatx.museum\np2972\naVnt.no\np2973\naVgj?vik.no\np2974\naVgame-server.cc\np2975\naVb?.nordland.no\np2976\naVrecreation.aero\np2977\naVbritishcolumbia.museum\np2978\naVgov.sb\np2979\naVtas.au\np2980\naVamot.no\np2981\naVgo.tj\np2982\naVnewspaper.museum\np2983\naVcostume.museum\np2984\naVbamble.no\np2985\naVdontexist.com\np2986\naVhob?l.no\np2987\naVmoskenes.no\np2988\naVgb.com\np2989\naVindianapolis.museum\np2990\naV!city.chiba.jp\np2991\naV!pref.kagoshima.jp\np2992\naVfhsk.se\np2993\naVmedia.pl\np2994\naVkaluga.ru\np2995\naVsells-it.net\np2996\naVanthro.museum\np2997\naVveterinaire.fr\np2998\naVbellevue.museum\np2999\naVcommunication.museum\np3000\naV!pref.tottori.jp\np3001\naVbe\np3002\naVbf\np3003\naVbg\np3004\naVba\np3005\naVbb\np3006\naVcarbonia-iglesias.it\np3007\naVbm\np3008\naVbo\np3009\naVedu.cu\np3010\naVbi\np3011\naVbj\np3012\naVmaritime.museum\np3013\naVedu.ci\np3014\naV!pref.saga.jp\np3015\naVknowsitall.info\np3016\naVbw\np3017\naVkursk.ru\np3018\naVedu.co\np3019\naVedu.cn\np3020\naVlib.ca.us\np3021\naVlib.oh.us\np3022\naVkr.com\np3023\naVby\np3024\naVbz\np3025\naVgov.sl\np3026\naVaustin.museum\np3027\naVbajddar.no\np3028\naV*.mt\np3029\naV*.mz\np3030\naVam\np3031\naVeu.int\np3032\naVfor-more.biz\np3033\naVfin.ec\np3034\naVcody.museum\np3035\naVeid.no\np3036\naVgouv.rw\np3037\naVvicenza.it\np3038\naVsejny.pl\np3039\naV*.mm\np3040\naVmobi.gp\np3041\naVgame-host.org\np3042\naVflorida.museum\np3043\naVlinz.museum\np3044\naVchattanooga.museum\np3045\naVtananger.no\np3046\naVselfip.com\np3047\naVnb.ca\np3048\naVinfo.pl\np3049\naVupow.gov.pl\np3050\naVaca.pro\np3051\naVinfo.pk\np3052\naVfrom-vt.com\np3053\naVrad?y.no\np3054\naVstokke.no\np3055\naVfield.museum\np3056\naVinfo.pr\np3057\naVcountryestate.museum\np3058\naVstalowa-wola.pl\np3059\naVfortmissoula.museum\np3060\naVvang.no\np3061\naVns.ca\np3062\naVauthor.aero\np3063\naVpaleo.museum\np3064\naVzj.cn\np3065\naV*.qa\np3066\naVsx.cn\np3067\naVmn.us\np3068\naVcc.la.us\np3069\naVlugansk.ua\np3070\naVragusa.it\np3071\naVagr.br\np3072\naVcadaques.museum\np3073\naVint.mw\np3074\naVzgorzelec.pl\np3075\naVkarpacz.pl\np3076\naVfundacio.museum\np3077\naVwi.us\np3078\naVfredrikstad.no\np3079\naVzp.ua\np3080\naVtime.museum\np3081\naVpacific.museum\np3082\naVmil.kz\np3083\naVart.dz\np3084\naVmt.us\np3085\naVqc.com\np3086\naVmil.kr\np3087\naVlib.ny.us\np3088\naVcom.az\np3089\naVdepot.museum\np3090\naVmil.km\np3091\naV!city.kobe.jp\np3092\naV9.bg\np3093\naVarts.ro\np3094\naVmil.kg\np3095\naVoskol.ru\np3096\naVperugia.it\np3097\naVj?lster.no\np3098\naVinfo\np3099\naVlancashire.museum\np3100\naVlenvik.no\np3101\naVsirdal.no\np3102\naVcc.na\np3103\naVuz\np3104\naVadygeya.ru\np3105\naV\\u7b87\\u4eba.hk\np3106\naVus\np3107\naVequipment.aero\np3108\naVgov.ly\np3109\naVis-a-patsfan.org\np3110\naVmed.br\np3111\naVip6.arpa\np3112\naVua\np3113\naVdyndns-office.com\np3114\naVgeorgia.museum\np3115\naVboleslawiec.pl\np3116\naV*.yamaguchi.jp\np3117\naVug.gov.pl\np3118\naVpro.ec\np3119\naVeun.eg\np3120\naVsande.vestfold.no\np3121\naV\\u7db2\\u7d61.cn\np3122\naVlivinghistory.museum\np3123\naVprd.km\np3124\naVsn?sa.no\np3125\naVlans.museum\np3126\naVtm.fr\np3127\naVfuossko.no\np3128\naVchelyabinsk.ru\np3129\naVpharmacien.fr\np3130\naVkirkenes.no\np3131\naVis-a-painter.com\np3132\naVfetsund.no\np3133\naVis-a-nascarfan.com\np3134\naVjfk.museum\np3135\naVk.bg\np3136\naVk12.oh.us\np3137\naVk12.ma.us\np3138\naVlucerne.museum\np3139\naVv?ler.hedmark.no\np3140\naVfirm.nf\np3141\naVbadajoz.museum\np3142\naVhabmer.no\np3143\naV!city.saitama.jp\np3144\naVfribourg.museum\np3145\naVin.rs\np3146\naVcymru.museum\np3147\naVnalchik.ru\np3148\naVnet.vi\np3149\naVjeonbuk.kr\np3150\naVnet.an\np3151\naVnet.vc\np3152\naVlaspezia.it\np3153\naVfr?na.no\np3154\naVlarvik.no\np3155\naVinf.br\np3156\naVgov.rs\np3157\naVhomeftp.net\np3158\naVinfo.nf\np3159\naVvaler.ostfold.no\np3160\naVco.je\np3161\naVinfo.na\np3162\naVsa.com\np3163\naVgames.hu\np3164\naVtreviso.it\np3165\naVsongdalen.no\np3166\naVaquila.it\np3167\naVdeatnu.no\np3168\naVk12.or.us\np3169\naVwielun.pl\np3170\naVmissoula.museum\np3171\naVswiebodzin.pl\np3172\naVgranvin.no\np3173\naVpadova.it\np3174\naVh?nefoss.no\np3175\naVweb.lk\np3176\naVtn.it\np3177\naVlib.as.us\np3178\naVk12.pa.us\np3179\naVmil.ec\np3180\naVnet.ae\np3181\naVstarachowice.pl\np3182\naVdyndns-remote.com\np3183\naVnom.br\np3184\naVlindas.no\np3185\naVgs.st.no\np3186\naVfilm.hu\np3187\naVvi.us\np3188\naVgw\np3189\naVon-the-web.tv\np3190\naVlevanger.no\np3191\naVinf.mk\np3192\naVgs\np3193\naVgr\np3194\naVgq\np3195\naVgp\np3196\naVpomorze.pl\np3197\naVamber.museum\np3198\naVorg.mk\np3199\naVtrust.museum\np3200\naVpriv.pl\np3201\naVorg.ml\np3202\naVgy\np3203\naVorg.mn\np3204\naVgg\np3205\naVgf\np3206\naVge\np3207\naVgd\np3208\naVorg.mu\np3209\naVga\np3210\naVedu\np3211\naVgouv.ci\np3212\naVorg.mx\np3213\naVgm\np3214\naVgl\np3215\naV\\u0627\\u06cc\\u0631\\u0627\\u0646.ir\np3216\naVgi\np3217\naVgh\np3218\naVvic.edu.au\np3219\naV*.tottori.jp\np3220\naVassedic.fr\np3221\naVan.it\np3222\naV!mecon.ar\np3223\naVterni.it\np3224\naVnom.pl\np3225\naVlib.nh.us\np3226\naVusa.museum\np3227\naVmuseet.museum\np3228\naVkristiansand.no\np3229\naVdavvenjarga.no\np3230\naVgs.tr.no\np3231\naVes.kr\np3232\naVstathelle.no\np3233\naVkg.kr\np3234\naVforde.no\np3235\naVancona.it\np3236\naVdn.ua\np3237\naVin.ua\np3238\naVevje-og-hornnes.no\np3239\naVdontexist.net\np3240\naVtraniandriabarletta.it\np3241\naVnatuurwetenschappen.museum\np3242\naVostre-toten.no\np3243\naVabo.pa\np3244\naVc.la\np3245\naVb.bg\np3246\naVturek.pl\np3247\naVskydiving.aero\np3248\naVservegame.org\np3249\naVtsk.ru\np3250\naVmedecin.fr\np3251\naViron.museum\np3252\naVis-a-designer.com\np3253\naVcontemporaryart.museum\np3254\naVchildrens.museum\np3255\naV?rdal.no\np3256\naVwa.au\np3257\naVnet.do\np3258\naVnet.dm\np3259\naVelk.pl\np3260\naVmel?y.no\np3261\naVfareast.ru\np3262\naVkr?dsherad.no\np3263\naVcivilaviation.aero\np3264\naVmod.gi\np3265\naVuy.com\np3266\naV*.oita.jp\np3267\naVmalopolska.pl\np3268\naVis-lost.org\np3269\naVnarviika.no\np3270\naVnet.dz\np3271\naVsurgeonshall.museum\np3272\naVzhitomir.ua\np3273\naVfl.us\np3274\naVfrom-tn.com\np3275\naVblogdns.net\np3276\naVmielno.pl\np3277\naVguernsey.museum\np3278\naVnkz.ru\np3279\naVgrue.no\np3280\naVedu.bb\np3281\naVln.cn\np3282\naVmil.rw\np3283\naVandoy.no\np3284\naVnapoli.it\np3285\naV*.fukushima.jp\np3286\naVk12.wa.us\np3287\naVvic.gov.au\np3288\naVsex.pl\np3289\naVor.ci\np3290\naVnsk.ru\np3291\naV*.nz\np3292\naV!pref.mie.jp\np3293\naVco.pn\np3294\naVw.bg\np3295\naVcambridge.museum\np3296\naVtm.hu\np3297\naV*.np\np3298\naVheroy.nordland.no\np3299\naVgyeongnam.kr\np3300\naVfrom-nm.com\np3301\naVrnu.tn\np3302\naVnieruchomosci.pl\np3303\naV*.ni\np3304\naV\\u4e2d\\u56fd\np3305\naVor.cr\np3306\naVvet.br\np3307\naValessandria.it\np3308\naVco.pw\np3309\naVk12.tn.us\np3310\naVcom.kp\np3311\naVh?gebostad.no\np3312\naVfrom-ky.com\np3313\naVrzeszow.pl\np3314\naVtranibarlettaandria.it\np3315\naVgs.ol.no\np3316\naVcom.ky\np3317\naVcom.kz\np3318\naVsauherad.no\np3319\naVcc.pr.us\np3320\naVfyresdal.no\np3321\naVb?mlo.no\np3322\naVlib.nj.us\np3323\naVsauda.no\np3324\naVusculture.museum\np3325\naVcom.kg\np3326\naVfrom-nj.com\np3327\naVcom.ki\np3328\naV\\u0641\\u0644\\u0633\\u0637\\u064a\\u0646\np3329\naVcom.km\np3330\naVsport.hu\np3331\naVairport.aero\np3332\naVschweiz.museum\np3333\naVcc.mo.us\np3334\naVmagnitka.ru\np3335\naVmonzaedellabrianza.it\np3336\naVdyndns-at-home.com\np3337\naVmg\np3338\naVhu.com\np3339\naVcom.pt\np3340\naVsaltdal.no\np3341\naVtv.it\np3342\naVhm.no\np3343\naVk12.nh.us\np3344\naVkvinesdal.no\np3345\naVlib.vi.us\np3346\naVoystre-slidre.no\np3347\naVfrom-oh.com\np3348\naVbauern.museum\np3349\naVmielec.pl\np3350\naVmil.lv\np3351\naVpol.ht\np3352\naVtouch.museum\np3353\naVfitjar.no\np3354\naVk12.wy.us\np3355\naVcom.ps\np3356\naVamusement.aero\np3357\naV*.ehime.jp\np3358\naVforgot.his.name\np3359\naVskjak.no\np3360\naVgos.pk\np3361\naVtree.museum\np3362\naVjgora.pl\np3363\naVgov.sc\np3364\naVgob.do\np3365\naVsc.us\np3366\naVauto.pl\np3367\naVqld.edu.au\np3368\naVpress.aero\np3369\naVtextile.museum\np3370\naVfrom-ok.com\np3371\naVfortworth.museum\np3372\naVk12.fl.us\np3373\naVs.bg\np3374\naVvgs.no\np3375\naVgulen.no\np3376\naVincheon.kr\np3377\naVpt.it\np3378\naVsc.ug\np3379\naVis-slick.com\np3380\naVmedia.hu\np3381\naVvagan.no\np3382\naVo.bg\np3383\naVtranoy.no\np3384\naVint.bo\np3385\naVcom.pk\np3386\naVor.ug\np3387\naVpvt.k12.ma.us\np3388\naVsolund.no\np3389\naV\\u4e2d\\u570b\np3390\naVname.jo\np3391\naVcom.pe\np3392\naVcaserta.it\np3393\naVsettlers.museum\np3394\naVstranda.no\np3395\naVor.at\np3396\naVembaixada.st\np3397\naV\\u0627\\u0644\\u0633\\u0639\\u0648\\u062f\\u06cc\\u0629\np3398\naVnedre-eiker.no\np3399\naVcn.com\np3400\naVaerobatic.aero\np3401\naVbz.it\np3402\naVgo.ci\np3403\naVsklep.pl\np3404\naVcom.pa\np3405\naVcc.wi.us\np3406\naVasso.dz\np3407\naVbiz.tj\np3408\naVfrom-md.com\np3409\naVaremark.no\np3410\naVbroker.aero\np3411\naVor.th\np3412\naVlaw.pro\np3413\naVschlesisches.museum\np3414\naVgo.cr\np3415\naVcc.ne.us\np3416\naVgov.sd\np3417\naVsund.no\np3418\naVgov.sa\np3419\naVgov.tn\np3420\naVno.com\np3421\naVi.ph\np3422\naVis-an-entertainer.com\np3423\naVn.bg\np3424\naVis-a-cpa.com\np3425\naVlebesby.no\np3426\naV!pref.shiga.jp\np3427\naVlib.ee\np3428\naVsortland.no\np3429\naVnavigation.aero\np3430\naVgov.sy\np3431\naVdynathome.net\np3432\naVuhren.museum\np3433\naV!pref.osaka.jp\np3434\naVcom.iq\np3435\naVcanada.museum\np3436\naVgov.nc.tr\np3437\naVfrom-de.com\np3438\naV\\u0627\\u0644\\u0633\\u0639\\u0648\\u062f\\u06cc\\u06c3\np3439\naV!pref.aomori.jp\np3440\naVbadaddja.no\np3441\naVac.rs\np3442\naVloyalist.museum\np3443\naVnom.co\np3444\naVbusan.kr\np3445\naVjondal.no\np3446\naVeidsvoll.no\np3447\naV\\u653f\\u5e9c.hk\np3448\naVis-a-personaltrainer.com\np3449\naVcreation.museum\np3450\naVagrar.hu\np3451\naVculturalcenter.museum\np3452\naV*.sv\np3453\naVgc.ca\np3454\naValand.fi\np3455\naVart.do\np3456\naVmus.br\np3457\naVtrieste.it\np3458\naVdonna.no\np3459\naVfirenze.it\np3460\naVac.ug\np3461\naVsilk.museum\np3462\naVcc.wv.us\np3463\naVint.la\np3464\naVnord-odal.no\np3465\naVjl.cn\np3466\naVrakkestad.no\np3467\naVint.lk\np3468\naVcl.it\np3469\naVv.bg\np3470\naVntr.br\np3471\naVstore.st\np3472\naVtaxi.br\np3473\naVmi.it\np3474\naVac.im\np3475\naVac.in\np3476\naVbarcelona.museum\np3477\naV!pref.yamagata.jp\np3478\naVac.id\np3479\naVjpn.com\np3480\naVleka.no\np3481\naV*.fukui.jp\np3482\naVdyndns-free.com\np3483\naVgotdns.com\np3484\naVtraeumtgerade.de\np3485\naVegersund.no\np3486\naVlom.no\np3487\naVsk?nland.no\np3488\naVac.ir\np3489\naVnorilsk.ru\np3490\naVgrp.lk\np3491\naVlc\np3492\naVfrom-ne.com\np3493\naVpriv.at\np3494\naVkv.ua\np3495\naVbryne.no\np3496\naVnet.ci\np3497\naVnet.cn\np3498\naVnet.co\np3499\naVli\np3500\naVvenice.it\np3501\naVlt\np3502\naVlu\np3503\naVls\np3504\naV*.aomori.jp\np3505\naVnet.cu\np3506\naVwodzislaw.pl\np3507\naVly\np3508\naVdep.no\np3509\naVza.net\np3510\naVhistorisches.museum\np3511\naVenna.it\np3512\naVtr?gstad.no\np3513\naVmil.pl\np3514\naVab.ca\np3515\naVjuedisches.museum\np3516\naVsd.us\np3517\naVpharmaciens.km\np3518\naVbialystok.pl\np3519\naVbeeldengeluid.museum\np3520\naVtempioolbia.it\np3521\naVsweden.museum\np3522\naVshop.hu\np3523\naVshop.ht\np3524\naVlib.mi.us\np3525\naVga.us\np3526\naVlo.it\np3527\naVliving.museum\np3528\naVcom.nf\np3529\naVme.it\np3530\naVtravel.tt\np3531\naVbardu.no\np3532\naVburghof.museum\np3533\naVbr.it\np3534\naVproject.museum\np3535\naVvibovalentia.it\np3536\naVmatera.it\np3537\naVringsaker.no\np3538\naVhasvik.no\np3539\naVverona.it\np3540\naVvic.au\np3541\naVnyny.museum\np3542\naVr.bg\np3543\naVd.se\np3544\naVav.it\np3545\naVest-a-la-maison.com\np3546\naVis-into-anime.com\np3547\naVdvrdns.org\np3548\naVaurskog-h?land.no\np3549\naVz.bg\np3550\naVosen.no\np3551\naVnovosibirsk.ru\np3552\naVcom.jo\np3553\naVk12.mt.us\np3554\naVloppa.no\np3555\naVasso.km\np3556\naVstateofdelaware.museum\np3557\naVleirvik.no\np3558\naVag.it\np3559\naVtrd.br\np3560\naVcci.fr\np3561\naVaveroy.no\np3562\naVlur?y.no\np3563\naVczeladz.pl\np3564\naVmanchester.museum\np3565\naVlib.ut.us\np3566\naVhadsel.no\np3567\naV*.yokohama.jp\np3568\naVmasfjorden.no\np3569\naVkrokstadelva.no\np3570\naViki.fi\np3571\naVstj?rdalshalsen.no\np3572\naVwegrow.pl\np3573\naVnewport.museum\np3574\naVarq.br\np3575\naVlib.sc.us\np3576\naVgiehtavuoatna.no\np3577\naVtourism.pl\np3578\naVcorreios-e-telecomunica??es.museum\np3579\naVco.gy\np3580\naV!city.okayama.jp\np3581\naVradom.pl\np3582\naVjus.br\np3583\naVar.it\np3584\naVorg.na\np3585\naVtsaritsyn.ru\np3586\naVcomputerhistory.museum\np3587\naVvyatka.ru\np3588\naVtonsberg.no\np3589\naVgouv.bj\np3590\naVcrew.aero\np3591\naVnl.no\np3592\naVw.se\np3593\naV!city.sapporo.jp\np3594\naVco.gg\np3595\naVagents.aero\np3596\naVorg.nr\np3597\naV?l.no\np3598\naV!pref.wakayama.jp\np3599\naVemp.br\np3600\naVsiracusa.it\np3601\naVlib.ok.us\np3602\naV!pref.gunma.jp\np3603\naVbir.ru\np3604\naVbaltimore.museum\np3605\naVmonmouth.museum\np3606\naVcc.ny.us\np3607\naVrec.nf\np3608\naVh?pmir.no\np3609\naV*.au\np3610\naVgausdal.no\np3611\naV!pref.chiba.jp\np3612\naVlib.id.us\np3613\naVgov.lt\np3614\naVtime.no\np3615\naVgov.lv\np3616\naVed.ao\np3617\naVar.us\np3618\naVanthropology.museum\np3619\naVskiptvet.no\np3620\naVvaroy.no\np3621\naVgov.lk\np3622\naVor.tz\np3623\naVkraanghke.no\np3624\naVsimple-url.com\np3625\naVsci.eg\np3626\naVgov.lb\np3627\naVgov.lc\np3628\naVedu.ac\np3629\naVholmestrand.no\np3630\naVid.ly\np3631\naVedu.af\np3632\naVgsm.pl\np3633\naVpistoia.it\np3634\naVcc.ia.us\np3635\naVszkola.pl\np3636\naVid.lv\np3637\naVedu.an\np3638\naVkirov.ru\np3639\naVedu.al\np3640\naVpescara.it\np3641\naVorg.tj\np3642\naVfarmequipment.museum\np3643\naVedu.az\np3644\naVslask.pl\np3645\naVas.us\np3646\naVnationalfirearms.museum\np3647\naVnm.cn\np3648\naVskedsmo.no\np3649\naVnesset.no\np3650\naVsimbirsk.ru\np3651\naVsz\np3652\naVr?hkker?vju.no\np3653\naVcom.ee\np3654\naVsy\np3655\naVengine.aero\np3656\naVmemorial.museum\np3657\naVkvinnherad.no\np3658\naVis-a-socialist.com\np3659\naVinsurance.aero\np3660\naVsandnes.no\np3661\naVvennesla.no\np3662\naVh?ylandet.no\np3663\naVkg\np3664\naVs?r-odal.no\np3665\naVk12.ri.us\np3666\naVpaderborn.museum\np3667\naVse.net\np3668\naVlib.tn.us\np3669\naV*.om\np3670\naVhomedns.org\np3671\naVsr\np3672\naVbahcavuotna.no\np3673\naVwhaling.museum\np3674\naVvardo.no\np3675\naVdyndns-home.com\np3676\naVor.bi\np3677\naVnewhampshire.museum\np3678\naVscrapping.cc\np3679\naVtromso.no\np3680\naVrochester.museum\np3681\naVot.it\np3682\naVlg.ua\np3683\naVmo-i-rana.no\np3684\naVlutsk.ua\np3685\naVkviteseid.no\np3686\naV!nhs.uk\np3687\naVskoczow.pl\np3688\naVlib.il.us\np3689\naVadv.br\np3690\naVeducational.museum\np3691\naVbelluno.it\np3692\naVperso.tn\np3693\naVst\np3694\naVandriabarlettatrani.it\np3695\naVcesena-forli.it\np3696\naVgov.bt\np3697\naVgov.br\np3698\naVgov.bs\np3699\naVullensvang.no\np3700\naVjournalism.museum\np3701\naVstore.ro\np3702\naVis-a-techie.com\np3703\naVgov.bz\np3704\naVsi\np3705\naVarezzo.it\np3706\naVgov.bf\np3707\naVamli.no\np3708\naVsh\np3709\naVgov.bb\np3710\naVbv.nl\np3711\naVvt.it\np3712\naVgov.ba\np3713\naVgov.bo\np3714\naVgov.bm\np3715\naVreggio-calabria.it\np3716\naVgov.bh\np3717\naV!pref.niigata.jp\np3718\naVbalsfjord.no\np3719\naVrennebu.no\np3720\naVisa-hockeynut.com\np3721\naVgu.us\np3722\naVcinema.museum\np3723\naVedu.ws\np3724\naVk12.ak.us\np3725\naVdynalias.net\np3726\naVlocalhistory.museum\np3727\naVkms.ru\np3728\naVpenza.ru\np3729\naVselfip.net\np3730\naVmatta-varjjat.no\np3731\naVaq.it\np3732\naVco.at\np3733\naVmidatlantic.museum\np3734\naVsciencecenters.museum\np3735\naVsch.gg\np3736\naVminnesota.museum\np3737\naVcc.id.us\np3738\naVvt.us\np3739\naVkamchatka.ru\np3740\naVmonza-brianza.it\np3741\naV*.yamanashi.jp\np3742\naVgob.es\np3743\naVnt.edu.au\np3744\naVmonticello.museum\np3745\naVkurgan.ru\np3746\naVsg\np3747\naVedu.ps\np3748\naVroyken.no\np3749\naVjx.cn\np3750\naVis-an-artist.com\np3751\naV!pref.oita.jp\np3752\naVgeometre-expert.fr\np3753\naVgob.ec\np3754\naVblog.br\np3755\naVne.pw\np3756\naVbio.br\np3757\naVdonetsk.ua\np3758\naVstadt.museum\np3759\naVwestern.museum\np3760\naVpo.it\np3761\naVlivorno.it\np3762\naVfhs.no\np3763\naVasnes.no\np3764\naVlandes.museum\np3765\naVpesaro-urbino.it\np3766\naV!nawras.om\np3767\naVorg.pn\np3768\naVweb.pk\np3769\naVfreight.aero\np3770\naVva\np3771\naVlc.it\np3772\naVhol.no\np3773\naVchiropractic.museum\np3774\naVorg.pl\np3775\naVprd.mg\np3776\naVcorvette.museum\np3777\naVartcenter.museum\np3778\naVzt.ua\np3779\naVis-uberleet.com\np3780\naVe.se\np3781\naVnesna.no\np3782\naVfrana.no\np3783\naVkicks-ass.org\np3784\naVorg.pk\np3785\naVmuncie.museum\np3786\naVindianmarket.museum\np3787\naVgov.tj\np3788\naVorg.ph\np3789\naVbrandywinevalley.museum\np3790\naV!omanpost.om\np3791\naVbushey.museum\np3792\naVlocal\np3793\naVcremona.it\np3794\naVnet.tw\np3795\naVweb.nf\np3796\naVholt?len.no\np3797\naVszczecin.pl\np3798\naVis-a-student.com\np3799\naVjevnaker.no\np3800\naVyosemite.museum\np3801\naVgov.pk\np3802\naVgov.pl\np3803\naVorkanger.no\np3804\naVgov.pn\np3805\naVfm.no\np3806\naVcampidano-medio.it\np3807\naVreggiocalabria.it\np3808\naVmuos?t.no\np3809\naVgov.pt\np3810\naVgdansk.pl\np3811\naVinfo.la\np3812\naVeti.br\np3813\naVpotenza.it\np3814\naVluzern.museum\np3815\naVnet.th\np3816\naVdyndns-work.com\np3817\naVintl.tn\np3818\naV!pref.yamanashi.jp\np3819\naVedu.ph\np3820\naVfrom-sd.com\np3821\naVmil.gh\np3822\naVmil.ge\np3823\naVhaugesund.no\np3824\naVcc.nd.us\np3825\naVvestre-toten.no\np3826\naVrockart.museum\np3827\naVaquarium.museum\np3828\naVtank.museum\np3829\naVdynalias.org\np3830\naVdaejeon.kr\np3831\naVvalle.no\np3832\naVgreta.fr\np3833\naVpodzone.org\np3834\naVrennesoy.no\np3835\naVbrussels.museum\np3836\naVis-a-bruinsfan.org\np3837\naVvirtuel.museum\np3838\naVomsk.ru\np3839\naVmr.no\np3840\naVpe.it\np3841\naVis-a-bulls-fan.com\np3842\naVorg.ws\np3843\naVisa-geek.org\np3844\naValaheadju.no\np3845\naVopole.pl\np3846\naV?vre-eiker.no\np3847\naVgs.cn\np3848\naVskaun.no\np3849\naVskj?k.no\np3850\naVcommunications.museum\np3851\naVnaturalhistorymuseum.museum\np3852\naVfarm.museum\np3853\naVcc.mt.us\np3854\naVcb.it\np3855\naVutazas.hu\np3856\naVjudaica.museum\np3857\naV!pref.kumamoto.jp\np3858\naVk12.ky.us\np3859\naVac.ng\np3860\naVlabor.museum\np3861\naVpro.pr\np3862\naVbarum.no\np3863\naVfrom-nd.com\np3864\naVcc.nv.us\np3865\naVsokndal.no\np3866\naVnet.ba\np3867\naVexperts-comptables.fr\np3868\naVnet.bb\np3869\naVnet.bh\np3870\naVla\np3871\naVnet.bm\np3872\naVkherson.ua\np3873\naVnet.bo\np3874\naVraisa.no\np3875\naVdnsdojo.org\np3876\naVnet.bs\np3877\naVnet.br\np3878\naVnet.bt\np3879\naVarna.no\np3880\naVe-burg.ru\np3881\naVgr.it\np3882\naVxj.cn\np3883\naVnet.bz\np3884\naVsafety.aero\np3885\naVla-spezia.it\np3886\naVedu.pk\np3887\naVyamal.ru\np3888\naVci\np3889\naVch\np3890\naVco\np3891\naVcn\np3892\naVcm\np3893\naVcl\np3894\naVcc\np3895\naVca\np3896\naVcg\np3897\naVcf\np3898\naVcd\np3899\naVcz\np3900\naVcx\np3901\naVkrodsherad.no\np3902\naV*.tochigi.jp\np3903\naVcr\np3904\naVk12.az.us\np3905\naVcv\np3906\naVcu\np3907\naVtambov.ru\np3908\naVorg.ae\np3909\naVlv\np3910\naVorg.ag\np3911\naVorg.af\np3912\naVco.rs\np3913\naVs?l?t.no\np3914\naVorg.ac\np3915\naVlebork.pl\np3916\naVorg.al\np3917\naVorg.an\np3918\naVorg.ai\np3919\naVnavuotna.no\np3920\naVint.ru\np3921\naVbindal.no\np3922\naV\\u0628\\u06be\\u0627\\u0631\\u062a\np3923\naVlindesnes.no\np3924\naVch.it\np3925\naVorg.az\np3926\naVcom.mx\np3927\naVcom.my\np3928\naVgdynia.pl\np3929\naVmo.cn\np3930\naVparachuting.aero\np3931\naVk12.md.us\np3932\naVcom.mv\np3933\naVchildrensgarden.museum\np3934\naVha.cn\np3935\naVcom.mk\np3936\naVcom.mo\np3937\naVcom.ml\np3938\naVtrading.aero\np3939\naVmanx.museum\np3940\naVcom.mg\np3941\naVchambagri.fr\np3942\naVoregontrail.museum\np3943\naVos?yro.no\np3944\naVfroland.no\np3945\naVkalisz.pl\np3946\naVlib.gu.us\np3947\naVlib.vt.us\np3948\naVgs.oslo.no\np3949\naVkunst.museum\np3950\naVteo.br\np3951\naVfranziskaner.museum\np3952\naVat-band-camp.net\np3953\naVorg.ru\np3954\naVdali.museum\np3955\naVmoney.museum\np3956\naVsibenik.museum\np3957\naVrindal.no\np3958\naV\\u0633\\u0648\\u0631\\u064a\\u0627\np3959\naVask?y.no\np3960\naVtra.kp\np3961\naVhalden.no\np3962\naVvg\np3963\naVrotorcraft.aero\np3964\naVvi\np3965\naVbjark?y.no\np3966\naVmil.ph\np3967\naVtimekeeping.museum\np3968\naVcc.pa.us\np3969\naVjeju.kr\np3970\naVstation.museum\np3971\naVvu\np3972\naVpubol.museum\np3973\naVbiz.tt\np3974\naVdlugoleka.pl\np3975\naV*.tokyo.jp\np3976\naVsociety.museum\np3977\naVdolls.museum\np3978\naVbeskidy.pl\np3979\naVpr.it\np3980\naVmosvik.no\np3981\naVad.jp\np3982\naVdoomdns.org\np3983\naVkvitsoy.no\np3984\naVkarlsoy.no\np3985\naVlajolla.museum\np3986\naVcc.ak.us\np3987\naVvlaanderen.museum\np3988\naVmed.ec\np3989\naVmed.ee\np3990\naVgob.bo\np3991\naVprzeworsk.pl\np3992\naVgov.my\np3993\naVchuvashia.ru\np3994\naVhurdal.no\np3995\naVhjartdal.no\np3996\naVgov.mr\np3997\naVgov.mw\np3998\naVarts.co\np3999\naVerotika.hu\np4000\naVr?st.no\np4001\naVgov.mk\np4002\naVis-a-therapist.com\np4003\naVposts-and-telecommunications.museum\np4004\naVgov.mo\np4005\naVgov.mn\np4006\naV*.bd\np4007\naVgov.ml\np4008\naVname.hr\np4009\naVqld.au\np4010\naVgov.ma\np4011\naVmil.pe\np4012\naV*.bn\np4013\naVaid.pl\np4014\naVgov.me\np4015\naVva.it\np4016\naVasso.fr\np4017\naVcc.sd.us\np4018\naVmazowsze.pl\np4019\naVedu.ng\np4020\naVpa.it\np4021\naVwloclawek.pl\np4022\naVrns.tn\np4023\naVerotica.hu\np4024\naVhomelinux.net\np4025\naVfuel.aero\np4026\naVfjaler.no\np4027\naVoregon.museum\np4028\naVedu.nr\np4029\naVdrammen.no\np4030\naVmodern.museum\np4031\naVne.ug\np4032\naVaudnedaln.no\np4033\naVnet.st\np4034\naVde.us\np4035\naVworks.aero\np4036\naVorskog.no\np4037\naVexchange.aero\np4038\naVco.th\np4039\naVhagebostad.no\np4040\naVgs.rl.no\np4041\naVfrom-ct.com\np4042\naVnet.sa\np4043\naVcc.de.us\np4044\naVaeroclub.aero\np4045\naVact.au\np4046\naVcc.nc.us\np4047\naVfj.cn\np4048\naVkirovograd.ua\np4049\naVlib.nd.us\np4050\naVmjondalen.no\np4051\naVbilbao.museum\np4052\naVws.na\np4053\naVnet.sl\np4054\naVnom.es\np4055\naVis-a-hunter.com\np4056\naVpol.dz\np4057\naVngo.lk\np4058\naVvr.it\np4059\naVnorfolk.museum\np4060\naV!pref.fukuoka.jp\np4061\naVpa.us\np4062\naVrost.no\np4063\naVhe.cn\np4064\naVservebbs.org\np4065\naVwy.us\np4066\naVmo?reke.no\np4067\naVfrom-ar.com\np4068\naVpyatigorsk.ru\np4069\naVlib.ne.us\np4070\naVseljord.no\np4071\naVgob.pk\np4072\naVgob.pe\np4073\naVushuaia.museum\np4074\naVgob.pa\np4075\naVlahppi.no\np4076\naV?snes.no\np4077\naVddr.museum\np4078\naVmuseum.tt\np4079\naVeven?\\u0161\\u0161i.no\np4080\naVfrom-az.net\np4081\naVilawa.pl\np4082\naV!pref.kochi.jp\np4083\naVgov.cu\np4084\naVk?fjord.no\np4085\naVfoggia.it\np4086\naVleikanger.no\np4087\naVgov.cx\np4088\naVk12.sc.us\np4089\naVgov.cd\np4090\naVkchr.ru\np4091\naVfusa.no\np4092\naVgov.cm\np4093\naVgov.cl\np4094\naVgov.co\np4095\naVgov.cn\np4096\naVnd.us\np4097\naVoff.ai\np4098\naVboston.museum\np4099\naV*.kitakyushu.jp\np4100\naVfinearts.museum\np4101\naVcc.nh.us\np4102\naVgrozny.ru\np4103\naVemergency.aero\np4104\naVno.it\np4105\naVk12.ec\np4106\naVso.it\np4107\naV*.yamagata.jp\np4108\naVis-saved.org\np4109\naV\\u0627\\u0644\\u062c\\u0632\\u0627\\u0626\\u0631\np4110\naVnet.al\np4111\naVworkinggroup.aero\np4112\naVin.us\np4113\naVnet.ai\np4114\naVpri.ee\np4115\naVra.it\np4116\naVnet.af\np4117\naVnet.ag\np4118\naVnet.ac\np4119\naVmill.museum\np4120\naVnet.az\np4121\naVhi.cn\np4122\naVfolkebibl.no\np4123\naVrauma.no\np4124\naVpress.ma\np4125\naVmil.ru\np4126\naVconsulting.aero\np4127\naVpro.br\np4128\naVbus.museum\np4129\naVk12.vi\np4130\naVunsa.ba\np4131\naVcc.il.us\np4132\naVcivilisation.museum\np4133\naVbirdart.museum\np4134\naVsaotome.st\np4135\naVdnsalias.net\np4136\naVbjugn.no\np4137\naVsaskatchewan.museum\np4138\naV!pref.toyama.jp\np4139\naVvoss.no\np4140\naVlib.wv.us\np4141\naVlib.va.us\np4142\naVamerican.museum\np4143\naVpt\np4144\naV\\u0627\\u0644\\u064a\\u0645\\u0646\np4145\naVklodzko.pl\np4146\naVlodingen.no\np4147\naVk12.as.us\np4148\naVinfo.mv\np4149\naVosoyro.no\np4150\naVcz.it\np4151\naVmeland.no\np4152\naVis-with-theband.com\np4153\naV!metro.tokyo.jp\np4154\naVgangaviika.no\np4155\naVringerike.no\np4156\naVms.kr\np4157\naVgo.tz\np4158\naVtrainer.aero\np4159\naVusantiques.museum\np4160\naVskien.no\np4161\naVcom.lr\np4162\naVtrento.it\np4163\naVasti.it\np4164\naVcom.lv\np4165\naVgo.th\np4166\naVcom.lk\np4167\naVtexas.museum\np4168\naVmragowo.pl\np4169\naVcom.la\np4170\naVcom.lc\np4171\naVcom.lb\np4172\naVkvanangen.no\np4173\naVal.no\np4174\naVpors?\\u014bgu.no\np4175\naVaarborte.no\np4176\naVmuseum.mv\np4177\naV?laheadju.no\np4178\naVmuseum\np4179\naVski.no\np4180\naVdnepropetrovsk.ua\np4181\naVbologna.it\np4182\naVtg\np4183\naVcc.nj.us\np4184\naVnet.to\np4185\naVessex.museum\np4186\naVdyroy.no\np4187\naVkomforb.se\np4188\naVorg.pt\np4189\naVkvafjord.no\np4190\naVorg.pr\np4191\naVorg.ps\np4192\naVli.it\np4193\naVhr\np4194\naVclinton.museum\np4195\naViveland.no\np4196\naVpe\np4197\naVht\np4198\naVhu\np4199\naVorg.pf\np4200\naVhk\np4201\naVpriv.me\np4202\naVorg.pe\np4203\naVhn\np4204\naVco.ao\np4205\naVnet.tn\np4206\naVhm\np4207\naVfjell.no\np4208\naVhk.cn\np4209\naVwashingtondc.museum\np4210\naVfinland.museum\np4211\naVco.ag\np4212\naV*.toyama.jp\np4213\naVco.ae\np4214\naVs?rum.no\np4215\naVburyatia.ru\np4216\naVbialowieza.pl\np4217\naVtp.it\np4218\naVpl\np4219\naV\\u0627\\u0644\\u0627\\u0631\\u062f\\u0646\np4220\naV*.wakayama.jp\np4221\naVwarmia.pl\np4222\naVs?r-varanger.no\np4223\naVk12.nj.us\np4224\naVk12.ga.us\np4225\naV*.cy\np4226\naVed.ci\np4227\naVint\np4228\naVbedzin.pl\np4229\naV!city.nagoya.jp\np4230\naVri.us\np4231\naVgov.tw\np4232\naV*.ck\np4233\naVstore.bb\np4234\naVnamsos.no\np4235\naVfrom-dc.com\np4236\naVhitra.no\np4237\naVlib.la.us\np4238\naVed.cr\np4239\naVnationalheritage.museum\np4240\naV\\u092d\\u093e\\u0930\\u0924\np4241\naVg?ls?.no\np4242\naVkunstsammlung.museum\np4243\naVchieti.it\np4244\naVnot.br\np4245\naVasso.gp\np4246\naV\\u53f0\\u7063\np4247\naVcity.hu\np4248\naVmedia.museum\np4249\naV*.fukuoka.jp\np4250\naVsykkylven.no\np4251\naVkl?bu.no\np4252\naVaejrie.no\np4253\naVstavropol.ru\np4254\naVnikolaev.ua\np4255\naVnotaires.fr\np4256\naVxxx\np4257\naVscientist.aero\np4258\naVhomeftp.org\np4259\naVgs.of.no\np4260\naVtopology.museum\np4261\naVexpress.aero\np4262\naVnet.tj\np4263\naVboldlygoingnowhere.org\np4264\naVse.com\np4265\naVravenna.it\np4266\naVcq.cn\np4267\naVhobby-site.org\np4268\naVmonzaebrianza.it\np4269\naVnet.pt\np4270\naVorg.bz\np4271\naV*.iwate.jp\np4272\naVsells-for-u.com\np4273\naVorg.ba\np4274\naVorg.bb\np4275\naVco.st\np4276\naVbari.it\np4277\naVvarggat.no\np4278\naVorg.bh\np4279\naVorg.bi\np4280\naVco.sz\np4281\naV!icnet.uk\np4282\naVorg.bm\np4283\naVorg.bo\np4284\naVorg.br\np4285\naVfrom.hr\np4286\naVorg.bt\np4287\naVorg.bw\np4288\naV*.tr\np4289\naVpz.it\np4290\naVspace-to-rent.com\np4291\naVgildesk?l.no\np4292\naVdomain\np4293\naVvirtual\np4294\natRp4295\n.\n"
  },
  {
    "path": "thirdparty_libs/tldextract/LICENSE",
    "content": "Copyright (c) 2013, John Kurkowski\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * The names of its contributors may not be used to endorse or promote\n      products derived from this software without specific prior written\n      permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL JOHN KURKOWSKI BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "thirdparty_libs/tldextract/README.md",
    "content": "# Python Module\n\n`tldextract` accurately separates the gTLD or ccTLD (generic or country code\ntop-level domain) from the registered domain and subdomains of a URL. For\nexample, say you want just the 'google' part of 'http://www.google.com'.\n\n*Everybody gets this wrong.* Splitting on the '.' and taking the last 2\nelements goes a long way only if you're thinking of simple e.g. .com\ndomains. Think parsing\n[http://forums.bbc.co.uk](http://forums.bbc.co.uk) for example: the naive\nsplitting method above will give you 'co' as the domain and 'uk' as the TLD,\ninstead of 'bbc' and 'co.uk' respectively.\n\n`tldextract` on the other hand knows what all gTLDs and ccTLDs look like by\nlooking up the currently living ones according to\n[the Public Suffix List](http://www.publicsuffix.org). So,\ngiven a URL, it knows its subdomain from its domain, and its domain from its\ncountry code.\n\n    >>> import tldextract\n    >>> tldextract.extract('http://forums.news.cnn.com/')\n    ExtractResult(subdomain='forums.news', domain='cnn', suffix='com')\n    >>> tldextract.extract('http://forums.bbc.co.uk/') # United Kingdom\n    ExtractResult(subdomain='forums', domain='bbc', suffix='co.uk')\n    >>> tldextract.extract('http://www.worldbank.org.kg/') # Kyrgyzstan\n    ExtractResult(subdomain='www', domain='worldbank', suffix='org.kg')\n\n`ExtractResult` is a namedtuple, so it's simple to access the parts you want.\n\n    >>> ext = tldextract.extract('http://forums.bbc.co.uk')\n    >>> ext.domain\n    'bbc'\n    >>> '.'.join(ext[:2]) # rejoin subdomain and domain\n    'forums.bbc'\n\nThis module started by implementing the chosen answer from [this StackOverflow question on\ngetting the \"domain name\" from a URL](http://stackoverflow.com/questions/569137/how-to-get-domain-name-from-url/569219#569219).\nHowever, the proposed regex solution doesn't address many country codes like\ncom.au, or the exceptions to country codes like the registered domain\nparliament.uk. The Public Suffix List does, and so does this module.\n\n## Installation\n\nLatest release on PyPI:\n\n    $ pip install tldextract\n\nOr the latest dev version:\n\n    $ pip install -e git://github.com/john-kurkowski/tldextract.git#egg=tldextract\n\nCommand-line usage, splits the url components by space:\n\n    $ tldextract http://forums.bbc.co.uk\n    forums bbc co.uk\n\nRun tests:\n\n    $ python -m tldextract.tests.all\n\n## Note About Caching & Advanced Usage\n\nBeware when first running the module, it updates its TLD list with a live HTTP\nrequest. This updated TLD set is cached indefinitely in\n`/path/to/tldextract/.tld_set`.\n\n(Arguably runtime bootstrapping like that shouldn't be the default behavior,\nlike for production systems. But I want you to have the latest TLDs, especially\nwhen I haven't kept this code up to date.)\n\nTo avoid this fetch or control the cache's location, use your own extract\ncallable by setting TLDEXTRACT_CACHE environment variable or by setting the\ncache_file path in TLDExtract initialization.\n\n    # extract callable that falls back to the included TLD snapshot, no live HTTP fetching\n    no_fetch_extract = tldextract.TLDExtract(fetch=False)\n    no_fetch_extract('http://www.google.com')\n\n    # extract callable that reads/writes the updated TLD set to a different path\n    custom_cache_extract = tldextract.TLDExtract(cache_file='/path/to/your/cache/file')\n    custom_cache_extract('http://www.google.com')\n\nIf you want to stay fresh with the TLD definitions--though they don't change\noften--delete the cache file occasionally, or run\n\n    tldextract --update\n\nor:\n\n    env TLDEXTRACT_CACHE=\"~/tldextract.cache\" tldextract --update\n\nIt is also recommended to delete the file after upgrading this lib.\n\n# Public API\n\nI know it's just one method, but I've needed this functionality in a few\nprojects and programming languages, so I've uploaded\n[`tldextract` to App Engine](http://tldextract.appspot.com/). It's there on\nGAE's free pricing plan until Google cuts it off. Just hit it with\nyour favorite HTTP client with the URL you want parsed like so:\n\n    $ curl \"http://tldextract.appspot.com/api/extract?url=http://www.bbc.co.uk/foo/bar/baz.html\"\n    {\"domain\": \"bbc\", \"subdomain\": \"www\", \"suffix\": \"co.uk\"}\n\n"
  },
  {
    "path": "thirdparty_libs/tldextract/__init__.py",
    "content": "from .tldextract import extract, TLDExtract\n\n__version__ = \"1.2\"\n"
  },
  {
    "path": "thirdparty_libs/tldextract/tldextract.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"`tldextract` accurately separates the gTLD or ccTLD (generic or country code\ntop-level domain) from the registered domain and subdomains of a URL.\n\n    >>> import tldextract\n    >>> tldextract.extract('http://forums.news.cnn.com/')\n    ExtractResult(subdomain='forums.news', domain='cnn', suffix='com')\n    >>> tldextract.extract('http://forums.bbc.co.uk/') # United Kingdom\n    ExtractResult(subdomain='forums', domain='bbc', suffix='co.uk')\n    >>> tldextract.extract('http://www.worldbank.org.kg/') # Kyrgyzstan\n    ExtractResult(subdomain='www', domain='worldbank', suffix='org.kg')\n\n`ExtractResult` is a namedtuple, so it's simple to access the parts you want.\n\n    >>> ext = tldextract.extract('http://forums.bbc.co.uk')\n    >>> ext.domain\n    'bbc'\n    >>> '.'.join(ext[:2]) # rejoin subdomain and domain\n    'forums.bbc'\n\"\"\"\n\nfrom __future__ import with_statement\ntry:\n    import cPickle as pickle\nexcept ImportError:\n    import pickle\nimport errno\nfrom functools import wraps\nimport logging\nfrom operator import itemgetter\nimport os\nimport sys\nimport warnings\n\n#try:\n    #import pkg_resources\n#except ImportError:\nif 1:\n    class pkg_resources(object):\n        \"\"\"Fake pkg_resources interface which falls back to getting resources\n        inside `tldextract`'s directory.\n        \"\"\"\n        @classmethod\n        def resource_stream(cls, package, resource_name):\n            moddir = os.path.dirname(__file__)\n            f = os.path.join(moddir, resource_name)\n            return open(f)\n\nimport re\nimport socket\ntry: # pragma: no cover\n    # Python 2\n    from urllib2 import urlopen, URLError\n    from urlparse import scheme_chars\nexcept ImportError: # pragma: no cover\n    # Python 3\n    from urllib.request import urlopen\n    from urllib.error import URLError\n    from urllib.parse import scheme_chars\n    unicode = str\n\nLOG = logging.getLogger(\"tldextract\")\n\nSCHEME_RE = re.compile(r'^([' + scheme_chars + ']+:)?//')\nIP_RE = re.compile(r'^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$')\n\nclass ExtractResult(tuple):\n    'ExtractResult(subdomain, domain, suffix)'\n    __slots__ = ()\n    _fields = ('subdomain', 'domain', 'suffix')\n\n    def __new__(_cls, subdomain, domain, suffix):\n        'Create new instance of ExtractResult(subdomain, domain, suffix)'\n        return tuple.__new__(_cls, (subdomain, domain, suffix))\n\n    @classmethod\n    def _make(cls, iterable, new=tuple.__new__, len=len):\n        'Make a new ExtractResult object from a sequence or iterable'\n        result = new(cls, iterable)\n        if len(result) != 3:\n            raise TypeError('Expected 3 arguments, got %d' % len(result))\n        return result\n\n    def __repr__(self):\n        'Return a nicely formatted representation string'\n        return 'ExtractResult(subdomain=%r, domain=%r, suffix=%r)' % self\n\n    def _asdict(self):\n        'Return a new dict which maps field names to their values'\n        base_zip = zip(self._fields, self)\n        zipped = base_zip + [('tld', self.tld)]\n        return dict(zipped)\n\n    def _replace(_self, **kwds):\n        'Return a new ExtractResult object replacing specified fields with new values'\n        result = _self._make(map(kwds.pop, ('subdomain', 'domain', 'suffix'), _self))\n        if kwds:\n            raise ValueError('Got unexpected field names: %r' % kwds.keys())\n        return result\n\n    def __getnewargs__(self):\n        'Return self as a plain tuple.  Used by copy and pickle.'\n        return tuple(self)\n\n    subdomain = property(itemgetter(0), doc='Alias for field number 0')\n    domain = property(itemgetter(1), doc='Alias for field number 1')\n    suffix = property(itemgetter(2), doc='Alias for field number 2')\n\n    @property\n    def tld(self):\n      warnings.warn('This use of tld is misleading. Use `suffix` instead.', DeprecationWarning)\n      return self.suffix\n\n    @property\n    def registered_domain(self):\n      \"\"\"\n      Joins the domain and suffix fields with a dot, if they're both set.\n\n      >>> extract('http://forums.bbc.co.uk').registered_domain\n      'bbc.co.uk'\n      >>> extract('http://localhost:8080').registered_domain\n      ''\n      \"\"\"\n      if self.domain and self.suffix:\n          return self.domain + '.' + self.suffix\n      return ''\n\nclass TLDExtract(object):\n    def __init__(self, fetch=True, cache_file=''):\n        \"\"\"\n        Constructs a callable for extracting subdomain, domain, and TLD\n        components from a URL.\n\n        If fetch is True (the default) and no cached TLD set is found, this\n        extractor will fetch TLD sources live over HTTP on first use. Set to\n        False to not make HTTP requests. Either way, if the TLD set can't be\n        read, the module will fall back to the included TLD set snapshot.\n\n        Specifying cache_file will override the location of the TLD set.\n        Defaults to /path/to/tldextract/.tld_set.\n\n        \"\"\"\n        self.fetch = fetch\n        self.cache_file = os.path.expanduser(cache_file or\n            os.environ.get(\"TLDEXTRACT_CACHE\",\n                os.path.join(os.path.dirname(__file__), '.tld_set')))\n        self._extractor = None\n\n    def __call__(self, url):\n        \"\"\"\n        Takes a string URL and splits it into its subdomain, domain, and\n        gTLD/ccTLD component.\n\n        >>> extract = TLDExtract()\n        >>> extract('http://forums.news.cnn.com/')\n        ExtractResult(subdomain='forums.news', domain='cnn', suffix='com')\n        >>> extract('http://forums.bbc.co.uk/')\n        ExtractResult(subdomain='forums', domain='bbc', suffix='co.uk')\n        \"\"\"\n        netloc = SCHEME_RE.sub(\"\", url) \\\n          .partition(\"/\")[0] \\\n          .partition(\"?\")[0] \\\n          .partition(\"#\")[0] \\\n          .split(\"@\")[-1] \\\n          .partition(\":\")[0] \\\n          .rstrip(\".\")\n\n        registered_domain, tld = self._get_tld_extractor().extract(netloc)\n        if not tld and netloc and netloc[0].isdigit():\n            try:\n                is_ip = socket.inet_aton(netloc)\n                return ExtractResult('', netloc, '')\n            except AttributeError:\n                if IP_RE.match(netloc):\n                    return ExtractResult('', netloc, '')\n            except socket.error:\n                pass\n\n        subdomain, _, domain = registered_domain.rpartition('.')\n        return ExtractResult(subdomain, domain, tld)\n\n    def update(self, fetch_now=False):\n        if os.path.exists(self.cache_file):\n            os.unlink(self.cache_file)\n        self._extractor = None\n        if fetch_now:\n            self._get_tld_extractor()\n\n    def _get_tld_extractor(self):\n        if self._extractor:\n            return self._extractor\n\n        cached_file = self.cache_file\n        try:\n            with open(cached_file) as f:\n                self._extractor = _PublicSuffixListTLDExtractor(pickle.load(f))\n                return self._extractor\n        except IOError as ioe:\n            file_not_found = ioe.errno == errno.ENOENT\n            if not file_not_found:\n              LOG.error(\"error reading TLD cache file %s: %s\", cached_file, ioe)\n        except Exception as ex:\n            LOG.error(\"error reading TLD cache file %s: %s\", cached_file, ex)\n\n        tlds = frozenset()\n        if self.fetch:\n            tld_sources = (_PublicSuffixListSource,)\n            tlds = frozenset(tld for tld_source in tld_sources for tld in tld_source())\n\n        if not tlds:\n            with pkg_resources.resource_stream(__name__, '.tld_set_snapshot') as snapshot_file:\n                self._extractor = _PublicSuffixListTLDExtractor(pickle.load(snapshot_file))\n                return self._extractor\n\n        LOG.info(\"computed TLDs: [%s, ...]\", ', '.join(list(tlds)[:10]))\n        if LOG.isEnabledFor(logging.DEBUG):\n            import difflib\n            with pkg_resources.resource_stream(__name__, '.tld_set_snapshot') as snapshot_file:\n                snapshot = sorted(pickle.load(snapshot_file))\n            new = sorted(tlds)\n            for line in difflib.unified_diff(snapshot, new, fromfile=\".tld_set_snapshot\", tofile=cached_file):\n                if sys.version_info < (3,):\n                    sys.stderr.write(line.encode('utf-8') + \"\\n\")\n                else:\n                    sys.stderr.write(line + \"\\n\")\n\n        try:\n            with open(cached_file, 'wb') as f:\n                pickle.dump(tlds, f)\n        except IOError as e:\n            LOG.warn(\"unable to cache TLDs in file %s: %s\", cached_file, e)\n\n        self._extractor = _PublicSuffixListTLDExtractor(tlds)\n        return self._extractor\n\nTLD_EXTRACTOR = TLDExtract()\n\n@wraps(TLD_EXTRACTOR.__call__)\ndef extract(url):\n    return TLD_EXTRACTOR(url)\n\n@wraps(TLD_EXTRACTOR.update)\ndef update(*args, **kwargs):\n    return TLD_EXTRACTOR.update(*args, **kwargs)\n\ndef _fetch_page(url):\n    try:\n        return unicode(urlopen(url).read(), 'utf-8')\n    except URLError as e:\n        LOG.error(e)\n        return u''\n\ndef _PublicSuffixListSource():\n    page = _fetch_page('http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1')\n\n    tld_finder = re.compile(r'^(?P<tld>[.*!]*\\w[\\S]*)', re.UNICODE | re.MULTILINE)\n    tlds = [m.group('tld') for m in tld_finder.finditer(page)]\n    return tlds\n\nclass _PublicSuffixListTLDExtractor(object):\n    def __init__(self, tlds):\n        self.tlds = tlds\n\n    def extract(self, netloc):\n        spl = netloc.split('.')\n        lower_spl = tuple(el.lower() for el in spl)\n        for i in range(len(spl)):\n            maybe_tld = '.'.join(lower_spl[i:])\n            exception_tld = '!' + maybe_tld\n            if exception_tld in self.tlds:\n                return '.'.join(spl[:i+1]), '.'.join(spl[i+1:])\n\n            if maybe_tld in self.tlds:\n                return '.'.join(spl[:i]), '.'.join(spl[i:])\n\n            wildcard_tld = '*.' + '.'.join(lower_spl[i+1:])\n            if wildcard_tld in self.tlds:\n                return '.'.join(spl[:i]), '.'.join(spl[i:])\n\n        return netloc, ''\n\n\ndef main():\n    \"\"\"docstring for main\"\"\"\n    import argparse\n\n    distribution = pkg_resources.get_distribution('tldextract')\n\n    parser = argparse.ArgumentParser(\n        version='%(prog)s ' + distribution.version,\n        description='Parse hostname from a url or fqdn')\n\n    parser.add_argument('input', metavar='fqdn|url',\n                        type=unicode, nargs='*', help='fqdn or url')\n\n    parser.add_argument('-u', '--update', default=False, action='store_true', help='force fetch the latest TLD definitions')\n    parser.add_argument('-c', '--cache_file', help='use an alternate TLD definition file')\n\n    args = parser.parse_args()\n\n    if args.cache_file:\n        TLD_EXTRACTOR.cache_file = args.cache_file\n\n    if args.update:\n        try:\n            TLD_EXTRACTOR.update(True)\n        except Exception as exc:\n            sys.stderr.write(exc + \"\\n\")\n            exit(2)\n    elif len(args.input) is 0:\n        parser.print_usage()\n        exit(1)\n\n    for i in args.input:\n        print(' '.join(extract(i)))\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "thirdparty_libs/torndb.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2009 Facebook\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# 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, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\n\"\"\"A lightweight wrapper around MySQLdb.\nOriginally part of the Tornado framework.  The tornado.database module\nis slated for removal in Tornado 3.0, and it is now available separately\nas torndb.\n\"\"\"\n\nfrom __future__ import absolute_import, division, with_statement\n\nimport copy\nimport logging\nimport os\nimport time\n\ntry:\n    import MySQLdb.constants\n    import MySQLdb.converters\n    import MySQLdb.cursors\nexcept ImportError:\n    try:\n        import pymysql as MySQLdb\n    except ImportError:\n        # If MySQLdb isn't available this module won't actually be useable,\n        # but we want it to at least be importable on readthedocs.org,\n        # which has limitations on third-party modules.\n        if 'READTHEDOCS' in os.environ:\n            MySQLdb = None\n        else:\n            raise\n\nversion = \"0.3\"\nversion_info = (0, 3, 0, 0)\n\nclass Connection(object):\n    \"\"\"A lightweight wrapper around MySQLdb DB-API connections.\n    The main value we provide is wrapping rows in a dict/object so that\n    columns can be accessed by name. Typical usage::\n        db = torndb.Connection(\"localhost\", \"mydatabase\")\n        for article in db.query(\"SELECT * FROM articles\"):\n            print article.title\n    Cursors are hidden by the implementation, but other than that, the methods\n    are very similar to the DB-API.\n    We explicitly set the timezone to UTC and assume the character encoding to\n    UTF-8 (can be changed) on all connections to avoid time zone and encoding errors.\n    The sql_mode parameter is set by default to \"traditional\", which \"gives an error instead of a warning\"\n    (http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html). However, it can be set to\n    any other mode including blank (None) thereby explicitly clearing the SQL mode.\n    Arguments read_timeout and write_timeout can be passed using kwargs, if\n    MySQLdb version >= 1.2.5 and MySQL version > 5.1.12.\n    \"\"\"\n    def __init__(self, host, database, user=None, password=None,\n                 max_idle_time=7 * 3600, connect_timeout=0,\n                 time_zone=\"+0:00\", charset = \"utf8\", sql_mode=\"TRADITIONAL\",\n                 **kwargs):\n        self.host = host\n        self.database = database\n        self.max_idle_time = float(max_idle_time)\n\n        args = dict(conv=CONVERSIONS, use_unicode=True, charset=charset,\n                    db=database, init_command=('SET time_zone = \"%s\"' % time_zone),\n                    connect_timeout=connect_timeout, sql_mode=sql_mode, **kwargs)\n        if user is not None:\n            args[\"user\"] = user\n        if password is not None:\n            args[\"passwd\"] = password\n\n        # We accept a path to a MySQL socket file or a host(:port) string\n        if \"/\" in host:\n            args[\"unix_socket\"] = host\n        else:\n            self.socket = None\n            pair = host.split(\":\")\n            if len(pair) == 2:\n                args[\"host\"] = pair[0]\n                args[\"port\"] = int(pair[1])\n            else:\n                args[\"host\"] = host\n                args[\"port\"] = 3306\n\n        self._db = None\n        self._db_args = args\n        self._last_use_time = time.time()\n        try:\n            self.reconnect()\n        except Exception:\n            logging.error(\"Cannot connect to MySQL on %s\", self.host,\n                          exc_info=True)\n\n    def __del__(self):\n        self.close()\n\n    def close(self):\n        \"\"\"Closes this database connection.\"\"\"\n        if getattr(self, \"_db\", None) is not None:\n            self._db.close()\n            self._db = None\n\n    def reconnect(self):\n        \"\"\"Closes the existing database connection and re-opens it.\"\"\"\n        self.close()\n        self._db = MySQLdb.connect(**self._db_args)\n        self._db.autocommit(True)\n\n    def iter(self, query, *parameters, **kwparameters):\n        \"\"\"Returns an iterator for the given query and parameters.\"\"\"\n        self._ensure_connected()\n        cursor = MySQLdb.cursors.SSCursor(self._db)\n        try:\n            self._execute(cursor, query, parameters, kwparameters)\n            column_names = [d[0] for d in cursor.description]\n            for row in cursor:\n                yield Row(zip(column_names, row))\n        finally:\n            cursor.close()\n\n    def query(self, query, *parameters, **kwparameters):\n        \"\"\"Returns a row list for the given query and parameters.\"\"\"\n        cursor = self._cursor()\n        try:\n            self._execute(cursor, query, parameters, kwparameters)\n            column_names = [d[0] for d in cursor.description]\n            return [Row(zip(column_names, row)) for row in cursor]\n        finally:\n            cursor.close()\n\n    def get(self, query, *parameters, **kwparameters):\n        \"\"\"Returns the (singular) row returned by the given query.\n        If the query has no results, returns None.  If it has\n        more than one result, raises an exception.\n        \"\"\"\n        rows = self.query(query, *parameters, **kwparameters)\n        if not rows:\n            return None\n        elif len(rows) > 1:\n            raise Exception(\"Multiple rows returned for Database.get() query\")\n        else:\n            return rows[0]\n\n    # rowcount is a more reasonable default return value than lastrowid,\n    # but for historical compatibility execute() must return lastrowid.\n    def execute(self, query, *parameters, **kwparameters):\n        \"\"\"Executes the given query, returning the lastrowid from the query.\"\"\"\n        return self.execute_lastrowid(query, *parameters, **kwparameters)\n\n    def execute_lastrowid(self, query, *parameters, **kwparameters):\n        \"\"\"Executes the given query, returning the lastrowid from the query.\"\"\"\n        cursor = self._cursor()\n        try:\n            self._execute(cursor, query, parameters, kwparameters)\n            return cursor.lastrowid\n        finally:\n            cursor.close()\n\n    def execute_rowcount(self, query, *parameters, **kwparameters):\n        \"\"\"Executes the given query, returning the rowcount from the query.\"\"\"\n        cursor = self._cursor()\n        try:\n            self._execute(cursor, query, parameters, kwparameters)\n            return cursor.rowcount\n        finally:\n            cursor.close()\n\n    def executemany(self, query, parameters):\n        \"\"\"Executes the given query against all the given param sequences.\n        We return the lastrowid from the query.\n        \"\"\"\n        return self.executemany_lastrowid(query, parameters)\n\n    def executemany_lastrowid(self, query, parameters):\n        \"\"\"Executes the given query against all the given param sequences.\n        We return the lastrowid from the query.\n        \"\"\"\n        cursor = self._cursor()\n        try:\n            cursor.executemany(query, parameters)\n            return cursor.lastrowid\n        finally:\n            cursor.close()\n\n    def executemany_rowcount(self, query, parameters):\n        \"\"\"Executes the given query against all the given param sequences.\n        We return the rowcount from the query.\n        \"\"\"\n        cursor = self._cursor()\n        try:\n            cursor.executemany(query, parameters)\n            return cursor.rowcount\n        finally:\n            cursor.close()\n\n    update = delete = execute_rowcount\n    updatemany = executemany_rowcount\n\n    insert = execute_lastrowid\n    insertmany = executemany_lastrowid\n\n    def _ensure_connected(self):\n        # Mysql by default closes client connections that are idle for\n        # 8 hours, but the client library does not report this fact until\n        # you try to perform a query and it fails.  Protect against this\n        # case by preemptively closing and reopening the connection\n        # if it has been idle for too long (7 hours by default).\n        if (self._db is None or\n            (time.time() - self._last_use_time > self.max_idle_time)):\n            self.reconnect()\n        self._last_use_time = time.time()\n\n    def _cursor(self):\n        self._ensure_connected()\n        return self._db.cursor()\n\n    def _execute(self, cursor, query, parameters, kwparameters):\n        try:\n            return cursor.execute(query, kwparameters or parameters)\n        except OperationalError:\n            logging.error(\"Error connecting to MySQL on %s\", self.host)\n            self.close()\n            raise\n\n    def insert_by_dict(self, tablename, rowdict, replace=False):\n        cursor = self._cursor()\n        cursor.execute(\"describe %s\" % tablename)\n        allowed_keys = set(row[0] for row in cursor.fetchall())\n        keys = allowed_keys.intersection(rowdict)\n\n        if len(rowdict) > len(keys):\n            unknown_keys = set(rowdict) - allowed_keys\n            logging.error(\"skipping keys: %s\", \", \".join(unknown_keys))\n\n        columns = \", \".join(keys)\n        values_template = \", \".join([\"%s\"] * len(keys))\n\n        if replace:\n            sql = \"REPLACE INTO %s (%s) VALUES (%s)\" % (\n                tablename, columns, values_template)\n        else:\n            sql = \"INSERT INTO %s (%s) VALUES (%s)\" % (\n                tablename, columns, values_template)\n\n        values = tuple(rowdict[key] for key in keys)\n        try:\n            cursor.execute(sql, values)\n            #self._execute(cursor, sql, values, None)\n            return cursor.lastrowid\n        finally:\n            cursor.close()\n\n\nclass Row(dict):\n    \"\"\"A dict that allows for object-like property access syntax.\"\"\"\n    def __getattr__(self, name):\n        try:\n            return self[name]\n        except KeyError:\n            raise AttributeError(name)\n\nif MySQLdb is not None:\n    # Fix the access conversions to properly recognize unicode/binary\n    FIELD_TYPE = MySQLdb.constants.FIELD_TYPE\n    FLAG = MySQLdb.constants.FLAG\n    CONVERSIONS = copy.copy(MySQLdb.converters.conversions)\n\n    field_types = [FIELD_TYPE.BLOB, FIELD_TYPE.STRING, FIELD_TYPE.VAR_STRING]\n    if 'VARCHAR' in vars(FIELD_TYPE):\n        field_types.append(FIELD_TYPE.VARCHAR)\n\n    for field_type in field_types:\n        CONVERSIONS[field_type] = [(FLAG.BINARY, str)] + CONVERSIONS[field_type]\n\n    # Alias some common MySQL exceptions\n    IntegrityError = MySQLdb.IntegrityError\n    OperationalError = MySQLdb.OperationalError"
  },
  {
    "path": "thirdparty_libs/wvs_spider/__init__.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n"
  },
  {
    "path": "thirdparty_libs/wvs_spider/lib/__init__.py",
    "content": ""
  },
  {
    "path": "thirdparty_libs/wvs_spider/lib/config.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nWVS_INSTALL_PATH = 'D:/Acunetix/Web Vulnerability Scanner 10'\nXML_SAVE_PATH = 'D:/spider_db/'\nWVS_SETTINGS_PATH = 'C:/Documents and Settings/All Users/Documents/Acunetix WVS 10/Settings'\nWVS_DEFAULT_TEMPLATE = 'default_wvs.xml' #在调用wvs之前，必须先生成个default 模板\n\n#celery redis\nREDIS_SERVER = '172.16.203.129'\nREDIS_PWD    = ''\nREDIS_PORT   = '6379'\n"
  },
  {
    "path": "thirdparty_libs/wvs_spider/run.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\n\n__all__ = []\n\n\n#------------------------------------------------------------------------------\n# Fix the module load path.\n\nimport os, sys\nfrom os import path\nimport redis\n\nhere = path.split(path.abspath(__file__))[0]\nif not here:  # if it fails use cwd instead\n\there = path.abspath(os.getcwd())\nif not here in sys.path:\n\tsys.path.insert(0, here)\n# add parent path\nparent = path.abspath(path.join(here, '../../../'))\nif not parent in sys.path:\n\tsys.path.insert(0, parent)\n\n\nfrom celery import Celery, platforms\nimport sys, time, datetime, random, hashlib, urllib, requests\nfrom lib.config import REDIS_SERVER, REDIS_PWD\n\ndef start_wvs_spider_dispatch(target, audit_name, cookie, Logger):\n\tapp = Celery()\n\tapp.config_from_object('wvs_celery_config')\n\tdomain = get_crawl_domain(target)\n\t#keys = get_save_crawl_folder_name(domain)\n\tLogger.log_verbose(\"Web Spider: Crawl Domain:%s, keys:%s\"  % (domain, audit_name))\n\tLogger.log_verbose(\"Web Spider: Spider is Running!\")\n\tapp.send_task('wvs_tasks.wvs_spider_dispatch', args=[target, audit_name, cookie])\n\tplatforms.C_FORCE_ROOT = True\n\tLogger.log_verbose('Waiting spider return content..........')\n\treturn wait_parse_result(audit_name)\n\ndef test_start_wvs_spider_dispatch(keys):\n\treturn wait_parse_result(keys)\n\ndef get_save_crawl_folder_name(domain):\n\n\tif isinstance(domain, str):\n\t\tcur_time =  str(int(time.mktime(datetime.datetime.now().timetuple())))\n\t\tseed =  ''.join(random.sample('abcdefghijklmnopqrstuvwxyz!@#$%^&*', 5))\n\t\t__ = hashlib.md5()\n\t\t__.update(cur_time + seed)\n\t\treturn '{0}_{1}'.format(domain, __.hexdigest())\n\ndef get_crawl_domain(url):\n\tif isinstance(url, str):\n\t\tprotocol, __ = urllib.splittype(url)\n\t\thost = urllib.splitnport(urllib.splithost(__)[0])\n\t\treturn host[0]\n\ndef wait_parse_result_by_redis(keys):\n\ts = requests.session()\n\ts.keep_alive = False\n\tredis_url = 'http://172.16.203.129:7379/GET/'\n\tspider_json_content = None\n\twhile True:\n\t\tspider_json = requests.get(url = redis_url + keys).json()\n\t\tif spider_json['GET'] is not None:\n\t\t\tspider_json_content = spider_json['GET']\n\t\t\tbreak\n\t\ttime.sleep(1)\n\treturn spider_json_content \n\ndef wait_parse_result(keys):\n    pool = redis.ConnectionPool(host = REDIS_SERVER , port = 6379, db = 0, password = REDIS_PWD)\n    r = redis.Redis(connection_pool = pool)\n    spider_json_content = None\n    while True:\n        #TODO timeout is need\n        try:\n\t\t\t_ = r.get(keys)\n\t\t\tif _ is not None:\n\t\t\t\tspider_json_content = _\n\t\t\t\tr.delete(keys)\n\t\t\t\tbreak\n\t\t\telse:\n\t\t\t\ttime.sleep(2)\n        except Exception:\n            time.sleep(1)\n\n    return spider_json_content\n\nif __name__ == '__main__':\n\tif len(sys.argv) == 3:\n\t\tstart_wvs_spider_dispatch(sys.argv[1], sys.argv[2], sys.argv[3])  #url, cookie\n"
  },
  {
    "path": "thirdparty_libs/wvs_spider/wvs_celery_config.py",
    "content": "# celeryconfig.py\n# coding=utf-8\n\nfrom lib.config import REDIS_PWD, REDIS_SERVER, REDIS_PORT\n\nBROKER_URL = 'redis://:{0}@{1}:{2}/8'.format(REDIS_PWD, REDIS_SERVER, REDIS_PORT)\nCELERY_RESULT_BACKEND = 'redis://:{0}@{1}:{2}/9'.format(REDIS_PWD, REDIS_SERVER, REDIS_PORT)\n\n#BROKER_URL = 'redis://:%s@172.16.203.129:6379/8' % REDIS_PWD\n#CELERY_RESULT_BACKEND = 'redis://:%s@172.16.203.129:6379/9' % REDIS_PWD\n\n# Tasks 位于 worker.py 中\nCELERY_IMPORTS = ('wvs_tasks', )\n\n# 默认为1次/秒的任务\nCELERY_ANNOTATIONS = {'wvs_tasks.wvs_spider_dispatch': {'rate_limit': '1/s'}}\n\nCELERY_ROUTES = {'wvs_tasks.wvs_spider_dispatch': {'queue': 'add'},\n                 'wvs_tasks.error_handler': {'queue': 'error'}}\n\n# 默认所有格式为 json\nCELERY_TASK_SERIALIZER = 'json'\nCELERY_RESULT_SERIALIZER = 'json'\nCELERY_ACCEPT_CONTENT=['json']\n"
  },
  {
    "path": "thirdparty_libs/wvs_spider/wvs_console.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nimport os, datetime, time, urllib, random, hashlib, threading, subprocess\nfrom lib.config import XML_SAVE_PATH\nfrom lib.config import WVS_INSTALL_PATH\nfrom lib.config import WVS_SETTINGS_PATH , WVS_DEFAULT_TEMPLATE\nfrom HTMLParser import HTMLParser\nfrom xml.etree import ElementTree as ET\n\nclass WVSSpider(threading.Thread):\n\n    def __init__(self, url, keys, cookie = 'None'):\n        super(WVSSpider, self).__init__()\n        self.url = url\n        self.save_folder_name = keys\n        self.cookie = cookie\n        \n    def _set_crawl_setting_template(self):\n\n        if self.cookie != None:\n\n            default_template_path = os.path.join(WVS_SETTINGS_PATH, WVS_DEFAULT_TEMPLATE)\n            tree = ET.parse(default_template_path)\n            xml_root_node = tree.getroot()\n            cookie_node = xml_root_node.getiterator('CustomCookies')\n            if cookie_node != None and len(cookie_node) == 1:\n                if cookie_node[0].find('Cookie') == None:\n                    ET.SubElement(cookie_node[0], tag = \"Cookie\", attrib = {\"CookieString\":\"%s\" % self.cookie, \"Url\":\"%s\" % self.url, \"Enabled\":\"0\"})\n\n                    crawl_template_file = os.path.join(WVS_SETTINGS_PATH, self.save_folder_name + '.xml')\n                    print crawl_template_file\n                    with open(crawl_template_file, 'w') as f:\n                        f.write(ET.tostring(xml_root_node))\n                        return crawl_template_file\n\n        return None\n\n\n    def _get_wvs_console_path(self):\n        return WVS_INSTALL_PATH\n\n    def get_run_cmd(self):\n    \tsave_folder_path = XML_SAVE_PATH + self.save_folder_name\n        if self.cookie != None:\n            crawl_template_file = self._set_crawl_setting_template()\n            if crawl_template_file is not None:\n                return '{0}/wvs_console.exe /Scan {1} /Profile Empty /ExportXML /SaveLogs /Settings {2} /SaveCrawlerData /SaveFolder {3} --EnablePortScanning=False --ManipHTTPHeaders=True'.format(self._get_wvs_console_path(), self.url, self.save_folder_name , save_folder_path)\n            else:\n                return '{0}/wvs_console.exe /Crawl {1}  /ExportXML /SaveLogs /Settings Default /SaveCrawlerData /SaveFolder {2} --EnablePortScanning=False --ManipHTTPHeaders=True'.format(self._get_wvs_console_path(), self.url, save_folder_path)\n\n        else:\n            return '{0}/wvs_console.exe /Crawl {1}  /ExportXML /SaveLogs /Settings Default /SaveCrawlerData /SaveFolder {2} --EnablePortScanning=False --ManipHTTPHeaders=True'.format(self._get_wvs_console_path(), self.url, save_folder_path)\n\n    def run(self):\n    \tself.__spider_proc = subprocess.Popen(args=self.get_run_cmd(),\n                                               stdout=subprocess.PIPE,\n                                                stderr=subprocess.PIPE,\n                                                bufsize=0)\n        print self.__spider_proc.stdout.readlines()\n\t\t\n\n\ndef main():\n\twvs_spider = WVSSpider(url = 'http://www.baidu.com/afdasf', keys = \"ff\", cookie = 'login=fuck')\n\twvs_spider.start()\n    \n\n\nif __name__  == '__main__': main()\n"
  },
  {
    "path": "thirdparty_libs/wvs_spider/wvs_run.py",
    "content": "#!/usr/bin/env python\n#-*- coding:utf-8 -*-\n\n\nimport sys\nimport optparse\n\n#from thirdparty_libs.wvs_spider.wvs_console import WVSSpider\nfrom wvs_console import WVSSpider\n\n\ndef do_wvs_crawl(target, keys, cookie):\n\tprint 'start crawl %s, keys:%s' % (target, keys)\n\tWVSSpider(target, keys, cookie).start()\n\n\n#def run_wvs_spider(target):\n#\tresult = do_wvs_crawl(target)\n\n\ndef main():\n\tprint len(sys.argv)\n\tif len(sys.argv) == 3:\n\t\tdo_wvs_crawl(sys.argv[1], sys.argv[2], None)\n\tif len(sys.argv) == 4:\n\t\tdo_wvs_crawl(sys.argv[1], sys.argv[2], sys.argv[3])\n\n\nif __name__  == '__main__': main()"
  },
  {
    "path": "thirdparty_libs/wvs_spider/wvs_tasks.py",
    "content": "#!/usr/bin/env python\n#-*- coding:utf-8 -*-\n\n\nfrom celery import Celery\nimport subprocess\n\n'''\ncelery -A wvs_tasks worker --loglevel=info -Q add\n'''\n\napp = Celery()\napp.config_from_object('wvs_celery_config')\n\n@app.task\ndef wvs_spider_dispatch(url, keys, cookie):\n\n\tif cookie != None:\n\t\tcmdline = 'python wvs_run.py %s %s %s' % (url, keys, cookie)\n\telse:\n\t\tcmdline = 'python wvs_run.py %s %s' % (url, keys)\n\n\tprint cmdline\n\tspider_proc = subprocess.Popen(cmdline, shell = True, stdout = subprocess.PIPE, stderr = subprocess.PIPE)\n\tprocess_output = spider_proc.stdout.readlines()\n\tprint 'wvs subprocess exit!'\n\treturn process_output\n    "
  },
  {
    "path": "thirdparty_libs/wvs_spider/xml2mysql.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nfrom HTMLParser import HTMLParser\nfrom xml.etree import ElementTree\nimport MySQLdb\nimport time, sys, os, json, redis, re\nfrom watchdog.observers import Observer\nfrom watchdog.events import FileSystemEventHandler\n\nSPIDER_TARGET     = 'spider_target'\nSPIDER_SITE_FILES = 'spider_site_files'\nSPIDER_PARM       = 'spider_parameter'\nSPIDER_PARM_TYPES = 'spider_parm_types'\n\nMYSQL_HOST      = '172.16.203.129'\nMYSQL_PORT      = 3306\nMYSQL_USER      = 'root'\nMYSQL_PWD       = 'root'\nMYSQL_DB        = 'luscan_spider'\n\nCRAWL_FILENAME  = 'export.xml'\nREDIS_SERVER    = '10.133.6.20'\n\nclass MySQLBase(object):\n    u'''对MySQLdb常用函数进行封装的类'''\n\n    error_code = '' #MySQL错误号码\n\n    _instance = None #本类的实例\n    _conn = None # 数据库conn\n    _cur = None #游标\n\n    _TIMEOUT = 30 #默认超时30秒\n    _timecount = 0\n\n    def __init__(self, dbconfig):\n        u'构造器：根据数据库连接参数，创建MySQL连接'\n        try:\n            self._conn = MySQLdb.connect(host=dbconfig['host'],\n                                         port=dbconfig['port'],\n                                         user=dbconfig['user'],\n                                         passwd=dbconfig['passwd'],\n                                         db=dbconfig['db'])\n        except MySQLdb.Error, e:\n            self.error_code = e.args[0]\n            error_msg = 'MySQL error! ', e.args[0], e.args[1]\n            print error_msg\n            sys.exit()\n            \n        self._cur = self._conn.cursor()\n        self._instance = MySQLdb\n\n    def query(self,sql):\n        u'执行 SELECT 语句'\n        try:\n            self._cur.execute(\"SET NAMES utf8\")\n            result = self._cur.execute(sql)\n        except MySQLdb.Error, e:\n            self.error_code = e.args[0]\n            print \"数据库错误代码:\",e.args[0],e.args[1]\n            result = False\n        return result\n\n    def update(self,sql):\n        u'执行 UPDATE 及 DELETE 语句'\n        try:\n            self._cur.execute(\"SET NAMES utf8\")\n            result = self._cur.execute(sql)\n            self._conn.commit()\n        except MySQLdb.Error, e:\n            self.error_code = e.args[0]\n            print \"数据库错误代码:\",e.args[0],e.args[1]\n            result = False\n        return result\n\n    def insert(self,sql):\n        u'执行 INSERT 语句。如主键为自增长int，则返回新生成的ID'\n        try:\n            self._cur.execute(\"SET NAMES utf8\")\n            self._cur.execute(sql)\n            insert_id = self._conn.insert_id()\n            self._conn.commit()\n            return insert_id\n        except MySQLdb.Error, e:\n            self.error_code = e.args[0]\n            print \"数据库错误代码:\",e.args[0],e.args[1]\n            return -1\n\n    def fetchAllRows(self):\n        u'返回结果列表'\n        return self._cur.fetchall()\n\n    def fetchOneRow(self):\n        u'返回一行结果，然后游标指向下一行。到达最后一行以后，返回None'\n        return self._cur.fetchone()\n\n    def getRowCount(self):\n        u'获取结果行数'\n        return self._cur.rowcount\n\n    def commit(self):\n        u'数据库commit操作'\n        self._conn.commit()\n\n    def rollback(self):\n        u'数据库回滚操作'\n        self._conn.rollback()\n\n    def __del__(self):\n        u'释放资源（系统GC自动调用）'\n        try:\n            self._cur.close()\n            self._conn.close()\n        except:\n            pass\n\n    def  close(self):\n        u'关闭数据库连接'\n        self.__del__()\n\n\nclass CrawlDB(MySQLBase):\n\n    def __init__(self):\n        MySQLBase.__init__(self, {'host':MYSQL_HOST, 'port':MYSQL_PORT, 'user':MYSQL_USER, 'passwd': MYSQL_PWD, 'db':MYSQL_DB})\n\n\nclass CrawlFileMonitor(FileSystemEventHandler):\n\n    def __init__(self):\n        super(CrawlFileMonitor, self).__init__()\n        #self.crawl_log_path = crawl_log_path\n\n    def on_created(self, event):\n        super(CrawlFileMonitor, self).on_created(event)\n        if not event.is_directory:\n            #print event.src_path\n            if CRAWL_FILENAME in event.src_path:\n                print '[+] wait crawl xml file writing...'\n                while True:\n                    try:\n                        open(event.src_path, \"r\").read(5)\n                        print '[+] spider xml file write finish!'\n                        crawlxml = CrawlXML(event.src_path)\n                        crawlxml.xml2mysql()\n                        break\n                    except IOError:\n                        time.sleep(2) # need file write finish\n                \n\nclass CrawlXML(object):\n    '''\n    crawl xml解析类\n    '''\n\n    def __init__(self, filepath = CRAWL_FILENAME):\n        self.filepath = filepath\n        self.xml_root_node = ElementTree.fromstring(open(self.filepath).read())\n        self.xml_object = {}\n        self.domain_node_tagname   = 'Crawler'\n        self.domain_node_attrib    = 'StartUrl'\n        self.sitefile_node_tagname = 'SiteFile'\n        self.crawldb = CrawlDB()\n\n\n    def xml_unescape(self, content):\n        h = HTMLParser()\n        return h.unescape(content)\n\n    def __get_node_text(self, node):\n        '''\n        获取节点的文本内容\n        :param node:\n        :return:\n        '''\n        return node.text\n\n    def __get_node_tag(self, node):\n        '''\n        获取节点的标签值\n        :param node:\n        :return:\n        '''\n        return node.tag\n\n    def __get_domain(self):\n        starturl_node = self.xml_root_node.getiterator(self.domain_node_tagname)\n        if len(starturl_node) == 1:\n            if starturl_node[0].attrib.has_key(self.domain_node_attrib):\n                self.xml_object['domain'] = starturl_node[0].attrib[self.domain_node_attrib]\n\n    def _parse_domain(self):\n        '''\n        TODO need find the right path\n        '''\n        return os.path.split(os.path.split(self.filepath)[0])[1]\n        \n            \n\n    def __get_sitefile_object(self):\n        sitefile_arr = []\n        sitefiles_nodes = self.xml_root_node.getiterator(self.sitefile_node_tagname)\n        for site_node in sitefiles_nodes:\n            sitefile_item = {}\n            name_node_text     = self.__get_node_text(site_node.find('Name'))    #name: user.do\n            nameurl_node_text  = self.__get_node_text(site_node.find('URL'))    #URL: /user.do\n            fullurl_node_text  = self.__get_node_text(site_node.find('FullURL'))  #FullUrl: http://xxxxx.com/user.do\n            sitefile_item['name'] = name_node_text\n            sitefile_item['nameurl'] = nameurl_node_text\n            sitefile_item['fullurl'] = fullurl_node_text\n\n            #---------get all url and parameter ----------\n            all_cgi_nodes = site_node.getiterator('Variation')\n            sitefile_item['content'] = []\n            for cgi_node in all_cgi_nodes:\n                cgiinfo_dict = {}\n                cgiinfo_dict['url'] = self.__get_node_text(cgi_node.find('URL'))\n                param_data = self.__get_node_text(cgi_node.find('PostData'))\n                cgiinfo_dict['param_data'] = self.xml_unescape(param_data) if param_data is not None else ''\n                cgiinfo_dict['method']     = 'POST' if param_data is not None else 'GET'\n                sitefile_item['content'].append(cgiinfo_dict)\n\n            sitefile_arr.append(sitefile_item)\n\n        self.xml_object['info'] = sitefile_arr\n\n\n    def xml2mysql(self):\n        self.__get_domain()\n        print self.xml_object\n        self.__get_sitefile_object()\n        print self.xml_object\n        '''\n         ------------\n         push redis\n        '''\n        pool = redis.ConnectionPool(host = REDIS_SERVER, port = '6379', db =0)\n        redis_conn = redis.Redis(connection_pool = pool)\n        redis_conn.set(self._parse_domain(), json.dumps(self.xml_object))\n        \n        print 'Domain:%s' % self.xml_object['domain']\n\n        cur_time = time.strftime( '%Y-%m-%d %X', time.localtime( time.time() ) )\n        sql = \"insert into %s(`starturl`, `starttime`, `finishtime`) values('%s', '%s', '%s')\" % (SPIDER_TARGET, self.xml_object['domain'], cur_time, cur_time)\n        id = self.crawldb.insert(sql)\n       \n        sfid = 0\n        for item in self.xml_object['info']:\n            print '-----------------'\n            print 'Name:%s' % item['name']\n            print 'nameurl:%s' % item['nameurl']\n            print 'fullurl:%s' % item['fullurl']\n            sql = \"insert into %s values('%d', '%d', '%s', '%s', '%s')\" % (SPIDER_SITE_FILES, id, sfid, item['name'], item['nameurl'], item['fullurl'])\n            print sql\n            if self.crawldb.insert(sql) == -1:\n                print '[-] spider_site_files insert data Mysql Error! error_code:%s sql:%s' % (self.crawldb.error_code, sql)\n            else:\n                schemeid = 0\n                for each_cgi in item['content']:\n                    print 'Cgi:%s' % each_cgi['url']\n                    print 'Parm:%s' % each_cgi['param_data']\n                    print 'Method:%s' % each_cgi['method']\n                    sql = \"insert into %s values('%d', '%d', '%d', '%s', '%s', '%s')\" % (SPIDER_PARM, id, sfid, schemeid, each_cgi['url'], each_cgi['param_data'],  each_cgi['method'])\n\n                    if self.crawldb.insert(sql) == -1:\n                        print '[-] spider_parameter insert data Mysql Error! sql:%s' % sql\n                    schemeid = schemeid + 1\n            sfid = sfid + 1\n\n        print '[+] %s crawl success!' % self.xml_object['domain']\n\ndef monitor(path):\n    event_handler = CrawlFileMonitor()\n    observer = Observer()\n    observer.schedule(event_handler, path, recursive=True)\n    observer.start()\n    try:\n        while True:\n            time.sleep(1)\n    except KeyboardInterrupt:\n        observer.stop()\n    observer.join()\n\n\ndef main():\n    #crawlxml = CrawlXML('/Users/BlackYe_Mac/worktools/export.xml')\n    #crawlxml.analyse()\n    monitor('D:/spider_db/')\n    \nif __name__  == '__main__':\n    main()\n"
  },
  {
    "path": "webservice/lalascan_web/app/__init__.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\n\nfrom flask import Flask\nfrom flask.ext.login import LoginManager\n\nfrom models import db\n\ndef create_app(object_name):\n    app = Flask(__name__)\n    app.config.from_object(object_name)\n\n    db.init_app(app)\n\n    login_manager = LoginManager()\n    login_manager.login_view = 'login.login'\n\n    from app.views import login\n    from app.views import webscan\n    app.register_blueprint(login.login_module)\n    app.register_blueprint(webscan.webscan_module)\n\n    return app"
  },
  {
    "path": "webservice/lalascan_web/app/extensions/__init__.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n"
  },
  {
    "path": "webservice/lalascan_web/app/extensions/flask_paginate.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\n    flask_paginate\n    ~~~~~~~~~~~~~~~~~~\n\n    Adds pagination support to your application.\n\n    :copyright: (c) 2013 by Lix Xu.\n    :license: BSD, see LICENSE for more details\n\"\"\"\n\nfrom __future__ import unicode_literals\nimport sys\nfrom flask import request, url_for, Markup, current_app\n\n__version__ = '0.4.5'\n\nPY2 = sys.version_info[0] == 2\n\n_bs_prev_page = '<li class=\"previous\"><a href=\"{0}\">{1}</a></li>'\nPREV_PAGES = dict(bootstrap=_bs_prev_page,\n                  bootstrap2=_bs_prev_page,\n                  bootstrap3=_bs_prev_page,\n                  foundation='<li class=\"arrow\"><a href=\"{0}\">{1}</a></li>',\n                  )\n\n_bs_next_page = '<li class=\"next\"><a href=\"{0}\">{1}</a></li>'\nNEXT_PAGES = dict(bootstrap=_bs_next_page,\n                  bootstrap2=_bs_next_page,\n                  bootstrap3=_bs_next_page,\n                  foundation='<li class=\"arrow\"><a href=\"{0}\">{1}</a></li>',\n                  )\n\nCURRENT_PAGES = dict(bootstrap='<li class=\"active\"><a>{0}</a></li>',\n                     bootstrap3='<li class=\"active\"><a>{0}</a></li>',\n                     foundation='<li class=\"current\"><a>{0}</a></li>',\n                     )\nCURRENT_PAGES.update(bootstrap2=CURRENT_PAGES['bootstrap'])\n\nLINK = '<li><a href=\"{0}\">{1}</a></li>'\nFA_LINK = '<li class=\"unavailable\"><a>{0}</a></li>'\n\nGAP_MARKERS = dict(bootstrap='<li class=\"disabled\"><a>...</a></li>',\n                   foundation='<li class=\"unavailable\">\\\n                   <a>...</a></li>',\n                   )\nGAP_MARKERS.update(bootstrap2=GAP_MARKERS['bootstrap'],\n                   bootstrap3=GAP_MARKERS['bootstrap'],\n                   )\n\n_bs_prev_disabled_page = '<li class=\"previous disabled unavailable\">\\\n<a> {0} </a></li>'\nPREV_DISABLED_PAGES = dict(bootstrap=_bs_prev_disabled_page,\n                           bootstrap2=_bs_prev_disabled_page,\n                           bootstrap3=_bs_prev_disabled_page,\n                           foundation=FA_LINK,\n                           )\n\n_bs_next_disabled_page = '<li class=\"next disabled\">\\\n<a> {0} </a></li>'\nNEXT_DISABLED_PAGES = dict(bootstrap=_bs_next_disabled_page,\n                           bootstrap2=_bs_next_disabled_page,\n                           bootstrap3=_bs_next_disabled_page,\n                           foundation=FA_LINK,\n                           )\n\nPREV_LABEL = '&laquo;'\nNEXT_LABEL = '&raquo;'\nRECORD_NAME = 'records'\n\nDISPLAY_MSG = '''displaying <b>{start} - {end}</b> {record_name} in\ntotal <b>{total}</b>'''\n\nSEARCH_MSG = '''found <b>{found}</b> {record_name},\ndisplaying <b>{start} - {end}</b>'''\n\nCSS_LINKS = dict(bootstrap='<div class=\"pagination{0}{1}\"><ul>',\n                 bootstrap2='<div class=\"pagination{0}{1}\"><ul>',\n                 bootstrap3='<ul class=\"pagination{0}{1}\">',\n                 foundation='<ul class=\"pagination{0}{1}\">',\n                 )\nCSS_LINKS_END = dict(bootstrap='</ul></div>',\n                     bootstrap2='</ul></div>',\n                     bootstrap3='</ul>',\n                     foundation='</ul>',\n                     )\n\n# foundation aligment\nF_ALIGNMENT = '<div class=\"pagination-{0}\">'\n\n\ndef get_page_args():\n    args = request.args.copy()\n    args.update(request.view_args.copy())\n    page_parameter = args.get('page_parameter', 'page')\n    page = int(args.get(page_parameter, 1))\n    per_page = args.get('per_page')\n    if not per_page:\n        per_page = current_app.config.get('PER_PAGE', 20)\n    else:\n        per_page = int(per_page)\n\n    offset = (page - 1) * per_page\n    return page, per_page, offset\n\n\nclass Pagination(object):\n    \"\"\"A simple pagination extension for flask.\"\"\"\n\n    def __init__(self, found=0, **kwargs):\n        '''Detail parameters.\n\n            **found**: used when searching\n\n            **page**: current page\n\n            **per_page**: how many records displayed on one page\n\n            **page_parameter**: a name(string) of a GET parameter that holds \\\n            a page index, Use it if you want to iterate over multiple Pagination \\\n            objects simultaniously.\n            default is 'page'.\n\n            **inner_window**: how many links arround current page\n\n            **outer_window**: how many links near first/last link\n\n            **prev_label**: text for previous page, default is **&laquo;**\n\n            **next_label**: text for next page, default is **&raquo;**\n\n            **search**: search or not?\n\n            **total**: total records for pagination\n\n            **display_msg**: text for pagation information\n\n            **search_msg**: text for search information\n\n            **record_name**: record name showed in pagination information\n\n            **link_size**: font size of page links\n\n            **alignment**: the alignment of pagination links\n\n            **href**: Add custom href for links - this supports forms \\\n            with post method. It MUST contain {0} to format page number\n\n            **show_single_page**: decide whether or not a single page \\\n            returns pagination\n\n            **bs_version**: the version of bootstrap, default is **2**\n\n            **css_framework**: the css framework, default is **bootstrap**\n\n            **anchor**: anchor parameter, appends to page href\n\n            **format_total**: number format total, like **1,234**, \\\n            default is False\n\n            **format_number**: number format start and end, like **1,234**, \\\n            default is False\n\n        '''\n        self.found = found\n        self.page_parameter = kwargs.get('page_parameter', 'page')\n        self.page = kwargs.get(self.page_parameter, 1)\n        self.per_page = kwargs.get('per_page', 20)\n        self.inner_window = kwargs.get('inner_window', 2)\n        self.outer_window = kwargs.get('outer_window', 1)\n        self.prev_label = kwargs.get('prev_label') or PREV_LABEL\n        self.next_label = kwargs.get('next_label') or NEXT_LABEL\n        self.search = kwargs.get('search', False)\n        self.total = kwargs.get('total', 0)\n        self.format_total = kwargs.get('format_total', False)\n        self.format_number = kwargs.get('format_number', False)\n        self.display_msg = kwargs.get('display_msg') or DISPLAY_MSG\n        self.search_msg = kwargs.get('search_msg') or SEARCH_MSG\n        self.record_name = kwargs.get('record_name') or RECORD_NAME\n        self.css_framework = kwargs.get('css_framework', 'bootstrap').lower()\n        if self.css_framework not in CURRENT_PAGES:\n            self.css_framework = 'bootstrap'\n\n        self.bs_version = kwargs.get('bs_version') or 2\n        if self.css_framework.startswith('bootstrap'):\n            if self.bs_version in (3, '3'):\n                self.css_framework = 'bootstrap3'\n\n        self.link_size = kwargs.get('link_size', '')\n        if self.link_size:\n            if self.css_framework == 'foundation':\n                self.link_size = ''\n            else:\n                self.link_size = ' pagination-{0}'.format(self.link_size)\n\n        self.alignment = kwargs.get('alignment', '')\n        if self.alignment and self.css_framework.startswith('bootstrap'):\n            self.alignment = ' pagination-{0}'.format(self.alignment)\n\n        self.href = kwargs.get('href', None)\n        self.anchor = kwargs.get('anchor', None)\n        self.show_single_page = kwargs.get('show_single_page', False)\n\n        self.link = LINK\n        self.current_page_fmt = CURRENT_PAGES[self.css_framework]\n        self.link_css_fmt = CSS_LINKS[self.css_framework]\n        self.gap_marker_fmt = GAP_MARKERS[self.css_framework]\n        self.prev_disabled_page_fmt = PREV_DISABLED_PAGES[self.css_framework]\n        self.next_disabled_page_fmt = NEXT_DISABLED_PAGES[self.css_framework]\n        self.prev_page_fmt = PREV_PAGES[self.css_framework]\n        self.next_page_fmt = NEXT_PAGES[self.css_framework]\n        self.css_end_fmt = CSS_LINKS_END[self.css_framework]\n        self.init_values()\n\n    def page_href(self, page):\n        if self.href:\n            url = self.href.format(page or 1)\n        else:\n            self.args[self.page_parameter] = page\n            if self.anchor:\n                url = url_for(self.endpoint, _anchor=self.anchor, **self.args)\n            else:\n                url = url_for(self.endpoint, **self.args)\n\n        # Need to return a unicode object\n        return url.decode('utf8') if PY2 else url\n\n    def init_values(self):\n        current_total = self.found if self.search else self.total\n        pages = divmod(current_total, self.per_page)\n        self.total_pages = pages[0] + 1 if pages[1] else pages[0]\n        self.has_prev = self.page > 1\n        self.has_next = self.page < self.total_pages\n\n        args = request.args.copy()\n        args.update(request.view_args.copy())\n        self.args = {}\n        for k, v in args.lists():\n            if len(v) == 1:\n                self.args[k] = v[0]\n            else:\n                self.args[k] = v\n\n        self.endpoint = request.endpoint\n\n    @property\n    def prev_page(self):\n        if self.has_prev:\n            page = self.page - 1 if self.page > 2 else None\n            url = self.page_href(page)\n            return self.prev_page_fmt.format(url, self.prev_label)\n\n        return self.prev_disabled_page_fmt.format(self.prev_label)\n\n    @property\n    def next_page(self):\n        if self.has_next:\n            url = self.page_href(self.page + 1)\n            return self.next_page_fmt.format(url, self.next_label)\n\n        return self.next_disabled_page_fmt.format(self.next_label)\n\n    @property\n    def first_page(self):\n        # current page is first page\n        if self.has_prev:\n            return self.link.format(self.page_href(None), 1)\n\n        return self.current_page_fmt.format(1)\n\n    @property\n    def last_page(self):\n        if self.has_next:\n            url = self.page_href(self.total_pages)\n            return self.link.format(url, self.total_pages)\n\n        return self.current_page_fmt.format(self.page)\n\n    @property\n    def pages(self):\n        if self.total_pages < self.inner_window * 2 - 1:\n            return range(1, self.total_pages + 1)\n\n        pages = []\n        win_from = self.page - self.inner_window\n        win_to = self.page + self.inner_window\n        if win_to > self.total_pages:\n            win_from -= win_to - self.total_pages\n            win_to = self.total_pages\n\n        if win_from < 1:\n            win_to = win_to + 1 - win_from\n            win_from = 1\n            if win_to > self.total_pages:\n                win_to = self.total_pages\n\n        if win_from > self.inner_window:\n            pages.extend(range(1, self.outer_window + 1 + 1))\n            pages.append(None)\n        else:\n            pages.extend(range(1, win_to + 1))\n\n        if win_to < self.total_pages - self.inner_window + 1:\n            if win_from > self.inner_window:\n                pages.extend(range(win_from, win_to + 1))\n\n            pages.append(None)\n            pages.extend(range(self.total_pages - 1, self.total_pages + 1))\n        elif win_from > self.inner_window:\n            pages.extend(range(win_from, self.total_pages + 1))\n        else:\n            pages.extend(range(win_to + 1, self.total_pages + 1))\n\n        return pages\n\n    def single_page(self, page):\n        if page == self.page:\n            return self.current_page_fmt.format(page)\n\n        if page == 1:\n            return self.first_page\n\n        if page == self.total_pages:\n            return self.last_page\n\n        return self.link.format(self.page_href(page), page)\n\n    def _get_single_page_link(self):\n        s = [self.link_css_fmt.format(self.link_size, self.alignment)]\n        s.append(self.prev_page)\n        s.append(self.single_page(1))\n        s.append(self.next_page)\n        s.append(self.css_end_fmt)\n        if self.css_framework == 'foundation' and self.alignment:\n            s.insert(0, F_ALIGNMENT.format(self.alignment))\n            s.append('</div>')\n\n        return Markup(''.join(s))\n\n    @property\n    def links(self):\n        \"\"\"Get all the pagination links.\"\"\"\n        if self.total_pages <= 1:\n            if self.show_single_page:\n                return self._get_single_page_link()\n\n            return ''\n\n        s = [self.link_css_fmt.format(self.link_size, self.alignment)]\n        s.append(self.prev_page)\n        for page in self.pages:\n            s.append(self.single_page(page) if page else self.gap_marker_fmt)\n\n        s.append(self.next_page)\n        s.append(self.css_end_fmt)\n        if self.css_framework == 'foundation' and self.alignment:\n            s.insert(0, F_ALIGNMENT.format(self.alignment))\n            s.append('</div>')\n\n        return Markup(''.join(s))\n\n    @property\n    def info(self):\n        \"\"\"Get the pagination information.\"\"\"\n        start = 1 + (self.page - 1) * self.per_page\n        end = start + self.per_page - 1\n        if end > self.total:\n            end = self.total if not self.search else self.found\n\n        if start > self.total:\n            start = self.total if not self.search else self.found\n\n        s = ['<div class=\"pagination-page-info\">']\n        page_msg = self.search_msg if self.search else self.display_msg\n        if self.format_total:\n            total_text = '{0:,}'.format(self.total)\n        else:\n            total_text = '{0}'.format(self.total)\n\n        if self.format_number:\n            start_text = '{0:,}'.format(start)\n            end_text = '{0:,}'.format(end)\n        else:\n            start_text = start\n            end_text = end\n\n        s.append(page_msg.format(found=self.found,\n                                 total=total_text,\n                                 start=start_text,\n                                 end=end_text,\n                                 record_name=self.record_name,\n                                 )\n                 )\n        s.append('</div>')\n        return Markup(''.join(s))\n"
  },
  {
    "path": "webservice/lalascan_web/app/forms.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nfrom flask_wtf import Form\nfrom wtforms import StringField, TextField, SubmitField, IntegerField\nfrom wtforms.validators import DataRequired, Length\n\nfrom models.leakinfo import SLeakInfo\n\nclass LeakInfoForm(Form):\n    leak_name    = StringField('leak_name', validators = [DataRequired('leak_name'), Length(max=100)])\n    leak_name_cn = StringField('leak_name_cn', validators = [DataRequired('leak_name_cn'), Length(max=100)])\n\n    spt          = IntegerField('spt', validators = [DataRequired('spt')])\n    description  = TextField('description', validators = [DataRequired('description')])\n    risk_level   = IntegerField('risk_level')\n\n    '''\n    def validate(self):\n        check_validate = super(LeakInfoForm, self).validate()\n\n        print check_validate\n        if not check_validate:\n            print '2222'\n            return False\n        print '1111'\n        bret = SLeakInfo.query.filter_by(leak_name = self.leak_name.data).first()\n        if bret:\n            return False\n    '''\n\n\n"
  },
  {
    "path": "webservice/lalascan_web/app/models/__init__.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\n\nfrom flask.ext.sqlalchemy import SQLAlchemy\n\ndb = SQLAlchemy(use_native_unicode = 'utf8')"
  },
  {
    "path": "webservice/lalascan_web/app/models/leakinfo.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nfrom . import db\n\nclass SLeakInfo(db.Model):\n\n\n    __tablename__ = 'scan_leak_info'\n\n    id = db.Column(db.Integer, primary_key=True, autoincrement=True)\n    spt_id = db.Column(db.Integer, nullable = False)\n    leak_name = db.Column(db.String(100), nullable = False)\n    leak_name_cn = db.Column(db.String(100), nullable = False)\n    description = db.Column(db.Text())\n    risk_level = db.Column(db.Integer)\n    fix_content = db.Column(db.Text())\n\n    def to_dict(self, **kwargs):\n\n        leakinfo_dict = dict(\n            id = self.id,\n            spt_id = self.spt_id,\n            leak_name = self.leak_name,\n            leak_name_cn = self.leak_name_cn,\n            description = self.description,\n            risk_level = self.risk_level,\n        )\n\n        return dict(leakinfo_dict, **kwargs)\n\nclass SPluginType(db.Model):\n\n    __tablename__ = 'scan_plugin_type'\n\n    id = db.Column(db.Integer, primary_key=True, autoincrement=True)\n    name = db.Column(db.String(10), nullable = False)\n    description = db.Column(db.Text())\n\n    def get_plugin_name(self):\n        return dict( id = self.id,\n                     name = self.name )"
  },
  {
    "path": "webservice/lalascan_web/app/models/policy.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nfrom . import db\n\nfrom datetime import datetime\n\n\nclass SLeakPolicy(db.Model):\n\n    __tablename__ = 'scan_leak_policy'\n\n    id = db.Column(db.Integer, primary_key=True, autoincrement=True)\n    sli_id = db.Column(db.Integer, nullable = False)\n    spt_id = db.Column(db.Integer, nullable = False)\n    policy_name = db.Column(db.String(50), nullable = False)\n    content = db.Column(db.Text())\n    insert_time = db.Column(db.DateTime, default=datetime.utcnow)\n    update_time = db.Column(db.DateTime, default=datetime.utcnow)\n    status = db.Column(db.Integer, default = 1)\n\n    def to_dict(self):\n        return dict(\n            id = self.id,\n            sli_id = self.sli_id,\n            spt_id = self.spt_id,\n            policy_name = self.policy_name,\n            content = self.content,\n            insert_time = self.insert_time,\n            update_time = self.update_time,\n            status = self.status\n        )"
  },
  {
    "path": "webservice/lalascan_web/app/models/scanner.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nfrom . import db\n\nclass STarget(db.Model):\n\n    __tablename__ = 'scan_task'\n\n    id = db.Column(db.Integer(), primary_key = True, autoincrement=True)\n    audit_name = db.Column(db.String(100), nullable = False)\n    scan_url   = db.Column(db.String(200), nullable = False)\n    starttime  = db.Column(db.DateTime, nullable = False)\n    finishtime = db.Column(db.DateTime, nullable = False)\n    status     = db.Column(db.Integer)\n    user       = db.Column(db.String(10))\n\n    def to_dict(self):\n        return dict(\n            id = self.id,\n            audit_name = self.audit_name,\n            scan_url = self.scan_url,\n            starttime = self.starttime,\n            finishtime = self.finishtime,\n            user = self.user\n        )\n\n\nclass SVulDetail(db.Model):\n\n    __tablename__  = 'scan_vul_detail'\n\n    id = db.Column(db.Integer(), primary_key = True, autoincrement=True)\n    st_id = db.Column(db.Integer(), primary_key = True)\n    sli_id = db.Column(db.Integer(), nullable = False)\n    url = db.Column(db.Text, nullable = False)\n    vulparam_point = db.Column(db.String(10), nullable = False)\n    method      = db.Column(db.String(5))\n    payload     = db.Column(db.Text)\n    get_param   = db.Column(db.Text)\n    post_param  = db.Column(db.Text)\n    ori_req_header = db.Column(db.Text)\n    ori_resp_header = db.Column(db.Text)\n    ori_resp_body = db.Column(db.Text)\n    insert_time = db.Column(db.DateTime)\n\n\n\nclass Scanner(object):\n\n    def __init__(self, **kwargs):\n        self.scan_url = kwargs.get('scan_url', None)\n        self.audit_name = kwargs.get('audit_name', None)\n        self.starttime = kwargs.get('starttime', None)\n        self.finishtime = kwargs.get('finishtime', None)\n        self.status = kwargs.get('status', None)\n\n        self.risk_cnt = kwargs.get('high_cnt', {})\n\n        self.high_risk_cnt = 0\n        self.middle_risk_cnt = 0\n        self.low_risk_cnt = 0\n        self.info_risk_cnt = 0\n\n    def add_risk_cnt(self, risk_level):\n        if risk_level == 4:\n            self.high_risk_cnt += 1\n        elif risk_level == 3:\n            self.middle_risk_cnt += 1\n        elif risk_level == 2:\n            self.low_risk_cnt += 1\n        elif risk_level == 1:\n            self.info_risk_cnt += 1\n\n\n"
  },
  {
    "path": "webservice/lalascan_web/app/models/spider.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n"
  },
  {
    "path": "webservice/lalascan_web/app/services.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nfrom models.policy import SLeakPolicy\nfrom models.leakinfo import SLeakInfo\nfrom models.leakinfo import SPluginType\nfrom models.scanner import STarget\nfrom models.scanner import SVulDetail\n\nfrom models import db\n\nclass PolicyService(object):\n\n    @staticmethod\n    def get_policy():\n        all_policy = SLeakPolicy.query.order_by(\"id desc\").all()\n        return [policy.to_dict() for policy in all_policy]\n\n    @staticmethod\n    def get_policy_cnt():\n        return SLeakPolicy.query.count()\n\n    @staticmethod\n    def get_policy_by_leakinfo(offset, per_page):\n        return db.session.query(SLeakInfo.leak_name_cn, SLeakPolicy).outerjoin(SLeakPolicy, SLeakInfo.id == SLeakPolicy.spt_id).order_by(SLeakPolicy.id.desc()).offset(offset).limit(per_page).all()\n\n    @staticmethod\n    def get_leakinfo(offset, per_page):\n        all_leakinfo = db.session.query(SPluginType.name, SLeakInfo).outerjoin(SLeakInfo, SLeakInfo.spt_id == SPluginType.id).order_by(SLeakInfo.id.desc()).offset(offset).limit(per_page).all()\n        return [leakinfo[1].to_dict(plugin_type = leakinfo[0]) for leakinfo in all_leakinfo]\n\n    @staticmethod\n    def get_leakinfo_cnt():\n        return SLeakInfo.query.count()\n\n    @staticmethod\n    def get_plugin_type():\n        all_plugin_type = SPluginType.query.all()\n        return [plugin_type.get_plugin_name() for plugin_type in all_plugin_type]\n\n\n    @staticmethod\n    def add_leakinfo(**kwargs):\n        sleakinfo = SLeakInfo(leak_name = kwargs['leak_name'],\n                              leak_name_cn = kwargs['leak_name_cn'],\n                              spt_id = kwargs['spt'],\n                              description = kwargs['description'],\n                              risk_level = kwargs['risk_level'],\n                              fix_content = None)\n\n        db.session.add(sleakinfo)\n        db.session.commit()\n        return sleakinfo.to_dict()\n\n    @staticmethod\n    def del_leakinfo(leak_id):\n        leakinfo = SLeakInfo.query.get(leak_id)\n        db.session.delete(leakinfo)\n        db.session.commit()\n\n\n\nclass VulDetailInfo(object):\n\n    @staticmethod\n    def get_scan_task():\n        vuldetail = db.session.query(STarget, SVulDetail, SLeakInfo).outerjoin(SVulDetail, STarget.id == SVulDetail.st_id).outerjoin(SLeakInfo, SLeakInfo.id == SVulDetail.sli_id).all()\n        return vuldetail"
  },
  {
    "path": "webservice/lalascan_web/app/static/css/oneui.css",
    "content": "/*!\r\n* OneUI - v1.0 - Auto-compiled on 2015-06-12 - Copyright 2015 \r\n* @author pixelcave\r\n*/\n/*\n * Bootstrap v3.3.4 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/* normalize.css v3.0.2 | MIT License | git.io/normalize */\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n  -ms-text-size-adjust: 100%;\n}\nbody {\n  margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  vertical-align: baseline;\n}\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n[hidden],\ntemplate {\n  display: none;\n}\na {\n  background-color: transparent;\n}\na:active,\na:hover {\n  outline: 0;\n}\nabbr[title] {\n  border-bottom: 1px dotted;\n}\nb,\nstrong {\n  font-weight: bold;\n}\ndfn {\n  font-style: italic;\n}\nh1 {\n  margin: .67em 0;\n  font-size: 2em;\n}\nmark {\n  color: #000;\n  background: #ff0;\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\nsup {\n  top: -0.5em;\n}\nsub {\n  bottom: -0.25em;\n}\nimg {\n  border: 0;\n}\nsvg:not(:root) {\n  overflow: hidden;\n}\nfigure {\n  margin: 1em 40px;\n}\nhr {\n  height: 0;\n  -webkit-box-sizing: content-box;\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n}\npre {\n  overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  margin: 0;\n  font: inherit;\n  color: inherit;\n}\nbutton {\n  overflow: visible;\n}\nbutton,\nselect {\n  text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\ninput {\n  line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\nfieldset {\n  padding: .35em .625em .75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\nlegend {\n  padding: 0;\n  border: 0;\n}\ntextarea {\n  overflow: auto;\n}\noptgroup {\n  font-weight: bold;\n}\ntable {\n  border-spacing: 0;\n  border-collapse: collapse;\n}\ntd,\nth {\n  padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n  *,\n  *:before,\n  *:after {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    -webkit-box-shadow: none !important;\n    box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  a[href^=\"#\"]:after,\n  a[href^=\"javascript:\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  select {\n    background: #fff !important;\n  }\n  .navbar {\n    display: none;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  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');\n}\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n  content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n.glyphicon-cd:before {\n  content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n  content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n  content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n  content: \"\\e204\";\n}\n.glyphicon-copy:before {\n  content: \"\\e205\";\n}\n.glyphicon-paste:before {\n  content: \"\\e206\";\n}\n.glyphicon-alert:before {\n  content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n  content: \"\\e210\";\n}\n.glyphicon-king:before {\n  content: \"\\e211\";\n}\n.glyphicon-queen:before {\n  content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n  content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n  content: \"\\e214\";\n}\n.glyphicon-knight:before {\n  content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n  content: \"\\e216\";\n}\n.glyphicon-tent:before {\n  content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n  content: \"\\e218\";\n}\n.glyphicon-bed:before {\n  content: \"\\e219\";\n}\n.glyphicon-apple:before {\n  content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n  content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n  content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n  content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n  content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n  content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n  content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n  content: \"\\e227\";\n}\n.glyphicon-btc:before {\n  content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n  content: \"\\e227\";\n}\n.glyphicon-yen:before {\n  content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n  content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n  content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n  content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n  content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n  content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n  content: \"\\e232\";\n}\n.glyphicon-education:before {\n  content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n  content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n  content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n  content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n  content: \"\\e237\";\n}\n.glyphicon-oil:before {\n  content: \"\\e238\";\n}\n.glyphicon-grain:before {\n  content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n  content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n  content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n  content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n  content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n  content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n  content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n  content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n  content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n  content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n  content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n  content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n  content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n  content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n  content: \"\\e253\";\n}\n.glyphicon-console:before {\n  content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n  content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n  content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n  content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n  content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n  content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n  content: \"\\e260\";\n}\n* {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\nhtml {\n  font-size: 10px;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #333;\n  background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\na {\n  color: #337ab7;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #23527c;\n  text-decoration: underline;\n}\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\nfigure {\n  margin: 0;\n}\nimg {\n  vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n.img-rounded {\n  border-radius: 6px;\n}\n.img-thumbnail {\n  display: inline-block;\n  max-width: 100%;\n  height: auto;\n  padding: 4px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n  -o-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n}\n.img-circle {\n  border-radius: 50%;\n}\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eee;\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto;\n}\n[role=\"button\"] {\n  cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n  font-weight: normal;\n  line-height: 1;\n  color: #777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n  font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n  font-size: 75%;\n}\nh1,\n.h1 {\n  font-size: 36px;\n}\nh2,\n.h2 {\n  font-size: 30px;\n}\nh3,\n.h3 {\n  font-size: 24px;\n}\nh4,\n.h4 {\n  font-size: 18px;\n}\nh5,\n.h5 {\n  font-size: 14px;\n}\nh6,\n.h6 {\n  font-size: 12px;\n}\np {\n  margin: 0 0 10px;\n}\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 300;\n  line-height: 1.4;\n}\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\nsmall,\n.small {\n  font-size: 85%;\n}\nmark,\n.mark {\n  padding: .2em;\n  background-color: #fcf8e3;\n}\n.text-left {\n  text-align: left;\n}\n.text-right {\n  text-align: right;\n}\n.text-center {\n  text-align: center;\n}\n.text-justify {\n  text-align: justify;\n}\n.text-nowrap {\n  white-space: nowrap;\n}\n.text-lowercase {\n  text-transform: lowercase;\n}\n.text-uppercase {\n  text-transform: uppercase;\n}\n.text-capitalize {\n  text-transform: capitalize;\n}\n.text-muted {\n  color: #777;\n}\n.text-primary {\n  color: #337ab7;\n}\na.text-primary:hover {\n  color: #286090;\n}\n.text-success {\n  color: #3c763d;\n}\na.text-success:hover {\n  color: #2b542c;\n}\n.text-info {\n  color: #31708f;\n}\na.text-info:hover {\n  color: #245269;\n}\n.text-warning {\n  color: #8a6d3b;\n}\na.text-warning:hover {\n  color: #66512c;\n}\n.text-danger {\n  color: #a94442;\n}\na.text-danger:hover {\n  color: #843534;\n}\n.bg-primary {\n  color: #fff;\n  background-color: #337ab7;\n}\na.bg-primary:hover {\n  background-color: #286090;\n}\n.bg-success {\n  background-color: #dff0d8;\n}\na.bg-success:hover {\n  background-color: #c1e2b3;\n}\n.bg-info {\n  background-color: #d9edf7;\n}\na.bg-info:hover {\n  background-color: #afd9ee;\n}\n.bg-warning {\n  background-color: #fcf8e3;\n}\na.bg-warning:hover {\n  background-color: #f7ecb5;\n}\n.bg-danger {\n  background-color: #f2dede;\n}\na.bg-danger:hover {\n  background-color: #e4b9b9;\n}\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eee;\n}\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n.list-inline {\n  padding-left: 0;\n  margin-left: -5px;\n  list-style: none;\n}\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 1.42857143;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #777;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  font-size: 17.5px;\n  border-left: 5px solid #eee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n  margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n  display: block;\n  font-size: 80%;\n  line-height: 1.42857143;\n  color: #777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  text-align: right;\n  border-right: 5px solid #eee;\n  border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #fff;\n  background-color: #333;\n  border-radius: 3px;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: bold;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  color: #333;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border-radius: 0;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n.container {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\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  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n.row {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n.col-xs-1,\n.col-sm-1,\n.col-md-1,\n.col-lg-1,\n.col-xs-2,\n.col-sm-2,\n.col-md-2,\n.col-lg-2,\n.col-xs-3,\n.col-sm-3,\n.col-md-3,\n.col-lg-3,\n.col-xs-4,\n.col-sm-4,\n.col-md-4,\n.col-lg-4,\n.col-xs-5,\n.col-sm-5,\n.col-md-5,\n.col-lg-5,\n.col-xs-6,\n.col-sm-6,\n.col-md-6,\n.col-lg-6,\n.col-xs-7,\n.col-sm-7,\n.col-md-7,\n.col-lg-7,\n.col-xs-8,\n.col-sm-8,\n.col-md-8,\n.col-lg-8,\n.col-xs-9,\n.col-sm-9,\n.col-md-9,\n.col-lg-9,\n.col-xs-10,\n.col-sm-10,\n.col-md-10,\n.col-lg-10,\n.col-xs-11,\n.col-sm-11,\n.col-md-11,\n.col-lg-11,\n.col-xs-12,\n.col-sm-12,\n.col-md-12,\n.col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12 {\n  float: left;\n}\n.col-xs-12 {\n  width: 100%;\n}\n.col-xs-11 {\n  width: 91.66666667%;\n}\n.col-xs-10 {\n  width: 83.33333333%;\n}\n.col-xs-9 {\n  width: 75%;\n}\n.col-xs-8 {\n  width: 66.66666667%;\n}\n.col-xs-7 {\n  width: 58.33333333%;\n}\n.col-xs-6 {\n  width: 50%;\n}\n.col-xs-5 {\n  width: 41.66666667%;\n}\n.col-xs-4 {\n  width: 33.33333333%;\n}\n.col-xs-3 {\n  width: 25%;\n}\n.col-xs-2 {\n  width: 16.66666667%;\n}\n.col-xs-1 {\n  width: 8.33333333%;\n}\n.col-xs-pull-12 {\n  right: 100%;\n}\n.col-xs-pull-11 {\n  right: 91.66666667%;\n}\n.col-xs-pull-10 {\n  right: 83.33333333%;\n}\n.col-xs-pull-9 {\n  right: 75%;\n}\n.col-xs-pull-8 {\n  right: 66.66666667%;\n}\n.col-xs-pull-7 {\n  right: 58.33333333%;\n}\n.col-xs-pull-6 {\n  right: 50%;\n}\n.col-xs-pull-5 {\n  right: 41.66666667%;\n}\n.col-xs-pull-4 {\n  right: 33.33333333%;\n}\n.col-xs-pull-3 {\n  right: 25%;\n}\n.col-xs-pull-2 {\n  right: 16.66666667%;\n}\n.col-xs-pull-1 {\n  right: 8.33333333%;\n}\n.col-xs-pull-0 {\n  right: auto;\n}\n.col-xs-push-12 {\n  left: 100%;\n}\n.col-xs-push-11 {\n  left: 91.66666667%;\n}\n.col-xs-push-10 {\n  left: 83.33333333%;\n}\n.col-xs-push-9 {\n  left: 75%;\n}\n.col-xs-push-8 {\n  left: 66.66666667%;\n}\n.col-xs-push-7 {\n  left: 58.33333333%;\n}\n.col-xs-push-6 {\n  left: 50%;\n}\n.col-xs-push-5 {\n  left: 41.66666667%;\n}\n.col-xs-push-4 {\n  left: 33.33333333%;\n}\n.col-xs-push-3 {\n  left: 25%;\n}\n.col-xs-push-2 {\n  left: 16.66666667%;\n}\n.col-xs-push-1 {\n  left: 8.33333333%;\n}\n.col-xs-push-0 {\n  left: auto;\n}\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n.col-xs-offset-11 {\n  margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n  margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n.col-xs-offset-8 {\n  margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n  margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n.col-xs-offset-5 {\n  margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n  margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n.col-xs-offset-2 {\n  margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n  margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .col-sm-1,\n  .col-sm-2,\n  .col-sm-3,\n  .col-sm-4,\n  .col-sm-5,\n  .col-sm-6,\n  .col-sm-7,\n  .col-sm-8,\n  .col-sm-9,\n  .col-sm-10,\n  .col-sm-11,\n  .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666667%;\n  }\n  .col-sm-10 {\n    width: 83.33333333%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666667%;\n  }\n  .col-sm-7 {\n    width: 58.33333333%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.66666667%;\n  }\n  .col-sm-1 {\n    width: 8.33333333%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-sm-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-sm-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-sm-pull-0 {\n    right: auto;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666667%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666667%;\n  }\n  .col-sm-push-7 {\n    left: 58.33333333%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.66666667%;\n  }\n  .col-sm-push-1 {\n    left: 8.33333333%;\n  }\n  .col-sm-push-0 {\n    left: auto;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0;\n  }\n}\n@media (min-width: 992px) {\n  .col-md-1,\n  .col-md-2,\n  .col-md-3,\n  .col-md-4,\n  .col-md-5,\n  .col-md-6,\n  .col-md-7,\n  .col-md-8,\n  .col-md-9,\n  .col-md-10,\n  .col-md-11,\n  .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666667%;\n  }\n  .col-md-10 {\n    width: 83.33333333%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666667%;\n  }\n  .col-md-7 {\n    width: 58.33333333%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.66666667%;\n  }\n  .col-md-1 {\n    width: 8.33333333%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-md-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-md-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666667%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666667%;\n  }\n  .col-md-push-7 {\n    left: 58.33333333%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.66666667%;\n  }\n  .col-md-push-1 {\n    left: 8.33333333%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0;\n  }\n}\n@media (min-width: 1200px) {\n  .col-lg-1,\n  .col-lg-2,\n  .col-lg-3,\n  .col-lg-4,\n  .col-lg-5,\n  .col-lg-6,\n  .col-lg-7,\n  .col-lg-8,\n  .col-lg-9,\n  .col-lg-10,\n  .col-lg-11,\n  .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666667%;\n  }\n  .col-lg-10 {\n    width: 83.33333333%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666667%;\n  }\n  .col-lg-7 {\n    width: 58.33333333%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.66666667%;\n  }\n  .col-lg-1 {\n    width: 8.33333333%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-lg-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-lg-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666667%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666667%;\n  }\n  .col-lg-push-7 {\n    left: 58.33333333%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.66666667%;\n  }\n  .col-lg-push-1 {\n    left: 8.33333333%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0;\n  }\n}\ntable {\n  background-color: transparent;\n}\ncaption {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  color: #777;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.42857143;\n  vertical-align: top;\n  border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n  border-top: 0;\n}\n.table > tbody + tbody {\n  border-top: 2px solid #ddd;\n}\n.table .table {\n  background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n  padding: 5px;\n}\n.table-bordered {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n  background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n  position: static;\n  display: table-column;\n  float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  position: static;\n  display: table-cell;\n  float: none;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n  background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n  background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n  background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc;\n}\n.table-responsive {\n  min-height: .01%;\n  overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid #ddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  line-height: normal;\n}\ninput[type=\"file\"] {\n  display: block;\n}\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555;\n}\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\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  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s;\n  -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n  transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n  color: #999;\n  opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n  color: #999;\n}\n.form-control::-webkit-input-placeholder {\n  color: #999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  background-color: #eee;\n  opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n}\ntextarea.form-control {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"],\n  input[type=\"time\"],\n  input[type=\"datetime-local\"],\n  input[type=\"month\"] {\n    line-height: 34px;\n  }\n  input[type=\"date\"].input-sm,\n  input[type=\"time\"].input-sm,\n  input[type=\"datetime-local\"].input-sm,\n  input[type=\"month\"].input-sm,\n  .input-group-sm input[type=\"date\"],\n  .input-group-sm input[type=\"time\"],\n  .input-group-sm input[type=\"datetime-local\"],\n  .input-group-sm input[type=\"month\"] {\n    line-height: 30px;\n  }\n  input[type=\"date\"].input-lg,\n  input[type=\"time\"].input-lg,\n  input[type=\"datetime-local\"].input-lg,\n  input[type=\"month\"].input-lg,\n  .input-group-lg input[type=\"date\"],\n  .input-group-lg input[type=\"time\"],\n  .input-group-lg input[type=\"datetime-local\"],\n  .input-group-lg input[type=\"month\"] {\n    line-height: 46px;\n  }\n}\n.form-group {\n  margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n  min-height: 20px;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-top: 4px \\9;\n  margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n  position: relative;\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  vertical-align: middle;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n  cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n  cursor: not-allowed;\n}\n.form-control-static {\n  min-height: 34px;\n  padding-top: 7px;\n  padding-bottom: 7px;\n  margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n  padding-right: 0;\n  padding-left: 0;\n}\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n  height: auto;\n}\n.form-group-sm .form-control {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.form-group-sm .form-control {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.form-group-sm .form-control,\nselect[multiple].form-group-sm .form-control {\n  height: auto;\n}\n.form-group-sm .form-control-static {\n  height: 30px;\n  min-height: 32px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n}\n.input-lg {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\nselect.input-lg {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n  height: auto;\n}\n.form-group-lg .form-control {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\nselect.form-group-lg .form-control {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.form-group-lg .form-control,\nselect[multiple].form-group-lg .form-control {\n  height: auto;\n}\n.form-group-lg .form-control-static {\n  height: 46px;\n  min-height: 38px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n}\n.has-feedback {\n  position: relative;\n}\n.has-feedback .form-control {\n  padding-right: 42.5px;\n}\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2;\n  display: block;\n  width: 34px;\n  height: 34px;\n  line-height: 34px;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback {\n  width: 46px;\n  height: 46px;\n  line-height: 46px;\n}\n.input-sm + .form-control-feedback {\n  width: 30px;\n  height: 30px;\n  line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n  color: #3c763d;\n}\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n  border-color: #2b542c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n  color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n  color: #8a6d3b;\n}\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n  color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n  color: #a94442;\n}\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n  border-color: #843534;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #a94442;\n}\n.has-error .form-control-feedback {\n  color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n  top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n  top: 0;\n}\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-static {\n    display: inline-block;\n  }\n  .form-inline .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .form-inline .input-group .input-group-addon,\n  .form-inline .input-group .input-group-btn,\n  .form-inline .input-group .form-control {\n    width: auto;\n  }\n  .form-inline .input-group > .form-control {\n    width: 100%;\n  }\n  .form-inline .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio label,\n  .form-inline .checkbox label {\n    padding-left: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .form-inline .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    padding-top: 7px;\n    margin-bottom: 0;\n    text-align: right;\n  }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n  right: 15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-lg .control-label {\n    padding-top: 14.333333px;\n  }\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-sm .control-label {\n    padding-top: 6px;\n  }\n}\n.btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  -ms-touch-action: manipulation;\n  touch-action: manipulation;\n  cursor: pointer;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n  color: #333;\n  text-decoration: none;\n}\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  pointer-events: none;\n  cursor: not-allowed;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n  box-shadow: none;\n  opacity: .65;\n}\n.btn-default {\n  color: #333;\n  background-color: #fff;\n  border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus,\n.btn-default.focus,\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  background-image: none;\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: #fff;\n  border-color: #ccc;\n}\n.btn-default .badge {\n  color: #fff;\n  background-color: #333;\n}\n.btn-primary {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary.focus,\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  background-image: none;\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: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.btn-success {\n  color: #fff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success:hover,\n.btn-success:focus,\n.btn-success.focus,\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  background-image: none;\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: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success .badge {\n  color: #5cb85c;\n  background-color: #fff;\n}\n.btn-info {\n  color: #fff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info:hover,\n.btn-info:focus,\n.btn-info.focus,\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  background-image: none;\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: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info .badge {\n  color: #5bc0de;\n  background-color: #fff;\n}\n.btn-warning {\n  color: #fff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning.focus,\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  background-image: none;\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: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning .badge {\n  color: #f0ad4e;\n  background-color: #fff;\n}\n.btn-danger {\n  color: #fff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger.focus,\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  background-image: none;\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: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger .badge {\n  color: #d9534f;\n  background-color: #fff;\n}\n.btn-link {\n  font-weight: normal;\n  color: #337ab7;\n  border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n  color: #23527c;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #777;\n  text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity .15s linear;\n  -o-transition: opacity .15s linear;\n  transition: opacity .15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\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.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition-timing-function: ease;\n  -o-transition-timing-function: ease;\n  transition-timing-function: ease;\n  -webkit-transition-duration: .35s;\n  -o-transition-duration: .35s;\n  transition-duration: .35s;\n  -webkit-transition-property: height, visibility;\n  -o-transition-property: height, visibility;\n  transition-property: height, visibility;\n}\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px dashed;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle:focus {\n  outline: 0;\n}\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  font-size: 14px;\n  text-align: left;\n  list-style: none;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n  background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n}\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.42857143;\n  color: #333;\n  white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #262626;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #fff;\n  text-decoration: none;\n  background-color: #337ab7;\n  outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.open > a {\n  outline: 0;\n}\n.dropdown-menu-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu-left {\n  right: auto;\n  left: 0;\n}\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.42857143;\n  color: #777;\n  white-space: nowrap;\n}\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 990;\n}\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  content: \"\";\n  border-top: 0;\n  border-bottom: 4px solid;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto;\n  }\n  .navbar-right .dropdown-menu-left {\n    right: auto;\n    left: 0;\n  }\n}\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n.btn-toolbar {\n  margin-left: -5px;\n}\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n  float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n  margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn .caret {\n  margin-left: 0;\n}\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  display: table-cell;\n  float: none;\n  width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n  left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n  float: none;\n  padding-right: 0;\n  padding-left: 0;\n}\n.input-group .form-control {\n  position: relative;\n  z-index: 2;\n  float: left;\n  width: 100%;\n  margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #555;\n  text-align: center;\n  background-color: #eee;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n.input-group-btn {\n  position: relative;\n  font-size: 0;\n  white-space: nowrap;\n}\n.input-group-btn > .btn {\n  position: relative;\n}\n.input-group-btn > .btn + .btn {\n  margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n  margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n  margin-left: -1px;\n}\n.nav {\n  padding-left: 0;\n  margin-bottom: 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: #eee;\n}\n.nav > li.disabled > a {\n  color: #777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #777;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eee;\n  border-color: #337ab7;\n}\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 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 #ddd;\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.42857143;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n  border-color: #eee #eee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555;\n  cursor: default;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-bottom-color: transparent;\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  margin-bottom: 5px;\n  text-align: center;\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: 4px;\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 #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 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: #fff;\n  }\n}\n.nav-pills > li {\n  float: left;\n}\n.nav-pills > li > a {\n  border-radius: 4px;\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: #fff;\n  background-color: #337ab7;\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  margin-bottom: 5px;\n  text-align: center;\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: 4px;\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 #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 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: #fff;\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-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n.navbar-collapse {\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\n  -webkit-overflow-scrolling: touch;\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}\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-right: 0;\n    padding-left: 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  height: 50px;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\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  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\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: 7.5px -15px;\n}\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\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: 20px;\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: 15px;\n    padding-bottom: 15px;\n  }\n}\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -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}\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    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 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-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  margin-bottom: 0;\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n  margin-top: 14px;\n  margin-bottom: 14px;\n}\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n  .navbar-text {\n    float: left;\n    margin-right: 15px;\n    margin-left: 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: #f8f8f8;\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n  color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n.navbar-default .navbar-text {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333;\n  background-color: transparent;\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: #555;\n  background-color: #e7e7e7;\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: #ccc;\n  background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n  border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e7e7e7;\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  color: #555;\n  background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777;\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: #333;\n    background-color: transparent;\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: #555;\n    background-color: #e7e7e7;\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: #ccc;\n    background-color: transparent;\n  }\n}\n.navbar-default .navbar-link {\n  color: #777;\n}\n.navbar-default .navbar-link:hover {\n  color: #333;\n}\n.navbar-default .btn-link {\n  color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n  color: #333;\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: #ccc;\n}\n.navbar-inverse {\n  background-color: #222;\n  border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #fff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #fff;\n  background-color: transparent;\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: #fff;\n  background-color: #080808;\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: #444;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n  border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\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  color: #fff;\n  background-color: #080808;\n}\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #9d9d9d;\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: #fff;\n    background-color: transparent;\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: #fff;\n    background-color: #080808;\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: #444;\n    background-color: transparent;\n  }\n}\n.navbar-inverse .navbar-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #fff;\n}\n.navbar-inverse .btn-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n  color: #fff;\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: #444;\n}\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n.breadcrumb > li {\n  display: inline-block;\n}\n.breadcrumb > li + li:before {\n  padding: 0 5px;\n  color: #ccc;\n  content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n  color: #777;\n}\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n.pagination > li {\n  display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  margin-left: -1px;\n  line-height: 1.42857143;\n  color: #337ab7;\n  text-decoration: none;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  color: #23527c;\n  background-color: #eee;\n  border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 2;\n  color: #fff;\n  cursor: default;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #fff;\n  border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-top-left-radius: 6px;\n  border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-top-right-radius: 6px;\n  border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-top-left-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n}\n.pager li {\n  display: inline;\n}\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eee;\n}\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #fff;\n}\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.label:empty {\n  display: none;\n}\n.btn .label {\n  position: relative;\n  top: -1px;\n}\n.label-default {\n  background-color: #777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #5e5e5e;\n}\n.label-primary {\n  background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #286090;\n}\n.label-success {\n  background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n.label-info {\n  background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n.label-warning {\n  background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n.label-danger {\n  background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  background-color: #777;\n  border-radius: 10px;\n}\n.badge:empty {\n  display: none;\n}\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n  top: 0;\n  padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #337ab7;\n  background-color: #fff;\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.jumbotron {\n  padding: 30px 15px;\n  margin-bottom: 30px;\n  color: inherit;\n  background-color: #eee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n  color: inherit;\n}\n.jumbotron p {\n  margin-bottom: 15px;\n  font-size: 21px;\n  font-weight: 200;\n}\n.jumbotron > hr {\n  border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n  border-radius: 6px;\n}\n.jumbotron .container {\n  max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding: 48px 0;\n  }\n  .container .jumbotron,\n  .container-fluid .jumbotron {\n    padding-right: 60px;\n    padding-left: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 63px;\n  }\n}\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: border 0.2s ease-in-out;\n  -o-transition: border 0.2s ease-in-out;\n  transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n  margin-right: auto;\n  margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #337ab7;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #333;\n}\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n.alert .alert-link {\n  font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n.alert > p + p {\n  margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n  padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n.alert-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n  color: #2b542c;\n}\n.alert-info {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n  color: #245269;\n}\n.alert-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n  color: #66512c;\n}\n.alert-danger {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n  color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@-o-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n  float: left;\n  width: 0;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #fff;\n  text-align: center;\n  background-color: #337ab7;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-transition: width .6s ease;\n  -o-transition: width .6s ease;\n  transition: width .6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  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);\n  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);\n  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);\n  -webkit-background-size: 40px 40px;\n  background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n  -o-animation: progress-bar-stripes 2s linear infinite;\n  animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n  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);\n  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);\n  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);\n}\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n  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);\n  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);\n  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);\n}\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n  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);\n  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);\n  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);\n}\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n  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);\n  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);\n  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);\n}\n.media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n.media-body {\n  width: 10000px;\n}\n.media-object {\n  display: block;\n}\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n.media-middle {\n  vertical-align: middle;\n}\n.media-bottom {\n  vertical-align: bottom;\n}\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\n}\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\na.list-group-item {\n  color: #555;\n}\na.list-group-item .list-group-item-heading {\n  color: #333;\n}\na.list-group-item:hover,\na.list-group-item:focus {\n  color: #555;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #eee;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n  color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n  color: #777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n  color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #c7ddef;\n}\n.list-group-item-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n}\na.list-group-item-success {\n  color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-success:hover,\na.list-group-item-success:focus {\n  color: #3c763d;\n  background-color: #d0e9c6;\n}\na.list-group-item-success.active,\na.list-group-item-success.active:hover,\na.list-group-item-success.active:focus {\n  color: #fff;\n  background-color: #3c763d;\n  border-color: #3c763d;\n}\n.list-group-item-info {\n  color: #31708f;\n  background-color: #d9edf7;\n}\na.list-group-item-info {\n  color: #31708f;\n}\na.list-group-item-info .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-info:hover,\na.list-group-item-info:focus {\n  color: #31708f;\n  background-color: #c4e3f3;\n}\na.list-group-item-info.active,\na.list-group-item-info.active:hover,\na.list-group-item-info.active:focus {\n  color: #fff;\n  background-color: #31708f;\n  border-color: #31708f;\n}\n.list-group-item-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n}\na.list-group-item-warning {\n  color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-warning:hover,\na.list-group-item-warning:focus {\n  color: #8a6d3b;\n  background-color: #faf2cc;\n}\na.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus {\n  color: #fff;\n  background-color: #8a6d3b;\n  border-color: #8a6d3b;\n}\n.list-group-item-danger {\n  color: #a94442;\n  background-color: #f2dede;\n}\na.list-group-item-danger {\n  color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-danger:hover,\na.list-group-item-danger:focus {\n  color: #a94442;\n  background-color: #ebcccc;\n}\na.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus {\n  color: #fff;\n  background-color: #a94442;\n  border-color: #a94442;\n}\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n.panel {\n  margin-bottom: 20px;\n  background-color: #fff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n  padding: 15px;\n}\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n  color: inherit;\n}\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #ddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n  margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n  border-width: 1px 0;\n  border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n  border-top: 0;\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n  border-bottom: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n  margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n  padding-right: 15px;\n  padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n  border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n  border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n  border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n  border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n  border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n  border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n  border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n  border-bottom: 0;\n}\n.panel > .table-responsive {\n  margin-bottom: 0;\n  border: 0;\n}\n.panel-group {\n  margin-bottom: 20px;\n}\n.panel-group .panel {\n  margin-bottom: 0;\n  border-radius: 4px;\n}\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n  border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n  border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #ddd;\n}\n.panel-default {\n  border-color: #ddd;\n}\n.panel-default > .panel-heading {\n  color: #333;\n  background-color: #f5f5f5;\n  border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n  color: #f5f5f5;\n  background-color: #333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ddd;\n}\n.panel-primary {\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #337ab7;\n}\n.panel-success {\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n  color: #dff0d8;\n  background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n.panel-info {\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n  color: #d9edf7;\n  background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #bce8f1;\n}\n.panel-warning {\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n  color: #fcf8e3;\n  background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #faebcc;\n}\n.panel-danger {\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n  color: #f2dede;\n  background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 0;\n}\n.embed-responsive-16by9 {\n  padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n  padding-bottom: 75%;\n}\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #fff;\n  filter: alpha(opacity=20);\n  opacity: .2;\n}\n.close:hover,\n.close:focus {\n  color: #000;\n  text-decoration: none;\n  cursor: pointer;\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\nbutton.close {\n  -webkit-appearance: none;\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n}\n.modal-open {\n  overflow: hidden;\n}\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1050;\n  display: none;\n  overflow: hidden;\n  -webkit-overflow-scrolling: touch;\n  outline: 0;\n}\n.modal.fade .modal-dialog {\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n  -o-transition: -o-transform 0.3s ease-out;\n  transition: transform 0.3s ease-out;\n  -webkit-transform: translate(0, -25%);\n  -ms-transform: translate(0, -25%);\n  -o-transform: translate(0, -25%);\n  transform: translate(0, -25%);\n}\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n  -ms-transform: translate(0, 0);\n  -o-transform: translate(0, 0);\n  transform: translate(0, 0);\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n.modal-content {\n  position: relative;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n  background-clip: padding-box;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  outline: 0;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n}\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  background-color: #000;\n}\n.modal-backdrop.fade {\n  filter: alpha(opacity=0);\n  opacity: 0;\n}\n.modal-backdrop.in {\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\n.modal-header {\n  min-height: 16.42857143px;\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n  margin-top: -2px;\n}\n.modal-title {\n  margin: 0;\n  line-height: 1.42857143;\n}\n.modal-body {\n  position: relative;\n  padding: 15px;\n}\n.modal-footer {\n  padding: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n@media (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n  }\n  .modal-sm {\n    width: 300px;\n  }\n}\n@media (min-width: 992px) {\n  .modal-lg {\n    width: 900px;\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 12px;\n  font-weight: normal;\n  line-height: 1.4;\n  filter: alpha(opacity=0);\n  opacity: 0;\n}\n.tooltip.in {\n  filter: alpha(opacity=90);\n  opacity: .9;\n}\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #fff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000;\n  border-radius: 4px;\n}\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: left;\n  white-space: normal;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n  background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n  margin-top: -10px;\n}\n.popover.right {\n  margin-left: 10px;\n}\n.popover.bottom {\n  margin-top: 10px;\n}\n.popover.left {\n  margin-left: -10px;\n}\n.popover-title {\n  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n.popover-content {\n  padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover > .arrow {\n  border-width: 11px;\n}\n.popover > .arrow:after {\n  content: \"\";\n  border-width: 10px;\n}\n.popover.top > .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  content: \" \";\n  border-top-color: #fff;\n  border-bottom-width: 0;\n}\n.popover.right > .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n  border-left-width: 0;\n}\n.popover.right > .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  content: \" \";\n  border-right-color: #fff;\n  border-left-width: 0;\n}\n.popover.bottom > .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n.popover.bottom > .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  content: \" \";\n  border-top-width: 0;\n  border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  content: \" \";\n  border-right-width: 0;\n  border-left-color: #fff;\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: 0.6s ease-in-out left;\n  -o-transition: 0.6s ease-in-out left;\n  transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n  .carousel-inner > .item {\n    -webkit-transition: -webkit-transform 0.6s ease-in-out;\n    -o-transition: -o-transform 0.6s ease-in-out;\n    transition: transform 0.6s ease-in-out;\n    -webkit-backface-visibility: hidden;\n    backface-visibility: hidden;\n    -webkit-perspective: 1000;\n    perspective: 1000;\n  }\n  .carousel-inner > .item.next,\n  .carousel-inner > .item.active.right {\n    left: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n  .carousel-inner > .item.prev,\n  .carousel-inner > .item.active.left {\n    left: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n  .carousel-inner > .item.next.left,\n  .carousel-inner > .item.prev.right,\n  .carousel-inner > .item.active {\n    left: 0;\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n  background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001)));\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n  background-repeat: repeat-x;\n}\n.carousel-control.right {\n  right: 0;\n  left: auto;\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n  background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5)));\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n  background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #fff;\n  text-decoration: none;\n  filter: alpha(opacity=90);\n  outline: 0;\n  opacity: .9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n  margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n  margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  font-family: serif;\n  line-height: 1;\n}\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n  border: 1px solid #fff;\n  border-radius: 10px;\n}\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #fff;\n}\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n  text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    font-size: 30px;\n  }\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .icon-prev {\n    margin-left: -15px;\n  }\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-next {\n    margin-right: -15px;\n  }\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n  clear: both;\n}\n.center-block {\n  display: block;\n  margin-right: auto;\n  margin-left: auto;\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.hidden {\n  display: none !important;\n}\n.affix {\n  position: fixed;\n}\n@-ms-viewport {\n  width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  table.visible-xs {\n    display: table;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-block {\n    display: block !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline {\n    display: inline !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  table.visible-sm {\n    display: table;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-block {\n    display: block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  table.visible-md {\n    display: table;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-block {\n    display: block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  table.visible-lg {\n    display: table;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-block {\n    display: block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n}\n.visible-print {\n  display: none !important;\n}\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  table.visible-print {\n    display: table;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n}\n.visible-print-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-block {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline-block {\n    display: inline-block !important;\n  }\n}\n@media print {\n  .hidden-print {\n    display: none !important;\n  }\n}\n/*# sourceMappingURL=bootstrap.css.map */\nhtml,\nbody {\n  height: 100%;\n}\nbody {\n  font-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  color: #646464;\n  background-color: #f5f5f5;\n}\n.no-focus *:focus {\n  outline: 0 !important;\n}\na {\n  color: #5c90d2;\n  -webkit-transition: color 0.12s ease-out;\n  transition: color 0.12s ease-out;\n}\na.link-effect {\n  position: relative;\n}\na.link-effect:before {\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 2px;\n  content: \"\";\n  background-color: #3169b1;\n  visibility: hidden;\n  -webkit-transform: scaleX(0);\n  -ms-transform: scaleX(0);\n  transform: scaleX(0);\n  -webkit-transition: -webkit-transform 0.12s ease-out;\n  transition: transform 0.12s ease-out;\n}\na:hover,\na:focus {\n  color: #3169b1;\n  text-decoration: none;\n}\na:hover.link-effect:before,\na:focus.link-effect:before {\n  visibility: visible;\n  -webkit-transform: scaleX(1);\n  -ms-transform: scaleX(1);\n  transform: scaleX(1);\n}\na:active {\n  color: #5c90d2;\n}\na.inactive {\n  cursor: not-allowed;\n}\na.inactive:focus {\n  background-color: transparent !important;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  margin: 0;\n  font-family: \"Source Sans Pro\", \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-weight: 600;\n  line-height: 1.2;\n  color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n  font-weight: 600;\n  font-size: 85%;\n  color: #777;\n}\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-weight: inherit;\n}\nh1,\n.h1 {\n  font-size: 36px;\n}\nh2,\n.h2 {\n  font-size: 30px;\n}\nh3,\n.h3 {\n  font-size: 24px;\n}\nh4,\n.h4 {\n  font-size: 20px;\n}\nh5,\n.h5 {\n  font-size: 16px;\n}\nh6,\n.h6 {\n  font-size: 14px;\n}\n.page-heading {\n  color: #545454;\n  font-size: 28px;\n  font-weight: 400;\n}\n.page-heading small {\n  margin-top: 5px;\n  display: block;\n  color: #777;\n  font-size: 16px;\n  font-weight: 300;\n  line-height: 1.4;\n}\n@media screen and (min-width: 768px) {\n  .page-heading small {\n    margin-top: 0;\n    display: inline;\n    line-height: inherit;\n  }\n}\n.content-heading {\n  margin-top: 15px;\n  margin-bottom: 15px;\n  font-weight: 600;\n  font-size: 15px;\n  color: #8c8c8c;\n  text-transform: uppercase;\n}\n.content-heading small {\n  font-size: 13px;\n  font-weight: normal;\n  color: #999999;\n  text-transform: none;\n}\n@media screen and (min-width: 768px) {\n  .content-heading {\n    margin-top: 25px;\n  }\n}\n.font-w300 {\n  font-weight: 300 !important;\n}\n.font-w400 {\n  font-weight: 400 !important;\n}\n.font-w600 {\n  font-weight: 600 !important;\n}\n.font-w700 {\n  font-weight: 700 !important;\n}\n.font-s12 {\n  font-size: 12px !important;\n}\n.font-s13 {\n  font-size: 13px !important;\n}\n.font-s36 {\n  font-size: 36px !important;\n}\n.font-s48 {\n  font-size: 48px !important;\n}\n.font-s64 {\n  font-size: 64px !important;\n}\n.font-s96 {\n  font-size: 96px !important;\n}\n.font-s128 {\n  font-size: 128px !important;\n}\np {\n  line-height: 1.6;\n}\np.nice-copy,\n.nice-copy p {\n  line-height: 1.8;\n}\n.text-muted {\n  color: #999999;\n}\na.text-muted:hover,\na.text-muted:active,\na.text-muted:focus,\nbutton.text-muted:hover,\nbutton.text-muted:active,\nbutton.text-muted:focus {\n  color: #999999;\n  opacity: .75;\n}\n.text-primary {\n  color: #5c90d2;\n}\na.text-primary:hover,\na.text-primary:active,\na.text-primary:focus,\nbutton.text-primary:hover,\nbutton.text-primary:active,\nbutton.text-primary:focus {\n  color: #5c90d2;\n  opacity: .75;\n}\n.text-primary-dark {\n  color: #3e4a59;\n}\na.text-primary-dark:hover,\na.text-primary-dark:active,\na.text-primary-dark:focus,\nbutton.text-primary-dark:hover,\nbutton.text-primary-dark:active,\nbutton.text-primary-dark:focus {\n  color: #3e4a59;\n  opacity: .75;\n}\n.text-primary-darker {\n  color: #2c343f;\n}\na.text-primary-darker:hover,\na.text-primary-darker:active,\na.text-primary-darker:focus,\nbutton.text-primary-darker:hover,\nbutton.text-primary-darker:active,\nbutton.text-primary-darker:focus {\n  color: #2c343f;\n  opacity: .75;\n}\n.text-primary-light {\n  color: #98b9e3;\n}\na.text-primary-light:hover,\na.text-primary-light:active,\na.text-primary-light:focus,\nbutton.text-primary-light:hover,\nbutton.text-primary-light:active,\nbutton.text-primary-light:focus {\n  color: #98b9e3;\n  opacity: .75;\n}\n.text-primary-lighter {\n  color: #ccdcf1;\n}\na.text-primary-lighter:hover,\na.text-primary-lighter:active,\na.text-primary-lighter:focus,\nbutton.text-primary-lighter:hover,\nbutton.text-primary-lighter:active,\nbutton.text-primary-lighter:focus {\n  color: #ccdcf1;\n  opacity: .75;\n}\n.text-success {\n  color: #46c37b;\n}\na.text-success:hover,\na.text-success:active,\na.text-success:focus,\nbutton.text-success:hover,\nbutton.text-success:active,\nbutton.text-success:focus {\n  color: #46c37b;\n  opacity: .75;\n}\n.text-warning {\n  color: #f3b760;\n}\na.text-warning:hover,\na.text-warning:active,\na.text-warning:focus,\nbutton.text-warning:hover,\nbutton.text-warning:active,\nbutton.text-warning:focus {\n  color: #f3b760;\n  opacity: .75;\n}\n.text-info {\n  color: #70b9eb;\n}\na.text-info:hover,\na.text-info:active,\na.text-info:focus,\nbutton.text-info:hover,\nbutton.text-info:active,\nbutton.text-info:focus {\n  color: #70b9eb;\n  opacity: .75;\n}\n.text-danger {\n  color: #d26a5c;\n}\na.text-danger:hover,\na.text-danger:active,\na.text-danger:focus,\nbutton.text-danger:hover,\nbutton.text-danger:active,\nbutton.text-danger:focus {\n  color: #d26a5c;\n  opacity: .75;\n}\n.text-success-light {\n  color: #e0f5e9;\n}\na.text-success-light:hover,\na.text-success-light:active,\na.text-success-light:focus,\nbutton.text-success-light:hover,\nbutton.text-success-light:active,\nbutton.text-success-light:focus {\n  color: #e0f5e9;\n  opacity: .75;\n}\n.text-warning-light {\n  color: #fdf3e5;\n}\na.text-warning-light:hover,\na.text-warning-light:active,\na.text-warning-light:focus,\nbutton.text-warning-light:hover,\nbutton.text-warning-light:active,\nbutton.text-warning-light:focus {\n  color: #fdf3e5;\n  opacity: .75;\n}\n.text-info-light {\n  color: #edf6fd;\n}\na.text-info-light:hover,\na.text-info-light:active,\na.text-info-light:focus,\nbutton.text-info-light:hover,\nbutton.text-info-light:active,\nbutton.text-info-light:focus {\n  color: #edf6fd;\n  opacity: .75;\n}\n.text-danger-light {\n  color: #f9eae8;\n}\na.text-danger-light:hover,\na.text-danger-light:active,\na.text-danger-light:focus,\nbutton.text-danger-light:hover,\nbutton.text-danger-light:active,\nbutton.text-danger-light:focus {\n  color: #f9eae8;\n  opacity: .75;\n}\n.text-white {\n  color: #ffffff;\n}\na.text-white:hover,\na.text-white:active,\na.text-white:focus,\nbutton.text-white:hover,\nbutton.text-white:active,\nbutton.text-white:focus {\n  color: #ffffff;\n  opacity: .75;\n}\n.text-white-op {\n  color: rgba(255, 255, 255, 0.85);\n}\na.text-white-op:hover,\na.text-white-op:active,\na.text-white-op:focus,\nbutton.text-white-op:hover,\nbutton.text-white-op:active,\nbutton.text-white-op:focus {\n  color: rgba(255, 255, 255, 0.85);\n  opacity: .75;\n}\n.text-black {\n  color: #000000;\n}\na.text-black:hover,\na.text-black:active,\na.text-black:focus,\nbutton.text-black:hover,\nbutton.text-black:active,\nbutton.text-black:focus {\n  color: #000000;\n  opacity: .75;\n}\n.text-black-op {\n  color: rgba(0, 0, 0, 0.5);\n}\na.text-black-op:hover,\na.text-black-op:active,\na.text-black-op:focus,\nbutton.text-black-op:hover,\nbutton.text-black-op:active,\nbutton.text-black-op:focus {\n  color: rgba(0, 0, 0, 0.5);\n  opacity: .75;\n}\n.text-gray {\n  color: #c9c9c9;\n}\na.text-gray:hover,\na.text-gray:active,\na.text-gray:focus,\nbutton.text-gray:hover,\nbutton.text-gray:active,\nbutton.text-gray:focus {\n  color: #c9c9c9;\n  opacity: .75;\n}\n.text-gray-dark {\n  color: #999999;\n}\na.text-gray-dark:hover,\na.text-gray-dark:active,\na.text-gray-dark:focus,\nbutton.text-gray-dark:hover,\nbutton.text-gray-dark:active,\nbutton.text-gray-dark:focus {\n  color: #999999;\n  opacity: .75;\n}\n.text-gray-darker {\n  color: #393939;\n}\na.text-gray-darker:hover,\na.text-gray-darker:active,\na.text-gray-darker:focus,\nbutton.text-gray-darker:hover,\nbutton.text-gray-darker:active,\nbutton.text-gray-darker:focus {\n  color: #393939;\n  opacity: .75;\n}\n.text-gray-light {\n  color: #f3f3f3;\n}\na.text-gray-light:hover,\na.text-gray-light:active,\na.text-gray-light:focus,\nbutton.text-gray-light:hover,\nbutton.text-gray-light:active,\nbutton.text-gray-light:focus {\n  color: #f3f3f3;\n  opacity: .75;\n}\n.text-gray-lighter {\n  color: #f9f9f9;\n}\na.text-gray-lighter:hover,\na.text-gray-lighter:active,\na.text-gray-lighter:focus,\nbutton.text-gray-lighter:hover,\nbutton.text-gray-lighter:active,\nbutton.text-gray-lighter:focus {\n  color: #f9f9f9;\n  opacity: .75;\n}\n.bg-muted {\n  background-color: #999999;\n}\na.bg-muted:hover {\n  background-color: #808080;\n}\n.bg-primary {\n  background-color: #5c90d2;\n}\na.bg-primary:hover {\n  background-color: #3675c5;\n}\n.bg-primary-op {\n  background-color: rgba(92, 144, 210, 0.75);\n}\na.bg-primary-op:hover {\n  background-color: rgba(54, 117, 197, 0.75);\n}\n.bg-primary-dark {\n  background-color: #3e4a59;\n}\na.bg-primary-dark:hover {\n  background-color: #29313b;\n}\n.bg-primary-dark-op {\n  background-color: rgba(62, 74, 89, 0.83);\n}\na.bg-primary-dark-op:hover {\n  background-color: rgba(41, 49, 59, 0.83);\n}\n.bg-primary-darker {\n  background-color: #2c343f;\n}\na.bg-primary-darker:hover {\n  background-color: #171b21;\n}\n.bg-primary-light {\n  background-color: #98b9e3;\n}\na.bg-primary-light:hover {\n  background-color: #709ed8;\n}\n.bg-primary-lighter {\n  background-color: #ccdcf1;\n}\na.bg-primary-lighter:hover {\n  background-color: #a4c1e6;\n}\n.bg-success {\n  background-color: #46c37b;\n}\na.bg-success:hover {\n  background-color: #34a263;\n}\n.bg-warning {\n  background-color: #f3b760;\n}\na.bg-warning:hover {\n  background-color: #efa231;\n}\n.bg-info {\n  background-color: #70b9eb;\n}\na.bg-info:hover {\n  background-color: #43a3e5;\n}\n.bg-danger {\n  background-color: #d26a5c;\n}\na.bg-danger:hover {\n  background-color: #c54736;\n}\n.bg-success-light {\n  background-color: #e0f5e9;\n}\na.bg-success-light:hover {\n  background-color: #b9e9ce;\n}\n.bg-warning-light {\n  background-color: #fdf3e5;\n}\na.bg-warning-light:hover {\n  background-color: #f9ddb6;\n}\n.bg-info-light {\n  background-color: #edf6fd;\n}\na.bg-info-light:hover {\n  background-color: #bfdff8;\n}\n.bg-danger-light {\n  background-color: #f9eae8;\n}\na.bg-danger-light:hover {\n  background-color: #eec5c0;\n}\n.bg-white {\n  background-color: #ffffff;\n}\na.bg-white:hover {\n  background-color: #e6e6e6;\n}\n.bg-white-op {\n  background-color: rgba(255, 255, 255, 0.075);\n}\n.bg-black {\n  background-color: #000000;\n}\na.bg-black:hover {\n  background-color: #000000;\n}\n.bg-black-op {\n  background-color: rgba(0, 0, 0, 0.4);\n}\n.bg-gray {\n  background-color: #c9c9c9;\n}\na.bg-gray:hover {\n  background-color: #b0b0b0;\n}\n.bg-gray-dark {\n  background-color: #999999;\n}\na.bg-gray-dark:hover {\n  background-color: #808080;\n}\n.bg-gray-darker {\n  background-color: #393939;\n}\na.bg-gray-darker:hover {\n  background-color: #202020;\n}\n.bg-gray-light {\n  background-color: #f3f3f3;\n}\na.bg-gray-light:hover {\n  background-color: #dadada;\n}\n.bg-gray-lighter {\n  background-color: #f9f9f9;\n}\na.bg-gray-lighter:hover {\n  background-color: #e0e0e0;\n}\n.btn {\n  font-weight: 600;\n  border-radius: 2px;\n  -webkit-transition: all 0.15s ease-out;\n  transition: all 0.15s ease-out;\n}\n.btn:active,\n.btn.active {\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn.btn-square {\n  border-radius: 0;\n}\n.btn.btn-rounded {\n  border-radius: 20px;\n}\n.btn.btn-minw {\n  min-width: 110px;\n}\n.btn.btn-noborder {\n  border: none !important;\n}\n.btn.btn-image {\n  position: relative;\n  padding-left: 40px;\n}\n.btn.btn-image > img {\n  position: absolute;\n  top: 3px;\n  left: 3px;\n  display: block;\n  width: 26px;\n  height: 26px;\n  border-radius: 3px;\n}\n.btn > i.pull-left {\n  margin-top: 3px;\n  margin-right: 5px;\n}\n.btn > i.pull-right {\n  margin-top: 3px;\n  margin-left: 5px;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus {\n  text-decoration: none;\n}\n.btn-default {\n  color: #545454;\n  background-color: #f5f5f5;\n  border-color: #e9e9e9;\n}\n.btn-default:hover,\n.btn-default:focus,\n.btn-default.focus,\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  color: #545454;\n  background-color: #e1e1e1;\n  border-color: #cacaca;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  background-color: #c7c7c7;\n  border-color: #b1b1b1;\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: #f5f5f5;\n  border-color: #e9e9e9;\n}\n.btn-default .badge {\n  color: #f5f5f5;\n  background-color: #545454;\n}\n.btn-primary {\n  color: #ffffff;\n  background-color: #5c90d2;\n  border-color: #3675c5;\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary.focus,\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  color: #ffffff;\n  background-color: #3c7ac9;\n  border-color: #295995;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  background-color: #2d62a5;\n  border-color: #1e416d;\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: #5c90d2;\n  border-color: #3675c5;\n}\n.btn-primary .badge {\n  color: #5c90d2;\n  background-color: #ffffff;\n}\n.btn-success {\n  color: #ffffff;\n  background-color: #46c37b;\n  border-color: #34a263;\n}\n.btn-success:hover,\n.btn-success:focus,\n.btn-success.focus,\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  color: #ffffff;\n  background-color: #37a967;\n  border-color: #257346;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  background-color: #2a8350;\n  border-color: #194d2f;\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: #46c37b;\n  border-color: #34a263;\n}\n.btn-success .badge {\n  color: #46c37b;\n  background-color: #ffffff;\n}\n.btn-info {\n  color: #ffffff;\n  background-color: #70b9eb;\n  border-color: #43a3e5;\n}\n.btn-info:hover,\n.btn-info:focus,\n.btn-info.focus,\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  color: #ffffff;\n  background-color: #4ca7e6;\n  border-color: #1d86ce;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  background-color: #1f92e0;\n  border-color: #1769a1;\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: #70b9eb;\n  border-color: #43a3e5;\n}\n.btn-info .badge {\n  color: #70b9eb;\n  background-color: #ffffff;\n}\n.btn-warning {\n  color: #ffffff;\n  background-color: #f3b760;\n  border-color: #efa231;\n}\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning.focus,\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  color: #ffffff;\n  background-color: #f0a63a;\n  border-color: #d38310;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  background-color: #e68f11;\n  border-color: #a3660c;\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: #f3b760;\n  border-color: #efa231;\n}\n.btn-warning .badge {\n  color: #f3b760;\n  background-color: #ffffff;\n}\n.btn-danger {\n  color: #ffffff;\n  background-color: #d26a5c;\n  border-color: #c54736;\n}\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger.focus,\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  color: #ffffff;\n  background-color: #c94d3c;\n  border-color: #953629;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  background-color: #a53c2d;\n  border-color: #6d271e;\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: #d26a5c;\n  border-color: #c54736;\n}\n.btn-danger .badge {\n  color: #d26a5c;\n  background-color: #ffffff;\n}\nlabel {\n  font-size: 13px;\n  font-weight: 600;\n}\n.form-control {\n  color: #646464;\n  border: 1px solid #e6e6e6;\n  border-radius: 3px;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n  -webkit-transition: all 0.15s ease-out;\n  transition: all 0.15s ease-out;\n}\n.form-control::-moz-placeholder {\n  color: #aaaaaa;\n}\n.form-control:-ms-input-placeholder {\n  color: #aaaaaa;\n}\n.form-control::-webkit-input-placeholder {\n  color: #aaaaaa;\n}\n.form-control:focus {\n  border-color: #cccccc;\n  background-color: #fcfcfc;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\ntextarea.form-control {\n  max-width: 100%;\n}\ninput[type=\"text\"].form-control,\ninput[type=\"password\"].form-control,\ninput[type=\"email\"].form-control,\ntextarea.form-control {\n  -webkit-appearance: none;\n}\n.form-control.input-sm {\n  border-radius: 3px;\n}\n.form-control.input-lg {\n  font-size: 14px;\n  border-radius: 3px;\n}\n.input-group-lg .form-control {\n  font-size: 14px;\n}\n.form-group {\n  margin-bottom: 20px;\n}\n.form-bordered .form-group {\n  padding-bottom: 10px;\n  margin-bottom: 10px;\n  border-bottom: 1px solid #f3f3f3;\n}\n.form-bordered .form-group.form-actions {\n  border-bottom: none;\n}\n.help-block {\n  margin-top: 5px;\n  margin-bottom: 0;\n  font-style: italic;\n  font-size: 13px;\n  color: #a4a4a4;\n}\n.has-success > label,\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n  color: #46c37b;\n}\n.has-success .form-control {\n  border-color: #46c37b;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.has-success .form-control:focus {\n  border-color: #34a263;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.has-success .input-group-addon {\n  color: #46c37b;\n  border-color: #46c37b;\n  background-color: #ffffff;\n}\n.has-success .form-control-feedback {\n  color: #46c37b;\n}\n.has-info > label,\n.has-info .help-block,\n.has-info .control-label,\n.has-info .radio,\n.has-info .checkbox,\n.has-info .radio-inline,\n.has-info .checkbox-inline,\n.has-info.radio label,\n.has-info.checkbox label,\n.has-info.radio-inline label,\n.has-info.checkbox-inline label {\n  color: #70b9eb;\n}\n.has-info .form-control {\n  border-color: #70b9eb;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.has-info .form-control:focus {\n  border-color: #43a3e5;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.has-info .input-group-addon {\n  color: #70b9eb;\n  border-color: #70b9eb;\n  background-color: #ffffff;\n}\n.has-info .form-control-feedback {\n  color: #70b9eb;\n}\n.has-warning > label,\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n  color: #f3b760;\n}\n.has-warning .form-control {\n  border-color: #f3b760;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.has-warning .form-control:focus {\n  border-color: #efa231;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.has-warning .input-group-addon {\n  color: #f3b760;\n  border-color: #f3b760;\n  background-color: #ffffff;\n}\n.has-warning .form-control-feedback {\n  color: #f3b760;\n}\n.has-error > label,\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n  color: #d26a5c;\n}\n.has-error .form-control {\n  border-color: #d26a5c;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.has-error .form-control:focus {\n  border-color: #c54736;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.has-error .input-group-addon {\n  color: #d26a5c;\n  border-color: #d26a5c;\n  background-color: #ffffff;\n}\n.has-error .form-control-feedback {\n  color: #d26a5c;\n}\n.input-group-addon {\n  color: #646464;\n  background-color: #f9f9f9;\n  border-color: #e6e6e6;\n  border-radius: 3px;\n}\n.input-group-addon.input-sm,\n.input-group-addon.input-lg {\n  border-radius: 3px;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn,\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  border-radius: 3px;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n.label-primary {\n  background-color: #5c90d2;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #3675c5;\n}\n.label-success {\n  background-color: #46c37b;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #34a263;\n}\n.label-info {\n  background-color: #70b9eb;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #43a3e5;\n}\n.label-warning {\n  background-color: #f3b760;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #efa231;\n}\n.label-danger {\n  background-color: #d26a5c;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c54736;\n}\n.badge-primary {\n  background-color: #5c90d2;\n}\n.badge-success {\n  background-color: #46c37b;\n}\n.badge-info {\n  background-color: #70b9eb;\n}\n.badge-warning {\n  background-color: #f3b760;\n}\n.badge-danger {\n  background-color: #d26a5c;\n}\n.alert {\n  padding-bottom: 10px;\n  border-radius: 2px;\n  border: none;\n}\n.alert p {\n  margin-bottom: 5px !important;\n}\n.alert-success {\n  background-color: #e0f5e9;\n  color: #34a263;\n  -webkit-box-shadow: 0 2px #cdefdb;\n  box-shadow: 0 2px #cdefdb;\n}\n.alert-success hr {\n  border-top-color: #cdefdb;\n}\n.alert-success .alert-link {\n  color: #287b4b;\n}\n.alert-info {\n  background-color: #edf6fd;\n  color: #43a3e5;\n  -webkit-box-shadow: 0 2px #d6ebfa;\n  box-shadow: 0 2px #d6ebfa;\n}\n.alert-info hr {\n  border-top-color: #d6ebfa;\n}\n.alert-info .alert-link {\n  color: #1e8cd7;\n}\n.alert-warning {\n  background-color: #fdf3e5;\n  color: #efa231;\n  -webkit-box-shadow: 0 2px #fbe8cd;\n  box-shadow: 0 2px #fbe8cd;\n}\n.alert-warning hr {\n  border-top-color: #fbe8cd;\n}\n.alert-warning .alert-link {\n  color: #dc8911;\n}\n.alert-danger {\n  background-color: #f9eae8;\n  color: #c54736;\n  -webkit-box-shadow: 0 2px #f4d8d4;\n  box-shadow: 0 2px #f4d8d4;\n}\n.alert-danger hr {\n  border-top-color: #f4d8d4;\n}\n.alert-danger .alert-link {\n  color: #9d392b;\n}\n.progress {\n  height: 24px;\n  border-radius: 2px;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.progress.progress-mini {\n  height: 5px;\n}\n.progress.progress-mini .progress-bar {\n  line-height: 5px;\n}\n.progress-bar {\n  line-height: 24px;\n  font-weight: 600;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.progress-bar-primary {\n  background-color: #5c90d2;\n}\n.progress-bar-success {\n  background-color: #46c37b;\n}\n.progress-bar-info {\n  background-color: #70b9eb;\n}\n.progress-bar-warning {\n  background-color: #f3b760;\n}\n.progress-bar-danger {\n  background-color: #d26a5c;\n}\n.nav-pills > li > a {\n  font-weight: 600;\n  color: #646464;\n  border-radius: 3px;\n}\n.nav-pills > li > a:hover,\n.nav-pills > li > a:focus {\n  color: #646464;\n  background-color: #f9f9f9;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #fff;\n  background-color: #5c90d2;\n}\n.nav-pills > li.active > a > .badge {\n  color: #5c90d2;\n}\n.pagination {\n  border-radius: 0;\n}\n.pagination > li {\n  display: block;\n  float: left;\n  margin: 0 0 5px 5px;\n}\n.pagination > li > a,\n.pagination > li > span {\n  display: block;\n  float: none;\n  margin: 0;\n  padding-right: 8px;\n  padding-left: 8px;\n  color: #646464;\n  font-weight: 600;\n  border: none;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  color: #5c90d2;\n  background-color: transparent;\n  -webkit-box-shadow: 0 2px #5c90d2;\n  box-shadow: 0 2px #5c90d2;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  color: #5c90d2;\n  background-color: #f9f9f9;\n  -webkit-box-shadow: 0 2px #5c90d2;\n  box-shadow: 0 2px #5c90d2;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #c9c9c9;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.pager li > a,\n.pager li > span {\n  padding: 6px 14px;\n  font-weight: 600;\n  color: #646464;\n  border: 1px solid #eee;\n  border-radius: 3px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n  color: #5c90d2;\n  background-color: #f9f9f9;\n}\n.pager li.disabled > span,\n.pager li.disabled > span:hover,\n.pager li.disabled > span:focus,\n.pager li.disabled > a,\n.pager li.disabled > a:hover,\n.pager li.disabled > a:focus {\n  color: #c9c9c9;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.list-group-item {\n  padding: 10px 15px;\n  border-color: #eee;\n}\na.list-group-item {\n  font-weight: 600;\n  color: #646464;\n}\na.list-group-item:hover,\na.list-group-item:focus {\n  color: #5c90d2;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  background-color: #5c90d2;\n  border-color: #5c90d2;\n}\n.list-group-item.active > .badge {\n  color: #5c90d2;\n}\n.breadcrumb {\n  padding: 0;\n  margin-bottom: 0;\n  text-transform: uppercase;\n  font-size: 12px;\n  font-weight: 600;\n  color: #999999;\n  background-color: transparent;\n}\n.breadcrumb > li + li:before {\n  display: inline-block;\n  padding: 0;\n  font-family: \"FontAwesome\";\n  color: rgba(0, 0, 0, 0.5);\n  content: \"\\f105\";\n  width: 20px;\n  text-align: center;\n}\n.tooltip-inner {\n  padding: 6px 8px;\n  background-color: #2c343f;\n  border-radius: 0;\n}\n.tooltip.top .tooltip-arrow {\n  border-top-color: #2c343f;\n}\n.tooltip.right .tooltip-arrow {\n  border-right-color: #2c343f;\n}\n.tooltip.left .tooltip-arrow {\n  border-left-color: #2c343f;\n}\n.tooltip.bottom .tooltip-arrow {\n  border-bottom-color: #2c343f;\n}\n.popover {\n  border-color: #ddd;\n  border-radius: 2px;\n  -webkit-box-shadow: 0 10px 30px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.05);\n}\n.popover-title {\n  padding: 10px 10px 1px;\n  font-family: \"Source Sans Pro\", \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  background-color: #fff;\n  border-bottom: none;\n  border-radius: 1px 1px 0 0;\n}\n.popover-content {\n  padding: 10px;\n}\n.dropdown-menu {\n  min-width: 180px;\n  padding: 5px 0;\n  border-color: #ddd;\n  border-radius: 2px;\n  -webkit-box-shadow: 0 10px 30px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.05);\n}\n.dropdown-menu > li > a {\n  padding: 7px 12px;\n}\n.dropdown-menu > li > a:hover {\n  background-color: #f9f9f9;\n}\n.dropdown-menu > li > a i.pull-right,\n.dropdown-menu > li > a .badge.pull-right {\n  right: 0;\n  margin-top: 3px;\n  margin-left: 10px;\n}\n.dropdown-menu > li > a i.pull-left,\n.dropdown-menu > li > a .badge.pull-left {\n  left: 0;\n  margin-top: 3px;\n  margin-right: 10px;\n}\n.dropdown-menu > li > a .badge.pull-right {\n  margin-top: 1px;\n}\n.dropdown-menu > li > a .badge.pull-left {\n  margin-top: 1px;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #545454;\n  background-color: #f0f0f0;\n}\n.dropdown-header {\n  padding: 5px 12px 4px;\n  font-weight: 600;\n  color: #999999;\n  text-transform: uppercase;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 12px 10px;\n  border-top: 1px solid #f0f0f0;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th {\n  padding: 16px 10px 12px;\n  font-family: \"Source Sans Pro\", \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 15px;\n  font-weight: 600;\n  text-transform: uppercase;\n}\n.table > thead > tr > th {\n  border-bottom: 1px solid #ddd;\n}\n.table > tbody + tbody {\n  border-top: 1px solid #ddd;\n}\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n  padding: 6px 8px;\n}\n.table-bordered {\n  border: 1px solid #e9e9e9;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #f0f0f0;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 1px;\n  border-bottom-color: #e9e9e9;\n}\n.table-borderless {\n  border: none;\n}\n.table-borderless > thead > tr > th,\n.table-borderless > tbody > tr > th,\n.table-borderless > tfoot > tr > th,\n.table-borderless > thead > tr > td,\n.table-borderless > tbody > tr > td,\n.table-borderless > tfoot > tr > td {\n  border: none;\n}\n.table-borderless > thead > tr > th,\n.table-borderless > thead > tr > td {\n  border-bottom: 1px solid #ddd;\n}\n.table-vcenter > thead > tr > th,\n.table-vcenter > tbody > tr > th,\n.table-vcenter > tfoot > tr > th,\n.table-vcenter > thead > tr > td,\n.table-vcenter > tbody > tr > td,\n.table-vcenter > tfoot > tr > td {\n  vertical-align: middle;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n  background-color: #f5f5f5;\n}\n.table-header-bg > thead > tr > th,\n.table-header-bg > thead > tr > td {\n  color: #fff;\n  background-color: #5c90d2;\n  border-bottom-color: #5c90d2;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n  background-color: #ececec;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #e0f5e9;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #cdefdb;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n  background-color: #edf6fd;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n  background-color: #d6ebfa;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fdf3e5;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #fbe8cd;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f9eae8;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #f4d8d4;\n}\n.table-responsive {\n  -webkit-overflow-scrolling: touch;\n}\n.js-table-checkable tbody tr,\n.js-table-sections-header > tr {\n  cursor: pointer;\n}\n.js-table-sections-header > tr > td:first-child > i {\n  -webkit-transition: -webkit-transform 0.15s ease-out;\n  transition: transform 0.15s ease-out;\n}\n.js-table-sections-header + tbody {\n  display: none;\n}\n.js-table-sections-header.open > tr {\n  background-color: #f9f9f9;\n}\n.js-table-sections-header.open > tr > td:first-child > i {\n  -webkit-transform: rotate(90deg);\n  -ms-transform: rotate(90deg);\n  transform: rotate(90deg);\n}\n.js-table-sections-header.open + tbody {\n  display: table-row-group;\n}\n.modal.fade .modal-dialog {\n  -webkit-transition: all 0.12s ease-out;\n  transition: all 0.12s ease-out;\n}\n.modal.fade .modal-dialog.modal-dialog-popin {\n  -webkit-transform: scale(1.1);\n  -ms-transform: scale(1.1);\n  transform: scale(1.1);\n}\n.modal.fade .modal-dialog.modal-dialog-popout {\n  -webkit-transform: scale(0.9);\n  -ms-transform: scale(0.9);\n  transform: scale(0.9);\n}\n.modal.fade .modal-dialog.modal-dialog-slideup {\n  -webkit-transform: translate(0, 10%);\n  -ms-transform: translate(0, 10%);\n  transform: translate(0, 10%);\n}\n.modal.fade .modal-dialog.modal-dialog-slideright {\n  -webkit-transform: translate(-10%, 0);\n  -ms-transform: translate(-10%, 0);\n  transform: translate(-10%, 0);\n}\n.modal.fade .modal-dialog.modal-dialog-slideleft {\n  -webkit-transform: translate(10%, 0);\n  -ms-transform: translate(10%, 0);\n  transform: translate(10%, 0);\n}\n.modal.fade .modal-dialog.modal-dialog-fromright {\n  -webkit-transform: translateX(25%) rotate(10deg) scale(0.9);\n  -ms-transform: translateX(25%) rotate(10deg) scale(0.9);\n  transform: translateX(25%) rotate(10deg) scale(0.9);\n}\n.modal.fade .modal-dialog.modal-dialog-fromleft {\n  -webkit-transform: translateX(-25%) rotate(-10deg) scale(0.9);\n  -ms-transform: translateX(-25%) rotate(-10deg) scale(0.9);\n  transform: translateX(-25%) rotate(-10deg) scale(0.9);\n}\n.modal.in .modal-dialog.modal-dialog-popin,\n.modal.in .modal-dialog.modal-dialog-popout {\n  -webkit-transform: scale(1);\n  -ms-transform: scale(1);\n  transform: scale(1);\n}\n.modal.in .modal-dialog.modal-dialog-slideup,\n.modal.in .modal-dialog.modal-dialog-slideright,\n.modal.in .modal-dialog.modal-dialog-slideleft {\n  -webkit-transform: translate(0, 0);\n  -ms-transform: translate(0, 0);\n  transform: translate(0, 0);\n}\n.modal.in .modal-dialog.modal-dialog-fromright,\n.modal.in .modal-dialog.modal-dialog-fromleft {\n  -webkit-transform: translateX(0) rotate(0) scale(1);\n  -ms-transform: translateX(0) rotate(0) scale(1);\n  transform: translateX(0) rotate(0) scale(1);\n}\n.modal-dialog.modal-dialog-top {\n  margin-top: 0;\n  padding: 0 !important;\n}\n.modal-dialog.modal-dialog-top .modal-content {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.modal-content {\n  border: none;\n  border-radius: 0;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.modal-backdrop.in {\n  opacity: .25;\n}\n.modal-header {\n  padding: 18px 20px;\n  border-bottom-color: #eee;\n}\n.modal-body {\n  padding: 20px;\n}\n.modal-footer {\n  padding: 12px 20px;\n  border-top-color: #eee;\n}\n.modal-title {\n  font-weight: normal;\n}\n.fade.fade-up {\n  opacity: 0;\n  -webkit-transition: all 0.25s ease-out;\n  transition: all 0.25s ease-out;\n  -webkit-transform: translateY(100px);\n  -ms-transform: translateY(100px);\n  transform: translateY(100px);\n}\n.fade.fade-up.in {\n  opacity: 1;\n  -webkit-transform: translateY(0);\n  -ms-transform: translateY(0);\n  transform: translateY(0);\n}\n.fade.fade-right {\n  opacity: 0;\n  -webkit-transition: all 0.25s ease-out;\n  transition: all 0.25s ease-out;\n  -webkit-transform: translateX(-100px);\n  -ms-transform: translateX(-100px);\n  transform: translateX(-100px);\n}\n.fade.fade-right.in {\n  opacity: 1;\n  -webkit-transform: translateX(0);\n  -ms-transform: translateX(0);\n  transform: translateX(0);\n}\n.fade.fade-left {\n  opacity: 0;\n  -webkit-transition: all 0.25s ease-out;\n  transition: all 0.25s ease-out;\n  -webkit-transform: translateX(100px);\n  -ms-transform: translateX(100px);\n  transform: translateX(100px);\n}\n.fade.fade-left.in {\n  opacity: 1;\n  -webkit-transform: translateX(0);\n  -ms-transform: translateX(0);\n  transform: translateX(0);\n}\n.panel {\n  border-radius: 3px;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.panel-group .panel {\n  border-radius: 3px;\n}\n.panel-group .panel + .panel {\n  margin-top: 10px;\n}\n.panel-default {\n  border-color: #f0f0f0;\n}\n.panel-default > .panel-heading {\n  color: #646464;\n  background-color: #f9f9f9;\n  border-color: #f0f0f0;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #f0f0f0;\n}\n.panel-default > .panel-heading .badge {\n  color: #f9f9f9;\n  background-color: #646464;\n}\n.panel-default > .panel-heading a {\n  font-weight: 400;\n}\n.panel-default > .panel-heading a:hover,\n.panel-default > .panel-heading a:focus {\n  color: #4a4a4a;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #f0f0f0;\n}\n.panel-primary {\n  border-color: #ccdcf1;\n}\n.panel-primary > .panel-heading {\n  color: #5c90d2;\n  background-color: #e8eff9;\n  border-color: #ccdcf1;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ccdcf1;\n}\n.panel-primary > .panel-heading .badge {\n  color: #e8eff9;\n  background-color: #5c90d2;\n}\n.panel-primary > .panel-heading a {\n  font-weight: 400;\n}\n.panel-primary > .panel-heading a:hover,\n.panel-primary > .panel-heading a:focus {\n  color: #3675c5;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ccdcf1;\n}\n.panel-success {\n  border-color: #cdefdb;\n}\n.panel-success > .panel-heading {\n  color: #46c37b;\n  background-color: #e0f5e9;\n  border-color: #cdefdb;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #cdefdb;\n}\n.panel-success > .panel-heading .badge {\n  color: #e0f5e9;\n  background-color: #46c37b;\n}\n.panel-success > .panel-heading a {\n  font-weight: 400;\n}\n.panel-success > .panel-heading a:hover,\n.panel-success > .panel-heading a:focus {\n  color: #34a263;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #cdefdb;\n}\n.panel-info {\n  border-color: #d6ebfa;\n}\n.panel-info > .panel-heading {\n  color: #70b9eb;\n  background-color: #edf6fd;\n  border-color: #d6ebfa;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #d6ebfa;\n}\n.panel-info > .panel-heading .badge {\n  color: #edf6fd;\n  background-color: #70b9eb;\n}\n.panel-info > .panel-heading a {\n  font-weight: 400;\n}\n.panel-info > .panel-heading a:hover,\n.panel-info > .panel-heading a:focus {\n  color: #43a3e5;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #d6ebfa;\n}\n.panel-warning {\n  border-color: #fbe8cd;\n}\n.panel-warning > .panel-heading {\n  color: #f3b760;\n  background-color: #fdf3e5;\n  border-color: #fbe8cd;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #fbe8cd;\n}\n.panel-warning > .panel-heading .badge {\n  color: #fdf3e5;\n  background-color: #f3b760;\n}\n.panel-warning > .panel-heading a {\n  font-weight: 400;\n}\n.panel-warning > .panel-heading a:hover,\n.panel-warning > .panel-heading a:focus {\n  color: #efa231;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #fbe8cd;\n}\n.panel-danger {\n  border-color: #f4d8d4;\n}\n.panel-danger > .panel-heading {\n  color: #d26a5c;\n  background-color: #f9eae8;\n  border-color: #f4d8d4;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #f4d8d4;\n}\n.panel-danger > .panel-heading .badge {\n  color: #f9eae8;\n  background-color: #d26a5c;\n}\n.panel-danger > .panel-heading a {\n  font-weight: 400;\n}\n.panel-danger > .panel-heading a:hover,\n.panel-danger > .panel-heading a:focus {\n  color: #c54736;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #f4d8d4;\n}\n.img-responsive {\n  width: 100%;\n}\n/* FONT PATH\n * -------------------------- */\n@font-face {\n  font-family: 'FontAwesome';\n  src: url('../fonts/fontawesome-webfont.eot?v=4.3.0');\n  src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n.fa {\n  display: inline-block;\n  font: normal normal normal 14px/1 FontAwesome;\n  font-size: inherit;\n  text-rendering: auto;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  transform: translate(0, 0);\n}\n/* makes the font 33% larger relative to the icon container */\n.fa-lg {\n  font-size: 1.33333333em;\n  line-height: 0.75em;\n  vertical-align: -15%;\n}\n.fa-2x {\n  font-size: 2em;\n}\n.fa-3x {\n  font-size: 3em;\n}\n.fa-4x {\n  font-size: 4em;\n}\n.fa-5x {\n  font-size: 5em;\n}\n.fa-fw {\n  width: 1.28571429em;\n  text-align: center;\n}\n.fa-ul {\n  padding-left: 0;\n  margin-left: 2.14285714em;\n  list-style-type: none;\n}\n.fa-ul > li {\n  position: relative;\n}\n.fa-li {\n  position: absolute;\n  left: -2.14285714em;\n  width: 2.14285714em;\n  top: 0.14285714em;\n  text-align: center;\n}\n.fa-li.fa-lg {\n  left: -1.85714286em;\n}\n.fa-border {\n  padding: .2em .25em .15em;\n  border: solid 0.08em #eeeeee;\n  border-radius: .1em;\n}\n.pull-right {\n  float: right;\n}\n.pull-left {\n  float: left;\n}\n.fa.pull-left {\n  margin-right: .3em;\n}\n.fa.pull-right {\n  margin-left: .3em;\n}\n.fa-spin {\n  -webkit-animation: fa-spin 2s infinite linear;\n  animation: fa-spin 2s infinite linear;\n}\n.fa-pulse {\n  -webkit-animation: fa-spin 1s infinite steps(8);\n  animation: fa-spin 1s infinite steps(8);\n}\n@-webkit-keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n    transform: rotate(359deg);\n  }\n}\n@keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n    transform: rotate(359deg);\n  }\n}\n.fa-rotate-90 {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);\n  -webkit-transform: rotate(90deg);\n  -ms-transform: rotate(90deg);\n  transform: rotate(90deg);\n}\n.fa-rotate-180 {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);\n  -webkit-transform: rotate(180deg);\n  -ms-transform: rotate(180deg);\n  transform: rotate(180deg);\n}\n.fa-rotate-270 {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);\n  -webkit-transform: rotate(270deg);\n  -ms-transform: rotate(270deg);\n  transform: rotate(270deg);\n}\n.fa-flip-horizontal {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);\n  -webkit-transform: scale(-1, 1);\n  -ms-transform: scale(-1, 1);\n  transform: scale(-1, 1);\n}\n.fa-flip-vertical {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n  -webkit-transform: scale(1, -1);\n  -ms-transform: scale(1, -1);\n  transform: scale(1, -1);\n}\n:root .fa-rotate-90,\n:root .fa-rotate-180,\n:root .fa-rotate-270,\n:root .fa-flip-horizontal,\n:root .fa-flip-vertical {\n  filter: none;\n}\n.fa-stack {\n  position: relative;\n  display: inline-block;\n  width: 2em;\n  height: 2em;\n  line-height: 2em;\n  vertical-align: middle;\n}\n.fa-stack-1x,\n.fa-stack-2x {\n  position: absolute;\n  left: 0;\n  width: 100%;\n  text-align: center;\n}\n.fa-stack-1x {\n  line-height: inherit;\n}\n.fa-stack-2x {\n  font-size: 2em;\n}\n.fa-inverse {\n  color: #ffffff;\n}\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n   readers do not read off random characters that represent icons */\n.fa-glass:before {\n  content: \"\\f000\";\n}\n.fa-music:before {\n  content: \"\\f001\";\n}\n.fa-search:before {\n  content: \"\\f002\";\n}\n.fa-envelope-o:before {\n  content: \"\\f003\";\n}\n.fa-heart:before {\n  content: \"\\f004\";\n}\n.fa-star:before {\n  content: \"\\f005\";\n}\n.fa-star-o:before {\n  content: \"\\f006\";\n}\n.fa-user:before {\n  content: \"\\f007\";\n}\n.fa-film:before {\n  content: \"\\f008\";\n}\n.fa-th-large:before {\n  content: \"\\f009\";\n}\n.fa-th:before {\n  content: \"\\f00a\";\n}\n.fa-th-list:before {\n  content: \"\\f00b\";\n}\n.fa-check:before {\n  content: \"\\f00c\";\n}\n.fa-remove:before,\n.fa-close:before,\n.fa-times:before {\n  content: \"\\f00d\";\n}\n.fa-search-plus:before {\n  content: \"\\f00e\";\n}\n.fa-search-minus:before {\n  content: \"\\f010\";\n}\n.fa-power-off:before {\n  content: \"\\f011\";\n}\n.fa-signal:before {\n  content: \"\\f012\";\n}\n.fa-gear:before,\n.fa-cog:before {\n  content: \"\\f013\";\n}\n.fa-trash-o:before {\n  content: \"\\f014\";\n}\n.fa-home:before {\n  content: \"\\f015\";\n}\n.fa-file-o:before {\n  content: \"\\f016\";\n}\n.fa-clock-o:before {\n  content: \"\\f017\";\n}\n.fa-road:before {\n  content: \"\\f018\";\n}\n.fa-download:before {\n  content: \"\\f019\";\n}\n.fa-arrow-circle-o-down:before {\n  content: \"\\f01a\";\n}\n.fa-arrow-circle-o-up:before {\n  content: \"\\f01b\";\n}\n.fa-inbox:before {\n  content: \"\\f01c\";\n}\n.fa-play-circle-o:before {\n  content: \"\\f01d\";\n}\n.fa-rotate-right:before,\n.fa-repeat:before {\n  content: \"\\f01e\";\n}\n.fa-refresh:before {\n  content: \"\\f021\";\n}\n.fa-list-alt:before {\n  content: \"\\f022\";\n}\n.fa-lock:before {\n  content: \"\\f023\";\n}\n.fa-flag:before {\n  content: \"\\f024\";\n}\n.fa-headphones:before {\n  content: \"\\f025\";\n}\n.fa-volume-off:before {\n  content: \"\\f026\";\n}\n.fa-volume-down:before {\n  content: \"\\f027\";\n}\n.fa-volume-up:before {\n  content: \"\\f028\";\n}\n.fa-qrcode:before {\n  content: \"\\f029\";\n}\n.fa-barcode:before {\n  content: \"\\f02a\";\n}\n.fa-tag:before {\n  content: \"\\f02b\";\n}\n.fa-tags:before {\n  content: \"\\f02c\";\n}\n.fa-book:before {\n  content: \"\\f02d\";\n}\n.fa-bookmark:before {\n  content: \"\\f02e\";\n}\n.fa-print:before {\n  content: \"\\f02f\";\n}\n.fa-camera:before {\n  content: \"\\f030\";\n}\n.fa-font:before {\n  content: \"\\f031\";\n}\n.fa-bold:before {\n  content: \"\\f032\";\n}\n.fa-italic:before {\n  content: \"\\f033\";\n}\n.fa-text-height:before {\n  content: \"\\f034\";\n}\n.fa-text-width:before {\n  content: \"\\f035\";\n}\n.fa-align-left:before {\n  content: \"\\f036\";\n}\n.fa-align-center:before {\n  content: \"\\f037\";\n}\n.fa-align-right:before {\n  content: \"\\f038\";\n}\n.fa-align-justify:before {\n  content: \"\\f039\";\n}\n.fa-list:before {\n  content: \"\\f03a\";\n}\n.fa-dedent:before,\n.fa-outdent:before {\n  content: \"\\f03b\";\n}\n.fa-indent:before {\n  content: \"\\f03c\";\n}\n.fa-video-camera:before {\n  content: \"\\f03d\";\n}\n.fa-photo:before,\n.fa-image:before,\n.fa-picture-o:before {\n  content: \"\\f03e\";\n}\n.fa-pencil:before {\n  content: \"\\f040\";\n}\n.fa-map-marker:before {\n  content: \"\\f041\";\n}\n.fa-adjust:before {\n  content: \"\\f042\";\n}\n.fa-tint:before {\n  content: \"\\f043\";\n}\n.fa-edit:before,\n.fa-pencil-square-o:before {\n  content: \"\\f044\";\n}\n.fa-share-square-o:before {\n  content: \"\\f045\";\n}\n.fa-check-square-o:before {\n  content: \"\\f046\";\n}\n.fa-arrows:before {\n  content: \"\\f047\";\n}\n.fa-step-backward:before {\n  content: \"\\f048\";\n}\n.fa-fast-backward:before {\n  content: \"\\f049\";\n}\n.fa-backward:before {\n  content: \"\\f04a\";\n}\n.fa-play:before {\n  content: \"\\f04b\";\n}\n.fa-pause:before {\n  content: \"\\f04c\";\n}\n.fa-stop:before {\n  content: \"\\f04d\";\n}\n.fa-forward:before {\n  content: \"\\f04e\";\n}\n.fa-fast-forward:before {\n  content: \"\\f050\";\n}\n.fa-step-forward:before {\n  content: \"\\f051\";\n}\n.fa-eject:before {\n  content: \"\\f052\";\n}\n.fa-chevron-left:before {\n  content: \"\\f053\";\n}\n.fa-chevron-right:before {\n  content: \"\\f054\";\n}\n.fa-plus-circle:before {\n  content: \"\\f055\";\n}\n.fa-minus-circle:before {\n  content: \"\\f056\";\n}\n.fa-times-circle:before {\n  content: \"\\f057\";\n}\n.fa-check-circle:before {\n  content: \"\\f058\";\n}\n.fa-question-circle:before {\n  content: \"\\f059\";\n}\n.fa-info-circle:before {\n  content: \"\\f05a\";\n}\n.fa-crosshairs:before {\n  content: \"\\f05b\";\n}\n.fa-times-circle-o:before {\n  content: \"\\f05c\";\n}\n.fa-check-circle-o:before {\n  content: \"\\f05d\";\n}\n.fa-ban:before {\n  content: \"\\f05e\";\n}\n.fa-arrow-left:before {\n  content: \"\\f060\";\n}\n.fa-arrow-right:before {\n  content: \"\\f061\";\n}\n.fa-arrow-up:before {\n  content: \"\\f062\";\n}\n.fa-arrow-down:before {\n  content: \"\\f063\";\n}\n.fa-mail-forward:before,\n.fa-share:before {\n  content: \"\\f064\";\n}\n.fa-expand:before {\n  content: \"\\f065\";\n}\n.fa-compress:before {\n  content: \"\\f066\";\n}\n.fa-plus:before {\n  content: \"\\f067\";\n}\n.fa-minus:before {\n  content: \"\\f068\";\n}\n.fa-asterisk:before {\n  content: \"\\f069\";\n}\n.fa-exclamation-circle:before {\n  content: \"\\f06a\";\n}\n.fa-gift:before {\n  content: \"\\f06b\";\n}\n.fa-leaf:before {\n  content: \"\\f06c\";\n}\n.fa-fire:before {\n  content: \"\\f06d\";\n}\n.fa-eye:before {\n  content: \"\\f06e\";\n}\n.fa-eye-slash:before {\n  content: \"\\f070\";\n}\n.fa-warning:before,\n.fa-exclamation-triangle:before {\n  content: \"\\f071\";\n}\n.fa-plane:before {\n  content: \"\\f072\";\n}\n.fa-calendar:before {\n  content: \"\\f073\";\n}\n.fa-random:before {\n  content: \"\\f074\";\n}\n.fa-comment:before {\n  content: \"\\f075\";\n}\n.fa-magnet:before {\n  content: \"\\f076\";\n}\n.fa-chevron-up:before {\n  content: \"\\f077\";\n}\n.fa-chevron-down:before {\n  content: \"\\f078\";\n}\n.fa-retweet:before {\n  content: \"\\f079\";\n}\n.fa-shopping-cart:before {\n  content: \"\\f07a\";\n}\n.fa-folder:before {\n  content: \"\\f07b\";\n}\n.fa-folder-open:before {\n  content: \"\\f07c\";\n}\n.fa-arrows-v:before {\n  content: \"\\f07d\";\n}\n.fa-arrows-h:before {\n  content: \"\\f07e\";\n}\n.fa-bar-chart-o:before,\n.fa-bar-chart:before {\n  content: \"\\f080\";\n}\n.fa-twitter-square:before {\n  content: \"\\f081\";\n}\n.fa-facebook-square:before {\n  content: \"\\f082\";\n}\n.fa-camera-retro:before {\n  content: \"\\f083\";\n}\n.fa-key:before {\n  content: \"\\f084\";\n}\n.fa-gears:before,\n.fa-cogs:before {\n  content: \"\\f085\";\n}\n.fa-comments:before {\n  content: \"\\f086\";\n}\n.fa-thumbs-o-up:before {\n  content: \"\\f087\";\n}\n.fa-thumbs-o-down:before {\n  content: \"\\f088\";\n}\n.fa-star-half:before {\n  content: \"\\f089\";\n}\n.fa-heart-o:before {\n  content: \"\\f08a\";\n}\n.fa-sign-out:before {\n  content: \"\\f08b\";\n}\n.fa-linkedin-square:before {\n  content: \"\\f08c\";\n}\n.fa-thumb-tack:before {\n  content: \"\\f08d\";\n}\n.fa-external-link:before {\n  content: \"\\f08e\";\n}\n.fa-sign-in:before {\n  content: \"\\f090\";\n}\n.fa-trophy:before {\n  content: \"\\f091\";\n}\n.fa-github-square:before {\n  content: \"\\f092\";\n}\n.fa-upload:before {\n  content: \"\\f093\";\n}\n.fa-lemon-o:before {\n  content: \"\\f094\";\n}\n.fa-phone:before {\n  content: \"\\f095\";\n}\n.fa-square-o:before {\n  content: \"\\f096\";\n}\n.fa-bookmark-o:before {\n  content: \"\\f097\";\n}\n.fa-phone-square:before {\n  content: \"\\f098\";\n}\n.fa-twitter:before {\n  content: \"\\f099\";\n}\n.fa-facebook-f:before,\n.fa-facebook:before {\n  content: \"\\f09a\";\n}\n.fa-github:before {\n  content: \"\\f09b\";\n}\n.fa-unlock:before {\n  content: \"\\f09c\";\n}\n.fa-credit-card:before {\n  content: \"\\f09d\";\n}\n.fa-rss:before {\n  content: \"\\f09e\";\n}\n.fa-hdd-o:before {\n  content: \"\\f0a0\";\n}\n.fa-bullhorn:before {\n  content: \"\\f0a1\";\n}\n.fa-bell:before {\n  content: \"\\f0f3\";\n}\n.fa-certificate:before {\n  content: \"\\f0a3\";\n}\n.fa-hand-o-right:before {\n  content: \"\\f0a4\";\n}\n.fa-hand-o-left:before {\n  content: \"\\f0a5\";\n}\n.fa-hand-o-up:before {\n  content: \"\\f0a6\";\n}\n.fa-hand-o-down:before {\n  content: \"\\f0a7\";\n}\n.fa-arrow-circle-left:before {\n  content: \"\\f0a8\";\n}\n.fa-arrow-circle-right:before {\n  content: \"\\f0a9\";\n}\n.fa-arrow-circle-up:before {\n  content: \"\\f0aa\";\n}\n.fa-arrow-circle-down:before {\n  content: \"\\f0ab\";\n}\n.fa-globe:before {\n  content: \"\\f0ac\";\n}\n.fa-wrench:before {\n  content: \"\\f0ad\";\n}\n.fa-tasks:before {\n  content: \"\\f0ae\";\n}\n.fa-filter:before {\n  content: \"\\f0b0\";\n}\n.fa-briefcase:before {\n  content: \"\\f0b1\";\n}\n.fa-arrows-alt:before {\n  content: \"\\f0b2\";\n}\n.fa-group:before,\n.fa-users:before {\n  content: \"\\f0c0\";\n}\n.fa-chain:before,\n.fa-link:before {\n  content: \"\\f0c1\";\n}\n.fa-cloud:before {\n  content: \"\\f0c2\";\n}\n.fa-flask:before {\n  content: \"\\f0c3\";\n}\n.fa-cut:before,\n.fa-scissors:before {\n  content: \"\\f0c4\";\n}\n.fa-copy:before,\n.fa-files-o:before {\n  content: \"\\f0c5\";\n}\n.fa-paperclip:before {\n  content: \"\\f0c6\";\n}\n.fa-save:before,\n.fa-floppy-o:before {\n  content: \"\\f0c7\";\n}\n.fa-square:before {\n  content: \"\\f0c8\";\n}\n.fa-navicon:before,\n.fa-reorder:before,\n.fa-bars:before {\n  content: \"\\f0c9\";\n}\n.fa-list-ul:before {\n  content: \"\\f0ca\";\n}\n.fa-list-ol:before {\n  content: \"\\f0cb\";\n}\n.fa-strikethrough:before {\n  content: \"\\f0cc\";\n}\n.fa-underline:before {\n  content: \"\\f0cd\";\n}\n.fa-table:before {\n  content: \"\\f0ce\";\n}\n.fa-magic:before {\n  content: \"\\f0d0\";\n}\n.fa-truck:before {\n  content: \"\\f0d1\";\n}\n.fa-pinterest:before {\n  content: \"\\f0d2\";\n}\n.fa-pinterest-square:before {\n  content: \"\\f0d3\";\n}\n.fa-google-plus-square:before {\n  content: \"\\f0d4\";\n}\n.fa-google-plus:before {\n  content: \"\\f0d5\";\n}\n.fa-money:before {\n  content: \"\\f0d6\";\n}\n.fa-caret-down:before {\n  content: \"\\f0d7\";\n}\n.fa-caret-up:before {\n  content: \"\\f0d8\";\n}\n.fa-caret-left:before {\n  content: \"\\f0d9\";\n}\n.fa-caret-right:before {\n  content: \"\\f0da\";\n}\n.fa-columns:before {\n  content: \"\\f0db\";\n}\n.fa-unsorted:before,\n.fa-sort:before {\n  content: \"\\f0dc\";\n}\n.fa-sort-down:before,\n.fa-sort-desc:before {\n  content: \"\\f0dd\";\n}\n.fa-sort-up:before,\n.fa-sort-asc:before {\n  content: \"\\f0de\";\n}\n.fa-envelope:before {\n  content: \"\\f0e0\";\n}\n.fa-linkedin:before {\n  content: \"\\f0e1\";\n}\n.fa-rotate-left:before,\n.fa-undo:before {\n  content: \"\\f0e2\";\n}\n.fa-legal:before,\n.fa-gavel:before {\n  content: \"\\f0e3\";\n}\n.fa-dashboard:before,\n.fa-tachometer:before {\n  content: \"\\f0e4\";\n}\n.fa-comment-o:before {\n  content: \"\\f0e5\";\n}\n.fa-comments-o:before {\n  content: \"\\f0e6\";\n}\n.fa-flash:before,\n.fa-bolt:before {\n  content: \"\\f0e7\";\n}\n.fa-sitemap:before {\n  content: \"\\f0e8\";\n}\n.fa-umbrella:before {\n  content: \"\\f0e9\";\n}\n.fa-paste:before,\n.fa-clipboard:before {\n  content: \"\\f0ea\";\n}\n.fa-lightbulb-o:before {\n  content: \"\\f0eb\";\n}\n.fa-exchange:before {\n  content: \"\\f0ec\";\n}\n.fa-cloud-download:before {\n  content: \"\\f0ed\";\n}\n.fa-cloud-upload:before {\n  content: \"\\f0ee\";\n}\n.fa-user-md:before {\n  content: \"\\f0f0\";\n}\n.fa-stethoscope:before {\n  content: \"\\f0f1\";\n}\n.fa-suitcase:before {\n  content: \"\\f0f2\";\n}\n.fa-bell-o:before {\n  content: \"\\f0a2\";\n}\n.fa-coffee:before {\n  content: \"\\f0f4\";\n}\n.fa-cutlery:before {\n  content: \"\\f0f5\";\n}\n.fa-file-text-o:before {\n  content: \"\\f0f6\";\n}\n.fa-building-o:before {\n  content: \"\\f0f7\";\n}\n.fa-hospital-o:before {\n  content: \"\\f0f8\";\n}\n.fa-ambulance:before {\n  content: \"\\f0f9\";\n}\n.fa-medkit:before {\n  content: \"\\f0fa\";\n}\n.fa-fighter-jet:before {\n  content: \"\\f0fb\";\n}\n.fa-beer:before {\n  content: \"\\f0fc\";\n}\n.fa-h-square:before {\n  content: \"\\f0fd\";\n}\n.fa-plus-square:before {\n  content: \"\\f0fe\";\n}\n.fa-angle-double-left:before {\n  content: \"\\f100\";\n}\n.fa-angle-double-right:before {\n  content: \"\\f101\";\n}\n.fa-angle-double-up:before {\n  content: \"\\f102\";\n}\n.fa-angle-double-down:before {\n  content: \"\\f103\";\n}\n.fa-angle-left:before {\n  content: \"\\f104\";\n}\n.fa-angle-right:before {\n  content: \"\\f105\";\n}\n.fa-angle-up:before {\n  content: \"\\f106\";\n}\n.fa-angle-down:before {\n  content: \"\\f107\";\n}\n.fa-desktop:before {\n  content: \"\\f108\";\n}\n.fa-laptop:before {\n  content: \"\\f109\";\n}\n.fa-tablet:before {\n  content: \"\\f10a\";\n}\n.fa-mobile-phone:before,\n.fa-mobile:before {\n  content: \"\\f10b\";\n}\n.fa-circle-o:before {\n  content: \"\\f10c\";\n}\n.fa-quote-left:before {\n  content: \"\\f10d\";\n}\n.fa-quote-right:before {\n  content: \"\\f10e\";\n}\n.fa-spinner:before {\n  content: \"\\f110\";\n}\n.fa-circle:before {\n  content: \"\\f111\";\n}\n.fa-mail-reply:before,\n.fa-reply:before {\n  content: \"\\f112\";\n}\n.fa-github-alt:before {\n  content: \"\\f113\";\n}\n.fa-folder-o:before {\n  content: \"\\f114\";\n}\n.fa-folder-open-o:before {\n  content: \"\\f115\";\n}\n.fa-smile-o:before {\n  content: \"\\f118\";\n}\n.fa-frown-o:before {\n  content: \"\\f119\";\n}\n.fa-meh-o:before {\n  content: \"\\f11a\";\n}\n.fa-gamepad:before {\n  content: \"\\f11b\";\n}\n.fa-keyboard-o:before {\n  content: \"\\f11c\";\n}\n.fa-flag-o:before {\n  content: \"\\f11d\";\n}\n.fa-flag-checkered:before {\n  content: \"\\f11e\";\n}\n.fa-terminal:before {\n  content: \"\\f120\";\n}\n.fa-code:before {\n  content: \"\\f121\";\n}\n.fa-mail-reply-all:before,\n.fa-reply-all:before {\n  content: \"\\f122\";\n}\n.fa-star-half-empty:before,\n.fa-star-half-full:before,\n.fa-star-half-o:before {\n  content: \"\\f123\";\n}\n.fa-location-arrow:before {\n  content: \"\\f124\";\n}\n.fa-crop:before {\n  content: \"\\f125\";\n}\n.fa-code-fork:before {\n  content: \"\\f126\";\n}\n.fa-unlink:before,\n.fa-chain-broken:before {\n  content: \"\\f127\";\n}\n.fa-question:before {\n  content: \"\\f128\";\n}\n.fa-info:before {\n  content: \"\\f129\";\n}\n.fa-exclamation:before {\n  content: \"\\f12a\";\n}\n.fa-superscript:before {\n  content: \"\\f12b\";\n}\n.fa-subscript:before {\n  content: \"\\f12c\";\n}\n.fa-eraser:before {\n  content: \"\\f12d\";\n}\n.fa-puzzle-piece:before {\n  content: \"\\f12e\";\n}\n.fa-microphone:before {\n  content: \"\\f130\";\n}\n.fa-microphone-slash:before {\n  content: \"\\f131\";\n}\n.fa-shield:before {\n  content: \"\\f132\";\n}\n.fa-calendar-o:before {\n  content: \"\\f133\";\n}\n.fa-fire-extinguisher:before {\n  content: \"\\f134\";\n}\n.fa-rocket:before {\n  content: \"\\f135\";\n}\n.fa-maxcdn:before {\n  content: \"\\f136\";\n}\n.fa-chevron-circle-left:before {\n  content: \"\\f137\";\n}\n.fa-chevron-circle-right:before {\n  content: \"\\f138\";\n}\n.fa-chevron-circle-up:before {\n  content: \"\\f139\";\n}\n.fa-chevron-circle-down:before {\n  content: \"\\f13a\";\n}\n.fa-html5:before {\n  content: \"\\f13b\";\n}\n.fa-css3:before {\n  content: \"\\f13c\";\n}\n.fa-anchor:before {\n  content: \"\\f13d\";\n}\n.fa-unlock-alt:before {\n  content: \"\\f13e\";\n}\n.fa-bullseye:before {\n  content: \"\\f140\";\n}\n.fa-ellipsis-h:before {\n  content: \"\\f141\";\n}\n.fa-ellipsis-v:before {\n  content: \"\\f142\";\n}\n.fa-rss-square:before {\n  content: \"\\f143\";\n}\n.fa-play-circle:before {\n  content: \"\\f144\";\n}\n.fa-ticket:before {\n  content: \"\\f145\";\n}\n.fa-minus-square:before {\n  content: \"\\f146\";\n}\n.fa-minus-square-o:before {\n  content: \"\\f147\";\n}\n.fa-level-up:before {\n  content: \"\\f148\";\n}\n.fa-level-down:before {\n  content: \"\\f149\";\n}\n.fa-check-square:before {\n  content: \"\\f14a\";\n}\n.fa-pencil-square:before {\n  content: \"\\f14b\";\n}\n.fa-external-link-square:before {\n  content: \"\\f14c\";\n}\n.fa-share-square:before {\n  content: \"\\f14d\";\n}\n.fa-compass:before {\n  content: \"\\f14e\";\n}\n.fa-toggle-down:before,\n.fa-caret-square-o-down:before {\n  content: \"\\f150\";\n}\n.fa-toggle-up:before,\n.fa-caret-square-o-up:before {\n  content: \"\\f151\";\n}\n.fa-toggle-right:before,\n.fa-caret-square-o-right:before {\n  content: \"\\f152\";\n}\n.fa-euro:before,\n.fa-eur:before {\n  content: \"\\f153\";\n}\n.fa-gbp:before {\n  content: \"\\f154\";\n}\n.fa-dollar:before,\n.fa-usd:before {\n  content: \"\\f155\";\n}\n.fa-rupee:before,\n.fa-inr:before {\n  content: \"\\f156\";\n}\n.fa-cny:before,\n.fa-rmb:before,\n.fa-yen:before,\n.fa-jpy:before {\n  content: \"\\f157\";\n}\n.fa-ruble:before,\n.fa-rouble:before,\n.fa-rub:before {\n  content: \"\\f158\";\n}\n.fa-won:before,\n.fa-krw:before {\n  content: \"\\f159\";\n}\n.fa-bitcoin:before,\n.fa-btc:before {\n  content: \"\\f15a\";\n}\n.fa-file:before {\n  content: \"\\f15b\";\n}\n.fa-file-text:before {\n  content: \"\\f15c\";\n}\n.fa-sort-alpha-asc:before {\n  content: \"\\f15d\";\n}\n.fa-sort-alpha-desc:before {\n  content: \"\\f15e\";\n}\n.fa-sort-amount-asc:before {\n  content: \"\\f160\";\n}\n.fa-sort-amount-desc:before {\n  content: \"\\f161\";\n}\n.fa-sort-numeric-asc:before {\n  content: \"\\f162\";\n}\n.fa-sort-numeric-desc:before {\n  content: \"\\f163\";\n}\n.fa-thumbs-up:before {\n  content: \"\\f164\";\n}\n.fa-thumbs-down:before {\n  content: \"\\f165\";\n}\n.fa-youtube-square:before {\n  content: \"\\f166\";\n}\n.fa-youtube:before {\n  content: \"\\f167\";\n}\n.fa-xing:before {\n  content: \"\\f168\";\n}\n.fa-xing-square:before {\n  content: \"\\f169\";\n}\n.fa-youtube-play:before {\n  content: \"\\f16a\";\n}\n.fa-dropbox:before {\n  content: \"\\f16b\";\n}\n.fa-stack-overflow:before {\n  content: \"\\f16c\";\n}\n.fa-instagram:before {\n  content: \"\\f16d\";\n}\n.fa-flickr:before {\n  content: \"\\f16e\";\n}\n.fa-adn:before {\n  content: \"\\f170\";\n}\n.fa-bitbucket:before {\n  content: \"\\f171\";\n}\n.fa-bitbucket-square:before {\n  content: \"\\f172\";\n}\n.fa-tumblr:before {\n  content: \"\\f173\";\n}\n.fa-tumblr-square:before {\n  content: \"\\f174\";\n}\n.fa-long-arrow-down:before {\n  content: \"\\f175\";\n}\n.fa-long-arrow-up:before {\n  content: \"\\f176\";\n}\n.fa-long-arrow-left:before {\n  content: \"\\f177\";\n}\n.fa-long-arrow-right:before {\n  content: \"\\f178\";\n}\n.fa-apple:before {\n  content: \"\\f179\";\n}\n.fa-windows:before {\n  content: \"\\f17a\";\n}\n.fa-android:before {\n  content: \"\\f17b\";\n}\n.fa-linux:before {\n  content: \"\\f17c\";\n}\n.fa-dribbble:before {\n  content: \"\\f17d\";\n}\n.fa-skype:before {\n  content: \"\\f17e\";\n}\n.fa-foursquare:before {\n  content: \"\\f180\";\n}\n.fa-trello:before {\n  content: \"\\f181\";\n}\n.fa-female:before {\n  content: \"\\f182\";\n}\n.fa-male:before {\n  content: \"\\f183\";\n}\n.fa-gittip:before,\n.fa-gratipay:before {\n  content: \"\\f184\";\n}\n.fa-sun-o:before {\n  content: \"\\f185\";\n}\n.fa-moon-o:before {\n  content: \"\\f186\";\n}\n.fa-archive:before {\n  content: \"\\f187\";\n}\n.fa-bug:before {\n  content: \"\\f188\";\n}\n.fa-vk:before {\n  content: \"\\f189\";\n}\n.fa-weibo:before {\n  content: \"\\f18a\";\n}\n.fa-renren:before {\n  content: \"\\f18b\";\n}\n.fa-pagelines:before {\n  content: \"\\f18c\";\n}\n.fa-stack-exchange:before {\n  content: \"\\f18d\";\n}\n.fa-arrow-circle-o-right:before {\n  content: \"\\f18e\";\n}\n.fa-arrow-circle-o-left:before {\n  content: \"\\f190\";\n}\n.fa-toggle-left:before,\n.fa-caret-square-o-left:before {\n  content: \"\\f191\";\n}\n.fa-dot-circle-o:before {\n  content: \"\\f192\";\n}\n.fa-wheelchair:before {\n  content: \"\\f193\";\n}\n.fa-vimeo-square:before {\n  content: \"\\f194\";\n}\n.fa-turkish-lira:before,\n.fa-try:before {\n  content: \"\\f195\";\n}\n.fa-plus-square-o:before {\n  content: \"\\f196\";\n}\n.fa-space-shuttle:before {\n  content: \"\\f197\";\n}\n.fa-slack:before {\n  content: \"\\f198\";\n}\n.fa-envelope-square:before {\n  content: \"\\f199\";\n}\n.fa-wordpress:before {\n  content: \"\\f19a\";\n}\n.fa-openid:before {\n  content: \"\\f19b\";\n}\n.fa-institution:before,\n.fa-bank:before,\n.fa-university:before {\n  content: \"\\f19c\";\n}\n.fa-mortar-board:before,\n.fa-graduation-cap:before {\n  content: \"\\f19d\";\n}\n.fa-yahoo:before {\n  content: \"\\f19e\";\n}\n.fa-google:before {\n  content: \"\\f1a0\";\n}\n.fa-reddit:before {\n  content: \"\\f1a1\";\n}\n.fa-reddit-square:before {\n  content: \"\\f1a2\";\n}\n.fa-stumbleupon-circle:before {\n  content: \"\\f1a3\";\n}\n.fa-stumbleupon:before {\n  content: \"\\f1a4\";\n}\n.fa-delicious:before {\n  content: \"\\f1a5\";\n}\n.fa-digg:before {\n  content: \"\\f1a6\";\n}\n.fa-pied-piper:before {\n  content: \"\\f1a7\";\n}\n.fa-pied-piper-alt:before {\n  content: \"\\f1a8\";\n}\n.fa-drupal:before {\n  content: \"\\f1a9\";\n}\n.fa-joomla:before {\n  content: \"\\f1aa\";\n}\n.fa-language:before {\n  content: \"\\f1ab\";\n}\n.fa-fax:before {\n  content: \"\\f1ac\";\n}\n.fa-building:before {\n  content: \"\\f1ad\";\n}\n.fa-child:before {\n  content: \"\\f1ae\";\n}\n.fa-paw:before {\n  content: \"\\f1b0\";\n}\n.fa-spoon:before {\n  content: \"\\f1b1\";\n}\n.fa-cube:before {\n  content: \"\\f1b2\";\n}\n.fa-cubes:before {\n  content: \"\\f1b3\";\n}\n.fa-behance:before {\n  content: \"\\f1b4\";\n}\n.fa-behance-square:before {\n  content: \"\\f1b5\";\n}\n.fa-steam:before {\n  content: \"\\f1b6\";\n}\n.fa-steam-square:before {\n  content: \"\\f1b7\";\n}\n.fa-recycle:before {\n  content: \"\\f1b8\";\n}\n.fa-automobile:before,\n.fa-car:before {\n  content: \"\\f1b9\";\n}\n.fa-cab:before,\n.fa-taxi:before {\n  content: \"\\f1ba\";\n}\n.fa-tree:before {\n  content: \"\\f1bb\";\n}\n.fa-spotify:before {\n  content: \"\\f1bc\";\n}\n.fa-deviantart:before {\n  content: \"\\f1bd\";\n}\n.fa-soundcloud:before {\n  content: \"\\f1be\";\n}\n.fa-database:before {\n  content: \"\\f1c0\";\n}\n.fa-file-pdf-o:before {\n  content: \"\\f1c1\";\n}\n.fa-file-word-o:before {\n  content: \"\\f1c2\";\n}\n.fa-file-excel-o:before {\n  content: \"\\f1c3\";\n}\n.fa-file-powerpoint-o:before {\n  content: \"\\f1c4\";\n}\n.fa-file-photo-o:before,\n.fa-file-picture-o:before,\n.fa-file-image-o:before {\n  content: \"\\f1c5\";\n}\n.fa-file-zip-o:before,\n.fa-file-archive-o:before {\n  content: \"\\f1c6\";\n}\n.fa-file-sound-o:before,\n.fa-file-audio-o:before {\n  content: \"\\f1c7\";\n}\n.fa-file-movie-o:before,\n.fa-file-video-o:before {\n  content: \"\\f1c8\";\n}\n.fa-file-code-o:before {\n  content: \"\\f1c9\";\n}\n.fa-vine:before {\n  content: \"\\f1ca\";\n}\n.fa-codepen:before {\n  content: \"\\f1cb\";\n}\n.fa-jsfiddle:before {\n  content: \"\\f1cc\";\n}\n.fa-life-bouy:before,\n.fa-life-buoy:before,\n.fa-life-saver:before,\n.fa-support:before,\n.fa-life-ring:before {\n  content: \"\\f1cd\";\n}\n.fa-circle-o-notch:before {\n  content: \"\\f1ce\";\n}\n.fa-ra:before,\n.fa-rebel:before {\n  content: \"\\f1d0\";\n}\n.fa-ge:before,\n.fa-empire:before {\n  content: \"\\f1d1\";\n}\n.fa-git-square:before {\n  content: \"\\f1d2\";\n}\n.fa-git:before {\n  content: \"\\f1d3\";\n}\n.fa-hacker-news:before {\n  content: \"\\f1d4\";\n}\n.fa-tencent-weibo:before {\n  content: \"\\f1d5\";\n}\n.fa-qq:before {\n  content: \"\\f1d6\";\n}\n.fa-wechat:before,\n.fa-weixin:before {\n  content: \"\\f1d7\";\n}\n.fa-send:before,\n.fa-paper-plane:before {\n  content: \"\\f1d8\";\n}\n.fa-send-o:before,\n.fa-paper-plane-o:before {\n  content: \"\\f1d9\";\n}\n.fa-history:before {\n  content: \"\\f1da\";\n}\n.fa-genderless:before,\n.fa-circle-thin:before {\n  content: \"\\f1db\";\n}\n.fa-header:before {\n  content: \"\\f1dc\";\n}\n.fa-paragraph:before {\n  content: \"\\f1dd\";\n}\n.fa-sliders:before {\n  content: \"\\f1de\";\n}\n.fa-share-alt:before {\n  content: \"\\f1e0\";\n}\n.fa-share-alt-square:before {\n  content: \"\\f1e1\";\n}\n.fa-bomb:before {\n  content: \"\\f1e2\";\n}\n.fa-soccer-ball-o:before,\n.fa-futbol-o:before {\n  content: \"\\f1e3\";\n}\n.fa-tty:before {\n  content: \"\\f1e4\";\n}\n.fa-binoculars:before {\n  content: \"\\f1e5\";\n}\n.fa-plug:before {\n  content: \"\\f1e6\";\n}\n.fa-slideshare:before {\n  content: \"\\f1e7\";\n}\n.fa-twitch:before {\n  content: \"\\f1e8\";\n}\n.fa-yelp:before {\n  content: \"\\f1e9\";\n}\n.fa-newspaper-o:before {\n  content: \"\\f1ea\";\n}\n.fa-wifi:before {\n  content: \"\\f1eb\";\n}\n.fa-calculator:before {\n  content: \"\\f1ec\";\n}\n.fa-paypal:before {\n  content: \"\\f1ed\";\n}\n.fa-google-wallet:before {\n  content: \"\\f1ee\";\n}\n.fa-cc-visa:before {\n  content: \"\\f1f0\";\n}\n.fa-cc-mastercard:before {\n  content: \"\\f1f1\";\n}\n.fa-cc-discover:before {\n  content: \"\\f1f2\";\n}\n.fa-cc-amex:before {\n  content: \"\\f1f3\";\n}\n.fa-cc-paypal:before {\n  content: \"\\f1f4\";\n}\n.fa-cc-stripe:before {\n  content: \"\\f1f5\";\n}\n.fa-bell-slash:before {\n  content: \"\\f1f6\";\n}\n.fa-bell-slash-o:before {\n  content: \"\\f1f7\";\n}\n.fa-trash:before {\n  content: \"\\f1f8\";\n}\n.fa-copyright:before {\n  content: \"\\f1f9\";\n}\n.fa-at:before {\n  content: \"\\f1fa\";\n}\n.fa-eyedropper:before {\n  content: \"\\f1fb\";\n}\n.fa-paint-brush:before {\n  content: \"\\f1fc\";\n}\n.fa-birthday-cake:before {\n  content: \"\\f1fd\";\n}\n.fa-area-chart:before {\n  content: \"\\f1fe\";\n}\n.fa-pie-chart:before {\n  content: \"\\f200\";\n}\n.fa-line-chart:before {\n  content: \"\\f201\";\n}\n.fa-lastfm:before {\n  content: \"\\f202\";\n}\n.fa-lastfm-square:before {\n  content: \"\\f203\";\n}\n.fa-toggle-off:before {\n  content: \"\\f204\";\n}\n.fa-toggle-on:before {\n  content: \"\\f205\";\n}\n.fa-bicycle:before {\n  content: \"\\f206\";\n}\n.fa-bus:before {\n  content: \"\\f207\";\n}\n.fa-ioxhost:before {\n  content: \"\\f208\";\n}\n.fa-angellist:before {\n  content: \"\\f209\";\n}\n.fa-cc:before {\n  content: \"\\f20a\";\n}\n.fa-shekel:before,\n.fa-sheqel:before,\n.fa-ils:before {\n  content: \"\\f20b\";\n}\n.fa-meanpath:before {\n  content: \"\\f20c\";\n}\n.fa-buysellads:before {\n  content: \"\\f20d\";\n}\n.fa-connectdevelop:before {\n  content: \"\\f20e\";\n}\n.fa-dashcube:before {\n  content: \"\\f210\";\n}\n.fa-forumbee:before {\n  content: \"\\f211\";\n}\n.fa-leanpub:before {\n  content: \"\\f212\";\n}\n.fa-sellsy:before {\n  content: \"\\f213\";\n}\n.fa-shirtsinbulk:before {\n  content: \"\\f214\";\n}\n.fa-simplybuilt:before {\n  content: \"\\f215\";\n}\n.fa-skyatlas:before {\n  content: \"\\f216\";\n}\n.fa-cart-plus:before {\n  content: \"\\f217\";\n}\n.fa-cart-arrow-down:before {\n  content: \"\\f218\";\n}\n.fa-diamond:before {\n  content: \"\\f219\";\n}\n.fa-ship:before {\n  content: \"\\f21a\";\n}\n.fa-user-secret:before {\n  content: \"\\f21b\";\n}\n.fa-motorcycle:before {\n  content: \"\\f21c\";\n}\n.fa-street-view:before {\n  content: \"\\f21d\";\n}\n.fa-heartbeat:before {\n  content: \"\\f21e\";\n}\n.fa-venus:before {\n  content: \"\\f221\";\n}\n.fa-mars:before {\n  content: \"\\f222\";\n}\n.fa-mercury:before {\n  content: \"\\f223\";\n}\n.fa-transgender:before {\n  content: \"\\f224\";\n}\n.fa-transgender-alt:before {\n  content: \"\\f225\";\n}\n.fa-venus-double:before {\n  content: \"\\f226\";\n}\n.fa-mars-double:before {\n  content: \"\\f227\";\n}\n.fa-venus-mars:before {\n  content: \"\\f228\";\n}\n.fa-mars-stroke:before {\n  content: \"\\f229\";\n}\n.fa-mars-stroke-v:before {\n  content: \"\\f22a\";\n}\n.fa-mars-stroke-h:before {\n  content: \"\\f22b\";\n}\n.fa-neuter:before {\n  content: \"\\f22c\";\n}\n.fa-facebook-official:before {\n  content: \"\\f230\";\n}\n.fa-pinterest-p:before {\n  content: \"\\f231\";\n}\n.fa-whatsapp:before {\n  content: \"\\f232\";\n}\n.fa-server:before {\n  content: \"\\f233\";\n}\n.fa-user-plus:before {\n  content: \"\\f234\";\n}\n.fa-user-times:before {\n  content: \"\\f235\";\n}\n.fa-hotel:before,\n.fa-bed:before {\n  content: \"\\f236\";\n}\n.fa-viacoin:before {\n  content: \"\\f237\";\n}\n.fa-train:before {\n  content: \"\\f238\";\n}\n.fa-subway:before {\n  content: \"\\f239\";\n}\n.fa-medium:before {\n  content: \"\\f23a\";\n}\n@font-face {\n  font-family: Simple-Line-Icons;\n  src: url(../fonts/Simple-Line-Icons.eot);\n  src: url(../fonts/Simple-Line-Icons.eot?#iefix) format('embedded-opentype'), url(../fonts/Simple-Line-Icons.woff) format('woff'), url(../fonts/Simple-Line-Icons.ttf) format('truetype'), url(../fonts/Simple-Line-Icons.svg#Simple-Line-Icons) format('svg');\n  font-weight: 400;\n  font-style: normal;\n}\n.si {\n  font-family: Simple-Line-Icons;\n  speak: none;\n  font-style: normal;\n  font-weight: 400;\n  font-variant: normal;\n  text-transform: none;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n}\n.btn .si {\n  position: relative;\n  bottom: -2px;\n  display: inline-block;\n}\n.si-user-female:before {\n  content: \"\\e000\";\n}\n.si-user-follow:before {\n  content: \"\\e002\";\n}\n.si-user-following:before {\n  content: \"\\e003\";\n}\n.si-user-unfollow:before {\n  content: \"\\e004\";\n}\n.si-trophy:before {\n  content: \"\\e006\";\n}\n.si-screen-smartphone:before {\n  content: \"\\e010\";\n}\n.si-screen-desktop:before {\n  content: \"\\e011\";\n}\n.si-plane:before {\n  content: \"\\e012\";\n}\n.si-notebook:before {\n  content: \"\\e013\";\n}\n.si-moustache:before {\n  content: \"\\e014\";\n}\n.si-mouse:before {\n  content: \"\\e015\";\n}\n.si-magnet:before {\n  content: \"\\e016\";\n}\n.si-energy:before {\n  content: \"\\e020\";\n}\n.si-emoticon-smile:before {\n  content: \"\\e021\";\n}\n.si-disc:before {\n  content: \"\\e022\";\n}\n.si-cursor-move:before {\n  content: \"\\e023\";\n}\n.si-crop:before {\n  content: \"\\e024\";\n}\n.si-credit-card:before {\n  content: \"\\e025\";\n}\n.si-chemistry:before {\n  content: \"\\e026\";\n}\n.si-user:before {\n  content: \"\\e005\";\n}\n.si-speedometer:before {\n  content: \"\\e007\";\n}\n.si-social-youtube:before {\n  content: \"\\e008\";\n}\n.si-social-twitter:before {\n  content: \"\\e009\";\n}\n.si-social-tumblr:before {\n  content: \"\\e00a\";\n}\n.si-social-facebook:before {\n  content: \"\\e00b\";\n}\n.si-social-dropbox:before {\n  content: \"\\e00c\";\n}\n.si-social-dribbble:before {\n  content: \"\\e00d\";\n}\n.si-shield:before {\n  content: \"\\e00e\";\n}\n.si-screen-tablet:before {\n  content: \"\\e00f\";\n}\n.si-magic-wand:before {\n  content: \"\\e017\";\n}\n.si-hourglass:before {\n  content: \"\\e018\";\n}\n.si-graduation:before {\n  content: \"\\e019\";\n}\n.si-ghost:before {\n  content: \"\\e01a\";\n}\n.si-game-controller:before {\n  content: \"\\e01b\";\n}\n.si-fire:before {\n  content: \"\\e01c\";\n}\n.si-eyeglasses:before {\n  content: \"\\e01d\";\n}\n.si-envelope-open:before {\n  content: \"\\e01e\";\n}\n.si-envelope-letter:before {\n  content: \"\\e01f\";\n}\n.si-bell:before {\n  content: \"\\e027\";\n}\n.si-badge:before {\n  content: \"\\e028\";\n}\n.si-anchor:before {\n  content: \"\\e029\";\n}\n.si-wallet:before {\n  content: \"\\e02a\";\n}\n.si-vector:before {\n  content: \"\\e02b\";\n}\n.si-speech:before {\n  content: \"\\e02c\";\n}\n.si-puzzle:before {\n  content: \"\\e02d\";\n}\n.si-printer:before {\n  content: \"\\e02e\";\n}\n.si-present:before {\n  content: \"\\e02f\";\n}\n.si-playlist:before {\n  content: \"\\e030\";\n}\n.si-pin:before {\n  content: \"\\e031\";\n}\n.si-picture:before {\n  content: \"\\e032\";\n}\n.si-map:before {\n  content: \"\\e033\";\n}\n.si-layers:before {\n  content: \"\\e034\";\n}\n.si-handbag:before {\n  content: \"\\e035\";\n}\n.si-globe-alt:before {\n  content: \"\\e036\";\n}\n.si-globe:before {\n  content: \"\\e037\";\n}\n.si-frame:before {\n  content: \"\\e038\";\n}\n.si-folder-alt:before {\n  content: \"\\e039\";\n}\n.si-film:before {\n  content: \"\\e03a\";\n}\n.si-feed:before {\n  content: \"\\e03b\";\n}\n.si-earphones-alt:before {\n  content: \"\\e03c\";\n}\n.si-earphones:before {\n  content: \"\\e03d\";\n}\n.si-drop:before {\n  content: \"\\e03e\";\n}\n.si-drawer:before {\n  content: \"\\e03f\";\n}\n.si-docs:before {\n  content: \"\\e040\";\n}\n.si-directions:before {\n  content: \"\\e041\";\n}\n.si-direction:before {\n  content: \"\\e042\";\n}\n.si-diamond:before {\n  content: \"\\e043\";\n}\n.si-cup:before {\n  content: \"\\e044\";\n}\n.si-compass:before {\n  content: \"\\e045\";\n}\n.si-call-out:before {\n  content: \"\\e046\";\n}\n.si-call-in:before {\n  content: \"\\e047\";\n}\n.si-call-end:before {\n  content: \"\\e048\";\n}\n.si-calculator:before {\n  content: \"\\e049\";\n}\n.si-bubbles:before {\n  content: \"\\e04a\";\n}\n.si-briefcase:before {\n  content: \"\\e04b\";\n}\n.si-book-open:before {\n  content: \"\\e04c\";\n}\n.si-basket-loaded:before {\n  content: \"\\e04d\";\n}\n.si-basket:before {\n  content: \"\\e04e\";\n}\n.si-bag:before {\n  content: \"\\e04f\";\n}\n.si-action-undo:before {\n  content: \"\\e050\";\n}\n.si-action-redo:before {\n  content: \"\\e051\";\n}\n.si-wrench:before {\n  content: \"\\e052\";\n}\n.si-umbrella:before {\n  content: \"\\e053\";\n}\n.si-trash:before {\n  content: \"\\e054\";\n}\n.si-tag:before {\n  content: \"\\e055\";\n}\n.si-support:before {\n  content: \"\\e056\";\n}\n.si-size-fullscreen:before {\n  content: \"\\e057\";\n}\n.si-size-actual:before {\n  content: \"\\e058\";\n}\n.si-shuffle:before {\n  content: \"\\e059\";\n}\n.si-share-alt:before {\n  content: \"\\e05a\";\n}\n.si-share:before {\n  content: \"\\e05b\";\n}\n.si-rocket:before {\n  content: \"\\e05c\";\n}\n.si-question:before {\n  content: \"\\e05d\";\n}\n.si-pie-chart:before {\n  content: \"\\e05e\";\n}\n.si-pencil:before {\n  content: \"\\e05f\";\n}\n.si-note:before {\n  content: \"\\e060\";\n}\n.si-music-tone-alt:before {\n  content: \"\\e061\";\n}\n.si-music-tone:before {\n  content: \"\\e062\";\n}\n.si-microphone:before {\n  content: \"\\e063\";\n}\n.si-loop:before {\n  content: \"\\e064\";\n}\n.si-logout:before {\n  content: \"\\e065\";\n}\n.si-login:before {\n  content: \"\\e066\";\n}\n.si-list:before {\n  content: \"\\e067\";\n}\n.si-like:before {\n  content: \"\\e068\";\n}\n.si-home:before {\n  content: \"\\e069\";\n}\n.si-grid:before {\n  content: \"\\e06a\";\n}\n.si-graph:before {\n  content: \"\\e06b\";\n}\n.si-equalizer:before {\n  content: \"\\e06c\";\n}\n.si-dislike:before {\n  content: \"\\e06d\";\n}\n.si-cursor:before {\n  content: \"\\e06e\";\n}\n.si-control-start:before {\n  content: \"\\e06f\";\n}\n.si-control-rewind:before {\n  content: \"\\e070\";\n}\n.si-control-play:before {\n  content: \"\\e071\";\n}\n.si-control-pause:before {\n  content: \"\\e072\";\n}\n.si-control-forward:before {\n  content: \"\\e073\";\n}\n.si-control-end:before {\n  content: \"\\e074\";\n}\n.si-calendar:before {\n  content: \"\\e075\";\n}\n.si-bulb:before {\n  content: \"\\e076\";\n}\n.si-bar-chart:before {\n  content: \"\\e077\";\n}\n.si-arrow-up:before {\n  content: \"\\e078\";\n}\n.si-arrow-right:before {\n  content: \"\\e079\";\n}\n.si-arrow-left:before {\n  content: \"\\e07a\";\n}\n.si-arrow-down:before {\n  content: \"\\e07b\";\n}\n.si-ban:before {\n  content: \"\\e07c\";\n}\n.si-bubble:before {\n  content: \"\\e07d\";\n}\n.si-camcorder:before {\n  content: \"\\e07e\";\n}\n.si-camera:before {\n  content: \"\\e07f\";\n}\n.si-check:before {\n  content: \"\\e080\";\n}\n.si-clock:before {\n  content: \"\\e081\";\n}\n.si-close:before {\n  content: \"\\e082\";\n}\n.si-cloud-download:before {\n  content: \"\\e083\";\n}\n.si-cloud-upload:before {\n  content: \"\\e084\";\n}\n.si-doc:before {\n  content: \"\\e085\";\n}\n.si-envelope:before {\n  content: \"\\e086\";\n}\n.si-eye:before {\n  content: \"\\e087\";\n}\n.si-flag:before {\n  content: \"\\e088\";\n}\n.si-folder:before {\n  content: \"\\e089\";\n}\n.si-heart:before {\n  content: \"\\e08a\";\n}\n.si-info:before {\n  content: \"\\e08b\";\n}\n.si-key:before {\n  content: \"\\e08c\";\n}\n.si-link:before {\n  content: \"\\e08d\";\n}\n.si-lock:before {\n  content: \"\\e08e\";\n}\n.si-lock-open:before {\n  content: \"\\e08f\";\n}\n.si-magnifier:before {\n  content: \"\\e090\";\n}\n.si-magnifier-add:before {\n  content: \"\\e091\";\n}\n.si-magnifier-remove:before {\n  content: \"\\e092\";\n}\n.si-paper-clip:before {\n  content: \"\\e093\";\n}\n.si-paper-plane:before {\n  content: \"\\e094\";\n}\n.si-plus:before {\n  content: \"\\e095\";\n}\n.si-pointer:before {\n  content: \"\\e096\";\n}\n.si-power:before {\n  content: \"\\e097\";\n}\n.si-refresh:before {\n  content: \"\\e098\";\n}\n.si-reload:before {\n  content: \"\\e099\";\n}\n.si-settings:before {\n  content: \"\\e09a\";\n}\n.si-star:before {\n  content: \"\\e09b\";\n}\n.si-symbol-female:before {\n  content: \"\\e09c\";\n}\n.si-symbol-male:before {\n  content: \"\\e09d\";\n}\n.si-target:before {\n  content: \"\\e09e\";\n}\n.si-volume-1:before {\n  content: \"\\e09f\";\n}\n.si-volume-2:before {\n  content: \"\\e0a0\";\n}\n.si-volume-off:before {\n  content: \"\\e0a1\";\n}\n.si-users:before {\n  content: \"\\e001\";\n}\n#header-navbar {\n  min-height: 60px;\n  background-color: #fff;\n}\n#header-navbar:before,\n#header-navbar:after {\n  content: \" \";\n  display: table;\n}\n#header-navbar:after {\n  clear: both;\n}\n.header-navbar-fixed #header-navbar {\n  position: fixed;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n  min-width: 320px;\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n  -webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.02);\n  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.02);\n}\n.header-navbar-fixed #main-container {\n  padding-top: 60px;\n}\n@media screen and (min-width: 992px) {\n  .header-navbar-fixed.sidebar-l.sidebar-o #header-navbar {\n    left: 230px;\n  }\n  .header-navbar-fixed.sidebar-r.sidebar-o #header-navbar {\n    right: 230px;\n  }\n  .header-navbar-fixed.sidebar-l.sidebar-o.sidebar-mini #header-navbar {\n    left: 60px;\n  }\n  .header-navbar-fixed.sidebar-r.sidebar-o.sidebar-mini #header-navbar {\n    right: 60px;\n  }\n}\n.header-navbar-transparent #header-navbar {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.header-navbar-transparent.header-navbar-fixed.header-navbar-scroll #header-navbar {\n  background-color: #3e4a59;\n}\n.header-navbar-transparent.header-navbar-fixed #main-container {\n  padding-top: 0;\n}\n#page-container {\n  margin: 0 auto;\n  width: 100%;\n  min-width: 320px;\n  background-color: #2c343f;\n}\n@media screen and (min-width: 992px) {\n  #page-container.sidebar-l.sidebar-o {\n    padding-left: 230px;\n  }\n  #page-container.sidebar-r.sidebar-o {\n    padding-right: 230px;\n  }\n  #page-container.sidebar-l.sidebar-o.sidebar-mini {\n    padding-left: 60px;\n  }\n  #page-container.sidebar-r.sidebar-o.sidebar-mini {\n    padding-right: 60px;\n  }\n}\n#sidebar,\n#side-overlay {\n  position: fixed;\n  top: 0;\n  bottom: 0;\n  z-index: 1031;\n  overflow-y: auto;\n  -webkit-overflow-scrolling: touch;\n  -webkit-transition: all 0.28s ease-out;\n  transition: all 0.28s ease-out;\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n}\n@media screen and (min-width: 992px) {\n  .side-scroll #sidebar,\n  .side-scroll #side-overlay {\n    overflow-y: hidden;\n  }\n}\n#sidebar {\n  width: 230px;\n  background-color: #2c343f;\n}\n.sidebar-l #sidebar {\n  left: 0;\n  -webkit-transform: translateX(-100%) translateY(0) translateZ(0);\n  -ms-transform: translateX(-100%) translateY(0);\n  transform: translateX(-100%) translateY(0) translateZ(0);\n}\n.sidebar-r #sidebar {\n  right: 0;\n  -webkit-transform: translateX(100%) translateY(0) translateZ(0);\n  -ms-transform: translateX(100%) translateY(0);\n  transform: translateX(100%) translateY(0) translateZ(0);\n}\n@media screen and (max-width: 991px) {\n  #sidebar {\n    width: 100%;\n    opacity: 0;\n  }\n  .sidebar-o-xs #sidebar {\n    opacity: 1;\n    -webkit-transform: translateX(0) translateY(0) translateZ(0);\n    -ms-transform: translateX(0) translateY(0);\n    transform: translateX(0) translateY(0) translateZ(0);\n  }\n}\n@media screen and (min-width: 992px) {\n  #sidebar {\n    width: 230px;\n    -webkit-transition: none;\n    transition: none;\n  }\n  .sidebar-o #sidebar {\n    -webkit-transform: translateX(0) translateY(0) translateZ(0);\n    -ms-transform: translateX(0) translateY(0);\n    transform: translateX(0) translateY(0) translateZ(0);\n  }\n  .sidebar-o.sidebar-mini #sidebar {\n    overflow-x: hidden;\n    -webkit-transition: all 0.28s ease-out;\n    transition: all 0.28s ease-out;\n  }\n  .sidebar-l.sidebar-o.sidebar-mini #sidebar {\n    -webkit-transform: translateX(-170px) translateY(0) translateZ(0);\n    -ms-transform: translateX(-170px) translateY(0);\n    transform: translateX(-170px) translateY(0) translateZ(0);\n  }\n  .sidebar-r.sidebar-o.sidebar-mini #sidebar {\n    -webkit-transform: translateX(170px) translateY(0) translateZ(0);\n    -ms-transform: translateX(170px) translateY(0);\n    transform: translateX(170px) translateY(0) translateZ(0);\n  }\n  .sidebar-o.sidebar-mini #sidebar .sidebar-content {\n    width: 230px;\n    -webkit-transition: all 0.28s ease-out;\n    transition: all 0.28s ease-out;\n  }\n  .sidebar-l.sidebar-o.sidebar-mini #sidebar .sidebar-content {\n    -webkit-transform: translateX(170px) translateY(0) translateZ(0);\n    -ms-transform: translateX(170px) translateY(0);\n    transform: translateX(170px) translateY(0) translateZ(0);\n  }\n  .sidebar-o.sidebar-mini #sidebar:hover,\n  .sidebar-o.sidebar-mini #sidebar:hover .sidebar-content {\n    -webkit-transform: translateX(0) translateY(0) translateZ(0);\n    -ms-transform: translateX(0) translateY(0);\n    transform: translateX(0) translateY(0) translateZ(0);\n  }\n  .sidebar-o.sidebar-mini #sidebar .sidebar-mini-hide {\n    opacity: 0;\n    -webkit-transition: opacity 0.28s ease-out;\n    transition: opacity 0.28s ease-out;\n  }\n  .sidebar-o.sidebar-mini #sidebar .sidebar-mini-hidden {\n    display: none;\n  }\n  .sidebar-o.sidebar-mini #sidebar .nav-main > li.open > ul {\n    display: none;\n  }\n  .sidebar-o.sidebar-mini #sidebar:hover .sidebar-mini-hide {\n    opacity: 1;\n  }\n  .sidebar-o.sidebar-mini #sidebar:hover .nav-main > li.open > ul {\n    display: block;\n  }\n}\n#side-overlay {\n  background-color: #fff;\n}\n.sidebar-l #side-overlay {\n  right: 0;\n  -webkit-transform: translateX(100%) translateY(0) translateZ(0);\n  -ms-transform: translateX(100%) translateY(0);\n  transform: translateX(100%) translateY(0) translateZ(0);\n}\n.sidebar-r #side-overlay {\n  left: 0;\n  -webkit-transform: translateX(-100%) translateY(0) translateZ(0);\n  -ms-transform: translateX(-100%) translateY(0);\n  transform: translateX(-100%) translateY(0) translateZ(0);\n}\n@media screen and (max-width: 991px) {\n  #side-overlay {\n    width: 100%;\n    opacity: 0;\n  }\n  .side-overlay-o #side-overlay {\n    opacity: 1;\n    -webkit-transform: translateX(0) translateY(0) translateZ(0);\n    -ms-transform: translateX(0) translateY(0);\n    transform: translateX(0) translateY(0) translateZ(0);\n  }\n}\n@media screen and (min-width: 992px) {\n  #side-overlay {\n    width: 320px;\n    -webkit-box-shadow: 0 0 20px rgba(0, 0, 0, 0.3);\n    box-shadow: 0 0 20px rgba(0, 0, 0, 0.3);\n  }\n  .sidebar-l #side-overlay {\n    -webkit-transform: translateX(110%) translateY(0) translateZ(0);\n    -ms-transform: translateX(110%) translateY(0);\n    transform: translateX(110%) translateY(0) translateZ(0);\n  }\n  .sidebar-r #side-overlay {\n    -webkit-transform: translateX(-110%) translateY(0) translateZ(0);\n    -ms-transform: translateX(-110%) translateY(0);\n    transform: translateX(-110%) translateY(0) translateZ(0);\n  }\n  .sidebar-l.side-overlay-hover #side-overlay {\n    -webkit-transform: translateX(300px) translateY(0) translateZ(0);\n    -ms-transform: translateX(300px) translateY(0);\n    transform: translateX(300px) translateY(0) translateZ(0);\n  }\n  .sidebar-r.side-overlay-hover #side-overlay {\n    -webkit-transform: translateX(-300px) translateY(0) translateZ(0);\n    -ms-transform: translateX(-300px) translateY(0);\n    transform: translateX(-300px) translateY(0) translateZ(0);\n  }\n  .side-overlay-hover #side-overlay:hover,\n  .side-overlay-o #side-overlay,\n  .side-overlay-o.side-overlay-hover #side-overlay {\n    -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);\n    box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);\n    -webkit-transform: translateX(0) translateY(0) translateZ(0);\n    -ms-transform: translateX(0) translateY(0);\n    transform: translateX(0) translateY(0) translateZ(0);\n  }\n}\n.side-header {\n  margin: 0 auto;\n  min-height: 60px;\n}\n.side-header:before,\n.side-header:after {\n  content: \" \";\n  display: table;\n}\n.side-header:after {\n  clear: both;\n}\n.side-header.side-content {\n  overflow: visible;\n}\n.side-header > span,\n.side-header > a {\n  display: inline-block;\n  line-height: 34px;\n}\n.side-header img {\n  display: inline-block;\n  margin-top: -2px;\n}\n.side-content {\n  margin: 0 auto;\n  padding: 13px 20px 1px;\n  max-width: 100%;\n  overflow-x: hidden;\n}\n.side-content p,\n.side-content .push,\n.side-content .block,\n.side-content .items-push > div {\n  margin-bottom: 13px;\n}\n.side-content .items-push-2x > div {\n  margin-bottom: 26px;\n}\n.side-content .items-push-3x > div {\n  margin-bottom: 39px;\n}\n.side-content.side-content-full {\n  padding-bottom: 13px;\n}\n.side-content.side-content-full .pull-b {\n  margin-bottom: -13px;\n}\n.side-content .pull-t {\n  margin-top: -13px;\n}\n.side-content .pull-r-l {\n  margin-right: -20px;\n  margin-left: -20px;\n}\n.side-content .pull-b {\n  margin-bottom: -1px;\n}\n#main-container,\n#page-footer {\n  overflow-x: hidden;\n}\n#main-container {\n  background-color: #f5f5f5;\n}\n.content {\n  margin: 0 auto;\n  padding: 16px 14px 1px;\n  max-width: 100%;\n  overflow-x: visible;\n}\n.content p,\n.content .push,\n.content .block,\n.content .items-push > div {\n  margin-bottom: 16px;\n}\n.content .items-push-2x > div {\n  margin-bottom: 32px;\n}\n.content .items-push-3x > div {\n  margin-bottom: 48px;\n}\n.content.content-full {\n  padding-bottom: 16px;\n}\n.content.content-full .pull-b {\n  margin-bottom: -16px;\n}\n.content .pull-t {\n  margin-top: -16px;\n}\n.content .pull-r-l {\n  margin-right: -14px;\n  margin-left: -14px;\n}\n.content .pull-b {\n  margin-bottom: -1px;\n}\n@media screen and (min-width: 768px) {\n  .content {\n    margin: 0 auto;\n    padding: 30px 30px 1px;\n    max-width: 100%;\n    overflow-x: visible;\n  }\n  .content p,\n  .content .push,\n  .content .block,\n  .content .items-push > div {\n    margin-bottom: 30px;\n  }\n  .content .items-push-2x > div {\n    margin-bottom: 60px;\n  }\n  .content .items-push-3x > div {\n    margin-bottom: 90px;\n  }\n  .content.content-full {\n    padding-bottom: 30px;\n  }\n  .content.content-full .pull-b {\n    margin-bottom: -30px;\n  }\n  .content .pull-t {\n    margin-top: -30px;\n  }\n  .content .pull-r-l {\n    margin-right: -30px;\n    margin-left: -30px;\n  }\n  .content .pull-b {\n    margin-bottom: -1px;\n  }\n  .content.content-boxed {\n    max-width: 1280px;\n  }\n  .content.content-narrow {\n    max-width: 95%;\n  }\n}\n.content-grid {\n  margin-bottom: 24px;\n}\n.content-grid .push,\n.content-grid .block {\n  margin-bottom: 6px;\n}\n.content-grid .row {\n  margin-left: -3px;\n  margin-right: -3px;\n}\n.content-grid .row > div[class*=\"col\"] {\n  padding-left: 3px;\n  padding-right: 3px;\n}\n.content-mini {\n  margin: 0 auto;\n  padding: 13px 14px 1px;\n  max-width: 100%;\n  overflow-x: visible;\n}\n.content-mini p,\n.content-mini .push,\n.content-mini .block,\n.content-mini .items-push > div {\n  margin-bottom: 13px;\n}\n.content-mini .items-push-2x > div {\n  margin-bottom: 26px;\n}\n.content-mini .items-push-3x > div {\n  margin-bottom: 39px;\n}\n.content-mini.content-mini-full {\n  padding-bottom: 13px;\n}\n.content-mini.content-mini-full .pull-b {\n  margin-bottom: -13px;\n}\n.content-mini .pull-t {\n  margin-top: -13px;\n}\n.content-mini .pull-r-l {\n  margin-right: -14px;\n  margin-left: -14px;\n}\n.content-mini .pull-b {\n  margin-bottom: -1px;\n}\n@media screen and (min-width: 768px) {\n  .content-mini {\n    margin: 0 auto;\n    padding: 13px 30px 1px;\n    max-width: 100%;\n    overflow-x: visible;\n  }\n  .content-mini p,\n  .content-mini .push,\n  .content-mini .block,\n  .content-mini .items-push > div {\n    margin-bottom: 13px;\n  }\n  .content-mini .items-push-2x > div {\n    margin-bottom: 26px;\n  }\n  .content-mini .items-push-3x > div {\n    margin-bottom: 39px;\n  }\n  .content-mini.content-mini-full {\n    padding-bottom: 13px;\n  }\n  .content-mini.content-mini-full .pull-b {\n    margin-bottom: -13px;\n  }\n  .content-mini .pull-t {\n    margin-top: -13px;\n  }\n  .content-mini .pull-r-l {\n    margin-right: -30px;\n    margin-left: -30px;\n  }\n  .content-mini .pull-b {\n    margin-bottom: -1px;\n  }\n}\n.content-boxed {\n  margin: 0 auto;\n  width: 100%;\n  max-width: 1280px;\n}\n.bg-image {\n  background-color: #f9f9f9;\n  background-position: center center;\n  background-repeat: no-repeat;\n  -webkit-background-size: cover;\n  background-size: cover;\n}\n.bg-image-parallax {\n  background-attachment: fixed;\n}\n.form-material {\n  position: relative;\n  margin: 10px 0 10px;\n}\n.form-material > label {\n  position: absolute;\n  top: 6px;\n  left: 0;\n  font-size: 13px;\n  font-weight: 600;\n  -webkit-transform: translateY(-24px);\n  -ms-transform: translateY(-24px);\n  transform: translateY(-24px);\n}\n.form-material.floating > label {\n  font-size: 15px;\n  font-weight: 400;\n  cursor: text;\n  z-index: 10;\n  -webkit-transition: all 0.15s ease-out;\n  transition: all 0.15s ease-out;\n  -webkit-transform: translateY(0);\n  -ms-transform: translateY(0);\n  transform: translateY(0);\n}\n.form-material > .form-control {\n  padding-left: 0;\n  padding-right: 0;\n  border: 0;\n  border-radius: 0;\n  background-color: transparent;\n  -webkit-box-shadow: 0 1px 0 #e6e6e6;\n  box-shadow: 0 1px 0 #e6e6e6;\n}\n.form-material > .form-control:focus {\n  background-color: transparent;\n  -webkit-box-shadow: 0 2px 0 #646464;\n  box-shadow: 0 2px 0 #646464;\n}\n.form-material > .form-control:focus + label {\n  color: #646464;\n}\n.form-material > .form-control:focus ~ .input-group-addon {\n  -webkit-box-shadow: 0 2px 0 #646464;\n  box-shadow: 0 2px 0 #646464;\n}\n.form-material > .form-control:focus + label,\n.form-material.floating.open > label {\n  font-size: 13px;\n  font-weight: 600;\n  cursor: default;\n  -webkit-transform: translateY(-24px);\n  -ms-transform: translateY(-24px);\n  transform: translateY(-24px);\n}\n.form-material .form-control[disabled],\n.form-material .form-control[readonly],\n.form-material fieldset[disabled] .form-control {\n  background-color: #fff;\n  border-bottom: 1px dashed #ccc;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.form-material.input-group .input-group-addon {\n  border: none;\n  background-color: transparent;\n  border-radius: 0 !important;\n  -webkit-box-shadow: 0 1px 0 #e6e6e6;\n  box-shadow: 0 1px 0 #e6e6e6;\n  -webkit-transition: all 0.15s ease-out;\n  transition: all 0.15s ease-out;\n}\n.form-material.form-material-primary > .form-control:focus {\n  -webkit-box-shadow: 0 2px 0 #5c90d2;\n  box-shadow: 0 2px 0 #5c90d2;\n}\n.form-material.form-material-primary > .form-control:focus + label {\n  color: #5c90d2;\n}\n.form-material.form-material-primary > .form-control:focus ~ .input-group-addon {\n  color: #5c90d2;\n  -webkit-box-shadow: 0 2px 0 #5c90d2;\n  box-shadow: 0 2px 0 #5c90d2;\n}\n.form-material.form-material-success > .form-control:focus {\n  -webkit-box-shadow: 0 2px 0 #46c37b;\n  box-shadow: 0 2px 0 #46c37b;\n}\n.form-material.form-material-success > .form-control:focus + label {\n  color: #46c37b;\n}\n.form-material.form-material-success > .form-control:focus ~ .input-group-addon {\n  color: #46c37b;\n  -webkit-box-shadow: 0 2px 0 #46c37b;\n  box-shadow: 0 2px 0 #46c37b;\n}\n.form-material.form-material-info > .form-control:focus {\n  -webkit-box-shadow: 0 2px 0 #70b9eb;\n  box-shadow: 0 2px 0 #70b9eb;\n}\n.form-material.form-material-info > .form-control:focus + label {\n  color: #70b9eb;\n}\n.form-material.form-material-info > .form-control:focus ~ .input-group-addon {\n  color: #70b9eb;\n  -webkit-box-shadow: 0 2px 0 #70b9eb;\n  box-shadow: 0 2px 0 #70b9eb;\n}\n.form-material.form-material-warning > .form-control:focus {\n  -webkit-box-shadow: 0 2px 0 #f3b760;\n  box-shadow: 0 2px 0 #f3b760;\n}\n.form-material.form-material-warning > .form-control:focus + label {\n  color: #f3b760;\n}\n.form-material.form-material-warning > .form-control:focus ~ .input-group-addon {\n  color: #f3b760;\n  -webkit-box-shadow: 0 2px 0 #f3b760;\n  box-shadow: 0 2px 0 #f3b760;\n}\n.form-material.form-material-danger > .form-control:focus {\n  -webkit-box-shadow: 0 2px 0 #d26a5c;\n  box-shadow: 0 2px 0 #d26a5c;\n}\n.form-material.form-material-danger > .form-control:focus + label {\n  color: #d26a5c;\n}\n.form-material.form-material-danger > .form-control:focus ~ .input-group-addon {\n  color: #d26a5c;\n  -webkit-box-shadow: 0 2px 0 #d26a5c;\n  box-shadow: 0 2px 0 #d26a5c;\n}\n.has-success .form-material > .form-control {\n  -webkit-box-shadow: 0 1px 0 #46c37b;\n  box-shadow: 0 1px 0 #46c37b;\n}\n.has-success .form-material > .form-control:focus {\n  -webkit-box-shadow: 0 2px 0 #46c37b;\n  box-shadow: 0 2px 0 #46c37b;\n}\n.has-success .form-material > .form-control:focus + label {\n  color: #46c37b;\n}\n.has-success .form-material > .form-control:focus ~ .input-group-addon {\n  color: #46c37b;\n  -webkit-box-shadow: 0 2px 0 #46c37b;\n  box-shadow: 0 2px 0 #46c37b;\n}\n.has-success .form-material > .form-control + label {\n  color: #46c37b;\n}\n.has-success .form-material > .form-control ~ .input-group-addon {\n  color: #46c37b;\n  -webkit-box-shadow: 0 1px 0 #46c37b;\n  box-shadow: 0 1px 0 #46c37b;\n}\n.has-success .form-material > .help-block {\n  color: #46c37b;\n}\n.has-info .form-material > .form-control {\n  -webkit-box-shadow: 0 1px 0 #70b9eb;\n  box-shadow: 0 1px 0 #70b9eb;\n}\n.has-info .form-material > .form-control:focus {\n  -webkit-box-shadow: 0 2px 0 #70b9eb;\n  box-shadow: 0 2px 0 #70b9eb;\n}\n.has-info .form-material > .form-control:focus + label {\n  color: #70b9eb;\n}\n.has-info .form-material > .form-control:focus ~ .input-group-addon {\n  color: #70b9eb;\n  -webkit-box-shadow: 0 2px 0 #70b9eb;\n  box-shadow: 0 2px 0 #70b9eb;\n}\n.has-info .form-material > .form-control + label {\n  color: #70b9eb;\n}\n.has-info .form-material > .form-control ~ .input-group-addon {\n  color: #70b9eb;\n  -webkit-box-shadow: 0 1px 0 #70b9eb;\n  box-shadow: 0 1px 0 #70b9eb;\n}\n.has-info .form-material > .help-block {\n  color: #70b9eb;\n}\n.has-warning .form-material > .form-control {\n  -webkit-box-shadow: 0 1px 0 #f3b760;\n  box-shadow: 0 1px 0 #f3b760;\n}\n.has-warning .form-material > .form-control:focus {\n  -webkit-box-shadow: 0 2px 0 #f3b760;\n  box-shadow: 0 2px 0 #f3b760;\n}\n.has-warning .form-material > .form-control:focus + label {\n  color: #f3b760;\n}\n.has-warning .form-material > .form-control:focus ~ .input-group-addon {\n  color: #f3b760;\n  -webkit-box-shadow: 0 2px 0 #f3b760;\n  box-shadow: 0 2px 0 #f3b760;\n}\n.has-warning .form-material > .form-control + label {\n  color: #f3b760;\n}\n.has-warning .form-material > .form-control ~ .input-group-addon {\n  color: #f3b760;\n  -webkit-box-shadow: 0 1px 0 #f3b760;\n  box-shadow: 0 1px 0 #f3b760;\n}\n.has-warning .form-material > .help-block {\n  color: #f3b760;\n}\n.has-error .form-material > .form-control {\n  -webkit-box-shadow: 0 1px 0 #d26a5c;\n  box-shadow: 0 1px 0 #d26a5c;\n}\n.has-error .form-material > .form-control:focus {\n  -webkit-box-shadow: 0 2px 0 #d26a5c;\n  box-shadow: 0 2px 0 #d26a5c;\n}\n.has-error .form-material > .form-control:focus + label {\n  color: #d26a5c;\n}\n.has-error .form-material > .form-control:focus ~ .input-group-addon {\n  color: #d26a5c;\n  -webkit-box-shadow: 0 2px 0 #d26a5c;\n  box-shadow: 0 2px 0 #d26a5c;\n}\n.has-error .form-material > .form-control + label {\n  color: #d26a5c;\n}\n.has-error .form-material > .form-control ~ .input-group-addon {\n  color: #d26a5c;\n  -webkit-box-shadow: 0 1px 0 #d26a5c;\n  box-shadow: 0 1px 0 #d26a5c;\n}\n.has-error .form-material > .help-block {\n  color: #d26a5c;\n}\n.css-input {\n  position: relative;\n  display: inline-block;\n  margin: 2px 0;\n  font-weight: 400;\n  cursor: pointer;\n}\n.css-input input {\n  position: absolute;\n  opacity: 0;\n}\n.css-input input:focus + span {\n  box-shadow: 0 0 3px rgba(0, 0, 0, 0.25);\n}\n.css-input input + span {\n  position: relative;\n  display: inline-block;\n  margin-top: -2px;\n  margin-right: 3px;\n  vertical-align: middle;\n}\n.css-input input + span:after {\n  position: absolute;\n  content: \"\";\n}\n.css-checkbox {\n  margin: 7px 0;\n}\n.css-checkbox input + span {\n  width: 20px;\n  height: 20px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  -webkit-transition: background-color 0.2s;\n  transition: background-color 0.2s;\n}\n.css-checkbox input + span:after {\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  font-family: \"FontAwesome\";\n  font-size: 10px;\n  color: #fff;\n  line-height: 18px;\n  content: \"\\f00c\";\n  text-align: center;\n}\n.css-checkbox:hover input + span {\n  border-color: #ccc;\n}\n.css-checkbox.css-checkbox-sm {\n  margin: 9px 0 8px;\n  font-size: 12px;\n}\n.css-checkbox.css-checkbox-sm input + span {\n  width: 16px;\n  height: 16px;\n}\n.css-checkbox.css-checkbox-sm input + span:after {\n  font-size: 8px;\n  line-height: 15px;\n}\n.css-checkbox.css-checkbox-lg {\n  margin: 3px 0;\n}\n.css-checkbox.css-checkbox-lg input + span {\n  width: 30px;\n  height: 30px;\n}\n.css-checkbox.css-checkbox-lg input + span:after {\n  font-size: 12px;\n  line-height: 30px;\n}\n.css-checkbox.css-checkbox-rounded input + span {\n  border-radius: 3px;\n}\n.css-checkbox-default input:checked + span {\n  background-color: #999999;\n  border-color: #999999;\n}\n.css-checkbox-primary input:checked + span {\n  background-color: #5c90d2;\n  border-color: #5c90d2;\n}\n.css-checkbox-info input:checked + span {\n  background-color: #70b9eb;\n  border-color: #70b9eb;\n}\n.css-checkbox-success input:checked + span {\n  background-color: #46c37b;\n  border-color: #46c37b;\n}\n.css-checkbox-warning input:checked + span {\n  background-color: #f3b760;\n  border-color: #f3b760;\n}\n.css-checkbox-danger input:checked + span {\n  background-color: #d26a5c;\n  border-color: #d26a5c;\n}\n.css-radio {\n  margin: 7px 0;\n}\n.css-radio input + span {\n  width: 20px;\n  height: 20px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 50%;\n}\n.css-radio input + span:after {\n  top: 2px;\n  right: 2px;\n  bottom: 2px;\n  left: 2px;\n  background-color: #fff;\n  border-radius: 50%;\n  opacity: 0;\n  -webkit-transition: opacity 0.2s ease-out;\n  transition: opacity 0.2s ease-out;\n}\n.css-radio input:checked + span:after {\n  opacity: 1;\n}\n.css-radio:hover input + span {\n  border-color: #ccc;\n}\n.css-radio.css-radio-sm {\n  margin: 9px 0 8px;\n  font-size: 12px;\n}\n.css-radio.css-radio-sm input + span {\n  width: 16px;\n  height: 16px;\n}\n.css-radio.css-radio-lg {\n  margin: 5px 0;\n}\n.css-radio.css-radio-lg input + span {\n  width: 26px;\n  height: 26px;\n}\n.css-radio-default input:checked + span:after {\n  background-color: #999999;\n}\n.css-radio-primary input:checked + span:after {\n  background-color: #5c90d2;\n}\n.css-radio-info input:checked + span:after {\n  background-color: #70b9eb;\n}\n.css-radio-success input:checked + span:after {\n  background-color: #46c37b;\n}\n.css-radio-warning input:checked + span:after {\n  background-color: #f3b760;\n}\n.css-radio-danger input:checked + span:after {\n  background-color: #d26a5c;\n}\n.switch {\n  margin: 3px 0;\n}\n.switch input + span {\n  width: 54px;\n  height: 30px;\n  background-color: #eee;\n  border-radius: 30px;\n  -webkit-transition: background-color 0.4s;\n  transition: background-color 0.4s;\n}\n.switch input + span:after {\n  top: 2px;\n  bottom: 2px;\n  left: 2px;\n  width: 26px;\n  background-color: #fff;\n  border-radius: 50%;\n  -webkit-box-shadow: 1px 0 3px rgba(0, 0, 0, 0.1);\n  box-shadow: 1px 0 3px rgba(0, 0, 0, 0.1);\n  -webkit-transition: -webkit-transform 0.15s ease-out;\n  transition: transform 0.15s ease-out;\n}\n.switch input:checked + span {\n  background-color: #ddd;\n}\n.switch input:checked + span:after {\n  -webkit-box-shadow: -2px 0 3px rgba(0, 0, 0, 0.2);\n  box-shadow: -2px 0 3px rgba(0, 0, 0, 0.2);\n  -webkit-transform: translateX(23px);\n  -ms-transform: translateX(23px);\n  transform: translateX(23px);\n}\n.switch.switch-sm {\n  margin: 8px 0 7px;\n  font-size: 12px;\n}\n.switch.switch-sm input + span {\n  width: 36px;\n  height: 20px;\n}\n.switch.switch-sm input + span:after {\n  width: 16px;\n}\n.switch.switch-sm input:checked + span:after {\n  -webkit-transform: translateX(15px);\n  -ms-transform: translateX(15px);\n  transform: translateX(15px);\n}\n.switch.switch-lg {\n  margin: 1px 0;\n}\n.switch.switch-lg input + span {\n  width: 70px;\n  height: 34px;\n}\n.switch.switch-lg input + span:after {\n  width: 30px;\n}\n.switch.switch-lg input:checked + span:after {\n  -webkit-transform: translateX(35px);\n  -ms-transform: translateX(35px);\n  transform: translateX(35px);\n}\n.switch.switch-square input + span,\n.switch.switch-square input + span:after {\n  border-radius: 0;\n}\n.switch-default input:checked + span {\n  background-color: #999999;\n}\n.switch-primary input:checked + span {\n  background-color: #5c90d2;\n}\n.switch-info input:checked + span {\n  background-color: #70b9eb;\n}\n.switch-success input:checked + span {\n  background-color: #46c37b;\n}\n.switch-warning input:checked + span {\n  background-color: #f3b760;\n}\n.switch-danger input:checked + span {\n  background-color: #d26a5c;\n}\n.block {\n  margin-bottom: 30px;\n  background-color: #fff;\n  -webkit-box-shadow: 0 2px rgba(0, 0, 0, 0.01);\n  box-shadow: 0 2px rgba(0, 0, 0, 0.01);\n}\n.side-content .block {\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.block-header {\n  padding: 15px 20px;\n  -webkit-transition: opacity 0.2s ease-out;\n  transition: opacity 0.2s ease-out;\n}\n.block-header:before,\n.block-header:after {\n  content: \" \";\n  display: table;\n}\n.block-header:after {\n  clear: both;\n}\n.block-title {\n  font-size: 15px;\n  font-weight: 600;\n  text-transform: uppercase;\n  line-height: 1.2;\n}\n.block-title.text-normal {\n  text-transform: none;\n}\n.block-title small {\n  font-size: 13px;\n  font-weight: normal;\n  text-transform: none;\n}\n.block-content {\n  margin: 0 auto;\n  padding: 20px 20px 1px;\n  max-width: 100%;\n  overflow-x: visible;\n  -webkit-transition: opacity 0.2s ease-out;\n  transition: opacity 0.2s ease-out;\n}\n.block-content p,\n.block-content .push,\n.block-content .block,\n.block-content .items-push > div {\n  margin-bottom: 20px;\n}\n.block-content .items-push-2x > div {\n  margin-bottom: 40px;\n}\n.block-content .items-push-3x > div {\n  margin-bottom: 60px;\n}\n.block-content.block-content-full {\n  padding-bottom: 20px;\n}\n.block-content.block-content-full .pull-b {\n  margin-bottom: -20px;\n}\n.block-content .pull-t {\n  margin-top: -20px;\n}\n.block-content .pull-r-l {\n  margin-right: -20px;\n  margin-left: -20px;\n}\n.block-content .pull-b {\n  margin-bottom: -1px;\n}\n.block-content.block-content-mini {\n  padding-top: 10px;\n}\n.block-content.block-content-mini.block-content-full.block-content-mini {\n  padding-bottom: 10px;\n}\n@media screen and (min-width: 1200px) {\n  .block-content.block-content-narrow {\n    padding-left: 10%;\n    padding-right: 10%;\n  }\n}\n.block.block-full .block-content {\n  padding-bottom: 20px;\n}\n.block.block-full .block-content.block-content-mini {\n  padding-bottom: 10px;\n}\n.block-table {\n  width: 100%;\n}\n.block-table td {\n  padding: 10px;\n  vertical-align: middle;\n}\n.block.block-bordered {\n  border: 1px solid #e9e9e9;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.block.block-bordered .block-header {\n  border-bottom: 1px solid #e9e9e9;\n}\n.block.block-rounded {\n  border-radius: 4px;\n}\n.block.block-rounded .block-header {\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.block.block-rounded .block-content:first-child {\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.block.block-rounded .block-content:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.block.block-themed > .block-header {\n  border-bottom: none;\n}\n.block.block-themed > .block-header .block-title {\n  color: #fff;\n}\n.block.block-themed > .block-header .block-title small {\n  color: rgba(255, 255, 255, 0.75);\n}\n.block.block-transparent {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.block.block-opt-refresh {\n  position: relative;\n}\n.block.block-opt-refresh .block-header {\n  opacity: .25;\n}\n.block.block-opt-refresh .block-content {\n  opacity: .15;\n}\n.block.block-opt-refresh:after {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  margin: -20px 0 0 -20px;\n  width: 40px;\n  height: 40px;\n  line-height: 40px;\n  color: #646464;\n  font-family: Simple-Line-Icons;\n  font-size: 18px;\n  text-align: center;\n  z-index: 2;\n  content: \"\\e09a\";\n  -webkit-animation: fa-spin 2s infinite linear;\n  animation: fa-spin 2s infinite linear;\n}\n.ie9 .block.block-opt-refresh:after {\n  content: \"Loading..\";\n}\n.block.block-opt-fullscreen {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  margin-bottom: 0;\n  overflow-y: auto;\n  -webkit-overflow-scrolling: touch;\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n}\n.block.block-opt-hidden.block-bordered .block-header {\n  border-bottom: none;\n}\n.block.block-opt-hidden .block-content {\n  display: none;\n}\na.block {\n  display: block;\n  color: #646464;\n  font-weight: normal;\n  -webkit-transition: all 0.15s ease-out;\n  transition: all 0.15s ease-out;\n}\na.block:hover {\n  color: #646464;\n  opacity: .9;\n}\na.block.block-link-hover1:hover {\n  -webkit-box-shadow: 0 2px rgba(0, 0, 0, 0.1);\n  box-shadow: 0 2px rgba(0, 0, 0, 0.1);\n  opacity: 1;\n}\na.block.block-link-hover1:active {\n  -webkit-box-shadow: 0 2px rgba(0, 0, 0, 0.01);\n  box-shadow: 0 2px rgba(0, 0, 0, 0.01);\n}\na.block.block-link-hover2:hover {\n  -webkit-transform: translateY(-2px);\n  -ms-transform: translateY(-2px);\n  transform: translateY(-2px);\n  -webkit-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.1);\n  box-shadow: 0 2px 2px rgba(0, 0, 0, 0.1);\n  opacity: 1;\n}\na.block.block-link-hover2:active {\n  -webkit-transform: translateY(-1px);\n  -ms-transform: translateY(-1px);\n  transform: translateY(-1px);\n  -webkit-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 2px 2px rgba(0, 0, 0, 0.05);\n}\na.block.block-link-hover3:hover {\n  -webkit-box-shadow: 0 0 12px rgba(0, 0, 0, 0.1);\n  box-shadow: 0 0 12px rgba(0, 0, 0, 0.1);\n  opacity: 1;\n}\na.block.block-link-hover3:active {\n  -webkit-box-shadow: 0 0 2px rgba(0, 0, 0, 0.1);\n  box-shadow: 0 0 2px rgba(0, 0, 0, 0.1);\n}\n.block > .nav-tabs {\n  background-color: #f9f9f9;\n  border-bottom: none;\n}\n.block > .nav-tabs.nav-tabs-right > li {\n  float: right;\n}\n.block > .nav-tabs.nav-justified > li > a {\n  margin-bottom: 0;\n}\n.block > .nav-tabs > li {\n  margin-bottom: 0;\n}\n.block > .nav-tabs > li > a {\n  margin-right: 0;\n  padding-top: 12px;\n  padding-bottom: 12px;\n  color: #646464;\n  font-weight: 600;\n  border: 1px solid transparent;\n  border-radius: 0;\n}\n.block > .nav-tabs > li > a:hover {\n  color: #5c90d2;\n  background-color: transparent;\n  border-color: transparent;\n}\n.block > .nav-tabs > li.active > a,\n.block > .nav-tabs > li.active > a:hover,\n.block > .nav-tabs > li.active > a:focus {\n  color: #646464;\n  background-color: #fff;\n  border-color: transparent;\n}\n.block > .nav-tabs.nav-tabs-alt {\n  background-color: transparent;\n  border-bottom: 1px solid #e9e9e9;\n}\n.block > .nav-tabs.nav-tabs-alt > li > a {\n  -webkit-transition: all 0.15s ease-out;\n  transition: all 0.15s ease-out;\n}\n.block > .nav-tabs.nav-tabs-alt > li > a:hover {\n  -webkit-box-shadow: 0 2px #5c90d2;\n  box-shadow: 0 2px #5c90d2;\n}\n.block > .nav-tabs.nav-tabs-alt > li.active > a,\n.block > .nav-tabs.nav-tabs-alt > li.active > a:hover,\n.block > .nav-tabs.nav-tabs-alt > li.active > a:focus {\n  -webkit-box-shadow: 0 2px #5c90d2;\n  box-shadow: 0 2px #5c90d2;\n}\n.block .block-content.tab-content {\n  overflow: hidden;\n}\n.block-options {\n  float: right;\n  margin: -3px 0 -3px 15px;\n  padding: 0;\n  height: 24px;\n  list-style: none;\n}\n.block-options:before,\n.block-options:after {\n  content: \" \";\n  display: table;\n}\n.block-options:after {\n  clear: both;\n}\n.block-options.block-options-left {\n  float: left;\n  margin-right: 15px;\n  margin-left: 0;\n}\n.block-options.block-options-left + .block-title {\n  float: right;\n}\n.block-options > li {\n  display: inline-block;\n  margin: 0 2px;\n  padding: 0;\n}\n.block-options > li > a,\n.block-options > li > button {\n  display: block;\n  padding: 2px 3px;\n  color: #999999;\n  opacity: .6;\n}\n.block.block-themed > .block-header .block-options > li > a,\n.block.block-themed > .block-header .block-options > li > button {\n  color: #fff;\n}\n.block-options > li > a:hover,\n.block-options > li > button:hover {\n  text-decoration: none;\n  opacity: 1;\n}\n.block-options > li > a:active,\n.block-options > li > button:active {\n  opacity: .6;\n}\n.block-options > li > span {\n  display: block;\n  padding: 2px 3px;\n}\n.block.block-themed > .block-header .block-options > li > span {\n  color: #fff;\n}\n.block-options > li > a:focus {\n  text-decoration: none;\n  opacity: 1;\n}\n.block-options > li > button {\n  background: none;\n  border: none;\n}\n.block-options > li.active > a,\n.block-options > li.open > button {\n  text-decoration: none;\n  opacity: 1;\n}\n.nav-main {\n  margin: 0 -20px;\n  padding: 0;\n  list-style: none;\n}\n.nav-main .nav-main-heading {\n  padding: 22px 35px 6px 20px;\n  font-size: 12px;\n  font-weight: 600;\n  text-transform: uppercase;\n  color: rgba(255, 255, 255, 0.3);\n}\n.nav-main a {\n  display: block;\n  padding: 10px 35px 10px 20px;\n  color: rgba(255, 255, 255, 0.5);\n}\n.nav-main a:hover,\n.nav-main a:focus {\n  color: rgba(255, 255, 255, 0.5);\n  background-color: rgba(0, 0, 0, 0.2);\n}\n.nav-main a:hover > i,\n.nav-main a:focus > i {\n  color: #fff;\n}\n.nav-main a.active,\n.nav-main a.active:hover {\n  color: #fff;\n}\n.nav-main a.active > i,\n.nav-main a.active:hover > i {\n  color: #fff;\n}\n.nav-main a > i {\n  margin-right: 15px;\n  color: rgba(255, 255, 255, 0.2);\n}\n.nav-main a.nav-submenu {\n  position: relative;\n  padding-right: 30px;\n}\n.nav-main a.nav-submenu:before {\n  position: absolute;\n  top: 50%;\n  -webkit-transform: translateY(-50%);\n  -ms-transform: translateY(-50%);\n  transform: translateY(-50%);\n  right: 15px;\n  display: inline-block;\n  font-family: 'FontAwesome';\n  color: rgba(255, 255, 255, 0.25);\n  content: \"\\f104\";\n}\n.nav-main a.nav-submenu:before.nav-main a.nav-submenu:before-fwidth {\n  width: 100%;\n}\n.nav-main ul {\n  margin: 0;\n  padding: 0 0 0 50px;\n  height: 0;\n  list-style: none;\n  background-color: rgba(0, 0, 0, 0.15);\n  overflow: hidden;\n}\n.nav-main ul > li {\n  opacity: 0;\n  -webkit-transition: all 0.25s ease-out;\n  transition: all 0.25s ease-out;\n  -webkit-transform: translateX(-15px);\n  -ms-transform: translateX(-15px);\n  transform: translateX(-15px);\n}\n.nav-main ul .nav-main-heading {\n  padding-left: 0;\n  padding-right: 0;\n  color: rgba(255, 255, 255, 0.65);\n}\n.nav-main ul a {\n  padding: 8px 0;\n  font-size: 13px;\n  color: rgba(255, 255, 255, 0.4);\n}\n.nav-main ul a:hover,\n.nav-main ul a:focus {\n  color: #fff;\n  background-color: transparent;\n}\n.nav-main ul a > i {\n  margin-right: 10px;\n}\n.nav-main ul ul {\n  padding-left: 12px;\n}\n.nav-main li.open > a.nav-submenu {\n  color: #fff;\n}\n.nav-main li.open > a.nav-submenu > i {\n  color: #fff;\n}\n.nav-main li.open > a.nav-submenu:before {\n  content: \"\\f107\";\n}\n.nav-main li.open > ul {\n  height: auto;\n}\n.nav-main li.open > ul > li {\n  opacity: 1;\n  -webkit-transform: translateX(0);\n  -ms-transform: translateX(0);\n  transform: translateX(0);\n}\n.nav-header {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.nav-header:before,\n.nav-header:after {\n  content: \" \";\n  display: table;\n}\n.nav-header:after {\n  clear: both;\n}\n.nav-header > li {\n  margin-right: 12px;\n  float: left;\n}\n.nav-header > li > a,\n.nav-header > li > .btn-group > a {\n  padding: 0 12px;\n  display: block;\n  line-height: 34px;\n  font-weight: 600;\n}\n.nav-header.pull-right > li {\n  margin-right: 0;\n  margin-left: 12px;\n  float: left;\n}\n.nav-header .header-content {\n  line-height: 34px;\n}\n.nav-header .header-search {\n  width: 360px;\n}\n@media screen and (max-width: 767px) {\n  .nav-header .header-search {\n    display: none;\n  }\n  .nav-header .header-search.header-search-xs-visible {\n    position: absolute;\n    top: 60px;\n    right: 0;\n    left: 0;\n    z-index: 999;\n    display: block;\n    width: 100%;\n    border-top: 1px solid #f9f9f9;\n  }\n  .nav-header .header-search.header-search-xs-visible > form {\n    padding: 14px 14px;\n    background-color: #fff;\n    -webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.02);\n    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.02);\n  }\n}\n.nav-users {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.nav-users > li:last-child > a {\n  border-bottom: none;\n}\n.nav-users a {\n  position: relative;\n  padding: 12px 8px 8px 71px;\n  display: block;\n  min-height: 62px;\n  font-weight: 600;\n  border-bottom: 1px solid #f3f3f3;\n}\n.nav-users a > img {\n  position: absolute;\n  left: 12px;\n  top: 10px;\n  width: 42px;\n  height: 42px;\n  border-radius: 50%;\n}\n.nav-users a > i {\n  position: absolute;\n  left: 40px;\n  top: 40px;\n  display: inline-block;\n  width: 18px;\n  height: 18px;\n  line-height: 18px;\n  text-align: center;\n  background-color: #fff;\n  border-radius: 50%;\n}\n.nav-users a:hover {\n  background-color: #f9f9f9;\n}\n.list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.list > li {\n  position: relative;\n}\n.list-timeline {\n  position: relative;\n  padding-top: 10px;\n}\n.list-timeline > li {\n  margin-bottom: 10px;\n}\n.list-timeline .list-timeline-time {\n  margin: 0 -20px;\n  padding: 10px 20px 10px 40px;\n  min-height: 40px;\n  text-align: right;\n  color: #999;\n  font-size: 13px;\n  font-style: italic;\n  background-color: #f9f9f9;\n  border-radius: 2px;\n}\n.list-timeline .list-timeline-icon {\n  position: absolute;\n  top: 5px;\n  left: 10px;\n  width: 30px;\n  height: 30px;\n  line-height: 30px;\n  color: #fff;\n  text-align: center;\n  border-radius: 50%;\n}\n.list-timeline .list-timeline-content {\n  padding: 10px 10px 1px;\n}\n.list-timeline .list-timeline-content > p:first-child {\n  margin-bottom: 0;\n}\n@media screen and (min-width: 768px) {\n  .list-timeline {\n    padding-top: 20px;\n  }\n  .list-timeline:before {\n    position: absolute;\n    top: 0;\n    left: 120px;\n    bottom: 0;\n    display: block;\n    width: 4px;\n    content: \"\";\n    background-color: #f9f9f9;\n    z-index: 1;\n  }\n  .list-timeline > li {\n    min-height: 40px;\n    z-index: 2;\n  }\n  .list-timeline > li:last-child {\n    margin-bottom: 0;\n  }\n  .list-timeline .list-timeline-time {\n    position: absolute;\n    top: 0;\n    left: 0;\n    margin: 0;\n    padding-right: 0;\n    padding-left: 0;\n    width: 90px;\n    background-color: transparent;\n  }\n  .list-timeline .list-timeline-icon {\n    top: 3px;\n    left: 105px;\n    width: 34px;\n    height: 34px;\n    line-height: 34px;\n    z-index: 2 !important;\n  }\n  .list-timeline .list-timeline-content {\n    padding-left: 160px;\n  }\n}\n.list-activity > li {\n  margin-bottom: 5px;\n  padding-bottom: 5px;\n  padding-left: 30px;\n  font-size: 13px;\n  border-bottom: 1px solid #f3f3f3;\n}\n.list-activity > li > i:first-child {\n  position: absolute;\n  left: 0;\n  top: 0;\n  display: inline-block;\n  width: 20px;\n  height: 20px;\n  line-height: 20px;\n  font-size: 14px;\n  text-align: center;\n}\n.list-events > li {\n  margin-bottom: 5px;\n  padding: 8px 30px 8px 10px;\n  color: rgba(0, 0, 0, 0.5);\n  font-size: 13px;\n  font-weight: 700;\n  background-color: #b5d0eb;\n}\n.list-events > li:before {\n  position: absolute;\n  top: 50%;\n  -webkit-transform: translateY(-50%);\n  -ms-transform: translateY(-50%);\n  transform: translateY(-50%);\n  right: 10px;\n  display: inline-block;\n  font-family: 'FontAwesome';\n  color: rgba(255, 255, 255, 0.75);\n  content: \"\\f073\";\n}\n.list-events > li:before.list-events > li:before-fwidth {\n  width: 100%;\n}\n.list-events > li:hover {\n  cursor: move;\n}\n.list-simple > li {\n  margin-bottom: 20px;\n}\n.list-simple-mini > li {\n  margin-bottom: 10px;\n}\n.list-li-clearfix > li:before,\n.list-li-clearfix > li:after {\n  content: \" \";\n  display: table;\n}\n.list-li-clearfix > li:after {\n  clear: both;\n}\n.img-avatar {\n  display: inline-block !important;\n  width: 64px;\n  height: 64px;\n  border-radius: 50%;\n}\n.img-avatar.img-avatar32 {\n  width: 32px;\n  height: 32px;\n}\n.img-avatar.img-avatar48 {\n  width: 48px;\n  height: 48px;\n}\n.img-avatar.img-avatar96 {\n  width: 96px;\n  height: 96px;\n}\n.img-avatar.img-avatar128 {\n  width: 128px;\n  height: 128px;\n}\n.img-avatar-thumb {\n  margin: 5px;\n  -webkit-box-shadow: 0 0 0 5px rgba(255, 255, 255, 0.4);\n  box-shadow: 0 0 0 5px rgba(255, 255, 255, 0.4);\n}\n.img-thumb {\n  padding: 5px;\n  background-color: #fff;\n  border-radius: 2px;\n}\n.img-link {\n  display: inline-block;\n  cursor: -webkit-zoom-in;\n  cursor: zoom-in;\n  -webkit-transition: -webkit-transform 0.15s ease-out;\n  transition: transform 0.15s ease-out;\n}\n.img-link:hover {\n  -webkit-transform: rotate(1deg);\n  -ms-transform: rotate(1deg);\n  transform: rotate(1deg);\n}\n.img-container {\n  position: relative;\n  overflow: hidden;\n  z-index: 0;\n  display: block;\n}\n.img-container .img-options {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1;\n  content: \"\";\n  background-color: rgba(0, 0, 0, 0.6);\n  opacity: 0;\n  visibility: none;\n  -webkit-transition: all 0.25s ease-out;\n  transition: all 0.25s ease-out;\n}\n.img-container .img-options-content {\n  position: absolute;\n  top: 50%;\n  -webkit-transform: translateY(-50%);\n  -ms-transform: translateY(-50%);\n  transform: translateY(-50%);\n  right: 0;\n  left: 0;\n  text-align: center;\n}\n.img-container > img {\n  -webkit-transition: -webkit-transform 0.35s ease-out;\n  transition: transform 0.35s ease-out;\n}\n.img-container:hover .img-options {\n  opacity: 1;\n  visibility: visible;\n}\n.img-container.fx-img-zoom-in:hover > img {\n  -webkit-transform: scale(1.2);\n  -ms-transform: scale(1.2);\n  transform: scale(1.2);\n}\n.img-container.fx-img-rotate-r:hover > img {\n  -webkit-transform: scale(1.4) rotate(8deg);\n  -ms-transform: scale(1.4) rotate(8deg);\n  transform: scale(1.4) rotate(8deg);\n}\n.img-container.fx-img-rotate-l:hover > img {\n  -webkit-transform: scale(1.4) rotate(-8deg);\n  -ms-transform: scale(1.4) rotate(-8deg);\n  transform: scale(1.4) rotate(-8deg);\n}\n.img-container.fx-opt-slide-top .img-options {\n  -webkit-transform: translateY(100%);\n  -ms-transform: translateY(100%);\n  transform: translateY(100%);\n}\n.img-container.fx-opt-slide-top:hover .img-options {\n  -webkit-transform: translateY(0);\n  -ms-transform: translateY(0);\n  transform: translateY(0);\n}\n.img-container.fx-opt-slide-right .img-options {\n  -webkit-transform: translateX(-100%);\n  -ms-transform: translateX(-100%);\n  transform: translateX(-100%);\n}\n.img-container.fx-opt-slide-right:hover .img-options {\n  -webkit-transform: translateX(0);\n  -ms-transform: translateX(0);\n  transform: translateX(0);\n}\n.img-container.fx-opt-slide-down .img-options {\n  -webkit-transform: translateY(-100%);\n  -ms-transform: translateY(-100%);\n  transform: translateY(-100%);\n}\n.img-container.fx-opt-slide-down:hover .img-options {\n  -webkit-transform: translateY(0);\n  -ms-transform: translateY(0);\n  transform: translateY(0);\n}\n.img-container.fx-opt-slide-left .img-options {\n  -webkit-transform: translateX(100%);\n  -ms-transform: translateX(100%);\n  transform: translateX(100%);\n}\n.img-container.fx-opt-slide-left:hover .img-options {\n  -webkit-transform: translateX(0);\n  -ms-transform: translateX(0);\n  transform: translateX(0);\n}\n.img-container.fx-opt-zoom-in .img-options {\n  -webkit-transform: scale(0);\n  -ms-transform: scale(0);\n  transform: scale(0);\n}\n.img-container.fx-opt-zoom-in:hover .img-options {\n  -webkit-transform: scale(1);\n  -ms-transform: scale(1);\n  transform: scale(1);\n}\n.img-container.fx-opt-zoom-out .img-options {\n  -webkit-transform: scale(2);\n  -ms-transform: scale(2);\n  transform: scale(2);\n}\n.img-container.fx-opt-zoom-out:hover .img-options {\n  -webkit-transform: scale(1);\n  -ms-transform: scale(1);\n  transform: scale(1);\n}\n.push-5 {\n  margin-bottom: 5px !important;\n}\n.push-5-t {\n  margin-top: 5px !important;\n}\n.push-5-r {\n  margin-right: 5px !important;\n}\n.push-5-l {\n  margin-left: 5px !important;\n}\n.push-10 {\n  margin-bottom: 10px !important;\n}\n.push-10-t {\n  margin-top: 10px !important;\n}\n.push-10-r {\n  margin-right: 10px !important;\n}\n.push-10-l {\n  margin-left: 10px !important;\n}\n.push-15 {\n  margin-bottom: 15px !important;\n}\n.push-15-t {\n  margin-top: 15px !important;\n}\n.push-15-r {\n  margin-right: 15px !important;\n}\n.push-15-l {\n  margin-left: 15px !important;\n}\n.push-20 {\n  margin-bottom: 20px !important;\n}\n.push-20-t {\n  margin-top: 20px !important;\n}\n.push-20-r {\n  margin-right: 20px !important;\n}\n.push-20-l {\n  margin-left: 20px !important;\n}\n.push-30 {\n  margin-bottom: 30px !important;\n}\n.push-30-t {\n  margin-top: 30px !important;\n}\n.push-30-r {\n  margin-right: 30px !important;\n}\n.push-30-l {\n  margin-left: 30px !important;\n}\n.push-50 {\n  margin-bottom: 50px !important;\n}\n.push-50-t {\n  margin-top: 50px !important;\n}\n.push-50-r {\n  margin-right: 50px !important;\n}\n.push-50-l {\n  margin-left: 50px !important;\n}\n.push-100 {\n  margin-bottom: 100px !important;\n}\n.push-100-t {\n  margin-top: 100px !important;\n}\n.push-100-r {\n  margin-right: 100px !important;\n}\n.push-100-l {\n  margin-left: 100px !important;\n}\n.push-150 {\n  margin-bottom: 150px !important;\n}\n.push-150-t {\n  margin-top: 150px !important;\n}\n.push-150-r {\n  margin-right: 150px !important;\n}\n.push-150-l {\n  margin-left: 150px !important;\n}\n.pulldown {\n  position: relative;\n  top: 50px;\n}\n@media screen and (min-width: 992px) {\n  .pulldown {\n    top: 150px;\n  }\n}\n.remove-margin {\n  margin: 0 !important;\n}\n.remove-margin-t {\n  margin-top: 0 !important;\n}\n.remove-margin-r {\n  margin-right: 0 !important;\n}\n.remove-margin-b {\n  margin-bottom: 0 !important;\n}\n.remove-margin-l {\n  margin-left: 0 !important;\n}\n.remove-padding {\n  padding: 0 !important;\n}\n.remove-padding-t {\n  padding-top: 0 !important;\n}\n.remove-padding-r {\n  padding-right: 0 !important;\n}\n.remove-padding-b {\n  padding-bottom: 0 !important;\n}\n.remove-padding-l {\n  padding-left: 0 !important;\n}\n.align-v {\n  position: absolute;\n  top: 50%;\n  -webkit-transform: translateY(-50%);\n  -ms-transform: translateY(-50%);\n  transform: translateY(-50%);\n}\n.align-v.align-v-fwidth {\n  width: 100%;\n}\n.border {\n  border: 1px solid #e9e9e9;\n}\n.border-t {\n  border-top: 1px solid #e9e9e9;\n}\n.border-r {\n  border-right: 1px solid #e9e9e9;\n}\n.border-b {\n  border-bottom: 1px solid #e9e9e9;\n}\n.border-l {\n  border-left: 1px solid #e9e9e9;\n}\n.border-white-op {\n  border: 1px solid rgba(255, 255, 255, 0.1);\n}\n.border-white-op-t {\n  border-top: 1px solid rgba(255, 255, 255, 0.1);\n}\n.border-white-op-r {\n  border-right: 1px solid rgba(255, 255, 255, 0.1);\n}\n.border-white-op-b {\n  border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n}\n.border-white-op-l {\n  border-left: 1px solid rgba(255, 255, 255, 0.1);\n}\n.border-black-op {\n  border: 1px solid rgba(0, 0, 0, 0.1);\n}\n.border-black-op-t {\n  border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n.border-black-op-r {\n  border-right: 1px solid rgba(0, 0, 0, 0.1);\n}\n.border-black-op-b {\n  border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n}\n.border-black-op-l {\n  border-left: 1px solid rgba(0, 0, 0, 0.1);\n}\n.item {\n  display: inline-block;\n  width: 60px;\n  height: 60px;\n  text-align: center;\n  font-size: 28px;\n  font-weight: 300;\n  line-height: 60px;\n}\n.item .si:before {\n  position: relative;\n  top: 1px;\n}\na.item:hover,\na.item:focus {\n  opacity: .6;\n}\n.item.item-circle {\n  border-radius: 50%;\n}\n.item.item-rounded {\n  border-radius: 3px;\n}\n.item.item-rounded-big {\n  border-radius: 24px;\n}\n.item.item-rounded-big.item-2x {\n  border-radius: 35px;\n}\n.item.item-2x {\n  width: 100px;\n  height: 100px;\n  line-height: 100px;\n}\n.item.item-2x .si:before {\n  position: relative;\n  top: 3px;\n}\n.overflow-hidden {\n  overflow: hidden;\n}\n.visibility-hidden {\n  visibility: hidden;\n}\n.text-default {\n  color: #5c90d2;\n}\na.text-default:hover,\na.text-default:active,\na.text-default:focus,\nbutton.text-default:hover,\nbutton.text-default:active,\nbutton.text-default:focus {\n  color: #5c90d2;\n  opacity: .75;\n}\n.text-default-dark {\n  color: #3e4a59;\n}\na.text-default-dark:hover,\na.text-default-dark:active,\na.text-default-dark:focus,\nbutton.text-default-dark:hover,\nbutton.text-default-dark:active,\nbutton.text-default-dark:focus {\n  color: #3e4a59;\n  opacity: .75;\n}\n.text-default-darker {\n  color: #2c343f;\n}\na.text-default-darker:hover,\na.text-default-darker:active,\na.text-default-darker:focus,\nbutton.text-default-darker:hover,\nbutton.text-default-darker:active,\nbutton.text-default-darker:focus {\n  color: #2c343f;\n  opacity: .75;\n}\n.text-default-light {\n  color: #98b9e3;\n}\na.text-default-light:hover,\na.text-default-light:active,\na.text-default-light:focus,\nbutton.text-default-light:hover,\nbutton.text-default-light:active,\nbutton.text-default-light:focus {\n  color: #98b9e3;\n  opacity: .75;\n}\n.text-default-lighter {\n  color: #ccdcf1;\n}\na.text-default-lighter:hover,\na.text-default-lighter:active,\na.text-default-lighter:focus,\nbutton.text-default-lighter:hover,\nbutton.text-default-lighter:active,\nbutton.text-default-lighter:focus {\n  color: #ccdcf1;\n  opacity: .75;\n}\n.bg-default {\n  background-color: #5c90d2;\n}\na.bg-default:hover {\n  background-color: #3675c5;\n}\n.bg-default-op {\n  background-color: rgba(92, 144, 210, 0.75);\n}\na.bg-default-op:hover {\n  background-color: rgba(54, 117, 197, 0.75);\n}\n.bg-default-dark {\n  background-color: #3e4a59;\n}\na.bg-default-dark:hover {\n  background-color: #29313b;\n}\n.bg-default-dark-op {\n  background-color: rgba(62, 74, 89, 0.83);\n}\na.bg-default-dark-op:hover {\n  background-color: rgba(41, 49, 59, 0.83);\n}\n.bg-default-darker {\n  background-color: #2c343f;\n}\na.bg-default-darker:hover {\n  background-color: #171b21;\n}\n.bg-default-light {\n  background-color: #98b9e3;\n}\na.bg-default-light:hover {\n  background-color: #709ed8;\n}\n.bg-default-lighter {\n  background-color: #ccdcf1;\n}\na.bg-default-lighter:hover {\n  background-color: #a4c1e6;\n}\n.text-amethyst {\n  color: #a48ad4;\n}\na.text-amethyst:hover,\na.text-amethyst:active,\na.text-amethyst:focus,\nbutton.text-amethyst:hover,\nbutton.text-amethyst:active,\nbutton.text-amethyst:focus {\n  color: #a48ad4;\n  opacity: .75;\n}\n.text-amethyst-dark {\n  color: #4f546b;\n}\na.text-amethyst-dark:hover,\na.text-amethyst-dark:active,\na.text-amethyst-dark:focus,\nbutton.text-amethyst-dark:hover,\nbutton.text-amethyst-dark:active,\nbutton.text-amethyst-dark:focus {\n  color: #4f546b;\n  opacity: .75;\n}\n.text-amethyst-darker {\n  color: #353847;\n}\na.text-amethyst-darker:hover,\na.text-amethyst-darker:active,\na.text-amethyst-darker:focus,\nbutton.text-amethyst-darker:hover,\nbutton.text-amethyst-darker:active,\nbutton.text-amethyst-darker:focus {\n  color: #353847;\n  opacity: .75;\n}\n.text-amethyst-light {\n  color: #c7b7e4;\n}\na.text-amethyst-light:hover,\na.text-amethyst-light:active,\na.text-amethyst-light:focus,\nbutton.text-amethyst-light:hover,\nbutton.text-amethyst-light:active,\nbutton.text-amethyst-light:focus {\n  color: #c7b7e4;\n  opacity: .75;\n}\n.text-amethyst-lighter {\n  color: #e4dcf2;\n}\na.text-amethyst-lighter:hover,\na.text-amethyst-lighter:active,\na.text-amethyst-lighter:focus,\nbutton.text-amethyst-lighter:hover,\nbutton.text-amethyst-lighter:active,\nbutton.text-amethyst-lighter:focus {\n  color: #e4dcf2;\n  opacity: .75;\n}\n.bg-amethyst {\n  background-color: #a48ad4;\n}\na.bg-amethyst:hover {\n  background-color: #8765c6;\n}\n.bg-amethyst-op {\n  background-color: rgba(164, 138, 212, 0.75);\n}\na.bg-amethyst-op:hover {\n  background-color: rgba(135, 101, 198, 0.75);\n}\n.bg-amethyst-dark {\n  background-color: #4f546b;\n}\na.bg-amethyst-dark:hover {\n  background-color: #393d4e;\n}\n.bg-amethyst-dark-op {\n  background-color: rgba(79, 84, 107, 0.83);\n}\na.bg-amethyst-dark-op:hover {\n  background-color: rgba(57, 61, 78, 0.83);\n}\n.bg-amethyst-darker {\n  background-color: #353847;\n}\na.bg-amethyst-darker:hover {\n  background-color: #1f212a;\n}\n.bg-amethyst-light {\n  background-color: #c7b7e4;\n}\na.bg-amethyst-light:hover {\n  background-color: #aa91d7;\n}\n.bg-amethyst-lighter {\n  background-color: #e4dcf2;\n}\na.bg-amethyst-lighter:hover {\n  background-color: #c7b7e4;\n}\n.text-city {\n  color: #ff6b6b;\n}\na.text-city:hover,\na.text-city:active,\na.text-city:focus,\nbutton.text-city:hover,\nbutton.text-city:active,\nbutton.text-city:focus {\n  color: #ff6b6b;\n  opacity: .75;\n}\n.text-city-dark {\n  color: #555555;\n}\na.text-city-dark:hover,\na.text-city-dark:active,\na.text-city-dark:focus,\nbutton.text-city-dark:hover,\nbutton.text-city-dark:active,\nbutton.text-city-dark:focus {\n  color: #555555;\n  opacity: .75;\n}\n.text-city-darker {\n  color: #333333;\n}\na.text-city-darker:hover,\na.text-city-darker:active,\na.text-city-darker:focus,\nbutton.text-city-darker:hover,\nbutton.text-city-darker:active,\nbutton.text-city-darker:focus {\n  color: #333333;\n  opacity: .75;\n}\n.text-city-light {\n  color: #ff8f8f;\n}\na.text-city-light:hover,\na.text-city-light:active,\na.text-city-light:focus,\nbutton.text-city-light:hover,\nbutton.text-city-light:active,\nbutton.text-city-light:focus {\n  color: #ff8f8f;\n  opacity: .75;\n}\n.text-city-lighter {\n  color: #ffb8b8;\n}\na.text-city-lighter:hover,\na.text-city-lighter:active,\na.text-city-lighter:focus,\nbutton.text-city-lighter:hover,\nbutton.text-city-lighter:active,\nbutton.text-city-lighter:focus {\n  color: #ffb8b8;\n  opacity: .75;\n}\n.bg-city {\n  background-color: #ff6b6b;\n}\na.bg-city:hover {\n  background-color: #ff3838;\n}\n.bg-city-op {\n  background-color: rgba(255, 107, 107, 0.75);\n}\na.bg-city-op:hover {\n  background-color: rgba(255, 56, 56, 0.75);\n}\n.bg-city-dark {\n  background-color: #555555;\n}\na.bg-city-dark:hover {\n  background-color: #3b3b3b;\n}\n.bg-city-dark-op {\n  background-color: rgba(85, 85, 85, 0.83);\n}\na.bg-city-dark-op:hover {\n  background-color: rgba(59, 59, 59, 0.83);\n}\n.bg-city-darker {\n  background-color: #333333;\n}\na.bg-city-darker:hover {\n  background-color: #1a1a1a;\n}\n.bg-city-light {\n  background-color: #ff8f8f;\n}\na.bg-city-light:hover {\n  background-color: #ff5c5c;\n}\n.bg-city-lighter {\n  background-color: #ffb8b8;\n}\na.bg-city-lighter:hover {\n  background-color: #ff8585;\n}\n.text-flat {\n  color: #44b4a6;\n}\na.text-flat:hover,\na.text-flat:active,\na.text-flat:focus,\nbutton.text-flat:hover,\nbutton.text-flat:active,\nbutton.text-flat:focus {\n  color: #44b4a6;\n  opacity: .75;\n}\n.text-flat-dark {\n  color: #3f5259;\n}\na.text-flat-dark:hover,\na.text-flat-dark:active,\na.text-flat-dark:focus,\nbutton.text-flat-dark:hover,\nbutton.text-flat-dark:active,\nbutton.text-flat-dark:focus {\n  color: #3f5259;\n  opacity: .75;\n}\n.text-flat-darker {\n  color: #242f33;\n}\na.text-flat-darker:hover,\na.text-flat-darker:active,\na.text-flat-darker:focus,\nbutton.text-flat-darker:hover,\nbutton.text-flat-darker:active,\nbutton.text-flat-darker:focus {\n  color: #242f33;\n  opacity: .75;\n}\n.text-flat-light {\n  color: #83d0c7;\n}\na.text-flat-light:hover,\na.text-flat-light:active,\na.text-flat-light:focus,\nbutton.text-flat-light:hover,\nbutton.text-flat-light:active,\nbutton.text-flat-light:focus {\n  color: #83d0c7;\n  opacity: .75;\n}\n.text-flat-lighter {\n  color: #a8ded8;\n}\na.text-flat-lighter:hover,\na.text-flat-lighter:active,\na.text-flat-lighter:focus,\nbutton.text-flat-lighter:hover,\nbutton.text-flat-lighter:active,\nbutton.text-flat-lighter:focus {\n  color: #a8ded8;\n  opacity: .75;\n}\n.bg-flat {\n  background-color: #44b4a6;\n}\na.bg-flat:hover {\n  background-color: #368f84;\n}\n.bg-flat-op {\n  background-color: rgba(68, 180, 166, 0.75);\n}\na.bg-flat-op:hover {\n  background-color: rgba(54, 143, 132, 0.75);\n}\n.bg-flat-dark {\n  background-color: #3f5259;\n}\na.bg-flat-dark:hover {\n  background-color: #2a363b;\n}\n.bg-flat-dark-op {\n  background-color: rgba(63, 82, 89, 0.83);\n}\na.bg-flat-dark-op:hover {\n  background-color: rgba(42, 54, 59, 0.83);\n}\n.bg-flat-darker {\n  background-color: #242f33;\n}\na.bg-flat-darker:hover {\n  background-color: #0f1315;\n}\n.bg-flat-light {\n  background-color: #83d0c7;\n}\na.bg-flat-light:hover {\n  background-color: #5ec2b6;\n}\n.bg-flat-lighter {\n  background-color: #a8ded8;\n}\na.bg-flat-lighter:hover {\n  background-color: #83d0c7;\n}\n.text-modern {\n  color: #14adc4;\n}\na.text-modern:hover,\na.text-modern:active,\na.text-modern:focus,\nbutton.text-modern:hover,\nbutton.text-modern:active,\nbutton.text-modern:focus {\n  color: #14adc4;\n  opacity: .75;\n}\n.text-modern-dark {\n  color: #3e4d52;\n}\na.text-modern-dark:hover,\na.text-modern-dark:active,\na.text-modern-dark:focus,\nbutton.text-modern-dark:hover,\nbutton.text-modern-dark:active,\nbutton.text-modern-dark:focus {\n  color: #3e4d52;\n  opacity: .75;\n}\n.text-modern-darker {\n  color: #323e42;\n}\na.text-modern-darker:hover,\na.text-modern-darker:active,\na.text-modern-darker:focus,\nbutton.text-modern-darker:hover,\nbutton.text-modern-darker:active,\nbutton.text-modern-darker:focus {\n  color: #323e42;\n  opacity: .75;\n}\n.text-modern-light {\n  color: #7fe3f2;\n}\na.text-modern-light:hover,\na.text-modern-light:active,\na.text-modern-light:focus,\nbutton.text-modern-light:hover,\nbutton.text-modern-light:active,\nbutton.text-modern-light:focus {\n  color: #7fe3f2;\n  opacity: .75;\n}\n.text-modern-lighter {\n  color: #c4f2f9;\n}\na.text-modern-lighter:hover,\na.text-modern-lighter:active,\na.text-modern-lighter:focus,\nbutton.text-modern-lighter:hover,\nbutton.text-modern-lighter:active,\nbutton.text-modern-lighter:focus {\n  color: #c4f2f9;\n  opacity: .75;\n}\n.bg-modern {\n  background-color: #14adc4;\n}\na.bg-modern:hover {\n  background-color: #0f8496;\n}\n.bg-modern-op {\n  background-color: rgba(20, 173, 196, 0.75);\n}\na.bg-modern-op:hover {\n  background-color: rgba(15, 132, 150, 0.75);\n}\n.bg-modern-dark {\n  background-color: #3e4d52;\n}\na.bg-modern-dark:hover {\n  background-color: #283235;\n}\n.bg-modern-dark-op {\n  background-color: rgba(62, 77, 82, 0.83);\n}\na.bg-modern-dark-op:hover {\n  background-color: rgba(40, 50, 53, 0.83);\n}\n.bg-modern-darker {\n  background-color: #323e42;\n}\na.bg-modern-darker:hover {\n  background-color: #1c2325;\n}\n.bg-modern-light {\n  background-color: #7fe3f2;\n}\na.bg-modern-light:hover {\n  background-color: #51d9ed;\n}\n.bg-modern-lighter {\n  background-color: #c4f2f9;\n}\na.bg-modern-lighter:hover {\n  background-color: #96e8f4;\n}\n.text-smooth {\n  color: #ff6c9d;\n}\na.text-smooth:hover,\na.text-smooth:active,\na.text-smooth:focus,\nbutton.text-smooth:hover,\nbutton.text-smooth:active,\nbutton.text-smooth:focus {\n  color: #ff6c9d;\n  opacity: .75;\n}\n.text-smooth-dark {\n  color: #4a5568;\n}\na.text-smooth-dark:hover,\na.text-smooth-dark:active,\na.text-smooth-dark:focus,\nbutton.text-smooth-dark:hover,\nbutton.text-smooth-dark:active,\nbutton.text-smooth-dark:focus {\n  color: #4a5568;\n  opacity: .75;\n}\n.text-smooth-darker {\n  color: #333a47;\n}\na.text-smooth-darker:hover,\na.text-smooth-darker:active,\na.text-smooth-darker:focus,\nbutton.text-smooth-darker:hover,\nbutton.text-smooth-darker:active,\nbutton.text-smooth-darker:focus {\n  color: #333a47;\n  opacity: .75;\n}\n.text-smooth-light {\n  color: #ff90b5;\n}\na.text-smooth-light:hover,\na.text-smooth-light:active,\na.text-smooth-light:focus,\nbutton.text-smooth-light:hover,\nbutton.text-smooth-light:active,\nbutton.text-smooth-light:focus {\n  color: #ff90b5;\n  opacity: .75;\n}\n.text-smooth-lighter {\n  color: #ffb9d0;\n}\na.text-smooth-lighter:hover,\na.text-smooth-lighter:active,\na.text-smooth-lighter:focus,\nbutton.text-smooth-lighter:hover,\nbutton.text-smooth-lighter:active,\nbutton.text-smooth-lighter:focus {\n  color: #ffb9d0;\n  opacity: .75;\n}\n.bg-smooth {\n  background-color: #ff6c9d;\n}\na.bg-smooth:hover {\n  background-color: #ff397b;\n}\n.bg-smooth-op {\n  background-color: rgba(255, 108, 157, 0.75);\n}\na.bg-smooth-op:hover {\n  background-color: rgba(255, 57, 123, 0.75);\n}\n.bg-smooth-dark {\n  background-color: #4a5568;\n}\na.bg-smooth-dark:hover {\n  background-color: #353d4a;\n}\n.bg-smooth-dark-op {\n  background-color: rgba(74, 85, 104, 0.83);\n}\na.bg-smooth-dark-op:hover {\n  background-color: rgba(53, 61, 74, 0.83);\n}\n.bg-smooth-darker {\n  background-color: #333a47;\n}\na.bg-smooth-darker:hover {\n  background-color: #1e2229;\n}\n.bg-smooth-light {\n  background-color: #ff90b5;\n}\na.bg-smooth-light:hover {\n  background-color: #ff5d93;\n}\n.bg-smooth-lighter {\n  background-color: #ffb9d0;\n}\na.bg-smooth-lighter:hover {\n  background-color: #ff86ae;\n}\n@media print {\n  #page-container,\n  #main-container {\n    padding: 0 !important;\n  }\n  #header-navbar,\n  #sidebar,\n  #side-overlay,\n  .block-options {\n    display: none !important;\n  }\n}\n.animated {\n  -webkit-animation-duration: 1s;\n  animation-duration: 1s;\n  -webkit-animation-fill-mode: both;\n  animation-fill-mode: both;\n}\n.animated.infinite {\n  -webkit-animation-iteration-count: infinite;\n  animation-iteration-count: infinite;\n}\n.animated.hinge {\n  -webkit-animation-duration: 2s;\n  animation-duration: 2s;\n}\n.animated.bounceIn,\n.animated.bounceOut {\n  -webkit-animation-duration: .75s;\n  animation-duration: .75s;\n}\n.animated.flipOutX,\n.animated.flipOutY {\n  -webkit-animation-duration: .75s;\n  animation-duration: .75s;\n}\n@-webkit-keyframes bounce {\n  0%,\n  20%,\n  53%,\n  80%,\n  100% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n  40%,\n  43% {\n    -webkit-transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    -webkit-transform: translate3d(0, -30px, 0);\n    transform: translate3d(0, -30px, 0);\n  }\n  70% {\n    -webkit-transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    -webkit-transform: translate3d(0, -15px, 0);\n    transform: translate3d(0, -15px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, -4px, 0);\n    transform: translate3d(0, -4px, 0);\n  }\n}\n@keyframes bounce {\n  0%,\n  20%,\n  53%,\n  80%,\n  100% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n  40%,\n  43% {\n    -webkit-transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    -webkit-transform: translate3d(0, -30px, 0);\n    transform: translate3d(0, -30px, 0);\n  }\n  70% {\n    -webkit-transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    -webkit-transform: translate3d(0, -15px, 0);\n    transform: translate3d(0, -15px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, -4px, 0);\n    transform: translate3d(0, -4px, 0);\n  }\n}\n.bounce {\n  -webkit-animation-name: bounce;\n  animation-name: bounce;\n  -webkit-transform-origin: center bottom;\n  transform-origin: center bottom;\n}\n@-webkit-keyframes flash {\n  0%,\n  50%,\n  100% {\n    opacity: 1;\n  }\n  25%,\n  75% {\n    opacity: 0;\n  }\n}\n@keyframes flash {\n  0%,\n  50%,\n  100% {\n    opacity: 1;\n  }\n  25%,\n  75% {\n    opacity: 0;\n  }\n}\n.flash {\n  -webkit-animation-name: flash;\n  animation-name: flash;\n}\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n@-webkit-keyframes pulse {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  50% {\n    -webkit-transform: scale3d(1.05, 1.05, 1.05);\n    transform: scale3d(1.05, 1.05, 1.05);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n@keyframes pulse {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  50% {\n    -webkit-transform: scale3d(1.05, 1.05, 1.05);\n    transform: scale3d(1.05, 1.05, 1.05);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n.pulse {\n  -webkit-animation-name: pulse;\n  animation-name: pulse;\n}\n@-webkit-keyframes rubberBand {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  30% {\n    -webkit-transform: scale3d(1.25, 0.75, 1);\n    transform: scale3d(1.25, 0.75, 1);\n  }\n  40% {\n    -webkit-transform: scale3d(0.75, 1.25, 1);\n    transform: scale3d(0.75, 1.25, 1);\n  }\n  50% {\n    -webkit-transform: scale3d(1.15, 0.85, 1);\n    transform: scale3d(1.15, 0.85, 1);\n  }\n  65% {\n    -webkit-transform: scale3d(0.95, 1.05, 1);\n    transform: scale3d(0.95, 1.05, 1);\n  }\n  75% {\n    -webkit-transform: scale3d(1.05, 0.95, 1);\n    transform: scale3d(1.05, 0.95, 1);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n@keyframes rubberBand {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  30% {\n    -webkit-transform: scale3d(1.25, 0.75, 1);\n    transform: scale3d(1.25, 0.75, 1);\n  }\n  40% {\n    -webkit-transform: scale3d(0.75, 1.25, 1);\n    transform: scale3d(0.75, 1.25, 1);\n  }\n  50% {\n    -webkit-transform: scale3d(1.15, 0.85, 1);\n    transform: scale3d(1.15, 0.85, 1);\n  }\n  65% {\n    -webkit-transform: scale3d(0.95, 1.05, 1);\n    transform: scale3d(0.95, 1.05, 1);\n  }\n  75% {\n    -webkit-transform: scale3d(1.05, 0.95, 1);\n    transform: scale3d(1.05, 0.95, 1);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n.rubberBand {\n  -webkit-animation-name: rubberBand;\n  animation-name: rubberBand;\n}\n@-webkit-keyframes shake {\n  0%,\n  100% {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n  10%,\n  30%,\n  50%,\n  70%,\n  90% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n  20%,\n  40%,\n  60%,\n  80% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n}\n@keyframes shake {\n  0%,\n  100% {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n  10%,\n  30%,\n  50%,\n  70%,\n  90% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n  20%,\n  40%,\n  60%,\n  80% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n}\n.shake {\n  -webkit-animation-name: shake;\n  animation-name: shake;\n}\n@-webkit-keyframes swing {\n  20% {\n    -webkit-transform: rotate3d(0, 0, 1, 15deg);\n    transform: rotate3d(0, 0, 1, 15deg);\n  }\n  40% {\n    -webkit-transform: rotate3d(0, 0, 1, -10deg);\n    transform: rotate3d(0, 0, 1, -10deg);\n  }\n  60% {\n    -webkit-transform: rotate3d(0, 0, 1, 5deg);\n    transform: rotate3d(0, 0, 1, 5deg);\n  }\n  80% {\n    -webkit-transform: rotate3d(0, 0, 1, -5deg);\n    transform: rotate3d(0, 0, 1, -5deg);\n  }\n  100% {\n    -webkit-transform: rotate3d(0, 0, 1, 0deg);\n    transform: rotate3d(0, 0, 1, 0deg);\n  }\n}\n@keyframes swing {\n  20% {\n    -webkit-transform: rotate3d(0, 0, 1, 15deg);\n    transform: rotate3d(0, 0, 1, 15deg);\n  }\n  40% {\n    -webkit-transform: rotate3d(0, 0, 1, -10deg);\n    transform: rotate3d(0, 0, 1, -10deg);\n  }\n  60% {\n    -webkit-transform: rotate3d(0, 0, 1, 5deg);\n    transform: rotate3d(0, 0, 1, 5deg);\n  }\n  80% {\n    -webkit-transform: rotate3d(0, 0, 1, -5deg);\n    transform: rotate3d(0, 0, 1, -5deg);\n  }\n  100% {\n    -webkit-transform: rotate3d(0, 0, 1, 0deg);\n    transform: rotate3d(0, 0, 1, 0deg);\n  }\n}\n.swing {\n  -webkit-transform-origin: top center;\n  transform-origin: top center;\n  -webkit-animation-name: swing;\n  animation-name: swing;\n}\n@-webkit-keyframes tada {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  10%,\n  20% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);\n  }\n  30%,\n  50%,\n  70%,\n  90% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n  }\n  40%,\n  60%,\n  80% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n@keyframes tada {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  10%,\n  20% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);\n  }\n  30%,\n  50%,\n  70%,\n  90% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n  }\n  40%,\n  60%,\n  80% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n.tada {\n  -webkit-animation-name: tada;\n  animation-name: tada;\n}\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n@-webkit-keyframes wobble {\n  0% {\n    -webkit-transform: none;\n    transform: none;\n  }\n  15% {\n    -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n    transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n  }\n  30% {\n    -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n    transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n  }\n  45% {\n    -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n    transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n  }\n  60% {\n    -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n    transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n  }\n  75% {\n    -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n    transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes wobble {\n  0% {\n    -webkit-transform: none;\n    transform: none;\n  }\n  15% {\n    -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n    transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n  }\n  30% {\n    -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n    transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n  }\n  45% {\n    -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n    transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n  }\n  60% {\n    -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n    transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n  }\n  75% {\n    -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n    transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.wobble {\n  -webkit-animation-name: wobble;\n  animation-name: wobble;\n}\n@-webkit-keyframes bounceIn {\n  0%,\n  20%,\n  40%,\n  60%,\n  80%,\n  100% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  20% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n  40% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9);\n    transform: scale3d(0.9, 0.9, 0.9);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.03, 1.03, 1.03);\n    transform: scale3d(1.03, 1.03, 1.03);\n  }\n  80% {\n    -webkit-transform: scale3d(0.97, 0.97, 0.97);\n    transform: scale3d(0.97, 0.97, 0.97);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n@keyframes bounceIn {\n  0%,\n  20%,\n  40%,\n  60%,\n  80%,\n  100% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  20% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n  40% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9);\n    transform: scale3d(0.9, 0.9, 0.9);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.03, 1.03, 1.03);\n    transform: scale3d(1.03, 1.03, 1.03);\n  }\n  80% {\n    -webkit-transform: scale3d(0.97, 0.97, 0.97);\n    transform: scale3d(0.97, 0.97, 0.97);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n.bounceIn {\n  -webkit-animation-name: bounceIn;\n  animation-name: bounceIn;\n}\n@-webkit-keyframes bounceInDown {\n  0%,\n  60%,\n  75%,\n  90%,\n  100% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -3000px, 0);\n    transform: translate3d(0, -3000px, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 25px, 0);\n    transform: translate3d(0, 25px, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, 5px, 0);\n    transform: translate3d(0, 5px, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes bounceInDown {\n  0%,\n  60%,\n  75%,\n  90%,\n  100% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -3000px, 0);\n    transform: translate3d(0, -3000px, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 25px, 0);\n    transform: translate3d(0, 25px, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, 5px, 0);\n    transform: translate3d(0, 5px, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.bounceInDown {\n  -webkit-animation-name: bounceInDown;\n  animation-name: bounceInDown;\n}\n@-webkit-keyframes bounceInLeft {\n  0%,\n  60%,\n  75%,\n  90%,\n  100% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-3000px, 0, 0);\n    transform: translate3d(-3000px, 0, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(25px, 0, 0);\n    transform: translate3d(25px, 0, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(5px, 0, 0);\n    transform: translate3d(5px, 0, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes bounceInLeft {\n  0%,\n  60%,\n  75%,\n  90%,\n  100% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-3000px, 0, 0);\n    transform: translate3d(-3000px, 0, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(25px, 0, 0);\n    transform: translate3d(25px, 0, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(5px, 0, 0);\n    transform: translate3d(5px, 0, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.bounceInLeft {\n  -webkit-animation-name: bounceInLeft;\n  animation-name: bounceInLeft;\n}\n@-webkit-keyframes bounceInRight {\n  0%,\n  60%,\n  75%,\n  90%,\n  100% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(3000px, 0, 0);\n    transform: translate3d(3000px, 0, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(-25px, 0, 0);\n    transform: translate3d(-25px, 0, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(-5px, 0, 0);\n    transform: translate3d(-5px, 0, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes bounceInRight {\n  0%,\n  60%,\n  75%,\n  90%,\n  100% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(3000px, 0, 0);\n    transform: translate3d(3000px, 0, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(-25px, 0, 0);\n    transform: translate3d(-25px, 0, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(-5px, 0, 0);\n    transform: translate3d(-5px, 0, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.bounceInRight {\n  -webkit-animation-name: bounceInRight;\n  animation-name: bounceInRight;\n}\n@-webkit-keyframes bounceInUp {\n  0%,\n  60%,\n  75%,\n  90%,\n  100% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 3000px, 0);\n    transform: translate3d(0, 3000px, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, -5px, 0);\n    transform: translate3d(0, -5px, 0);\n  }\n  100% {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n@keyframes bounceInUp {\n  0%,\n  60%,\n  75%,\n  90%,\n  100% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 3000px, 0);\n    transform: translate3d(0, 3000px, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, -5px, 0);\n    transform: translate3d(0, -5px, 0);\n  }\n  100% {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n.bounceInUp {\n  -webkit-animation-name: bounceInUp;\n  animation-name: bounceInUp;\n}\n@-webkit-keyframes bounceOut {\n  20% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9);\n    transform: scale3d(0.9, 0.9, 0.9);\n  }\n  50%,\n  55% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n}\n@keyframes bounceOut {\n  20% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9);\n    transform: scale3d(0.9, 0.9, 0.9);\n  }\n  50%,\n  55% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n}\n.bounceOut {\n  -webkit-animation-name: bounceOut;\n  animation-name: bounceOut;\n}\n@-webkit-keyframes bounceOutDown {\n  20% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n  40%,\n  45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n@keyframes bounceOutDown {\n  20% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n  40%,\n  45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n.bounceOutDown {\n  -webkit-animation-name: bounceOutDown;\n  animation-name: bounceOutDown;\n}\n@-webkit-keyframes bounceOutLeft {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(20px, 0, 0);\n    transform: translate3d(20px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n@keyframes bounceOutLeft {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(20px, 0, 0);\n    transform: translate3d(20px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n.bounceOutLeft {\n  -webkit-animation-name: bounceOutLeft;\n  animation-name: bounceOutLeft;\n}\n@-webkit-keyframes bounceOutRight {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(-20px, 0, 0);\n    transform: translate3d(-20px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n@keyframes bounceOutRight {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(-20px, 0, 0);\n    transform: translate3d(-20px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n.bounceOutRight {\n  -webkit-animation-name: bounceOutRight;\n  animation-name: bounceOutRight;\n}\n@-webkit-keyframes bounceOutUp {\n  20% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n  40%,\n  45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 20px, 0);\n    transform: translate3d(0, 20px, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n@keyframes bounceOutUp {\n  20% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n  40%,\n  45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 20px, 0);\n    transform: translate3d(0, 20px, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n.bounceOutUp {\n  -webkit-animation-name: bounceOutUp;\n  animation-name: bounceOutUp;\n}\n@-webkit-keyframes fadeIn {\n  0% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n@keyframes fadeIn {\n  0% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n.fadeIn {\n  -webkit-animation-name: fadeIn;\n  animation-name: fadeIn;\n}\n@-webkit-keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInDown {\n  -webkit-animation-name: fadeInDown;\n  animation-name: fadeInDown;\n}\n@-webkit-keyframes fadeInDownBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInDownBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInDownBig {\n  -webkit-animation-name: fadeInDownBig;\n  animation-name: fadeInDownBig;\n}\n@-webkit-keyframes fadeInLeft {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInLeft {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInLeft {\n  -webkit-animation-name: fadeInLeft;\n  animation-name: fadeInLeft;\n}\n@-webkit-keyframes fadeInLeftBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInLeftBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInLeftBig {\n  -webkit-animation-name: fadeInLeftBig;\n  animation-name: fadeInLeftBig;\n}\n@-webkit-keyframes fadeInRight {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInRight {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInRight {\n  -webkit-animation-name: fadeInRight;\n  animation-name: fadeInRight;\n}\n@-webkit-keyframes fadeInRightBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInRightBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInRightBig {\n  -webkit-animation-name: fadeInRightBig;\n  animation-name: fadeInRightBig;\n}\n@-webkit-keyframes fadeInUp {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInUp {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInUp {\n  -webkit-animation-name: fadeInUp;\n  animation-name: fadeInUp;\n}\n@-webkit-keyframes fadeInUpBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInUpBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInUpBig {\n  -webkit-animation-name: fadeInUpBig;\n  animation-name: fadeInUpBig;\n}\n@-webkit-keyframes fadeOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n@keyframes fadeOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n.fadeOut {\n  -webkit-animation-name: fadeOut;\n  animation-name: fadeOut;\n}\n@-webkit-keyframes fadeOutDown {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n}\n@keyframes fadeOutDown {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n}\n.fadeOutDown {\n  -webkit-animation-name: fadeOutDown;\n  animation-name: fadeOutDown;\n}\n@-webkit-keyframes fadeOutDownBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n@keyframes fadeOutDownBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n.fadeOutDownBig {\n  -webkit-animation-name: fadeOutDownBig;\n  animation-name: fadeOutDownBig;\n}\n@-webkit-keyframes fadeOutLeft {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n}\n@keyframes fadeOutLeft {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n}\n.fadeOutLeft {\n  -webkit-animation-name: fadeOutLeft;\n  animation-name: fadeOutLeft;\n}\n@-webkit-keyframes fadeOutLeftBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n@keyframes fadeOutLeftBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n.fadeOutLeftBig {\n  -webkit-animation-name: fadeOutLeftBig;\n  animation-name: fadeOutLeftBig;\n}\n@-webkit-keyframes fadeOutRight {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n}\n@keyframes fadeOutRight {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n}\n.fadeOutRight {\n  -webkit-animation-name: fadeOutRight;\n  animation-name: fadeOutRight;\n}\n@-webkit-keyframes fadeOutRightBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n@keyframes fadeOutRightBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n.fadeOutRightBig {\n  -webkit-animation-name: fadeOutRightBig;\n  animation-name: fadeOutRightBig;\n}\n@-webkit-keyframes fadeOutUp {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n}\n@keyframes fadeOutUp {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n}\n.fadeOutUp {\n  -webkit-animation-name: fadeOutUp;\n  animation-name: fadeOutUp;\n}\n@-webkit-keyframes fadeOutUpBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n@keyframes fadeOutUpBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n.fadeOutUpBig {\n  -webkit-animation-name: fadeOutUpBig;\n  animation-name: fadeOutUpBig;\n}\n@-webkit-keyframes flip {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n  40% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n  50% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n  80% {\n    -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95);\n    transform: perspective(400px) scale3d(0.95, 0.95, 0.95);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n}\n@keyframes flip {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n  40% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n  50% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n  80% {\n    -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95);\n    transform: perspective(400px) scale3d(0.95, 0.95, 0.95);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n}\n.animated.flip {\n  -webkit-backface-visibility: visible;\n  backface-visibility: visible;\n  -webkit-animation-name: flip;\n  animation-name: flip;\n}\n@-webkit-keyframes flipInX {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n    opacity: 0;\n  }\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n  }\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n@keyframes flipInX {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n    opacity: 0;\n  }\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n  }\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n.flipInX {\n  -webkit-backface-visibility: visible !important;\n  backface-visibility: visible !important;\n  -webkit-animation-name: flipInX;\n  animation-name: flipInX;\n}\n@-webkit-keyframes flipInY {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n    opacity: 0;\n  }\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n  }\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n@keyframes flipInY {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n    opacity: 0;\n  }\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n  }\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n.flipInY {\n  -webkit-backface-visibility: visible !important;\n  backface-visibility: visible !important;\n  -webkit-animation-name: flipInY;\n  animation-name: flipInY;\n}\n@-webkit-keyframes flipOutX {\n  0% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    opacity: 0;\n  }\n}\n@keyframes flipOutX {\n  0% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    opacity: 0;\n  }\n}\n.flipOutX {\n  -webkit-animation-name: flipOutX;\n  animation-name: flipOutX;\n  -webkit-backface-visibility: visible !important;\n  backface-visibility: visible !important;\n}\n@-webkit-keyframes flipOutY {\n  0% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    opacity: 0;\n  }\n}\n@keyframes flipOutY {\n  0% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    opacity: 0;\n  }\n}\n.flipOutY {\n  -webkit-backface-visibility: visible !important;\n  backface-visibility: visible !important;\n  -webkit-animation-name: flipOutY;\n  animation-name: flipOutY;\n}\n@-webkit-keyframes lightSpeedIn {\n  0% {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);\n    transform: translate3d(100%, 0, 0) skewX(-30deg);\n    opacity: 0;\n  }\n  60% {\n    -webkit-transform: skewX(20deg);\n    transform: skewX(20deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: skewX(-5deg);\n    transform: skewX(-5deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes lightSpeedIn {\n  0% {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);\n    transform: translate3d(100%, 0, 0) skewX(-30deg);\n    opacity: 0;\n  }\n  60% {\n    -webkit-transform: skewX(20deg);\n    transform: skewX(20deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: skewX(-5deg);\n    transform: skewX(-5deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.lightSpeedIn {\n  -webkit-animation-name: lightSpeedIn;\n  animation-name: lightSpeedIn;\n  -webkit-animation-timing-function: ease-out;\n  animation-timing-function: ease-out;\n}\n@-webkit-keyframes lightSpeedOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);\n    transform: translate3d(100%, 0, 0) skewX(30deg);\n    opacity: 0;\n  }\n}\n@keyframes lightSpeedOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);\n    transform: translate3d(100%, 0, 0) skewX(30deg);\n    opacity: 0;\n  }\n}\n.lightSpeedOut {\n  -webkit-animation-name: lightSpeedOut;\n  animation-name: lightSpeedOut;\n  -webkit-animation-timing-function: ease-in;\n  animation-timing-function: ease-in;\n}\n@-webkit-keyframes rotateIn {\n  0% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, -200deg);\n    transform: rotate3d(0, 0, 1, -200deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes rotateIn {\n  0% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, -200deg);\n    transform: rotate3d(0, 0, 1, -200deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.rotateIn {\n  -webkit-animation-name: rotateIn;\n  animation-name: rotateIn;\n}\n@-webkit-keyframes rotateInDownLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes rotateInDownLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.rotateInDownLeft {\n  -webkit-animation-name: rotateInDownLeft;\n  animation-name: rotateInDownLeft;\n}\n@-webkit-keyframes rotateInDownRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes rotateInDownRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.rotateInDownRight {\n  -webkit-animation-name: rotateInDownRight;\n  animation-name: rotateInDownRight;\n}\n@-webkit-keyframes rotateInUpLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes rotateInUpLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.rotateInUpLeft {\n  -webkit-animation-name: rotateInUpLeft;\n  animation-name: rotateInUpLeft;\n}\n@-webkit-keyframes rotateInUpRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -90deg);\n    transform: rotate3d(0, 0, 1, -90deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes rotateInUpRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -90deg);\n    transform: rotate3d(0, 0, 1, -90deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.rotateInUpRight {\n  -webkit-animation-name: rotateInUpRight;\n  animation-name: rotateInUpRight;\n}\n@-webkit-keyframes rotateOut {\n  0% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, 200deg);\n    transform: rotate3d(0, 0, 1, 200deg);\n    opacity: 0;\n  }\n}\n@keyframes rotateOut {\n  0% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, 200deg);\n    transform: rotate3d(0, 0, 1, 200deg);\n    opacity: 0;\n  }\n}\n.rotateOut {\n  -webkit-animation-name: rotateOut;\n  animation-name: rotateOut;\n}\n@-webkit-keyframes rotateOutDownLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n}\n@keyframes rotateOutDownLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n}\n.rotateOutDownLeft {\n  -webkit-animation-name: rotateOutDownLeft;\n  animation-name: rotateOutDownLeft;\n}\n@-webkit-keyframes rotateOutDownRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n@keyframes rotateOutDownRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n.rotateOutDownRight {\n  -webkit-animation-name: rotateOutDownRight;\n  animation-name: rotateOutDownRight;\n}\n@-webkit-keyframes rotateOutUpLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n@keyframes rotateOutUpLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n.rotateOutUpLeft {\n  -webkit-animation-name: rotateOutUpLeft;\n  animation-name: rotateOutUpLeft;\n}\n@-webkit-keyframes rotateOutUpRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 90deg);\n    transform: rotate3d(0, 0, 1, 90deg);\n    opacity: 0;\n  }\n}\n@keyframes rotateOutUpRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 90deg);\n    transform: rotate3d(0, 0, 1, 90deg);\n    opacity: 0;\n  }\n}\n.rotateOutUpRight {\n  -webkit-animation-name: rotateOutUpRight;\n  animation-name: rotateOutUpRight;\n}\n@-webkit-keyframes hinge {\n  0% {\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n  20%,\n  60% {\n    -webkit-transform: rotate3d(0, 0, 1, 80deg);\n    transform: rotate3d(0, 0, 1, 80deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n  40%,\n  80% {\n    -webkit-transform: rotate3d(0, 0, 1, 60deg);\n    transform: rotate3d(0, 0, 1, 60deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: translate3d(0, 700px, 0);\n    transform: translate3d(0, 700px, 0);\n    opacity: 0;\n  }\n}\n@keyframes hinge {\n  0% {\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n  20%,\n  60% {\n    -webkit-transform: rotate3d(0, 0, 1, 80deg);\n    transform: rotate3d(0, 0, 1, 80deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n  40%,\n  80% {\n    -webkit-transform: rotate3d(0, 0, 1, 60deg);\n    transform: rotate3d(0, 0, 1, 60deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: translate3d(0, 700px, 0);\n    transform: translate3d(0, 700px, 0);\n    opacity: 0;\n  }\n}\n.hinge {\n  -webkit-animation-name: hinge;\n  animation-name: hinge;\n}\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n@-webkit-keyframes rollIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n    transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes rollIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n    transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.rollIn {\n  -webkit-animation-name: rollIn;\n  animation-name: rollIn;\n}\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n@-webkit-keyframes rollOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n    transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n  }\n}\n@keyframes rollOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n    transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n  }\n}\n.rollOut {\n  -webkit-animation-name: rollOut;\n  animation-name: rollOut;\n}\n@-webkit-keyframes zoomIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  50% {\n    opacity: 1;\n  }\n}\n@keyframes zoomIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  50% {\n    opacity: 1;\n  }\n}\n.zoomIn {\n  -webkit-animation-name: zoomIn;\n  animation-name: zoomIn;\n}\n@-webkit-keyframes zoomInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomInDown {\n  -webkit-animation-name: zoomInDown;\n  animation-name: zoomInDown;\n}\n@-webkit-keyframes zoomInLeft {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomInLeft {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomInLeft {\n  -webkit-animation-name: zoomInLeft;\n  animation-name: zoomInLeft;\n}\n@-webkit-keyframes zoomInRight {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomInRight {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomInRight {\n  -webkit-animation-name: zoomInRight;\n  animation-name: zoomInRight;\n}\n@-webkit-keyframes zoomInUp {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomInUp {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomInUp {\n  -webkit-animation-name: zoomInUp;\n  animation-name: zoomInUp;\n}\n@-webkit-keyframes zoomOut {\n  0% {\n    opacity: 1;\n  }\n  50% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  100% {\n    opacity: 0;\n  }\n}\n@keyframes zoomOut {\n  0% {\n    opacity: 1;\n  }\n  50% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  100% {\n    opacity: 0;\n  }\n}\n.zoomOut {\n  -webkit-animation-name: zoomOut;\n  animation-name: zoomOut;\n}\n@-webkit-keyframes zoomOutDown {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomOutDown {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomOutDown {\n  -webkit-animation-name: zoomOutDown;\n  animation-name: zoomOutDown;\n}\n@-webkit-keyframes zoomOutLeft {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0);\n    transform: scale(0.1) translate3d(-2000px, 0, 0);\n    -webkit-transform-origin: left center;\n    transform-origin: left center;\n  }\n}\n@keyframes zoomOutLeft {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0);\n    transform: scale(0.1) translate3d(-2000px, 0, 0);\n    -webkit-transform-origin: left center;\n    transform-origin: left center;\n  }\n}\n.zoomOutLeft {\n  -webkit-animation-name: zoomOutLeft;\n  animation-name: zoomOutLeft;\n}\n@-webkit-keyframes zoomOutRight {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale(0.1) translate3d(2000px, 0, 0);\n    transform: scale(0.1) translate3d(2000px, 0, 0);\n    -webkit-transform-origin: right center;\n    transform-origin: right center;\n  }\n}\n@keyframes zoomOutRight {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale(0.1) translate3d(2000px, 0, 0);\n    transform: scale(0.1) translate3d(2000px, 0, 0);\n    -webkit-transform-origin: right center;\n    transform-origin: right center;\n  }\n}\n.zoomOutRight {\n  -webkit-animation-name: zoomOutRight;\n  animation-name: zoomOutRight;\n}\n@-webkit-keyframes zoomOutUp {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomOutUp {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomOutUp {\n  -webkit-animation-name: zoomOutUp;\n  animation-name: zoomOutUp;\n}\n@-webkit-keyframes slideInDown {\n  0% {\n    -webkit-transform: translateY(-100%);\n    transform: translateY(-100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n}\n@keyframes slideInDown {\n  0% {\n    -webkit-transform: translateY(-100%);\n    transform: translateY(-100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n}\n.slideInDown {\n  -webkit-animation-name: slideInDown;\n  animation-name: slideInDown;\n}\n@-webkit-keyframes slideInLeft {\n  0% {\n    -webkit-transform: translateX(-100%);\n    transform: translateX(-100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n@keyframes slideInLeft {\n  0% {\n    -webkit-transform: translateX(-100%);\n    transform: translateX(-100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n.slideInLeft {\n  -webkit-animation-name: slideInLeft;\n  animation-name: slideInLeft;\n}\n@-webkit-keyframes slideInRight {\n  0% {\n    -webkit-transform: translateX(100%);\n    transform: translateX(100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n@keyframes slideInRight {\n  0% {\n    -webkit-transform: translateX(100%);\n    transform: translateX(100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n.slideInRight {\n  -webkit-animation-name: slideInRight;\n  animation-name: slideInRight;\n}\n@-webkit-keyframes slideInUp {\n  0% {\n    -webkit-transform: translateY(100%);\n    transform: translateY(100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n}\n@keyframes slideInUp {\n  0% {\n    -webkit-transform: translateY(100%);\n    transform: translateY(100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n}\n.slideInUp {\n  -webkit-animation-name: slideInUp;\n  animation-name: slideInUp;\n}\n@-webkit-keyframes slideOutDown {\n  0% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateY(100%);\n    transform: translateY(100%);\n  }\n}\n@keyframes slideOutDown {\n  0% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateY(100%);\n    transform: translateY(100%);\n  }\n}\n.slideOutDown {\n  -webkit-animation-name: slideOutDown;\n  animation-name: slideOutDown;\n}\n@-webkit-keyframes slideOutLeft {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateX(-100%);\n    transform: translateX(-100%);\n  }\n}\n@keyframes slideOutLeft {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateX(-100%);\n    transform: translateX(-100%);\n  }\n}\n.slideOutLeft {\n  -webkit-animation-name: slideOutLeft;\n  animation-name: slideOutLeft;\n}\n@-webkit-keyframes slideOutRight {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateX(100%);\n    transform: translateX(100%);\n  }\n}\n@keyframes slideOutRight {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateX(100%);\n    transform: translateX(100%);\n  }\n}\n.slideOutRight {\n  -webkit-animation-name: slideOutRight;\n  animation-name: slideOutRight;\n}\n@-webkit-keyframes slideOutUp {\n  0% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateY(-100%);\n    transform: translateY(-100%);\n  }\n}\n@keyframes slideOutUp {\n  0% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateY(-100%);\n    transform: translateY(-100%);\n  }\n}\n.slideOutUp {\n  -webkit-animation-name: slideOutUp;\n  animation-name: slideOutUp;\n}\n.draggable-handler {\n  cursor: move;\n}\n.draggable-placeholder {\n  background-color: #f1f1f1;\n  border: 1px dashed #ccc;\n}\npre.pre-sh {\n  padding: 0;\n  margin: 0;\n  border: none;\n  background-color: transparent;\n  border-radius: 0;\n}\n.dropzone {\n  min-height: 200px;\n  background-color: #f9f9f9;\n  border: 2px dashed #bbb;\n  border-radius: 3px;\n}\n.dropzone .dz-message {\n  margin: 65px 0;\n  font-size: 16px;\n  font-style: italic;\n  color: #888;\n}\n.dropzone:hover {\n  background-color: #fcfcfc;\n  border-color: #5c90d2;\n}\n.dropzone:hover .dz-message {\n  color: #5c90d2;\n}\n.datepicker {\n  z-index: 1051 !important;\n}\n.input-daterange .input-group-addon {\n  min-width: 30px;\n  color: #646464;\n  background-color: #f9f9f9;\n  border-color: #e6e6e6;\n}\n.datepicker table tr td.today,\n.datepicker table tr td.today:hover,\n.datepicker table tr td.today.disabled,\n.datepicker table tr td.today.disabled:hover {\n  background-color: #faeab9;\n  border-color: #faeab9;\n}\n.datepicker table tr td.active:hover,\n.datepicker table tr td.active:hover:hover,\n.datepicker table tr td.active.disabled:hover,\n.datepicker table tr td.active.disabled:hover:hover,\n.datepicker table tr td.active:focus,\n.datepicker table tr td.active:hover:focus,\n.datepicker table tr td.active.disabled:focus,\n.datepicker table tr td.active.disabled:hover:focus,\n.datepicker table tr td.active:active,\n.datepicker table tr td.active:hover:active,\n.datepicker table tr td.active.disabled:active,\n.datepicker table tr td.active.disabled:hover:active,\n.datepicker table tr td.active.active,\n.datepicker table tr td.active:hover.active,\n.datepicker table tr td.active.disabled.active,\n.datepicker table tr td.active.disabled:hover.active,\n.open .dropdown-toggle.datepicker table tr td.active,\n.open .dropdown-toggle.datepicker table tr td.active:hover,\n.open .dropdown-toggle.datepicker table tr td.active.disabled,\n.open .dropdown-toggle.datepicker table tr td.active.disabled:hover,\n.datepicker table tr td span.active:hover,\n.datepicker table tr td span.active:hover:hover,\n.datepicker table tr td span.active.disabled:hover,\n.datepicker table tr td span.active.disabled:hover:hover,\n.datepicker table tr td span.active:focus,\n.datepicker table tr td span.active:hover:focus,\n.datepicker table tr td span.active.disabled:focus,\n.datepicker table tr td span.active.disabled:hover:focus,\n.datepicker table tr td span.active:active,\n.datepicker table tr td span.active:hover:active,\n.datepicker table tr td span.active.disabled:active,\n.datepicker table tr td span.active.disabled:hover:active,\n.datepicker table tr td span.active.active,\n.datepicker table tr td span.active:hover.active,\n.datepicker table tr td span.active.disabled.active,\n.datepicker table tr td span.active.disabled:hover.active,\n.open .dropdown-toggle.datepicker table tr td span.active,\n.open .dropdown-toggle.datepicker table tr td span.active:hover,\n.open .dropdown-toggle.datepicker table tr td span.active.disabled,\n.open .dropdown-toggle.datepicker table tr td span.active.disabled:hover {\n  background-color: #5c90d2;\n  border-color: #5c90d2;\n}\n.colorpicker.dropdown-menu {\n  min-width: 130px;\n}\ndiv.tagsinput {\n  padding: 6px 12px 1px;\n  border-color: #e6e6e6;\n  border-radius: 3px;\n}\ndiv.tagsinput input {\n  padding-top: 0;\n  padding-bottom: 0;\n  height: 22px;\n}\n.form-material div.tagsinput {\n  padding-right: 0;\n  padding-left: 0;\n  border: none;\n  border-bottom: 1px solid #e6e6e6;\n}\ndiv.tagsinput span.tag {\n  padding: 2px 5px;\n  height: 22px;\n  line-height: 18px;\n  color: #fff;\n  font-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-weight: 600;\n  background-color: #5c90d2;\n  border: none;\n}\ndiv.tagsinput span.tag a {\n  font-size: 13px;\n  color: rgba(255, 255, 255, 0.5);\n}\ndiv.tagsinput span.tag a:hover {\n  color: rgba(255, 255, 255, 0.75);\n}\n.select2-container .select2-selection--single {\n  height: 34px;\n}\n.select2-container .select2-dropdown {\n  border-color: #e6e6e6;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.select2-container--default .select2-selection--single {\n  border-color: #e6e6e6;\n  border-radius: 3px;\n}\n.select2-container--default .select2-selection--single .select2-selection__rendered {\n  padding-left: 12px;\n  line-height: 34px;\n}\n.form-material .select2-container--default .select2-selection--single .select2-selection__rendered {\n  padding-left: 0;\n}\n.select2-container--default .select2-selection--single .select2-selection__arrow {\n  height: 34px;\n}\n.form-material .select2-container--default .select2-selection--single {\n  border: none;\n  border-bottom: 1px solid #e6e6e6;\n  border-radius: 0;\n}\n.select2-container--default .select2-selection--single .select2-selection__placeholder {\n  color: #aaa;\n}\n.select2-container--default .select2-selection--multiple,\n.select2-container--default.select2-container--focus .select2-selection--multiple {\n  border-color: #e6e6e6;\n  border-radius: 3px;\n}\n.form-material .select2-container--default .select2-selection--multiple,\n.form-material .select2-container--default.select2-container--focus .select2-selection--multiple {\n  border: none;\n  border-bottom: 1px solid #e6e6e6;\n  border-radius: 0;\n}\n.select2-container--default .select2-selection--multiple .select2-selection__rendered,\n.select2-container--default.select2-container--focus .select2-selection--multiple .select2-selection__rendered {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n.form-material .select2-container--default .select2-selection--multiple .select2-selection__rendered,\n.form-material .select2-container--default.select2-container--focus .select2-selection--multiple .select2-selection__rendered {\n  padding-left: 0;\n}\n.select2-container--default .select2-selection--multiple .select2-selection__choice {\n  height: 22px;\n  line-height: 22px;\n  color: #fff;\n  font-size: 13px;\n  font-weight: 600;\n  background-color: #5c90d2;\n  border: none;\n  border-radius: 3px;\n}\n.select2-container--default .select2-selection--multiple .select2-selection__choice__remove {\n  margin-right: 5px;\n  color: rgba(255, 255, 255, 0.5);\n}\n.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {\n  color: rgba(255, 255, 255, 0.75);\n}\n.select2-container--default .select2-search--dropdown .select2-search__field {\n  border-color: #e6e6e6;\n}\n.select2-container--default .select2-results__option--highlighted[aria-selected] {\n  background-color: #5c90d2;\n}\n.select2-container--default .select2-search--inline .select2-search__field {\n  padding-right: 0;\n  padding-left: 0;\n  font-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.form-material .select2-container--default .select2-search--inline .select2-search__field {\n  padding-left: 0;\n}\n.select2-search--dropdown .select2-search__field {\n  padding: 6px 12px;\n  font-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  border-radius: 3px;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.slick-slider {\n  margin-bottom: 45px;\n}\n.slick-slider.slick-padding-dots {\n  padding-bottom: 45px;\n  margin-bottom: 0;\n}\n.slick-slider.slick-padding-dots .slick-dots {\n  bottom: 0;\n}\n.slick-slider.slick-nav-hover .slick-prev,\n.slick-slider.slick-nav-hover .slick-next {\n  opacity: 0;\n  -webkit-transition: opacity 0.25s ease-out;\n  transition: opacity 0.25s ease-out;\n}\n.slick-slider.slick-nav-hover:hover .slick-prev,\n.slick-slider.slick-nav-hover:hover .slick-next {\n  opacity: .25;\n}\n.slick-slider.slick-nav-hover:hover .slick-prev:hover,\n.slick-slider.slick-nav-hover:hover .slick-next:hover {\n  opacity: .6;\n}\n.slick-slider.slick-nav-white .slick-prev,\n.slick-slider.slick-nav-white .slick-next {\n  background-color: #fff;\n}\n.slick-slider.slick-nav-white .slick-prev:hover,\n.slick-slider.slick-nav-white .slick-next:hover {\n  background-color: #fff;\n}\n.slick-slider.slick-nav-white .slick-prev:before,\n.slick-slider.slick-nav-white .slick-next:before {\n  color: #000;\n}\n.slick-slider .slick-dots {\n  bottom: -45px;\n}\n.slick-slider .slick-prev,\n.slick-slider .slick-next {\n  margin-top: -15px;\n  width: 40px;\n  height: 40px;\n  text-align: center;\n  background-color: #000;\n  opacity: .25;\n}\n.slick-slider .slick-prev:hover,\n.slick-slider .slick-next:hover {\n  background-color: #000;\n  opacity: .6;\n}\n.slick-slider .slick-prev:before,\n.slick-slider .slick-next:before {\n  font-family: 'FontAwesome';\n  font-size: 14px;\n  line-height: 28px;\n}\n.slick-slider .slick-prev {\n  left: 10px;\n}\n.slick-slider .slick-prev:before {\n  content: \"\\f060\";\n}\n.slick-slider .slick-next {\n  right: 10px;\n}\n.slick-slider .slick-next:before {\n  content: \"\\f061\";\n}\n.note-editor {\n  border-color: #ddd;\n}\n.note-editor .note-toolbar {\n  border-bottom-color: #ddd;\n}\n.note-editor .note-statusbar .note-resizebar {\n  border-top-color: #ddd;\n}\n.note-editor .note-toolbar.btn-toolbar {\n  margin-left: 0;\n}\n.jqstooltip {\n  -webkit-box-sizing: content-box;\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  border: none !important;\n  background-color: rgba(0, 0, 0, 0.75) !important;\n}\n.pie-chart {\n  position: relative;\n  display: inline-block;\n}\n.pie-chart > span {\n  position: absolute;\n  top: 50%;\n  -webkit-transform: translateY(-50%);\n  -ms-transform: translateY(-50%);\n  transform: translateY(-50%);\n  margin-top: -2px;\n  right: 0;\n  left: 0;\n  text-align: center;\n}\n.flot-tooltip {\n  position: absolute;\n  display: none;\n  color: #fff;\n  background: rgba(0, 0, 0, 0.75);\n  padding: 4px 8px;\n}\n.flot-pie-label {\n  font-size: 13px;\n  text-align: center;\n  padding: 4px 8px;\n  color: #fff;\n}\n.legend > table td {\n  padding: 3px 4px;\n  font-size: 14px;\n}\n.fc-event {\n  padding-left: 3px;\n  padding-right: 3px;\n  font-size: 12px;\n  font-weight: 600;\n  line-height: 1.4;\n  color: rgba(0, 0, 0, 0.75);\n  border: 1px solid #b5d0eb;\n  background-color: #b5d0eb;\n  border-radius: 0;\n}\n.fc-event:hover {\n  color: rgba(0, 0, 0, 0.75);\n}\n.fc button {\n  height: 34px;\n  line-height: 34px;\n  font-weight: 600;\n}\n.fc-state-default.fc-corner-left {\n  border-top-left-radius: 2px;\n  border-bottom-left-radius: 2px;\n}\n.fc-state-default.fc-corner-right {\n  border-top-right-radius: 2px;\n  border-bottom-right-radius: 2px;\n}\n.fc-state-default {\n  color: #393939;\n  background-color: #f3f3f3;\n  background-image: none;\n  border: 1px solid #e6e6e6;\n  text-shadow: none;\n  box-shadow: none;\n}\n.fc-state-hover,\n.fc-state-down,\n.fc-state-active,\n.fc-state-disabled {\n  color: #393939;\n  background-color: #dfdfdf;\n  border-color: #c7c7c7;\n}\n.fc-state-hover {\n  color: #393939;\n  -webkit-transition: all 0.15s ease-out;\n  transition: all 0.15s ease-out;\n}\n.fc-state-down,\n.fc-state-active {\n  background-color: #c5c5c5;\n  border-color: #aeaeae;\n  box-shadow: none;\n}\n.fc-state-disabled {\n  opacity: .35;\n}\n.fc-toolbar {\n  margin-bottom: 29px;\n}\n.fc-toolbar h2 {\n  font-weight: 400;\n}\n.fc thead th.fc-widget-header {\n  padding-top: 6px;\n  padding-bottom: 6px;\n  font-size: 16px;\n  font-weight: 600;\n  text-transform: uppercase;\n  background-color: #f9f9f9;\n}\n.fc-unthemed th,\n.fc-unthemed td,\n.fc-unthemed hr,\n.fc-unthemed thead,\n.fc-unthemed tbody,\n.fc-unthemed .fc-row,\n.fc-unthemed .fc-popover {\n  border-color: #eee;\n}\n.placeholder {\n  color: #aaa;\n}\n"
  },
  {
    "path": "webservice/lalascan_web/app/static/img/avatars/readme.txt",
    "content": "All avatars used in the demo are not available for commercial use,\r\nso I couldn't include them in the final package. If you would like\r\nthem for mockup purposes, you can either replace the images in this\r\nfolder with avatars from http://uifaces.com/ or you can contact me\r\nto send you the ones I've used in the demo (also from uifaces.com).\r\n\r\nThank you! :-)"
  },
  {
    "path": "webservice/lalascan_web/app/static/js/app.js",
    "content": "/*\r\n *  Document   : app.js\r\n *  Author     : pixelcave\r\n *  Description: UI Framework Custom Functionality (available to all pages)\r\n *\r\n */\r\n\r\nvar App = function() {\r\n    // Helper variables - set in uiInit()\r\n    var $lHtml, $lBody, $lPage, $lSidebar, $lSidebarScroll, $lSideOverlay, $lSideOverlayScroll, $lHeader, $lMain, $lFooter;\r\n\r\n    /*\r\n     ********************************************************************************************\r\n     *\r\n     * BASE UI FUNCTIONALITY\r\n     *\r\n     * Functions which handle vital UI functionality such as main navigation and layout\r\n     * They are auto initialized in every page\r\n     *\r\n     *********************************************************************************************\r\n     */\r\n\r\n    // User Interface init\r\n    var uiInit = function() {\r\n        // Set variables\r\n        $lHtml              = jQuery('html');\r\n        $lBody              = jQuery('body');\r\n        $lPage              = jQuery('#page-container');\r\n        $lSidebar           = jQuery('#sidebar');\r\n        $lSidebarScroll     = jQuery('#sidebar-scroll');\r\n        $lSideOverlay       = jQuery('#side-overlay');\r\n        $lSideOverlayScroll = jQuery('#side-overlay-scroll');\r\n        $lHeader            = jQuery('#header-navbar');\r\n        $lMain              = jQuery('#main-container');\r\n        $lFooter            = jQuery('#page-footer');\r\n\r\n        // Initialize Tooltips\r\n        jQuery('[data-toggle=\"tooltip\"], .js-tooltip').tooltip({\r\n            container: 'body',\r\n            animation: false\r\n        });\r\n\r\n        // Initialize Popovers\r\n        jQuery('[data-toggle=\"popover\"], .js-popover').popover({\r\n            container: 'body',\r\n            animation: true,\r\n            trigger: 'hover'\r\n        });\r\n\r\n        // Initialize Tabs\r\n        jQuery('[data-toggle=\"tabs\"] a, .js-tabs a').click(function(e){\r\n            e.preventDefault();\r\n            jQuery(this).tab('show');\r\n        });\r\n\r\n        // Init form placeholder (for IE9)\r\n        jQuery('.form-control').placeholder();\r\n    };\r\n\r\n    // Layout functionality\r\n    var uiLayout = function() {\r\n        // Resizes #main-container min height (push footer to the bottom)\r\n        var $resizeTimeout;\r\n\r\n        if ($lMain.length) {\r\n            uiHandleMain();\r\n\r\n            jQuery(window).on('resize orientationchange', function(){\r\n                clearTimeout($resizeTimeout);\r\n\r\n                $resizeTimeout = setTimeout(function(){\r\n                    uiHandleMain();\r\n                }, 150);\r\n            });\r\n        }\r\n\r\n        // Init sidebar and side overlay custom scrolling\r\n        uiHandleScroll('init');\r\n\r\n        // Init transparent header functionality (solid on scroll - used in frontend)\r\n        if ($lPage.hasClass('header-navbar-fixed') && $lPage.hasClass('header-navbar-transparent')) {\r\n            jQuery(window).on('scroll', function(){\r\n                if (jQuery(this).scrollTop() > 20) {\r\n                    $lPage.addClass('header-navbar-scroll');\r\n                } else {\r\n                    $lPage.removeClass('header-navbar-scroll');\r\n                }\r\n            });\r\n        }\r\n\r\n        // Call layout API on button click\r\n        jQuery('[data-toggle=\"layout\"]').on('click', function(){\r\n            var $btn = jQuery(this);\r\n\r\n            uiLayoutApi($btn.data('action'));\r\n\r\n            if ($lHtml.hasClass('no-focus')) {\r\n                $btn.blur();\r\n            }\r\n        });\r\n    };\r\n\r\n    // Resizes #main-container to fill empty space if exists\r\n    var uiHandleMain = function() {\r\n        var $hWindow     = jQuery(window).height();\r\n        var $hHeader     = $lHeader.outerHeight();\r\n        var $hFooter     = $lFooter.outerHeight();\r\n\r\n        if ($lPage.hasClass('header-navbar-fixed')) {\r\n            $lMain.css('min-height', $hWindow - $hFooter);\r\n        } else {\r\n            $lMain.css('min-height', $hWindow - ($hHeader + $hFooter));\r\n        }\r\n    };\r\n\r\n    // Handles sidebar and side overlay custom scrolling functionality\r\n    var uiHandleScroll = function($mode) {\r\n        var $windowW = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;\r\n\r\n        // Init scrolling\r\n        if ($mode === 'init') {\r\n            // Init scrolling only if required the first time\r\n            uiHandleScroll();\r\n\r\n            // Handle scrolling on resize or orientation change\r\n            var $sScrollTimeout;\r\n\r\n            jQuery(window).on('resize orientationchange', function(){\r\n                clearTimeout($sScrollTimeout);\r\n\r\n                $sScrollTimeout = setTimeout(function(){\r\n                    uiHandleScroll();\r\n                }, 150);\r\n            });\r\n        } else {\r\n            // If screen width is greater than 991 pixels and .side-scroll is added to #page-container\r\n            if ($windowW > 991 && $lPage.hasClass('side-scroll')) {\r\n                // Turn scroll lock off (sidebar and side overlay - slimScroll will take care of it)\r\n                jQuery($lSidebar).scrollLock('off');\r\n                jQuery($lSideOverlay).scrollLock('off');\r\n\r\n                // If sidebar scrolling does not exist init it..\r\n                if ($lSidebarScroll.length && (!$lSidebarScroll.parent('.slimScrollDiv').length)) {\r\n                    $lSidebarScroll.slimScroll({\r\n                        height: $lSidebar.outerHeight(),\r\n                        color: '#fff',\r\n                        size: '5px',\r\n                        opacity : .35,\r\n                        wheelStep : 15,\r\n                        distance : '2px',\r\n                        railVisible: false,\r\n                        railOpacity: 1\r\n                    });\r\n                }\r\n                else { // ..else resize scrolling height\r\n                    $lSidebarScroll\r\n                        .add($lSidebarScroll.parent())\r\n                        .css('height', $lSidebar.outerHeight());\r\n                }\r\n\r\n                // If side overlay scrolling does not exist init it..\r\n                if ($lSideOverlayScroll.length && (!$lSideOverlayScroll.parent('.slimScrollDiv').length)) {\r\n                    $lSideOverlayScroll.slimScroll({\r\n                        height: $lSideOverlay.outerHeight(),\r\n                        color: '#000',\r\n                        size: '5px',\r\n                        opacity : .35,\r\n                        wheelStep : 15,\r\n                        distance : '2px',\r\n                        railVisible: false,\r\n                        railOpacity: 1\r\n                    });\r\n                }\r\n                else { // ..else resize scrolling height\r\n                    $lSideOverlayScroll\r\n                        .add($lSideOverlayScroll.parent())\r\n                        .css('height', $lSideOverlay.outerHeight());\r\n                }\r\n            } else {\r\n                // Turn scroll lock on (sidebar and side overlay)\r\n                jQuery($lSidebar).scrollLock();\r\n                jQuery($lSideOverlay).scrollLock();\r\n\r\n                // If sidebar scrolling exists destroy it..\r\n                if ($lSidebarScroll.length && $lSidebarScroll.parent('.slimScrollDiv').length) {\r\n                    $lSidebarScroll\r\n                        .slimScroll({destroy: true});\r\n                    $lSidebarScroll\r\n                        .attr('style', '');\r\n                }\r\n\r\n                // If side overlay scrolling exists destroy it..\r\n                if ($lSideOverlayScroll.length && $lSideOverlayScroll.parent('.slimScrollDiv').length) {\r\n                    $lSideOverlayScroll\r\n                        .slimScroll({destroy: true});\r\n                    $lSideOverlayScroll\r\n                        .attr('style', '');\r\n                }\r\n            }\r\n        }\r\n    };\r\n\r\n    // Layout API\r\n    var uiLayoutApi = function($mode) {\r\n        var $windowW = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;\r\n\r\n        // Mode selection\r\n        switch($mode) {\r\n            case 'sidebar_pos_toggle':\r\n                $lPage.toggleClass('sidebar-l sidebar-r');\r\n                break;\r\n            case 'sidebar_pos_left':\r\n                $lPage\r\n                    .removeClass('sidebar-r')\r\n                    .addClass('sidebar-l');\r\n                break;\r\n            case 'sidebar_pos_right':\r\n                $lPage\r\n                    .removeClass('sidebar-l')\r\n                    .addClass('sidebar-r');\r\n                break;\r\n            case 'sidebar_toggle':\r\n                if ($windowW > 991) {\r\n                    $lPage.toggleClass('sidebar-o');\r\n                } else {\r\n                    $lPage.toggleClass('sidebar-o-xs');\r\n                }\r\n                break;\r\n            case 'sidebar_open':\r\n                if ($windowW > 991) {\r\n                    $lPage.addClass('sidebar-o');\r\n                } else {\r\n                    $lPage.addClass('sidebar-o-xs');\r\n                }\r\n                break;\r\n            case 'sidebar_close':\r\n                if ($windowW > 991) {\r\n                    $lPage.removeClass('sidebar-o');\r\n                } else {\r\n                    $lPage.removeClass('sidebar-o-xs');\r\n                }\r\n                break;\r\n            case 'sidebar_mini_toggle':\r\n                if ($windowW > 991) {\r\n                    $lPage.toggleClass('sidebar-mini');\r\n                }\r\n                break;\r\n            case 'sidebar_mini_on':\r\n                if ($windowW > 991) {\r\n                    $lPage.addClass('sidebar-mini');\r\n                }\r\n                break;\r\n            case 'sidebar_mini_off':\r\n                if ($windowW > 991) {\r\n                    $lPage.removeClass('sidebar-mini');\r\n                }\r\n                break;\r\n            case 'side_overlay_toggle':\r\n                $lPage.toggleClass('side-overlay-o');\r\n                break;\r\n            case 'side_overlay_open':\r\n                $lPage.addClass('side-overlay-o');\r\n                break;\r\n            case 'side_overlay_close':\r\n                $lPage.removeClass('side-overlay-o');\r\n                break;\r\n            case 'side_overlay_hoverable_toggle':\r\n                $lPage.toggleClass('side-overlay-hover');\r\n                break;\r\n            case 'side_overlay_hoverable_on':\r\n                $lPage.addClass('side-overlay-hover');\r\n                break;\r\n            case 'side_overlay_hoverable_off':\r\n                $lPage.removeClass('side-overlay-hover');\r\n                break;\r\n            case 'header_fixed_toggle':\r\n                $lPage.toggleClass('header-navbar-fixed');\r\n                break;\r\n            case 'header_fixed_on':\r\n                $lPage.addClass('header-navbar-fixed');\r\n                break;\r\n            case 'header_fixed_off':\r\n                $lPage.removeClass('header-navbar-fixed');\r\n                break;\r\n            case 'side_scroll_toggle':\r\n                $lPage.toggleClass('side-scroll');\r\n                uiHandleScroll();\r\n                break;\r\n            case 'side_scroll_on':\r\n                $lPage.addClass('side-scroll');\r\n                uiHandleScroll();\r\n                break;\r\n            case 'side_scroll_off':\r\n                $lPage.removeClass('side-scroll');\r\n                uiHandleScroll();\r\n                break;\r\n            default:\r\n                return false;\r\n        }\r\n    };\r\n\r\n    // Main navigation functionality\r\n    var uiNav = function() {\r\n        // When a submenu link is clicked\r\n        jQuery('[data-toggle=\"nav-submenu\"]').on('click', function(e){\r\n            // Stop default behaviour\r\n            e.stopPropagation();\r\n\r\n            // Get link\r\n            var $link = jQuery(this);\r\n\r\n            // Get link's parent\r\n            var $parentLi = $link.parent('li');\r\n\r\n            if ($parentLi.hasClass('open')) { // If submenu is open, close it..\r\n                $parentLi.removeClass('open');\r\n            } else { // .. else if submenu is closed, close all other (same level) submenus first before open it\r\n                $link\r\n                    .closest('ul')\r\n                    .find('> li')\r\n                    .removeClass('open');\r\n\r\n                $parentLi\r\n                    .addClass('open');\r\n            }\r\n\r\n            // Remove focus from submenu link\r\n            if ($lHtml.hasClass('no-focus')) {\r\n                $link.blur();\r\n            }\r\n        });\r\n    };\r\n\r\n    // Blocks options functionality\r\n    var uiBlocks = function() {\r\n        // Init default icons fullscreen and content toggle buttons\r\n        uiBlocksApi(false, 'init');\r\n\r\n        // Call blocks API on option button click\r\n        jQuery('[data-toggle=\"block-option\"]').on('click', function(){\r\n            uiBlocksApi(jQuery(this).parents('.block'), jQuery(this).data('action'));\r\n        });\r\n    };\r\n\r\n    // Blocks API\r\n    var uiBlocksApi = function($block, $mode) {\r\n        // Set default icons for fullscreen and content toggle buttons\r\n        var $iconFullscreen         = 'si si-size-fullscreen';\r\n        var $iconFullscreenActive   = 'si si-size-actual';\r\n        var $iconContent            = 'si si-arrow-up';\r\n        var $iconContentActive      = 'si si-arrow-down';\r\n\r\n        if ($mode === 'init') {\r\n            // Auto add the default toggle icons to fullscreen and content toggle buttons\r\n            jQuery('[data-toggle=\"block-option\"][data-action=\"fullscreen_toggle\"]').each(function(){\r\n                var $this = jQuery(this);\r\n\r\n                $this.html('<i class=\"' + (jQuery(this).closest('.block').hasClass('block-opt-fullscreen') ? $iconFullscreenActive : $iconFullscreen) + '\"></i>');\r\n            });\r\n\r\n            jQuery('[data-toggle=\"block-option\"][data-action=\"content_toggle\"]').each(function(){\r\n                var $this = jQuery(this);\r\n\r\n                $this.html('<i class=\"' + ($this.closest('.block').hasClass('block-opt-hidden') ? $iconContentActive : $iconContent) + '\"></i>');\r\n            });\r\n        } else {\r\n            // Get block element\r\n            var $elBlock = ($block instanceof jQuery) ? $block : jQuery($block);\r\n\r\n            // If element exists, procceed with blocks functionality\r\n            if ($elBlock.length) {\r\n                // Get block option buttons if exist (need them to update their icons)\r\n                var $btnFullscreen  = jQuery('[data-toggle=\"block-option\"][data-action=\"fullscreen_toggle\"]', $elBlock);\r\n                var $btnToggle      = jQuery('[data-toggle=\"block-option\"][data-action=\"content_toggle\"]', $elBlock);\r\n\r\n                // Mode selection\r\n                switch($mode) {\r\n                    case 'fullscreen_toggle':\r\n                        $elBlock.toggleClass('block-opt-fullscreen');\r\n\r\n                        // Enable/disable scroll lock to block\r\n                        $elBlock.hasClass('block-opt-fullscreen') ? jQuery($elBlock).scrollLock() : jQuery($elBlock).scrollLock('off');\r\n\r\n                        // Update block option icon\r\n                        if ($btnFullscreen.length) {\r\n                            if ($elBlock.hasClass('block-opt-fullscreen')) {\r\n                                jQuery('i', $btnFullscreen)\r\n                                    .removeClass($iconFullscreen)\r\n                                    .addClass($iconFullscreenActive);\r\n                            } else {\r\n                                jQuery('i', $btnFullscreen)\r\n                                    .removeClass($iconFullscreenActive)\r\n                                    .addClass($iconFullscreen);\r\n                            }\r\n                        }\r\n                        break;\r\n                    case 'fullscreen_on':\r\n                        $elBlock.addClass('block-opt-fullscreen');\r\n\r\n                        // Enable scroll lock to block\r\n                        jQuery($elBlock).scrollLock();\r\n\r\n                        // Update block option icon\r\n                        if ($btnFullscreen.length) {\r\n                            jQuery('i', $btnFullscreen)\r\n                                .removeClass($iconFullscreen)\r\n                                .addClass($iconFullscreenActive);\r\n                        }\r\n                        break;\r\n                    case 'fullscreen_off':\r\n                        $elBlock.removeClass('block-opt-fullscreen');\r\n\r\n                        // Disable scroll lock to block\r\n                        jQuery($elBlock).scrollLock('off');\r\n\r\n                        // Update block option icon\r\n                        if ($btnFullscreen.length) {\r\n                            jQuery('i', $btnFullscreen)\r\n                                .removeClass($iconFullscreenActive)\r\n                                .addClass($iconFullscreen);\r\n                        }\r\n                        break;\r\n                    case 'content_toggle':\r\n                        $elBlock.toggleClass('block-opt-hidden');\r\n\r\n                        // Update block option icon\r\n                        if ($btnToggle.length) {\r\n                            if ($elBlock.hasClass('block-opt-hidden')) {\r\n                                jQuery('i', $btnToggle)\r\n                                    .removeClass($iconContent)\r\n                                    .addClass($iconContentActive);\r\n                            } else {\r\n                                jQuery('i', $btnToggle)\r\n                                    .removeClass($iconContentActive)\r\n                                    .addClass($iconContent);\r\n                            }\r\n                        }\r\n                        break;\r\n                    case 'content_hide':\r\n                        $elBlock.addClass('block-opt-hidden');\r\n\r\n                        // Update block option icon\r\n                        if ($btnToggle.length) {\r\n                            jQuery('i', $btnToggle)\r\n                                .removeClass($iconContent)\r\n                                .addClass($iconContentActive);\r\n                        }\r\n                        break;\r\n                    case 'content_show':\r\n                        $elBlock.removeClass('block-opt-hidden');\r\n\r\n                        // Update block option icon\r\n                        if ($btnToggle.length) {\r\n                            jQuery('i', $btnToggle)\r\n                                .removeClass($iconContentActive)\r\n                                .addClass($iconContent);\r\n                        }\r\n                        break;\r\n                    case 'refresh_toggle':\r\n                        $elBlock.toggleClass('block-opt-refresh');\r\n\r\n                        // Return block to normal state if the demostration mode is on in the refresh option button - data-action-mode=\"demo\"\r\n                        if (jQuery('[data-toggle=\"block-option\"][data-action=\"refresh_toggle\"][data-action-mode=\"demo\"]', $elBlock).length) {\r\n                            setTimeout(function(){\r\n                                $elBlock.removeClass('block-opt-refresh');\r\n                            }, 2000);\r\n                        }\r\n                        break;\r\n                    case 'state_loading':\r\n                        $elBlock.addClass('block-opt-refresh');\r\n                        break;\r\n                    case 'state_normal':\r\n                        $elBlock.removeClass('block-opt-refresh');\r\n                        break;\r\n                    case 'close':\r\n                        $elBlock.hide();\r\n                        break;\r\n                    case 'open':\r\n                        $elBlock.show();\r\n                        break;\r\n                    default:\r\n                        return false;\r\n                }\r\n            }\r\n        }\r\n    };\r\n\r\n    // Material inputs helper\r\n    var uiForms = function() {\r\n        jQuery('.form-material.floating > .form-control').each(function(){\r\n            var $input  = jQuery(this);\r\n            var $parent = $input.parent('.form-material');\r\n\r\n            if ($input.val()) {\r\n                $parent.addClass('open');\r\n            }\r\n\r\n            $input.on('change', function(){\r\n                if ($input.val()) {\r\n                    $parent.addClass('open');\r\n                } else {\r\n                    $parent.removeClass('open');\r\n                }\r\n            });\r\n        });\r\n    };\r\n\r\n    // Set active color themes functionality\r\n    var uiHandleTheme = function() {\r\n        var $cssTheme = jQuery('#css-theme');\r\n\r\n        // Set the active color theme link as active\r\n        jQuery('[data-toggle=\"theme\"][data-theme=\"' + ($cssTheme.length ? $cssTheme.attr('href') : 'default') + '\"]')\r\n            .parent('li')\r\n            .addClass('active');\r\n\r\n        // When a color theme link is clicked\r\n        jQuery('[data-toggle=\"theme\"]').on('click', function(){\r\n            var $this   = jQuery(this);\r\n            var $theme  = $this.data('theme');\r\n\r\n            // Set this color theme link as active\r\n            jQuery('[data-toggle=\"theme\"]')\r\n                .parent('li')\r\n                .removeClass('active');\r\n\r\n            jQuery('[data-toggle=\"theme\"][data-theme=\"' + $theme + '\"]')\r\n                .parent('li')\r\n                .addClass('active');\r\n\r\n            // Update color theme\r\n            if ($theme === 'default') {\r\n                if ($cssTheme.length) {\r\n                    $cssTheme.remove();\r\n                }\r\n            } else {\r\n                if ($cssTheme.length) {\r\n                    $cssTheme.attr('href', $theme);\r\n                } else {\r\n                    jQuery('#css-main')\r\n                        .after('<link rel=\"stylesheet\" id=\"css-theme\" href=\"' + $theme + '\">');\r\n                }\r\n            }\r\n\r\n            $cssTheme = jQuery('#css-theme');\r\n        });\r\n    };\r\n\r\n    // Scroll to element animation helper\r\n    var uiScrollTo = function() {\r\n        jQuery('[data-toggle=\"scroll-to\"]').on('click', function(){\r\n            var $this   = jQuery(this);\r\n            var $target = $this.data('target');\r\n            var $speed  = $this.data('speed') ? $this.data('speed') : 1000;\r\n\r\n            jQuery('html, body').animate({\r\n                scrollTop: jQuery($target).offset().top\r\n            }, $speed);\r\n        });\r\n    };\r\n\r\n    // Toggle class helper\r\n    var uiToggleClass = function() {\r\n        jQuery('[data-toggle=\"class-toggle\"]').on('click', function(){\r\n            var $el = jQuery(this);\r\n\r\n            jQuery($el.data('target').toString()).toggleClass($el.data('class').toString());\r\n\r\n            if ($lHtml.hasClass('no-focus')) {\r\n                $el.blur();\r\n            }\r\n        });\r\n    };\r\n\r\n    // Add the correct copyright year\r\n    var uiYearCopy = function() {\r\n        var $date       = new Date();\r\n        var $yearCopy   = jQuery('.js-year-copy');\r\n\r\n        if ($date.getFullYear() === 2015) {\r\n            $yearCopy.html('2015');\r\n        } else {\r\n            $yearCopy.html('2015-' + $date.getFullYear().toString().substr(2,2));\r\n        }\r\n    };\r\n\r\n    /*\r\n     ********************************************************************************************\r\n     *\r\n     * UI HELPERS (ON DEMAND)\r\n     *\r\n     * Third party plugin inits or various custom user interface helpers to extend functionality\r\n     * They need to be called in a page to be initialized. They are included here to be easy to\r\n     * init them on demand on multiple pages (usually repeated init code in common components)\r\n     *\r\n     ********************************************************************************************\r\n     */\r\n\r\n    /*\r\n     * Print Page functionality\r\n     *\r\n     * App.initHelper('print-page');\r\n     *\r\n     */\r\n    var uiHelperPrint = function() {\r\n        // Store all #page-container classes\r\n        var $pageCls = $lPage.prop('class');\r\n\r\n        // Remove all classes from #page-container\r\n        $lPage.prop('class', '');\r\n\r\n        // Print the page\r\n        window.print();\r\n\r\n        // Restore all #page-container classes\r\n        $lPage.prop('class', $pageCls);\r\n    };\r\n\r\n    /*\r\n     * Custom Table functionality such as section toggling or checkable rows\r\n     *\r\n     * App.initHelper('table-tools');\r\n     *\r\n     */\r\n\r\n    // Table sections functionality\r\n    var uiHelperTableToolsSections = function(){\r\n        var $table      = jQuery('.js-table-sections');\r\n        var $tableRows  = jQuery('.js-table-sections-header > tr', $table);\r\n\r\n        // When a row is clicked in tbody.js-table-sections-header\r\n        $tableRows.click(function(e) {\r\n            var $row    = jQuery(this);\r\n            var $tbody  = $row.parent('tbody');\r\n\r\n            if (! $tbody.hasClass('open')) {\r\n                jQuery('tbody', $table).removeClass('open');\r\n            }\r\n\r\n            $tbody.toggleClass('open');\r\n        });\r\n    };\r\n\r\n    // Checkable table functionality\r\n    var uiHelperTableToolsCheckable = function() {\r\n        var $table = jQuery('.js-table-checkable');\r\n\r\n        // When a checkbox is clicked in thead\r\n        jQuery('thead input:checkbox', $table).click(function() {\r\n            var $checkedStatus = jQuery(this).prop('checked');\r\n\r\n            // Check or uncheck all checkboxes in tbody\r\n            jQuery('tbody input:checkbox', $table).each(function() {\r\n                var $checkbox = jQuery(this);\r\n\r\n                $checkbox.prop('checked', $checkedStatus);\r\n                uiHelperTableToolscheckRow($checkbox, $checkedStatus);\r\n            });\r\n        });\r\n\r\n        // When a checkbox is clicked in tbody\r\n        jQuery('tbody input:checkbox', $table).click(function() {\r\n            var $checkbox = jQuery(this);\r\n\r\n            uiHelperTableToolscheckRow($checkbox, $checkbox.prop('checked'));\r\n        });\r\n\r\n        // When a row is clicked in tbody\r\n        jQuery('tbody > tr', $table).click(function(e) {\r\n            if (e.target.type !== 'checkbox'\r\n                    && e.target.type !== 'button'\r\n                    && e.target.tagName.toLowerCase() !== 'a'\r\n                    && !jQuery(e.target).parent('label').length) {\r\n                var $checkbox       = jQuery('input:checkbox', this);\r\n                var $checkedStatus  = $checkbox.prop('checked');\r\n\r\n                $checkbox.prop('checked', ! $checkedStatus);\r\n                uiHelperTableToolscheckRow($checkbox, ! $checkedStatus);\r\n            }\r\n        });\r\n    };\r\n\r\n    // Checkable table functionality helper - Checks or unchecks table row\r\n    var uiHelperTableToolscheckRow = function($checkbox, $checkedStatus) {\r\n        if ($checkedStatus) {\r\n            $checkbox\r\n                .closest('tr')\r\n                .addClass('active');\r\n        } else {\r\n            $checkbox\r\n                .closest('tr')\r\n                .removeClass('active');\r\n        }\r\n    };\r\n\r\n    /*\r\n     * jQuery Appear, for more examples you can check out https://github.com/bas2k/jquery.appear\r\n     *\r\n     * App.initHelper('appear');\r\n     *\r\n     */\r\n    var uiHelperAppear = function(){\r\n        // Add a specific class on elements (when they become visible on scrolling)\r\n        jQuery('[data-toggle=\"appear\"]').each(function(){\r\n            var $windowW    = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;\r\n            var $this       = jQuery(this);\r\n            var $class      = $this.data('class') ? $this.data('class') : 'animated fadeIn';\r\n            var $offset     = $this.data('offset') ? $this.data('offset') : 0;\r\n            var $timeout    = ($lHtml.hasClass('ie9') || $windowW < 992) ? 0 : ($this.data('timeout') ? $this.data('timeout') : 0);\r\n\r\n            $this.appear(function() {\r\n                setTimeout(function(){\r\n                    $this\r\n                        .removeClass('visibility-hidden')\r\n                        .addClass($class);\r\n                }, $timeout);\r\n            },{accY: $offset});\r\n        });\r\n    };\r\n\r\n    /*\r\n     * jQuery Appear + jQuery countTo, for more examples you can check out https://github.com/bas2k/jquery.appear and https://github.com/mhuggins/jquery-countTo\r\n     *\r\n     * App.initHelper('appear-countTo');\r\n     *\r\n     */\r\n    var uiHelperAppearCountTo = function(){\r\n        // Init counter functionality\r\n        jQuery('[data-toggle=\"countTo\"]').each(function(){\r\n            var $this       = jQuery(this);\r\n            var $after      = $this.data('after');\r\n            var $speed      = $this.data('speed') ? $this.data('speed') : 1500;\r\n            var $interval   = $this.data('interval') ? $this.data('interval') : 15;\r\n\r\n            $this.appear(function() {\r\n                $this.countTo({\r\n                    speed: $speed,\r\n                    refreshInterval: $interval,\r\n                    onComplete: function() {\r\n                        if($after) {\r\n                            $this.html($this.html() + $after);\r\n                        }\r\n                    }\r\n                });\r\n            });\r\n        });\r\n    };\r\n\r\n    /*\r\n     ********************************************************************************************\r\n     *\r\n     * All the following helpers require each plugin's resources (JS, CSS) to be included in order to work\r\n     *\r\n     ********************************************************************************************\r\n     */\r\n\r\n    /*\r\n     * Magnific Popup functionality, for more examples you can check out http://dimsemenov.com/plugins/magnific-popup/\r\n     *\r\n     * App.initHelper('magnific-popup');\r\n     *\r\n     */\r\n    var uiHelperMagnific = function(){\r\n        // Simple Gallery init\r\n        jQuery('.js-gallery').each(function(){\r\n            jQuery(this).magnificPopup({\r\n                delegate: 'a.img-link',\r\n                type: 'image',\r\n                gallery: {\r\n                    enabled: true\r\n                }\r\n            });\r\n        });\r\n\r\n        // Advanced Gallery init\r\n        jQuery('.js-gallery-advanced').each(function(){\r\n            jQuery(this).magnificPopup({\r\n                delegate: 'a.img-lightbox',\r\n                type: 'image',\r\n                gallery: {\r\n                    enabled: true\r\n                }\r\n            });\r\n        });\r\n    };\r\n\r\n    /*\r\n     * CKEditor init, for more examples you can check out http://ckeditor.com/\r\n     *\r\n     * App.initHelper('ckeditor');\r\n     *\r\n     */\r\n    var uiHelperCkeditor = function(){\r\n        // Disable auto init when contenteditable property is set to true\r\n        CKEDITOR.disableAutoInline = true;\r\n\r\n        // Init inline text editor\r\n        CKEDITOR.inline('js-ckeditor-inline');\r\n\r\n        // Init full text editor\r\n        CKEDITOR.replace('js-ckeditor');\r\n    };\r\n\r\n    /*\r\n     * Summernote init, for more examples you can check out http://summernote.org/\r\n     *\r\n     * App.initHelper('summernote');\r\n     *\r\n     */\r\n    var uiHelperSummernote = function(){\r\n        // Init text editor in air mode (inline)\r\n        jQuery('.js-summernote-air').summernote({\r\n            airMode: true\r\n          });\r\n\r\n        // Init full text editor\r\n        jQuery('.js-summernote').summernote({\r\n            height: 350,\r\n            minHeight: null,\r\n            maxHeight: null\r\n        });\r\n    };\r\n\r\n    /*\r\n     * Slick init, for more examples you can check out http://kenwheeler.github.io/slick/\r\n     *\r\n     * App.initHelper('slick');\r\n     *\r\n     */\r\n    var uiHelperSlick = function(){\r\n        // Get each slider element (with .js-slider class)\r\n        jQuery('.js-slider').each(function(){\r\n            var $slider = jQuery(this);\r\n\r\n            // Get each slider's init data\r\n            var $sliderArrows       = $slider.data('slider-arrows') ? $slider.data('slider-arrows') : false;\r\n            var $sliderDots         = $slider.data('slider-dots') ? $slider.data('slider-dots') : false;\r\n            var $sliderNum          = $slider.data('slider-num') ? $slider.data('slider-num') : 1;\r\n            var $sliderAuto         = $slider.data('slider-autoplay') ? $slider.data('slider-autoplay') : false;\r\n            var $sliderAutoSpeed    = $slider.data('slider-autoplay-speed') ? $slider.data('slider-autoplay-speed') : 3000;\r\n\r\n            // Init slick slider\r\n            $slider.slick({\r\n                arrows: $sliderArrows,\r\n                dots: $sliderDots,\r\n                slidesToShow: $sliderNum,\r\n                autoplay: $sliderAuto,\r\n                autoplaySpeed: $sliderAutoSpeed\r\n            });\r\n        });\r\n    };\r\n\r\n    /*\r\n     * Bootstrap Datepicker init, for more examples you can check out https://github.com/eternicode/bootstrap-datepicker\r\n     *\r\n     * App.initHelper('datepicker');\r\n     *\r\n     */\r\n    var uiHelperDatepicker = function(){\r\n        // Init datepicker (with .js-datepicker and .input-daterange class)\r\n        jQuery('.js-datepicker').add('.input-daterange').datepicker({\r\n            weekStart: 1,\r\n            autoclose: true,\r\n            todayHighlight: true\r\n        });\r\n    };\r\n\r\n    /*\r\n     * Bootstrap Colorpicker init, for more examples you can check out http://mjolnic.com/bootstrap-colorpicker/\r\n     *\r\n     * App.initHelper('colorpicker');\r\n     *\r\n     */\r\n    var uiHelperColorpicker = function(){\r\n        // Get each colorpicker element (with .js-colorpicker class)\r\n        jQuery('.js-colorpicker').each(function(){\r\n            var $colorpicker = jQuery(this);\r\n\r\n            // Get each colorpicker's init data\r\n            var $colorpickerMode    = $colorpicker.data('colorpicker-mode') ? $colorpicker.data('colorpicker-mode') : 'hex';\r\n            var $colorpickerinline  = $colorpicker.data('colorpicker-inline') ? true : false;\r\n\r\n            // Init colorpicker\r\n            $colorpicker.colorpicker({\r\n                'format': $colorpickerMode,\r\n                'inline': $colorpickerinline\r\n            });\r\n        });\r\n    };\r\n\r\n    /*\r\n     * Masked Inputs, for more examples you can check out http://digitalbush.com/projects/masked-input-plugin/\r\n     *\r\n     * App.initHelper('masked-inputs');\r\n     *\r\n     */\r\n    var uiHelperMaskedInputs = function(){\r\n        // Init Masked Inputs\r\n        // a - Represents an alpha character (A-Z,a-z)\r\n        // 9 - Represents a numeric character (0-9)\r\n        // * - Represents an alphanumeric character (A-Z,a-z,0-9)\r\n        jQuery('.js-masked-date').mask('99/99/9999');\r\n        jQuery('.js-masked-date-dash').mask('99-99-9999');\r\n        jQuery('.js-masked-phone').mask('(999) 999-9999');\r\n        jQuery('.js-masked-phone-ext').mask('(999) 999-9999? x99999');\r\n        jQuery('.js-masked-taxid').mask('99-9999999');\r\n        jQuery('.js-masked-ssn').mask('999-99-9999');\r\n        jQuery('.js-masked-pkey').mask('a*-999-a999');\r\n    };\r\n\r\n    /*\r\n     * Tags Inputs, for more examples you can check out https://github.com/xoxco/jQuery-Tags-Input\r\n     *\r\n     * App.initHelper('tags-inputs');\r\n     *\r\n     */\r\n    var uiHelperTagsInputs = function(){\r\n        // Init Tags Inputs (with .js-tags-input class)\r\n        jQuery('.js-tags-input').tagsInput({\r\n            height: '36px',\r\n            width: '100%',\r\n            defaultText: 'Add tag',\r\n            removeWithBackspace: true,\r\n            delimiter: [',']\r\n        });\r\n    };\r\n\r\n    /*\r\n     * Select2, for more examples you can check out https://github.com/select2/select2\r\n     *\r\n     * App.initHelper('select2');\r\n     *\r\n     */\r\n    var uiHelperSelect2 = function(){\r\n        // Init Select2 (with .js-select2 class)\r\n        jQuery('.js-select2').select2();\r\n    };\r\n\r\n    /*\r\n     * Highlight.js, for more examples you can check out https://highlightjs.org/usage/\r\n     *\r\n     * App.initHelper('highlightjs');\r\n     *\r\n     */\r\n    var uiHelperHighlightjs = function(){\r\n        // Init Highlight.js\r\n        hljs.initHighlightingOnLoad();\r\n    };\r\n\r\n    /*\r\n     * Bootstrap Notify, for more examples you can check out http://bootstrap-growl.remabledesigns.com/\r\n     *\r\n     * App.initHelper('notify');\r\n     *\r\n     */\r\n    var uiHelperNotify = function(){\r\n        // Init notifications (with .js-notify class)\r\n        jQuery('.js-notify').on('click', function(){\r\n            var $notify         = jQuery(this);\r\n            var $notifyMsg      = $notify.data('notify-message');\r\n            var $notifyType     = $notify.data('notify-type') ? $notify.data('notify-type') : 'info';\r\n            var $notifyFrom     = $notify.data('notify-from') ? $notify.data('notify-from') : 'top';\r\n            var $notifyAlign    = $notify.data('notify-align') ? $notify.data('notify-align') : 'right';\r\n            var $notifyIcon     = $notify.data('notify-icon') ? $notify.data('notify-icon') : '';\r\n            var $notifyUrl      = $notify.data('notify-url') ? $notify.data('notify-url') : '';\r\n\r\n            jQuery.notify({\r\n                    icon: $notifyIcon,\r\n                    message: $notifyMsg,\r\n                    url: $notifyUrl\r\n                },\r\n                {\r\n                    element: 'body',\r\n                    type: $notifyType,\r\n                    allow_dismiss: true,\r\n                    newest_on_top: true,\r\n                    showProgressbar: false,\r\n                    placement: {\r\n                        from: $notifyFrom,\r\n                        align: $notifyAlign\r\n                    },\r\n                    offset: 20,\r\n                    spacing: 10,\r\n                    z_index: 1031,\r\n                    delay: 5000,\r\n                    timer: 1000,\r\n                    animate: {\r\n                        enter: 'animated fadeIn',\r\n                        exit: 'animated fadeOutDown'\r\n                    }\r\n                });\r\n        });\r\n    };\r\n\r\n    /*\r\n     * Draggable items with jQuery, for more examples you can check out https://jqueryui.com/sortable/\r\n     *\r\n     * App.initHelper('draggable-items');\r\n     *\r\n     */\r\n    var uiHelperDraggableItems = function(){\r\n        // Init draggable items functionality (with .js-draggable-items class)\r\n        jQuery('.js-draggable-items').sortable({\r\n            connectWith: '.draggable-column',\r\n            items: '.draggable-item',\r\n            opacity: .75,\r\n            handle: '.draggable-handler',\r\n            placeholder: 'draggable-placeholder',\r\n            tolerance: 'pointer',\r\n            start: function(e, ui){\r\n                ui.placeholder.css({\r\n                    'height': ui.item.outerHeight(),\r\n                    'margin-bottom': ui.item.css('margin-bottom')\r\n                });\r\n            }\r\n        });\r\n    };\r\n\r\n    /*\r\n     * Easy Pie Chart, for more examples you can check out http://rendro.github.io/easy-pie-chart/\r\n     *\r\n     * App.initHelper('easy-pie-chart');\r\n     *\r\n     */\r\n    var uiHelperEasyPieChart = function(){\r\n        // Init Easy Pie Charts (with .js-pie-chart class)\r\n        jQuery('.js-pie-chart').easyPieChart({\r\n            barColor: jQuery(this).data('bar-color') ? jQuery(this).data('bar-color') : '#777777',\r\n            trackColor: jQuery(this).data('track-color') ? jQuery(this).data('track-color') : '#eeeeee',\r\n            lineWidth: jQuery(this).data('line-width') ? jQuery(this).data('line-width') : 3,\r\n            size: jQuery(this).data('size') ? jQuery(this).data('size') : '80',\r\n            animate: 750,\r\n            scaleColor: jQuery(this).data('scale-color') ? jQuery(this).data('scale-color') : false\r\n        });\r\n    };\r\n\r\n    return {\r\n        init: function() {\r\n            // Init all vital functions\r\n            uiInit();\r\n            uiLayout();\r\n            uiNav();\r\n            uiBlocks();\r\n            uiForms();\r\n            uiHandleTheme();\r\n            uiToggleClass();\r\n            uiScrollTo();\r\n            uiYearCopy();\r\n        },\r\n        layout: function($mode) {\r\n            uiLayoutApi($mode);\r\n        },\r\n        blocks: function($block, $mode) {\r\n            uiBlocksApi($block, $mode);\r\n        },\r\n        initHelper: function($helper) {\r\n            switch ($helper) {\r\n                case 'print-page':\r\n                    uiHelperPrint();\r\n                    break;\r\n                case 'table-tools':\r\n                    uiHelperTableToolsSections();\r\n                    uiHelperTableToolsCheckable();\r\n                    break;\r\n                case 'appear':\r\n                    uiHelperAppear();\r\n                    break;\r\n                case 'appear-countTo':\r\n                    uiHelperAppearCountTo();\r\n                    break;\r\n                case 'magnific-popup':\r\n                    uiHelperMagnific();\r\n                    break;\r\n                case 'ckeditor':\r\n                    uiHelperCkeditor();\r\n                    break;\r\n                case 'summernote':\r\n                    uiHelperSummernote();\r\n                    break;\r\n                case 'slick':\r\n                    uiHelperSlick();\r\n                    break;\r\n                case 'datepicker':\r\n                    uiHelperDatepicker();\r\n                    break;\r\n                case 'colorpicker':\r\n                    uiHelperColorpicker();\r\n                    break;\r\n                case 'tags-inputs':\r\n                    uiHelperTagsInputs();\r\n                    break;\r\n                case 'masked-inputs':\r\n                    uiHelperMaskedInputs();\r\n                    break;\r\n                case 'select2':\r\n                    uiHelperSelect2();\r\n                    break;\r\n                case 'highlightjs':\r\n                    uiHelperHighlightjs();\r\n                    break;\r\n                case 'notify':\r\n                    uiHelperNotify();\r\n                    break;\r\n                case 'draggable-items':\r\n                    uiHelperDraggableItems();\r\n                    break;\r\n                case 'easy-pie-chart':\r\n                    uiHelperEasyPieChart();\r\n                    break;\r\n                default:\r\n                    return false;\r\n            }\r\n        },\r\n        initHelpers: function($helpers) {\r\n            if ($helpers instanceof Array) {\r\n                for(var $index in $helpers) {\r\n                    App.initHelper($helpers[$index]);\r\n                }\r\n            } else {\r\n                App.initHelper($helpers);\r\n            }\r\n        }\r\n    };\r\n}();\r\n\r\n// Initialize app when page loads\r\njQuery(function(){ App.init(); });"
  },
  {
    "path": "webservice/lalascan_web/app/static/js/pages/base_comp_animations.js",
    "content": "/*\n *  Document   : base_comp_animations.js\n *  Author     : pixelcave\n *  Description: Custom JS code used in Animations Page\n */\n\nvar BaseCompAnimations = function() {\n    // Animation toggle functionality\n    var initAnimationToggle = function(){\n        var $animationClass, $button, $currentSection;\n\n        // On button click\n        jQuery('.js-animation-section button').on('click', function(){\n            $button         = jQuery(this);\n            $animationClass = $button.data('animation-class');\n            $currentSection = $button.parents('.js-animation-section');\n\n            // Update class preview\n            jQuery('.js-animation-preview', $currentSection).html($animationClass);\n\n            // Update animation object classes\n            jQuery('.js-animation-object', $currentSection)\n                .removeClass()\n                .addClass('js-animation-object animated ' + $animationClass);\n        });\n    };\n\n    return {\n        init: function() {\n            // Init animation toggle\n            initAnimationToggle();\n        }\n    };\n}();\n\n// Initialize when page loads\njQuery(function(){ BaseCompAnimations.init(); });"
  },
  {
    "path": "webservice/lalascan_web/app/static/js/pages/base_comp_calendar.js",
    "content": "/*\n *  Document   : base_comp_calendar.js\n *  Author     : pixelcave\n *  Description: Custom JS code used in Calendar Page\n */\n\nvar BaseCompCalendar = function() {\n    // Add new event in the event list\n    var addEvent = function() {\n        var $eventInput      = jQuery('.js-add-event');\n        var $eventInputVal   = '';\n\n        // When the add event form is submitted\n        jQuery('.js-form-add-event').on('submit', function(){\n            $eventInputVal = $eventInput.prop('value'); // Get input value\n\n            // Check if the user entered something\n            if ( $eventInputVal ) {\n                // Add it to the events list\n                jQuery('.js-events')\n                    .prepend('<li class=\"animated fadeInDown\">' +\n                            jQuery('<div />').text($eventInputVal).html() +\n                            '</li>');\n\n                // Clear input field\n                $eventInput.prop('value', '');\n\n                // Re-Init Events\n                initEvents();\n            }\n\n            return false;\n        });\n    };\n\n    // Init drag and drop event functionality\n    var initEvents = function() {\n        jQuery('.js-events')\n            .find('li')\n            .each(function() {\n                var $event = jQuery(this);\n\n                // create an Event Object\n                var $eventObject = {\n                    title: jQuery.trim($event.text()),\n                    color: $event.css('background-color') };\n\n                // store the Event Object in the DOM element so we can get to it later\n                jQuery(this).data('eventObject', $eventObject);\n\n                // make the event draggable using jQuery UI\n                jQuery(this).draggable({\n                    zIndex: 999,\n                    revert: true,\n                    revertDuration: 0\n                });\n            });\n    };\n\n    // Init FullCalendar\n    var initCalendar = function(){\n        var $date    = new Date();\n        var $d       = $date.getDate();\n        var $m       = $date.getMonth();\n        var $y       = $date.getFullYear();\n\n        jQuery('.js-calendar').fullCalendar({\n            firstDay: 1,\n            editable: true,\n            droppable: true,\n            header: {\n                left: 'title',\n                right: 'prev,next month,agendaWeek,agendaDay'\n            },\n            drop: function($date, $allDay) { // this function is called when something is dropped\n                // retrieve the dropped element's stored Event Object\n                var $originalEventObject = jQuery(this).data('eventObject');\n\n                // we need to copy it, so that multiple events don't have a reference to the same object\n                var $copiedEventObject = jQuery.extend({}, $originalEventObject);\n\n                // assign it the date that was reported\n                $copiedEventObject.start = $date;\n\n                // render the event on the calendar\n                // the last `true` argument determines if the event \"sticks\" (http://arshaw.com/fullcalendar/docs/event_rendering/renderEvent/)\n                jQuery('.js-calendar').fullCalendar('renderEvent', $copiedEventObject, true);\n\n                // remove the element from the \"Draggable Events\" list\n                jQuery(this).remove();\n            },\n            events: [\n                {\n                    title: 'Free day',\n                    start: new Date($y, $m, 1),\n                    allDay: true,\n                    color: '#faeab9'\n                },\n                {\n                    title: 'Skype Meeting',\n                    start: new Date($y, $m, 2)\n                },\n                {\n                    title: 'Secret Project',\n                    start: new Date($y, $m, 5),\n                    end: new Date($y, $m, 8),\n                    allDay: true,\n                    color: '#fac5a5'\n                },\n                {\n                    title: 'Work',\n                    start: new Date($y, $m, 9),\n                    end: new Date($y, $m, 11),\n                    allDay: true,\n                    color: '#fac5a5'\n                },\n                {\n                    id: 999,\n                    title: 'Biking (repeated)',\n                    start: new Date($y, $m, $d - 3, 15, 0)\n                },\n                {\n                    id: 999,\n                    title: 'Biking (repeated)',\n                    start: new Date($y, $m, $d + 2, 15, 0)\n                },\n                {\n                    title: 'Landing Template',\n                    start: new Date($y, $m, $d - 1),\n                    end: new Date($y, $m, $d - 1),\n                    allDay: true,\n                    color: '#faeab9'\n                },\n                {\n                    title: 'Lunch Meeting',\n                    start: new Date($y, $m, $d + 5, 14, 00),\n                    color: '#fac5a5'\n                },\n                {\n                    title: 'Admin Template',\n                    start: new Date($y, $m, $d, 9, 0),\n                    end: new Date($y, $m, $d, 12, 0),\n                    allDay: true,\n                    color: '#faeab9'\n                },\n                {\n                    title: 'Party',\n                    start: new Date($y, $m, 15),\n                    end: new Date($y, $m, 16),\n                    allDay: true,\n                    color: '#faeab9'\n                },\n                {\n                    title: 'Reading',\n                    start: new Date($y, $m, $d + 8, 21, 0),\n                    end: new Date($y, $m, $d + 8, 23, 30),\n                    allDay: true\n                },\n                {\n                    title: 'Follow me on Twitter',\n                    start: new Date($y, $m, 23),\n                    end: new Date($y, $m, 25),\n                    allDay: true,\n                    url: 'http://twitter.com/pixelcave',\n                    color: '#32ccfe'\n                }\n            ]\n        });\n    };\n\n    return {\n        init: function () {\n            // Add Event functionality\n            addEvent();\n\n            // FullCalendar, for more examples you can check out http://fullcalendar.io/\n            initEvents();\n            initCalendar();\n        }\n    };\n}();\n\n// Initialize when page loads\njQuery(function(){ BaseCompCalendar.init(); });"
  },
  {
    "path": "webservice/lalascan_web/app/static/js/pages/base_comp_charts.js",
    "content": "/*\n *  Document   : base_comp_charts.js\n *  Author     : pixelcave\n *  Description: Custom JS code used in Charts Page\n */\n\nvar BaseCompCharts = function() {\n    // Chart.js Charts, for more examples you can check out http://www.chartjs.org/docs\n    var initChartsChartJS = function () {\n        // Get Chart Containers\n        var $chartLinesCon  = jQuery('.js-chartjs-lines')[0].getContext('2d');\n        var $chartBarsCon   = jQuery('.js-chartjs-bars')[0].getContext('2d');\n        var $chartRadarCon  = jQuery('.js-chartjs-radar')[0].getContext('2d');\n        var $chartPolarCon  = jQuery('.js-chartjs-polar')[0].getContext('2d');\n        var $chartPieCon    = jQuery('.js-chartjs-pie')[0].getContext('2d');\n        var $chartDonutCon  = jQuery('.js-chartjs-donut')[0].getContext('2d');\n\n        // Set Chart and Chart Data variables\n        var $chartLines, $chartBars, $chartRadar, $chartPolar, $chartPie, $chartDonut;\n        var $chartLinesBarsRadarData, $chartPolarPieDonutData;\n\n        // Set global chart options\n        var $globalOptions = {\n            scaleFontFamily: \"'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif\",\n            scaleFontColor: '#999',\n            scaleFontStyle: '600',\n            tooltipTitleFontFamily: \"'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif\",\n            tooltipCornerRadius: 3,\n            maintainAspectRatio: false,\n            responsive: true\n        };\n\n        // Lines/Bar/Radar Chart Data\n        var $chartLinesBarsRadarData = {\n            labels: ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'],\n            datasets: [\n                {\n                    label: 'Last Week',\n                    fillColor: 'rgba(220,220,220,.3)',\n                    strokeColor: 'rgba(220,220,220,1)',\n                    pointColor: 'rgba(220,220,220,1)',\n                    pointStrokeColor: '#fff',\n                    pointHighlightFill: '#fff',\n                    pointHighlightStroke: 'rgba(220,220,220,1)',\n                    data: [30, 32, 40, 45, 43, 38, 55]\n                },\n                {\n                    label: 'This Week',\n                    fillColor: 'rgba(171, 227, 125, .3)',\n                    strokeColor: 'rgba(171, 227, 125, 1)',\n                    pointColor: 'rgba(171, 227, 125, 1)',\n                    pointStrokeColor: '#fff',\n                    pointHighlightFill: '#fff',\n                    pointHighlightStroke: 'rgba(171, 227, 125, 1)',\n                    data: [15, 16, 20, 25, 23, 25, 32]\n                }\n            ]\n        };\n\n        // Polar/Pie/Donut Data\n        var $chartPolarPieDonutData = [\n            {\n                value: 56,\n                color: 'rgba(171, 227, 125, 1)',\n                highlight: 'rgba(171, 227, 125, .75)',\n                label: 'Earnings'\n            },\n            {\n                value: 22,\n                color: 'rgba(250, 219, 125, 1)',\n                highlight: 'rgba(250, 219, 125, .75)',\n                label: 'Sales'\n            },\n            {\n                value: 22,\n                color: 'rgba(117, 176, 235, 1)',\n                highlight: 'rgba(117, 176, 235, .75)',\n                label: 'Tickets'\n            }\n        ];\n\n        // Init Charts\n        $chartLines = new Chart($chartLinesCon).Line($chartLinesBarsRadarData, $globalOptions);\n        $chartBars  = new Chart($chartBarsCon).Bar($chartLinesBarsRadarData, $globalOptions);\n        $chartRadar = new Chart($chartRadarCon).Radar($chartLinesBarsRadarData, $globalOptions);\n        $chartPolar = new Chart($chartPolarCon).PolarArea($chartPolarPieDonutData, $globalOptions);\n        $chartPie   = new Chart($chartPieCon).Pie($chartPolarPieDonutData, $globalOptions);\n        $chartDonut = new Chart($chartDonutCon).Doughnut($chartPolarPieDonutData, $globalOptions);\n    };\n\n    // jQuery Sparkline Charts, for more examples you can check out http://omnipotent.net/jquery.sparkline/#s-docs\n    var initChartsSparkline = function(){\n        // Bar Charts\n        var $barOptions = {\n            type: 'bar',\n            barWidth: 8,\n            barSpacing: 6,\n            height: '70px',\n            barColor: '#fadb7d',\n            tooltipPrefix: '',\n            tooltipSuffix: ' Tickets',\n            tooltipFormat: '{{prefix}}{{value}}{{suffix}}'\n        };\n        jQuery('.js-slc-bar1').sparkline('html', $barOptions);\n\n        $barOptions['barColor']         = '#abe37d';\n        $barOptions['tooltipPrefix']    = '$ ';\n        $barOptions['tooltipSuffix']    = '';\n        jQuery('.js-slc-bar2').sparkline('html', $barOptions);\n\n        $barOptions['barColor']         = '#faad7d';\n        $barOptions['tooltipPrefix']    = '';\n        $barOptions['tooltipSuffix']    = ' Sales';\n        jQuery('.js-slc-bar3').sparkline('html', $barOptions);\n\n        // Line Charts\n        var $lineOptions = {\n            type: 'line',\n            width: '120px',\n            height: '70px',\n            tooltipOffsetX: -25,\n            tooltipOffsetY: 20,\n            lineColor: '#fadb7d',\n            fillColor: '#fadb7d',\n            spotColor: '#777777',\n            minSpotColor: '#777777',\n            maxSpotColor: '#777777',\n            highlightSpotColor: '#777777',\n            highlightLineColor: '#777777',\n            spotRadius: 2,\n            tooltipPrefix: '',\n            tooltipSuffix: ' Tickets',\n            tooltipFormat: '{{prefix}}{{y}}{{suffix}}'\n        };\n        jQuery('.js-slc-line1').sparkline('html', $lineOptions);\n\n        $lineOptions['lineColor']       = '#abe37d';\n        $lineOptions['fillColor']       = '#abe37d';\n        $lineOptions['tooltipPrefix']   = '$ ';\n        $lineOptions['tooltipSuffix']   = '';\n        jQuery('.js-slc-line2').sparkline('html', $lineOptions);\n\n        $lineOptions['lineColor']       = '#faad7d';\n        $lineOptions['fillColor']       = '#faad7d';\n        $lineOptions['tooltipPrefix']   = '';\n        $lineOptions['tooltipSuffix']   = ' Sales';\n        jQuery('.js-slc-line3').sparkline('html', $lineOptions);\n\n        // Pie Charts\n        var $pieCharts = {\n            type: 'pie',\n            width: '50px',\n            height: '50px',\n            sliceColors: ['#fadb7d','#faad7d', '#75b0eb','#abe37d'],\n            tooltipPrefix: '',\n            tooltipSuffix: ' Tickets',\n            tooltipFormat: '{{prefix}}{{value}}{{suffix}}'\n        };\n        jQuery('.js-slc-pie1').sparkline('html', $pieCharts);\n\n        $pieCharts['tooltipPrefix'] = '$ ';\n        $pieCharts['tooltipSuffix'] = '';\n        jQuery('.js-slc-pie2').sparkline('html', $pieCharts);\n\n        $pieCharts['tooltipPrefix'] = '';\n        $pieCharts['tooltipSuffix'] = ' Sales';\n        jQuery('.js-slc-pie3').sparkline('html', $pieCharts);\n\n        // Tristate Charts\n        var $tristateOptions = {\n            type: 'tristate',\n            barWidth: 8,\n            barSpacing: 6,\n            height: '80px',\n            posBarColor: '#abe37d',\n            negBarColor: '#faad7d'\n        };\n        jQuery('.js-slc-tristate1').sparkline('html', $tristateOptions);\n        jQuery('.js-slc-tristate2').sparkline('html', $tristateOptions);\n        jQuery('.js-slc-tristate3').sparkline('html', $tristateOptions);\n    };\n\n    // Randomize Easy Pie Chart values\n    var initRandomEasyPieChart = function(){\n        jQuery('.js-pie-randomize').on('click', function(){\n            jQuery(this)\n                .parents('.block')\n                .find('.pie-chart')\n                .each(function() {\n                    var $random = Math.floor((Math.random() * 100) + 1);\n\n                    jQuery(this)\n                        .data('easyPieChart')\n                        .update($random);\n                });\n        });\n    };\n\n    // Flot charts, for more examples you can check out http://www.flotcharts.org/flot/examples/\n    var initChartsFlot = function(){\n        // Get the elements where we will attach the charts\n        var $flotLines      = jQuery('.js-flot-lines');\n        var $flotStacked    = jQuery('.js-flot-stacked');\n        var $flotLive       = jQuery('.js-flot-live');\n        var $flotPie        = jQuery('.js-flot-pie');\n        var $flotBars       = jQuery('.js-flot-bars');\n\n        // Demo Data\n        var $dataEarnings    = [[1, 2500], [2, 2300], [3, 3200], [4, 2500], [5, 4500], [6, 2800], [7, 3900], [8, 3100], [9, 4600], [10, 3200], [11, 4200], [12, 5700]];\n        var $dataSales       = [[1, 1100], [2, 700], [3, 1300], [4, 900], [5, 1900], [6, 950], [7, 1700], [8, 1250], [9, 1800], [10, 1300], [11, 1750], [12, 2900]];\n\n        var $dataSalesBefore = [[1, 500], [4, 390], [7, 1000], [10, 600], [13, 800], [16, 1050], [19, 1200], [22, 750], [25, 980], [28, 900], [31, 1350], [34, 1200]];\n        var $dataSalesAfter  = [[2, 650], [5, 600], [8, 1400], [11, 900], [14, 1300], [17, 1200], [20, 1420], [23, 1650], [26, 1300], [29, 1120], [32, 1550], [35, 1650]];\n\n        var $dataMonths      = [[1, 'Jan'], [2, 'Feb'], [3, 'Mar'], [4, 'Apr'], [5, 'May'], [6, 'Jun'], [7, 'Jul'], [8, 'Aug'], [9, 'Sep'], [10, 'Oct'], [11, 'Nov'], [12, 'Dec']];\n        var $dataMonthsBars  = [[2, 'Jan'], [5, 'Feb'], [8, 'Mar'], [11, 'Apr'], [14, 'May'], [17, 'Jun'], [20, 'Jul'], [23, 'Aug'], [26, 'Sep'], [29, 'Oct'], [32, 'Nov'], [35, 'Dec']];\n\n        // Init lines chart\n        jQuery.plot($flotLines,\n            [\n                {\n                    label: 'Earnings',\n                    data: $dataEarnings,\n                    lines: {\n                        show: true,\n                        fill: true,\n                        fillColor: {\n                            colors: [{opacity: .7}, {opacity: .7}]\n                        }\n                    },\n                    points: {\n                        show: true,\n                        radius: 6\n                    }\n                },\n                {\n                    label: 'Sales',\n                    data: $dataSales,\n                    lines: {\n                        show: true,\n                        fill: true,\n                        fillColor: {\n                            colors: [{opacity: .5}, {opacity: .5}]\n                        }\n                    },\n                    points: {\n                        show: true,\n                        radius: 6\n                    }\n                }\n            ],\n            {\n                colors: ['#abe37d', '#333333'],\n                legend: {\n                    show: true,\n                    position: 'nw',\n                    backgroundOpacity: 0\n                },\n                grid: {\n                    borderWidth: 0,\n                    hoverable: true,\n                    clickable: true\n                },\n                yaxis: {\n                    tickColor: '#ffffff',\n                    ticks: 3\n                },\n                xaxis: {\n                    ticks: $dataMonths,\n                    tickColor: '#f5f5f5'\n                }\n            }\n        );\n\n        // Creating and attaching a tooltip to the classic chart\n        var previousPoint = null, ttlabel = null;\n        $flotLines.bind('plothover', function(event, pos, item) {\n            if (item) {\n                if (previousPoint !== item.dataIndex) {\n                    previousPoint = item.dataIndex;\n\n                    jQuery('.js-flot-tooltip').remove();\n                    var x = item.datapoint[0], y = item.datapoint[1];\n\n                    if (item.seriesIndex === 0) {\n                        ttlabel = '$ <strong>' + y + '</strong>';\n                    } else if (item.seriesIndex === 1) {\n                        ttlabel = '<strong>' + y + '</strong> sales';\n                    } else {\n                        ttlabel = '<strong>' + y + '</strong> tickets';\n                    }\n\n                    jQuery('<div class=\"js-flot-tooltip flot-tooltip\">' + ttlabel + '</div>')\n                        .css({top: item.pageY - 45, left: item.pageX + 5}).appendTo(\"body\").show();\n                }\n            }\n            else {\n                jQuery('.js-flot-tooltip').remove();\n                previousPoint = null;\n            }\n        });\n\n        // Stacked Chart\n        jQuery.plot($flotStacked,\n            [\n                {\n                    label: 'Sales',\n                    data: $dataSales\n                },\n                {\n                    label: 'Earnings',\n                    data: $dataEarnings\n                }\n            ],\n            {\n                colors: ['#faad7d', '#fadb7d'],\n                series: {\n                    stack: true,\n                    lines: {\n                        show: true,\n                        fill: true\n                    }\n                },\n                lines: {show: true,\n                    lineWidth: 0,\n                    fill: true,\n                    fillColor: {\n                        colors: [{opacity: 1}, {opacity: 1}]\n                    }\n                },\n                legend: {\n                    show: true,\n                    position: 'nw',\n                    sorted: true,\n                    backgroundOpacity: 0\n                },\n                grid: {\n                    borderWidth: 0\n                },\n                yaxis: {\n                    tickColor: '#ffffff',\n                    ticks: 3\n                },\n                xaxis: {\n                    ticks: $dataMonths,\n                    tickColor: '#f5f5f5'\n                }\n            }\n        );\n\n        // Live Chart\n        var $dataLive = [];\n\n        function getRandomData() { // Random data generator\n\n            if ($dataLive.length > 0)\n                $dataLive = $dataLive.slice(1);\n\n            while ($dataLive.length < 300) {\n                var prev = $dataLive.length > 0 ? $dataLive[$dataLive.length - 1] : 50;\n                var y = prev + Math.random() * 10 - 5;\n                if (y < 0)\n                    y = 0;\n                if (y > 100)\n                    y = 100;\n                $dataLive.push(y);\n            }\n\n            var res = [];\n            for (var i = 0; i < $dataLive.length; ++i)\n                res.push([i, $dataLive[i]]);\n\n            // Show live chart info\n            jQuery('.js-flot-live-info').html(y.toFixed(0) + '%');\n\n            return res;\n        }\n\n        function updateChartLive() { // Update live chart\n            $chartLive.setData([getRandomData()]);\n            $chartLive.draw();\n            setTimeout(updateChartLive, 70);\n        }\n\n        var $chartLive = jQuery.plot($flotLive, // Init live chart\n            [{ data: getRandomData() }],\n            {\n                series: {\n                    shadowSize: 0\n                },\n                lines: {\n                    show: true,\n                    lineWidth: 2,\n                    fill: true,\n                    fillColor: {\n                        colors: [{opacity: .2}, {opacity: .2}]\n                    }\n                },\n                colors: ['#75b0eb'],\n                grid: {\n                    borderWidth: 0,\n                    color: '#aaaaaa'\n                },\n                yaxis: {\n                    show: true,\n                    min: 0,\n                    max: 110\n                },\n                xaxis: {\n                    show: false\n                }\n            }\n        );\n\n        updateChartLive(); // Start getting new data\n\n        // Bars Chart\n        jQuery.plot($flotBars,\n            [\n                {\n                    label: 'Sales Before',\n                    data: $dataSalesBefore,\n                    bars: {\n                        show: true,\n                        lineWidth: 0,\n                        fillColor: {\n                            colors: [{opacity: 1}, {opacity: 1}]\n                        }\n                    }\n                },\n                {\n                    label: 'Sales After',\n                    data: $dataSalesAfter,\n                    bars: {\n                        show: true,\n                        lineWidth: 0,\n                        fillColor: {\n                            colors: [{opacity: 1}, {opacity: 1}]\n                        }\n                    }\n                }\n            ],\n            {\n                colors: ['#faad7d', '#fadb7d'],\n                legend: {\n                    show: true,\n                    position: 'nw',\n                    backgroundOpacity: 0\n                },\n                grid: {\n                    borderWidth: 0\n                },\n                yaxis: {\n                    ticks: 3,\n                    tickColor: '#f5f5f5'\n                },\n                xaxis: {\n                    ticks: $dataMonthsBars,\n                    tickColor: '#f5f5f5'\n                }\n            }\n        );\n\n        // Pie Chart\n        jQuery.plot($flotPie,\n            [\n                {\n                    label: 'Sales',\n                    data: 22\n                },\n                {\n                    label: 'Tickets',\n                    data: 22\n                },\n                {\n                    label: 'Earnings',\n                    data: 56\n                }\n            ],\n            {\n                colors: ['#fadb7d', '#75b0eb', '#abe37d'],\n                legend: {show: false},\n                series: {\n                    pie: {\n                        show: true,\n                        radius: 1,\n                        label: {\n                            show: true,\n                            radius: 2/3,\n                            formatter: function(label, pieSeries) {\n                                return '<div class=\"flot-pie-label\">' + label + '<br>' + Math.round(pieSeries.percent) + '%</div>';\n                            },\n                            background: {\n                                opacity: .75,\n                                color: '#000000'\n                            }\n                        }\n                    }\n                }\n            }\n        );\n    };\n\n    return {\n        init: function () {\n            // Init all charts\n            initChartsChartJS();\n            initChartsSparkline();\n            initChartsFlot();\n\n            // Randomize Easy Pie values functionality\n            initRandomEasyPieChart();\n        }\n    };\n}();\n\n// Initialize when page loads\njQuery(function(){ BaseCompCharts.init(); });"
  },
  {
    "path": "webservice/lalascan_web/app/static/js/pages/base_comp_maps.js",
    "content": "/*\n *  Document   : base_comp_maps.js\n *  Author     : pixelcave\n *  Description: Custom JS code used in Maps Page\n */\n\nvar BaseCompMaps = function() {\n    // Init Search Map\n    var initMapSearch = function(){\n        // Init Map\n        var $mapSearch = new GMaps({\n            div: '#js-map-search',\n            lat: 20,\n            lng: 0,\n            zoom: 2,\n            scrollwheel: false\n        });\n\n        // When the search form is submitted\n        jQuery('.js-form-search').on('submit', function(){\n            GMaps.geocode({\n                address: jQuery('.js-search-address').val().trim(),\n                callback: function ($results, $status) {\n                    if (($status === 'OK') && $results) {\n                        var $latlng = $results[0].geometry.location;\n\n                        $mapSearch.removeMarkers();\n                        $mapSearch.addMarker({ lat: $latlng.lat(), lng: $latlng.lng() });\n                        $mapSearch.fitBounds($results[0].geometry.viewport);\n                    } else {\n                        alert('Address not found!');\n                    }\n                }\n            });\n\n            return false;\n        });\n    };\n\n    // Init Satellite Map\n    var initMapSat = function(){\n        new GMaps({\n            div: '#js-map-sat',\n            lat: 0,\n            lng: 0,\n            zoom: 1,\n            scrollwheel: false\n        }).setMapTypeId(google.maps.MapTypeId.SATELLITE);\n    };\n\n    // Init Terrain Map\n    var initMapTer = function(){\n        new GMaps({\n            div: '#js-map-ter',\n            lat: 0,\n            lng: 0,\n            zoom: 1,\n            scrollwheel: false\n        }).setMapTypeId(google.maps.MapTypeId.TERRAIN);\n    };\n\n    // Init Overlay Map\n    var initMapOverlay = function(){\n        new GMaps({\n            div: '#js-map-overlay',\n            lat: 37.7577,\n            lng: -122.4376,\n            zoom: 11,\n            scrollwheel: false\n        }).drawOverlay({\n            lat: 37.7577,\n            lng: -122.4376,\n            content: '<div class=\"alert alert-danger alert-dismissable\"><h4 class=\"push-15\">Overlay Message</h4><p class=\"push-10\">You can overlay messages on your maps!</p></div>'\n        });\n    };\n\n    // Init Markers Map\n    var initMapMarkers = function(){\n        new GMaps({\n            div: '#js-map-markers',\n            lat: 37.7577,\n            lng: -122.4376,\n            zoom: 11,\n            scrollwheel: false\n        }).addMarkers([\n            {lat: 37.70, lng: -122.49, title: 'Marker #1', animation: google.maps.Animation.DROP, infoWindow: {content: '<strong>Marker #1</strong>'}},\n            {lat: 37.76, lng: -122.46, title: 'Marker #2', animation: google.maps.Animation.DROP, infoWindow: {content: '<strong>Marker #2</strong>'}},\n            {lat: 37.72, lng: -122.41, title: 'Marker #3', animation: google.maps.Animation.DROP, infoWindow: {content: '<strong>Marker #3</strong>'}},\n            {lat: 37.78, lng: -122.39, title: 'Marker #4', animation: google.maps.Animation.DROP, infoWindow: {content: '<strong>Marker #4</strong>'}},\n            {lat: 37.74, lng: -122.46, title: 'Marker #5', animation: google.maps.Animation.DROP, infoWindow: {content: '<strong>Marker #5</strong>'}}\n        ]);\n    };\n\n    // Init Street Map\n    var initMapStreet = function(){\n        new GMaps.createPanorama({\n            el: '#js-map-street',\n            lat: 37.809345,\n            lng: -122.475825,\n            pov: {heading: 340.91, pitch: 4},\n            scrollwheel: false\n        });\n    };\n\n    // Init Geolocation Map\n    var initMapGeo = function(){\n        var gmapGeolocation = new GMaps({\n            div: '#js-map-geo',\n            lat: 0,\n            lng: 0,\n            scrollwheel: false\n        });\n\n        GMaps.geolocate({\n            success: function(position) {\n                gmapGeolocation.setCenter(position.coords.latitude, position.coords.longitude);\n                gmapGeolocation.addMarker({\n                    lat: position.coords.latitude,\n                    lng: position.coords.longitude,\n                    animation: google.maps.Animation.DROP,\n                    title: 'GeoLocation',\n                    infoWindow: {\n                        content: '<div class=\"text-success\"><i class=\"fa fa-map-marker\"></i> <strong>Your location!</strong></div>'\n                    }\n                });\n            },\n            error: function(error) {\n                alert('Geolocation failed: ' + error.message);\n            },\n            not_supported: function() {\n                alert(\"Your browser does not support geolocation\");\n            },\n            always: function() {\n                // Message when geolocation succeed\n            }\n        });\n    };\n\n    return {\n        init: function () {\n            // Gmaps.js, for more examples you can check out https://hpneo.github.io/gmaps/\n\n            // Init Map with Search functionality\n            initMapSearch();\n\n            // Init Example Maps\n            initMapSat();\n            initMapTer();\n            initMapOverlay();\n            initMapMarkers();\n            initMapStreet();\n            initMapGeo();\n        }\n    };\n}();\n\n// Initialize when page loads\njQuery(function(){ BaseCompMaps.init(); });"
  },
  {
    "path": "webservice/lalascan_web/app/static/js/pages/base_forms_validation.js",
    "content": "/*\n *  Document   : base_forms_validation.js\n *  Author     : pixelcave\n *  Description: Custom JS code used in Form Validation Page\n */\n\nvar BaseFormValidation = function() {\n    // Init Bootstrap Forms Validation, for more examples you can check out https://github.com/jzaefferer/jquery-validation\n    var initValidationBootstrap = function(){\n        jQuery('.js-validation-bootstrap').validate({\n            errorClass: 'help-block animated fadeInDown',\n            errorElement: 'div',\n            errorPlacement: function(error, e) {\n                jQuery(e).parents('.form-group > div').append(error);\n            },\n            highlight: function(e) {\n                jQuery(e).closest('.form-group').removeClass('has-error').addClass('has-error');\n                jQuery(e).closest('.help-block').remove();\n            },\n            success: function(e) {\n                jQuery(e).closest('.form-group').removeClass('has-error');\n                jQuery(e).closest('.help-block').remove();\n            },\n            rules: {\n                'val-username': {\n                    required: true,\n                    minlength: 3\n                },\n                'val-email': {\n                    required: true,\n                    email: true\n                },\n                'val-password': {\n                    required: true,\n                    minlength: 5\n                },\n                'val-confirm-password': {\n                    required: true,\n                    equalTo: '#val-password'\n                },\n                'val-suggestions': {\n                    required: true,\n                    minlength: 5\n                },\n                'val-skill': {\n                    required: true\n                },\n                'val-website': {\n                    required: true,\n                    url: true\n                },\n                'val-digits': {\n                    required: true,\n                    digits: true\n                },\n                'val-number': {\n                    required: true,\n                    number: true\n                },\n                'val-range': {\n                    required: true,\n                    range: [1, 5]\n                },\n                'val-terms': {\n                    required: true\n                }\n            },\n            messages: {\n                'val-username': {\n                    required: 'Please enter a username',\n                    minlength: 'Your username must consist of at least 3 characters'\n                },\n                'val-email': 'Please enter a valid email address',\n                'val-password': {\n                    required: 'Please provide a password',\n                    minlength: 'Your password must be at least 5 characters long'\n                },\n                'val-confirm-password': {\n                    required: 'Please provide a password',\n                    minlength: 'Your password must be at least 5 characters long',\n                    equalTo: 'Please enter the same password as above'\n                },\n                'val-suggestions': 'What can we do to become better?',\n                'val-skill': 'Please select a skill!',\n                'val-website': 'Please enter your website!',\n                'val-digits': 'Please enter only digits!',\n                'val-number': 'Please enter a number!',\n                'val-range': 'Please enter a number between 1 and 5!',\n                'val-terms': 'You must agree to the service terms!'\n            }\n        });\n    };\n\n    // Init Material Forms Validation, for more examples you can check out https://github.com/jzaefferer/jquery-validation\n    var initValidationMaterial = function(){\n        jQuery('.js-validation-material').validate({\n            errorClass: 'help-block text-right animated fadeInDown',\n            errorElement: 'div',\n            errorPlacement: function(error, e) {\n                jQuery(e).parents('.form-group .form-material').append(error);\n            },\n            highlight: function(e) {\n                jQuery(e).closest('.form-group').removeClass('has-error').addClass('has-error');\n                jQuery(e).closest('.help-block').remove();\n            },\n            success: function(e) {\n                jQuery(e).closest('.form-group').removeClass('has-error');\n                jQuery(e).closest('.help-block').remove();\n            },\n            rules: {\n                'val-username2': {\n                    required: true,\n                    minlength: 3\n                },\n                'val-email2': {\n                    required: true,\n                    email: true\n                },\n                'val-password2': {\n                    required: true,\n                    minlength: 5\n                },\n                'val-confirm-password2': {\n                    required: true,\n                    equalTo: '#val-password2'\n                },\n                'val-suggestions2': {\n                    required: true,\n                    minlength: 5\n                },\n                'val-skill2': {\n                    required: true\n                },\n                'val-website2': {\n                    required: true,\n                    url: true\n                },\n                'val-digits2': {\n                    required: true,\n                    digits: true\n                },\n                'val-number2': {\n                    required: true,\n                    number: true\n                },\n                'val-range2': {\n                    required: true,\n                    range: [1, 5]\n                },\n                'val-terms2': {\n                    required: true\n                }\n            },\n            messages: {\n                'val-username2': {\n                    required: 'Please enter a username',\n                    minlength: 'Your username must consist of at least 3 characters'\n                },\n                'val-email2': 'Please enter a valid email address',\n                'val-password2': {\n                    required: 'Please provide a password',\n                    minlength: 'Your password must be at least 5 characters long'\n                },\n                'val-confirm-password2': {\n                    required: 'Please provide a password',\n                    minlength: 'Your password must be at least 5 characters long',\n                    equalTo: 'Please enter the same password as above'\n                },\n                'val-suggestions2': 'What can we do to become better?',\n                'val-skill2': 'Please select a skill!',\n                'val-website2': 'Please enter your website!',\n                'val-digits2': 'Please enter only digits!',\n                'val-number2': 'Please enter a number!',\n                'val-range2': 'Please enter a number between 1 and 5!',\n                'val-terms2': 'You must agree to the service terms!'\n            }\n        });\n    };\n\n    return {\n        init: function () {\n            // Init Bootstrap Forms Validation\n            initValidationBootstrap();\n\n            // Init Meterial Forms Validation\n            initValidationMaterial();\n        }\n    };\n}();\n\n// Initialize when page loads\njQuery(function(){ BaseFormValidation.init(); });"
  },
  {
    "path": "webservice/lalascan_web/app/static/js/pages/base_forms_wizard.js",
    "content": "/*\n *  Document   : base_forms_wizard.js\n *  Author     : pixelcave\n *  Description: Custom JS code used in Form Wizard Page\n */\n\nvar BaseFormWizard = function() {\n    // Init simple wizard, for more examples you can check out http://vadimg.com/twitter-bootstrap-wizard-example/\n    var initWizardSimple = function(){\n        jQuery('.js-wizard-simple').bootstrapWizard({\n            'tabClass': '',\n            'firstSelector': '.wizard-first',\n            'previousSelector': '.wizard-prev',\n            'nextSelector': '.wizard-next',\n            'lastSelector': '.wizard-last',\n            'onTabShow': function($tab, $navigation, $index) {\n\t\tvar $total      = $navigation.find('li').length;\n\t\tvar $current    = $index + 1;\n\t\tvar $percent    = ($current/$total) * 100;\n\n                // Get vital wizard elements\n                var $wizard     = $navigation.parents('.block');\n                var $progress   = $wizard.find('.wizard-progress > .progress-bar');\n                var $btnPrev    = $wizard.find('.wizard-prev');\n                var $btnNext    = $wizard.find('.wizard-next');\n                var $btnFinish  = $wizard.find('.wizard-finish');\n\n                // Update progress bar if there is one\n\t\tif ($progress) {\n                    $progress.css({ width: $percent + '%' });\n                }\n\n\t\t// If it's the last tab then hide the last button and show the finish instead\n\t\tif($current >= $total) {\n                    $btnNext.hide();\n                    $btnFinish.show();\n\t\t} else {\n                    $btnNext.show();\n                    $btnFinish.hide();\n\t\t}\n            }\n        });\n    };\n\n    // Init wizards with validation, for more examples you can check out http://vadimg.com/twitter-bootstrap-wizard-example/\n    var initWizardValidation = function(){\n        // Get forms\n        var $form1 = jQuery('.js-form1');\n        var $form2 = jQuery('.js-form2');\n\n        // Prevent forms from submitting on enter key press\n        $form1.add($form2).on('keyup keypress', function (e) {\n            var code = e.keyCode || e.which;\n\n            if (code === 13) {\n                e.preventDefault();\n                return false;\n            }\n        });\n\n        // Init form validation on classic wizard form\n        var $validator1 = $form1.validate({\n            errorClass: 'help-block animated fadeInDown',\n            errorElement: 'div',\n            errorPlacement: function(error, e) {\n                jQuery(e).parents('.form-group > div').append(error);\n            },\n            highlight: function(e) {\n                jQuery(e).closest('.form-group').removeClass('has-error').addClass('has-error');\n                jQuery(e).closest('.help-block').remove();\n            },\n            success: function(e) {\n                jQuery(e).closest('.form-group').removeClass('has-error');\n                jQuery(e).closest('.help-block').remove();\n            },\n            rules: {\n                'validation-classic-firstname': {\n                    required: true,\n                    minlength: 2\n                },\n                'validation-classic-lastname': {\n                    required: true,\n                    minlength: 2\n                },\n                'validation-classic-email': {\n                    required: true,\n                    email: true\n                },\n                'validation-classic-details': {\n                    required: true,\n                    minlength: 5\n                },\n                'validation-classic-city': {\n                    required: true\n                },\n                'validation-classic-skills': {\n                    required: true\n                },\n                'validation-classic-terms': {\n                    required: true\n                }\n            },\n            messages: {\n                'validation-classic-firstname': {\n                    required: 'Please enter a firstname',\n                    minlength: 'Your firtname must consist of at least 2 characters'\n                },\n                'validation-classic-lastname': {\n                    required: 'Please enter a lastname',\n                    minlength: 'Your lastname must consist of at least 2 characters'\n                },\n                'validation-classic-email': 'Please enter a valid email address',\n                'validation-classic-details': 'Let us know a few thing about yourself',\n                'validation-classic-skills': 'Please select a skill!',\n                'validation-classic-terms': 'You must agree to the service terms!'\n            }\n        });\n\n        // Init form validation on the other wizard form\n        var $validator2 = $form2.validate({\n            errorClass: 'help-block text-right animated fadeInDown',\n            errorElement: 'div',\n            errorPlacement: function(error, e) {\n                jQuery(e).parents('.form-group .form-material').append(error);\n            },\n            highlight: function(e) {\n                jQuery(e).closest('.form-group').removeClass('has-error').addClass('has-error');\n                jQuery(e).closest('.help-block').remove();\n            },\n            success: function(e) {\n                jQuery(e).closest('.form-group').removeClass('has-error');\n                jQuery(e).closest('.help-block').remove();\n            },\n            rules: {\n                'validation-firstname': {\n                    required: true,\n                    minlength: 2\n                },\n                'validation-lastname': {\n                    required: true,\n                    minlength: 2\n                },\n                'validation-email': {\n                    required: true,\n                    email: true\n                },\n                'validation-details': {\n                    required: true,\n                    minlength: 5\n                },\n                'validation-city': {\n                    required: true\n                },\n                'validation-skills': {\n                    required: true\n                },\n                'validation-terms': {\n                    required: true\n                }\n            },\n            messages: {\n                'validation-firstname': {\n                    required: 'Please enter a firstname',\n                    minlength: 'Your firtname must consist of at least 2 characters'\n                },\n                'validation-lastname': {\n                    required: 'Please enter a lastname',\n                    minlength: 'Your lastname must consist of at least 2 characters'\n                },\n                'validation-email': 'Please enter a valid email address',\n                'validation-details': 'Let us know a few thing about yourself',\n                'validation-skills': 'Please select a skill!',\n                'validation-terms': 'You must agree to the service terms!'\n            }\n        });\n\n        // Init classic wizard with validation\n        jQuery('.js-wizard-classic-validation').bootstrapWizard({\n            'tabClass': '',\n            'previousSelector': '.wizard-prev',\n            'nextSelector': '.wizard-next',\n            'onTabShow': function($tab, $nav, $index) {\n\t\tvar $total      = $nav.find('li').length;\n\t\tvar $current    = $index + 1;\n\n                // Get vital wizard elements\n                var $wizard     = $nav.parents('.block');\n                var $btnNext    = $wizard.find('.wizard-next');\n                var $btnFinish  = $wizard.find('.wizard-finish');\n\n\t\t// If it's the last tab then hide the last button and show the finish instead\n\t\tif($current >= $total) {\n                    $btnNext.hide();\n                    $btnFinish.show();\n\t\t} else {\n                    $btnNext.show();\n                    $btnFinish.hide();\n\t\t}\n            },\n            'onNext': function($tab, $navigation, $index) {\n                var $valid = $form1.valid();\n\n                if(!$valid) {\n                    $validator1.focusInvalid();\n\n                    return false;\n                }\n            },\n            onTabClick: function($tab, $navigation, $index) {\n\t\treturn false;\n            }\n        });\n\n        // Init wizard with validation\n        jQuery('.js-wizard-validation').bootstrapWizard({\n            'tabClass': '',\n            'previousSelector': '.wizard-prev',\n            'nextSelector': '.wizard-next',\n            'onTabShow': function($tab, $nav, $index) {\n\t\tvar $total      = $nav.find('li').length;\n\t\tvar $current    = $index + 1;\n\n                // Get vital wizard elements\n                var $wizard     = $nav.parents('.block');\n                var $btnNext    = $wizard.find('.wizard-next');\n                var $btnFinish  = $wizard.find('.wizard-finish');\n\n\t\t// If it's the last tab then hide the last button and show the finish instead\n\t\tif($current >= $total) {\n                    $btnNext.hide();\n                    $btnFinish.show();\n\t\t} else {\n                    $btnNext.show();\n                    $btnFinish.hide();\n\t\t}\n            },\n            'onNext': function($tab, $navigation, $index) {\n                var $valid = $form2.valid();\n\n                if(!$valid) {\n                    $validator2.focusInvalid();\n\n                    return false;\n                }\n            },\n            onTabClick: function($tab, $navigation, $index) {\n\t\treturn false;\n            }\n        });\n    };\n\n    return {\n        init: function () {\n            // Init simple wizard\n            initWizardSimple();\n\n            // Init wizards with validation\n            initWizardValidation();\n        }\n    };\n}();\n\n// Initialize when page loads\njQuery(function(){ BaseFormWizard.init(); });"
  },
  {
    "path": "webservice/lalascan_web/app/static/js/pages/base_pages_coming_soon.js",
    "content": "/*\n *  Document   : base_pages_coming_soon.js\n *  Author     : pixelcave\n *  Description: Custom JS code used in Coming Soon Page\n */\n\nvar BasePagesComingSoon = function() {\n    // Init Countdown.js, for more examples you can check out https://github.com/hilios/jQuery.countdown\n    var initCounter = function(){\n        jQuery('.js-countdown').countdown((new Date().getFullYear() + 2) + '/01/15', function(event) {\n            jQuery(this).html(event.strftime('<div class=\"row items-push text-center\">'\n                    + '<div class=\"col-xs-3\"><div class=\"font-s36 font-w700 text-white\">%-D</div><div class=\"font-s12 font-w700 text-white-op\">DAYS</div></div>'\n                    + '<div class=\"col-xs-3\"><div class=\"font-s36 font-w700 text-white\">%H</div><div class=\"font-s12 font-w700 text-white-op\">HOURS</div></div>'\n                    + '<div class=\"col-xs-3\"><div class=\"font-s36 font-w700 text-white\">%M</div><div class=\"font-s12 font-w700 text-white-op\">MINUTES</div></div>'\n                    + '<div class=\"col-xs-3\"><div class=\"font-s36 font-w700 text-white\">%S</div><div class=\"font-s12 font-w700 text-white-op\">SECONDS</div></div>'\n                    + '</div>'\n            ));\n        });\n    };\n\n    return {\n        init: function () {\n            // Init Countdown\n            initCounter();\n        }\n    };\n}();\n\n// Initialize when page loads\njQuery(function(){ BasePagesComingSoon.init(); });"
  },
  {
    "path": "webservice/lalascan_web/app/static/js/pages/base_pages_dashboard.js",
    "content": "/*\n *  Document   : base_pages_dashboard.js\n *  Author     : pixelcave\n *  Description: Custom JS code used in Dashboard Page\n */\n\nvar BasePagesDashboard = function() {\n    // Chart.js Chart, for more examples you can check out http://www.chartjs.org/docs\n    var initDashChartJS = function(){\n        // Get Chart Container\n        var $dashChartLinesCon  = jQuery('.js-dash-chartjs-lines')[0].getContext('2d');\n\n        // Set Chart and Chart Data variables\n        var $dashChartLines, $dashChartLinesData;\n\n        // Lines Chart Data\n        var $dashChartLinesData = {\n            labels: ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'],\n            datasets: [\n                {\n                    label: 'This Week',\n                    fillColor: 'rgba(44, 52, 63, .07)',\n                    strokeColor: 'rgba(44, 52, 63, .25)',\n                    pointColor: 'rgba(44, 52, 63, .25)',\n                    pointStrokeColor: '#fff',\n                    pointHighlightFill: '#fff',\n                    pointHighlightStroke: 'rgba(44, 52, 63, 1)',\n                    data: [34, 42, 40, 65, 48, 56, 80]\n                },\n                {\n                    label: 'Last Week',\n                    fillColor: 'rgba(44, 52, 63, .1)',\n                    strokeColor: 'rgba(44, 52, 63, .55)',\n                    pointColor: 'rgba(44, 52, 63, .55)',\n                    pointStrokeColor: '#fff',\n                    pointHighlightFill: '#fff',\n                    pointHighlightStroke: 'rgba(44, 52, 63, 1)',\n                    data: [18, 19, 20, 35, 23, 28, 50]\n                }\n            ]\n        };\n\n        // Init Lines Chart\n        $dashChartLines = new Chart($dashChartLinesCon).Line($dashChartLinesData, {\n            scaleFontFamily: \"'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif\",\n            scaleFontColor: '#999',\n            scaleFontStyle: '600',\n            tooltipTitleFontFamily: \"'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif\",\n            tooltipCornerRadius: 3,\n            maintainAspectRatio: false,\n            responsive: true\n        });\n    };\n\n    return {\n        init: function () {\n            // Init ChartJS chart\n            initDashChartJS();\n        }\n    };\n}();\n\n// Initialize when page loads\njQuery(function(){ BasePagesDashboard.init(); });"
  },
  {
    "path": "webservice/lalascan_web/app/static/js/pages/base_pages_lock.js",
    "content": "/*\n *  Document   : base_pages_lock.js\n *  Author     : pixelcave\n *  Description: Custom JS code used in Lock Screen Page\n */\n\nvar BasePagesLock = function() {\n    // Init Lock Form Validation, for more examples you can check out https://github.com/jzaefferer/jquery-validation\n    var initValidationLock = function(){\n        jQuery('.js-validation-lock').validate({\n            errorClass: 'help-block text-right animated fadeInDown',\n            errorElement: 'div',\n            errorPlacement: function(error, e) {\n                jQuery(e).parents('.form-group .form-material').append(error);\n            },\n            highlight: function(e) {\n                jQuery(e).closest('.form-group').removeClass('has-error').addClass('has-error');\n                jQuery(e).closest('.help-block').remove();\n            },\n            success: function(e) {\n                jQuery(e).closest('.form-group').removeClass('has-error');\n                jQuery(e).closest('.help-block').remove();\n            },\n            rules: {\n                'lock-password': {\n                    required: true,\n                    minlength: 5\n                }\n            },\n            messages: {\n                'lock-password': {\n                    required: 'Please provide a password',\n                    minlength: 'Your password must be at least 5 characters long'\n                }\n            }\n        });\n    };\n\n    return {\n        init: function () {\n            // Init Reminder Form Validation\n            initValidationLock();\n        }\n    };\n}();\n\n// Initialize when page loads\njQuery(function(){ BasePagesLock.init(); });"
  },
  {
    "path": "webservice/lalascan_web/app/static/js/pages/base_pages_login.js",
    "content": "/*\n *  Document   : base_pages_login.js\n *  Author     : pixelcave\n *  Description: Custom JS code used in Login Page\n */\n\nvar BasePagesLogin = function() {\n    // Init Login Form Validation, for more examples you can check out https://github.com/jzaefferer/jquery-validation\n    var initValidationLogin = function(){\n        jQuery('.js-validation-login').validate({\n            errorClass: 'help-block text-right animated fadeInDown',\n            errorElement: 'div',\n            errorPlacement: function(error, e) {\n                jQuery(e).parents('.form-group .form-material').append(error);\n            },\n            highlight: function(e) {\n                jQuery(e).closest('.form-group').removeClass('has-error').addClass('has-error');\n                jQuery(e).closest('.help-block').remove();\n            },\n            success: function(e) {\n                jQuery(e).closest('.form-group').removeClass('has-error');\n                jQuery(e).closest('.help-block').remove();\n            },\n            rules: {\n                'login-username': {\n                    required: true,\n                    minlength: 3\n                },\n                'login-password': {\n                    required: true,\n                    minlength: 5\n                }\n            },\n            messages: {\n                'login-username': {\n                    required: 'Please enter a username',\n                    minlength: 'Your username must consist of at least 3 characters'\n                },\n                'login-password': {\n                    required: 'Please provide a password',\n                    minlength: 'Your password must be at least 5 characters long'\n                }\n            }\n        });\n    };\n\n    return {\n        init: function () {\n            // Init Login Form Validation\n            initValidationLogin();\n        }\n    };\n}();\n\n// Initialize when page loads\njQuery(function(){ BasePagesLogin.init(); });"
  },
  {
    "path": "webservice/lalascan_web/app/static/js/pages/base_pages_register.js",
    "content": "/*\n *  Document   : base_pages_register.js\n *  Author     : pixelcave\n *  Description: Custom JS code used in Register Page\n */\n\nvar BasePagesRegister = function() {\n    // Init Register Form Validation, for more examples you can check out https://github.com/jzaefferer/jquery-validation\n    var initValidationRegister = function(){\n        jQuery('.js-validation-register').validate({\n            errorClass: 'help-block text-right animated fadeInDown',\n            errorElement: 'div',\n            errorPlacement: function(error, e) {\n                jQuery(e).parents('.form-group .form-material').append(error);\n            },\n            highlight: function(e) {\n                jQuery(e).closest('.form-group').removeClass('has-error').addClass('has-error');\n                jQuery(e).closest('.help-block').remove();\n            },\n            success: function(e) {\n                jQuery(e).closest('.form-group').removeClass('has-error');\n                jQuery(e).closest('.help-block').remove();\n            },\n            rules: {\n                'register-username': {\n                    required: true,\n                    minlength: 3\n                },\n                'register-email': {\n                    required: true,\n                    email: true\n                },\n                'register-password': {\n                    required: true,\n                    minlength: 5\n                },\n                'register-password2': {\n                    required: true,\n                    equalTo: '#register-password'\n                }\n            },\n            messages: {\n                'register-username': {\n                    required: 'Please enter a username',\n                    minlength: 'Your username must consist of at least 3 characters'\n                },\n                'register-email': 'Please enter a valid email address',\n                'register-password': {\n                    required: 'Please provide a password',\n                    minlength: 'Your password must be at least 5 characters long'\n                },\n                'register-password2': {\n                    required: 'Please provide a password',\n                    minlength: 'Your password must be at least 5 characters long',\n                    equalTo: 'Please enter the same password as above'\n                }\n            }\n        });\n    };\n\n    return {\n        init: function () {\n            // Init Register Form Validation\n            initValidationRegister();\n        }\n    };\n}();\n\n// Initialize when page loads\njQuery(function(){ BasePagesRegister.init(); });"
  },
  {
    "path": "webservice/lalascan_web/app/static/js/pages/base_pages_reminder.js",
    "content": "/*\n *  Document   : base_pages_reminder.js\n *  Author     : pixelcave\n *  Description: Custom JS code used in Reminder Page\n */\n\nvar BasePagesReminder = function() {\n    // Init Reminder Form Validation, for more examples you can check out https://github.com/jzaefferer/jquery-validation\n    var initValidationReminder = function(){\n        jQuery('.js-validation-reminder').validate({\n            errorClass: 'help-block text-right animated fadeInDown',\n            errorElement: 'div',\n            errorPlacement: function(error, e) {\n                jQuery(e).parents('.form-group .form-material').append(error);\n            },\n            highlight: function(e) {\n                jQuery(e).closest('.form-group').removeClass('has-error').addClass('has-error');\n                jQuery(e).closest('.help-block').remove();\n            },\n            success: function(e) {\n                jQuery(e).closest('.form-group').removeClass('has-error');\n                jQuery(e).closest('.help-block').remove();\n            },\n            rules: {\n                'reminder-email': {\n                    required: true,\n                    email: true\n                }\n            },\n            messages: {\n                'reminder-email': {\n                    required: 'Please enter a valid email address'\n                }\n            }\n        });\n    };\n\n    return {\n        init: function () {\n            // Init Reminder Form Validation\n            initValidationReminder();\n        }\n    };\n}();\n\n// Initialize when page loads\njQuery(function(){ BasePagesReminder.init(); });"
  },
  {
    "path": "webservice/lalascan_web/app/static/js/pages/base_tables_datatables.js",
    "content": "/*\n *  Document   : base_tables_datatables.js\n *  Author     : pixelcave\n *  Description: Custom JS code used in Tables Datatables Page\n */\n\nvar BaseTableDatatables = function() {\n    // Init full DataTable, for more examples you can check out https://www.datatables.net/\n    var initDataTableFull = function() {\n        jQuery('.js-dataTable-full').dataTable({\n            columnDefs: [ { orderable: false, targets: [ 4 ] } ],\n            pageLength: 10,\n            lengthMenu: [[5, 10, 15, 20], [5, 10, 15, 20]]\n        });\n    };\n\n    // Init simple DataTable, for more examples you can check out https://www.datatables.net/\n    var initDataTableSimple = function() {\n        jQuery('.js-dataTable-simple').dataTable({\n            columnDefs: [ { orderable: false, targets: [ 4 ] } ],\n            pageLength: 10,\n            lengthMenu: [[5, 10, 15, 20], [5, 10, 15, 20]],\n            searching: false,\n            oLanguage: {\n                sLengthMenu: \"\"\n            },\n            dom:\n                \"<'row'<'col-sm-12'tr>>\" +\n                \"<'row'<'col-sm-6'i><'col-sm-6'p>>\"\n        });\n    };\n\n    // DataTables Bootstrap integration\n    var bsDataTables = function() {\n        var $DataTable = jQuery.fn.dataTable;\n\n        // Set the defaults for DataTables init\n        jQuery.extend( true, $DataTable.defaults, {\n            dom:\n                \"<'row'<'col-sm-6'l><'col-sm-6'f>>\" +\n                \"<'row'<'col-sm-12'tr>>\" +\n                \"<'row'<'col-sm-6'i><'col-sm-6'p>>\",\n            renderer: 'bootstrap',\n            oLanguage: {\n                sLengthMenu: \"_MENU_\",\n                sInfo: \"Showing <strong>_START_</strong>-<strong>_END_</strong> of <strong>_TOTAL_</strong>\",\n                oPaginate: {\n                    sPrevious: '<i class=\"fa fa-angle-left\"></i>',\n                    sNext: '<i class=\"fa fa-angle-right\"></i>'\n                }\n            }\n        });\n\n        // Default class modification\n        jQuery.extend($DataTable.ext.classes, {\n            sWrapper: \"dataTables_wrapper form-inline dt-bootstrap\",\n            sFilterInput: \"form-control\",\n            sLengthSelect: \"form-control\"\n        });\n\n        // Bootstrap paging button renderer\n        $DataTable.ext.renderer.pageButton.bootstrap = function (settings, host, idx, buttons, page, pages) {\n            var api     = new $DataTable.Api(settings);\n            var classes = settings.oClasses;\n            var lang    = settings.oLanguage.oPaginate;\n            var btnDisplay, btnClass;\n\n            var attach = function (container, buttons) {\n                var i, ien, node, button;\n                var clickHandler = function (e) {\n                    e.preventDefault();\n                    if (!jQuery(e.currentTarget).hasClass('disabled')) {\n                        api.page(e.data.action).draw(false);\n                    }\n                };\n\n                for (i = 0, ien = buttons.length; i < ien; i++) {\n                    button = buttons[i];\n\n                    if (jQuery.isArray(button)) {\n                        attach(container, button);\n                    }\n                    else {\n                        btnDisplay = '';\n                        btnClass = '';\n\n                        switch (button) {\n                            case 'ellipsis':\n                                btnDisplay = '&hellip;';\n                                btnClass = 'disabled';\n                                break;\n\n                            case 'first':\n                                btnDisplay = lang.sFirst;\n                                btnClass = button + (page > 0 ? '' : ' disabled');\n                                break;\n\n                            case 'previous':\n                                btnDisplay = lang.sPrevious;\n                                btnClass = button + (page > 0 ? '' : ' disabled');\n                                break;\n\n                            case 'next':\n                                btnDisplay = lang.sNext;\n                                btnClass = button + (page < pages - 1 ? '' : ' disabled');\n                                break;\n\n                            case 'last':\n                                btnDisplay = lang.sLast;\n                                btnClass = button + (page < pages - 1 ? '' : ' disabled');\n                                break;\n\n                            default:\n                                btnDisplay = button + 1;\n                                btnClass = page === button ?\n                                        'active' : '';\n                                break;\n                        }\n\n                        if (btnDisplay) {\n                            node = jQuery('<li>', {\n                                'class': classes.sPageButton + ' ' + btnClass,\n                                'aria-controls': settings.sTableId,\n                                'tabindex': settings.iTabIndex,\n                                'id': idx === 0 && typeof button === 'string' ?\n                                        settings.sTableId + '_' + button :\n                                        null\n                            })\n                            .append(jQuery('<a>', {\n                                    'href': '#'\n                                })\n                                .html(btnDisplay)\n                            )\n                            .appendTo(container);\n\n                            settings.oApi._fnBindAction(\n                                node, {action: button}, clickHandler\n                            );\n                        }\n                    }\n                }\n            };\n\n            attach(\n                jQuery(host).empty().html('<ul class=\"pagination\"/>').children('ul'),\n                buttons\n            );\n        };\n\n        // TableTools Bootstrap compatibility - Required TableTools 2.1+\n        if ($DataTable.TableTools) {\n            // Set the classes that TableTools uses to something suitable for Bootstrap\n            jQuery.extend(true, $DataTable.TableTools.classes, {\n                \"container\": \"DTTT btn-group\",\n                \"buttons\": {\n                    \"normal\": \"btn btn-default\",\n                    \"disabled\": \"disabled\"\n                },\n                \"collection\": {\n                    \"container\": \"DTTT_dropdown dropdown-menu\",\n                    \"buttons\": {\n                        \"normal\": \"\",\n                        \"disabled\": \"disabled\"\n                    }\n                },\n                \"print\": {\n                    \"info\": \"DTTT_print_info\"\n                },\n                \"select\": {\n                    \"row\": \"active\"\n                }\n            });\n\n            // Have the collection use a bootstrap compatible drop down\n            jQuery.extend(true, $DataTable.TableTools.DEFAULTS.oTags, {\n                \"collection\": {\n                    \"container\": \"ul\",\n                    \"button\": \"li\",\n                    \"liner\": \"a\"\n                }\n            });\n        }\n    };\n\n    return {\n        init: function() {\n            // Init Datatables\n            bsDataTables();\n            initDataTableSimple();\n            initDataTableFull();\n        }\n    };\n}();\n\n// Initialize when page loads\njQuery(function(){ BaseTableDatatables.init(); });"
  },
  {
    "path": "webservice/lalascan_web/app/static/js/pages/base_ui_activity.js",
    "content": "/*\n *  Document   : base_ui_activity.js\n *  Author     : pixelcave\n *  Description: Custom JS code used in Activity Page\n */\n\nvar BaseUIActivity = function() {\n    // Randomize progress bars values\n    var barsRandomize = function(){\n        jQuery('.js-bar-randomize').on('click', function(){\n            jQuery(this)\n                .parents('.block')\n                .find('.progress-bar')\n                .each(function() {\n                    var $this   = jQuery(this);\n                    var $random = Math.floor((Math.random() * 91) + 10)  + '%';\n\n                    $this.css('width', $random);\n\n                    if ( ! $this.parent().hasClass('progress-mini')) {\n                        $this.html($random);\n                    }\n                });\n            });\n    };\n\n    return {\n        init: function() {\n            // Init randomize bar values\n            barsRandomize();\n        }\n    };\n}();\n\n// Initialize when page loads\njQuery(function(){ BaseUIActivity.init(); });"
  },
  {
    "path": "webservice/lalascan_web/app/static/js/pages/base_ui_icons.js",
    "content": "/*\n *  Document   : base_ui_icons.js\n *  Author     : pixelcave\n *  Description: Custom JS code used in Icons Page\n */\n\nvar BaseUIIcons = function() {\n    // Icon search functionality\n    var initIconSearch = function(){\n        // Set variables\n        var $searchItems = jQuery('.js-icon-list > div');\n        var $searchValue = '';\n\n        // When user types\n        jQuery('.js-icon-search').on('keyup', function(){\n            $searchValue = jQuery(this).val().toLowerCase();\n\n            if ($searchValue.length > 2) { // If more than 2 characters, search the icons\n                $searchItems.hide();\n\n                jQuery('code', $searchItems)\n                    .each(function(){\n                        if (jQuery(this).text().match($searchValue)) {\n                            jQuery(this).parent('div').show();\n                        }\n                    });\n            } else if ($searchValue.length === 0) { // If text deleted show all icons\n                $searchItems.show();\n            }\n        });\n    };\n\n    return {\n        init: function() {\n            // Init icon search\n            initIconSearch();\n        }\n    };\n}();\n\n// Initialize when page loads\njQuery(function(){ BaseUIIcons.init(); });"
  },
  {
    "path": "webservice/lalascan_web/app/static/js/pages/base_ui_widgets.js",
    "content": "/*\n *  Document   : base_ui_widgets.js\n *  Author     : pixelcave\n *  Description: Custom JS code used in Widgets Page\n */\n\nvar BaseUIWidgets = function() {\n    // jQuery Sparkline Charts, for more examples you can check out http://omnipotent.net/jquery.sparkline/#s-docs\n    var initWidgetsSparkline = function(){\n        // Line Charts\n        var $lineOptions = {\n            type: 'line',\n            width: '200px',\n            height: '120px',\n            tooltipOffsetX: -25,\n            tooltipOffsetY: 20,\n            lineColor: '#abe37d',\n            fillColor: '#abe37d',\n            spotColor: '#777777',\n            minSpotColor: '#777777',\n            maxSpotColor: '#777777',\n            highlightSpotColor: '#777777',\n            highlightLineColor: '#777777',\n            spotRadius: 2,\n            tooltipPrefix: '',\n            tooltipSuffix: ' Sales',\n            tooltipFormat: '{{prefix}}{{y}}{{suffix}}'\n        };\n        jQuery('.js-widget-line1').sparkline('html', $lineOptions);\n\n        $lineOptions['lineColor']       = '#fadb7d';\n        $lineOptions['fillColor']       = '#fadb7d';\n        $lineOptions['tooltipPrefix']   = '';\n        $lineOptions['tooltipSuffix']   = ' Tickets';\n        jQuery('.js-widget-line2').sparkline('html', $lineOptions);\n\n        $lineOptions['lineColor']       = '#faad7d';\n        $lineOptions['fillColor']       = '#faad7d';\n        $lineOptions['tooltipPrefix']   = '$ ';\n        $lineOptions['tooltipSuffix']   = '';\n        jQuery('.js-widget-line3').sparkline('html', $lineOptions);\n    };\n\n    return {\n        init: function() {\n            // Init all charts\n            initWidgetsSparkline();\n        }\n    };\n}();\n\n// Initialize when page loads\njQuery(function(){ BaseUIWidgets.init(); });"
  },
  {
    "path": "webservice/lalascan_web/app/static/js/pages/frontend_contact.js",
    "content": "/*\n *  Document   : frontend_contact.js\n *  Author     : pixelcave\n *  Description: Custom JS code used in Frontend Contact Page\n */\n\nvar FrontendContact = function() {\n    // Init Contact Map with Gmaps.js, for more examples you can check out https://hpneo.github.io/gmaps/\n    var initContactMap = function(){\n        new GMaps({\n            div: '#js-map-contact',\n            lat: 37.75755,\n            lng: -122.43688,\n            zoom: 15,\n            disableDefaultUI: true,\n            scrollwheel: false\n        }).addMarkers([\n            {lat: 37.75755, lng: -122.43688, title: 'Marker #1', animation: google.maps.Animation.DROP, infoWindow: {content: '<strong>Company</strong>'}}\n        ]);\n    };\n\n    return {\n        init: function () {\n            // Init Contact Map\n            initContactMap();\n        }\n    };\n}();\n\n// Initialize when page loads\njQuery(function(){ FrontendContact.init(); });"
  },
  {
    "path": "webservice/lalascan_web/app/static/js/pages/frontend_features.js",
    "content": "/*\n *  Document   : frontend_features.js\n *  Author     : pixelcave\n *  Description: Custom JS code used in Frontend Features Page\n */\n\nvar FrontendFeatures = function() {\n    // Chart.js Chart, for more examples you can check out http://www.chartjs.org/docs\n    var initFeaturesChartJS = function(){\n        // Get Chart Container\n        var $featuresChartLinesCon  = jQuery('.js-features-chartjs-lines')[0].getContext('2d');\n\n        // Set Chart and Chart Data variables\n        var $featuresChartLines, $featuresChartLinesData;\n\n        // Lines Chart Data\n        var $featuresChartLinesData = {\n            labels: ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'],\n            datasets: [\n                {\n                    label: 'This Week',\n                    fillColor: 'rgba(0, 0, 0, .07)',\n                    strokeColor: 'rgba(0, 0, 0, .25)',\n                    pointColor: 'rgba(0, 0, 0, .25)',\n                    pointStrokeColor: '#fff',\n                    pointHighlightFill: '#fff',\n                    pointHighlightStroke: 'rgba(0, 0, 0, 1)',\n                    data: [24, 30, 40, 70, 76, 170, 350]\n                },\n                {\n                    label: 'Last Week',\n                    fillColor: 'rgba(0, 0, 0, .1)',\n                    strokeColor: 'rgba(0, 0, 0, .55)',\n                    pointColor: 'rgba(0, 0, 0, .55)',\n                    pointStrokeColor: '#fff',\n                    pointHighlightFill: '#fff',\n                    pointHighlightStroke: 'rgba(0, 0, 0, 1)',\n                    data: [12, 15, 20, 35, 38, 90, 250]\n                }\n            ]\n        };\n\n        // Init Lines Chart\n        $featuresChartLines = new Chart($featuresChartLinesCon).Line($featuresChartLinesData, {\n            scaleFontFamily: \"'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif\",\n            scaleFontColor: '#fff',\n            scaleFontStyle: '600',\n            tooltipTitleFontFamily: \"'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif\",\n            tooltipCornerRadius: 3,\n            maintainAspectRatio: false,\n            responsive: true,\n            scaleShowGridLines: false,\n            scaleShowLabels : false\n        });\n    };\n\n    return {\n        init: function () {\n            // Init ChartJS chart\n            initFeaturesChartJS();\n        }\n    };\n}();\n\n// Initialize when page loads\njQuery(function(){ FrontendFeatures.init(); });"
  },
  {
    "path": "webservice/lalascan_web/app/static/less/main.less",
    "content": "// Variables and Mixins\r\n@import \"variables.less\";\r\n@import \"mixins.less\";\r\n\r\n// Bootstrap framework & overwriting\r\n@import \"modules/base.bootstrap.less\";\r\n@import \"modules/base.bootstrap-overwrite.less\";\r\n\r\n// Icons\r\n@import \"modules/icons.fontawesome.less\";\r\n@import \"modules/icons.simplelineicons.less\";\r\n\r\n// Modules\r\n@import \"modules/oneui.layout.less\";\r\n@import \"modules/oneui.forms.less\";\r\n@import \"modules/oneui.blocks.less\";\r\n@import \"modules/oneui.navigation.less\";\r\n@import \"modules/oneui.lists.less\";\r\n@import \"modules/oneui.images.less\";\r\n@import \"modules/oneui.utilities.less\";\r\n@import \"modules/oneui.themes.less\";\r\n@import \"modules/oneui.print.less\";\r\n\r\n// Third Party\r\n@import \"modules/extend.animations.less\";\r\n@import \"modules/extend.plugins.less\";"
  },
  {
    "path": "webservice/lalascan_web/app/static/less/mixins.less",
    "content": "//\r\n// Mixins\r\n// --------------------------------------------------\r\n\r\n// Bootstrap Mixins\r\n\r\n// Clearfix\r\n.clearfix() {\r\n    &:before,\r\n        &:after {\r\n        content: \" \"; // 1\r\n        display: table; // 2\r\n    }\r\n    &:after {\r\n        clear: both;\r\n    }\r\n}\r\n\r\n// Single side border-radius\r\n.border-top-radius(@radius) {\r\n    border-top-right-radius: @radius;\r\n    border-top-left-radius: @radius;\r\n}\r\n.border-right-radius(@radius) {\r\n    border-bottom-right-radius: @radius;\r\n    border-top-right-radius: @radius;\r\n}\r\n.border-bottom-radius(@radius) {\r\n    border-bottom-right-radius: @radius;\r\n    border-bottom-left-radius: @radius;\r\n}\r\n.border-left-radius(@radius) {\r\n    border-bottom-left-radius: @radius;\r\n    border-top-left-radius: @radius;\r\n}\r\n\r\n// Drop shadows\r\n.box-shadow(@shadow) {\r\n    -webkit-box-shadow: @shadow;\r\n    box-shadow: @shadow;\r\n}\r\n\r\n// Transitions\r\n.transition(@transition) {\r\n    -webkit-transition: @transition;\r\n    transition: @transition;\r\n}\r\n.transition-delay(@transition-delay) {\r\n    -webkit-transition-delay: @transition-delay;\r\n    transition-delay: @transition-delay;\r\n}\r\n.transition-duration(@transition-duration) {\r\n    -webkit-transition-duration: @transition-duration;\r\n    transition-duration: @transition-duration;\r\n}\r\n.transition-transform(@transition) {\r\n    -webkit-transition: -webkit-transform @transition;\r\n    transition: transform @transition;\r\n}\r\n\r\n// Backface visibility\r\n.backface-visibility(@visibility){\r\n    -webkit-backface-visibility: @visibility;\r\n    backface-visibility: @visibility;\r\n}\r\n\r\n// Transformations\r\n.transform(@scale, @rotate) {\r\n    -webkit-transform: @arguments;\r\n    -ms-transform: @arguments;\r\n    transform: @arguments;\r\n}\r\n.scale(@ratio) {\r\n    -webkit-transform: scale(@ratio);\r\n    -ms-transform: scale(@ratio);\r\n    transform: scale(@ratio);\r\n}\r\n.scale(@ratioX; @ratioY) {\r\n    -webkit-transform: scale(@ratioX, @ratioY);\r\n    -ms-transform: scale(@ratioX, @ratioY);\r\n    transform: scale(@ratioX, @ratioY);\r\n}\r\n.scaleX(@ratio) {\r\n    -webkit-transform: scaleX(@ratio);\r\n    -ms-transform: scaleX(@ratio);\r\n    transform: scaleX(@ratio);\r\n}\r\n.scaleY(@ratio) {\r\n    -webkit-transform: scaleY(@ratio);\r\n    -ms-transform: scaleY(@ratio);\r\n    transform: scaleY(@ratio);\r\n}\r\n.skew(@x; @y) {\r\n    -webkit-transform: skewX(@x) skewY(@y);\r\n    -ms-transform: skewX(@x) skewY(@y);\r\n    transform: skewX(@x) skewY(@y);\r\n}\r\n.translate(@x; @y) {\r\n    -webkit-transform: translate(@x, @y);\r\n    -ms-transform: translate(@x, @y);\r\n    transform: translate(@x, @y);\r\n}\r\n.translateX(@x) {\r\n    -webkit-transform: translateX(@x);\r\n    -ms-transform: translateX(@x);\r\n    transform: translateX(@x);\r\n}\r\n.translateY(@y) {\r\n    -webkit-transform: translateY(@y);\r\n    -ms-transform: translateY(@y);\r\n    transform: translateY(@y);\r\n}\r\n.translate3d(@x; @y; @z) {\r\n    -webkit-transform: translateX(@x) translateY(@y) translateZ(@z);\r\n    -ms-transform: translateX(@x) translateY(@y);\r\n    transform: translateX(@x) translateY(@y) translateZ(@z);\r\n}\r\n.rotate(@degrees) {\r\n    -webkit-transform: rotate(@degrees);\r\n    -ms-transform: rotate(@degrees);\r\n    transform: rotate(@degrees);\r\n}\r\n.rotateX(@degrees) {\r\n    -webkit-transform: rotateX(@degrees);\r\n    -ms-transform: rotateX(@degrees);\r\n    transform: rotateX(@degrees);\r\n}\r\n.rotateY(@degrees) {\r\n    -webkit-transform: rotateY(@degrees);\r\n    -ms-transform: rotateY(@degrees);\r\n    transform: rotateY(@degrees);\r\n}\r\n.perspective(@perspective) {\r\n    -webkit-perspective: @perspective;\r\n    -moz-perspective: @perspective;\r\n    perspective: @perspective;\r\n}\r\n.perspective-origin(@perspective) {\r\n    -webkit-perspective-origin: @perspective;\r\n    -moz-perspective-origin: @perspective;\r\n    perspective-origin: @perspective;\r\n}\r\n.transform-origin(@origin) {\r\n    -webkit-transform-origin: @origin;\r\n    -moz-transform-origin: @origin;\r\n    -ms-transform-origin: @origin;\r\n    transform-origin: @origin;\r\n}\r\n\r\n// Animations\r\n.animation(@animation) {\r\n    -webkit-animation: @animation;\r\n    animation: @animation;\r\n}\r\n\r\n// Typography\r\n.text-emphasis-variant(@color) {\r\n    color: @color;\r\n\r\n    a&:hover,\r\n    a&:active,\r\n    a&:focus,\r\n    button&:hover,\r\n    button&:active,\r\n    button&:focus {\r\n        color: @color;\r\n        opacity: .75;\r\n    }\r\n}\r\n\r\n// Contextual backgrounds\r\n.bg-variant(@color) {\r\n    background-color: @color;\r\n    a&:hover {\r\n        background-color: darken(@color, 10%);\r\n    }\r\n}\r\n\r\n// Buttons\r\n.button-variant(@color; @background; @border) {\r\n    color: @color;\r\n    background-color: @background;\r\n    border-color: @border;\r\n\r\n    &:hover,\r\n    &:focus,\r\n    &.focus,\r\n    &:active,\r\n    &.active,\r\n    .open > .dropdown-toggle& {\r\n        color: @color;\r\n        background-color: darken(@background, 8%);\r\n        border-color: darken(@border, 12%);\r\n    }\r\n\r\n    &:active,\r\n    &.active,\r\n    .open > .dropdown-toggle& {\r\n        background-color: darken(@background, 18%);\r\n        border-color: darken(@border, 22%);\r\n    }\r\n\r\n    &.disabled,\r\n    &[disabled],\r\n    fieldset[disabled] & {\r\n    &,\r\n    &:hover,\r\n    &:focus,\r\n    &.focus,\r\n    &:active,\r\n    &.active {\r\n            background-color: @background;\r\n            border-color: @border;\r\n        }\r\n    }\r\n\r\n    .badge {\r\n        color: @background;\r\n        background-color: @color;\r\n    }\r\n}\r\n\r\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\r\n    padding: @padding-vertical @padding-horizontal;\r\n    font-size: @font-size;\r\n    line-height: @line-height;\r\n    border-radius: @border-radius;\r\n}\r\n\r\n// Forms\r\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\r\n    // Color the label and help text\r\n    > label,\r\n    .help-block,\r\n    .control-label,\r\n    .radio,\r\n    .checkbox,\r\n    .radio-inline,\r\n    .checkbox-inline,\r\n    &.radio label,\r\n    &.checkbox label,\r\n    &.radio-inline label,\r\n    &.checkbox-inline label  {\r\n        color: @text-color;\r\n    }\r\n    // Set the border and box shadow on specific inputs to match\r\n    .form-control {\r\n        border-color: @border-color;\r\n        .box-shadow(none);\r\n        &:focus {\r\n            border-color: darken(@border-color, 10%);\r\n            .box-shadow(none);\r\n        }\r\n    }\r\n    // Set validation states also for addons\r\n    .input-group-addon {\r\n        color: @text-color;\r\n        border-color: @border-color;\r\n        background-color: @background-color;\r\n    }\r\n    // Optional feedback icon\r\n    .form-control-feedback {\r\n        color: @text-color;\r\n    }\r\n}\r\n\r\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\r\n    height: @input-height;\r\n    padding: @padding-vertical @padding-horizontal;\r\n    font-size: @font-size;\r\n    line-height: @line-height;\r\n    border-radius: @border-radius;\r\n\r\n    select& {\r\n        height: @input-height;\r\n        line-height: @input-height;\r\n    }\r\n}\r\n\r\n.placeholder(@color) {\r\n  // Firefox\r\n  &::-moz-placeholder {\r\n    color: @color;\r\n  }\r\n  &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\r\n  &::-webkit-input-placeholder  { color: @color; } // Safari and Chrome\r\n}\r\n\r\n// Tables\r\n.table-row-variant(@state; @background) {\r\n    // Exact selectors below required to override `.table-striped` and prevent\r\n    // inheritance to nested tables.\r\n    .table > thead > tr,\r\n    .table > tbody > tr,\r\n    .table > tfoot > tr {\r\n        > td.@{state},\r\n        > th.@{state},\r\n        &.@{state} > td,\r\n        &.@{state} > th {\r\n            background-color: @background;\r\n        }\r\n    }\r\n\r\n    // Hover states for `.table-hover`\r\n    // Note: this is not available for cells or rows within `thead` or `tfoot`.\r\n    .table-hover > tbody > tr {\r\n        > td.@{state}:hover,\r\n        > th.@{state}:hover,\r\n        &.@{state}:hover > td,\r\n        &:hover > .@{state},\r\n        &.@{state}:hover > th {\r\n            background-color: darken(@background, 5%);\r\n        }\r\n    }\r\n}\r\n\r\n// Labels\r\n.label-variant(@color) {\r\n    background-color: @color;\r\n\r\n    &[href] {\r\n        &:hover,\r\n        &:focus {\r\n            background-color: darken(@color, 10%);\r\n        }\r\n    }\r\n}\r\n\r\n// Alerts\r\n.alert-variant(@background; @text-color) {\r\n    background-color: @background;\r\n    color: @text-color;\r\n    .box-shadow(0 2px darken(@background, 5%));\r\n\r\n    hr {\r\n        border-top-color: darken(@background, 5%);\r\n    }\r\n\r\n    .alert-link {\r\n        color: darken(@text-color, 10%);\r\n    }\r\n}\r\n\r\n// Panels\r\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\r\n    border-color: @border;\r\n\r\n    & > .panel-heading {\r\n        color: @heading-text-color;\r\n        background-color: @heading-bg-color;\r\n        border-color: @heading-border;\r\n\r\n        + .panel-collapse > .panel-body {\r\n            border-top-color: @border;\r\n        }\r\n        .badge {\r\n            color: @heading-bg-color;\r\n            background-color: @heading-text-color;\r\n        }\r\n\r\n        a {\r\n            font-weight: 400;\r\n\r\n            &:hover,\r\n            &:focus {\r\n                color: darken(@heading-text-color, 10%);\r\n            }\r\n        }\r\n    }\r\n\r\n    & > .panel-footer {\r\n        + .panel-collapse > .panel-body {\r\n            border-bottom-color: @border;\r\n        }\r\n    }\r\n}\r\n\r\n\r\n// UI Framework Mixins\r\n\r\n// Layout\r\n.content-layout(@x, @y, @overflow) {\r\n    margin: 0 auto;\r\n    padding: @y @x 1px;\r\n    max-width: 100%;\r\n    overflow-x: @overflow;\r\n\r\n    p,\r\n    .push,\r\n    .block,\r\n    .items-push > div {\r\n        margin-bottom: @y;\r\n    }\r\n\r\n    .items-push-2x > div {\r\n        margin-bottom: (@y*2);\r\n    }\r\n\r\n    .items-push-3x > div {\r\n        margin-bottom: (@y*3);\r\n    }\r\n\r\n    &&-full {\r\n        padding-bottom: @y;\r\n\r\n        .pull-b {\r\n            margin-bottom: -@y;\r\n        }\r\n    }\r\n\r\n    .pull-t {\r\n        margin-top: -@y;\r\n    }\r\n\r\n    .pull-r-l {\r\n        margin-right: -@x;\r\n        margin-left: -@x;\r\n    }\r\n\r\n    .pull-b {\r\n        margin-bottom: -1px;\r\n    }\r\n}\r\n\r\n.push-generate(@space) {\r\n    margin-bottom: @space !important;\r\n\r\n    &-t { margin-top: @space !important; }\r\n    &-r { margin-right: @space !important; }\r\n    &-l { margin-left: @space !important; }\r\n}\r\n\r\n.vertical-align() {\r\n    position: absolute;\r\n    top: 50%;\r\n    .translateY(-50%);\r\n}\r\n\r\n// Material Form Inputs\r\n.form-control-material-focus-variant(@color) {\r\n    &:focus {\r\n        .box-shadow(0 2px 0 @color);\r\n\r\n        + label {\r\n            color: @color;\r\n        }\r\n\r\n        ~ .input-group-addon {\r\n            color: @color;\r\n            .box-shadow(0 2px 0 @color);\r\n        }\r\n    }\r\n}\r\n\r\n.form-control-material-state-variant(@color) {\r\n    > .form-control {\r\n        .box-shadow(0 1px 0 @color);\r\n\r\n        &:focus {\r\n            .box-shadow(0 2px 0 @color);\r\n\r\n            + label {\r\n                color: @color;\r\n            }\r\n\r\n            ~ .input-group-addon {\r\n                color: @color;\r\n                .box-shadow(0 2px 0 @color);\r\n            }\r\n        }\r\n\r\n        & + label {\r\n            color: @color;\r\n        }\r\n\r\n        ~ .input-group-addon {\r\n            color: @color;\r\n            .box-shadow(0 1px 0 @color);\r\n        }\r\n    }\r\n\r\n    > .help-block {\r\n        color: @color;\r\n    }\r\n}\r\n\r\n// Generate color theme\r\n.color-theme(@brand-primary; @brand-light; @brand-lighter; @brand-dark; @brand-darker; @body-bg) {\r\n    body {\r\n        background-color: @body-bg;\r\n    }\r\n\r\n    // Bootstrap\r\n    a {\r\n        color: @brand-primary;\r\n\r\n        &.link-effect:before {\r\n            background-color: darken(@brand-primary, 15%);\r\n        }\r\n\r\n        &:hover,\r\n        &:focus {\r\n            color: darken(@brand-primary, 15%);\r\n        }\r\n\r\n        &:active {\r\n            color: @brand-primary;\r\n        }\r\n    }\r\n\r\n    .text {\r\n        &-primary {\r\n            .text-emphasis-variant(@brand-primary);\r\n        }\r\n\r\n        &-primary-dark {\r\n            .text-emphasis-variant(@brand-dark);\r\n        }\r\n\r\n        &-primary-darker {\r\n            .text-emphasis-variant(@brand-darker);\r\n        }\r\n\r\n        &-primary-light {\r\n            .text-emphasis-variant(@brand-light);\r\n        }\r\n\r\n        &-primary-lighter {\r\n            .text-emphasis-variant(@brand-lighter);\r\n        }\r\n    }\r\n\r\n    // Emphasis background colors\r\n    .bg {\r\n        &-primary {\r\n            .bg-variant(@brand-primary);\r\n        }\r\n\r\n        &-primary-op {\r\n            .bg-variant(fade(@brand-primary, 75%));\r\n        }\r\n\r\n        &-primary-dark {\r\n            .bg-variant(@brand-dark);\r\n        }\r\n\r\n        &-primary-dark-op {\r\n            .bg-variant(fade(@brand-dark, 83%));\r\n        }\r\n\r\n        &-primary-darker {\r\n            .bg-variant(@brand-darker);\r\n        }\r\n\r\n        &-primary-light {\r\n            .bg-variant(@brand-light);\r\n        }\r\n\r\n        &-primary-lighter {\r\n            .bg-variant(@brand-lighter);\r\n        }\r\n    }\r\n\r\n    .btn-primary {\r\n        .button-variant(#fff; @brand-primary; darken(@brand-primary, 10%));\r\n    }\r\n\r\n    .label-primary {\r\n        .label-variant(@brand-primary);\r\n    }\r\n\r\n    .badge-primary {\r\n        background-color: @brand-primary;\r\n    }\r\n\r\n    .progress-bar-primary {\r\n        background-color: @brand-primary;\r\n    }\r\n\r\n    .nav-pills {\r\n        > li {\r\n            &.active > a {\r\n                &,\r\n                &:hover,\r\n                &:focus {\r\n                    background-color: @brand-primary;\r\n                }\r\n\r\n                > .badge {\r\n                    color: @brand-primary;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    .pagination {\r\n        > li > a,\r\n        > li > span {\r\n            &:hover,\r\n            &:focus {\r\n                color: @brand-primary;\r\n                .box-shadow(0 2px @brand-primary);\r\n            }\r\n        }\r\n\r\n        > .active > a,\r\n        > .active > span {\r\n            &,\r\n            &:hover,\r\n            &:focus {\r\n                color: @brand-primary;\r\n                .box-shadow(0 2px @brand-primary);\r\n            }\r\n        }\r\n    }\r\n\r\n    .pager li > a {\r\n        &:hover,\r\n        &:focus {\r\n            color: @brand-primary;\r\n        }\r\n    }\r\n\r\n    a.list-group-item {\r\n        &:hover,\r\n        &:focus {\r\n            color: @brand-primary;\r\n        }\r\n    }\r\n\r\n    .list-group-item.active {\r\n        &,\r\n        &:hover,\r\n        &:focus {\r\n            background-color: @brand-primary;\r\n            border-color: @brand-primary;\r\n        }\r\n\r\n        > .badge {\r\n            color: @brand-primary;\r\n        }\r\n    }\r\n\r\n    .tooltip-inner {\r\n        background-color: @brand-darker;\r\n    }\r\n\r\n    .tooltip {\r\n        &.top .tooltip-arrow {\r\n            border-top-color: @brand-darker;\r\n        }\r\n        &.right .tooltip-arrow {\r\n            border-right-color: @brand-darker;\r\n        }\r\n        &.left .tooltip-arrow {\r\n            border-left-color: @brand-darker;\r\n        }\r\n        &.bottom .tooltip-arrow {\r\n            border-bottom-color: @brand-darker;\r\n        }\r\n    }\r\n\r\n    .table-header-bg {\r\n        > thead > tr {\r\n            > th,\r\n            > td {\r\n                background-color: @brand-primary;\r\n                border-bottom-color: @brand-primary;\r\n            }\r\n        }\r\n    }\r\n\r\n    .panel-primary {\r\n        .panel-variant(@brand-lighter; @brand-primary; lighten(@brand-lighter, 7%); @brand-lighter);\r\n    }\r\n\r\n    // Layout\r\n    .header-navbar-transparent.header-navbar-fixed.header-navbar-scroll {\r\n        #header-navbar {\r\n            background-color: @brand-dark;\r\n        }\r\n    }\r\n\r\n    #page-container,\r\n    #sidebar {\r\n        background-color: @brand-darker;\r\n    }\r\n\r\n    #main-container {\r\n        background-color: @body-bg;\r\n    }\r\n\r\n    // Forms\r\n    .form-material.form-material-primary > .form-control {\r\n        .form-control-material-focus-variant(@brand-primary);\r\n    }\r\n\r\n    .css-checkbox-primary input:checked + span {\r\n        background-color: @brand-primary;\r\n        border-color: @brand-primary;\r\n    }\r\n\r\n    .css-radio-primary input:checked + span:after,\r\n    .switch-primary input:checked + span {\r\n        background-color: @brand-primary;\r\n    }\r\n\r\n    // Blocks\r\n    .block {\r\n        > .nav-tabs {\r\n            > li {\r\n                > a:hover {\r\n                    color: @brand-primary;\r\n                }\r\n            }\r\n\r\n            &.nav-tabs-alt {\r\n                > li {\r\n                    > a:hover {\r\n                        .box-shadow(0 2px @brand-primary);\r\n                    }\r\n\r\n                    &.active > a {\r\n                        &,\r\n                        &:hover,\r\n                        &:focus {\r\n                            .box-shadow(0 2px @brand-primary);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    // Plugins\r\n    .dropzone:hover {\r\n        border-color: @brand-primary;\r\n\r\n        .dz-message {\r\n            color: @brand-primary;\r\n        }\r\n    }\r\n\r\n    .datepicker table tr td.active:hover,\r\n    .datepicker table tr td.active:hover:hover,\r\n    .datepicker table tr td.active.disabled:hover,\r\n    .datepicker table tr td.active.disabled:hover:hover,\r\n    .datepicker table tr td.active:focus,\r\n    .datepicker table tr td.active:hover:focus,\r\n    .datepicker table tr td.active.disabled:focus,\r\n    .datepicker table tr td.active.disabled:hover:focus,\r\n    .datepicker table tr td.active:active,\r\n    .datepicker table tr td.active:hover:active,\r\n    .datepicker table tr td.active.disabled:active,\r\n    .datepicker table tr td.active.disabled:hover:active,\r\n    .datepicker table tr td.active.active,\r\n    .datepicker table tr td.active:hover.active,\r\n    .datepicker table tr td.active.disabled.active,\r\n    .datepicker table tr td.active.disabled:hover.active,\r\n    .open .dropdown-toggle.datepicker table tr td.active,\r\n    .open .dropdown-toggle.datepicker table tr td.active:hover,\r\n    .open .dropdown-toggle.datepicker table tr td.active.disabled,\r\n    .open .dropdown-toggle.datepicker table tr td.active.disabled:hover,\r\n    .datepicker table tr td span.active:hover,\r\n    .datepicker table tr td span.active:hover:hover,\r\n    .datepicker table tr td span.active.disabled:hover,\r\n    .datepicker table tr td span.active.disabled:hover:hover,\r\n    .datepicker table tr td span.active:focus,\r\n    .datepicker table tr td span.active:hover:focus,\r\n    .datepicker table tr td span.active.disabled:focus,\r\n    .datepicker table tr td span.active.disabled:hover:focus,\r\n    .datepicker table tr td span.active:active,\r\n    .datepicker table tr td span.active:hover:active,\r\n    .datepicker table tr td span.active.disabled:active,\r\n    .datepicker table tr td span.active.disabled:hover:active,\r\n    .datepicker table tr td span.active.active,\r\n    .datepicker table tr td span.active:hover.active,\r\n    .datepicker table tr td span.active.disabled.active,\r\n    .datepicker table tr td span.active.disabled:hover.active,\r\n    .open .dropdown-toggle.datepicker table tr td span.active,\r\n    .open .dropdown-toggle.datepicker table tr td span.active:hover,\r\n    .open .dropdown-toggle.datepicker table tr td span.active.disabled,\r\n    .open .dropdown-toggle.datepicker table tr td span.active.disabled:hover {\r\n        background-color: @brand-primary;\r\n        border-color: @brand-primary;\r\n    }\r\n\r\n    div.tagsinput span.tag {\r\n        background-color: @brand-primary;\r\n    }\r\n\r\n    .select2-container--default {\r\n        .select2-selection--multiple {\r\n            .select2-selection__choice {\r\n                background-color: @brand-primary;\r\n            }\r\n        }\r\n\r\n        .select2-results__option--highlighted[aria-selected] {\r\n            background-color: @brand-primary;\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "webservice/lalascan_web/app/static/less/modules/base.bootstrap-overwrite.less",
    "content": "//\r\n// Bootstrap Overwrite & Extend\r\n// --------------------------------------------------\r\n\r\n// Scaffolding\r\nhtml, body {\r\n    height: 100%;\r\n}\r\n\r\nbody {\r\n    font-family: @font-family-base;\r\n    font-size: @font-size-base;\r\n    color: @text-color;\r\n    background-color: @body-bg;\r\n}\r\n\r\n.no-focus *:focus {\r\n    // Disabling focus outline is not a good practice for accessibility reasons\r\n    // It is disabled for better demostrating template's design by making it simpler\r\n    // Elements have their own focus styles but consider enabling the outline in\r\n    // production by removing .no-focus class from <html> tag\r\n    outline: 0 !important;\r\n}\r\n\r\n// Links\r\na {\r\n    color: @link-color;\r\n    .transition(color .12s ease-out);\r\n\r\n    &.link-effect {\r\n        position: relative;\r\n\r\n        &:before {\r\n            position: absolute;\r\n            bottom: 0;\r\n            left: 0;\r\n            width: 100%;\r\n            height: 2px;\r\n            content: \"\";\r\n            background-color: @link-hover-color;\r\n            visibility: hidden;\r\n            .scaleX(0);\r\n            .transition-transform(.12s ease-out);\r\n        }\r\n    }\r\n\r\n    &:hover,\r\n    &:focus {\r\n        color: @link-hover-color;\r\n        text-decoration: @link-hover-decoration;\r\n\r\n        &.link-effect:before {\r\n            visibility: visible;\r\n            .scaleX(1);\r\n        }\r\n    }\r\n\r\n    &:active {\r\n        color: @link-color;\r\n    }\r\n\r\n    &.inactive {\r\n        cursor: not-allowed;\r\n\r\n        &:focus {\r\n            background-color: transparent !important;\r\n        }\r\n    }\r\n}\r\n\r\n// Typography\r\nh1, h2, h3, h4, h5, h6,\r\n.h1, .h2, .h3, .h4, .h5, .h6 {\r\n    margin: 0;\r\n    font-family: @headings-font-family;\r\n    font-weight: @headings-font-weight;\r\n    line-height: @headings-line-height;\r\n    color: inherit;\r\n\r\n    small,\r\n    .small {\r\n        font-weight: @headings-font-weight;\r\n        font-size: 85%;\r\n        color: #777;\r\n    }\r\n}\r\n\r\n.h1, .h2, .h3, .h4, .h5, .h6 {\r\n    font-weight: inherit;\r\n}\r\n\r\nh1, .h1 { font-size: @font-size-h1; }\r\nh2, .h2 { font-size: @font-size-h2; }\r\nh3, .h3 { font-size: @font-size-h3; }\r\nh4, .h4 { font-size: @font-size-h4; }\r\nh5, .h5 { font-size: @font-size-h5; }\r\nh6, .h6 { font-size: @font-size-h6; }\r\n\r\n.page-heading {\r\n    color: @text-color-dark;\r\n    font-size: 28px;\r\n    font-weight: 400;\r\n\r\n    small {\r\n        margin-top: 5px;\r\n        display: block;\r\n        color: #777;\r\n        font-size: 16px;\r\n        font-weight: 300;\r\n        line-height: 1.4;\r\n\r\n        @media screen and (min-width: @screen-sm-min) {\r\n            margin-top: 0;\r\n            display: inline;\r\n            line-height: inherit;\r\n        }\r\n    }\r\n}\r\n\r\n.content-heading {\r\n    margin-top: 15px;\r\n    margin-bottom: 15px;\r\n    font-weight: 600;\r\n    font-size: 15px;\r\n    color: darken(@gray-dark, 5%);\r\n    text-transform: uppercase;\r\n\r\n    small {\r\n        font-size: 13px;\r\n        font-weight: normal;\r\n        color: @gray-dark;\r\n        text-transform: none;\r\n    }\r\n\r\n    @media screen and (min-width: @screen-sm-min) {\r\n        margin-top: 25px;\r\n    }\r\n}\r\n\r\n.font-w300 { font-weight: 300 !important; }\r\n.font-w400 { font-weight: 400 !important; }\r\n.font-w600 { font-weight: 600 !important; }\r\n.font-w700 { font-weight: 700 !important; }\r\n\r\n.font-s12 { font-size: 12px !important; }\r\n.font-s13 { font-size: 13px !important; }\r\n.font-s36 { font-size: 36px !important; }\r\n.font-s48 { font-size: 48px !important; }\r\n.font-s64 { font-size: 64px !important; }\r\n.font-s96 { font-size: 96px !important; }\r\n.font-s128 { font-size: 128px !important; }\r\n\r\np {\r\n    line-height: @line-height-base;\r\n\r\n    &.nice-copy,\r\n    .nice-copy & {\r\n        line-height: 1.8;\r\n    }\r\n}\r\n\r\n// Emphasis\r\n.text {\r\n    &-muted {\r\n        .text-emphasis-variant(@gray-dark);\r\n    }\r\n\r\n    &-primary {\r\n        .text-emphasis-variant(@brand-primary);\r\n    }\r\n\r\n    &-primary-dark {\r\n        .text-emphasis-variant(@brand-dark);\r\n    }\r\n\r\n    &-primary-darker {\r\n        .text-emphasis-variant(@brand-darker);\r\n    }\r\n\r\n    &-primary-light {\r\n        .text-emphasis-variant(@brand-light);\r\n    }\r\n\r\n    &-primary-lighter {\r\n        .text-emphasis-variant(@brand-lighter);\r\n    }\r\n\r\n    &-success {\r\n        .text-emphasis-variant(@brand-success);\r\n    }\r\n\r\n    &-warning {\r\n        .text-emphasis-variant(@brand-warning);\r\n    }\r\n\r\n    &-info {\r\n        .text-emphasis-variant(@brand-info);\r\n    }\r\n\r\n    &-danger {\r\n        .text-emphasis-variant(@brand-danger);\r\n    }\r\n\r\n    &-success-light {\r\n        .text-emphasis-variant(@brand-success-light);\r\n    }\r\n\r\n    &-warning-light {\r\n        .text-emphasis-variant(@brand-warning-light);\r\n    }\r\n\r\n    &-info-light {\r\n        .text-emphasis-variant(@brand-info-light);\r\n    }\r\n\r\n    &-danger-light {\r\n        .text-emphasis-variant(@brand-danger-light);\r\n    }\r\n\r\n    &-white {\r\n        .text-emphasis-variant(#fff);\r\n    }\r\n\r\n    &-white-op {\r\n        .text-emphasis-variant(rgba(255,255,255,.85));\r\n    }\r\n\r\n    &-black {\r\n        .text-emphasis-variant(#000);\r\n    }\r\n\r\n    &-black-op {\r\n        .text-emphasis-variant(rgba(0,0,0,.5));\r\n    }\r\n\r\n    &-gray {\r\n        .text-emphasis-variant(@gray-base);\r\n    }\r\n\r\n    &-gray-dark {\r\n        .text-emphasis-variant(@gray-dark);\r\n    }\r\n\r\n    &-gray-darker {\r\n        .text-emphasis-variant(@gray-darker);\r\n    }\r\n\r\n    &-gray-light {\r\n        .text-emphasis-variant(@gray-light);\r\n    }\r\n\r\n    &-gray-lighter {\r\n        .text-emphasis-variant(@gray-lighter);\r\n    }\r\n}\r\n\r\n// Emphasis background colors\r\n.bg {\r\n    &-muted {\r\n        .bg-variant(@gray-dark);\r\n    }\r\n\r\n    &-primary {\r\n        .bg-variant(@brand-primary);\r\n    }\r\n\r\n    &-primary-op {\r\n        .bg-variant(fade(@brand-primary, 75%));\r\n    }\r\n\r\n    &-primary-dark {\r\n        .bg-variant(@brand-dark);\r\n    }\r\n\r\n    &-primary-dark-op {\r\n        .bg-variant(fade(@brand-dark, 83%));\r\n    }\r\n\r\n    &-primary-darker {\r\n        .bg-variant(@brand-darker);\r\n    }\r\n\r\n    &-primary-light {\r\n        .bg-variant(@brand-light);\r\n    }\r\n\r\n    &-primary-lighter {\r\n        .bg-variant(@brand-lighter);\r\n    }\r\n\r\n    &-success {\r\n        .bg-variant(@brand-success);\r\n    }\r\n\r\n    &-warning {\r\n        .bg-variant(@brand-warning);\r\n    }\r\n\r\n    &-info {\r\n        .bg-variant(@brand-info);\r\n    }\r\n\r\n    &-danger {\r\n        .bg-variant(@brand-danger);\r\n    }\r\n\r\n    &-success-light {\r\n        .bg-variant(@brand-success-light);\r\n    }\r\n\r\n    &-warning-light {\r\n        .bg-variant(@brand-warning-light);\r\n    }\r\n\r\n    &-info-light {\r\n        .bg-variant(@brand-info-light);\r\n    }\r\n\r\n    &-danger-light {\r\n        .bg-variant(@brand-danger-light);\r\n    }\r\n\r\n    &-white {\r\n        .bg-variant(#fff);\r\n    }\r\n\r\n    &-white-op {\r\n        background-color: rgba(255,255,255,.075);\r\n    }\r\n\r\n    &-black {\r\n        .bg-variant(#000);\r\n    }\r\n\r\n    &-black-op {\r\n        background-color: rgba(0,0,0,.4);\r\n    }\r\n\r\n    &-gray {\r\n        .bg-variant(@gray-base);\r\n    }\r\n\r\n    &-gray-dark {\r\n        .bg-variant(@gray-dark);\r\n    }\r\n\r\n    &-gray-darker {\r\n        .bg-variant(@gray-darker);\r\n    }\r\n\r\n    &-gray-light {\r\n        .bg-variant(@gray-light);\r\n    }\r\n\r\n    &-gray-lighter {\r\n        .bg-variant(@gray-lighter);\r\n    }\r\n}\r\n\r\n// Buttons\r\n.btn {\r\n    font-weight: 600;\r\n    border-radius: 2px;\r\n    .transition(all .15s ease-out);\r\n\r\n    &:active,\r\n    &.active {\r\n        .box-shadow(none);\r\n    }\r\n\r\n    &.btn-square {\r\n        border-radius: 0;\r\n    }\r\n\r\n    &.btn-rounded {\r\n        border-radius: 20px;\r\n    }\r\n\r\n    &.btn-minw {\r\n        min-width: 110px;\r\n    }\r\n\r\n    &.btn-noborder {\r\n        border: none !important;\r\n    }\r\n\r\n    &.btn-image {\r\n        position: relative;\r\n        padding-left: 40px;\r\n\r\n        > img {\r\n            position: absolute;\r\n            top: 3px;\r\n            left: 3px;\r\n            display: block;\r\n            width: 26px;\r\n            height: 26px;\r\n            border-radius: 3px;\r\n        }\r\n    }\r\n\r\n    > i {\r\n        &.pull-left {\r\n            margin-top: 3px;\r\n            margin-right: 5px;\r\n        }\r\n\r\n        &.pull-right {\r\n            margin-top: 3px;\r\n            margin-left: 5px;\r\n        }\r\n    }\r\n}\r\n\r\n.btn-link,\r\n.btn-link:hover,\r\n.btn-link:focus {\r\n    text-decoration: none;\r\n}\r\n\r\n.btn-default {\r\n    .button-variant(@text-color-dark; #f5f5f5; #e9e9e9);\r\n}\r\n\r\n.btn-primary {\r\n    .button-variant(#fff; @brand-primary; darken(@brand-primary, 10%));\r\n}\r\n\r\n.btn-success {\r\n    .button-variant(#fff; @brand-success; darken(@brand-success, 10%));\r\n}\r\n\r\n.btn-info {\r\n    .button-variant(#fff; @brand-info; darken(@brand-info, 10%));\r\n}\r\n\r\n.btn-warning {\r\n    .button-variant(#fff; @brand-warning; darken(@brand-warning, 10%));\r\n}\r\n\r\n.btn-danger {\r\n    .button-variant(#fff; @brand-danger; darken(@brand-danger, 10%));\r\n}\r\n\r\n// Forms\r\nlabel {\r\n    font-size: 13px;\r\n    font-weight: 600;\r\n}\r\n\r\n.form-control {\r\n    color: @text-color;\r\n    border: 1px solid @form-border-color;\r\n    border-radius: 3px;\r\n    .box-shadow(none);\r\n    .transition(all .15s ease-out);\r\n    .placeholder(#aaa);\r\n\r\n    &:focus {\r\n        border-color: @form-border-focus-color;\r\n        background-color: @form-bg-focus-color;\r\n        .box-shadow(none);\r\n    }\r\n\r\n    textarea& {\r\n        max-width: 100%;\r\n    }\r\n\r\n    input[type=\"text\"]&,\r\n    input[type=\"password\"]&,\r\n    input[type=\"email\"]&,\r\n    textarea& {\r\n        -webkit-appearance: none;\r\n    }\r\n\r\n    &.input-sm {\r\n        border-radius: 3px;\r\n    }\r\n\r\n    &.input-lg {\r\n        font-size: 14px;\r\n        border-radius: 3px;\r\n    }\r\n\r\n    .input-group-lg & {\r\n        font-size: 14px;\r\n    }\r\n}\r\n\r\n.form-group {\r\n    margin-bottom: 20px;\r\n\r\n    .form-bordered & {\r\n        padding-bottom: 10px;\r\n        margin-bottom: 10px;\r\n        border-bottom: 1px solid @gray-light;\r\n\r\n        &.form-actions {\r\n            border-bottom: none;\r\n        }\r\n    }\r\n}\r\n\r\n.help-block {\r\n    margin-top: 5px;\r\n    margin-bottom: 0;\r\n    font-style: italic;\r\n    font-size: 13px;\r\n    color: lighten(@text-color, 25%);\r\n}\r\n\r\n.has-success {\r\n  .form-control-validation(@brand-success; @brand-success; #fff);\r\n}\r\n\r\n.has-info {\r\n  .form-control-validation(@brand-info; @brand-info; #fff);\r\n}\r\n\r\n.has-warning {\r\n  .form-control-validation(@brand-warning; @brand-warning; #fff);\r\n}\r\n\r\n.has-error {\r\n  .form-control-validation(@brand-danger; @brand-danger; #fff);\r\n}\r\n\r\n// Input groups\r\n.input-group-addon {\r\n    color: @text-color;\r\n    background-color: #f9f9f9;\r\n    border-color: @form-border-color;\r\n    border-radius: 3px;\r\n\r\n    &.input-sm,\r\n    &.input-lg {\r\n        border-radius: 3px;\r\n    }\r\n}\r\n\r\n.input-group-sm > .form-control,\r\n.input-group-sm > .input-group-addon,\r\n.input-group-sm > .input-group-btn > .btn,\r\n.input-group-lg > .form-control,\r\n.input-group-lg > .input-group-addon,\r\n.input-group-lg > .input-group-btn > .btn {\r\n    border-radius: 3px;\r\n}\r\n\r\n.input-group .form-control:first-child,\r\n.input-group-addon:first-child,\r\n.input-group-btn:first-child > .btn,\r\n.input-group-btn:first-child > .btn-group > .btn,\r\n.input-group-btn:first-child > .dropdown-toggle,\r\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\r\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\r\n    .border-right-radius(0);\r\n}\r\n\r\n.input-group-addon:first-child {\r\n    border-right: 0;\r\n}\r\n\r\n.input-group .form-control:last-child,\r\n.input-group-addon:last-child,\r\n.input-group-btn:last-child > .btn,\r\n.input-group-btn:last-child > .btn-group > .btn,\r\n.input-group-btn:last-child > .dropdown-toggle,\r\n.input-group-btn:first-child > .btn:not(:first-child),\r\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\r\n    .border-left-radius(0);\r\n}\r\n\r\n.input-group-addon:last-child {\r\n    border-left: 0;\r\n}\r\n\r\n// Labels\r\n.label-primary {\r\n    .label-variant(@brand-primary);\r\n}\r\n\r\n.label-success {\r\n    .label-variant(@brand-success);\r\n}\r\n\r\n.label-info {\r\n    .label-variant(@brand-info);\r\n}\r\n\r\n.label-warning {\r\n    .label-variant(@brand-warning);\r\n}\r\n\r\n.label-danger {\r\n    .label-variant(@brand-danger);\r\n}\r\n\r\n// Badges\r\n.badge-primary {\r\n    background-color: @brand-primary;\r\n}\r\n\r\n.badge-success {\r\n    background-color: @brand-success;\r\n}\r\n\r\n.badge-info {\r\n    background-color: @brand-info;\r\n}\r\n\r\n.badge-warning {\r\n    background-color: @brand-warning;\r\n}\r\n\r\n.badge-danger {\r\n    background-color: @brand-danger;\r\n}\r\n\r\n// Alerts\r\n.alert {\r\n    padding-bottom: 10px;\r\n    border-radius: 2px;\r\n    border: none;\r\n\r\n    p {\r\n        margin-bottom: 5px !important;\r\n    }\r\n}\r\n\r\n.alert-success {\r\n    .alert-variant(@brand-success-light; darken(@brand-success, 10%));\r\n}\r\n\r\n.alert-info {\r\n    .alert-variant(@brand-info-light; darken(@brand-info, 10%));\r\n}\r\n\r\n.alert-warning {\r\n    .alert-variant(@brand-warning-light; darken(@brand-warning, 10%));\r\n}\r\n\r\n.alert-danger {\r\n    .alert-variant(@brand-danger-light; darken(@brand-danger, 10%));\r\n}\r\n\r\n// Progress Bars\r\n.progress {\r\n    height: 24px;\r\n    border-radius: 2px;\r\n    .box-shadow(none);\r\n\r\n    &&-mini {\r\n        height: 5px;\r\n\r\n        .progress-bar {\r\n            line-height: 5px;\r\n        }\r\n    }\r\n}\r\n\r\n.progress-bar {\r\n    line-height: 24px;\r\n    font-weight: 600;\r\n    .box-shadow(none);\r\n}\r\n\r\n.progress-bar-primary {\r\n    background-color: @brand-primary;\r\n}\r\n\r\n.progress-bar-success {\r\n    background-color: @brand-success;\r\n}\r\n\r\n.progress-bar-info {\r\n    background-color: @brand-info;\r\n}\r\n\r\n.progress-bar-warning {\r\n    background-color: @brand-warning;\r\n}\r\n\r\n.progress-bar-danger {\r\n    background-color: @brand-danger;\r\n}\r\n\r\n// Nav Pills\r\n.nav-pills {\r\n    > li {\r\n        > a {\r\n            font-weight: 600;\r\n            color: @text-color;\r\n            border-radius: 3px;\r\n\r\n            &:hover,\r\n            &:focus {\r\n                color: @text-color;\r\n                background-color: @gray-lighter;\r\n            }\r\n        }\r\n\r\n        &.active > a {\r\n            &,\r\n            &:hover,\r\n            &:focus {\r\n                color: #fff;\r\n                background-color: @brand-primary;\r\n            }\r\n\r\n            > .badge {\r\n                color: @brand-primary;\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n// Pagination\r\n.pagination {\r\n    border-radius: 0;\r\n\r\n    > li {\r\n        display: block;\r\n        float: left;\r\n        margin: 0 0 5px 5px;\r\n\r\n        > a,\r\n        > span {\r\n            display: block;\r\n            float: none;\r\n            margin: 0;\r\n            padding-right: 8px;\r\n            padding-left: 8px;\r\n            color: @text-color;\r\n            font-weight: 600;\r\n            border: none;\r\n        }\r\n\r\n        &:first-child {\r\n            > a,\r\n            > span {\r\n                .border-left-radius(0);\r\n            }\r\n        }\r\n\r\n        &:last-child {\r\n            > a,\r\n            > span {\r\n                .border-right-radius(0);\r\n            }\r\n        }\r\n    }\r\n\r\n    > li > a,\r\n    > li > span {\r\n        &:hover,\r\n        &:focus {\r\n            color: @brand-primary;\r\n            background-color: transparent;\r\n            .box-shadow(0 2px @brand-primary);\r\n        }\r\n    }\r\n\r\n    > .active > a,\r\n    > .active > span {\r\n        &,\r\n        &:hover,\r\n        &:focus {\r\n            color: @brand-primary;\r\n            background-color: @gray-lighter;\r\n            .box-shadow(0 2px @brand-primary);\r\n        }\r\n    }\r\n\r\n    > .disabled {\r\n        > span,\r\n        > span:hover,\r\n        > span:focus,\r\n        > a,\r\n        > a:hover,\r\n        > a:focus {\r\n            color: @gray-base;\r\n            .box-shadow(none);\r\n        }\r\n    }\r\n}\r\n\r\n.pager li {\r\n    > a,\r\n    > span {\r\n        padding: 6px 14px;\r\n        font-weight: 600;\r\n        color: @text-color;\r\n        border: 1px solid #eee;\r\n        border-radius: 3px;\r\n    }\r\n\r\n    > a {\r\n        &:hover,\r\n        &:focus {\r\n            color: @brand-primary;\r\n            background-color: @gray-lighter;\r\n        }\r\n    }\r\n\r\n    &.disabled {\r\n        > span,\r\n        > span:hover,\r\n        > span:focus,\r\n        > a,\r\n        > a:hover,\r\n        > a:focus {\r\n            color: @gray-base;\r\n            .box-shadow(none);\r\n        }\r\n    }\r\n}\r\n\r\n// List Group\r\n.list-group-item {\r\n    padding: 10px 15px;\r\n    border-color: #eee;\r\n}\r\n\r\na.list-group-item {\r\n    font-weight: 600;\r\n    color: @text-color;\r\n\r\n    &:hover,\r\n    &:focus {\r\n        color: @brand-primary;\r\n    }\r\n}\r\n\r\n.list-group-item.active {\r\n    &,\r\n    &:hover,\r\n    &:focus {\r\n        background-color: @brand-primary;\r\n        border-color: @brand-primary;\r\n    }\r\n\r\n    > .badge {\r\n        color: @brand-primary;\r\n    }\r\n}\r\n\r\n// Breadcrumb\r\n.breadcrumb {\r\n    padding: 0;\r\n    margin-bottom: 0;\r\n    text-transform: uppercase;\r\n    font-size: 12px;\r\n    font-weight: 600;\r\n    color: @gray-dark;\r\n    background-color: transparent;\r\n\r\n    > li + li:before {\r\n        display: inline-block;\r\n        padding: 0;\r\n        font-family: \"FontAwesome\";\r\n        color: rgba(0,0,0,.5);\r\n        content: \"\\f105\";\r\n        width: 20px;\r\n        text-align: center;\r\n    }\r\n}\r\n\r\n// Tooltip\r\n.tooltip-inner {\r\n    padding: 6px 8px;\r\n    background-color: @brand-darker;\r\n    border-radius: 0;\r\n}\r\n\r\n.tooltip {\r\n    &.top .tooltip-arrow {\r\n        border-top-color: @brand-darker;\r\n    }\r\n    &.right .tooltip-arrow {\r\n        border-right-color: @brand-darker;\r\n    }\r\n    &.left .tooltip-arrow {\r\n        border-left-color: @brand-darker;\r\n    }\r\n    &.bottom .tooltip-arrow {\r\n        border-bottom-color: @brand-darker;\r\n    }\r\n}\r\n\r\n// Popovers\r\n.popover {\r\n    border-color: #ddd;\r\n    border-radius: 2px;\r\n    .box-shadow(0 10px 30px rgba(0,0,0,.05));\r\n}\r\n\r\n.popover-title {\r\n    padding: 10px 10px 1px;\r\n    font-family: @headings-font-family;\r\n    background-color: #fff;\r\n    border-bottom: none;\r\n    border-radius: 1px 1px 0 0;\r\n}\r\n\r\n.popover-content {\r\n    padding: 10px;\r\n}\r\n\r\n// Dropdowns\r\n.dropdown-menu {\r\n    min-width: 180px;\r\n    padding: 5px 0;\r\n    border-color: #ddd;\r\n    border-radius: 2px;\r\n    .box-shadow(0 10px 30px rgba(0,0,0,.05));\r\n\r\n    // Links within the dropdown menu\r\n    > li > a {\r\n        padding: 7px 12px;\r\n\r\n        &:hover {\r\n            background-color: #f9f9f9;\r\n        }\r\n\r\n        i,\r\n        .badge {\r\n            &.pull-right {\r\n                right: 0;\r\n                margin-top: 3px;\r\n                margin-left: 10px;\r\n            }\r\n\r\n            &.pull-left {\r\n                left: 0;\r\n                margin-top: 3px;\r\n                margin-right: 10px;\r\n            }\r\n        }\r\n\r\n        .badge {\r\n            &.pull-right {\r\n                margin-top: 1px;\r\n            }\r\n\r\n            &.pull-left {\r\n                margin-top: 1px;\r\n            }\r\n        }\r\n    }\r\n\r\n    > .active > a {\r\n        &,\r\n        &:hover,\r\n        &:focus {\r\n            color: @text-color-dark;\r\n            background-color: #f0f0f0;\r\n        }\r\n    }\r\n}\r\n\r\n.dropdown-header {\r\n    padding: 5px 12px 4px;\r\n    font-weight: 600;\r\n    color: @gray-dark;\r\n    text-transform: uppercase;\r\n}\r\n\r\n// Tables\r\n.table {\r\n    > thead,\r\n    > tbody,\r\n    > tfoot {\r\n        > tr {\r\n            > th,\r\n            > td {\r\n                padding: 12px 10px;\r\n                border-top: 1px solid #f0f0f0;\r\n            }\r\n\r\n            > th {\r\n                padding: 16px 10px 12px;\r\n                font-family: @headings-font-family;\r\n                font-size: 15px;\r\n                font-weight: 600;\r\n                text-transform: uppercase;\r\n            }\r\n        }\r\n    }\r\n\r\n    > thead > tr > th {\r\n        border-bottom: 1px solid #ddd;\r\n    }\r\n\r\n    > tbody + tbody {\r\n        border-top: 1px solid #ddd;\r\n    }\r\n}\r\n\r\n.table-condensed {\r\n    > thead,\r\n    > tbody,\r\n    > tfoot {\r\n        > tr {\r\n            > td {\r\n                padding: 6px 8px;\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n.table-bordered {\r\n    border: 1px solid #e9e9e9;\r\n\r\n    > thead,\r\n    > tbody,\r\n    > tfoot {\r\n        > tr {\r\n            > th,\r\n            > td {\r\n                border: 1px solid #f0f0f0;\r\n            }\r\n        }\r\n    }\r\n\r\n    > thead > tr {\r\n        > th,\r\n        > td {\r\n            border-bottom-width: 1px;\r\n            border-bottom-color: #e9e9e9;\r\n        }\r\n    }\r\n}\r\n\r\n.table-borderless {\r\n    border: none;\r\n\r\n    > thead,\r\n    > tbody,\r\n    > tfoot {\r\n        > tr {\r\n            > th,\r\n            > td {\r\n                border: none;\r\n            }\r\n        }\r\n    }\r\n\r\n    > thead > tr {\r\n        > th,\r\n        > td {\r\n            border-bottom: 1px solid #ddd;\r\n        }\r\n    }\r\n}\r\n\r\n.table-vcenter {\r\n    > thead,\r\n    > tbody,\r\n    > tfoot {\r\n        > tr {\r\n            > th,\r\n            > td {\r\n                vertical-align: middle;\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n.table-striped {\r\n    > tbody > tr:nth-of-type(odd) {\r\n        background-color: #f9f9f9;\r\n    }\r\n}\r\n\r\n.table-hover {\r\n    > tbody > tr:hover {\r\n        background-color: #f5f5f5;\r\n    }\r\n}\r\n\r\n.table-header-bg {\r\n    > thead > tr {\r\n        > th,\r\n        > td {\r\n            color: #fff;\r\n            background-color: @brand-primary;\r\n            border-bottom-color: @brand-primary;\r\n        }\r\n    }\r\n}\r\n\r\n.table-row-variant(active; #f9f9f9);\r\n.table-row-variant(success; @brand-success-light);\r\n.table-row-variant(info; @brand-info-light);\r\n.table-row-variant(warning; @brand-warning-light);\r\n.table-row-variant(danger; @brand-danger-light);\r\n\r\n.table-responsive {\r\n    -webkit-overflow-scrolling: touch;\r\n}\r\n\r\n// Table Tools\r\n.js-table-checkable tbody tr,\r\n.js-table-sections-header > tr {\r\n    cursor: pointer;\r\n}\r\n\r\n.js-table-sections-header {\r\n    > tr > td:first-child > i {\r\n        .transition-transform(.15s ease-out);\r\n    }\r\n\r\n    + tbody {\r\n        display: none;\r\n    }\r\n\r\n    &.open {\r\n        > tr {\r\n            background-color: #f9f9f9;\r\n        }\r\n\r\n        > tr > td:first-child > i {\r\n            .rotate(90deg);\r\n        }\r\n\r\n        + tbody {\r\n            display: table-row-group;\r\n        }\r\n    }\r\n}\r\n\r\n// Modals\r\n.modal {\r\n    &.fade .modal-dialog {\r\n        .transition(all .12s ease-out);\r\n\r\n        &.modal-dialog-popin {\r\n            .scale(1.1);\r\n        }\r\n\r\n        &.modal-dialog-popout {\r\n            .scale(.9);\r\n        }\r\n\r\n        &.modal-dialog-slideup {\r\n            .translate(0, 10%);\r\n        }\r\n\r\n        &.modal-dialog-slideright {\r\n            .translate(-10%, 0);\r\n        }\r\n\r\n        &.modal-dialog-slideleft {\r\n            .translate(10%, 0);\r\n        }\r\n\r\n        &.modal-dialog-fromright {\r\n            -webkit-transform: translateX(25%) rotate(10deg) scale(.9);\r\n            -ms-transform: translateX(25%) rotate(10deg) scale(.9);\r\n            transform: translateX(25%) rotate(10deg) scale(.9);\r\n        }\r\n\r\n        &.modal-dialog-fromleft {\r\n            -webkit-transform: translateX(-25%) rotate(-10deg) scale(.9);\r\n            -ms-transform: translateX(-25%) rotate(-10deg) scale(.9);\r\n            transform: translateX(-25%) rotate(-10deg) scale(.9);\r\n        }\r\n    }\r\n\r\n    &.in .modal-dialog {\r\n        &.modal-dialog-popin,\r\n        &.modal-dialog-popout {\r\n            .scale(1);\r\n        }\r\n\r\n        &.modal-dialog-slideup,\r\n        &.modal-dialog-slideright,\r\n        &.modal-dialog-slideleft {\r\n            .translate(0, 0);\r\n        }\r\n\r\n        &.modal-dialog-fromright,\r\n        &.modal-dialog-fromleft {\r\n            -webkit-transform: translateX(0) rotate(0) scale(1);\r\n            -ms-transform: translateX(0) rotate(0) scale(1);\r\n            transform: translateX(0) rotate(0) scale(1);\r\n        }\r\n    }\r\n}\r\n\r\n.modal-dialog {\r\n    &&-top {\r\n        margin-top: 0;\r\n        padding: 0 !important;\r\n\r\n        .modal-content {\r\n            .border-top-radius(0);\r\n        }\r\n    }\r\n}\r\n\r\n.modal-content {\r\n    border: none;\r\n    border-radius: 0;\r\n    .box-shadow(none);\r\n}\r\n\r\n.modal-backdrop.in {\r\n    opacity: .25;\r\n}\r\n\r\n.modal-header {\r\n    padding: 18px 20px;\r\n    border-bottom-color: #eee;\r\n}\r\n\r\n.modal-body {\r\n    padding: 20px;\r\n}\r\n\r\n.modal-footer {\r\n    padding: 12px 20px;\r\n    border-top-color: #eee;\r\n}\r\n\r\n.modal-title {\r\n    font-weight: normal;\r\n}\r\n\r\n// Animations\r\n.fade {\r\n    &&-up {\r\n        opacity: 0;\r\n        .transition(all .25s ease-out);\r\n        .translateY(100px);\r\n\r\n        &.in {\r\n            opacity: 1;\r\n            .translateY(0);\r\n        }\r\n    }\r\n\r\n    &&-right {\r\n        opacity: 0;\r\n        .transition(all .25s ease-out);\r\n        .translateX(-100px);\r\n\r\n        &.in {\r\n            opacity: 1;\r\n            .translateX(0);\r\n        }\r\n    }\r\n\r\n    &&-left {\r\n        opacity: 0;\r\n        .transition(all .25s ease-out);\r\n        .translateX(100px);\r\n\r\n        &.in {\r\n            opacity: 1;\r\n            .translateX(0);\r\n        }\r\n    }\r\n}\r\n\r\n// Panels\r\n.panel {\r\n    border-radius: 3px;\r\n    .box-shadow(none);\r\n}\r\n\r\n.panel-group {\r\n    .panel {\r\n        border-radius: 3px;\r\n\r\n        + .panel {\r\n            margin-top: 10px;\r\n        }\r\n    }\r\n}\r\n\r\n.panel-default {\r\n    .panel-variant(#f0f0f0; @text-color; #f9f9f9; #f0f0f0);\r\n}\r\n\r\n.panel-primary {\r\n    .panel-variant(@brand-lighter; @brand-primary; lighten(@brand-lighter, 7%); @brand-lighter);\r\n}\r\n\r\n.panel-success {\r\n    .panel-variant(darken(@brand-success-light, 5%); @brand-success; @brand-success-light; darken(@brand-success-light, 5%));\r\n}\r\n\r\n.panel-info {\r\n    .panel-variant(darken(@brand-info-light, 5%); @brand-info; @brand-info-light; darken(@brand-info-light, 5%));\r\n}\r\n\r\n.panel-warning {\r\n    .panel-variant(darken(@brand-warning-light, 5%); @brand-warning; @brand-warning-light; darken(@brand-warning-light, 5%));\r\n}\r\n\r\n.panel-danger {\r\n    .panel-variant(darken(@brand-danger-light, 5%); @brand-danger; @brand-danger-light; darken(@brand-danger-light, 5%));\r\n}\r\n\r\n// Helpers\r\n.img-responsive {\r\n    width: 100%;\r\n}"
  },
  {
    "path": "webservice/lalascan_web/app/static/less/modules/base.bootstrap.less",
    "content": "/*\n * Bootstrap v3.3.4 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n/* normalize.css v3.0.2 | MIT License | git.io/normalize */\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\nbody {\n  margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  vertical-align: baseline;\n}\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n[hidden],\ntemplate {\n  display: none;\n}\na {\n  background-color: transparent;\n}\na:active,\na:hover {\n  outline: 0;\n}\nabbr[title] {\n  border-bottom: 1px dotted;\n}\nb,\nstrong {\n  font-weight: bold;\n}\ndfn {\n  font-style: italic;\n}\nh1 {\n  margin: .67em 0;\n  font-size: 2em;\n}\nmark {\n  color: #000;\n  background: #ff0;\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\nsup {\n  top: -.5em;\n}\nsub {\n  bottom: -.25em;\n}\nimg {\n  border: 0;\n}\nsvg:not(:root) {\n  overflow: hidden;\n}\nfigure {\n  margin: 1em 40px;\n}\nhr {\n  height: 0;\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n}\npre {\n  overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  margin: 0;\n  font: inherit;\n  color: inherit;\n}\nbutton {\n  overflow: visible;\n}\nbutton,\nselect {\n  text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\ninput {\n  line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n  padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\nfieldset {\n  padding: .35em .625em .75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\nlegend {\n  padding: 0;\n  border: 0;\n}\ntextarea {\n  overflow: auto;\n}\noptgroup {\n  font-weight: bold;\n}\ntable {\n  border-spacing: 0;\n  border-collapse: collapse;\n}\ntd,\nth {\n  padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n  *,\n  *:before,\n  *:after {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    -webkit-box-shadow: none !important;\n            box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  a[href^=\"#\"]:after,\n  a[href^=\"javascript:\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  select {\n    background: #fff !important;\n  }\n  .navbar {\n    display: none;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n@font-face {\n  font-family: 'Glyphicons Halflings';\n\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  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');\n}\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n  content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n.glyphicon-cd:before {\n  content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n  content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n  content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n  content: \"\\e204\";\n}\n.glyphicon-copy:before {\n  content: \"\\e205\";\n}\n.glyphicon-paste:before {\n  content: \"\\e206\";\n}\n.glyphicon-alert:before {\n  content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n  content: \"\\e210\";\n}\n.glyphicon-king:before {\n  content: \"\\e211\";\n}\n.glyphicon-queen:before {\n  content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n  content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n  content: \"\\e214\";\n}\n.glyphicon-knight:before {\n  content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n  content: \"\\e216\";\n}\n.glyphicon-tent:before {\n  content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n  content: \"\\e218\";\n}\n.glyphicon-bed:before {\n  content: \"\\e219\";\n}\n.glyphicon-apple:before {\n  content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n  content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n  content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n  content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n  content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n  content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n  content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n  content: \"\\e227\";\n}\n.glyphicon-btc:before {\n  content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n  content: \"\\e227\";\n}\n.glyphicon-yen:before {\n  content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n  content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n  content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n  content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n  content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n  content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n  content: \"\\e232\";\n}\n.glyphicon-education:before {\n  content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n  content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n  content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n  content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n  content: \"\\e237\";\n}\n.glyphicon-oil:before {\n  content: \"\\e238\";\n}\n.glyphicon-grain:before {\n  content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n  content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n  content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n  content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n  content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n  content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n  content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n  content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n  content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n  content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n  content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n  content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n  content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n  content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n  content: \"\\e253\";\n}\n.glyphicon-console:before {\n  content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n  content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n  content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n  content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n  content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n  content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n  content: \"\\e260\";\n}\n* {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\nhtml {\n  font-size: 10px;\n\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #333;\n  background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\na {\n  color: #337ab7;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #23527c;\n  text-decoration: underline;\n}\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\nfigure {\n  margin: 0;\n}\nimg {\n  vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n.img-rounded {\n  border-radius: 6px;\n}\n.img-thumbnail {\n  display: inline-block;\n  max-width: 100%;\n  height: auto;\n  padding: 4px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: all .2s ease-in-out;\n       -o-transition: all .2s ease-in-out;\n          transition: all .2s ease-in-out;\n}\n.img-circle {\n  border-radius: 50%;\n}\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eee;\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto;\n}\n[role=\"button\"] {\n  cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n  font-weight: normal;\n  line-height: 1;\n  color: #777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n  font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n  font-size: 75%;\n}\nh1,\n.h1 {\n  font-size: 36px;\n}\nh2,\n.h2 {\n  font-size: 30px;\n}\nh3,\n.h3 {\n  font-size: 24px;\n}\nh4,\n.h4 {\n  font-size: 18px;\n}\nh5,\n.h5 {\n  font-size: 14px;\n}\nh6,\n.h6 {\n  font-size: 12px;\n}\np {\n  margin: 0 0 10px;\n}\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 300;\n  line-height: 1.4;\n}\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\nsmall,\n.small {\n  font-size: 85%;\n}\nmark,\n.mark {\n  padding: .2em;\n  background-color: #fcf8e3;\n}\n.text-left {\n  text-align: left;\n}\n.text-right {\n  text-align: right;\n}\n.text-center {\n  text-align: center;\n}\n.text-justify {\n  text-align: justify;\n}\n.text-nowrap {\n  white-space: nowrap;\n}\n.text-lowercase {\n  text-transform: lowercase;\n}\n.text-uppercase {\n  text-transform: uppercase;\n}\n.text-capitalize {\n  text-transform: capitalize;\n}\n.text-muted {\n  color: #777;\n}\n.text-primary {\n  color: #337ab7;\n}\na.text-primary:hover {\n  color: #286090;\n}\n.text-success {\n  color: #3c763d;\n}\na.text-success:hover {\n  color: #2b542c;\n}\n.text-info {\n  color: #31708f;\n}\na.text-info:hover {\n  color: #245269;\n}\n.text-warning {\n  color: #8a6d3b;\n}\na.text-warning:hover {\n  color: #66512c;\n}\n.text-danger {\n  color: #a94442;\n}\na.text-danger:hover {\n  color: #843534;\n}\n.bg-primary {\n  color: #fff;\n  background-color: #337ab7;\n}\na.bg-primary:hover {\n  background-color: #286090;\n}\n.bg-success {\n  background-color: #dff0d8;\n}\na.bg-success:hover {\n  background-color: #c1e2b3;\n}\n.bg-info {\n  background-color: #d9edf7;\n}\na.bg-info:hover {\n  background-color: #afd9ee;\n}\n.bg-warning {\n  background-color: #fcf8e3;\n}\na.bg-warning:hover {\n  background-color: #f7ecb5;\n}\n.bg-danger {\n  background-color: #f2dede;\n}\na.bg-danger:hover {\n  background-color: #e4b9b9;\n}\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eee;\n}\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n.list-inline {\n  padding-left: 0;\n  margin-left: -5px;\n  list-style: none;\n}\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 1.42857143;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #777;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  font-size: 17.5px;\n  border-left: 5px solid #eee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n  margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n  display: block;\n  font-size: 80%;\n  line-height: 1.42857143;\n  color: #777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  text-align: right;\n  border-right: 5px solid #eee;\n  border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #fff;\n  background-color: #333;\n  border-radius: 3px;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n}\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: bold;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  color: #333;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border-radius: 0;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n.container {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\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  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n.row {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n.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 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n.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 {\n  float: left;\n}\n.col-xs-12 {\n  width: 100%;\n}\n.col-xs-11 {\n  width: 91.66666667%;\n}\n.col-xs-10 {\n  width: 83.33333333%;\n}\n.col-xs-9 {\n  width: 75%;\n}\n.col-xs-8 {\n  width: 66.66666667%;\n}\n.col-xs-7 {\n  width: 58.33333333%;\n}\n.col-xs-6 {\n  width: 50%;\n}\n.col-xs-5 {\n  width: 41.66666667%;\n}\n.col-xs-4 {\n  width: 33.33333333%;\n}\n.col-xs-3 {\n  width: 25%;\n}\n.col-xs-2 {\n  width: 16.66666667%;\n}\n.col-xs-1 {\n  width: 8.33333333%;\n}\n.col-xs-pull-12 {\n  right: 100%;\n}\n.col-xs-pull-11 {\n  right: 91.66666667%;\n}\n.col-xs-pull-10 {\n  right: 83.33333333%;\n}\n.col-xs-pull-9 {\n  right: 75%;\n}\n.col-xs-pull-8 {\n  right: 66.66666667%;\n}\n.col-xs-pull-7 {\n  right: 58.33333333%;\n}\n.col-xs-pull-6 {\n  right: 50%;\n}\n.col-xs-pull-5 {\n  right: 41.66666667%;\n}\n.col-xs-pull-4 {\n  right: 33.33333333%;\n}\n.col-xs-pull-3 {\n  right: 25%;\n}\n.col-xs-pull-2 {\n  right: 16.66666667%;\n}\n.col-xs-pull-1 {\n  right: 8.33333333%;\n}\n.col-xs-pull-0 {\n  right: auto;\n}\n.col-xs-push-12 {\n  left: 100%;\n}\n.col-xs-push-11 {\n  left: 91.66666667%;\n}\n.col-xs-push-10 {\n  left: 83.33333333%;\n}\n.col-xs-push-9 {\n  left: 75%;\n}\n.col-xs-push-8 {\n  left: 66.66666667%;\n}\n.col-xs-push-7 {\n  left: 58.33333333%;\n}\n.col-xs-push-6 {\n  left: 50%;\n}\n.col-xs-push-5 {\n  left: 41.66666667%;\n}\n.col-xs-push-4 {\n  left: 33.33333333%;\n}\n.col-xs-push-3 {\n  left: 25%;\n}\n.col-xs-push-2 {\n  left: 16.66666667%;\n}\n.col-xs-push-1 {\n  left: 8.33333333%;\n}\n.col-xs-push-0 {\n  left: auto;\n}\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n.col-xs-offset-11 {\n  margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n  margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n.col-xs-offset-8 {\n  margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n  margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n.col-xs-offset-5 {\n  margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n  margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n.col-xs-offset-2 {\n  margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n  margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .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 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666667%;\n  }\n  .col-sm-10 {\n    width: 83.33333333%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666667%;\n  }\n  .col-sm-7 {\n    width: 58.33333333%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.66666667%;\n  }\n  .col-sm-1 {\n    width: 8.33333333%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-sm-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-sm-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-sm-pull-0 {\n    right: auto;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666667%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666667%;\n  }\n  .col-sm-push-7 {\n    left: 58.33333333%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.66666667%;\n  }\n  .col-sm-push-1 {\n    left: 8.33333333%;\n  }\n  .col-sm-push-0 {\n    left: auto;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0;\n  }\n}\n@media (min-width: 992px) {\n  .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 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666667%;\n  }\n  .col-md-10 {\n    width: 83.33333333%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666667%;\n  }\n  .col-md-7 {\n    width: 58.33333333%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.66666667%;\n  }\n  .col-md-1 {\n    width: 8.33333333%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-md-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-md-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666667%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666667%;\n  }\n  .col-md-push-7 {\n    left: 58.33333333%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.66666667%;\n  }\n  .col-md-push-1 {\n    left: 8.33333333%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0;\n  }\n}\n@media (min-width: 1200px) {\n  .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 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666667%;\n  }\n  .col-lg-10 {\n    width: 83.33333333%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666667%;\n  }\n  .col-lg-7 {\n    width: 58.33333333%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.66666667%;\n  }\n  .col-lg-1 {\n    width: 8.33333333%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-lg-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-lg-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666667%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666667%;\n  }\n  .col-lg-push-7 {\n    left: 58.33333333%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.66666667%;\n  }\n  .col-lg-push-1 {\n    left: 8.33333333%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0;\n  }\n}\ntable {\n  background-color: transparent;\n}\ncaption {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  color: #777;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.42857143;\n  vertical-align: top;\n  border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n  border-top: 0;\n}\n.table > tbody + tbody {\n  border-top: 2px solid #ddd;\n}\n.table .table {\n  background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n  padding: 5px;\n}\n.table-bordered {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n  background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n  position: static;\n  display: table-column;\n  float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  position: static;\n  display: table-cell;\n  float: none;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n  background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n  background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n  background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc;\n}\n.table-responsive {\n  min-height: .01%;\n  overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid #ddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  line-height: normal;\n}\ninput[type=\"file\"] {\n  display: block;\n}\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555;\n}\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\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  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n  -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n       -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n          transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n          box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n}\n.form-control::-moz-placeholder {\n  color: #999;\n  opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n  color: #999;\n}\n.form-control::-webkit-input-placeholder {\n  color: #999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  background-color: #eee;\n  opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n}\ntextarea.form-control {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"],\n  input[type=\"time\"],\n  input[type=\"datetime-local\"],\n  input[type=\"month\"] {\n    line-height: 34px;\n  }\n  input[type=\"date\"].input-sm,\n  input[type=\"time\"].input-sm,\n  input[type=\"datetime-local\"].input-sm,\n  input[type=\"month\"].input-sm,\n  .input-group-sm input[type=\"date\"],\n  .input-group-sm input[type=\"time\"],\n  .input-group-sm input[type=\"datetime-local\"],\n  .input-group-sm input[type=\"month\"] {\n    line-height: 30px;\n  }\n  input[type=\"date\"].input-lg,\n  input[type=\"time\"].input-lg,\n  input[type=\"datetime-local\"].input-lg,\n  input[type=\"month\"].input-lg,\n  .input-group-lg input[type=\"date\"],\n  .input-group-lg input[type=\"time\"],\n  .input-group-lg input[type=\"datetime-local\"],\n  .input-group-lg input[type=\"month\"] {\n    line-height: 46px;\n  }\n}\n.form-group {\n  margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n  min-height: 20px;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-top: 4px \\9;\n  margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n  position: relative;\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  vertical-align: middle;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n  cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n  cursor: not-allowed;\n}\n.form-control-static {\n  min-height: 34px;\n  padding-top: 7px;\n  padding-bottom: 7px;\n  margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n  padding-right: 0;\n  padding-left: 0;\n}\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n  height: auto;\n}\n.form-group-sm .form-control {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.form-group-sm .form-control {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.form-group-sm .form-control,\nselect[multiple].form-group-sm .form-control {\n  height: auto;\n}\n.form-group-sm .form-control-static {\n  height: 30px;\n  min-height: 32px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n}\n.input-lg {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\nselect.input-lg {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n  height: auto;\n}\n.form-group-lg .form-control {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\nselect.form-group-lg .form-control {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.form-group-lg .form-control,\nselect[multiple].form-group-lg .form-control {\n  height: auto;\n}\n.form-group-lg .form-control-static {\n  height: 46px;\n  min-height: 38px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n}\n.has-feedback {\n  position: relative;\n}\n.has-feedback .form-control {\n  padding-right: 42.5px;\n}\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2;\n  display: block;\n  width: 34px;\n  height: 34px;\n  line-height: 34px;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback {\n  width: 46px;\n  height: 46px;\n  line-height: 46px;\n}\n.input-sm + .form-control-feedback {\n  width: 30px;\n  height: 30px;\n  line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n  color: #3c763d;\n}\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-success .form-control:focus {\n  border-color: #2b542c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n  color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n  color: #8a6d3b;\n}\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n  color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n  color: #a94442;\n}\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-error .form-control:focus {\n  border-color: #843534;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #a94442;\n}\n.has-error .form-control-feedback {\n  color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n  top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n  top: 0;\n}\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-static {\n    display: inline-block;\n  }\n  .form-inline .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .form-inline .input-group .input-group-addon,\n  .form-inline .input-group .input-group-btn,\n  .form-inline .input-group .form-control {\n    width: auto;\n  }\n  .form-inline .input-group > .form-control {\n    width: 100%;\n  }\n  .form-inline .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio label,\n  .form-inline .checkbox label {\n    padding-left: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .form-inline .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    padding-top: 7px;\n    margin-bottom: 0;\n    text-align: right;\n  }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n  right: 15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-lg .control-label {\n    padding-top: 14.333333px;\n  }\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-sm .control-label {\n    padding-top: 6px;\n  }\n}\n.btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  -ms-touch-action: manipulation;\n      touch-action: manipulation;\n  cursor: pointer;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n  color: #333;\n  text-decoration: none;\n}\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\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.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  pointer-events: none;\n  cursor: not-allowed;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n          box-shadow: none;\n  opacity: .65;\n}\n.btn-default {\n  color: #333;\n  background-color: #fff;\n  border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus,\n.btn-default.focus,\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  background-image: none;\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: #fff;\n  border-color: #ccc;\n}\n.btn-default .badge {\n  color: #fff;\n  background-color: #333;\n}\n.btn-primary {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary.focus,\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  background-image: none;\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: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.btn-success {\n  color: #fff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success:hover,\n.btn-success:focus,\n.btn-success.focus,\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  background-image: none;\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: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success .badge {\n  color: #5cb85c;\n  background-color: #fff;\n}\n.btn-info {\n  color: #fff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info:hover,\n.btn-info:focus,\n.btn-info.focus,\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  background-image: none;\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: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info .badge {\n  color: #5bc0de;\n  background-color: #fff;\n}\n.btn-warning {\n  color: #fff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning.focus,\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  background-image: none;\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: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning .badge {\n  color: #f0ad4e;\n  background-color: #fff;\n}\n.btn-danger {\n  color: #fff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger.focus,\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  background-image: none;\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: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger .badge {\n  color: #d9534f;\n  background-color: #fff;\n}\n.btn-link {\n  font-weight: normal;\n  color: #337ab7;\n  border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n  color: #23527c;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #777;\n  text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity .15s linear;\n       -o-transition: opacity .15s linear;\n          transition: opacity .15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\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.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition-timing-function: ease;\n       -o-transition-timing-function: ease;\n          transition-timing-function: ease;\n  -webkit-transition-duration: .35s;\n       -o-transition-duration: .35s;\n          transition-duration: .35s;\n  -webkit-transition-property: height, visibility;\n       -o-transition-property: height, visibility;\n          transition-property: height, visibility;\n}\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px dashed;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle:focus {\n  outline: 0;\n}\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  font-size: 14px;\n  text-align: left;\n  list-style: none;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, .15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n          box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n}\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.42857143;\n  color: #333;\n  white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #262626;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #fff;\n  text-decoration: none;\n  background-color: #337ab7;\n  outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.open > a {\n  outline: 0;\n}\n.dropdown-menu-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu-left {\n  right: auto;\n  left: 0;\n}\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.42857143;\n  color: #777;\n  white-space: nowrap;\n}\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 990;\n}\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  content: \"\";\n  border-top: 0;\n  border-bottom: 4px solid;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto;\n  }\n  .navbar-right .dropdown-menu-left {\n    right: auto;\n    left: 0;\n  }\n}\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n.btn-toolbar {\n  margin-left: -5px;\n}\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n  float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n  margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\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-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n.btn .caret {\n  margin-left: 0;\n}\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  display: table-cell;\n  float: none;\n  width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n  left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n  float: none;\n  padding-right: 0;\n  padding-left: 0;\n}\n.input-group .form-control {\n  position: relative;\n  z-index: 2;\n  float: left;\n  width: 100%;\n  margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #555;\n  text-align: center;\n  background-color: #eee;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n.input-group-btn {\n  position: relative;\n  font-size: 0;\n  white-space: nowrap;\n}\n.input-group-btn > .btn {\n  position: relative;\n}\n.input-group-btn > .btn + .btn {\n  margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n  margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n  margin-left: -1px;\n}\n.nav {\n  padding-left: 0;\n  margin-bottom: 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: #eee;\n}\n.nav > li.disabled > a {\n  color: #777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #777;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eee;\n  border-color: #337ab7;\n}\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 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 #ddd;\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.42857143;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n  border-color: #eee #eee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555;\n  cursor: default;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-bottom-color: transparent;\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  margin-bottom: 5px;\n  text-align: center;\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: 4px;\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 #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 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: #fff;\n  }\n}\n.nav-pills > li {\n  float: left;\n}\n.nav-pills > li > a {\n  border-radius: 4px;\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: #fff;\n  background-color: #337ab7;\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  margin-bottom: 5px;\n  text-align: center;\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: 4px;\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 #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 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: #fff;\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-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n.navbar-collapse {\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\n  -webkit-overflow-scrolling: touch;\n  border-top: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\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-right: 0;\n    padding-left: 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  height: 50px;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\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  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\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: 7.5px -15px;\n}\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\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: 20px;\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: 15px;\n    padding-bottom: 15px;\n  }\n}\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -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, .1), 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\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    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 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-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  margin-bottom: 0;\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n  margin-top: 14px;\n  margin-bottom: 14px;\n}\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n  .navbar-text {\n    float: left;\n    margin-right: 15px;\n    margin-left: 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: #f8f8f8;\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n  color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n.navbar-default .navbar-text {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333;\n  background-color: transparent;\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: #555;\n  background-color: #e7e7e7;\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: #ccc;\n  background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n  border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e7e7e7;\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  color: #555;\n  background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777;\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: #333;\n    background-color: transparent;\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: #555;\n    background-color: #e7e7e7;\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: #ccc;\n    background-color: transparent;\n  }\n}\n.navbar-default .navbar-link {\n  color: #777;\n}\n.navbar-default .navbar-link:hover {\n  color: #333;\n}\n.navbar-default .btn-link {\n  color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n  color: #333;\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: #ccc;\n}\n.navbar-inverse {\n  background-color: #222;\n  border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #fff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #fff;\n  background-color: transparent;\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: #fff;\n  background-color: #080808;\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: #444;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n  border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\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  color: #fff;\n  background-color: #080808;\n}\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #9d9d9d;\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: #fff;\n    background-color: transparent;\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: #fff;\n    background-color: #080808;\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: #444;\n    background-color: transparent;\n  }\n}\n.navbar-inverse .navbar-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #fff;\n}\n.navbar-inverse .btn-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n  color: #fff;\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: #444;\n}\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n.breadcrumb > li {\n  display: inline-block;\n}\n.breadcrumb > li + li:before {\n  padding: 0 5px;\n  color: #ccc;\n  content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n  color: #777;\n}\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n.pagination > li {\n  display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  margin-left: -1px;\n  line-height: 1.42857143;\n  color: #337ab7;\n  text-decoration: none;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  color: #23527c;\n  background-color: #eee;\n  border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 2;\n  color: #fff;\n  cursor: default;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #fff;\n  border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-top-left-radius: 6px;\n  border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-top-right-radius: 6px;\n  border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-top-left-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n}\n.pager li {\n  display: inline;\n}\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eee;\n}\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #fff;\n}\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.label:empty {\n  display: none;\n}\n.btn .label {\n  position: relative;\n  top: -1px;\n}\n.label-default {\n  background-color: #777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #5e5e5e;\n}\n.label-primary {\n  background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #286090;\n}\n.label-success {\n  background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n.label-info {\n  background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n.label-warning {\n  background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n.label-danger {\n  background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  background-color: #777;\n  border-radius: 10px;\n}\n.badge:empty {\n  display: none;\n}\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n  top: 0;\n  padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #337ab7;\n  background-color: #fff;\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.jumbotron {\n  padding: 30px 15px;\n  margin-bottom: 30px;\n  color: inherit;\n  background-color: #eee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n  color: inherit;\n}\n.jumbotron p {\n  margin-bottom: 15px;\n  font-size: 21px;\n  font-weight: 200;\n}\n.jumbotron > hr {\n  border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n  border-radius: 6px;\n}\n.jumbotron .container {\n  max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding: 48px 0;\n  }\n  .container .jumbotron,\n  .container-fluid .jumbotron {\n    padding-right: 60px;\n    padding-left: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 63px;\n  }\n}\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: border .2s ease-in-out;\n       -o-transition: border .2s ease-in-out;\n          transition: border .2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n  margin-right: auto;\n  margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #337ab7;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #333;\n}\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n.alert .alert-link {\n  font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n.alert > p + p {\n  margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n  padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n.alert-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n  color: #2b542c;\n}\n.alert-info {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n  color: #245269;\n}\n.alert-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n  color: #66512c;\n}\n.alert-danger {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n  color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@-o-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n}\n.progress-bar {\n  float: left;\n  width: 0;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #fff;\n  text-align: center;\n  background-color: #337ab7;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n  -webkit-transition: width .6s ease;\n       -o-transition: width .6s ease;\n          transition: width .6s ease;\n}\n.progress-striped .progress-bar,\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  -webkit-background-size: 40px 40px;\n          background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n       -o-animation: progress-bar-stripes 2s linear infinite;\n          animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\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.progress-bar-info {\n  background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\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.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\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.progress-bar-danger {\n  background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\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.media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n.media-body {\n  width: 10000px;\n}\n.media-object {\n  display: block;\n}\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n.media-middle {\n  vertical-align: middle;\n}\n.media-bottom {\n  vertical-align: bottom;\n}\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\n}\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\na.list-group-item {\n  color: #555;\n}\na.list-group-item .list-group-item-heading {\n  color: #333;\n}\na.list-group-item:hover,\na.list-group-item:focus {\n  color: #555;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #eee;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n  color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n  color: #777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n  color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #c7ddef;\n}\n.list-group-item-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n}\na.list-group-item-success {\n  color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-success:hover,\na.list-group-item-success:focus {\n  color: #3c763d;\n  background-color: #d0e9c6;\n}\na.list-group-item-success.active,\na.list-group-item-success.active:hover,\na.list-group-item-success.active:focus {\n  color: #fff;\n  background-color: #3c763d;\n  border-color: #3c763d;\n}\n.list-group-item-info {\n  color: #31708f;\n  background-color: #d9edf7;\n}\na.list-group-item-info {\n  color: #31708f;\n}\na.list-group-item-info .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-info:hover,\na.list-group-item-info:focus {\n  color: #31708f;\n  background-color: #c4e3f3;\n}\na.list-group-item-info.active,\na.list-group-item-info.active:hover,\na.list-group-item-info.active:focus {\n  color: #fff;\n  background-color: #31708f;\n  border-color: #31708f;\n}\n.list-group-item-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n}\na.list-group-item-warning {\n  color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-warning:hover,\na.list-group-item-warning:focus {\n  color: #8a6d3b;\n  background-color: #faf2cc;\n}\na.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus {\n  color: #fff;\n  background-color: #8a6d3b;\n  border-color: #8a6d3b;\n}\n.list-group-item-danger {\n  color: #a94442;\n  background-color: #f2dede;\n}\na.list-group-item-danger {\n  color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-danger:hover,\na.list-group-item-danger:focus {\n  color: #a94442;\n  background-color: #ebcccc;\n}\na.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus {\n  color: #fff;\n  background-color: #a94442;\n  border-color: #a94442;\n}\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n.panel {\n  margin-bottom: 20px;\n  background-color: #fff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n          box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n}\n.panel-body {\n  padding: 15px;\n}\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n  color: inherit;\n}\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #ddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n  margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n  border-width: 1px 0;\n  border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n  border-top: 0;\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n  border-bottom: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n  margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n  padding-right: 15px;\n  padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n  border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n  border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n  border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n  border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n  border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n  border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n  border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n  border-bottom: 0;\n}\n.panel > .table-responsive {\n  margin-bottom: 0;\n  border: 0;\n}\n.panel-group {\n  margin-bottom: 20px;\n}\n.panel-group .panel {\n  margin-bottom: 0;\n  border-radius: 4px;\n}\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n  border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n  border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #ddd;\n}\n.panel-default {\n  border-color: #ddd;\n}\n.panel-default > .panel-heading {\n  color: #333;\n  background-color: #f5f5f5;\n  border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n  color: #f5f5f5;\n  background-color: #333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ddd;\n}\n.panel-primary {\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #337ab7;\n}\n.panel-success {\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n  color: #dff0d8;\n  background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n.panel-info {\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n  color: #d9edf7;\n  background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #bce8f1;\n}\n.panel-warning {\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n  color: #fcf8e3;\n  background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #faebcc;\n}\n.panel-danger {\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n  color: #f2dede;\n  background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 0;\n}\n.embed-responsive-16by9 {\n  padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n  padding-bottom: 75%;\n}\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n}\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, .15);\n}\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #fff;\n  filter: alpha(opacity=20);\n  opacity: .2;\n}\n.close:hover,\n.close:focus {\n  color: #000;\n  text-decoration: none;\n  cursor: pointer;\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\nbutton.close {\n  -webkit-appearance: none;\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n}\n.modal-open {\n  overflow: hidden;\n}\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1050;\n  display: none;\n  overflow: hidden;\n  -webkit-overflow-scrolling: touch;\n  outline: 0;\n}\n.modal.fade .modal-dialog {\n  -webkit-transition: -webkit-transform .3s ease-out;\n       -o-transition:      -o-transform .3s ease-out;\n          transition:         transform .3s ease-out;\n  -webkit-transform: translate(0, -25%);\n      -ms-transform: translate(0, -25%);\n       -o-transform: translate(0, -25%);\n          transform: translate(0, -25%);\n}\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n      -ms-transform: translate(0, 0);\n       -o-transform: translate(0, 0);\n          transform: translate(0, 0);\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n.modal-content {\n  position: relative;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, .2);\n  border-radius: 6px;\n  outline: 0;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n          box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n}\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  background-color: #000;\n}\n.modal-backdrop.fade {\n  filter: alpha(opacity=0);\n  opacity: 0;\n}\n.modal-backdrop.in {\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\n.modal-header {\n  min-height: 16.42857143px;\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n  margin-top: -2px;\n}\n.modal-title {\n  margin: 0;\n  line-height: 1.42857143;\n}\n.modal-body {\n  position: relative;\n  padding: 15px;\n}\n.modal-footer {\n  padding: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n@media (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n            box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n  }\n  .modal-sm {\n    width: 300px;\n  }\n}\n@media (min-width: 992px) {\n  .modal-lg {\n    width: 900px;\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 12px;\n  font-weight: normal;\n  line-height: 1.4;\n  filter: alpha(opacity=0);\n  opacity: 0;\n}\n.tooltip.in {\n  filter: alpha(opacity=90);\n  opacity: .9;\n}\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #fff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000;\n  border-radius: 4px;\n}\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: left;\n  white-space: normal;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, .2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n}\n.popover.top {\n  margin-top: -10px;\n}\n.popover.right {\n  margin-left: 10px;\n}\n.popover.bottom {\n  margin-top: 10px;\n}\n.popover.left {\n  margin-left: -10px;\n}\n.popover-title {\n  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n.popover-content {\n  padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover > .arrow {\n  border-width: 11px;\n}\n.popover > .arrow:after {\n  content: \"\";\n  border-width: 10px;\n}\n.popover.top > .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999;\n  border-top-color: rgba(0, 0, 0, .25);\n  border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  content: \" \";\n  border-top-color: #fff;\n  border-bottom-width: 0;\n}\n.popover.right > .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999;\n  border-right-color: rgba(0, 0, 0, .25);\n  border-left-width: 0;\n}\n.popover.right > .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  content: \" \";\n  border-right-color: #fff;\n  border-left-width: 0;\n}\n.popover.bottom > .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999;\n  border-bottom-color: rgba(0, 0, 0, .25);\n}\n.popover.bottom > .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  content: \" \";\n  border-top-width: 0;\n  border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999;\n  border-left-color: rgba(0, 0, 0, .25);\n}\n.popover.left > .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  content: \" \";\n  border-right-width: 0;\n  border-left-color: #fff;\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: .6s ease-in-out left;\n       -o-transition: .6s ease-in-out left;\n          transition: .6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n  .carousel-inner > .item {\n    -webkit-transition: -webkit-transform .6s ease-in-out;\n         -o-transition:      -o-transform .6s ease-in-out;\n            transition:         transform .6s ease-in-out;\n\n    -webkit-backface-visibility: hidden;\n            backface-visibility: hidden;\n    -webkit-perspective: 1000;\n            perspective: 1000;\n  }\n  .carousel-inner > .item.next,\n  .carousel-inner > .item.active.right {\n    left: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n            transform: translate3d(100%, 0, 0);\n  }\n  .carousel-inner > .item.prev,\n  .carousel-inner > .item.active.left {\n    left: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n            transform: translate3d(-100%, 0, 0);\n  }\n  .carousel-inner > .item.next.left,\n  .carousel-inner > .item.prev.right,\n  .carousel-inner > .item.active {\n    left: 0;\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0);\n  }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));\n  background-image:         linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n  background-repeat: repeat-x;\n}\n.carousel-control.right {\n  right: 0;\n  left: auto;\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));\n  background-image:         linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n  background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #fff;\n  text-decoration: none;\n  filter: alpha(opacity=90);\n  outline: 0;\n  opacity: .9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n  margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n  margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  font-family: serif;\n  line-height: 1;\n}\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n  border: 1px solid #fff;\n  border-radius: 10px;\n}\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #fff;\n}\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n}\n.carousel-caption .btn {\n  text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    font-size: 30px;\n  }\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .icon-prev {\n    margin-left: -15px;\n  }\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-next {\n    margin-right: -15px;\n  }\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n  clear: both;\n}\n.center-block {\n  display: block;\n  margin-right: auto;\n  margin-left: auto;\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.hidden {\n  display: none !important;\n}\n.affix {\n  position: fixed;\n}\n@-ms-viewport {\n  width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  table.visible-xs {\n    display: table;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-block {\n    display: block !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline {\n    display: inline !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  table.visible-sm {\n    display: table;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-block {\n    display: block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  table.visible-md {\n    display: table;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-block {\n    display: block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  table.visible-lg {\n    display: table;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-block {\n    display: block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n}\n.visible-print {\n  display: none !important;\n}\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  table.visible-print {\n    display: table;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n}\n.visible-print-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-block {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline-block {\n    display: inline-block !important;\n  }\n}\n@media print {\n  .hidden-print {\n    display: none !important;\n  }\n}\n/*# sourceMappingURL=bootstrap.css.map */"
  },
  {
    "path": "webservice/lalascan_web/app/static/less/modules/extend.animations.less",
    "content": "//\n// Animate.css - http://daneden.me/animate\n// Licensed under the MIT license - http://opensource.org/licenses/MIT\n// Copyright (c) 2015 Daniel Eden\n// --------------------------------------------------\n\n.animated {\n    -webkit-animation-duration: 1s;\n    animation-duration: 1s;\n    -webkit-animation-fill-mode: both;\n    animation-fill-mode: both;\n}\n\n.animated.infinite {\n    -webkit-animation-iteration-count: infinite;\n    animation-iteration-count: infinite;\n}\n\n.animated.hinge {\n    -webkit-animation-duration: 2s;\n    animation-duration: 2s;\n}\n\n.animated.bounceIn,\n.animated.bounceOut {\n    -webkit-animation-duration: .75s;\n    animation-duration: .75s;\n}\n\n.animated.flipOutX,\n.animated.flipOutY {\n    -webkit-animation-duration: .75s;\n    animation-duration: .75s;\n}\n\n@-webkit-keyframes bounce {\n    0%, 20%, 53%, 80%, 100% {\n        -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n        transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n        -webkit-transform: translate3d(0,0,0);\n        transform: translate3d(0,0,0);\n    }\n\n    40%, 43% {\n        -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n        transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n        -webkit-transform: translate3d(0, -30px, 0);\n        transform: translate3d(0, -30px, 0);\n    }\n\n    70% {\n        -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n        transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n        -webkit-transform: translate3d(0, -15px, 0);\n        transform: translate3d(0, -15px, 0);\n    }\n\n    90% {\n        -webkit-transform: translate3d(0,-4px,0);\n        transform: translate3d(0,-4px,0);\n    }\n}\n\n@keyframes bounce {\n    0%, 20%, 53%, 80%, 100% {\n        -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n        transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n        -webkit-transform: translate3d(0,0,0);\n        transform: translate3d(0,0,0);\n    }\n\n    40%, 43% {\n        -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n        transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n        -webkit-transform: translate3d(0, -30px, 0);\n        transform: translate3d(0, -30px, 0);\n    }\n\n    70% {\n        -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n        transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n        -webkit-transform: translate3d(0, -15px, 0);\n        transform: translate3d(0, -15px, 0);\n    }\n\n    90% {\n        -webkit-transform: translate3d(0,-4px,0);\n        transform: translate3d(0,-4px,0);\n    }\n}\n\n.bounce {\n    -webkit-animation-name: bounce;\n    animation-name: bounce;\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n}\n\n@-webkit-keyframes flash {\n    0%, 50%, 100% {\n        opacity: 1;\n    }\n\n    25%, 75% {\n        opacity: 0;\n    }\n}\n\n@keyframes flash {\n    0%, 50%, 100% {\n        opacity: 1;\n    }\n\n    25%, 75% {\n        opacity: 0;\n    }\n}\n\n.flash {\n    -webkit-animation-name: flash;\n    animation-name: flash;\n}\n\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n\n@-webkit-keyframes pulse {\n    0% {\n        -webkit-transform: scale3d(1, 1, 1);\n        transform: scale3d(1, 1, 1);\n    }\n\n    50% {\n        -webkit-transform: scale3d(1.05, 1.05, 1.05);\n        transform: scale3d(1.05, 1.05, 1.05);\n    }\n\n    100% {\n        -webkit-transform: scale3d(1, 1, 1);\n        transform: scale3d(1, 1, 1);\n    }\n}\n\n@keyframes pulse {\n    0% {\n        -webkit-transform: scale3d(1, 1, 1);\n        transform: scale3d(1, 1, 1);\n    }\n\n    50% {\n        -webkit-transform: scale3d(1.05, 1.05, 1.05);\n        transform: scale3d(1.05, 1.05, 1.05);\n    }\n\n    100% {\n        -webkit-transform: scale3d(1, 1, 1);\n        transform: scale3d(1, 1, 1);\n    }\n}\n\n.pulse {\n    -webkit-animation-name: pulse;\n    animation-name: pulse;\n}\n\n@-webkit-keyframes rubberBand {\n    0% {\n        -webkit-transform: scale3d(1, 1, 1);\n        transform: scale3d(1, 1, 1);\n    }\n\n    30% {\n        -webkit-transform: scale3d(1.25, 0.75, 1);\n        transform: scale3d(1.25, 0.75, 1);\n    }\n\n    40% {\n        -webkit-transform: scale3d(0.75, 1.25, 1);\n        transform: scale3d(0.75, 1.25, 1);\n    }\n\n    50% {\n        -webkit-transform: scale3d(1.15, 0.85, 1);\n        transform: scale3d(1.15, 0.85, 1);\n    }\n\n    65% {\n        -webkit-transform: scale3d(.95, 1.05, 1);\n        transform: scale3d(.95, 1.05, 1);\n    }\n\n    75% {\n        -webkit-transform: scale3d(1.05, .95, 1);\n        transform: scale3d(1.05, .95, 1);\n    }\n\n    100% {\n        -webkit-transform: scale3d(1, 1, 1);\n        transform: scale3d(1, 1, 1);\n    }\n}\n\n@keyframes rubberBand {\n    0% {\n        -webkit-transform: scale3d(1, 1, 1);\n        transform: scale3d(1, 1, 1);\n    }\n\n    30% {\n        -webkit-transform: scale3d(1.25, 0.75, 1);\n        transform: scale3d(1.25, 0.75, 1);\n    }\n\n    40% {\n        -webkit-transform: scale3d(0.75, 1.25, 1);\n        transform: scale3d(0.75, 1.25, 1);\n    }\n\n    50% {\n        -webkit-transform: scale3d(1.15, 0.85, 1);\n        transform: scale3d(1.15, 0.85, 1);\n    }\n\n    65% {\n        -webkit-transform: scale3d(.95, 1.05, 1);\n        transform: scale3d(.95, 1.05, 1);\n    }\n\n    75% {\n        -webkit-transform: scale3d(1.05, .95, 1);\n        transform: scale3d(1.05, .95, 1);\n    }\n\n    100% {\n        -webkit-transform: scale3d(1, 1, 1);\n        transform: scale3d(1, 1, 1);\n    }\n}\n\n.rubberBand {\n    -webkit-animation-name: rubberBand;\n    animation-name: rubberBand;\n}\n\n@-webkit-keyframes shake {\n    0%, 100% {\n        -webkit-transform: translate3d(0, 0, 0);\n        transform: translate3d(0, 0, 0);\n    }\n\n    10%, 30%, 50%, 70%, 90% {\n        -webkit-transform: translate3d(-10px, 0, 0);\n        transform: translate3d(-10px, 0, 0);\n    }\n\n    20%, 40%, 60%, 80% {\n        -webkit-transform: translate3d(10px, 0, 0);\n        transform: translate3d(10px, 0, 0);\n    }\n}\n\n@keyframes shake {\n    0%, 100% {\n        -webkit-transform: translate3d(0, 0, 0);\n        transform: translate3d(0, 0, 0);\n    }\n\n    10%, 30%, 50%, 70%, 90% {\n        -webkit-transform: translate3d(-10px, 0, 0);\n        transform: translate3d(-10px, 0, 0);\n    }\n\n    20%, 40%, 60%, 80% {\n        -webkit-transform: translate3d(10px, 0, 0);\n        transform: translate3d(10px, 0, 0);\n    }\n}\n\n.shake {\n    -webkit-animation-name: shake;\n    animation-name: shake;\n}\n\n@-webkit-keyframes swing {\n    20% {\n        -webkit-transform: rotate3d(0, 0, 1, 15deg);\n        transform: rotate3d(0, 0, 1, 15deg);\n    }\n\n    40% {\n        -webkit-transform: rotate3d(0, 0, 1, -10deg);\n        transform: rotate3d(0, 0, 1, -10deg);\n    }\n\n    60% {\n        -webkit-transform: rotate3d(0, 0, 1, 5deg);\n        transform: rotate3d(0, 0, 1, 5deg);\n    }\n\n    80% {\n        -webkit-transform: rotate3d(0, 0, 1, -5deg);\n        transform: rotate3d(0, 0, 1, -5deg);\n    }\n\n    100% {\n        -webkit-transform: rotate3d(0, 0, 1, 0deg);\n        transform: rotate3d(0, 0, 1, 0deg);\n    }\n}\n\n@keyframes swing {\n    20% {\n        -webkit-transform: rotate3d(0, 0, 1, 15deg);\n        transform: rotate3d(0, 0, 1, 15deg);\n    }\n\n    40% {\n        -webkit-transform: rotate3d(0, 0, 1, -10deg);\n        transform: rotate3d(0, 0, 1, -10deg);\n    }\n\n    60% {\n        -webkit-transform: rotate3d(0, 0, 1, 5deg);\n        transform: rotate3d(0, 0, 1, 5deg);\n    }\n\n    80% {\n        -webkit-transform: rotate3d(0, 0, 1, -5deg);\n        transform: rotate3d(0, 0, 1, -5deg);\n    }\n\n    100% {\n        -webkit-transform: rotate3d(0, 0, 1, 0deg);\n        transform: rotate3d(0, 0, 1, 0deg);\n    }\n}\n\n.swing {\n    -webkit-transform-origin: top center;\n    transform-origin: top center;\n    -webkit-animation-name: swing;\n    animation-name: swing;\n}\n\n@-webkit-keyframes tada {\n    0% {\n        -webkit-transform: scale3d(1, 1, 1);\n        transform: scale3d(1, 1, 1);\n    }\n\n    10%, 20% {\n        -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);\n        transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);\n    }\n\n    30%, 50%, 70%, 90% {\n        -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n        transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n    }\n\n    40%, 60%, 80% {\n        -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n        transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n    }\n\n    100% {\n        -webkit-transform: scale3d(1, 1, 1);\n        transform: scale3d(1, 1, 1);\n    }\n}\n\n@keyframes tada {\n    0% {\n        -webkit-transform: scale3d(1, 1, 1);\n        transform: scale3d(1, 1, 1);\n    }\n\n    10%, 20% {\n        -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);\n        transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);\n    }\n\n    30%, 50%, 70%, 90% {\n        -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n        transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n    }\n\n    40%, 60%, 80% {\n        -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n        transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n    }\n\n    100% {\n        -webkit-transform: scale3d(1, 1, 1);\n        transform: scale3d(1, 1, 1);\n    }\n}\n\n.tada {\n    -webkit-animation-name: tada;\n    animation-name: tada;\n}\n\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n\n@-webkit-keyframes wobble {\n    0% {\n        -webkit-transform: none;\n        transform: none;\n    }\n\n    15% {\n        -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n        transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n    }\n\n    30% {\n        -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n        transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n    }\n\n    45% {\n        -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n        transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n    }\n\n    60% {\n        -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n        transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n    }\n\n    75% {\n        -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n        transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n    }\n\n    100% {\n        -webkit-transform: none;\n        transform: none;\n    }\n}\n\n@keyframes wobble {\n    0% {\n        -webkit-transform: none;\n        transform: none;\n    }\n\n    15% {\n        -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n        transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n    }\n\n    30% {\n        -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n        transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n    }\n\n    45% {\n        -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n        transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n    }\n\n    60% {\n        -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n        transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n    }\n\n    75% {\n        -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n        transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n    }\n\n    100% {\n        -webkit-transform: none;\n        transform: none;\n    }\n}\n\n.wobble {\n    -webkit-animation-name: wobble;\n    animation-name: wobble;\n}\n\n@-webkit-keyframes bounceIn {\n    0%, 20%, 40%, 60%, 80%, 100% {\n        -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n        transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    }\n\n    0% {\n        opacity: 0;\n        -webkit-transform: scale3d(.3, .3, .3);\n        transform: scale3d(.3, .3, .3);\n    }\n\n    20% {\n        -webkit-transform: scale3d(1.1, 1.1, 1.1);\n        transform: scale3d(1.1, 1.1, 1.1);\n    }\n\n    40% {\n        -webkit-transform: scale3d(.9, .9, .9);\n        transform: scale3d(.9, .9, .9);\n    }\n\n    60% {\n        opacity: 1;\n        -webkit-transform: scale3d(1.03, 1.03, 1.03);\n        transform: scale3d(1.03, 1.03, 1.03);\n    }\n\n    80% {\n        -webkit-transform: scale3d(.97, .97, .97);\n        transform: scale3d(.97, .97, .97);\n    }\n\n    100% {\n        opacity: 1;\n        -webkit-transform: scale3d(1, 1, 1);\n        transform: scale3d(1, 1, 1);\n    }\n}\n\n@keyframes bounceIn {\n    0%, 20%, 40%, 60%, 80%, 100% {\n        -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n        transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    }\n\n    0% {\n        opacity: 0;\n        -webkit-transform: scale3d(.3, .3, .3);\n        transform: scale3d(.3, .3, .3);\n    }\n\n    20% {\n        -webkit-transform: scale3d(1.1, 1.1, 1.1);\n        transform: scale3d(1.1, 1.1, 1.1);\n    }\n\n    40% {\n        -webkit-transform: scale3d(.9, .9, .9);\n        transform: scale3d(.9, .9, .9);\n    }\n\n    60% {\n        opacity: 1;\n        -webkit-transform: scale3d(1.03, 1.03, 1.03);\n        transform: scale3d(1.03, 1.03, 1.03);\n    }\n\n    80% {\n        -webkit-transform: scale3d(.97, .97, .97);\n        transform: scale3d(.97, .97, .97);\n    }\n\n    100% {\n        opacity: 1;\n        -webkit-transform: scale3d(1, 1, 1);\n        transform: scale3d(1, 1, 1);\n    }\n}\n\n.bounceIn {\n    -webkit-animation-name: bounceIn;\n    animation-name: bounceIn;\n}\n\n@-webkit-keyframes bounceInDown {\n    0%, 60%, 75%, 90%, 100% {\n        -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n        transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    }\n\n    0% {\n        opacity: 0;\n        -webkit-transform: translate3d(0, -3000px, 0);\n        transform: translate3d(0, -3000px, 0);\n    }\n\n    60% {\n        opacity: 1;\n        -webkit-transform: translate3d(0, 25px, 0);\n        transform: translate3d(0, 25px, 0);\n    }\n\n    75% {\n        -webkit-transform: translate3d(0, -10px, 0);\n        transform: translate3d(0, -10px, 0);\n    }\n\n    90% {\n        -webkit-transform: translate3d(0, 5px, 0);\n        transform: translate3d(0, 5px, 0);\n    }\n\n    100% {\n        -webkit-transform: none;\n        transform: none;\n    }\n}\n\n@keyframes bounceInDown {\n    0%, 60%, 75%, 90%, 100% {\n        -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n        transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    }\n\n    0% {\n        opacity: 0;\n        -webkit-transform: translate3d(0, -3000px, 0);\n        transform: translate3d(0, -3000px, 0);\n    }\n\n    60% {\n        opacity: 1;\n        -webkit-transform: translate3d(0, 25px, 0);\n        transform: translate3d(0, 25px, 0);\n    }\n\n    75% {\n        -webkit-transform: translate3d(0, -10px, 0);\n        transform: translate3d(0, -10px, 0);\n    }\n\n    90% {\n        -webkit-transform: translate3d(0, 5px, 0);\n        transform: translate3d(0, 5px, 0);\n    }\n\n    100% {\n        -webkit-transform: none;\n        transform: none;\n    }\n}\n\n.bounceInDown {\n    -webkit-animation-name: bounceInDown;\n    animation-name: bounceInDown;\n}\n\n@-webkit-keyframes bounceInLeft {\n    0%, 60%, 75%, 90%, 100% {\n        -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n        transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    }\n\n    0% {\n        opacity: 0;\n        -webkit-transform: translate3d(-3000px, 0, 0);\n        transform: translate3d(-3000px, 0, 0);\n    }\n\n    60% {\n        opacity: 1;\n        -webkit-transform: translate3d(25px, 0, 0);\n        transform: translate3d(25px, 0, 0);\n    }\n\n    75% {\n        -webkit-transform: translate3d(-10px, 0, 0);\n        transform: translate3d(-10px, 0, 0);\n    }\n\n    90% {\n        -webkit-transform: translate3d(5px, 0, 0);\n        transform: translate3d(5px, 0, 0);\n    }\n\n    100% {\n        -webkit-transform: none;\n        transform: none;\n    }\n}\n\n@keyframes bounceInLeft {\n    0%, 60%, 75%, 90%, 100% {\n        -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n        transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    }\n\n    0% {\n        opacity: 0;\n        -webkit-transform: translate3d(-3000px, 0, 0);\n        transform: translate3d(-3000px, 0, 0);\n    }\n\n    60% {\n        opacity: 1;\n        -webkit-transform: translate3d(25px, 0, 0);\n        transform: translate3d(25px, 0, 0);\n    }\n\n    75% {\n        -webkit-transform: translate3d(-10px, 0, 0);\n        transform: translate3d(-10px, 0, 0);\n    }\n\n    90% {\n        -webkit-transform: translate3d(5px, 0, 0);\n        transform: translate3d(5px, 0, 0);\n    }\n\n    100% {\n        -webkit-transform: none;\n        transform: none;\n    }\n}\n\n.bounceInLeft {\n    -webkit-animation-name: bounceInLeft;\n    animation-name: bounceInLeft;\n}\n\n@-webkit-keyframes bounceInRight {\n    0%, 60%, 75%, 90%, 100% {\n        -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n        transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    }\n\n    0% {\n        opacity: 0;\n        -webkit-transform: translate3d(3000px, 0, 0);\n        transform: translate3d(3000px, 0, 0);\n    }\n\n    60% {\n        opacity: 1;\n        -webkit-transform: translate3d(-25px, 0, 0);\n        transform: translate3d(-25px, 0, 0);\n    }\n\n    75% {\n        -webkit-transform: translate3d(10px, 0, 0);\n        transform: translate3d(10px, 0, 0);\n    }\n\n    90% {\n        -webkit-transform: translate3d(-5px, 0, 0);\n        transform: translate3d(-5px, 0, 0);\n    }\n\n    100% {\n        -webkit-transform: none;\n        transform: none;\n    }\n}\n\n@keyframes bounceInRight {\n    0%, 60%, 75%, 90%, 100% {\n        -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n        transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    }\n\n    0% {\n        opacity: 0;\n        -webkit-transform: translate3d(3000px, 0, 0);\n        transform: translate3d(3000px, 0, 0);\n    }\n\n    60% {\n        opacity: 1;\n        -webkit-transform: translate3d(-25px, 0, 0);\n        transform: translate3d(-25px, 0, 0);\n    }\n\n    75% {\n        -webkit-transform: translate3d(10px, 0, 0);\n        transform: translate3d(10px, 0, 0);\n    }\n\n    90% {\n        -webkit-transform: translate3d(-5px, 0, 0);\n        transform: translate3d(-5px, 0, 0);\n    }\n\n    100% {\n        -webkit-transform: none;\n        transform: none;\n    }\n}\n\n.bounceInRight {\n    -webkit-animation-name: bounceInRight;\n    animation-name: bounceInRight;\n}\n\n@-webkit-keyframes bounceInUp {\n    0%, 60%, 75%, 90%, 100% {\n        -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n        transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    }\n\n    0% {\n        opacity: 0;\n        -webkit-transform: translate3d(0, 3000px, 0);\n        transform: translate3d(0, 3000px, 0);\n    }\n\n    60% {\n        opacity: 1;\n        -webkit-transform: translate3d(0, -20px, 0);\n        transform: translate3d(0, -20px, 0);\n    }\n\n    75% {\n        -webkit-transform: translate3d(0, 10px, 0);\n        transform: translate3d(0, 10px, 0);\n    }\n\n    90% {\n        -webkit-transform: translate3d(0, -5px, 0);\n        transform: translate3d(0, -5px, 0);\n    }\n\n    100% {\n        -webkit-transform: translate3d(0, 0, 0);\n        transform: translate3d(0, 0, 0);\n    }\n}\n\n@keyframes bounceInUp {\n    0%, 60%, 75%, 90%, 100% {\n        -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n        transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    }\n\n    0% {\n        opacity: 0;\n        -webkit-transform: translate3d(0, 3000px, 0);\n        transform: translate3d(0, 3000px, 0);\n    }\n\n    60% {\n        opacity: 1;\n        -webkit-transform: translate3d(0, -20px, 0);\n        transform: translate3d(0, -20px, 0);\n    }\n\n    75% {\n        -webkit-transform: translate3d(0, 10px, 0);\n        transform: translate3d(0, 10px, 0);\n    }\n\n    90% {\n        -webkit-transform: translate3d(0, -5px, 0);\n        transform: translate3d(0, -5px, 0);\n    }\n\n    100% {\n        -webkit-transform: translate3d(0, 0, 0);\n        transform: translate3d(0, 0, 0);\n    }\n}\n\n.bounceInUp {\n    -webkit-animation-name: bounceInUp;\n    animation-name: bounceInUp;\n}\n\n@-webkit-keyframes bounceOut {\n    20% {\n        -webkit-transform: scale3d(.9, .9, .9);\n        transform: scale3d(.9, .9, .9);\n    }\n\n    50%, 55% {\n        opacity: 1;\n        -webkit-transform: scale3d(1.1, 1.1, 1.1);\n        transform: scale3d(1.1, 1.1, 1.1);\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: scale3d(.3, .3, .3);\n        transform: scale3d(.3, .3, .3);\n    }\n}\n\n@keyframes bounceOut {\n    20% {\n        -webkit-transform: scale3d(.9, .9, .9);\n        transform: scale3d(.9, .9, .9);\n    }\n\n    50%, 55% {\n        opacity: 1;\n        -webkit-transform: scale3d(1.1, 1.1, 1.1);\n        transform: scale3d(1.1, 1.1, 1.1);\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: scale3d(.3, .3, .3);\n        transform: scale3d(.3, .3, .3);\n    }\n}\n\n.bounceOut {\n    -webkit-animation-name: bounceOut;\n    animation-name: bounceOut;\n}\n\n@-webkit-keyframes bounceOutDown {\n    20% {\n        -webkit-transform: translate3d(0, 10px, 0);\n        transform: translate3d(0, 10px, 0);\n    }\n\n    40%, 45% {\n        opacity: 1;\n        -webkit-transform: translate3d(0, -20px, 0);\n        transform: translate3d(0, -20px, 0);\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: translate3d(0, 2000px, 0);\n        transform: translate3d(0, 2000px, 0);\n    }\n}\n\n@keyframes bounceOutDown {\n    20% {\n        -webkit-transform: translate3d(0, 10px, 0);\n        transform: translate3d(0, 10px, 0);\n    }\n\n    40%, 45% {\n        opacity: 1;\n        -webkit-transform: translate3d(0, -20px, 0);\n        transform: translate3d(0, -20px, 0);\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: translate3d(0, 2000px, 0);\n        transform: translate3d(0, 2000px, 0);\n    }\n}\n\n.bounceOutDown {\n    -webkit-animation-name: bounceOutDown;\n    animation-name: bounceOutDown;\n}\n\n@-webkit-keyframes bounceOutLeft {\n    20% {\n        opacity: 1;\n        -webkit-transform: translate3d(20px, 0, 0);\n        transform: translate3d(20px, 0, 0);\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: translate3d(-2000px, 0, 0);\n        transform: translate3d(-2000px, 0, 0);\n    }\n}\n\n@keyframes bounceOutLeft {\n    20% {\n        opacity: 1;\n        -webkit-transform: translate3d(20px, 0, 0);\n        transform: translate3d(20px, 0, 0);\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: translate3d(-2000px, 0, 0);\n        transform: translate3d(-2000px, 0, 0);\n    }\n}\n\n.bounceOutLeft {\n    -webkit-animation-name: bounceOutLeft;\n    animation-name: bounceOutLeft;\n}\n\n@-webkit-keyframes bounceOutRight {\n    20% {\n        opacity: 1;\n        -webkit-transform: translate3d(-20px, 0, 0);\n        transform: translate3d(-20px, 0, 0);\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: translate3d(2000px, 0, 0);\n        transform: translate3d(2000px, 0, 0);\n    }\n}\n\n@keyframes bounceOutRight {\n    20% {\n        opacity: 1;\n        -webkit-transform: translate3d(-20px, 0, 0);\n        transform: translate3d(-20px, 0, 0);\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: translate3d(2000px, 0, 0);\n        transform: translate3d(2000px, 0, 0);\n    }\n}\n\n.bounceOutRight {\n    -webkit-animation-name: bounceOutRight;\n    animation-name: bounceOutRight;\n}\n\n@-webkit-keyframes bounceOutUp {\n    20% {\n        -webkit-transform: translate3d(0, -10px, 0);\n        transform: translate3d(0, -10px, 0);\n    }\n\n    40%, 45% {\n        opacity: 1;\n        -webkit-transform: translate3d(0, 20px, 0);\n        transform: translate3d(0, 20px, 0);\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: translate3d(0, -2000px, 0);\n        transform: translate3d(0, -2000px, 0);\n    }\n}\n\n@keyframes bounceOutUp {\n    20% {\n        -webkit-transform: translate3d(0, -10px, 0);\n        transform: translate3d(0, -10px, 0);\n    }\n\n    40%, 45% {\n        opacity: 1;\n        -webkit-transform: translate3d(0, 20px, 0);\n        transform: translate3d(0, 20px, 0);\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: translate3d(0, -2000px, 0);\n        transform: translate3d(0, -2000px, 0);\n    }\n}\n\n.bounceOutUp {\n    -webkit-animation-name: bounceOutUp;\n    animation-name: bounceOutUp;\n}\n\n@-webkit-keyframes fadeIn {\n    0% {\n        opacity: 0;\n    }\n\n    100% {\n        opacity: 1;\n    }\n}\n\n@keyframes fadeIn {\n    0% {\n        opacity: 0;\n    }\n\n    100% {\n        opacity: 1;\n    }\n}\n\n.fadeIn {\n    -webkit-animation-name: fadeIn;\n    animation-name: fadeIn;\n}\n\n@-webkit-keyframes fadeInDown {\n    0% {\n        opacity: 0;\n        -webkit-transform: translate3d(0, -100%, 0);\n        transform: translate3d(0, -100%, 0);\n    }\n\n    100% {\n        opacity: 1;\n        -webkit-transform: none;\n        transform: none;\n    }\n}\n\n@keyframes fadeInDown {\n    0% {\n        opacity: 0;\n        -webkit-transform: translate3d(0, -100%, 0);\n        transform: translate3d(0, -100%, 0);\n    }\n\n    100% {\n        opacity: 1;\n        -webkit-transform: none;\n        transform: none;\n    }\n}\n\n.fadeInDown {\n    -webkit-animation-name: fadeInDown;\n    animation-name: fadeInDown;\n}\n\n@-webkit-keyframes fadeInDownBig {\n    0% {\n        opacity: 0;\n        -webkit-transform: translate3d(0, -2000px, 0);\n        transform: translate3d(0, -2000px, 0);\n    }\n\n    100% {\n        opacity: 1;\n        -webkit-transform: none;\n        transform: none;\n    }\n}\n\n@keyframes fadeInDownBig {\n    0% {\n        opacity: 0;\n        -webkit-transform: translate3d(0, -2000px, 0);\n        transform: translate3d(0, -2000px, 0);\n    }\n\n    100% {\n        opacity: 1;\n        -webkit-transform: none;\n        transform: none;\n    }\n}\n\n.fadeInDownBig {\n    -webkit-animation-name: fadeInDownBig;\n    animation-name: fadeInDownBig;\n}\n\n@-webkit-keyframes fadeInLeft {\n    0% {\n        opacity: 0;\n        -webkit-transform: translate3d(-100%, 0, 0);\n        transform: translate3d(-100%, 0, 0);\n    }\n\n    100% {\n        opacity: 1;\n        -webkit-transform: none;\n        transform: none;\n    }\n}\n\n@keyframes fadeInLeft {\n    0% {\n        opacity: 0;\n        -webkit-transform: translate3d(-100%, 0, 0);\n        transform: translate3d(-100%, 0, 0);\n    }\n\n    100% {\n        opacity: 1;\n        -webkit-transform: none;\n        transform: none;\n    }\n}\n\n.fadeInLeft {\n    -webkit-animation-name: fadeInLeft;\n    animation-name: fadeInLeft;\n}\n\n@-webkit-keyframes fadeInLeftBig {\n    0% {\n        opacity: 0;\n        -webkit-transform: translate3d(-2000px, 0, 0);\n        transform: translate3d(-2000px, 0, 0);\n    }\n\n    100% {\n        opacity: 1;\n        -webkit-transform: none;\n        transform: none;\n    }\n}\n\n@keyframes fadeInLeftBig {\n    0% {\n        opacity: 0;\n        -webkit-transform: translate3d(-2000px, 0, 0);\n        transform: translate3d(-2000px, 0, 0);\n    }\n\n    100% {\n        opacity: 1;\n        -webkit-transform: none;\n        transform: none;\n    }\n}\n\n.fadeInLeftBig {\n    -webkit-animation-name: fadeInLeftBig;\n    animation-name: fadeInLeftBig;\n}\n\n@-webkit-keyframes fadeInRight {\n    0% {\n        opacity: 0;\n        -webkit-transform: translate3d(100%, 0, 0);\n        transform: translate3d(100%, 0, 0);\n    }\n\n    100% {\n        opacity: 1;\n        -webkit-transform: none;\n        transform: none;\n    }\n}\n\n@keyframes fadeInRight {\n    0% {\n        opacity: 0;\n        -webkit-transform: translate3d(100%, 0, 0);\n        transform: translate3d(100%, 0, 0);\n    }\n\n    100% {\n        opacity: 1;\n        -webkit-transform: none;\n        transform: none;\n    }\n}\n\n.fadeInRight {\n    -webkit-animation-name: fadeInRight;\n    animation-name: fadeInRight;\n}\n\n@-webkit-keyframes fadeInRightBig {\n    0% {\n        opacity: 0;\n        -webkit-transform: translate3d(2000px, 0, 0);\n        transform: translate3d(2000px, 0, 0);\n    }\n\n    100% {\n        opacity: 1;\n        -webkit-transform: none;\n        transform: none;\n    }\n}\n\n@keyframes fadeInRightBig {\n    0% {\n        opacity: 0;\n        -webkit-transform: translate3d(2000px, 0, 0);\n        transform: translate3d(2000px, 0, 0);\n    }\n\n    100% {\n        opacity: 1;\n        -webkit-transform: none;\n        transform: none;\n    }\n}\n\n.fadeInRightBig {\n    -webkit-animation-name: fadeInRightBig;\n    animation-name: fadeInRightBig;\n}\n\n@-webkit-keyframes fadeInUp {\n    0% {\n        opacity: 0;\n        -webkit-transform: translate3d(0, 100%, 0);\n        transform: translate3d(0, 100%, 0);\n    }\n\n    100% {\n        opacity: 1;\n        -webkit-transform: none;\n        transform: none;\n    }\n}\n\n@keyframes fadeInUp {\n    0% {\n        opacity: 0;\n        -webkit-transform: translate3d(0, 100%, 0);\n        transform: translate3d(0, 100%, 0);\n    }\n\n    100% {\n        opacity: 1;\n        -webkit-transform: none;\n        transform: none;\n    }\n}\n\n.fadeInUp {\n    -webkit-animation-name: fadeInUp;\n    animation-name: fadeInUp;\n}\n\n@-webkit-keyframes fadeInUpBig {\n    0% {\n        opacity: 0;\n        -webkit-transform: translate3d(0, 2000px, 0);\n        transform: translate3d(0, 2000px, 0);\n    }\n\n    100% {\n        opacity: 1;\n        -webkit-transform: none;\n        transform: none;\n    }\n}\n\n@keyframes fadeInUpBig {\n    0% {\n        opacity: 0;\n        -webkit-transform: translate3d(0, 2000px, 0);\n        transform: translate3d(0, 2000px, 0);\n    }\n\n    100% {\n        opacity: 1;\n        -webkit-transform: none;\n        transform: none;\n    }\n}\n\n.fadeInUpBig {\n    -webkit-animation-name: fadeInUpBig;\n    animation-name: fadeInUpBig;\n}\n\n@-webkit-keyframes fadeOut {\n    0% {\n        opacity: 1;\n    }\n\n    100% {\n        opacity: 0;\n    }\n}\n\n@keyframes fadeOut {\n    0% {\n        opacity: 1;\n    }\n\n    100% {\n        opacity: 0;\n    }\n}\n\n.fadeOut {\n    -webkit-animation-name: fadeOut;\n    animation-name: fadeOut;\n}\n\n@-webkit-keyframes fadeOutDown {\n    0% {\n        opacity: 1;\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: translate3d(0, 100%, 0);\n        transform: translate3d(0, 100%, 0);\n    }\n}\n\n@keyframes fadeOutDown {\n    0% {\n        opacity: 1;\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: translate3d(0, 100%, 0);\n        transform: translate3d(0, 100%, 0);\n    }\n}\n\n.fadeOutDown {\n    -webkit-animation-name: fadeOutDown;\n    animation-name: fadeOutDown;\n}\n\n@-webkit-keyframes fadeOutDownBig {\n    0% {\n        opacity: 1;\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: translate3d(0, 2000px, 0);\n        transform: translate3d(0, 2000px, 0);\n    }\n}\n\n@keyframes fadeOutDownBig {\n    0% {\n        opacity: 1;\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: translate3d(0, 2000px, 0);\n        transform: translate3d(0, 2000px, 0);\n    }\n}\n\n.fadeOutDownBig {\n    -webkit-animation-name: fadeOutDownBig;\n    animation-name: fadeOutDownBig;\n}\n\n@-webkit-keyframes fadeOutLeft {\n    0% {\n        opacity: 1;\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: translate3d(-100%, 0, 0);\n        transform: translate3d(-100%, 0, 0);\n    }\n}\n\n@keyframes fadeOutLeft {\n    0% {\n        opacity: 1;\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: translate3d(-100%, 0, 0);\n        transform: translate3d(-100%, 0, 0);\n    }\n}\n\n.fadeOutLeft {\n    -webkit-animation-name: fadeOutLeft;\n    animation-name: fadeOutLeft;\n}\n\n@-webkit-keyframes fadeOutLeftBig {\n    0% {\n        opacity: 1;\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: translate3d(-2000px, 0, 0);\n        transform: translate3d(-2000px, 0, 0);\n    }\n}\n\n@keyframes fadeOutLeftBig {\n    0% {\n        opacity: 1;\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: translate3d(-2000px, 0, 0);\n        transform: translate3d(-2000px, 0, 0);\n    }\n}\n\n.fadeOutLeftBig {\n    -webkit-animation-name: fadeOutLeftBig;\n    animation-name: fadeOutLeftBig;\n}\n\n@-webkit-keyframes fadeOutRight {\n    0% {\n        opacity: 1;\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: translate3d(100%, 0, 0);\n        transform: translate3d(100%, 0, 0);\n    }\n}\n\n@keyframes fadeOutRight {\n    0% {\n        opacity: 1;\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: translate3d(100%, 0, 0);\n        transform: translate3d(100%, 0, 0);\n    }\n}\n\n.fadeOutRight {\n    -webkit-animation-name: fadeOutRight;\n    animation-name: fadeOutRight;\n}\n\n@-webkit-keyframes fadeOutRightBig {\n    0% {\n        opacity: 1;\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: translate3d(2000px, 0, 0);\n        transform: translate3d(2000px, 0, 0);\n    }\n}\n\n@keyframes fadeOutRightBig {\n    0% {\n        opacity: 1;\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: translate3d(2000px, 0, 0);\n        transform: translate3d(2000px, 0, 0);\n    }\n}\n\n.fadeOutRightBig {\n    -webkit-animation-name: fadeOutRightBig;\n    animation-name: fadeOutRightBig;\n}\n\n@-webkit-keyframes fadeOutUp {\n    0% {\n        opacity: 1;\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: translate3d(0, -100%, 0);\n        transform: translate3d(0, -100%, 0);\n    }\n}\n\n@keyframes fadeOutUp {\n    0% {\n        opacity: 1;\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: translate3d(0, -100%, 0);\n        transform: translate3d(0, -100%, 0);\n    }\n}\n\n.fadeOutUp {\n    -webkit-animation-name: fadeOutUp;\n    animation-name: fadeOutUp;\n}\n\n@-webkit-keyframes fadeOutUpBig {\n    0% {\n        opacity: 1;\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: translate3d(0, -2000px, 0);\n        transform: translate3d(0, -2000px, 0);\n    }\n}\n\n@keyframes fadeOutUpBig {\n    0% {\n        opacity: 1;\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: translate3d(0, -2000px, 0);\n        transform: translate3d(0, -2000px, 0);\n    }\n}\n\n.fadeOutUpBig {\n    -webkit-animation-name: fadeOutUpBig;\n    animation-name: fadeOutUpBig;\n}\n\n@-webkit-keyframes flip {\n    0% {\n        -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n        transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n        -webkit-animation-timing-function: ease-out;\n        animation-timing-function: ease-out;\n    }\n\n    40% {\n        -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n        transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n        -webkit-animation-timing-function: ease-out;\n        animation-timing-function: ease-out;\n    }\n\n    50% {\n        -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n        transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n        -webkit-animation-timing-function: ease-in;\n        animation-timing-function: ease-in;\n    }\n\n    80% {\n        -webkit-transform: perspective(400px) scale3d(.95, .95, .95);\n        transform: perspective(400px) scale3d(.95, .95, .95);\n        -webkit-animation-timing-function: ease-in;\n        animation-timing-function: ease-in;\n    }\n\n    100% {\n        -webkit-transform: perspective(400px);\n        transform: perspective(400px);\n        -webkit-animation-timing-function: ease-in;\n        animation-timing-function: ease-in;\n    }\n}\n\n@keyframes flip {\n    0% {\n        -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n        transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n        -webkit-animation-timing-function: ease-out;\n        animation-timing-function: ease-out;\n    }\n\n    40% {\n        -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n        transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n        -webkit-animation-timing-function: ease-out;\n        animation-timing-function: ease-out;\n    }\n\n    50% {\n        -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n        transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n        -webkit-animation-timing-function: ease-in;\n        animation-timing-function: ease-in;\n    }\n\n    80% {\n        -webkit-transform: perspective(400px) scale3d(.95, .95, .95);\n        transform: perspective(400px) scale3d(.95, .95, .95);\n        -webkit-animation-timing-function: ease-in;\n        animation-timing-function: ease-in;\n    }\n\n    100% {\n        -webkit-transform: perspective(400px);\n        transform: perspective(400px);\n        -webkit-animation-timing-function: ease-in;\n        animation-timing-function: ease-in;\n    }\n}\n\n.animated.flip {\n    -webkit-backface-visibility: visible;\n    backface-visibility: visible;\n    -webkit-animation-name: flip;\n    animation-name: flip;\n}\n\n@-webkit-keyframes flipInX {\n    0% {\n        -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n        transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n        -webkit-transition-timing-function: ease-in;\n        transition-timing-function: ease-in;\n        opacity: 0;\n    }\n\n    40% {\n        -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n        transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n        -webkit-transition-timing-function: ease-in;\n        transition-timing-function: ease-in;\n    }\n\n    60% {\n        -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n        transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n        opacity: 1;\n    }\n\n    80% {\n        -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n        transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n    }\n\n    100% {\n        -webkit-transform: perspective(400px);\n        transform: perspective(400px);\n    }\n}\n\n@keyframes flipInX {\n    0% {\n        -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n        transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n        -webkit-transition-timing-function: ease-in;\n        transition-timing-function: ease-in;\n        opacity: 0;\n    }\n\n    40% {\n        -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n        transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n        -webkit-transition-timing-function: ease-in;\n        transition-timing-function: ease-in;\n    }\n\n    60% {\n        -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n        transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n        opacity: 1;\n    }\n\n    80% {\n        -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n        transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n    }\n\n    100% {\n        -webkit-transform: perspective(400px);\n        transform: perspective(400px);\n    }\n}\n\n.flipInX {\n    -webkit-backface-visibility: visible !important;\n    backface-visibility: visible !important;\n    -webkit-animation-name: flipInX;\n    animation-name: flipInX;\n}\n\n@-webkit-keyframes flipInY {\n    0% {\n        -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n        transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n        -webkit-transition-timing-function: ease-in;\n        transition-timing-function: ease-in;\n        opacity: 0;\n    }\n\n    40% {\n        -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n        transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n        -webkit-transition-timing-function: ease-in;\n        transition-timing-function: ease-in;\n    }\n\n    60% {\n        -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n        transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n        opacity: 1;\n    }\n\n    80% {\n        -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n        transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n    }\n\n    100% {\n        -webkit-transform: perspective(400px);\n        transform: perspective(400px);\n    }\n}\n\n@keyframes flipInY {\n    0% {\n        -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n        transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n        -webkit-transition-timing-function: ease-in;\n        transition-timing-function: ease-in;\n        opacity: 0;\n    }\n\n    40% {\n        -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n        transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n        -webkit-transition-timing-function: ease-in;\n        transition-timing-function: ease-in;\n    }\n\n    60% {\n        -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n        transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n        opacity: 1;\n    }\n\n    80% {\n        -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n        transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n    }\n\n    100% {\n        -webkit-transform: perspective(400px);\n        transform: perspective(400px);\n    }\n}\n\n.flipInY {\n    -webkit-backface-visibility: visible !important;\n    backface-visibility: visible !important;\n    -webkit-animation-name: flipInY;\n    animation-name: flipInY;\n}\n\n@-webkit-keyframes flipOutX {\n    0% {\n        -webkit-transform: perspective(400px);\n        transform: perspective(400px);\n    }\n\n    30% {\n        -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n        transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n        opacity: 1;\n    }\n\n    100% {\n        -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n        transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n        opacity: 0;\n    }\n}\n\n@keyframes flipOutX {\n    0% {\n        -webkit-transform: perspective(400px);\n        transform: perspective(400px);\n    }\n\n    30% {\n        -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n        transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n        opacity: 1;\n    }\n\n    100% {\n        -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n        transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n        opacity: 0;\n    }\n}\n\n.flipOutX {\n    -webkit-animation-name: flipOutX;\n    animation-name: flipOutX;\n    -webkit-backface-visibility: visible !important;\n    backface-visibility: visible !important;\n}\n\n@-webkit-keyframes flipOutY {\n    0% {\n        -webkit-transform: perspective(400px);\n        transform: perspective(400px);\n    }\n\n    30% {\n        -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n        transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n        opacity: 1;\n    }\n\n    100% {\n        -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n        transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n        opacity: 0;\n    }\n}\n\n@keyframes flipOutY {\n    0% {\n        -webkit-transform: perspective(400px);\n        transform: perspective(400px);\n    }\n\n    30% {\n        -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n        transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n        opacity: 1;\n    }\n\n    100% {\n        -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n        transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n        opacity: 0;\n    }\n}\n\n.flipOutY {\n    -webkit-backface-visibility: visible !important;\n    backface-visibility: visible !important;\n    -webkit-animation-name: flipOutY;\n    animation-name: flipOutY;\n}\n\n@-webkit-keyframes lightSpeedIn {\n    0% {\n        -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);\n        transform: translate3d(100%, 0, 0) skewX(-30deg);\n        opacity: 0;\n    }\n\n    60% {\n        -webkit-transform: skewX(20deg);\n        transform: skewX(20deg);\n        opacity: 1;\n    }\n\n    80% {\n        -webkit-transform: skewX(-5deg);\n        transform: skewX(-5deg);\n        opacity: 1;\n    }\n\n    100% {\n        -webkit-transform: none;\n        transform: none;\n        opacity: 1;\n    }\n}\n\n@keyframes lightSpeedIn {\n    0% {\n        -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);\n        transform: translate3d(100%, 0, 0) skewX(-30deg);\n        opacity: 0;\n    }\n\n    60% {\n        -webkit-transform: skewX(20deg);\n        transform: skewX(20deg);\n        opacity: 1;\n    }\n\n    80% {\n        -webkit-transform: skewX(-5deg);\n        transform: skewX(-5deg);\n        opacity: 1;\n    }\n\n    100% {\n        -webkit-transform: none;\n        transform: none;\n        opacity: 1;\n    }\n}\n\n.lightSpeedIn {\n    -webkit-animation-name: lightSpeedIn;\n    animation-name: lightSpeedIn;\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n}\n\n@-webkit-keyframes lightSpeedOut {\n    0% {\n        opacity: 1;\n    }\n\n    100% {\n        -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);\n        transform: translate3d(100%, 0, 0) skewX(30deg);\n        opacity: 0;\n    }\n}\n\n@keyframes lightSpeedOut {\n    0% {\n        opacity: 1;\n    }\n\n    100% {\n        -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);\n        transform: translate3d(100%, 0, 0) skewX(30deg);\n        opacity: 0;\n    }\n}\n\n.lightSpeedOut {\n    -webkit-animation-name: lightSpeedOut;\n    animation-name: lightSpeedOut;\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n}\n\n@-webkit-keyframes rotateIn {\n    0% {\n        -webkit-transform-origin: center;\n        transform-origin: center;\n        -webkit-transform: rotate3d(0, 0, 1, -200deg);\n        transform: rotate3d(0, 0, 1, -200deg);\n        opacity: 0;\n    }\n\n    100% {\n        -webkit-transform-origin: center;\n        transform-origin: center;\n        -webkit-transform: none;\n        transform: none;\n        opacity: 1;\n    }\n}\n\n@keyframes rotateIn {\n    0% {\n        -webkit-transform-origin: center;\n        transform-origin: center;\n        -webkit-transform: rotate3d(0, 0, 1, -200deg);\n        transform: rotate3d(0, 0, 1, -200deg);\n        opacity: 0;\n    }\n\n    100% {\n        -webkit-transform-origin: center;\n        transform-origin: center;\n        -webkit-transform: none;\n        transform: none;\n        opacity: 1;\n    }\n}\n\n.rotateIn {\n    -webkit-animation-name: rotateIn;\n    animation-name: rotateIn;\n}\n\n@-webkit-keyframes rotateInDownLeft {\n    0% {\n        -webkit-transform-origin: left bottom;\n        transform-origin: left bottom;\n        -webkit-transform: rotate3d(0, 0, 1, -45deg);\n        transform: rotate3d(0, 0, 1, -45deg);\n        opacity: 0;\n    }\n\n    100% {\n        -webkit-transform-origin: left bottom;\n        transform-origin: left bottom;\n        -webkit-transform: none;\n        transform: none;\n        opacity: 1;\n    }\n}\n\n@keyframes rotateInDownLeft {\n    0% {\n        -webkit-transform-origin: left bottom;\n        transform-origin: left bottom;\n        -webkit-transform: rotate3d(0, 0, 1, -45deg);\n        transform: rotate3d(0, 0, 1, -45deg);\n        opacity: 0;\n    }\n\n    100% {\n        -webkit-transform-origin: left bottom;\n        transform-origin: left bottom;\n        -webkit-transform: none;\n        transform: none;\n        opacity: 1;\n    }\n}\n\n.rotateInDownLeft {\n    -webkit-animation-name: rotateInDownLeft;\n    animation-name: rotateInDownLeft;\n}\n\n@-webkit-keyframes rotateInDownRight {\n    0% {\n        -webkit-transform-origin: right bottom;\n        transform-origin: right bottom;\n        -webkit-transform: rotate3d(0, 0, 1, 45deg);\n        transform: rotate3d(0, 0, 1, 45deg);\n        opacity: 0;\n    }\n\n    100% {\n        -webkit-transform-origin: right bottom;\n        transform-origin: right bottom;\n        -webkit-transform: none;\n        transform: none;\n        opacity: 1;\n    }\n}\n\n@keyframes rotateInDownRight {\n    0% {\n        -webkit-transform-origin: right bottom;\n        transform-origin: right bottom;\n        -webkit-transform: rotate3d(0, 0, 1, 45deg);\n        transform: rotate3d(0, 0, 1, 45deg);\n        opacity: 0;\n    }\n\n    100% {\n        -webkit-transform-origin: right bottom;\n        transform-origin: right bottom;\n        -webkit-transform: none;\n        transform: none;\n        opacity: 1;\n    }\n}\n\n.rotateInDownRight {\n    -webkit-animation-name: rotateInDownRight;\n    animation-name: rotateInDownRight;\n}\n\n@-webkit-keyframes rotateInUpLeft {\n    0% {\n        -webkit-transform-origin: left bottom;\n        transform-origin: left bottom;\n        -webkit-transform: rotate3d(0, 0, 1, 45deg);\n        transform: rotate3d(0, 0, 1, 45deg);\n        opacity: 0;\n    }\n\n    100% {\n        -webkit-transform-origin: left bottom;\n        transform-origin: left bottom;\n        -webkit-transform: none;\n        transform: none;\n        opacity: 1;\n    }\n}\n\n@keyframes rotateInUpLeft {\n    0% {\n        -webkit-transform-origin: left bottom;\n        transform-origin: left bottom;\n        -webkit-transform: rotate3d(0, 0, 1, 45deg);\n        transform: rotate3d(0, 0, 1, 45deg);\n        opacity: 0;\n    }\n\n    100% {\n        -webkit-transform-origin: left bottom;\n        transform-origin: left bottom;\n        -webkit-transform: none;\n        transform: none;\n        opacity: 1;\n    }\n}\n\n.rotateInUpLeft {\n    -webkit-animation-name: rotateInUpLeft;\n    animation-name: rotateInUpLeft;\n}\n\n@-webkit-keyframes rotateInUpRight {\n    0% {\n        -webkit-transform-origin: right bottom;\n        transform-origin: right bottom;\n        -webkit-transform: rotate3d(0, 0, 1, -90deg);\n        transform: rotate3d(0, 0, 1, -90deg);\n        opacity: 0;\n    }\n\n    100% {\n        -webkit-transform-origin: right bottom;\n        transform-origin: right bottom;\n        -webkit-transform: none;\n        transform: none;\n        opacity: 1;\n    }\n}\n\n@keyframes rotateInUpRight {\n    0% {\n        -webkit-transform-origin: right bottom;\n        transform-origin: right bottom;\n        -webkit-transform: rotate3d(0, 0, 1, -90deg);\n        transform: rotate3d(0, 0, 1, -90deg);\n        opacity: 0;\n    }\n\n    100% {\n        -webkit-transform-origin: right bottom;\n        transform-origin: right bottom;\n        -webkit-transform: none;\n        transform: none;\n        opacity: 1;\n    }\n}\n\n.rotateInUpRight {\n    -webkit-animation-name: rotateInUpRight;\n    animation-name: rotateInUpRight;\n}\n\n@-webkit-keyframes rotateOut {\n    0% {\n        -webkit-transform-origin: center;\n        transform-origin: center;\n        opacity: 1;\n    }\n\n    100% {\n        -webkit-transform-origin: center;\n        transform-origin: center;\n        -webkit-transform: rotate3d(0, 0, 1, 200deg);\n        transform: rotate3d(0, 0, 1, 200deg);\n        opacity: 0;\n    }\n}\n\n@keyframes rotateOut {\n    0% {\n        -webkit-transform-origin: center;\n        transform-origin: center;\n        opacity: 1;\n    }\n\n    100% {\n        -webkit-transform-origin: center;\n        transform-origin: center;\n        -webkit-transform: rotate3d(0, 0, 1, 200deg);\n        transform: rotate3d(0, 0, 1, 200deg);\n        opacity: 0;\n    }\n}\n\n.rotateOut {\n    -webkit-animation-name: rotateOut;\n    animation-name: rotateOut;\n}\n\n@-webkit-keyframes rotateOutDownLeft {\n    0% {\n        -webkit-transform-origin: left bottom;\n        transform-origin: left bottom;\n        opacity: 1;\n    }\n\n    100% {\n        -webkit-transform-origin: left bottom;\n        transform-origin: left bottom;\n        -webkit-transform: rotate3d(0, 0, 1, 45deg);\n        transform: rotate3d(0, 0, 1, 45deg);\n        opacity: 0;\n    }\n}\n\n@keyframes rotateOutDownLeft {\n    0% {\n        -webkit-transform-origin: left bottom;\n        transform-origin: left bottom;\n        opacity: 1;\n    }\n\n    100% {\n        -webkit-transform-origin: left bottom;\n        transform-origin: left bottom;\n        -webkit-transform: rotate3d(0, 0, 1, 45deg);\n        transform: rotate3d(0, 0, 1, 45deg);\n        opacity: 0;\n    }\n}\n\n.rotateOutDownLeft {\n    -webkit-animation-name: rotateOutDownLeft;\n    animation-name: rotateOutDownLeft;\n}\n\n@-webkit-keyframes rotateOutDownRight {\n    0% {\n        -webkit-transform-origin: right bottom;\n        transform-origin: right bottom;\n        opacity: 1;\n    }\n\n    100% {\n        -webkit-transform-origin: right bottom;\n        transform-origin: right bottom;\n        -webkit-transform: rotate3d(0, 0, 1, -45deg);\n        transform: rotate3d(0, 0, 1, -45deg);\n        opacity: 0;\n    }\n}\n\n@keyframes rotateOutDownRight {\n    0% {\n        -webkit-transform-origin: right bottom;\n        transform-origin: right bottom;\n        opacity: 1;\n    }\n\n    100% {\n        -webkit-transform-origin: right bottom;\n        transform-origin: right bottom;\n        -webkit-transform: rotate3d(0, 0, 1, -45deg);\n        transform: rotate3d(0, 0, 1, -45deg);\n        opacity: 0;\n    }\n}\n\n.rotateOutDownRight {\n    -webkit-animation-name: rotateOutDownRight;\n    animation-name: rotateOutDownRight;\n}\n\n@-webkit-keyframes rotateOutUpLeft {\n    0% {\n        -webkit-transform-origin: left bottom;\n        transform-origin: left bottom;\n        opacity: 1;\n    }\n\n    100% {\n        -webkit-transform-origin: left bottom;\n        transform-origin: left bottom;\n        -webkit-transform: rotate3d(0, 0, 1, -45deg);\n        transform: rotate3d(0, 0, 1, -45deg);\n        opacity: 0;\n    }\n}\n\n@keyframes rotateOutUpLeft {\n    0% {\n        -webkit-transform-origin: left bottom;\n        transform-origin: left bottom;\n        opacity: 1;\n    }\n\n    100% {\n        -webkit-transform-origin: left bottom;\n        transform-origin: left bottom;\n        -webkit-transform: rotate3d(0, 0, 1, -45deg);\n        transform: rotate3d(0, 0, 1, -45deg);\n        opacity: 0;\n    }\n}\n\n.rotateOutUpLeft {\n    -webkit-animation-name: rotateOutUpLeft;\n    animation-name: rotateOutUpLeft;\n}\n\n@-webkit-keyframes rotateOutUpRight {\n    0% {\n        -webkit-transform-origin: right bottom;\n        transform-origin: right bottom;\n        opacity: 1;\n    }\n\n    100% {\n        -webkit-transform-origin: right bottom;\n        transform-origin: right bottom;\n        -webkit-transform: rotate3d(0, 0, 1, 90deg);\n        transform: rotate3d(0, 0, 1, 90deg);\n        opacity: 0;\n    }\n}\n\n@keyframes rotateOutUpRight {\n    0% {\n        -webkit-transform-origin: right bottom;\n        transform-origin: right bottom;\n        opacity: 1;\n    }\n\n    100% {\n        -webkit-transform-origin: right bottom;\n        transform-origin: right bottom;\n        -webkit-transform: rotate3d(0, 0, 1, 90deg);\n        transform: rotate3d(0, 0, 1, 90deg);\n        opacity: 0;\n    }\n}\n\n.rotateOutUpRight {\n    -webkit-animation-name: rotateOutUpRight;\n    animation-name: rotateOutUpRight;\n}\n\n@-webkit-keyframes hinge {\n    0% {\n        -webkit-transform-origin: top left;\n        transform-origin: top left;\n        -webkit-animation-timing-function: ease-in-out;\n        animation-timing-function: ease-in-out;\n    }\n\n    20%, 60% {\n        -webkit-transform: rotate3d(0, 0, 1, 80deg);\n        transform: rotate3d(0, 0, 1, 80deg);\n        -webkit-transform-origin: top left;\n        transform-origin: top left;\n        -webkit-animation-timing-function: ease-in-out;\n        animation-timing-function: ease-in-out;\n    }\n\n    40%, 80% {\n        -webkit-transform: rotate3d(0, 0, 1, 60deg);\n        transform: rotate3d(0, 0, 1, 60deg);\n        -webkit-transform-origin: top left;\n        transform-origin: top left;\n        -webkit-animation-timing-function: ease-in-out;\n        animation-timing-function: ease-in-out;\n        opacity: 1;\n    }\n\n    100% {\n        -webkit-transform: translate3d(0, 700px, 0);\n        transform: translate3d(0, 700px, 0);\n        opacity: 0;\n    }\n}\n\n@keyframes hinge {\n    0% {\n        -webkit-transform-origin: top left;\n        transform-origin: top left;\n        -webkit-animation-timing-function: ease-in-out;\n        animation-timing-function: ease-in-out;\n    }\n\n    20%, 60% {\n        -webkit-transform: rotate3d(0, 0, 1, 80deg);\n        transform: rotate3d(0, 0, 1, 80deg);\n        -webkit-transform-origin: top left;\n        transform-origin: top left;\n        -webkit-animation-timing-function: ease-in-out;\n        animation-timing-function: ease-in-out;\n    }\n\n    40%, 80% {\n        -webkit-transform: rotate3d(0, 0, 1, 60deg);\n        transform: rotate3d(0, 0, 1, 60deg);\n        -webkit-transform-origin: top left;\n        transform-origin: top left;\n        -webkit-animation-timing-function: ease-in-out;\n        animation-timing-function: ease-in-out;\n        opacity: 1;\n    }\n\n    100% {\n        -webkit-transform: translate3d(0, 700px, 0);\n        transform: translate3d(0, 700px, 0);\n        opacity: 0;\n    }\n}\n\n.hinge {\n    -webkit-animation-name: hinge;\n    animation-name: hinge;\n}\n\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n\n@-webkit-keyframes rollIn {\n    0% {\n        opacity: 0;\n        -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n        transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n    }\n\n    100% {\n        opacity: 1;\n        -webkit-transform: none;\n        transform: none;\n    }\n}\n\n@keyframes rollIn {\n    0% {\n        opacity: 0;\n        -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n        transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n    }\n\n    100% {\n        opacity: 1;\n        -webkit-transform: none;\n        transform: none;\n    }\n}\n\n.rollIn {\n    -webkit-animation-name: rollIn;\n    animation-name: rollIn;\n}\n\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n\n@-webkit-keyframes rollOut {\n    0% {\n        opacity: 1;\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n        transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n    }\n}\n\n@keyframes rollOut {\n    0% {\n        opacity: 1;\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n        transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n    }\n}\n\n.rollOut {\n    -webkit-animation-name: rollOut;\n    animation-name: rollOut;\n}\n\n@-webkit-keyframes zoomIn {\n    0% {\n        opacity: 0;\n        -webkit-transform: scale3d(.3, .3, .3);\n        transform: scale3d(.3, .3, .3);\n    }\n\n    50% {\n        opacity: 1;\n    }\n}\n\n@keyframes zoomIn {\n    0% {\n        opacity: 0;\n        -webkit-transform: scale3d(.3, .3, .3);\n        transform: scale3d(.3, .3, .3);\n    }\n\n    50% {\n        opacity: 1;\n    }\n}\n\n.zoomIn {\n    -webkit-animation-name: zoomIn;\n    animation-name: zoomIn;\n}\n\n@-webkit-keyframes zoomInDown {\n    0% {\n        opacity: 0;\n        -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);\n        transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);\n        -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n        animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    }\n\n    60% {\n        opacity: 1;\n        -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n        transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n        -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n        animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    }\n}\n\n@keyframes zoomInDown {\n    0% {\n        opacity: 0;\n        -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);\n        transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);\n        -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n        animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    }\n\n    60% {\n        opacity: 1;\n        -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n        transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n        -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n        animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    }\n}\n\n.zoomInDown {\n    -webkit-animation-name: zoomInDown;\n    animation-name: zoomInDown;\n}\n\n@-webkit-keyframes zoomInLeft {\n    0% {\n        opacity: 0;\n        -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);\n        transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);\n        -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n        animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    }\n\n    60% {\n        opacity: 1;\n        -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);\n        transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);\n        -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n        animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    }\n}\n\n@keyframes zoomInLeft {\n    0% {\n        opacity: 0;\n        -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);\n        transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);\n        -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n        animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    }\n\n    60% {\n        opacity: 1;\n        -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);\n        transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);\n        -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n        animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    }\n}\n\n.zoomInLeft {\n    -webkit-animation-name: zoomInLeft;\n    animation-name: zoomInLeft;\n}\n\n@-webkit-keyframes zoomInRight {\n    0% {\n        opacity: 0;\n        -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);\n        transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);\n        -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n        animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    }\n\n    60% {\n        opacity: 1;\n        -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);\n        transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);\n        -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n        animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    }\n}\n\n@keyframes zoomInRight {\n    0% {\n        opacity: 0;\n        -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);\n        transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);\n        -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n        animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    }\n\n    60% {\n        opacity: 1;\n        -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);\n        transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);\n        -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n        animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    }\n}\n\n.zoomInRight {\n    -webkit-animation-name: zoomInRight;\n    animation-name: zoomInRight;\n}\n\n@-webkit-keyframes zoomInUp {\n    0% {\n        opacity: 0;\n        -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);\n        transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);\n        -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n        animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    }\n\n    60% {\n        opacity: 1;\n        -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n        transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n        -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n        animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    }\n}\n\n@keyframes zoomInUp {\n    0% {\n        opacity: 0;\n        -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);\n        transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);\n        -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n        animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    }\n\n    60% {\n        opacity: 1;\n        -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n        transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n        -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n        animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    }\n}\n\n.zoomInUp {\n    -webkit-animation-name: zoomInUp;\n    animation-name: zoomInUp;\n}\n\n@-webkit-keyframes zoomOut {\n    0% {\n        opacity: 1;\n    }\n\n    50% {\n        opacity: 0;\n        -webkit-transform: scale3d(.3, .3, .3);\n        transform: scale3d(.3, .3, .3);\n    }\n\n    100% {\n        opacity: 0;\n    }\n}\n\n@keyframes zoomOut {\n    0% {\n        opacity: 1;\n    }\n\n    50% {\n        opacity: 0;\n        -webkit-transform: scale3d(.3, .3, .3);\n        transform: scale3d(.3, .3, .3);\n    }\n\n    100% {\n        opacity: 0;\n    }\n}\n\n.zoomOut {\n    -webkit-animation-name: zoomOut;\n    animation-name: zoomOut;\n}\n\n@-webkit-keyframes zoomOutDown {\n    40% {\n        opacity: 1;\n        -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n        transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n        -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n        animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);\n        transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);\n        -webkit-transform-origin: center bottom;\n        transform-origin: center bottom;\n        -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n        animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    }\n}\n\n@keyframes zoomOutDown {\n    40% {\n        opacity: 1;\n        -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n        transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n        -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n        animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);\n        transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);\n        -webkit-transform-origin: center bottom;\n        transform-origin: center bottom;\n        -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n        animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    }\n}\n\n.zoomOutDown {\n    -webkit-animation-name: zoomOutDown;\n    animation-name: zoomOutDown;\n}\n\n@-webkit-keyframes zoomOutLeft {\n    40% {\n        opacity: 1;\n        -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);\n        transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: scale(.1) translate3d(-2000px, 0, 0);\n        transform: scale(.1) translate3d(-2000px, 0, 0);\n        -webkit-transform-origin: left center;\n        transform-origin: left center;\n    }\n}\n\n@keyframes zoomOutLeft {\n    40% {\n        opacity: 1;\n        -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);\n        transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: scale(.1) translate3d(-2000px, 0, 0);\n        transform: scale(.1) translate3d(-2000px, 0, 0);\n        -webkit-transform-origin: left center;\n        transform-origin: left center;\n    }\n}\n\n.zoomOutLeft {\n    -webkit-animation-name: zoomOutLeft;\n    animation-name: zoomOutLeft;\n}\n\n@-webkit-keyframes zoomOutRight {\n    40% {\n        opacity: 1;\n        -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);\n        transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: scale(.1) translate3d(2000px, 0, 0);\n        transform: scale(.1) translate3d(2000px, 0, 0);\n        -webkit-transform-origin: right center;\n        transform-origin: right center;\n    }\n}\n\n@keyframes zoomOutRight {\n    40% {\n        opacity: 1;\n        -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);\n        transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: scale(.1) translate3d(2000px, 0, 0);\n        transform: scale(.1) translate3d(2000px, 0, 0);\n        -webkit-transform-origin: right center;\n        transform-origin: right center;\n    }\n}\n\n.zoomOutRight {\n    -webkit-animation-name: zoomOutRight;\n    animation-name: zoomOutRight;\n}\n\n@-webkit-keyframes zoomOutUp {\n    40% {\n        opacity: 1;\n        -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n        transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n        -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n        animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);\n        transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);\n        -webkit-transform-origin: center bottom;\n        transform-origin: center bottom;\n        -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n        animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    }\n}\n\n@keyframes zoomOutUp {\n    40% {\n        opacity: 1;\n        -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n        transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n        -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n        animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);\n        transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);\n        -webkit-transform-origin: center bottom;\n        transform-origin: center bottom;\n        -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n        animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    }\n}\n\n.zoomOutUp {\n    -webkit-animation-name: zoomOutUp;\n    animation-name: zoomOutUp;\n}\n\n@-webkit-keyframes slideInDown {\n    0% {\n        -webkit-transform: translateY(-100%);\n        transform: translateY(-100%);\n        visibility: visible;\n    }\n\n    100% {\n        -webkit-transform: translateY(0);\n        transform: translateY(0);\n    }\n}\n\n@keyframes slideInDown {\n    0% {\n        -webkit-transform: translateY(-100%);\n        transform: translateY(-100%);\n        visibility: visible;\n    }\n\n    100% {\n        -webkit-transform: translateY(0);\n        transform: translateY(0);\n    }\n}\n\n.slideInDown {\n    -webkit-animation-name: slideInDown;\n    animation-name: slideInDown;\n}\n\n@-webkit-keyframes slideInLeft {\n    0% {\n        -webkit-transform: translateX(-100%);\n        transform: translateX(-100%);\n        visibility: visible;\n    }\n\n    100% {\n        -webkit-transform: translateX(0);\n        transform: translateX(0);\n    }\n}\n\n@keyframes slideInLeft {\n    0% {\n        -webkit-transform: translateX(-100%);\n        transform: translateX(-100%);\n        visibility: visible;\n    }\n\n    100% {\n        -webkit-transform: translateX(0);\n        transform: translateX(0);\n    }\n}\n\n.slideInLeft {\n    -webkit-animation-name: slideInLeft;\n    animation-name: slideInLeft;\n}\n\n@-webkit-keyframes slideInRight {\n    0% {\n        -webkit-transform: translateX(100%);\n        transform: translateX(100%);\n        visibility: visible;\n    }\n\n    100% {\n        -webkit-transform: translateX(0);\n        transform: translateX(0);\n    }\n}\n\n@keyframes slideInRight {\n    0% {\n        -webkit-transform: translateX(100%);\n        transform: translateX(100%);\n        visibility: visible;\n    }\n\n    100% {\n        -webkit-transform: translateX(0);\n        transform: translateX(0);\n    }\n}\n\n.slideInRight {\n    -webkit-animation-name: slideInRight;\n    animation-name: slideInRight;\n}\n\n@-webkit-keyframes slideInUp {\n    0% {\n        -webkit-transform: translateY(100%);\n        transform: translateY(100%);\n        visibility: visible;\n    }\n\n    100% {\n        -webkit-transform: translateY(0);\n        transform: translateY(0);\n    }\n}\n\n@keyframes slideInUp {\n    0% {\n        -webkit-transform: translateY(100%);\n        transform: translateY(100%);\n        visibility: visible;\n    }\n\n    100% {\n        -webkit-transform: translateY(0);\n        transform: translateY(0);\n    }\n}\n\n.slideInUp {\n    -webkit-animation-name: slideInUp;\n    animation-name: slideInUp;\n}\n\n@-webkit-keyframes slideOutDown {\n    0% {\n        -webkit-transform: translateY(0);\n        transform: translateY(0);\n    }\n\n    100% {\n        visibility: hidden;\n        -webkit-transform: translateY(100%);\n        transform: translateY(100%);\n    }\n}\n\n@keyframes slideOutDown {\n    0% {\n        -webkit-transform: translateY(0);\n        transform: translateY(0);\n    }\n\n    100% {\n        visibility: hidden;\n        -webkit-transform: translateY(100%);\n        transform: translateY(100%);\n    }\n}\n\n.slideOutDown {\n    -webkit-animation-name: slideOutDown;\n    animation-name: slideOutDown;\n}\n\n@-webkit-keyframes slideOutLeft {\n    0% {\n        -webkit-transform: translateX(0);\n        transform: translateX(0);\n    }\n\n    100% {\n        visibility: hidden;\n        -webkit-transform: translateX(-100%);\n        transform: translateX(-100%);\n    }\n}\n\n@keyframes slideOutLeft {\n    0% {\n        -webkit-transform: translateX(0);\n        transform: translateX(0);\n    }\n\n    100% {\n        visibility: hidden;\n        -webkit-transform: translateX(-100%);\n        transform: translateX(-100%);\n    }\n}\n\n.slideOutLeft {\n    -webkit-animation-name: slideOutLeft;\n    animation-name: slideOutLeft;\n}\n\n@-webkit-keyframes slideOutRight {\n    0% {\n        -webkit-transform: translateX(0);\n        transform: translateX(0);\n    }\n\n    100% {\n        visibility: hidden;\n        -webkit-transform: translateX(100%);\n        transform: translateX(100%);\n    }\n}\n\n@keyframes slideOutRight {\n    0% {\n        -webkit-transform: translateX(0);\n        transform: translateX(0);\n    }\n\n    100% {\n        visibility: hidden;\n        -webkit-transform: translateX(100%);\n        transform: translateX(100%);\n    }\n}\n\n.slideOutRight {\n    -webkit-animation-name: slideOutRight;\n    animation-name: slideOutRight;\n}\n\n@-webkit-keyframes slideOutUp {\n    0% {\n        -webkit-transform: translateY(0);\n        transform: translateY(0);\n    }\n\n    100% {\n        visibility: hidden;\n        -webkit-transform: translateY(-100%);\n        transform: translateY(-100%);\n    }\n}\n\n@keyframes slideOutUp {\n    0% {\n        -webkit-transform: translateY(0);\n        transform: translateY(0);\n    }\n\n    100% {\n        visibility: hidden;\n        -webkit-transform: translateY(-100%);\n        transform: translateY(-100%);\n    }\n}\n\n.slideOutUp {\n    -webkit-animation-name: slideOutUp;\n    animation-name: slideOutUp;\n}"
  },
  {
    "path": "webservice/lalascan_web/app/static/less/modules/extend.plugins.less",
    "content": "//\r\n// Plugins\r\n//\r\n// Overwrite/Extend styles of various JS plugins\r\n// --------------------------------------------------\r\n\r\n// Draggable Blocks (jQueryUI)\r\n.draggable {\r\n    &-handler {\r\n        cursor: move;\r\n    }\r\n\r\n    &-placeholder {\r\n        background-color: #f1f1f1;\r\n        border: 1px dashed #ccc;\r\n    }\r\n}\r\n\r\n// Highlight.js\r\npre.pre-sh {\r\n    padding: 0;\r\n    margin: 0;\r\n    border: none;\r\n    background-color: transparent;\r\n    border-radius: 0;\r\n}\r\n\r\n// DropzoneJS\r\n.dropzone {\r\n    min-height: 200px;\r\n    background-color: #f9f9f9;\r\n    border: 2px dashed #bbb;\r\n    border-radius: 3px;\r\n\r\n    .dz-message {\r\n        margin: 65px 0;\r\n        font-size: 16px;\r\n        font-style: italic;\r\n        color: #888;\r\n    }\r\n\r\n    &:hover {\r\n        background-color: #fcfcfc;\r\n        border-color: @brand-primary;\r\n\r\n        .dz-message {\r\n            color: @brand-primary;\r\n        }\r\n    }\r\n}\r\n\r\n// Bootstrap Datepicker\r\n.datepicker {\r\n    z-index: 1051 !important;\r\n}\r\n\r\n.input-daterange .input-group-addon {\r\n    min-width: 30px;\r\n    color: @text-color;\r\n    background-color: #f9f9f9;\r\n    border-color: @form-border-color;\r\n}\r\n\r\n.datepicker table tr td.today,\r\n.datepicker table tr td.today:hover,\r\n.datepicker table tr td.today.disabled,\r\n.datepicker table tr td.today.disabled:hover {\r\n    background-color: #faeab9;\r\n    border-color: #faeab9;\r\n}\r\n\r\n.datepicker table tr td.active:hover,\r\n.datepicker table tr td.active:hover:hover,\r\n.datepicker table tr td.active.disabled:hover,\r\n.datepicker table tr td.active.disabled:hover:hover,\r\n.datepicker table tr td.active:focus,\r\n.datepicker table tr td.active:hover:focus,\r\n.datepicker table tr td.active.disabled:focus,\r\n.datepicker table tr td.active.disabled:hover:focus,\r\n.datepicker table tr td.active:active,\r\n.datepicker table tr td.active:hover:active,\r\n.datepicker table tr td.active.disabled:active,\r\n.datepicker table tr td.active.disabled:hover:active,\r\n.datepicker table tr td.active.active,\r\n.datepicker table tr td.active:hover.active,\r\n.datepicker table tr td.active.disabled.active,\r\n.datepicker table tr td.active.disabled:hover.active,\r\n.open .dropdown-toggle.datepicker table tr td.active,\r\n.open .dropdown-toggle.datepicker table tr td.active:hover,\r\n.open .dropdown-toggle.datepicker table tr td.active.disabled,\r\n.open .dropdown-toggle.datepicker table tr td.active.disabled:hover,\r\n.datepicker table tr td span.active:hover,\r\n.datepicker table tr td span.active:hover:hover,\r\n.datepicker table tr td span.active.disabled:hover,\r\n.datepicker table tr td span.active.disabled:hover:hover,\r\n.datepicker table tr td span.active:focus,\r\n.datepicker table tr td span.active:hover:focus,\r\n.datepicker table tr td span.active.disabled:focus,\r\n.datepicker table tr td span.active.disabled:hover:focus,\r\n.datepicker table tr td span.active:active,\r\n.datepicker table tr td span.active:hover:active,\r\n.datepicker table tr td span.active.disabled:active,\r\n.datepicker table tr td span.active.disabled:hover:active,\r\n.datepicker table tr td span.active.active,\r\n.datepicker table tr td span.active:hover.active,\r\n.datepicker table tr td span.active.disabled.active,\r\n.datepicker table tr td span.active.disabled:hover.active,\r\n.open .dropdown-toggle.datepicker table tr td span.active,\r\n.open .dropdown-toggle.datepicker table tr td span.active:hover,\r\n.open .dropdown-toggle.datepicker table tr td span.active.disabled,\r\n.open .dropdown-toggle.datepicker table tr td span.active.disabled:hover {\r\n    background-color: @brand-primary;\r\n    border-color: @brand-primary;\r\n}\r\n\r\n// Bootstrap Colorpicker\r\n.colorpicker.dropdown-menu {\r\n    min-width: 130px;\r\n}\r\n\r\n// jQuery Tags Input\r\ndiv.tagsinput {\r\n    padding: 6px 12px 1px;\r\n    border-color: @form-border-color;\r\n    border-radius: 3px;\r\n\r\n    input {\r\n        padding-top: 0;\r\n        padding-bottom: 0;\r\n        height: 22px;\r\n    }\r\n\r\n    .form-material & {\r\n        padding-right: 0;\r\n        padding-left: 0;\r\n        border: none;\r\n        border-bottom: 1px solid @form-border-color;\r\n    }\r\n\r\n    span.tag {\r\n        padding: 2px 5px;\r\n        height: 22px;\r\n        line-height: 18px;\r\n        color: #fff;\r\n        font-family: @font-family-base;\r\n        font-weight: 600;\r\n        background-color: @brand-primary;\r\n        border: none;\r\n\r\n        a {\r\n            font-size: 13px;\r\n            color: rgba(255,255,255,.5);\r\n\r\n            &:hover {\r\n                color: rgba(255,255,255,.75);\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n// Select2\r\n.select2-container {\r\n    .select2-selection--single {\r\n        height: 34px;\r\n    }\r\n\r\n    .select2-dropdown {\r\n        border-color: @form-border-color;\r\n        .border-bottom-radius(3px);\r\n    }\r\n}\r\n\r\n.select2-container--default {\r\n    .select2-selection--single {\r\n        border-color: @form-border-color;\r\n        border-radius: 3px;\r\n\r\n        .select2-selection__rendered {\r\n            padding-left: 12px;\r\n            line-height: 34px;\r\n\r\n            .form-material & {\r\n                padding-left: 0;\r\n            }\r\n        }\r\n\r\n        .select2-selection__arrow {\r\n            height: 34px;\r\n        }\r\n\r\n        .form-material & {\r\n            border: none;\r\n            border-bottom: 1px solid @form-border-color;\r\n            border-radius: 0;\r\n        }\r\n\r\n        .select2-selection__placeholder {\r\n            color: #aaa;\r\n        }\r\n    }\r\n\r\n    .select2-selection--multiple,\r\n    &.select2-container--focus .select2-selection--multiple {\r\n        border-color: @form-border-color;\r\n        border-radius: 3px;\r\n\r\n        .form-material & {\r\n            border: none;\r\n            border-bottom: 1px solid @form-border-color;\r\n            border-radius: 0;\r\n        }\r\n\r\n        & .select2-selection__rendered {\r\n            padding-right: 12px;\r\n            padding-left: 12px;\r\n\r\n            .form-material & {\r\n                padding-left: 0;\r\n            }\r\n        }\r\n    }\r\n\r\n    .select2-selection--multiple {\r\n        .select2-selection__choice {\r\n            height: 22px;\r\n            line-height: 22px;\r\n            color: #fff;\r\n            font-size: 13px;\r\n            font-weight: 600;\r\n            background-color: @brand-primary;\r\n            border: none;\r\n            border-radius: 3px;\r\n        }\r\n\r\n        .select2-selection__choice__remove {\r\n            margin-right: 5px;\r\n            color: rgba(255,255,255,.5);\r\n\r\n            &:hover {\r\n                color: rgba(255,255,255,.75);\r\n            }\r\n        }\r\n    }\r\n\r\n    .select2-search--dropdown .select2-search__field {\r\n        border-color: @form-border-color;\r\n    }\r\n\r\n    .select2-results__option--highlighted[aria-selected] {\r\n        background-color: @brand-primary;\r\n    }\r\n\r\n    .select2-search--inline .select2-search__field {\r\n        padding-right: 0;\r\n        padding-left: 0;\r\n        font-family: @font-family-base;\r\n        .box-shadow(none);\r\n\r\n        .form-material & {\r\n            padding-left: 0;\r\n        }\r\n    }\r\n}\r\n\r\n.select2-search--dropdown .select2-search__field {\r\n    padding: 6px 12px;\r\n    font-family: @font-family-base;\r\n    border-radius: 3px;\r\n    .box-shadow(none);\r\n}\r\n\r\n// Slick\r\n.slick-slider {\r\n    margin-bottom: 45px;\r\n\r\n    &.slick-padding-dots {\r\n        padding-bottom: 45px;\r\n        margin-bottom: 0;\r\n\r\n        .slick-dots {\r\n            bottom: 0;\r\n        }\r\n    }\r\n\r\n    &.slick-nav-hover {\r\n        .slick-prev,\r\n        .slick-next {\r\n            opacity: 0;\r\n            .transition(opacity .25s ease-out);\r\n        }\r\n\r\n        &:hover {\r\n            .slick-prev,\r\n            .slick-next {\r\n                opacity: .25;\r\n\r\n                &:hover {\r\n                    opacity: .6;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    &.slick-nav-white {\r\n        .slick-prev,\r\n        .slick-next {\r\n            background-color: #fff;\r\n\r\n            &:hover {\r\n                background-color: #fff;\r\n            }\r\n\r\n            &:before {\r\n                color: #000;\r\n            }\r\n        }\r\n    }\r\n\r\n    .slick-dots {\r\n        bottom: -45px;\r\n    }\r\n\r\n    .slick-prev,\r\n    .slick-next {\r\n        margin-top: -15px;\r\n        width: 40px;\r\n        height: 40px;\r\n        text-align: center;\r\n        background-color: #000;\r\n        opacity: .25;\r\n\r\n        &:hover {\r\n            background-color: #000;\r\n            opacity: .6;\r\n        }\r\n\r\n        &:before {\r\n            font-family: 'FontAwesome';\r\n            font-size: 14px;\r\n            line-height: 28px;\r\n        }\r\n    }\r\n\r\n    .slick-prev {\r\n        left: 10px;\r\n\r\n        &:before {\r\n            content: \"\\f060\";\r\n        }\r\n    }\r\n\r\n    .slick-next {\r\n        right: 10px;\r\n\r\n        &:before {\r\n            content: \"\\f061\";\r\n        }\r\n    }\r\n}\r\n\r\n// Summernote\r\n.note-editor {\r\n    border-color: #ddd;\r\n\r\n    .note-toolbar {\r\n        border-bottom-color: #ddd;\r\n    }\r\n\r\n    .note-statusbar .note-resizebar {\r\n        border-top-color: #ddd;\r\n    }\r\n\r\n    .note-toolbar.btn-toolbar {\r\n        margin-left: 0;\r\n    }\r\n}\r\n\r\n// jQuery Sparkline\r\n.jqstooltip {\r\n    -webkit-box-sizing: content-box;\r\n    -moz-box-sizing: content-box;\r\n    box-sizing: content-box;\r\n    border: none !important;\r\n    background-color: rgba(0,0,0,.75) !important;\r\n}\r\n\r\n// Easy Pie Chart\r\n.pie-chart {\r\n    position: relative;\r\n    display: inline-block;\r\n\r\n    > span {\r\n        .vertical-align();\r\n        margin-top: -2px;\r\n        right: 0;\r\n        left: 0;\r\n        text-align: center;\r\n    }\r\n}\r\n\r\n// Flot Charts\r\n.flot-tooltip {\r\n    position: absolute;\r\n    display: none;\r\n    color: #fff;\r\n    background: rgba(0,0,0,.75);\r\n    padding: 4px 8px;\r\n}\r\n\r\n.flot-pie-label {\r\n    font-size: 13px;\r\n    text-align: center;\r\n    padding: 4px 8px;\r\n    color: #fff;\r\n}\r\n\r\n.legend > table td {\r\n    padding: 3px 4px;\r\n    font-size: 14px;\r\n}\r\n\r\n// FullCalendar\r\n.fc-event {\r\n    padding-left: 3px;\r\n    padding-right: 3px;\r\n    font-size: 12px;\r\n    font-weight: 600;\r\n    line-height: 1.4;\r\n    color: rgba(0,0,0,.75);\r\n    border: 1px solid #b5d0eb;\r\n    background-color: #b5d0eb;\r\n    border-radius: 0;\r\n\r\n    &:hover {\r\n        color: rgba(0,0,0,.75);\r\n    }\r\n}\r\n\r\n.fc button {\r\n    height: 34px;\r\n    line-height: 34px;\r\n    font-weight: 600;\r\n}\r\n\r\n.fc-state-default.fc-corner-left {\r\n    border-top-left-radius: 2px;\r\n    border-bottom-left-radius: 2px;\r\n}\r\n\r\n.fc-state-default.fc-corner-right {\r\n    border-top-right-radius: 2px;\r\n    border-bottom-right-radius: 2px;\r\n}\r\n\r\n.fc-state-default {\r\n    color: @gray-darker;\r\n    background-color: @gray-light;\r\n    background-image: none;\r\n    border: 1px solid #e6e6e6;\r\n    text-shadow: none;\r\n    box-shadow: none;\r\n}\r\n\r\n.fc-state-hover,\r\n.fc-state-down,\r\n.fc-state-active,\r\n.fc-state-disabled {\r\n    color: @gray-darker;\r\n    background-color: darken(@gray-light, 8%);\r\n    border-color: darken(#e6e6e6, 12%);\r\n}\r\n\r\n.fc-state-hover {\r\n    color: #393939;\r\n    .transition(all .15s ease-out);\r\n}\r\n\r\n.fc-state-down,\r\n.fc-state-active {\r\n    background-color: darken(@gray-light, 18%);\r\n    border-color: darken(#e6e6e6, 22%);;\r\n    box-shadow: none;\r\n}\r\n\r\n.fc-state-disabled {\r\n    opacity: .35;\r\n}\r\n\r\n.fc-toolbar {\r\n    margin-bottom: 29px;\r\n\r\n    h2 {\r\n        font-weight: 400;\r\n    }\r\n}\r\n\r\n.fc thead th.fc-widget-header {\r\n    padding-top: 6px;\r\n    padding-bottom: 6px;\r\n    font-size: 16px;\r\n    font-weight: 600;\r\n    text-transform: uppercase;\r\n    background-color: #f9f9f9;\r\n}\r\n\r\n.fc-unthemed th,\r\n.fc-unthemed td,\r\n.fc-unthemed hr,\r\n.fc-unthemed thead,\r\n.fc-unthemed tbody,\r\n.fc-unthemed .fc-row,\r\n.fc-unthemed .fc-popover {\r\n    border-color: #eee;\r\n}\r\n\r\n// HTML5 Placeholder\r\n.placeholder {\r\n    color: #aaa;\r\n}"
  },
  {
    "path": "webservice/lalascan_web/app/static/less/modules/icons.fontawesome.less",
    "content": "//\n// Font Awesome 4.3.0\n// --------------------------------------------------\n\n/* FONT PATH\n * -------------------------- */\n@font-face {\n    font-family: 'FontAwesome';\n    src: url('../fonts/fontawesome-webfont.eot?v=4.3.0');\n    src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg');\n    font-weight: normal;\n    font-style: normal;\n}\n.fa {\n    display: inline-block;\n    font: normal normal normal 14px/1 FontAwesome;\n    font-size: inherit;\n    text-rendering: auto;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n    transform: translate(0, 0);\n}\n/* makes the font 33% larger relative to the icon container */\n.fa-lg {\n    font-size: 1.33333333em;\n    line-height: 0.75em;\n    vertical-align: -15%;\n}\n.fa-2x {\n    font-size: 2em;\n}\n.fa-3x {\n    font-size: 3em;\n}\n.fa-4x {\n    font-size: 4em;\n}\n.fa-5x {\n    font-size: 5em;\n}\n.fa-fw {\n    width: 1.28571429em;\n    text-align: center;\n}\n.fa-ul {\n    padding-left: 0;\n    margin-left: 2.14285714em;\n    list-style-type: none;\n}\n.fa-ul > li {\n    position: relative;\n}\n.fa-li {\n    position: absolute;\n    left: -2.14285714em;\n    width: 2.14285714em;\n    top: 0.14285714em;\n    text-align: center;\n}\n.fa-li.fa-lg {\n    left: -1.85714286em;\n}\n.fa-border {\n    padding: .2em .25em .15em;\n    border: solid 0.08em #eeeeee;\n    border-radius: .1em;\n}\n.pull-right {\n    float: right;\n}\n.pull-left {\n    float: left;\n}\n.fa.pull-left {\n    margin-right: .3em;\n}\n.fa.pull-right {\n    margin-left: .3em;\n}\n.fa-spin {\n    -webkit-animation: fa-spin 2s infinite linear;\n    animation: fa-spin 2s infinite linear;\n}\n.fa-pulse {\n    -webkit-animation: fa-spin 1s infinite steps(8);\n    animation: fa-spin 1s infinite steps(8);\n}\n@-webkit-keyframes fa-spin {\n    0% {\n        -webkit-transform: rotate(0deg);\n        transform: rotate(0deg);\n    }\n    100% {\n        -webkit-transform: rotate(359deg);\n        transform: rotate(359deg);\n    }\n}\n@keyframes fa-spin {\n    0% {\n        -webkit-transform: rotate(0deg);\n        transform: rotate(0deg);\n    }\n    100% {\n        -webkit-transform: rotate(359deg);\n        transform: rotate(359deg);\n    }\n}\n.fa-rotate-90 {\n    filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);\n    -webkit-transform: rotate(90deg);\n    -ms-transform: rotate(90deg);\n    transform: rotate(90deg);\n}\n.fa-rotate-180 {\n    filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);\n    -webkit-transform: rotate(180deg);\n    -ms-transform: rotate(180deg);\n    transform: rotate(180deg);\n}\n.fa-rotate-270 {\n    filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);\n    -webkit-transform: rotate(270deg);\n    -ms-transform: rotate(270deg);\n    transform: rotate(270deg);\n}\n.fa-flip-horizontal {\n    filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);\n    -webkit-transform: scale(-1, 1);\n    -ms-transform: scale(-1, 1);\n    transform: scale(-1, 1);\n}\n.fa-flip-vertical {\n    filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n    -webkit-transform: scale(1, -1);\n    -ms-transform: scale(1, -1);\n    transform: scale(1, -1);\n}\n:root .fa-rotate-90,\n:root .fa-rotate-180,\n:root .fa-rotate-270,\n:root .fa-flip-horizontal,\n:root .fa-flip-vertical {\n    filter: none;\n}\n.fa-stack {\n    position: relative;\n    display: inline-block;\n    width: 2em;\n    height: 2em;\n    line-height: 2em;\n    vertical-align: middle;\n}\n.fa-stack-1x,\n.fa-stack-2x {\n    position: absolute;\n    left: 0;\n    width: 100%;\n    text-align: center;\n}\n.fa-stack-1x {\n    line-height: inherit;\n}\n.fa-stack-2x {\n    font-size: 2em;\n}\n.fa-inverse {\n    color: #ffffff;\n}\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n   readers do not read off random characters that represent icons */\n.fa-glass:before {\n    content: \"\\f000\";\n}\n.fa-music:before {\n    content: \"\\f001\";\n}\n.fa-search:before {\n    content: \"\\f002\";\n}\n.fa-envelope-o:before {\n    content: \"\\f003\";\n}\n.fa-heart:before {\n    content: \"\\f004\";\n}\n.fa-star:before {\n    content: \"\\f005\";\n}\n.fa-star-o:before {\n    content: \"\\f006\";\n}\n.fa-user:before {\n    content: \"\\f007\";\n}\n.fa-film:before {\n    content: \"\\f008\";\n}\n.fa-th-large:before {\n    content: \"\\f009\";\n}\n.fa-th:before {\n    content: \"\\f00a\";\n}\n.fa-th-list:before {\n    content: \"\\f00b\";\n}\n.fa-check:before {\n    content: \"\\f00c\";\n}\n.fa-remove:before,\n.fa-close:before,\n.fa-times:before {\n    content: \"\\f00d\";\n}\n.fa-search-plus:before {\n    content: \"\\f00e\";\n}\n.fa-search-minus:before {\n    content: \"\\f010\";\n}\n.fa-power-off:before {\n    content: \"\\f011\";\n}\n.fa-signal:before {\n    content: \"\\f012\";\n}\n.fa-gear:before,\n.fa-cog:before {\n    content: \"\\f013\";\n}\n.fa-trash-o:before {\n    content: \"\\f014\";\n}\n.fa-home:before {\n    content: \"\\f015\";\n}\n.fa-file-o:before {\n    content: \"\\f016\";\n}\n.fa-clock-o:before {\n    content: \"\\f017\";\n}\n.fa-road:before {\n    content: \"\\f018\";\n}\n.fa-download:before {\n    content: \"\\f019\";\n}\n.fa-arrow-circle-o-down:before {\n    content: \"\\f01a\";\n}\n.fa-arrow-circle-o-up:before {\n    content: \"\\f01b\";\n}\n.fa-inbox:before {\n    content: \"\\f01c\";\n}\n.fa-play-circle-o:before {\n    content: \"\\f01d\";\n}\n.fa-rotate-right:before,\n.fa-repeat:before {\n    content: \"\\f01e\";\n}\n.fa-refresh:before {\n    content: \"\\f021\";\n}\n.fa-list-alt:before {\n    content: \"\\f022\";\n}\n.fa-lock:before {\n    content: \"\\f023\";\n}\n.fa-flag:before {\n    content: \"\\f024\";\n}\n.fa-headphones:before {\n    content: \"\\f025\";\n}\n.fa-volume-off:before {\n    content: \"\\f026\";\n}\n.fa-volume-down:before {\n    content: \"\\f027\";\n}\n.fa-volume-up:before {\n    content: \"\\f028\";\n}\n.fa-qrcode:before {\n    content: \"\\f029\";\n}\n.fa-barcode:before {\n    content: \"\\f02a\";\n}\n.fa-tag:before {\n    content: \"\\f02b\";\n}\n.fa-tags:before {\n    content: \"\\f02c\";\n}\n.fa-book:before {\n    content: \"\\f02d\";\n}\n.fa-bookmark:before {\n    content: \"\\f02e\";\n}\n.fa-print:before {\n    content: \"\\f02f\";\n}\n.fa-camera:before {\n    content: \"\\f030\";\n}\n.fa-font:before {\n    content: \"\\f031\";\n}\n.fa-bold:before {\n    content: \"\\f032\";\n}\n.fa-italic:before {\n    content: \"\\f033\";\n}\n.fa-text-height:before {\n    content: \"\\f034\";\n}\n.fa-text-width:before {\n    content: \"\\f035\";\n}\n.fa-align-left:before {\n    content: \"\\f036\";\n}\n.fa-align-center:before {\n    content: \"\\f037\";\n}\n.fa-align-right:before {\n    content: \"\\f038\";\n}\n.fa-align-justify:before {\n    content: \"\\f039\";\n}\n.fa-list:before {\n    content: \"\\f03a\";\n}\n.fa-dedent:before,\n.fa-outdent:before {\n    content: \"\\f03b\";\n}\n.fa-indent:before {\n    content: \"\\f03c\";\n}\n.fa-video-camera:before {\n    content: \"\\f03d\";\n}\n.fa-photo:before,\n.fa-image:before,\n.fa-picture-o:before {\n    content: \"\\f03e\";\n}\n.fa-pencil:before {\n    content: \"\\f040\";\n}\n.fa-map-marker:before {\n    content: \"\\f041\";\n}\n.fa-adjust:before {\n    content: \"\\f042\";\n}\n.fa-tint:before {\n    content: \"\\f043\";\n}\n.fa-edit:before,\n.fa-pencil-square-o:before {\n    content: \"\\f044\";\n}\n.fa-share-square-o:before {\n    content: \"\\f045\";\n}\n.fa-check-square-o:before {\n    content: \"\\f046\";\n}\n.fa-arrows:before {\n    content: \"\\f047\";\n}\n.fa-step-backward:before {\n    content: \"\\f048\";\n}\n.fa-fast-backward:before {\n    content: \"\\f049\";\n}\n.fa-backward:before {\n    content: \"\\f04a\";\n}\n.fa-play:before {\n    content: \"\\f04b\";\n}\n.fa-pause:before {\n    content: \"\\f04c\";\n}\n.fa-stop:before {\n    content: \"\\f04d\";\n}\n.fa-forward:before {\n    content: \"\\f04e\";\n}\n.fa-fast-forward:before {\n    content: \"\\f050\";\n}\n.fa-step-forward:before {\n    content: \"\\f051\";\n}\n.fa-eject:before {\n    content: \"\\f052\";\n}\n.fa-chevron-left:before {\n    content: \"\\f053\";\n}\n.fa-chevron-right:before {\n    content: \"\\f054\";\n}\n.fa-plus-circle:before {\n    content: \"\\f055\";\n}\n.fa-minus-circle:before {\n    content: \"\\f056\";\n}\n.fa-times-circle:before {\n    content: \"\\f057\";\n}\n.fa-check-circle:before {\n    content: \"\\f058\";\n}\n.fa-question-circle:before {\n    content: \"\\f059\";\n}\n.fa-info-circle:before {\n    content: \"\\f05a\";\n}\n.fa-crosshairs:before {\n    content: \"\\f05b\";\n}\n.fa-times-circle-o:before {\n    content: \"\\f05c\";\n}\n.fa-check-circle-o:before {\n    content: \"\\f05d\";\n}\n.fa-ban:before {\n    content: \"\\f05e\";\n}\n.fa-arrow-left:before {\n    content: \"\\f060\";\n}\n.fa-arrow-right:before {\n    content: \"\\f061\";\n}\n.fa-arrow-up:before {\n    content: \"\\f062\";\n}\n.fa-arrow-down:before {\n    content: \"\\f063\";\n}\n.fa-mail-forward:before,\n.fa-share:before {\n    content: \"\\f064\";\n}\n.fa-expand:before {\n    content: \"\\f065\";\n}\n.fa-compress:before {\n    content: \"\\f066\";\n}\n.fa-plus:before {\n    content: \"\\f067\";\n}\n.fa-minus:before {\n    content: \"\\f068\";\n}\n.fa-asterisk:before {\n    content: \"\\f069\";\n}\n.fa-exclamation-circle:before {\n    content: \"\\f06a\";\n}\n.fa-gift:before {\n    content: \"\\f06b\";\n}\n.fa-leaf:before {\n    content: \"\\f06c\";\n}\n.fa-fire:before {\n    content: \"\\f06d\";\n}\n.fa-eye:before {\n    content: \"\\f06e\";\n}\n.fa-eye-slash:before {\n    content: \"\\f070\";\n}\n.fa-warning:before,\n.fa-exclamation-triangle:before {\n    content: \"\\f071\";\n}\n.fa-plane:before {\n    content: \"\\f072\";\n}\n.fa-calendar:before {\n    content: \"\\f073\";\n}\n.fa-random:before {\n    content: \"\\f074\";\n}\n.fa-comment:before {\n    content: \"\\f075\";\n}\n.fa-magnet:before {\n    content: \"\\f076\";\n}\n.fa-chevron-up:before {\n    content: \"\\f077\";\n}\n.fa-chevron-down:before {\n    content: \"\\f078\";\n}\n.fa-retweet:before {\n    content: \"\\f079\";\n}\n.fa-shopping-cart:before {\n    content: \"\\f07a\";\n}\n.fa-folder:before {\n    content: \"\\f07b\";\n}\n.fa-folder-open:before {\n    content: \"\\f07c\";\n}\n.fa-arrows-v:before {\n    content: \"\\f07d\";\n}\n.fa-arrows-h:before {\n    content: \"\\f07e\";\n}\n.fa-bar-chart-o:before,\n.fa-bar-chart:before {\n    content: \"\\f080\";\n}\n.fa-twitter-square:before {\n    content: \"\\f081\";\n}\n.fa-facebook-square:before {\n    content: \"\\f082\";\n}\n.fa-camera-retro:before {\n    content: \"\\f083\";\n}\n.fa-key:before {\n    content: \"\\f084\";\n}\n.fa-gears:before,\n.fa-cogs:before {\n    content: \"\\f085\";\n}\n.fa-comments:before {\n    content: \"\\f086\";\n}\n.fa-thumbs-o-up:before {\n    content: \"\\f087\";\n}\n.fa-thumbs-o-down:before {\n    content: \"\\f088\";\n}\n.fa-star-half:before {\n    content: \"\\f089\";\n}\n.fa-heart-o:before {\n    content: \"\\f08a\";\n}\n.fa-sign-out:before {\n    content: \"\\f08b\";\n}\n.fa-linkedin-square:before {\n    content: \"\\f08c\";\n}\n.fa-thumb-tack:before {\n    content: \"\\f08d\";\n}\n.fa-external-link:before {\n    content: \"\\f08e\";\n}\n.fa-sign-in:before {\n    content: \"\\f090\";\n}\n.fa-trophy:before {\n    content: \"\\f091\";\n}\n.fa-github-square:before {\n    content: \"\\f092\";\n}\n.fa-upload:before {\n    content: \"\\f093\";\n}\n.fa-lemon-o:before {\n    content: \"\\f094\";\n}\n.fa-phone:before {\n    content: \"\\f095\";\n}\n.fa-square-o:before {\n    content: \"\\f096\";\n}\n.fa-bookmark-o:before {\n    content: \"\\f097\";\n}\n.fa-phone-square:before {\n    content: \"\\f098\";\n}\n.fa-twitter:before {\n    content: \"\\f099\";\n}\n.fa-facebook-f:before,\n.fa-facebook:before {\n    content: \"\\f09a\";\n}\n.fa-github:before {\n    content: \"\\f09b\";\n}\n.fa-unlock:before {\n    content: \"\\f09c\";\n}\n.fa-credit-card:before {\n    content: \"\\f09d\";\n}\n.fa-rss:before {\n    content: \"\\f09e\";\n}\n.fa-hdd-o:before {\n    content: \"\\f0a0\";\n}\n.fa-bullhorn:before {\n    content: \"\\f0a1\";\n}\n.fa-bell:before {\n    content: \"\\f0f3\";\n}\n.fa-certificate:before {\n    content: \"\\f0a3\";\n}\n.fa-hand-o-right:before {\n    content: \"\\f0a4\";\n}\n.fa-hand-o-left:before {\n    content: \"\\f0a5\";\n}\n.fa-hand-o-up:before {\n    content: \"\\f0a6\";\n}\n.fa-hand-o-down:before {\n    content: \"\\f0a7\";\n}\n.fa-arrow-circle-left:before {\n    content: \"\\f0a8\";\n}\n.fa-arrow-circle-right:before {\n    content: \"\\f0a9\";\n}\n.fa-arrow-circle-up:before {\n    content: \"\\f0aa\";\n}\n.fa-arrow-circle-down:before {\n    content: \"\\f0ab\";\n}\n.fa-globe:before {\n    content: \"\\f0ac\";\n}\n.fa-wrench:before {\n    content: \"\\f0ad\";\n}\n.fa-tasks:before {\n    content: \"\\f0ae\";\n}\n.fa-filter:before {\n    content: \"\\f0b0\";\n}\n.fa-briefcase:before {\n    content: \"\\f0b1\";\n}\n.fa-arrows-alt:before {\n    content: \"\\f0b2\";\n}\n.fa-group:before,\n.fa-users:before {\n    content: \"\\f0c0\";\n}\n.fa-chain:before,\n.fa-link:before {\n    content: \"\\f0c1\";\n}\n.fa-cloud:before {\n    content: \"\\f0c2\";\n}\n.fa-flask:before {\n    content: \"\\f0c3\";\n}\n.fa-cut:before,\n.fa-scissors:before {\n    content: \"\\f0c4\";\n}\n.fa-copy:before,\n.fa-files-o:before {\n    content: \"\\f0c5\";\n}\n.fa-paperclip:before {\n    content: \"\\f0c6\";\n}\n.fa-save:before,\n.fa-floppy-o:before {\n    content: \"\\f0c7\";\n}\n.fa-square:before {\n    content: \"\\f0c8\";\n}\n.fa-navicon:before,\n.fa-reorder:before,\n.fa-bars:before {\n    content: \"\\f0c9\";\n}\n.fa-list-ul:before {\n    content: \"\\f0ca\";\n}\n.fa-list-ol:before {\n    content: \"\\f0cb\";\n}\n.fa-strikethrough:before {\n    content: \"\\f0cc\";\n}\n.fa-underline:before {\n    content: \"\\f0cd\";\n}\n.fa-table:before {\n    content: \"\\f0ce\";\n}\n.fa-magic:before {\n    content: \"\\f0d0\";\n}\n.fa-truck:before {\n    content: \"\\f0d1\";\n}\n.fa-pinterest:before {\n    content: \"\\f0d2\";\n}\n.fa-pinterest-square:before {\n    content: \"\\f0d3\";\n}\n.fa-google-plus-square:before {\n    content: \"\\f0d4\";\n}\n.fa-google-plus:before {\n    content: \"\\f0d5\";\n}\n.fa-money:before {\n    content: \"\\f0d6\";\n}\n.fa-caret-down:before {\n    content: \"\\f0d7\";\n}\n.fa-caret-up:before {\n    content: \"\\f0d8\";\n}\n.fa-caret-left:before {\n    content: \"\\f0d9\";\n}\n.fa-caret-right:before {\n    content: \"\\f0da\";\n}\n.fa-columns:before {\n    content: \"\\f0db\";\n}\n.fa-unsorted:before,\n.fa-sort:before {\n    content: \"\\f0dc\";\n}\n.fa-sort-down:before,\n.fa-sort-desc:before {\n    content: \"\\f0dd\";\n}\n.fa-sort-up:before,\n.fa-sort-asc:before {\n    content: \"\\f0de\";\n}\n.fa-envelope:before {\n    content: \"\\f0e0\";\n}\n.fa-linkedin:before {\n    content: \"\\f0e1\";\n}\n.fa-rotate-left:before,\n.fa-undo:before {\n    content: \"\\f0e2\";\n}\n.fa-legal:before,\n.fa-gavel:before {\n    content: \"\\f0e3\";\n}\n.fa-dashboard:before,\n.fa-tachometer:before {\n    content: \"\\f0e4\";\n}\n.fa-comment-o:before {\n    content: \"\\f0e5\";\n}\n.fa-comments-o:before {\n    content: \"\\f0e6\";\n}\n.fa-flash:before,\n.fa-bolt:before {\n    content: \"\\f0e7\";\n}\n.fa-sitemap:before {\n    content: \"\\f0e8\";\n}\n.fa-umbrella:before {\n    content: \"\\f0e9\";\n}\n.fa-paste:before,\n.fa-clipboard:before {\n    content: \"\\f0ea\";\n}\n.fa-lightbulb-o:before {\n    content: \"\\f0eb\";\n}\n.fa-exchange:before {\n    content: \"\\f0ec\";\n}\n.fa-cloud-download:before {\n    content: \"\\f0ed\";\n}\n.fa-cloud-upload:before {\n    content: \"\\f0ee\";\n}\n.fa-user-md:before {\n    content: \"\\f0f0\";\n}\n.fa-stethoscope:before {\n    content: \"\\f0f1\";\n}\n.fa-suitcase:before {\n    content: \"\\f0f2\";\n}\n.fa-bell-o:before {\n    content: \"\\f0a2\";\n}\n.fa-coffee:before {\n    content: \"\\f0f4\";\n}\n.fa-cutlery:before {\n    content: \"\\f0f5\";\n}\n.fa-file-text-o:before {\n    content: \"\\f0f6\";\n}\n.fa-building-o:before {\n    content: \"\\f0f7\";\n}\n.fa-hospital-o:before {\n    content: \"\\f0f8\";\n}\n.fa-ambulance:before {\n    content: \"\\f0f9\";\n}\n.fa-medkit:before {\n    content: \"\\f0fa\";\n}\n.fa-fighter-jet:before {\n    content: \"\\f0fb\";\n}\n.fa-beer:before {\n    content: \"\\f0fc\";\n}\n.fa-h-square:before {\n    content: \"\\f0fd\";\n}\n.fa-plus-square:before {\n    content: \"\\f0fe\";\n}\n.fa-angle-double-left:before {\n    content: \"\\f100\";\n}\n.fa-angle-double-right:before {\n    content: \"\\f101\";\n}\n.fa-angle-double-up:before {\n    content: \"\\f102\";\n}\n.fa-angle-double-down:before {\n    content: \"\\f103\";\n}\n.fa-angle-left:before {\n    content: \"\\f104\";\n}\n.fa-angle-right:before {\n    content: \"\\f105\";\n}\n.fa-angle-up:before {\n    content: \"\\f106\";\n}\n.fa-angle-down:before {\n    content: \"\\f107\";\n}\n.fa-desktop:before {\n    content: \"\\f108\";\n}\n.fa-laptop:before {\n    content: \"\\f109\";\n}\n.fa-tablet:before {\n    content: \"\\f10a\";\n}\n.fa-mobile-phone:before,\n.fa-mobile:before {\n    content: \"\\f10b\";\n}\n.fa-circle-o:before {\n    content: \"\\f10c\";\n}\n.fa-quote-left:before {\n    content: \"\\f10d\";\n}\n.fa-quote-right:before {\n    content: \"\\f10e\";\n}\n.fa-spinner:before {\n    content: \"\\f110\";\n}\n.fa-circle:before {\n    content: \"\\f111\";\n}\n.fa-mail-reply:before,\n.fa-reply:before {\n    content: \"\\f112\";\n}\n.fa-github-alt:before {\n    content: \"\\f113\";\n}\n.fa-folder-o:before {\n    content: \"\\f114\";\n}\n.fa-folder-open-o:before {\n    content: \"\\f115\";\n}\n.fa-smile-o:before {\n    content: \"\\f118\";\n}\n.fa-frown-o:before {\n    content: \"\\f119\";\n}\n.fa-meh-o:before {\n    content: \"\\f11a\";\n}\n.fa-gamepad:before {\n    content: \"\\f11b\";\n}\n.fa-keyboard-o:before {\n    content: \"\\f11c\";\n}\n.fa-flag-o:before {\n    content: \"\\f11d\";\n}\n.fa-flag-checkered:before {\n    content: \"\\f11e\";\n}\n.fa-terminal:before {\n    content: \"\\f120\";\n}\n.fa-code:before {\n    content: \"\\f121\";\n}\n.fa-mail-reply-all:before,\n.fa-reply-all:before {\n    content: \"\\f122\";\n}\n.fa-star-half-empty:before,\n.fa-star-half-full:before,\n.fa-star-half-o:before {\n    content: \"\\f123\";\n}\n.fa-location-arrow:before {\n    content: \"\\f124\";\n}\n.fa-crop:before {\n    content: \"\\f125\";\n}\n.fa-code-fork:before {\n    content: \"\\f126\";\n}\n.fa-unlink:before,\n.fa-chain-broken:before {\n    content: \"\\f127\";\n}\n.fa-question:before {\n    content: \"\\f128\";\n}\n.fa-info:before {\n    content: \"\\f129\";\n}\n.fa-exclamation:before {\n    content: \"\\f12a\";\n}\n.fa-superscript:before {\n    content: \"\\f12b\";\n}\n.fa-subscript:before {\n    content: \"\\f12c\";\n}\n.fa-eraser:before {\n    content: \"\\f12d\";\n}\n.fa-puzzle-piece:before {\n    content: \"\\f12e\";\n}\n.fa-microphone:before {\n    content: \"\\f130\";\n}\n.fa-microphone-slash:before {\n    content: \"\\f131\";\n}\n.fa-shield:before {\n    content: \"\\f132\";\n}\n.fa-calendar-o:before {\n    content: \"\\f133\";\n}\n.fa-fire-extinguisher:before {\n    content: \"\\f134\";\n}\n.fa-rocket:before {\n    content: \"\\f135\";\n}\n.fa-maxcdn:before {\n    content: \"\\f136\";\n}\n.fa-chevron-circle-left:before {\n    content: \"\\f137\";\n}\n.fa-chevron-circle-right:before {\n    content: \"\\f138\";\n}\n.fa-chevron-circle-up:before {\n    content: \"\\f139\";\n}\n.fa-chevron-circle-down:before {\n    content: \"\\f13a\";\n}\n.fa-html5:before {\n    content: \"\\f13b\";\n}\n.fa-css3:before {\n    content: \"\\f13c\";\n}\n.fa-anchor:before {\n    content: \"\\f13d\";\n}\n.fa-unlock-alt:before {\n    content: \"\\f13e\";\n}\n.fa-bullseye:before {\n    content: \"\\f140\";\n}\n.fa-ellipsis-h:before {\n    content: \"\\f141\";\n}\n.fa-ellipsis-v:before {\n    content: \"\\f142\";\n}\n.fa-rss-square:before {\n    content: \"\\f143\";\n}\n.fa-play-circle:before {\n    content: \"\\f144\";\n}\n.fa-ticket:before {\n    content: \"\\f145\";\n}\n.fa-minus-square:before {\n    content: \"\\f146\";\n}\n.fa-minus-square-o:before {\n    content: \"\\f147\";\n}\n.fa-level-up:before {\n    content: \"\\f148\";\n}\n.fa-level-down:before {\n    content: \"\\f149\";\n}\n.fa-check-square:before {\n    content: \"\\f14a\";\n}\n.fa-pencil-square:before {\n    content: \"\\f14b\";\n}\n.fa-external-link-square:before {\n    content: \"\\f14c\";\n}\n.fa-share-square:before {\n    content: \"\\f14d\";\n}\n.fa-compass:before {\n    content: \"\\f14e\";\n}\n.fa-toggle-down:before,\n.fa-caret-square-o-down:before {\n    content: \"\\f150\";\n}\n.fa-toggle-up:before,\n.fa-caret-square-o-up:before {\n    content: \"\\f151\";\n}\n.fa-toggle-right:before,\n.fa-caret-square-o-right:before {\n    content: \"\\f152\";\n}\n.fa-euro:before,\n.fa-eur:before {\n    content: \"\\f153\";\n}\n.fa-gbp:before {\n    content: \"\\f154\";\n}\n.fa-dollar:before,\n.fa-usd:before {\n    content: \"\\f155\";\n}\n.fa-rupee:before,\n.fa-inr:before {\n    content: \"\\f156\";\n}\n.fa-cny:before,\n.fa-rmb:before,\n.fa-yen:before,\n.fa-jpy:before {\n    content: \"\\f157\";\n}\n.fa-ruble:before,\n.fa-rouble:before,\n.fa-rub:before {\n    content: \"\\f158\";\n}\n.fa-won:before,\n.fa-krw:before {\n    content: \"\\f159\";\n}\n.fa-bitcoin:before,\n.fa-btc:before {\n    content: \"\\f15a\";\n}\n.fa-file:before {\n    content: \"\\f15b\";\n}\n.fa-file-text:before {\n    content: \"\\f15c\";\n}\n.fa-sort-alpha-asc:before {\n    content: \"\\f15d\";\n}\n.fa-sort-alpha-desc:before {\n    content: \"\\f15e\";\n}\n.fa-sort-amount-asc:before {\n    content: \"\\f160\";\n}\n.fa-sort-amount-desc:before {\n    content: \"\\f161\";\n}\n.fa-sort-numeric-asc:before {\n    content: \"\\f162\";\n}\n.fa-sort-numeric-desc:before {\n    content: \"\\f163\";\n}\n.fa-thumbs-up:before {\n    content: \"\\f164\";\n}\n.fa-thumbs-down:before {\n    content: \"\\f165\";\n}\n.fa-youtube-square:before {\n    content: \"\\f166\";\n}\n.fa-youtube:before {\n    content: \"\\f167\";\n}\n.fa-xing:before {\n    content: \"\\f168\";\n}\n.fa-xing-square:before {\n    content: \"\\f169\";\n}\n.fa-youtube-play:before {\n    content: \"\\f16a\";\n}\n.fa-dropbox:before {\n    content: \"\\f16b\";\n}\n.fa-stack-overflow:before {\n    content: \"\\f16c\";\n}\n.fa-instagram:before {\n    content: \"\\f16d\";\n}\n.fa-flickr:before {\n    content: \"\\f16e\";\n}\n.fa-adn:before {\n    content: \"\\f170\";\n}\n.fa-bitbucket:before {\n    content: \"\\f171\";\n}\n.fa-bitbucket-square:before {\n    content: \"\\f172\";\n}\n.fa-tumblr:before {\n    content: \"\\f173\";\n}\n.fa-tumblr-square:before {\n    content: \"\\f174\";\n}\n.fa-long-arrow-down:before {\n    content: \"\\f175\";\n}\n.fa-long-arrow-up:before {\n    content: \"\\f176\";\n}\n.fa-long-arrow-left:before {\n    content: \"\\f177\";\n}\n.fa-long-arrow-right:before {\n    content: \"\\f178\";\n}\n.fa-apple:before {\n    content: \"\\f179\";\n}\n.fa-windows:before {\n    content: \"\\f17a\";\n}\n.fa-android:before {\n    content: \"\\f17b\";\n}\n.fa-linux:before {\n    content: \"\\f17c\";\n}\n.fa-dribbble:before {\n    content: \"\\f17d\";\n}\n.fa-skype:before {\n    content: \"\\f17e\";\n}\n.fa-foursquare:before {\n    content: \"\\f180\";\n}\n.fa-trello:before {\n    content: \"\\f181\";\n}\n.fa-female:before {\n    content: \"\\f182\";\n}\n.fa-male:before {\n    content: \"\\f183\";\n}\n.fa-gittip:before,\n.fa-gratipay:before {\n    content: \"\\f184\";\n}\n.fa-sun-o:before {\n    content: \"\\f185\";\n}\n.fa-moon-o:before {\n    content: \"\\f186\";\n}\n.fa-archive:before {\n    content: \"\\f187\";\n}\n.fa-bug:before {\n    content: \"\\f188\";\n}\n.fa-vk:before {\n    content: \"\\f189\";\n}\n.fa-weibo:before {\n    content: \"\\f18a\";\n}\n.fa-renren:before {\n    content: \"\\f18b\";\n}\n.fa-pagelines:before {\n    content: \"\\f18c\";\n}\n.fa-stack-exchange:before {\n    content: \"\\f18d\";\n}\n.fa-arrow-circle-o-right:before {\n    content: \"\\f18e\";\n}\n.fa-arrow-circle-o-left:before {\n    content: \"\\f190\";\n}\n.fa-toggle-left:before,\n.fa-caret-square-o-left:before {\n    content: \"\\f191\";\n}\n.fa-dot-circle-o:before {\n    content: \"\\f192\";\n}\n.fa-wheelchair:before {\n    content: \"\\f193\";\n}\n.fa-vimeo-square:before {\n    content: \"\\f194\";\n}\n.fa-turkish-lira:before,\n.fa-try:before {\n    content: \"\\f195\";\n}\n.fa-plus-square-o:before {\n    content: \"\\f196\";\n}\n.fa-space-shuttle:before {\n    content: \"\\f197\";\n}\n.fa-slack:before {\n    content: \"\\f198\";\n}\n.fa-envelope-square:before {\n    content: \"\\f199\";\n}\n.fa-wordpress:before {\n    content: \"\\f19a\";\n}\n.fa-openid:before {\n    content: \"\\f19b\";\n}\n.fa-institution:before,\n.fa-bank:before,\n.fa-university:before {\n    content: \"\\f19c\";\n}\n.fa-mortar-board:before,\n.fa-graduation-cap:before {\n    content: \"\\f19d\";\n}\n.fa-yahoo:before {\n    content: \"\\f19e\";\n}\n.fa-google:before {\n    content: \"\\f1a0\";\n}\n.fa-reddit:before {\n    content: \"\\f1a1\";\n}\n.fa-reddit-square:before {\n    content: \"\\f1a2\";\n}\n.fa-stumbleupon-circle:before {\n    content: \"\\f1a3\";\n}\n.fa-stumbleupon:before {\n    content: \"\\f1a4\";\n}\n.fa-delicious:before {\n    content: \"\\f1a5\";\n}\n.fa-digg:before {\n    content: \"\\f1a6\";\n}\n.fa-pied-piper:before {\n    content: \"\\f1a7\";\n}\n.fa-pied-piper-alt:before {\n    content: \"\\f1a8\";\n}\n.fa-drupal:before {\n    content: \"\\f1a9\";\n}\n.fa-joomla:before {\n    content: \"\\f1aa\";\n}\n.fa-language:before {\n    content: \"\\f1ab\";\n}\n.fa-fax:before {\n    content: \"\\f1ac\";\n}\n.fa-building:before {\n    content: \"\\f1ad\";\n}\n.fa-child:before {\n    content: \"\\f1ae\";\n}\n.fa-paw:before {\n    content: \"\\f1b0\";\n}\n.fa-spoon:before {\n    content: \"\\f1b1\";\n}\n.fa-cube:before {\n    content: \"\\f1b2\";\n}\n.fa-cubes:before {\n    content: \"\\f1b3\";\n}\n.fa-behance:before {\n    content: \"\\f1b4\";\n}\n.fa-behance-square:before {\n    content: \"\\f1b5\";\n}\n.fa-steam:before {\n    content: \"\\f1b6\";\n}\n.fa-steam-square:before {\n    content: \"\\f1b7\";\n}\n.fa-recycle:before {\n    content: \"\\f1b8\";\n}\n.fa-automobile:before,\n.fa-car:before {\n    content: \"\\f1b9\";\n}\n.fa-cab:before,\n.fa-taxi:before {\n    content: \"\\f1ba\";\n}\n.fa-tree:before {\n    content: \"\\f1bb\";\n}\n.fa-spotify:before {\n    content: \"\\f1bc\";\n}\n.fa-deviantart:before {\n    content: \"\\f1bd\";\n}\n.fa-soundcloud:before {\n    content: \"\\f1be\";\n}\n.fa-database:before {\n    content: \"\\f1c0\";\n}\n.fa-file-pdf-o:before {\n    content: \"\\f1c1\";\n}\n.fa-file-word-o:before {\n    content: \"\\f1c2\";\n}\n.fa-file-excel-o:before {\n    content: \"\\f1c3\";\n}\n.fa-file-powerpoint-o:before {\n    content: \"\\f1c4\";\n}\n.fa-file-photo-o:before,\n.fa-file-picture-o:before,\n.fa-file-image-o:before {\n    content: \"\\f1c5\";\n}\n.fa-file-zip-o:before,\n.fa-file-archive-o:before {\n    content: \"\\f1c6\";\n}\n.fa-file-sound-o:before,\n.fa-file-audio-o:before {\n    content: \"\\f1c7\";\n}\n.fa-file-movie-o:before,\n.fa-file-video-o:before {\n    content: \"\\f1c8\";\n}\n.fa-file-code-o:before {\n    content: \"\\f1c9\";\n}\n.fa-vine:before {\n    content: \"\\f1ca\";\n}\n.fa-codepen:before {\n    content: \"\\f1cb\";\n}\n.fa-jsfiddle:before {\n    content: \"\\f1cc\";\n}\n.fa-life-bouy:before,\n.fa-life-buoy:before,\n.fa-life-saver:before,\n.fa-support:before,\n.fa-life-ring:before {\n    content: \"\\f1cd\";\n}\n.fa-circle-o-notch:before {\n    content: \"\\f1ce\";\n}\n.fa-ra:before,\n.fa-rebel:before {\n    content: \"\\f1d0\";\n}\n.fa-ge:before,\n.fa-empire:before {\n    content: \"\\f1d1\";\n}\n.fa-git-square:before {\n    content: \"\\f1d2\";\n}\n.fa-git:before {\n    content: \"\\f1d3\";\n}\n.fa-hacker-news:before {\n    content: \"\\f1d4\";\n}\n.fa-tencent-weibo:before {\n    content: \"\\f1d5\";\n}\n.fa-qq:before {\n    content: \"\\f1d6\";\n}\n.fa-wechat:before,\n.fa-weixin:before {\n    content: \"\\f1d7\";\n}\n.fa-send:before,\n.fa-paper-plane:before {\n    content: \"\\f1d8\";\n}\n.fa-send-o:before,\n.fa-paper-plane-o:before {\n    content: \"\\f1d9\";\n}\n.fa-history:before {\n    content: \"\\f1da\";\n}\n.fa-genderless:before,\n.fa-circle-thin:before {\n    content: \"\\f1db\";\n}\n.fa-header:before {\n    content: \"\\f1dc\";\n}\n.fa-paragraph:before {\n    content: \"\\f1dd\";\n}\n.fa-sliders:before {\n    content: \"\\f1de\";\n}\n.fa-share-alt:before {\n    content: \"\\f1e0\";\n}\n.fa-share-alt-square:before {\n    content: \"\\f1e1\";\n}\n.fa-bomb:before {\n    content: \"\\f1e2\";\n}\n.fa-soccer-ball-o:before,\n.fa-futbol-o:before {\n    content: \"\\f1e3\";\n}\n.fa-tty:before {\n    content: \"\\f1e4\";\n}\n.fa-binoculars:before {\n    content: \"\\f1e5\";\n}\n.fa-plug:before {\n    content: \"\\f1e6\";\n}\n.fa-slideshare:before {\n    content: \"\\f1e7\";\n}\n.fa-twitch:before {\n    content: \"\\f1e8\";\n}\n.fa-yelp:before {\n    content: \"\\f1e9\";\n}\n.fa-newspaper-o:before {\n    content: \"\\f1ea\";\n}\n.fa-wifi:before {\n    content: \"\\f1eb\";\n}\n.fa-calculator:before {\n    content: \"\\f1ec\";\n}\n.fa-paypal:before {\n    content: \"\\f1ed\";\n}\n.fa-google-wallet:before {\n    content: \"\\f1ee\";\n}\n.fa-cc-visa:before {\n    content: \"\\f1f0\";\n}\n.fa-cc-mastercard:before {\n    content: \"\\f1f1\";\n}\n.fa-cc-discover:before {\n    content: \"\\f1f2\";\n}\n.fa-cc-amex:before {\n    content: \"\\f1f3\";\n}\n.fa-cc-paypal:before {\n    content: \"\\f1f4\";\n}\n.fa-cc-stripe:before {\n    content: \"\\f1f5\";\n}\n.fa-bell-slash:before {\n    content: \"\\f1f6\";\n}\n.fa-bell-slash-o:before {\n    content: \"\\f1f7\";\n}\n.fa-trash:before {\n    content: \"\\f1f8\";\n}\n.fa-copyright:before {\n    content: \"\\f1f9\";\n}\n.fa-at:before {\n    content: \"\\f1fa\";\n}\n.fa-eyedropper:before {\n    content: \"\\f1fb\";\n}\n.fa-paint-brush:before {\n    content: \"\\f1fc\";\n}\n.fa-birthday-cake:before {\n    content: \"\\f1fd\";\n}\n.fa-area-chart:before {\n    content: \"\\f1fe\";\n}\n.fa-pie-chart:before {\n    content: \"\\f200\";\n}\n.fa-line-chart:before {\n    content: \"\\f201\";\n}\n.fa-lastfm:before {\n    content: \"\\f202\";\n}\n.fa-lastfm-square:before {\n    content: \"\\f203\";\n}\n.fa-toggle-off:before {\n    content: \"\\f204\";\n}\n.fa-toggle-on:before {\n    content: \"\\f205\";\n}\n.fa-bicycle:before {\n    content: \"\\f206\";\n}\n.fa-bus:before {\n    content: \"\\f207\";\n}\n.fa-ioxhost:before {\n    content: \"\\f208\";\n}\n.fa-angellist:before {\n    content: \"\\f209\";\n}\n.fa-cc:before {\n    content: \"\\f20a\";\n}\n.fa-shekel:before,\n.fa-sheqel:before,\n.fa-ils:before {\n    content: \"\\f20b\";\n}\n.fa-meanpath:before {\n    content: \"\\f20c\";\n}\n.fa-buysellads:before {\n    content: \"\\f20d\";\n}\n.fa-connectdevelop:before {\n    content: \"\\f20e\";\n}\n.fa-dashcube:before {\n    content: \"\\f210\";\n}\n.fa-forumbee:before {\n    content: \"\\f211\";\n}\n.fa-leanpub:before {\n    content: \"\\f212\";\n}\n.fa-sellsy:before {\n    content: \"\\f213\";\n}\n.fa-shirtsinbulk:before {\n    content: \"\\f214\";\n}\n.fa-simplybuilt:before {\n    content: \"\\f215\";\n}\n.fa-skyatlas:before {\n    content: \"\\f216\";\n}\n.fa-cart-plus:before {\n    content: \"\\f217\";\n}\n.fa-cart-arrow-down:before {\n    content: \"\\f218\";\n}\n.fa-diamond:before {\n    content: \"\\f219\";\n}\n.fa-ship:before {\n    content: \"\\f21a\";\n}\n.fa-user-secret:before {\n    content: \"\\f21b\";\n}\n.fa-motorcycle:before {\n    content: \"\\f21c\";\n}\n.fa-street-view:before {\n    content: \"\\f21d\";\n}\n.fa-heartbeat:before {\n    content: \"\\f21e\";\n}\n.fa-venus:before {\n    content: \"\\f221\";\n}\n.fa-mars:before {\n    content: \"\\f222\";\n}\n.fa-mercury:before {\n    content: \"\\f223\";\n}\n.fa-transgender:before {\n    content: \"\\f224\";\n}\n.fa-transgender-alt:before {\n    content: \"\\f225\";\n}\n.fa-venus-double:before {\n    content: \"\\f226\";\n}\n.fa-mars-double:before {\n    content: \"\\f227\";\n}\n.fa-venus-mars:before {\n    content: \"\\f228\";\n}\n.fa-mars-stroke:before {\n    content: \"\\f229\";\n}\n.fa-mars-stroke-v:before {\n    content: \"\\f22a\";\n}\n.fa-mars-stroke-h:before {\n    content: \"\\f22b\";\n}\n.fa-neuter:before {\n    content: \"\\f22c\";\n}\n.fa-facebook-official:before {\n    content: \"\\f230\";\n}\n.fa-pinterest-p:before {\n    content: \"\\f231\";\n}\n.fa-whatsapp:before {\n    content: \"\\f232\";\n}\n.fa-server:before {\n    content: \"\\f233\";\n}\n.fa-user-plus:before {\n    content: \"\\f234\";\n}\n.fa-user-times:before {\n    content: \"\\f235\";\n}\n.fa-hotel:before,\n.fa-bed:before {\n    content: \"\\f236\";\n}\n.fa-viacoin:before {\n    content: \"\\f237\";\n}\n.fa-train:before {\n    content: \"\\f238\";\n}\n.fa-subway:before {\n    content: \"\\f239\";\n}\n.fa-medium:before {\n    content: \"\\f23a\";\n}"
  },
  {
    "path": "webservice/lalascan_web/app/static/less/modules/icons.simplelineicons.less",
    "content": "//\n// Simple Line Icons\n// --------------------------------------------------\n\n@font-face {\n    font-family: Simple-Line-Icons;\n    src: url(../fonts/Simple-Line-Icons.eot);\n    src: url(../fonts/Simple-Line-Icons.eot?#iefix) format('embedded-opentype'),url(../fonts/Simple-Line-Icons.woff) format('woff'),url(../fonts/Simple-Line-Icons.ttf) format('truetype'),url(../fonts/Simple-Line-Icons.svg#Simple-Line-Icons) format('svg');\n    font-weight: 400;\n    font-style: normal;\n}\n\n.si {\n    font-family: Simple-Line-Icons;\n    speak: none;\n    font-style: normal;\n    font-weight: 400;\n    font-variant: normal;\n    text-transform: none;\n    line-height: 1;\n    -webkit-font-smoothing: antialiased;\n}\n\n.btn .si {\n    position: relative;\n    bottom: -2px;\n    display: inline-block;\n}\n\n.si-user-female:before {\n    content: \"\\e000\";\n}\n\n.si-user-follow:before {\n    content: \"\\e002\";\n}\n\n.si-user-following:before {\n    content: \"\\e003\";\n}\n\n.si-user-unfollow:before {\n    content: \"\\e004\";\n}\n\n.si-trophy:before {\n    content: \"\\e006\";\n}\n\n.si-screen-smartphone:before {\n    content: \"\\e010\";\n}\n\n.si-screen-desktop:before {\n    content: \"\\e011\";\n}\n\n.si-plane:before {\n    content: \"\\e012\";\n}\n\n.si-notebook:before {\n    content: \"\\e013\";\n}\n\n.si-moustache:before {\n    content: \"\\e014\";\n}\n\n.si-mouse:before {\n    content: \"\\e015\";\n}\n\n.si-magnet:before {\n    content: \"\\e016\";\n}\n\n.si-energy:before {\n    content: \"\\e020\";\n}\n\n.si-emoticon-smile:before {\n    content: \"\\e021\";\n}\n\n.si-disc:before {\n    content: \"\\e022\";\n}\n\n.si-cursor-move:before {\n    content: \"\\e023\";\n}\n\n.si-crop:before {\n    content: \"\\e024\";\n}\n\n.si-credit-card:before {\n    content: \"\\e025\";\n}\n\n.si-chemistry:before {\n    content: \"\\e026\";\n}\n\n.si-user:before {\n    content: \"\\e005\";\n}\n\n.si-speedometer:before {\n    content: \"\\e007\";\n}\n\n.si-social-youtube:before {\n    content: \"\\e008\";\n}\n\n.si-social-twitter:before {\n    content: \"\\e009\";\n}\n\n.si-social-tumblr:before {\n    content: \"\\e00a\";\n}\n\n.si-social-facebook:before {\n    content: \"\\e00b\";\n}\n\n.si-social-dropbox:before {\n    content: \"\\e00c\";\n}\n\n.si-social-dribbble:before {\n    content: \"\\e00d\";\n}\n\n.si-shield:before {\n    content: \"\\e00e\";\n}\n\n.si-screen-tablet:before {\n    content: \"\\e00f\";\n}\n\n.si-magic-wand:before {\n    content: \"\\e017\";\n}\n\n.si-hourglass:before {\n    content: \"\\e018\";\n}\n\n.si-graduation:before {\n    content: \"\\e019\";\n}\n\n.si-ghost:before {\n    content: \"\\e01a\";\n}\n\n.si-game-controller:before {\n    content: \"\\e01b\";\n}\n\n.si-fire:before {\n    content: \"\\e01c\";\n}\n\n.si-eyeglasses:before {\n    content: \"\\e01d\";\n}\n\n.si-envelope-open:before {\n    content: \"\\e01e\";\n}\n\n.si-envelope-letter:before {\n    content: \"\\e01f\";\n}\n\n.si-bell:before {\n    content: \"\\e027\";\n}\n\n.si-badge:before {\n    content: \"\\e028\";\n}\n\n.si-anchor:before {\n    content: \"\\e029\";\n}\n\n.si-wallet:before {\n    content: \"\\e02a\";\n}\n\n.si-vector:before {\n    content: \"\\e02b\";\n}\n\n.si-speech:before {\n    content: \"\\e02c\";\n}\n\n.si-puzzle:before {\n    content: \"\\e02d\";\n}\n\n.si-printer:before {\n    content: \"\\e02e\";\n}\n\n.si-present:before {\n    content: \"\\e02f\";\n}\n\n.si-playlist:before {\n    content: \"\\e030\";\n}\n\n.si-pin:before {\n    content: \"\\e031\";\n}\n\n.si-picture:before {\n    content: \"\\e032\";\n}\n\n.si-map:before {\n    content: \"\\e033\";\n}\n\n.si-layers:before {\n    content: \"\\e034\";\n}\n\n.si-handbag:before {\n    content: \"\\e035\";\n}\n\n.si-globe-alt:before {\n    content: \"\\e036\";\n}\n\n.si-globe:before {\n    content: \"\\e037\";\n}\n\n.si-frame:before {\n    content: \"\\e038\";\n}\n\n.si-folder-alt:before {\n    content: \"\\e039\";\n}\n\n.si-film:before {\n    content: \"\\e03a\";\n}\n\n.si-feed:before {\n    content: \"\\e03b\";\n}\n\n.si-earphones-alt:before {\n    content: \"\\e03c\";\n}\n\n.si-earphones:before {\n    content: \"\\e03d\";\n}\n\n.si-drop:before {\n    content: \"\\e03e\";\n}\n\n.si-drawer:before {\n    content: \"\\e03f\";\n}\n\n.si-docs:before {\n    content: \"\\e040\";\n}\n\n.si-directions:before {\n    content: \"\\e041\";\n}\n\n.si-direction:before {\n    content: \"\\e042\";\n}\n\n.si-diamond:before {\n    content: \"\\e043\";\n}\n\n.si-cup:before {\n    content: \"\\e044\";\n}\n\n.si-compass:before {\n    content: \"\\e045\";\n}\n\n.si-call-out:before {\n    content: \"\\e046\";\n}\n\n.si-call-in:before {\n    content: \"\\e047\";\n}\n\n.si-call-end:before {\n    content: \"\\e048\";\n}\n\n.si-calculator:before {\n    content: \"\\e049\";\n}\n\n.si-bubbles:before {\n    content: \"\\e04a\";\n}\n\n.si-briefcase:before {\n    content: \"\\e04b\";\n}\n\n.si-book-open:before {\n    content: \"\\e04c\";\n}\n\n.si-basket-loaded:before {\n    content: \"\\e04d\";\n}\n\n.si-basket:before {\n    content: \"\\e04e\";\n}\n\n.si-bag:before {\n    content: \"\\e04f\";\n}\n\n.si-action-undo:before {\n    content: \"\\e050\";\n}\n\n.si-action-redo:before {\n    content: \"\\e051\";\n}\n\n.si-wrench:before {\n    content: \"\\e052\";\n}\n\n.si-umbrella:before {\n    content: \"\\e053\";\n}\n\n.si-trash:before {\n    content: \"\\e054\";\n}\n\n.si-tag:before {\n    content: \"\\e055\";\n}\n\n.si-support:before {\n    content: \"\\e056\";\n}\n\n.si-size-fullscreen:before {\n    content: \"\\e057\";\n}\n\n.si-size-actual:before {\n    content: \"\\e058\";\n}\n\n.si-shuffle:before {\n    content: \"\\e059\";\n}\n\n.si-share-alt:before {\n    content: \"\\e05a\";\n}\n\n.si-share:before {\n    content: \"\\e05b\";\n}\n\n.si-rocket:before {\n    content: \"\\e05c\";\n}\n\n.si-question:before {\n    content: \"\\e05d\";\n}\n\n.si-pie-chart:before {\n    content: \"\\e05e\";\n}\n\n.si-pencil:before {\n    content: \"\\e05f\";\n}\n\n.si-note:before {\n    content: \"\\e060\";\n}\n\n.si-music-tone-alt:before {\n    content: \"\\e061\";\n}\n\n.si-music-tone:before {\n    content: \"\\e062\";\n}\n\n.si-microphone:before {\n    content: \"\\e063\";\n}\n\n.si-loop:before {\n    content: \"\\e064\";\n}\n\n.si-logout:before {\n    content: \"\\e065\";\n}\n\n.si-login:before {\n    content: \"\\e066\";\n}\n\n.si-list:before {\n    content: \"\\e067\";\n}\n\n.si-like:before {\n    content: \"\\e068\";\n}\n\n.si-home:before {\n    content: \"\\e069\";\n}\n\n.si-grid:before {\n    content: \"\\e06a\";\n}\n\n.si-graph:before {\n    content: \"\\e06b\";\n}\n\n.si-equalizer:before {\n    content: \"\\e06c\";\n}\n\n.si-dislike:before {\n    content: \"\\e06d\";\n}\n\n.si-cursor:before {\n    content: \"\\e06e\";\n}\n\n.si-control-start:before {\n    content: \"\\e06f\";\n}\n\n.si-control-rewind:before {\n    content: \"\\e070\";\n}\n\n.si-control-play:before {\n    content: \"\\e071\";\n}\n\n.si-control-pause:before {\n    content: \"\\e072\";\n}\n\n.si-control-forward:before {\n    content: \"\\e073\";\n}\n\n.si-control-end:before {\n    content: \"\\e074\";\n}\n\n.si-calendar:before {\n    content: \"\\e075\";\n}\n\n.si-bulb:before {\n    content: \"\\e076\";\n}\n\n.si-bar-chart:before {\n    content: \"\\e077\";\n}\n\n.si-arrow-up:before {\n    content: \"\\e078\";\n}\n\n.si-arrow-right:before {\n    content: \"\\e079\";\n}\n\n.si-arrow-left:before {\n    content: \"\\e07a\";\n}\n\n.si-arrow-down:before {\n    content: \"\\e07b\";\n}\n\n.si-ban:before {\n    content: \"\\e07c\";\n}\n\n.si-bubble:before {\n    content: \"\\e07d\";\n}\n\n.si-camcorder:before {\n    content: \"\\e07e\";\n}\n\n.si-camera:before {\n    content: \"\\e07f\";\n}\n\n.si-check:before {\n    content: \"\\e080\";\n}\n\n.si-clock:before {\n    content: \"\\e081\";\n}\n\n.si-close:before {\n    content: \"\\e082\";\n}\n\n.si-cloud-download:before {\n    content: \"\\e083\";\n}\n\n.si-cloud-upload:before {\n    content: \"\\e084\";\n}\n\n.si-doc:before {\n    content: \"\\e085\";\n}\n\n.si-envelope:before {\n    content: \"\\e086\";\n}\n\n.si-eye:before {\n    content: \"\\e087\";\n}\n\n.si-flag:before {\n    content: \"\\e088\";\n}\n\n.si-folder:before {\n    content: \"\\e089\";\n}\n\n.si-heart:before {\n    content: \"\\e08a\";\n}\n\n.si-info:before {\n    content: \"\\e08b\";\n}\n\n.si-key:before {\n    content: \"\\e08c\";\n}\n\n.si-link:before {\n    content: \"\\e08d\";\n}\n\n.si-lock:before {\n    content: \"\\e08e\";\n}\n\n.si-lock-open:before {\n    content: \"\\e08f\";\n}\n\n.si-magnifier:before {\n    content: \"\\e090\";\n}\n\n.si-magnifier-add:before {\n    content: \"\\e091\";\n}\n\n.si-magnifier-remove:before {\n    content: \"\\e092\";\n}\n\n.si-paper-clip:before {\n    content: \"\\e093\";\n}\n\n.si-paper-plane:before {\n    content: \"\\e094\";\n}\n\n.si-plus:before {\n    content: \"\\e095\";\n}\n\n.si-pointer:before {\n    content: \"\\e096\";\n}\n\n.si-power:before {\n    content: \"\\e097\";\n}\n\n.si-refresh:before {\n    content: \"\\e098\";\n}\n\n.si-reload:before {\n    content: \"\\e099\";\n}\n\n.si-settings:before {\n    content: \"\\e09a\";\n}\n\n.si-star:before {\n    content: \"\\e09b\";\n}\n\n.si-symbol-female:before {\n    content: \"\\e09c\";\n}\n\n.si-symbol-male:before {\n    content: \"\\e09d\";\n}\n\n.si-target:before {\n    content: \"\\e09e\";\n}\n\n.si-volume-1:before {\n    content: \"\\e09f\";\n}\n\n.si-volume-2:before {\n    content: \"\\e0a0\";\n}\n\n.si-volume-off:before {\n    content: \"\\e0a1\";\n}\n\n.si-users:before {\n    content: \"\\e001\";\n}"
  },
  {
    "path": "webservice/lalascan_web/app/static/less/modules/oneui.blocks.less",
    "content": "//\r\n// Blocks\r\n// --------------------------------------------------\r\n\r\n// Block\r\n.block {\r\n    margin-bottom: @space-base;\r\n    background-color: #fff;\r\n    .box-shadow(0 2px rgba(0,0,0,.01));\r\n\r\n    .side-content & {\r\n        .box-shadow(none);\r\n    }\r\n\r\n    &-header {\r\n        .clearfix();\r\n        padding: 15px @space-block;\r\n        .transition(opacity .2s ease-out);\r\n    }\r\n\r\n    &-title {\r\n        font-size: @font-size-base + 1px;\r\n        font-weight: 600;\r\n        text-transform: uppercase;\r\n        line-height: @headings-line-height;\r\n\r\n        &.text-normal {\r\n            text-transform: none;\r\n        }\r\n\r\n        small {\r\n            font-size: @font-size-base - 1px;\r\n            font-weight: normal;\r\n            text-transform: none;\r\n        }\r\n    }\r\n\r\n    &-content {\r\n        .content-layout(@space-block, @space-block, visible);\r\n        .transition(opacity .2s ease-out);\r\n\r\n        &.block-content-mini {\r\n            padding-top: (@space-block / 2);\r\n\r\n            &.block-content-full.block-content-mini {\r\n                padding-bottom: (@space-block / 2);\r\n            }\r\n        }\r\n\r\n        &.block-content-narrow {\r\n            @media screen and (min-width: @screen-lg-min) {\r\n                padding-left: 10%;\r\n                padding-right: 10%;\r\n            }\r\n        }\r\n    }\r\n\r\n    &.block-full .block-content {\r\n        padding-bottom: @space-block;\r\n\r\n        &.block-content-mini {\r\n            padding-bottom: (@space-block / 2);\r\n        }\r\n    }\r\n\r\n    &-table {\r\n        width: 100%;\r\n\r\n        td {\r\n            padding: 10px;\r\n            vertical-align: middle;\r\n        }\r\n    }\r\n\r\n    // Block Variations\r\n    &.block-bordered {\r\n        border: 1px solid #e9e9e9;\r\n        .box-shadow(none);\r\n\r\n        .block-header {\r\n            border-bottom: 1px solid #e9e9e9;\r\n        }\r\n    }\r\n\r\n    &.block-rounded {\r\n        border-radius: 4px;\r\n\r\n        .block-header {\r\n            .border-top-radius(3px);\r\n        }\r\n\r\n        .block-content {\r\n            &:first-child {\r\n                .border-top-radius(3px);\r\n            }\r\n\r\n            &:last-child {\r\n                .border-bottom-radius(3px);\r\n            }\r\n        }\r\n    }\r\n\r\n    &.block-themed > .block-header {\r\n        border-bottom: none;\r\n\r\n        .block-title {\r\n            color: #fff;\r\n        }\r\n\r\n        .block-title small {\r\n            color: rgba(255,255,255,.75);\r\n        }\r\n    }\r\n\r\n    &.block-transparent {\r\n        background-color: transparent;\r\n        .box-shadow(none);\r\n    }\r\n\r\n    // Block Options\r\n    &.block-opt-refresh {\r\n        position: relative;\r\n\r\n        .block-header {\r\n            opacity: .25;\r\n        }\r\n\r\n        .block-content {\r\n            opacity: .15;\r\n        }\r\n\r\n        &:after {\r\n            position: absolute;\r\n            top: 50%;\r\n            left: 50%;\r\n            margin: -20px 0 0 -20px;\r\n            width: 40px;\r\n            height: 40px;\r\n            line-height: 40px;\r\n            color: @text-color;\r\n            font-family: Simple-Line-Icons;\r\n            font-size: 18px;\r\n            text-align: center;\r\n            z-index: 2;\r\n            content: \"\\e09a\";\r\n            .animation(fa-spin 2s infinite linear);\r\n        }\r\n\r\n        .ie9 &:after {\r\n            content: \"Loading..\";\r\n        }\r\n    }\r\n\r\n    &.block-opt-fullscreen {\r\n        position: fixed;\r\n        top: 0;\r\n        right: 0;\r\n        bottom: 0;\r\n        left: 0;\r\n        z-index: 1040;\r\n        margin-bottom: 0;\r\n        overflow-y: auto;\r\n        -webkit-overflow-scrolling: touch;\r\n        .backface-visibility(hidden);\r\n    }\r\n\r\n    &.block-opt-hidden {\r\n        &.block-bordered .block-header {\r\n            border-bottom: none;\r\n        }\r\n\r\n        .block-content {\r\n            display: none;\r\n        }\r\n    }\r\n\r\n    // Block Links\r\n    a& {\r\n        display: block;\r\n        color: @text-color;\r\n        font-weight: normal;\r\n        .transition(all .15s ease-out);\r\n\r\n        &:hover {\r\n            color: @text-color;\r\n            opacity: .9;\r\n        }\r\n\r\n        &.block-link-hover1 {\r\n            &:hover {\r\n                .box-shadow(0 2px rgba(0,0,0,.1));\r\n                opacity: 1;\r\n            }\r\n\r\n            &:active {\r\n                .box-shadow(0 2px rgba(0,0,0,.01));\r\n            }\r\n        }\r\n\r\n        &.block-link-hover2 {\r\n            &:hover {\r\n                .translateY(-2px);\r\n                .box-shadow(0 2px 2px rgba(0,0,0,0.1));\r\n                opacity: 1;\r\n            }\r\n\r\n            &:active {\r\n                .translateY(-1px);\r\n                .box-shadow(0 2px 2px rgba(0,0,0,0.05));\r\n            }\r\n        }\r\n\r\n        &.block-link-hover3 {\r\n            &:hover {\r\n                .box-shadow(0 0 12px rgba(0,0,0,0.1));\r\n                opacity: 1;\r\n            }\r\n\r\n            &:active {\r\n                .box-shadow(0 0 2px rgba(0,0,0,0.1));\r\n            }\r\n        }\r\n    }\r\n\r\n    // Block Tabs\r\n    > .nav-tabs {\r\n        background-color: @gray-lighter;\r\n        border-bottom: none;\r\n\r\n        &.nav-tabs-right > li {\r\n            float: right;\r\n        }\r\n\r\n        &.nav-justified > li > a {\r\n            margin-bottom: 0;\r\n        }\r\n\r\n        > li {\r\n            margin-bottom: 0;\r\n\r\n            > a {\r\n                margin-right: 0;\r\n                padding-top: 12px;\r\n                padding-bottom: 12px;\r\n                color: @text-color;\r\n                font-weight: 600;\r\n                border: 1px solid transparent;\r\n                border-radius: 0;\r\n\r\n                &:hover {\r\n                    color: @brand-primary;\r\n                    background-color: transparent;\r\n                    border-color: transparent;\r\n                }\r\n            }\r\n\r\n            &.active > a {\r\n                &,\r\n                &:hover,\r\n                &:focus {\r\n                    color: @text-color;\r\n                    background-color: #fff;\r\n                    border-color: transparent;\r\n                }\r\n            }\r\n        }\r\n\r\n        &.nav-tabs-alt {\r\n            background-color: transparent;\r\n            border-bottom: 1px solid #e9e9e9;\r\n\r\n            > li {\r\n                > a {\r\n                    .transition(all .15s ease-out);\r\n\r\n                    &:hover {\r\n                        .box-shadow(0 2px @brand-primary);\r\n                    }\r\n                }\r\n\r\n                &.active > a {\r\n                    &,\r\n                    &:hover,\r\n                    &:focus {\r\n                        .box-shadow(0 2px @brand-primary);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    .block-content.tab-content {\r\n        overflow: hidden;\r\n    }\r\n}\r\n\r\n// Block Options\r\n.block-options {\r\n    .clearfix();\r\n    float: right;\r\n    margin: -3px 0 -3px 15px;\r\n    padding: 0;\r\n    height: 24px;\r\n    list-style: none;\r\n\r\n    &&-left {\r\n        float: left;\r\n        margin-right: 15px;\r\n        margin-left: 0;\r\n\r\n        + .block-title {\r\n            float: right;\r\n        }\r\n    }\r\n\r\n    > li {\r\n        display: inline-block;\r\n        margin: 0 2px;\r\n        padding: 0;\r\n\r\n        > a,\r\n        > button {\r\n            display: block;\r\n            padding: 2px 3px;\r\n            color: @gray-dark;\r\n            opacity: .6;\r\n\r\n            .block.block-themed > .block-header & {\r\n                color: #fff;\r\n            }\r\n\r\n            &:hover {\r\n                text-decoration: none;\r\n                opacity: 1;\r\n            }\r\n\r\n            &:active {\r\n                opacity: .6;\r\n            }\r\n        }\r\n\r\n        > span {\r\n            display: block;\r\n            padding: 2px 3px;\r\n\r\n            .block.block-themed > .block-header & {\r\n                color: #fff;\r\n            }\r\n        }\r\n\r\n        > a:focus {\r\n            text-decoration: none;\r\n            opacity: 1;\r\n        }\r\n\r\n        > button {\r\n            background: none;\r\n            border: none;\r\n        }\r\n\r\n        &.active > a,\r\n        &.open > button {\r\n            text-decoration: none;\r\n            opacity: 1;\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "webservice/lalascan_web/app/static/less/modules/oneui.forms.less",
    "content": "//\r\n// Forms\r\n// --------------------------------------------------\r\n\r\n// Material Inputs\r\n.form-material {\r\n    position: relative;\r\n    margin: 10px 0 10px;\r\n\r\n    // Labels\r\n    > label {\r\n        position: absolute;\r\n        top: 6px;\r\n        left: 0;\r\n        font-size: 13px;\r\n        font-weight: 600;\r\n        .translateY(-24px);\r\n    }\r\n\r\n    &.floating > label {\r\n        font-size: 15px;\r\n        font-weight: 400;\r\n        cursor: text;\r\n        z-index: 10;\r\n        .transition(all .15s ease-out);\r\n        .translateY(0);\r\n    }\r\n\r\n    // Form controls and input addons\r\n    > .form-control {\r\n        padding-left: 0;\r\n        padding-right: 0;\r\n        border: 0;\r\n        border-radius: 0;\r\n        background-color: transparent;\r\n        .box-shadow(0 1px 0 @form-border-color);\r\n\r\n        &:focus {\r\n            background-color: transparent;\r\n            .box-shadow(0 2px 0 @text-color);\r\n\r\n            + label {\r\n                color: @text-color;\r\n            }\r\n\r\n            ~ .input-group-addon {\r\n                .box-shadow(0 2px 0 @text-color);\r\n            }\r\n        }\r\n    }\r\n\r\n    & > .form-control:focus + label,\r\n    &.floating.open > label {\r\n        font-size: 13px;\r\n        font-weight: 600;\r\n        cursor: default;\r\n        .translateY(-24px);\r\n    }\r\n\r\n    .form-control[disabled],\r\n    .form-control[readonly],\r\n    fieldset[disabled] .form-control {\r\n        background-color: #fff;\r\n        border-bottom: 1px dashed #ccc;\r\n        .box-shadow(none);\r\n    }\r\n\r\n    &.input-group .input-group-addon {\r\n        border: none;\r\n        background-color: transparent;\r\n        border-radius: 0 !important;\r\n        .box-shadow(0 1px 0 @form-border-color);\r\n        .transition(all .15s ease-out);\r\n    }\r\n\r\n    // Form Focus Variations\r\n    &.form-material-primary > .form-control {\r\n        .form-control-material-focus-variant(@brand-primary);\r\n    }\r\n\r\n    &.form-material-success > .form-control {\r\n        .form-control-material-focus-variant(@brand-success);\r\n    }\r\n\r\n    &.form-material-info > .form-control {\r\n        .form-control-material-focus-variant(@brand-info);\r\n    }\r\n\r\n    &.form-material-warning > .form-control {\r\n        .form-control-material-focus-variant(@brand-warning);\r\n    }\r\n\r\n    &.form-material-danger > .form-control {\r\n        .form-control-material-focus-variant(@brand-danger);\r\n    }\r\n\r\n    // Form State Variations\r\n    .has-success & {\r\n        .form-control-material-state-variant(@brand-success);\r\n    }\r\n\r\n    .has-info & {\r\n        .form-control-material-state-variant(@brand-info);\r\n    }\r\n\r\n    .has-warning & {\r\n        .form-control-material-state-variant(@brand-warning);\r\n    }\r\n\r\n    .has-error & {\r\n        .form-control-material-state-variant(@brand-danger);\r\n    }\r\n}\r\n\r\n// CSS Inputs (Checkboxes + Radios + Switches) - Base class\r\n.css-input {\r\n    position: relative;\r\n    display: inline-block;\r\n    margin: 2px 0;\r\n    font-weight: 400;\r\n    cursor: pointer;\r\n\r\n    input {\r\n        position: absolute;\r\n        opacity: 0;\r\n\r\n        &:focus + span {\r\n\r\n            box-shadow: 0 0 3px rgba(0,0,0,.25);\r\n        }\r\n\r\n        + span {\r\n            position: relative;\r\n            display: inline-block;\r\n            margin-top: -2px;\r\n            margin-right: 3px;\r\n            vertical-align: middle;\r\n\r\n            &:after {\r\n                position: absolute;\r\n                content: \"\";\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n// CSS Checkboxes\r\n.css-checkbox {\r\n    margin: 7px 0;\r\n\r\n    input {\r\n        + span {\r\n            width: 20px;\r\n            height: 20px;\r\n            background-color: #fff;\r\n            border: 1px solid #ddd;\r\n            .transition(background-color .2s);\r\n\r\n            &:after {\r\n                top: 0;\r\n                right: 0;\r\n                bottom: 0;\r\n                left: 0;\r\n                font-family: \"FontAwesome\";\r\n                font-size: 10px;\r\n                color: #fff;\r\n                line-height: 18px;\r\n                content: \"\\f00c\";\r\n                text-align: center;\r\n            }\r\n        }\r\n    }\r\n\r\n    &:hover input + span {\r\n        border-color: #ccc;\r\n    }\r\n\r\n    // Variations\r\n    &&-sm {\r\n        margin: 9px 0 8px;\r\n        font-size: 12px;\r\n\r\n        input + span {\r\n            width: 16px;\r\n            height: 16px;\r\n\r\n            &:after {\r\n                font-size: 8px;\r\n                line-height: 15px;\r\n            }\r\n        }\r\n    }\r\n\r\n    &&-lg {\r\n        margin: 3px 0;\r\n\r\n        input + span {\r\n            width: 30px;\r\n            height: 30px;\r\n\r\n            &:after {\r\n                font-size: 12px;\r\n                line-height: 30px;\r\n            }\r\n        }\r\n    }\r\n\r\n    &&-rounded input + span {\r\n        border-radius: 3px;\r\n    }\r\n\r\n    &-default input:checked + span {\r\n        background-color: @gray-dark;\r\n        border-color: @gray-dark;\r\n    }\r\n\r\n    &-primary input:checked + span {\r\n        background-color: @brand-primary;\r\n        border-color: @brand-primary;\r\n    }\r\n\r\n    &-info input:checked + span {\r\n        background-color: @brand-info;\r\n        border-color: @brand-info;\r\n    }\r\n\r\n    &-success input:checked + span {\r\n        background-color: @brand-success;\r\n        border-color: @brand-success;\r\n    }\r\n\r\n    &-warning input:checked + span {\r\n        background-color: @brand-warning;\r\n        border-color: @brand-warning;\r\n    }\r\n\r\n    &-danger input:checked + span {\r\n        background-color: @brand-danger;\r\n        border-color: @brand-danger;\r\n    }\r\n}\r\n\r\n// CSS Radios\r\n.css-radio {\r\n    margin: 7px 0;\r\n\r\n    input {\r\n        + span {\r\n            width: 20px;\r\n            height: 20px;\r\n            background-color: #fff;\r\n            border: 1px solid #ddd;\r\n            border-radius: 50%;\r\n\r\n            &:after {\r\n                top: 2px;\r\n                right: 2px;\r\n                bottom: 2px;\r\n                left: 2px;\r\n                background-color: #fff;\r\n                border-radius: 50%;\r\n                opacity: 0;\r\n                .transition(opacity .2s ease-out);\r\n            }\r\n        }\r\n\r\n        &:checked + span:after {\r\n            opacity: 1;\r\n        }\r\n    }\r\n\r\n    &:hover input + span {\r\n        border-color: #ccc;\r\n    }\r\n\r\n    // Variations\r\n    &&-sm {\r\n        margin: 9px 0 8px;\r\n        font-size: 12px;\r\n\r\n        input + span {\r\n            width: 16px;\r\n            height: 16px;\r\n        }\r\n    }\r\n\r\n    &&-lg {\r\n        margin: 5px 0;\r\n\r\n        input + span {\r\n            width: 26px;\r\n            height: 26px;\r\n        }\r\n    }\r\n\r\n    &-default input:checked + span:after { background-color: @gray-dark; }\r\n    &-primary input:checked + span:after { background-color: @brand-primary; }\r\n    &-info input:checked + span:after { background-color: @brand-info; }\r\n    &-success input:checked + span:after { background-color: @brand-success; }\r\n    &-warning input:checked + span:after { background-color: @brand-warning; }\r\n    &-danger input:checked + span:after { background-color: @brand-danger; }\r\n}\r\n\r\n// CSS Switches\r\n.switch {\r\n    margin: 3px 0;\r\n\r\n    input {\r\n        + span {\r\n            width: 54px;\r\n            height: 30px;\r\n            background-color: #eee;\r\n            border-radius: 30px;\r\n            .transition(background-color .4s);\r\n\r\n            &:after {\r\n                top: 2px;\r\n                bottom: 2px;\r\n                left: 2px;\r\n                width: 26px;\r\n                background-color: #fff;\r\n                border-radius: 50%;\r\n                .box-shadow(1px 0 3px rgba(0,0,0,.1));\r\n                .transition-transform(.15s ease-out);\r\n            }\r\n        }\r\n\r\n        &:checked + span {\r\n            background-color: #ddd;\r\n\r\n            &:after {\r\n                .box-shadow(-2px 0 3px rgba(0,0,0,.2));\r\n                .translateX(23px);\r\n            }\r\n        }\r\n    }\r\n\r\n    // Variations\r\n    &&-sm {\r\n        margin: 8px 0 7px;\r\n        font-size: 12px;\r\n\r\n        input {\r\n            + span {\r\n                width: 36px;\r\n                height: 20px;\r\n\r\n                &:after {\r\n                    width: 16px;\r\n                }\r\n            }\r\n\r\n            &:checked + span:after {\r\n                .translateX(15px);\r\n            }\r\n        }\r\n    }\r\n\r\n    &&-lg {\r\n        margin: 1px 0;\r\n\r\n        input {\r\n            + span {\r\n                width: 70px;\r\n                height: 34px;\r\n\r\n                &:after {\r\n                    width: 30px;\r\n                }\r\n            }\r\n\r\n            &:checked + span:after {\r\n                .translateX(35px);\r\n            }\r\n        }\r\n    }\r\n\r\n    &&-square input + span,\r\n    &&-square input + span:after {\r\n        border-radius: 0;\r\n    }\r\n\r\n    &-default input:checked + span { background-color: @gray-dark; }\r\n    &-primary input:checked + span { background-color: @brand-primary; }\r\n    &-info input:checked + span { background-color: @brand-info; }\r\n    &-success input:checked + span { background-color: @brand-success; }\r\n    &-warning input:checked + span { background-color: @brand-warning; }\r\n    &-danger input:checked + span { background-color: @brand-danger; }\r\n}"
  },
  {
    "path": "webservice/lalascan_web/app/static/less/modules/oneui.images.less",
    "content": "//\r\n// Images (links and hover options)\r\n// --------------------------------------------------\r\n\r\n// Avatar\r\n.img-avatar {\r\n    display: inline-block !important;\r\n    width: 64px;\r\n    height: 64px;\r\n    border-radius: 50%;\r\n\r\n    &.img-avatar32 {\r\n        width: 32px;\r\n        height: 32px;\r\n    }\r\n\r\n    &.img-avatar48 {\r\n        width: 48px;\r\n        height: 48px;\r\n    }\r\n\r\n    &.img-avatar96 {\r\n        width: 96px;\r\n        height: 96px;\r\n    }\r\n\r\n    &.img-avatar128 {\r\n        width: 128px;\r\n        height: 128px;\r\n    }\r\n\r\n    &-thumb {\r\n        margin: 5px;\r\n        .box-shadow(0 0 0 5px rgba(255,255,255,.4));\r\n    }\r\n}\r\n\r\n// Image Thumb\r\n.img-thumb {\r\n    padding: 5px;\r\n    background-color: #fff;\r\n    border-radius: 2px;\r\n}\r\n\r\n// Image Link\r\n.img-link {\r\n    display: inline-block;\r\n    cursor: -webkit-zoom-in;\r\n    cursor: zoom-in;\r\n    .transition-transform(.15s ease-out);\r\n\r\n    &:hover {\r\n        .rotate(1deg);\r\n    }\r\n}\r\n\r\n// Image Hover Options\r\n.img-container {\r\n    position: relative;\r\n    overflow: hidden;\r\n    z-index: 0;\r\n    display: block;\r\n\r\n    .img-options {\r\n        position: absolute;\r\n        top: 0;\r\n        right: 0;\r\n        bottom: 0;\r\n        left: 0;\r\n        z-index: 1;\r\n        content: \"\";\r\n        background-color: rgba(0,0,0,.6);\r\n        opacity: 0;\r\n        visibility: none;\r\n        .transition(all .25s ease-out);\r\n\r\n        &-content {\r\n            .vertical-align();\r\n            right: 0;\r\n            left: 0;\r\n            text-align: center;\r\n        }\r\n    }\r\n\r\n    > img {\r\n        .transition-transform(.35s ease-out);\r\n    }\r\n\r\n    &:hover {\r\n        .img-options {\r\n            opacity: 1;\r\n            visibility: visible;\r\n        }\r\n    }\r\n\r\n    // Image hover effects\r\n    &.fx-img-zoom-in:hover > img {\r\n        .scale(1.2);\r\n    }\r\n\r\n    &.fx-img-rotate-r:hover > img {\r\n        .transform(scale(1.4), rotate(8deg));\r\n    }\r\n\r\n    &.fx-img-rotate-l:hover > img {\r\n        .transform(scale(1.4), rotate(-8deg));\r\n    }\r\n\r\n    // Image options hover effects\r\n    &.fx-opt-slide-top {\r\n        .img-options {\r\n            .translateY(100%);\r\n        }\r\n\r\n        &:hover .img-options {\r\n            .translateY(0);\r\n        }\r\n    }\r\n\r\n    &.fx-opt-slide-right {\r\n        .img-options {\r\n            .translateX(-100%);\r\n        }\r\n\r\n        &:hover .img-options {\r\n            .translateX(0);\r\n        }\r\n    }\r\n\r\n    &.fx-opt-slide-down {\r\n        .img-options {\r\n            .translateY(-100%);\r\n        }\r\n\r\n        &:hover .img-options {\r\n            .translateY(0);\r\n        }\r\n    }\r\n\r\n    &.fx-opt-slide-left {\r\n        .img-options {\r\n            .translateX(100%);\r\n        }\r\n\r\n        &:hover .img-options {\r\n            .translateX(0);\r\n        }\r\n    }\r\n\r\n    &.fx-opt-zoom-in {\r\n        .img-options {\r\n            .scale(0);\r\n        }\r\n\r\n        &:hover .img-options {\r\n            .scale(1);\r\n        }\r\n    }\r\n\r\n    &.fx-opt-zoom-out {\r\n        .img-options {\r\n            .scale(2);\r\n        }\r\n\r\n        &:hover .img-options {\r\n            .scale(1);\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "webservice/lalascan_web/app/static/less/modules/oneui.layout.less",
    "content": "//\r\n// Layout\r\n// --------------------------------------------------\r\n\r\n// Header Navbar\r\n#header-navbar {\r\n    min-height: @header-height;\r\n    background-color: #fff;\r\n    .clearfix();\r\n}\r\n\r\n.header-navbar-fixed {\r\n    #header-navbar {\r\n        position: fixed;\r\n        top: 0;\r\n        right: 0;\r\n        left: 0;\r\n        z-index: 1030;\r\n        min-width: 320px;\r\n        .backface-visibility(hidden);\r\n        .box-shadow(0 2px 5px rgba(0,0,0,.02));\r\n    }\r\n\r\n    #main-container {\r\n        padding-top: @header-height;\r\n    }\r\n\r\n    @media screen and (min-width: @screen-md-min) {\r\n        &.sidebar-l.sidebar-o #header-navbar {\r\n            left: @sidebar-width;\r\n        }\r\n\r\n        &.sidebar-r.sidebar-o #header-navbar {\r\n            right: @sidebar-width;\r\n        }\r\n\r\n        // Mini Sidebar\r\n        &.sidebar-l.sidebar-o.sidebar-mini #header-navbar {\r\n            left: @sidebar-width-mini;\r\n        }\r\n\r\n        &.sidebar-r.sidebar-o.sidebar-mini #header-navbar {\r\n            right: @sidebar-width-mini;\r\n        }\r\n    }\r\n}\r\n\r\n.header-navbar-transparent {\r\n    #header-navbar {\r\n        background-color: transparent;\r\n        .box-shadow(none);\r\n    }\r\n\r\n    &.header-navbar-fixed {\r\n        &.header-navbar-scroll {\r\n            #header-navbar {\r\n                background-color: @brand-dark;\r\n            }\r\n        }\r\n\r\n        #main-container {\r\n            padding-top: 0;\r\n        }\r\n    }\r\n}\r\n\r\n// Page Container\r\n#page-container {\r\n    margin: 0 auto;\r\n    width: 100%;\r\n    min-width: 320px;\r\n    background-color: @brand-darker;\r\n\r\n    @media screen and (min-width: @screen-md-min) {\r\n        &.sidebar-l.sidebar-o {\r\n            padding-left: @sidebar-width;\r\n        }\r\n\r\n        &.sidebar-r.sidebar-o {\r\n            padding-right: @sidebar-width;\r\n        }\r\n\r\n        // Mini Sidebar\r\n        &.sidebar-l.sidebar-o.sidebar-mini {\r\n            padding-left: @sidebar-width-mini;\r\n        }\r\n\r\n        &.sidebar-r.sidebar-o.sidebar-mini {\r\n            padding-right: @sidebar-width-mini;\r\n        }\r\n    }\r\n}\r\n\r\n// Sidebar and Side Overlay\r\n#sidebar,\r\n#side-overlay {\r\n    position: fixed;\r\n    top: 0;\r\n    bottom: 0;\r\n    z-index: 1031;\r\n    overflow-y: auto;\r\n    -webkit-overflow-scrolling: touch;\r\n    .transition(all @side-transition);\r\n    .backface-visibility(hidden);\r\n\r\n    @media screen and (min-width: @screen-md-min) {\r\n        // Side Scroll (Disable native scrolling, slimScroll will be enabled with JS)\r\n        .side-scroll & {\r\n            overflow-y: hidden;\r\n        }\r\n    }\r\n}\r\n\r\n#sidebar {\r\n    width: @sidebar-width;\r\n    background-color: @brand-darker;\r\n\r\n    .sidebar-l & {\r\n        left: 0;\r\n        .translate3d(-100%,0,0);\r\n    }\r\n\r\n    .sidebar-r & {\r\n        right: 0;\r\n        .translate3d(100%,0,0);\r\n    }\r\n\r\n    @media screen and (max-width: @screen-sm-max) {\r\n        width: 100%;\r\n        opacity: 0;\r\n\r\n        .sidebar-o-xs & {\r\n            opacity: 1;\r\n            .translate3d(0,0,0);\r\n        }\r\n    }\r\n\r\n    @media screen and (min-width: @screen-md-min) {\r\n        width: @sidebar-width;\r\n        .transition(none);\r\n\r\n        .sidebar-o & {\r\n            .translate3d(0,0,0);\r\n        }\r\n\r\n        // Mini Sidebar\r\n        .sidebar-o.sidebar-mini & {\r\n            overflow-x: hidden;\r\n            .transition(all @side-transition);\r\n        }\r\n\r\n        .sidebar-l.sidebar-o.sidebar-mini & {\r\n            .translate3d(-(@sidebar-width - @sidebar-width-mini),0,0);\r\n        }\r\n\r\n        .sidebar-r.sidebar-o.sidebar-mini & {\r\n            .translate3d((@sidebar-width - @sidebar-width-mini),0,0);\r\n        }\r\n\r\n        .sidebar-o.sidebar-mini & .sidebar-content {\r\n            width: @sidebar-width;\r\n            .transition(all @side-transition);\r\n        }\r\n\r\n        .sidebar-l.sidebar-o.sidebar-mini & .sidebar-content {\r\n            .translate3d((@sidebar-width - @sidebar-width-mini),0,0);\r\n        }\r\n\r\n        .sidebar-o.sidebar-mini &:hover,\r\n        .sidebar-o.sidebar-mini &:hover .sidebar-content {\r\n            .translate3d(0,0,0);\r\n        }\r\n\r\n        .sidebar-o.sidebar-mini & {\r\n            .sidebar-mini-hide {\r\n                opacity: 0;\r\n                .transition(opacity @side-transition);\r\n            }\r\n\r\n            .sidebar-mini-hidden {\r\n                display: none;\r\n            }\r\n\r\n            .nav-main > li.open > ul {\r\n                display: none;\r\n            }\r\n        }\r\n\r\n        .sidebar-o.sidebar-mini &:hover {\r\n            .sidebar-mini-hide {\r\n                opacity: 1;\r\n            }\r\n\r\n            .nav-main > li.open > ul {\r\n                display: block;\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n#side-overlay {\r\n    background-color: #fff;\r\n\r\n    .sidebar-l & {\r\n        right: 0;\r\n        .translate3d(100%,0,0);\r\n    }\r\n\r\n    .sidebar-r & {\r\n        left: 0;\r\n        .translate3d(-100%,0,0);\r\n    }\r\n\r\n    @media screen and (max-width: @screen-sm-max) {\r\n        width: 100%;\r\n        opacity: 0;\r\n\r\n        .side-overlay-o & {\r\n            opacity: 1;\r\n            .translate3d(0,0,0);\r\n        }\r\n    }\r\n\r\n    @media screen and (min-width: @screen-md-min) {\r\n        width: @side-overlay-width;\r\n        .box-shadow(0 0 20px rgba(0,0,0,.3));\r\n\r\n        .sidebar-l & {\r\n            .translate3d(110%,0,0);\r\n        }\r\n\r\n        .sidebar-r & {\r\n            .translate3d(-110%,0,0);\r\n        }\r\n\r\n        .sidebar-l.side-overlay-hover & {\r\n            .translate3d(@side-overlay-width - 20px,0,0);\r\n        }\r\n\r\n        .sidebar-r.side-overlay-hover & {\r\n            .translate3d(-(@side-overlay-width - 20px),0,0);\r\n        }\r\n\r\n        .side-overlay-hover &:hover,\r\n        .side-overlay-o &,\r\n        .side-overlay-o.side-overlay-hover & {\r\n            .box-shadow(0 0 10px rgba(0,0,0,.3));\r\n            .translate3d(0,0,0);\r\n        }\r\n    }\r\n}\r\n\r\n// Sidebar and Side Overlay content\r\n.side-header {\r\n    margin: 0 auto;\r\n    min-height: @header-height;\r\n    .clearfix();\r\n\r\n    &.side-content {\r\n        overflow: visible;\r\n    }\r\n\r\n    > span,\r\n    > a {\r\n        display: inline-block;\r\n        line-height: 34px;\r\n    }\r\n\r\n    img {\r\n        display: inline-block;\r\n        margin-top: -2px;\r\n    }\r\n}\r\n\r\n.side-content {\r\n    .content-layout(@space-side-content, ((@header-height - 34px) / 2), hidden);\r\n}\r\n\r\n// Main Content\r\n#main-container,\r\n#page-footer {\r\n    overflow-x: hidden;\r\n}\r\n\r\n#main-container {\r\n    background-color: @body-bg;\r\n}\r\n\r\n.content {\r\n    .content-layout(14px, 16px, visible);\r\n\r\n    @media screen and (min-width: @screen-sm-min) {\r\n        .content-layout(@space-base, @space-base, visible);\r\n\r\n        &&-boxed {\r\n            max-width: @space-width-boxed;\r\n        }\r\n\r\n        &&-narrow {\r\n            max-width: @space-width-narrow;\r\n        }\r\n    }\r\n\r\n    &-grid {\r\n        margin-bottom: (@space-base - @space-grid-base);\r\n\r\n        .push,\r\n        .block {\r\n            margin-bottom: @space-grid-base;\r\n        }\r\n\r\n        .row {\r\n            margin-left: -(@space-grid-base / 2);\r\n            margin-right: -(@space-grid-base / 2);\r\n\r\n            & > div[class*=\"col\"] {\r\n                padding-left: (@space-grid-base / 2);\r\n                padding-right: (@space-grid-base / 2);\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n.content-mini {\r\n    .content-layout(14px, ((@header-height - 34px) / 2), visible);\r\n\r\n    @media screen and (min-width: @screen-sm-min) {\r\n        .content-layout(@space-base, ((@header-height - 34px) / 2), visible);\r\n    }\r\n}\r\n\r\n.content-boxed {\r\n    margin: 0 auto;\r\n    width: 100%;\r\n    max-width: @space-width-boxed;\r\n}\r\n\r\n// Layout Backgrounds\r\n.bg-image {\r\n    background-color: @gray-lighter;\r\n    background-position: center center;\r\n    background-repeat: no-repeat;\r\n    -webkit-background-size: cover;\r\n    background-size: cover;\r\n\r\n    &-parallax {\r\n        background-attachment: fixed;\r\n    }\r\n}"
  },
  {
    "path": "webservice/lalascan_web/app/static/less/modules/oneui.lists.less",
    "content": "//\r\n// Lists\r\n// --------------------------------------------------\r\n\r\n// Base List\r\n.list {\r\n    margin: 0;\r\n    padding: 0;\r\n    list-style: none;\r\n\r\n    > li {\r\n        position: relative;\r\n    }\r\n}\r\n\r\n// Timeline\r\n.list-timeline {\r\n    position: relative;\r\n    padding-top: 10px;\r\n\r\n    > li {\r\n        margin-bottom: 10px;\r\n    }\r\n\r\n    & &-time {\r\n        margin: 0 -20px;\r\n        padding: 10px 20px 10px 40px;\r\n        min-height: 40px;\r\n        text-align: right;\r\n        color: #999;\r\n        font-size: 13px;\r\n        font-style: italic;\r\n        background-color: #f9f9f9;\r\n        border-radius: 2px;\r\n    }\r\n\r\n    & &-icon {\r\n        position: absolute;\r\n        top: 5px;\r\n        left: 10px;\r\n        width: 30px;\r\n        height: 30px;\r\n        line-height: 30px;\r\n        color: #fff;\r\n        text-align: center;\r\n        border-radius: 50%;\r\n    }\r\n\r\n    & &-content {\r\n        padding: 10px 10px 1px;\r\n\r\n        > p:first-child {\r\n            margin-bottom: 0;\r\n        }\r\n    }\r\n\r\n    @media screen and (min-width: @screen-sm-min) {\r\n        padding-top: 20px;\r\n\r\n        &:before {\r\n            position: absolute;\r\n            top: 0;\r\n            left: 120px;\r\n            bottom: 0;\r\n            display: block;\r\n            width: 4px;\r\n            content: \"\";\r\n            background-color: #f9f9f9;\r\n            z-index: 1;\r\n        }\r\n\r\n        > li {\r\n            min-height: 40px;\r\n            z-index: 2;\r\n\r\n            &:last-child {\r\n                margin-bottom: 0;\r\n            }\r\n        }\r\n\r\n        & &-time {\r\n            position: absolute;\r\n            top: 0;\r\n            left: 0;\r\n            margin: 0;\r\n            padding-right: 0;\r\n            padding-left: 0;\r\n            width: 90px;\r\n            background-color: transparent;\r\n        }\r\n\r\n        & &-icon {\r\n            top: 3px;\r\n            left: 105px;\r\n            width: 34px;\r\n            height: 34px;\r\n            line-height: 34px;\r\n            z-index: 2 !important;\r\n        }\r\n\r\n        & &-content {\r\n            padding-left: 160px;\r\n        }\r\n    }\r\n}\r\n\r\n// Activity\r\n.list-activity > li {\r\n    margin-bottom: 5px;\r\n    padding-bottom: 5px;\r\n    padding-left: 30px;\r\n    font-size: 13px;\r\n    border-bottom: 1px solid @gray-light;\r\n\r\n    > i:first-child {\r\n        position: absolute;\r\n        left: 0;\r\n        top: 0;\r\n        display: inline-block;\r\n        width: 20px;\r\n        height: 20px;\r\n        line-height: 20px;\r\n        font-size: 14px;\r\n        text-align: center;\r\n    }\r\n}\r\n\r\n// Events\r\n.list-events > li {\r\n    margin-bottom: 5px;\r\n    padding: 8px 30px 8px 10px;\r\n    color: rgba(0,0,0,.5);\r\n    font-size: 13px;\r\n    font-weight: 700;\r\n    background-color: #b5d0eb;\r\n\r\n    &:before {\r\n        .align-v();\r\n        right: 10px;\r\n        display: inline-block;\r\n        font-family: 'FontAwesome';\r\n        color: rgba(255,255,255,.75);\r\n        content: \"\\f073\";\r\n    }\r\n\r\n    &:hover {\r\n        cursor: move;\r\n    }\r\n}\r\n\r\n// Simple\r\n.list-simple > li {\r\n    margin-bottom: 20px;\r\n}\r\n\r\n.list-simple-mini > li {\r\n    margin-bottom: 10px;\r\n}\r\n\r\n// List li clearfix\r\n.list-li-clearfix > li {\r\n    .clearfix();\r\n}"
  },
  {
    "path": "webservice/lalascan_web/app/static/less/modules/oneui.navigation.less",
    "content": "//\r\n// Navigation\r\n// --------------------------------------------------\r\n\r\n// Main Navigation\r\n.nav-main {\r\n    margin: 0 -@space-side-content;\r\n    padding: 0;\r\n    list-style: none;\r\n\r\n    // Headers\r\n    .nav-main-heading {\r\n        padding: 22px (@space-side-content + 15) 6px @space-side-content;\r\n        font-size: 12px;\r\n        font-weight: 600;\r\n        text-transform: uppercase;\r\n        color: rgba(255,255,255,.3);\r\n    }\r\n\r\n    // Default links\r\n    a {\r\n        display: block;\r\n        padding: 10px (@space-side-content + 15) 10px @space-side-content;\r\n        color: rgba(255,255,255,.5);\r\n\r\n        &:hover,\r\n        &:focus {\r\n            color: rgba(255,255,255,.5);\r\n            background-color: rgba(0,0,0,.2);\r\n\r\n            > i {\r\n                color: #fff;\r\n            }\r\n        }\r\n\r\n        &.active,\r\n        &.active:hover {\r\n            color: #fff;\r\n\r\n            > i {\r\n                color: #fff;\r\n            }\r\n        }\r\n\r\n        > i {\r\n            margin-right: 15px;\r\n            color: rgba(255,255,255,.2);\r\n        }\r\n\r\n        &.nav-submenu {\r\n            position: relative;\r\n            padding-right: 30px;\r\n        }\r\n\r\n        &.nav-submenu:before {\r\n            .align-v();\r\n            right: 15px;\r\n            display: inline-block;\r\n            font-family: 'FontAwesome';\r\n            color: rgba(255,255,255,.25);\r\n            content: \"\\f104\";\r\n        }\r\n    }\r\n\r\n    // Submenus\r\n    ul {\r\n        margin: 0;\r\n        padding: 0 0 0 (@space-side-content + 30);\r\n        height: 0;\r\n        list-style: none;\r\n        background-color: rgba(0,0,0,.15);\r\n        overflow: hidden;\r\n\r\n        > li {\r\n            opacity: 0;\r\n            .transition(all .25s ease-out);\r\n            .translateX(-15px);\r\n        }\r\n\r\n        .nav-main-heading {\r\n            padding-left: 0;\r\n            padding-right: 0;\r\n            color: rgba(255,255,255,.65);\r\n        }\r\n\r\n        a {\r\n            padding: 8px 0;\r\n            font-size: 13px;\r\n            color: rgba(255,255,255,.4);\r\n\r\n            &:hover,\r\n            &:focus {\r\n                color: #fff;\r\n                background-color: transparent;\r\n            }\r\n\r\n            > i {\r\n                margin-right: 10px;\r\n            }\r\n        }\r\n\r\n        ul {\r\n            padding-left: 12px;\r\n        }\r\n    }\r\n\r\n    // Active submenu\r\n    li.open {\r\n        > a.nav-submenu {\r\n            color: #fff;\r\n\r\n            > i {\r\n                color: #fff;\r\n            }\r\n\r\n            &:before {\r\n                content: \"\\f107\";\r\n            }\r\n        }\r\n\r\n        > ul {\r\n            height: auto;\r\n\r\n            > li {\r\n                opacity: 1;\r\n                .translateX(0);\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n// Header Navigation\r\n.nav-header {\r\n    margin: 0;\r\n    padding: 0;\r\n    list-style: none;\r\n    .clearfix();\r\n\r\n    > li {\r\n        margin-right: 12px;\r\n        float: left;\r\n\r\n        > a,\r\n        > .btn-group > a {\r\n            padding: 0 12px;\r\n            display: block;\r\n            line-height: 34px;\r\n            font-weight: 600;\r\n        }\r\n    }\r\n\r\n    &.pull-right > li {\r\n        margin-right: 0;\r\n        margin-left: 12px;\r\n        float: left;\r\n    }\r\n\r\n    .header-content {\r\n        line-height: 34px;\r\n    }\r\n\r\n    .header-search {\r\n        width: 360px;\r\n\r\n        @media screen and (max-width: @screen-xs-max) {\r\n            display: none;\r\n\r\n            &.header-search-xs-visible {\r\n                position: absolute;\r\n                top: @header-height;\r\n                right: 0;\r\n                left: 0;\r\n                z-index: 999;\r\n                display: block;\r\n                width: 100%;\r\n                border-top: 1px solid #f9f9f9;\r\n\r\n                > form {\r\n                    padding: 14px 14px;\r\n                    background-color: #fff;\r\n                    .box-shadow(0 2px 5px rgba(0,0,0,.02));\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n// User Navigation\r\n.nav-users {\r\n    margin: 0;\r\n    padding: 0;\r\n    list-style: none;\r\n\r\n    > li:last-child > a {\r\n        border-bottom: none;\r\n    }\r\n\r\n    a {\r\n        position: relative;\r\n        padding: 12px 8px 8px 71px;\r\n        display: block;\r\n        min-height: 62px;\r\n        font-weight: 600;\r\n        border-bottom: 1px solid @gray-light;\r\n\r\n        > img {\r\n            position: absolute;\r\n            left: 12px;\r\n            top: 10px;\r\n            width: 42px;\r\n            height: 42px;\r\n            border-radius: 50%;\r\n        }\r\n\r\n        > i {\r\n            position: absolute;\r\n            left: 40px;\r\n            top: 40px;\r\n            display: inline-block;\r\n            width: 18px;\r\n            height: 18px;\r\n            line-height: 18px;\r\n            text-align: center;\r\n            background-color: #fff;\r\n            border-radius: 50%;\r\n        }\r\n\r\n        &:hover {\r\n            background-color: #f9f9f9;\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "webservice/lalascan_web/app/static/less/modules/oneui.print.less",
    "content": "//\r\n// Print\r\n// --------------------------------------------------\r\n\r\n@media print {\r\n    #page-container,\r\n    #main-container {\r\n        padding: 0 !important;\r\n    }\r\n\r\n    #header-navbar,\r\n    #sidebar,\r\n    #side-overlay,\r\n    .block-options {\r\n        display: none !important;\r\n    }\r\n}"
  },
  {
    "path": "webservice/lalascan_web/app/static/less/modules/oneui.themes.less",
    "content": "//\r\n// Themes\r\n// --------------------------------------------------\r\n\r\n// Default\r\n.text-default {\r\n    .text-emphasis-variant(@brand-primary);\r\n\r\n    &-dark {\r\n        .text-emphasis-variant(@brand-dark);\r\n    }\r\n\r\n    &-darker {\r\n        .text-emphasis-variant(@brand-darker);\r\n    }\r\n\r\n    &-light {\r\n        .text-emphasis-variant(@brand-light);\r\n    }\r\n\r\n    &-lighter {\r\n        .text-emphasis-variant(@brand-lighter);\r\n    }\r\n}\r\n\r\n.bg-default {\r\n    .bg-variant(@brand-primary);\r\n\r\n    &-op {\r\n        .bg-variant(fade(@brand-primary, 75%));\r\n    }\r\n\r\n    &-dark {\r\n        .bg-variant(@brand-dark);\r\n    }\r\n\r\n    &-dark-op {\r\n        .bg-variant(fade(@brand-dark, 83%));\r\n    }\r\n\r\n    &-darker {\r\n        .bg-variant(@brand-darker);\r\n    }\r\n\r\n    &-light {\r\n        .bg-variant(@brand-light);\r\n    }\r\n\r\n    &-lighter {\r\n        .bg-variant(@brand-lighter);\r\n    }\r\n}\r\n\r\n// Amethyst\r\n.text-amethyst {\r\n    .text-emphasis-variant(@theme-amethyst-base);\r\n\r\n    &-dark {\r\n        .text-emphasis-variant(@theme-amethyst-dark);\r\n    }\r\n\r\n    &-darker {\r\n        .text-emphasis-variant(@theme-amethyst-darker);\r\n    }\r\n\r\n    &-light {\r\n        .text-emphasis-variant(@theme-amethyst-light);\r\n    }\r\n\r\n    &-lighter {\r\n        .text-emphasis-variant(@theme-amethyst-lighter);\r\n    }\r\n}\r\n\r\n.bg-amethyst {\r\n    .bg-variant(@theme-amethyst-base);\r\n\r\n    &-op {\r\n        .bg-variant(fade(@theme-amethyst-base, 75%));\r\n    }\r\n\r\n    &-dark {\r\n        .bg-variant(@theme-amethyst-dark);\r\n    }\r\n\r\n    &-dark-op {\r\n        .bg-variant(fade(@theme-amethyst-dark, 83%));\r\n    }\r\n\r\n    &-darker {\r\n        .bg-variant(@theme-amethyst-darker);\r\n    }\r\n\r\n    &-light {\r\n        .bg-variant(@theme-amethyst-light);\r\n    }\r\n\r\n    &-lighter {\r\n        .bg-variant(@theme-amethyst-lighter);\r\n    }\r\n}\r\n\r\n// City\r\n.text-city {\r\n    .text-emphasis-variant(@theme-city-base);\r\n\r\n    &-dark {\r\n        .text-emphasis-variant(@theme-city-dark);\r\n    }\r\n\r\n    &-darker {\r\n        .text-emphasis-variant(@theme-city-darker);\r\n    }\r\n\r\n    &-light {\r\n        .text-emphasis-variant(@theme-city-light);\r\n    }\r\n\r\n    &-lighter {\r\n        .text-emphasis-variant(@theme-city-lighter);\r\n    }\r\n}\r\n\r\n.bg-city {\r\n    .bg-variant(@theme-city-base);\r\n\r\n    &-op {\r\n        .bg-variant(fade(@theme-city-base, 75%));\r\n    }\r\n\r\n    &-dark {\r\n        .bg-variant(@theme-city-dark);\r\n    }\r\n\r\n    &-dark-op {\r\n        .bg-variant(fade(@theme-city-dark, 83%));\r\n    }\r\n\r\n    &-darker {\r\n        .bg-variant(@theme-city-darker);\r\n    }\r\n\r\n    &-light {\r\n        .bg-variant(@theme-city-light);\r\n    }\r\n\r\n    &-lighter {\r\n        .bg-variant(@theme-city-lighter);\r\n    }\r\n}\r\n\r\n// Flat\r\n.text-flat {\r\n    .text-emphasis-variant(@theme-flat-base);\r\n\r\n    &-dark {\r\n        .text-emphasis-variant(@theme-flat-dark);\r\n    }\r\n\r\n    &-darker {\r\n        .text-emphasis-variant(@theme-flat-darker);\r\n    }\r\n\r\n    &-light {\r\n        .text-emphasis-variant(@theme-flat-light);\r\n    }\r\n\r\n    &-lighter {\r\n        .text-emphasis-variant(@theme-flat-lighter);\r\n    }\r\n}\r\n\r\n.bg-flat {\r\n    .bg-variant(@theme-flat-base);\r\n\r\n    &-op {\r\n        .bg-variant(fade(@theme-flat-base, 75%));\r\n    }\r\n\r\n    &-dark {\r\n        .bg-variant(@theme-flat-dark);\r\n    }\r\n\r\n    &-dark-op {\r\n        .bg-variant(fade(@theme-flat-dark, 83%));\r\n    }\r\n\r\n    &-darker {\r\n        .bg-variant(@theme-flat-darker);\r\n    }\r\n\r\n    &-light {\r\n        .bg-variant(@theme-flat-light);\r\n    }\r\n\r\n    &-lighter {\r\n        .bg-variant(@theme-flat-lighter);\r\n    }\r\n}\r\n\r\n// Modern\r\n.text-modern {\r\n    .text-emphasis-variant(@theme-modern-base);\r\n\r\n    &-dark {\r\n        .text-emphasis-variant(@theme-modern-dark);\r\n    }\r\n\r\n    &-darker {\r\n        .text-emphasis-variant(@theme-modern-darker);\r\n    }\r\n\r\n    &-light {\r\n        .text-emphasis-variant(@theme-modern-light);\r\n    }\r\n\r\n    &-lighter {\r\n        .text-emphasis-variant(@theme-modern-lighter);\r\n    }\r\n}\r\n\r\n.bg-modern {\r\n    .bg-variant(@theme-modern-base);\r\n\r\n    &-op {\r\n        .bg-variant(fade(@theme-modern-base, 75%));\r\n    }\r\n\r\n    &-dark {\r\n        .bg-variant(@theme-modern-dark);\r\n    }\r\n\r\n    &-dark-op {\r\n        .bg-variant(fade(@theme-modern-dark, 83%));\r\n    }\r\n\r\n    &-darker {\r\n        .bg-variant(@theme-modern-darker);\r\n    }\r\n\r\n    &-light {\r\n        .bg-variant(@theme-modern-light);\r\n    }\r\n\r\n    &-lighter {\r\n        .bg-variant(@theme-modern-lighter);\r\n    }\r\n}\r\n\r\n// Smooth\r\n.text-smooth {\r\n    .text-emphasis-variant(@theme-smooth-base);\r\n\r\n    &-dark {\r\n        .text-emphasis-variant(@theme-smooth-dark);\r\n    }\r\n\r\n    &-darker {\r\n        .text-emphasis-variant(@theme-smooth-darker);\r\n    }\r\n\r\n    &-light {\r\n        .text-emphasis-variant(@theme-smooth-light);\r\n    }\r\n\r\n    &-lighter {\r\n        .text-emphasis-variant(@theme-smooth-lighter);\r\n    }\r\n}\r\n\r\n.bg-smooth {\r\n    .bg-variant(@theme-smooth-base);\r\n\r\n    &-op {\r\n        .bg-variant(fade(@theme-smooth-base, 75%));\r\n    }\r\n\r\n    &-dark {\r\n        .bg-variant(@theme-smooth-dark);\r\n    }\r\n\r\n    &-dark-op {\r\n        .bg-variant(fade(@theme-smooth-dark, 83%));\r\n    }\r\n\r\n    &-darker {\r\n        .bg-variant(@theme-smooth-darker);\r\n    }\r\n\r\n    &-light {\r\n        .bg-variant(@theme-smooth-light);\r\n    }\r\n\r\n    &-lighter {\r\n        .bg-variant(@theme-smooth-lighter);\r\n    }\r\n}"
  },
  {
    "path": "webservice/lalascan_web/app/static/less/modules/oneui.utilities.less",
    "content": "//\r\n// Utilities\r\n// --------------------------------------------------\r\n\r\n// Layout\r\n.push-5 {\r\n    .push-generate(5px);\r\n}\r\n\r\n.push-10 {\r\n    .push-generate(10px);\r\n}\r\n\r\n.push-15 {\r\n    .push-generate(15px);\r\n}\r\n\r\n.push-20 {\r\n    .push-generate(20px);\r\n}\r\n\r\n.push-30 {\r\n    .push-generate(30px);\r\n}\r\n\r\n.push-50 {\r\n    .push-generate(50px);\r\n}\r\n\r\n.push-100 {\r\n    .push-generate(100px);\r\n}\r\n\r\n.push-150 {\r\n    .push-generate(150px);\r\n}\r\n\r\n.pulldown {\r\n    position: relative;\r\n    top: 50px;\r\n\r\n    @media screen and (min-width: @screen-md-min) {\r\n        top: 150px;\r\n    }\r\n}\r\n\r\n.remove-margin {\r\n    margin: 0 !important;\r\n\r\n    &-t { margin-top: 0 !important; }\r\n    &-r { margin-right: 0 !important; }\r\n    &-b { margin-bottom: 0 !important; }\r\n    &-l { margin-left: 0 !important; }\r\n}\r\n\r\n.remove-padding {\r\n    padding: 0 !important;\r\n\r\n    &-t { padding-top: 0 !important; }\r\n    &-r { padding-right: 0 !important; }\r\n    &-b { padding-bottom: 0 !important; }\r\n    &-l { padding-left: 0 !important; }\r\n}\r\n\r\n// Vertical center align\r\n.align-v {\r\n    .vertical-align();\r\n\r\n    &&-fwidth {\r\n        width: 100%;\r\n    }\r\n}\r\n\r\n// Border\r\n.border {\r\n    border: 1px solid #e9e9e9;\r\n\r\n    &-t { border-top: 1px solid #e9e9e9; }\r\n    &-r { border-right: 1px solid #e9e9e9; }\r\n    &-b { border-bottom: 1px solid #e9e9e9; }\r\n    &-l { border-left: 1px solid #e9e9e9; }\r\n}\r\n\r\n.border-white-op {\r\n    border: 1px solid rgba(255,255,255,.1);\r\n\r\n    &-t { border-top: 1px solid rgba(255,255,255,.1); }\r\n    &-r { border-right: 1px solid rgba(255,255,255,.1); }\r\n    &-b { border-bottom: 1px solid rgba(255,255,255,.1); }\r\n    &-l { border-left: 1px solid rgba(255,255,255,.1); }\r\n}\r\n\r\n.border-black-op {\r\n    border: 1px solid rgba(0,0,0,.1);\r\n\r\n    &-t { border-top: 1px solid rgba(0,0,0,.1); }\r\n    &-r { border-right: 1px solid rgba(0,0,0,.1); }\r\n    &-b { border-bottom: 1px solid rgba(0,0,0,.1); }\r\n    &-l { border-left: 1px solid rgba(0,0,0,.1); }\r\n}\r\n\r\n// Item\r\n.item {\r\n    display: inline-block;\r\n    width: 60px;\r\n    height: 60px;\r\n    text-align: center;\r\n    font-size: 28px;\r\n    font-weight: 300;\r\n    line-height: 60px;\r\n\r\n    .si:before {\r\n        position: relative;\r\n        top: 1px;\r\n    }\r\n\r\n    a& {\r\n        &:hover,\r\n        &:focus {\r\n            opacity: .6;\r\n        }\r\n    }\r\n\r\n    &&-circle {\r\n        border-radius: 50%;\r\n    }\r\n\r\n    &&-rounded {\r\n        border-radius: 3px;\r\n    }\r\n\r\n    &&-rounded-big {\r\n        border-radius: 24px;\r\n\r\n        &.item-2x {\r\n            border-radius: 35px;\r\n        }\r\n    }\r\n\r\n    &.item-2x {\r\n        width: 100px;\r\n        height: 100px;\r\n        line-height: 100px;\r\n\r\n        .si:before {\r\n            position: relative;\r\n            top: 3px;\r\n        }\r\n    }\r\n}\r\n\r\n// Helpers\r\n.overflow-hidden {\r\n    overflow: hidden;\r\n}\r\n\r\n.visibility-hidden {\r\n    visibility: hidden;\r\n}"
  },
  {
    "path": "webservice/lalascan_web/app/static/less/themes/amethyst.less",
    "content": "//\n// Color Theme - Amethyst\n// --------------------------------------------------\n\n// Variables and Mixins\n@import \"../variables.less\";\n@import \"../mixins.less\";\n\n// Generate color theme\n.color-theme(@theme-amethyst-base; @theme-amethyst-light; @theme-amethyst-lighter; @theme-amethyst-dark; @theme-amethyst-darker; @theme-amethyst-body);"
  },
  {
    "path": "webservice/lalascan_web/app/static/less/themes/city.less",
    "content": "//\n// Color Theme - City\n// --------------------------------------------------\n\n// Variables and Mixins\n@import \"../variables.less\";\n@import \"../mixins.less\";\n\n// Generate color theme\n.color-theme(@theme-city-base; @theme-city-light; @theme-city-lighter; @theme-city-dark; @theme-city-darker; @theme-city-body);"
  },
  {
    "path": "webservice/lalascan_web/app/static/less/themes/flat.less",
    "content": "//\n// Color Theme - Flat\n// --------------------------------------------------\n\n// Variables and Mixins\n@import \"../variables.less\";\n@import \"../mixins.less\";\n\n// Generate color theme\n.color-theme(@theme-flat-base; @theme-flat-light; @theme-flat-lighter; @theme-flat-dark; @theme-flat-darker; @theme-flat-body);"
  },
  {
    "path": "webservice/lalascan_web/app/static/less/themes/modern.less",
    "content": "//\n// Color Theme - Modern\n// --------------------------------------------------\n\n// Variables and Mixins\n@import \"../variables.less\";\n@import \"../mixins.less\";\n\n// Generate color theme\n.color-theme(@theme-modern-base; @theme-modern-light; @theme-modern-lighter; @theme-modern-dark; @theme-modern-darker; @theme-modern-body);"
  },
  {
    "path": "webservice/lalascan_web/app/static/less/themes/smooth.less",
    "content": "//\n// Color Theme - Smooth\n// --------------------------------------------------\n\n// Variables and Mixins\n@import \"../variables.less\";\n@import \"../mixins.less\";\n\n// Generate color theme\n.color-theme(@theme-smooth-base; @theme-smooth-light; @theme-smooth-lighter; @theme-smooth-dark; @theme-smooth-darker; @theme-smooth-body);"
  },
  {
    "path": "webservice/lalascan_web/app/static/less/variables.less",
    "content": "//\r\n// Variables\r\n// --------------------------------------------------\r\n\r\n// Colors Base\r\n@brand-base:                #5c90d2;\r\n@brand-light:               lighten(@brand-base, 15%);\r\n@brand-lighter:             lighten(@brand-base, 28%);\r\n@brand-dark:                #3e4a59;\r\n@brand-darker:              #2c343f;\r\n\r\n@brand-primary:             @brand-base;\r\n@brand-success:             #46c37b;\r\n@brand-info:                #70b9eb;\r\n@brand-warning:             #f3b760;\r\n@brand-danger:              #d26a5c;\r\n\r\n@brand-success-light:       #e0f5e9;\r\n@brand-info-light:          #edf6fd;\r\n@brand-warning-light:       #fdf3e5;\r\n@brand-danger-light:        #f9eae8;\r\n\r\n@gray-base:                 #c9c9c9;\r\n@gray-dark:                 #999999;\r\n@gray-darker:               #393939;\r\n@gray-light:                #f3f3f3;\r\n@gray-lighter:              #f9f9f9;\r\n\r\n// Scaffolding\r\n@body-bg:                   #f5f5f5;\r\n@text-color:                #646464;\r\n@text-color-dark:           #545454;\r\n@link-color:                @brand-primary;\r\n@link-hover-color:          darken(@link-color, 15%);\r\n@link-hover-decoration:     none;\r\n@focus-style:               2px dotted #5c99db;\r\n\r\n// Color Themes\r\n@theme-amethyst-base:       #a48ad4;\r\n@theme-amethyst-light:      lighten(@theme-amethyst-base, 12%);\r\n@theme-amethyst-lighter:    lighten(@theme-amethyst-base, 22%);\r\n@theme-amethyst-dark:       #4f546b;\r\n@theme-amethyst-darker:     #353847;\r\n@theme-amethyst-body:       #f6f5f7;\r\n\r\n@theme-city-base:           #ff6b6b;\r\n@theme-city-light:          lighten(@theme-city-base, 7%);\r\n@theme-city-lighter:        lighten(@theme-city-base, 15%);\r\n@theme-city-dark:           #555;\r\n@theme-city-darker:         #333;\r\n@theme-city-body:           @body-bg;\r\n\r\n@theme-flat-base:           #44b4a6;\r\n@theme-flat-light:          lighten(@theme-flat-base, 18%);\r\n@theme-flat-lighter:        lighten(@theme-flat-base, 28%);\r\n@theme-flat-dark:           #3f5259;\r\n@theme-flat-darker:         #242f33;\r\n@theme-flat-body:           #f5f7f7;\r\n\r\n@theme-modern-base:         #14adc4;\r\n@theme-modern-light:        lighten(@theme-modern-base, 30%);\r\n@theme-modern-lighter:      lighten(@theme-modern-base, 45%);\r\n@theme-modern-dark:         #3e4d52;\r\n@theme-modern-darker:       #323e42;\r\n@theme-modern-body:         #f5f6f7;\r\n\r\n@theme-smooth-base:         #ff6c9d;\r\n@theme-smooth-light:        lighten(@theme-smooth-base, 7%);\r\n@theme-smooth-lighter:      lighten(@theme-smooth-base, 15%);\r\n@theme-smooth-dark:         #4a5568;\r\n@theme-smooth-darker:       #333a47;\r\n@theme-smooth-body:         #f7f5f6;\r\n\r\n// Typography\r\n@font-family-base:          \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\r\n@font-size-base:            14px;\r\n@font-size-h1:              36px;\r\n@font-size-h2:              30px;\r\n@font-size-h3:              24px;\r\n@font-size-h4:              20px;\r\n@font-size-h5:              16px;\r\n@font-size-h6:              14px;\r\n\r\n@headings-font-family:      \"Source Sans Pro\", \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\r\n@headings-font-weight:      600;\r\n@headings-line-height:      1.2;\r\n@headings-color:            inherit;\r\n@headings-small-color:      @gray-dark;\r\n\r\n@line-height-base:          1.6;\r\n\r\n// Layout Spaces\r\n@space-base:                30px;           // Content padding\r\n@space-grid-base:           6px;            // Content grid padding 2, 4, 6.. etc\r\n@space-block:               20px;           // Block padding\r\n@space-side-content:        @space-block;   // Side Content padding\r\n@space-width-boxed:         1280px;         // Boxed content max width\r\n@space-width-narrow:        95%;            // Narrow content max width\r\n\r\n// Header\r\n@header-height:             60px;           // Best values > 40px and < 70px\r\n\r\n// Sidebar and Side Overlay\r\n@sidebar-width:             230px;\r\n@sidebar-width-mini:        60px;\r\n@side-overlay-width:        320px;\r\n@side-transition:           .28s ease-out;\r\n\r\n// Forms\r\n@form-border-color:         #e6e6e6;\r\n@form-border-focus-color:   #ccc;\r\n@form-bg-focus-color:       #fcfcfc;\r\n\r\n// Media queries breakpoints\r\n@screen-xs-min:             480px;\r\n@screen-sm-min:             768px;\r\n@screen-md-min:             992px;\r\n@screen-lg-min:             1200px;\r\n@screen-xs-max:             (@screen-sm-min - 1);\r\n@screen-sm-max:             (@screen-md-min - 1);\r\n@screen-md-max:             (@screen-lg-min - 1);"
  },
  {
    "path": "webservice/lalascan_web/app/templates/add_leakinfo.html",
    "content": "{% extends \"base.html\" %}\n{% block content %}\n\n<script>\n\n    function test(){\n        return true;\n    }\n</script>\n\n<!-- Main Container -->\n<main id=\"main-container\">\n    <!-- Page Header -->\n    <div class=\"content bg-gray-lighter\">\n        <div class=\"row items-push\">\n            <div class=\"col-sm-8\">\n                <h1 class=\"page-heading\">\n                    添加新漏洞插件类型\n                </h1>\n            </div>\n            <div class=\"col-sm-4 text-right hidden-xs\">\n                <ol class=\"breadcrumb push-10-t\">\n                    <li>首页</li>\n                    <li><a class=\"link-effect\" href=\"/webscan/leakinfo\">漏洞类型分布</a></li>\n                </ol>\n            </div>\n        </div>\n    </div>\n    <!-- END Page Header -->\n\n    <!-- Page Content -->\n    <div class=\"content content-narrow\">\n        <div class=\"panel-group\">\n            <div class=\"panel panel-default\">\n                <div class=\"panel-heading\">\n                    <h3 class=\"panel-title\">\n                        <a class=\"accordion-toggle\" data-toggle=\"collapse\" data-parent=\"#faq4\" href=\"#faq4_q1\"><i class=\"si si-list\"></i> 填写漏洞大类规则</a>\n                    </h3>\n                </div>\n                <div id=\"faq4_q1\" class=\"panel-collapse collapse in\">\n                    <div class=\"panel-body\">\n                        <form class=\"form-horizontal push-10-t\" action=\"/webscan/leak_add\" method=\"post\" onsubmit=\"return test();\">\n                            <h2 class=\"content-heading\">基本规则配置</h2>\n                            <div class=\"block\">\n                                <div class=\"block-content block-content-full\">\n                                    <div class=\"row js-animation-section\">\n\n                                        <div class=\"form-group\">\n                                            <div class=\"col-xs-6 col-sm-4\">\n                                                <div class=\"form-material form-material-primary\">\n                                                    <input class=\"form-control\" type=\"text\" id=\"faq-contact-firstname\" name=\"leak_name_cn\" placeholder=\"eg SQL注入\">\n                                                    <label for=\"faq-contact-firstname\">漏洞分类名称(中文)</label>\n                                                </div>\n                                            </div>\n                                            <div class=\"col-xs-6 col-sm-4\">\n                                                <div class=\"form-material form-material-primary\">\n                                                    <input class=\"form-control\" type=\"text\" id=\"faq-contact-lastname\" name=\"leak_name\" placeholder=\"eg sqli\">\n                                                    <label for=\"faq-contact-lastname\">漏洞插件类名</label>\n                                                </div>\n                                            </div>\n                                        </div>\n\n                                        <div class=\"form-group\">\n                                            <div class=\"col-sm-4\">\n                                                <div class=\"form-material form-material-primary\">\n                                                    <select class=\"form-control\" id=\"faq-contact-subject\" name=\"spt\" size=\"1\">\n                                                        {%for plugin_info in plugin_type %}\n                                                            <option value=\"{{plugin_info.id}}\">{{ plugin_info.name }}</option>\n                                                        {% endfor %}\n                                                    </select>\n                                                    <label for=\"faq-contact-subject\">插件归属类型</label>\n                                                </div>\n                                            </div>\n                                        </div>\n\n                                        <div class=\"form-group\">\n                                            <div class=\"col-xs-4\">\n                                                <label for=\"mega-skills\">风险等级</label>\n                                                <select class=\"form-control\" id=\"mega-skills\" name=\"risk_level\" size=\"4\" multiple>\n                                                    <option value=\"4\">高危</option>\n                                                    <option value=\"3\">中危</option>\n                                                    <option value=\"2\">低危</option>\n                                                    <option value=\"1\">提示</option>\n                                                </select>\n                                            </div>\n                                        </div>\n\n                                        <div class=\"form-group\">\n                                            <div class=\"col-xs-12\">\n                                                <div class=\"form-material form-material-primary\">\n                                                    <textarea class=\"form-control\" id=\"faq-contact-msg\" name=\"description\" rows=\"7\" placeholder=\"恶意用户可以利用该漏洞执行任意SQL语句,可以造成如下危害：未经过授权操作数据库中的数据,恶意...\"></textarea>\n                                                    <label for=\"faq-contact-msg\">漏洞描述</label>\n                                                </div>\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n\n\n                            <div class=\"form-group remove-margin-b\">\n                                <div class=\"col-xs-12\">\n                                    <button class=\"btn btn-sm btn-primary\" type=\"submit\"><i class=\"si si-action-redo push-5-r\"></i> 立即添加</button>\n                                </div>\n                            </div>\n                        </form>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n    <!-- END Page Content -->\n</main>\n<!-- END Main Container -->\n\n{% endblock %}"
  },
  {
    "path": "webservice/lalascan_web/app/templates/add_task.html",
    "content": "{% extends \"base.html\" %}\n{% block content %}\n\n<!-- Main Container -->\n<main id=\"main-container\">\n    <!-- Page Header -->\n    <div class=\"content bg-gray-lighter\">\n        <div class=\"row items-push\">\n            <div class=\"col-sm-8\">\n                <h1 class=\"page-heading\">\n                    添加新扫描任务\n                </h1>\n            </div>\n            <div class=\"col-sm-4 text-right hidden-xs\">\n                <ol class=\"breadcrumb push-10-t\">\n                    <li>首页</li>\n                    <li><a class=\"link-effect\" href=\"\">Animations</a></li>\n                </ol>\n            </div>\n        </div>\n    </div>\n    <!-- END Page Header -->\n\n    <!-- Page Content -->\n    <div class=\"content content-narrow\">\n        <div class=\"panel-group\">\n            <div class=\"panel panel-default\">\n                <div class=\"panel-heading\">\n                    <h3 class=\"panel-title\">\n                        <a class=\"accordion-toggle\" data-toggle=\"collapse\" data-parent=\"#faq4\" href=\"#faq4_q1\"><i class=\"si si-list\"></i> 设置参数并添加任务</a>\n                    </h3>\n                </div>\n                <div id=\"faq4_q1\" class=\"panel-collapse collapse in\">\n                    <div class=\"panel-body\">\n                        <form class=\"form-horizontal push-10-t\" action=\"base_pages_faq.html\" method=\"post\" onsubmit=\"return false;\">\n                            <h2 class=\"content-heading\">基本扫描配置</h2>\n                            <div class=\"block\">\n                                <div class=\"block-content block-content-full\">\n                                    <div class=\"row js-animation-section\">\n\n                                        <div class=\"form-group\">\n                                            <div class=\"col-xs-8 col-sm-10\">\n                                                <div class=\"form-material form-material-primary\">\n                                                    <label for=\"faq-contact-firstname\">扫描模式</label>\n                                                </div>\n                                                <label class=\"css-input css-radio css-radio-warning push-10-r\">\n                                                    <input type=\"radio\" name=\"mega-gender-group\" checked = \"checked\"><span></span>域名爬扫\n                                                </label>\n                                                <label class=\"css-input css-radio css-radio-warning\">\n                                                    <input type=\"radio\" name=\"mega-gender-group\"><span></span>单CGI扫描\n                                                </label>\n                                            </div>\n                                        </div>\n\n                                        <div class=\"form-group\">\n                                            <div class=\"col-xs-8 col-sm-7\">\n                                                <div class=\"form-material form-material-primary\">\n                                                    <input class=\"form-control\" type=\"text\" id=\"faq-contact-firstname\" name=\"faq-contact-firstname\" placeholder=\"请输入网址，例如http://www.baidu.com\">\n                                                    <label for=\"faq-contact-firstname\">扫描入口</label>\n                                                </div>\n                                            </div>\n                                            <div class=\"col-xs-8 col-sm-5\">\n                                                <div class=\"form-material form-material-primary\">\n                                                    <input class=\"form-control\" type=\"text\" id=\"\" name=\"faq-contact-firstname\" placeholder=\"\">\n                                                    <label for=\"faq-contact-firstname\">POST值:</label>\n                                                </div>\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n\n                            <div class=\"form-group\">\n                                <div class=\"col-sm-8 col-md-11\">\n                                    <h2 class=\"content-heading\">扫描插件</h2>\n                                        <!-- Block Tabs Justified Default Style -->\n                                        <div class=\"row form-material form-material-primary\">\n                                            <ul class=\"nav nav-tabs nav-justified\" data-toggle=\"tabs\">\n                                                <li class=\"active\">\n                                                    <a href=\"#btabs-static-justified-home\"><i class=\"fa fa-home\"></i> 通用常见漏洞</a>\n                                                </li>\n                                                <li>\n                                                    <a href=\"#btabs-static-justified-profile\"><i class=\"fa fa-pencil\"></i> WebApps应用程序漏洞</a>\n                                                </li>\n                                                <li>\n                                                    <a href=\"#btabs-static-justified-settings\"><i class=\"fa fa-cog\"></i> 系统中间件漏洞</a>\n                                                </li>\n                                                <li>\n                                                    <a href=\"#btabs-static-justified-settings\"><i class=\"fa fa-cog\"></i> 子域名收集</a>\n                                                </li>\n                                            </ul>\n                                            <div class=\"block-content tab-content\">\n                                                <div class=\"tab-pane active\" id=\"btabs-static-justified-home\">\n                                                    <h4 class=\"font-w300 push-15\">常见漏洞插件</h4>\n                                                        <div class=\"block\">\n                                                            <div class=\"block-content\">\n                                                                <!-- If you put a checkbox in thead section, it will automatically toggle all tbody section checkboxes -->\n                                                                <table class=\"js-table-checkable table table-hover\">\n                                                                    <thead>\n                                                                        <tr>\n                                                                            <th class=\"text-center\" style=\"width: 70px;\">\n                                                                                <label class=\"css-input css-checkbox css-checkbox-primary remove-margin-t remove-margin-b\">\n                                                                                    <input type=\"checkbox\" id=\"check-all\" name=\"check-all\"><span></span>全选/反选\n                                                                                </label>\n                                                                            </th>\n                                                                            <th>插件名</th>\n                                                                            <th class=\"hidden-xs\" style=\"width: 12%;\">插件作者</th>\n                                                                            <th class=\"hidden-xs\" style=\"width: 15%;\">漏洞危害</th>\n                                                                        </tr>\n                                                                    </thead>\n                                                                    <tbody>\n                                                                        <tr>\n                                                                            <td class=\"text-center\">\n                                                                                <label class=\"css-input css-checkbox css-checkbox-primary\">\n                                                                                    <input type=\"checkbox\" id=\"row_1\" name=\"row_1\"><span></span>\n                                                                                </label>\n                                                                            </td>\n                                                                            <td>\n                                                                                <p class=\"font-w600 push-10\">SQL注入</p>\n                                                                                <p class=\"text-muted remove-margin-b\">Customer details and further information</p>\n                                                                            </td>\n                                                                            <td class=\"hidden-xs\">\n                                                                                <span class=\"label label-info\">admin</span>\n                                                                            </td>\n                                                                            <td class=\"hidden-xs\">\n                                                                                <em class=\"text-muted\">June 4, 2015 12:16</em>\n                                                                            </td>\n                                                                        </tr>\n                                                                        <tr>\n                                                                            <td class=\"text-center\">\n                                                                                <label class=\"css-input css-checkbox css-checkbox-primary\">\n                                                                                    <input type=\"checkbox\" id=\"row_3\" name=\"row_3\"><span></span>\n                                                                                </label>\n                                                                            </td>\n                                                                            <td>\n                                                                                <p class=\"font-w600 push-10\">反射XSS</p>\n                                                                                <p class=\"text-muted remove-margin-b\">Customer details and further information</p>\n                                                                            </td>\n                                                                            <td class=\"hidden-xs\">\n                                                                                <span class=\"label label-warning\">admin</span>\n                                                                            </td>\n                                                                            <td class=\"hidden-xs\">\n                                                                                <em class=\"text-muted\">June 6, 2015 12:16</em>\n                                                                            </td>\n                                                                        </tr>\n                                                                        <tr>\n                                                                            <td class=\"text-center\">\n                                                                                <label class=\"css-input css-checkbox css-checkbox-primary\">\n                                                                                    <input type=\"checkbox\" id=\"row_4\" name=\"row_4\"><span></span>\n                                                                                </label>\n                                                                            </td>\n                                                                            <td>\n                                                                                <p class=\"font-w600 push-10\">DOM-XSS</p>\n                                                                                <p class=\"text-muted remove-margin-b\">Customer details and further information</p>\n                                                                            </td>\n                                                                            <td class=\"hidden-xs\">\n                                                                                <span class=\"label label-info\">admin</span>\n                                                                            </td>\n                                                                            <td class=\"hidden-xs\">\n                                                                                <em class=\"text-muted\">June 5, 2015 12:16</em>\n                                                                            </td>\n                                                                        </tr>\n                                                                    </tbody>\n                                                                </table>\n                                                            </div>\n                                                        </div>\n                                                        <!-- END Checkable Table -->\n                                                    </div>\n                                                <div class=\"tab-pane\" id=\"btabs-static-justified-profile\">\n                                                    <h4 class=\"font-w300 push-15\">Profile Tab</h4>\n                                                    <p>...</p>\n                                                </div>\n                                                <div class=\"tab-pane\" id=\"btabs-static-justified-settings\">\n                                                    <h4 class=\"font-w300 push-15\">Settings Tab</h4>\n                                                    <p>...</p>\n                                                </div>\n                                            </div>\n                                        <!-- END Block Tabs Justified Alternative Style -->\n                                        </div>\n                                    <!-- END Justified Tabs -->\n                                </div>\n                            </div>\n\n                            <h2 class=\"content-heading\">高级扫描配置</h2>\n                            <div class=\"block\">\n                                <div class=\"block-content block-content-full\">\n                                    <div class=\"row js-animation-section\">\n                                        <div class=\"form-group\">\n                                            <div class=\"col-xs-8 col-sm-3\">\n                                                <div class=\"form-material form-material-primary\">\n                                                    <input class=\"form-control\" type=\"text\" id=\"faq-contact-firstname\" name=\"faq-contact-firstname\" placeholder=\"\">\n                                                    <label for=\"faq-contact-firstname\">扫描速率</label>\n                                                </div>\n                                            </div>\n                                            <div class=\"col-xs-8 col-sm-3\">\n                                                <div class=\"form-material form-material-primary\">\n                                                    <input class=\"form-control\" type=\"text\" name=\"faq-contact-firstname\" placeholder=\"\">\n                                                    <label for=\"faq-contact-firstname\">端口扫描:</label>\n                                                </div>\n                                            </div>\n                                            <div class=\"col-xs-8 col-sm-3\">\n                                                <div class=\"form-material form-material-primary\">\n                                                    <input class=\"form-control\" type=\"text\" name=\"faq-contact-firstname\" placeholder=\"\">\n                                                    <label for=\"faq-contact-firstname\">任务超时:</label>\n                                                </div>\n                                            </div>\n                                        </div>\n\n                                        <div class=\"form-group\">\n                                            <div class=\"col-xs-8 col-sm-11\">\n                                                <div class=\"form-material form-material-primary\">\n                                                    <input class=\"form-control\" type=\"text\" name=\"faq-contact-firstname\" placeholder=\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36\">\n                                                    <label for=\"faq-contact-firstname\">扫描签名</label>\n                                                </div>\n                                            </div>\n                                        </div>\n\n                                        <div class=\"form-group\">\n                                            <div class=\"col-xs-12\">\n                                                <div class=\"form-material form-material-primary\">\n                                                    <textarea class=\"form-control\" id=\"faq-contact-msg\" name=\"faq-contact-msg\" rows=\"7\" placeholder=\"uin=27295; login_name=scanner; skey=9c3346b0a3c5e8; loidcreated=2015-03-30\"></textarea>\n                                                    <label for=\"faq-contact-msg\">网站Cookie</label>\n                                                </div>\n                                            </div>\n                                        </div>\n\n                                    </div>\n                                </div>\n                            </div>\n\n                            <div class=\"form-group remove-margin-b\">\n                                <div class=\"col-xs-12\">\n                                    <button class=\"btn btn-sm btn-primary\" type=\"submit\"><i class=\"fa fa-send push-5-r\"></i> 立即添加</button>\n                                </div>\n                            </div>\n                        </form>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n    <!-- END Page Content -->\n</main>\n<!-- END Main Container -->\n\n{% endblock %}"
  },
  {
    "path": "webservice/lalascan_web/app/templates/base.html",
    "content": "<!DOCTYPE html>\n<!--[if IE 9]>         <html class=\"ie9 no-focus\"> <![endif]-->\n<!--[if gt IE 9]><!--> <html class=\"no-focus\"> <!--<![endif]-->\n    <head>\n        <meta charset=\"utf-8\">\n\n        <title>Lalascan云安全平台</title>\n\n        <meta name=\"description\" content=\"OneUI - Admin Dashboard Template & UI Framework created by pixelcave and published on Themeforest\">\n        <meta name=\"author\" content=\"pixelcave\">\n        <meta name=\"robots\" content=\"noindex, nofollow\">\n        <meta name=\"viewport\" content=\"width=device-width,initial-scale=1,maximum-scale=1.0\">\n\n        <!-- Icons -->\n        <!-- The following icons can be replaced with your own, they are used by desktop and mobile browsers -->\n        <link rel=\"shortcut icon\" href=\"/static/img/favicons/favicon.png\">\n\n        <link rel=\"icon\" type=\"image/png\" href=\"/static/img/favicons/favicon-16x16.png\" sizes=\"16x16\">\n        <link rel=\"icon\" type=\"image/png\" href=\"/static/img/favicons/favicon-32x32.png\" sizes=\"32x32\">\n        <link rel=\"icon\" type=\"image/png\" href=\"/static/img/favicons/favicon-96x96.png\" sizes=\"96x96\">\n        <link rel=\"icon\" type=\"image/png\" href=\"/static/img/favicons/favicon-160x160.png\" sizes=\"160x160\">\n        <link rel=\"icon\" type=\"image/png\" href=\"/static/img/favicons/favicon-192x192.png\" sizes=\"192x192\">\n\n        <link rel=\"apple-touch-icon\" sizes=\"57x57\" href=\"/static/img/favicons/apple-touch-icon-57x57.png\">\n        <link rel=\"apple-touch-icon\" sizes=\"60x60\" href=\"/static/img/favicons/apple-touch-icon-60x60.png\">\n        <link rel=\"apple-touch-icon\" sizes=\"72x72\" href=\"/static/img/favicons/apple-touch-icon-72x72.png\">\n        <link rel=\"apple-touch-icon\" sizes=\"76x76\" href=\"/static/img/favicons/apple-touch-icon-76x76.png\">\n        <link rel=\"apple-touch-icon\" sizes=\"114x114\" href=\"/static/img/favicons/apple-touch-icon-114x114.png\">\n        <link rel=\"apple-touch-icon\" sizes=\"120x120\" href=\"/static/img/favicons/apple-touch-icon-120x120.png\">\n        <link rel=\"apple-touch-icon\" sizes=\"144x144\" href=\"/static/img/favicons/apple-touch-icon-144x144.png\">\n        <link rel=\"apple-touch-icon\" sizes=\"152x152\" href=\"/static/img/favicons/apple-touch-icon-152x152.png\">\n        <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"/static/img/favicons/apple-touch-icon-180x180.png\">\n        <!-- END Icons -->\n\n        <!-- Stylesheets -->\n        <!-- Web fonts -->\n        <link rel=\"stylesheet\" href=\"http://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400italic,600,700%7COpen+Sans:300,400,400italic,600,700\">\n\n        <script src=\"http://code.jquery.com/jquery-1.8.3.min.js\"></script>\n        <!-- OneUI CSS framework -->\n        <link rel=\"stylesheet\" id=\"css-main\" href=\"/static/css/oneui.css\">\n\n        <!-- You can include a specific file from css/themes/ folder to alter the default color theme of the template. eg: -->\n        <!-- <link rel=\"stylesheet\" id=\"css-theme\" href=\"/static/css/themes/flat.min.css\"> -->\n        <!-- END Stylesheets -->\n        <script type=text/javascript>\n            $SCRIPT_ROOT = {{ request.script_root|tojson|safe }};\n        </script>\n    </head>\n    <body>\n        <!-- Page Container -->\n        <!--\n            Available Classes:\n\n            'sidebar-l'                  Left Sidebar and right Side Overlay\n            'sidebar-r'                  Right Sidebar and left Side Overlay\n            'sidebar-mini'               Mini hoverable Sidebar (> 991px)\n            'sidebar-o'                  Visible Sidebar by default (> 991px)\n            'sidebar-o-xs'               Visible Sidebar by default (< 992px)\n\n            'side-overlay-hover'         Hoverable Side Overlay (> 991px)\n            'side-overlay-o'             Visible Side Overlay by default (> 991px)\n\n            'side-scroll'                Enables custom scrolling on Sidebar and Side Overlay instead of native scrolling (> 991px)\n\n            'header-navbar-fixed'        Enables fixed header\n        -->\n        <div id=\"page-container\" class=\"sidebar-l sidebar-o side-scroll header-navbar-fixed\">\n            <!-- Side Overlay-->\n            <aside id=\"side-overlay\">\n                <!-- Side Overlay Scroll Container -->\n                <div id=\"side-overlay-scroll\">\n                    <!-- Side Header -->\n                    <div class=\"side-header side-content\">\n                        <!-- Layout API, functionality initialized in App() -> uiLayoutApi() -->\n                        <button class=\"btn btn-default pull-right\" type=\"button\" data-toggle=\"layout\" data-action=\"side_overlay_close\">\n                            <i class=\"fa fa-times\"></i>\n                        </button>\n                        <span>\n                            <img class=\"img-avatar img-avatar32\" src=\"/static/img/avatars/avatar10.jpg\" alt=\"\">\n                            <span class=\"font-w600 push-10-l\">Keith Simpson</span>\n                        </span>\n                    </div>\n                    <!-- END Side Header -->\n\n                    <!-- Side Content -->\n                    <div class=\"side-content remove-padding-t\">\n\n                        fuck!!\n                    </div>\n                    <!-- END Side Content -->\n                </div>\n                <!-- END Side Overlay Scroll Container -->\n            </aside>\n            <!-- END Side Overlay -->\n\n            <!-- Sidebar -->\n            <nav id=\"sidebar\">\n                <!-- Sidebar Scroll Container -->\n                <div id=\"sidebar-scroll\">\n                    <!-- Sidebar Content -->\n                    <!-- Adding .sidebar-mini-hide to an element will hide it when the sidebar is in mini mode -->\n                    <div class=\"sidebar-content\">\n                        <!-- Side Header -->\n                        <div class=\"side-header side-content bg-white-op\">\n                            <!-- Layout API, functionality initialized in App() -> uiLayoutApi() -->\n                            <button class=\"btn btn-link text-gray pull-right hidden-md hidden-lg\" type=\"button\" data-toggle=\"layout\" data-action=\"sidebar_close\">\n                                <i class=\"fa fa-times\"></i>\n                            </button>\n                            <!-- Themes functionality initialized in App() -> uiHandleTheme() -->\n                            <div class=\"btn-group pull-right\">\n                                <button class=\"btn btn-link text-gray dropdown-toggle\" data-toggle=\"dropdown\" type=\"button\">\n                                    <i class=\"si si-drop\"></i>\n                                </button>\n                                <ul class=\"dropdown-menu dropdown-menu-right font-s13 sidebar-mini-hide\">\n                                    <li>\n                                        <a data-toggle=\"theme\" data-theme=\"default\" tabindex=\"-1\" href=\"javascript:void(0)\">\n                                            <i class=\"fa fa-circle text-default pull-right\"></i> <span class=\"font-w600\">Default</span>\n                                        </a>\n                                    </li>\n                                    <li>\n                                        <a data-toggle=\"theme\" data-theme=\"/static/css/themes/amethyst.min.css\" tabindex=\"-1\" href=\"javascript:void(0)\">\n                                            <i class=\"fa fa-circle text-amethyst pull-right\"></i> <span class=\"font-w600\">Amethyst</span>\n                                        </a>\n                                    </li>\n                                    <li>\n                                        <a data-toggle=\"theme\" data-theme=\"/static/css/themes/city.min.css\" tabindex=\"-1\" href=\"javascript:void(0)\">\n                                            <i class=\"fa fa-circle text-city pull-right\"></i> <span class=\"font-w600\">City</span>\n                                        </a>\n                                    </li>\n                                    <li>\n                                        <a data-toggle=\"theme\" data-theme=\"/static/css/themes/flat.min.css\" tabindex=\"-1\" href=\"javascript:void(0)\">\n                                            <i class=\"fa fa-circle text-flat pull-right\"></i> <span class=\"font-w600\">Flat</span>\n                                        </a>\n                                    </li>\n                                    <li>\n                                        <a data-toggle=\"theme\" data-theme=\"/static/css/themes/modern.min.css\" tabindex=\"-1\" href=\"javascript:void(0)\">\n                                            <i class=\"fa fa-circle text-modern pull-right\"></i> <span class=\"font-w600\">Modern</span>\n                                        </a>\n                                    </li>\n                                    <li>\n                                        <a data-toggle=\"theme\" data-theme=\"/static/css/themes/smooth.min.css\" tabindex=\"-1\" href=\"javascript:void(0)\">\n                                            <i class=\"fa fa-circle text-smooth pull-right\"></i> <span class=\"font-w600\">Smooth</span>\n                                        </a>\n                                    </li>\n                                </ul>\n                            </div>\n                            <a class=\"h5 text-white\" href=\"index.html\">\n                                <i class=\"fa fa-circle-o-notch text-primary\"></i> <span class=\"h4 font-w600 sidebar-mini-hide\">ne</span>\n                            </a>\n                        </div>\n                        <!-- END Side Header -->\n\n                        <!-- Side Content -->\n                        <div class=\"side-content\">\n                            <ul class=\"nav-main\">\n                                <li>\n                                    <a href=\"index.html\">\n                                        <i class=\"si si-speedometer\"></i>\n                                        <span class=\"sidebar-mini-hide\">数据趋势图</span>\n                                    </a>\n                                </li>\n                                <li class=\"nav-main-heading\"><span class=\"sidebar-mini-hide\">Web漏洞扫描</span></li>\n                                <li>\n                                    <a class=\"nav-submenu\" data-toggle=\"nav-submenu\" href=\"/webscan/add_task\"><i class=\"si si-badge\"></i><span class=\"sidebar-mini-hide\">添加任务</span></a>\n                                </li>\n                                <li>\n                                    <a class=\"nav-submenu\" data-toggle=\"nav-submenu\" href=\"/webscan/scanner\"><i class=\"si si-grid\"></i><span class=\"sidebar-mini-hide\">历史扫描结果</span></a>\n                                </li>\n                                <li>\n                                    <a class=\"nav-submenu\" data-toggle=\"nav-submenu\" href=\"#\"><i class=\"si si-note\"></i><span class=\"sidebar-mini-hide\">添加插件</span></a>\n                                </li>\n                                <li>\n                                    <a class=\"nav-submenu\" data-toggle=\"nav-submenu\" href=\"#\"><i class=\"si si-grid\"></i><span class=\"sidebar-mini-hide\">策略规则</span></a>\n                                    <ul>\n                                        <li>\n                                            <a href=\"/webscan/leakinfo\">漏洞类型分布</a>\n                                        </li>\n                                        <li>\n                                            <a href=\"/webscan/policy\">策略规则列表</a>\n                                        </li>\n                                    </ul>\n                                </li>\n                                <li>\n                                    <a class=\"nav-submenu\" data-toggle=\"nav-submenu\" href=\"#\"><i class=\"si si-fire\"></i><span class=\"sidebar-mini-hide\">任务管理</span></a>\n                                </li>\n\n                                <li class=\"nav-main-heading\"><span class=\"sidebar-mini-hide\">资产管理</span></li>\n                                <li>\n                                    <a href=\"frontend_home.html\"><i class=\"si si-rocket\"></i><span class=\"sidebar-mini-hide\">端口扫描</span></a>\n                                </li>\n                            </ul>\n                        </div>\n                        <!-- END Side Content -->\n                    </div>\n                    <!-- Sidebar Content -->\n                </div>\n                <!-- END Sidebar Scroll Container -->\n            </nav>\n            <!-- END Sidebar -->\n\n            <!-- Header -->\n            <header id=\"header-navbar\" class=\"content-mini content-mini-full\">\n                <!-- Header Navigation Right -->\n                <ul class=\"nav-header pull-right\">\n                    <li>\n                        <div class=\"btn-group\">\n                            <button class=\"btn btn-default btn-image dropdown-toggle\" data-toggle=\"dropdown\" type=\"button\">\n                                <img src=\"/static/img/avatars/avatar10.jpg\" alt=\"Avatar\">\n                                <span class=\"caret\"></span>\n                            </button>\n                            <ul class=\"dropdown-menu dropdown-menu-right\">\n                                <li class=\"dropdown-header\">Profile</li>\n                                <li>\n                                    <a tabindex=\"-1\" href=\"base_pages_inbox.html\">\n                                        <i class=\"si si-envelope-open pull-right\"></i>\n                                        <span class=\"badge badge-primary pull-right\">3</span>Inbox\n                                    </a>\n                                </li>\n                                <li>\n                                    <a tabindex=\"-1\" href=\"base_pages_profile.html\">\n                                        <i class=\"si si-user pull-right\"></i>\n                                        <span class=\"badge badge-success pull-right\">1</span>Profile\n                                    </a>\n                                </li>\n                                <li>\n                                    <a tabindex=\"-1\" href=\"javascript:void(0)\">\n                                        <i class=\"si si-settings pull-right\"></i>Settings\n                                    </a>\n                                </li>\n                                <li class=\"divider\"></li>\n                                <li class=\"dropdown-header\">Actions</li>\n                                <li>\n                                    <a tabindex=\"-1\" href=\"base_pages_lock.html\">\n                                        <i class=\"si si-lock pull-right\"></i>Lock Account\n                                    </a>\n                                </li>\n                                <li>\n                                    <a tabindex=\"-1\" href=\"base_pages_login.html\">\n                                        <i class=\"si si-logout pull-right\"></i>Log out\n                                    </a>\n                                </li>\n                            </ul>\n                        </div>\n                    </li>\n                    <li>\n                        <!-- Layout API, functionality initialized in App() -> uiLayoutApi() -->\n                        <button class=\"btn btn-default\" data-toggle=\"layout\" data-action=\"side_overlay_toggle\" type=\"button\">\n                            <i class=\"fa fa-tasks\"></i>\n                        </button>\n                    </li>\n                </ul>\n                <!-- END Header Navigation Right -->\n\n                <!-- Header Navigation Left -->\n                <ul class=\"nav-header pull-left\">\n                    <li class=\"hidden-md hidden-lg\">\n                        <!-- Layout API, functionality initialized in App() -> uiLayoutApi() -->\n                        <button class=\"btn btn-default\" data-toggle=\"layout\" data-action=\"sidebar_toggle\" type=\"button\">\n                            <i class=\"fa fa-navicon\"></i>\n                        </button>\n                    </li>\n                    <li class=\"hidden-xs hidden-sm\">\n                        <!-- Layout API, functionality initialized in App() -> uiLayoutApi() -->\n                        <button class=\"btn btn-default\" data-toggle=\"layout\" data-action=\"sidebar_mini_toggle\" type=\"button\">\n                            <i class=\"fa fa-ellipsis-v\"></i>\n                        </button>\n                    </li>\n\n                    <li class=\"visible-xs\">\n                        <!-- Toggle class helper (for .js-header-search below), functionality initialized in App() -> uiToggleClass() -->\n                        <button class=\"btn btn-default\" data-toggle=\"class-toggle\" data-target=\".js-header-search\" data-class=\"header-search-xs-visible\" type=\"button\">\n                            <i class=\"fa fa-search\"></i>\n                        </button>\n                    </li>\n                    <li class=\"js-header-search header-search\">\n                        <form class=\"form-horizontal\" action=\"base_pages_search.html\" method=\"post\">\n                            <div class=\"form-material form-material-primary input-group remove-margin-t remove-margin-b\">\n                                <input class=\"form-control\" type=\"text\" id=\"base-material-text\" name=\"base-material-text\" placeholder=\"Search..\">\n                                <span class=\"input-group-addon\"><i class=\"si si-magnifier\"></i></span>\n                            </div>\n                        </form>\n                    </li>\n                </ul>\n                <!-- END Header Navigation Left -->\n            </header>\n            <!-- END Header -->\n\n            {% block content %}{% endblock %}\n\n            <!-- Footer -->\n            <footer id=\"page-footer\" class=\"content-mini content-mini-full font-s12 bg-gray-lighter clearfix\">\n                <div class=\"pull-right\">\n                    Crafted with <i class=\"fa fa-heart text-city\"></i> by <a class=\"font-w600\" href=\"http://goo.gl/vNS3I\" target=\"_blank\">pixelcave</a>\n                </div>\n                <div class=\"pull-left\">\n                    <a class=\"font-w600\" href=\"javascript:void(0)\" target=\"_blank\">OneUI 1.0</a> &copy; <span class=\"js-year-copy\"></span>\n                </div>\n            </footer>\n            <!-- END Footer -->\n        </div>\n        <!-- END Page Container -->\n\n        <!-- Apps Modal -->\n        <!-- Opens from the button in the header -->\n        <div class=\"modal fade\" id=\"apps-modal\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\n            <div class=\"modal-sm modal-dialog modal-dialog-top\">\n                <div class=\"modal-content\">\n                    <!-- Apps Block -->\n                    <div class=\"block block-themed block-transparent\">\n                        <div class=\"block-header bg-primary-dark\">\n                            <ul class=\"block-options\">\n                                <li>\n                                    <button data-dismiss=\"modal\" type=\"button\"><i class=\"si si-close\"></i></button>\n                                </li>\n                            </ul>\n                            <h3 class=\"block-title\">Apps</h3>\n                        </div>\n                        <div class=\"block-content\">\n                            <div class=\"row text-center\">\n                                <div class=\"col-xs-6\">\n                                    <a class=\"block block-rounded\" href=\"index.html\">\n                                        <div class=\"block-content text-white bg-default\">\n                                            <i class=\"si si-speedometer fa-2x\"></i>\n                                            <div class=\"font-w600 push-15-t push-15\">Backend</div>\n                                        </div>\n                                    </a>\n                                </div>\n                                <div class=\"col-xs-6\">\n                                    <a class=\"block block-rounded\" href=\"frontend_home.html\">\n                                        <div class=\"block-content text-white bg-modern\">\n                                            <i class=\"si si-rocket fa-2x\"></i>\n                                            <div class=\"font-w600 push-15-t push-15\">Frontend</div>\n                                        </div>\n                                    </a>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                    <!-- END Apps Block -->\n                </div>\n            </div>\n        </div>\n        <!-- END Apps Modal -->\n\n        <!-- OneUI Core JS: jQuery, Bootstrap, slimScroll, scrollLock, Appear, CountTo, Placeholder, Cookie and App.js -->\n        <script src=\"/static/js/core/jquery.min.js\"></script>\n        <script src=\"/static/js/core/bootstrap.min.js\"></script>\n        <script src=\"/static/js/core/jquery.slimscroll.min.js\"></script>\n        <script src=\"/static/js/core/jquery.scrollLock.min.js\"></script>\n        <script src=\"/static/js/core/jquery.appear.min.js\"></script>\n        <script src=\"/static/js/core/jquery.countTo.min.js\"></script>\n        <script src=\"/static/js/core/jquery.placeholder.min.js\"></script>\n        <script src=\"/static/js/core/js.cookie.min.js\"></script>\n        <script src=\"/static/js/app.js\"></script>\n\n        <!-- Page JS Code -->\n        <script src=\"/static/js/pages/base_comp_animations.js\"></script>\n\n        <!-- Page JS Code -->\n        <script>\n            $(function () {\n                // Init page helpers (Table Tools helper)\n                App.initHelpers('table-tools');\n            });\n        </script>\n    </body>\n</html>"
  },
  {
    "path": "webservice/lalascan_web/app/templates/detail.html",
    "content": "{% extends \"base.html\" %}\n{% block content %}\n\n<!-- Main Container -->\n<main id=\"main-container\">\n    <!-- Page Header -->\n    <div class=\"content bg-gray-lighter\">\n        <div class=\"row items-push\">\n            <div class=\"col-sm-8\">\n                <h1 class=\"page-heading\">\n                    Web漏洞扫描报告 <small>您的网站存在0个漏洞.安全风险等级：</small>\n                </h1>\n            </div>\n            <div class=\"col-sm-4 text-right hidden-xs\">\n                <ol class=\"breadcrumb push-10-t\">\n                    <li>首页</li>\n                    <li><a class=\"link-effect\" href=\"\">Animations</a></li>\n                </ol>\n            </div>\n        </div>\n    </div>\n    <!-- END Page Header -->\n\n    <!-- Page Content -->\n    <div class=\"content content-narrow\">\n        <!-- Headings -->\n        <div class=\"row\">\n            <div class=\"col-md-6\">\n                <!-- Headings Light -->\n                <div class=\"block block-bordered\">\n                    <div class=\"block-header bg-gray-lighter\">\n                        <h3 class=\"block-title\">网站基础信息</h3>\n                    </div>\n                    <div class=\"block-content\">\n                        <h6 class=\"font-w300 push\">扫描URL：</h6>\n                        <h6 class=\"font-w300 push\">网站标题：</h6>\n                        <h6 class=\"font-w300 push\">服务器IP：</h6>\n                        <h6 class=\"font-w300 push\">任务名：</h6>\n                        <h6 class=\"font-w300 push\">扫描时间：</h6>\n                        <h6 class=\"font-w300 push\">扫描进程数：</h6>\n                        <h6 class=\"font-w300 push\">安全评级：</h6>\n                    </div>\n                </div>\n                <!-- END Headings Light -->\n            </div>\n            <div class=\"col-md-6\">\n                <!-- Headings Bold -->\n                <div class=\"block\">\n                     <div class=\"block-header bg-gray-lighter\">\n                        <h3 class=\"block-title\">漏洞统计分布</h3>\n                    </div>\n                    <div class=\"block-content\">\n                        <div class=\"row items-push-2x text-center\">\n                            <div class=\"col-xs-6 col-sm-4\">\n                                <!-- Sparkline Pie 1 Container -->\n                                <span class=\"js-slc-pie1\">4,3,2,4</span>\n                                <div class=\"push-10-t\"><i class=\"fa fa-ticket text-muted\"></i> Tickets</div>\n                            </div>\n                            <div class=\"col-xs-6 col-sm-4\">\n                                <!-- Sparkline Pie 2 Container -->\n                                <span class=\"js-slc-pie2\">980,1210,1350,900</span>\n                                <div class=\"push-10-t\"><i class=\"fa fa-line-chart text-muted\"></i> Earnings</div>\n                            </div>\n                            <div class=\"col-xs-12 col-sm-4\">\n                                <!-- Sparkline Pie 3 Container -->\n                                <span class=\"js-slc-pie3\">8,11,9,8</span>\n                                <div class=\"push-10-t\"><i class=\"fa fa-suitcase text-muted\"></i> Sales</div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n                <!-- END Headings Bold -->\n            </div>\n        </div>\n        <!-- END Headings -->\n\n        <!-- Bouncing Entrances -->\n        <h2 class=\"content-heading\">Bouncing Entrances</h2>\n        <div class=\"block\">\n            <div class=\"block-content block-content-full\">\n                <div class=\"row js-animation-section\">\n                    <div class=\"col-md-6\">\n                        <h5 class=\"font-w400 push\">Active CSS classes: <code>animated <span class=\"js-animation-preview\"></span></code></h5>\n                        <div class=\"row items-push\">\n                            <div class=\"col-sm-6\">\n                                <button class=\"btn btn-block btn-default\" data-animation-class=\"bounceIn\">bounceIn</button>\n                            </div>\n                            <div class=\"col-sm-6\">\n                                <button class=\"btn btn-block btn-default\" data-animation-class=\"bounceInDown\">bounceInDown</button>\n                            </div>\n                            <div class=\"col-sm-6\">\n                                <button class=\"btn btn-block btn-default\" data-animation-class=\"bounceInLeft\">bounceInLeft</button>\n                            </div>\n                            <div class=\"col-sm-6\">\n                                <button class=\"btn btn-block btn-default\" data-animation-class=\"bounceInRight\">bounceInRight</button>\n                            </div>\n                            <div class=\"col-sm-6\">\n                                <button class=\"btn btn-block btn-default\" data-animation-class=\"bounceInUp\">bounceInUp</button>\n                            </div>\n                        </div>\n                    </div>\n                    <div class=\"col-md-4 col-md-offset-1\">\n                        <div class=\"js-animation-object\">\n                            <img class=\"center-block img-responsive\" src=\"/static/img/various/little-monster.png\" alt=\"\">\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n        <!-- END Bouncing Entrances -->\n\n\n        <div class=\"row\">\n            <div class=\"col-md-12\">\n                <!-- Headings Light -->\n                <div class=\"block block-bordered\">\n                    <div class=\"block-header bg-gray-lighter\">\n                        <h3 class=\"block-title\">网站爬虫目录</h3>\n                    </div>\n                    <div class=\"block-content\">\n                    </div>\n                </div>\n                <!-- END Headings Light -->\n            </div>\n        </div>\n        <!-- END Headings -->\n\n    </div>\n    <!-- END Page Content -->\n</main>\n<!-- END Main Container -->\n\n{% endblock %}"
  },
  {
    "path": "webservice/lalascan_web/app/templates/leakinfo.html",
    "content": "{% extends \"base.html\" %}\n{% block content %}\n\n<script>\n    function del_leakinfo(leak_id){\n        $.getJSON('/webscan/del_leakinfo', {\n            leak_id : leak_id\n        }, function(data){\n            if (data.status == 100){\n                top.location.reload();\n            }\n        })\n    }\n\n</script>\n\n<!-- Main Container -->\n<main id=\"main-container\">\n    <!-- Page Header -->\n    <div class=\"content bg-gray-lighter\">\n        <div class=\"row items-push\">\n            <div class=\"col-sm-7\">\n                <h1 class=\"page-heading\">\n                    漏洞类型分布 <small></small>\n                </h1>\n            </div>\n            <div class=\"col-sm-5 text-right hidden-xs\">\n                <ol class=\"breadcrumb push-10-t\">\n                    <li>首页</li>\n                    <li><a class=\"link-effect\" href=\"\">Search Results</a></li>\n                </ol>\n            </div>\n        </div>\n    </div>\n    <!-- END Page Header -->\n\n    <!-- Partial Table -->\n    <div class=\"block\">\n        <div class=\"block-header\">\n            <h3 class=\"block-title\"></h3>\n            <div class=\"block-options\">\n                <button class=\"btn btn-sm btn-success\" type=\"submit\" onclick=\"location='/webscan/add_leakinfo'\"><i class=\"si si-arrow-right\"></i> 新增漏洞类型</button>\n            </div>\n        </div>\n\n\n        <div class=\"block-content\">\n            <table class=\"table table-striped table-vcenter\">\n                <thead>\n                    <tr>\n                        <th class=\"hidden-xs\" style=\"width: 5%;\">ID</th>\n                        <th class=\"hidden-xs\" style=\"width: 10%;\">漏洞插件</th>\n                        <th class=\"text-center\" style=\"width: 10%;\">漏洞名</th>\n                        <th class=\"hidden-xs\" style=\"width: 10px\">归属类型</th>\n                        <th class=\"hidden-xs\" style=\"width: 10px\">漏洞描述</th>\n                        <th class=\"hidden-xs\" style=\"width: 10px\">风险等级</th>\n                        <th class=\"hidden-xs\" style=\"width: 5px;\">操作</th>\n                    </tr>\n                </thead>\n                <tbody>\n                    {%for leak in leakinfo %}\n                    <tr>\n                        <td class=\"font-w600\">{{ leak.id }}</td>\n                        <td class=\"hidden-xs\">{{ leak.leak_name }}</td>\n                        <td class=\"hidden-xs hidden-sm\">{{ leak.leak_name_cn }}</td>\n                        <td class=\"hidden-xs hidden-sm\">{{ leak.plugin_type }}</td>\n                        <td class=\"hidden-xs hidden-sm\">{{ leak.description | truncate(50, True) }}</td>\n                        <td class=\"hidden-xs hidden-sm\">\n                            {% if leak.risk_level and leak.risk_level == 4 %}\n                                <span class=\"label label-danger\">高危</span>\n                            {% elif leak.risk_level == 3 %}\n                                <span class=\"label label-warning\">中危</span>\n                            {% elif leak.risk_level == 2 %}\n                                <span class=\"label label-primary\">低危</span>\n                            {% elif leak.risk_level == 1 %}\n                                <span class=\"label label label-success\">提示</span>\n                            {% endif %}\n                        </td>\n                        <td class=\"hidden-xs\">\n                            <div class=\"btn-group\">\n                                <button class=\"btn btn-xs btn-default\" type=\"button\" data-toggle=\"tooltip\" title=\"分类编辑\"><i class=\"fa fa-pencil\"></i></button>\n                                <button class=\"btn btn-xs btn-default\" type=\"button\" data-toggle=\"modal\" data-target=\"#modal-fadein_{{leak.id}}\" data-toggle=\"tooltip\" title=\"删除类型\"><i class=\"fa fa-times\"></i></button>\n                            </div>\n                        </td>\n\n                        <!-- Fade In Modal -->\n                        <div class=\"modal fade\" id=\"modal-fadein_{{leak.id}}\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\n                            <div class=\"modal-dialog\">\n                                <div class=\"modal-content\">\n                                    <div class=\"block block-themed block-transparent remove-margin-b\">\n                                        <div class=\"block-header bg-primary-dark\">\n                                            <ul class=\"block-options\">\n                                                <li>\n                                                    <button data-dismiss=\"modal\" type=\"button\"><i class=\"si si-close\"></i></button>\n                                                </li>\n                                            </ul>\n                                            <h3 class=\"block-title\">删除 &amp; 漏洞类型</h3>\n                                        </div>\n                                        <div class=\"block-content\">\n                                            <label for=\"example-text-input-error\">你确定要删除类型为\"{{leak.leak_name_cn}}\"的漏洞分类么？</label>\n                                        </div>\n                                    </div>\n                                    <div class=\"modal-footer\">\n                                        <button class=\"btn btn-sm btn-default\" type=\"button\" data-dismiss=\"modal\">关闭</button>\n                                        <button class=\"btn btn-sm btn-primary\" type=\"button\" data-dismiss=\"modal\" onclick=\"del_leakinfo({{leak.id}})\"><i class=\"fa fa-check\"></i> 确定</button>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                        <!-- END Fade In Modal -->\n                    </tr>\n                    {% endfor %}\n                </tbody>\n            </table>\n        </div>\n        {{ pagination.links }}\n    </div>\n    <!-- END Partial Table -->\n\n</main>\n\n{% endblock %}"
  },
  {
    "path": "webservice/lalascan_web/app/templates/policy.html",
    "content": "{% extends \"base.html\" %}\n{% block content %}\n\n<!-- Main Container -->\n<main id=\"main-container\">\n    <!-- Page Header -->\n    <div class=\"content bg-gray-lighter\">\n        <div class=\"row items-push\">\n            <div class=\"col-sm-7\">\n                <h1 class=\"page-heading\">\n                    策略规则列表 <small></small>\n                </h1>\n            </div>\n            <div class=\"col-sm-5 text-right hidden-xs\">\n                <ol class=\"breadcrumb push-10-t\">\n                    <li>首页</li>\n                    <li><a class=\"link-effect\" href=\"\">Search Results</a></li>\n                </ol>\n            </div>\n        </div>\n    </div>\n    <!-- END Page Header -->\n\n    <!-- Partial Table -->\n    <div class=\"block\">\n        <div class=\"block-header\">\n            <h3 class=\"block-title\"></h3>\n        </div>\n        <div class=\"block-content\">\n            <table class=\"table table-striped table-vcenter\">\n                <thead>\n                    <tr>\n                        <th class=\"hidden-xs\" style=\"width: 5%;\">ID</th>\n                        <th class=\"hidden-xs\" style=\"width: 10%;\">插件规则</th>\n                        <th class=\"text-center\" style=\"width: 40%;\">规则详情</th>\n                        <th class=\"hidden-xs\" style=\"width: 10px\">归属类型</th>\n                        <th class=\"hidden-xs\" style=\"width: 10px\">更新时间</th>\n                        <th class=\"hidden-xs\" style=\"width: 5px;\">操作</th>\n                    </tr>\n                </thead>\n                <tbody>\n                    {%for p in policy %}\n                    <tr>\n                        <td class=\"font-w600\">{{ p[1].id }}</td>\n                        <td class=\"hidden-xs\">{{ p[1].policy_name }}</td>\n                        <td class=\"hidden-xs hidden-sm\">{{ p[1].content | truncate(50, True) }}</td>\n                        <td class=\"hidden-xs hidden-sm\">{{ p[0] }}</td>\n                        <td class=\"hidden-xs hidden-sm\">{{ p[1].update_time }}</td>\n                        <td class=\"hidden-xs\">\n                            <div class=\"btn-group\">\n                                <button class=\"btn btn-xs btn-default\" type=\"button\" data-toggle=\"tooltip\" title=\"Edit Client\"><i class=\"fa fa-pencil\"></i></button>\n                                <button class=\"btn btn-xs btn-default\" type=\"button\" data-toggle=\"tooltip\" title=\"Remove Client\"><i class=\"fa fa-times\"></i></button>\n                            </div>\n                        </td>\n                    </tr>\n                    {% endfor %}\n                </tbody>\n            </table>\n        </div>\n        {{ pagination.links }}\n    </div>\n    <!-- END Partial Table -->\n\n</main>\n\n{% endblock %}"
  },
  {
    "path": "webservice/lalascan_web/app/templates/scanner.html",
    "content": "{% extends \"base.html\" %}\n{% block content %}\n\n<!-- Main Container -->\n<main id=\"main-container\">\n    <!-- Page Header -->\n    <div class=\"content bg-gray-lighter\">\n        <div class=\"row items-push\">\n            <div class=\"col-sm-7\">\n                <h1 class=\"page-heading\">\n                    扫描结果列表 <small></small>\n                </h1>\n            </div>\n            <div class=\"col-sm-5 text-right hidden-xs\">\n                <ol class=\"breadcrumb push-10-t\">\n                    <li>首页</li>\n                    <li><a class=\"link-effect\" href=\"\">Search Results</a></li>\n                </ol>\n            </div>\n        </div>\n    </div>\n    <!-- END Page Header -->\n\n\n    <div class=\"block-content tab-content bg-white\">\n        <!-- Projects -->\n        <div class=\"tab-pane fade fade-up in active\" id=\"search-projects\">\n            <div class=\"border-b push-30\">\n                <h2 class=\"push-10\">6 <span class=\"h5 font-w400 text-muted\">Projects Found</span></h2>\n            </div>\n\n            <table class=\"table table-striped table-vcenter\">\n                <thead>\n                    <tr>\n                        <th style=\"width: 35%;\"><i class=\"fa fa-suitcase text-gray\"></i> 扫描URL</th>\n                        <th class=\"text-center hidden-xs\" style=\"width: 45%;\"><i class=\"fa fa-ticket text-gray\"></i> 检测结果</th>\n                        <th class=\"text-center hidden-xs hidden-sm\" style=\"width: 8%;\"><i class=\"fa fa-bar-chart text-gray\"></i> 扫描状态</th>\n                        <th class=\"text-right\" style=\"width: 15%; min-width: 110px;\"><i class=\"fa fa-trophy text-gray\"></i> 更多操作</th>\n                    </tr>\n                </thead>\n                <tbody>\n                    {%for task in scanner %}\n                    <tr>\n                        <td>\n                            <h3 class=\"h5 font-w600 push-10\">\n                                <a class=\"link-effect\" href=\"javascript:void(0)\">{{ task.scan_url }}</a>\n                            </h3>\n                            <div class=\"push-10\">\n                                <span class=\"badge badge-warning\"><i class=\"fa fa-cog\"></i> 任务名:{{ task.audit_name }}</span>\n                            </div>\n                            <div class=\"font-s13 text-muted hidden-xs\">\n                                <p>起始时间: {{ task.starttime }} | 结束时间: {{ task.finishtime }}</p>\n                            </div>\n                        </td>\n                        <td class=\"h4 text-center hidden-xs\">\n                            <div class=\"block-content\">\n                                <span class=\"badge badge-danger\">{{ task.high_risk_cnt }}高危</span> |\n                                <span class=\"badge badge-warning\">{{ task.middle_risk_cnt }}中危</span> |\n                                <span class=\"badge badge-info\">{{ task.low_risk_cnt }}低危</span> |\n                                <span class=\"badge badge-success\">{{ task.info_risk_cnt }}提示</span>\n                            </div>\n                        </td>\n                        <td class=\"h5 text-center hidden-xs hidden-sm\">\n                            <div class=\"push-5\">\n                                <span class=\"label label-success\"><i class=\"fa fa-check\"></i> Completed</span>\n                            </div>\n                        </td>\n                        <td class=\"h6 text-primary text-right\">漏洞详情/重新扫描</td>\n                    </tr>\n                    {% endfor %}\n                </tbody>\n            </table>\n            <div class=\"border-t\">\n                <ul class=\"pagination\">\n                    <li class=\"disabled\"><a href=\"javascript:void(0)\">Prev</a></li>\n                    <li class=\"active\"><a href=\"javascript:void(0)\">1</a></li>\n                    <li><a href=\"javascript:void(0)\">2</a></li>\n                    <li><span>...</span></li>\n                    <li><a href=\"javascript:void(0)\">10</a></li>\n                    <li><a href=\"javascript:void(0)\">Next</a></li>\n                </ul>\n            </div>\n        </div>\n        <!-- END Projects -->\n    </div>\n</main>\n\n{% endblock %}"
  },
  {
    "path": "webservice/lalascan_web/app/util.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\n\nclass RETCODE:\n    SUCCESS = 100\n    ERROR   = 99"
  },
  {
    "path": "webservice/lalascan_web/app/views/__init__.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n"
  },
  {
    "path": "webservice/lalascan_web/app/views/login.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nfrom flask import Blueprint, url_for, redirect\n\n\nlogin_module = Blueprint('login', __name__)\n\n@login_module.route('/cloudscan', methods = ['GET'])\ndef index():\n    return redirect(url_for('login.login'))\n\n@login_module.route('/cloudscan/login', methods = ['GET', 'POST'])\ndef login():\n    return 'hello world!'\n"
  },
  {
    "path": "webservice/lalascan_web/app/views/webscan.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nfrom flask import Blueprint, url_for, redirect, render_template, request, flash, jsonify\nfrom flask import current_app\n\nfrom app.services import PolicyService, VulDetailInfo\nfrom app.models.scanner import Scanner\nfrom app.forms import LeakInfoForm\nfrom app.extensions.flask_paginate import Pagination, get_page_args\n\nfrom app.util import RETCODE\n\n\nwebscan_module = Blueprint('webscan', __name__)\n\n@webscan_module.route('/webscan/', methods = ['GET'])\ndef index():\n    return redirect(url_for('login.login'))\n\n\n@webscan_module.route('/webscan/scanner', defaults = {'page' : 1})\n@webscan_module.route('/webscan/scanner/', defaults = {'page' : 1})\n@webscan_module.route('/webscan/scanner/<int:page>')\n@webscan_module.route('/webscan/scanner/<int:page>/')\ndef show_vuldetail(page):\n    _scan = VulDetailInfo.get_scan_task()\n    all_scan = {}\n\n    _scanner = {}\n\n    for _ in _scan:\n\n\n        _scan_task = _[0]\n        _scan_vul_detail = _[1]\n        _leakinfo = _[2]\n\n        single_scan_task = {}\n        single_scan_task['scan_task'] = None\n        single_scan_task['scan_info'] = []\n\n        if all_scan.has_key(_scan_task.id):\n            #scan_info = all_scan[_scan_task.id]['scan_info']\n            __ = (_scan_vul_detail, _leakinfo)\n\n            all_scan[_scan_task.id]['scan_info'].append(__)\n            all_scan[_scan_task.id] = {'scan_task' : _scan_task, 'scan_info' :all_scan[_scan_task.id]['scan_info']}\n            #all_scan[_scan_task.id]['scan_info'].append((_scan_vul_detail, _leakinfo))\n\n            if _leakinfo != None:\n                _scanner[_scan_task.id].add_risk_cnt(int(_leakinfo.risk_level))\n        else:\n\n            single_scan_task['scan_task'] = _scan_task\n            single_scan_task['scan_info'].append((_scan_vul_detail, _leakinfo))\n\n            all_scan[_scan_task.id] = single_scan_task\n\n\n            scanner = Scanner(audit_name = _scan_task.audit_name,\n                              scan_url   = _scan_task.scan_url,\n                              starttime  = _scan_task.starttime,\n                              finishtime = _scan_task.finishtime,\n                              status     = _scan_task.status,\n                              )\n\n            if _leakinfo != None:\n                scanner.add_risk_cnt(int(_leakinfo.risk_level))\n\n            _scanner[_scan_task.id] = scanner\n\n    print _scanner\n\n    '''\n    scanner = Scanner(audit_name = _scan_task.audit_name,\n                      scan_url   = _scan_task.scan_url,\n                      starttime  = _scan_task.starttime,\n                      finishtime = _scan_task.finishtime,\n                      status     = _scan_task.status,\n\n                      )\n\n\n\n    all_scan_task.append(scan_task)\n    '''\n\n    return render_template(\"/scanner.html\", scanner = [p for x , p in _scanner.iteritems()])\n\n\n@webscan_module.route('/webscan/add_task', methods = ['GET', 'POST'])\ndef add_task():\n    return render_template('/add_task.html')\n\n@webscan_module.route('/webscan/leakinfo', defaults = {'page' : 1})\n@webscan_module.route('/webscan/leakinfo/', defaults = {'page' : 1})\n@webscan_module.route('/webscan/leakinfo/<int:page>')\n@webscan_module.route('/webscan/leakinfo/<int:page>/')\ndef show_leakinfo(page):\n\n    total = PolicyService.get_leakinfo_cnt()\n    page, per_page, offset = get_page_args()\n\n    leakinfo = PolicyService.get_leakinfo(offset, per_page)\n\n    pagination = get_pagination(page=page,\n                                per_page=per_page,\n                                total=total,\n                                record_name='leakinfo',\n                                )\n\n    return render_template('/leakinfo.html', leakinfo = leakinfo,\n                           page=page,\n                           per_page=per_page,\n                           pagination=pagination,\n                           )\n\n@webscan_module.route('/webscan/add_leakinfo')\ndef add_leakinfo():\n    plugin_type = PolicyService.get_plugin_type()\n    return render_template('/add_leakinfo.html', plugin_type = plugin_type)\n\n@webscan_module.route('/webscan/leak_add', methods = ['GET', 'POST'])\ndef leak_add():\n    leakinfo_form = LeakInfoForm(request.form)\n\n    if leakinfo_form.validate_on_submit():\n        return redirect('/add_leakinfo')\n\n    if request.method == 'GET':\n        return redirect(url_for('webscan.add_leakinfo'))\n\n    if request.method == 'POST':\n        leak_name    = leakinfo_form.leak_name.data\n        leak_name_cn = leakinfo_form.leak_name_cn.data\n        spt          = leakinfo_form.spt.data\n        description  = leakinfo_form.description.data\n        risk_level   = leakinfo_form.risk_level.data\n\n        PolicyService.add_leakinfo(leak_name = leak_name, leak_name_cn = leak_name_cn, spt = spt, description = description, risk_level = risk_level)\n\n        return redirect(url_for('webscan.show_leakinfo'))\n\n@webscan_module.route('/webscan/del_leakinfo', methods = ['GET', 'POST'])\ndef delete_leakinfo():\n    leak_id = request.args.get('leak_id')\n\n    PolicyService.del_leakinfo(leak_id)\n    return jsonify(status = RETCODE.SUCCESS , info = 'success', data = None)\n\n\n@webscan_module.route('/webscan/policy', defaults = {'page' : 1})\n@webscan_module.route('/webscan/policy/', defaults = {'page' : 1})\n@webscan_module.route('/webscan/policy/<int:page>')\n@webscan_module.route('/webscan/policy/<int:page>/')\ndef show_policys(page):\n    total = PolicyService.get_policy_cnt()\n\n    page, per_page, offset = get_page_args()\n    policys = PolicyService.get_policy_by_leakinfo(offset, per_page)\n\n    pagination = get_pagination(page=page,\n                                per_page=per_page,\n                                total=total,\n                                record_name='policys',\n                                )\n\n    return render_template('/policy.html', policy = policys,\n                           page=page,\n                           per_page=per_page,\n                           pagination=pagination,\n                           )\n\n\ndef get_css_framework():\n    return current_app.config.get('CSS_FRAMEWORK', 'bootstrap3')\n\ndef get_link_size():\n    return current_app.config.get('LINK_SIZE', 'sm')\n\ndef show_single_page_or_not():\n    return current_app.config.get('SHOW_SINGLE_PAGE', False)\n\ndef get_pagination(**kwargs):\n    kwargs.setdefault('record_name', 'records')\n    return Pagination(css_framework=get_css_framework(),\n                      link_size=get_link_size(),\n                      show_single_page=show_single_page_or_not(),\n                      **kwargs\n                      )\n\n"
  },
  {
    "path": "webservice/lalascan_web/config.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\n\nCSRF_ENABLED = True\nSECRET_KEY = 'b6068e9b337f8177d6e8d858cb2117a5'\n\nSQLALCHEMY_ECHO = True\n\nMYSQL_HOST = '127.0.0.1'\nMYSQL_PORT = '3306'\nMYSQL_USER = 'root'\nMYSQL_PWD  = ''\nMYSQL_DATABASE = 'lalascan'\nSQLALCHEMY_DATABASE_URI = 'mysql://{0}@{1}:{2}/{3}?charset=utf8'.format(MYSQL_USER, MYSQL_HOST, MYSQL_PORT, MYSQL_DATABASE)\n"
  },
  {
    "path": "webservice/lalascan_web/manage.py",
    "content": "#!/usr/bin/env/python\n#-*- coding:utf-8 -*-\n\n__author__ = 'BlackYe.'\n\nfrom flask.ext.script import Manager, Server\nfrom app import create_app\n\nimport os\n\nenv = os.environ.get('WEBAPP_ENV', 'config')\napp = create_app(env)\nmanager = Manager(app)\nmanager.add_command(\"runserver\", Server(use_debugger = True,\n                                        use_reloader = True,\n                                        host = '172.16.203.129', port = 8080))\n\n\nif __name__ == '__main__':\n    manager.run()"
  },
  {
    "path": "webservice/lalascan_web/requirements.txt",
    "content": ""
  }
]