├── .gitattributes
├── react
├── templates
│ ├── cors
│ │ ├── .firebaserc
│ │ ├── _redirects
│ │ ├── firebase.json
│ │ └── _headers
│ ├── env.development
│ ├── public
│ │ ├── favicon.ico
│ │ ├── manifest.json
│ │ ├── index.html
│ │ └── white-logo.svg
│ ├── src
│ │ ├── index.js
│ │ ├── Signin.js
│ │ ├── setupProxy.js
│ │ ├── Profile.js
│ │ ├── App.js
│ │ └── styles
│ │ │ └── style.css
│ ├── gitignore
│ ├── _package.json
│ └── README.md
└── index.js
├── .travis.yml
├── vue
├── templates
│ ├── eslintignore
│ ├── public
│ │ ├── _redirects
│ │ ├── favicon.ico
│ │ ├── avatar-placeholder.png
│ │ ├── manifest.json
│ │ ├── _headers
│ │ ├── index.html
│ │ └── white-logo.svg
│ ├── babel.config.js
│ ├── firebaserc
│ ├── postcss.config.js
│ ├── editorconfig
│ ├── src
│ │ ├── App.vue
│ │ ├── userSession.js
│ │ ├── main.js
│ │ ├── router.js
│ │ ├── components
│ │ │ ├── Landing.vue
│ │ │ └── Dashboard.vue
│ │ ├── views
│ │ │ └── Home.vue
│ │ └── assets
│ │ │ └── styles.css
│ ├── postcssrc.js
│ ├── firebase.json
│ ├── vue.config.js
│ ├── eslintrc.js
│ ├── gitignore
│ ├── jest.config.js
│ └── _package.json
└── index.js
├── .npmignore
├── webpack
├── templates
│ ├── dist
│ │ ├── robots.txt
│ │ ├── favicon.ico
│ │ ├── avatar-placeholder.png
│ │ ├── manifest.json
│ │ ├── index.html
│ │ ├── app.css
│ │ ├── white-logo.svg
│ │ └── bootstrap.min.css
│ ├── netlify.toml
│ ├── webpack.config.js
│ ├── amplify.yml
│ ├── _package.json
│ ├── gitignore
│ ├── firebase.json
│ └── src
│ │ └── index.js
└── index.js
├── cmd
└── index.js
├── .editorconfig
├── .vscode
└── launch.json
├── lib
└── index.js
├── CHANGELOG.md
├── .gitignore
├── package.json
├── .circleci
└── config.yml
├── LICENSE
├── app
└── index.js
├── README.md
└── test
└── app.js
/.gitattributes:
--------------------------------------------------------------------------------
1 | * text=auto
2 |
--------------------------------------------------------------------------------
/react/templates/cors/.firebaserc:
--------------------------------------------------------------------------------
1 | {}
2 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | node_js:
3 | - v8
4 |
--------------------------------------------------------------------------------
/react/templates/cors/_redirects:
--------------------------------------------------------------------------------
1 | /* /index.html 200
2 |
--------------------------------------------------------------------------------
/vue/templates/eslintignore:
--------------------------------------------------------------------------------
1 | build/*.js
2 | config/*.js
3 |
--------------------------------------------------------------------------------
/vue/templates/public/_redirects:
--------------------------------------------------------------------------------
1 | /* /index.html 200
2 |
--------------------------------------------------------------------------------
/react/templates/env.development:
--------------------------------------------------------------------------------
1 | HOST=127.0.0.1
2 | SKIP_PREFLIGHT_CHECK=true
3 |
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | .app-gen-test
2 | .webpack-gen-test
3 | .react-gen-test
4 | .vue-gen-test
5 |
--------------------------------------------------------------------------------
/webpack/templates/dist/robots.txt:
--------------------------------------------------------------------------------
1 | # robotstxt.org/
2 |
3 | User-agent: *
4 | Disallow:
--------------------------------------------------------------------------------
/vue/templates/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | presets: [
3 | '@vue/app'
4 | ]
5 | }
6 |
--------------------------------------------------------------------------------
/vue/templates/firebaserc:
--------------------------------------------------------------------------------
1 | {
2 | "projects": {
3 | "default": "hello-blockstack"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/vue/templates/postcss.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: {
3 | autoprefixer: {}
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/react/templates/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stacks-archive/blockstack-app-generator/HEAD/react/templates/public/favicon.ico
--------------------------------------------------------------------------------
/vue/templates/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stacks-archive/blockstack-app-generator/HEAD/vue/templates/public/favicon.ico
--------------------------------------------------------------------------------
/webpack/templates/dist/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stacks-archive/blockstack-app-generator/HEAD/webpack/templates/dist/favicon.ico
--------------------------------------------------------------------------------
/vue/templates/public/avatar-placeholder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stacks-archive/blockstack-app-generator/HEAD/vue/templates/public/avatar-placeholder.png
--------------------------------------------------------------------------------
/webpack/templates/dist/avatar-placeholder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stacks-archive/blockstack-app-generator/HEAD/webpack/templates/dist/avatar-placeholder.png
--------------------------------------------------------------------------------
/vue/templates/editorconfig:
--------------------------------------------------------------------------------
1 | undefined
2 | [*.{js,jsx,ts,tsx,vue}]
3 | indent_style = space
4 | indent_size = 2
5 | trim_trailing_whitespace = true
6 | insert_final_newline = true
7 |
--------------------------------------------------------------------------------
/cmd/index.js:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | require("../lib/index").createAppGen({
4 | args: process.argv.slice(2)
5 | }).run().catch(error => {
6 | console.error(error);
7 | });
8 |
--------------------------------------------------------------------------------
/vue/templates/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | indent_style = space
5 | indent_size = 2
6 | charset = utf-8
7 | trim_trailing_whitespace = true
8 | insert_final_newline = true
9 |
10 | [*.md]
11 | trim_trailing_whitespace = false
12 |
--------------------------------------------------------------------------------
/vue/templates/postcssrc.js:
--------------------------------------------------------------------------------
1 | // https://github.com/michael-ciniawsky/postcss-load-config
2 |
3 | module.exports = {
4 | "plugins": {
5 | // to edit target browsers: use "browserlist" field in package.json
6 | "autoprefixer": {}
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/vue/templates/src/userSession.js:
--------------------------------------------------------------------------------
1 | import { UserSession, AppConfig } from 'blockstack'
2 |
3 | export const appConfig = new AppConfig(['store_write', 'publish_data'])
4 | export const userSession = new UserSession({ appConfig })
5 | window.userSession = userSession
6 |
--------------------------------------------------------------------------------
/vue/templates/firebase.json:
--------------------------------------------------------------------------------
1 | {
2 | "hosting": {
3 | "public": "dist",
4 | "headers": [ {
5 | "source" : "manifest.json",
6 | "headers" : [ {
7 | "key" : "Access-Control-Allow-Origin",
8 | "value" : "*"
9 | } ]
10 | } ]
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/webpack/templates/dist/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Hello, Blockstack",
3 | "start_url": "localhost:9000",
4 | "description": "A simple demo of Blockstack Auth",
5 | "icons": [{
6 | "src": "favicon.ico",
7 | "sizes": "192x192",
8 | "type": "image/png"
9 | }]
10 | }
--------------------------------------------------------------------------------
/vue/templates/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Hello, Blockstack App",
3 | "start_url": "./index.html",
4 | "description": "A simple Hello, Blockstack app",
5 | "icons": [{
6 | "src": "favicon.ico",
7 | "sizes": "400x400",
8 | "type": "image/png"
9 | }]
10 | }
11 |
--------------------------------------------------------------------------------
/webpack/templates/netlify.toml:
--------------------------------------------------------------------------------
1 | [build]
2 | publish = "dist/"
3 | command = "npm run build"
4 |
5 | [[headers]]
6 | for = "/manifest.json"
7 | [headers.values]
8 | Access-Control-Allow-Origin = "*"
9 | Access-Control-Allow-Headers = "*"
10 | Access-Control-Allow-Methods = "GET"
11 |
--------------------------------------------------------------------------------
/vue/templates/src/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import App from './App.vue'
3 | import router from './router'
4 |
5 | window.blockstack = require('blockstack')
6 | window.axios = require('axios')
7 |
8 | Vue.config.productionTip = false
9 |
10 | new Vue({
11 | router,
12 | render: h => h(App)
13 | }).$mount('#app')
14 |
--------------------------------------------------------------------------------
/react/templates/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Hello, Blockstack",
3 | "description": "A simple demo of Blockstack Auth",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "192x192",
8 | "type": "image/png"
9 | }
10 | ],
11 | "start_url": "./index.html",
12 | "display": "standalone"
13 | }
14 |
--------------------------------------------------------------------------------
/vue/templates/src/router.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import Router from 'vue-router'
3 | import Home from './views/Home.vue'
4 |
5 | Vue.use(Router)
6 |
7 | export default new Router({
8 | mode: 'history',
9 | base: process.env.BASE_URL,
10 | routes: [
11 | {
12 | path: '/',
13 | name: 'home',
14 | component: Home
15 | }
16 | ]
17 | })
18 |
--------------------------------------------------------------------------------
/vue/templates/vue.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | devServer: {
3 | headers: {
4 | 'Access-Control-Allow-Origin': '*',
5 | 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, PATCH, OPTIONS',
6 | 'Access-Control-Allow-Headers': 'X-Requested-With, Content-Type, Origin, Authorization, Accept, Client-Security-Token, Accept-Encoding'
7 | }
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/react/templates/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import ReactDOM from 'react-dom';
3 | import { BrowserRouter } from 'react-router-dom'
4 | import App from './App.js';
5 |
6 | // Require Sass file so webpack can build it
7 | import 'bootstrap/dist/css/bootstrap.css';
8 | import'./styles/style.css';
9 |
10 | ReactDOM.render(, document.getElementById('root'));
--------------------------------------------------------------------------------
/vue/templates/eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | root: true,
3 | env: {
4 | node: true
5 | },
6 | 'extends': [
7 | 'plugin:vue/essential',
8 | '@vue/standard'
9 | ],
10 | rules: {
11 | 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
12 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
13 | },
14 | parserOptions: {
15 | parser: 'babel-eslint'
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/vue/templates/gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | /dist
4 |
5 | # Coverage outputs
6 | coverage/*
7 |
8 | # Get rid of .empty files
9 | .nyc_output/.empty
10 | coverage/.empty
11 | !.empty
12 |
13 | # local env files
14 | .env.local
15 | .env.*.local
16 |
17 | # Log files
18 | npm-debug.log*
19 | yarn-debug.log*
20 | yarn-error.log*
21 |
22 | # Editor directories and files
23 | .idea
24 | .vscode
25 | *.suo
26 | *.ntvs*
27 | *.njsproj
28 | *.sln
29 | *.sw?
30 |
--------------------------------------------------------------------------------
/react/templates/cors/firebase.json:
--------------------------------------------------------------------------------
1 | {
2 | "hosting": {
3 | "public": "build",
4 | "ignore": [
5 | "firebase.json",
6 | "**/.*",
7 | "**/node_modules/**"
8 | ],
9 | "rewrites": [
10 | {
11 | "source": "**",
12 | "destination": "/index.html"
13 | }
14 | ],
15 | "headers": [ {
16 | "source" : "manifest.json",
17 | "headers" : [ {
18 | "key" : "Access-Control-Allow-Origin",
19 | "value" : "*"
20 | } ]
21 | } ]
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/react/templates/cors/_headers:
--------------------------------------------------------------------------------
1 | /index.html
2 | Access-Control-Allow-Origin: *
3 | Access-Control-Allow-Headers: "X-Requested-With, Content-Type, Origin, Authorization, Accept, Client-Security-Token, Accept-Encoding"
4 | Access-Control-Allow-Methods: "POST, GET, OPTIONS, DELETE, PUT"
5 | /manifest.json
6 | Access-Control-Allow-Origin: *
7 | Access-Control-Allow-Headers: "X-Requested-With, Content-Type, Origin, Authorization, Accept, Client-Security-Token, Accept-Encoding"
8 | Access-Control-Allow-Methods: "POST, GET, OPTIONS, DELETE, PUT"
9 |
--------------------------------------------------------------------------------
/vue/templates/public/_headers:
--------------------------------------------------------------------------------
1 | /index.html
2 | Access-Control-Allow-Origin: *
3 | Access-Control-Allow-Headers: "X-Requested-With, Content-Type, Origin, Authorization, Accept, Client-Security-Token, Accept-Encoding"
4 | Access-Control-Allow-Methods: "POST, GET, OPTIONS, DELETE, PUT"
5 | /manifest.json
6 | Access-Control-Allow-Origin: *
7 | Access-Control-Allow-Headers: "X-Requested-With, Content-Type, Origin, Authorization, Accept, Client-Security-Token, Accept-Encoding"
8 | Access-Control-Allow-Methods: "POST, GET, OPTIONS, DELETE, PUT"
9 |
--------------------------------------------------------------------------------
/webpack/templates/webpack.config.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 |
3 | module.exports = {
4 | devServer: {
5 | contentBase: path.join(__dirname, 'dist'),
6 | port: 9000,
7 | open: true,
8 | before: app => {
9 | // Configure manifest.json CORS headers.
10 | app.get('/manifest.json', (req, res, next) => {
11 | res.set({
12 | 'Access-Control-Allow-Origin': '*',
13 | 'Access-Control-Allow-Headers': '*',
14 | 'Access-Control-Allow-Methods': 'GET',
15 | });
16 | next();
17 | })
18 | }
19 | }
20 | };
21 |
--------------------------------------------------------------------------------
/webpack/templates/amplify.yml:
--------------------------------------------------------------------------------
1 | version: 1.0
2 | env:
3 | variables:
4 | VERSION_NODE_DEFAULT: 10
5 | frontend:
6 | phases:
7 | preBuild:
8 | commands:
9 | - npm ci
10 | build:
11 | commands:
12 | - npm run build
13 | artifacts:
14 | baseDirectory: dist
15 | files:
16 | - '**/*'
17 | customHeaders:
18 | - pattern: '**/manifest.json'
19 | headers:
20 | - key: 'Access-Control-Allow-Origin'
21 | value: '*'
22 | - key: 'Access-Control-Allow-Headers'
23 | value: '*'
24 | - key: 'Access-Control-Allow-Methods'
25 | value: 'GET'
26 |
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | {
2 | // Use IntelliSense to learn about possible attributes.
3 | // Hover to view descriptions of existing attributes.
4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5 | "version": "0.2.0",
6 | "configurations": [
7 | {
8 | "type": "node",
9 | "request": "launch",
10 | "name": "Mocha Tests",
11 | "program": "${workspaceRoot}/node_modules/mocha/bin/mocha",
12 | "args": [
13 | "--inspect-brk",
14 | "${workspaceFolder}/test/**/*.js"
15 | ],
16 | "port": 9229,
17 | }
18 | ]
19 | }
20 |
--------------------------------------------------------------------------------
/react/templates/src/Signin.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import { useConnect } from '@blockstack/connect';
3 |
4 | export const Signin = () => {
5 | const { doOpenAuth } = useConnect();
6 |
7 | return (
8 |
9 |
Hello, Blockstack!
10 |
11 |
18 |
19 |
20 | );
21 | }
22 |
23 | export default Signin;
24 |
--------------------------------------------------------------------------------
/react/templates/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Hello, Blockstack
8 |
9 |
10 |
15 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/react/templates/src/setupProxy.js:
--------------------------------------------------------------------------------
1 | // 'React-scripts start' sets up a development server that automatically
2 | // registers files with this name. This proxy file sets up a CORS header
3 | // for manifest.json, allowing sign in via Blockstack without using
4 | // the webpack configuration file that create-react-app has configured
5 | // and hidden.
6 | // https://facebook.github.io/create-react-app/docs/proxying-api-requests-in-development
7 |
8 | module.exports = function(app) {
9 | app.get('/manifest.json', (req, res, next) => {
10 | res.set({
11 | 'Access-Control-Allow-Origin': '*',
12 | 'Access-Control-Allow-Headers': '*',
13 | 'Access-Control-Allow-Methods': 'GET'
14 | });
15 | next();
16 | })
17 | };
--------------------------------------------------------------------------------
/webpack/templates/_package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "hello-blockstack-webpack",
3 | "version": "0.0.0",
4 | "description": "A simple Blockstack app",
5 | "private": true,
6 | "scripts": {
7 | "build": "webpack",
8 | "start": "webpack-dev-server",
9 | "test": "webpack"
10 | },
11 | "author": {
12 | "name": "Blockstack PBC",
13 | "email": "editors@blockstack.com",
14 | "url": "https://blockstack.org"
15 | },
16 | "devDependencies": {
17 | "webpack": "^4.32.2",
18 | "webpack-cli": "^3.3.2",
19 | "webpack-dev-server": "^3.5.1"
20 | },
21 | "dependencies": {
22 | "@blockstack/connect": "^2.4.0",
23 | "blockstack": "^19.2.5",
24 | "react": "^16.13.1",
25 | "react-dom": "^16.13.1"
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/lib/index.js:
--------------------------------------------------------------------------------
1 | const path = require("path");
2 | const YeoEnv = require("yeoman-environment");
3 |
4 | const GENERATOR_NAME = "generator-blockstack:app";
5 |
6 | exports.createAppGen = function createAppGen({
7 | args,
8 | options
9 | } = {}) {
10 | const appPath = path.join(__dirname, "../app");
11 | const env = YeoEnv.createEnv();
12 | env.register(appPath, GENERATOR_NAME);
13 |
14 | const runFn = () => {
15 | const runArgs = [GENERATOR_NAME];
16 | if (typeof args === "string") {
17 | runArgs.push(args);
18 | } else if (Array.isArray(args)) {
19 | runArgs.push(...args);
20 | }
21 | const runResult = env.run(runArgs, options);
22 | return Promise.resolve(runResult);
23 | };
24 |
25 | return { run: runFn, env: env };
26 | }
27 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | ## 0.9.0 - June 17, 2020
4 |
5 | - Integration with `@blockstack/connect` library
6 |
7 | ## 0.7.0 - August 6, 2019
8 | - Added Vue.js generator.
9 | - Updated React generator to use `react-scripts`.
10 | - Updated generators to use blockstack.js v19.2.5.
11 | - Updated yeoman dependencies.
12 | - Updated webpage styling.
13 |
14 |
15 | ## 0.6.0 - April 19, 2019
16 |
17 | - Added a new Webpack-based generator. It's similar to the 'default' generator that uses browserify, but may result in smaller bundle sizes and an easier development environment.
18 | - Updated React generator to use blockstack.js v19.1.0 and uses the new `UserSession` API.
19 | - Updated the default generator to use blockstack.js v19.1.0 and uses the new `UserSession` API.
20 |
--------------------------------------------------------------------------------
/react/templates/gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 |
6 | # Runtime data
7 | pids
8 | *.pid
9 | *.seed
10 |
11 | # Directory for instrumented libs generated by jscoverage/JSCover
12 | lib-cov
13 |
14 | # Coverage directory used by tools like istanbul
15 | coverage
16 |
17 | # nyc test coverage
18 | .nyc_output
19 |
20 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
21 | .grunt
22 |
23 | # node-waf configuration
24 | .lock-wscript
25 |
26 | # Compiled binary addons (http://nodejs.org/api/addons.html)
27 | build/Release
28 |
29 | # Dependency directories
30 | node_modules
31 | jspm_packages
32 |
33 | # Optional npm cache directory
34 | .npm
35 |
36 | # Optional REPL history
37 | .node_repl_history
38 |
39 | # Custom
40 | .DS_Store
--------------------------------------------------------------------------------
/webpack/templates/gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 |
6 | # Runtime data
7 | pids
8 | *.pid
9 | *.seed
10 |
11 | # Directory for instrumented libs generated by jscoverage/JSCover
12 | lib-cov
13 |
14 | # Coverage directory used by tools like istanbul
15 | coverage
16 |
17 | # nyc test coverage
18 | .nyc_output
19 |
20 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
21 | .grunt
22 |
23 | # node-waf configuration
24 | .lock-wscript
25 |
26 | # Compiled binary addons (http://nodejs.org/api/addons.html)
27 | build/Release
28 |
29 | # Dependency directories
30 | node_modules
31 | jspm_packages
32 |
33 | # Optional npm cache directory
34 | .npm
35 |
36 | # Optional REPL history
37 | .node_repl_history
38 |
39 | # Custom
40 | .DS_Store
--------------------------------------------------------------------------------
/vue/templates/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Hello, Blockstack
9 |
10 |
11 |
16 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 |
6 | # Runtime data
7 | pids
8 | *.pid
9 | *.seed
10 |
11 | # Directory for instrumented libs generated by jscoverage/JSCover
12 | lib-cov
13 |
14 | # Coverage directory used by tools like istanbul
15 | coverage
16 |
17 | # nyc test coverage
18 | .nyc_output
19 |
20 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
21 | .grunt
22 |
23 | # node-waf configuration
24 | .lock-wscript
25 |
26 | # Compiled binary addons (http://nodejs.org/api/addons.html)
27 | build/Release
28 |
29 | # Dependency directories
30 | node_modules
31 | jspm_packages
32 |
33 | # Testing directories
34 | .app-gen-test
35 | .webpack-gen-test
36 | .react-gen-test
37 | .vue-gen-test
38 |
39 | # Optional npm cache directory
40 | .npm
41 |
42 | # Optional REPL history
43 | .node_repl_history
44 |
45 | # Custom
46 | .DS_Store
--------------------------------------------------------------------------------
/vue/templates/jest.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | moduleFileExtensions: [
3 | 'js',
4 | 'jsx',
5 | 'json',
6 | 'vue'
7 | ],
8 | transform: {
9 | '^.+\\.vue$': 'vue-jest',
10 | '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub',
11 | '^.+\\.jsx?$': 'babel-jest'
12 | },
13 | transformIgnorePatterns: [
14 | '/node_modules/'
15 | ],
16 | moduleNameMapper: {
17 | '^@/(.*)$': '/src/$1'
18 | },
19 | snapshotSerializers: [
20 | 'jest-serializer-vue'
21 | ],
22 | testMatch: [
23 | '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'
24 | ],
25 | testURL: 'http://localhost/',
26 | watchPlugins: [
27 | 'jest-watch-typeahead/filename',
28 | 'jest-watch-typeahead/testname'
29 | ],
30 | reporters: [
31 | 'default',
32 | 'jest-junit'
33 | ]
34 | }
35 |
--------------------------------------------------------------------------------
/webpack/templates/firebase.json:
--------------------------------------------------------------------------------
1 | {
2 | "hosting": {
3 | "public": "dist",
4 | "ignore": [
5 | "firebase.json",
6 | "**/.*",
7 | "**/node_modules/**"
8 | ],
9 | "rewrites": [
10 | {
11 | "source": "**",
12 | "destination": "/index.html"
13 | }
14 | ],
15 | "headers": [
16 | {
17 | "source" : "**/*.@(eot|json|otf|ttf|ttc|woff|font.css)",
18 | "headers" : [
19 | {
20 | "key" : "Access-Control-Allow-Origin",
21 | "value" : "*"
22 | }
23 | ]
24 | },
25 | {
26 | "source" : "**/*.@(jpg|jpeg|gif|png)",
27 | "headers" : [
28 | {
29 | "key" : "Cache-Control",
30 | "value" : "max-age=7200"
31 | }
32 | ]
33 | }
34 | ],
35 | "cleanUrls": true,
36 | "trailingSlash": false
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/react/templates/src/Profile.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import {
3 | Person,
4 | } from 'blockstack';
5 |
6 | const avatarFallbackImage = 'https://s3.amazonaws.com/onename/avatar-placeholder.png';
7 |
8 | export const Profile = ({ userData, handleSignOut }) => {
9 | const { username } = userData;
10 | const person = new Person(userData.profile);
11 | return (
12 |
13 |
14 |

15 |
16 |
Hello, { person.name() || username || 'Nameless Person' }!
17 |
18 |
25 |
26 |
27 | );
28 | }
29 |
30 | export default Profile
31 |
--------------------------------------------------------------------------------
/vue/templates/src/components/Landing.vue:
--------------------------------------------------------------------------------
1 |
2 |
15 |
16 |
17 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "generator-blockstack",
3 | "version": "0.10.0",
4 | "description": "A set of yeoman generators building Blockstack apps",
5 | "homepage": "https://blocktack.org",
6 | "author": {
7 | "name": "Blockstack PBC",
8 | "email": "editors@blockstack.com",
9 | "url": "https://blockstack.org"
10 | },
11 | "files": [
12 | "app",
13 | "react",
14 | "webpack",
15 | "vue",
16 | "lib",
17 | "cmd"
18 | ],
19 | "bin": "./cmd/index.js",
20 | "main": "lib/index.js",
21 | "keywords": [
22 | "blockstack",
23 | "apps",
24 | "yeoman",
25 | "yeoman-generator"
26 | ],
27 | "dependencies": {
28 | "chalk": "^2.4.2",
29 | "yeoman-environment": "^2.4.0",
30 | "yeoman-generator": "^4.0.2",
31 | "yosay": "^2.0.2"
32 | },
33 | "devDependencies": {
34 | "mocha": "^6.2.0",
35 | "yeoman-assert": "^3.1.1",
36 | "yeoman-test": "^2.0.0"
37 | },
38 | "repository": "github:blockstack/blockstack-app-generator",
39 | "scripts": {
40 | "test": "mocha test/app.js"
41 | },
42 | "license": "MIT"
43 | }
44 |
--------------------------------------------------------------------------------
/.circleci/config.yml:
--------------------------------------------------------------------------------
1 | # Javascript Node CircleCI 2.0 configuration file
2 | #
3 | # Check https://circleci.com/docs/2.0/language-javascript/ for more details
4 | #
5 | version: 2
6 | jobs:
7 | build:
8 | docker:
9 | # specify the version you desire here
10 | - image: circleci/node:10
11 |
12 | # Specify service dependencies here if necessary
13 | # CircleCI maintains a library of pre-built images
14 | # documented at https://circleci.com/docs/2.0/circleci-images/
15 | # - image: circleci/mongo:3.4.4
16 |
17 | working_directory: ~/repo
18 |
19 | steps:
20 | - checkout
21 |
22 | # Download and cache dependencies
23 | - restore_cache:
24 | keys:
25 | - v1-dependencies-{{ checksum "package.json" }}
26 | # fallback to using the latest cache if no exact match is found
27 | - v1-dependencies-
28 |
29 | - run: npm install
30 |
31 | - save_cache:
32 | paths:
33 | - node_modules
34 | key: v1-dependencies-{{ checksum "package.json" }}
35 |
36 | # run tests!
37 | - run: npm test
38 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2017 Blockstack Inc.
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy of
6 | this software and associated documentation files (the "Software"), to deal in
7 | the Software without restriction, including without limitation the rights to
8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9 | the Software, and to permit persons to whom the Software is furnished to do so,
10 | subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--------------------------------------------------------------------------------
/vue/templates/src/views/Home.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
41 |
--------------------------------------------------------------------------------
/react/templates/_package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "hello-blockstack",
3 | "version": "0.0.0",
4 | "description": "A simple Blockstack app using ReactJS",
5 | "repository": {
6 | "type": "git",
7 | "url": "git+https://github.com/blockstack/hello-blockstack.git"
8 | },
9 | "bugs": {
10 | "url": "https://github.com/blockstack/hello-blockstack/issues"
11 | },
12 | "author": {
13 | "name": "Blockstack PBC",
14 | "email": "editors@blockstack.com",
15 | "url": "https://blockstack.org"
16 | },
17 | "license": "MIT",
18 | "dependencies": {
19 | "blockstack": "^19.2.5",
20 | "@blockstack/connect": "^2.7.2",
21 | "react": "^16.8.6",
22 | "react-dom": "^16.8.6",
23 | "react-router-dom": "^4.3.1",
24 | "react-scripts": "3.0.1"
25 | },
26 | "scripts": {
27 | "start": "react-scripts start",
28 | "build": "react-scripts build",
29 | "test": "react-scripts build",
30 | "eject": "react-scripts eject"
31 | },
32 | "eslintConfig": {
33 | "extends": "react-app"
34 | },
35 | "browserslist": {
36 | "production": [
37 | ">0.2%",
38 | "not dead",
39 | "not op_mini all"
40 | ],
41 | "development": [
42 | "last 1 chrome version",
43 | "last 1 firefox version",
44 | "last 1 safari version"
45 | ]
46 | },
47 | "devDependencies": {
48 | "bootstrap": "^4.3.1",
49 | "react-test-renderer": "^16.8.6"
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/webpack/templates/dist/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Hello Blockstack
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
18 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/vue/templates/src/components/Dashboard.vue:
--------------------------------------------------------------------------------
1 |
2 |
18 |
19 |
20 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/react/templates/src/App.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import Profile from './Profile.js';
3 | import Signin from './Signin.js';
4 | import {
5 | UserSession,
6 | AppConfig
7 | } from 'blockstack';
8 | import { Connect } from '@blockstack/connect';
9 |
10 | const appConfig = new AppConfig()
11 | const userSession = new UserSession({ appConfig: appConfig })
12 |
13 | export default class App extends Component {
14 | state = {
15 | userData: null,
16 | }
17 |
18 | handleSignOut(e) {
19 | e.preventDefault();
20 | this.setState({ userData: null });
21 | userSession.signUserOut(window.location.origin);
22 | }
23 |
24 | render() {
25 | const { userData } = this.state;
26 | const authOptions = {
27 | appDetails: {
28 | name: 'Blockstack App',
29 | icon: window.location.origin + '/favicon.ico'
30 | },
31 | userSession,
32 | finished: ({ userSession }) => {
33 | this.setState({ userData: userSession.loadUserData() });
34 | }
35 | }
36 | return (
37 |
38 |
39 |
40 | { !userData ?
:
}
41 |
42 |
43 |
44 | );
45 | }
46 |
47 | componentDidMount() {
48 | if (userSession.isSignInPending()) {
49 | userSession.handlePendingSignIn().then((userData) => {
50 | window.history.replaceState({}, document.title, "/")
51 | this.setState({ userData: userData})
52 | });
53 | } else if (userSession.isUserSignedIn()) {
54 | this.setState({ userData: userSession.loadUserData() });
55 | }
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/vue/templates/_package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "hello-blockstack",
3 | "version": "6.0.1",
4 | "description": "A decentralized Todo app built on Blockstack",
5 | "author": {
6 | "name": "Blockstack PBC",
7 | "email": "editors@blockstack.com",
8 | "url": "https://blockstack.org"
9 | },
10 | "repository": {
11 | "type": "git",
12 | "url": "https://github.com/blockstack/blockstack-todos"
13 | },
14 | "private": true,
15 | "scripts": {
16 | "start": "vue-cli-service serve",
17 | "build": "vue-cli-service build",
18 | "lint": "vue-cli-service lint",
19 | "test": "vue-cli-service build"
20 | },
21 | "dependencies": {
22 | "@blockstack/connect": "^2.4.0",
23 | "axios": "^0.18.0",
24 | "blockstack": "^19.2.5",
25 | "bootstrap": "^4.3.1",
26 | "core-js": "^2.6.5",
27 | "react": "^16.13.1",
28 | "react-dom": "^16.13.1",
29 | "vue": "^2.6.10",
30 | "vue-router": "^3.0.3"
31 | },
32 | "devDependencies": {
33 | "@vue/cli-plugin-babel": "^3.6.0",
34 | "@vue/cli-plugin-eslint": "^3.6.0",
35 | "@vue/cli-plugin-unit-jest": "^3.6.0",
36 | "@vue/cli-service": "^3.6.0",
37 | "@vue/eslint-config-standard": "^4.0.0",
38 | "@vue/test-utils": "1.0.0-beta.29",
39 | "babel-core": "7.0.0-bridge.0",
40 | "babel-eslint": "^10.0.1",
41 | "babel-jest": "^23.6.0",
42 | "eslint": "^5.16.0",
43 | "eslint-plugin-vue": "^5.0.0",
44 | "node-sass": "^4.9.0",
45 | "sass-loader": "^7.1.0",
46 | "vue-template-compiler": "^2.5.21"
47 | },
48 | "browserslist": {
49 | "production": [
50 | ">0.2%",
51 | "not dead",
52 | "not op_mini all"
53 | ],
54 | "development": [
55 | "last 1 chrome version",
56 | "last 1 firefox version",
57 | "last 1 safari version"
58 | ]
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/webpack/templates/dist/app.css:
--------------------------------------------------------------------------------
1 | /* Globals */
2 | a,a:focus,a:hover{color:#fff;}
3 | html,body{height:100%;background-color:#F4F4FC;}
4 | body{color:#3700FF;text-align:center;}
5 | .hide{display:none;}
6 | .landing-heading{font-family:'Source Code Pro',monospace;font-weight:400;}
7 |
8 | /* Buttons */
9 | .btn{font-family:'Source Code Pro',monospace;padding:0.5625rem 2.5rem;font-size:0.8125rem;font-weight:400;line-height:1.75rem;border-radius:0!important;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}
10 | .btn-lg{font-size:0.875rem;padding:0.6875rem 3.4375rem;line-height:1.75rem;}
11 | .btn:focus,.btn:active:focus,.btn.active:focus{outline:none;}
12 | .btn-primary{background-color:#3700FF;border:1px solid #3700FF;}
13 | .btn-primary:hover,.btn-primary:focus,.btn-primary:active{color:#fff;border:1px solid #270F34;background-color:#270F34;}
14 | .navbar{background-color:#3700FF !important;-webkit-border-radius: 0;-moz-border-radius: 0;border-radius: 0;}
15 |
16 | /* Avatar */
17 | .avatar{width:100px;height:100px;}
18 | .avatar-section{margin-bottom:25px;}
19 |
20 | /* Scaffolding */
21 | .site-wrapper{display:table;width:100%;height:90% !important;min-height:90vh !important;}
22 | .site-wrapper-inner{display:flex;flex-direction:column;justify-content:center;margin-right:auto;margin-left:auto;width:100%;height:90%;}
23 | .panel-authed{padding:0 0 0 0;}
24 |
25 | /* Home button */
26 | .btn-home-hello{position:absolute;font-family:'Source Code Pro',monospace;font-size:11px;font-weight:400;color:rgba(255,255,255,0.85);top:15px;left:15px;padding:3px 20px;background-color:rgba(255,255,255,0.15);border-radius:6px;-webkit-box-shadow:0px 0px 20px 0px rgba(0,0,0,0.15);-moz-box-shadow:0px 0px 20px 0px rgba(0,0,0,0.15);box-shadow:0px 0px 20px 0px rgba(0,0,0,0.15);}
27 |
28 | /* Input */
29 | input, textarea{color:#000;}
30 | input, textarea{color:#000;}
31 |
--------------------------------------------------------------------------------
/react/templates/src/styles/style.css:
--------------------------------------------------------------------------------
1 | /* Globals */
2 | a,a:focus,a:hover{color:#fff;}
3 | html,body{height:100%;background-color:#F4F4FC;}
4 | body{color:#3700FF;text-align:center;}
5 | .hide{display:none;}
6 | .landing-heading{font-family:'Source Code Pro',monospace;font-weight:400;}
7 |
8 | /* Buttons */
9 | .btn{font-family:'Source Code Pro',monospace;padding:0.5625rem 2.5rem;font-size:0.8125rem;font-weight:400;line-height:1.75rem;border-radius:0!important;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}
10 | .btn-lg{font-size:0.875rem;padding:0.6875rem 3.4375rem;line-height:1.75rem;}
11 | .btn:focus,.btn:active:focus,.btn.active:focus{outline:none;}
12 | .btn-primary{background-color:#3700FF;border:1px solid #3700FF;}
13 | .btn-primary:hover,.btn-primary:focus,.btn-primary:active{color:#fff;border:1px solid #270F34;background-color:#270F34;}
14 | .navbar{background-color:#3700FF !important;-webkit-border-radius: 0;-moz-border-radius: 0;border-radius: 0;}
15 |
16 | /* Avatar */
17 | .avatar{width:100px;height:100px;}
18 | .avatar-section{margin-bottom:25px;}
19 |
20 | /* Scaffolding */
21 | .site-wrapper{display:table;width:100%;height:90% !important;min-height:90vh !important;}
22 | .site-wrapper-inner{display:flex;flex-direction:column;justify-content:center;margin-right:auto;margin-left:auto;width:100%;height:90%;}
23 | .panel-authed{padding:0 0 0 0;}
24 |
25 | /* Home button */
26 | .btn-home-hello{position:absolute;font-family:'Source Code Pro',monospace;font-size:11px;font-weight:400;color:rgba(255,255,255,0.85);top:15px;left:15px;padding:3px 20px;background-color:rgba(255,255,255,0.15);border-radius:6px;-webkit-box-shadow:0px 0px 20px 0px rgba(0,0,0,0.15);-moz-box-shadow:0px 0px 20px 0px rgba(0,0,0,0.15);box-shadow:0px 0px 20px 0px rgba(0,0,0,0.15);}
27 |
28 | /* Input */
29 | input, textarea{color:#000;}
30 | input, textarea{color:#000;}
31 |
--------------------------------------------------------------------------------
/webpack/templates/src/index.js:
--------------------------------------------------------------------------------
1 | import * as blockstack from 'blockstack'
2 | import { showBlockstackConnect } from '@blockstack/connect';
3 |
4 | const appConfig = new blockstack.AppConfig()
5 | const userSession = new blockstack.UserSession({ appConfig: appConfig })
6 |
7 | document.addEventListener("DOMContentLoaded", function () {
8 | const authOptions = {
9 | appDetails: {
10 | name: 'Blockstack App',
11 | icon: window.location.origin + '/favicon.ico'
12 | },
13 | userSession,
14 | finished: ({ userSession }) => {
15 | const profile = userSession.loadUserData().profile;
16 | showProfile(profile);
17 | }
18 | }
19 |
20 | document.getElementById('signin-button').addEventListener('click', function (event) {
21 | event.preventDefault()
22 | showBlockstackConnect(authOptions)
23 | })
24 | document.getElementById('signout-button').addEventListener('click', function (event) {
25 | event.preventDefault()
26 | userSession.signUserOut(window.location.href)
27 | window.location = window.location.origin
28 | })
29 |
30 | function showProfile(profile) {
31 | var person = new blockstack.Person(profile)
32 | const username = userSession.loadUserData().username
33 |
34 | document.getElementById('heading-name').textContent = person.name() || username || "Nameless Person"
35 | if (person.avatarUrl()) {
36 | document.getElementById('avatar-image').setAttribute('src', person.avatarUrl())
37 | }
38 | else {
39 | document.getElementById('avatar-image').setAttribute('src', './avatar-placeholder.png')
40 | }
41 | document.getElementById('section-1').style.display = 'none'
42 | document.getElementById('section-2').style.display = 'block'
43 | }
44 |
45 | if (userSession.isUserSignedIn()) {
46 | var profile = userSession.loadUserData().profile
47 | showProfile(profile)
48 | } else if (userSession.isSignInPending()) {
49 | userSession.handlePendingSignIn().then(function (userData) {
50 | window.location = window.location.origin
51 | })
52 | }
53 | })
54 |
--------------------------------------------------------------------------------
/vue/templates/src/assets/styles.css:
--------------------------------------------------------------------------------
1 | /* Globals */
2 | a,a:focus,a:hover{color:#fff;}
3 | html,body{height:100%;background-color:#F4F4FC;}
4 | body{color:#3700FF;text-align:center;margin:0px !important}
5 | .hide{display:none;}
6 | .landing-heading{font-family:'Source Code Pro',monospace;font-weight:400;font-size:2.5em}
7 | .center{top:30%;position:relative;justify-content:center}
8 | /* Buttons */
9 | .btn{font-family:'Source Code Pro',monospace;padding:0.5625rem 2.5rem;font-size:0.8125rem;font-weight:400;line-height:1.75rem;border-radius:0!important;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}
10 | .btn-lg{font-size:0.875rem;padding:1.0rem 3.4375rem;line-height:1.75rem;}
11 | .btn:focus,.btn:active:focus,.btn.active:focus{outline:none;}
12 | .btn-primary{background-color:#3700FF;border:1px solid #3700FF;}
13 | .btn-primary:hover,.btn-primary:focus,.btn-primary:active{color:#fff;border:1px solid #270F34;background-color:#270F34;}
14 | .navbar{background-color:#3700FF;border:8px solid #3700FF; text-align:left}
15 | #logo {
16 | margin:8px
17 | }
18 | #signin-button {
19 | text-decoration-line:none
20 | }
21 |
22 | /* Avatar */
23 | .avatar{width:100px;height:100px;}
24 | .avatar-section{margin-bottom:25px;}
25 |
26 | /* Scaffolding */
27 | .site-wrapper{display:table;width:100%;height:100vh;min-height:90%;}
28 | .site-wrapper-inner{display:flex;flex-direction:column;justify-content:center;margin-right:auto;margin-left:auto;width:90%;height:90%;}
29 | .panel-authed{padding:0 0 0 0;}
30 |
31 | /* Home button */
32 | .btn-home-hello{position:absolute;font-family:'Source Code Pro',monospace;font-size:11px;font-weight:400;color:rgba(255,255,255,0.85);top:15px;left:15px;padding:3px 20px;background-color:rgba(255,255,255,0.15);border-radius:6px;-webkit-box-shadow:0px 0px 20px 0px rgba(0,0,0,0.15);-moz-box-shadow:0px 0px 20px 0px rgba(0,0,0,0.15);box-shadow:0px 0px 20px 0px rgba(0,0,0,0.15);}
33 |
--------------------------------------------------------------------------------
/app/index.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | var Generator = require('yeoman-generator');
3 | var chalk = require('chalk');
4 | var yosay = require('yosay');
5 |
6 | class BlockstackGenerator extends Generator {
7 |
8 | // The name `constructor` is important here
9 | constructor(args, opts) {
10 | // Calling the super constructor is important so our generator is correctly set up
11 | super(args, opts);
12 | this.option('react', {
13 | description: 'Generate a React project template',
14 | type: Boolean
15 | });
16 | this.option('plain', {
17 | description: 'Generate a plain Javascript project template',
18 | type: Boolean
19 | });
20 | this.option('vue', {
21 | description: 'Generate a Vue project template',
22 | type: Boolean
23 | });
24 | }
25 |
26 | async prompting() {
27 | if (this.options.react) {
28 | this.outputAppType = 'react';
29 | } else if (this.options.plain) {
30 | this.outputAppType = 'plain';
31 | } else if (this.options.vue) {
32 | this.outputAppType = 'vue';
33 | } else {
34 |
35 | // Have Yeoman greet the user.
36 | this.log(yosay(
37 | 'Welcome to the ' + chalk.red('Blockstack') + ' app generator!'
38 | ));
39 |
40 | const answers = await this.prompt([{
41 | type: 'rawlist',
42 | name: 'generator_type',
43 | message: 'What type of project scaffolding do you want to generate?',
44 | suffix: ` ${chalk.dim('(Use arrow keys to select and press ENTER)')}`,
45 | choices: [
46 | { name: 'React', value: 'react' },
47 | { name: 'Plain JavaScript', value: 'plain' },
48 | { name: 'Vue', value: 'vue' }
49 | ]
50 | }]);
51 | this.outputAppType = answers['generator_type'];
52 | }
53 | }
54 |
55 | main() {
56 | if (this.outputAppType === 'react') {
57 | return this.composeWith(require.resolve('../react'));
58 | } else if (this.outputAppType === 'plain') {
59 | return this.composeWith(require.resolve('../webpack'));
60 | } else if (this.outputAppType === 'vue') {
61 | return this.composeWith(require.resolve('../vue'));
62 | } else {
63 | throw new Error(`Unexpected app output type selected: ${this.outputAppType}`);
64 | }
65 | }
66 |
67 | }
68 |
69 | module.exports = BlockstackGenerator;
70 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Blockstack App Generator [![CircleCI][circleci-image]][circleci-url] [![NPM version][npm-image]][npm-url] [![Slack][slack-image]][slack-url]
2 |
3 | ## Installation
4 |
5 | 1. If not already installed, install [Node.js](https://nodejs.org/) v10 or higher _(minimum required version is Node.js v8)_.
6 |
7 | 2. Create a new directory and `cd` into it:
8 |
9 | ```bash
10 | mkdir hello-blockstack
11 | cd hello-blockstack
12 | ```
13 |
14 | 3. Generate a Blockstack app, you can specify the framework.
15 |
16 | | Framework | Use this command to install |
17 | |------------------|-----------------------------|
18 | | Plain Javascript | `npx generator-blockstack --plain` |
19 | | React | `npx generator-blockstack --react` |
20 | | Vue | `npx generator-blockstack --vue` |
21 |
22 | For additional options run `npx generator-blockstack --help`.
23 |
24 | > Alternatively, global package installation can be used. Try this if running into problems:
25 | > ```
26 | > npm install -g yo generator-blockstack
27 | > yo blockstack
28 | > ```
29 |
30 | 4. Start the development server:
31 |
32 | ```bash
33 | npm run start
34 | ```
35 |
36 |
37 | ## Testing the generated app
38 |
39 | The single tests works for all generators:
40 |
41 |
42 | ```bash
43 | npm run test
44 | ```
45 |
46 |
47 | ## Testing the generator project
48 |
49 | Within the repo directory, run `npm run test`. This command will generate the variants of Blockstack apps
50 | in folders called `.app-gen-test`, `.webpack-gen-test`, `.react-gen-test`, and `.vue-gen-test`. The test asserts
51 | that all expected files were actually created. It also runs the `npm run test` command within each app. For the
52 | React, Webpack, and Vue generators, `npm run test` currently builds the app, but that command can be
53 | changed. (For a React app, the typical test command is `react-scripts test`.)
54 |
55 | ## License
56 |
57 | MIT © [Blockstack](https://blockstack.com)
58 |
59 |
60 | [npm-image]: https://img.shields.io/npm/v/generator-blockstack.svg
61 | [npm-url]: https://www.npmjs.com/package/generator-blockstack
62 | [circleci-image]: https://circleci.com/gh/blockstack/blockstack-app-generator.svg?style=shield&circle-token=:circle-token
63 | [circleci-url]: https://circleci.com/gh/blockstack/blockstack-app-generator/tree/master
64 | [slack-image]: https://img.shields.io/badge/join-slack-e32072.svg
65 | [slack-url]: http://slack.blockstack.org/
66 |
--------------------------------------------------------------------------------
/webpack/index.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | var Generator = require('yeoman-generator');
3 | var chalk = require('chalk');
4 | var yosay = require('yosay');
5 |
6 | class BlockstackWebpackGenerator extends Generator {
7 |
8 | constructor(args, opts) {
9 | // Calling the super constructor is important so our generator is correctly set up
10 | super(args, opts);
11 | }
12 |
13 | prompting() {
14 |
15 | }
16 |
17 | writing() {
18 | this.fs.copy(
19 | this.templatePath('_package.json'),
20 | this.destinationPath('package.json')
21 | );
22 | this.fs.copy(
23 | this.templatePath('gitignore'),
24 | this.destinationPath('.gitignore')
25 | );
26 | this.fs.copy(
27 | this.templatePath('webpack.config.js'),
28 | this.destinationPath('webpack.config.js')
29 | );
30 | this.fs.copy(
31 | this.templatePath('netlify.toml'),
32 | this.destinationPath('netlify.toml')
33 | );
34 | this.fs.copy(
35 | this.templatePath('firebase.json'),
36 | this.destinationPath('firebase.json')
37 | );
38 | this.fs.copy(
39 | this.templatePath('amplify.yml'),
40 | this.destinationPath('amplify.yml')
41 | );
42 | // styles
43 | this.fs.copy(
44 | this.templatePath('dist/app.css'),
45 | this.destinationPath('dist/app.css')
46 | );
47 | this.fs.copy(
48 | this.templatePath('dist/bootstrap.min.css'),
49 | this.destinationPath('dist/bootstrap.min.css')
50 | );
51 | // images
52 | this.fs.copy(
53 | this.templatePath('dist/avatar-placeholder.png'),
54 | this.destinationPath('dist/avatar-placeholder.png')
55 | )
56 | // html
57 | this.fs.copy(
58 | this.templatePath('dist/index.html'),
59 | this.destinationPath('dist/index.html')
60 | );
61 | // publicExtras
62 | this.fs.copy(
63 | this.templatePath('dist/robots.txt'),
64 | this.destinationPath('dist/robots.txt')
65 | );
66 | this.fs.copy(
67 | this.templatePath('dist/manifest.json'),
68 | this.destinationPath('dist/manifest.json')
69 | );
70 | this.fs.copy(
71 | this.templatePath('dist/favicon.ico'),
72 | this.destinationPath('dist/favicon.ico')
73 | );
74 | this.fs.copy(
75 | this.templatePath('dist/white-logo.svg'),
76 | this.destinationPath('dist/white-logo.svg')
77 | );
78 | // scripts
79 | this.fs.copy(
80 | this.templatePath('src/index.js'),
81 | this.destinationPath('src/index.js')
82 | );
83 | }
84 |
85 | install() {
86 | this.installDependencies({
87 | bower: false
88 | });
89 | }
90 | }
91 |
92 | module.exports = BlockstackWebpackGenerator;
93 |
--------------------------------------------------------------------------------
/react/index.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | var Generator = require('yeoman-generator');
3 | var chalk = require('chalk');
4 | var yosay = require('yosay');
5 |
6 | class BlockstackReactGenerator extends Generator {
7 |
8 | constructor(args, opts) {
9 | // Calling the super constructor is important so our generator is correctly set up
10 | super(args, opts);
11 | }
12 |
13 | prompting() {
14 |
15 | }
16 |
17 | writing() {
18 | // configs
19 | this.fs.copy(
20 | this.templatePath('_package.json'),
21 | this.destinationPath('package.json')
22 | );
23 |
24 | this.fs.copy(
25 | this.templatePath('gitignore'),
26 | this.destinationPath('.gitignore')
27 | );
28 | this.fs.copy(
29 | this.templatePath('env.development'),
30 | this.destinationPath('.env.development')
31 | );
32 | // CORS configuration for Firebase, Netlify
33 | this.fs.copy(
34 | this.templatePath('cors/_headers'),
35 | this.destinationPath('cors/_headers')
36 | );
37 | this.fs.copy(
38 | this.templatePath('cors/_redirects'),
39 | this.destinationPath('cors/_redirects')
40 | );
41 | this.fs.copy(
42 | this.templatePath('cors/firebase.json'),
43 | this.destinationPath('cors/firebase.json')
44 | );
45 | // styles
46 | this.fs.copy(
47 | this.templatePath('src/styles/style.css'),
48 | this.destinationPath('src/styles/style.css')
49 | );
50 | // scripts
51 | this.fs.copy(
52 | this.templatePath('src/index.js'),
53 | this.destinationPath('src/index.js')
54 | );
55 | this.fs.copy(
56 | this.templatePath('src/App.js'),
57 | this.destinationPath('src/App.js')
58 | );
59 | this.fs.copy(
60 | this.templatePath('src/Profile.js'),
61 | this.destinationPath('src/Profile.js')
62 | );
63 | this.fs.copy(
64 | this.templatePath('src/setupProxy.js'),
65 | this.destinationPath('src/setupProxy.js')
66 | );
67 | this.fs.copy(
68 | this.templatePath('src/Signin.js'),
69 | this.destinationPath('src/Signin.js')
70 | );
71 | // images, assets, and html
72 | this.fs.copy(
73 | this.templatePath('public/favicon.ico'),
74 | this.destinationPath('public/favicon.ico')
75 | )
76 | this.fs.copy(
77 | this.templatePath('public/index.html'),
78 | this.destinationPath('public/index.html')
79 | );
80 | this.fs.copy(
81 | this.templatePath('public/manifest.json'),
82 | this.destinationPath('public/manifest.json')
83 | );
84 | // create-react-app README
85 | this.fs.copy(
86 | this.templatePath('README.md'),
87 | this.destinationPath('README.md')
88 | )
89 | this.fs.copy(
90 | this.templatePath('public/white-logo.svg'),
91 | this.destinationPath('public/white-logo.svg')
92 | )
93 | }
94 |
95 | install() {
96 | this.installDependencies({
97 | bower: false
98 | });
99 | }
100 | };
101 |
102 | module.exports = BlockstackReactGenerator;
103 |
--------------------------------------------------------------------------------
/react/templates/README.md:
--------------------------------------------------------------------------------
1 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
2 |
3 | ## Available Scripts
4 |
5 | In the project directory, you can run:
6 |
7 | ### `npm start`
8 |
9 | Runs the app in the development mode.
10 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
11 |
12 | The page will reload if you make edits.
13 | You will also see any lint errors in the console.
14 |
15 | ### `npm test`
16 |
17 | Launches the test runner in the interactive watch mode.
18 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
19 |
20 | ### `npm run build`
21 |
22 | Builds the app for production to the `build` folder.
23 | It correctly bundles React in production mode and optimizes the build for the best performance.
24 |
25 | The build is minified and the filenames include the hashes.
26 | Your app is ready to be deployed!
27 |
28 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
29 |
30 | ### `npm run eject`
31 |
32 | **Note: this is a one-way operation. Once you `eject`, you can’t go back!**
33 |
34 | If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
35 |
36 | Instead, it will copy all the configuration files and the transitive dependencies (Webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.
37 |
38 | You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.
39 |
40 | ## Learn More
41 |
42 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
43 |
44 | To learn React, check out the [React documentation](https://reactjs.org/).
45 |
46 | ### Code Splitting
47 |
48 | This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting
49 |
50 | ### Analyzing the Bundle Size
51 |
52 | This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size
53 |
54 | ### Making a Progressive Web App
55 |
56 | This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app
57 |
58 | ### Advanced Configuration
59 |
60 | This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration
61 |
62 | ### Deployment
63 |
64 | This section has moved here: https://facebook.github.io/create-react-app/docs/deployment
65 |
66 | ### `npm run build` fails to minify
67 |
68 | This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify
69 |
--------------------------------------------------------------------------------
/vue/index.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | var Generator = require('yeoman-generator');
3 | var chalk = require('chalk');
4 | var yosay = require('yosay');
5 |
6 | class BlockstackVueGenerator extends Generator {
7 |
8 | constructor(args, opts) {
9 | // Calling the super constructor is important so our generator is correctly set up
10 | super(args, opts);
11 | }
12 |
13 | prompting() {
14 |
15 | }
16 |
17 | writing() {
18 | //configs
19 | this.fs.copy(
20 | this.templatePath('_package.json'),
21 | this.destinationPath('package.json')
22 | );
23 | this.fs.copy(
24 | this.templatePath('babel.config.js'),
25 | this.destinationPath('babel.config.js')
26 | );
27 | this.fs.copy(
28 | this.templatePath('editorconfig'),
29 | this.destinationPath('.editorconfig')
30 | );
31 | this.fs.copy(
32 | this.templatePath('eslintignore'),
33 | this.destinationPath('.eslintignore')
34 | );
35 | this.fs.copy(
36 | this.templatePath('eslintrc.js'),
37 | this.destinationPath('.eslintrc.js')
38 | );
39 | this.fs.copy(
40 | this.templatePath('firebase.json'),
41 | this.destinationPath('firebase.json')
42 | );
43 | this.fs.copy(
44 | this.templatePath('firebaserc'),
45 | this.destinationPath('.firebaserc')
46 | );
47 | this.fs.copy(
48 | this.templatePath('gitignore'),
49 | this.destinationPath('.gitignore')
50 | );
51 | this.fs.copy(
52 | this.templatePath('jest.config.js'),
53 | this.destinationPath('jest.config.js')
54 | );
55 | this.fs.copy(
56 | this.templatePath('postcss.config.js'),
57 | this.destinationPath('postcss.config.js')
58 | );
59 | this.fs.copy(
60 | this.templatePath('postcssrc.js'),
61 | this.destinationPath('.postcssrc.js')
62 | );
63 |
64 |
65 | this.fs.copy(
66 | this.templatePath('src/App.vue'),
67 | this.destinationPath('src/App.vue')
68 | );
69 | this.fs.copy(
70 | this.templatePath('src/components/Dashboard.vue'),
71 | this.destinationPath('src/components/Dashboard.vue')
72 | );
73 | this.fs.copy(
74 | this.templatePath('src/components/Landing.vue'),
75 | this.destinationPath('src/components/Landing.vue')
76 | );
77 | this.fs.copy(
78 | this.templatePath('src/views/Home.vue'),
79 | this.destinationPath('src/views/Home.vue')
80 | );
81 |
82 | this.fs.copy(
83 | this.templatePath('src/assets/styles.css'),
84 | this.destinationPath('src/assets/styles.css')
85 | );
86 |
87 | this.fs.copy(
88 | this.templatePath('src/main.js'),
89 | this.destinationPath('src/main.js')
90 | );
91 | this.fs.copy(
92 | this.templatePath('src/router.js'),
93 | this.destinationPath('src/router.js')
94 | );
95 | this.fs.copy(
96 | this.templatePath('src/userSession.js'),
97 | this.destinationPath('src/userSession.js')
98 | );
99 |
100 | this.fs.copy(
101 | this.templatePath('public/index.html'),
102 | this.destinationPath('public/index.html')
103 | );
104 |
105 | this.fs.copy(
106 | this.templatePath('public/manifest.json'),
107 | this.destinationPath('public/manifest.json')
108 | );
109 | this.fs.copy(
110 | this.templatePath('public/favicon.ico'),
111 | this.destinationPath('public/favicon.ico')
112 | );
113 | this.fs.copy(
114 | this.templatePath('public/white-logo.svg'),
115 | this.destinationPath('public/white-logo.svg')
116 | );
117 | this.fs.copy(
118 | this.templatePath('public/avatar-placeholder.png'),
119 | this.destinationPath('public/avatar-placeholder.png')
120 | );
121 | this.fs.copy(
122 | this.templatePath('public/_headers'),
123 | this.destinationPath('public/_headers')
124 | );
125 | this.fs.copy(
126 | this.templatePath('public/_redirects'),
127 | this.destinationPath('public/_redirects')
128 | );
129 | this.fs.copy(
130 | this.templatePath('vue.config.js'),
131 | this.destinationPath('vue.config.js')
132 | );
133 | }
134 |
135 |
136 | install() {
137 | this.installDependencies({
138 | bower: false
139 | });
140 | }
141 | };
142 |
143 | module.exports = BlockstackVueGenerator;
144 |
--------------------------------------------------------------------------------
/react/templates/public/white-logo.svg:
--------------------------------------------------------------------------------
1 |
14 |
--------------------------------------------------------------------------------
/vue/templates/public/white-logo.svg:
--------------------------------------------------------------------------------
1 |
14 |
--------------------------------------------------------------------------------
/webpack/templates/dist/white-logo.svg:
--------------------------------------------------------------------------------
1 |
14 |
--------------------------------------------------------------------------------
/test/app.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | const path = require('path');
3 | const assert = require('yeoman-assert');
4 | const helpers = require('yeoman-test');
5 |
6 | describe('generator-blockstack integrated initializer [react]', function () {
7 | this.enableTimeouts(false)
8 |
9 | let testingDir;
10 | let runEnv;
11 |
12 | before(async () => {
13 | testingDir = path.join(__dirname, "../.integrated-app-gen-test-react");
14 | await new Promise((resolve, reject) => {
15 | helpers.testDirectory(testingDir, err => {
16 | if (err) {
17 | reject(err);
18 | } else {
19 | resolve();
20 | }
21 | });
22 | });
23 | });
24 |
25 | it("create app generator", async () => {
26 | const modularGen = require('../lib/index');
27 | const result = modularGen.createAppGen({
28 | args: ['--react'],
29 | options: { skipInstall: true }
30 | });
31 | runEnv = result.run;
32 | });
33 |
34 | it("generate a project", async () => {
35 | await runEnv();
36 | });
37 |
38 | it('creates files', function () {
39 | assert.file(['package.json']);
40 | });
41 |
42 | after(async () => {
43 | // Clean temp output dir.
44 | await new Promise((resolve, reject) => {
45 | helpers.testDirectory(testingDir, err => {
46 | if (err) { reject(err); } else { resolve(); }
47 | });
48 | });
49 | });
50 |
51 | });
52 |
53 | describe('generator-blockstack integrated initializer [vue]', function () {
54 | this.enableTimeouts(false)
55 |
56 | let testingDir;
57 | let runEnv;
58 |
59 | before(async () => {
60 | testingDir = path.join(__dirname, "../.integrated-app-gen-test-vue");
61 | await new Promise((resolve, reject) => {
62 | helpers.testDirectory(testingDir, err => {
63 | if (err) {
64 | reject(err);
65 | } else {
66 | resolve();
67 | }
68 | });
69 | });
70 | });
71 |
72 | it("create app generator", async () => {
73 | const modularGen = require('../lib/index');
74 | const result = modularGen.createAppGen({
75 | args: ['--vue'],
76 | options: { skipInstall: true }
77 | });
78 | runEnv = result.run;
79 | });
80 |
81 | it("generate a project", async () => {
82 | await runEnv();
83 | });
84 |
85 | it('creates files', function () {
86 | assert.file(['package.json']);
87 | });
88 |
89 | after(async () => {
90 | // Clean temp output dir.
91 | await new Promise((resolve, reject) => {
92 | helpers.testDirectory(testingDir, err => {
93 | if (err) { reject(err); } else { resolve(); }
94 | });
95 | });
96 | });
97 |
98 | });
99 |
100 | describe('generator-blockstack integrated initializer [plain]', function () {
101 | this.enableTimeouts(false)
102 |
103 | let testingDir;
104 | let runEnv;
105 |
106 | before(async () => {
107 | testingDir = path.join(__dirname, "../.integrated-app-gen-test-plain");
108 | await new Promise((resolve, reject) => {
109 | helpers.testDirectory(testingDir, err => {
110 | if (err) {
111 | reject(err);
112 | } else {
113 | resolve();
114 | }
115 | });
116 | });
117 | });
118 |
119 | it("create app generator", async () => {
120 | const modularGen = require('../lib/index');
121 | const result = modularGen.createAppGen({
122 | args: ['--plain'],
123 | options: { skipInstall: true }
124 | });
125 | runEnv = result.run;
126 | });
127 |
128 | it("generate a project", async () => {
129 | await runEnv();
130 | });
131 |
132 | it('creates files', function () {
133 | assert.file(['package.json']);
134 | });
135 |
136 | after(async () => {
137 | // Clean temp output dir.
138 | await new Promise((resolve, reject) => {
139 | helpers.testDirectory(testingDir, err => {
140 | if (err) { reject(err); } else { resolve(); }
141 | });
142 | });
143 | });
144 |
145 | });
146 |
147 | describe('generator-blockstack:app', function () {
148 | this.enableTimeouts(false)
149 |
150 | let generator = undefined;
151 |
152 | before(async () => {
153 |
154 | const testingDir = path.join(__dirname, "../.app-gen-test");
155 | await new Promise((resolve, reject) => {
156 | helpers.testDirectory(testingDir, err => {
157 | if (err) {
158 | reject(err);
159 | } else {
160 | resolve();
161 | }
162 | });
163 | });
164 | });
165 |
166 | it("generate a project", async () => {
167 | const appPath = path.join(__dirname, "../app");
168 | generator = helpers.createGenerator(appPath, [], [], {
169 | skipInstall: false
170 | });
171 | helpers.mockPrompt(generator, { generator_type: 'plain' });
172 | // Run yo-generator to output project.
173 | await Promise.resolve(generator.run());
174 | });
175 |
176 | it('creates files', function () {
177 | assert.file([
178 | '.gitignore',
179 | 'package.json',
180 | 'webpack.config.js',
181 | 'netlify.toml',
182 | 'amplify.yml',
183 | 'firebase.json',
184 | 'src/index.js',
185 | 'dist/app.css',
186 | 'dist/index.html',
187 | 'dist/manifest.json',
188 | 'dist/robots.txt',
189 | 'dist/bootstrap.min.css',
190 | 'dist/avatar-placeholder.png',
191 | 'dist/favicon.ico',
192 | 'dist/white-logo.svg'
193 | ]);
194 | });
195 |
196 | it("builds hello world", () => {
197 | // Ensure `npm test` succeeds in generated project.
198 | generator.spawnCommandSync("npm", ["test"]);
199 | });
200 |
201 | });
202 |
203 |
204 | describe('generator-blockstack:webpack', function () {
205 | this.enableTimeouts(false)
206 |
207 |
208 | let generator = undefined;
209 | const testingDir = path.join(__dirname, "../.webpack-gen-test");
210 |
211 | before(async () => {
212 | await new Promise((resolve, reject) => {
213 | helpers.testDirectory(testingDir, err => {
214 | if (err) {
215 | reject(err);
216 | } else {
217 | resolve();
218 | }
219 | });
220 | });
221 | });
222 |
223 | it("generate a project", async () => {
224 | const appPath = path.join(__dirname, "../webpack");
225 | generator = helpers.createGenerator(appPath, [], [], {
226 | skipInstall: false
227 | });
228 | helpers.mockPrompt(generator, { someAnswer: true });
229 | // Run yo-generator to output project.
230 | await Promise.resolve(generator.run());
231 | });
232 |
233 | it('creates files', function () {
234 | assert.file([
235 | '.gitignore',
236 | 'package.json',
237 | 'webpack.config.js',
238 | 'netlify.toml',
239 | 'amplify.yml',
240 | 'firebase.json',
241 | 'src/index.js',
242 | 'dist/app.css',
243 | 'dist/index.html',
244 | 'dist/manifest.json',
245 | 'dist/robots.txt',
246 | 'dist/bootstrap.min.css',
247 | 'dist/avatar-placeholder.png',
248 | 'dist/favicon.ico',
249 | 'dist/white-logo.svg'
250 | ]);
251 | });
252 |
253 | it("builds hello world", () => {
254 | // Ensure `npm test` succeeds in generated project.
255 | generator.spawnCommandSync("npm", ["test"]);
256 | });
257 |
258 |
259 | });
260 |
261 | describe('generator-blockstack:react', function () {
262 | this.enableTimeouts(false)
263 |
264 | let generator = undefined;
265 |
266 | before(async () => {
267 |
268 | const testingDir = path.join(__dirname, "../.react-gen-test");
269 | await new Promise((resolve, reject) => {
270 | helpers.testDirectory(testingDir, err => {
271 | if (err) {
272 | reject(err);
273 | } else {
274 | resolve();
275 | }
276 | });
277 | });
278 | });
279 |
280 | it("generate a project", async () => {
281 | const appPath = path.join(__dirname, "../react");
282 | generator = helpers.createGenerator(appPath, [], [], {
283 | skipInstall: false
284 | });
285 | helpers.mockPrompt(generator, { someAnswer: true });
286 | // Run yo-generator to output project.
287 | await Promise.resolve(generator.run());
288 | });
289 |
290 | it('creates files', function () {
291 | assert.file([
292 | '.env.development',
293 | '.gitignore',
294 | 'package.json',
295 | 'README.md',
296 | 'src/index.js',
297 | 'src/App.js',
298 | 'src/styles/style.css',
299 | 'src/Signin.js',
300 | 'src/Profile.js',
301 | 'src/index.js',
302 | 'src/setupProxy.js',
303 | 'public/favicon.ico',
304 | 'public/white-logo.svg',
305 | 'public/index.html',
306 | 'public/manifest.json'
307 | ]);
308 | });
309 |
310 | it("builds hello world", () => {
311 | // Ensure `npm test` succeeds in generated project.
312 | generator.spawnCommandSync("npm", ["test"]);
313 | });
314 | });
315 |
316 |
317 |
318 |
319 | describe('generator-blockstack:vue', function () {
320 | this.enableTimeouts(false);
321 |
322 | let generator = undefined;
323 |
324 | before(async () => {
325 |
326 | const testingDir = path.join(__dirname, "../.vue-gen-test");
327 | await new Promise((resolve, reject) => {
328 | helpers.testDirectory(testingDir, err => {
329 | if (err) {
330 | reject(err);
331 | } else {
332 | resolve();
333 | }
334 | });
335 | });
336 | });
337 |
338 | it("generate a project", async () => {
339 | const appPath = path.join(__dirname, "../vue");
340 | generator = helpers.createGenerator(appPath, [], [], {
341 | skipInstall: false
342 | });
343 | helpers.mockPrompt(generator, { someAnswer: true });
344 | // Run yo-generator to output project.
345 | await Promise.resolve(generator.run());
346 | });
347 |
348 | it('creates files', function () {
349 | assert.file([
350 | 'babel.config.js',
351 | '.gitignore',
352 | '.editorconfig',
353 | '.eslintignore',
354 | '.eslintrc.js',
355 | 'firebase.json',
356 | '.firebaserc',
357 | 'package.json',
358 | 'jest.config.js',
359 | 'postcss.config.js',
360 | '.postcssrc.js',
361 | 'vue.config.js',
362 | 'src/App.vue',
363 | 'src/assets/styles.css',
364 | 'src/main.js',
365 | 'src/router.js',
366 | 'src/userSession.js',
367 | 'src/components/Dashboard.vue',
368 | 'src/components/Landing.vue',
369 | 'src/views/Home.vue',
370 | 'public/_headers',
371 | 'public/_redirects',
372 | 'public/avatar-placeholder.png',
373 | 'public/white-logo.svg',
374 | 'public/favicon.ico',
375 | 'public/index.html',
376 | 'public/manifest.json'
377 | ]);
378 | });
379 |
380 | it("builds hello world", () => {
381 | // Ensure `npm test` succeeds in generated project.
382 | generator.spawnCommandSync("npm", ["test"]);
383 | });
384 |
385 | });
386 |
387 |
388 |
--------------------------------------------------------------------------------
/webpack/templates/dist/bootstrap.min.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap v4.0.0-alpha.2 (http://getbootstrap.com)
3 | * Copyright 2011-2016 Twitter, Inc.
4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5 | *//*! normalize.css commit fe56763 | 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,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{outline:0}a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.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:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-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;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}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*,::after,::before,::first-letter,::first-line{text-shadow:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{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 td,.table-bordered th{border:1px solid #ddd!important}}html{-webkit-box-sizing:border-box;box-sizing:border-box}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}@-ms-viewport{width:device-width}html{font-size:16px;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}body{font-family:Raleway,sans-serif;font-size:.9375rem;line-height:1.75;color:#373a3c;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1.375rem}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #818a91}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}a{color:#c733df;text-decoration:none}a:focus,a:hover{color:#971bab;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}pre{margin-top:0;margin-bottom:1rem}figure{margin:0 0 1rem}img{vertical-align:middle}[role=button]{cursor:pointer}[role=button],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}table{background-color:transparent}caption{padding-top:.75rem;padding-bottom:.75rem;color:#818a91;text-align:left;caption-side:bottom}th{text-align:left}label{display:inline-block;margin-bottom:.5rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,select,textarea{margin:0;line-height:inherit;border-radius:0}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit}input[type=search]{-webkit-appearance:none}output{display:inline-block}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:2rem;font-family:inherit;font-weight:500;line-height:1.35;color:inherit}.h1,h1{font-size:2.25rem}.h2,h2{font-size:1.75rem}.h3,h3{font-size:1.625rem}.h4,h4{font-size:1.25rem}.h5,h5{font-size:1rem}.h6,h6{font-size:.875rem}.lead{font-size:1.125rem;font-weight:300}.display-1{font-size:6rem;font-weight:300}.display-2{font-size:5.5rem;font-weight:300}.display-3{font-size:4.5rem;font-weight:300}.display-4{font-size:3.5rem;font-weight:300}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:5px}.initialism{font-size:90%;text-transform:uppercase}.blockquote{padding:.5rem 1rem;margin-bottom:1rem;font-size:1.171875rem;border-left:.25rem solid #eceeef}.blockquote-footer{display:block;font-size:80%;color:#818a91}.blockquote-footer::before{content:"\2014 \00A0"}.blockquote-reverse{padding-right:1rem;padding-left:0;text-align:right;border-right:.25rem solid #eceeef;border-left:0}.blockquote-reverse .blockquote-footer::before{content:""}.blockquote-reverse .blockquote-footer::after{content:"\00A0 \2014"}dl.row>dd+dt{clear:left}.carousel-inner>.carousel-item>a>img,.carousel-inner>.carousel-item>img,.img-fluid{display:block;max-width:100%;height:auto}.img-rounded{border-radius:.3rem}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #ddd;border-radius:.25rem;-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%}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#818a91}code,kbd,pre,samp{font-family:"Source Code Pro",Courier New,monospace}code{padding:.2rem .4rem;font-size:90%;color:#bd4147;background-color:#f7f7f9;border-radius:.25rem}kbd{padding:.2rem .4rem;font-size:90%;color:#fff;background-color:#333;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;margin-top:0;margin-bottom:1rem;font-size:90%;color:#373a3c}pre code{padding:0;font-size:inherit;color:inherit;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px}.container::after{content:"";display:table;clear:both}@media (min-width:544px){.container{max-width:576px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:975px){.container{max-width:940px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px}.container-fluid::after{content:"";display:table;clear:both}.row{margin-left:-15px;margin-right:-15px}.row::after{content:"";display:table;clear:both}.col-xs-1{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:8.333333%}.col-xs-2{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:16.666667%}.col-xs-3{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:25%}.col-xs-4{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:33.333333%}.col-xs-5{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:41.666667%}.col-xs-6{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:50%}.col-xs-7{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:58.333333%}.col-xs-8{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:66.666667%}.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:75%}.col-xs-10{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:83.333333%}.col-xs-11{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:91.666667%}.col-xs-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:100%}.pull-xs-0{right:auto}.pull-xs-1{right:8.333333%}.pull-xs-2{right:16.666667%}.pull-xs-3{right:25%}.pull-xs-4{right:33.333333%}.pull-xs-5{right:41.666667%}.pull-xs-6{right:50%}.pull-xs-7{right:58.333333%}.pull-xs-8{right:66.666667%}.pull-xs-9{right:75%}.pull-xs-10{right:83.333333%}.pull-xs-11{right:91.666667%}.pull-xs-12{right:100%}.push-xs-0{left:auto}.push-xs-1{left:8.333333%}.push-xs-2{left:16.666667%}.push-xs-3{left:25%}.push-xs-4{left:33.333333%}.push-xs-5{left:41.666667%}.push-xs-6{left:50%}.push-xs-7{left:58.333333%}.push-xs-8{left:66.666667%}.push-xs-9{left:75%}.push-xs-10{left:83.333333%}.push-xs-11{left:91.666667%}.push-xs-12{left:100%}.offset-xs-1{margin-left:8.333333%}.offset-xs-2{margin-left:16.666667%}.offset-xs-3{margin-left:25%}.offset-xs-4{margin-left:33.333333%}.offset-xs-5{margin-left:41.666667%}.offset-xs-6{margin-left:50%}.offset-xs-7{margin-left:58.333333%}.offset-xs-8{margin-left:66.666667%}.offset-xs-9{margin-left:75%}.offset-xs-10{margin-left:83.333333%}.offset-xs-11{margin-left:91.666667%}@media (min-width:544px){.col-sm-1{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:8.333333%}.col-sm-2{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:16.666667%}.col-sm-3{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:25%}.col-sm-4{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:33.333333%}.col-sm-5{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:41.666667%}.col-sm-6{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:50%}.col-sm-7{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:58.333333%}.col-sm-8{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:66.666667%}.col-sm-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:75%}.col-sm-10{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:83.333333%}.col-sm-11{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:91.666667%}.col-sm-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:100%}.pull-sm-0{right:auto}.pull-sm-1{right:8.333333%}.pull-sm-2{right:16.666667%}.pull-sm-3{right:25%}.pull-sm-4{right:33.333333%}.pull-sm-5{right:41.666667%}.pull-sm-6{right:50%}.pull-sm-7{right:58.333333%}.pull-sm-8{right:66.666667%}.pull-sm-9{right:75%}.pull-sm-10{right:83.333333%}.pull-sm-11{right:91.666667%}.pull-sm-12{right:100%}.push-sm-0{left:auto}.push-sm-1{left:8.333333%}.push-sm-2{left:16.666667%}.push-sm-3{left:25%}.push-sm-4{left:33.333333%}.push-sm-5{left:41.666667%}.push-sm-6{left:50%}.push-sm-7{left:58.333333%}.push-sm-8{left:66.666667%}.push-sm-9{left:75%}.push-sm-10{left:83.333333%}.push-sm-11{left:91.666667%}.push-sm-12{left:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md-1{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:8.333333%}.col-md-2{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:16.666667%}.col-md-3{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:25%}.col-md-4{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:33.333333%}.col-md-5{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:41.666667%}.col-md-6{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:50%}.col-md-7{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:58.333333%}.col-md-8{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:66.666667%}.col-md-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:75%}.col-md-10{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:83.333333%}.col-md-11{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:91.666667%}.col-md-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:100%}.pull-md-0{right:auto}.pull-md-1{right:8.333333%}.pull-md-2{right:16.666667%}.pull-md-3{right:25%}.pull-md-4{right:33.333333%}.pull-md-5{right:41.666667%}.pull-md-6{right:50%}.pull-md-7{right:58.333333%}.pull-md-8{right:66.666667%}.pull-md-9{right:75%}.pull-md-10{right:83.333333%}.pull-md-11{right:91.666667%}.pull-md-12{right:100%}.push-md-0{left:auto}.push-md-1{left:8.333333%}.push-md-2{left:16.666667%}.push-md-3{left:25%}.push-md-4{left:33.333333%}.push-md-5{left:41.666667%}.push-md-6{left:50%}.push-md-7{left:58.333333%}.push-md-8{left:66.666667%}.push-md-9{left:75%}.push-md-10{left:83.333333%}.push-md-11{left:91.666667%}.push-md-12{left:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:975px){.col-lg-1{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:8.333333%}.col-lg-2{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:16.666667%}.col-lg-3{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:25%}.col-lg-4{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:33.333333%}.col-lg-5{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:41.666667%}.col-lg-6{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:50%}.col-lg-7{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:58.333333%}.col-lg-8{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:66.666667%}.col-lg-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:75%}.col-lg-10{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:83.333333%}.col-lg-11{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:91.666667%}.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:100%}.pull-lg-0{right:auto}.pull-lg-1{right:8.333333%}.pull-lg-2{right:16.666667%}.pull-lg-3{right:25%}.pull-lg-4{right:33.333333%}.pull-lg-5{right:41.666667%}.pull-lg-6{right:50%}.pull-lg-7{right:58.333333%}.pull-lg-8{right:66.666667%}.pull-lg-9{right:75%}.pull-lg-10{right:83.333333%}.pull-lg-11{right:91.666667%}.pull-lg-12{right:100%}.push-lg-0{left:auto}.push-lg-1{left:8.333333%}.push-lg-2{left:16.666667%}.push-lg-3{left:25%}.push-lg-4{left:33.333333%}.push-lg-5{left:41.666667%}.push-lg-6{left:50%}.push-lg-7{left:58.333333%}.push-lg-8{left:66.666667%}.push-lg-9{left:75%}.push-lg-10{left:83.333333%}.push-lg-11{left:91.666667%}.push-lg-12{left:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl-1{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:8.333333%}.col-xl-2{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:16.666667%}.col-xl-3{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:25%}.col-xl-4{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:33.333333%}.col-xl-5{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:41.666667%}.col-xl-6{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:50%}.col-xl-7{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:58.333333%}.col-xl-8{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:66.666667%}.col-xl-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:75%}.col-xl-10{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:83.333333%}.col-xl-11{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:91.666667%}.col-xl-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px;float:left;width:100%}.pull-xl-0{right:auto}.pull-xl-1{right:8.333333%}.pull-xl-2{right:16.666667%}.pull-xl-3{right:25%}.pull-xl-4{right:33.333333%}.pull-xl-5{right:41.666667%}.pull-xl-6{right:50%}.pull-xl-7{right:58.333333%}.pull-xl-8{right:66.666667%}.pull-xl-9{right:75%}.pull-xl-10{right:83.333333%}.pull-xl-11{right:91.666667%}.pull-xl-12{right:100%}.push-xl-0{left:auto}.push-xl-1{left:8.333333%}.push-xl-2{left:16.666667%}.push-xl-3{left:25%}.push-xl-4{left:33.333333%}.push-xl-5{left:41.666667%}.push-xl-6{left:50%}.push-xl-7{left:58.333333%}.push-xl-8{left:66.666667%}.push-xl-9{left:75%}.push-xl-10{left:83.333333%}.push-xl-11{left:91.666667%}.push-xl-12{left:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem}.table td,.table th{padding:1.125rem;vertical-align:top;border-top:1px solid #eceeef}.table thead th{vertical-align:bottom;border-bottom:2px solid #eceeef}.table tbody+tbody{border-top:2px solid #eceeef}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #eceeef}.table-bordered td,.table-bordered th{border:1px solid #eceeef}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover tbody tr:hover{background-color:#f5f5f5}.table-active,.table-active>td,.table-active>th{background-color:#f5f5f5}.table-hover .table-active:hover{background-color:#e8e8e8}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:#e8e8e8}.table-success,.table-success>td,.table-success>th{background-color:#dff0d8}.table-hover .table-success:hover{background-color:#d0e9c6}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#d0e9c6}.table-info,.table-info>td,.table-info>th{background-color:#d9edf7}.table-hover .table-info:hover{background-color:#c4e3f3}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#c4e3f3}.table-warning,.table-warning>td,.table-warning>th{background-color:#fcf8e3}.table-hover .table-warning:hover{background-color:#faf2cc}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#faf2cc}.table-danger,.table-danger>td,.table-danger>th{background-color:#f2dede}.table-hover .table-danger:hover{background-color:#ebcccc}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#ebcccc}.table-responsive{display:block;width:100%;min-height:.01%;overflow-x:auto}.thead-inverse th{color:#fff;background-color:#373a3c}.thead-default th{color:#55595c;background-color:#eceeef}.table-inverse{color:#eceeef;background-color:#1a1d1f}.table-inverse.table-bordered{border:0;border-color:#32363a}.table-inverse td,.table-inverse th,.table-inverse thead th{border-color:#32363a;font-size:.9375rem}.table-reflow thead{float:left}.table-reflow tbody{display:block;white-space:nowrap}.table-reflow td,.table-reflow th{border-top:1px solid #eceeef;border-left:1px solid #eceeef}.table-reflow td:last-child,.table-reflow th:last-child{border-right:1px solid #eceeef}.table-reflow tbody:last-child tr:last-child td,.table-reflow tbody:last-child tr:last-child th,.table-reflow tfoot:last-child tr:last-child td,.table-reflow tfoot:last-child tr:last-child th,.table-reflow thead:last-child tr:last-child td,.table-reflow thead:last-child tr:last-child th{border-bottom:1px solid #eceeef}.table-reflow tr{float:left}.table-reflow tr td,.table-reflow tr th{display:block!important;border:1px solid #eceeef}.form-control{display:block;width:100%;padding:.5rem .75rem;font-size:.9375rem;line-height:1.25;color:#55595c;background-color:#fff;background-image:none;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;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;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{border-color:#66afe9;outline:0;background-color:#fafafa;color:#55595c;-webkit-transition:all .15s ease-in-out;-o-transition:all .15s ease-in-out;transition:all .15s ease-in-out}.form-control::-webkit-input-placeholder{color:#999;opacity:1}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999;opacity:1}.form-control::placeholder{color:#999;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#eceeef;opacity:1}.form-control:disabled{cursor:not-allowed}select.form-control:not([size]):not([multiple]){height:2.640625rem}.form-control-file,.form-control-range{display:block}.form-control-label{padding:.5rem .75rem;margin-bottom:0}_::-webkit-full-page-media.form-control,input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:2.640625rem}.input-group-sm _::-webkit-full-page-media.form-control,.input-group-sm input[type=date].form-control,.input-group-sm input[type=time].form-control,.input-group-sm input[type=datetime-local].form-control,.input-group-sm input[type=month].form-control,_::-webkit-full-page-media.input-sm,input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:1.8125rem}.input-group-lg _::-webkit-full-page-media.form-control,.input-group-lg input[type=date].form-control,.input-group-lg input[type=time].form-control,.input-group-lg input[type=datetime-local].form-control,.input-group-lg input[type=month].form-control,_::-webkit-full-page-media.input-lg,input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:3.166667rem}.form-control-static{min-height:2.640625rem;padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0}.form-control-static.form-control-lg,.form-control-static.form-control-sm,.input-group-lg>.form-control-static.form-control,.input-group-lg>.form-control-static.input-group-addon,.input-group-lg>.input-group-btn>.form-control-static.btn,.input-group-sm>.form-control-static.form-control,.input-group-sm>.form-control-static.input-group-addon,.input-group-sm>.input-group-btn>.form-control-static.btn{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{padding:.75rem 1.5rem;font-size:1.25rem;border-radius:.3rem}.form-group{margin-bottom:1rem}.checkbox,.radio{position:relative;display:block;margin-bottom:.75rem}.checkbox label,.radio label{padding-left:1.25rem;margin-bottom:0;cursor:pointer}.checkbox label input:only-child,.radio label input:only-child{position:static}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:.25rem;margin-left:-1.25rem}.checkbox+.checkbox,.radio+.radio{margin-top:-.25rem}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:1.25rem;margin-bottom:0;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:.75rem}input[type=checkbox].disabled,input[type=checkbox]:disabled,input[type=radio].disabled,input[type=radio]:disabled{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label{cursor:not-allowed}.form-control-danger,.form-control-success,.form-control-warning{padding-right:2.25rem;background-repeat:no-repeat;background-position:center right .660156rem;-webkit-background-size:1.320312rem 1.320312rem;background-size:1.320312rem 1.320312rem}.has-success .checkbox,.has-success .checkbox-inline,.has-success .form-control-label,.has-success .radio,.has-success .radio-inline,.has-success .text-help,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#1db954}.has-success .form-control{border-color:#1db954}.has-success .input-group-addon{color:#1db954;border-color:#1db954;background-color:#aff3c7}.has-success .form-control-feedback{color:#1db954}.has-success .form-control-success{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%235cb85c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E")}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .form-control-label,.has-warning .radio,.has-warning .radio-inline,.has-warning .text-help,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#f90}.has-warning .form-control{border-color:#f90}.has-warning .input-group-addon{color:#f90;border-color:#f90;background-color:#ffebcc}.has-warning .form-control-feedback{color:#f90}.has-warning .form-control-warning{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23f0ad4e' d='M4.4 5.324h-.8v-2.46h.8zm0 1.42h-.8V5.89h.8zM3.76.63L.04 7.075c-.115.2.016.425.26.426h7.397c.242 0 .372-.226.258-.426C6.726 4.924 5.47 2.79 4.253.63c-.113-.174-.39-.174-.494 0z'/%3E%3C/svg%3E")}.has-danger .checkbox,.has-danger .checkbox-inline,.has-danger .form-control-label,.has-danger .radio,.has-danger .radio-inline,.has-danger .text-help,.has-danger.checkbox label,.has-danger.checkbox-inline label,.has-danger.radio label,.has-danger.radio-inline label{color:#d0021b}.has-danger .form-control{border-color:#d0021b}.has-danger .input-group-addon{color:#d0021b;border-color:#d0021b;background-color:#fea0ab}.has-danger .form-control-feedback{color:#d0021b}.has-danger .form-control-danger{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23d9534f' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E")}@media (min-width:544px){.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 .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .form-control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.btn{display:inline-block;font-weight:500;line-height:1.25;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.6875rem 2.375rem;font-size:.6875rem;border-radius:.25rem;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:focus,.btn:hover{text-decoration:none}.btn.focus{text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0}.btn.disabled,.btn:disabled{cursor:not-allowed;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#53206f;border-color:#53206f}.btn-primary:hover{color:#fff;background-color:#351547;border-color:#2f123f}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#351547;border-color:#2f123f}.btn-primary.active,.btn-primary:active,.open>.btn-primary.dropdown-toggle{color:#fff;background-color:#351547;border-color:#2f123f;background-image:none}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.btn-primary.dropdown-toggle.focus,.open>.btn-primary.dropdown-toggle:focus,.open>.btn-primary.dropdown-toggle:hover{color:#fff;background-color:#210d2c;border-color:#09030c}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary:disabled.focus,.btn-primary:disabled:focus{background-color:#53206f;border-color:#53206f}.btn-primary.disabled:hover,.btn-primary:disabled:hover{background-color:#53206f;border-color:#53206f}.btn-secondary{color:#53206f;background-color:#fff;border-color:#f0f0f0}.btn-secondary:hover{color:#53206f;background-color:#e6e6e6;border-color:#d1d1d1}.btn-secondary.focus,.btn-secondary:focus{color:#53206f;background-color:#e6e6e6;border-color:#d1d1d1}.btn-secondary.active,.btn-secondary:active,.open>.btn-secondary.dropdown-toggle{color:#53206f;background-color:#e6e6e6;border-color:#d1d1d1;background-image:none}.btn-secondary.active.focus,.btn-secondary.active:focus,.btn-secondary.active:hover,.btn-secondary:active.focus,.btn-secondary:active:focus,.btn-secondary:active:hover,.open>.btn-secondary.dropdown-toggle.focus,.open>.btn-secondary.dropdown-toggle:focus,.open>.btn-secondary.dropdown-toggle:hover{color:#53206f;background-color:#d4d4d4;border-color:#b0b0b0}.btn-secondary.disabled.focus,.btn-secondary.disabled:focus,.btn-secondary:disabled.focus,.btn-secondary:disabled:focus{background-color:#fff;border-color:#f0f0f0}.btn-secondary.disabled:hover,.btn-secondary:disabled:hover{background-color:#fff;border-color:#f0f0f0}.btn-info{color:#fff;background-color:#4a90e2;border-color:#4a90e2}.btn-info:hover{color:#fff;background-color:#2275d7;border-color:#2171ce}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#2275d7;border-color:#2171ce}.btn-info.active,.btn-info:active,.open>.btn-info.dropdown-toggle{color:#fff;background-color:#2275d7;border-color:#2171ce;background-image:none}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.btn-info.dropdown-toggle.focus,.open>.btn-info.dropdown-toggle:focus,.open>.btn-info.dropdown-toggle:hover{color:#fff;background-color:#1d65b8;border-color:#185195}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info:disabled.focus,.btn-info:disabled:focus{background-color:#4a90e2;border-color:#4a90e2}.btn-info.disabled:hover,.btn-info:disabled:hover{background-color:#4a90e2;border-color:#4a90e2}.btn-success{color:#fff;background-color:#1db954;border-color:#1db954}.btn-success:hover{color:#fff;background-color:#168d40;border-color:#15843c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#168d40;border-color:#15843c}.btn-success.active,.btn-success:active,.open>.btn-success.dropdown-toggle{color:#fff;background-color:#168d40;border-color:#15843c;background-image:none}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.btn-success.dropdown-toggle.focus,.open>.btn-success.dropdown-toggle:focus,.open>.btn-success.dropdown-toggle:hover{color:#fff;background-color:#116e32;border-color:#0c4b22}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success:disabled.focus,.btn-success:disabled:focus{background-color:#1db954;border-color:#1db954}.btn-success.disabled:hover,.btn-success:disabled:hover{background-color:#1db954;border-color:#1db954}.btn-warning{color:#fff;background-color:#f90;border-color:#f90}.btn-warning:hover{color:#fff;background-color:#cc7a00;border-color:#c27400}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#cc7a00;border-color:#c27400}.btn-warning.active,.btn-warning:active,.open>.btn-warning.dropdown-toggle{color:#fff;background-color:#cc7a00;border-color:#c27400;background-image:none}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.btn-warning.dropdown-toggle.focus,.open>.btn-warning.dropdown-toggle:focus,.open>.btn-warning.dropdown-toggle:hover{color:#fff;background-color:#a86500;border-color:#804d00}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning:disabled.focus,.btn-warning:disabled:focus{background-color:#f90;border-color:#f90}.btn-warning.disabled:hover,.btn-warning:disabled:hover{background-color:#f90;border-color:#f90}.btn-danger{color:#fff;background-color:#d0021b;border-color:#d0021b}.btn-danger:hover{color:#fff;background-color:#9d0214;border-color:#930113}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#9d0214;border-color:#930113}.btn-danger.active,.btn-danger:active,.open>.btn-danger.dropdown-toggle{color:#fff;background-color:#9d0214;border-color:#930113;background-image:none}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.btn-danger.dropdown-toggle.focus,.open>.btn-danger.dropdown-toggle:focus,.open>.btn-danger.dropdown-toggle:hover{color:#fff;background-color:#7a0110;border-color:#52010b}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger:disabled.focus,.btn-danger:disabled:focus{background-color:#d0021b;border-color:#d0021b}.btn-danger.disabled:hover,.btn-danger:disabled:hover{background-color:#d0021b;border-color:#d0021b}.btn-special{color:#fff;background-color:#3f1855;border-color:#3f1855}.btn-special:hover{color:#fff;background-color:#220d2d;border-color:#1c0b25}.btn-special.focus,.btn-special:focus{color:#fff;background-color:#220d2d;border-color:#1c0b25}.btn-special.active,.btn-special:active,.open>.btn-special.dropdown-toggle{color:#fff;background-color:#220d2d;border-color:#1c0b25;background-image:none}.btn-special.active.focus,.btn-special.active:focus,.btn-special.active:hover,.btn-special:active.focus,.btn-special:active:focus,.btn-special:active:hover,.open>.btn-special.dropdown-toggle.focus,.open>.btn-special.dropdown-toggle:focus,.open>.btn-special.dropdown-toggle:hover{color:#fff;background-color:#0d0511;border-color:#000}.btn-special.disabled.focus,.btn-special.disabled:focus,.btn-special:disabled.focus,.btn-special:disabled:focus{background-color:#3f1855;border-color:#3f1855}.btn-special.disabled:hover,.btn-special:disabled:hover{background-color:#3f1855;border-color:#3f1855}.btn-outline-primary{color:#53206f;background-image:none;background-color:transparent;border-color:#53206f}.btn-outline-primary.active,.btn-outline-primary.focus,.btn-outline-primary:active,.btn-outline-primary:focus,.open>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#53206f;border-color:#53206f}.btn-outline-primary:hover{color:#fff;background-color:#53206f;border-color:#53206f}.btn-outline-primary.disabled.focus,.btn-outline-primary.disabled:focus,.btn-outline-primary:disabled.focus,.btn-outline-primary:disabled:focus{border-color:#8e37be}.btn-outline-primary.disabled:hover,.btn-outline-primary:disabled:hover{border-color:#8e37be}.btn-outline-secondary{color:#fff;background-image:none;background-color:transparent;border-color:#fff}.btn-outline-secondary.active,.btn-outline-secondary.focus,.btn-outline-secondary:active,.btn-outline-secondary:focus,.open>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#fff;border-color:#fff}.btn-outline-secondary:hover{color:#fff;background-color:#fff;border-color:#fff}.btn-outline-secondary.disabled.focus,.btn-outline-secondary.disabled:focus,.btn-outline-secondary:disabled.focus,.btn-outline-secondary:disabled:focus{border-color:#fff}.btn-outline-secondary.disabled:hover,.btn-outline-secondary:disabled:hover{border-color:#fff}.btn-outline-info{color:#4a90e2;background-image:none;background-color:transparent;border-color:#4a90e2}.btn-outline-info.active,.btn-outline-info.focus,.btn-outline-info:active,.btn-outline-info:focus,.open>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#4a90e2;border-color:#4a90e2}.btn-outline-info:hover{color:#fff;background-color:#4a90e2;border-color:#4a90e2}.btn-outline-info.disabled.focus,.btn-outline-info.disabled:focus,.btn-outline-info:disabled.focus,.btn-outline-info:disabled:focus{border-color:#a2c6f0}.btn-outline-info.disabled:hover,.btn-outline-info:disabled:hover{border-color:#a2c6f0}.btn-outline-success{color:#1db954;background-image:none;background-color:transparent;border-color:#1db954}.btn-outline-success.active,.btn-outline-success.focus,.btn-outline-success:active,.btn-outline-success:focus,.open>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#1db954;border-color:#1db954}.btn-outline-success:hover{color:#fff;background-color:#1db954;border-color:#1db954}.btn-outline-success.disabled.focus,.btn-outline-success.disabled:focus,.btn-outline-success:disabled.focus,.btn-outline-success:disabled:focus{border-color:#57e589}.btn-outline-success.disabled:hover,.btn-outline-success:disabled:hover{border-color:#57e589}.btn-outline-warning{color:#f90;background-image:none;background-color:transparent;border-color:#f90}.btn-outline-warning.active,.btn-outline-warning.focus,.btn-outline-warning:active,.btn-outline-warning:focus,.open>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#f90;border-color:#f90}.btn-outline-warning:hover{color:#fff;background-color:#f90;border-color:#f90}.btn-outline-warning.disabled.focus,.btn-outline-warning.disabled:focus,.btn-outline-warning:disabled.focus,.btn-outline-warning:disabled:focus{border-color:#ffc266}.btn-outline-warning.disabled:hover,.btn-outline-warning:disabled:hover{border-color:#ffc266}.btn-outline-danger{color:#d0021b;background-image:none;background-color:transparent;border-color:#d0021b}.btn-outline-danger.active,.btn-outline-danger.focus,.btn-outline-danger:active,.btn-outline-danger:focus,.open>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#d0021b;border-color:#d0021b}.btn-outline-danger:hover{color:#fff;background-color:#d0021b;border-color:#d0021b}.btn-outline-danger.disabled.focus,.btn-outline-danger.disabled:focus,.btn-outline-danger:disabled.focus,.btn-outline-danger:disabled:focus{border-color:#fd3b52}.btn-outline-danger.disabled:hover,.btn-outline-danger:disabled:hover{border-color:#fd3b52}.btn-outline-special{color:#3f1855;background-image:none;background-color:transparent;border-color:#3f1855}.btn-outline-special.active,.btn-outline-special.focus,.btn-outline-special:active,.btn-outline-special:focus,.open>.btn-outline-special.dropdown-toggle{color:#fff;background-color:#3f1855;border-color:#3f1855}.btn-outline-special:hover{color:#fff;background-color:#3f1855;border-color:#3f1855}.btn-outline-special.disabled.focus,.btn-outline-special.disabled:focus,.btn-outline-special:disabled.focus,.btn-outline-special:disabled:focus{border-color:#7a2ea5}.btn-outline-special.disabled:hover,.btn-outline-special:disabled:hover{border-color:#7a2ea5}.btn-link{font-weight:400;color:#c733df;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link:disabled{background-color:transparent}.btn-link,.btn-link:active,.btn-link:focus{border-color:transparent}.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#971bab;text-decoration:underline;background-color:transparent}.btn-link:disabled:focus,.btn-link:disabled:hover{color:#818a91;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:1.125rem 3.438rem;font-size:.9375rem;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.4375rem 1.875rem;font-size:.875rem;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height;-o-transition-property:height;transition-property:height}.dropdown,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-right:.25rem;margin-left:.25rem;vertical-align:middle;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-left:.3em solid transparent}.dropdown-toggle:focus{outline:0}.dropup .dropdown-toggle::after{border-top:0;border-bottom:.3em solid}.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;font-size:.9375rem;color:#373a3c;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-divider{height:1px;margin:.5rem 0;overflow:hidden;background-color:#e5e5e5}.dropdown-item{display:block;width:100%;padding:3px 20px;clear:both;font-weight:400;color:#373a3c;text-align:inherit;white-space:nowrap;background:0 0;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#2b2d2f;text-decoration:none;background-color:#f5f5f5}.dropdown-item.active,.dropdown-item.active:focus,.dropdown-item.active:hover{color:#fff;text-decoration:none;background-color:#53206f;outline:0}.dropdown-item.disabled,.dropdown-item.disabled:focus,.dropdown-item.disabled:hover{color:#818a91}.dropdown-item.disabled:focus,.dropdown-item.disabled:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:"progid:DXImageTransform.Microsoft.gradient(enabled = false)"}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:5px 20px;font-size:.875rem;color:#818a91;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:.3em solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:2}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{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::after{content:"";display:table;clear:both}.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-right:8px;padding-left:8px}.btn-group-lg.btn-group>.btn+.dropdown-toggle,.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn .caret{margin-left:0}.btn-group-lg>.btn .caret,.btn-lg .caret{border-width:.3em .3em 0;border-bottom-width:0}.dropup .btn-group-lg>.btn .caret,.dropup .btn-lg .caret{border-width:0 .3em .3em}.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::after{content:"";display:table;clear:both}.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-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}.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}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;width:100%;display:table;border-collapse:separate}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:active,.input-group .form-control:focus,.input-group .form-control:hover{z-index:3}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn: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:.5rem .75rem;margin-bottom:0;font-size:.9375rem;font-weight:400;line-height:1.25;color:#55595c;text-align:center;background-color:#eceeef;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.input-group-addon.form-control-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-addon.form-control-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:.75rem 1.5rem;font-size:1.25rem;border-radius:.3rem}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:not(:last-child),.input-group-addon:not(:last-child),.input-group-btn:not(:first-child)>.btn-group:not(:last-child)>.btn,.input-group-btn:not(:first-child)>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group>.btn,.input-group-btn:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:not(:last-child){border-right:0}.input-group .form-control:not(:first-child),.input-group-addon:not(:first-child),.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group>.btn,.input-group-btn:not(:first-child)>.dropdown-toggle,.input-group-btn:not(:last-child)>.btn-group:not(:first-child)>.btn,.input-group-btn:not(:last-child)>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.form-control+.input-group-addon:not(:first-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:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:3}.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group{margin-right:-1px}.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group{z-index:2;margin-left:-1px}.input-group-btn:not(:first-child)>.btn-group:active,.input-group-btn:not(:first-child)>.btn-group:focus,.input-group-btn:not(:first-child)>.btn-group:hover,.input-group-btn:not(:first-child)>.btn:active,.input-group-btn:not(:first-child)>.btn:focus,.input-group-btn:not(:first-child)>.btn:hover{z-index:3}.custom-control{position:relative;display:inline;padding-left:1.5rem}.custom-control+.custom-control{margin-left:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-indicator{color:#fff;background-color:#0074d9}.custom-control-input:focus~.custom-control-indicator{-webkit-box-shadow:0 0 0 .075rem #fff,0 0 0 .2rem #0074d9;box-shadow:0 0 0 .075rem #fff,0 0 0 .2rem #0074d9}.custom-control-input:active~.custom-control-indicator{color:#fff;background-color:#84c6ff}.custom-control-input:disabled~.custom-control-indicator{cursor:not-allowed;background-color:#eee}.custom-control-input:disabled~.custom-control-description{color:#767676;cursor:not-allowed}.custom-control-indicator{position:absolute;top:.0625rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#ddd;background-repeat:no-repeat;background-position:center center;-webkit-background-size:50% 50%;background-size:50% 50%}.custom-checkbox .custom-control-indicator{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-indicator{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-indicator{background-color:#0074d9;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-radio .custom-control-indicator{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-indicator{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-controls-stacked .custom-control{display:inline}.custom-controls-stacked .custom-control::after{display:block;margin-bottom:.25rem;content:""}.custom-controls-stacked .custom-control+.custom-control{margin-left:0}.custom-select{display:inline-block;max-width:100%;padding:.375rem 1.75rem .375rem .75rem;padding-right:.75rem\9;color:#55595c;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-image:none\9;-webkit-background-size:8px 10px;background-size:8px 10px;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;-moz-appearance:none;-webkit-appearance:none}.custom-select:focus{border-color:#51a7e8;outline:0}.custom-select::-ms-expand{opacity:0}.custom-select-sm{padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-file{position:relative;display:inline-block;max-width:100%;height:2.5rem;cursor:pointer}.custom-file-input{min-width:14rem;max-width:100%;margin:0;filter:alpha(opacity=0);opacity:0}.custom-file-control{position:absolute;top:0;right:0;left:0;z-index:5;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#555;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;border:1px solid #ddd;border-radius:.25rem}.custom-file-control:lang(en)::after{content:"Choose file..."}.custom-file-control::before{position:absolute;top:-1px;right:-1px;bottom:-1px;z-index:6;display:block;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#555;background-color:#eee;border:1px solid #ddd;border-radius:0 .25rem .25rem 0}.custom-file-control:lang(en)::before{content:"Browse"}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:inline-block}.nav-link:focus,.nav-link:hover{text-decoration:none;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.nav-link.disabled{color:#818a91}.nav-link.disabled,.nav-link.disabled:focus,.nav-link.disabled:hover{color:#818a91;cursor:not-allowed;background-color:transparent}.nav-inline .nav-item{display:inline-block}.nav-inline .nav-item+.nav-item,.nav-inline .nav-link+.nav-link{margin-left:1rem}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs::after{content:"";display:table;clear:both}.nav-tabs .nav-item{float:left;margin-bottom:-1px}.nav-tabs .nav-item+.nav-item{margin-left:.2rem}.nav-tabs .nav-link{display:block;padding:.5em 1em;border:1px solid transparent;border-radius:.25rem .25rem 0 0}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#eceeef #eceeef #ddd}.nav-tabs .nav-link.disabled,.nav-tabs .nav-link.disabled:focus,.nav-tabs .nav-link.disabled:hover{color:#818a91;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.open .nav-link,.nav-tabs .nav-item.open .nav-link:focus,.nav-tabs .nav-item.open .nav-link:hover,.nav-tabs .nav-link.active,.nav-tabs .nav-link.active:focus,.nav-tabs .nav-link.active:hover{color:#55595c;background-color:#fff;border-color:#ddd #ddd transparent}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.nav-pills::after{content:"";display:table;clear:both}.nav-pills .nav-item{float:left}.nav-pills .nav-item+.nav-item{margin-left:.2rem}.nav-pills .nav-link{display:block;padding:.5em 1em;border-radius:.25rem}.nav-pills .nav-item.open .nav-link,.nav-pills .nav-item.open .nav-link:focus,.nav-pills .nav-item.open .nav-link:hover,.nav-pills .nav-link.active,.nav-pills .nav-link.active:focus,.nav-pills .nav-link.active:hover{color:#fff;cursor:default;background-color:#53206f}.nav-stacked .nav-item{display:block;float:none}.nav-stacked .nav-item+.nav-item{margin-top:.2rem;margin-left:0}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;padding:.5rem 1rem}.navbar::after{content:"";display:table;clear:both}@media (min-width:544px){.navbar{border-radius:.25rem}}.navbar-full{z-index:1000}@media (min-width:544px){.navbar-full{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:544px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0}.navbar-fixed-bottom{bottom:0}.navbar-sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1030;width:100%}@media (min-width:544px){.navbar-sticky-top{border-radius:0}}.navbar-brand{float:left;padding-top:.25rem;padding-bottom:.25rem;margin-right:1rem;font-size:1.25rem}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}.navbar-divider{float:left;width:1px;padding-top:.425rem;padding-bottom:.425rem;margin-right:1rem;margin-left:1rem;overflow:hidden}.navbar-divider::before{content:"\00a0"}.navbar-toggler{padding:.5rem .75rem;font-size:1.25rem;line-height:1;background:0 0;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}@media (min-width:544px){.navbar-toggleable-xs{display:block!important}}@media (min-width:768px){.navbar-toggleable-sm{display:block!important}}@media (min-width:975px){.navbar-toggleable-md{display:block!important}}.navbar-nav .nav-item{float:left}.navbar-nav .nav-link{display:block;padding-top:.425rem;padding-bottom:.425rem}.navbar-nav .nav-link+.nav-link{margin-left:1rem}.navbar-nav .nav-item+.nav-item{margin-left:1rem}.navbar-light .navbar-brand{color:rgba(0,0,0,.8)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.8)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.6)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .active>.nav-link:focus,.navbar-light .navbar-nav .active>.nav-link:hover,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.active:focus,.navbar-light .navbar-nav .nav-link.active:hover,.navbar-light .navbar-nav .nav-link.open,.navbar-light .navbar-nav .nav-link.open:focus,.navbar-light .navbar-nav .nav-link.open:hover,.navbar-light .navbar-nav .open>.nav-link,.navbar-light .navbar-nav .open>.nav-link:focus,.navbar-light .navbar-nav .open>.nav-link:hover{color:rgba(0,0,0,.8)}.navbar-light .navbar-divider{background-color:rgba(0,0,0,.075)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .active>.nav-link:focus,.navbar-dark .navbar-nav .active>.nav-link:hover,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.active:focus,.navbar-dark .navbar-nav .nav-link.active:hover,.navbar-dark .navbar-nav .nav-link.open,.navbar-dark .navbar-nav .nav-link.open:focus,.navbar-dark .navbar-nav .nav-link.open:hover,.navbar-dark .navbar-nav .open>.nav-link,.navbar-dark .navbar-nav .open>.nav-link:focus,.navbar-dark .navbar-nav .open>.nav-link:hover{color:#fff}.navbar-dark .navbar-divider{background-color:rgba(255,255,255,.075)}.card{position:relative;display:block;margin-bottom:.75rem;background-color:#fff;border-radius:.25rem;-webkit-box-shadow:inset 0 0 0 1px rgba(0,0,0,.125);box-shadow:inset 0 0 0 1px rgba(0,0,0,.125)}.card-block{padding:1.25rem}.card-block::after{content:"";display:table;clear:both}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-header{padding:.75rem 1.25rem;background-color:#f5f5f5;-webkit-box-shadow:inset 0 0 0 1px rgba(0,0,0,.125);box-shadow:inset 0 0 0 1px rgba(0,0,0,.125)}.card-header::after{content:"";display:table;clear:both}.card-header:first-child{border-radius:.25rem .25rem 0 0}.card-footer{padding:.75rem 1.25rem;background-color:#f5f5f5;-webkit-box-shadow:inset 0 0 0 1px rgba(0,0,0,.125);box-shadow:inset 0 0 0 1px rgba(0,0,0,.125)}.card-footer::after{content:"";display:table;clear:both}.card-footer:last-child{border-radius:0 0 .25rem .25rem}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-tabs .nav-item{margin-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-primary{background-color:#53206f;border-color:#53206f}.card-success{background-color:#1db954;border-color:#1db954}.card-info{background-color:#4a90e2;border-color:#4a90e2}.card-warning{background-color:#f90;border-color:#f90}.card-danger{background-color:#d0021b;border-color:#d0021b}.card-outline-primary{background-color:transparent;border-color:#53206f}.card-outline-secondary{background-color:transparent;border-color:#f0f0f0}.card-outline-info{background-color:transparent;border-color:#4a90e2}.card-outline-success{background-color:transparent;border-color:#1db954}.card-outline-warning{background-color:transparent;border-color:#f90}.card-outline-danger{background-color:transparent;border-color:#d0021b}.card-inverse .card-footer,.card-inverse .card-header{border-bottom:1px solid rgba(255,255,255,.2)}.card-inverse .card-blockquote,.card-inverse .card-footer,.card-inverse .card-header,.card-inverse .card-title{color:#fff}.card-inverse .card-blockquote>footer,.card-inverse .card-link,.card-inverse .card-text{color:rgba(255,255,255,.65)}.card-inverse .card-link:focus,.card-inverse .card-link:hover{color:#fff}.card-blockquote{padding:0;margin-bottom:0;border-left:0}.card-img{border-radius:.25rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img-top{border-radius:.25rem .25rem 0 0}.card-img-bottom{border-radius:0 0 .25rem .25rem}@media (min-width:544px){.card-deck{display:table;table-layout:fixed;border-spacing:1.25rem 0}.card-deck .card{display:table-cell;width:1%;vertical-align:top}.card-deck-wrapper{margin-right:-1.25rem;margin-left:-1.25rem}}@media (min-width:544px){.card-group{display:table;width:100%;table-layout:fixed}.card-group .card{display:table-cell;vertical-align:top}.card-group .card+.card{margin-left:0;border-left:0}.card-group .card:first-child{border-bottom-right-radius:0;border-top-right-radius:0}.card-group .card:first-child .card-img-top{border-top-right-radius:0}.card-group .card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group .card:last-child{border-bottom-left-radius:0;border-top-left-radius:0}.card-group .card:last-child .card-img-top{border-top-left-radius:0}.card-group .card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group .card:not(:first-child):not(:last-child){border-radius:0}.card-group .card:not(:first-child):not(:last-child) .card-img-bottom,.card-group .card:not(:first-child):not(:last-child) .card-img-top{border-radius:0}}@media (min-width:544px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%}}.breadcrumb{padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#eceeef;border-radius:.25rem}.breadcrumb::after{content:"";display:table;clear:both}.breadcrumb-item{float:left}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#818a91;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#818a91}.pagination{display:inline-block;padding-left:0;margin-top:1rem;margin-bottom:1rem;border-radius:.25rem}.page-item{display:inline}.page-item:first-child .page-link{margin-left:0;border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.page-item:last-child .page-link{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.page-item.active .page-link,.page-item.active .page-link:focus,.page-item.active .page-link:hover{z-index:2;color:#fff;cursor:default;background-color:#53206f;border-color:#53206f}.page-item.disabled .page-link,.page-item.disabled .page-link:focus,.page-item.disabled .page-link:hover{color:#818a91;pointer-events:none;cursor:not-allowed;background-color:#fff;border-color:#ddd}.page-link{position:relative;float:left;padding:.5rem .75rem;margin-left:-1px;color:#c733df;text-decoration:none;background-color:#fff;border:1px solid #ddd}.page-link:focus,.page-link:hover{color:#fff;background-color:#351547;border-color:#2f123f}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-bottom-left-radius:.3rem;border-top-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-bottom-right-radius:.3rem;border-top-right-radius:.3rem}.pagination-sm .page-link{padding:.275rem .75rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-bottom-left-radius:.2rem;border-top-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-bottom-right-radius:.2rem;border-top-right-radius:.2rem}.label{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.label:empty{display:none}.btn .label{position:relative;top:-1px}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.label-default{background-color:#818a91}.label-default[href]:focus,.label-default[href]:hover{background-color:#687077}.label-primary{background-color:#53206f}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#351547}.label-success{background-color:#1db954}.label-success[href]:focus,.label-success[href]:hover{background-color:#168d40}.label-info{background-color:#4a90e2}.label-info[href]:focus,.label-info[href]:hover{background-color:#2275d7}.label-warning{background-color:#f90}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#cc7a00}.label-danger{background-color:#d0021b}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#9d0214}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#eceeef;border-radius:.3rem}@media (min-width:544px){.jumbotron{padding:4rem 2rem}}.jumbotron-hr{border-top-color:#d0d5d8}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{padding:15px;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:35px}.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d0e9c6;color:#3c763d}.alert-success hr{border-top-color:#c1e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bcdff1;color:#31708f}.alert-info hr{border-top-color:#a6d5ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faf2cc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7ecb5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebcccc;color:#a94442}.alert-danger hr{border-top-color:#e4b9b9}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:block;width:100%;height:1rem;margin-bottom:1rem}.progress[value]{background-color:#eee;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem}.progress[value]::-ms-fill{background-color:#0074d9;border:0}.progress[value]::-moz-progress-bar{background-color:#0074d9;border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.progress[value]::-webkit-progress-value{background-color:#0074d9;border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.progress[value="100"]::-moz-progress-bar{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.progress[value="100"]::-webkit-progress-value{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.progress[value]::-webkit-progress-bar{background-color:#eee;border-radius:.25rem}.progress[value],base::-moz-progress-bar{background-color:#eee;border-radius:.25rem}@media screen and (min-width:0\0){.progress{background-color:#eee;border-radius:.25rem}.progress-bar{display:inline-block;height:1rem;text-indent:-999rem;background-color:#0074d9;border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.progress[width="100%"]{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}}.progress-striped[value]::-webkit-progress-value{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:1rem 1rem;background-size:1rem 1rem}.progress-striped[value]::-moz-progress-bar{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-striped[value]::-ms-fill{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}@media screen and (min-width:0\0){.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:1rem 1rem;background-size:1rem 1rem}}.progress-animated[value]::-webkit-progress-value{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-animated[value]::-moz-progress-bar{animation:progress-bar-stripes 2s linear infinite}@media screen and (min-width:0\0){.progress-animated .progress-bar-striped{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}}.progress-success[value]::-webkit-progress-value{background-color:#1db954}.progress-success[value]::-moz-progress-bar{background-color:#1db954}.progress-success[value]::-ms-fill{background-color:#1db954}@media screen and (min-width:0\0){.progress-success .progress-bar{background-color:#1db954}}.progress-info[value]::-webkit-progress-value{background-color:#4a90e2}.progress-info[value]::-moz-progress-bar{background-color:#4a90e2}.progress-info[value]::-ms-fill{background-color:#4a90e2}@media screen and (min-width:0\0){.progress-info .progress-bar{background-color:#4a90e2}}.progress-warning[value]::-webkit-progress-value{background-color:#f90}.progress-warning[value]::-moz-progress-bar{background-color:#f90}.progress-warning[value]::-ms-fill{background-color:#f90}@media screen and (min-width:0\0){.progress-warning .progress-bar{background-color:#f90}}.progress-danger[value]::-webkit-progress-value{background-color:#d0021b}.progress-danger[value]::-moz-progress-bar{background-color:#d0021b}.progress-danger[value]::-ms-fill{background-color:#d0021b}@media screen and (min-width:0\0){.progress-danger .progress-bar{background-color:#d0021b}}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden}.media-body{width:10000px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right{padding-left:10px}.media-left{padding-right:10px}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:0}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:.25rem;border-top-left-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#818a91;cursor:not-allowed;background-color:#eceeef}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#818a91}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;text-decoration:none;background-color:#53206f;border-color:#53206f}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#bb80db}.list-group-flush .list-group-item{border-radius:0}.list-group-item-action{width:100%;color:#555;text-align:inherit}.list-group-item-action .list-group-item-heading{color:#333}.list-group-item-action:focus,.list-group-item-action:hover{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}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:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}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:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}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:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}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:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9{padding-bottom:42.857143%}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.embed-responsive-1by1{padding-bottom:100%}.close{float:right;font-size:1.40625rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0;-webkit-overflow-scrolling:touch}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out,-o-transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.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:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.in{opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header::after{content:"";display:table;clear:both}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.75}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer::after{content:"";display:table;clear:both}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:544px){.modal-dialog{max-width:600px;margin:30px auto}.modal-sm{max-width:300px}}@media (min-width:975px){.modal-lg{max-width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:Raleway,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.75;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.in{opacity:.9}.tooltip.bs-tether-element-attached-bottom,.tooltip.tooltip-top{padding:5px 0;margin-top:-3px}.tooltip.bs-tether-element-attached-bottom .tooltip-arrow,.tooltip.tooltip-top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.bs-tether-element-attached-left,.tooltip.tooltip-right{padding:0 5px;margin-left:3px}.tooltip.bs-tether-element-attached-left .tooltip-arrow,.tooltip.tooltip-right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.bs-tether-element-attached-top,.tooltip.tooltip-bottom{padding:5px 0;margin-top:3px}.tooltip.bs-tether-element-attached-top .tooltip-arrow,.tooltip.tooltip-bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bs-tether-element-attached-right,.tooltip.tooltip-left{padding:0 5px;margin-left:-3px}.tooltip.bs-tether-element-attached-right .tooltip-arrow,.tooltip.tooltip-left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;padding:1px;font-family:Raleway,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.75;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;font-size:.875rem;word-wrap:break-word;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover.bs-tether-element-attached-bottom,.popover.popover-top{margin-top:-10px}.popover.bs-tether-element-attached-bottom .popover-arrow,.popover.popover-top .popover-arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.bs-tether-element-attached-bottom .popover-arrow::after,.popover.popover-top .popover-arrow::after{bottom:1px;margin-left:-10px;content:"";border-top-color:#fff;border-bottom-width:0}.popover.bs-tether-element-attached-left,.popover.popover-right{margin-left:10px}.popover.bs-tether-element-attached-left .popover-arrow,.popover.popover-right .popover-arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.bs-tether-element-attached-left .popover-arrow::after,.popover.popover-right .popover-arrow::after{bottom:-10px;left:1px;content:"";border-right-color:#fff;border-left-width:0}.popover.bs-tether-element-attached-top,.popover.popover-bottom{margin-top:10px}.popover.bs-tether-element-attached-top .popover-arrow,.popover.popover-bottom .popover-arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-top .popover-arrow::after,.popover.popover-bottom .popover-arrow::after{top:1px;margin-left:-10px;content:"";border-top-width:0;border-bottom-color:#fff}.popover.bs-tether-element-attached-right,.popover.popover-left{margin-left:-10px}.popover.bs-tether-element-attached-right .popover-arrow,.popover.popover-left .popover-arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-right .popover-arrow::after,.popover.popover-left .popover-arrow::after{right:1px;bottom:-10px;content:"";border-right-width:0;border-left-color:#fff}.popover-title{padding:8px 14px;margin:0;font-size:.9375rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:.2375rem .2375rem 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{content:"";border-width:10px}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.carousel-item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.carousel-item>a>img,.carousel-inner>.carousel-item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.carousel-item{-webkit-transition:-webkit-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out,-o-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.carousel-item.active.right,.carousel-inner>.carousel-item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.carousel-item.active.left,.carousel-inner>.carousel-item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.carousel-item.active,.carousel-inner>.carousel-item.next.left,.carousel-inner>.carousel-item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,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;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);opacity:.5}.carousel-control.left{background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;width:20px;height:20px;margin-top:-10px;font-family:serif;line-height:1}.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .icon-next{right:50%;margin-right:-10px}.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%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:transparent;border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media (min-width:544px){.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .icon-prev{margin-left:-15px}.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.bg-inverse{color:#eceeef;background-color:#373a3c}.bg-faded{background-color:#f7f7f9}.bg-primary-gradient{background-image:-webkit-linear-gradient(315deg,#000 0,#040007 7%,#180d1f 40%,#24132f 53%,#361648 67%,#3c174f 75%,#48195d 86%,#53206f 98%,#53206f 100%);background-image:-o-linear-gradient(315deg,#000 0,#040007 7%,#180d1f 40%,#24132f 53%,#361648 67%,#3c174f 75%,#48195d 86%,#53206f 98%,#53206f 100%);background-image:linear-gradient(135deg,#000 0,#040007 7%,#180d1f 40%,#24132f 53%,#361648 67%,#3c174f 75%,#48195d 86%,#53206f 98%,#53206f 100%);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FF000000', endColorstr='#FF000000', GradientType=1)}.bg-primary{color:#fff!important;background-color:#53206f!important}a.bg-primary:focus,a.bg-primary:hover{background-color:#351547!important}.bg-success{color:#fff!important;background-color:#1db954!important}a.bg-success:focus,a.bg-success:hover{background-color:#168d40!important}.bg-info{color:#fff!important;background-color:#4a90e2!important}a.bg-info:focus,a.bg-info:hover{background-color:#2275d7!important}.bg-warning{color:#fff!important;background-color:#f90!important}a.bg-warning:focus,a.bg-warning:hover{background-color:#cc7a00!important}.bg-danger{color:#fff!important;background-color:#d0021b!important}a.bg-danger:focus,a.bg-danger:hover{background-color:#9d0214!important}.clearfix::after{content:"";display:table;clear:both}.pull-xs-left{float:left!important}.pull-xs-right{float:right!important}.pull-xs-none{float:none!important}@media (min-width:544px){.pull-sm-left{float:left!important}.pull-sm-right{float:right!important}.pull-sm-none{float:none!important}}@media (min-width:768px){.pull-md-left{float:left!important}.pull-md-right{float:right!important}.pull-md-none{float:none!important}}@media (min-width:975px){.pull-lg-left{float:left!important}.pull-lg-right{float:right!important}.pull-lg-none{float:none!important}}@media (min-width:1200px){.pull-xl-left{float:left!important}.pull-xl-right{float:right!important}.pull-xl-none{float:none!important}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;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}.m-x-auto{margin-right:auto!important;margin-left:auto!important}.m-a-0{margin:0 0!important}.m-t-0{margin-top:0!important}.m-r-0{margin-right:0!important}.m-b-0{margin-bottom:0!important}.m-l-0{margin-left:0!important}.m-x-0{margin-right:0!important;margin-left:0!important}.m-y-0{margin-top:0!important;margin-bottom:0!important}.m-a-1{margin:1rem 1rem!important}.m-t-1{margin-top:1rem!important}.m-r-1{margin-right:1rem!important}.m-b-1{margin-bottom:1rem!important}.m-l-1{margin-left:1rem!important}.m-x-1{margin-right:1rem!important;margin-left:1rem!important}.m-y-1{margin-top:1rem!important;margin-bottom:1rem!important}.m-a-2{margin:1.5rem 1.5rem!important}.m-t-2{margin-top:1.5rem!important}.m-r-2{margin-right:1.5rem!important}.m-b-2{margin-bottom:1.5rem!important}.m-l-2{margin-left:1.5rem!important}.m-x-2{margin-right:1.5rem!important;margin-left:1.5rem!important}.m-y-2{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-a-3{margin:3rem 3rem!important}.m-t-3{margin-top:3rem!important}.m-r-3{margin-right:3rem!important}.m-b-3{margin-bottom:3rem!important}.m-l-3{margin-left:3rem!important}.m-x-3{margin-right:3rem!important;margin-left:3rem!important}.m-y-3{margin-top:3rem!important;margin-bottom:3rem!important}.m-a-4{margin:4rem 4rem!important}.m-t-4{margin-top:4rem!important}.m-r-4{margin-right:4rem!important}.m-b-4{margin-bottom:4rem!important}.m-l-4{margin-left:4rem!important}.m-x-4{margin-right:4rem!important;margin-left:4rem!important}.m-y-4{margin-top:4rem!important;margin-bottom:4rem!important}.m-a-5{margin:5rem 5rem!important}.m-t-5{margin-top:5rem!important}.m-r-5{margin-right:5rem!important}.m-b-5{margin-bottom:5rem!important}.m-l-5{margin-left:5rem!important}.m-x-5{margin-right:5rem!important;margin-left:5rem!important}.m-y-5{margin-top:5rem!important;margin-bottom:5rem!important}.p-a-0{padding:0 0!important}.p-t-0{padding-top:0!important}.p-r-0{padding-right:0!important}.p-b-0{padding-bottom:0!important}.p-l-0{padding-left:0!important}.p-x-0{padding-right:0!important;padding-left:0!important}.p-y-0{padding-top:0!important;padding-bottom:0!important}.p-a-1{padding:1rem 1rem!important}.p-t-1{padding-top:1rem!important}.p-r-1{padding-right:1rem!important}.p-b-1{padding-bottom:1rem!important}.p-l-1{padding-left:1rem!important}.p-x-1{padding-right:1rem!important;padding-left:1rem!important}.p-y-1{padding-top:1rem!important;padding-bottom:1rem!important}.p-a-2{padding:1.5rem 1.5rem!important}.p-t-2{padding-top:1.5rem!important}.p-r-2{padding-right:1.5rem!important}.p-b-2{padding-bottom:1.5rem!important}.p-l-2{padding-left:1.5rem!important}.p-x-2{padding-right:1.5rem!important;padding-left:1.5rem!important}.p-y-2{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-a-3{padding:3rem 3rem!important}.p-t-3{padding-top:3rem!important}.p-r-3{padding-right:3rem!important}.p-b-3{padding-bottom:3rem!important}.p-l-3{padding-left:3rem!important}.p-x-3{padding-right:3rem!important;padding-left:3rem!important}.p-y-3{padding-top:3rem!important;padding-bottom:3rem!important}.p-a-4{padding:4rem 4rem!important}.p-t-4{padding-top:4rem!important}.p-r-4{padding-right:4rem!important}.p-b-4{padding-bottom:4rem!important}.p-l-4{padding-left:4rem!important}.p-x-4{padding-right:4rem!important;padding-left:4rem!important}.p-y-4{padding-top:4rem!important;padding-bottom:4rem!important}.p-a-5{padding:5rem 5rem!important}.p-t-5{padding-top:5rem!important}.p-r-5{padding-right:5rem!important}.p-b-5{padding-bottom:5rem!important}.p-l-5{padding-left:5rem!important}.p-x-5{padding-right:5rem!important;padding-left:5rem!important}.p-y-5{padding-top:5rem!important;padding-bottom:5rem!important}.pos-f-t{position:fixed;top:0;right:0;left:0;z-index:1030}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-xs-left{text-align:left!important}.text-xs-right{text-align:right!important}.text-xs-center{text-align:center!important}@media (min-width:544px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:975px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-normal{font-weight:400}.font-weight-bold{font-weight:700}.font-italic{font-style:italic}.text-muted{color:#818a91!important}a.text-muted:focus,a.text-muted:hover{color:#687077}.text-primary{color:#53206f!important}a.text-primary:focus,a.text-primary:hover{color:#351547}.text-success{color:#1db954!important}a.text-success:focus,a.text-success:hover{color:#168d40}.text-info{color:#4a90e2!important}a.text-info:focus,a.text-info:hover{color:#2275d7}.text-warning{color:#f90!important}a.text-warning:focus,a.text-warning:hover{color:#cc7a00}.text-danger{color:#d0021b!important}a.text-danger:focus,a.text-danger:hover{color:#9d0214}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.invisible{visibility:hidden!important}.hidden-xs-up{display:none!important}@media (max-width:543px){.hidden-xs-down{display:none!important}}@media (min-width:544px){.hidden-sm-up{display:none!important}}@media (max-width:767px){.hidden-sm-down{display:none!important}}@media (min-width:768px){.hidden-md-up{display:none!important}}@media (max-width:974px){.hidden-md-down{display:none!important}}@media (min-width:975px){.hidden-lg-up{display:none!important}}@media (max-width:1199px){.hidden-lg-down{display:none!important}}@media (min-width:1200px){.hidden-xl-up{display:none!important}}.hidden-xl-down{display:none!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}}.h1.type-inverse,.h2.type-inverse,.h3.type-inverse,.h4.type-inverse,.h5.type-inverse,.h6.type-inverse,h1.type-inverse,h2.type-inverse,h3.type-inverse,h4.type-inverse,h5.type-inverse,h6.type-inverse{margin-bottom:2rem;font-family:inherit;font-weight:300;line-height:1.35;color:#fff}.lead-out{font-size:.875rem;font-weight:500;color:#fff;margin-bottom:2rem}a,a:focus{outline:0}.form-control{display:block;width:100%;padding:.5rem .75rem;font-size:.9375rem;line-height:1.75;color:#55595c;background-color:#fff;background-image:none;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;-webkit-transition:all .15s ease-in-out;-o-transition:all .15s ease-in-out;transition:all .15s ease-in-out}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{border-color:#66afe9;outline:0;background-color:#fafafa;color:#55595c;-webkit-transition:all .15s ease-in-out;-o-transition:all .15s ease-in-out;transition:all .15s ease-in-out}.form-control:focus::-webkit-input-placeholder{opacity:0;-webkit-transition:all ease-in-out .15s;-o-transition:all ease-in-out .15s;transition:all ease-in-out .15s}.form-control::-webkit-input-placeholder{color:#999;text-transform:uppercase;font-size:.75rem;padding:.25rem 0 0 0;opacity:1}.form-control::-moz-placeholder{color:#999;text-transform:uppercase;font-size:.75rem;padding:.25rem 0 0 0;opacity:1}.form-control:-ms-input-placeholder{color:#999;text-transform:uppercase;font-size:.75rem;padding:.25rem 0 0 0;opacity:1}.form-control::placeholder{color:#999;text-transform:uppercase;font-size:.75rem;padding:.25rem 0 0 0;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#eceeef;opacity:1}.form-control:disabled{cursor:not-allowed}fieldset.form-group>label{color:#949494;font-size:.75rem;text-transform:uppercase}label{font-size:.75rem;text-transform:uppercase}.checkbox-radio-label-fix{padding-top:.25rem}.checkbox label,.radio label{font-size:.9375rem;text-transform:capitalize}.form-control-label{padding:.75rem 1rem;margin-bottom:0;font-size:.75rem;font-weight:400;text-transform:uppercase;height:42px}.form-inverse-control{display:block;width:100%;padding:.5rem .75rem;font-size:.9375rem;line-height:1.75;font-weight:300;color:#fff;background-color:#2a2d31;background-image:none;border:1px solid #2a2d31;border-radius:.25rem;-webkit-transition:all .15s ease-in-out;-o-transition:all .15s ease-in-out;transition:all .15s ease-in-out}.form-inverse-control::-ms-expand{background-color:transparent;border:0}.form-inverse-control:focus{border-color:#41474d;outline:0;background-color:#393e44;font-weight:300;color:#fff;-webkit-transition:all .15s ease-in-out;-o-transition:all .15s ease-in-out;transition:all .15s ease-in-out}.form-inverse-control:focus::-webkit-input-placeholder{opacity:0;-webkit-transition:all ease-in-out .15s;-o-transition:all ease-in-out .15s;transition:all ease-in-out .15s}.form-inverse-control::-webkit-input-placeholder{color:#494f56;text-transform:uppercase;font-size:.75rem;font-weight:400;padding:.25rem 0 0 0;opacity:1}.form-inverse-control::-moz-placeholder{color:#494f56;text-transform:uppercase;font-size:.75rem;font-weight:400;padding:.25rem 0 0 0;opacity:1}.form-inverse-control:-ms-input-placeholder{color:#494f56;text-transform:uppercase;font-size:.75rem;font-weight:400;padding:.25rem 0 0 0;opacity:1}.form-inverse-control::placeholder{color:#494f56;text-transform:uppercase;font-size:.75rem;font-weight:400;padding:.25rem 0 0 0;opacity:1}.form-inverse-control:disabled,.form-inverse-control[readonly]{background-color:#eceeef;opacity:1}.form-inverse-control:disabled{cursor:not-allowed}fieldset.form-group.form-inverse>label{color:#494f56}.checkbox-radio-label-inverse-fix{padding-top:.25rem;color:#494f56}.form-inverse-control-label{color:#494f56;text-align:right;padding-right:1.5rem}.text-muted-inverse{color:#494f56}.custom-select{display:inline-block;max-width:100%;padding:.375rem 1.75rem .375rem .75rem;padding-right:.75rem\9;color:#55595c;vertical-align:middle;background:#fff url(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") ) no-repeat right .75rem center;background-image:none\9;-webkit-background-size:8px 10px;background-size:8px 10px;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;-moz-appearance:none;-webkit-appearance:none;-webkit-transition:all .15s ease-in-out;-o-transition:all .15s ease-in-out;transition:all .15s ease-in-out}.custom-select:focus,.custom-select:hover{border-color:#66afe9;background-color:#fafafa;color:#2e2e2e;outline:0;-webkit-transition:all .15s ease-in-out;-o-transition:all .15s ease-in-out;transition:all .15s ease-in-out}.custom-select::-ms-expand{opacity:0}.custom-file{text-transform:capitalize!important;font-size:.9375rem!important;position:relative;display:inline-block;max-width:100%;height:2.5rem;cursor:pointer}.custom-file-input{min-width:14rem;max-width:100%;margin:0;filter:alpha(opacity=0);opacity:0}.custom-file-control{position:absolute;top:0;right:0;left:0;z-index:5;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#555;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;border:1px solid #ddd;border-radius:.25rem;-webkit-transition:all .15s ease-in-out;-o-transition:all .15s ease-in-out;transition:all .15s ease-in-out}.custom-file-control:lang(en)::after{content:"Choose file..."}.custom-file-control::before{position:absolute;top:-1px;right:-1px;bottom:-1px;z-index:6;display:block;height:2.5rem;padding:.75rem 2.5rem .75rem 2.5rem;text-transform:uppercase;font-size:.6875rem;letter-spacing:1px;line-height:1.5;color:#555;background-color:#eee;border:1px solid #ddd;border-radius:0 .25rem .25rem 0}.custom-file-control:hover::before{color:#fff;background-color:#351547;border-color:#351547}.custom-file-control:focus,.custom-file-control:hover{border-color:#66afe9;background-color:#fafafa;color:#2e2e2e;outline:0}.custom-file-control:lang(en)::before{content:"Browse"}.custom-control-inverse{color:#fff;font-weight:300;position:relative;display:inline;padding-left:1.5rem}.custom-control-inverse+.custom-control{margin-left:1rem}.custom-control-inverse-input{position:absolute;z-index:-1;opacity:0}.custom-control-inverse-input:checked~.custom-control-inverse-indicator{color:#fff;background-color:#0074d9}.custom-control-inverse-input:focus~.custom-control-inverse-indicator{-webkit-box-shadow:0 0 0 .075rem #fff,0 0 0 .2rem #0074d9;box-shadow:0 0 0 .075rem #fff,0 0 0 .2rem #0074d9}.custom-control-inverse-input:active~.custom-control-inverse-indicator{color:#fff;background-color:#84c6ff}.custom-control-inverse-input:disabled~.custom-control-inverse-indicator{cursor:not-allowed;background-color:#32363a}.custom-control-inverse-input:disabled~.custom-control-inverse-description{color:#41474d;cursor:not-allowed;font-weight:400}.custom-control-inverse-indicator{position:absolute;top:.0625rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#41474d;background-repeat:no-repeat;background-position:center center;-webkit-background-size:50% 50%;background-size:50% 50%}.custom-checkbox-inverse .custom-control-inverse-indicator{border-radius:.25rem}.custom-checkbox-inverse .custom-control-inverse-input:checked~.custom-control-inverse-indicator{background-image:url(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E") )}.custom-checkbox-inverse .custom-control-inverse-input:indeterminate~.custom-control-inverse-indicator{background-color:#0074d9;background-image:url(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E") )}.custom-radio-inverse .custom-control-inverse-indicator{border-radius:50%}.custom-radio-inverse .custom-control-inverse-input:checked~.custom-control-inverse-indicator{background-image:url(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E") )}.custom-select-inverse{display:inline-block;max-width:100%;padding:.375rem 1.75rem .375rem .75rem;padding-right:.75rem\9;color:#fff;font-weight:300;vertical-align:middle;background:#32363a url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAUAgMAAAD5DFXkAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjFBRTNFMDNDNzcwMTFFNUIwNUM5M0IwMzhENTZERkQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjFBRTNFMDRDNzcwMTFFNUIwNUM5M0IwMzhENTZERkQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyMUFFM0UwMUM3NzAxMUU1QjA1QzkzQjAzOEQ1NkRGRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyMUFFM0UwMkM3NzAxMUU1QjA1QzkzQjAzOEQ1NkRGRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Plbf/wsAAAAMUExURQAAAGZmZmZmZszMzF/IoNMAAAADdFJOUwB/gL9pIscAAABFSURBVAgdBcExAYAgAATAw4XBEEawAs2kGRWMYAgHFnnvKA31xvHi+ihJU5Pbkbyu5AMAACNZzmTak8eWdMbCObE/2LofCTof4TvEpdkAAAAASUVORK5CYII=) no-repeat right .75rem center;background-image:none\9;-webkit-background-size:8px 10px;background-size:8px 10px;border:1px solid #32363a;border-radius:.25rem;-moz-appearance:none;-webkit-appearance:none;-webkit-transition:all .15s ease-in-out;-o-transition:all .15s ease-in-out;transition:all .15s ease-in-out}.custom-select-inverse:focus,.custom-select-inverse:hover{border-color:#41474d;background-color:#393e44;color:#fff;font-weight:300;outline:0;-webkit-transition:all .15s ease-in-out;-o-transition:all .15s ease-in-out;transition:all .15s ease-in-out}.custom-select-inverse::-ms-expand{opacity:0}.custom-file-control{position:absolute;top:0;right:0;left:0;z-index:5;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#fff;font-weight:300;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#32363a;border:1px solid #32363a;border-radius:.25rem;-webkit-transition:all .15s ease-in-out;-o-transition:all .15s ease-in-out;transition:all .15s ease-in-out}.custom-file-control:lang(en)::after{content:"Choose file..."}.custom-file-control::before{position:absolute;top:-1px;right:-1px;bottom:-1px;z-index:6;display:block;height:2.5rem;padding:.75rem 2.5rem .75rem 2.5rem;text-transform:uppercase;font-size:.6875rem;letter-spacing:1px;line-height:1.5;color:#555;background-color:#eee;border:1px solid #ddd;border-radius:0 .25rem .25rem 0}.custom-file-control:hover::before{color:#fff;background-color:#351547;border-color:#351547}.custom-file-control:focus,.custom-file-control:hover{border-color:#41474d;background-color:#393e44;color:#fff;font-weight:300;outline:0}.custom-file-control:lang(en)::before{content:"Browse"}a.list-group-item,button.list-group-item{width:100%;color:#555;text-align:inherit;text-transform:lowercase}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#818a91;cursor:not-allowed;background-color:#eceeef}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#818a91}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#53206f;background-repeat:no-repeat;background-position:center left;-webkit-background-size:.65625rem .65625rem;background-size:.65625rem .65625rem;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyB3aWR0aD0iNnB4IiBoZWlnaHQ9IjhweCIgdmlld0JveD0iMCAwIDYgOCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpza2V0Y2g9Imh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9ucyI+ICAgICAgICA8dGl0bGU+aWNvbi1hcnJvdzwvdGl0bGU+ICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPiAgICA8ZGVmcz48L2RlZnM+ICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHNrZXRjaDp0eXBlPSJNU1BhZ2UiPiAgICAgICAgPGcgaWQ9ImJyb3dzZXItbGlnaHQtY2FyZHMiIHNrZXRjaDp0eXBlPSJNU0FydGJvYXJkR3JvdXAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zNjMuMDAwMDAwLCAtNDIyLjAwMDAwMCkiIHN0cm9rZT0iIzIyNzVENyI+ICAgICAgICAgICAgPGcgaWQ9IkRlcG9zaXRQYWdlLmpzIiBza2V0Y2g6dHlwZT0iTVNMYXllckdyb3VwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMzUuMDAwMDAwLCAxMDUuMDAwMDAwKSI+ICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0yOSwzMTcgTDMzLDMyMSBMMjksMzI1IiBpZD0iaWNvbi1hcnJvdyIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPiAgICAgICAgICAgIDwvZz4gICAgICAgIDwvZz4gICAgPC9nPjwvc3ZnPg==);border-color:#53206f}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#bb80db}
6 | /*# sourceMappingURL=bootstrap.min.css.map */
--------------------------------------------------------------------------------