PK!H]blogger_cli/__init__.pyimport os __version__ = '1.0.1' ROOT_DIR = os.path.join(os.path.split(__file__)[0]) RESOURCE_DIR = os.path.join(os.path.split(__file__)[0], 'resources') HOME = os.path.expanduser('~') CONFIG_DIR = os.path.join(HOME, '.config', 'blogger_cli') PK!$blogger_cli/blog_manager/__init__.pyPK!o!!$blogger_cli/blog_manager/add_post.pyimport os import jinja2 import json import shutil from pathlib import Path from collections import OrderedDict from pkg_resources import resource_string from bs4 import BeautifulSoup as BS def add(ctx, filename_meta): filename, meta = Path(filename_meta[0]), filename_meta[1] ctx.log(":: Resolving", filename) destination_dir = Path(ctx.conversion['destination_dir']) file_path = destination_dir / filename topic = os.path.dirname(str(filename)) meta['topic'] = topic snippet = get_snippet_content_map(ctx, meta) snippet['link'] = str(filename) html_page = insert_html_snippets(ctx, file_path, meta, snippet) ctx.log(":: Writing finished html to", filename) file_path.write_text(html_page, encoding='utf-8') update_posts_index(ctx, snippet, meta) def get_snippet_content_map(ctx, meta): templates_dir = ctx.conversion.get('templates_dir') snippet_names = [ 'layout','disqus', 'css', 'li_tag', 'google_analytics', 'navbar_data', 'navbar', 'js', 'mathjax', 'light_theme', 'dark_theme', ] snippet_content_map = {} for snippet in snippet_names: file_name = snippet + '.html' file_content = get_internal_resource(file_name) snippet_content_map[snippet] = file_content if templates_dir: template_files = Path(templates_dir).glob('*') all_filenames = [i.resolve() for i in template_files if i.is_file()] html_filenames = [i for i in all_filenames if i.suffix == '.html'] for file in html_filenames: custom_snippet = os.path.splitext(str(file.name))[0] snippet_content_map[custom_snippet] = file.read_text(encoding='utf-8') resolve_templates(ctx, snippet_content_map, meta) return snippet_content_map def read_file(file_path): with open(file_path, 'r', encoding='utf-8') as rf: content = rf.read() return content def get_internal_resource(file_name): internal_resource_path = 'resources/' + file_name file_content = resource_string('blogger_cli', internal_resource_path) return file_content.decode('utf-8') def insert_html_snippets(ctx, file_path, meta, snippet_content_map): iscode = ctx.conversion['iscode'] ctx.log(":: Inserting html_snippets to file") html_body = file_path.read_text(encoding='utf-8') ctx.vlog(":: iscode =", iscode) if not iscode: snippet_content_map['css'] = '' snippet_content_map['mathjax'] = '' snippet_content_map['dark_theme'] = '' snippet_content_map['light_theme'] = '' snippet_content_map['body'] = html_body snippet_content_map['title'] = get_page_title(ctx, html_body) layout = snippet_content_map['layout'] template = jinja2.Template(layout) snippet_content_map.pop('layout') final_page = template.render(snippet=snippet_content_map, meta=meta) if iscode: html_page = insert_prettyprint_class(ctx, final_page) return html_page def insert_prettyprint_class(ctx, html_page): soup = BS(html_page, features='html.parser') pre_tags = soup.find_all('pre') if not pre_tags: ctx.log(":: WARNING: No pre tags found in code") return html_page for pre_tag in pre_tags: pre_tag['class'] = 'prettyprint' return soup.prettify(formatter='html') def resolve_templates(ctx, snippet_content_map, meta): config = dict() blog = ctx.current_blog topic = meta.get('topic') navbar_dict = get_navbar_dict(ctx, snippet_content_map, topic) layout_renderer_map = { 'disqus': config, 'google_analytics': config, 'navbar': navbar_dict } config_names = ['disqus_username', 'google_analytics_id'] for config_name in config_names: config_key = blog + ":" + config_name config[config_name] = ctx.config.read(key=config_key) exclude_snippet = ['layout', 'li_tag'] for snippet, content in snippet_content_map.items(): if snippet not in exclude_snippet: renderer = layout_renderer_map.get(snippet) content_template = jinja2.Template(content) html_snippet = content_template.render(config=renderer, meta=meta) snippet_content_map[snippet] = html_snippet def get_navbar_dict(ctx, snippet_content_map, topic): try: navbar_dict = json.loads(snippet_content_map['navbar_data'], object_pairs_hook=OrderedDict) except Exception as E: ctx.log("Couldnot parse your custom navbar", E) raise SystemExit("ERROR: INVALID NAVBAR TEMPLATE") if topic: for nav_topic, nav_link in navbar_dict.items(): nav_link = '../' + nav_link navbar_dict[nav_topic] = nav_link return navbar_dict def get_page_title(ctx, page): current_blog = ctx.current_blog filter_ = ctx.config.read(key=current_blog +':filter_post_without_title') if filter_ in ['true', 'True']: ctx.log(":: Filtering this post as it doesnot have title") current_blog = '' soup = BS(page, 'html.parser') try: title = soup.find_all('h1')[0].contents[0] if title is None: title = current_blog except IndexError: title = current_blog title = title.strip() ctx.log(":: Got page title as", title) return title def update_posts_index(ctx, snippet_content_map, meta): post_li_tag_div = prepare_post_list(meta, snippet_content_map) destination_dir = ctx.conversion['destination_dir'] index_path = os.path.join(destination_dir, 'index.html') index_div_class = 'posts_list' index_class = ctx.config.read(key=ctx.current_blog + ': index_div_name') if index_class: index_div_class = index_class topic = meta['topic'] if not os.path.exists(index_path): ctx.log("Cannot find index file in", index_path) ctx.log("WARNING: NO INDEX FILE. \nSEE blogger export --help") return None soup = BS(read_file(index_path), features='html.parser') posts_list_div = soup.find('div', class_=index_div_class) if not posts_list_div: ctx.log("Cannot update blog index. No div with", index_div_class, "class") ctx.log("WARNING: INVALID INDEX.", index_path) return None ctx.log(":: Updating index file at", index_path) if topic and post_li_tag_div: update_under_topic(posts_list_div, post_li_tag_div, topic) ctx.log(":: Linking under topic", topic) elif post_li_tag_div: update_without_topic(posts_list_div, post_li_tag_div) snippet = snippet_content_map ctx.log(":: File link and title", snippet['link'], '->', snippet['title']) with open(index_path, 'w', encoding='utf8') as wf: wf.write(soup.prettify(formatter='html')) ctx.log("Index successfully updated\n") def update_under_topic(posts_list_div, post_li_tag_div, topic): div_topic = 'meta-' + topic topic_tag = posts_list_div.find('div', class_=div_topic) if topic_tag: file_link = post_li_tag_div.ul.li.a['href'] topic_tag = check_and_remove_duplicate_tag(topic_tag, file_link) ul_tag = post_li_tag_div.ul.extract() topic_tag.append(ul_tag) else: post_li_tag_div['class'] = div_topic h3_soup = BS('

'+topic+'

\n', features='html.parser') h3_tag = h3_soup.find('h3') post_li_tag_div.insert(0, h3_tag) posts_list_div.insert(0, post_li_tag_div) def update_without_topic(posts_list_div, post_li_tag): file_link = post_li_tag.ul.li.a['href'] posts_list_div = check_and_remove_duplicate_tag(posts_list_div, file_link) li_tag_ul = post_li_tag.ul.extract() posts_list_div.insert(0, li_tag_ul) def prepare_post_list(meta, snippet): if not snippet['title']: return None li_tag_layout = snippet['li_tag'] li_tag_template = jinja2.Template(li_tag_layout) li_tag_html = li_tag_template.render(meta=meta, snippet=snippet) li_tag = BS(li_tag_html, features='html.parser').find('li') new_div = '''\
''' new_div_tag = BS(new_div, features='html.parser').find('div') new_div_tag.ul.append(li_tag) return new_div_tag def check_and_remove_duplicate_tag(div_tag, file_link): try: ul_tags = div_tag.find_all('ul') except AttributeError: return div_tag for ul_tag in ul_tags: li_tag_link = ul_tag.li.a['href'] if li_tag_link == file_link: ul_tag.decompose() return div_tag PK!% blogger_cli/cli.pyimport os import sys import click from blogger_cli.cli_utils.json_writer import Config from blogger_cli import CONFIG_DIR class Context(object): def __init__(self): self.verbose = False config_path = os.path.join(CONFIG_DIR, 'blog_config.cfg') self.config = Config(config_path, backup_dir='~/.blogger/backup/') self.blog_list = self.config.read(all_keys=True) self.config_keys = [ 'google_analytics_id', 'disqus_username', 'blog_images_dir', 'templates_dir', 'blog_posts_dir', 'default', 'working_dir', 'blog_dir' ] self.optional_config = [ 'meta_format', 'post_extract_list', 'index_div_name', 'filter_post_without_title', 'working_dir_timestamp', 'create_nbdata_file', 'delete_ipynb_meta' ] self.SUPPORTED_EXTENSIONS = ['md', 'ipynb', 'html'] self.current_blog = '' def log(self, msg, *args): """Logs a message to stderr.""" if args: for arg in args: msg += ' ' + str(arg) click.echo(msg, file=sys.stderr) def vlog(self, msg, *args): """Logs a message to stderr only if verbose is enabled.""" if self.verbose: self.log(msg, *args) def blog_exists(self, blog): return False if not self.config.read(key=blog) else True @property def default_blog(self): cfg = self.config.get_dict() for i in cfg: if 'default' in cfg[i]: return i pass_context = click.make_pass_decorator(Context, ensure=True) cmd_folder = os.path.abspath(os.path.join(os.path.dirname(__file__), 'commands')) class ComplexCLI(click.MultiCommand): def list_commands(self, ctx): rv = [] for filename in os.listdir(cmd_folder): if filename.endswith('.py') and \ filename.startswith('cmd_'): rv.append(filename[4:-3]) rv.sort() return rv def get_command(self, ctx, name): try: if sys.version_info[0] == 2: name = name.encode('ascii', 'replace') mod = __import__('blogger_cli.commands.cmd_' + name, None, None, ['cli']) except ImportError as e: print(e) return return mod.cli @click.command(cls=ComplexCLI) @click.option('-v', '--verbose', is_flag=True, help='enables verbose command') @pass_context def cli(ctx, verbose): ''' A CLI tool to maintain your blogger blog. Sync, convert and upload :). ''' ctx.verbose = verbose ctx.vlog("Started the main command") if __name__ == "__main__": cli() PK!!blogger_cli/cli_utils/__init__.pyPK!RORO%blogger_cli/cli_utils/installation.py""" This script will install blogger-cli and its dependencies in isolation from the rest of the system. It does, in order: - Downloads the latest stable (or pre-release) version of blogger-cli. - Downloads all its dependencies in the blogger-cli/venv directory. - Copies it and all extra files in $BLOGGER_CLI_HOME. - Updates the PATH in a system-specific way. There will be a `blogger` script that will be installed in $BLOGGER_CLI_HOME/bin which will act as the blogger command but is slightly different in the sense that it will use the current Python installation. What this means is that one blogger-cli installation can serve for multiple Python versions. """ import argparse import json import os import platform import re import shutil import stat import subprocess import sys import tarfile import tempfile from contextlib import closing from contextlib import contextmanager from functools import cmp_to_key from gzip import GzipFile from io import UnsupportedOperation try: from urllib.error import HTTPError from urllib.request import Request from urllib.request import urlopen except ImportError: from urllib2 import HTTPError from urllib2 import Request from urllib2 import urlopen try: input = raw_input except NameError: pass try: try: import winreg except ImportError: import _winreg as winreg except ImportError: winreg = None WINDOWS = sys.platform.startswith("win") or (sys.platform == "cli" and os.name == "nt") FOREGROUND_COLORS = { "black": 30, "red": 31, "green": 32, "yellow": 33, "blue": 34, "magenta": 35, "cyan": 36, "white": 37, } BACKGROUND_COLORS = { "black": 40, "red": 41, "green": 42, "yellow": 43, "blue": 44, "magenta": 45, "cyan": 46, "white": 47, } OPTIONS = {"bold": 1, "underscore": 4, "blink": 5, "reverse": 7, "conceal": 8} def style(fg, bg, options): codes = [] if fg: codes.append(FOREGROUND_COLORS[fg]) if bg: codes.append(BACKGROUND_COLORS[bg]) if options: if not isinstance(options, (list, tuple)): options = [options] for option in options: codes.append(OPTIONS[option]) return "\033[{}m".format(";".join(map(str, codes))) STYLES = { "info": style("green", None, None), "comment": style("yellow", None, None), "error": style("red", None, None), "warning": style("yellow", None, None), } def is_decorated(): if platform.system().lower() == "windows": return ( os.getenv("ANSICON") is not None or "ON" == os.getenv("ConEmuANSI") or "xterm" == os.getenv("Term") ) if not hasattr(sys.stdout, "fileno"): return False try: return os.isatty(sys.stdout.fileno()) except UnsupportedOperation: return False def is_interactive(): if not hasattr(sys.stdin, "fileno"): return False try: return os.isatty(sys.stdin.fileno()) except UnsupportedOperation: return False def colorize(style, text): if not is_decorated(): return text return "{}{}\033[0m".format(STYLES[style], text) def string_to_bool(value): value = value.lower() return value in {"true", "1", "y", "yes"} def expanduser(path): """ Expand ~ and ~user constructions. Includes a workaround for http://bugs.python.org/issue14768 """ expanded = os.path.expanduser(path) if path.startswith("~/") and expanded.startswith("//"): expanded = expanded[1:] return expanded HOME = expanduser("~") LINUX_HOME = os.path.join(HOME, 'local', '.blogger_cli') WINDOWS_HOME = os.path.join(HOME, ".blogger_cli") BLOGGER_CLI_HOME = WINDOWS_HOME if WINDOWS else LINUX_HOME BLOGGER_CLI_BIN = os.path.join(BLOGGER_CLI_HOME, "bin") BLOGGER_CLI_ENV = os.path.join(BLOGGER_CLI_HOME, "env") BLOGGER_CLI_VENV = os.path.join(BLOGGER_CLI_HOME, "venv") BLOGGER_CLI_VENV_BACKUP = os.path.join(BLOGGER_CLI_HOME, "venv-backup") BIN = """#!{python_path} from blogger_cli.cli import cli if __name__ == "__main__": cli() """ BAT = '@echo off\r\n{python_path} "{blogger_cli_bin}" %*\r\n' PRE_MESSAGE = """# Welcome to {blogger-cli}! This will download and install the latest version of {blogger-cli}, a ipynb converter and blog manager. It will add the `blogger` command to {blogger-cli}'s bin directory, located at: {blogger_cli_home_bin} {platform_msg} You can uninstall at any time by executing this script with the --uninstall option, and these changes will be reverted. """ PRE_UNINSTALL_MESSAGE = """# We are sorry to see you go! This will uninstall {blogger-cli}. It will remove the `blogger` command from {blogger-cli}'s bin directory, located at: {blogger_cli_home_bin} This will also remove {blogger-cli} from your system's PATH. """ PRE_MESSAGE_UNIX = """This path will then be added to your `PATH` environment variable by modifying the profile file{plural} located at: {rcfiles}""" PRE_MESSAGE_WINDOWS = """This path will then be added to your `PATH` environment variable by modifying the `HKEY_CURRENT_USER/Environment/PATH` registry key.""" PRE_MESSAGE_NO_MODIFY_PATH = """This path needs to be in your `PATH` environment variable, but will not be added automatically.""" POST_MESSAGE_UNIX = """{blogger-cli} is installed now. Great! To get started you need {blogger-cli}'s bin directory ({blogger_cli_home_bin}) in your `PATH` environment variable. Next time you log in this will be done automatically. You have to run blogger-cli using the 'blogger' command! If 'blogger' command doesnot work place {linux_addition} in your bashrc/bash_profile To configure your current shell run `source {blogger_cli_home_env}` """ POST_MESSAGE_WINDOWS = """{blogger-cli} is installed now. Great! To get started you need blogger-cli's bin directory ({blogger_cli_home_bin}) in your `PATH` environment variable. Future applications will automatically have the correct environment, but you may need to restart your current shell. You have to run blogger-cli using the 'blogger' command! """ POST_MESSAGE_WINDOWS_NO_MODIFY_PATH = """{blogger-cli} is installed now. Great! To get started you need Blogger-cli's bin directory ({blogger_cli_home_bin}) in your `PATH` environment variable. This has not been done automatically. You have to run blogger-cli using the 'blogger' command! """ class Installer: CURRENT_PYTHON = sys.executable CURRENT_PYTHON_VERSION = sys.version_info[:2] def __init__( self, version=None, force=False, accept_all=False, ): self._version = version self._force = force self._modify_path = True self._accept_all = accept_all def run(self): self.customize_install() self.display_pre_message() self.ensure_python_version() self.ensure_home() try: self.install() except subprocess.CalledProcessError as e: print(colorize("error", "An error has occured: {}".format(str(e)))) print(e.output.decode()) return e.returncode self.display_post_message(self._version) return 0 def uninstall(self): self.display_pre_uninstall_message() if not self.customize_uninstall(): return self.remove_home() self.remove_from_path() def ensure_python_version(self): major, minor = self.CURRENT_PYTHON_VERSION if major < 3 or minor < 5: print("SORRY BLOGGER CLI IS NOT SUPPORTED ONLY FOR 3.5 AND ABOVE!") sys.exit(1) def customize_install(self): if not self._accept_all and WINDOWS: print("Before we start, please answer the following questions.") print("You may simply press the Enter key to leave unchanged.") modify_path = input("Modify PATH variable? ([y]/n) ") or "y" if modify_path.lower() in {"n", "no"}: self._modify_path = False print("") def customize_uninstall(self): if not self._accept_all: print() uninstall = ( input("Are you sure you want to uninstall Blogger-cli? (y/[n]) ") or "n" ) if uninstall.lower() not in {"y", "yes"}: return False print("") return True def ensure_home(self): """ Ensures that $BLOGGER_CLI_HOME exists or create it. """ if not os.path.exists(BLOGGER_CLI_HOME): os.makedirs(BLOGGER_CLI_HOME, 0o755) def remove_home(self): """ Removes $BLOGGER_CLI_HOME. """ if not os.path.exists(BLOGGER_CLI_HOME): return shutil.rmtree(BLOGGER_CLI_HOME) def install(self): """ Installs Blogger-cli in $BLOGGER_CLI_HOME. """ version = self._version if self._version else 'Latest' print("Installing version: " + colorize("info", version)) self.make_venv() self.make_bin() self.make_env() self.update_path() return 0 def make_venv(self): """ Packs everything into a single lib/ directory. """ if os.path.exists(BLOGGER_CLI_VENV_BACKUP): shutil.rmtree(BLOGGER_CLI_VENV_BACKUP) # Backup the current installation if os.path.exists(BLOGGER_CLI_VENV): shutil.copytree(BLOGGER_CLI_VENV, BLOGGER_CLI_VENV_BACKUP) if self._force: shutil.rmtree(BLOGGER_CLI_VENV) try: self._make_venv() except Exception: if not os.path.exists(BLOGGER_CLI_VENV_BACKUP): raise shutil.copytree(BLOGGER_CLI_VENV_BACKUP, BLOGGER_CLI_VENV) shutil.rmtree(BLOGGER_CLI_VENV_BACKUP) raise finally: if os.path.exists(BLOGGER_CLI_VENV_BACKUP): shutil.rmtree(BLOGGER_CLI_VENV_BACKUP) def _make_venv(self): global BIN, BAT major, minor = self.CURRENT_PYTHON_VERSION if not os.path.exists(BLOGGER_CLI_VENV): import venv print("Making virtualenv in", BLOGGER_CLI_VENV) venv.create(BLOGGER_CLI_VENV, with_pip=True) windows_path = os.path.join(BLOGGER_CLI_VENV, 'Scripts', 'python') linux_path = os.path.join(BLOGGER_CLI_VENV, 'bin', 'python') new_python = windows_path if WINDOWS else linux_path new_pip = new_python + ' -m pip' if self._version: install_cmd = new_pip + ' install blogger-cli==' + self._version else: install_cmd = new_pip + ' install blogger-cli' BIN = BIN.format(python_path=new_python) BAT = BAT.format(python_path=new_python, blogger_cli_bin='{blogger_cli_bin}') os.system(install_cmd) def make_bin(self): if not os.path.exists(BLOGGER_CLI_BIN): os.mkdir(BLOGGER_CLI_BIN, 0o755) if WINDOWS: with open(os.path.join(BLOGGER_CLI_BIN, "blogger.bat"), "w") as f: f.write( BAT.format( blogger_cli_bin=os.path.join(BLOGGER_CLI_BIN, "blogger").replace( os.environ["USERPROFILE"], "%USERPROFILE%" ) ) ) with open(os.path.join(BLOGGER_CLI_BIN, "blogger"), "w") as f: f.write(BIN) if not WINDOWS: # Making the file executable st = os.stat(os.path.join(BLOGGER_CLI_BIN, "blogger")) os.chmod(os.path.join(BLOGGER_CLI_BIN, "blogger"), st.st_mode | stat.S_IEXEC) def make_env(self): if WINDOWS: return with open(os.path.join(BLOGGER_CLI_HOME, "env"), "w") as f: f.write(self.get_export_string()) def update_path(self): """ Tries to update the $PATH automatically. """ if WINDOWS: return self.add_to_windows_path() # Updating any profile we can on UNIX systems export_string = self.get_export_string() self.linux_addition = "\n{}\n".format(export_string) updated = [] profiles = self.get_unix_profiles() for profile in profiles: if not os.path.exists(profile): continue with open(profile, "r") as f: content = f.read() if self.linux_addition not in content: with open(profile, "a") as f: f.write(self.linux_addition) updated.append(os.path.relpath(profile, HOME)) def add_to_windows_path(self): try: old_path = self.get_windows_path_var() except WindowsError: old_path = None if old_path is None: print( colorize( "warning", "Unable to get the PATH value. It will not be updated automatically", ) ) self._modify_path = False return new_path = BLOGGER_CLI_BIN if BLOGGER_CLI_BIN in old_path: old_path = old_path.replace(BLOGGER_CLI_BIN + ";", "") if old_path: new_path += ";" new_path += old_path self.set_windows_path_var(new_path) def get_windows_path_var(self): with winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER) as root: with winreg.OpenKey(root, "Environment", 0, winreg.KEY_ALL_ACCESS) as key: path, _ = winreg.QueryValueEx(key, "PATH") return path def set_windows_path_var(self, value): import ctypes with winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER) as root: with winreg.OpenKey(root, "Environment", 0, winreg.KEY_ALL_ACCESS) as key: winreg.SetValueEx(key, "PATH", 0, winreg.REG_EXPAND_SZ, value) # Tell other processes to update their environment HWND_BROADCAST = 0xFFFF WM_SETTINGCHANGE = 0x1A SMTO_ABORTIFHUNG = 0x0002 result = ctypes.c_long() SendMessageTimeoutW = ctypes.windll.user32.SendMessageTimeoutW SendMessageTimeoutW( HWND_BROADCAST, WM_SETTINGCHANGE, 0, u"Environment", SMTO_ABORTIFHUNG, 5000, ctypes.byref(result), ) def remove_from_path(self): if WINDOWS: return self.remove_from_windows_path() return self.remove_from_unix_path() def remove_from_windows_path(self): path = self.get_windows_path_var() blogger_cli_path = BLOGGER_CLI_BIN if blogger_cli_path in path: path = path.replace(BLOGGER_CLI_BIN + ";", "") if blogger_cli_path in path: path = path.replace(BLOGGER_CLI_BIN, "") self.set_windows_path_var(path) def remove_from_unix_path(self): # Updating any profile we can on UNIX systems export_string = self.get_export_string() addition = "{}\n".format(export_string) profiles = self.get_unix_profiles() for profile in profiles: if not os.path.exists(profile): continue with open(profile, "r") as f: content = f.readlines() if addition not in content: continue new_content = [] for line in content: if line == addition: if new_content and not new_content[-1].strip(): new_content = new_content[:-1] continue new_content.append(line) with open(profile, "w") as f: f.writelines(new_content) def get_export_string(self): path = BLOGGER_CLI_BIN.replace(os.getenv("HOME", ""), "$HOME") export_string = 'export PATH="{}:$PATH"'.format(path) return export_string def get_unix_profiles(self): profiles = [os.path.join(HOME, ".profile")] shell = os.getenv("SHELL", "") if "zsh" in shell: zdotdir = os.getenv("ZDOTDIR", HOME) profiles.append(os.path.join(zdotdir, ".zprofile")) bash_profile = os.path.join(HOME, ".bash_profile") if os.path.exists(bash_profile): profiles.append(bash_profile) return profiles def display_pre_message(self): if WINDOWS: home = BLOGGER_CLI_BIN.replace(os.getenv("USERPROFILE", ""), "%USERPROFILE%") else: home = BLOGGER_CLI_BIN.replace(os.getenv("HOME", ""), "$HOME") kwargs = { "blogger-cli": colorize("info", "blogger-cli"), "blogger_cli_home_bin": colorize("comment", home), } if not self._modify_path: kwargs["platform_msg"] = PRE_MESSAGE_NO_MODIFY_PATH else: if WINDOWS: kwargs["platform_msg"] = PRE_MESSAGE_WINDOWS else: profiles = [ colorize("comment", p.replace(os.getenv("HOME", ""), "$HOME")) for p in self.get_unix_profiles() ] kwargs["platform_msg"] = PRE_MESSAGE_UNIX.format( rcfiles="\n".join(profiles), plural="s" if len(profiles) > 1 else "" ) print(PRE_MESSAGE.format(**kwargs)) def display_pre_uninstall_message(self): home_bin = BLOGGER_CLI_BIN if WINDOWS: home_bin = home_bin.replace(os.getenv("USERPROFILE", ""), "%USERPROFILE%") else: home_bin = home_bin.replace(os.getenv("HOME", ""), "$HOME") kwargs = { "blogger-cli": colorize("info", "blogger-cli"), "blogger_cli_home_bin": colorize("comment", home_bin), } print(PRE_UNINSTALL_MESSAGE.format(**kwargs)) def display_post_message(self, version): print("") kwargs = { "blogger-cli": colorize("info", "blogger-cli"), "version": colorize("comment", version), } if WINDOWS: message = POST_MESSAGE_WINDOWS if not self._modify_path: message = POST_MESSAGE_WINDOWS_NO_MODIFY_PATH blogger_cli_home_bin = BLOGGER_CLI_BIN.replace( os.getenv("USERPROFILE", ""), "%USERPROFILE%" ) else: message = POST_MESSAGE_UNIX blogger_cli_home_bin = BLOGGER_CLI_BIN.replace(os.getenv("HOME", ""), "$HOME") kwargs["blogger_cli_home_env"] = colorize( "comment", BLOGGER_CLI_ENV.replace(os.getenv("HOME", ""), "$HOME") ) kwargs['linux_addition'] = self.linux_addition kwargs["blogger_cli_home_bin"] = colorize("comment", blogger_cli_home_bin) print(message.format(**kwargs)) def call(self, *args): return subprocess.check_output(args, stderr=subprocess.STDOUT) def _get(self, url): request = Request(url, headers={"User-Agent": "Python Blogger-cli"}) with closing(urlopen(request)) as r: return r.read() def main(): parser = argparse.ArgumentParser( description="Installs the latest (or given) version of blogger-cli" ) parser.add_argument("--version", dest="version") parser.add_argument( "-f", "--force", dest="force", action="store_true", default=False ) parser.add_argument( "-y", "--yes", dest="accept_all", action="store_true", default=False ) parser.add_argument( "--uninstall", dest="uninstall", action="store_true", default=False ) args = parser.parse_args() installer = Installer( version=args.version or os.getenv("BLOGGER_CLI_VERSION"), force=args.force, accept_all=args.accept_all or string_to_bool(os.getenv("BLOGGER_CLI_ACCEPT", "0")) or not is_interactive(), ) if args.uninstall or string_to_bool(os.getenv("BLOGGER_CLI_UNINSTALL", "0")): return installer.uninstall() return installer.run() if __name__ == "__main__": sys.exit(main()) PK!`Sȴ$blogger_cli/cli_utils/json_writer.py''' Config manager file to quickly write app configurations ''' import json import datetime import os class Config: ''' Config class with methods write(key, value): eg Config.write('parent:child:sub_child', 'value') Config.write('key','value') read(key=None, value=None, all_keys=False, all_values=False) get_dict(): gives you config dict delete_key(key): deletes a key delete_file(backup=True): deletes the config file ''' def __init__(self, file, backup_dir='~/.cli_backup/'): self.file_path = os.path.abspath(os.path.expanduser(file)) self.file = os.path.basename(self.file_path) self.file_dir = os.path.dirname(self.file_path) self.backup_dir = os.path.abspath(os.path.expanduser(backup_dir)) # check if file exists and json readable otherwise create one self.handle_file() def __str__(self): return self.file_path def __repr__(self): return "file: {0}, backup_dir: {1}".format( self.file_path, self.backup_dir) def handle_file(self): file_exists = os.path.exists(self.file_path) folder_exists = os.path.exists(self.file_dir) if file_exists: try: self.get_dict() except (Exception, ValueError): file_exists = False if not file_exists: if not folder_exists: os.makedirs(self.file_dir) self.write_dict({}) def get_dict(self): ''' Gives you the whole config dictionary from config file ''' with open(self.file_path, 'r')as rf: data = json.load(rf) return data def write_dict(self, new_dict): ''' params: dictionary containing configs returns : nothing ''' with open(self.file_path, 'w')as rf: json.dump(new_dict, rf, indent=2) def __dict_accesor(self, dict_name, key_list): ''' Makes multi level dict easy to access name['a']['b']['c']...... Params: dict_name(str) = name of dictionary key_list(list) = list of keys to use as ['key1']['key2'].... Returns: A string like name['k1']['k2'] Maybe use it with exec/eval ''' for i in key_list: dict_name += "['{0}']".format(i) return dict_name def write(self, key, value): ''' writes to a config file as a dictionary params: key:name of setting, path of setting value: value of setting Usage: Config.write('user.email','a@a.com') Config.write(' ''' def make_depth(key_list): ''' Creates depth assuming nothing existed before Returns: A dictionary with all list items in nested form and last item being assigned the given value ''' value = None key_list.reverse() for key in key_list: value = {key: value} return value def ensure_path(key_list, data_dict): first_half = '' second_half = ' = temp_dict' temp_dict = data_dict for index, item in enumerate(key_list): if item in temp_dict: temp_dict = temp_dict[item] else: temp_dict.update( make_depth(key_list[index:]) ) first_half = self.__dict_accesor( 'data_dict', key_list[:index] ) exec(first_half + second_half) break with open(self.file_path, 'r')as rf: data_dict = json.load(rf) key_list = [ i.strip() for i in key.split(":") ] first_half = self.__dict_accesor('data_dict', key_list) second_half = '= value' ensure_path(key_list, data_dict) exec(first_half + second_half) self.write_dict(data_dict) def read(self, key=None, value=None, all_keys=False, all_values=False): ''' Reads and return key or value from config file (returns config dict if no parameter) Params: [o] key: key of dict. Use (:) eg: key:nkey for depth [o] value : value of dictionary to get key of [o] all_keys [bool] : True returns all keys dict object [o] all_values [bool]: True returns all values dict obj. ''' # Check if more than 1 kwargs given arguments = (key, value, all_keys, all_values) given = [1 for i in arguments if i] if len(given) >= 2: raise ValueError("More than 1 arguments given") # load the dictionary from config configs = self.get_dict() if all_keys: return list(configs.keys()) elif all_values: return list(configs.values()) elif key: cfg_dict = configs key_list = key.split(':') for i in key_list: key = i.strip() cfg_dict = cfg_dict.get(key) if not cfg_dict: return None return cfg_dict elif value: key = [k for k, v in configs.items() if v == value] if len(key) == 1: return key[0] return key def delete_key(self, key): ''' Deletes a given key from the config ''' key_list = key.split(':') config_dict = self.get_dict() dict_accesor = self.__dict_accesor('config_dict', key_list) exec('del ' + dict_accesor) self.write_dict(config_dict) def delete_file(self, backup=True): ''' Deletes config_file to backup_dir (both specified in Config class) Params: backup [boolean] : Defaults to True ''' # manage name acc to current datetime date_today = datetime.datetime.now() str_format = '%d_%b_%Y_%H_%M_%S' name = date_today.strftime(str_format) + '.cfg' if backup: if not os.path.exists(self.backup_dir): os.makedirs(self.backup_dir) new_name = os.path.join(self.backup_dir, name) os.rename(self.file_path, new_name) else: os.remove(self.file_path) PK! blogger_cli/commands/__init__.pyPK!#blogger_cli/commands/cmd_addblog.pyimport click from blogger_cli.cli import pass_context from blogger_cli.commands.cmd_setupblog import setup @click.command('addblog', short_help="Register a new blog") @click.argument('blog') @click.option('-v', '--verbose', is_flag=True) @click.option('-s', '--silent', is_flag=True, help="Do not load the setup.") @pass_context def cli(ctx, blog, silent, verbose): """ Add a new blog.\n Usage:\n blogger addblog blogname\n blogger addblog -s blogname """ ctx.verbose = verbose add_blog_if_valid(ctx, blog) if not silent: ctx.log("Running setup for", blog) setup(ctx, blog) ctx.log("Setup completed succesfully") def add_blog_if_valid(ctx, blog, blog_dir=None): layout = { 'blog_dir': blog_dir, 'blog_posts_dir': None, 'blog_images_dir':None, 'templates_dir':None, 'working_dir': None, 'google_analytics_id': None, 'disqus_username':None, } if not ctx.blog_exists(blog): ctx.config.write(blog, layout) ctx.log("Blog added succesfully") ctx.vlog("Blog", ctx.config.read(blog)) else: ctx.log("Blog already exists!") ctx.vlog('Blogs', ctx.config.read(all_keys=True)) raise SystemExit(0) PK!Q#P P "blogger_cli/commands/cmd_config.pyimport json import click from blogger_cli.cli import pass_context @click.command('config', short_help="Change a blog's configurations") @click.argument('configs', required=False, nargs=-1) @click.option('-b', '--blog', type=str, help="Name of the blog to use") @click.option('-rm', '--remove', is_flag=True, help="Enable delete key") @click.option('-re', '--restore', type=click.Path(exists=True), help="Restore a blog's config") @click.option('-v', '--verbose', is_flag=True) @pass_context def cli(ctx, remove, blog, configs, restore, verbose): """ Change a blogs configurations.\n Examples:\n blogger config -b html_dir C:Users/foldername/\n blogger config -b txt_dir ~/foldername/\n Tip: You can set a defalut blog to avoid using -b option everytime! """ ctx.verbose = verbose blog = __get_blog(ctx, blog) if restore: with open(restore, 'r') as rf: try: config_dict = json.load(rf) except Exception as E: ctx.log('ERROR: Invalid config file.', E) raise SystemExit(0) ctx.config.write(blog, config_dict) ctx.log('Configurations for', blog, 'restored') raise SystemExit(0) if not configs: raise SystemExit("ERROR: MISSING ARGUMENT 'CONFIG KEY'"+ " See blogger config --help") __validate(ctx, blog, configs) key = configs[0] blog_dict = ctx.config.read(key=blog) try: value = configs[1] ctx.config.write(blog + ":" + key, value) ctx.log(key, "->", value) except IndexError: if remove: ctx.config.delete_key(blog + ':' + key) ctx.log(key, "->", "deleted") else: ctx.log(blog_dict.get(key)) raise SystemExit(0) def __get_blog(ctx, blog): if blog is None: default = ctx.default_blog if default is None: ctx.log("Try 'blogger config --help' for help.") raise SystemExit("\nError: Missing option -b ") else: ctx.vlog("\nUsing default blog ->", default) blog = default return blog def __validate(ctx, blog, configs): if len(configs) > 2: raise SystemExit("\nInvalid input arguments") if not ctx.blog_exists(blog): raise SystemExit("\nBlog " + str(blog) + " doesnot exist") key = configs[0] blog_dict = ctx.config.read(key=blog) allowed_keys = ctx.config_keys + ctx.optional_config if key not in allowed_keys and key not in blog_dict: raise SystemExit("\nInvalid config key.") PK!###blogger_cli/commands/cmd_convert.pyimport os import shutil import click from pathlib import Path from datetime import datetime from blogger_cli.commands.convert_utils.classifier import convert_and_copyfiles from blogger_cli.blog_manager import add_post from blogger_cli.cli import pass_context @click.command('convert', short_help='Convert files to html') @click.argument('path', nargs=-1, required=False, type=click.Path(exists=True)) @click.option('--recursive', '-r', 'recursive', is_flag=True, help="Recusively search folder for files to convert. USE WITH CAUTION") @click.option('--not-code', 'iscode', is_flag=True, default=True, help="Do not add mathjax and code support") @click.option('-o', 'destination_dir', type=click.Path(exists=True), help="Destination for converted files,DEFAULT from blog_config") @click.option('-b', '--blog', help="Name of the blog") @click.option('-ex-html', '--exclude-html', 'exclude_html', is_flag=True, help='Ignore html files from conversion') @click.option('--img-dir', 'img_dir', type=click.Path(exists=True), help="Folder for post images. Default: blog's config, Destination dir") @click.option('-no-ex', '--no-extract', 'extract_static', is_flag=True, default=True, help="Disable resource extraction from files like images from ipynbs") @click.option('--topic', 'topic', type=str, help="Topic in which this post should be placed in index") @click.option('-temp', '--template','templates_dir', type=click.Path(exists=True), help="Folder path of custom templates") @click.option('--override-meta','override_meta', is_flag=True, help="Ignore meta topic in favour of --topic option") @click.option('-v', '--verbose', is_flag=True, help="Enable verbose flag") @pass_context def cli(ctx, path, iscode, blog, exclude_html, extract_static, destination_dir, img_dir, topic, templates_dir, recursive, override_meta, verbose): """ Convert from diffrent file format to html Usage:\n blogger convert filename.ipynb\n blogger convert file1 file2 file3 -b blog1 -no-imgex\n blogger convert file1 file2 file3 -b blog1 --topic Tech\n blogger convert filename --not-code -o ~/username.github.io blogger convert ../folder1 file1 ../folder2 -v \n blogger convert -r ../folder1 file1 ../folder2 -v \n blogger convert ../folder1 file1 ../folder2 --exclude-html -v """ ctx.verbose = verbose set_current_blog(ctx, blog) path = path if path else get_files_from_working_dir(ctx, recursive) if not path: ctx.log(":: All files synced.") raise SystemExit(0) resolved_files = get_files_being_converted(path, recursive=recursive) file_ext_map = get_file_ext_map(ctx, exclude_html, resolved_files) destination_dir = check_and_ensure_destination_dir(ctx, destination_dir) img_dir = check_and_ensure_img_dir(ctx, destination_dir, img_dir) templates_dir = resolve_templates_dir(ctx, templates_dir) ctx.log("\nCONVERTING", len(file_ext_map), 'FILES') ctx.vlog("Got files and ext:", file_ext_map, 'img_dir:', img_dir, "templates_dir:", templates_dir) ctx.conversion = { 'file_ext_map': file_ext_map, 'destination_dir': destination_dir, 'iscode': iscode, 'img_dir': img_dir, 'extract_static': extract_static, 'templates_dir':templates_dir, 'override_meta': override_meta, 'topic': topic } filenames_meta = convert_and_copyfiles(ctx) ctx.log("Converted files successfully.\n\nADDING FILES TO BLOG") for filename_meta in filenames_meta: add_post.add(ctx, filename_meta) def get_files_from_working_dir(ctx, recursive): ctx.log("\n:: No input files given. Scanning working folder for changes..") blog = ctx.current_blog last_checked = ctx.config.read(key=blog + ': working_dir_timestamp') working_dir = ctx.config.read(key=blog + ': working_dir') working_dir = Path(str(working_dir)) if not working_dir or not working_dir.exists(): ctx.log(":: Working folder doesnot exist") raise SystemExit(":: ERROR: No input files") current_timestamp = datetime.today().timestamp() ctx.config.write(blog + ':working_dir_timestamp', current_timestamp) if not last_checked: return str(working_dir) try: last_checked = float(last_checked) except: ctx.log("Parse error for last sync. Please convert", "files manually or convert all files in your working_dir") raise SystemExit("ERROR: Last sync date invalid") def is_modified_file(path): if not path.is_file(): return False if path.lstat().st_mtime >= last_checked: return True return False all_files = [] for item in working_dir.iterdir(): if item.is_file(): if is_modified_file(item): all_files.append( str(item.resolve()) ) else: continue elif recursive: items = item.rglob('*') files = [str(i.resolve()) for i in items if is_modified_file(i)] all_files += files return all_files def get_files_being_converted(path, recursive=False): isfolder = lambda x: True if os.path.isdir(x) else False all_files = [] for item in path: if not isfolder(item): abs_file_path = os.path.abspath(item) all_files.append(abs_file_path) continue if recursive: items = Path(item).rglob('*') files = [ str(i.resolve()) for i in items if i.is_file() ] all_files += files elif not recursive: items = get_all_files(item) all_files += items return set(all_files) def get_all_files(folder): files = [] for file in os.listdir(folder): file_path = os.path.join(folder, file) if os.path.isfile(file_path): abs_file_path = os.path.abspath(file_path) files.append(abs_file_path) return files def check_and_ensure_destination_dir(ctx, output_dir): blog = ctx.current_blog blog_dir = ctx.config.read(key=blog+': blog_dir') posts_dir = ctx.config.read(key=blog + ' : blog_posts_dir') if not posts_dir and not output_dir: ctx.log("No target folder set. Specify one with -o option or", "setup in your", blog, "blog's config") raise SystemExit("ERROR: NO OUTPUT FOLDER") if posts_dir: destination_dir = os.path.join(blog_dir, posts_dir) if output_dir: destination_dir = output_dir destination_dir = os.path.normpath(os.path.expanduser(destination_dir)) if not os.path.exists(destination_dir): os.makedirs(destination_dir) return destination_dir def check_and_ensure_img_dir(ctx, destination_dir, output_img_dir): blog = ctx.current_blog blog_dir = ctx.config.read(key=blog+': blog_dir') blog_img_dir = ctx.config.read(key=blog+': blog_images_dir') if not blog_img_dir and not output_img_dir: ctx.log("No images folder given. Specify one with -o option or", "setup in your", blog, "blog's config") ctx.log("If you want to avoid extracting images use -no-ex option.") if click.confirm("Put images dir in same folder as blog posts?"): img_dir = os.path.join(destination_dir, 'images') return img_dir else: raise SystemExit("ERROR: NO OUTPUT FOLDER") if blog_img_dir: img_dir = os.path.join(blog_dir, blog_img_dir) if output_img_dir: img_dir = output_img_dir img_dir = os.path.normpath(os.path.expanduser(img_dir)) if not os.path.exists(img_dir): os.makedirs(img_dir) return img_dir def resolve_templates_dir(ctx, templates_dir_from_cmd): blog = ctx.current_blog blog_dir = ctx.config.read(key=blog+': blog_dir') blog_templates_dir = ctx.config.read(key=blog + ': templates_dir') templates_dir = blog_templates_dir if templates_dir_from_cmd: templates_dir = templates_dir_from_cmd if templates_dir: templates_dir = os.path.normpath(os.path.expanduser(templates_dir)) return templates_dir def set_current_blog(ctx, blog): current_blog = ctx.default_blog if blog: current_blog = blog if not ctx.blog_exists(current_blog): ctx.log("Blog name not given. Use --blog option or set default blog") raise SystemExit("ERROR: Blogname unavailable. SEE blogger convert --help") ctx.current_blog = current_blog def get_file_ext_map(ctx, exclude_html, files_being_converted): file_ext_map = {} if exclude_html: ctx.SUPPORTED_EXTENSIONS.remove('html') for file in files_being_converted: ext = get_file_ext(file) if ext in ctx.SUPPORTED_EXTENSIONS: file_ext_map[file] = ext else: ctx.log("Unsupported ext", ext, "Skipping") continue return file_ext_map def get_file_ext(file): extension = os.path.splitext(file)[1] return extension[1:] PK! IJ "blogger_cli/commands/cmd_export.pyimport os import click from blogger_cli.cli import pass_context from blogger_cli.commands.export_utils.copier import (copy_design_assets, copy_blog_index, copy_blog_config, copy_blog_template, copy_blog_layout) @click.command('export', short_help="Export default design to your blog") @click.argument('resource', type=str) @click.option('-b', '--blog', type=str, help="Name of the blog to use") @click.option('-o', '--to', 'relative_path', help="Relative path from blog root") @click.option('-v', '--verbose', is_flag=True, help='Enable verbose flag') @pass_context def cli(ctx, resource, blog, relative_path, verbose): """ Export necessary resources to bootstrap your blog\n Syntax: \n blogger export [OPTION} [RESOURCE} [RELATIVE BLOG PATH}\n Examples:\n blogger export -b blogs/\n Tip: You can set a defalut blog to avoid using -b option everytime!\n blogger export assets/css/\n RESOURCES:\n design_assets, blog_template, blog_index, blog_config blog_layout """ ctx.verbose = verbose validate_blog_and_settings(ctx, blog, relative_path) export_path = resolve_export_path(ctx, relative_path) resource_map = { 'design_assets': copy_design_assets, 'blog_template': copy_blog_template, 'blog_index': copy_blog_index, 'blog_config': copy_blog_config, 'blog_layout':copy_blog_layout, } transfer = resource_map.get(resource) if not transfer: ctx.log("No such resource. See blogger export --help") raise SystemExit("ERROR: INVALID RESOURCE NAME") ctx.vlog("Using function", transfer) transfer(ctx, export_path) def validate_blog_and_settings(ctx, input_blog, input_path): blog = ctx.default_blog if input_blog: blog = input_blog blog_exists = ctx.blog_exists(blog) if blog_exists: settings = ctx.config.read(key=blog + ': blog_dir') if not settings and not input_path: ctx.log("Set config value for blog_dir in", blog, "blog") raise SystemExit("ERROR: MISSING CONFIG: blog_dir") elif not blog or not blog_exists: ctx.log("Pass a correct blog with -b option", "or set a default blog") raise SystemExit("ERROR: INVALID_BLOG_NAME: " + str(blog)) ctx.current_blog = blog def resolve_export_path(ctx, relative_path): blog = ctx.current_blog blog_dir = ctx.config.read(key=blog+': blog_dir') if not blog_dir: if not os.path.exists(os.path.dirname(relative_path)): ctx.log("You have used relative path", relative_path, 'without setting blog_dir value in config!') raise SystemExit("Use full path to export in this folder") else: blog_dir = '' blog_dir = os.path.normpath(os.path.expanduser((blog_dir))) export_path = blog_dir if relative_path: export_path = os.path.join(blog_dir, relative_path) try: os.makedirs(export_path) except FileExistsError: pass ctx.vlog("Got export path", export_path) return export_path PK!hSS blogger_cli/commands/cmd_info.pyfrom itertools import zip_longest import click from blogger_cli import __version__ from blogger_cli.cli import pass_context @click.command('info', short_help="Show blog's properties") @click.argument('blog', required=False) @click.option('--all', 'show_all', is_flag=True) @click.option('-V', '--version', is_flag=True, help='Show version of blogger-cli and exit') @click.option('-v', '--verbose', is_flag=True) @pass_context def cli(ctx, blog, show_all, version, verbose): """ Get details about blogs and app itself\n Usage:\n bloggger info\n blogger info """ ctx.verbose = verbose blog_exists = ctx.blog_exists(blog) if version: ctx.log(__version__) raise SystemExit(0) ctx.log("\nBlogger-cli version:", __version__) if blog and not blog_exists: ctx.log('Invalid blog name. No such blog', blog) elif not blog: # List all blogs ctx.log("\nRegistered Blogs:") for i in ctx.blog_list: default = ctx.default_blog ctx.log(' ', i) if i != default else ctx.log(' ', i, '[default]') if len(ctx.blog_list) == 0: ctx.log(' ', "No blog registered yet!") ctx.log("\nBlog:configs [standard]") for key in ctx.config_keys: ctx.log(' ', key) if show_all: ctx.log("\nOptional:configs [Advanced]") for key in ctx.optional_config: ctx.log(' ', key) ctx.log("\nTip: Use blogger info blogname for blog details\n") else: if blog == ctx.default_blog: ctx.log("\nBlog Name:", blog, '[Default]') else: ctx.log("\nBlog Name:", blog) ctx.log('Configurations:') blog_dict = ctx.config.read(blog) for k, v in sorted(blog_dict.items()): ctx.log(' ', k, "->", v) PK!s"blogger_cli/commands/cmd_rmblog.pyimport click from blogger_cli.cli import pass_context @click.command('rmblog', short_help="Remove a blog") @click.argument('blog') @click.option('-v', '--verbose', is_flag=True) @pass_context def cli(ctx, blog, verbose): """ Remove a blog""" ctx.verbose = verbose if not ctx.blog_exists(blog): ctx.log("Blog doesnot exist! so not removed") ctx.vlog('Blogs: ', ctx.blog_list) else: ctx.config.delete_key(blog) ctx.log("Blog removed succesfully") PK!55!blogger_cli/commands/cmd_serve.pyimport os import socketserver import http.server import click from blogger_cli.cli import pass_context @click.command('serve', short_help="Serve your blog locally") @click.argument('blog', required=False ) @click.option('--port', '-p', 'port', type=int, default=8000) @click.option('-d', '--dir', 'dir', help="Folder path to serve. Default: blog_dir") @click.option('-v', '--verbose', is_flag=True, help='Enable verbosity') @pass_context def cli(ctx, blog, port, dir, verbose): ctx.verbose = verbose ctx.vlog("\n:: GOT blog:", blog, "port:", str(port), "(", type(port), ")") if not blog: blog = ctx.default_blog ctx.vlog(":: No blog name given using default blog:", str(blog)) if not blog: ctx.log("Use blogger serve or set a default blog in configs") raise SystemExit("ERROR: Missing required argument 'BLOG' ") blog_dir = ctx.config.read(key=blog + ':blog_dir') if dir: blog_dir = dir if not blog_dir: ctx.log("CNo blog_dir set blog_dir in config or use --dir option") raise SystemExit("ERROR: No folder specified") blog_dir = os.path.abspath(os.path.expanduser(blog_dir)) ctx.vlog(":: Got blog_dir:", blog_dir) ctx.log(":: Serving at http://localhost:" + str(port) + '/') ctx.log(":: Exit using CTRL+C") serve_locally(blog_dir, port) def serve_locally(dir, PORT): web_dir = dir os.chdir(web_dir) Handler = http.server.SimpleHTTPRequestHandler httpd = socketserver.TCPServer(("", PORT), Handler) httpd.serve_forever() PK!88&blogger_cli/commands/cmd_setdefault.pyimport click from blogger_cli.cli import pass_context @click.command('defaultblog', short_help="Set a blog as default") @click.argument('blog', type=str) @click.option('-v', '--verbose', is_flag=True) @pass_context def cli(ctx, blog, verbose): """ Set a blog as default\n Usage:\n blogger defaultblog blogname """ ctx.verbose = verbose if not ctx.blog_exists(blog): ctx.vlog('Blogs', ctx.blog_list) return ctx.log("No such blog ", blog) default_blog = ctx.default_blog if default_blog: ctx.vlog("Default blog", default_blog, "found transferring its default property to", blog) ctx.config.delete_key(default_blog + ':default') ctx.config.write(blog + ':default', True) ctx.log('Default blog changed from', default_blog, "to", blog) PK!%blogger_cli/commands/cmd_setupblog.pyimport click from blogger_cli.cli import pass_context @click.command('setupblog', short_help="Register a new blog") @click.argument('blog') @click.option('-v', '--verbose', is_flag=True) @pass_context def cli(ctx, blog, verbose): """ Load a setup procedure to a blog.\n Usage:\n blogger setupblog blogname """ ctx.verbose = verbose if not ctx.blog_exists(blog): ctx.log("Blog doesnot exist!") else: ctx.log("Setting up blog") setup(ctx, blog) ctx.log("Blog setup completed succesfully") def setup(ctx, blog): ctx.log("Use n to skip through options!") blog_attrs = ctx.config.read(key=blog) help = { 'blogname': 'Name of your blog', 'blog_dir': 'Path of your blog', 'blog_posts_dir': "blog's posts folder (relative to blog_dir)", 'blog_images_dir': "blog's images folder (relative to blog_dir)", 'templates_dir': "Path of folder of your custom templates (if any)", 'working_dir': "Folder where keep your md, ipynb, html files", 'google_analytics_id': 'It is in the snippet provided by google eg:UA-039224021-1', 'disqus_username': 'It is in url of your disqus account eg: https://username.disqus.com/', } for k, v in sorted(blog_attrs.items()): try: hint = ' - {0}'.format(help[k]) value = click.prompt(k + hint, default=v) if value.strip() == '': ctx.config.write('{0}:{1}'.format(blog, k), None) elif value != 'n': ctx.config.write('{0}:{1}'.format(blog, k), value) except KeyError: # The option is not supposed to be setup by user like defaultblog pass PK!huL%blogger_cli/commands/cmd_uninstall.pyimport os import click import shutil from pkg_resources import resource_filename from blogger_cli import ROOT_DIR, CONFIG_DIR from blogger_cli.cli_utils.installation import (Installer, WINDOWS, BLOGGER_CLI_HOME) @click.command('uninstall', short_help="Uninstall the custom installation") def cli(): """ This command will update blogger-cli if you have installed it with custom installation. """ custom = [False for i in ['.blogger_cli', 'venv'] if i not in ROOT_DIR] if False in custom: print("blogger-cli was not installed by recommended method") raise SystemExit("Use pip uninstall blogger-cli instead to uninstall") if not WINDOWS: installer = Installer() installer.uninstall() return installer = Installer() installer.remove_from_windows_path() new_file_path = os.path.join(CONFIG_DIR, 'blogger_installer.py') installer_location = 'cli_utils/installation.py' installer_path = resource_filename('blogger_cli', installer_location) shutil.copyfile(installer_path, new_file_path) print("Please run this command manually to Uninstall:\n", "python", new_file_path, '--uninstall') PK! |?"blogger_cli/commands/cmd_update.pyimport os import click import shutil from pkg_resources import resource_filename from blogger_cli import ROOT_DIR, CONFIG_DIR from blogger_cli.cli_utils.installation import (Installer, WINDOWS, BLOGGER_CLI_HOME) @click.command('update', short_help="Update the custom installation") @click.option('-f', '--force', is_flag=True) @click.option('--version', is_flag=True) @click.option('-y', 'accept_all', is_flag=True) def cli(version, force, accept_all): """ This command will update blogger-cli if you have installed it with custom installation. """ custom = [False for i in ['.blogger_cli', 'venv'] if i not in ROOT_DIR] if False in custom: print("blogger-cli was not installed by recommended method") raise SystemExit("Use pip install --upgrade blogger-cli instead to upgrade") if not WINDOWS or not force: installer = Installer( version=version, force=force, accept_all=accept_all ) installer.run() return new_file_path = os.path.join(CONFIG_DIR, 'blogger_installer.py') installer_location = 'cli_utils/installation.py' installer_path = resource_filename('blogger_cli', installer_location) shutil.copyfile(installer_path, new_file_path) last_string = '-f ' if version: last_string += ' --version '+version if accept_all: last_string += ' -y ' print("Please run this command manually to force update!:\n", "python", new_file_path, last_string) PK!.blogger_cli/commands/convert_utils/__init__.pyPK!8c^^0blogger_cli/commands/convert_utils/classifier.pyimport os.path from shutil import copyfile, SameFileError from blogger_cli.converter import ipynb_to_html, md_to_html from blogger_cli.blog_manager import add_post def convert_and_copyfiles(ctx): file_ext_map = ctx.conversion['file_ext_map'] filenames_meta = [] convert_file = { 'md': md_to_html.convert_and_copy_to_blog, 'ipynb': ipynb_to_html.convert_and_copy_to_blog, 'html': process_htmlfile, 'htm': process_htmlfile, } for file, filetype in file_ext_map.items(): ctx.vlog(":: Processing the file", file, "filetype:", filetype) converter = convert_file[filetype] html_filename_meta = converter(ctx, file) filenames_meta.append(html_filename_meta) return filenames_meta def process_htmlfile(ctx, html_file): destination_dir = ctx.conversion['destination_dir'] html_filename = os.path.basename(html_file) given_topic = ctx.conversion.get('topic') topic = given_topic if given_topic else '' if topic: ctx.log(":: Got topic, ", topic) html_filename = os.path.join(topic, html_filename) html_file_path = os.path.join(destination_dir, html_filename) meta = dict() ctx.vlog(":: Copying basic html file to", html_file_path) try: copyfile(html_file, html_file_path) except: pass return (html_filename, meta) PK!-blogger_cli/commands/export_utils/__init__.pyPK!JT T +blogger_cli/commands/export_utils/copier.pyimport os import json from distutils.dir_util import copy_tree from distutils.file_util import copy_file from pkg_resources import resource_filename, resource_string import jinja2 from blogger_cli import RESOURCE_DIR from blogger_cli.blog_manager.add_post import get_snippet_content_map def copy_design_assets(ctx, export_path): design_asset_path = os.path.join(RESOURCE_DIR, 'blog_layout', 'assets') ctx.vlog("Copying design assets from", design_asset_path, os.listdir(design_asset_path)) copy_tree(design_asset_path, export_path) return design_asset_path def copy_blog_template(ctx, export_path): blog_template_dir = os.path.join(RESOURCE_DIR, 'blog_layout', '_blogger_templates') build_indexes(ctx) ctx.vlog("Copying blog template from", blog_template_dir, os.listdir(blog_template_dir)) copy_tree(blog_template_dir, export_path) return blog_template_dir def copy_blog_layout(ctx, export_path): blog_layout_dir = os.path.join(RESOURCE_DIR, 'blog_layout') build_indexes(ctx) ctx.vlog("Copying blog template from", blog_layout_dir, os.listdir(blog_layout_dir)) copy_tree(blog_layout_dir, export_path) images_folder = os.path.join(export_path, 'images') if not os.path.exists(images_folder): os.mkdir(images_folder) return blog_layout_dir def build_indexes(ctx): blog = ctx.current_blog templates_dir = ctx.config.read(key=blog+':templates_dir') if templates_dir: templates_dir = os.path.normpath(os.path.expanduser(templates_dir)) ctx.conversion = { 'templates_dir' : templates_dir } meta = dict() snippet = get_snippet_content_map(ctx, meta) indexes = ['main_index.html', 'blog_index.html'] index_template_paths = ['resources/' + index for index in indexes] dest_index_paths = { 'main_index.html': 'resources/blog_layout/index.html', 'blog_index.html': 'resources/blog_layout/blog/index.html', } for index_path in index_template_paths: index_layout = resource_string('blogger_cli', index_path).decode('utf-8') index_template = jinja2.Template(index_layout).render(snippet=snippet) index_filename = os.path.basename(index_path) dest_index_filename = resource_filename('blogger_cli', dest_index_paths[index_filename]) with open(dest_index_filename, 'w') as wf: wf.write(index_template) def copy_blog_config(ctx, export_dir): blog = ctx.current_blog blog_config = ctx.config.read(key=blog) export_path = os.path.join(export_dir, blog+'.json') ctx.vlog("Copying blog config for", blog, "to", export_path) with open(export_path, 'w') as wf: json.dump(blog_config, wf, indent=2) return blog_config def copy_blog_index(ctx, export_path): build_indexes(ctx) blog_index_path = resource_filename('blogger_cli', 'resources/blog_layout/blog/index.html') ctx.vlog("Copying blog index from", blog_index_path) copy_file(blog_index_path, export_path) return blog_index_path PK!!blogger_cli/converter/__init__.pyPK!pxΝ "blogger_cli/converter/extractor.py import os import shutil from base64 import b64decode from pathlib import Path from collections import OrderedDict from bs4 import BeautifulSoup as BS from urllib.request import Request, urlopen def extract_and_write_static(ctx, html_body, topic_filename, blog_post_dir): global EXTRACT_LIST blog = ctx.current_blog EXTRACT_LIST = ctx.config.read(key=blog+':post_extract_list') if not EXTRACT_LIST: EXTRACT_LIST = ['URI', 'URL'] static_dir = ctx.conversion['img_dir'] topic = os.path.dirname(topic_filename) filename = os.path.basename(topic_filename) name, ext = os.path.splitext(filename) static_path = os.path.join(static_dir, topic, name) if not os.path.exists(static_path): os.makedirs(static_path) soup = BS(html_body, 'html.parser') images = soup.find_all('img') ctx.log(":: Found", len(images), "images") extract_images(ctx, images, static_path, filename, blog_post_dir) videos = soup.find_all('video') extract_videos(ctx, videos, static_path, filename, blog_post_dir) ctx.log(":: Found", len(videos), "videos") if not os.listdir(static_path): os.rmdir(static_path) return soup.decode('utf8') def extract_videos(ctx, videos, video_path, filename, blog_post_dir): def get_name_from_title(video_tag): try: video_name = video_tag['title'].strip().lower() except: video_name = None return video_name def get_video_data(video_tag): try: video_data = video_tag['src'] except: video_data = video_tag.source['src'] return video_data for index, video_tag in enumerate(videos): try: video_data = get_video_data(video_tag) except: ctx.log("Cannot find src attribute. Skipping...") continue video_name = get_name_from_title(video_tag) if not video_name: video_name = 'video_' + str(index+1) video_name = video_name.replace(' ', '_').replace('.','_') + '.mp4' video_path = os.path.join(video_path, video_name) if (video_data.startswith('data:video/mp4;base64,') and 'URI' in EXTRACT_LIST): ctx.log(":: Detected DATA URI video. Writing to", video_path) video_tag = extract_and_write_uri(video_data, video_tag, video_path, blog_post_dir) else: file_path = get_absolute_path(ctx, filename) dest_path = os.path.dirname(video_path) extracted_path = extract_static_files(video_data, file_path, dest_path) if extracted_path: ctx.log(":: Detected STATIC video. Copying to", extracted_path) new_video_src = get_static_src(blog_post_dir, extracted_path) video_tag['src'] = new_video_src def extract_images(ctx, images, img_path, filename, blog_post_dir): for index, img_tag in enumerate(images): img_data = img_tag['src'] try: image_name = img_tag['title'].strip().lower() except: image_name = None if not image_name: image_name = 'image_' + str(index+1) image_name = image_name.replace(' ','_').replace('.','_') + '.png' image_path = os.path.join(img_path, image_name) if (img_data.startswith('data:image/png;base64,') and 'URI' in EXTRACT_LIST): ctx.log(":: Detected DATA URI img. Writing to", image_path) img_tag = extract_and_write_uri(img_data, img_tag, image_path, blog_post_dir) elif ( (img_data.startswith('http') or img_data.startswith('https')) and 'URL' in EXTRACT_LIST): img_tag = extract_and_write_url_img(ctx, img_data, img_tag, image_path, blog_post_dir) else: file_path = get_absolute_path(ctx, filename) dest_path = os.path.dirname(image_path) extracted_path = extract_static_files(img_data, file_path, dest_path) if extracted_path: ctx.log(":: Detected STATIC img. Copying to", extracted_path) new_img_src = get_static_src(blog_post_dir, extracted_path) img_tag['src'] = new_img_src def extract_and_write_uri(data, tag, static_path, blog_post_dir): __, encoded = data.split(",", 1) data = b64decode(encoded) with open(static_path, 'wb') as wf: wf.write(data) static_src = get_static_src(blog_post_dir, static_path) tag['src'] = static_src return tag def extract_and_write_url_img(ctx, img_data, img_tag, image_path, blog_post_dir): ctx.vlog(":: Downloading image from", img_data) headers = {'User-Agent': 'Mozilla/5.0 (Macintosh;Intel ' + 'Mac OS X 10_10_1) AppleWebKit/537.36(KHTML, like Gecko)'+ ' Chrome/39.0.2171.95 Safari/537.36'} try: req = Request(img_data, headers=headers) with urlopen(req) as response: raw_image = response.read() ctx.log(":: Detected url image. Writing to", image_path) with open(image_path, 'wb') as wf: wf.write(raw_image) image_src = get_static_src(blog_post_dir, image_path) img_tag['src'] = image_src ctx.vlog(":: Replacing source tag with:", image_src) except Exception as E: ctx.vlog(":: skipping the image.", E) pass return img_tag def get_static_src(destination_dir, static_path): os.chdir(destination_dir) src_path = os.path.relpath(static_path) return src_path def get_absolute_path(ctx, filename): all_files = ctx.conversion['file_ext_map'].keys() file_path = [file for file in all_files if filename in file] return file_path[0] def extract_static_files(file_name, file_path, dest_dir): orig_dir = Path(os.path.dirname(file_path)) static_path = orig_dir / file_name file_name = os.path.basename(file_name) # manage cases like ../../video.mp4 if static_path.exists(): static_path = static_path.resolve() dest_path = os.path.join(dest_dir, file_name) shutil.copyfile(str(static_path), dest_path) return dest_path def extract_main_and_meta_from_file_content(ctx, file_data): metadata = '' meta_start, meta_end = extract_meta_format(ctx) first_mark = file_data.find(meta_start) + len(meta_start) second_mark = file_data.find(meta_end) if not -1 in (first_mark, second_mark): metadata = file_data[first_mark: second_mark] metadata = os.linesep.join([s for s in metadata.splitlines() if s]) main_data = file_data[second_mark + len(meta_end): ] meta_lines = metadata.strip().split('\n') meta = OrderedDict() try: for key_value in meta_lines: key, value = key_value.split(':') meta[key.strip()] = value.strip() except: main_data = file_data ctx.vlog(":: Got metadata", meta) return main_data, meta def extract_meta_format(ctx): meta_separator = ctx.config.read(key=ctx.current_blog + ':meta_format') if meta_separator: meta_signs = [i.strip() for i in meta_separator.strip().split(" ")] try: meta_start, meta_end = meta_signs except: raise SystemExit("Invalid custom meta format", meta_signs) else: meta_start, meta_end = '' return meta_start, meta_end def replace_ext(file_path, ext): file_dir = os.path.dirname(file_path) orig_filename_ext = os.path.basename(file_path) orig_filename = os.path.splitext(orig_filename_ext)[0] new_filename = orig_filename + ext new_file_path = os.path.join(file_dir, new_filename) return new_file_path def extract_topic(ctx, meta): override_meta = ctx.conversion.get('override_meta') given_topic = ctx.conversion.get('topic') meta_topic = meta.get('topic') if meta else None topics = (meta_topic, given_topic) available_topic = [topic for topic in topics if topic] if len(available_topic) == 2: topic = given_topic if override_meta else meta_topic elif available_topic: topic = available_topic[0] else: topic = '' return topic PK!p&blogger_cli/converter/ipynb_to_html.pyimport os import json from shutil import copyfile, SameFileError from collections import OrderedDict import jinja2 from bs4 import BeautifulSoup as BS from nbconvert import HTMLExporter import nbformat from traitlets.config import Config as TraitletsConfig from blogger_cli.converter.extractor import ( extract_meta_format, replace_ext, extract_topic, extract_main_and_meta_from_file_content, extract_and_write_static ) def convert_and_copy_to_blog(ctx, ipynb_file): ipynb_file_path = os.path.abspath(os.path.expanduser(ipynb_file)) html_body, meta = convert_to_html(ctx, ipynb_file_path) html_filename_meta = write_html_and_ipynb(ctx, ipynb_file_path, html_body, meta) return html_filename_meta def convert_to_html(ctx, ipynb_file_path): html_exporter = gen_exporter() ipynb_data, metadata = extract_main_and_meta(ctx, ipynb_file_path) nb = nbformat.reads(ipynb_data, as_version=4) (body, __) = html_exporter.from_notebook_node(nb) return body, metadata def write_html_and_ipynb(ctx, ipynb_file_path, html_body, meta): extract_static = ctx.conversion['extract_static'] destination_dir = ctx.conversion['destination_dir'] ipynb_filename = os.path.basename(ipynb_file_path) given_topic = ctx.conversion.get('topic') topic = given_topic if given_topic else '' if topic: ctx.log(":: Got topic, ", topic) ipynb_filename = os.path.join(topic, ipynb_filename) html_filename = ipynb_filename.replace('.ipynb', '.html') html_file_path = os.path.join(destination_dir, html_filename) new_ipynb_file_path = os.path.join(destination_dir, ipynb_filename) new_blog_post_dir = os.path.dirname(html_file_path) ctx.vlog("New blog_posts_dir finalized::", new_blog_post_dir) if not os.path.exists(new_blog_post_dir): os.mkdir(new_blog_post_dir) if extract_static: html_body = extract_and_write_static(ctx, html_body, ipynb_filename, new_blog_post_dir) def gen_exporter(): config = TraitletsConfig() config.htmlexporter.preprocessors = [ 'nbconvert.preprocessors.extractoutputpreprocessor'] html_exporter = HTMLExporter(config=config) html_exporter.template_file = 'basic' return html_exporter def extract_main_and_meta(ctx, ipynb_file_path): blog = ctx.current_blog metadata = OrderedDict() delete_ipynb_meta = ctx.config.read(key=blog + ':delete_ipynb_meta') ctx.written_ipynb = False with open(ipynb_file_path, 'r', encoding='utf-8') as rf: ipynb_data = rf.read() nbdata_file_path = replace_ext(ipynb_file_path, '.nbdata') if os.path.exists(nbdata_file_path): ctx.vlog(":: Reading nbdata file", nbdata_file_path) with open(nbdata_file_path, 'r', encoding='utf-8') as rf: nbdata_content = rf.read() __, metadata = extract_main_and_meta_from_file_content( ctx, nbdata_content) if not metadata: ctx.vlog(":: Extracting meta from file", ipynb_file_path) ipynb_data, metadata = extract_main_and_meta_from_ipynb( ctx, ipynb_data) if metadata and not delete_ipynb_meta in ['false', 'False']: ipynb_filename = os.path.basename(ipynb_file_path) topic = extract_topic(ctx, metadata) blog_post_dir = get_blog_post_dir(ctx, topic) new_ipynb_file_path = os.path.join(blog_post_dir, ipynb_filename) ctx.log(":: Deleting meta from ipynb_file", new_ipynb_file_path ) with open(new_ipynb_file_path, 'w', encoding='utf-8') as wf: ipynb_dict = json.loads(ipynb_data) json.dump(ipynb_dict, wf, indent=2) ctx.written_ipynb = True return ipynb_data, metadata def extract_main_and_meta_from_ipynb(ctx, ipynb_data): metadata = OrderedDict() ipynb_dict = json.loads(ipynb_data) meta_start, meta_end = extract_meta_format(ctx) try: raw_meta = ipynb_dict['cells'][0].get('source') if not raw_meta: ctx.log(':: Metadata, The first cell is empty!') meta_list = [str(i).strip() for i in raw_meta] try: first_mark = meta_list.index(meta_start) second_mark = meta_list.index(meta_end) except ValueError: ctx.log(':: Meta tags:', meta_start, meta_end, "Not found") return ipynb_data, metadata meta = [i for i in meta_list[first_mark+1:second_mark] if i] for key_value in meta: key, value = key_value.split(':') if value: metadata[key.strip()] = value.strip() del ipynb_dict['cells'][0] ipynb_data = json.dumps(ipynb_dict) except Exception as E: ctx.log(":: Ipynb file is empty") finally: ctx.vlog(":: Got metadata", metadata) return ipynb_data, metadata def get_blog_post_dir(ctx, topic): destination_dir = ctx.conversion['destination_dir'] blog_post_dir = os.path.join(destination_dir, topic) return blog_post_dir def write_html_and_ipynb(ctx, ipynb_file_path, html_body, meta): blog = ctx.current_blog extract_static = ctx.conversion['extract_static'] create_nbdata_file = ctx.config.read(key=blog + ':create_nbdata_file') topic = extract_topic(ctx, meta) ctx.log(":: Got topic,", topic) blog_post_dir = get_blog_post_dir(ctx, topic) ipynb_filename = os.path.basename(ipynb_file_path) html_filename = replace_ext(ipynb_filename, '.html') html_file_path = os.path.join(blog_post_dir, html_filename) new_ipynb_file_path = os.path.join(blog_post_dir, ipynb_filename) ctx.vlog(":: New blog_posts_dir finalized::", blog_post_dir) html_topic_filename = os.path.join(topic, html_filename) if not os.path.exists(blog_post_dir): os.mkdir(blog_post_dir) if extract_static: html_body = extract_and_write_static(ctx, html_body, ipynb_filename, blog_post_dir) if meta and not create_nbdata_file in ['false', 'False']: create_nbdata_file_in_blog_dir(ctx, meta, new_ipynb_file_path) with open(html_file_path, 'w', encoding='utf8') as wf: wf.write(html_body) ctx.log(":: Converted basic html to", html_file_path) if not ctx.written_ipynb: try: copyfile(ipynb_file_path, new_ipynb_file_path) ctx.log(":: Copied ipynb file to", new_ipynb_file_path) except SameFileError: os.remove(new_ipynb_file_path) copyfile(ipynb_file_path, new_ipynb_file_path) ctx.log(":: Overwriting ipynb file", new_ipynb_file_path) return (html_topic_filename, meta) def create_nbdata_file_in_blog_dir(ctx, meta, file_path): meta_string = ''' {{meta_format.start}} {% for key, value in meta.items() %} {{key}}: {{value}} {% endfor %} {{meta_format.end}} ''' meta_start, meta_end = extract_meta_format(ctx) meta_format = { 'start': meta_start, 'end': meta_end } meta_template = jinja2.Template(meta_string) meta_content = meta_template.render(meta_format=meta_format, meta=meta) meta_content = os.linesep.join([s for s in meta_content.splitlines() if s]) nbdata_file_path = replace_ext(file_path, '.nbdata') ctx.log(":: Creating nbdata file", nbdata_file_path) with open(nbdata_file_path, 'w', encoding='utf-8') as wf: wf.write(meta_content) PK!ќq q #blogger_cli/converter/md_to_html.pyimport os from shutil import copyfile, SameFileError from urllib.request import urlopen, Request import markdown from bs4 import BeautifulSoup as BS from blogger_cli.converter.extractor import ( extract_main_and_meta_from_file_content, extract_topic, extract_and_write_static, replace_ext ) def convert_and_copy_to_blog(ctx, md_file): md_file_path = os.path.abspath(os.path.expanduser(md_file)) html_body, meta = convert(ctx, md_file_path) html_filename_meta = write_html_and_md(ctx, html_body, md_file_path, meta) return html_filename_meta def convert(ctx, md_file_path): with open(md_file_path, 'r', encoding='utf8') as rf: md_data = rf.read() ctx.vlog(":: Extracting meta info") main_md, metadata = extract_main_and_meta_from_file_content(ctx, md_data) extensions = ['extra', 'smarty'] html = markdown.markdown(main_md, extensions=extensions, output_format='html5') return html, metadata def write_html_and_md(ctx, html_body, md_file_path, meta): md_filename = os.path.basename(md_file_path) destination_dir = ctx.conversion['destination_dir'] override_meta = ctx.conversion['override_meta'] topic = extract_topic(ctx, meta) md_filename = os.path.join(topic, md_filename) html_filename = replace_ext(md_filename, '.html') html_file_path = os.path.join(destination_dir, html_filename) new_md_file_path = os.path.join(destination_dir, md_filename) new_blog_post_dir = os.path.dirname(html_file_path) ctx.vlog(":: New blog_posts_dir finalized", new_blog_post_dir) if not os.path.exists(new_blog_post_dir): os.mkdir(new_blog_post_dir) extract_static = ctx.conversion['extract_static'] if extract_static: html_body = extract_and_write_static(ctx, html_body, md_filename, new_blog_post_dir) with open(html_file_path, 'w', encoding='utf8') as wf: wf.write(html_body) ctx.log(":: Converted basic html to", html_file_path) try: copyfile(md_file_path, new_md_file_path) ctx.log(":: Copied md file to", new_md_file_path) except SameFileError: os.remove(new_md_file_path) copyfile(md_file_path, new_md_file_path) ctx.log(":: Overwriting md file", new_md_file_path) return (html_filename, meta) PK!!blogger_cli/resources/__init__.pyPK!ql%blogger_cli/resources/blog_index.html {{ snippet.navbar }}
{{ snippet.google_analytics }} PK!XGG=blogger_cli/resources/blog_layout/_blogger_templates/css.html{% if meta.topic %} {% else %} {% endif %} PK!nVVDblogger_cli/resources/blog_layout/_blogger_templates/dark_theme.html {% if meta.topic %} {% else %} {% endif %} PK!6@blogger_cli/resources/blog_layout/_blogger_templates/disqus.html
PK!/Jblogger_cli/resources/blog_layout/_blogger_templates/google_analytics.html PK!>Ētt<blogger_cli/resources/blog_layout/_blogger_templates/js.html PK!/..@blogger_cli/resources/blog_layout/_blogger_templates/layout.html {{ snippet.google_analytics }} {{ snippet.title }} {{ snippet.css }} {{ snippet.mathjax }} {{ snippet.navbar }}
{{ snippet.body }} {{ snippet.disqus }} {{ snippet.js }} {{ snippet.light_theme }}
PK!c`GG@blogger_cli/resources/blog_layout/_blogger_templates/li_tag.html
  • {{ snippet.title }}
  • PK!JLLEblogger_cli/resources/blog_layout/_blogger_templates/light_theme.html {% if meta.topic %} {% else %} {% endif %} PK!e3_~~Ablogger_cli/resources/blog_layout/_blogger_templates/mathjax.html PK!@blogger_cli/resources/blog_layout/_blogger_templates/navbar.html PK!' __Eblogger_cli/resources/blog_layout/_blogger_templates/navbar_data.html{ "Home": "../index.html", "Blog": "index.html", "Projects": "../projects.html/" } PK!y ZLL>blogger_cli/resources/blog_layout/assets/css/bootstrap.min.css@import url("https://fonts.googleapis.com/css?family=News+Cycle:400,700");/*! * bootswatch v3.3.7 * Homepage: http://bootswatch.com * Copyright 2012-2016 Thomas Park * Licensed under MIT * Based on Bootstrap *//*! * Bootstrap v3.3.7 (http://getbootstrap.com) * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:Georgia,"Times New Roman",Times,serif;font-size:14px;line-height:1.42857143;color:#777777;background-color:#ffffff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#eb6864;text-decoration:none}a:hover,a:focus{color:#e22620;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#ffffff;border:1px solid #dddddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:21px;margin-bottom:21px;border:0;border-top:1px solid #eeeeee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"News Cycle","Arial Narrow Bold",sans-serif;font-weight:700;line-height:1.1;color:#000000}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999999}h1,.h1,h2,.h2,h3,.h3{margin-top:21px;margin-bottom:10.5px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10.5px;margin-bottom:10.5px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:39px}h2,.h2{font-size:32px}h3,.h3{font-size:26px}h4,.h4{font-size:19px}h5,.h5{font-size:15px}h6,.h6{font-size:13px}p{margin:0 0 10.5px}.lead{margin-bottom:21px;font-size:17px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:22.5px}}small,.small{font-size:86%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#999999}.text-primary{color:#eb6864}a.text-primary:hover,a.text-primary:focus{color:#e53c37}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-danger{color:#b94a48}a.text-danger:hover,a.text-danger:focus{color:#953b39}.bg-primary{color:#fff;background-color:#eb6864}a.bg-primary:hover,a.bg-primary:focus{background-color:#e53c37}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover,a.bg-info:focus{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover,a.bg-warning:focus{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover,a.bg-danger:focus{background-color:#e4b9b9}.page-header{padding-bottom:9.5px;margin:42px 0 21px;border-bottom:1px solid #eeeeee}ul,ol{margin-top:0;margin-bottom:10.5px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:21px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10.5px 21px;margin:0 0 21px;font-size:18.75px;border-left:5px solid #eeeeee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#999999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:21px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:10px;margin:0 0 10.5px;font-size:14px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333333;background-color:#f5f5f5;border:1px solid #cccccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:5%;padding-right:5%}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#999999;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:21px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #dddddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #dddddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #dddddd}.table .table{background-color:#ffffff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #dddddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #dddddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15.75px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #dddddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:21px;font-size:22.5px;line-height:inherit;color:#777777;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:9px;font-size:15px;line-height:1.42857143;color:#777777}.form-control{display:block;width:100%;height:39px;padding:8px 12px;font-size:15px;line-height:1.42857143;color:#777777;background-color:#ffffff;background-image:none;border:1px solid #cccccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control::-moz-placeholder{color:#999999;opacity:1}.form-control:-ms-input-placeholder{color:#999999}.form-control::-webkit-input-placeholder{color:#999999}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eeeeee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:39px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:31px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:56px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:21px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:9px;padding-bottom:9px;margin-bottom:0;min-height:36px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:31px;padding:5px 10px;font-size:13px;line-height:1.5;border-radius:3px}select.input-sm{height:31px;line-height:31px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:31px;padding:5px 10px;font-size:13px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:31px;line-height:31px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:31px;min-height:34px;padding:6px 10px;font-size:13px;line-height:1.5}.input-lg{height:56px;padding:14px 16px;font-size:19px;line-height:1.3333333;border-radius:6px}select.input-lg{height:56px;line-height:56px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:56px;padding:14px 16px;font-size:19px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:56px;line-height:56px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:56px;min-height:40px;padding:15px 16px;font-size:19px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:48.75px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:39px;height:39px;line-height:39px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:56px;height:56px;line-height:56px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:31px;height:31px;line-height:31px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#468847}.has-success .form-control{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.has-success .input-group-addon{color:#468847;border-color:#468847;background-color:#dff0d8}.has-success .form-control-feedback{color:#468847}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#c09853}.has-warning .form-control{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.has-warning .input-group-addon{color:#c09853;border-color:#c09853;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#c09853}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#b94a48}.has-error .form-control{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.has-error .input-group-addon{color:#b94a48;border-color:#b94a48;background-color:#f2dede}.has-error .form-control-feedback{color:#b94a48}.has-feedback label~.form-control-feedback{top:26px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#b7b7b7}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:9px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:30px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:9px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:15px;font-size:19px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:13px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:8px 12px;font-size:15px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#ffffff;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#ffffff;background-color:#999999;border-color:#999999}.btn-default:focus,.btn-default.focus{color:#ffffff;background-color:#808080;border-color:#595959}.btn-default:hover{color:#ffffff;background-color:#808080;border-color:#7a7a7a}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#ffffff;background-color:#808080;border-color:#7a7a7a}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#ffffff;background-color:#6e6e6e;border-color:#595959}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus{background-color:#999999;border-color:#999999}.btn-default .badge{color:#999999;background-color:#ffffff}.btn-primary{color:#ffffff;background-color:#eb6864;border-color:#eb6864}.btn-primary:focus,.btn-primary.focus{color:#ffffff;background-color:#e53c37;border-color:#b81c18}.btn-primary:hover{color:#ffffff;background-color:#e53c37;border-color:#e4332e}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#e53c37;border-color:#e4332e}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#ffffff;background-color:#dc221c;border-color:#b81c18}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus{background-color:#eb6864;border-color:#eb6864}.btn-primary .badge{color:#eb6864;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#22b24c;border-color:#22b24c}.btn-success:focus,.btn-success.focus{color:#ffffff;background-color:#1a873a;border-color:#0e471e}.btn-success:hover{color:#ffffff;background-color:#1a873a;border-color:#187f36}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#1a873a;border-color:#187f36}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#ffffff;background-color:#14692d;border-color:#0e471e}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus{background-color:#22b24c;border-color:#22b24c}.btn-success .badge{color:#22b24c;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#336699;border-color:#336699}.btn-info:focus,.btn-info.focus{color:#ffffff;background-color:#264c73;border-color:#132639}.btn-info:hover{color:#ffffff;background-color:#264c73;border-color:#24476b}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#264c73;border-color:#24476b}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#ffffff;background-color:#1d3b58;border-color:#132639}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus{background-color:#336699;border-color:#336699}.btn-info .badge{color:#336699;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#f5e625;border-color:#f5e625}.btn-warning:focus,.btn-warning.focus{color:#ffffff;background-color:#ddce0a;border-color:#948a07}.btn-warning:hover{color:#ffffff;background-color:#ddce0a;border-color:#d3c50a}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#ddce0a;border-color:#d3c50a}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#ffffff;background-color:#bbae09;border-color:#948a07}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus{background-color:#f5e625;border-color:#f5e625}.btn-warning .badge{color:#f5e625;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#f57a00;border-color:#f57a00}.btn-danger:focus,.btn-danger.focus{color:#ffffff;background-color:#c26100;border-color:#763b00}.btn-danger:hover{color:#ffffff;background-color:#c26100;border-color:#b85c00}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#c26100;border-color:#b85c00}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#ffffff;background-color:#9e4f00;border-color:#763b00}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus{background-color:#f57a00;border-color:#f57a00}.btn-danger .badge{color:#f57a00;background-color:#ffffff}.btn-link{color:#eb6864;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#e22620;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:14px 16px;font-size:19px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:13px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:13px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:15px;text-align:left;background-color:#ffffff;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#ffffff;background-color:#eb6864}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#eb6864}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:13px;line-height:1.42857143;color:#999999;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:56px;padding:14px 16px;font-size:19px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:56px;line-height:56px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:31px;padding:5px 10px;font-size:13px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:31px;line-height:31px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:8px 12px;font-size:15px;font-weight:normal;line-height:1;color:#777777;text-align:center;background-color:#eeeeee;border:1px solid #cccccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:13px;border-radius:3px}.input-group-addon.input-lg{padding:14px 16px;font-size:19px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eeeeee}.nav>li.disabled>a{color:#999999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eeeeee;border-color:#eb6864}.nav .nav-divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #dddddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#777777;background-color:#ffffff;border:1px solid #dddddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #dddddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #dddddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#ffffff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#eb6864}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #dddddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #dddddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#ffffff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:60px;margin-bottom:21px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:19.5px 15px;font-size:19px;line-height:21px;height:60px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:13px;margin-bottom:13px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:9.75px -15px}.navbar-nav>li>a{padding-top:8px;padding-bottom:8px;line-height:21px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:21px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:10.5px;margin-bottom:10.5px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:10.5px;margin-bottom:10.5px}.navbar-btn.btn-sm{margin-top:14.5px;margin-bottom:14.5px}.navbar-btn.btn-xs{margin-top:19px;margin-bottom:19px}.navbar-text{margin-top:19.5px;margin-bottom:19.5px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#ffffff;border-color:#eeeeee}.navbar-default .navbar-brand{color:#000000}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#000000;background-color:#eeeeee}.navbar-default .navbar-text{color:#000000}.navbar-default .navbar-nav>li>a{color:#000000}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#000000;background-color:#eeeeee}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#000000;background-color:#eeeeee}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#dddddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#dddddd}.navbar-default .navbar-toggle .icon-bar{background-color:#cccccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#eeeeee}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#eeeeee;color:#000000}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#000000}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#000000;background-color:#eeeeee}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#000000;background-color:#eeeeee}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-default .navbar-link{color:#000000}.navbar-default .navbar-link:hover{color:#000000}.navbar-default .btn-link{color:#000000}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#000000}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#cccccc}.navbar-inverse{background-color:#eb6864;border-color:#e53c37}.navbar-inverse .navbar-brand{color:#ffffff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#ffffff;background-color:#e74b47}.navbar-inverse .navbar-text{color:#ffffff}.navbar-inverse .navbar-nav>li>a{color:#ffffff}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#ffffff;background-color:#e74b47}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:#e74b47}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#e53c37}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#e53c37}.navbar-inverse .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#e74944}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#e74b47;color:#ffffff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#e53c37}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#e53c37}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:#e74b47}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#e74b47}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444444;background-color:transparent}}.navbar-inverse .navbar-link{color:#ffffff}.navbar-inverse .navbar-link:hover{color:#ffffff}.navbar-inverse .btn-link{color:#ffffff}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#ffffff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444444}.breadcrumb{padding:8px 15px;margin-bottom:21px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#cccccc}.breadcrumb>.active{color:#999999}.pagination{display:inline-block;padding-left:0;margin:21px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:8px 12px;line-height:1.42857143;text-decoration:none;color:#eb6864;background-color:#ffffff;border:1px solid #dddddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:2;color:#e22620;background-color:#eeeeee;border-color:#dddddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:3;color:#999999;background-color:#f5f5f5;border-color:#dddddd;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999999;background-color:#ffffff;border-color:#dddddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:14px 16px;font-size:19px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:13px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:21px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#ffffff;border:1px solid #dddddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eeeeee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999999;background-color:#ffffff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#eb6864}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#e53c37}.label-success{background-color:#22b24c}.label-success[href]:hover,.label-success[href]:focus{background-color:#1a873a}.label-info{background-color:#336699}.label-info[href]:hover,.label-info[href]:focus{background-color:#264c73}.label-warning{background-color:#f5e625}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ddce0a}.label-danger{background-color:#f57a00}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c26100}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:13px;font-weight:bold;color:#ffffff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#eb6864;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#eb6864;background-color:#ffffff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eeeeee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:23px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px;padding-left:15px;padding-right:15px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:68px}}.thumbnail{display:block;padding:4px;margin-bottom:21px;line-height:1.42857143;background-color:#ffffff;border:1px solid #dddddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#eb6864}.thumbnail .caption{padding:9px;color:#777777}.alert{padding:15px;margin-bottom:21px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#356635}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#2d6987}.alert-warning{background-color:#fcf8e3;border-color:#fbeed5;color:#c09853}.alert-warning hr{border-top-color:#f8e5be}.alert-warning .alert-link{color:#a47e3c}.alert-danger{background-color:#f2dede;border-color:#eed3d7;color:#b94a48}.alert-danger hr{border-top-color:#e6c1c7}.alert-danger .alert-link{color:#953b39}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:21px;margin-bottom:21px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:13px;line-height:21px;color:#ffffff;text-align:center;background-color:#eb6864;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#22b24c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#336699}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f5e625}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#f57a00}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#ffffff;border:1px solid #dddddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333333}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#555555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eeeeee;color:#999999;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#999999}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#eb6864;border-color:#eb6864}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#ffffff}.list-group-item-success{color:#468847;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#468847}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#468847;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#468847;border-color:#468847}.list-group-item-info{color:#3a87ad;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#3a87ad}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#3a87ad;background-color:#c4e3f3}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#3a87ad;border-color:#3a87ad}.list-group-item-warning{color:#c09853;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#c09853}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#c09853;background-color:#faf2cc}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#c09853;border-color:#c09853}.list-group-item-danger{color:#b94a48;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#b94a48}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#b94a48;background-color:#ebcccc}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#b94a48;border-color:#b94a48}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:21px;background-color:#ffffff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:17px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #dddddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #dddddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:21px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #dddddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #dddddd}.panel-default{border-color:#dddddd}.panel-default>.panel-heading{color:#777777;background-color:#f5f5f5;border-color:#dddddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dddddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#777777}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dddddd}.panel-primary{border-color:#eb6864}.panel-primary>.panel-heading{color:#ffffff;background-color:#eb6864;border-color:#eb6864}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#eb6864}.panel-primary>.panel-heading .badge{color:#eb6864;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#eb6864}.panel-success{border-color:#22b24c}.panel-success>.panel-heading{color:#468847;background-color:#22b24c;border-color:#22b24c}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#22b24c}.panel-success>.panel-heading .badge{color:#22b24c;background-color:#468847}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#22b24c}.panel-info{border-color:#336699}.panel-info>.panel-heading{color:#3a87ad;background-color:#336699;border-color:#336699}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#336699}.panel-info>.panel-heading .badge{color:#336699;background-color:#3a87ad}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#336699}.panel-warning{border-color:#f5e625}.panel-warning>.panel-heading{color:#c09853;background-color:#f5e625;border-color:#f5e625}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#f5e625}.panel-warning>.panel-heading .badge{color:#f5e625;background-color:#c09853}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#f5e625}.panel-danger{border-color:#f57a00}.panel-danger>.panel-heading{color:#b94a48;background-color:#f57a00;border-color:#f57a00}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#f57a00}.panel-danger>.panel-heading .badge{color:#f57a00;background-color:#b94a48}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#f57a00}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:22.5px;font-weight:bold;line-height:1;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#ffffff;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{padding:20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:Georgia,"Times New Roman",Times,serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:13px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;background-color:#000000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:Georgia,"Times New Roman",Times,serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:15px;background-color:#ffffff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:15px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ffffff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#ffffff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ffffff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#ffffff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);background-color:rgba(0,0,0,0)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-header:before,.modal-header:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-header:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar{font-size:18px;font-family:"News Cycle","Arial Narrow Bold",sans-serif;font-weight:700}.navbar-default .badge{background-color:#000;color:#fff}.navbar-inverse .badge{background-color:#fff;color:#eb6864}.navbar-brand{font-size:inherit;font-weight:700;text-transform:uppercase}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label,.has-warning .form-control-feedback{color:#f57a00}.has-warning .form-control,.has-warning .form-control:focus{border-color:#f57a00}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label,.has-error .form-control-feedback{color:#eb6864}.has-error .form-control,.has-error .form-control:focus{border-color:#eb6864}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label,.has-success .form-control-feedback{color:#22b24c}.has-success .form-control,.has-success .form-control:focus{border-color:#22b24c}.badge{padding-bottom:4px;vertical-align:3px;font-size:10px}.jumbotron h1,.jumbotron h2,.jumbotron h3,.jumbotron h4,.jumbotron h5,.jumbotron h6{font-family:"News Cycle","Arial Narrow Bold",sans-serif;font-weight:700;color:#000}.panel-primary .panel-title,.panel-success .panel-title,.panel-warning .panel-title,.panel-danger .panel-title,.panel-info .panel-title{color:#fff} PK!ކ%!``7blogger_cli/resources/blog_layout/assets/css/custom.cssbody { font-family: "News Cycle", "Arial Narrow Bold", sans-serif; font-size: 21px; line-height: 1.42857143; color: #777777; background-color: #ffffff; } a.anchor-link:link { text-decoration: none; padding: 0 20px; visibility: hidden } h1:hover .anchor-link, h2:hover .anchor-link, h3:hover .anchor-link, h4:hover .anchor-link, h5:hover .anchor-link, h6:hover .anchor-link { visibility: visible } th, td { padding: 8px; } tr:hover { background-color: #f5f5f5 } div.cell { padding: 4px } .text_cell.rendered h1, h2, h3, h4 { font-weight: 100 } .paper_title { font-size: 24px; } pre { font-family: monospace; border-radius: 0px; } pre code { white-space: pre; } .pre-scrollable { max-height: 340px; overflow-y: scroll; } div.input_prompt { color: firebrick; } div.output_prompt { color: firebrick; } img { max-width: 100% } #content { width: 95%; margin: auto; } @media (min-width: 768px){ #content { width: 80%; margin-right: auto; margin-left: auto; } } .navbar { font-size: 24px; font-family: "News Cycle", "Arial Narrow", sans-serif; font-weight: 300; } pre.prettyprint { white-space: pre; border-radius: 0; } .output_html.rendered_html.output_subarea.output_execute_result { overflow-x: auto; padding: 0.4em; } PK!E~tt;blogger_cli/resources/blog_layout/assets/css/dark_theme.csspre.prettyprint { white-space: pre !important; border-radius: 0 !important; padding: 10px !important; } PK!IdWhWhAblogger_cli/resources/blog_layout/assets/css/font-awesome.min.css/*! * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.4.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"} PK!: 5<blogger_cli/resources/blog_layout/assets/css/light_theme.csspre.prettyprint { white-space: pre !important; border-radius: 4px !important; border: 1px solid #cccccc !important; padding: 10px !important; } PK!~8>blogger_cli/resources/blog_layout/assets/css/python_syntax.css.hll { background-color: #ffffcc } .c { color: #408080; font-style: italic } /* Comment */ .err { border: 1px solid #FF0000 } /* Error */ .k { color: #008000; font-weight: bold } /* Keyword */ .o { color: #666666 } /* Operator */ .ch { color: #408080; font-style: italic } /* Comment.Hashbang */ .cm { color: #408080; font-style: italic } /* Comment.Multiline */ .cp { color: #BC7A00 } /* Comment.Preproc */ .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */ .c1 { color: #408080; font-style: italic } /* Comment.Single */ .cs { color: #408080; font-style: italic } /* Comment.Special */ .gd { color: #A00000 } /* Generic.Deleted */ .ge { font-style: italic } /* Generic.Emph */ .gr { color: #FF0000 } /* Generic.Error */ .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .gi { color: #00A000 } /* Generic.Inserted */ .go { color: #888888 } /* Generic.Output */ .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ .gs { font-weight: bold } /* Generic.Strong */ .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ .gt { color: #0044DD } /* Generic.Traceback */ .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ .kp { color: #008000 } /* Keyword.Pseudo */ .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ .kt { color: #B00040 } /* Keyword.Type */ .m { color: #666666 } /* Literal.Number */ .s { color: #BA2121 } /* Literal.String */ .na { color: #7D9029 } /* Name.Attribute */ .nb { color: #008000 } /* Name.Builtin */ .nc { color: #0000FF; font-weight: bold } /* Name.Class */ .no { color: #880000 } /* Name.Constant */ .nd { color: #AA22FF } /* Name.Decorator */ .ni { color: #999999; font-weight: bold } /* Name.Entity */ .ne { color: #D2413A; font-weight: bold } /* Name.Exception */ .nf { color: #0000FF } /* Name.Function */ .nl { color: #A0A000 } /* Name.Label */ .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ .nt { color: #008000; font-weight: bold } /* Name.Tag */ .nv { color: #19177C } /* Name.Variable */ .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ .w { color: #bbbbbb } /* Text.Whitespace */ .mb { color: #666666 } /* Literal.Number.Bin */ .mf { color: #666666 } /* Literal.Number.Float */ .mh { color: #666666 } /* Literal.Number.Hex */ .mi { color: #666666 } /* Literal.Number.Integer */ .mo { color: #666666 } /* Literal.Number.Oct */ .sa { color: #BA2121 } /* Literal.String.Affix */ .sb { color: #BA2121 } /* Literal.String.Backtick */ .sc { color: #BA2121 } /* Literal.String.Char */ .dl { color: #BA2121 } /* Literal.String.Delimiter */ .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ .s2 { color: #BA2121 } /* Literal.String.Double */ .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ .sh { color: #BA2121 } /* Literal.String.Heredoc */ .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ .sx { color: #008000 } /* Literal.String.Other */ .sr { color: #BB6688 } /* Literal.String.Regex */ .s1 { color: #BA2121 } /* Literal.String.Single */ .ss { color: #19177C } /* Literal.String.Symbol */ .bp { color: #008000 } /* Name.Builtin.Pseudo */ .fm { color: #0000FF } /* Name.Function.Magic */ .vc { color: #19177C } /* Name.Variable.Class */ .vg { color: #19177C } /* Name.Variable.Global */ .vi { color: #19177C } /* Name.Variable.Instance */ .vm { color: #19177C } /* Name.Variable.Magic */ .il { color: #666666 } /* Literal.Number.Integer.Long */ PK!l'1blogger_cli/resources/blog_layout/blog/index.html
    PK! E},blogger_cli/resources/blog_layout/index.html

    Your Name

    Programming enthusiast
    Passionate learner
    Place, City
    Contact: youremail.@gmail.com

    About me

    This is something about me

    PK!XGGblogger_cli/resources/css.html{% if meta.topic %} {% else %} {% endif %} PK!nVV%blogger_cli/resources/dark_theme.html {% if meta.topic %} {% else %} {% endif %} PK!6!blogger_cli/resources/disqus.html
    PK!/+blogger_cli/resources/google_analytics.html PK!>Ēttblogger_cli/resources/js.html PK!/..!blogger_cli/resources/layout.html {{ snippet.google_analytics }} {{ snippet.title }} {{ snippet.css }} {{ snippet.mathjax }} {{ snippet.navbar }}
    {{ snippet.body }} {{ snippet.disqus }} {{ snippet.js }} {{ snippet.light_theme }}
    PK!c`GG!blogger_cli/resources/li_tag.html
  • {{ snippet.title }}
  • PK!JLL&blogger_cli/resources/light_theme.html {% if meta.topic %} {% else %} {% endif %} PK!yZ %blogger_cli/resources/main_index.html

    Your Name

    Programming enthusiast
    Passionate learner
    Place, City
    Contact: youremail.@gmail.com

    About me

    This is something about me

    {{ snippet.google_analytics }} PK!e3_~~"blogger_cli/resources/mathjax.html PK!!blogger_cli/resources/navbar.html PK!' __&blogger_cli/resources/navbar_data.html{ "Home": "../index.html", "Blog": "index.html", "Projects": "../projects.html/" } PK!blogger_cli/tests/__init__.pyPK!822blogger_cli/tests/messages.pyclass BloggerMessage(object): main = '''\ Usage: blogger [OPTIONS] COMMAND [ARGS]... A CLI tool to maintain your blogger blog. Sync, convert and upload :). Options: -v, --verbose enables verbose command --help Show this message and exit. Commands: addblog Register a new blog config Change a blog's configurations convert Convert files to html export Export default design to your blog info Show blog's properties rmblog Remove a blog serve Serve your blog locally setdefault Set a blog as default setupblog Register a new blog uninstall Uninstall the custom installation update Update the custom installation ''' addblog_success = '''\ Blog added succesfully ''' addblog_existing = '''\ Blog already exists! ''' rmblog_success = '''\ Blog removed succesfully ''' info_success = '''\ Registered Blogs: test1 Blog:configs [standard] google_analytics_id disqus_username blog_images_dir templates_dir blog_posts_dir default working_dir blog_dir Tip: Use blogger info blogname for blog details ''' all_info_success = '''\ Registered Blogs: test1 Blog:configs [standard] google_analytics_id disqus_username blog_images_dir templates_dir blog_posts_dir default working_dir blog_dir Optional:configs [Advanced] meta_format post_extract_list index_div_name filter_post_without_title working_dir_timestamp create_nbdata_file delete_ipynb_meta Tip: Use blogger info blogname for blog details ''' PK!4, , blogger_cli/tests/test_basic.pyimport unittest from click.testing import CliRunner from blogger_cli.cli import cli from blogger_cli.tests.messages import BloggerMessage as BM class TestBasic(unittest.TestCase): def setUp(self): self.runner = CliRunner() result = self.runner.invoke(cli, ['addblog', 'test1', '-s']) self.assertEqual(result.output, BM.addblog_success) self.assertEqual(result.exit_code, 0) def test_main(self): result = self.runner.invoke(cli) self.assertEqual(result.exit_code, 0) def test_addblog_existing(self): self.maxDiff = None result = self.runner.invoke(cli, ['addblog', 'test1']) self.assertEqual(result.output, BM.addblog_existing) self.assertEqual(result.exit_code, 0) def test_info_success(self): result = self.runner.invoke(cli, ['info']) self.assertEqual(result.exit_code, 0) self.assertEqual(result.output, BM.info_success) result = self.runner.invoke(cli, ['info', '--all']) self.assertEqual(result.exit_code, 0) self.assertEqual(result.output, BM.all_info_success) def test_setupblog_success(self): result = self.runner.invoke(cli, ['setupblog', 'test1'], input='\nn \nn \nn \nn \nn \nn \nn') self.assertEqual(result.exit_code, 0) def test_setdefault_success(self): result = self.runner.invoke(cli, ['setdefault', 'test1']) self.assertEqual(result.exit_code, 0) def test_config_success(self): result = self.runner.invoke(cli, ['config', '-b', 'test1', 'working_dir', 'html/']) self.assertEqual(result.exit_code, 0) result = self.runner.invoke(cli, ['config', '-b', 'test1', 'working_dir']) self.assertEqual(result.output, 'html/\n') result = self.runner.invoke(cli, ['setdefault', 'test1']) result = self.runner.invoke(cli, ['config', 'blog_dir', '~/blog_dir/']) self.assertEqual(result.exit_code, 0) result = self.runner.invoke(cli, ['config', 'blog_dir']) self.assertEqual(result.output, '~/blog_dir/\n') result = self.runner.invoke(cli, ['config', '-rm', 'default']) self.assertEqual(result.exit_code, 0) result = self.runner.invoke(cli, ['config', '-b', 'test1', 'default']) self.assertEqual(result.exit_code, 0) def test_notadded(self): result = self.runner.invoke(cli, ['rmblog', 'test0']) self.assertEqual(result.exit_code, 0) result = self.runner.invoke(cli, ['setupblog', 'test0']) self.assertEqual(result.exit_code, 0) result = self.runner.invoke(cli, ['info', 'test0']) self.assertEqual(result.exit_code, 0) result = self.runner.invoke(cli, ['setdefault', 'test0']) self.assertEqual(result.exit_code, 0) def tearDown(self): result = self.runner.invoke(cli, ['rmblog', 'test1']) self.assertEqual(result.output, BM.rmblog_success) self.assertEqual(result.exit_code, 0) if __name__ == '__main__': unittest.main() PK!'blogger_cli/tests/test_basic_convert.pyimport os import shutil import unittest from click.testing import CliRunner from blogger_cli import ROOT_DIR from blogger_cli.cli import cli from blogger_cli.tests.messages import BloggerMessage as BM from pkg_resources import resource_filename class TestBasic(unittest.TestCase): def setUp(self): self.runner = CliRunner() HOME_DIR = os.path.expanduser('~') self.export_dir = os.path.join(HOME_DIR, '.blogger_tmp') os.mkdir(self.export_dir) self.blog_dir = os.path.join(self.export_dir, 'blog') self.index_path = os.path.join(self.blog_dir, 'index.html') self.runner.invoke(cli, ['addblog', 'test1'], input=self.export_dir + '\nn \nn \nn \nn \nn \nn') self.runner.invoke(cli, ['config', '-b', 'test1', 'blog_posts_dir', 'blog/']) self.runner.invoke(cli, ['config', '-b', 'test1', 'blog_images_dir', 'images/']) self.runner.invoke(cli, ['export', '-b', 'test1', 'blog_index', '-o', 'blog']) def test_html(self): html_path = resource_filename('blogger_cli', 'tests/tests_resources/html.html') test_index_path = resource_filename('blogger_cli', 'tests/tests_resources/index/html_index.html') result = self.runner.invoke(cli, ['convert', '-b', 'test1', html_path, '-v']) self.assertEqual(result.exit_code, 0) self.assertEqual(['blog', 'images'], os.listdir(self.export_dir)) self.assertEqual( {'html.html', 'index.html'}, set(os.listdir(self.blog_dir)) ) self.assertEqual(self.read_file(self.index_path), self.read_file(test_index_path)) @staticmethod def read_file(file_path): with open(file_path, 'r', encoding='utf-8') as rf: data = rf.read() return data def test_ipynb(self): ipynb1_path = resource_filename('blogger_cli', 'tests/tests_resources/ipynb1.ipynb') test_index_path = resource_filename('blogger_cli', 'tests/tests_resources/index/ipynb1_index.html') result = self.runner.invoke(cli, ['convert', '-b', 'test1', ipynb1_path, '-v']) self.assertEqual(result.exit_code, 0) self.assertEqual( {'blog', 'images'}, set(os.listdir(self.export_dir)) ) self.assertEqual( {'index.html', 'ipynb1.html', 'ipynb1.ipynb'}, set(os.listdir(self.blog_dir)) ) self.assertEqual(self.read_file(self.index_path), self.read_file(test_index_path)) def test_ipynb_images_and_index(self): self.test_ipynb() ipynb2_path = resource_filename('blogger_cli', 'tests/tests_resources/ipynb2.ipynb') test_index_path = resource_filename('blogger_cli', 'tests/tests_resources/index/ipynb2_index.html') result = self.runner.invoke(cli, ['setdefault', 'test1']) result = self.runner.invoke(cli, ['convert', ipynb2_path, '-v']) self.assertEqual(result.exit_code, 0) self.assertEqual( {'blog', 'images'}, set(os.listdir(self.export_dir)) ) self.assertEqual( {'index.html', 'ipynb1.html', 'ipynb1.ipynb', 'ipynb2.html', 'ipynb2.ipynb'}, set(os.listdir(self.blog_dir)) ) self.assertEqual(self.read_file(self.index_path), self.read_file(test_index_path)) images_dir = os.path.join(self.export_dir, 'images') post_image_dir = os.path.join(images_dir, 'ipynb2') self.assertEqual(['ipynb2'], os.listdir(images_dir)) self.assertEqual(['image_1.png'], os.listdir(post_image_dir)) def test_md(self): md_path = resource_filename('blogger_cli', 'tests/tests_resources/md1.md') test_index_path = resource_filename('blogger_cli', 'tests/tests_resources/index/md_index.html') result = self.runner.invoke(cli, ['convert', '-b', 'test1', md_path, '-v']) self.assertEqual(result.exit_code, 0) self.assertEqual( {'blog', 'images'}, set(os.listdir(self.export_dir)) ) self.assertEqual( {'index.html', 'md1.html', 'md1.md'}, set(os.listdir(self.blog_dir)) ) self.assertEqual(self.read_file(self.index_path), self.read_file(test_index_path)) def test_md_meta_and_custom_templates(self): md_path = resource_filename('blogger_cli', 'tests/tests_resources/md2.md') test_results_path = resource_filename('blogger_cli', 'tests/tests_resources/results/md2.html') test_index_path = resource_filename('blogger_cli', 'tests/tests_resources/index/meta_and_templates_index.html') templates_path = os.path.join(ROOT_DIR, 'tests', 'tests_resources', '_blogger_templates') result = self.runner.invoke(cli, ['convert', '-b', 'test1', md_path, '-v', '-temp',templates_path]) self.assertEqual(result.exit_code, 0) self.assertEqual( {'blog', 'images'}, set(os.listdir(self.export_dir)) ) topic_dir = os.path.join(self.blog_dir, 'meta') self.assertEqual( {'md2.html', 'md2.md'}, set(os.listdir(topic_dir)) ) converted_html = os.path.join(topic_dir, 'md2.html') self.assertEqual(self.read_file(self.index_path), self.read_file(test_index_path)) self.assertEqual(self.read_file(converted_html), self.read_file(test_results_path)) def tearDown(self): self.runner.invoke(cli, ['rmblog', 'test1']) shutil.rmtree(self.export_dir) if __name__ == '__main__': unittest.main() PK!`*VI,blogger_cli/tests/test_convert_cmd_parser.pyimport os import shutil import unittest from tempfile import mkdtemp from pkg_resources import resource_filename from click.testing import CliRunner from blogger_cli import ROOT_DIR from blogger_cli.cli import Context from blogger_cli.cli import cli from blogger_cli.commands.cmd_convert import (get_files_being_converted, check_and_ensure_destination_dir) class TestBasic(unittest.TestCase): def setUp(self): self.runner = CliRunner() self.ctx = Context() self.root_dir = ROOT_DIR.capitalize() self.export_dir = mkdtemp() self.blog_dir = os.path.join(self.export_dir, 'blog') self.index_path = os.path.join(self.blog_dir, 'index.html') self.runner.invoke(cli, ['addblog', 'test1'], input=self.export_dir + '\nn \nn \nn \nn \nn \nn') self.runner.invoke(cli, ['config', '-b', 'test1', 'blog_posts_dir', 'blog']) self.runner.invoke(cli, ['config', '-b', 'test1', 'blog_images_dir', 'images']) def test_get_files_being_converted(self): resource_path = os.path.join(self.root_dir, 'tests', 'tests_resources') files = get_files_being_converted( (resource_path, ) ) expected_files = {'html.html', 'ipynb1.ipynb', 'ipynb2.ipynb', 'md1.md', 'md2.md', 'ipynb3.ipynb'} expected = {os.path.join(resource_path, i) for i in expected_files} self.assertEqual(expected, files) index_files = {'html_index.html', 'ipynb1_index.html', 'ipynb2_index.html','md_index.html', 'topic_index.html', 'meta_and_templates_index.html'} template_files = {'layout.html', 'li_tag.html', 'navbar_data.html'} results_files = {'md2.html'} path1_join = lambda x: os.path.join(resource_path, 'index', x) path2_join = lambda x: os.path.join(resource_path, '_blogger_templates', x) path3_join = lambda x: os.path.join(resource_path, 'results', x) expected_files1 = {path1_join(i) for i in index_files} expected_files2 = {path2_join(i) for i in template_files} expected_files3 = {path3_join(i) for i in results_files} expected.update(expected_files1, expected_files2, expected_files3) file1 = os.path.join(resource_path, 'html.html') file2 = os.path.join(resource_path, 'md1.md') files = get_files_being_converted((file1, file2, resource_path), recursive=True) self.assertEqual(expected, files) def nulllog(self, msg, *args, **kwargs): pass def test_check_and_ensure_destination_dir(self): ctx = self.ctx ctx.log = self.nulllog ctx.current_blog = 'test1' output_dir = None destination_dir = check_and_ensure_destination_dir(ctx, output_dir) self.assertEqual(self.blog_dir, destination_dir) self.runner.invoke(cli, ['config', '-b', 'test1', 'blog_posts_dir', 'blog/test']) destination_dir = check_and_ensure_destination_dir(ctx, output_dir) expected_destination_dir = os.path.join(self.blog_dir, 'test') self.assertEqual(expected_destination_dir, destination_dir) self.runner.invoke(cli, ['config', '-b', 'test1', '-rm', 'blog_dir']) self.runner.invoke(cli, ['config', '-b', 'test1', '-rm', 'blog_posts_dir']) with self.assertRaises(SystemExit) as se: destination_dir = check_and_ensure_destination_dir(ctx, output_dir) def tearDown(self): self.runner.invoke(cli, ['rmblog', 'test1']) shutil.rmtree(self.export_dir) if __name__ == '__main__': unittest.main() PK!!H blogger_cli/tests/test_export.py''' Tests only export command. THE TESTS RUN IN ALPHABETICAL ORDER OF NAME OF FUNCTION |except for setUP (runs first) and tearDown (run last)| ''' import os import shutil import unittest from click.testing import CliRunner from blogger_cli.cli import cli from blogger_cli.tests.messages import BloggerMessage as BM class TestBasic(unittest.TestCase): def setUp(self): self.runner = CliRunner() self.export_dir = os.path.expanduser('~/.blogger_tmp/') self.runner.invoke(cli, ['addblog', 'test1'], input=self.export_dir + '\nn \nn \nn \nn \nn \nn') def test_blog_config(self): result = self.runner.invoke(cli, ['export','-b', 'test1', 'blog_config']) self.assertEqual(result.exit_code, 0) self.assertEqual(['test1.json'], os.listdir(self.export_dir)) result = self.runner.invoke(cli, ['setdefault', 'test1']) result = self.runner.invoke(cli, ['export', 'blog_config', '-o', self.export_dir]) self.assertEqual(result.exit_code, 0) self.assertEqual(['test1.json'], os.listdir(self.export_dir)) self.runner.invoke(cli, ['config', '-rm', 'default']) def test_blog_index(self): result = self.runner.invoke(cli, ['export','-b', 'test1', 'blog_index']) self.assertEqual(result.exit_code, 0) self.assertEqual(['index.html'], os.listdir(self.export_dir)) self.runner.invoke(cli, ['setdefault', 'test1']) result = self.runner.invoke(cli, ['export', 'blog_index', '-o', 'blog']) self.assertEqual(result.exit_code, 0) blog_dir = os.path.join(self.export_dir, 'blog') self.assertEqual(['index.html'], os.listdir(blog_dir)) self.runner.invoke(cli, ['config', '-rm', 'default']) def test_design_assets(self): result = self.runner.invoke(cli, ['export','-b', 'test1', 'design_assets']) self.assertEqual(result.exit_code, 0) expected_files = {'css'} self.assertEqual(expected_files, set(os.listdir(self.export_dir))) result = self.runner.invoke(cli, ['setdefault', 'test1']) result = self.runner.invoke(cli, ['export', 'design_assets', '-o', 'assets']) self.assertEqual(result.exit_code, 0) assets_dir = os.path.join(self.export_dir, 'assets') self.assertEqual(expected_files, set(os.listdir(assets_dir))) self.runner.invoke(cli, ['config', '-rm', 'default']) def test_export_blog_layout(self): assets_dir = os.path.join(self.export_dir, 'assets') result = self.runner.invoke(cli, ['setdefault', 'test1']) result = self.runner.invoke(cli, ['export', 'blog_layout', '-o', 'assets']) self.assertEqual(result.exit_code, 0) expected_files = {'assets', 'blog', 'index.html', '_blogger_templates', 'images'} self.assertEqual(expected_files, set(os.listdir(assets_dir))) self.runner.invoke(cli, ['config', '-rm', 'default']) shutil.rmtree(self.export_dir) def test_export_blog_template(self): assets_dir = os.path.join(self.export_dir, 'assets') result = self.runner.invoke(cli, ['setdefault', 'test1']) result = self.runner.invoke(cli, ['export', 'blog_template', '-o', 'assets']) self.assertEqual(result.exit_code, 0) expected_files = {'css.html', 'dark_theme.html','navbar_data.html', 'disqus.html', 'google_analytics.html', 'js.html', 'layout.html', 'li_tag.html', 'light_theme.html', 'mathjax.html', 'navbar.html'} self.assertEqual(expected_files, set(os.listdir(assets_dir))) self.runner.invoke(cli, ['config', '-rm', 'default']) shutil.rmtree(self.export_dir) def tearDown(self): self.runner.invoke(cli, ['rmblog', 'test1']) try: shutil.rmtree(self.export_dir) except FileNotFoundError: #folder already deleted by export_blog_template pass if __name__ == '__main__': unittest.main() PK!E>%%@blogger_cli/tests/tests_resources/_blogger_templates/layout.html {{ snippet.google_analytics }} {{ snippet.title }} {{ snippet.light_theme }} {{ snippet.css }} {{ snippet.mathjax }} {{ snippet.navbar }}
    {% if meta.tags %} tags: {{ meta.tags }}, {% endif %} {% if meta.date %} Date:{{meta.date}} {% endif %} {{ snippet.body }} {{ snippet.disqus }} {{ snippet.js }}
    PK!\E5mWW@blogger_cli/tests/tests_resources/_blogger_templates/li_tag.html
  • {{ snippet.title }} ( {{ meta.date }} )
  • PK!+݂ __Eblogger_cli/tests/tests_resources/_blogger_templates/navbar_data.html{ "Home": "../index.html", "Blog": "index.html", "Contacts": "../contacts.html/" } PK!wrE E +blogger_cli/tests/tests_resources/html.html

    How I built a Command line app to manage my blog

    Why to do it?

    • I have to write code in jupyternotebook and md files
    • I need custom easy solution that is fast
    import os
    
    os.path.join(a, b)
    
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'a' is not defined
    
    help(os.path.abspath)
    
    abspath(path)
        Return the absolute version of a path.
    

    See ? It just works out of the box for me!!

    def test_width_management(width=20):
        for i in range(50):
            print(i, "Cycle of loop has been succesfully completed")
    
    test_width_management()
    

    Well lets test this long output!

    0 Cycle of loop has been succesfully completed
    1 Cycle of loop has been succesfully completed
    2 Cycle of loop has been succesfully completed
    3 Cycle of loop has been succesfully completed
    4 Cycle of loop has been succesfully completed
    5 Cycle of loop has been succesfully completed
    6 Cycle of loop has been succesfully completed
    7 Cycle of loop has been succesfully completed
    8 Cycle of loop has been succesfully completed
    9 Cycle of loop has been succesfully completed
    10 Cycle of loop has been succesfully completed
    11 Cycle of loop has been succesfully completed
    12 Cycle of loop has been succesfully completed
    13 Cycle of loop has been succesfully completed
    14 Cycle of loop has been succesfully completed
    15 Cycle of loop has been succesfully completed
    16 Cycle of loop has been succesfully completed
    17 Cycle of loop has been succesfully completed
    18 Cycle of loop has been succesfully completed
    19 Cycle of loop has been succesfully completed
    20 Cycle of loop has been succesfully completed
    21 Cycle of loop has been succesfully completed
    22 Cycle of loop has been succesfully completed
    23 Cycle of loop has been succesfully completed
    24 Cycle of loop has been succesfully completed
    25 Cycle of loop has been succesfully completed
    26 Cycle of loop has been succesfully completed
    27 Cycle of loop has been succesfully completed
    28 Cycle of loop has been succesfully completed
    29 Cycle of loop has been succesfully completed
    30 Cycle of loop has been succesfully completed
    31 Cycle of loop has been succesfully completed
    32 Cycle of loop has been succesfully completed
    33 Cycle of loop has been succesfully completed
    34 Cycle of loop has been succesfully completed
    35 Cycle of loop has been succesfully completed
    36 Cycle of loop has been succesfully completed
    37 Cycle of loop has been succesfully completed
    38 Cycle of loop has been succesfully completed
    39 Cycle of loop has been succesfully completed
    40 Cycle of loop has been succesfully completed
    41 Cycle of loop has been succesfully completed
    42 Cycle of loop has been succesfully completed
    43 Cycle of loop has been succesfully completed
    44 Cycle of loop has been succesfully completed
    45 Cycle of loop has been succesfully completed
    46 Cycle of loop has been succesfully completed
    47 Cycle of loop has been succesfully completed
    48 Cycle of loop has been succesfully completed
    49 Cycle of loop has been succesfully completed
    
    PK!tp7blogger_cli/tests/tests_resources/index/html_index.html PK!(R339blogger_cli/tests/tests_resources/index/ipynb1_index.html PK!S9blogger_cli/tests/tests_resources/index/ipynb2_index.html PK!A5blogger_cli/tests/tests_resources/index/md_index.html PK!h\\Eblogger_cli/tests/tests_resources/index/meta_and_templates_index.html

    meta

    PK!(2oo8blogger_cli/tests/tests_resources/index/topic_index.html PK!7߽%%.blogger_cli/tests/tests_resources/ipynb1.ipynb{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# python मा selenium को प्रयोग browser automation अथ\n", " वा ब्राउज रलाई आँफै चलाउन प्रयोग हुन्छ। तेस्तै आज हामी python प्रयोग गरेर wifirouter reboot गर्न प्रयोग गर्ने छौ. सबैभन्दा पहिला तपाईंको सिस्टममा python install हुनुपर्छ तेस्तै अब तपाईं https://chromedriver.chromium.org/downloads/ मा गएर आफ्नो chrome भर्सन अनुसार ड्राइभर download गर्नुस्। अब त्यो फाइललाई unzip गरेर तेस्भित्रको फाइललाई तपाईंले सम्झिने फोल्डरमा राख्नुहोस्। \n", "अब cmd कमाण्डलाइनमा गएर pip install selenium टाईप गर्नुहोस् र केहीबेर मै सेलेनियम install हुनेछ। \n", "\n", "अब एउटा फोल्डर बनाउनुहोस् र तपाईंको code editor मा open गर्नुहोस्।\n", "हामी main.py नामको फाइल बनाउछौ। अब तेस्भित्र यि कुराहरु लेख्छौ: " ] }, { "cell_type": "raw", "metadata": {}, "source": [ "from selenium import webdriver\n", "\n", "browser = webdriver.Chrome()\n", "browser.get('https://facebook.com')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "raw", "metadata": {}, "source": [ "browser.get('http://192.168.1.1/login')" ] }, { "cell_type": "raw", "metadata": {}, "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "username = 'admin'\n", "password = 'admin'\n", " \n", "user_field = browser.find_element_by_name('sth')\n", "pass_field = browser.find_element_by_name('sth')\n", "user_field.send_keys(username)\n", "pass_field.send_keys(password) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "browser.find_element_by_css_selector(\"input[onclick*='return saveChanges()']\").click()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "browser.get('http://192.168.1.1/reboot.htm/')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "browser.find_element_by_css_selector(\"input[onclick*='return rebootClick()']\").click()\n", "alert_obj = browser.switch_to.alert\n", "time.sleep(2)\n", "alert_obj.accept() " ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from win_notify import ballon_tip as winnotifier" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "winnotifier(\"sharmaji: Wifi rebooted\",\\\n", " \"TOTOLINK succesfully has been rebooted wait for 10-15 secs\")\n", "time.sleep(3)\n", "browser.close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "chrome_options = webdriver.ChromeOptions()\n", "chrome_options.add_argument(\"--incognito\")\n", "chrome_options.add_argument(\"--disable-extensions\")\n", "chrome_options.add_argument(\"--disable-gpu\")\n", "chrome_options.add_argument(\"--headless\")\n", "browser = webdriver.Chrome(options=chrome_options) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def setup(incognito=False):\n", " global browser\n", " if incognito:\n", " chrome_options = webdriver.ChromeOptions()\n", " chrome_options.add_argument(\"--incognito\")\n", " chrome_options.add_argument(\"--disable-extensions\")\n", " chrome_options.add_argument(\"--disable-gpu\")\n", " chrome_options.add_argument(\"--headless\")\n", " browser = webdriver.Chrome(options=chrome_options)\n", " else:\n", " browser = webdriver.Chrome()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def authenticate(router_user, router_pass):" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def authenticate(router_user, router_pass):\n", " browser.get(\"http://192.168.1.1/login.htm\")\n", " user_field = browser.find_element_by_name('username')\n", " pass_field = browser.find_element_by_name('userpass')\n", " user_field.send_keys(router_user)\n", " pass_field.send_keys(router_pass)\n", " browser.find_element_by_css_selector(\"input[onclick*='return saveChanges()']\").click()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def reboot():\n", " browser.get(\"http://192.168.1.1/reboot.htm\")\n", " time.sleep(1)\n", " browser.find_element_by_css_selector(\"input[onclick*='return rebootClick()']\").click()\n", " alert_obj = browser.switch_to.alert\n", " time.sleep(2)\n", " alert_obj.accept()\n", " winnotifier(\"sharmaji: Wifi rebooted\",\\\n", " \"TOTOLINK succesfully has been rebooted wait for 10-15 secs\")\n", " time.sleep(3)\n", " browser.close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "setup(incognito=True)\n", "try:\n", " authenticate(\"admin\", \"admin\")\n", " reboot()\n", "except:\n", " reboot()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import time\n", "from selenium import webdriver\n", "from win_notify import balloon_tip as winnotifier\n", " \n", " \n", "def setup(incognito=False):\n", " global browser\n", " if incognito:\n", " chrome_options = webdriver.ChromeOptions()\n", " chrome_options.add_argument(\"--incognito\")\n", " chrome_options.add_argument(\"--disable-extensions\")\n", " chrome_options.add_argument(\"--disable-gpu\")\n", " chrome_options.add_argument(\"--headless\")\n", " browser = webdriver.Chrome(options=chrome_options)\n", " else:\n", " browser = webdriver.Chrome()\n", " \n", "def authenticate(\n", " router_user, router_pass, element_name=\"username\",\n", " element_password=\"userpass\", button_onclick='return saveChanges()'):\n", " \n", " browser.get(\"http://192.168.1.1/login.htm\")\n", " username = browser.find_element_by_name(element_name)\n", " password = browser.find_element_by_name(element_password)\n", " username.send_keys(router_user)\n", " password.send_keys(router_pass)\n", " browser.find_element_by_css_selector(\"input[onclick*='return saveChanges()']\").click()\n", " \n", "def reboot():\n", " browser.get(\"http://192.168.1.1/reboot.htm\")\n", " time.sleep(1)\n", " browser.find_element_by_css_selector(\"input[onclick*='return rebootClick()']\").click()\n", " alert_obj = browser.switch_to.alert\n", " time.sleep(2)\n", " alert_obj.accept()\n", " winnotifier(\"sharmaji: Wifi rebooted\",\\\n", " \"TOTOLINK succesfully has been rebooted wait for 10-15 secs\")\n", " time.sleep(3)\n", " browser.close()\n", " \n", "setup(incognito=True)\n", "try:\n", " authenticate(\"admin\", \"admin\")\n", " reboot()\n", "except:\n", " reboot()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.5" } }, "nbformat": 4, "nbformat_minor": 2 } PK!RH~:~:.blogger_cli/tests/tests_resources/ipynb2.ipynb{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Programmatically Understanding Gaussian Process." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import warnings\n", "warnings.filterwarnings('ignore')\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## A function to make matplotlib plot better" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "SPINE_COLOR = 'gray'\n", "\n", "def format_axes(ax):\n", " for spine in ['top', 'right']:\n", " ax.spines[spine].set_visible(False)\n", "\n", " for spine in ['left', 'bottom']:\n", " ax.spines[spine].set_color(SPINE_COLOR)\n", " ax.spines[spine].set_linewidth(0.5)\n", "\n", " ax.xaxis.set_ticks_position('bottom')\n", " ax.yaxis.set_ticks_position('left')\n", "\n", " for axis in [ax.xaxis, ax.yaxis]:\n", " axis.set_tick_params(direction='out', color=SPINE_COLOR)\n", "\n", " return ax" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### One dimensional Gaussian/Normal\n", "\n", "We will start the discussion with 1d Gaussians. Let us write some simple code to generate/sample data from " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "one_dim_normal_data = np.random.normal(0, 1, size=10000)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us now visualise the data in a 1d space using scatter plot" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAD8CAYAAABkbJM/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3XtwZOdZ5/Hv0xe1Wq27RhppLnjGthxsx1kTUrYp/mCWxI7JUnFgwzIsC6YwNUCRAmqXYu11sbKcojYJtRuKSoplSLxxsoSECpvKAJsdHCeCgnKccbIOji8TT2yPR3PxXHp0a6mlvjz7h8452yO3Rq/VwtJkfp+qLvU5/Z7TT5/ufn/nvKe7Ze6OiIjIWlKbXYCIiFwZFBgiIhJEgSEiIkEUGCIiEkSBISIiQRQYIiISRIEhIiJBNiQwzOxuMztqZsfM7P4mt+fM7PPR7U+a2Z5o/oCZfc3M5szsYyuWmYjW+XR0GdqIWkVEZH0yra7AzNLAx4E7gUngiJkdcvfnGprdB1x09+vNbD/wYeBngTLwe8Bbo8tKP+/uT7Vao4iItK7lwABuA465+0sAZvY54B6gMTDuAR6Krn8B+JiZmbuXgH8ws+s3oA6efvppv/XWWzdiVSIiVxMLabQRQ1I7gRMN05PRvKZt3L0KTAMDAev+H9Fw1O+Z2ZoPaGpqKqxiERF5wzbiCKNZR77yB6pC2qz08+5+0sy6gL8EfgH49MpG4+PjB4ADAKOjo2tXKyIi67IRgTEJ7G6Y3gWcWqXNpJllgB6geLmVuvvJ6O+smX2W5aGv1wXG2NjYQeAgwMTEhH5JUUTkn8lGDEkdAUbNbK+ZtQH7gUMr2hwC7o2uvx/4ql/mZ3LNLGNm26LrWeAnge9sQK0iIrJOLR9huHvVzD4AHAbSwCPu/qyZPQw85e6HgE8CnzGzYywfWeyPlzezV4BuoM3M3gfcBRwHDkdhkQa+Avxpq7WKiMj62ffT/8OYmJjwffv2bXYZIiJXmjftU1IiInIVUGCIiEgQBYaIiARRYIiISBAFhoiIBFFgiIhIEAWGiIgEUWCIiEgQBYaIiARRYIiISBAFhoiIBFFgiIhIEAWGiIgEUWCIiEgQBYaIiARRYIiISBAFhoiIBFFgiIhIEAWGiIgEUWCIiEgQBYaIiARRYIiISBAFhoiIBFFgiIhIEAWGiIgEUWCIiEgQBYaIiATZkMAws7vN7KiZHTOz+5vcnjOzz0e3P2lme6L5A2b2NTObM7OPrVjmh83smWiZPzIz24haRURkfVoODDNLAx8HfgK4Cfg5M7tpRbP7gIvufj3wUeDD0fwy8HvA7zRZ9R8DB4DR6HJ3q7WKiMj6bcQRxm3AMXd/yd2XgM8B96xocw/waHT9C8A7zczcveTu/8BycCTMbATodvcn3N2BTwPv24BaRURknTIbsI6dwImG6Ung9tXauHvVzKaBAeD8ZdY5uWKdO5s1HB8fP8DykQijo6NvtHYREQm0EYHR7NyCr6PNutqPjY0dBA4CTExMXG6dIiLSgo0YkpoEdjdM7wJOrdbGzDJAD1BcY5271liniIi8iTYiMI4Ao2a218zagP3AoRVtDgH3RtffD3w1OjfRlLufBmbN7I7o01G/CHxpA2oVEZF1anlIKjon8QHgMJAGHnH3Z83sYeApdz8EfBL4jJkdY/nIYn+8vJm9AnQDbWb2PuAud38O+HXgU0Ae+HJ0ERGRTWKX2dG/4kxMTPi+ffs2uwwRkStN0Pfc9E1vEREJosAQEZEgCgwREQmiwBARkSAKDBERCaLAEBGRIAoMEREJosAQEZEgCgwREQmiwBARkSAKDBERCaLAEBGRIAoMEREJosAQEZEgCgwREQmiwBARkSAKDBERCaLAEBGRIAoMEREJosAQEZEgCgwREQmiwBARkSAKDBERCaLAEBGRIAoMEREJosAQEZEgCgwREQmyIYFhZneb2VEzO2Zm9ze5PWdmn49uf9LM9jTc9kA0/6iZvbth/itm9oyZPW1mT21EnSIisn6ZVldgZmng48CdwCRwxMwOuftzDc3uAy66+/Vmth/4MPCzZnYTsB+4GdgBfMXMbnD3WrTcv3T3863WKCIirduII4zbgGPu/pK7LwGfA+5Z0eYe4NHo+heAd5qZRfM/5+6L7v4ycCxan4iIbDEtH2EAO4ETDdOTwO2rtXH3qplNAwPR/K+vWHZndN2BvzUzB/7E3Q82u/Px8fEDwAGA0dHR1h6JiIisaiMCw5rM88A2l1v2R939lJkNAY+Z2Qvu/vcrG4+NjR0EDgJMTEysvF8REdkgGzEkNQnsbpjeBZxarY2ZZYAeoHi5Zd09/nsW+CIaqhIR2VQbERhHgFEz22tmbSyfxD60os0h4N7o+vuBr7q7R/P3R5+i2guMAt8ws4KZdQGYWQG4C/jOBtQqIiLr1PKQVHRO4gPAYSANPOLuz5rZw8BT7n4I+CTwGTM7xvKRxf5o2WfN7C+A54Aq8BvuXjOz7cAXl8+LkwE+6+7/p9VaRURk/Wx5R//7w8TEhO/bt2+zyxARudI0O5/8Ovqmt4iIBFFgiIhIEAWGiIgEUWCIiEgQBYaIiARRYIiISBAFhoiIBFFgiIhIEAWGiIgEUWCIiEgQBYaIiARRYIiISBAFhoiIBFFgiIhIEAWGiIgEUWCIiEgQBYaIiARRYIiISBAFhoiIBFFgiIhIEAWGiIgEUWCIiEgQBYaIiARRYIiISBAFhoiIBFFgiIhIkA0JDDO728yOmtkxM7u/ye05M/t8dPuTZran4bYHovlHzezdoesUEZE3V6bVFZhZGvg4cCcwCRwxs0Pu/lxDs/uAi+5+vZntBz4M/KyZ3QTsB24GdgBfMbMbomXWWueGKRaLHD9+nNnZWbq6urjmmmvo7+9fdX6z5Z955hleeukl3J1t27bR09ODmSXLvfzyyzz++ON873vfo1wuMzAwQG9vL9VqldnZWUqlEtlsNpk+efIkxWKRhYUFzIxsNks2myWVSrGwsMDc3BxmBkClUsHMyGQyuDv1ep10Oo2ZYWYsLS1Rq9UwM9LpNO6ezM/lcgAsLCxQq9Xo6urCzJifnyedTpPL5ajVaiwuLpLJLL9c2traqNVq1Go13B2AWq1Ge3s7AO6Ou1OpVKjX6xQKBQAuXrxIPp+nvb09WWcul8Pdk/pSqeV9mFQqxeLiIrVajUKhgLuztLREW1sbZsbi4iKVSoWOjg5SqRT1ep1SqUR7ezu5XI5qtUq5XCaVStHW1kYqlaJarSZtFxcX6erqolqtUq1WAcjlcszMzNDe3k4mk6FWqwGQzWZZXFxMtmf8mLPZbNImXnfjNq5UKtRqNSqVCl1dXWSzWSqVCouLi6TTacrlMh0dHZc8b6lUCndnYWEBd6dQKCSPN5PJkMlkkts6OjoAmJ2dpa2tjUwmQzqdTp6bcrmcLF+r1ajX68nzWSqVku0aP65qtUqlUiGXy2Fm1Ot1lpaWaG9vp16vU6vVktdguVymUqmQz+eTbRW/7ubm5ujo6Ei2Q61WI5VKUalUyGaz1Ot13J1cLke9XqdSqeDuZLNZ3J1qtUo2m8XMqFQqLCws0NXVlTx3tVoteZzx85pOpwGS5yduG7+m4ucslUqRTqfJZDLU63Wq1Sr5fD55jdTrdTKZDD09PXR2dlKr1ZiZmaFcLidtR0ZGuO666+js7OTVV19lfn6evr4+rrnmGrq6uigUClx77bXccsstXLx4kb/7u7/jueee4+zZs8zNzSXbYWRkhBtuuIHrrruOer3O+fPnWVhYYGBggNHRUVKpFLOzs8njaOxP4n4otI/aKBZvyHWvwOxHgIfc/d3R9AMA7v5fGtocjto8YWYZ4AwwCNzf2DZuFy122XU2MzEx4fv27XtD9ReLRZ5//nkGBwcpFAqUSiXOnTvH8PAwZ86ced38G2+88ZInpFgs8o1vfINSqcSOHTuYmZnhW9/6FiMjI9x+++2k02n+8R//kWeffZa9e/dSLBZJpVK8+OKLdHZ2Mj09TVdXF/39/Zw+fZqpqSk6OjowM6ampjhz5gzd3d309vaSSqWYnJykWq3S3d3N4OAgi4uLXLhwgWw2m7ypTp06Ra1WY/v27eTzeWZnZzl79iypVIqhoSHa2tqoVqtcvHiR4eFharUaxWKR+fl5hoeHgeXOvaOjI3kDvPLKKywuLlIoFBgcHKRarVIsFrlw4QLpdJre3l6GhoaoVCqkUimmpqYol8vU63VGRkYol8ucPXuW3t5eenp6cHfOnDlDX19f0sHFy3Z1dTEzM5NM9/X1sbi4SCqVSjrN1157jUqlwtDQEIODg0nA9vb20t3dTSaT4YUXXiCdTrN9+3ay2SzpdJqpqSnm5uYYGBhgYGAAd+fcuXOUSiW6u7uZnZ0FSIInDoG4g6zX63R2dibPQaVSYXZ2lsXFRQDy+Xyy3qmpKU6dOgXA2972Njo7OymXy3z3u99lamqKXC5HX18fAwMD1Ov1pDOsVqtcuHABgOHhYdra2jh//jw9PT2USiUWFhbI5/MMDQ1Rr9eZnJxkaWmJoaEhhoaGmJmZoVgsMjMzw7Zt22hra0uCKpfLUSqVWFxcpLu7m1wux8DAAMVikVqtxoULF3B3du7cyblz58jlcnR0dFAqlUin0/T392NmFItFzp07R1dXFzt27KBWqzE3N8fJkydpa2tjx44dZLNZ2tramJmZYWlpiWq1mtTe39+fPM9xrfl8nr6+viQgKpUK58+fp1KpMDg4eMnODMD8/DyFQoFyuZy8ftydfD6PmdHR0ZEE6+zsLOfOnaNSqTA8PMzQ0BAAJ06cYG5ujr6+Pjo6OpiZmaFWq7Fz504ymQynT5+mUqmwfft2Ojs7mZ2dpVarcf78eYaGhrj55pvp7u7mm9/8JgC33XYbN998M9PT08zOznLq1Klkva+++irFYpFt27bR19fH7Ows2WyWwcFBKpUKu3bt4sYbb+TixYs8+eST/NiP/RgjIyM8++yzZDIZbrrpJtLpdNIPAU37rpV9VCALadTyEQawEzjRMD0J3L5aG3evmtk0MBDN//qKZXdG19da54Y4fvw4g4ODdHZ2AiR/jxw5wtvf/vbXzT9+/PglT8bx48eTF1g+n+fMmTO85S1voVQqJde/973vMTIywsLCAjt27Ej2ao8ePcrOnTup1Wp0dHRQqVTYs2cP58+fZ2BgAFjeI4o7//jFNj8/z+7du+no6GBqaoqRkRHa2toAqNfrDA8PU61WGRgYoFar0d3dneydFwoFOjs7KZVK7Nq1KwmGuJOYn5+nVCpx7bXXUqvVyOfz5HI59uzZw+TkJHv27EnCEWBpaQmA0dFR5ufnGRkZSfaUp6en2b59O1NTUywsLDA6Okq1WqW3t5dSqcQtt9ySvKHy+TyLi4ssLS2xfft2zIy5uTn27NnDmTNnGBoaorOzk4WFBYrFInv27GF6epr29nb6+vqSzgOWO+1sNsuOHTtYXFykp6eHVCrFjh07eOGFF8hms1x//fUsLS2RyWQYGBjg5ZdfZmpqih/8wR/kxIkTtLW1MTw8TD6f59ixY+zdu5fXXnsNd6e7u5tCocDc3ByDg4OcOnUqOWoaHh5Ojlza2tqSDrK7uzs56kylUjzxxBOMjIwknXZXV1cSDNPT00ntnZ2dLC0tcdNNNzE3N8fc3BxDQ0OMjIwwMzNDR0dH8jwODQ0xMDBAoVCgVqvR09PD3Nwc27Zto1wuk8/nOXXqFJlMhr1793Lq1Cl2795NV1cX7e3tnDt3juuvv56XX345eY38wA/8AMVikXw+z3XXXUetVmN+fj7pUOPtG+80nDx5kmuvvZZsNkt7ezv9/f3JEXOhUODs2bP09/ezY8cO0uk0hUKBQqHAiRMnSKVSyWu2Vquxbds2pqen2bt3L9PT0wwODlKv1xkaGuL48ePccMMNTE1N0dPTQ7FYTII8DvvOzk7a29uTvfbZ2VmGhobo7e2lo6ODjo4Ocrkcx44dS3bSurq62LZtWxJAO3fuZGFhgWw2yzXXXMPU1BQvvPAC27dvp7u7GzMjl8slz1e5XE62z+HDh5Oj9Di4Ojs7yefzyf3X63WOHj3KHXfckWxrgLe+9a289NJLAOzevZtUKpX0J3G/AzTtu1b2URtpI85hNEumlYctq7V5o/NfZ3x8/MD4+PhT4+PjT8V7c2/E7Oxs0tHECoUCFy5caDo/3gNtXD7eq4HloZ2+vj7q9XqyJxQf/sd/q9UqXV1dzM/Pk8/nL9m7zOfzySF3PBTl7slRQTw/HjaID+3joRpYHirJZDLJ7fFwRTwvnU5Tr9fp7+9PhlJSqVTyAq5WqxQKheS+Goc/4vpyuRzpdDo5xI87qbizjocU4r3warWaDB/FwwHxkFzjkUO8vniIobu7m2q1SiaTob29PRmKyOVyyVBOfLge71nGQwttbW3JsAiQbLNsNktnZ2fyuOPHWqvV6O3tTR53Op2mvb09GYqI28fbKn688Twzo729Paknk8nQ1taWDOnE2yQ+Woyfp/g5ix8fkAyLxcNJPT09y28Cd9LpNJ2dnZcM7cTDLPHjTKfTSY3xdo1fa/HQIyx3MvHrN36OgGS4J+7s4qCM68tkMslt8XT82AuFQjK0k0qlkqHKbDab/I2HQhuHWoGkzrjjb6wxXr6joyN5D8XPM5A8b/F649dEPBQHJO+F+HUdd7Lxdo4fZzzUGL+34vuPdwzi9cc7f+3t7WSzWZaWlpJwLpVKyVBjfPTT3t6evD4bh5hzuRzt7e2Uy2XK5XKyo1UqlZIdqrg/ifuh1fqulX3URtqII4xJYHfD9C5gZc8dt5mMhqR6gOIay661TgDGxsYOAgdheUjqjRbf1dVFqVRKXjiw3MEPDAw0nR+/0RqXn52dTfYk8/k8Fy9eTDoV4JKwKJVKZDIZzp8/T0dHBwsLC0mHk06nWVhYSDqveBw8Pt8Q79G5ezIOHo9vNw4txh1047mKuGNuHFMuFotJ5x0HXNx5l0qlpIbGYYC4vvj8Qr1eT7ZNXH/jG2RmZibpGOfn55NAioetGseSq9Vq0qHFb9iZmRkymUxyTiIO08XFxSRI4g5tYWEBIHkzNp67AZLtVKlUmJubSx53/FjjIavGMfJyuZycN4g76HhbNT7e+LZyuXzJWPzS0lISrPFzOTU1lWyjeCcgvi1+3PGYeRwQ09PTwP/v2Obm5pKQip+L+FxMPB3XGG/X+LWWTqeTTmVubo6uri4WFhaS5whIdioaz93EwzWwfM4mvi2ejp/zxvNx9XqdcrmcvC7jv/Hrt1KpJEN9cUca1xIvF5+vi5efn58nk8kwOztLKpVKjnIbz6nF52LixxwPGcbvhfh1HW+HeDvX63VmZmYuefxLS0vJ+adyuZzU7e7Jjk48ZBnvICwsLCTnj+Kdg3hoM97JiB93fHRdLpeTkHzttdfo7e2lUCgk78u4P2nsh0L6qI20EecwMsB3gXcCJ4EjwL9192cb2vwGcIu7/1p00vun3f3fmNnNwGeB21g+6f04MMryEcZl19mMzmHoHIbOYegchs5h/POdw2g5MADM7D3AHwJp4BF3/30zexh4yt0PmVk78Bngh1g+stjv7i9Fyz4I/DJQBX7b3b+82jrXqmM9gQH6lBToU1KgT0npU1JX9aek3rzA2CrWGxgiIle5oMDQN71FRCSIAkNERIIoMEREJIgCQ0REgigwREQkiAJDRESCKDBERCSIAkNERIIoMEREJIgCQ0REgigwREQkiAJDRESCKDBERCSIAkNERIIoMEREJIgCQ0REgigwREQkiAJDRESCKDBERCSIAkNERIIoMEREJIgCQ0REgigwREQkiAJDRESCKDBERCSIAkNERIIoMEREJEhLgWFm/Wb2mJm9GP3tW6XdvVGbF83s3ob5P2xmz5jZMTP7IzOzaP5DZnbSzJ6OLu9ppU4REWldq0cY9wOPu/so8Hg0fQkz6wfGgNuB24CxhmD5Y+AAMBpd7m5Y9KPufmt0+d8t1ikiIi1qNTDuAR6Nrj8KvK9Jm3cDj7l70d0vAo8Bd5vZCNDt7k+4uwOfXmV5ERHZAloNjO3ufhog+jvUpM1O4ETD9GQ0b2d0feX82AfM7J/M7JHVhrpEROTNk1mrgZl9BRhuctODgfdhTeb5ZebD8lDVB6PpDwL/FfjlZisfHx8/wPKwFqOjo4EliYjIG7VmYLj7u1a7zcxeM7MRdz8dDTGdbdJsEtjXML0LmIjm71ox/1R0n6813MefAn+9Wg1jY2MHgYMAExMTvlo7ERFpTatDUoeA+FNP9wJfatLmMHCXmfVFQ0t3AYejIaxZM7sj+nTUL8bLR+ET+yngOy3WKSIiLVrzCGMNHwL+wszuA14FfgbAzN4B/Jq7/4q7F83sg8CRaJmH3b0YXf914FNAHvhydAH4iJndyvKQ1CvAr7ZYp4iItMiWP6D0/WFiYsL37du32WWIiFxpmp1Tfh1901tERIIoMEREJIgCQ0REgigwREQkiAJDRESCKDBERCSIAkNERIIoMEREJIgCQ0REgigwREQkiAJDRESCKDBERCSIAkNERIIoMEREJIgCQ0REgigwREQkiAJDRESCKDBERCSIAkNERIIoMEREJIgCQ0REgigwREQkiAJDRESCKDBERCSIAkNERIIoMEREJIgCQ0REgrQUGGbWb2aPmdmL0d++VdrdG7V50czubZj/+2Z2wszmVrTPmdnnzeyYmT1pZntaqVNERFrX6hHG/cDj7j4KPB5NX8LM+oEx4HbgNmCsIVj+Kpq30n3ARXe/Hvgo8OEW6xQRkRa1Ghj3AI9G1x8F3tekzbuBx9y96O4XgceAuwHc/evufnqN9X4BeKeZWYu1iohIC1oNjO1xhx/9HWrSZidwomF6Mpp3Ocky7l4FpoGBFmsVEZEWZNZqYGZfAYab3PRg4H00OzLwjVpmfHz8AHAAYHR0NLAkERF5o9YMDHd/12q3mdlrZjbi7qfNbAQ426TZJLCvYXoXMLHG3U4Cu4FJM8sAPUCxWcOxsbGDwEGAiYmJtYJIRETWqdUhqUNA/Kmne4EvNWlzGLjLzPqik913RfNC1/t+4KvurjAQEdlErQbGh4A7zexF4M5oGjN7h5l9AsDdi8AHgSPR5eFoHmb2ETObBDrMbNLMHorW+0lgwMyOAf+eJp++EhGRN5d9P+24T0xM+L59+za7DBGRK03Qp1D1TW8REQmiwBARkSAKDBERCaLAEBGRIAoMEREJosAQEZEgCgwREQmiwBARkSAKDBERCaLAEBGRIAoMEREJosAQEZEgCgwREQmiwBARkSAKDBERCaLAEBGRIAoMEREJosAQEZEgCgwREQmiwBARkSAKDBERCaLAEBGRIAoMEREJosAQEZEgCgwREQmiwBARkSAKDBERCdJSYJhZv5k9ZmYvRn/7Vml3b9TmRTO7t2H+75vZCTObW9H+l8zsnJk9HV1+pZU6RUSkda0eYdwPPO7uo8Dj0fQlzKwfGANuB24DxhqC5a+iec183t1vjS6faLFOERFpUauBcQ/waHT9UeB9Tdq8G3jM3YvufhF4DLgbwN2/7u6nW6xBRETeBK0Gxva4w4/+DjVpsxM40TA9Gc1by782s38ysy+Y2e4W6xQRkRZl1mpgZl8Bhpvc9GDgfViTeb7GMn8F/Lm7L5rZr7F89PLjzRqOj48fAA4AjI6OBpYkIiJvlLmv1XdfZmGzo8A+dz9tZiPAhLu/ZUWbn4va/Go0/SdRuz9vaDPn7p2r3EcaKLp7z1r1jI+Pf4LlI5iVfhj4Zujj2gRbvT7Y+jWqvtZt9Rq3en2w9Wtcrb5XxsbGPrXm0u6+7gvwB8D90fX7gY80adMPvAz0RZeXgf4VbeZWTI80XP8p4Out1PnQQw891cry/9yXrV7flVCj6vv+r3Gr13cl1Nhqfa2ew/gQcKeZvQjcGU1jZu8ws09EgVQEPggciS4PR/Mws4+Y2STQYWaTZvZQtN7fNLNnzezbwG8Cv9RinSIi0qI1z2FcjrtfAN7ZZP5TwK80TD8CPNKk3e8Cv9tk/gPAA63UJiIiG+tq+ab3wc0uYA1bvT7Y+jWqvtZt9Rq3en2w9Wtsqb6WTnqLiMjV42o5whARkRZddYFhZr9jZm5m2za7lkZm9sHoi4pPm9nfmtmOza6pkZn9gZm9ENX4RTPr3eyaVjKzn4k+LFE3s3dsdj0xM7vbzI6a2TEze93P52w2M3vEzM6a2Xc2u5ZmzGy3mX3NzJ6Pnt/f2uyaGplZu5l9w8y+HdU3vtk1rcbM0mb2f83sr9ez/FUVGNE3xu8EXt3sWpr4A3d/m7vfCvw18J83u6AVHgPe6u5vA77L1vxQwneAnwb+frMLiUXfI/o48BPATcDPmdlNm1vV63yK6Od6tqgq8B/c/UbgDuA3ttg2XAR+3N3/BXArcLeZ3bHJNa3mt4Dn17vwVRUYwEdZ/lTWljtx4+4zDZMFtliN7v637l6NJr8O7NrMeppx9+fd/ehm17HCbcAxd3/J3ZeAz7H8G2xbhrv/PVDc7DpW4+6n3f1b0fVZlju8kJ8XelP4svgXt7PRZUu9fwHMbBfwr4B1/5jrVRMYZvZe4KS7f3uza1lN/HPvwM+z9Y4wGv0y8OXNLuIKsd7fUpMmzGwP8EPAk5tbyaWioZ6ngbMs/9jqlqov8ocs7zDX17uClr6HsdWs8btX/wm4682t6FKXq8/dv+TuDwIPmtkDwAdY/ln4LVNf1OZBlocI/uzNrC0WUuMWs57fUpMmzKwT+Evgt1cckW86d68Bt0bn9r5oZm919y1zTsjMfhI46+7fNLN9613P91VguPu7ms03s1uAvcC3zQyWh1O+ZWa3ufuZza6vic8Cf8ObHBhr1Rf986ufBN7pm/R57DewDbeKSaDx15Z3Aac2qZYrlpllWQ6LP3P3/7XZ9azG3afMbILlc0JbJjCAHwXea2bvAdqBbjP7n+7+797ISq6KISl3f8bdh9x9j7vvYflN/PY3MyzWYmaNP7X7XuCFzaqlGTO7G/iPwHvdfX6z67mCHAFGzWyvmbUB+4FDm1zTFcWW9/I+CTzv7v9ts+tZycwG40+MWFpqAAAAw0lEQVQNmlkeeBdb7P3r7g+4+66o/9sPfPWNhgVcJYFxhfiQmX3HzP6J5aGzLfXRQeBjQBfwWPTR3/++2QWtZGY/Ff022Y8Af2Nmhze7puiDAh8ADrN8svYv3P3Zza3qUmb258ATwFui33S7b7NrWuFHgV8Afrzh3za/Z7OLajACfC167x5h+RzGuj62utXpm94iIhJERxgiIhJEgSEiIkEUGCIiEkSBISIiQRQYIiISRIEhIiJBFBgiIhJEgSEiIkH+H17kM3965Kg9AAAAAElFTkSuQmCC\n", "text/plain": [ "
    " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.scatter(one_dim_normal_data, np.zeros_like(one_dim_normal_data), alpha=0.2, c='gray', edgecolors='k', marker='o')\n", "format_axes(plt.gca())" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'F:\\\\my_projects\\\\jupyter_notebooks\\\\data_science'" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import os\n", "os.getcwd()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# How to do this" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.5" } }, "nbformat": 4, "nbformat_minor": 2 } PK!~W"".blogger_cli/tests/tests_resources/ipynb3.ipynb{ "cells": [ { "cell_type": "raw", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# How to extract meta from ipynb file?" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "ename": "AttributeError", "evalue": "module 'os' has no attribute 'print'", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mos\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mos\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mgetcwd\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mos\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;31mAttributeError\u001b[0m: module 'os' has no attribute 'print'" ] } ], "source": [ "import os\n", "os.getcwd()\n", "os.print()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Well, there are\n", "- To do it.\n", "- To not do it." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.5" } }, "nbformat": 4, "nbformat_minor": 2 } PK!'{bw w (blogger_cli/tests/tests_resources/md1.md# How I built a Command line app to manage my blog ## Why to do it? * I have to write code in jupyternotebook and md files * I need custom easy solution that is fast ![image_test](https://github.com/hemanta212.png 'title') ![image_new](https://avatars1.githubusercontent.com/u/25475894?v=4 'raju' ) ``` import os os.path.join(a, b) ``` ``` Traceback (most recent call last): File "", line 1, in NameError: name 'a' is not defined ``` ``` help(os.path.abspath) ``` ``` abspath(path) Return the absolute version of a path. ``` See ? It just works out of the box for me!! ``` def test_width_management(width=20): for i in range(50): print(i, "Cycle of loop has been succesfully completed") test_width_management() ``` Well lets test this long output! ``` 0 Cycle of loop has been succesfully completed 1 Cycle of loop has been succesfully completed 2 Cycle of loop has been succesfully completed 3 Cycle of loop has been succesfully completed 4 Cycle of loop has been succesfully completed 5 Cycle of loop has been succesfully completed 6 Cycle of loop has been succesfully completed 7 Cycle of loop has been succesfully completed 8 Cycle of loop has been succesfully completed 9 Cycle of loop has been succesfully completed 10 Cycle of loop has been succesfully completed 11 Cycle of loop has been succesfully completed 12 Cycle of loop has been succesfully completed 13 Cycle of loop has been succesfully completed 14 Cycle of loop has been succesfully completed 15 Cycle of loop has been succesfully completed 16 Cycle of loop has been succesfully completed 17 Cycle of loop has been succesfully completed 18 Cycle of loop has been succesfully completed 19 Cycle of loop has been succesfully completed 20 Cycle of loop has been succesfully completed 21 Cycle of loop has been succesfully completed 22 Cycle of loop has been succesfully completed 23 Cycle of loop has been succesfully completed 24 Cycle of loop has been succesfully completed 25 Cycle of loop has been succesfully completed 26 Cycle of loop has been succesfully completed 27 Cycle of loop has been succesfully completed 28 Cycle of loop has been succesfully completed 29 Cycle of loop has been succesfully completed 30 Cycle of loop has been succesfully completed 31 Cycle of loop has been succesfully completed 32 Cycle of loop has been succesfully completed 33 Cycle of loop has been succesfully completed 34 Cycle of loop has been succesfully completed 35 Cycle of loop has been succesfully completed 36 Cycle of loop has been succesfully completed 37 Cycle of loop has been succesfully completed 38 Cycle of loop has been succesfully completed 39 Cycle of loop has been succesfully completed 40 Cycle of loop has been succesfully completed 41 Cycle of loop has been succesfully completed 42 Cycle of loop has been succesfully completed 43 Cycle of loop has been succesfully completed 44 Cycle of loop has been succesfully completed 45 Cycle of loop has been succesfully completed 46 Cycle of loop has been succesfully completed 47 Cycle of loop has been succesfully completed 48 Cycle of loop has been succesfully completed 49 Cycle of loop has been succesfully completed ``` PK!F(blogger_cli/tests/tests_resources/md2.md # this is the titile ![image](https://github.com/pykancha.png/ 'Pykancha logo') PK! ee2blogger_cli/tests/tests_resources/results/md2.html this is the titile
    tags: test1, test, Date:3 may

    this is the titile

    image

    PK!HMu(/,blogger_cli-1.0.1.dist-info/entry_points.txtN+I/N.,()JOOO-9z@l\\PK!9//#blogger_cli-1.0.1.dist-info/LICENSEMIT License Copyright (c) 2019 Hemanta Sharma Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. PK!Hu)GTU!blogger_cli-1.0.1.dist-info/WHEEL HM K-*ϳR03rOK-J,/R(O-)$qzd&Y)r$UV&UrPK!H`k$blogger_cli-1.0.1.dist-info/METADATAW͎SPk3=dكƫm+ F M &;j#A䒃rˣGWdtv3ݙ!_U}pho}⃽O<Hy,C&sʝ1}+(kz'kȸu7 #7UIuz@`/NR )=fK8wl乨NvG>65&3]9X1}H\'޺YbK;eic.}JגN|M1^eckuc|3Y '\!* Jg`? u ;Ag٦qkyUd *~%LKQe5y %\Ҏ;҂|"N}ݮy|;'ۢEtG n[/.PP;t 8R|j]tҨuXJo4Q_=d"Mf[D aA7B)Q A?DEw ;:du1^: Dnp!^ L\^w GTR`,Cn&}=-> ?C+4 *kj8?d $K ~f3yZtZ^vw9R}QfV2DUJSΑwlI`JV"PX5zLX#]H+Vy3"i.6̼y҂?k;AǁWvUSeV|7/4pRrgZl =f K9\$`/ Wq|i6Q&] PE_ރF]^}uz.e}qq9ԧٶI߽0l@ c#O&gWҸ+Q]yyp"<5܇"W:8O]d[qۧ|E$4Y % 4yAfDcAF008B+2b=`> ҆Bƅx+]RvW".ByC5us^{ґo|T=D :aPIděeA0TGb#l_s &:n|.% \6/0VSY7{1˵ mvR`"-Gw7ZAJoa'}6 =1/' ]]Oh~p3NkMiS计uO=SO~х&WaO8ۄP/-(h/OrLU(A۫7܁S=~_9hxxǠ֨=Ƚ\;[i-)%ltrbaBhYA(r-6z3Vʮ;uՁeĮ.]xy-ʊPFwi(Z?/R!CKh]B6E 1VoHRNgo٤쀛.HAs%n[B6%,JMZ ݟyj0eejoL~ vUmA²HV!^zNRO茖6;^1VW$aU,O/U% ^=GԎBPó:h'^^ J9lzxʱ|[!(|Uec26I@C-%?o0–Eyx-Lu=P=8:Śd^{K&#_嬍ټaV _I=7TN *O.g@z9]jk՚߮/%&{nvW`=)rUT,c)- y6)mU}p-j/%0WmSm[.s6 Y h:|mGi3ܝ zq2m랠0m7tU."\hK W^fDPm3A<ۓHgܕw:DCWmဢ%3W']??3apcn:y(sgOPz /Yt>{l< V"2a b5sr^P~ G6i+z*ͥovs4Άq"g^&L"QϘ?Pwk^8SHT7\hf)hK&d_x LR{&hK.P͔'uB0XF.9RuJrɝaLwlhU}4)&Pü^m~vMwcm]]Iyb3G X?3rq\!4Q|! -}q ޻,s{<7D:R Y̐a; ;AYx|Gss{^O2wtJxk=8M/m}'hh:<)6Ojf'jpdXKH1Tӑ#>Tȍ[>874vWԌ{ 5볨o^j*A~;a(n8z"kD,88n?PSsE0 [±7p y}z)øNysב&\GOLx5;/ Ij`0j 4BeaUXn*^+sUnP2>&ފT"[ 8xKur-b\旖^!li$D"gwp1˺Esa=/'N"{)Ll6jmsN3OPBPe+| ?+@~,B+(A;;u& RPEz~fTN|=*μC'H-OtM|NޤG gg /~пic)$f.Kx0ArM,OcJ<VE|+sgf˜_bwSؠ-xe"Y6ߑP(&qP+?ƱGmZPK!H]blogger_cli/__init__.pyPK!$)blogger_cli/blog_manager/__init__.pyPK!o!!$kblogger_cli/blog_manager/add_post.pyPK!% 8#blogger_cli/cli.pyPK!!O.blogger_cli/cli_utils/__init__.pyPK!RORO%.blogger_cli/cli_utils/installation.pyPK!`Sȴ$#~blogger_cli/cli_utils/json_writer.pyPK! blogger_cli/commands/__init__.pyPK!#(blogger_cli/commands/cmd_addblog.pyPK!Q#P P "jblogger_cli/commands/cmd_config.pyPK!###blogger_cli/commands/cmd_convert.pyPK! IJ "blogger_cli/commands/cmd_export.pyPK!hSS blogger_cli/commands/cmd_info.pyPK!s"blogger_cli/commands/cmd_rmblog.pyPK!55!blogger_cli/commands/cmd_serve.pyPK!88&9blogger_cli/commands/cmd_setdefault.pyPK!%blogger_cli/commands/cmd_setupblog.pyPK!huL%blogger_cli/commands/cmd_uninstall.pyPK! |?"blogger_cli/commands/cmd_update.pyPK!.+blogger_cli/commands/convert_utils/__init__.pyPK!8c^^0wblogger_cli/commands/convert_utils/classifier.pyPK!-#blogger_cli/commands/export_utils/__init__.pyPK!JT T +nblogger_cli/commands/export_utils/copier.pyPK!! blogger_cli/converter/__init__.pyPK!pxΝ "Jblogger_cli/converter/extractor.pyPK!p&'3blogger_cli/converter/ipynb_to_html.pyPK!ќq q #Qblogger_cli/converter/md_to_html.pyPK!!Zblogger_cli/resources/__init__.pyPK!ql%[blogger_cli/resources/blog_index.htmlPK!XGG=5]blogger_cli/resources/blog_layout/_blogger_templates/css.htmlPK!nVVD^blogger_cli/resources/blog_layout/_blogger_templates/dark_theme.htmlPK!6@`blogger_cli/resources/blog_layout/_blogger_templates/disqus.htmlPK!/Jeblogger_cli/resources/blog_layout/_blogger_templates/google_analytics.htmlPK!>Ētt< gblogger_cli/resources/blog_layout/_blogger_templates/js.htmlPK!/..@iblogger_cli/resources/blog_layout/_blogger_templates/layout.htmlPK!c`GG@gmblogger_cli/resources/blog_layout/_blogger_templates/li_tag.htmlPK!JLLE nblogger_cli/resources/blog_layout/_blogger_templates/light_theme.htmlPK!e3_~~Aoblogger_cli/resources/blog_layout/_blogger_templates/mathjax.htmlPK!@sblogger_cli/resources/blog_layout/_blogger_templates/navbar.htmlPK!' __Eublogger_cli/resources/blog_layout/_blogger_templates/navbar_data.htmlPK!y ZLL>Gvblogger_cli/resources/blog_layout/assets/css/bootstrap.min.cssPK!ކ%!``7\blogger_cli/resources/blog_layout/assets/css/custom.cssPK!E~tt;bblogger_cli/resources/blog_layout/assets/css/dark_theme.cssPK!IdWhWhAqcblogger_cli/resources/blog_layout/assets/css/font-awesome.min.cssPK!: 5<'blogger_cli/resources/blog_layout/assets/css/light_theme.cssPK!~8>!blogger_cli/resources/blog_layout/assets/css/python_syntax.cssPK!l'1}blogger_cli/resources/blog_layout/blog/index.htmlPK! E},blogger_cli/resources/blog_layout/index.htmlPK!XGG!blogger_cli/resources/css.htmlPK!nVV%blogger_cli/resources/dark_theme.htmlPK!6!=blogger_cli/resources/disqus.htmlPK!/+blogger_cli/resources/google_analytics.htmlPK!>Ētt}blogger_cli/resources/js.htmlPK!/..!,blogger_cli/resources/layout.htmlPK!c`GG!blogger_cli/resources/li_tag.htmlPK!JLL&blogger_cli/resources/light_theme.htmlPK!yZ %blogger_cli/resources/main_index.htmlPK!e3_~~"blogger_cli/resources/mathjax.htmlPK!!ablogger_cli/resources/navbar.htmlPK!' __&/ blogger_cli/resources/navbar_data.htmlPK! blogger_cli/tests/__init__.pyPK!822 blogger_cli/tests/messages.pyPK!4, , zblogger_cli/tests/test_basic.pyPK!'blogger_cli/tests/test_basic_convert.pyPK!`*VI,5blogger_cli/tests/test_convert_cmd_parser.pyPK!!H ,Eblogger_cli/tests/test_export.pyPK!E>%%@}Vblogger_cli/tests/tests_resources/_blogger_templates/layout.htmlPK!\E5mWW@[blogger_cli/tests/tests_resources/_blogger_templates/li_tag.htmlPK!+݂ __E[blogger_cli/tests/tests_resources/_blogger_templates/navbar_data.htmlPK!wrE E +w\blogger_cli/tests/tests_resources/html.htmlPK!tp7jblogger_cli/tests/tests_resources/index/html_index.htmlPK!(R339qoblogger_cli/tests/tests_resources/index/ipynb1_index.htmlPK!S9tblogger_cli/tests/tests_resources/index/ipynb2_index.htmlPK!A5 {blogger_cli/tests/tests_resources/index/md_index.htmlPK!h\\Evblogger_cli/tests/tests_resources/index/meta_and_templates_index.htmlPK!(2oo85blogger_cli/tests/tests_resources/index/topic_index.htmlPK!7߽%%.blogger_cli/tests/tests_resources/ipynb1.ipynbPK!RH~:~:.blogger_cli/tests/tests_resources/ipynb2.ipynbPK!~W"".blogger_cli/tests/tests_resources/ipynb3.ipynbPK!'{bw w (;blogger_cli/tests/tests_resources/md1.mdPK!F(blogger_cli/tests/tests_resources/md2.mdPK! ee2blogger_cli/tests/tests_resources/results/md2.htmlPK!HMu(/,vblogger_cli-1.0.1.dist-info/entry_points.txtPK!9//#blogger_cli-1.0.1.dist-info/LICENSEPK!Hu)GTU!Xblogger_cli-1.0.1.dist-info/WHEELPK!H`k$blogger_cli-1.0.1.dist-info/METADATAPK!HQe """blogger_cli-1.0.1.dist-info/RECORDPKWW/