From 7ec1e6ce53a31b3621009fb5e5f9ecfe98adc7d0 Mon Sep 17 00:00:00 2001 From: M9713 <m9713@student.jamk.fi> Date: Mon, 17 Jan 2022 20:48:18 +0200 Subject: [PATCH] Update to TE-version --- conduit-backend/.dockerignore | 8 +- conduit-backend/.gitignore | 4 + .../.gitlab-ci.yml | 0 conduit-backend/Dockerfile | 13 +- conduit-backend/app.js | 2 +- conduit-backend/models/User.js | 6 +- .../package-lock.json | 0 conduit-backend/package.json | 4 +- conduit-backend/routes/api/articles.js | 1 + conduit-backend/routes/api/users.js | 16 + conduit-front/.dockerignore | 5 +- conduit-front/.gitignore | 4 + {te-frontend => conduit-front}/.gitlab-ci.yml | 0 conduit-front/Dockerfile | 17 +- conduit-front/README.md | 2 +- .../package-lock.json | 0 conduit-front/package.json | 26 +- conduit-front/public/favicon.ico | Bin 15406 -> 24838 bytes conduit-front/public/index.html | 55 +- .../public/logo_wimma.png | Bin conduit-front/public/main.css | 2 +- .../public/word.json | 0 conduit-front/src/agent.js | 15 +- .../src/components/App.css | 0 conduit-front/src/components/App.js | 10 +- .../src/components/Article/ArticleActions.js | 25 +- .../src/components/Article/ArticleMeta.js | 17 +- .../src/components/Article/Comment.js | 4 +- .../src/components/Article/CommentInput.js | 21 +- .../src/components/Article/DeleteButton.js | 21 +- conduit-front/src/components/Article/index.js | 5 +- .../src/components/ArticlePreview.js | 31 +- .../src/components/Badwords.js | 0 .../Documents/Tietosuojaseloste.pdf | Bin conduit-front/src/components/Editor.js | 71 +- conduit-front/src/components/Header.js | 41 +- conduit-front/src/components/Home/Banner.js | 13 +- conduit-front/src/components/Home/MainView.js | 2 +- conduit-front/src/components/Home/index.js | 17 +- conduit-front/src/components/Login.js | 18 +- conduit-front/src/components/Profile.js | 64 +- conduit-front/src/components/Register.js | 81 +- conduit-front/src/components/Settings.js | 97 +- .../src/components/edit.js | 0 .../images/christmas-hat-png-19616.png | Bin .../src/components/images/home-hero.png | Bin .../components/images/logo-light_round.png | Bin .../src/components/images/logo-sm-light.png | Bin .../src/components/images/logo-sm.svg | 0 .../src/components/images/logo_wimma.png | Bin .../src/components/images/logo_wimma2.png | Bin .../src/components/images/smiley-cyrus.jpg | Bin conduit-front/src/constants/actionTypes.js | 3 +- conduit-front/src/middleware.js | 5 +- conduit-front/src/reducers/common.js | 6 +- te-backend/.circleci/config.yml | 20 - te-backend/.dockerignore | 8 - te-backend/.gitignore | 41 - te-backend/.travis.yml | 10 - te-backend/Dockerfile | 18 - te-backend/README.md | 52 - te-backend/app.js | 84 - te-backend/config/index.js | 3 - te-backend/config/passport.js | 18 - te-backend/models/Article.js | 56 - te-backend/models/Comment.js | 19 - te-backend/models/User.js | 99 - te-backend/package.json | 43 - te-backend/project-logo.png | Bin 53176 -> 0 bytes te-backend/public/.keep | 0 te-backend/routes/api/articles.js | 280 --- te-backend/routes/api/index.js | 22 - te-backend/routes/api/profiles.js | 53 - te-backend/routes/api/tags.js | 12 - te-backend/routes/api/users.js | 91 - te-backend/routes/auth.js | 27 - te-backend/routes/index.js | 5 - te-backend/te-backend-deployment.yaml | 33 - te-backend/te-backend-service.yaml | 13 - te-backend/tests/api-tests.postman.json | 1900 ----------------- te-backend/tests/env-api-tests.postman.json | 14 - te-frontend/.dockerignore | 5 - te-frontend/.gitignore | 20 - te-frontend/Dockerfile | 15 - te-frontend/README.md | 74 - te-frontend/package.json | 51 - te-frontend/project-logo.png | Bin 72206 -> 0 bytes te-frontend/public/favicon.ico | Bin 24838 -> 0 bytes te-frontend/public/index.html | 83 - te-frontend/public/main.css | 3 - te-frontend/src/agent.js | 99 - te-frontend/src/components/App.js | 90 - .../src/components/Article/ArticleActions.js | 62 - .../src/components/Article/ArticleMeta.js | 34 - te-frontend/src/components/Article/Comment.js | 35 - .../components/Article/CommentContainer.js | 40 - .../src/components/Article/CommentInput.js | 71 - .../src/components/Article/CommentList.js | 22 - .../src/components/Article/DeleteButton.js | 46 - te-frontend/src/components/Article/index.js | 98 - te-frontend/src/components/ArticleList.js | 38 - te-frontend/src/components/ArticlePreview.js | 90 - te-frontend/src/components/Editor.js | 223 -- te-frontend/src/components/Header.js | 94 - te-frontend/src/components/Home/Banner.js | 22 - te-frontend/src/components/Home/MainView.js | 96 - te-frontend/src/components/Home/Tags.js | 36 - te-frontend/src/components/Home/index.js | 77 - te-frontend/src/components/ListErrors.js | 26 - te-frontend/src/components/ListPagination.js | 58 - te-frontend/src/components/Login.js | 109 - te-frontend/src/components/Profile.js | 188 -- .../src/components/ProfileFavorites.js | 53 - te-frontend/src/components/Register.js | 164 -- te-frontend/src/components/Settings.js | 248 --- te-frontend/src/constants/actionTypes.js | 37 - te-frontend/src/index.js | 20 - te-frontend/src/middleware.js | 69 - te-frontend/src/reducer.js | 22 - te-frontend/src/reducers/article.js | 35 - te-frontend/src/reducers/articleList.js | 86 - te-frontend/src/reducers/auth.js | 34 - te-frontend/src/reducers/common.js | 72 - te-frontend/src/reducers/editor.js | 54 - te-frontend/src/reducers/home.js | 15 - te-frontend/src/reducers/profile.js | 24 - te-frontend/src/reducers/settings.js | 25 - te-frontend/src/store.js | 25 - te-frontend/te-frontend-deployment.yaml | 33 - te-frontend/te-frontend-service.yaml | 13 - 130 files changed, 561 insertions(+), 6026 deletions(-) rename {te-backend => conduit-backend}/.gitlab-ci.yml (100%) rename {te-backend => conduit-backend}/package-lock.json (100%) rename {te-frontend => conduit-front}/.gitlab-ci.yml (100%) rename {te-frontend => conduit-front}/package-lock.json (100%) rename {te-frontend => conduit-front}/public/logo_wimma.png (100%) rename {te-frontend => conduit-front}/public/word.json (100%) rename {te-frontend => conduit-front}/src/components/App.css (100%) rename {te-frontend => conduit-front}/src/components/Badwords.js (100%) rename {te-frontend => conduit-front}/src/components/Documents/Tietosuojaseloste.pdf (100%) rename {te-frontend => conduit-front}/src/components/edit.js (100%) rename {te-frontend => conduit-front}/src/components/images/christmas-hat-png-19616.png (100%) rename {te-frontend => conduit-front}/src/components/images/home-hero.png (100%) rename {te-frontend => conduit-front}/src/components/images/logo-light_round.png (100%) rename {te-frontend => conduit-front}/src/components/images/logo-sm-light.png (100%) rename {te-frontend => conduit-front}/src/components/images/logo-sm.svg (100%) rename {te-frontend => conduit-front}/src/components/images/logo_wimma.png (100%) rename {te-frontend => conduit-front}/src/components/images/logo_wimma2.png (100%) rename {te-frontend => conduit-front}/src/components/images/smiley-cyrus.jpg (100%) delete mode 100644 te-backend/.circleci/config.yml delete mode 100644 te-backend/.dockerignore delete mode 100644 te-backend/.gitignore delete mode 100644 te-backend/.travis.yml delete mode 100644 te-backend/Dockerfile delete mode 100644 te-backend/README.md delete mode 100644 te-backend/app.js delete mode 100644 te-backend/config/index.js delete mode 100644 te-backend/config/passport.js delete mode 100644 te-backend/models/Article.js delete mode 100644 te-backend/models/Comment.js delete mode 100644 te-backend/models/User.js delete mode 100644 te-backend/package.json delete mode 100644 te-backend/project-logo.png delete mode 100644 te-backend/public/.keep delete mode 100644 te-backend/routes/api/articles.js delete mode 100644 te-backend/routes/api/index.js delete mode 100644 te-backend/routes/api/profiles.js delete mode 100644 te-backend/routes/api/tags.js delete mode 100644 te-backend/routes/api/users.js delete mode 100644 te-backend/routes/auth.js delete mode 100644 te-backend/routes/index.js delete mode 100644 te-backend/te-backend-deployment.yaml delete mode 100644 te-backend/te-backend-service.yaml delete mode 100644 te-backend/tests/api-tests.postman.json delete mode 100644 te-backend/tests/env-api-tests.postman.json delete mode 100644 te-frontend/.dockerignore delete mode 100644 te-frontend/.gitignore delete mode 100644 te-frontend/Dockerfile delete mode 100644 te-frontend/README.md delete mode 100644 te-frontend/package.json delete mode 100644 te-frontend/project-logo.png delete mode 100644 te-frontend/public/favicon.ico delete mode 100644 te-frontend/public/index.html delete mode 100644 te-frontend/public/main.css delete mode 100644 te-frontend/src/agent.js delete mode 100644 te-frontend/src/components/App.js delete mode 100644 te-frontend/src/components/Article/ArticleActions.js delete mode 100644 te-frontend/src/components/Article/ArticleMeta.js delete mode 100644 te-frontend/src/components/Article/Comment.js delete mode 100644 te-frontend/src/components/Article/CommentContainer.js delete mode 100644 te-frontend/src/components/Article/CommentInput.js delete mode 100644 te-frontend/src/components/Article/CommentList.js delete mode 100644 te-frontend/src/components/Article/DeleteButton.js delete mode 100644 te-frontend/src/components/Article/index.js delete mode 100644 te-frontend/src/components/ArticleList.js delete mode 100644 te-frontend/src/components/ArticlePreview.js delete mode 100644 te-frontend/src/components/Editor.js delete mode 100644 te-frontend/src/components/Header.js delete mode 100644 te-frontend/src/components/Home/Banner.js delete mode 100644 te-frontend/src/components/Home/MainView.js delete mode 100644 te-frontend/src/components/Home/Tags.js delete mode 100644 te-frontend/src/components/Home/index.js delete mode 100644 te-frontend/src/components/ListErrors.js delete mode 100644 te-frontend/src/components/ListPagination.js delete mode 100644 te-frontend/src/components/Login.js delete mode 100644 te-frontend/src/components/Profile.js delete mode 100644 te-frontend/src/components/ProfileFavorites.js delete mode 100644 te-frontend/src/components/Register.js delete mode 100644 te-frontend/src/components/Settings.js delete mode 100644 te-frontend/src/constants/actionTypes.js delete mode 100644 te-frontend/src/index.js delete mode 100644 te-frontend/src/middleware.js delete mode 100644 te-frontend/src/reducer.js delete mode 100644 te-frontend/src/reducers/article.js delete mode 100644 te-frontend/src/reducers/articleList.js delete mode 100644 te-frontend/src/reducers/auth.js delete mode 100644 te-frontend/src/reducers/common.js delete mode 100644 te-frontend/src/reducers/editor.js delete mode 100644 te-frontend/src/reducers/home.js delete mode 100644 te-frontend/src/reducers/profile.js delete mode 100644 te-frontend/src/reducers/settings.js delete mode 100644 te-frontend/src/store.js delete mode 100644 te-frontend/te-frontend-deployment.yaml delete mode 100644 te-frontend/te-frontend-service.yaml diff --git a/conduit-backend/.dockerignore b/conduit-backend/.dockerignore index 93f1361..64b56b0 100644 --- a/conduit-backend/.dockerignore +++ b/conduit-backend/.dockerignore @@ -1,2 +1,8 @@ +.git +.gitignore +.gitlab-ci.yml +README.md node_modules -npm-debug.log +project-logo.png +back-up-system + diff --git a/conduit-backend/.gitignore b/conduit-backend/.gitignore index a812403..9adbb84 100644 --- a/conduit-backend/.gitignore +++ b/conduit-backend/.gitignore @@ -35,3 +35,7 @@ node_modules .node_repl_history .idea + +# used only in local development +Dockerfile-dev +docker-compose-dev.yml diff --git a/te-backend/.gitlab-ci.yml b/conduit-backend/.gitlab-ci.yml similarity index 100% rename from te-backend/.gitlab-ci.yml rename to conduit-backend/.gitlab-ci.yml diff --git a/conduit-backend/Dockerfile b/conduit-backend/Dockerfile index 10f4416..5dc91e5 100644 --- a/conduit-backend/Dockerfile +++ b/conduit-backend/Dockerfile @@ -1,13 +1,18 @@ -# Node/express -FROM node:14 +# Choose base image (maybe use node 14 with fewer warnings??) (changed from node:16-alpine) +FROM node:16 +# Create app directory WORKDIR /usr/src/app +# Install app dependencies COPY package*.json ./ - RUN npm install +# Bundle app source COPY . . +# Expose port EXPOSE 3000 -CMD [ "npm", "start" ] + +# Run app with node.js +CMD [ "node", "app.js" ] diff --git a/conduit-backend/app.js b/conduit-backend/app.js index 7435933..460baa4 100644 --- a/conduit-backend/app.js +++ b/conduit-backend/app.js @@ -33,7 +33,7 @@ if (!isProduction) { if(isProduction){ mongoose.connect(process.env.MONGODB_URI); } else { - mongoose.connect('mongodb://10.152.183.200/conduit'); + mongoose.connect('mongodb://localhost/conduit'); mongoose.set('debug', true); } diff --git a/conduit-backend/models/User.js b/conduit-backend/models/User.js index 482613b..acb2bcf 100644 --- a/conduit-backend/models/User.js +++ b/conduit-backend/models/User.js @@ -5,8 +5,8 @@ var jwt = require('jsonwebtoken'); var secret = require('../config').secret; var UserSchema = new mongoose.Schema({ - username: {type: String, lowercase: true, unique: true, required: [true, "can't be blank"], match: [/^[a-zA-Z0-9]+$/, 'is invalid'], index: true}, - email: {type: String, lowercase: true, unique: true, required: [true, "can't be blank"], match: [/\S+@\S+\.\S+/, 'is invalid'], index: true}, + username: {type: String, unique: true, uniqueCaseInsensitive: true, required: [true, "can't be blank"], match: [/^[a-zA-Z0-9]+$/, 'is invalid'], index: true}, + email: {type: String, unique: true, uniqueCaseInsensitive: true, required: [true, "can't be blank"], match: [/\S+@\S+\.\S+/, 'is invalid'], index: true}, bio: String, image: String, favorites: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Article' }], @@ -45,7 +45,7 @@ UserSchema.methods.toAuthJSON = function(){ email: this.email, token: this.generateJWT(), bio: this.bio, - image: this.image + image: this.image || 'https://static.productionready.io/images/smiley-cyrus.jpg' }; }; diff --git a/te-backend/package-lock.json b/conduit-backend/package-lock.json similarity index 100% rename from te-backend/package-lock.json rename to conduit-backend/package-lock.json diff --git a/conduit-backend/package.json b/conduit-backend/package.json index 8facb2e..0b71f5b 100644 --- a/conduit-backend/package.json +++ b/conduit-backend/package.json @@ -1,6 +1,6 @@ { "name": "conduit-node", - "version": "1.0.0", + "version": "2.0.0", "description": "conduit on node", "main": "app.js", "scripts": { @@ -27,7 +27,7 @@ "jsonwebtoken": "7.1.9", "method-override": "2.3.5", "methods": "1.1.2", - "mongoose": "4.6.4", + "mongoose": "^4.6.4", "mongoose-unique-validator": "1.0.2", "morgan": "1.7.0", "passport": "0.3.2", diff --git a/conduit-backend/routes/api/articles.js b/conduit-backend/routes/api/articles.js index e0f1074..a8ffe73 100644 --- a/conduit-backend/routes/api/articles.js +++ b/conduit-backend/routes/api/articles.js @@ -104,6 +104,7 @@ router.get('/feed', auth.required, function(req, res, next) { Promise.all([ Article.find({ author: {$in: user.following}}) .limit(Number(limit)) + .sort({createdAt: 'desc'}) .skip(Number(offset)) .populate('author') .exec(), diff --git a/conduit-backend/routes/api/users.js b/conduit-backend/routes/api/users.js index cc2e444..2fc1547 100644 --- a/conduit-backend/routes/api/users.js +++ b/conduit-backend/routes/api/users.js @@ -1,6 +1,8 @@ var mongoose = require('mongoose'); var router = require('express').Router(); var passport = require('passport'); +var Article = mongoose.model('Article'); +var Comment = mongoose.model('Comment'); var User = mongoose.model('User'); var auth = require('../auth'); @@ -72,4 +74,18 @@ router.post('/users', function(req, res, next){ }).catch(next); }); +router.delete('/user', auth.required, function(req, res, next){ + //console.log('TESTI', req); // prints to backend container log + User.findByIdAndRemove(req.payload.id).then(function(user){ + if(!user){ return res.sendStatus(401); } + + Promise.all([ + Article.find({ author: user._id }).remove(), + Comment.find({ author: user._id }).remove() + ]).then(function(){ + return res.sendStatus(204); + }).catch(next); + }); +}); + module.exports = router; diff --git a/conduit-front/.dockerignore b/conduit-front/.dockerignore index 93f1361..009becc 100644 --- a/conduit-front/.dockerignore +++ b/conduit-front/.dockerignore @@ -1,2 +1,5 @@ +.gitignore +.gitlab-ci.yml +README.md node_modules -npm-debug.log +project-logo.png diff --git a/conduit-front/.gitignore b/conduit-front/.gitignore index d09ce83..22b3f47 100644 --- a/conduit-front/.gitignore +++ b/conduit-front/.gitignore @@ -14,3 +14,7 @@ build .env npm-debug.log .idea + +# used only in local development +Dockerfile-dev +docker-compose-dev.yml diff --git a/te-frontend/.gitlab-ci.yml b/conduit-front/.gitlab-ci.yml similarity index 100% rename from te-frontend/.gitlab-ci.yml rename to conduit-front/.gitlab-ci.yml diff --git a/conduit-front/Dockerfile b/conduit-front/Dockerfile index 4b168c0..6d4d9e8 100644 --- a/conduit-front/Dockerfile +++ b/conduit-front/Dockerfile @@ -1,22 +1,15 @@ -#React/Redux +# Choose base image (maybe use node 14 for fewer warnings??) (changed from node:16) FROM node:14 -### -#FROM ubuntu:latest -### - +# Create app directory WORKDIR /usr/src/app +# Install app dependecies COPY package*.json ./ - RUN npm install -COPY . . +# Bundle app source +COPY . . EXPOSE 4100 - -### -#CMD apt update && apt install dnsutils -y && public_ip=$(dig +short myip.opendns.com @resolver1.opendns.com) && sed -i "s/localhost/$public_ip/g" -###src/agent.js && npm start - CMD [ "npm", "start" ] diff --git a/conduit-front/README.md b/conduit-front/README.md index 559f828..776ea0a 100644 --- a/conduit-front/README.md +++ b/conduit-front/README.md @@ -65,7 +65,7 @@ The example application is a social blogging site (i.e. a Medium.com clone) call - Render markdown from server client side - Comments section at bottom of page - Delete comment button (only shown to comment's author) -- Profile page (URL: /#/@username, /#/@username/favorites/lömps ) +- Profile page (URL: /#/@username, /#/@username/favorites ) - Show basic user info - List of articles populated from author's created articles or author's favorited articles diff --git a/te-frontend/package-lock.json b/conduit-front/package-lock.json similarity index 100% rename from te-frontend/package-lock.json rename to conduit-front/package-lock.json diff --git a/conduit-front/package.json b/conduit-front/package.json index 43b8136..8d7f2c4 100644 --- a/conduit-front/package.json +++ b/conduit-front/package.json @@ -1,12 +1,17 @@ { "name": "react-redux-realworld-example-app", - "version": "0.1.0", + "version": "2.0.0", "private": true, "devDependencies": { "cross-env": "^5.1.4", - "react-scripts": "0.9.5" + "react-scripts": "^4.0.3" }, "dependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@material-ui/core": "^4.12.3", + "@material-ui/icons": "^4.11.2", + "@mui/material": "^5.1.0", "history": "^4.6.3", "marked": "^0.3.6", "prop-types": "^15.5.10", @@ -16,18 +21,31 @@ "react-router": "^4.1.2", "react-router-dom": "^4.1.2", "react-router-redux": "^5.0.0-alpha.6", + "react-share": "^4.4.0", "redux": "^3.6.0", "redux-devtools-extension": "^2.13.2", "redux-logger": "^3.0.1", "superagent": "^3.8.2", "superagent-promise": "^1.1.0", - "isexe": "", - "which": "" + "sweetalert": "^2.1.2", + "sweetalert2": "^11.1.9" }, "scripts": { "start": "cross-env PORT=4100 react-scripts start", "build": "react-scripts build", "test": "cross-env PORT=4100 react-scripts test --env=jsdom", "eject": "react-scripts eject" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] } } diff --git a/conduit-front/public/favicon.ico b/conduit-front/public/favicon.ico index 768ef78d709e0d54cf1734cb3e975924661b63b9..5c125de5d897c1ff5692a656485b3216123dcd89 100644 GIT binary patch literal 24838 zcmeI4X^>UL6@VY56)S&I{`6Nu0RscWCdj@GJHx(%?6_-;yKy1n;EEf9f}pr1CW5HA zYt$%U#C=}?jWH&%G@BaHBxsWAoUb3}&6%Ei@4Ii_JRa1`RQ23*yU)_wJ$?H0>6gj0 z${d_I^w5kvTW3x<IFlKb$z%>YEc?FvyP3>p$!py@`@T`|dVepIsjbbvR}af%KKy<r zQ!O-7BpkB&^2i9=CVy?(v>7YuQ%SDC^zmNWPYR^7avI5P-@dKev}UZ^aDAOyci9Nn zwR4qEz~tSvrp|#ACvWzo9`3B;`}^{t18dxaH;?xT7#hmJiKAaI;|O=$yxzXNOHGw~ z^!5pE^SW`av%t_$22LFPsM^l%=PSp!3r`>9w%s+^ZQYnnTQ*Ggd9-1~kj_o$YdW@b ztCkJ(ZGYjusqV5L4{^)R9Gt@gzU1t|?xhE&c^q(|(R#oa*}Sj5c({A$mhrB8*Y@tc zr)K#C{KOp-eHl35ZWJ1&zkmI>9DL%!KJE@_!<b=R+`r#n>=W?aH;i?ZDb0O1HPFy6 zcV0Kf)eZ0BHm<I7>z9vowF7EA{z*aue9M)iJP&Zd)qYlfJ-c^sS1qY^?>s)!!Ta@x zr@Lz|80r)7<{QVk9Z$}5SDaVtz*Rc?oH5~Wcjoc^eA&EdJ^h@aZ-BvL{K2s_7Cvfr zFL&(R?D&(9OxsS%z_BzI9^Ai^AOF$PUpGk~oO(=OpMc3@Zh&KH1a9>G%%0rC)t@oQ z4d~M`hX+g^Wf8P>A&&qjq|tZe*44Laq7qVPK#QIc)s*Qj34P`NL`Q{xBI`SnR!RC? zlGdTvC%oVZ@0BgcH>}qc!uzul@{i@sH}L0|=eZBJ9qF!HHaw?`s0(_DJj(v`(memI z6jH}=BfGlS<lCz5(9Y}G6-$SDeZe<M+V!hhjy&`*IN(B)R>lRV4)ouv#h*65yRR>G zo;I#~BVK&l&{+H=_~Nq$d%bFLh7GE5pS&>Fr{RMe>)MM19~z6F1oQo_y>vtlpEZF# zIc82TpMc3z9;{Q)=zG5B#4+96yHCvYy8p4;C%6x`%y$2HccC9|#vGVD)**C0xX|R| z%h)}ze!Tnrvvb@RZ!GX@2lMEq`=`08b`9$%FnN@*zJLo2wD5?MbE&LN)Z>Kty*;m= zt{Cn0>Q3nk)`<?XKA&^a0H1)#qYT{(E;6A-&$G^18FQ!hbgw)(&2_47Slh<SeEagv z1zwkfi$2$N30U*M0ay8T6dv$`r{-OD&Jed;=9s?oY}dAp`^ziy+~Qf;b^SNe-^w2t z9LoMGIN(}Zc-b}#mAUu+)3b7GF}TbX=E<)&P4Tq!pYjI=hcfyIT;)Gf)@XRC?V|at zU(AVHuNvjo6xRCr(|dYbL)R{7Nh*KKhDl<#^z?QC;{h#gi(3onyYo*T;9eA4gt}r! zVK4mgxjCK>bR^{dVf!3ECg6Yz4YcskI>$XH*L8E)MsudhnkP0B>+M(XEcErHUBKi~ z1`fEP&WPhp{@Ew?cPlR(ma9iw8NbJWHqp=btCtM*FnP*@ZwwlJ&-Y|LEjgvJzUtPc zz5CrWNBRV8d0-bpWAl<=zM1PU8lJ<auFSVLADiJ5u&qD1&?ND+W&L_}^tzZnT_kh- z*}JFsu|}tn7*p~nn>seDxBK^QuuCj2fg{&2#*IG5ezf1B(o%lU+OZx7So4D?yi2*h zFBkr5pG3AJs83uy!~C3mQZLp~ss7-N9oAY>t)!eC#s)CrPukK!(!G*)H?v(~JCoj# zfvgTxMV{4?zL1neQ;ITVBAdFDf`1yG$o{g7^1sR_n{RZ7tnXio?tM%240}(z9xFY0 zlz{^-G*RET;-`7`>e0b{{`!2kM)t7Si9ZqD$~wh*hyGC>z~qs@0T&u*;h}hiKGEga zHkJ;%7aNc^o_0(>Z{Gp06<d!oiwkYI9@z4HFzfO!R*h-IQ)!TmJxBu9eEVd72@jiB z2+SIP`!%B@>9H;TwPTUnvvX0SJ+kGGZ0lFBWocl>kaa)AoiMta+x_-J-?#KHFnJ*! zwD1V?)4s#|?O)DlMBhVv4IgZs?d>b<6%xK3<{o91H?-%8?PK!_fm#3d>{{gQ<X0b> z?*8`b{G6?bZKdO{_9IVlz{R$PcGjeL|3*|@upby()_Lf^eQ&XQe)CjsbJ3Uolrgt< zweld3GH|fZpn(=1@PencO_a_)v6tU?WV-w8wfXLbOGae<M=}TTxv_VkkFEV<X@MyN z2V7{Fd+b}_1y6V*Bc$V<eH8m0Xsn%ve~-Ncd(n@dpOe#l=sI|Q`r=&2J`x`2Kya=+ zzt+=O-yl5kg&`x#=ZBrln1yv?kHLJSFLf?4rgqGMXHLwH^SM79;Blb|_b2e?d&Z|2 z%0Y)skMV`6zEc~Xy<sSyJa~eGoo@HZRu=U{mdyihsrJ)H^i^E@>0{<*C?Ead$6v+> z|EQKThJTmwXK!c6AOD+<KQQ<@{@^la?D)eoY5bwjH~(4t^38v6nlt~kz2*G=wGR5k zez5wFeYu@?QTh*@V)UQN=9#4b(fO+XpV^ev|A%*Lm^aWDtN+Wr{-FzRyE@u_*ca=6 z8v94>FgtDv7i<48{-OPce!KDVkzR+XKOcREPha(;$}iUb!*)f-Fb}Y4@r9z-_{OIg z`xn^T#ZtEPv_T$M*Sr+=Z{q#~8$|7Y{0!*2u${D*Jj%dfOrS~FzpH*_|55J!7kl4w z?LT!7T(!3!632pmZh?dh`n-z$_ts42pn6;c`}hx;TSYd0idsqal5&0uGV=UM{c9xQ z1KK6&TS+a^H|6B<wY1?KNwleRT=S(2ztn0;|CLnE`j%2QZCfX)(aE8_)AlDNl~VTp z#QQ1QtaCx&H5Jr$9fvivU)tSS(tj$j{j{03Ut57~*ExVr+*!fxXI=QFg4>_hPo1W3 zh+Dun!`UkP%H3}*@IE18q{7&MH2f3?T6o}Jf+xI@fh=SyUOArw`*w1_-PUlHZTHc@ z--yqIxPtI}IjPRzLIZ8cPv4P=>?A&=E~~0)>&J#V;TwAR*6}`01iu~U$@prtzW6YS ze}E>gUX+0YuF}B+Uhw2x7a7Q+oOzMNFHTNN<)40Rzg#`pABKF18@l}5A>RL`?Ri;Z zC8ExD$)im1@R{N7(wIog8$Yn(6%q$yd9(zKe};OnH%;<E6IVx!rq-Dls&Jo8o|c0< zuy5@7x0i)X@To&fw53oU#K*E9rw;0;PU1oT;M+!rL4$AO=p(c7O~B+)22N66stja8 zLmiT0brrv*pZHXfPf{Ow8X2@%^#b3ye(U5>mWBs7)>ls~T3Wi6!Xqw6+dpJLVS1P| z9qV%io-nE*rYcPxiS<?aaq&fI_%s)XSYMT&^sPqm$A6{c4iDfIKCMP$j7*hZC~Z`o z3eB_QUx<xEycp-_)Sah=HMTrWU685mFUR=P4wY|pc~adutHaL<osPMk3zXS2!X#eA zQmK56!Art#=`!NBRQ}0}8{+lj<e<}^zH?HJ#;)7I$_tz{`u|6Z8)$57Y@Ga3<m;M! z?b2b5zRf6E_G}ZMeu#tbU;9AgHA5Wxj!f{WgU#QUu-Y`l-Nnh}4h83xs_!^=pf9is zZ6c2{+5|2%arZBfg-mccFN>31>U_>mbPTXxkC*!?*zefr#2vF|qr8{|4|u^7-pD|f z&OPc->UKu)=iHgIpysp<ozGa?r0YPT{HTLHSC6V|OXXo_ayN;&#~E={T{+X=e(w~2 zw~0Nh;&4Wvrk?&hU(QFB4j$Z-f+xH+-#)1eb)s&iu!V^~AfA{w1uGX=?Rm}#S-&+l zgncRJ)Zh@ylBVrCPT)cVEj)CO3vXl~%gP4UL>;Lsbyj}GJWoBkufOA={CRTUjr%af zc5pUH9{pg?M5%+)oN`q9yBb<oyS@>Bt@+3xHV)qGm8b)Cp-w7~CwEhtBUk0rbjrqM zTb|tQ3-5-pw^cul`T+X&s?O;?V(FD<p-*U$j}C+<^vEC&nfC4)HUsx3hzYZGCbpcm z6e64X$6Y|>!(Q9Qg@(LTCNz{0-vBM^SX5lti3|GpxFn4;Ax6pGc~t)R!Bo${lYH(* z!F&5X*?S&}YoDCyzwv1H+XI(+rL`;RN9}iLxlfr-r&vGG8OQa@=>+a)+Ij)sd_{wu z1Am(+3-RFr4&N8N6+hqo19S#;SA1-hG<GH5jM5~<MA>>07p3}&*j4CR+rqdV)^6n; z_vFr!<qZ$Di!AT7`VHNnve0FgcNDC1nRsh^hbs!#=B-+mwMSJJ_g-u{F!6C(9`}rj zp@WyjXIw+xaqqN&wm`3UqvCMM*H~D5k4bo8S)U`Sb2ctKqWtsfFSBh4VQ@m;@X~sr z`v>(a%-=#=kb{pY<Q=}Noc+1|5qFyt+f_*W)u&sj^WW+}&Yr^g5%rG#;~pt<%<8C6 z|8W;TobTZ~I?~E0R{zlkm666CYO?;xU4uf_KXk0x#D%VZQTTTKvty&bKVbXH!qmAr z>mNL@6|DWkw~%E2V2jYl*e1}c{e$fib?(O+hs}eoBLRo&9(<zgA7XHk#X4o%Yhmmk z)%oBSV*e<g{mK4CZ|_U{SNnixv-dx;XDQ^nvoeA0T(|zPeYO9w^}*Jn4%|!DHtAEp zb?%3Z9@-^mGnHchi!Fl;WFcQ=Yh8F!N9vl^KD6!32cuK+`9GMe&)qxK-!FUQwr2W2 z#8;wi!vDctHF&~X^X;?L{*S1BVUJj8{;#kftpAfc-q!z#-zILn?AYal;Q=q}|3p@~ z{h#zj8vi$U_xSw+>;J}YV}0Mi<mo;y>;LZA<ldj{|NX)Ltz*y<=O3Jj=v>e{U$(s= zT<-IaV$Z+q-P!~3{HxN>Kbw30jXzM&I(S<6Ksx^}HvU2Vntb!<yFz0a_NVv<Vo^f< zl=P0zzDfLx<R#IBWyIX5zAQ)l1A8--U&vi>etSsm0>)j}Me^+L5{2yz--)?W`Q?az z!WLG4UNP}+#C+NKH+ZG-Q<ppbjq%{@oiSjqt>=E>IPp%LuKLx$$8NAOGr(#~P>!EA zDYlpXDR=xM?Xv5(-qp74Cw3LzBeASHSBY`OezkbO<VD55M#Z-5FY&MJafv~uZ8rWH z`;FiF)bE^fzVqhBKl3|r@GMdMb5Zvn(!{^B503JKg>yjP!G%WSymju_C$VBl--z<c z^Q7%X-+y6_@;es({)3!PFz);&9_MF;#0G|Sg%%$0f+uGm$Us)qcM;O3c&F`^eE*5I zbKkX6@4waTy#rW@_a9fA`=1qk|8?&isM!0@IuG{tLnqM(D<q*C_eg4Ds~li?v|)!N z+SJLm6?jiJ;|CvQpNDMCKKbne{#w=h$G-m^gRI#9|8H&&)Mp8E<F_^Ye$YqR=OH@o F{{x|jBbfjI literal 15406 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 Q?j^ZPEpVv?ez`61Kg2JOQ~&?~ diff --git a/conduit-front/public/index.html b/conduit-front/public/index.html index 977b223..21d61d5 100644 --- a/conduit-front/public/index.html +++ b/conduit-front/public/index.html @@ -1,10 +1,40 @@ <!doctype html> <html lang="en"> <head> + <style> + #doorbell{ + text-align: center; + } + #doorbell-submit-button{ + background-color: #5ED9C3; + color: rgb(255, 255, 255); + font-size: 1.1rem; + border-color: #5ED9C3; + } + #doorbell-submit-button:hover{ + background-color: #20c2a4; + color: rgb(255, 255, 255); + font-size: 1.1rem; + border-color: #219c86; + } + #doorbell-powered-by{ + color: #5ED9C3 + } + </style> + <!-- Global site tag (gtag.js) - Google Analytics --> + <script async src="https://www.googletagmanager.com/gtag/js?id=G-9FGSY8NE0L"></script> + <script> + window.dataLayer = window.dataLayer || []; + function gtag(){dataLayer.push(arguments);} + gtag('js', new Date()); + + gtag('config', 'G-9FGSY8NE0L'); + </script> + <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> - <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico"> - <link rel="stylesheet" href="main.css"> + <link rel="shortcut icon" href="%PUBLIC_URL%/logo_wimma.png"> + <link rel="stylesheet" href="../main.css"> <link href="//code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css" rel="stylesheet" type="text/css"> <link href="//fonts.googleapis.com/css?family=Titillium+Web:700|Source+Serif+Pro:400,700|Merriweather+Sans:400,700|Source+Sans+Pro:400,300,600,700,300italic,400italic,600italic,700italic" rel="stylesheet" type="text/css"> <!-- @@ -16,7 +46,7 @@ work correctly both with client-side routing and a non-root public URL. Learn how to configure a non-root public URL by running `npm run build`. --> - <title>ConduitMiau</title> + <title>WIMMA Lab Forum</title> </head> <body> <div id="root"></div> @@ -31,4 +61,23 @@ To create a production bundle, use `npm run build`. --> </body> + <script type="text/javascript"> + window.doorbellOptions = { + "id": "12727", + "appKey": "gcS5JEM6B1yEf3mRntjR2cKutewNl36UvthiBAEAv0K7o1kVkYIDi0CIVMpSIX5A", + strings: { + "feedback-button-text": "Feedback", + title: "Wimma Forum Feedback", + "feedback-textarea-placeholder": "Help Wimma Forum to improve, letting us know what you think.", + "email-input-placeholder": "Your email address"}, + email:"", + }; + (function(w, d, t) { + var hasLoaded = false; + function l() { if (hasLoaded) { return; } hasLoaded = true; window.doorbellOptions.windowLoaded = true; var g = d.createElement(t);g.id = 'doorbellScript';g.type = 'text/javascript';g.async = true;g.src = 'https://embed.doorbell.io/button/'+ + window.doorbellOptions['id']+'?t='+(new Date().getTime());(d.getElementsByTagName('head')[0]||d.getElementsByTagName('body')[0]).appendChild(g); } + if (w.attachEvent) { w.attachEvent('onload', l); } else if (w.addEventListener) { w.addEventListener('load', l, false); } else { l(); } + if (d.readyState == 'complete') { l(); } + }(window, document, 'script')); +</script> </html> diff --git a/te-frontend/public/logo_wimma.png b/conduit-front/public/logo_wimma.png similarity index 100% rename from te-frontend/public/logo_wimma.png rename to conduit-front/public/logo_wimma.png diff --git a/conduit-front/public/main.css b/conduit-front/public/main.css index a76a6f3..0d6dd8f 100644 --- a/conduit-front/public/main.css +++ b/conduit-front/public/main.css @@ -1,3 +1,3 @@ .logo-font{font-family:titillium web,sans-serif}html{position:relative;min-height:100vh;padding-bottom:100px}/*!* Bootstrap v4.0.0-alpha.2 (http://getbootstrap.com) * Copyright 2011-2016 Twitter, Inc. -* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)*//*!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{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]{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{*,*::before,*::after,*::first-letter,*::first-line{text-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.tag{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}@-ms-viewport{width:device-width;}html{font-size:16px;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}body{font-family:source sans pro,sans-serif;font-size:1rem;line-height:1.5;color:#373a3c;background-color:rgb(255, 255, 255)}[tabindex="-1"]:focus{outline:none!important}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #818a91}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}a{color:#5cb85c;text-decoration:none}a:focus,a:hover{color:#3d8b3d;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:not([href]){color:inherit;text-decoration:none}a:not([href]):focus,a:not([href]):hover{color:inherit;text-decoration:none}a:not([href]):focus{outline:none}pre{margin-top:0;margin-bottom:1rem}figure{margin:0 0 1rem}img{vertical-align:middle}[role=button]{cursor:pointer}a,area,button,[role=button],input,label,select,summary,textarea{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}input,button,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:.5rem;font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1,.h1{font-size:2.5rem}h2,.h2{font-size:2rem}h3,.h3{font-size:1.75rem}h4,.h4{font-size:1.5rem}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}.lead{font-size:1.25rem;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.25rem;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"}.img-fluid,.carousel-inner>.carousel-item>img,.carousel-inner>.carousel-item>a>img{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;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:Menlo,Monaco,Consolas,liberation mono,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}@media(min-width:544px){.container{max-width:576px}}@media(min-width:768px){.container{max-width:720px}}@media(min-width:992px){.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}.row{display:flex;flex-wrap:wrap;margin-left:-15px;margin-right:-15px}.col-xs{position:relative;flex-basis:0;flex-grow:1;max-width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 8.33333%;max-width:8.33333%}.col-xs-2{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 16.66667%;max-width:16.66667%}.col-xs-3{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 25%;max-width:25%}.col-xs-4{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 33.33333%;max-width:33.33333%}.col-xs-5{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 41.66667%;max-width:41.66667%}.col-xs-6{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 50%;max-width:50%}.col-xs-7{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 58.33333%;max-width:58.33333%}.col-xs-8{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 66.66667%;max-width:66.66667%}.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 75%;max-width:75%}.col-xs-10{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 83.33333%;max-width:83.33333%}.col-xs-11{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 91.66667%;max-width:91.66667%}.col-xs-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 100%;max-width:100%}.pull-xs-0{right:auto}.pull-xs-1{right:8.33333%}.pull-xs-2{right:16.66667%}.pull-xs-3{right:25%}.pull-xs-4{right:33.33333%}.pull-xs-5{right:41.66667%}.pull-xs-6{right:50%}.pull-xs-7{right:58.33333%}.pull-xs-8{right:66.66667%}.pull-xs-9{right:75%}.pull-xs-10{right:83.33333%}.pull-xs-11{right:91.66667%}.pull-xs-12{right:100%}.push-xs-0{left:auto}.push-xs-1{left:8.33333%}.push-xs-2{left:16.66667%}.push-xs-3{left:25%}.push-xs-4{left:33.33333%}.push-xs-5{left:41.66667%}.push-xs-6{left:50%}.push-xs-7{left:58.33333%}.push-xs-8{left:66.66667%}.push-xs-9{left:75%}.push-xs-10{left:83.33333%}.push-xs-11{left:91.66667%}.push-xs-12{left:100%}.offset-xs-1{margin-left:8.33333%}.offset-xs-2{margin-left:16.66667%}.offset-xs-3{margin-left:25%}.offset-xs-4{margin-left:33.33333%}.offset-xs-5{margin-left:41.66667%}.offset-xs-6{margin-left:50%}.offset-xs-7{margin-left:58.33333%}.offset-xs-8{margin-left:66.66667%}.offset-xs-9{margin-left:75%}.offset-xs-10{margin-left:83.33333%}.offset-xs-11{margin-left:91.66667%}@media(min-width:544px){.col-sm{position:relative;flex-basis:0;flex-grow:1;max-width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col-sm-1{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 8.33333%;max-width:8.33333%}.col-sm-2{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 16.66667%;max-width:16.66667%}.col-sm-3{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 25%;max-width:25%}.col-sm-4{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 33.33333%;max-width:33.33333%}.col-sm-5{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 41.66667%;max-width:41.66667%}.col-sm-6{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 50%;max-width:50%}.col-sm-7{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 58.33333%;max-width:58.33333%}.col-sm-8{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 66.66667%;max-width:66.66667%}.col-sm-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 75%;max-width:75%}.col-sm-10{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 83.33333%;max-width:83.33333%}.col-sm-11{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 91.66667%;max-width:91.66667%}.col-sm-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 100%;max-width:100%}.pull-sm-0{right:auto}.pull-sm-1{right:8.33333%}.pull-sm-2{right:16.66667%}.pull-sm-3{right:25%}.pull-sm-4{right:33.33333%}.pull-sm-5{right:41.66667%}.pull-sm-6{right:50%}.pull-sm-7{right:58.33333%}.pull-sm-8{right:66.66667%}.pull-sm-9{right:75%}.pull-sm-10{right:83.33333%}.pull-sm-11{right:91.66667%}.pull-sm-12{right:100%}.push-sm-0{left:auto}.push-sm-1{left:8.33333%}.push-sm-2{left:16.66667%}.push-sm-3{left:25%}.push-sm-4{left:33.33333%}.push-sm-5{left:41.66667%}.push-sm-6{left:50%}.push-sm-7{left:58.33333%}.push-sm-8{left:66.66667%}.push-sm-9{left:75%}.push-sm-10{left:83.33333%}.push-sm-11{left:91.66667%}.push-sm-12{left:100%}.offset-sm-0{margin-left:0%}.offset-sm-1{margin-left:8.33333%}.offset-sm-2{margin-left:16.66667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333%}.offset-sm-5{margin-left:41.66667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333%}.offset-sm-8{margin-left:66.66667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333%}.offset-sm-11{margin-left:91.66667%}}@media(min-width:768px){.col-md{position:relative;flex-basis:0;flex-grow:1;max-width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col-md-1{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 8.33333%;max-width:8.33333%}.col-md-2{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 16.66667%;max-width:16.66667%}.col-md-3{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 25%;max-width:25%}.col-md-4{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 33.33333%;max-width:33.33333%}.col-md-5{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 41.66667%;max-width:41.66667%}.col-md-6{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 50%;max-width:50%}.col-md-7{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 58.33333%;max-width:58.33333%}.col-md-8{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 66.66667%;max-width:66.66667%}.col-md-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 75%;max-width:75%}.col-md-10{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 83.33333%;max-width:83.33333%}.col-md-11{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 91.66667%;max-width:91.66667%}.col-md-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 100%;max-width:100%}.pull-md-0{right:auto}.pull-md-1{right:8.33333%}.pull-md-2{right:16.66667%}.pull-md-3{right:25%}.pull-md-4{right:33.33333%}.pull-md-5{right:41.66667%}.pull-md-6{right:50%}.pull-md-7{right:58.33333%}.pull-md-8{right:66.66667%}.pull-md-9{right:75%}.pull-md-10{right:83.33333%}.pull-md-11{right:91.66667%}.pull-md-12{right:100%}.push-md-0{left:auto}.push-md-1{left:8.33333%}.push-md-2{left:16.66667%}.push-md-3{left:25%}.push-md-4{left:33.33333%}.push-md-5{left:41.66667%}.push-md-6{left:50%}.push-md-7{left:58.33333%}.push-md-8{left:66.66667%}.push-md-9{left:75%}.push-md-10{left:83.33333%}.push-md-11{left:91.66667%}.push-md-12{left:100%}.offset-md-0{margin-left:0%}.offset-md-1{margin-left:8.33333%}.offset-md-2{margin-left:16.66667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333%}.offset-md-5{margin-left:41.66667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333%}.offset-md-8{margin-left:66.66667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333%}.offset-md-11{margin-left:91.66667%}}@media(min-width:992px){.col-lg{position:relative;flex-basis:0;flex-grow:1;max-width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col-lg-1{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 8.33333%;max-width:8.33333%}.col-lg-2{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 16.66667%;max-width:16.66667%}.col-lg-3{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 25%;max-width:25%}.col-lg-4{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 33.33333%;max-width:33.33333%}.col-lg-5{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 41.66667%;max-width:41.66667%}.col-lg-6{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 50%;max-width:50%}.col-lg-7{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 58.33333%;max-width:58.33333%}.col-lg-8{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 66.66667%;max-width:66.66667%}.col-lg-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 75%;max-width:75%}.col-lg-10{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 83.33333%;max-width:83.33333%}.col-lg-11{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 91.66667%;max-width:91.66667%}.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 100%;max-width:100%}.pull-lg-0{right:auto}.pull-lg-1{right:8.33333%}.pull-lg-2{right:16.66667%}.pull-lg-3{right:25%}.pull-lg-4{right:33.33333%}.pull-lg-5{right:41.66667%}.pull-lg-6{right:50%}.pull-lg-7{right:58.33333%}.pull-lg-8{right:66.66667%}.pull-lg-9{right:75%}.pull-lg-10{right:83.33333%}.pull-lg-11{right:91.66667%}.pull-lg-12{right:100%}.push-lg-0{left:auto}.push-lg-1{left:8.33333%}.push-lg-2{left:16.66667%}.push-lg-3{left:25%}.push-lg-4{left:33.33333%}.push-lg-5{left:41.66667%}.push-lg-6{left:50%}.push-lg-7{left:58.33333%}.push-lg-8{left:66.66667%}.push-lg-9{left:75%}.push-lg-10{left:83.33333%}.push-lg-11{left:91.66667%}.push-lg-12{left:100%}.offset-lg-0{margin-left:0%}.offset-lg-1{margin-left:8.33333%}.offset-lg-2{margin-left:16.66667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333%}.offset-lg-5{margin-left:41.66667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333%}.offset-lg-8{margin-left:66.66667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333%}.offset-lg-11{margin-left:91.66667%}}@media(min-width:1200px){.col-xl{position:relative;flex-basis:0;flex-grow:1;max-width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col-xl-1{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 8.33333%;max-width:8.33333%}.col-xl-2{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 16.66667%;max-width:16.66667%}.col-xl-3{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 25%;max-width:25%}.col-xl-4{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 33.33333%;max-width:33.33333%}.col-xl-5{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 41.66667%;max-width:41.66667%}.col-xl-6{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 50%;max-width:50%}.col-xl-7{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 58.33333%;max-width:58.33333%}.col-xl-8{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 66.66667%;max-width:66.66667%}.col-xl-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 75%;max-width:75%}.col-xl-10{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 83.33333%;max-width:83.33333%}.col-xl-11{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 91.66667%;max-width:91.66667%}.col-xl-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 100%;max-width:100%}.pull-xl-0{right:auto}.pull-xl-1{right:8.33333%}.pull-xl-2{right:16.66667%}.pull-xl-3{right:25%}.pull-xl-4{right:33.33333%}.pull-xl-5{right:41.66667%}.pull-xl-6{right:50%}.pull-xl-7{right:58.33333%}.pull-xl-8{right:66.66667%}.pull-xl-9{right:75%}.pull-xl-10{right:83.33333%}.pull-xl-11{right:91.66667%}.pull-xl-12{right:100%}.push-xl-0{left:auto}.push-xl-1{left:8.33333%}.push-xl-2{left:16.66667%}.push-xl-3{left:25%}.push-xl-4{left:33.33333%}.push-xl-5{left:41.66667%}.push-xl-6{left:50%}.push-xl-7{left:58.33333%}.push-xl-8{left:66.66667%}.push-xl-9{left:75%}.push-xl-10{left:83.33333%}.push-xl-11{left:91.66667%}.push-xl-12{left:100%}.offset-xl-0{margin-left:0%}.offset-xl-1{margin-left:8.33333%}.offset-xl-2{margin-left:16.66667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333%}.offset-xl-5{margin-left:41.66667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333%}.offset-xl-8{margin-left:66.66667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333%}.offset-xl-11{margin-left:91.66667%}}.table{width:100%;max-width:100%;margin-bottom:1rem}.table th,.table td{padding:.75rem;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 th,.table-sm td{padding:.3rem}.table-bordered{border:1px solid #eceeef}.table-bordered th,.table-bordered td{border:1px solid #eceeef}.table-bordered thead th,.table-bordered thead td{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover tbody tr:hover{background-color:#f5f5f5}.table-active,.table-active>th,.table-active>td{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>th,.table-success>td{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>th,.table-info>td{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>th,.table-warning>td{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>th,.table-danger>td{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:#373a3c}.table-inverse.table-bordered{border:0}.table-inverse th,.table-inverse td,.table-inverse thead th{border-color:#55595c}.table-reflow thead{float:left}.table-reflow tbody{display:block;white-space:nowrap}.table-reflow th,.table-reflow td{border-top:1px solid #eceeef;border-left:1px solid #eceeef}.table-reflow th:last-child,.table-reflow td:last-child{border-right:1px solid #eceeef}.table-reflow thead:last-child tr:last-child th,.table-reflow thead:last-child tr:last-child td,.table-reflow tbody:last-child tr:last-child th,.table-reflow tbody:last-child tr:last-child td,.table-reflow tfoot:last-child tr:last-child th,.table-reflow tfoot:last-child tr:last-child td{border-bottom:1px solid #eceeef}.table-reflow tr{float:left}.table-reflow tr th,.table-reflow tr td{display:block!important;border:1px solid #eceeef}.form-control{display:block;width:100%;padding:.5rem .75rem;font-size:1rem;line-height:1.25;color:#55595c;background-color:#fff;background-image:none;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{border-color:#66afe9;outline:none}.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.5rem}.form-control-file,.form-control-range{display:block}.form-control-label{padding:.5rem .75rem;margin-bottom:0}.form-control-legend{padding:.5rem .75rem;margin-bottom:0;font-size:1rem}_::-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.5rem}_::-webkit-full-page-media.input-sm,.input-group-sm _::-webkit-full-page-media.form-control,input[type=date].input-sm,.input-group-sm input[type=date].form-control,input[type=time].input-sm,.input-group-sm input[type=time].form-control,input[type=datetime-local].input-sm,.input-group-sm input[type=datetime-local].form-control,input[type=month].input-sm,.input-group-sm input[type=month].form-control{line-height:1.8125rem}_::-webkit-full-page-media.input-lg,.input-group-lg _::-webkit-full-page-media.form-control,input[type=date].input-lg,.input-group-lg input[type=date].form-control,input[type=time].input-lg,.input-group-lg input[type=time].form-control,input[type=datetime-local].input-lg,.input-group-lg input[type=datetime-local].form-control,input[type=month].input-lg,.input-group-lg input[type=month].form-control{line-height:3.16667rem}.form-control-static{min-height:2.5rem;padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0}.form-control-static.form-control-sm,.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,.form-control-static.form-control-lg,.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{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}.radio,.checkbox{position:relative;display:block;margin-bottom:.75rem}.radio label,.checkbox label{padding-left:1.25rem;margin-bottom:0;cursor:pointer}.radio label input:only-child,.checkbox label input:only-child{position:static}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-top:.25rem;margin-left:-1.25rem}.radio+.radio,.checkbox+.checkbox{margin-top:-.25rem}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:1.25rem;margin-bottom:0;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:.75rem}input[type=radio]:disabled,input[type=radio].disabled,input[type=checkbox]:disabled,input[type=checkbox].disabled{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label{cursor:not-allowed}.form-control-success,.form-control-warning,.form-control-danger{padding-right:2.25rem;background-repeat:no-repeat;background-position:center right .625rem;background-size:1.25rem 1.25rem}.has-success .text-help,.has-success .form-control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label,.has-success .custom-control{color:#5cb85c}.has-success .form-control{border-color:#5cb85c}.has-success .input-group-addon{color:#5cb85c;border-color:#5cb85c;background-color:#eaf6ea}.has-success .form-control-feedback{color:#5cb85c}.has-success .form-control-success{background-image:url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA4IDgnPjxwYXRoIGZpbGw9JyM1Y2I4NWMnIGQ9J00yLjMgNi43M0wuNiA0LjUzYy0uNC0xLjA0LjQ2LTEuNCAxLjEtLjhsMS4xIDEuNCAzLjQtMy44Yy42LS42MyAxLjYtLjI3IDEuMi43bC00IDQuNmMtLjQzLjUtLjguNC0xLjEuMXonLz48L3N2Zz4=)}.has-warning .text-help,.has-warning .form-control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label,.has-warning .custom-control{color:#f0ad4e}.has-warning .form-control{border-color:#f0ad4e}.has-warning .input-group-addon{color:#f0ad4e;border-color:#f0ad4e;background-color:#fff}.has-warning .form-control-feedback{color:#f0ad4e}.has-warning .form-control-warning{background-image:url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA4IDgnPjxwYXRoIGZpbGw9JyNmMGFkNGUnIGQ9J000LjQgNS4zMjRoLS44di0yLjQ2aC44em0wIDEuNDJoLS44VjUuODloLjh6TTMuNzYuNjNMLjA0IDcuMDc1Yy0uMTE1LjIuMDE2LjQyNS4yNi40MjZoNy4zOTdjLjI0MiAwIC4zNzItLjIyNi4yNTgtLjQyNkM2LjcyNiA0LjkyNCA1LjQ3IDIuNzkgNC4yNTMuNjNjLS4xMTMtLjE3NC0uMzktLjE3NC0uNDk0IDB6Jy8+PC9zdmc+)}.has-danger .text-help,.has-danger .form-control-label,.has-danger .radio,.has-danger .checkbox,.has-danger .radio-inline,.has-danger .checkbox-inline,.has-danger.radio label,.has-danger.checkbox label,.has-danger.radio-inline label,.has-danger.checkbox-inline label,.has-danger .custom-control{color:#b85c5c}.has-danger .form-control{border-color:#b85c5c}.has-danger .input-group-addon{color:#b85c5c;border-color:#b85c5c;background-color:#f6eaea}.has-danger .form-control-feedback{color:#b85c5c}.has-danger .form-control-danger{background-image:url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIGZpbGw9JyNkOTUzNGYnIHZpZXdCb3g9Jy0yIC0yIDcgNyc+PHBhdGggc3Ryb2tlPScjZDk1MzRmJyBkPSdNMCAwbDMgM20wLTNMMCAzJy8+PGNpcmNsZSByPScuNScvPjxjaXJjbGUgY3g9JzMnIHI9Jy41Jy8+PGNpcmNsZSBjeT0nMycgcj0nLjUnLz48Y2lyY2xlIGN4PSczJyBjeT0nMycgcj0nLjUnLz48L3N2Zz4=)}@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 .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .form-control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.btn{display:inline-block;font-weight:400;line-height:1.25;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;user-select:none;border:1px solid transparent;padding:.5rem 1rem;font-size:1rem;border-radius:.25rem}.btn:focus,.btn.focus,.btn:active:focus,.btn:active.focus,.btn.active:focus,.btn.active.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:#5cb85c;border-color:#5cb85c}.btn-primary:hover{color:#fff;background-color:#449d44;border-color:#419641}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#449d44;border-color:#419641}.btn-primary:active,.btn-primary.active,.open>.btn-primary.dropdown-toggle{color:#fff;background-color:#449d44;border-color:#419641;background-image:none}.btn-primary:active:hover,.btn-primary:active:focus,.btn-primary:active.focus,.btn-primary.active:hover,.btn-primary.active:focus,.btn-primary.active.focus,.open>.btn-primary.dropdown-toggle:hover,.open>.btn-primary.dropdown-toggle:focus,.open>.btn-primary.dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#2d672d}.btn-primary.disabled:focus,.btn-primary.disabled.focus,.btn-primary:disabled:focus,.btn-primary:disabled.focus{background-color:#5cb85c;border-color:#5cb85c}.btn-primary.disabled:hover,.btn-primary:disabled:hover{background-color:#5cb85c;border-color:#5cb85c}.btn-secondary{color:#373a3c;background-color:#fff;border-color:#ccc}.btn-secondary:hover{color:#373a3c;background-color:#e6e6e6;border-color:#adadad}.btn-secondary:focus,.btn-secondary.focus{color:#373a3c;background-color:#e6e6e6;border-color:#adadad}.btn-secondary:active,.btn-secondary.active,.open>.btn-secondary.dropdown-toggle{color:#373a3c;background-color:#e6e6e6;border-color:#adadad;background-image:none}.btn-secondary:active:hover,.btn-secondary:active:focus,.btn-secondary:active.focus,.btn-secondary.active:hover,.btn-secondary.active:focus,.btn-secondary.active.focus,.open>.btn-secondary.dropdown-toggle:hover,.open>.btn-secondary.dropdown-toggle:focus,.open>.btn-secondary.dropdown-toggle.focus{color:#373a3c;background-color:#d4d4d4;border-color:#8c8c8c}.btn-secondary.disabled:focus,.btn-secondary.disabled.focus,.btn-secondary:disabled:focus,.btn-secondary:disabled.focus{background-color:#fff;border-color:#ccc}.btn-secondary.disabled:hover,.btn-secondary:disabled:hover{background-color:#fff;border-color:#ccc}.btn-info{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#2aabd2}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#2aabd2}.btn-info:active,.btn-info.active,.open>.btn-info.dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#2aabd2;background-image:none}.btn-info:active:hover,.btn-info:active:focus,.btn-info:active.focus,.btn-info.active:hover,.btn-info.active:focus,.btn-info.active.focus,.open>.btn-info.dropdown-toggle:hover,.open>.btn-info.dropdown-toggle:focus,.open>.btn-info.dropdown-toggle.focus{color:#fff;background-color:#269abc;border-color:#1f7e9a}.btn-info.disabled:focus,.btn-info.disabled.focus,.btn-info:disabled:focus,.btn-info:disabled.focus{background-color:#5bc0de;border-color:#5bc0de}.btn-info.disabled:hover,.btn-info:disabled:hover{background-color:#5bc0de;border-color:#5bc0de}.btn-success{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#419641}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#449d44;border-color:#419641}.btn-success:active,.btn-success.active,.open>.btn-success.dropdown-toggle{color:#fff;background-color:#449d44;border-color:#419641;background-image:none}.btn-success:active:hover,.btn-success:active:focus,.btn-success:active.focus,.btn-success.active:hover,.btn-success.active:focus,.btn-success.active.focus,.open>.btn-success.dropdown-toggle:hover,.open>.btn-success.dropdown-toggle:focus,.open>.btn-success.dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#2d672d}.btn-success.disabled:focus,.btn-success.disabled.focus,.btn-success:disabled:focus,.btn-success:disabled.focus{background-color:#5cb85c;border-color:#5cb85c}.btn-success.disabled:hover,.btn-success:disabled:hover{background-color:#5cb85c;border-color:#5cb85c}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#eb9316}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#eb9316}.btn-warning:active,.btn-warning.active,.open>.btn-warning.dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#eb9316;background-image:none}.btn-warning:active:hover,.btn-warning:active:focus,.btn-warning:active.focus,.btn-warning.active:hover,.btn-warning.active:focus,.btn-warning.active.focus,.open>.btn-warning.dropdown-toggle:hover,.open>.btn-warning.dropdown-toggle:focus,.open>.btn-warning.dropdown-toggle.focus{color:#fff;background-color:#d58512;border-color:#b06d0f}.btn-warning.disabled:focus,.btn-warning.disabled.focus,.btn-warning:disabled:focus,.btn-warning:disabled.focus{background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning.disabled:hover,.btn-warning:disabled:hover{background-color:#f0ad4e;border-color:#f0ad4e}.btn-danger{color:#fff;background-color:#b85c5c;border-color:#b85c5c}.btn-danger:hover{color:#fff;background-color:#9d4444;border-color:#964141}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#9d4444;border-color:#964141}.btn-danger:active,.btn-danger.active,.open>.btn-danger.dropdown-toggle{color:#fff;background-color:#9d4444;border-color:#964141;background-image:none}.btn-danger:active:hover,.btn-danger:active:focus,.btn-danger:active.focus,.btn-danger.active:hover,.btn-danger.active:focus,.btn-danger.active.focus,.open>.btn-danger.dropdown-toggle:hover,.open>.btn-danger.dropdown-toggle:focus,.open>.btn-danger.dropdown-toggle.focus{color:#fff;background-color:#843939;border-color:#672d2d}.btn-danger.disabled:focus,.btn-danger.disabled.focus,.btn-danger:disabled:focus,.btn-danger:disabled.focus{background-color:#b85c5c;border-color:#b85c5c}.btn-danger.disabled:hover,.btn-danger:disabled:hover{background-color:#b85c5c;border-color:#b85c5c}.btn-outline-primary{color:#5cb85c;background-image:none;background-color:transparent;border-color:#5cb85c}.btn-outline-primary:hover{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-primary:focus,.btn-outline-primary.focus{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-primary:active,.btn-outline-primary.active,.open>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-primary:active:hover,.btn-outline-primary:active:focus,.btn-outline-primary:active.focus,.btn-outline-primary.active:hover,.btn-outline-primary.active:focus,.btn-outline-primary.active.focus,.open>.btn-outline-primary.dropdown-toggle:hover,.open>.btn-outline-primary.dropdown-toggle:focus,.open>.btn-outline-primary.dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#2d672d}.btn-outline-primary.disabled:focus,.btn-outline-primary.disabled.focus,.btn-outline-primary:disabled:focus,.btn-outline-primary:disabled.focus{border-color:#a3d7a3}.btn-outline-primary.disabled:hover,.btn-outline-primary:disabled:hover{border-color:#a3d7a3}.btn-outline-secondary{color:#ccc;background-image:none;background-color:transparent;border-color:#ccc}.btn-outline-secondary:hover{color:#fff;background-color:#ccc;border-color:#ccc}.btn-outline-secondary:focus,.btn-outline-secondary.focus{color:#fff;background-color:#ccc;border-color:#ccc}.btn-outline-secondary:active,.btn-outline-secondary.active,.open>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#ccc;border-color:#ccc}.btn-outline-secondary:active:hover,.btn-outline-secondary:active:focus,.btn-outline-secondary:active.focus,.btn-outline-secondary.active:hover,.btn-outline-secondary.active:focus,.btn-outline-secondary.active.focus,.open>.btn-outline-secondary.dropdown-toggle:hover,.open>.btn-outline-secondary.dropdown-toggle:focus,.open>.btn-outline-secondary.dropdown-toggle.focus{color:#fff;background-color:#a1a1a1;border-color:#8c8c8c}.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:#5bc0de;background-image:none;background-color:transparent;border-color:#5bc0de}.btn-outline-info:hover{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-info:focus,.btn-outline-info.focus{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-info:active,.btn-outline-info.active,.open>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-info:active:hover,.btn-outline-info:active:focus,.btn-outline-info:active.focus,.btn-outline-info.active:hover,.btn-outline-info.active:focus,.btn-outline-info.active.focus,.open>.btn-outline-info.dropdown-toggle:hover,.open>.btn-outline-info.dropdown-toggle:focus,.open>.btn-outline-info.dropdown-toggle.focus{color:#fff;background-color:#269abc;border-color:#1f7e9a}.btn-outline-info.disabled:focus,.btn-outline-info.disabled.focus,.btn-outline-info:disabled:focus,.btn-outline-info:disabled.focus{border-color:#b0e1ef}.btn-outline-info.disabled:hover,.btn-outline-info:disabled:hover{border-color:#b0e1ef}.btn-outline-success{color:#5cb85c;background-image:none;background-color:transparent;border-color:#5cb85c}.btn-outline-success:hover{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-success:focus,.btn-outline-success.focus{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-success:active,.btn-outline-success.active,.open>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-success:active:hover,.btn-outline-success:active:focus,.btn-outline-success:active.focus,.btn-outline-success.active:hover,.btn-outline-success.active:focus,.btn-outline-success.active.focus,.open>.btn-outline-success.dropdown-toggle:hover,.open>.btn-outline-success.dropdown-toggle:focus,.open>.btn-outline-success.dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#2d672d}.btn-outline-success.disabled:focus,.btn-outline-success.disabled.focus,.btn-outline-success:disabled:focus,.btn-outline-success:disabled.focus{border-color:#a3d7a3}.btn-outline-success.disabled:hover,.btn-outline-success:disabled:hover{border-color:#a3d7a3}.btn-outline-warning{color:#f0ad4e;background-image:none;background-color:transparent;border-color:#f0ad4e}.btn-outline-warning:hover{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-warning:focus,.btn-outline-warning.focus{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-warning:active,.btn-outline-warning.active,.open>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-warning:active:hover,.btn-outline-warning:active:focus,.btn-outline-warning:active.focus,.btn-outline-warning.active:hover,.btn-outline-warning.active:focus,.btn-outline-warning.active.focus,.open>.btn-outline-warning.dropdown-toggle:hover,.open>.btn-outline-warning.dropdown-toggle:focus,.open>.btn-outline-warning.dropdown-toggle.focus{color:#fff;background-color:#d58512;border-color:#b06d0f}.btn-outline-warning.disabled:focus,.btn-outline-warning.disabled.focus,.btn-outline-warning:disabled:focus,.btn-outline-warning:disabled.focus{border-color:#f8d9ac}.btn-outline-warning.disabled:hover,.btn-outline-warning:disabled:hover{border-color:#f8d9ac}.btn-outline-danger{color:#b85c5c;background-image:none;background-color:transparent;border-color:#b85c5c}.btn-outline-danger:hover{color:#fff;background-color:#b85c5c;border-color:#b85c5c}.btn-outline-danger:focus,.btn-outline-danger.focus{color:#fff;background-color:#b85c5c;border-color:#b85c5c}.btn-outline-danger:active,.btn-outline-danger.active,.open>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#b85c5c;border-color:#b85c5c}.btn-outline-danger:active:hover,.btn-outline-danger:active:focus,.btn-outline-danger:active.focus,.btn-outline-danger.active:hover,.btn-outline-danger.active:focus,.btn-outline-danger.active.focus,.open>.btn-outline-danger.dropdown-toggle:hover,.open>.btn-outline-danger.dropdown-toggle:focus,.open>.btn-outline-danger.dropdown-toggle.focus{color:#fff;background-color:#843939;border-color:#672d2d}.btn-outline-danger.disabled:focus,.btn-outline-danger.disabled.focus,.btn-outline-danger:disabled:focus,.btn-outline-danger:disabled.focus{border-color:#d7a3a3}.btn-outline-danger.disabled:hover,.btn-outline-danger:disabled:hover{border-color:#d7a3a3}.btn-link{font-weight:400;color:#5cb85c;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link:disabled{background-color:transparent}.btn-link,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#3d8b3d;text-decoration:underline;background-color:transparent}.btn-link:disabled:focus,.btn-link:disabled:hover{color:#818a91;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:.75rem 1.5rem;font-size:1.25rem;border-radius:.3rem}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;transition-timing-function:ease;transition-duration:.35s;transition-property:height}.dropup,.dropdown{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:1rem;color:#373a3c;text-align:left;list-style:none;background-color:#fff;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:#5cb85c;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>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:hover,.btn-group-vertical>.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>.btn-lg+.dropdown-toggle,.btn-group-lg.btn-group>.btn+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn .caret{margin-left:0}.btn-lg .caret,.btn-group-lg>.btn .caret{border-width:.3em .3em 0;border-bottom-width:0}.dropup .btn-lg .caret,.dropup .btn-group-lg>.btn .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=radio],[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;width:100%;display:flex}.input-group .form-control{position:relative;z-index:2;flex:1;margin-bottom:0}.input-group .form-control:focus,.input-group .form-control:active,.input-group .form-control:hover{z-index:3}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{white-space:nowrap;vertical-align:middle}.input-group-addon{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;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=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:not(:last-child),.input-group-addon:not(:last-child),.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group>.btn,.input-group-btn:not(:last-child)>.dropdown-toggle,.input-group-btn:not(:first-child)>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:not(:first-child)>.btn-group:not(:last-child)>.btn{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:not(:first-child),.input-group-btn:not(:last-child)>.btn-group:not(:first-child)>.btn{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:focus,.input-group-btn>.btn:active,.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:focus,.input-group-btn:not(:first-child)>.btn:active,.input-group-btn:not(:first-child)>.btn:hover,.input-group-btn:not(:first-child)>.btn-group:focus,.input-group-btn:not(:first-child)>.btn-group:active,.input-group-btn:not(:first-child)>.btn-group:hover{z-index:3}.custom-control{position:relative;display:inline;padding-left:1.5rem;cursor:pointer}.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{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;user-select:none;background-color:#ddd;background-repeat:no-repeat;background-position:center center;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;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA4IDgnPjxwYXRoIGZpbGw9JyNmZmYnIGQ9J002LjU2NC43NWwtMy41OSAzLjYxMi0xLjUzOC0xLjU1TDAgNC4yNiAyLjk3NCA3LjI1IDggMi4xOTN6Jy8+PC9zdmc+)}.custom-checkbox .custom-control-input:indeterminate~.custom-control-indicator{background-color:#0074d9;background-image:url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA0IDQnPjxwYXRoIHN0cm9rZT0nI2ZmZicgZD0nTTAgMmg0Jy8+PC9zdmc+)}.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;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9Jy00IC00IDggOCc+PGNpcmNsZSByPSczJyBmaWxsPScjZmZmJy8+PC9zdmc+)}.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;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA0IDUnPjxwYXRoIGZpbGw9JyMzMzMnIGQ9J00yIDBMMCAyaDR6bTAgNUwwIDNoNHonLz48L3N2Zz4=) no-repeat right .75rem center;background-image:none \9;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:none}.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;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}.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-link.active,.nav-tabs .nav-link.active:focus,.nav-tabs .nav-link.active:hover,.nav-tabs .nav-item.open .nav-link,.nav-tabs .nav-item.open .nav-link:focus,.nav-tabs .nav-item.open .nav-link: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-link.active,.nav-pills .nav-link.active:focus,.nav-pills .nav-link.active:hover,.nav-pills .nav-item.open .nav-link,.nav-pills .nav-item.open .nav-link:focus,.nav-pills .nav-item.open .nav-link:hover{color:#fff;cursor:default;background-color:#5cb85c}.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-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media(min-width:544px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0}.navbar-fixed-bottom{bottom:0}.navbar-sticky-top{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:992px){.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 .open>.nav-link,.navbar-light .navbar-nav .open>.nav-link:focus,.navbar-light .navbar-nav .open>.nav-link:hover,.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.open,.navbar-light .navbar-nav .nav-link.open:focus,.navbar-light .navbar-nav .nav-link.open:hover,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.active:focus,.navbar-light .navbar-nav .nav-link.active: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 .open>.nav-link,.navbar-dark .navbar-nav .open>.nav-link:focus,.navbar-dark .navbar-nav .open>.nav-link:hover,.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.open,.navbar-dark .navbar-nav .nav-link.open:focus,.navbar-dark .navbar-nav .nav-link.open:hover,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.active:focus,.navbar-dark .navbar-nav .nav-link.active: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;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;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;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:#5cb85c;border-color:#5cb85c}.card-success{background-color:#5cb85c;border-color:#5cb85c}.card-info{background-color:#5bc0de;border-color:#5bc0de}.card-warning{background-color:#f0ad4e;border-color:#f0ad4e}.card-danger{background-color:#b85c5c;border-color:#b85c5c}.card-outline-primary{background-color:transparent;border-color:#5cb85c}.card-outline-secondary{background-color:transparent;border-color:#ccc}.card-outline-info{background-color:transparent;border-color:#5bc0de}.card-outline-success{background-color:transparent;border-color:#5cb85c}.card-outline-warning{background-color:transparent;border-color:#f0ad4e}.card-outline-danger{background-color:transparent;border-color:#b85c5c}.card-inverse .card-header,.card-inverse .card-footer{border-bottom:1px solid rgba(255,255,255,.2)}.card-inverse .card-header,.card-inverse .card-footer,.card-inverse .card-title,.card-inverse .card-blockquote{color:#fff}.card-inverse .card-link,.card-inverse .card-text,.card-inverse .card-blockquote>footer{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:flex;flex-flow:row wrap;margin-right:-.625rem;margin-left:-.625rem}.card-deck .card{flex:1 0 0;margin-right:.625rem;margin-left:.625rem}}@media(min-width:544px){.card-group{display:flex;flex-flow:row wrap}.card-group .card{flex:1 0 0}.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-top,.card-group .card:not(:first-child):not(:last-child) .card-img-bottom{border-radius:0}}@media(min-width:544px){.card-columns{column-count:3;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:#5cb85c;border-color:#5cb85c}.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:#5cb85c;text-decoration:none;background-color:#fff;border:1px solid #ddd}.page-link:focus,.page-link:hover{color:#3d8b3d;background-color:#eceeef;border-color:#ddd}.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}.tag{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}.tag:empty{display:none}.btn .tag{position:relative;top:-1px}a.tag:focus,a.tag:hover{color:#fff;text-decoration:none;cursor:pointer}.tag-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.tag-default{background-color:#818a91}.tag-default[href]:focus,.tag-default[href]:hover{background-color:#687077}.tag-primary{background-color:#5cb85c}.tag-primary[href]:focus,.tag-primary[href]:hover{background-color:#449d44}.tag-success{background-color:#5cb85c}.tag-success[href]:focus,.tag-success[href]:hover{background-color:#449d44}.tag-info{background-color:#5bc0de}.tag-info[href]:focus,.tag-info[href]:hover{background-color:#31b0d5}.tag-warning{background-color:#f0ad4e}.tag-warning[href]:focus,.tag-warning[href]:hover{background-color:#ec971f}.tag-danger{background-color:#b85c5c}.tag-danger[href]:focus,.tag-danger[href]:hover{background-color:#9d4444}.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}@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;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}base::-moz-progress-bar,.progress[value]{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:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-striped[value]::-moz-progress-bar{background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-striped[value]::-ms-fill{background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}@media screen and (min-width:0\0){.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}}.progress-animated[value]::-webkit-progress-value{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{animation:progress-bar-stripes 2s linear infinite}}.progress-success[value]::-webkit-progress-value{background-color:#5cb85c}.progress-success[value]::-moz-progress-bar{background-color:#5cb85c}.progress-success[value]::-ms-fill{background-color:#5cb85c}@media screen and (min-width:0\0){.progress-success .progress-bar{background-color:#5cb85c}}.progress-info[value]::-webkit-progress-value{background-color:#5bc0de}.progress-info[value]::-moz-progress-bar{background-color:#5bc0de}.progress-info[value]::-ms-fill{background-color:#5bc0de}@media screen and (min-width:0\0){.progress-info .progress-bar{background-color:#5bc0de}}.progress-warning[value]::-webkit-progress-value{background-color:#f0ad4e}.progress-warning[value]::-moz-progress-bar{background-color:#f0ad4e}.progress-warning[value]::-ms-fill{background-color:#f0ad4e}@media screen and (min-width:0\0){.progress-warning .progress-bar{background-color:#f0ad4e}}.progress-danger[value]::-webkit-progress-value{background-color:#b85c5c}.progress-danger[value]::-moz-progress-bar{background-color:#b85c5c}.progress-danger[value]::-ms-fill{background-color:#b85c5c}@media screen and (min-width:0\0){.progress-danger .progress-bar{background-color:#b85c5c}}.media{display:flex;margin-bottom:1rem}.media-body{flex:1}.media-middle{align-self:center}.media-bottom{align-self:flex-end}.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:#5cb85c;border-color:#5cb85c}.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:#eaf6ea}.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 iframe,.embed-responsive embed,.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.85714%}.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.5rem;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{transition:transform .3s ease-out;transform:translate(0,-25%)}.modal.in .modal-dialog{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;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.5}.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:992px){.modal-lg{max-width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:source sans pro,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;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.tooltip-top,.tooltip.bs-tether-element-attached-bottom{padding:5px 0;margin-top:-3px}.tooltip.tooltip-top .tooltip-arrow,.tooltip.bs-tether-element-attached-bottom .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.tooltip-right,.tooltip.bs-tether-element-attached-left{padding:0 5px;margin-left:3px}.tooltip.tooltip-right .tooltip-arrow,.tooltip.bs-tether-element-attached-left .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.tooltip-bottom,.tooltip.bs-tether-element-attached-top{padding:5px 0;margin-top:3px}.tooltip.tooltip-bottom .tooltip-arrow,.tooltip.bs-tether-element-attached-top .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.tooltip-left,.tooltip.bs-tether-element-attached-right{padding:0 5px;margin-left:-3px}.tooltip.tooltip-left .tooltip-arrow,.tooltip.bs-tether-element-attached-right .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:source sans pro,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;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;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover.popover-top,.popover.bs-tether-element-attached-bottom{margin-top:-10px}.popover.popover-top .popover-arrow,.popover.bs-tether-element-attached-bottom .popover-arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.popover-top .popover-arrow::after,.popover.bs-tether-element-attached-bottom .popover-arrow::after{bottom:1px;margin-left:-10px;content:"";border-top-color:#fff;border-bottom-width:0}.popover.popover-right,.popover.bs-tether-element-attached-left{margin-left:10px}.popover.popover-right .popover-arrow,.popover.bs-tether-element-attached-left .popover-arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.popover-right .popover-arrow::after,.popover.bs-tether-element-attached-left .popover-arrow::after{bottom:-10px;left:1px;content:"";border-right-color:#fff;border-left-width:0}.popover.popover-bottom,.popover.bs-tether-element-attached-top{margin-top:10px}.popover.popover-bottom .popover-arrow,.popover.bs-tether-element-attached-top .popover-arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:rgba(0,0,0,.25)}.popover.popover-bottom .popover-arrow::after,.popover.bs-tether-element-attached-top .popover-arrow::after{top:1px;margin-left:-10px;content:"";border-top-width:0;border-bottom-color:#fff}.popover.popover-left,.popover.bs-tether-element-attached-right{margin-left:-10px}.popover.popover-left .popover-arrow,.popover.bs-tether-element-attached-right .popover-arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:rgba(0,0,0,.25)}.popover.popover-left .popover-arrow::after,.popover.bs-tether-element-attached-right .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:1rem;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;transition:.6s ease-in-out left}.carousel-inner>.carousel-item>img,.carousel-inner>.carousel-item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.carousel-item{transition:transform .6s ease-in-out;backface-visibility:hidden;perspective:1000px}.carousel-inner>.carousel-item.next,.carousel-inner>.carousel-item.active.right{left:0;transform:translate3d(100%,0,0)}.carousel-inner>.carousel-item.prev,.carousel-inner>.carousel-item.active.left{left:0;transform:translate3d(-100%,0,0)}.carousel-inner>.carousel-item.next.left,.carousel-inner>.carousel-item.prev.right,.carousel-inner>.carousel-item.active{left: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:linear-gradient(to right,rgba(0,0,0,0.5) 0%,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0%,rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control .icon-prev,.carousel-control .icon-next{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-prev,.carousel-control .icon-next{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{color:#fff!important;background-color:#5cb85c!important}a.bg-primary:focus,a.bg-primary:hover{background-color:#449d44!important}.bg-success{color:#fff!important;background-color:#5cb85c!important}a.bg-success:focus,a.bg-success:hover{background-color:#449d44!important}.bg-info{color:#fff!important;background-color:#5bc0de!important}a.bg-info:focus,a.bg-info:hover{background-color:#31b0d5!important}.bg-warning{color:#fff!important;background-color:#f0ad4e!important}a.bg-warning:focus,a.bg-warning:hover{background-color:#ec971f!important}.bg-danger{color:#fff!important;background-color:#b85c5c!important}a.bg-danger:focus,a.bg-danger:hover{background-color:#9d4444!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:992px){.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!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!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!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!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}.p-a-0{padding: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!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!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!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}.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:992px){.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:#5cb85c!important}a.text-primary:focus,a.text-primary:hover{color:#449d44}.text-success{color:#5cb85c!important}a.text-success:focus,a.text-success:hover{color:#449d44}.text-info{color:#5bc0de!important}a.text-info:focus,a.text-info:hover{color:#31b0d5}.text-warning{color:#f0ad4e!important}a.text-warning:focus,a.text-warning:hover{color:#ec971f}.text-danger{color:#b85c5c!important}a.text-danger:focus,a.text-danger:hover{color:#9d4444}.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:991px){.hidden-md-down{display:none!important}}@media(min-width:992px){.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}}.flex-xs-first{order:-1}.flex-xs-last{order:1}.flex-items-xs-top{align-items:flex-start}.flex-items-xs-middle{align-items:center}.flex-items-xs-bottom{align-items:flex-end}.flex-xs-top{align-self:flex-start}.flex-xs-middle{align-self:center}.flex-xs-bottom{align-self:flex-end}.flex-items-xs-left{justify-content:flex-start}.flex-items-xs-center{justify-content:center}.flex-items-xs-right{justify-content:flex-end}.flex-items-xs-around{justify-content:space-around}.flex-items-xs-between{justify-content:space-between}@media(min-width:544px){.flex-sm-first{order:-1}.flex-sm-last{order:1}}@media(min-width:544px){.flex-items-sm-top{align-items:flex-start}.flex-items-sm-middle{align-items:center}.flex-items-sm-bottom{align-items:flex-end}}@media(min-width:544px){.flex-sm-top{align-self:flex-start}.flex-sm-middle{align-self:center}.flex-sm-bottom{align-self:flex-end}}@media(min-width:544px){.flex-items-sm-left{justify-content:flex-start}.flex-items-sm-center{justify-content:center}.flex-items-sm-right{justify-content:flex-end}.flex-items-sm-around{justify-content:space-around}.flex-items-sm-between{justify-content:space-between}}@media(min-width:768px){.flex-md-first{order:-1}.flex-md-last{order:1}}@media(min-width:768px){.flex-items-md-top{align-items:flex-start}.flex-items-md-middle{align-items:center}.flex-items-md-bottom{align-items:flex-end}}@media(min-width:768px){.flex-md-top{align-self:flex-start}.flex-md-middle{align-self:center}.flex-md-bottom{align-self:flex-end}}@media(min-width:768px){.flex-items-md-left{justify-content:flex-start}.flex-items-md-center{justify-content:center}.flex-items-md-right{justify-content:flex-end}.flex-items-md-around{justify-content:space-around}.flex-items-md-between{justify-content:space-between}}@media(min-width:992px){.flex-lg-first{order:-1}.flex-lg-last{order:1}}@media(min-width:992px){.flex-items-lg-top{align-items:flex-start}.flex-items-lg-middle{align-items:center}.flex-items-lg-bottom{align-items:flex-end}}@media(min-width:992px){.flex-lg-top{align-self:flex-start}.flex-lg-middle{align-self:center}.flex-lg-bottom{align-self:flex-end}}@media(min-width:992px){.flex-items-lg-left{justify-content:flex-start}.flex-items-lg-center{justify-content:center}.flex-items-lg-right{justify-content:flex-end}.flex-items-lg-around{justify-content:space-around}.flex-items-lg-between{justify-content:space-between}}@media(min-width:1200px){.flex-xl-first{order:-1}.flex-xl-last{order:1}}@media(min-width:1200px){.flex-items-xl-top{align-items:flex-start}.flex-items-xl-middle{align-items:center}.flex-items-xl-bottom{align-items:flex-end}}@media(min-width:1200px){.flex-xl-top{align-self:flex-start}.flex-xl-middle{align-self:center}.flex-xl-bottom{align-self:flex-end}}@media(min-width:1200px){.flex-items-xl-left{justify-content:flex-start}.flex-items-xl-center{justify-content:center}.flex-items-xl-right{justify-content:flex-end}.flex-items-xl-around{justify-content:space-around}.flex-items-xl-between{justify-content:space-between}}.tag-default{color:#fff!important;font-size:.8rem;padding-top:.1rem;padding-bottom:.1rem;white-space:nowrap;margin-right:3px;margin-bottom:.2rem;display:inline-block}.tag-default:hover{text-decoration:none}.tag-default.tag-outline{border:1px solid #ddd;color:#aaa!important;background:0 0!important}ul.tag-list{padding-left:0!important;display:inline-block;list-style:none!important}ul.tag-list li{display:inline-block!important}.navbar-brand{font-family:titillium web,sans-serif;font-size:1.5rem!important;padding-top:0!important;margin-right:2rem!important;color:#5cb85c!important}.nav-link .user-pic{height:26px;border-radius:50px;float:left;margin-right:5px}.nav-link:hover{transition:.1s all}.nav-pills.outline-active .nav-link{border-radius:0;border:none;border-bottom:2px solid transparent;background:0 0;color:#aaa}.nav-pills.outline-active .nav-link:hover{color:#555}.nav-pills.outline-active .nav-link.active{background:#fff!important;border-bottom:2px solid #5cb85c!important;color:#5cb85c!important}footer{background:#f3f3f3;margin-top:3rem;padding:1rem 0;position:absolute;bottom:0;width:100%}footer .logo-font{vertical-align:middle}footer .attribution{vertical-align:middle;margin-left:10px;font-size:.8rem;color:#bbb;font-weight:300}.error-messages{color:#b85c5c!important;font-weight:700}.banner{color:#fff;background:#333;padding:2rem;margin-bottom:2rem}.banner h1{text-shadow:0 1px 3px rgba(0,0,0,.3);margin-bottom:0}.container.page{margin-top:1.5rem}.preview-link{color:inherit!important}.preview-link:hover{text-decoration:inherit!important}.article-meta{display:block;position:relative;font-weight:300}.article-meta img{display:inline-block;vertical-align:middle;height:32px;width:32px;border-radius:30px}.article-meta .info{margin:0 1.5rem 0 .3rem;display:inline-block;vertical-align:middle;line-height:1rem}.article-meta .info .author{display:block;font-weight:500!important}.article-meta .info .date{color:#bbb;font-size:.8rem;display:block}.article-preview{border-top:1px solid rgba(0,0,0,.1);padding:1.5rem 0}.article-preview .article-meta{margin:0 0 1rem}.article-preview .preview-link h1{font-weight:600!important;font-size:1.5rem!important;margin-bottom:3px}.article-preview .preview-link p{font-weight:300;font-size:24px;color:#999;margin-bottom:15px;font-size:1rem;line-height:1.3rem}.article-preview .preview-link span{max-width:30%;font-size:.8rem;font-weight:300;color:#bbb;vertical-align:middle}.article-preview .preview-link ul{float:right;max-width:50%;vertical-align:top}.article-preview .preview-link ul li{font-weight:300;font-size:.8rem!important;padding-top:0!important;padding-bottom:0!important}.btn .counter{font-size:.8rem!important}.home-page .banner{background:#5cb85c;box-shadow:inset 0 8px 8px -8px rgba(0,0,0,.3),inset 0 -8px 8px -8px rgba(0,0,0,.3)}.home-page .banner p{color:#fff;text-align:center;font-size:1.5rem;font-weight:300!important;margin-bottom:0}.home-page .banner h1{text-shadow:0 1px 3px rgba(0,0,0,.3);font-weight:700!important;text-align:center;font-size:3.5rem;padding-bottom:.5rem}.home-page .feed-toggle{margin-bottom:-1px}.home-page .sidebar{padding:5px 10px 10px;background:#f3f3f3;border-radius:4px}.home-page .sidebar p{margin-bottom:.2rem}.article-page .banner{padding:2rem 0}.article-page .banner h1{font-size:2.8rem;font-weight:600}.article-page .banner .btn{opacity:.8}.article-page .banner .btn:hover{transition:.1s all;opacity:1}.article-page .banner .article-meta{margin:2rem 0 0}.article-page .banner .article-meta .author{color:#fff}.article-page .article-content p{font-family:'source serif pro',serif;font-size:1.2rem;line-height:1.8rem;margin-bottom:2rem}.article-page .article-content h1,.article-page .article-content h2,.article-page .article-content h3,.article-page .article-content h4,.article-page .article-content h5,.article-page .article-content h6{font-weight:500!important;margin:1.6rem 0 1rem}.article-page .article-actions{text-align:center;margin:1.5rem 0 3rem}.article-page .article-actions .article-meta .info{text-align:left}.article-page .comment-form .card-block{padding:0}.article-page .comment-form .card-block textarea{border:0;padding:1.25rem}.article-page .comment-form .card-footer .btn{font-weight:700;float:right}.article-page .comment-form .card-footer .comment-author-img{height:30px;width:30px}.article-page .card{border:1px solid #e5e5e5;box-shadow:none!important}.article-page .card .card-footer{border-top:1px solid #e5e5e5;box-shadow:none!important;font-size:.8rem;font-weight:300}.article-page .card .comment-author-img{display:inline-block;vertical-align:middle;height:20px;width:20px;border-radius:30px}.article-page .card .comment-author{display:inline-block;vertical-align:middle}.article-page .card .date-posted{display:inline-block;vertical-align:middle;margin-left:5px;color:#bbb}.article-page .card .mod-options{float:right;color:#333;font-size:1rem}.article-page .card .mod-options i{margin-left:5px;opacity:.6;cursor:pointer}.article-page .card .mod-options i:hover{opacity:1}.profile-page .user-info{text-align:center;background:#f3f3f3;padding:2rem 0 1rem}.profile-page .user-info .user-img{width:100px;height:100px;border-radius:100px;margin-bottom:1rem}.profile-page .user-info h4{font-weight:700}.profile-page .user-info p{margin:0 auto .5rem;color:#aaa;max-width:450px;font-weight:300}.profile-page .user-info .action-btn{float:right;color:#999;border:1px solid #999}.profile-page .articles-toggle{margin:1.5rem 0 -1px}.editor-page .tag-list i{font-size:.6rem;margin-right:5px;cursor:pointer} +* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)*//*!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{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]{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{*,*::before,*::after,*::first-letter,*::first-line{text-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.tag{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}@-ms-viewport{width:device-width;}html{font-size:16px;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}body{font-family:source sans pro,sans-serif;font-size:1rem;line-height:1.5;color:#373a3c;background-color:#fff}[tabindex="-1"]:focus{outline:none!important}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #818a91}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}a{color:#5ED9C3;text-decoration:none}a:focus,a:hover{color:#5ed9c29a;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:not([href]){color:inherit;text-decoration:none}a:not([href]):focus,a:not([href]):hover{color:inherit;text-decoration:none}a:not([href]):focus{outline:none}pre{margin-top:0;margin-bottom:1rem}figure{margin:0 0 1rem}img{vertical-align:middle}[role=button]{cursor:pointer}a,area,button,[role=button],input,label,select,summary,textarea{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}input,button,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:.5rem;font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1,.h1{font-size:2.5rem}h2,.h2{font-size:2rem}h3,.h3{font-size:1.75rem}h4,.h4{font-size:1.5rem}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}.lead{font-size:1.25rem;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.25rem;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"}.img-fluid,.carousel-inner>.carousel-item>img,.carousel-inner>.carousel-item>a>img{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;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:Menlo,Monaco,Consolas,liberation mono,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}@media(min-width:544px){.container{max-width:576px}}@media(min-width:768px){.container{max-width:720px}}@media(min-width:992px){.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}.row{display:flex;flex-wrap:wrap;margin-left:-15px;margin-right:-15px}.col-xs{position:relative;flex-basis:0;flex-grow:1;max-width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 8.33333%;max-width:8.33333%}.col-xs-2{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 16.66667%;max-width:16.66667%}.col-xs-3{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 25%;max-width:25%}.col-xs-4{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 33.33333%;max-width:33.33333%}.col-xs-5{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 41.66667%;max-width:41.66667%}.col-xs-6{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 50%;max-width:50%}.col-xs-7{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 58.33333%;max-width:58.33333%}.col-xs-8{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 66.66667%;max-width:66.66667%}.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 75%;max-width:75%}.col-xs-10{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 83.33333%;max-width:83.33333%}.col-xs-11{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 91.66667%;max-width:91.66667%}.col-xs-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 100%;max-width:100%}.pull-xs-0{right:auto}.pull-xs-1{right:8.33333%}.pull-xs-2{right:16.66667%}.pull-xs-3{right:25%}.pull-xs-4{right:33.33333%}.pull-xs-5{right:41.66667%}.pull-xs-6{right:50%}.pull-xs-7{right:58.33333%}.pull-xs-8{right:66.66667%}.pull-xs-9{right:75%}.pull-xs-10{right:83.33333%}.pull-xs-11{right:91.66667%}.pull-xs-12{right:100%}.push-xs-0{left:auto}.push-xs-1{left:8.33333%}.push-xs-2{left:16.66667%}.push-xs-3{left:25%}.push-xs-4{left:33.33333%}.push-xs-5{left:41.66667%}.push-xs-6{left:50%}.push-xs-7{left:58.33333%}.push-xs-8{left:66.66667%}.push-xs-9{left:75%}.push-xs-10{left:83.33333%}.push-xs-11{left:91.66667%}.push-xs-12{left:100%}.offset-xs-1{margin-left:8.33333%}.offset-xs-2{margin-left:16.66667%}.offset-xs-3{margin-left:25%}.offset-xs-4{margin-left:33.33333%}.offset-xs-5{margin-left:41.66667%}.offset-xs-6{margin-left:50%}.offset-xs-7{margin-left:58.33333%}.offset-xs-8{margin-left:66.66667%}.offset-xs-9{margin-left:75%}.offset-xs-10{margin-left:83.33333%}.offset-xs-11{margin-left:91.66667%}@media(min-width:544px){.col-sm{position:relative;flex-basis:0;flex-grow:1;max-width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col-sm-1{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 8.33333%;max-width:8.33333%}.col-sm-2{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 16.66667%;max-width:16.66667%}.col-sm-3{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 25%;max-width:25%}.col-sm-4{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 33.33333%;max-width:33.33333%}.col-sm-5{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 41.66667%;max-width:41.66667%}.col-sm-6{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 50%;max-width:50%}.col-sm-7{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 58.33333%;max-width:58.33333%}.col-sm-8{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 66.66667%;max-width:66.66667%}.col-sm-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 75%;max-width:75%}.col-sm-10{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 83.33333%;max-width:83.33333%}.col-sm-11{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 91.66667%;max-width:91.66667%}.col-sm-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 100%;max-width:100%}.pull-sm-0{right:auto}.pull-sm-1{right:8.33333%}.pull-sm-2{right:16.66667%}.pull-sm-3{right:25%}.pull-sm-4{right:33.33333%}.pull-sm-5{right:41.66667%}.pull-sm-6{right:50%}.pull-sm-7{right:58.33333%}.pull-sm-8{right:66.66667%}.pull-sm-9{right:75%}.pull-sm-10{right:83.33333%}.pull-sm-11{right:91.66667%}.pull-sm-12{right:100%}.push-sm-0{left:auto}.push-sm-1{left:8.33333%}.push-sm-2{left:16.66667%}.push-sm-3{left:25%}.push-sm-4{left:33.33333%}.push-sm-5{left:41.66667%}.push-sm-6{left:50%}.push-sm-7{left:58.33333%}.push-sm-8{left:66.66667%}.push-sm-9{left:75%}.push-sm-10{left:83.33333%}.push-sm-11{left:91.66667%}.push-sm-12{left:100%}.offset-sm-0{margin-left:0%}.offset-sm-1{margin-left:8.33333%}.offset-sm-2{margin-left:16.66667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333%}.offset-sm-5{margin-left:41.66667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333%}.offset-sm-8{margin-left:66.66667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333%}.offset-sm-11{margin-left:91.66667%}}@media(min-width:768px){.col-md{position:relative;flex-basis:0;flex-grow:1;max-width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col-md-1{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 8.33333%;max-width:8.33333%}.col-md-2{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 16.66667%;max-width:16.66667%}.col-md-3{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 25%;max-width:25%}.col-md-4{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 33.33333%;max-width:33.33333%}.col-md-5{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 41.66667%;max-width:41.66667%}.col-md-6{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 50%;max-width:50%}.col-md-7{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 58.33333%;max-width:58.33333%}.col-md-8{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 66.66667%;max-width:66.66667%}.col-md-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 75%;max-width:75%}.col-md-10{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 83.33333%;max-width:83.33333%}.col-md-11{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 91.66667%;max-width:91.66667%}.col-md-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 100%;max-width:100%}.pull-md-0{right:auto}.pull-md-1{right:8.33333%}.pull-md-2{right:16.66667%}.pull-md-3{right:25%}.pull-md-4{right:33.33333%}.pull-md-5{right:41.66667%}.pull-md-6{right:50%}.pull-md-7{right:58.33333%}.pull-md-8{right:66.66667%}.pull-md-9{right:75%}.pull-md-10{right:83.33333%}.pull-md-11{right:91.66667%}.pull-md-12{right:100%}.push-md-0{left:auto}.push-md-1{left:8.33333%}.push-md-2{left:16.66667%}.push-md-3{left:25%}.push-md-4{left:33.33333%}.push-md-5{left:41.66667%}.push-md-6{left:50%}.push-md-7{left:58.33333%}.push-md-8{left:66.66667%}.push-md-9{left:75%}.push-md-10{left:83.33333%}.push-md-11{left:91.66667%}.push-md-12{left:100%}.offset-md-0{margin-left:0%}.offset-md-1{margin-left:8.33333%}.offset-md-2{margin-left:16.66667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333%}.offset-md-5{margin-left:41.66667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333%}.offset-md-8{margin-left:66.66667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333%}.offset-md-11{margin-left:91.66667%}}@media(min-width:992px){.col-lg{position:relative;flex-basis:0;flex-grow:1;max-width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col-lg-1{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 8.33333%;max-width:8.33333%}.col-lg-2{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 16.66667%;max-width:16.66667%}.col-lg-3{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 25%;max-width:25%}.col-lg-4{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 33.33333%;max-width:33.33333%}.col-lg-5{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 41.66667%;max-width:41.66667%}.col-lg-6{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 50%;max-width:50%}.col-lg-7{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 58.33333%;max-width:58.33333%}.col-lg-8{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 66.66667%;max-width:66.66667%}.col-lg-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 75%;max-width:75%}.col-lg-10{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 83.33333%;max-width:83.33333%}.col-lg-11{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 91.66667%;max-width:91.66667%}.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 100%;max-width:100%}.pull-lg-0{right:auto}.pull-lg-1{right:8.33333%}.pull-lg-2{right:16.66667%}.pull-lg-3{right:25%}.pull-lg-4{right:33.33333%}.pull-lg-5{right:41.66667%}.pull-lg-6{right:50%}.pull-lg-7{right:58.33333%}.pull-lg-8{right:66.66667%}.pull-lg-9{right:75%}.pull-lg-10{right:83.33333%}.pull-lg-11{right:91.66667%}.pull-lg-12{right:100%}.push-lg-0{left:auto}.push-lg-1{left:8.33333%}.push-lg-2{left:16.66667%}.push-lg-3{left:25%}.push-lg-4{left:33.33333%}.push-lg-5{left:41.66667%}.push-lg-6{left:50%}.push-lg-7{left:58.33333%}.push-lg-8{left:66.66667%}.push-lg-9{left:75%}.push-lg-10{left:83.33333%}.push-lg-11{left:91.66667%}.push-lg-12{left:100%}.offset-lg-0{margin-left:0%}.offset-lg-1{margin-left:8.33333%}.offset-lg-2{margin-left:16.66667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333%}.offset-lg-5{margin-left:41.66667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333%}.offset-lg-8{margin-left:66.66667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333%}.offset-lg-11{margin-left:91.66667%}}@media(min-width:1200px){.col-xl{position:relative;flex-basis:0;flex-grow:1;max-width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col-xl-1{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 8.33333%;max-width:8.33333%}.col-xl-2{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 16.66667%;max-width:16.66667%}.col-xl-3{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 25%;max-width:25%}.col-xl-4{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 33.33333%;max-width:33.33333%}.col-xl-5{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 41.66667%;max-width:41.66667%}.col-xl-6{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 50%;max-width:50%}.col-xl-7{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 58.33333%;max-width:58.33333%}.col-xl-8{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 66.66667%;max-width:66.66667%}.col-xl-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 75%;max-width:75%}.col-xl-10{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 83.33333%;max-width:83.33333%}.col-xl-11{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 91.66667%;max-width:91.66667%}.col-xl-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 100%;max-width:100%}.pull-xl-0{right:auto}.pull-xl-1{right:8.33333%}.pull-xl-2{right:16.66667%}.pull-xl-3{right:25%}.pull-xl-4{right:33.33333%}.pull-xl-5{right:41.66667%}.pull-xl-6{right:50%}.pull-xl-7{right:58.33333%}.pull-xl-8{right:66.66667%}.pull-xl-9{right:75%}.pull-xl-10{right:83.33333%}.pull-xl-11{right:91.66667%}.pull-xl-12{right:100%}.push-xl-0{left:auto}.push-xl-1{left:8.33333%}.push-xl-2{left:16.66667%}.push-xl-3{left:25%}.push-xl-4{left:33.33333%}.push-xl-5{left:41.66667%}.push-xl-6{left:50%}.push-xl-7{left:58.33333%}.push-xl-8{left:66.66667%}.push-xl-9{left:75%}.push-xl-10{left:83.33333%}.push-xl-11{left:91.66667%}.push-xl-12{left:100%}.offset-xl-0{margin-left:0%}.offset-xl-1{margin-left:8.33333%}.offset-xl-2{margin-left:16.66667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333%}.offset-xl-5{margin-left:41.66667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333%}.offset-xl-8{margin-left:66.66667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333%}.offset-xl-11{margin-left:91.66667%}}.table{width:100%;max-width:100%;margin-bottom:1rem}.table th,.table td{padding:.75rem;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 th,.table-sm td{padding:.3rem}.table-bordered{border:1px solid #eceeef}.table-bordered th,.table-bordered td{border:1px solid #eceeef}.table-bordered thead th,.table-bordered thead td{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover tbody tr:hover{background-color:#f5f5f5}.table-active,.table-active>th,.table-active>td{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>th,.table-success>td{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>th,.table-info>td{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>th,.table-warning>td{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>th,.table-danger>td{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:#373a3c}.table-inverse.table-bordered{border:0}.table-inverse th,.table-inverse td,.table-inverse thead th{border-color:#55595c}.table-reflow thead{float:left}.table-reflow tbody{display:block;white-space:nowrap}.table-reflow th,.table-reflow td{border-top:1px solid #eceeef;border-left:1px solid #eceeef}.table-reflow th:last-child,.table-reflow td:last-child{border-right:1px solid #eceeef}.table-reflow thead:last-child tr:last-child th,.table-reflow thead:last-child tr:last-child td,.table-reflow tbody:last-child tr:last-child th,.table-reflow tbody:last-child tr:last-child td,.table-reflow tfoot:last-child tr:last-child th,.table-reflow tfoot:last-child tr:last-child td{border-bottom:1px solid #eceeef}.table-reflow tr{float:left}.table-reflow tr th,.table-reflow tr td{display:block!important;border:1px solid #eceeef}.form-control{display:block;width:100%;padding:.5rem .75rem;font-size:1rem;line-height:1.25;color:#55595c;background-color:#fff;background-image:none;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{border-color:#66afe9;outline:none}.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.5rem}.form-control-file,.form-control-range{display:block}.form-control-label{padding:.5rem .75rem;margin-bottom:0}.form-control-legend{padding:.5rem .75rem;margin-bottom:0;font-size:1rem}_::-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.5rem}_::-webkit-full-page-media.input-sm,.input-group-sm _::-webkit-full-page-media.form-control,input[type=date].input-sm,.input-group-sm input[type=date].form-control,input[type=time].input-sm,.input-group-sm input[type=time].form-control,input[type=datetime-local].input-sm,.input-group-sm input[type=datetime-local].form-control,input[type=month].input-sm,.input-group-sm input[type=month].form-control{line-height:1.8125rem}_::-webkit-full-page-media.input-lg,.input-group-lg _::-webkit-full-page-media.form-control,input[type=date].input-lg,.input-group-lg input[type=date].form-control,input[type=time].input-lg,.input-group-lg input[type=time].form-control,input[type=datetime-local].input-lg,.input-group-lg input[type=datetime-local].form-control,input[type=month].input-lg,.input-group-lg input[type=month].form-control{line-height:3.16667rem}.form-control-static{min-height:2.5rem;padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0}.form-control-static.form-control-sm,.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,.form-control-static.form-control-lg,.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{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}.radio,.checkbox{position:relative;display:block;margin-bottom:.75rem}.radio label,.checkbox label{padding-left:1.25rem;margin-bottom:0;cursor:pointer}.radio label input:only-child,.checkbox label input:only-child{position:static}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-top:.25rem;margin-left:-1.25rem}.radio+.radio,.checkbox+.checkbox{margin-top:-.25rem}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:1.25rem;margin-bottom:0;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:.75rem}input[type=radio]:disabled,input[type=radio].disabled,input[type=checkbox]:disabled,input[type=checkbox].disabled{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label{cursor:not-allowed}.form-control-success,.form-control-warning,.form-control-danger{padding-right:2.25rem;background-repeat:no-repeat;background-position:center right .625rem;background-size:1.25rem 1.25rem}.has-success .text-help,.has-success .form-control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label,.has-success .custom-control{color:#5ED9C3}.has-success .form-control{border-color:#5ED9C3}.has-success .input-group-addon{color:#5ED9C3;border-color:#5ED9C3;background-color:#eaf6ea}.has-success .form-control-feedback{color:#5ED9C3}.has-success .form-control-success{background-image:url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA4IDgnPjxwYXRoIGZpbGw9JyM1Y2I4NWMnIGQ9J00yLjMgNi43M0wuNiA0LjUzYy0uNC0xLjA0LjQ2LTEuNCAxLjEtLjhsMS4xIDEuNCAzLjQtMy44Yy42LS42MyAxLjYtLjI3IDEuMi43bC00IDQuNmMtLjQzLjUtLjguNC0xLjEuMXonLz48L3N2Zz4=)}.has-warning .text-help,.has-warning .form-control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label,.has-warning .custom-control{color:#f0ad4e}.has-warning .form-control{border-color:#f0ad4e}.has-warning .input-group-addon{color:#f0ad4e;border-color:#f0ad4e;background-color:#fff}.has-warning .form-control-feedback{color:#f0ad4e}.has-warning .form-control-warning{background-image:url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA4IDgnPjxwYXRoIGZpbGw9JyNmMGFkNGUnIGQ9J000LjQgNS4zMjRoLS44di0yLjQ2aC44em0wIDEuNDJoLS44VjUuODloLjh6TTMuNzYuNjNMLjA0IDcuMDc1Yy0uMTE1LjIuMDE2LjQyNS4yNi40MjZoNy4zOTdjLjI0MiAwIC4zNzItLjIyNi4yNTgtLjQyNkM2LjcyNiA0LjkyNCA1LjQ3IDIuNzkgNC4yNTMuNjNjLS4xMTMtLjE3NC0uMzktLjE3NC0uNDk0IDB6Jy8+PC9zdmc+)}.has-danger .text-help,.has-danger .form-control-label,.has-danger .radio,.has-danger .checkbox,.has-danger .radio-inline,.has-danger .checkbox-inline,.has-danger.radio label,.has-danger.checkbox label,.has-danger.radio-inline label,.has-danger.checkbox-inline label,.has-danger .custom-control{color:#b85c5c}.has-danger .form-control{border-color:#b85c5c}.has-danger .input-group-addon{color:#b85c5c;border-color:#b85c5c;background-color:#f6eaea}.has-danger .form-control-feedback{color:#b85c5c}.has-danger .form-control-danger{background-image:url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIGZpbGw9JyNkOTUzNGYnIHZpZXdCb3g9Jy0yIC0yIDcgNyc+PHBhdGggc3Ryb2tlPScjZDk1MzRmJyBkPSdNMCAwbDMgM20wLTNMMCAzJy8+PGNpcmNsZSByPScuNScvPjxjaXJjbGUgY3g9JzMnIHI9Jy41Jy8+PGNpcmNsZSBjeT0nMycgcj0nLjUnLz48Y2lyY2xlIGN4PSczJyBjeT0nMycgcj0nLjUnLz48L3N2Zz4=)}@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 .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .form-control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.btn{display:inline-block;font-weight:400;line-height:1.25;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;user-select:none;border:1px solid transparent;padding:.5rem 1rem;font-size:1rem;border-radius:.25rem}.btn:focus,.btn.focus,.btn:active:focus,.btn:active.focus,.btn.active:focus,.btn.active.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:#5ED9C3;border-color:#5ED9C3}.btn-primary:hover{color:#fff;background-color:#38b5b3;border-color:#419641}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#38b5b3;border-color:#419641}.btn-primary:active,.btn-primary.active,.open>.btn-primary.dropdown-toggle{color:#fff;background-color:#38b5b3;border-color:#419641;background-image:none}.btn-primary:active:hover,.btn-primary:active:focus,.btn-primary:active.focus,.btn-primary.active:hover,.btn-primary.active:focus,.btn-primary.active.focus,.open>.btn-primary.dropdown-toggle:hover,.open>.btn-primary.dropdown-toggle:focus,.open>.btn-primary.dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#2d672d}.btn-primary.disabled:focus,.btn-primary.disabled.focus,.btn-primary:disabled:focus,.btn-primary:disabled.focus{background-color:#5ED9C3;border-color:#5ED9C3}.btn-primary.disabled:hover,.btn-primary:disabled:hover{background-color:#5ED9C3;border-color:#5ED9C3}.btn-secondary{color:#373a3c;background-color:#fff;border-color:#ccc}.btn-secondary:hover{color:#373a3c;background-color:#e6e6e6;border-color:#adadad}.btn-secondary:focus,.btn-secondary.focus{color:#373a3c;background-color:#e6e6e6;border-color:#adadad}.btn-secondary:active,.btn-secondary.active,.open>.btn-secondary.dropdown-toggle{color:#373a3c;background-color:#e6e6e6;border-color:#adadad;background-image:none}.btn-secondary:active:hover,.btn-secondary:active:focus,.btn-secondary:active.focus,.btn-secondary.active:hover,.btn-secondary.active:focus,.btn-secondary.active.focus,.open>.btn-secondary.dropdown-toggle:hover,.open>.btn-secondary.dropdown-toggle:focus,.open>.btn-secondary.dropdown-toggle.focus{color:#373a3c;background-color:#d4d4d4;border-color:#8c8c8c}.btn-secondary.disabled:focus,.btn-secondary.disabled.focus,.btn-secondary:disabled:focus,.btn-secondary:disabled.focus{background-color:#fff;border-color:#ccc}.btn-secondary.disabled:hover,.btn-secondary:disabled:hover{background-color:#fff;border-color:#ccc}.btn-info{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#2aabd2}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#2aabd2}.btn-info:active,.btn-info.active,.open>.btn-info.dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#2aabd2;background-image:none}.btn-info:active:hover,.btn-info:active:focus,.btn-info:active.focus,.btn-info.active:hover,.btn-info.active:focus,.btn-info.active.focus,.open>.btn-info.dropdown-toggle:hover,.open>.btn-info.dropdown-toggle:focus,.open>.btn-info.dropdown-toggle.focus{color:#fff;background-color:#269abc;border-color:#1f7e9a}.btn-info.disabled:focus,.btn-info.disabled.focus,.btn-info:disabled:focus,.btn-info:disabled.focus{background-color:#5bc0de;border-color:#5bc0de}.btn-info.disabled:hover,.btn-info:disabled:hover{background-color:#5bc0de;border-color:#5bc0de}.btn-success{color:#fff;background-color:#5ED9C3;border-color:#5ED9C3}.btn-success:hover{color:#fff;background-color:#38b5b3;border-color:#419641}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#38b5b3;border-color:#419641}.btn-success:active,.btn-success.active,.open>.btn-success.dropdown-toggle{color:#fff;background-color:#38b5b3;border-color:#419641;background-image:none}.btn-success:active:hover,.btn-success:active:focus,.btn-success:active.focus,.btn-success.active:hover,.btn-success.active:focus,.btn-success.active.focus,.open>.btn-success.dropdown-toggle:hover,.open>.btn-success.dropdown-toggle:focus,.open>.btn-success.dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#2d672d}.btn-success.disabled:focus,.btn-success.disabled.focus,.btn-success:disabled:focus,.btn-success:disabled.focus{background-color:#5ED9C3;border-color:#5ED9C3}.btn-success.disabled:hover,.btn-success:disabled:hover{background-color:#5ED9C3;border-color:#5ED9C3}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#eb9316}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#eb9316}.btn-warning:active,.btn-warning.active,.open>.btn-warning.dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#eb9316;background-image:none}.btn-warning:active:hover,.btn-warning:active:focus,.btn-warning:active.focus,.btn-warning.active:hover,.btn-warning.active:focus,.btn-warning.active.focus,.open>.btn-warning.dropdown-toggle:hover,.open>.btn-warning.dropdown-toggle:focus,.open>.btn-warning.dropdown-toggle.focus{color:#fff;background-color:#d58512;border-color:#b06d0f}.btn-warning.disabled:focus,.btn-warning.disabled.focus,.btn-warning:disabled:focus,.btn-warning:disabled.focus{background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning.disabled:hover,.btn-warning:disabled:hover{background-color:#f0ad4e;border-color:#f0ad4e}.btn-danger{color:#fff;background-color:#b85c5c;border-color:#b85c5c}.btn-danger:hover{color:#fff;background-color:#9d4444;border-color:#964141}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#9d4444;border-color:#964141}.btn-danger:active,.btn-danger.active,.open>.btn-danger.dropdown-toggle{color:#fff;background-color:#9d4444;border-color:#964141;background-image:none}.btn-danger:active:hover,.btn-danger:active:focus,.btn-danger:active.focus,.btn-danger.active:hover,.btn-danger.active:focus,.btn-danger.active.focus,.open>.btn-danger.dropdown-toggle:hover,.open>.btn-danger.dropdown-toggle:focus,.open>.btn-danger.dropdown-toggle.focus{color:#fff;background-color:#843939;border-color:#672d2d}.btn-danger.disabled:focus,.btn-danger.disabled.focus,.btn-danger:disabled:focus,.btn-danger:disabled.focus{background-color:#b85c5c;border-color:#b85c5c}.btn-danger.disabled:hover,.btn-danger:disabled:hover{background-color:#b85c5c;border-color:#b85c5c}.btn-outline-primary{color:#5ED9C3;background-image:none;background-color:transparent;border-color:#5ED9C3}.btn-outline-primary:hover{color:#fff;background-color:#5ED9C3;border-color:#5ED9C3}.btn-outline-primary:focus,.btn-outline-primary.focus{color:#fff;background-color:#5ED9C3;border-color:#5ED9C3}.btn-outline-primary:active,.btn-outline-primary.active,.open>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#5ED9C3;border-color:#5ED9C3}.btn-outline-primary:active:hover,.btn-outline-primary:active:focus,.btn-outline-primary:active.focus,.btn-outline-primary.active:hover,.btn-outline-primary.active:focus,.btn-outline-primary.active.focus,.open>.btn-outline-primary.dropdown-toggle:hover,.open>.btn-outline-primary.dropdown-toggle:focus,.open>.btn-outline-primary.dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#2d672d}.btn-outline-primary.disabled:focus,.btn-outline-primary.disabled.focus,.btn-outline-primary:disabled:focus,.btn-outline-primary:disabled.focus{border-color:#a3d7a3}.btn-outline-primary.disabled:hover,.btn-outline-primary:disabled:hover{border-color:#a3d7a3}.btn-outline-secondary{color:#ccc;background-image:none;background-color:transparent;border-color:#ccc}.btn-outline-secondary:hover{color:#fff;background-color:#ccc;border-color:#ccc}.btn-outline-secondary:focus,.btn-outline-secondary.focus{color:#fff;background-color:#ccc;border-color:#ccc}.btn-outline-secondary:active,.btn-outline-secondary.active,.open>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#ccc;border-color:#ccc}.btn-outline-secondary:active:hover,.btn-outline-secondary:active:focus,.btn-outline-secondary:active.focus,.btn-outline-secondary.active:hover,.btn-outline-secondary.active:focus,.btn-outline-secondary.active.focus,.open>.btn-outline-secondary.dropdown-toggle:hover,.open>.btn-outline-secondary.dropdown-toggle:focus,.open>.btn-outline-secondary.dropdown-toggle.focus{color:#fff;background-color:#a1a1a1;border-color:#8c8c8c}.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:#5bc0de;background-image:none;background-color:transparent;border-color:#5bc0de}.btn-outline-info:hover{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-info:focus,.btn-outline-info.focus{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-info:active,.btn-outline-info.active,.open>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-info:active:hover,.btn-outline-info:active:focus,.btn-outline-info:active.focus,.btn-outline-info.active:hover,.btn-outline-info.active:focus,.btn-outline-info.active.focus,.open>.btn-outline-info.dropdown-toggle:hover,.open>.btn-outline-info.dropdown-toggle:focus,.open>.btn-outline-info.dropdown-toggle.focus{color:#fff;background-color:#269abc;border-color:#1f7e9a}.btn-outline-info.disabled:focus,.btn-outline-info.disabled.focus,.btn-outline-info:disabled:focus,.btn-outline-info:disabled.focus{border-color:#b0e1ef}.btn-outline-info.disabled:hover,.btn-outline-info:disabled:hover{border-color:#b0e1ef}.btn-outline-success{color:#5ED9C3;background-image:none;background-color:transparent;border-color:#5ED9C3}.btn-outline-success:hover{color:#fff;background-color:#5ED9C3;border-color:#5ED9C3}.btn-outline-success:focus,.btn-outline-success.focus{color:#fff;background-color:#5ED9C3;border-color:#5ED9C3}.btn-outline-success:active,.btn-outline-success.active,.open>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#5ED9C3;border-color:#5ED9C3}.btn-outline-success:active:hover,.btn-outline-success:active:focus,.btn-outline-success:active.focus,.btn-outline-success.active:hover,.btn-outline-success.active:focus,.btn-outline-success.active.focus,.open>.btn-outline-success.dropdown-toggle:hover,.open>.btn-outline-success.dropdown-toggle:focus,.open>.btn-outline-success.dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#2d672d}.btn-outline-success.disabled:focus,.btn-outline-success.disabled.focus,.btn-outline-success:disabled:focus,.btn-outline-success:disabled.focus{border-color:#a3d7a3}.btn-outline-success.disabled:hover,.btn-outline-success:disabled:hover{border-color:#a3d7a3}.btn-outline-warning{color:#f0ad4e;background-image:none;background-color:transparent;border-color:#f0ad4e}.btn-outline-warning:hover{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-warning:focus,.btn-outline-warning.focus{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-warning:active,.btn-outline-warning.active,.open>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-warning:active:hover,.btn-outline-warning:active:focus,.btn-outline-warning:active.focus,.btn-outline-warning.active:hover,.btn-outline-warning.active:focus,.btn-outline-warning.active.focus,.open>.btn-outline-warning.dropdown-toggle:hover,.open>.btn-outline-warning.dropdown-toggle:focus,.open>.btn-outline-warning.dropdown-toggle.focus{color:#fff;background-color:#d58512;border-color:#b06d0f}.btn-outline-warning.disabled:focus,.btn-outline-warning.disabled.focus,.btn-outline-warning:disabled:focus,.btn-outline-warning:disabled.focus{border-color:#f8d9ac}.btn-outline-warning.disabled:hover,.btn-outline-warning:disabled:hover{border-color:#f8d9ac}.btn-outline-danger{color:#b85c5c;background-image:none;background-color:transparent;border-color:#b85c5c}.btn-outline-danger:hover{color:#fff;background-color:#b85c5c;border-color:#b85c5c}.btn-outline-danger:focus,.btn-outline-danger.focus{color:#fff;background-color:#b85c5c;border-color:#b85c5c}.btn-outline-danger:active,.btn-outline-danger.active,.open>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#b85c5c;border-color:#b85c5c}.btn-outline-danger:active:hover,.btn-outline-danger:active:focus,.btn-outline-danger:active.focus,.btn-outline-danger.active:hover,.btn-outline-danger.active:focus,.btn-outline-danger.active.focus,.open>.btn-outline-danger.dropdown-toggle:hover,.open>.btn-outline-danger.dropdown-toggle:focus,.open>.btn-outline-danger.dropdown-toggle.focus{color:#fff;background-color:#843939;border-color:#672d2d}.btn-outline-danger.disabled:focus,.btn-outline-danger.disabled.focus,.btn-outline-danger:disabled:focus,.btn-outline-danger:disabled.focus{border-color:#d7a3a3}.btn-outline-danger.disabled:hover,.btn-outline-danger:disabled:hover{border-color:#d7a3a3}.btn-link{font-weight:400;color:#5ED9C3;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link:disabled{background-color:transparent}.btn-link,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#3d8b3d;text-decoration:underline;background-color:transparent}.btn-link:disabled:focus,.btn-link:disabled:hover{color:#818a91;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:.75rem 1.5rem;font-size:1.25rem;border-radius:.3rem}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;transition-timing-function:ease;transition-duration:.35s;transition-property:height}.dropup,.dropdown{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:1rem;color:#373a3c;text-align:left;list-style:none;background-color:#fff;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:#5ED9C3;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>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:hover,.btn-group-vertical>.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>.btn-lg+.dropdown-toggle,.btn-group-lg.btn-group>.btn+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn .caret{margin-left:0}.btn-lg .caret,.btn-group-lg>.btn .caret{border-width:.3em .3em 0;border-bottom-width:0}.dropup .btn-lg .caret,.dropup .btn-group-lg>.btn .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=radio],[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;width:100%;display:flex}.input-group .form-control{position:relative;z-index:2;flex:1;margin-bottom:0}.input-group .form-control:focus,.input-group .form-control:active,.input-group .form-control:hover{z-index:3}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{white-space:nowrap;vertical-align:middle}.input-group-addon{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;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=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:not(:last-child),.input-group-addon:not(:last-child),.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group>.btn,.input-group-btn:not(:last-child)>.dropdown-toggle,.input-group-btn:not(:first-child)>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:not(:first-child)>.btn-group:not(:last-child)>.btn{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:not(:first-child),.input-group-btn:not(:last-child)>.btn-group:not(:first-child)>.btn{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:focus,.input-group-btn>.btn:active,.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:focus,.input-group-btn:not(:first-child)>.btn:active,.input-group-btn:not(:first-child)>.btn:hover,.input-group-btn:not(:first-child)>.btn-group:focus,.input-group-btn:not(:first-child)>.btn-group:active,.input-group-btn:not(:first-child)>.btn-group:hover{z-index:3}.custom-control{position:relative;display:inline;padding-left:1.5rem;cursor:pointer}.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{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;user-select:none;background-color:#ddd;background-repeat:no-repeat;background-position:center center;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;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA4IDgnPjxwYXRoIGZpbGw9JyNmZmYnIGQ9J002LjU2NC43NWwtMy41OSAzLjYxMi0xLjUzOC0xLjU1TDAgNC4yNiAyLjk3NCA3LjI1IDggMi4xOTN6Jy8+PC9zdmc+)}.custom-checkbox .custom-control-input:indeterminate~.custom-control-indicator{background-color:#0074d9;background-image:url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA0IDQnPjxwYXRoIHN0cm9rZT0nI2ZmZicgZD0nTTAgMmg0Jy8+PC9zdmc+)}.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;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9Jy00IC00IDggOCc+PGNpcmNsZSByPSczJyBmaWxsPScjZmZmJy8+PC9zdmc+)}.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;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA0IDUnPjxwYXRoIGZpbGw9JyMzMzMnIGQ9J00yIDBMMCAyaDR6bTAgNUwwIDNoNHonLz48L3N2Zz4=) no-repeat right .75rem center;background-image:none \9;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:none}.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;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}.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-link.active,.nav-tabs .nav-link.active:focus,.nav-tabs .nav-link.active:hover,.nav-tabs .nav-item.open .nav-link,.nav-tabs .nav-item.open .nav-link:focus,.nav-tabs .nav-item.open .nav-link: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-link.active,.nav-pills .nav-link.active:focus,.nav-pills .nav-link.active:hover,.nav-pills .nav-item.open .nav-link,.nav-pills .nav-item.open .nav-link:focus,.nav-pills .nav-item.open .nav-link:hover{color:#fff;cursor:default;background-color:#5ED9C3}.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-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media(min-width:544px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0}.navbar-fixed-bottom{bottom:0}.navbar-sticky-top{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:992px){.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 .open>.nav-link,.navbar-light .navbar-nav .open>.nav-link:focus,.navbar-light .navbar-nav .open>.nav-link:hover,.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.open,.navbar-light .navbar-nav .nav-link.open:focus,.navbar-light .navbar-nav .nav-link.open:hover,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.active:focus,.navbar-light .navbar-nav .nav-link.active: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 .open>.nav-link,.navbar-dark .navbar-nav .open>.nav-link:focus,.navbar-dark .navbar-nav .open>.nav-link:hover,.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.open,.navbar-dark .navbar-nav .nav-link.open:focus,.navbar-dark .navbar-nav .nav-link.open:hover,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.active:focus,.navbar-dark .navbar-nav .nav-link.active: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;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;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{height:67px;padding:.75rem 1.25rem;background-color:#f5f5f5;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:#5ED9C3;border-color:#5ED9C3}.card-success{background-color:#5ED9C3;border-color:#5ED9C3}.card-info{background-color:#5bc0de;border-color:#5bc0de}.card-warning{background-color:#f0ad4e;border-color:#f0ad4e}.card-danger{background-color:#b85c5c;border-color:#b85c5c}.card-outline-primary{background-color:transparent;border-color:#5ED9C3}.card-outline-secondary{background-color:transparent;border-color:#ccc}.card-outline-info{background-color:transparent;border-color:#5bc0de}.card-outline-success{background-color:transparent;border-color:#5ED9C3}.card-outline-warning{background-color:transparent;border-color:#f0ad4e}.card-outline-danger{background-color:transparent;border-color:#b85c5c}.card-inverse .card-header,.card-inverse .card-footer{border-bottom:1px solid rgba(255,255,255,.2)}.card-inverse .card-header,.card-inverse .card-footer,.card-inverse .card-title,.card-inverse .card-blockquote{color:#fff}.card-inverse .card-link,.card-inverse .card-text,.card-inverse .card-blockquote>footer{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:flex;flex-flow:row wrap;margin-right:-.625rem;margin-left:-.625rem}.card-deck .card{flex:1 0 0;margin-right:.625rem;margin-left:.625rem}}@media(min-width:544px){.card-group{display:flex;flex-flow:row wrap}.card-group .card{flex:1 0 0}.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-top,.card-group .card:not(:first-child):not(:last-child) .card-img-bottom{border-radius:0}}@media(min-width:544px){.card-columns{column-count:3;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:#5ED9C3;border-color:#5ED9C3}.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:#5ED9C3;text-decoration:none;background-color:#fff;border:1px solid #ddd}.page-link:focus,.page-link:hover{color:#3d8b3d;background-color:#eceeef;border-color:#ddd}.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}.tag{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}.tag:empty{display:none}.btn .tag{position:relative;top:-1px}a.tag:focus,a.tag:hover{color:#fff;text-decoration:none;cursor:pointer}.tag-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.tag-default{background-color:#818a91}.tag-default[href]:focus,.tag-default[href]:hover{background-color:#687077}.tag-primary{background-color:#5ED9C3}.tag-primary[href]:focus,.tag-primary[href]:hover{background-color:#38b5b3}.tag-success{background-color:#5ED9C3}.tag-success[href]:focus,.tag-success[href]:hover{background-color:#38b5b3}.tag-info{background-color:#5bc0de}.tag-info[href]:focus,.tag-info[href]:hover{background-color:#31b0d5}.tag-warning{background-color:#f0ad4e}.tag-warning[href]:focus,.tag-warning[href]:hover{background-color:#ec971f}.tag-danger{background-color:#b85c5c}.tag-danger[href]:focus,.tag-danger[href]:hover{background-color:#9d4444}.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}@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;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}base::-moz-progress-bar,.progress[value]{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:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-striped[value]::-moz-progress-bar{background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-striped[value]::-ms-fill{background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}@media screen and (min-width:0\0){.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}}.progress-animated[value]::-webkit-progress-value{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{animation:progress-bar-stripes 2s linear infinite}}.progress-success[value]::-webkit-progress-value{background-color:#5ED9C3}.progress-success[value]::-moz-progress-bar{background-color:#5ED9C3}.progress-success[value]::-ms-fill{background-color:#5ED9C3}@media screen and (min-width:0\0){.progress-success .progress-bar{background-color:#5ED9C3}}.progress-info[value]::-webkit-progress-value{background-color:#5bc0de}.progress-info[value]::-moz-progress-bar{background-color:#5bc0de}.progress-info[value]::-ms-fill{background-color:#5bc0de}@media screen and (min-width:0\0){.progress-info .progress-bar{background-color:#5bc0de}}.progress-warning[value]::-webkit-progress-value{background-color:#f0ad4e}.progress-warning[value]::-moz-progress-bar{background-color:#f0ad4e}.progress-warning[value]::-ms-fill{background-color:#f0ad4e}@media screen and (min-width:0\0){.progress-warning .progress-bar{background-color:#f0ad4e}}.progress-danger[value]::-webkit-progress-value{background-color:#b85c5c}.progress-danger[value]::-moz-progress-bar{background-color:#b85c5c}.progress-danger[value]::-ms-fill{background-color:#b85c5c}@media screen and (min-width:0\0){.progress-danger .progress-bar{background-color:#b85c5c}}.media{display:flex;margin-bottom:1rem}.media-body{flex:1}.media-middle{align-self:center}.media-bottom{align-self:flex-end}.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:#5ED9C3;border-color:#5ED9C3}.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:#eaf6ea}.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 iframe,.embed-responsive embed,.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.85714%}.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.5rem;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{transition:transform .3s ease-out;transform:translate(0,-25%)}.modal.in .modal-dialog{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;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.5}.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:992px){.modal-lg{max-width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:source sans pro,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;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.tooltip-top,.tooltip.bs-tether-element-attached-bottom{padding:5px 0;margin-top:-3px}.tooltip.tooltip-top .tooltip-arrow,.tooltip.bs-tether-element-attached-bottom .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.tooltip-right,.tooltip.bs-tether-element-attached-left{padding:0 5px;margin-left:3px}.tooltip.tooltip-right .tooltip-arrow,.tooltip.bs-tether-element-attached-left .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.tooltip-bottom,.tooltip.bs-tether-element-attached-top{padding:5px 0;margin-top:3px}.tooltip.tooltip-bottom .tooltip-arrow,.tooltip.bs-tether-element-attached-top .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.tooltip-left,.tooltip.bs-tether-element-attached-right{padding:0 5px;margin-left:-3px}.tooltip.tooltip-left .tooltip-arrow,.tooltip.bs-tether-element-attached-right .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:source sans pro,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;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;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover.popover-top,.popover.bs-tether-element-attached-bottom{margin-top:-10px}.popover.popover-top .popover-arrow,.popover.bs-tether-element-attached-bottom .popover-arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.popover-top .popover-arrow::after,.popover.bs-tether-element-attached-bottom .popover-arrow::after{bottom:1px;margin-left:-10px;content:"";border-top-color:#fff;border-bottom-width:0}.popover.popover-right,.popover.bs-tether-element-attached-left{margin-left:10px}.popover.popover-right .popover-arrow,.popover.bs-tether-element-attached-left .popover-arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.popover-right .popover-arrow::after,.popover.bs-tether-element-attached-left .popover-arrow::after{bottom:-10px;left:1px;content:"";border-right-color:#fff;border-left-width:0}.popover.popover-bottom,.popover.bs-tether-element-attached-top{margin-top:10px}.popover.popover-bottom .popover-arrow,.popover.bs-tether-element-attached-top .popover-arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:rgba(0,0,0,.25)}.popover.popover-bottom .popover-arrow::after,.popover.bs-tether-element-attached-top .popover-arrow::after{top:1px;margin-left:-10px;content:"";border-top-width:0;border-bottom-color:#fff}.popover.popover-left,.popover.bs-tether-element-attached-right{margin-left:-10px}.popover.popover-left .popover-arrow,.popover.bs-tether-element-attached-right .popover-arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:rgba(0,0,0,.25)}.popover.popover-left .popover-arrow::after,.popover.bs-tether-element-attached-right .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:1rem;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;transition:.6s ease-in-out left}.carousel-inner>.carousel-item>img,.carousel-inner>.carousel-item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.carousel-item{transition:transform .6s ease-in-out;backface-visibility:hidden;perspective:1000px}.carousel-inner>.carousel-item.next,.carousel-inner>.carousel-item.active.right{left:0;transform:translate3d(100%,0,0)}.carousel-inner>.carousel-item.prev,.carousel-inner>.carousel-item.active.left{left:0;transform:translate3d(-100%,0,0)}.carousel-inner>.carousel-item.next.left,.carousel-inner>.carousel-item.prev.right,.carousel-inner>.carousel-item.active{left: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:linear-gradient(to right,rgba(0,0,0,0.5) 0%,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0%,rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control .icon-prev,.carousel-control .icon-next{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-prev,.carousel-control .icon-next{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{color:#fff!important;background-color:#5ED9C3!important}a.bg-primary:focus,a.bg-primary:hover{background-color:#38b5b3!important}.bg-success{color:#fff!important;background-color:#5ED9C3!important}a.bg-success:focus,a.bg-success:hover{background-color:#38b5b3!important}.bg-info{color:#fff!important;background-color:#5bc0de!important}a.bg-info:focus,a.bg-info:hover{background-color:#31b0d5!important}.bg-warning{color:#fff!important;background-color:#f0ad4e!important}a.bg-warning:focus,a.bg-warning:hover{background-color:#ec971f!important}.bg-danger{color:#fff!important;background-color:#b85c5c!important}a.bg-danger:focus,a.bg-danger:hover{background-color:#9d4444!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:992px){.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!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!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!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!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}.p-a-0{padding: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!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!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!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}.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:992px){.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:#5ED9C3!important}a.text-primary:focus,a.text-primary:hover{color:#38b5b3}.text-success{color:#5ED9C3!important}a.text-success:focus,a.text-success:hover{color:#38b5b3}.text-info{color:#5bc0de!important}a.text-info:focus,a.text-info:hover{color:#31b0d5}.text-warning{color:#f0ad4e!important}a.text-warning:focus,a.text-warning:hover{color:#ec971f}.text-danger{color:#b85c5c!important}a.text-danger:focus,a.text-danger:hover{color:#9d4444}.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:991px){.hidden-md-down{display:none!important}}@media(min-width:992px){.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}}.flex-xs-first{order:-1}.flex-xs-last{order:1}.flex-items-xs-top{align-items:flex-start}.flex-items-xs-middle{align-items:center}.flex-items-xs-bottom{align-items:flex-end}.flex-xs-top{align-self:flex-start}.flex-xs-middle{align-self:center}.flex-xs-bottom{align-self:flex-end}.flex-items-xs-left{justify-content:flex-start}.flex-items-xs-center{justify-content:center}.flex-items-xs-right{justify-content:flex-end}.flex-items-xs-around{justify-content:space-around}.flex-items-xs-between{justify-content:space-between}@media(min-width:544px){.flex-sm-first{order:-1}.flex-sm-last{order:1}}@media(min-width:544px){.flex-items-sm-top{align-items:flex-start}.flex-items-sm-middle{align-items:center}.flex-items-sm-bottom{align-items:flex-end}}@media(min-width:544px){.flex-sm-top{align-self:flex-start}.flex-sm-middle{align-self:center}.flex-sm-bottom{align-self:flex-end}}@media(min-width:544px){.flex-items-sm-left{justify-content:flex-start}.flex-items-sm-center{justify-content:center}.flex-items-sm-right{justify-content:flex-end}.flex-items-sm-around{justify-content:space-around}.flex-items-sm-between{justify-content:space-between}}@media(min-width:768px){.flex-md-first{order:-1}.flex-md-last{order:1}}@media(min-width:768px){.flex-items-md-top{align-items:flex-start}.flex-items-md-middle{align-items:center}.flex-items-md-bottom{align-items:flex-end}}@media(min-width:768px){.flex-md-top{align-self:flex-start}.flex-md-middle{align-self:center}.flex-md-bottom{align-self:flex-end}}@media(min-width:768px){.flex-items-md-left{justify-content:flex-start}.flex-items-md-center{justify-content:center}.flex-items-md-right{justify-content:flex-end}.flex-items-md-around{justify-content:space-around}.flex-items-md-between{justify-content:space-between}}@media(min-width:992px){.flex-lg-first{order:-1}.flex-lg-last{order:1}}@media(min-width:992px){.flex-items-lg-top{align-items:flex-start}.flex-items-lg-middle{align-items:center}.flex-items-lg-bottom{align-items:flex-end}}@media(min-width:992px){.flex-lg-top{align-self:flex-start}.flex-lg-middle{align-self:center}.flex-lg-bottom{align-self:flex-end}}@media(min-width:992px){.flex-items-lg-left{justify-content:flex-start}.flex-items-lg-center{justify-content:center}.flex-items-lg-right{justify-content:flex-end}.flex-items-lg-around{justify-content:space-around}.flex-items-lg-between{justify-content:space-between}}@media(min-width:1200px){.flex-xl-first{order:-1}.flex-xl-last{order:1}}@media(min-width:1200px){.flex-items-xl-top{align-items:flex-start}.flex-items-xl-middle{align-items:center}.flex-items-xl-bottom{align-items:flex-end}}@media(min-width:1200px){.flex-xl-top{align-self:flex-start}.flex-xl-middle{align-self:center}.flex-xl-bottom{align-self:flex-end}}@media(min-width:1200px){.flex-items-xl-left{justify-content:flex-start}.flex-items-xl-center{justify-content:center}.flex-items-xl-right{justify-content:flex-end}.flex-items-xl-around{justify-content:space-around}.flex-items-xl-between{justify-content:space-between}}.tag-default{color:#fff!important;font-size:.8rem;padding-top:.1rem;padding-bottom:.1rem;white-space:nowrap;margin-right:3px;margin-bottom:.2rem;display:inline-block}.tag-default:hover{text-decoration:none}.tag-default.tag-outline{border:1px solid #ddd;color:#aaa!important;background:0 0!important}ul.tag-list{padding-left:0!important;display:inline-block;list-style:none!important}ul.tag-list li{display:inline-block!important}.navbar-brand{font-family:titillium web,sans-serif;font-size:1.5rem!important;padding-top:0!important;margin-right:2rem!important;color:#5ED9C3!important}.nav-link .user-pic{height:26px;border-radius:50px;float:left;margin-right:5px}.nav-link:hover{transition:.1s all}.nav-pills.outline-active .nav-link{border-radius:0;border:none;border-bottom:2px solid transparent;background:0 0;color:#aaa}.nav-pills.outline-active .nav-link:hover{color:#555}.nav-pills.outline-active .nav-link.active{background:#fff!important;border-bottom:2px solid #5ED9C3!important;color:#5ED9C3!important}footer{background:#f3f3f3;margin-top:3rem;padding:1rem 0;position:absolute;bottom:0;width:100%}footer .logo-font{vertical-align:middle}footer .attribution{vertical-align:middle;margin-left:10px;font-size:.8rem;color:#bbb;font-weight:300}.error-messages{color:#b85c5c!important;font-weight:700}.banner{color:#fff;background:#333;padding:2rem;margin-bottom:2rem}.banner h1{text-shadow:0 1px 3px rgba(0,0,0,.3);margin-bottom:0}.container.page{margin-top:1.5rem}.preview-link{color:inherit!important}.preview-link:hover{text-decoration:inherit!important}.article-meta{display:block;position:relative;font-weight:300}.article-meta img{display:inline-block;vertical-align:middle;height:32px;width:32px;border-radius:30px}.article-meta .info{margin:0 1.5rem 0 .3rem;display:inline-block;vertical-align:middle;line-height:1rem}.article-meta .info .author{display:block;font-weight:500!important}.article-meta .info .date{color:#bbb;font-size:.8rem;display:block}.article-preview{border-top:1px solid rgba(0,0,0,.1);padding:1.5rem 0}.article-preview .article-meta{margin:0 0 1rem}.article-preview .preview-link h1{font-weight:600!important;font-size:1.5rem!important;margin-bottom:3px}.article-preview .preview-link p{font-weight:300;font-size:24px;color:#999;margin-bottom:15px;font-size:1rem;line-height:1.3rem}.article-preview .preview-link span{max-width:30%;font-size:.8rem;font-weight:300;color:#bbb;vertical-align:middle}.article-preview .preview-link ul{float:right;max-width:50%;vertical-align:top}.article-preview .preview-link ul li{font-weight:300;font-size:.8rem!important;padding-top:0!important;padding-bottom:0!important}.btn .counter{font-size:.8rem!important}.home-page .banner{background:#5ED9C3;box-shadow:inset 0 8px 8px -8px rgba(0,0,0,.3),inset 0 -8px 8px -8px rgba(0,0,0,.3)}.home-page .banner p{color:#fff;text-align:center;font-size:1.5rem;font-weight:300!important;margin-bottom:0}.home-page .banner h1{text-shadow:0 1px 3px rgba(0,0,0,.3);font-weight:700!important;text-align:center;font-size:3.5rem;padding-bottom:.5rem}.home-page .feed-toggle{margin-bottom:-1px}.home-page .sidebar{padding:5px 10px 10px;background:#f3f3f3;border-radius:4px}.home-page .sidebar p{margin-bottom:.2rem}.article-page .banner{padding:2rem 0}.article-page .banner h1{font-size:2.8rem;font-weight:600}.article-page .banner .btn{opacity:.8}.article-page .banner .btn:hover{transition:.1s all;opacity:1}.article-page .banner .article-meta{margin:2rem 0 0}.article-page .banner .article-meta .author{color:#fff}.article-page .article-content p{font-family:'source serif pro',serif;font-size:1.2rem;line-height:1.8rem;margin-bottom:2rem}.article-page .article-content h1,.article-page .article-content h2,.article-page .article-content h3,.article-page .article-content h4,.article-page .article-content h5,.article-page .article-content h6{font-weight:500!important;margin:1.6rem 0 1rem}.article-page .article-actions{text-align:center;margin:1.5rem 0 3rem}.article-page .article-actions .article-meta .info{text-align:left}.article-page .comment-form .card-block{padding:0}.article-page .comment-form .card-block textarea{border:0;padding:1.25rem}.article-page .comment-form .card-footer .btn{font-weight:700;float:right}.article-page .comment-form .card-footer .comment-author-img{position:absolute;top:110px;height:30px;width:30px}.article-page .card{border:1px solid #e5e5e5;box-shadow:none!important}.article-page .card .card-footer{border-top:1px solid #e5e5e5;box-shadow:none!important;font-size:.8rem;font-weight:300}.article-page .card .comment-author-img{display:inline-block;vertical-align:middle;height:20px;width:20px;border-radius:30px}.article-page .card .comment-author{display:inline-block;vertical-align:middle}.article-page .card .date-posted{display:inline-block;vertical-align:middle;margin-left:5px;color:#bbb}.article-page .card .mod-options{float:right;color:#333;font-size:1rem}.article-page .card .mod-options i{margin-left:5px;opacity:.6;cursor:pointer}.article-page .card .mod-options i:hover{opacity:1}.profile-page .user-info{text-align:center;background:#f3f3f3;padding:2rem 0 1rem}.profile-page .user-info .user-img{width:100px;height:100px;border-radius:100px;margin-bottom:1rem}.profile-page .user-info h4{font-weight:700}.profile-page .user-info p{margin:0 auto .5rem;color:#aaa;max-width:450px;font-weight:300}.profile-page .user-info .action-btn{float:right;color:#999;border:1px solid #999}.profile-page .articles-toggle{margin:1.5rem 0 -1px}.editor-page .tag-list i{font-size:.6rem;margin-right:5px;cursor:pointer} \ No newline at end of file diff --git a/te-frontend/public/word.json b/conduit-front/public/word.json similarity index 100% rename from te-frontend/public/word.json rename to conduit-front/public/word.json diff --git a/conduit-front/src/agent.js b/conduit-front/src/agent.js index 07d3ccf..29d7e14 100644 --- a/conduit-front/src/agent.js +++ b/conduit-front/src/agent.js @@ -3,7 +3,7 @@ import _superagent from 'superagent'; const superagent = superagentPromise(_superagent, global.Promise); -const API_ROOT = 'http://vm3733.kaj.pouta.csc.fi:30000/api'; +const API_ROOT = process.env.REACT_APP_API_ROOT || 'https://conduit.productionready.io/api'; const encode = encodeURIComponent; const responseBody = res => res.body; @@ -16,8 +16,8 @@ const tokenPlugin = req => { } const requests = { - del: url => - superagent.del(`${API_ROOT}${url}`).use(tokenPlugin).then(responseBody), + del: (url, body) => + superagent.del(`${API_ROOT}${url}`, body).use(tokenPlugin).then(responseBody), get: url => superagent.get(`${API_ROOT}${url}`).use(tokenPlugin).then(responseBody), put: (url, body) => @@ -34,13 +34,16 @@ const Auth = { register: (username, email, password) => requests.post('/users', { user: { username, email, password } }), save: user => - requests.put('/user', { user }) + requests.put('/user', { user }), + delete: user => + requests.del('/user', { user }) }; const Tags = { getAll: () => requests.get('/tags') }; +//feed offset was 0 const limit = (count, p) => `limit=${count}&offset=${p ? p * count : 0}`; const omitSlug = article => Object.assign({}, article, { slug: undefined }) const Articles = { @@ -56,8 +59,8 @@ const Articles = { requests.post(`/articles/${slug}/favorite`), favoritedBy: (author, page) => requests.get(`/articles?favorited=${encode(author)}&${limit(5, page)}`), - feed: () => - requests.get('/articles/feed?limit=10&offset=0'), + feed: (page) => + requests.get(`/articles/feed?${limit(10, page)}`), get: slug => requests.get(`/articles/${slug}`), unfavorite: slug => diff --git a/te-frontend/src/components/App.css b/conduit-front/src/components/App.css similarity index 100% rename from te-frontend/src/components/App.css rename to conduit-front/src/components/App.css diff --git a/conduit-front/src/components/App.js b/conduit-front/src/components/App.js index 980ea72..8a8ec8a 100644 --- a/conduit-front/src/components/App.js +++ b/conduit-front/src/components/App.js @@ -6,6 +6,7 @@ import { APP_LOAD, REDIRECT } from '../constants/actionTypes'; import { Route, Switch } from 'react-router-dom'; import Article from '../components/Article'; import Editor from '../components/Editor'; +import edit from '../components/edit'; import Home from '../components/Home'; import Login from '../components/Login'; import Profile from '../components/Profile'; @@ -14,6 +15,8 @@ import Register from '../components/Register'; import Settings from '../components/Settings'; import { store } from '../store'; import { push } from 'react-router-redux'; +import './App.css'; +import Banner from './Home/Banner'; const mapStateToProps = state => { return { @@ -55,22 +58,23 @@ class App extends React.Component { <Header appName={this.props.appName} currentUser={this.props.currentUser} /> + <Banner/> <Switch> <Route exact path="/" component={Home}/> <Route path="/login" component={Login} /> <Route path="/register" component={Register} /> - <Route path="/editor/:slug" component={Editor} /> + <Route path="/edit/:slug" component={edit} /> <Route path="/editor" component={Editor} /> <Route path="/article/:id" component={Article} /> <Route path="/settings" component={Settings} /> <Route path="/@:username/favorites" component={ProfileFavorites} /> - <Route path="/@:username" component={Profile} /> + <Route path="/@:username" component={Profile} key={Math.random()}/> </Switch> </div> ); } return ( - <div> + <div className=""> <Header appName={this.props.appName} currentUser={this.props.currentUser} /> diff --git a/conduit-front/src/components/Article/ArticleActions.js b/conduit-front/src/components/Article/ArticleActions.js index 032e77d..f1b5f5b 100644 --- a/conduit-front/src/components/Article/ArticleActions.js +++ b/conduit-front/src/components/Article/ArticleActions.js @@ -3,6 +3,7 @@ import React from 'react'; import agent from '../../agent'; import { connect } from 'react-redux'; import { DELETE_ARTICLE } from '../../constants/actionTypes'; +import swal from 'sweetalert'; const mapDispatchToProps = dispatch => ({ onClickDelete: payload => @@ -14,17 +15,37 @@ const ArticleActions = props => { const del = () => { props.onClickDelete(agent.Articles.del(article.slug)) }; + + function deleteArticle() { + swal({ + title: "Are you sure?", + text: "Article and comments will be deleted permanently!", + buttons: true, + dangerMode: true, + }) + .then((willDelete) => { + if (willDelete) { + swal("Your article has been deleted!", { + icon: "success", + content: del() + }); + } else { + swal("Canceled!"); + } + }); + } + if (props.canModify) { return ( <span> <Link - to={`/editor/${article.slug}`} + to={`/edit/${article.slug}`} className="btn btn-outline-secondary btn-sm"> <i className="ion-edit"></i> Edit Article </Link> - <button className="btn btn-outline-danger btn-sm" onClick={del}> + <button className="btn btn-outline-danger btn-sm" onClick={()=>deleteArticle()} style={{marginLeft: 10}}> <i className="ion-trash-a"></i> Delete Article </button> diff --git a/conduit-front/src/components/Article/ArticleMeta.js b/conduit-front/src/components/Article/ArticleMeta.js index a30b35a..c2f490b 100644 --- a/conduit-front/src/components/Article/ArticleMeta.js +++ b/conduit-front/src/components/Article/ArticleMeta.js @@ -1,13 +1,17 @@ import ArticleActions from './ArticleActions'; import { Link } from 'react-router-dom'; import React from 'react'; +import { TwitterShareButton } from "react-share"; const ArticleMeta = props => { const article = props.article; + const link = `${window.location.href}` + return ( - <div className="article-meta"> + <div className="article-meta" > <Link to={`/@${article.author.username}`}> - <img src={article.author.image} alt={article.author.username} /> + <img src={article.author.image} alt={article.author.username} + onError={e => { e.currentTarget.src = "https://static.productionready.io/images/smiley-cyrus.jpg"; }}/> </Link> <div className="info"> @@ -15,11 +19,14 @@ const ArticleMeta = props => { {article.author.username} </Link> <span className="date"> - {new Date(article.createdAt).toDateString()} + {new Date(article.createdAt).toLocaleString()} </span> </div> - - <ArticleActions canModify={props.canModify} article={article} /> + <ArticleActions canModify={props.canModify} article={article}/> + <TwitterShareButton url={link} style={{alignItems: 'right'}}> + {<a class="twitter-share-button" data-show-count="false" target="_blank" style={{margin: 10}}> + <i className="ion-social-twitter"></i>Tweet</a>} + </TwitterShareButton> </div> ); }; diff --git a/conduit-front/src/components/Article/Comment.js b/conduit-front/src/components/Article/Comment.js index adb34a7..adc2a66 100644 --- a/conduit-front/src/components/Article/Comment.js +++ b/conduit-front/src/components/Article/Comment.js @@ -9,7 +9,7 @@ const Comment = props => { return ( <div className="card"> <div className="card-block"> - <p className="card-text">{comment.body}</p> + <p className="card-text-mylly">{comment.body}</p> </div> <div className="card-footer"> <Link @@ -24,7 +24,7 @@ const Comment = props => { {comment.author.username} </Link> <span className="date-posted"> - {new Date(comment.createdAt).toDateString()} + {new Date(comment.createdAt).toLocaleString()} </span> <DeleteButton show={show} slug={props.slug} commentId={comment.id} /> </div> diff --git a/conduit-front/src/components/Article/CommentInput.js b/conduit-front/src/components/Article/CommentInput.js index 3007ab9..91ca5a1 100644 --- a/conduit-front/src/components/Article/CommentInput.js +++ b/conduit-front/src/components/Article/CommentInput.js @@ -2,6 +2,7 @@ import React from 'react'; import agent from '../../agent'; import { connect } from 'react-redux'; import { ADD_COMMENT } from '../../constants/actionTypes'; +import BadWords from '../Badwords'; const mapDispatchToProps = dispatch => ({ onSubmit: payload => @@ -20,6 +21,10 @@ class CommentInput extends React.Component { }; this.createComment = ev => { + if (this.state.body < 1) { + ev.preventDefault() + return null + } ev.preventDefault(); const payload = agent.Comments.create(this.props.slug, { body: this.state.body }); @@ -34,18 +39,26 @@ class CommentInput extends React.Component { <div className="card-block"> <textarea className="form-control" placeholder="Write a comment..." + maxlength="1000" value={this.state.body} onChange={this.setBody} - rows="3"> + rows="3" + onKeyDown={(e) => { + if (e.keyCode === 9) e.preventDefault(); + }}> </textarea> </div> + <div className="card-footer"> <img src={this.props.currentUser.image} - className="comment-author-img" - alt={this.props.currentUser.username} /> + className="comment-author-img-mylly" + alt={this.props.currentUser.username} + onError={e => { e.currentTarget.src = "https://static.productionready.io/images/smiley-cyrus.jpg"; }}/> + <BadWords comment={this.state.body}/> <button - className="btn btn-sm btn-primary" + className="btn-primary-mylly" + id="publish" type="submit"> Post Comment </button> diff --git a/conduit-front/src/components/Article/DeleteButton.js b/conduit-front/src/components/Article/DeleteButton.js index b07d657..59d70bd 100644 --- a/conduit-front/src/components/Article/DeleteButton.js +++ b/conduit-front/src/components/Article/DeleteButton.js @@ -2,6 +2,7 @@ import React from 'react'; import agent from '../../agent'; import { connect } from 'react-redux'; import { DELETE_COMMENT } from '../../constants/actionTypes'; +import swal from 'sweetalert'; const mapDispatchToProps = dispatch => ({ onClick: (payload, commentId) => @@ -14,10 +15,28 @@ const DeleteButton = props => { props.onClick(payload, props.commentId); }; + function deleteComment() { + swal({ + title: "Are you sure?", + text: "Comment will be deleted permanently!", + buttons: true, + dangerMode: true, + }) + .then((willDelete) => { + if (willDelete) { + swal("Your comment has been deleted!", { + icon: "success", + content: del() + }); + } else { + swal("Canceled!"); + } + }); + } if (props.show) { return ( <span className="mod-options"> - <i className="ion-trash-a" onClick={del}></i> + <i className="ion-trash-a" onClick={()=>deleteComment()}></i> </span> ); } diff --git a/conduit-front/src/components/Article/index.js b/conduit-front/src/components/Article/index.js index 6be8975..2398114 100644 --- a/conduit-front/src/components/Article/index.js +++ b/conduit-front/src/components/Article/index.js @@ -44,7 +44,8 @@ class Article extends React.Component { <div className="banner"> <div className="container"> - <h1>{this.props.article.title}</h1> + <h1 className="article-title-mylly">{this.props.article.title}</h1> + <h5 style={{ color: '#80ffee' }}>{this.props.article.description}</h5> <ArticleMeta article={this.props.article} canModify={canModify} /> @@ -57,7 +58,7 @@ class Article extends React.Component { <div className="row article-content"> <div className="col-xs-12"> - <div dangerouslySetInnerHTML={markup}></div> + <div className="article-text-mylly" dangerouslySetInnerHTML={markup}></div> <ul className="tag-list"> { diff --git a/conduit-front/src/components/ArticlePreview.js b/conduit-front/src/components/ArticlePreview.js index ae9151a..2ac1cfc 100644 --- a/conduit-front/src/components/ArticlePreview.js +++ b/conduit-front/src/components/ArticlePreview.js @@ -3,10 +3,16 @@ import { Link } from 'react-router-dom'; import agent from '../agent'; import { connect } from 'react-redux'; import { ARTICLE_FAVORITED, ARTICLE_UNFAVORITED } from '../constants/actionTypes'; +import swal from 'sweetalert'; const FAVORITED_CLASS = 'btn btn-sm btn-primary'; const NOT_FAVORITED_CLASS = 'btn btn-sm btn-outline-primary'; +const mapStateToProps = state => ({ + ...state.articleList, + token: state.common.token +}); + const mapDispatchToProps = dispatch => ({ favorite: slug => dispatch({ type: ARTICLE_FAVORITED, @@ -25,19 +31,24 @@ const ArticlePreview = props => { NOT_FAVORITED_CLASS; const handleClick = ev => { - ev.preventDefault(); - if (article.favorited) { - props.unfavorite(article.slug); + if (props.token) { + ev.preventDefault(); + if (article.favorited) { + props.unfavorite(article.slug); + } else { + props.favorite(article.slug); + } } else { - props.favorite(article.slug); + swal("Sign in to favorite article", {buttons: false, timer: 1800}) } }; return ( - <div className="article-preview"> + <div className="article-preview" style={{marginBottom:5}}> <div className="article-meta"> <Link to={`/@${article.author.username}`}> - <img src={article.author.image} alt={article.author.username} /> + <img src={article.author.image} alt={article.author.username} + onError={e => { e.currentTarget.src = "https://static.productionready.io/images/smiley-cyrus.jpg"; }}/> </Link> <div className="info"> @@ -45,7 +56,7 @@ const ArticlePreview = props => { {article.author.username} </Link> <span className="date"> - {new Date(article.createdAt).toDateString()} + {new Date(article.createdAt).toLocaleString()} </span> </div> @@ -57,8 +68,8 @@ const ArticlePreview = props => { </div> <Link to={`/article/${article.slug}`} className="preview-link"> - <h1>{article.title}</h1> - <p>{article.description}</p> + <h1 className="preview-link-mylly">{article.title}</h1> + <p className="preview-link-mylly">{article.description}</p> <span>Read more...</span> <ul className="tag-list"> { @@ -76,4 +87,4 @@ const ArticlePreview = props => { ); } -export default connect(() => ({}), mapDispatchToProps)(ArticlePreview); +export default connect(mapStateToProps, mapDispatchToProps)(ArticlePreview); diff --git a/te-frontend/src/components/Badwords.js b/conduit-front/src/components/Badwords.js similarity index 100% rename from te-frontend/src/components/Badwords.js rename to conduit-front/src/components/Badwords.js diff --git a/te-frontend/src/components/Documents/Tietosuojaseloste.pdf b/conduit-front/src/components/Documents/Tietosuojaseloste.pdf similarity index 100% rename from te-frontend/src/components/Documents/Tietosuojaseloste.pdf rename to conduit-front/src/components/Documents/Tietosuojaseloste.pdf diff --git a/conduit-front/src/components/Editor.js b/conduit-front/src/components/Editor.js index 93d9d19..a912818 100644 --- a/conduit-front/src/components/Editor.js +++ b/conduit-front/src/components/Editor.js @@ -2,6 +2,7 @@ import ListErrors from './ListErrors'; import React from 'react'; import agent from '../agent'; import { connect } from 'react-redux'; +import Badwords from './Badwords'; import { ADD_TAG, EDITOR_PAGE_LOADED, @@ -11,6 +12,7 @@ import { UPDATE_FIELD_EDITOR } from '../constants/actionTypes'; + const mapStateToProps = state => ({ ...state.editor }); @@ -30,6 +32,7 @@ const mapDispatchToProps = dispatch => ({ dispatch({ type: UPDATE_FIELD_EDITOR, key, value }) }); + class Editor extends React.Component { constructor() { super(); @@ -41,10 +44,28 @@ class Editor extends React.Component { this.changeBody = updateFieldEvent('body'); this.changeTagInput = updateFieldEvent('tagInput'); + const errors = (key, error) => this.props.onUpdateField(key, error); + this.watchForEnter = ev => { + if (this.props.tagInput < 1 || (this.props.tagList || []).length > 3) { + errors('errors', {'Tags:': 'Empty tags not allowed'}); + return null + } if (ev.keyCode === 13) { ev.preventDefault(); this.props.onAddTag(); + errors('errors', {}); + } + }; + + this.clickToAdd = ev => { + if (this.props.tagInput < 1 || (this.props.tagList || []).length > 3) { + errors('errors', {'Tags:': 'Empty tags not allowed'}); + return null + } else { + ev.preventDefault(); + this.props.onAddTag(); + errors('errors', {}); } }; @@ -53,6 +74,9 @@ class Editor extends React.Component { }; this.submitForm = ev => { + if (!this.props.title||!this.props.body||!this.props.description) { + errors('errors', {'Please,': 'fill title and body fields.'}); + } else { ev.preventDefault(); const article = { title: this.props.title, @@ -60,14 +84,13 @@ class Editor extends React.Component { body: this.props.body, tagList: this.props.tagList }; - const slug = { slug: this.props.articleSlug }; const promise = this.props.articleSlug ? agent.Articles.update(Object.assign(article, slug)) : agent.Articles.create(article); this.props.onSubmit(promise); - }; + }}; } componentWillReceiveProps(nextProps) { @@ -97,9 +120,7 @@ class Editor extends React.Component { <div className="container page"> <div className="row"> <div className="col-md-10 offset-md-1 col-xs-12"> - - <ListErrors errors={this.props.errors}></ListErrors> - + <form> <fieldset> @@ -108,7 +129,8 @@ class Editor extends React.Component { className="form-control form-control-lg" type="text" placeholder="Article Title" - value={this.props.title} + maxlength="100" + value={this.props.title || ""} onChange={this.changeTitle} /> </fieldset> @@ -117,7 +139,8 @@ class Editor extends React.Component { className="form-control" type="text" placeholder="What's this article about?" - value={this.props.description} + maxlength="140" + value={this.props.description || ""} onChange={this.changeDescription} /> </fieldset> @@ -126,7 +149,8 @@ class Editor extends React.Component { className="form-control" rows="8" placeholder="Write your article (in markdown)" - value={this.props.body} + maxlength="3000" + value={this.props.body || ""} onChange={this.changeBody}> </textarea> </fieldset> @@ -135,10 +159,15 @@ class Editor extends React.Component { <input className="form-control" type="text" - placeholder="Give one tag at a time and press Enter" - value={this.props.tagInput} + placeholder="Enter tags" + maxlength="15" + value={this.props.tagInput ||""} onChange={this.changeTagInput} - onKeyUp={this.watchForEnter} /> + onKeyUp={this.watchForEnter} + onKeyDown={(e) => { + if (e.keyCode === 9) e.preventDefault(); + }}/> + <span onClick={this.clickToAdd} className="tag-enter">Press Enter or Click to Add</span> <div className="tag-list"> { @@ -156,17 +185,33 @@ class Editor extends React.Component { </div> </fieldset> + <button + className="btn btn-lg pull-xs-right btn-danger m-l-1" + type="button" + onClick={() => this.props.history.goBack()}> + Cancel + </button> + <button className="btn btn-lg pull-xs-right btn-primary" type="button" - disabled={this.props.inProgress} + id="publish" + disabled={false} onClick={this.submitForm}> Publish Article </button> + <Badwords title={this.props.title} + description={this.props.description} + body={this.props.body} + tags={this.props.tagInput} + tagList={this.props.tagList || []} + /> + + <ListErrors errors={this.props.errors}></ListErrors> + </fieldset> </form> - </div> </div> </div> diff --git a/conduit-front/src/components/Header.js b/conduit-front/src/components/Header.js index 63641b8..de49981 100644 --- a/conduit-front/src/components/Header.js +++ b/conduit-front/src/components/Header.js @@ -1,5 +1,7 @@ import React from 'react'; import { Link } from 'react-router-dom'; +import logo from './images/logo-sm.svg' + const LoggedOutView = props => { if (!props.currentUser) { @@ -7,19 +9,19 @@ const LoggedOutView = props => { <ul className="nav navbar-nav pull-xs-right"> <li className="nav-item"> - <Link to="/" className="nav-link"> + <Link to="/" className="nav-link-mylly"> Home </Link> </li> <li className="nav-item"> - <Link to="/login" className="nav-link"> + <Link to="/login" className="nav-link-mylly"> Sign in </Link> </li> <li className="nav-item"> - <Link to="/register" className="nav-link"> + <Link to="/register" className="nav-link-mylly"> Sign up </Link> </li> @@ -30,35 +32,36 @@ const LoggedOutView = props => { return null; }; +// li classname was "nav-item" const LoggedInView = props => { if (props.currentUser) { return ( <ul className="nav navbar-nav pull-xs-right"> - <li className="nav-item"> - <Link to="/" className="nav-link"> + <li className="nav-link-mylly"> + <Link to="/" className="nav-link-mylly"> Home </Link> </li> - <li className="nav-item"> - <Link to="/editor" className="nav-link"> + <li className="nav-link-mylly"> + <Link to="/editor" className="nav-link-mylly"> <i className="ion-compose"></i> New Post </Link> </li> - <li className="nav-item"> - <Link to="/settings" className="nav-link"> + <li className="nav-link-mylly"> + <Link to="/settings" className="nav-link-mylly"> <i className="ion-gear-a"></i> Settings </Link> </li> - - <li className="nav-item"> + + <li className="nav-link-mylly"> <Link to={`/@${props.currentUser.username}`} - className="nav-link"> - <img src={props.currentUser.image} className="user-pic" alt={props.currentUser.username} /> - {props.currentUser.username} + className="nav-link-mylly-user"> + <img src={props.currentUser.image} className="user-pic-mylly" title={props.currentUser.username} style={{marginLeft:10}}alt={props.currentUser.username} + onError={e => { e.currentTarget.src = "https://static.productionready.io/images/smiley-cyrus.jpg"; }}/> </Link> </li> @@ -72,11 +75,11 @@ const LoggedInView = props => { class Header extends React.Component { render() { return ( - <nav className="navbar navbar-light"> - <div className="container"> - - <Link to="/" className="navbar-brand"> - {this.props.appName.toLowerCase()} + <nav className="navbar-mylly"> + <div className="container-mylly"> + <Link to={{ pathname: "https://www.wimmalab.org/" }} target="_blank" className="navbar-brand-mylly"> + <img src={logo} alt="logo" height="20px"/> + {/* {this.props.appName.toLowerCase()} */} </Link> <LoggedOutView currentUser={this.props.currentUser} /> diff --git a/conduit-front/src/components/Home/Banner.js b/conduit-front/src/components/Home/Banner.js index dfb5690..cc3d52b 100644 --- a/conduit-front/src/components/Home/Banner.js +++ b/conduit-front/src/components/Home/Banner.js @@ -1,15 +1,18 @@ import React from 'react'; +import logo from '../images/logo_wimma.png' +import { Link } from 'react-router-dom'; +import homehero from '../images/home-hero.png' const Banner = ({ appName, token }) => { if (token) { return null; } - return ( - <div className="banner"> + return ( // style changed to black + <div className="banner-mylly" style={{ backgroundImage: `url(${homehero})`}}> <div className="container"> - <h1 className="logo-font"> - {appName.toLowerCase()} - </h1> + <Link to="/"> + <img src={logo} alt="logo" height="100px"/> + </Link> <p>A place to share your knowledge.</p> </div> </div> diff --git a/conduit-front/src/components/Home/MainView.js b/conduit-front/src/components/Home/MainView.js index bd581f2..c687523 100644 --- a/conduit-front/src/components/Home/MainView.js +++ b/conduit-front/src/components/Home/MainView.js @@ -47,7 +47,7 @@ const TagFilterTab = props => { } return ( - <li className="nav-item"> + <li className="nav-item" style={{color:'blue'}}> <a href="" className="nav-link active"> <i className="ion-pound"></i> {props.tag} </a> diff --git a/conduit-front/src/components/Home/index.js b/conduit-front/src/components/Home/index.js index 37fddd1..0ed4ea7 100644 --- a/conduit-front/src/components/Home/index.js +++ b/conduit-front/src/components/Home/index.js @@ -1,4 +1,4 @@ -import Banner from './Banner'; +// import Banner from './Banner'; import MainView from './MainView'; import React from 'react'; import Tags from './Tags'; @@ -9,6 +9,7 @@ import { HOME_PAGE_UNLOADED, APPLY_TAG_FILTER } from '../../constants/actionTypes'; +import Pdf from '../Documents/Tietosuojaseloste.pdf'; const Promise = global.Promise; @@ -34,12 +35,7 @@ class Home extends React.Component { agent.Articles.feed : agent.Articles.all; - /*this.props.onLoad(tab, articlesPromise, Promise.all([agent.Tags.getAll(), articlesPromise()]));*/ - Promise - .all([agent.Tags.getAll(), articlesPromise()]) - .then((result) => { - this.props.onLoad(tab, articlesPromise, result); - }); + this.props.onLoad(tab, articlesPromise, Promise.all([agent.Tags.getAll(), articlesPromise()])); } componentWillUnmount() { @@ -50,7 +46,7 @@ class Home extends React.Component { return ( <div className="home-page"> - <Banner token={this.props.token} appName={this.props.appName} /> + {/* <Banner token={this.props.token} appName={this.props.appName} /> */} <div className="container page"> <div className="row"> @@ -67,9 +63,12 @@ class Home extends React.Component { </div> </div> + </div> </div> - + <div className="footer"> + <a href = {Pdf} target = "_blank"><p>Privacy policy</p></a> + </div> </div> ); } diff --git a/conduit-front/src/components/Login.js b/conduit-front/src/components/Login.js index c63a0fa..a6e895a 100644 --- a/conduit-front/src/components/Login.js +++ b/conduit-front/src/components/Login.js @@ -8,6 +8,8 @@ import { LOGIN, LOGIN_PAGE_UNLOADED } from '../constants/actionTypes'; +import ShowIcon from '@material-ui/icons/Visibility'; +import ShowOffIcon from '@material-ui/icons/VisibilityOff'; const mapStateToProps = state => ({ ...state.auth }); @@ -25,6 +27,9 @@ const mapDispatchToProps = dispatch => ({ class Login extends React.Component { constructor() { super(); + this.state = { + password: true, + }; this.changeEmail = ev => this.props.onChangeEmail(ev.target.value); this.changePassword = ev => this.props.onChangePassword(ev.target.value); this.submitForm = (email, password) => ev => { @@ -53,8 +58,6 @@ class Login extends React.Component { </Link> </p> - <ListErrors errors={this.props.errors} /> - <form onSubmit={this.submitForm(email, password)}> <fieldset> @@ -70,12 +73,19 @@ class Login extends React.Component { <fieldset className="form-group"> <input className="form-control form-control-lg" - type="password" + type={this.state.password ? "password":"text" } placeholder="Password" value={password} onChange={this.changePassword} /> + <span + className="hideshowbtn" + style={{ top: 173 }} + onMouseDown={()=> this.setState({password:!this.state.password})}> + {this.state.password ? <ShowOffIcon/>:<ShowIcon/>} + </span> </fieldset> + <button className="btn btn-lg btn-primary pull-xs-right" type="submit" @@ -83,6 +93,8 @@ class Login extends React.Component { Sign in </button> + <ListErrors errors={this.props.errors} /> + </fieldset> </form> </div> diff --git a/conduit-front/src/components/Profile.js b/conduit-front/src/components/Profile.js index a3a5e6d..0310263 100644 --- a/conduit-front/src/components/Profile.js +++ b/conduit-front/src/components/Profile.js @@ -7,21 +7,10 @@ import { FOLLOW_USER, UNFOLLOW_USER, PROFILE_PAGE_LOADED, - PROFILE_PAGE_UNLOADED + PROFILE_PAGE_UNLOADED, + LOGOUT } from '../constants/actionTypes'; - -const EditProfileSettings = props => { - if (props.isUser) { - return ( - <Link - to="/settings" - className="btn btn-sm btn-outline-secondary action-btn"> - <i className="ion-gear-a"></i> Edit Profile Settings - </Link> - ); - } - return null; -}; +import swal from 'sweetalert'; const FollowUserButton = props => { if (props.isUser) { @@ -36,13 +25,16 @@ const FollowUserButton = props => { } const handleClick = ev => { - ev.preventDefault(); - if (props.user.following) { - props.unfollow(props.user.username) + if (props.isUser === null) { + swal("Sign in to follow user", {buttons: false, timer: 1900}) } else { - props.follow(props.user.username) - } - }; + ev.preventDefault(); + if (props.user.following) { + props.unfollow(props.user.username) + } else { + props.follow(props.user.username) + } + }}; return ( <button @@ -62,6 +54,7 @@ const mapStateToProps = state => ({ }); const mapDispatchToProps = dispatch => ({ + onClickLogout: () => dispatch({ type: LOGOUT }), onFollow: username => dispatch({ type: FOLLOW_USER, payload: agent.Profile.follow(username) @@ -109,23 +102,48 @@ class Profile extends React.Component { } render() { + + const EditProfileSettings = props => { + if (props.isUser) { + return ( + <div> + <Link + to="/settings" + className="btn btn-sm btn-outline-secondary action-btn"> + <i className="ion-gear-a"></i> Edit Profile Settings + </Link> + <button + className="btn btn-sm btn-outline-secondary action-btn" + style={{ + color: '#D56047', + borderColor: 'red', + marginRight:10}} + onClick={this.props.onClickLogout}> + <i className="ion-log-out"></i> Logout + </button> + </div> + ); + } + return null; + }; + const profile = this.props.profile; if (!profile) { return null; } - const isUser = this.props.currentUser && this.props.profile.username === this.props.currentUser.username; return ( <div className="profile-page"> - <div className="user-info"> + <div className="user-info" > <div className="container"> <div className="row"> <div className="col-xs-12 col-md-10 offset-md-1"> - <img src={profile.image} className="user-img" alt={profile.username} /> + <img src={profile.image} className="user-img" alt={profile.username} + onError={e => { e.currentTarget.src = "https://static.productionready.io/images/smiley-cyrus.jpg"; }}/> <h4>{profile.username}</h4> <p>{profile.bio}</p> diff --git a/conduit-front/src/components/Register.js b/conduit-front/src/components/Register.js index ff81749..82f7415 100644 --- a/conduit-front/src/components/Register.js +++ b/conduit-front/src/components/Register.js @@ -8,6 +8,9 @@ import { REGISTER, REGISTER_PAGE_UNLOADED } from '../constants/actionTypes'; +import swal from 'sweetalert'; +import ShowIcon from '@material-ui/icons/Visibility'; +import ShowOffIcon from '@material-ui/icons/VisibilityOff'; const mapStateToProps = state => ({ ...state.auth }); @@ -16,10 +19,12 @@ const mapDispatchToProps = dispatch => ({ dispatch({ type: UPDATE_FIELD_AUTH, key: 'email', value }), onChangePassword: value => dispatch({ type: UPDATE_FIELD_AUTH, key: 'password', value }), + onConfirmPassword: value => + dispatch({ type: UPDATE_FIELD_AUTH, key: 'confirmPassword', value }), onChangeUsername: value => dispatch({ type: UPDATE_FIELD_AUTH, key: 'username', value }), - onSubmit: (username, email, password) => { - const payload = agent.Auth.register(username, email, password); + onSubmit: (username, email, password,confirmPassword) => { + const payload = agent.Auth.register(username, email, password,confirmPassword); dispatch({ type: REGISTER, payload }) }, onUnload: () => @@ -29,12 +34,34 @@ const mapDispatchToProps = dispatch => ({ class Register extends React.Component { constructor() { super(); + this.state = { + password: true, + confirmPassword:true + }; this.changeEmail = ev => this.props.onChangeEmail(ev.target.value); this.changePassword = ev => this.props.onChangePassword(ev.target.value); + this.changeConfirmPassword = ev => this.props.onConfirmPassword(ev.target.value); this.changeUsername = ev => this.props.onChangeUsername(ev.target.value); - this.submitForm = (username, email, password) => ev => { + this.submitForm = (username, email, password,confirmPassword) => ev => { ev.preventDefault(); - this.props.onSubmit(username, email, password); + + const regex = /^\S{4,}$/; + if (!username||!email||!password) { + swal("All fields required") + return null; + } + + if(!regex.test(password)){ + + swal("Password at least 4 digits! No whitespaces") + return null; + } + if(password !== confirmPassword ) { + + swal("Passwords does not match ") + return null; + } + this.props.onSubmit(username, email, password,confirmPassword); } } @@ -45,6 +72,7 @@ class Register extends React.Component { render() { const email = this.props.email; const password = this.props.password; + const confirmPassword = this.props.confirmPassword; const username = this.props.username; return ( @@ -60,45 +88,68 @@ class Register extends React.Component { </Link> </p> - <ListErrors errors={this.props.errors} /> - <form onSubmit={this.submitForm(username, email, password)}> + <form onSubmit={this.submitForm(username, email, password,confirmPassword)}> <fieldset> - + <fieldset className="form-group"> - <input + <input + pattern=".{1,}" className="form-control form-control-lg" type="text" placeholder="Username" - value={this.props.username} + value={this.props.username || ""} onChange={this.changeUsername} /> </fieldset> - + <fieldset className="form-group"> <input className="form-control form-control-lg" type="email" placeholder="Email" - value={this.props.email} + value={this.props.email || ""} onChange={this.changeEmail} /> </fieldset> <fieldset className="form-group"> <input className="form-control form-control-lg" - type="password" + type={this.state.password ? "password":"text" } placeholder="Password" - value={this.props.password} + value={this.props.password || ""} onChange={this.changePassword} /> + <span + className="hideshowbtn" + style={{top: 240}} + onMouseDown={()=> this.setState({password:!this.state.password})}> + {this.state.password ? <ShowOffIcon/>:<ShowIcon/>} + </span> </fieldset> - + <fieldset className="form-group"> + <input + className="form-control form-control-lg" + type={this.state.confirmPassword ? "password":"text" } + placeholder="Confirm Password" + value={this.props.confirmPassword } + onChange={this.changeConfirmPassword} /> + <span + className="hideshowbtn" style={{top: 305}} + onMouseDown={()=> this.setState({confirmPassword:!this.state.confirmPassword})}> + {this.state.confirmPassword ? <ShowOffIcon/>:<ShowIcon/>} + </span> + </fieldset> + <button className="btn btn-lg btn-primary pull-xs-right" type="submit" - disabled={this.props.inProgress}> + disabled={this.props.inProgress + }> Sign up </button> + <ListErrors errors={this.props.errors} /> + + </fieldset> </form> </div> diff --git a/conduit-front/src/components/Settings.js b/conduit-front/src/components/Settings.js index 265b17a..63a70fa 100644 --- a/conduit-front/src/components/Settings.js +++ b/conduit-front/src/components/Settings.js @@ -5,8 +5,12 @@ import { connect } from 'react-redux'; import { SETTINGS_SAVED, SETTINGS_PAGE_UNLOADED, - LOGOUT + LOGOUT, + DELETE_USER } from '../constants/actionTypes'; +import swal from 'sweetalert'; +import ShowIcon from '@material-ui/icons/Visibility'; +import ShowOffIcon from '@material-ui/icons/VisibilityOff'; class SettingsForm extends React.Component { constructor() { @@ -17,7 +21,8 @@ class SettingsForm extends React.Component { username: '', bio: '', email: '', - password: '' + password: '', + confirmPassword: "" }; this.updateState = field => ev => { @@ -28,13 +33,35 @@ class SettingsForm extends React.Component { this.submitForm = ev => { ev.preventDefault(); - + const regexp = /^\S*$/;//ei välilyöntejä const user = Object.assign({}, this.state); + if(!regexp.test(user.password) || !regexp.test(user.confirmPassword)){ + swal(" Whitespace not allowed") + return null; + } + + if(user.password !== user.confirmPassword ) { + + swal("Passwords does not match ") + return null; + } + if (!user.password) { - delete user.password; + delete user.password; } - + else if(user.password.length < 4){ + swal("Password too short min 4 digits ") + return + } + else{ + swal({title: 'Password changed' , + timer: 1500, + icon: 'success', + showConfirmButton: false,}) + } + this.props.onSubmitForm(user); + }; } @@ -105,10 +132,29 @@ class SettingsForm extends React.Component { <fieldset className="form-group"> <input className="form-control form-control-lg" - type="password" + type={this.state.password ? "password":"text" } placeholder="New Password" - value={this.state.password} + //value={this.state.password} onChange={this.updateState('password')} /> + <span + className="hideshowbtn" style={{top: '67%'}} + onMouseDown={()=> this.setState({password:!this.state.password})}> + {this.state.password ? <ShowOffIcon/>:<ShowIcon/>} + </span> + </fieldset> + + <fieldset className="form-group"> + <input + className="form-control form-control-lg" + type={this.state.confirmPassword ? "password":"text" } + placeholder="Confirm Password" + // value={this.state.confirmPassword } + onChange={this.updateState('confirmPassword')} /> + <span + className="hideshowbtn" style={{top: '76%'}} + onMouseDown={()=> this.setState({confirmPassword:!this.state.confirmPassword})}> + {this.state.confirmPassword ? <ShowOffIcon/>:<ShowIcon/>} + </span> </fieldset> <button @@ -131,12 +177,36 @@ const mapStateToProps = state => ({ const mapDispatchToProps = dispatch => ({ onClickLogout: () => dispatch({ type: LOGOUT }), + onClickDeleteUser: user => + dispatch({ type: DELETE_USER, payload: agent.Auth.delete(user) }), onSubmitForm: user => dispatch({ type: SETTINGS_SAVED, payload: agent.Auth.save(user) }), onUnload: () => dispatch({ type: SETTINGS_PAGE_UNLOADED }) }); + class Settings extends React.Component { + + deleteUser() { + swal({ + title: "Are you sure?", + text: "Once deleted, you will not be able to recover your profile! \n All your articles and comments will be deleted!", + icon: "warning", + buttons: true, + dangerMode: true, + }) + .then((willDelete) => { + if (willDelete) { + swal("Poof! Your profile has been deleted!", { + icon: "success", + content: this.props.onClickDeleteUser() + }); + } else { + swal("Canceled!"); + } + }); + } + render() { return ( <div className="settings-page"> @@ -146,18 +216,25 @@ class Settings extends React.Component { <h1 className="text-xs-center">Your Settings</h1> - <ListErrors errors={this.props.errors}></ListErrors> - <SettingsForm currentUser={this.props.currentUser} onSubmitForm={this.props.onSubmitForm} /> + <ListErrors errors={this.props.errors}></ListErrors> + <hr /> + <button className="btn btn-outline-danger" onClick={this.props.onClickLogout}> - Or click here to logout. + Logout + </button> + + <button + className="btn btn-outline-danger pull-xs-right" + onClick={()=>this.deleteUser()}> + Delete account </button> </div> diff --git a/te-frontend/src/components/edit.js b/conduit-front/src/components/edit.js similarity index 100% rename from te-frontend/src/components/edit.js rename to conduit-front/src/components/edit.js diff --git a/te-frontend/src/components/images/christmas-hat-png-19616.png b/conduit-front/src/components/images/christmas-hat-png-19616.png similarity index 100% rename from te-frontend/src/components/images/christmas-hat-png-19616.png rename to conduit-front/src/components/images/christmas-hat-png-19616.png diff --git a/te-frontend/src/components/images/home-hero.png b/conduit-front/src/components/images/home-hero.png similarity index 100% rename from te-frontend/src/components/images/home-hero.png rename to conduit-front/src/components/images/home-hero.png diff --git a/te-frontend/src/components/images/logo-light_round.png b/conduit-front/src/components/images/logo-light_round.png similarity index 100% rename from te-frontend/src/components/images/logo-light_round.png rename to conduit-front/src/components/images/logo-light_round.png diff --git a/te-frontend/src/components/images/logo-sm-light.png b/conduit-front/src/components/images/logo-sm-light.png similarity index 100% rename from te-frontend/src/components/images/logo-sm-light.png rename to conduit-front/src/components/images/logo-sm-light.png diff --git a/te-frontend/src/components/images/logo-sm.svg b/conduit-front/src/components/images/logo-sm.svg similarity index 100% rename from te-frontend/src/components/images/logo-sm.svg rename to conduit-front/src/components/images/logo-sm.svg diff --git a/te-frontend/src/components/images/logo_wimma.png b/conduit-front/src/components/images/logo_wimma.png similarity index 100% rename from te-frontend/src/components/images/logo_wimma.png rename to conduit-front/src/components/images/logo_wimma.png diff --git a/te-frontend/src/components/images/logo_wimma2.png b/conduit-front/src/components/images/logo_wimma2.png similarity index 100% rename from te-frontend/src/components/images/logo_wimma2.png rename to conduit-front/src/components/images/logo_wimma2.png diff --git a/te-frontend/src/components/images/smiley-cyrus.jpg b/conduit-front/src/components/images/smiley-cyrus.jpg similarity index 100% rename from te-frontend/src/components/images/smiley-cyrus.jpg rename to conduit-front/src/components/images/smiley-cyrus.jpg diff --git a/conduit-front/src/constants/actionTypes.js b/conduit-front/src/constants/actionTypes.js index 8683c60..f2d4399 100644 --- a/conduit-front/src/constants/actionTypes.js +++ b/conduit-front/src/constants/actionTypes.js @@ -33,4 +33,5 @@ export const UPDATE_FIELD_EDITOR = 'UPDATE_FIELD_EDITOR'; export const FOLLOW_USER = 'FOLLOW_USER'; export const UNFOLLOW_USER = 'UNFOLLOW_USER'; export const PROFILE_FAVORITES_PAGE_UNLOADED = 'PROFILE_FAVORITES_PAGE_UNLOADED'; -export const PROFILE_FAVORITES_PAGE_LOADED = 'PROFILE_FAVORITES_PAGE_LOADED'; \ No newline at end of file +export const PROFILE_FAVORITES_PAGE_LOADED = 'PROFILE_FAVORITES_PAGE_LOADED'; +export const DELETE_USER = 'DELETE_USER'; \ No newline at end of file diff --git a/conduit-front/src/middleware.js b/conduit-front/src/middleware.js index 9e24a96..17a4d50 100644 --- a/conduit-front/src/middleware.js +++ b/conduit-front/src/middleware.js @@ -4,7 +4,8 @@ import { ASYNC_END, LOGIN, LOGOUT, - REGISTER + REGISTER, + DELETE_USER } from './constants/actionTypes'; const promiseMiddleware = store => next => action => { @@ -52,7 +53,7 @@ const localStorageMiddleware = store => next => action => { window.localStorage.setItem('jwt', action.payload.user.token); agent.setToken(action.payload.user.token); } - } else if (action.type === LOGOUT) { + } else if (action.type === LOGOUT || action.type === DELETE_USER) { window.localStorage.setItem('jwt', ''); agent.setToken(null); } diff --git a/conduit-front/src/reducers/common.js b/conduit-front/src/reducers/common.js index f95b2bb..06d349d 100644 --- a/conduit-front/src/reducers/common.js +++ b/conduit-front/src/reducers/common.js @@ -14,7 +14,8 @@ import { PROFILE_FAVORITES_PAGE_UNLOADED, SETTINGS_PAGE_UNLOADED, LOGIN_PAGE_UNLOADED, - REGISTER_PAGE_UNLOADED + REGISTER_PAGE_UNLOADED, + DELETE_USER } from '../constants/actionTypes'; const defaultState = { @@ -34,10 +35,11 @@ export default (state = defaultState, action) => { }; case REDIRECT: return { ...state, redirectTo: null }; + case DELETE_USER: case LOGOUT: return { ...state, redirectTo: '/', token: null, currentUser: null }; case ARTICLE_SUBMITTED: - const redirectUrl = `/article/${action.payload.article.slug}`; + const redirectUrl = action.error ? null : `/article/${action.payload.article.slug}`; return { ...state, redirectTo: redirectUrl }; case SETTINGS_SAVED: return { diff --git a/te-backend/.circleci/config.yml b/te-backend/.circleci/config.yml deleted file mode 100644 index c0f8472..0000000 --- a/te-backend/.circleci/config.yml +++ /dev/null @@ -1,20 +0,0 @@ -version: 2 - -jobs: - build: - docker: - - image: circleci/node:8.5.0 - - image: circleci/mongo:3.4.9 - steps: - - checkout - - run: - name: Start app and test - command: | - yarn - yarn run start & sleep 5 - curl http://localhost:3000/api/tags - yarn run test - - run: - name: Trigger integration tests - command: curl -X POST "https://circleci.com/api/v1.1/project/github/anishkny/realworld-e2e-test?circle-token=$CIRCLE_CI_TOKEN" - diff --git a/te-backend/.dockerignore b/te-backend/.dockerignore deleted file mode 100644 index 64b56b0..0000000 --- a/te-backend/.dockerignore +++ /dev/null @@ -1,8 +0,0 @@ -.git -.gitignore -.gitlab-ci.yml -README.md -node_modules -project-logo.png -back-up-system - diff --git a/te-backend/.gitignore b/te-backend/.gitignore deleted file mode 100644 index 9adbb84..0000000 --- a/te-backend/.gitignore +++ /dev/null @@ -1,41 +0,0 @@ -# Logs -logs -*.log -.DS_Store - -npm-debug.log* - -# Runtime data -pids -*.pid -*.seed - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release - -# Dependency directory -node_modules - -# Optional npm cache directory -.npm - -# Optional REPL history -.node_repl_history - -.idea - -# used only in local development -Dockerfile-dev -docker-compose-dev.yml diff --git a/te-backend/.travis.yml b/te-backend/.travis.yml deleted file mode 100644 index 795ed52..0000000 --- a/te-backend/.travis.yml +++ /dev/null @@ -1,10 +0,0 @@ -language: node_js -node_js: "8" - -sudo: required -services: mongodb - -install: yarn - -before_script: yarn start & sleep 5 -script: yarn test diff --git a/te-backend/Dockerfile b/te-backend/Dockerfile deleted file mode 100644 index 5dc91e5..0000000 --- a/te-backend/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -# Choose base image (maybe use node 14 with fewer warnings??) (changed from node:16-alpine) -FROM node:16 - -# Create app directory -WORKDIR /usr/src/app - -# Install app dependencies -COPY package*.json ./ -RUN npm install - -# Bundle app source -COPY . . - -# Expose port -EXPOSE 3000 - -# Run app with node.js -CMD [ "node", "app.js" ] diff --git a/te-backend/README.md b/te-backend/README.md deleted file mode 100644 index 660365d..0000000 --- a/te-backend/README.md +++ /dev/null @@ -1,52 +0,0 @@ -#  - -[](https://travis-ci.org/anishkny/node-express-realworld-example-app) - -> ### Example Node (Express + Mongoose) codebase containing real world examples (CRUD, auth, advanced patterns, etc) that adheres to the [RealWorld](https://github.com/gothinkster/realworld-example-apps) API spec. - -<a href="https://thinkster.io/tutorials/node-json-api" target="_blank"><img width="454" src="https://raw.githubusercontent.com/gothinkster/realworld/master/media/learn-btn-hr.png" /></a> - -This repo is functionality complete — PRs and issues welcome! - -# Getting started - -To get the Node server running locally: - -- Clone this repo -- `npm install` to install all required dependencies -- Install MongoDB Community Edition ([instructions](https://docs.mongodb.com/manual/installation/#tutorials)) and run it by executing `mongod` -- `npm run dev` to start the local server - -Alternately, to quickly try out this repo in the cloud, you can [](https://glitch.com/edit/#!/remix/realworld) - -# Code Overview - -## Dependencies - -- [expressjs](https://github.com/expressjs/express) - The server for handling and routing HTTP requests -- [express-jwt](https://github.com/auth0/express-jwt) - Middleware for validating JWTs for authentication -- [jsonwebtoken](https://github.com/auth0/node-jsonwebtoken) - For generating JWTs used by authentication -- [mongoose](https://github.com/Automattic/mongoose) - For modeling and mapping MongoDB data to javascript -- [mongoose-unique-validator](https://github.com/blakehaswell/mongoose-unique-validator) - For handling unique validation errors in Mongoose. Mongoose only handles validation at the document level, so a unique index across a collection will throw an exception at the driver level. The `mongoose-unique-validator` plugin helps us by formatting the error like a normal mongoose `ValidationError`. -- [passport](https://github.com/jaredhanson/passport) - For handling user authentication -- [slug](https://github.com/dodo/node-slug) - For encoding titles into a URL-friendly format - -## Application Structure - -- `app.js` - The entry point to our application. This file defines our express server and connects it to MongoDB using mongoose. It also requires the routes and models we'll be using in the application. -- `config/` - This folder contains configuration for passport as well as a central location for configuration/environment variables. -- `routes/` - This folder contains the route definitions for our API. -- `models/` - This folder contains the schema definitions for our Mongoose models. - -## Error Handling - -In `routes/api/index.js`, we define a error-handling middleware for handling Mongoose's `ValidationError`. This middleware will respond with a 422 status code and format the response to have [error messages the clients can understand](https://github.com/gothinkster/realworld/blob/master/API.md#errors-and-status-codes) - -## Authentication - -Requests are authenticated using the `Authorization` header with a valid JWT. We define two express middlewares in `routes/auth.js` that can be used to authenticate requests. The `required` middleware configures the `express-jwt` middleware using our application's secret and will return a 401 status code if the request cannot be authenticated. The payload of the JWT can then be accessed from `req.payload` in the endpoint. The `optional` middleware configures the `express-jwt` in the same way as `required`, but will *not* return a 401 status code if the request cannot be authenticated. - - -<br /> - -[](https://thinkster.io) diff --git a/te-backend/app.js b/te-backend/app.js deleted file mode 100644 index 460baa4..0000000 --- a/te-backend/app.js +++ /dev/null @@ -1,84 +0,0 @@ -var http = require('http'), - path = require('path'), - methods = require('methods'), - express = require('express'), - bodyParser = require('body-parser'), - session = require('express-session'), - cors = require('cors'), - passport = require('passport'), - errorhandler = require('errorhandler'), - mongoose = require('mongoose'); - -var isProduction = process.env.NODE_ENV === 'production'; - -// Create global app object -var app = express(); - -app.use(cors()); - -// Normal express config defaults -app.use(require('morgan')('dev')); -app.use(bodyParser.urlencoded({ extended: false })); -app.use(bodyParser.json()); - -app.use(require('method-override')()); -app.use(express.static(__dirname + '/public')); - -app.use(session({ secret: 'conduit', cookie: { maxAge: 60000 }, resave: false, saveUninitialized: false })); - -if (!isProduction) { - app.use(errorhandler()); -} - -if(isProduction){ - mongoose.connect(process.env.MONGODB_URI); -} else { - mongoose.connect('mongodb://localhost/conduit'); - mongoose.set('debug', true); -} - -require('./models/User'); -require('./models/Article'); -require('./models/Comment'); -require('./config/passport'); - -app.use(require('./routes')); - -/// catch 404 and forward to error handler -app.use(function(req, res, next) { - var err = new Error('Not Found'); - err.status = 404; - next(err); -}); - -/// error handlers - -// development error handler -// will print stacktrace -if (!isProduction) { - app.use(function(err, req, res, next) { - console.log(err.stack); - - res.status(err.status || 500); - - res.json({'errors': { - message: err.message, - error: err - }}); - }); -} - -// production error handler -// no stacktraces leaked to user -app.use(function(err, req, res, next) { - res.status(err.status || 500); - res.json({'errors': { - message: err.message, - error: {} - }}); -}); - -// finally, let's start our server... -var server = app.listen( process.env.PORT || 3000, function(){ - console.log('Listening on port ' + server.address().port); -}); diff --git a/te-backend/config/index.js b/te-backend/config/index.js deleted file mode 100644 index 1bf9d6a..0000000 --- a/te-backend/config/index.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - secret: process.env.NODE_ENV === 'production' ? process.env.SECRET : 'secret' -}; diff --git a/te-backend/config/passport.js b/te-backend/config/passport.js deleted file mode 100644 index abe0ce2..0000000 --- a/te-backend/config/passport.js +++ /dev/null @@ -1,18 +0,0 @@ -var passport = require('passport'); -var LocalStrategy = require('passport-local').Strategy; -var mongoose = require('mongoose'); -var User = mongoose.model('User'); - -passport.use(new LocalStrategy({ - usernameField: 'user[email]', - passwordField: 'user[password]' -}, function(email, password, done) { - User.findOne({email: email}).then(function(user){ - if(!user || !user.validPassword(password)){ - return done(null, false, {errors: {'email or password': 'is invalid'}}); - } - - return done(null, user); - }).catch(done); -})); - diff --git a/te-backend/models/Article.js b/te-backend/models/Article.js deleted file mode 100644 index e0d12ed..0000000 --- a/te-backend/models/Article.js +++ /dev/null @@ -1,56 +0,0 @@ -var mongoose = require('mongoose'); -var uniqueValidator = require('mongoose-unique-validator'); -var slug = require('slug'); -var User = mongoose.model('User'); - -var ArticleSchema = new mongoose.Schema({ - slug: {type: String, lowercase: true, unique: true}, - title: String, - description: String, - body: String, - favoritesCount: {type: Number, default: 0}, - comments: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Comment' }], - tagList: [{ type: String }], - author: { type: mongoose.Schema.Types.ObjectId, ref: 'User' } -}, {timestamps: true, usePushEach: true}); - -ArticleSchema.plugin(uniqueValidator, {message: 'is already taken'}); - -ArticleSchema.pre('validate', function(next){ - if(!this.slug) { - this.slugify(); - } - - next(); -}); - -ArticleSchema.methods.slugify = function() { - this.slug = slug(this.title) + '-' + (Math.random() * Math.pow(36, 6) | 0).toString(36); -}; - -ArticleSchema.methods.updateFavoriteCount = function() { - var article = this; - - return User.count({favorites: {$in: [article._id]}}).then(function(count){ - article.favoritesCount = count; - - return article.save(); - }); -}; - -ArticleSchema.methods.toJSONFor = function(user){ - return { - slug: this.slug, - title: this.title, - description: this.description, - body: this.body, - createdAt: this.createdAt, - updatedAt: this.updatedAt, - tagList: this.tagList, - favorited: user ? user.isFavorite(this._id) : false, - favoritesCount: this.favoritesCount, - author: this.author.toProfileJSONFor(user) - }; -}; - -mongoose.model('Article', ArticleSchema); diff --git a/te-backend/models/Comment.js b/te-backend/models/Comment.js deleted file mode 100644 index 7def57d..0000000 --- a/te-backend/models/Comment.js +++ /dev/null @@ -1,19 +0,0 @@ -var mongoose = require('mongoose'); - -var CommentSchema = new mongoose.Schema({ - body: String, - author: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }, - article: { type: mongoose.Schema.Types.ObjectId, ref: 'Article' } -}, {timestamps: true, usePushEach: true}); - -// Requires population of author -CommentSchema.methods.toJSONFor = function(user){ - return { - id: this._id, - body: this.body, - createdAt: this.createdAt, - author: this.author.toProfileJSONFor(user) - }; -}; - -mongoose.model('Comment', CommentSchema); diff --git a/te-backend/models/User.js b/te-backend/models/User.js deleted file mode 100644 index acb2bcf..0000000 --- a/te-backend/models/User.js +++ /dev/null @@ -1,99 +0,0 @@ -var mongoose = require('mongoose'); -var uniqueValidator = require('mongoose-unique-validator'); -var crypto = require('crypto'); -var jwt = require('jsonwebtoken'); -var secret = require('../config').secret; - -var UserSchema = new mongoose.Schema({ - username: {type: String, unique: true, uniqueCaseInsensitive: true, required: [true, "can't be blank"], match: [/^[a-zA-Z0-9]+$/, 'is invalid'], index: true}, - email: {type: String, unique: true, uniqueCaseInsensitive: true, required: [true, "can't be blank"], match: [/\S+@\S+\.\S+/, 'is invalid'], index: true}, - bio: String, - image: String, - favorites: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Article' }], - following: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }], - hash: String, - salt: String -}, {timestamps: true, usePushEach: true}); - -UserSchema.plugin(uniqueValidator, {message: 'is already taken.'}); - -UserSchema.methods.validPassword = function(password) { - var hash = crypto.pbkdf2Sync(password, this.salt, 10000, 512, 'sha512').toString('hex'); - return this.hash === hash; -}; - -UserSchema.methods.setPassword = function(password){ - this.salt = crypto.randomBytes(16).toString('hex'); - this.hash = crypto.pbkdf2Sync(password, this.salt, 10000, 512, 'sha512').toString('hex'); -}; - -UserSchema.methods.generateJWT = function() { - var today = new Date(); - var exp = new Date(today); - exp.setDate(today.getDate() + 60); - - return jwt.sign({ - id: this._id, - username: this.username, - exp: parseInt(exp.getTime() / 1000), - }, secret); -}; - -UserSchema.methods.toAuthJSON = function(){ - return { - username: this.username, - email: this.email, - token: this.generateJWT(), - bio: this.bio, - image: this.image || 'https://static.productionready.io/images/smiley-cyrus.jpg' - }; -}; - -UserSchema.methods.toProfileJSONFor = function(user){ - return { - username: this.username, - bio: this.bio, - image: this.image || 'https://static.productionready.io/images/smiley-cyrus.jpg', - following: user ? user.isFollowing(this._id) : false - }; -}; - -UserSchema.methods.favorite = function(id){ - if(this.favorites.indexOf(id) === -1){ - this.favorites.push(id); - } - - return this.save(); -}; - -UserSchema.methods.unfavorite = function(id){ - this.favorites.remove(id); - return this.save(); -}; - -UserSchema.methods.isFavorite = function(id){ - return this.favorites.some(function(favoriteId){ - return favoriteId.toString() === id.toString(); - }); -}; - -UserSchema.methods.follow = function(id){ - if(this.following.indexOf(id) === -1){ - this.following.push(id); - } - - return this.save(); -}; - -UserSchema.methods.unfollow = function(id){ - this.following.remove(id); - return this.save(); -}; - -UserSchema.methods.isFollowing = function(id){ - return this.following.some(function(followId){ - return followId.toString() === id.toString(); - }); -}; - -mongoose.model('User', UserSchema); diff --git a/te-backend/package.json b/te-backend/package.json deleted file mode 100644 index 0b71f5b..0000000 --- a/te-backend/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "conduit-node", - "version": "2.0.0", - "description": "conduit on node", - "main": "app.js", - "scripts": { - "mongo:start": "docker run --name realworld-mongo -p 27017:27017 mongo & sleep 5", - "start": "node ./app.js", - "dev": "nodemon ./app.js", - "test": "newman run ./tests/api-tests.postman.json -e ./tests/env-api-tests.postman.json", - "stop": "lsof -ti :3000 | xargs kill", - "mongo:stop": "docker stop realworld-mongo && docker rm realworld-mongo" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/gothinkster/productionready-node-api.git" - }, - "license": "ISC", - "dependencies": { - "body-parser": "1.15.0", - "cors": "2.7.1", - "ejs": "2.4.1", - "errorhandler": "1.4.3", - "express": "4.13.4", - "express-jwt": "3.3.0", - "express-session": "1.13.0", - "jsonwebtoken": "7.1.9", - "method-override": "2.3.5", - "methods": "1.1.2", - "mongoose": "^4.6.4", - "mongoose-unique-validator": "1.0.2", - "morgan": "1.7.0", - "passport": "0.3.2", - "passport-local": "1.0.0", - "request": "2.69.0", - "slug": "0.9.1", - "underscore": "1.8.3" - }, - "devDependencies": { - "newman": "^3.8.2", - "nodemon": "^1.11.0" - } -} diff --git a/te-backend/project-logo.png b/te-backend/project-logo.png deleted file mode 100644 index ef92a4be8c6cb93a3e9c78d72787e558a40cd149..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53176 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 T4&^Tm3_#%N>gTe~DWM4fEO&TD diff --git a/te-backend/public/.keep b/te-backend/public/.keep deleted file mode 100644 index e69de29..0000000 diff --git a/te-backend/routes/api/articles.js b/te-backend/routes/api/articles.js deleted file mode 100644 index a8ffe73..0000000 --- a/te-backend/routes/api/articles.js +++ /dev/null @@ -1,280 +0,0 @@ -var router = require('express').Router(); -var mongoose = require('mongoose'); -var Article = mongoose.model('Article'); -var Comment = mongoose.model('Comment'); -var User = mongoose.model('User'); -var auth = require('../auth'); - -// Preload article objects on routes with ':article' -router.param('article', function(req, res, next, slug) { - Article.findOne({ slug: slug}) - .populate('author') - .then(function (article) { - if (!article) { return res.sendStatus(404); } - - req.article = article; - - return next(); - }).catch(next); -}); - -router.param('comment', function(req, res, next, id) { - Comment.findById(id).then(function(comment){ - if(!comment) { return res.sendStatus(404); } - - req.comment = comment; - - return next(); - }).catch(next); -}); - -router.get('/', auth.optional, function(req, res, next) { - var query = {}; - var limit = 20; - var offset = 0; - - if(typeof req.query.limit !== 'undefined'){ - limit = req.query.limit; - } - - if(typeof req.query.offset !== 'undefined'){ - offset = req.query.offset; - } - - if( typeof req.query.tag !== 'undefined' ){ - query.tagList = {"$in" : [req.query.tag]}; - } - - Promise.all([ - req.query.author ? User.findOne({username: req.query.author}) : null, - req.query.favorited ? User.findOne({username: req.query.favorited}) : null - ]).then(function(results){ - var author = results[0]; - var favoriter = results[1]; - - if(author){ - query.author = author._id; - } - - if(favoriter){ - query._id = {$in: favoriter.favorites}; - } else if(req.query.favorited){ - query._id = {$in: []}; - } - - return Promise.all([ - Article.find(query) - .limit(Number(limit)) - .skip(Number(offset)) - .sort({createdAt: 'desc'}) - .populate('author') - .exec(), - Article.count(query).exec(), - req.payload ? User.findById(req.payload.id) : null, - ]).then(function(results){ - var articles = results[0]; - var articlesCount = results[1]; - var user = results[2]; - - return res.json({ - articles: articles.map(function(article){ - return article.toJSONFor(user); - }), - articlesCount: articlesCount - }); - }); - }).catch(next); -}); - -router.get('/feed', auth.required, function(req, res, next) { - var limit = 20; - var offset = 0; - - if(typeof req.query.limit !== 'undefined'){ - limit = req.query.limit; - } - - if(typeof req.query.offset !== 'undefined'){ - offset = req.query.offset; - } - - User.findById(req.payload.id).then(function(user){ - if (!user) { return res.sendStatus(401); } - - Promise.all([ - Article.find({ author: {$in: user.following}}) - .limit(Number(limit)) - .sort({createdAt: 'desc'}) - .skip(Number(offset)) - .populate('author') - .exec(), - Article.count({ author: {$in: user.following}}) - ]).then(function(results){ - var articles = results[0]; - var articlesCount = results[1]; - - return res.json({ - articles: articles.map(function(article){ - return article.toJSONFor(user); - }), - articlesCount: articlesCount - }); - }).catch(next); - }); -}); - -router.post('/', auth.required, function(req, res, next) { - User.findById(req.payload.id).then(function(user){ - if (!user) { return res.sendStatus(401); } - - var article = new Article(req.body.article); - - article.author = user; - - return article.save().then(function(){ - console.log(article.author); - return res.json({article: article.toJSONFor(user)}); - }); - }).catch(next); -}); - -// return a article -router.get('/:article', auth.optional, function(req, res, next) { - Promise.all([ - req.payload ? User.findById(req.payload.id) : null, - req.article.populate('author').execPopulate() - ]).then(function(results){ - var user = results[0]; - - return res.json({article: req.article.toJSONFor(user)}); - }).catch(next); -}); - -// update article -router.put('/:article', auth.required, function(req, res, next) { - User.findById(req.payload.id).then(function(user){ - if(req.article.author._id.toString() === req.payload.id.toString()){ - if(typeof req.body.article.title !== 'undefined'){ - req.article.title = req.body.article.title; - } - - if(typeof req.body.article.description !== 'undefined'){ - req.article.description = req.body.article.description; - } - - if(typeof req.body.article.body !== 'undefined'){ - req.article.body = req.body.article.body; - } - - if(typeof req.body.article.tagList !== 'undefined'){ - req.article.tagList = req.body.article.tagList - } - - req.article.save().then(function(article){ - return res.json({article: article.toJSONFor(user)}); - }).catch(next); - } else { - return res.sendStatus(403); - } - }); -}); - -// delete article -router.delete('/:article', auth.required, function(req, res, next) { - User.findById(req.payload.id).then(function(user){ - if (!user) { return res.sendStatus(401); } - - if(req.article.author._id.toString() === req.payload.id.toString()){ - return req.article.remove().then(function(){ - return res.sendStatus(204); - }); - } else { - return res.sendStatus(403); - } - }).catch(next); -}); - -// Favorite an article -router.post('/:article/favorite', auth.required, function(req, res, next) { - var articleId = req.article._id; - - User.findById(req.payload.id).then(function(user){ - if (!user) { return res.sendStatus(401); } - - return user.favorite(articleId).then(function(){ - return req.article.updateFavoriteCount().then(function(article){ - return res.json({article: article.toJSONFor(user)}); - }); - }); - }).catch(next); -}); - -// Unfavorite an article -router.delete('/:article/favorite', auth.required, function(req, res, next) { - var articleId = req.article._id; - - User.findById(req.payload.id).then(function (user){ - if (!user) { return res.sendStatus(401); } - - return user.unfavorite(articleId).then(function(){ - return req.article.updateFavoriteCount().then(function(article){ - return res.json({article: article.toJSONFor(user)}); - }); - }); - }).catch(next); -}); - -// return an article's comments -router.get('/:article/comments', auth.optional, function(req, res, next){ - Promise.resolve(req.payload ? User.findById(req.payload.id) : null).then(function(user){ - return req.article.populate({ - path: 'comments', - populate: { - path: 'author' - }, - options: { - sort: { - createdAt: 'desc' - } - } - }).execPopulate().then(function(article) { - return res.json({comments: req.article.comments.map(function(comment){ - return comment.toJSONFor(user); - })}); - }); - }).catch(next); -}); - -// create a new comment -router.post('/:article/comments', auth.required, function(req, res, next) { - User.findById(req.payload.id).then(function(user){ - if(!user){ return res.sendStatus(401); } - - var comment = new Comment(req.body.comment); - comment.article = req.article; - comment.author = user; - - return comment.save().then(function(){ - req.article.comments.push(comment); - - return req.article.save().then(function(article) { - res.json({comment: comment.toJSONFor(user)}); - }); - }); - }).catch(next); -}); - -router.delete('/:article/comments/:comment', auth.required, function(req, res, next) { - if(req.comment.author.toString() === req.payload.id.toString()){ - req.article.comments.remove(req.comment._id); - req.article.save() - .then(Comment.find({_id: req.comment._id}).remove().exec()) - .then(function(){ - res.sendStatus(204); - }); - } else { - res.sendStatus(403); - } -}); - -module.exports = router; diff --git a/te-backend/routes/api/index.js b/te-backend/routes/api/index.js deleted file mode 100644 index 03f36d6..0000000 --- a/te-backend/routes/api/index.js +++ /dev/null @@ -1,22 +0,0 @@ -var router = require('express').Router(); - -router.use('/', require('./users')); -router.use('/profiles', require('./profiles')); -router.use('/articles', require('./articles')); -router.use('/tags', require('./tags')); - -router.use(function(err, req, res, next){ - if(err.name === 'ValidationError'){ - return res.status(422).json({ - errors: Object.keys(err.errors).reduce(function(errors, key){ - errors[key] = err.errors[key].message; - - return errors; - }, {}) - }); - } - - return next(err); -}); - -module.exports = router; \ No newline at end of file diff --git a/te-backend/routes/api/profiles.js b/te-backend/routes/api/profiles.js deleted file mode 100644 index ffcd833..0000000 --- a/te-backend/routes/api/profiles.js +++ /dev/null @@ -1,53 +0,0 @@ -var router = require('express').Router(); -var mongoose = require('mongoose'); -var User = mongoose.model('User'); -var auth = require('../auth'); - -// Preload user profile on routes with ':username' -router.param('username', function(req, res, next, username){ - User.findOne({username: username}).then(function(user){ - if (!user) { return res.sendStatus(404); } - - req.profile = user; - - return next(); - }).catch(next); -}); - -router.get('/:username', auth.optional, function(req, res, next){ - if(req.payload){ - User.findById(req.payload.id).then(function(user){ - if(!user){ return res.json({profile: req.profile.toProfileJSONFor(false)}); } - - return res.json({profile: req.profile.toProfileJSONFor(user)}); - }); - } else { - return res.json({profile: req.profile.toProfileJSONFor(false)}); - } -}); - -router.post('/:username/follow', auth.required, function(req, res, next){ - var profileId = req.profile._id; - - User.findById(req.payload.id).then(function(user){ - if (!user) { return res.sendStatus(401); } - - return user.follow(profileId).then(function(){ - return res.json({profile: req.profile.toProfileJSONFor(user)}); - }); - }).catch(next); -}); - -router.delete('/:username/follow', auth.required, function(req, res, next){ - var profileId = req.profile._id; - - User.findById(req.payload.id).then(function(user){ - if (!user) { return res.sendStatus(401); } - - return user.unfollow(profileId).then(function(){ - return res.json({profile: req.profile.toProfileJSONFor(user)}); - }); - }).catch(next); -}); - -module.exports = router; diff --git a/te-backend/routes/api/tags.js b/te-backend/routes/api/tags.js deleted file mode 100644 index bea1a80..0000000 --- a/te-backend/routes/api/tags.js +++ /dev/null @@ -1,12 +0,0 @@ -var router = require('express').Router(); -var mongoose = require('mongoose'); -var Article = mongoose.model('Article'); - -// return a list of tags -router.get('/', function(req, res, next) { - Article.find().distinct('tagList').then(function(tags){ - return res.json({tags: tags}); - }).catch(next); -}); - -module.exports = router; diff --git a/te-backend/routes/api/users.js b/te-backend/routes/api/users.js deleted file mode 100644 index 2fc1547..0000000 --- a/te-backend/routes/api/users.js +++ /dev/null @@ -1,91 +0,0 @@ -var mongoose = require('mongoose'); -var router = require('express').Router(); -var passport = require('passport'); -var Article = mongoose.model('Article'); -var Comment = mongoose.model('Comment'); -var User = mongoose.model('User'); -var auth = require('../auth'); - -router.get('/user', auth.required, function(req, res, next){ - User.findById(req.payload.id).then(function(user){ - if(!user){ return res.sendStatus(401); } - - return res.json({user: user.toAuthJSON()}); - }).catch(next); -}); - -router.put('/user', auth.required, function(req, res, next){ - User.findById(req.payload.id).then(function(user){ - if(!user){ return res.sendStatus(401); } - - // only update fields that were actually passed... - if(typeof req.body.user.username !== 'undefined'){ - user.username = req.body.user.username; - } - if(typeof req.body.user.email !== 'undefined'){ - user.email = req.body.user.email; - } - if(typeof req.body.user.bio !== 'undefined'){ - user.bio = req.body.user.bio; - } - if(typeof req.body.user.image !== 'undefined'){ - user.image = req.body.user.image; - } - if(typeof req.body.user.password !== 'undefined'){ - user.setPassword(req.body.user.password); - } - - return user.save().then(function(){ - return res.json({user: user.toAuthJSON()}); - }); - }).catch(next); -}); - -router.post('/users/login', function(req, res, next){ - if(!req.body.user.email){ - return res.status(422).json({errors: {email: "can't be blank"}}); - } - - if(!req.body.user.password){ - return res.status(422).json({errors: {password: "can't be blank"}}); - } - - passport.authenticate('local', {session: false}, function(err, user, info){ - if(err){ return next(err); } - - if(user){ - user.token = user.generateJWT(); - return res.json({user: user.toAuthJSON()}); - } else { - return res.status(422).json(info); - } - })(req, res, next); -}); - -router.post('/users', function(req, res, next){ - var user = new User(); - - user.username = req.body.user.username; - user.email = req.body.user.email; - user.setPassword(req.body.user.password); - - user.save().then(function(){ - return res.json({user: user.toAuthJSON()}); - }).catch(next); -}); - -router.delete('/user', auth.required, function(req, res, next){ - //console.log('TESTI', req); // prints to backend container log - User.findByIdAndRemove(req.payload.id).then(function(user){ - if(!user){ return res.sendStatus(401); } - - Promise.all([ - Article.find({ author: user._id }).remove(), - Comment.find({ author: user._id }).remove() - ]).then(function(){ - return res.sendStatus(204); - }).catch(next); - }); -}); - -module.exports = router; diff --git a/te-backend/routes/auth.js b/te-backend/routes/auth.js deleted file mode 100644 index e44a215..0000000 --- a/te-backend/routes/auth.js +++ /dev/null @@ -1,27 +0,0 @@ -var jwt = require('express-jwt'); -var secret = require('../config').secret; - -function getTokenFromHeader(req){ - if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Token' || - req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') { - return req.headers.authorization.split(' ')[1]; - } - - return null; -} - -var auth = { - required: jwt({ - secret: secret, - userProperty: 'payload', - getToken: getTokenFromHeader - }), - optional: jwt({ - secret: secret, - userProperty: 'payload', - credentialsRequired: false, - getToken: getTokenFromHeader - }) -}; - -module.exports = auth; diff --git a/te-backend/routes/index.js b/te-backend/routes/index.js deleted file mode 100644 index 3585767..0000000 --- a/te-backend/routes/index.js +++ /dev/null @@ -1,5 +0,0 @@ -var router = require('express').Router(); - -router.use('/api', require('./api')); - -module.exports = router; diff --git a/te-backend/te-backend-deployment.yaml b/te-backend/te-backend-deployment.yaml deleted file mode 100644 index 4592451..0000000 --- a/te-backend/te-backend-deployment.yaml +++ /dev/null @@ -1,33 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: backend - name: backend - namespace: default -spec: - replicas: 1 - selector: - matchLabels: - app: backend - strategy: - rollingUpdate: - maxSurge: 25% - maxUnavailable: 25% - type: RollingUpdate - template: - metadata: - labels: - app: backend - spec: - containers: - - image: gitlab.labranet.jamk.fi:4567/conduitmiau/te-backend:backend - imagePullPolicy: Always - name: backend - resources: - requests: - cpu: '1' - memory: 1000Mi - - ports: - - containerPort: 3000 diff --git a/te-backend/te-backend-service.yaml b/te-backend/te-backend-service.yaml deleted file mode 100644 index 45feb84..0000000 --- a/te-backend/te-backend-service.yaml +++ /dev/null @@ -1,13 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: backend - namespace: default -spec: - type: LoadBalancer - ports: - - nodePort: 30000 - port: 80 - targetPort: 3000 - selector: - app: backend diff --git a/te-backend/tests/api-tests.postman.json b/te-backend/tests/api-tests.postman.json deleted file mode 100644 index bad71a2..0000000 --- a/te-backend/tests/api-tests.postman.json +++ /dev/null @@ -1,1900 +0,0 @@ -{ - "variables": [], - "info": { - "name": "Conduit API Tests", - "_postman_id": "dda3e595-02d7-bf12-2a43-3daea0970192", - "description": "Collection for testing the Conduit API\n\nhttps://github.com/gothinkster/realworld", - "schema": "https://schema.getpostman.com/json/collection/v2.0.0/collection.json" - }, - "item": [{ - "name": "Auth", - "description": "", - "item": [{ - "name": "Register", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "if (!(environment.isIntegrationTest)) {", - "var responseJSON = JSON.parse(responseBody);", - "", - "tests['Response contains \"user\" property'] = responseJSON.hasOwnProperty('user');", - "", - "var user = responseJSON.user || {};", - "", - "tests['User has \"email\" property'] = user.hasOwnProperty('email');", - "tests['User has \"username\" property'] = user.hasOwnProperty('username');", - "tests['User has \"token\" property'] = user.hasOwnProperty('token');", - "}", - "" - ] - } - }], - "request": { - "url": "{{apiUrl}}/users", - "method": "POST", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - } - ], - "body": { - "mode": "raw", - "raw": "{\"user\":{\"email\":\"john@jacob.com\", \"password\":\"johnnyjacob\", \"username\":\"johnjacob\"}}" - }, - "description": "" - }, - "response": [] - }, - { - "name": "Login", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "var responseJSON = JSON.parse(responseBody);", - "", - "tests['Response contains \"user\" property'] = responseJSON.hasOwnProperty('user');", - "", - "var user = responseJSON.user || {};", - "", - "tests['User has \"email\" property'] = user.hasOwnProperty('email');", - "tests['User has \"username\" property'] = user.hasOwnProperty('username');", - "tests['User has \"token\" property'] = user.hasOwnProperty('token');", - "" - ] - } - }], - "request": { - "url": "{{apiUrl}}/users/login", - "method": "POST", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - } - ], - "body": { - "mode": "raw", - "raw": "{\"user\":{\"email\":\"john@jacob.com\", \"password\":\"johnnyjacob\"}}" - }, - "description": "" - }, - "response": [] - }, - { - "name": "Login and Remember Token", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "var responseJSON = JSON.parse(responseBody);", - "", - "tests['Response contains \"user\" property'] = responseJSON.hasOwnProperty('user');", - "", - "var user = responseJSON.user || {};", - "", - "tests['User has \"email\" property'] = user.hasOwnProperty('email');", - "tests['User has \"username\" property'] = user.hasOwnProperty('username');", - "tests['User has \"token\" property'] = user.hasOwnProperty('token');", - "", - "if(tests['User has \"token\" property']){", - " postman.setEnvironmentVariable('token', user.token);", - "}", - "", - "tests['Environment variable \"token\" has been set'] = environment.token === user.token;", - "" - ] - } - }], - "request": { - "url": "{{apiUrl}}/users/login", - "method": "POST", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - } - ], - "body": { - "mode": "raw", - "raw": "{\"user\":{\"email\":\"john@jacob.com\", \"password\":\"johnnyjacob\"}}" - }, - "description": "" - }, - "response": [] - }, - { - "name": "Current User", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "var responseJSON = JSON.parse(responseBody);", - "", - "tests['Response contains \"user\" property'] = responseJSON.hasOwnProperty('user');", - "", - "var user = responseJSON.user || {};", - "", - "tests['User has \"email\" property'] = user.hasOwnProperty('email');", - "tests['User has \"username\" property'] = user.hasOwnProperty('username');", - "tests['User has \"token\" property'] = user.hasOwnProperty('token');", - "" - ] - } - }], - "request": { - "url": "{{apiUrl}}/user", - "method": "GET", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - }, - { - "key": "Authorization", - "value": "Token {{token}}", - "description": "" - } - ], - "body": {}, - "description": "" - }, - "response": [] - }, - { - "name": "Update User", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "var responseJSON = JSON.parse(responseBody);", - "", - "tests['Response contains \"user\" property'] = responseJSON.hasOwnProperty('user');", - "", - "var user = responseJSON.user || {};", - "", - "tests['User has \"email\" property'] = user.hasOwnProperty('email');", - "tests['User has \"username\" property'] = user.hasOwnProperty('username');", - "tests['User has \"token\" property'] = user.hasOwnProperty('token');", - "" - ] - } - }], - "request": { - "url": "{{apiUrl}}/user", - "method": "PUT", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - }, - { - "key": "Authorization", - "value": "Token {{token}}", - "description": "" - } - ], - "body": { - "mode": "raw", - "raw": "{\"user\":{\"email\":\"john@jacob.com\"}}" - }, - "description": "" - }, - "response": [] - } - ] - }, - { - "name": "Articles with authentication", - "description": "", - "item": [{ - "name": "Feed", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "var is200Response = responseCode.code === 200;", - "", - "tests['Response code is 200 OK'] = is200Response;", - "", - "if(is200Response){", - " var responseJSON = JSON.parse(responseBody);", - "", - " tests['Response contains \"articles\" property'] = responseJSON.hasOwnProperty('articles');", - " tests['Response contains \"articlesCount\" property'] = responseJSON.hasOwnProperty('articlesCount');", - " tests['articlesCount is an integer'] = Number.isInteger(responseJSON.articlesCount);", - "", - " if(responseJSON.articles.length){", - " var article = responseJSON.articles[0];", - "", - " tests['Article has \"title\" property'] = article.hasOwnProperty('title');", - " tests['Article has \"slug\" property'] = article.hasOwnProperty('slug');", - " tests['Article has \"body\" property'] = article.hasOwnProperty('body');", - " tests['Article has \"createdAt\" property'] = article.hasOwnProperty('createdAt');", - " tests['Article\\'s \"createdAt\" property is an ISO 8601 timestamp'] = new Date(article.createdAt).toISOString() === article.createdAt;", - " tests['Article has \"updatedAt\" property'] = article.hasOwnProperty('updatedAt');", - " tests['Article\\'s \"updatedAt\" property is an ISO 8601 timestamp'] = new Date(article.updatedAt).toISOString() === article.updatedAt;", - " tests['Article has \"description\" property'] = article.hasOwnProperty('description');", - " tests['Article has \"tagList\" property'] = article.hasOwnProperty('tagList');", - " tests['Article\\'s \"tagList\" property is an Array'] = Array.isArray(article.tagList);", - " tests['Article has \"author\" property'] = article.hasOwnProperty('author');", - " tests['Article has \"favorited\" property'] = article.hasOwnProperty('favorited');", - " tests['Article has \"favoritesCount\" property'] = article.hasOwnProperty('favoritesCount');", - " tests['favoritesCount is an integer'] = Number.isInteger(article.favoritesCount);", - " } else {", - " tests['articlesCount is 0 when feed is empty'] = responseJSON.articlesCount === 0;", - " }", - "}", - "" - ] - } - }], - "request": { - "url": "{{apiUrl}}/articles/feed", - "method": "GET", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - }, - { - "key": "Authorization", - "value": "Token {{token}}", - "description": "" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" - }, - "response": [] - }, - { - "name": "All Articles", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "var is200Response = responseCode.code === 200;", - "", - "tests['Response code is 200 OK'] = is200Response;", - "", - "if(is200Response){", - " var responseJSON = JSON.parse(responseBody);", - "", - " tests['Response contains \"articles\" property'] = responseJSON.hasOwnProperty('articles');", - " tests['Response contains \"articlesCount\" property'] = responseJSON.hasOwnProperty('articlesCount');", - " tests['articlesCount is an integer'] = Number.isInteger(responseJSON.articlesCount);", - "", - " if(responseJSON.articles.length){", - " var article = responseJSON.articles[0];", - "", - " tests['Article has \"title\" property'] = article.hasOwnProperty('title');", - " tests['Article has \"slug\" property'] = article.hasOwnProperty('slug');", - " tests['Article has \"body\" property'] = article.hasOwnProperty('body');", - " tests['Article has \"createdAt\" property'] = article.hasOwnProperty('createdAt');", - " tests['Article\\'s \"createdAt\" property is an ISO 8601 timestamp'] = new Date(article.createdAt).toISOString() === article.createdAt;", - " tests['Article has \"updatedAt\" property'] = article.hasOwnProperty('updatedAt');", - " tests['Article\\'s \"updatedAt\" property is an ISO 8601 timestamp'] = new Date(article.updatedAt).toISOString() === article.updatedAt;", - " tests['Article has \"description\" property'] = article.hasOwnProperty('description');", - " tests['Article has \"tagList\" property'] = article.hasOwnProperty('tagList');", - " tests['Article\\'s \"tagList\" property is an Array'] = Array.isArray(article.tagList);", - " tests['Article has \"author\" property'] = article.hasOwnProperty('author');", - " tests['Article has \"favorited\" property'] = article.hasOwnProperty('favorited');", - " tests['Article has \"favoritesCount\" property'] = article.hasOwnProperty('favoritesCount');", - " tests['favoritesCount is an integer'] = Number.isInteger(article.favoritesCount);", - " } else {", - " tests['articlesCount is 0 when feed is empty'] = responseJSON.articlesCount === 0;", - " }", - "}", - "" - ] - } - }], - "request": { - "url": "{{apiUrl}}/articles", - "method": "GET", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - }, - { - "key": "Authorization", - "value": "Token {{token}}", - "description": "" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" - }, - "response": [] - }, - { - "name": "All Articles with auth", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "var is200Response = responseCode.code === 200;", - "", - "tests['Response code is 200 OK'] = is200Response;", - "", - "if(is200Response){", - " var responseJSON = JSON.parse(responseBody);", - "", - " tests['Response contains \"articles\" property'] = responseJSON.hasOwnProperty('articles');", - " tests['Response contains \"articlesCount\" property'] = responseJSON.hasOwnProperty('articlesCount');", - " tests['articlesCount is an integer'] = Number.isInteger(responseJSON.articlesCount);", - "", - " if(responseJSON.articles.length){", - " var article = responseJSON.articles[0];", - "", - " tests['Article has \"title\" property'] = article.hasOwnProperty('title');", - " tests['Article has \"slug\" property'] = article.hasOwnProperty('slug');", - " tests['Article has \"body\" property'] = article.hasOwnProperty('body');", - " tests['Article has \"createdAt\" property'] = article.hasOwnProperty('createdAt');", - " tests['Article\\'s \"createdAt\" property is an ISO 8601 timestamp'] = new Date(article.createdAt).toISOString() === article.createdAt;", - " tests['Article has \"updatedAt\" property'] = article.hasOwnProperty('updatedAt');", - " tests['Article\\'s \"updatedAt\" property is an ISO 8601 timestamp'] = new Date(article.updatedAt).toISOString() === article.updatedAt;", - " tests['Article has \"description\" property'] = article.hasOwnProperty('description');", - " tests['Article has \"tagList\" property'] = article.hasOwnProperty('tagList');", - " tests['Article\\'s \"tagList\" property is an Array'] = Array.isArray(article.tagList);", - " tests['Article has \"author\" property'] = article.hasOwnProperty('author');", - " tests['Article has \"favorited\" property'] = article.hasOwnProperty('favorited');", - " tests['Article has \"favoritesCount\" property'] = article.hasOwnProperty('favoritesCount');", - " tests['favoritesCount is an integer'] = Number.isInteger(article.favoritesCount);", - " } else {", - " tests['articlesCount is 0 when feed is empty'] = responseJSON.articlesCount === 0;", - " }", - "}", - "" - ] - } - }], - "request": { - "url": "{{apiUrl}}/articles", - "method": "GET", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - }, - { - "key": "Authorization", - "value": "Token {{token}}", - "description": "" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" - }, - "response": [] - }, - { - "name": "Articles by Author", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "var is200Response = responseCode.code === 200;", - "", - "tests['Response code is 200 OK'] = is200Response;", - "", - "if(is200Response){", - " var responseJSON = JSON.parse(responseBody);", - "", - " tests['Response contains \"articles\" property'] = responseJSON.hasOwnProperty('articles');", - " tests['Response contains \"articlesCount\" property'] = responseJSON.hasOwnProperty('articlesCount');", - " tests['articlesCount is an integer'] = Number.isInteger(responseJSON.articlesCount);", - "", - " if(responseJSON.articles.length){", - " var article = responseJSON.articles[0];", - "", - " tests['Article has \"title\" property'] = article.hasOwnProperty('title');", - " tests['Article has \"slug\" property'] = article.hasOwnProperty('slug');", - " tests['Article has \"body\" property'] = article.hasOwnProperty('body');", - " tests['Article has \"createdAt\" property'] = article.hasOwnProperty('createdAt');", - " tests['Article\\'s \"createdAt\" property is an ISO 8601 timestamp'] = new Date(article.createdAt).toISOString() === article.createdAt;", - " tests['Article has \"updatedAt\" property'] = article.hasOwnProperty('updatedAt');", - " tests['Article\\'s \"updatedAt\" property is an ISO 8601 timestamp'] = new Date(article.updatedAt).toISOString() === article.updatedAt;", - " tests['Article has \"description\" property'] = article.hasOwnProperty('description');", - " tests['Article has \"tagList\" property'] = article.hasOwnProperty('tagList');", - " tests['Article\\'s \"tagList\" property is an Array'] = Array.isArray(article.tagList);", - " tests['Article has \"author\" property'] = article.hasOwnProperty('author');", - " tests['Article has \"favorited\" property'] = article.hasOwnProperty('favorited');", - " tests['Article has \"favoritesCount\" property'] = article.hasOwnProperty('favoritesCount');", - " tests['favoritesCount is an integer'] = Number.isInteger(article.favoritesCount);", - " } else {", - " tests['articlesCount is 0 when feed is empty'] = responseJSON.articlesCount === 0;", - " }", - "}", - "" - ] - } - }], - "request": { - "url": { - "raw": "{{apiUrl}}/articles?author=johnjacob", - "host": [ - "{{apiUrl}}" - ], - "path": [ - "articles" - ], - "query": [{ - "key": "author", - "value": "johnjacob" - }], - "variable": [] - }, - "method": "GET", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - }, - { - "key": "Authorization", - "value": "Token {{token}}", - "description": "" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" - }, - "response": [] - }, - { - "name": "Articles by Author with auth", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "var is200Response = responseCode.code === 200;", - "", - "tests['Response code is 200 OK'] = is200Response;", - "", - "if(is200Response){", - " var responseJSON = JSON.parse(responseBody);", - "", - " tests['Response contains \"articles\" property'] = responseJSON.hasOwnProperty('articles');", - " tests['Response contains \"articlesCount\" property'] = responseJSON.hasOwnProperty('articlesCount');", - " tests['articlesCount is an integer'] = Number.isInteger(responseJSON.articlesCount);", - "", - " if(responseJSON.articles.length){", - " var article = responseJSON.articles[0];", - "", - " tests['Article has \"title\" property'] = article.hasOwnProperty('title');", - " tests['Article has \"slug\" property'] = article.hasOwnProperty('slug');", - " tests['Article has \"body\" property'] = article.hasOwnProperty('body');", - " tests['Article has \"createdAt\" property'] = article.hasOwnProperty('createdAt');", - " tests['Article\\'s \"createdAt\" property is an ISO 8601 timestamp'] = new Date(article.createdAt).toISOString() === article.createdAt;", - " tests['Article has \"updatedAt\" property'] = article.hasOwnProperty('updatedAt');", - " tests['Article\\'s \"updatedAt\" property is an ISO 8601 timestamp'] = new Date(article.updatedAt).toISOString() === article.updatedAt;", - " tests['Article has \"description\" property'] = article.hasOwnProperty('description');", - " tests['Article has \"tagList\" property'] = article.hasOwnProperty('tagList');", - " tests['Article\\'s \"tagList\" property is an Array'] = Array.isArray(article.tagList);", - " tests['Article has \"author\" property'] = article.hasOwnProperty('author');", - " tests['Article has \"favorited\" property'] = article.hasOwnProperty('favorited');", - " tests['Article has \"favoritesCount\" property'] = article.hasOwnProperty('favoritesCount');", - " tests['favoritesCount is an integer'] = Number.isInteger(article.favoritesCount);", - " } else {", - " tests['articlesCount is 0 when feed is empty'] = responseJSON.articlesCount === 0;", - " }", - "}", - "" - ] - } - }], - "request": { - "url": { - "raw": "{{apiUrl}}/articles?author=johnjacob", - "host": [ - "{{apiUrl}}" - ], - "path": [ - "articles" - ], - "query": [{ - "key": "author", - "value": "johnjacob", - "equals": true, - "description": "" - }], - "variable": [] - }, - "method": "GET", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - }, - { - "key": "Authorization", - "value": "Token {{token}}", - "description": "" - } - ], - "body": {}, - "description": "" - }, - "response": [] - }, - { - "name": "Articles Favorited by Username", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "var is200Response = responseCode.code === 200;", - "", - "tests['Response code is 200 OK'] = is200Response;", - "", - "if(is200Response){", - " var responseJSON = JSON.parse(responseBody);", - " ", - " tests['Response contains \"articles\" property'] = responseJSON.hasOwnProperty('articles');", - " tests['Response contains \"articlesCount\" property'] = responseJSON.hasOwnProperty('articlesCount');", - " tests['articlesCount is an integer'] = Number.isInteger(responseJSON.articlesCount);", - "", - " if(responseJSON.articles.length){", - " var article = responseJSON.articles[0];", - "", - " tests['Article has \"title\" property'] = article.hasOwnProperty('title');", - " tests['Article has \"slug\" property'] = article.hasOwnProperty('slug');", - " tests['Article has \"body\" property'] = article.hasOwnProperty('body');", - " tests['Article has \"createdAt\" property'] = article.hasOwnProperty('createdAt');", - " tests['Article\\'s \"createdAt\" property is an ISO 8601 timestamp'] = new Date(article.createdAt).toISOString() === article.createdAt;", - " tests['Article has \"updatedAt\" property'] = article.hasOwnProperty('updatedAt');", - " tests['Article\\'s \"updatedAt\" property is an ISO 8601 timestamp'] = new Date(article.updatedAt).toISOString() === article.updatedAt;", - " tests['Article has \"description\" property'] = article.hasOwnProperty('description');", - " tests['Article has \"tagList\" property'] = article.hasOwnProperty('tagList');", - " tests['Article\\'s \"tagList\" property is an Array'] = Array.isArray(article.tagList);", - " tests['Article has \"author\" property'] = article.hasOwnProperty('author');", - " tests['Article has \"favorited\" property'] = article.hasOwnProperty('favorited');", - " tests['Article has \"favoritesCount\" property'] = article.hasOwnProperty('favoritesCount');", - " tests['favoritesCount is an integer'] = Number.isInteger(article.favoritesCount);", - " } else {", - " tests['articlesCount is 0 when feed is empty'] = responseJSON.articlesCount === 0;", - " }", - "}", - "" - ] - } - }], - "request": { - "url": { - "raw": "{{apiUrl}}/articles?favorited=jane", - "host": [ - "{{apiUrl}}" - ], - "path": [ - "articles" - ], - "query": [{ - "key": "favorited", - "value": "jane" - }], - "variable": [] - }, - "method": "GET", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - }, - { - "key": "Authorization", - "value": "Token {{token}}", - "description": "" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" - }, - "response": [] - }, - { - "name": "Articles Favorited by Username with auth", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "var is200Response = responseCode.code === 200;", - "", - "tests['Response code is 200 OK'] = is200Response;", - "", - "if(is200Response){", - " var responseJSON = JSON.parse(responseBody);", - " ", - " tests['Response contains \"articles\" property'] = responseJSON.hasOwnProperty('articles');", - " tests['Response contains \"articlesCount\" property'] = responseJSON.hasOwnProperty('articlesCount');", - " tests['articlesCount is an integer'] = Number.isInteger(responseJSON.articlesCount);", - "", - " if(responseJSON.articles.length){", - " var article = responseJSON.articles[0];", - "", - " tests['Article has \"title\" property'] = article.hasOwnProperty('title');", - " tests['Article has \"slug\" property'] = article.hasOwnProperty('slug');", - " tests['Article has \"body\" property'] = article.hasOwnProperty('body');", - " tests['Article has \"createdAt\" property'] = article.hasOwnProperty('createdAt');", - " tests['Article\\'s \"createdAt\" property is an ISO 8601 timestamp'] = new Date(article.createdAt).toISOString() === article.createdAt;", - " tests['Article has \"updatedAt\" property'] = article.hasOwnProperty('updatedAt');", - " tests['Article\\'s \"updatedAt\" property is an ISO 8601 timestamp'] = new Date(article.updatedAt).toISOString() === article.updatedAt;", - " tests['Article has \"description\" property'] = article.hasOwnProperty('description');", - " tests['Article has \"tagList\" property'] = article.hasOwnProperty('tagList');", - " tests['Article\\'s \"tagList\" property is an Array'] = Array.isArray(article.tagList);", - " tests['Article has \"author\" property'] = article.hasOwnProperty('author');", - " tests['Article has \"favorited\" property'] = article.hasOwnProperty('favorited');", - " tests['Article has \"favoritesCount\" property'] = article.hasOwnProperty('favoritesCount');", - " tests['favoritesCount is an integer'] = Number.isInteger(article.favoritesCount);", - " } else {", - " tests['articlesCount is 0 when feed is empty'] = responseJSON.articlesCount === 0;", - " }", - "}", - "" - ] - } - }], - "request": { - "url": { - "raw": "{{apiUrl}}/articles?favorited=jane", - "host": [ - "{{apiUrl}}" - ], - "path": [ - "articles" - ], - "query": [{ - "key": "favorited", - "value": "jane" - }], - "variable": [] - }, - "method": "GET", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - }, - { - "key": "Authorization", - "value": "Token {{token}}", - "description": "" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" - }, - "response": [] - }, - { - "name": "Articles by Tag", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "var is200Response = responseCode.code === 200;", - "", - "tests['Response code is 200 OK'] = is200Response;", - "", - "if(is200Response){", - " var responseJSON = JSON.parse(responseBody);", - "", - " tests['Response contains \"articles\" property'] = responseJSON.hasOwnProperty('articles');", - " tests['Response contains \"articlesCount\" property'] = responseJSON.hasOwnProperty('articlesCount');", - " tests['articlesCount is an integer'] = Number.isInteger(responseJSON.articlesCount);", - "", - " if(responseJSON.articles.length){", - " var article = responseJSON.articles[0];", - "", - " tests['Article has \"title\" property'] = article.hasOwnProperty('title');", - " tests['Article has \"slug\" property'] = article.hasOwnProperty('slug');", - " tests['Article has \"body\" property'] = article.hasOwnProperty('body');", - " tests['Article has \"createdAt\" property'] = article.hasOwnProperty('createdAt');", - " tests['Article\\'s \"createdAt\" property is an ISO 8601 timestamp'] = new Date(article.createdAt).toISOString() === article.createdAt;", - " tests['Article has \"updatedAt\" property'] = article.hasOwnProperty('updatedAt');", - " tests['Article\\'s \"updatedAt\" property is an ISO 8601 timestamp'] = new Date(article.updatedAt).toISOString() === article.updatedAt;", - " tests['Article has \"description\" property'] = article.hasOwnProperty('description');", - " tests['Article has \"tagList\" property'] = article.hasOwnProperty('tagList');", - " tests['Article\\'s \"tagList\" property is an Array'] = Array.isArray(article.tagList);", - " tests['Article has \"author\" property'] = article.hasOwnProperty('author');", - " tests['Article has \"favorited\" property'] = article.hasOwnProperty('favorited');", - " tests['Article has \"favoritesCount\" property'] = article.hasOwnProperty('favoritesCount');", - " tests['favoritesCount is an integer'] = Number.isInteger(article.favoritesCount);", - " } else {", - " tests['articlesCount is 0 when feed is empty'] = responseJSON.articlesCount === 0;", - " }", - "}", - "" - ] - } - }], - "request": { - "url": { - "raw": "{{apiUrl}}/articles?tag=dragons", - "host": [ - "{{apiUrl}}" - ], - "path": [ - "articles" - ], - "query": [{ - "key": "tag", - "value": "dragons" - }], - "variable": [] - }, - "method": "GET", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - }, - { - "key": "Authorization", - "value": "Token {{token}}", - "description": "" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" - }, - "response": [] - }, - { - "name": "Create Article", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "var responseJSON = JSON.parse(responseBody);", - "", - "tests['Response contains \"article\" property'] = responseJSON.hasOwnProperty('article');", - "", - "var article = responseJSON.article || {};", - "", - "tests['Article has \"title\" property'] = article.hasOwnProperty('title');", - "tests['Article has \"slug\" property'] = article.hasOwnProperty('slug');", - "if(tests['Article has \"slug\" property']){", - " postman.setEnvironmentVariable('slug', article.slug);", - "}", - "tests['Article has \"body\" property'] = article.hasOwnProperty('body');", - "tests['Article has \"createdAt\" property'] = article.hasOwnProperty('createdAt');", - "tests['Article\\'s \"createdAt\" property is an ISO 8601 timestamp'] = new Date(article.createdAt).toISOString() === article.createdAt;", - "tests['Article has \"updatedAt\" property'] = article.hasOwnProperty('updatedAt');", - "tests['Article\\'s \"updatedAt\" property is an ISO 8601 timestamp'] = new Date(article.updatedAt).toISOString() === article.updatedAt;", - "tests['Article has \"description\" property'] = article.hasOwnProperty('description');", - "tests['Article has \"tagList\" property'] = article.hasOwnProperty('tagList');", - "tests['Article\\'s \"tagList\" property is an Array'] = Array.isArray(article.tagList);", - "tests['Article has \"author\" property'] = article.hasOwnProperty('author');", - "tests['Article has \"favorited\" property'] = article.hasOwnProperty('favorited');", - "tests['Article has \"favoritesCount\" property'] = article.hasOwnProperty('favoritesCount');", - "tests['favoritesCount is an integer'] = Number.isInteger(article.favoritesCount);", - "" - ] - } - }], - "request": { - "url": "{{apiUrl}}/articles", - "method": "POST", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - }, - { - "key": "Authorization", - "value": "Token {{token}}", - "description": "" - } - ], - "body": { - "mode": "raw", - "raw": "{\"article\":{\"title\":\"How to train your dragon\", \"description\":\"Ever wonder how?\", \"body\":\"Very carefully.\", \"tagList\":[\"dragons\",\"training\"]}}" - }, - "description": "" - }, - "response": [] - }, - { - "name": "Single Article by slug", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "var responseJSON = JSON.parse(responseBody);", - "", - "tests['Response contains \"article\" property'] = responseJSON.hasOwnProperty('article');", - "", - "var article = responseJSON.article || {};", - "", - "tests['Article has \"title\" property'] = article.hasOwnProperty('title');", - "tests['Article has \"slug\" property'] = article.hasOwnProperty('slug');", - "tests['Article has \"body\" property'] = article.hasOwnProperty('body');", - "tests['Article has \"createdAt\" property'] = article.hasOwnProperty('createdAt');", - "tests['Article\\'s \"createdAt\" property is an ISO 8601 timestamp'] = new Date(article.createdAt).toISOString() === article.createdAt;", - "tests['Article has \"updatedAt\" property'] = article.hasOwnProperty('updatedAt');", - "tests['Article\\'s \"updatedAt\" property is an ISO 8601 timestamp'] = new Date(article.updatedAt).toISOString() === article.updatedAt;", - "tests['Article has \"description\" property'] = article.hasOwnProperty('description');", - "tests['Article has \"tagList\" property'] = article.hasOwnProperty('tagList');", - "tests['Article\\'s \"tagList\" property is an Array'] = Array.isArray(article.tagList);", - "tests['Article has \"author\" property'] = article.hasOwnProperty('author');", - "tests['Article has \"favorited\" property'] = article.hasOwnProperty('favorited');", - "tests['Article has \"favoritesCount\" property'] = article.hasOwnProperty('favoritesCount');", - "tests['favoritesCount is an integer'] = Number.isInteger(article.favoritesCount);", - "" - ] - } - }], - "request": { - "url": "{{apiUrl}}/articles/{{slug}}", - "method": "GET", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - }, - { - "key": "Authorization", - "value": "Token {{token}}", - "description": "" - } - ], - "body": {}, - "description": "" - }, - "response": [] - }, - { - "name": "Update Article", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "if (!(environment.isIntegrationTest)) {", - "var responseJSON = JSON.parse(responseBody);", - "", - "tests['Response contains \"article\" property'] = responseJSON.hasOwnProperty('article');", - "", - "var article = responseJSON.article || {};", - "", - "tests['Article has \"title\" property'] = article.hasOwnProperty('title');", - "tests['Article has \"slug\" property'] = article.hasOwnProperty('slug');", - "tests['Article has \"body\" property'] = article.hasOwnProperty('body');", - "tests['Article has \"createdAt\" property'] = article.hasOwnProperty('createdAt');", - "tests['Article\\'s \"createdAt\" property is an ISO 8601 timestamp'] = new Date(article.createdAt).toISOString() === article.createdAt;", - "tests['Article has \"updatedAt\" property'] = article.hasOwnProperty('updatedAt');", - "tests['Article\\'s \"updatedAt\" property is an ISO 8601 timestamp'] = new Date(article.updatedAt).toISOString() === article.updatedAt;", - "tests['Article has \"description\" property'] = article.hasOwnProperty('description');", - "tests['Article has \"tagList\" property'] = article.hasOwnProperty('tagList');", - "tests['Article\\'s \"tagList\" property is an Array'] = Array.isArray(article.tagList);", - "tests['Article has \"author\" property'] = article.hasOwnProperty('author');", - "tests['Article has \"favorited\" property'] = article.hasOwnProperty('favorited');", - "tests['Article has \"favoritesCount\" property'] = article.hasOwnProperty('favoritesCount');", - "tests['favoritesCount is an integer'] = Number.isInteger(article.favoritesCount);", - "}", - "" - ] - } - }], - "request": { - "url": "{{apiUrl}}/articles/{{slug}}", - "method": "PUT", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - }, - { - "key": "Authorization", - "value": "Token {{token}}", - "description": "" - } - ], - "body": { - "mode": "raw", - "raw": "{\"article\":{\"body\":\"With two hands\"}}" - }, - "description": "" - }, - "response": [] - }, - { - "name": "Favorite Article", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "var responseJSON = JSON.parse(responseBody);", - "", - "tests['Response contains \"article\" property'] = responseJSON.hasOwnProperty('article');", - "", - "var article = responseJSON.article || {};", - "", - "tests['Article has \"title\" property'] = article.hasOwnProperty('title');", - "tests['Article has \"slug\" property'] = article.hasOwnProperty('slug');", - "tests['Article has \"body\" property'] = article.hasOwnProperty('body');", - "tests['Article has \"createdAt\" property'] = article.hasOwnProperty('createdAt');", - "tests['Article\\'s \"createdAt\" property is an ISO 8601 timestamp'] = new Date(article.createdAt).toISOString() === article.createdAt;", - "tests['Article has \"updatedAt\" property'] = article.hasOwnProperty('updatedAt');", - "tests['Article\\'s \"updatedAt\" property is an ISO 8601 timestamp'] = new Date(article.updatedAt).toISOString() === article.updatedAt;", - "tests['Article has \"description\" property'] = article.hasOwnProperty('description');", - "tests['Article has \"tagList\" property'] = article.hasOwnProperty('tagList');", - "tests['Article\\'s \"tagList\" property is an Array'] = Array.isArray(article.tagList);", - "tests['Article has \"author\" property'] = article.hasOwnProperty('author');", - "tests['Article has \"favorited\" property'] = article.hasOwnProperty('favorited');", - "tests[\"Article's 'favorited' property is true\"] = article.favorited === true;", - "tests['Article has \"favoritesCount\" property'] = article.hasOwnProperty('favoritesCount');", - "tests['favoritesCount is an integer'] = Number.isInteger(article.favoritesCount);", - "tests[\"Article's 'favoritesCount' property is greater than 0\"] = article.favoritesCount > 0;", - "" - ] - } - }], - "request": { - "url": "{{apiUrl}}/articles/{{slug}}/favorite", - "method": "POST", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - }, - { - "key": "Authorization", - "value": "Token {{token}}", - "description": "" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" - }, - "response": [] - }, - { - "name": "Unfavorite Article", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "var responseJSON = JSON.parse(responseBody);", - "", - "tests['Response contains \"article\" property'] = responseJSON.hasOwnProperty('article');", - "", - "var article = responseJSON.article || {};", - "", - "tests['Article has \"title\" property'] = article.hasOwnProperty('title');", - "tests['Article has \"slug\" property'] = article.hasOwnProperty('slug');", - "tests['Article has \"body\" property'] = article.hasOwnProperty('body');", - "tests['Article has \"createdAt\" property'] = article.hasOwnProperty('createdAt');", - "tests['Article\\'s \"createdAt\" property is an ISO 8601 timestamp'] = new Date(article.createdAt).toISOString() === article.createdAt;", - "tests['Article has \"updatedAt\" property'] = article.hasOwnProperty('updatedAt');", - "tests['Article\\'s \"updatedAt\" property is an ISO 8601 timestamp'] = new Date(article.updatedAt).toISOString() === article.updatedAt;", - "tests['Article has \"description\" property'] = article.hasOwnProperty('description');", - "tests['Article has \"tagList\" property'] = article.hasOwnProperty('tagList');", - "tests['Article\\'s \"tagList\" property is an Array'] = Array.isArray(article.tagList);", - "tests['Article has \"author\" property'] = article.hasOwnProperty('author');", - "tests['Article has \"favorited\" property'] = article.hasOwnProperty('favorited');", - "tests['Article has \"favoritesCount\" property'] = article.hasOwnProperty('favoritesCount');", - "tests['favoritesCount is an integer'] = Number.isInteger(article.favoritesCount);", - "tests[\"Article's \\\"favorited\\\" property is true\"] = article.favorited === false;", - "" - ] - } - }], - "request": { - "url": "{{apiUrl}}/articles/{{slug}}/favorite", - "method": "DELETE", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - }, - { - "key": "Authorization", - "value": "Token {{token}}", - "description": "" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" - }, - "response": [] - } - ] - }, - { - "name": "Articles", - "description": "", - "item": [{ - "name": "All Articles", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "var is200Response = responseCode.code === 200;", - "", - "tests['Response code is 200 OK'] = is200Response;", - "", - "if(is200Response){", - " var responseJSON = JSON.parse(responseBody);", - "", - " tests['Response contains \"articles\" property'] = responseJSON.hasOwnProperty('articles');", - " tests['Response contains \"articlesCount\" property'] = responseJSON.hasOwnProperty('articlesCount');", - " tests['articlesCount is an integer'] = Number.isInteger(responseJSON.articlesCount);", - "", - " if(responseJSON.articles.length){", - " var article = responseJSON.articles[0];", - "", - " tests['Article has \"title\" property'] = article.hasOwnProperty('title');", - " tests['Article has \"slug\" property'] = article.hasOwnProperty('slug');", - " tests['Article has \"body\" property'] = article.hasOwnProperty('body');", - " tests['Article has \"createdAt\" property'] = article.hasOwnProperty('createdAt');", - " tests['Article\\'s \"createdAt\" property is an ISO 8601 timestamp'] = new Date(article.createdAt).toISOString() === article.createdAt;", - " tests['Article has \"updatedAt\" property'] = article.hasOwnProperty('updatedAt');", - " tests['Article\\'s \"updatedAt\" property is an ISO 8601 timestamp'] = new Date(article.updatedAt).toISOString() === article.updatedAt;", - " tests['Article has \"description\" property'] = article.hasOwnProperty('description');", - " tests['Article has \"tagList\" property'] = article.hasOwnProperty('tagList');", - " tests['Article\\'s \"tagList\" property is an Array'] = Array.isArray(article.tagList);", - " tests['Article has \"author\" property'] = article.hasOwnProperty('author');", - " tests['Article has \"favorited\" property'] = article.hasOwnProperty('favorited');", - " tests['Article has \"favoritesCount\" property'] = article.hasOwnProperty('favoritesCount');", - " tests['favoritesCount is an integer'] = Number.isInteger(article.favoritesCount);", - " } else {", - " tests['articlesCount is 0 when feed is empty'] = responseJSON.articlesCount === 0;", - " }", - "}", - "" - ] - } - }], - "request": { - "url": "{{apiUrl}}/articles", - "method": "GET", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" - }, - "response": [] - }, - { - "name": "Articles by Author", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "var is200Response = responseCode.code === 200;", - "", - "tests['Response code is 200 OK'] = is200Response;", - "", - "if(is200Response){", - " var responseJSON = JSON.parse(responseBody);", - "", - " tests['Response contains \"articles\" property'] = responseJSON.hasOwnProperty('articles');", - " tests['Response contains \"articlesCount\" property'] = responseJSON.hasOwnProperty('articlesCount');", - " tests['articlesCount is an integer'] = Number.isInteger(responseJSON.articlesCount);", - "", - " if(responseJSON.articles.length){", - " var article = responseJSON.articles[0];", - "", - " tests['Article has \"title\" property'] = article.hasOwnProperty('title');", - " tests['Article has \"slug\" property'] = article.hasOwnProperty('slug');", - " tests['Article has \"body\" property'] = article.hasOwnProperty('body');", - " tests['Article has \"createdAt\" property'] = article.hasOwnProperty('createdAt');", - " tests['Article\\'s \"createdAt\" property is an ISO 8601 timestamp'] = new Date(article.createdAt).toISOString() === article.createdAt;", - " tests['Article has \"updatedAt\" property'] = article.hasOwnProperty('updatedAt');", - " tests['Article\\'s \"updatedAt\" property is an ISO 8601 timestamp'] = new Date(article.updatedAt).toISOString() === article.updatedAt;", - " tests['Article has \"description\" property'] = article.hasOwnProperty('description');", - " tests['Article has \"tagList\" property'] = article.hasOwnProperty('tagList');", - " tests['Article\\'s \"tagList\" property is an Array'] = Array.isArray(article.tagList);", - " tests['Article has \"author\" property'] = article.hasOwnProperty('author');", - " tests['Article has \"favorited\" property'] = article.hasOwnProperty('favorited');", - " tests['Article has \"favoritesCount\" property'] = article.hasOwnProperty('favoritesCount');", - " tests['favoritesCount is an integer'] = Number.isInteger(article.favoritesCount);", - " } else {", - " tests['articlesCount is 0 when feed is empty'] = responseJSON.articlesCount === 0;", - " }", - "}", - "" - ] - } - }], - "request": { - "url": { - "raw": "{{apiUrl}}/articles?author=johnjacob", - "host": [ - "{{apiUrl}}" - ], - "path": [ - "articles" - ], - "query": [{ - "key": "author", - "value": "johnjacob" - }], - "variable": [] - }, - "method": "GET", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" - }, - "response": [] - }, - { - "name": "Articles Favorited by Username", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "var is200Response = responseCode.code === 200;", - "", - "tests['Response code is 200 OK'] = is200Response;", - "", - "if(is200Response){", - " var responseJSON = JSON.parse(responseBody);", - " ", - " tests['Response contains \"articles\" property'] = responseJSON.hasOwnProperty('articles');", - " tests['Response contains \"articlesCount\" property'] = responseJSON.hasOwnProperty('articlesCount');", - " tests['articlesCount is an integer'] = Number.isInteger(responseJSON.articlesCount);", - "", - " if(responseJSON.articles.length){", - " var article = responseJSON.articles[0];", - "", - " tests['Article has \"title\" property'] = article.hasOwnProperty('title');", - " tests['Article has \"slug\" property'] = article.hasOwnProperty('slug');", - " tests['Article has \"body\" property'] = article.hasOwnProperty('body');", - " tests['Article has \"createdAt\" property'] = article.hasOwnProperty('createdAt');", - " tests['Article\\'s \"createdAt\" property is an ISO 8601 timestamp'] = new Date(article.createdAt).toISOString() === article.createdAt;", - " tests['Article has \"updatedAt\" property'] = article.hasOwnProperty('updatedAt');", - " tests['Article\\'s \"updatedAt\" property is an ISO 8601 timestamp'] = new Date(article.updatedAt).toISOString() === article.updatedAt;", - " tests['Article has \"description\" property'] = article.hasOwnProperty('description');", - " tests['Article has \"tagList\" property'] = article.hasOwnProperty('tagList');", - " tests['Article\\'s \"tagList\" property is an Array'] = Array.isArray(article.tagList);", - " tests['Article has \"author\" property'] = article.hasOwnProperty('author');", - " tests['Article has \"favorited\" property'] = article.hasOwnProperty('favorited');", - " tests['Article has \"favoritesCount\" property'] = article.hasOwnProperty('favoritesCount');", - " tests['favoritesCount is an integer'] = Number.isInteger(article.favoritesCount);", - " } else {", - " tests['articlesCount is 0 when feed is empty'] = responseJSON.articlesCount === 0;", - " }", - "}", - "" - ] - } - }], - "request": { - "url": { - "raw": "{{apiUrl}}/articles?favorited=jane", - "host": [ - "{{apiUrl}}" - ], - "path": [ - "articles" - ], - "query": [{ - "key": "favorited", - "value": "jane" - }], - "variable": [] - }, - "method": "GET", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" - }, - "response": [] - }, - { - "name": "Articles by Tag", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "var is200Response = responseCode.code === 200;", - "", - "tests['Response code is 200 OK'] = is200Response;", - "", - "if(is200Response){", - " var responseJSON = JSON.parse(responseBody);", - "", - " tests['Response contains \"articles\" property'] = responseJSON.hasOwnProperty('articles');", - " tests['Response contains \"articlesCount\" property'] = responseJSON.hasOwnProperty('articlesCount');", - " tests['articlesCount is an integer'] = Number.isInteger(responseJSON.articlesCount);", - "", - " if(responseJSON.articles.length){", - " var article = responseJSON.articles[0];", - "", - " tests['Article has \"title\" property'] = article.hasOwnProperty('title');", - " tests['Article has \"slug\" property'] = article.hasOwnProperty('slug');", - " tests['Article has \"body\" property'] = article.hasOwnProperty('body');", - " tests['Article has \"createdAt\" property'] = article.hasOwnProperty('createdAt');", - " tests['Article\\'s \"createdAt\" property is an ISO 8601 timestamp'] = new Date(article.createdAt).toISOString() === article.createdAt;", - " tests['Article has \"updatedAt\" property'] = article.hasOwnProperty('updatedAt');", - " tests['Article\\'s \"updatedAt\" property is an ISO 8601 timestamp'] = new Date(article.updatedAt).toISOString() === article.updatedAt;", - " tests['Article has \"description\" property'] = article.hasOwnProperty('description');", - " tests['Article has \"tagList\" property'] = article.hasOwnProperty('tagList');", - " tests['Article\\'s \"tagList\" property is an Array'] = Array.isArray(article.tagList);", - " tests['Article has \"author\" property'] = article.hasOwnProperty('author');", - " tests['Article has \"favorited\" property'] = article.hasOwnProperty('favorited');", - " tests['Article has \"favoritesCount\" property'] = article.hasOwnProperty('favoritesCount');", - " tests['favoritesCount is an integer'] = Number.isInteger(article.favoritesCount);", - " } else {", - " tests['articlesCount is 0 when feed is empty'] = responseJSON.articlesCount === 0;", - " }", - "}", - "" - ] - } - }], - "request": { - "url": { - "raw": "{{apiUrl}}/articles?tag=dragons", - "host": [ - "{{apiUrl}}" - ], - "path": [ - "articles" - ], - "query": [{ - "key": "tag", - "value": "dragons" - }], - "variable": [] - }, - "method": "GET", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" - }, - "response": [] - }, - { - "name": "Single Article by slug", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "var responseJSON = JSON.parse(responseBody);", - "", - "tests['Response contains \"article\" property'] = responseJSON.hasOwnProperty('article');", - "", - "var article = responseJSON.article || {};", - "", - "tests['Article has \"title\" property'] = article.hasOwnProperty('title');", - "tests['Article has \"slug\" property'] = article.hasOwnProperty('slug');", - "tests['Article has \"body\" property'] = article.hasOwnProperty('body');", - "tests['Article has \"createdAt\" property'] = article.hasOwnProperty('createdAt');", - "tests['Article\\'s \"createdAt\" property is an ISO 8601 timestamp'] = new Date(article.createdAt).toISOString() === article.createdAt;", - "tests['Article has \"updatedAt\" property'] = article.hasOwnProperty('updatedAt');", - "tests['Article\\'s \"updatedAt\" property is an ISO 8601 timestamp'] = new Date(article.updatedAt).toISOString() === article.updatedAt;", - "tests['Article has \"description\" property'] = article.hasOwnProperty('description');", - "tests['Article has \"tagList\" property'] = article.hasOwnProperty('tagList');", - "tests['Article\\'s \"tagList\" property is an Array'] = Array.isArray(article.tagList);", - "tests['Article has \"author\" property'] = article.hasOwnProperty('author');", - "tests['Article has \"favorited\" property'] = article.hasOwnProperty('favorited');", - "tests['Article has \"favoritesCount\" property'] = article.hasOwnProperty('favoritesCount');", - "tests['favoritesCount is an integer'] = Number.isInteger(article.favoritesCount);", - "" - ] - } - }], - "request": { - "url": "{{apiUrl}}/articles/{{slug}}", - "method": "GET", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - } - ], - "body": {}, - "description": "" - }, - "response": [] - } - ] - }, - { - "name": "Comments", - "description": "", - "item": [{ - "name": "All Comments for Article", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "var is200Response = responseCode.code === 200", - "", - "tests['Response code is 200 OK'] = is200Response;", - "", - "if(is200Response){", - " var responseJSON = JSON.parse(responseBody);", - "", - " tests['Response contains \"comments\" property'] = responseJSON.hasOwnProperty('comments');", - "", - " if(responseJSON.comments.length){", - " var comment = responseJSON.comments[0];", - "", - " tests['Comment has \"id\" property'] = comment.hasOwnProperty('id');", - " tests['Comment has \"body\" property'] = comment.hasOwnProperty('body');", - " tests['Comment has \"createdAt\" property'] = comment.hasOwnProperty('createdAt');", - " tests['\"createdAt\" property is an ISO 8601 timestamp'] = new Date(comment.createdAt).toISOString() === comment.createdAt;", - " tests['Comment has \"updatedAt\" property'] = comment.hasOwnProperty('updatedAt');", - " tests['\"updatedAt\" property is an ISO 8601 timestamp'] = new Date(comment.updatedAt).toISOString() === comment.updatedAt;", - " tests['Comment has \"author\" property'] = comment.hasOwnProperty('author');", - " }", - "}", - "" - ] - } - }], - "request": { - "url": "{{apiUrl}}/articles/{{slug}}/comments", - "method": "GET", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - }, - { - "key": "Authorization", - "value": "Token {{token}}", - "description": "" - } - ], - "body": {}, - "description": "" - }, - "response": [] - }, - { - "name": "Create Comment for Article", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "var responseJSON = JSON.parse(responseBody);", - "", - "tests['Response contains \"comment\" property'] = responseJSON.hasOwnProperty('comment');", - "", - "var comment = responseJSON.comment || {};", - "", - "tests['Comment has \"id\" property'] = comment.hasOwnProperty('id');", - "tests['Comment has \"body\" property'] = comment.hasOwnProperty('body');", - "tests['Comment has \"createdAt\" property'] = comment.hasOwnProperty('createdAt');", - "tests['\"createdAt\" property is an ISO 8601 timestamp'] = new Date(comment.createdAt).toISOString() === comment.createdAt;", - "tests['Comment has \"author\" property'] = comment.hasOwnProperty('author');", - "" - ] - } - }], - "request": { - "url": "{{apiUrl}}/articles/{{slug}}/comments", - "method": "POST", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - }, - { - "key": "Authorization", - "value": "Token {{token}}", - "description": "" - } - ], - "body": { - "mode": "raw", - "raw": "{\"comment\":{\"body\":\"Thank you so much!\"}}" - }, - "description": "" - }, - "response": [] - }, - { - "name": "Delete Comment for Article", - "request": { - "url": "{{apiUrl}}/articles/{{slug}}/comments/1", - "method": "DELETE", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - }, - { - "key": "Authorization", - "value": "Token {{token}}", - "description": "" - } - ], - "body": {}, - "description": "" - }, - "response": [] - } - ] - }, - { - "name": "Profiles", - "description": "", - "item": [{ - "name": "Profile", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "if (!(environment.isIntegrationTest)) {", - "var is200Response = responseCode.code === 200;", - "", - "tests['Response code is 200 OK'] = is200Response;", - "", - "if(is200Response){", - " var responseJSON = JSON.parse(responseBody);", - "", - " tests['Response contains \"profile\" property'] = responseJSON.hasOwnProperty('profile');", - " ", - " var profile = responseJSON.profile || {};", - " ", - " tests['Profile has \"username\" property'] = profile.hasOwnProperty('username');", - " tests['Profile has \"image\" property'] = profile.hasOwnProperty('image');", - " tests['Profile has \"following\" property'] = profile.hasOwnProperty('following');", - "}", - "}", - "" - ] - } - }], - "request": { - "url": "{{apiUrl}}/profiles/johnjacob", - "method": "GET", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - }, - { - "key": "Authorization", - "value": "Token {{token}}", - "description": "" - } - ], - "body": {}, - "description": "" - }, - "response": [] - }, - { - "name": "Follow Profile", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "if (!(environment.isIntegrationTest)) {", - "var is200Response = responseCode.code === 200;", - "", - "tests['Response code is 200 OK'] = is200Response;", - "", - "if(is200Response){", - " var responseJSON = JSON.parse(responseBody);", - "", - " tests['Response contains \"profile\" property'] = responseJSON.hasOwnProperty('profile');", - " ", - " var profile = responseJSON.profile || {};", - " ", - " tests['Profile has \"username\" property'] = profile.hasOwnProperty('username');", - " tests['Profile has \"image\" property'] = profile.hasOwnProperty('image');", - " tests['Profile has \"following\" property'] = profile.hasOwnProperty('following');", - " tests['Profile\\'s \"following\" property is true'] = profile.following === true;", - "}", - "}", - "" - ] - } - }], - "request": { - "url": "{{apiUrl}}/profiles/johnjacob/follow", - "method": "POST", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - }, - { - "key": "Authorization", - "value": "Token {{token}}", - "description": "" - } - ], - "body": { - "mode": "raw", - "raw": "{\"user\":{\"email\":\"john@jacob.com\"}}" - }, - "description": "" - }, - "response": [] - }, - { - "name": "Unfollow Profile", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "if (!(environment.isIntegrationTest)) {", - "var is200Response = responseCode.code === 200;", - "", - "tests['Response code is 200 OK'] = is200Response;", - "", - "if(is200Response){", - " var responseJSON = JSON.parse(responseBody);", - "", - " tests['Response contains \"profile\" property'] = responseJSON.hasOwnProperty('profile');", - " ", - " var profile = responseJSON.profile || {};", - " ", - " tests['Profile has \"username\" property'] = profile.hasOwnProperty('username');", - " tests['Profile has \"image\" property'] = profile.hasOwnProperty('image');", - " tests['Profile has \"following\" property'] = profile.hasOwnProperty('following');", - " tests['Profile\\'s \"following\" property is false'] = profile.following === false;", - "}", - "}", - "" - ] - } - }], - "request": { - "url": "{{apiUrl}}/profiles/johnjacob/follow", - "method": "DELETE", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - }, - { - "key": "Authorization", - "value": "Token {{token}}", - "description": "" - } - ], - "body": {}, - "description": "" - }, - "response": [] - } - ] - }, - { - "name": "Tags", - "description": "", - "item": [{ - "name": "All Tags", - "event": [{ - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "var is200Response = responseCode.code === 200;", - "", - "tests['Response code is 200 OK'] = is200Response;", - "", - "if(is200Response){", - " var responseJSON = JSON.parse(responseBody);", - " ", - " tests['Response contains \"tags\" property'] = responseJSON.hasOwnProperty('tags');", - " tests['\"tags\" property returned as array'] = Array.isArray(responseJSON.tags);", - "}", - "" - ] - } - }], - "request": { - "url": "{{apiUrl}}/tags", - "method": "GET", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" - }, - "response": [] - }] - }, - { - "name": "Cleanup", - "description": "", - "item": [{ - "name": "Delete Article", - "request": { - "url": "{{apiUrl}}/articles/{{slug}}", - "method": "DELETE", - "header": [{ - "key": "Content-Type", - "value": "application/json", - "description": "" - }, - { - "key": "X-Requested-With", - "value": "XMLHttpRequest", - "description": "" - }, - { - "key": "Authorization", - "value": "Token {{token}}", - "description": "" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" - }, - "response": [] - }] - } - ] -} diff --git a/te-backend/tests/env-api-tests.postman.json b/te-backend/tests/env-api-tests.postman.json deleted file mode 100644 index f838f79..0000000 --- a/te-backend/tests/env-api-tests.postman.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "id": "4aa60b52-97fc-456d-4d4f-14a350e95dff", - "name": "Conduit API Tests - Environment", - "values": [{ - "enabled": true, - "key": "apiUrl", - "value": "http://localhost:3000/api", - "type": "text" - }], - "timestamp": 1505871382668, - "_postman_variable_scope": "environment", - "_postman_exported_at": "2017-09-20T01:36:34.835Z", - "_postman_exported_using": "Postman/5.2.0" -} diff --git a/te-frontend/.dockerignore b/te-frontend/.dockerignore deleted file mode 100644 index 009becc..0000000 --- a/te-frontend/.dockerignore +++ /dev/null @@ -1,5 +0,0 @@ -.gitignore -.gitlab-ci.yml -README.md -node_modules -project-logo.png diff --git a/te-frontend/.gitignore b/te-frontend/.gitignore deleted file mode 100644 index 22b3f47..0000000 --- a/te-frontend/.gitignore +++ /dev/null @@ -1,20 +0,0 @@ -# See http://help.github.com/ignore-files/ for more about ignoring files. - -# dependencies -node_modules - -# testing -coverage - -# production -build - -# misc -.DS_Store -.env -npm-debug.log -.idea - -# used only in local development -Dockerfile-dev -docker-compose-dev.yml diff --git a/te-frontend/Dockerfile b/te-frontend/Dockerfile deleted file mode 100644 index 6d4d9e8..0000000 --- a/te-frontend/Dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -# Choose base image (maybe use node 14 for fewer warnings??) (changed from node:16) -FROM node:14 - -# Create app directory -WORKDIR /usr/src/app - -# Install app dependecies -COPY package*.json ./ -RUN npm install - -# Bundle app source -COPY . . - -EXPOSE 4100 -CMD [ "npm", "start" ] diff --git a/te-frontend/README.md b/te-frontend/README.md deleted file mode 100644 index 776ea0a..0000000 --- a/te-frontend/README.md +++ /dev/null @@ -1,74 +0,0 @@ -#  - -[](http://realworld.io) - -> ### React + Redux codebase containing real world examples (CRUD, auth, advanced patterns, etc) that adheres to the [RealWorld](https://github.com/gothinkster/realworld-example-apps) spec and API. - -<a href="https://stackblitz.com/edit/react-redux-realworld" target="_blank"><img width="187" src="https://github.com/gothinkster/realworld/blob/master/media/edit_on_blitz.png?raw=true" /></a> <a href="https://thinkster.io/tutorials/build-a-real-world-react-redux-application" target="_blank"><img width="384" src="https://raw.githubusercontent.com/gothinkster/realworld/master/media/learn-btn-hr.png" /></a> - -### [Demo](https://react-redux.realworld.io) [RealWorld](https://github.com/gothinkster/realworld) - -Originally created for this [GH issue](https://github.com/reactjs/redux/issues/1353). The codebase is now feature complete; please submit bug fixes via pull requests & feedback via issues. - -We also have notes in [**our wiki**](https://github.com/gothinkster/react-redux-realworld-example-app/wiki) about how the various patterns used in this codebase and how they work (thanks [@thejmazz](https://github.com/thejmazz)!) - - -## Getting started - -You can view a live demo over at https://react-redux.realworld.io/ - -To get the frontend running locally: - -- Clone this repo -- `npm install` to install all req'd dependencies -- `npm start` to start the local server (this project uses create-react-app) - -Local web server will use port 4100 instead of standard React's port 3000 to prevent conflicts with some backends like Node or Rails. You can configure port in scripts section of `package.json`: we use [cross-env](https://github.com/kentcdodds/cross-env) to set environment variable PORT for React scripts, this is Windows-compatible way of setting environment variables. - -Alternatively, you can add `.env` file in the root folder of project to set environment variables (use PORT to change webserver's port). This file will be ignored by git, so it is suitable for API keys and other sensitive stuff. Refer to [dotenv](https://github.com/motdotla/dotenv) and [React](https://github.com/facebookincubator/create-react-app/blob/master/packages/react-scripts/template/README.md#adding-development-environment-variables-in-env) documentation for more details. Also, please remove setting variable via script section of `package.json` - `dotenv` never override variables if they are already set. - -### Making requests to the backend API - -For convenience, we have a live API server running at https://conduit.productionready.io/api for the application to make requests against. You can view [the API spec here](https://github.com/GoThinkster/productionready/blob/master/api) which contains all routes & responses for the server. - -The source code for the backend server (available for Node, Rails and Django) can be found in the [main RealWorld repo](https://github.com/gothinkster/realworld). - -If you want to change the API URL to a local server, simply edit `src/agent.js` and change `API_ROOT` to the local server's URL (i.e. `http://localhost:3000/api`) - - -## Functionality overview - -The example application is a social blogging site (i.e. a Medium.com clone) called "Conduit". It uses a custom API for all requests, including authentication. You can view a live demo over at https://redux.productionready.io/ - -**General functionality:** - -- Authenticate users via JWT (login/signup pages + logout button on settings page) -- CRU* users (sign up & settings page - no deleting required) -- CRUD Articles -- CR*D Comments on articles (no updating required) -- GET and display paginated lists of articles -- Favorite articles -- Follow other users - -**The general page breakdown looks like this:** - -- Home page (URL: /#/ ) - - List of tags - - List of articles pulled from either Feed, Global, or by Tag - - Pagination for list of articles -- Sign in/Sign up pages (URL: /#/login, /#/register ) - - Use JWT (store the token in localStorage) -- Settings page (URL: /#/settings ) -- Editor page to create/edit articles (URL: /#/editor, /#/editor/article-slug-here ) -- Article page (URL: /#/article/article-slug-here ) - - Delete article button (only shown to article's author) - - Render markdown from server client side - - Comments section at bottom of page - - Delete comment button (only shown to comment's author) -- Profile page (URL: /#/@username, /#/@username/favorites ) - - Show basic user info - - List of articles populated from author's created articles or author's favorited articles - -<br /> - -[](https://thinkster.io) diff --git a/te-frontend/package.json b/te-frontend/package.json deleted file mode 100644 index 8d7f2c4..0000000 --- a/te-frontend/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "react-redux-realworld-example-app", - "version": "2.0.0", - "private": true, - "devDependencies": { - "cross-env": "^5.1.4", - "react-scripts": "^4.0.3" - }, - "dependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@material-ui/core": "^4.12.3", - "@material-ui/icons": "^4.11.2", - "@mui/material": "^5.1.0", - "history": "^4.6.3", - "marked": "^0.3.6", - "prop-types": "^15.5.10", - "react": "^16.3.0", - "react-dom": "^16.3.0", - "react-redux": "^5.0.7", - "react-router": "^4.1.2", - "react-router-dom": "^4.1.2", - "react-router-redux": "^5.0.0-alpha.6", - "react-share": "^4.4.0", - "redux": "^3.6.0", - "redux-devtools-extension": "^2.13.2", - "redux-logger": "^3.0.1", - "superagent": "^3.8.2", - "superagent-promise": "^1.1.0", - "sweetalert": "^2.1.2", - "sweetalert2": "^11.1.9" - }, - "scripts": { - "start": "cross-env PORT=4100 react-scripts start", - "build": "react-scripts build", - "test": "cross-env PORT=4100 react-scripts test --env=jsdom", - "eject": "react-scripts eject" - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - } -} diff --git a/te-frontend/project-logo.png b/te-frontend/project-logo.png deleted file mode 100644 index 901b3b61b38fe94e2ded8be5632eb358be039cbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72206 zcmeFYWmKD8*DZ`wpt!r07MJ1@T#6NUCrEHBPM}cSp|}Khcei52p}4zSvEXoc-tWE7 zxS#*u&yz8dJ#r=ak#)^A*IaY$9j5$M1|5|I6$S<dUG|HlDhv!#5DW|~>^r2lE1mr1 zh;IvmrI?}^3`|W7+LOtD-ctd;s4Bw1czuL{`5p)Z^YC`*`vDA$D?1F#kueO6Kne^D zp<_m?iqP8!NT%{Kl5gwV<6ff8?`=VG{G#LX_6_X+JYk1FUWvT@97a}BOx<JYWYs-G zU(56F#XA4(n$@ya+fjcbvtIn}S`-=)yKx!^bqY=hfjD~(;+m{DdhBQFoKM#T3RQ)` zaPOW~=Q!IN!^WnPTgcUmlSMtP6`lN2YG&e%k4V<VFlXB>#M@%;?8NizN{A{DOZ*-6 z|9km=G5CKt`2RHxQlRR2$d37)wId#NJ_O}Vj-3Jc&vb3gBBu5r(0q7`|2ra^Ki6&u z)_US~)SsajA7f-_XZD&VrcCl;ax`DuLk@>YzlLpm+vw}WK?|l`HqT!Cky4{=Tt2JS z)&|dmFf9CM*G1{4W?ALYpML2WqyGl*jk`KhknfTWfdixS%~^a$v&c^K<R8^qE}7Uq ztn9xqWmM|nxybxR9EB#;LqPAJgR~W$tq%6xSw_<pO}q~t(S7so>5}7)nhryT>?F>b zJf=?A0<<7h7FnPy3<MD~LJHejk@~v|rL>+<<HY-BOGAa{BW}){(<otz{|@8Kyb3<v z!<_vzB*x=#AOP&7^qapon15i4G(r`1SA#N+{M8i3rUvrsA)LLC$og_|vQX!zvJlby z(aYKQHX{-FeNu3w((cdYvGDTE^7tCd7)fT*Xzh5;QB;<iclC%u%B?;p1jR4zW;Ljj z;q)cMCm0@}uL{prDv_jyYXy`J*B9i+!jI$L?WWY$H}C)^$X^2QPF);=v4E)@M>lG% zBa8?Y8KR{^_76FcH_DR3YEl#Pi`pxsw)QA)^`oH`w?DlqG_AqjTBZ`~(JR%I#V1A` z=hsDwZW;g1n9yGL8HAu0c2KnUw@4eUeUF>*Ns4{36}4=2ew^Hu9(80<Ja1Epg-i0e z)>dcH9kCKw&OcivgROAB^JgyJay6IebvKTAF-=QNZZa=le%EGb?4Mw?_|Vr*5V1^Y z1O^6)CdOzaXN?WNYDISle6_H<FAJCq@K>#qS+C{m667!Fe7Yolh?b^2uQ@uV^rDB5 zGL4N}_HIX+gcZ%=R7d2-XC{uMo>ddMNzzSQM=DBT%jv+N>FP|VAx_)|<H}a?E^awo z;Ce++7AxA3U(5pYHs_KW7Yc3G+Dv8gVpRT(FUf5(e6bv4nX&jb>65l|ip?Yc*i`>u zZGI|s6a?b#g=d@~sE{EFN$MrA@CkhYF+w5x;1ENbQ>4&$@$4c(v<B*0N3!m)FE2Ry zE1+Rw#c-?iRBD`2yH!FSwYyB9vja{<<8_URFMrrY#o~K>P`rP$#W$UBZ#Ekh$}CDX zKOu$!65o@-fGXdOp1@yj#3KQ!Ys?c-K}CDg@|HVwo9)%0wA{(QC~72x?^Owx!&6jH zp|)MNIb-GoywYqRR56A9Z4?K-q|5n<luV!e5^ks{10^7SB53&qDl$%Cb6tb>ZxE;G zP7Bl5f3zWdHu>H83dQywGydZ8>xY@=OyLtC@jVgH04b8yk2?}sp`Ju!;pj*7_usAQ zNNGZDqwhV8O%$Hn7x%TQvPzn`x0*#-#_F3M^=mtgtJYL@a^pgABM45D;RPWin0M-( zByH}>?~dWbR6Ko!xL;fnNt+{cGMr*q<S+LL-H$Nc9#?AlN>HQtpunD6kqd1hg82wH zhhf9mi6BeM5P3@rnP2<`;xqVCg{wsDas5f~q7c<$XFT;oIY$Sf9ZMD>_&MEjSm5CC zColh6v6XXqZg0W#Wz!hCv?slC)us@-x;^qNVTYw;1-yT20u|C}0s3pnx$$Ppna*4H zAMIeO+93k;&QeCi5HygasJNIy+!dY#BsX6)nfW5OfbMf�I0?CY)sAi^MFzJ)9tX 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%0D`*f6zxQYsVyEWj= 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 diff --git a/te-frontend/public/favicon.ico b/te-frontend/public/favicon.ico deleted file mode 100644 index 5c125de5d897c1ff5692a656485b3216123dcd89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24838 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 F{{x|jBbfjI diff --git a/te-frontend/public/index.html b/te-frontend/public/index.html deleted file mode 100644 index 21d61d5..0000000 --- a/te-frontend/public/index.html +++ /dev/null @@ -1,83 +0,0 @@ -<!doctype html> -<html lang="en"> - <head> - <style> - #doorbell{ - text-align: center; - } - #doorbell-submit-button{ - background-color: #5ED9C3; - color: rgb(255, 255, 255); - font-size: 1.1rem; - border-color: #5ED9C3; - } - #doorbell-submit-button:hover{ - background-color: #20c2a4; - color: rgb(255, 255, 255); - font-size: 1.1rem; - border-color: #219c86; - } - #doorbell-powered-by{ - color: #5ED9C3 - } - </style> - <!-- Global site tag (gtag.js) - Google Analytics --> - <script async src="https://www.googletagmanager.com/gtag/js?id=G-9FGSY8NE0L"></script> - <script> - window.dataLayer = window.dataLayer || []; - function gtag(){dataLayer.push(arguments);} - gtag('js', new Date()); - - gtag('config', 'G-9FGSY8NE0L'); - </script> - - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <link rel="shortcut icon" href="%PUBLIC_URL%/logo_wimma.png"> - <link rel="stylesheet" href="../main.css"> - <link href="//code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css" rel="stylesheet" type="text/css"> - <link href="//fonts.googleapis.com/css?family=Titillium+Web:700|Source+Serif+Pro:400,700|Merriweather+Sans:400,700|Source+Sans+Pro:400,300,600,700,300italic,400italic,600italic,700italic" rel="stylesheet" type="text/css"> - <!-- - Notice the use of %PUBLIC_URL% in the tag above. - It will be replaced with the URL of the `public` folder during the build. - Only files inside the `public` folder can be referenced from the HTML. - - Unlike "/favicon.ico" or "favico.ico", "%PUBLIC_URL%/favicon.ico" will - work correctly both with client-side routing and a non-root public URL. - Learn how to configure a non-root public URL by running `npm run build`. - --> - <title>WIMMA Lab Forum</title> - </head> - <body> - <div id="root"></div> - <!-- - This HTML file is a template. - If you open it directly in the browser, you will see an empty page. - - You can add webfonts, meta tags, or analytics to this file. - The build step will place the bundled scripts into the <body> tag. - - To begin the development, run `npm start`. - To create a production bundle, use `npm run build`. - --> - </body> - <script type="text/javascript"> - window.doorbellOptions = { - "id": "12727", - "appKey": "gcS5JEM6B1yEf3mRntjR2cKutewNl36UvthiBAEAv0K7o1kVkYIDi0CIVMpSIX5A", - strings: { - "feedback-button-text": "Feedback", - title: "Wimma Forum Feedback", - "feedback-textarea-placeholder": "Help Wimma Forum to improve, letting us know what you think.", - "email-input-placeholder": "Your email address"}, - email:"", - }; - (function(w, d, t) { - var hasLoaded = false; - function l() { if (hasLoaded) { return; } hasLoaded = true; window.doorbellOptions.windowLoaded = true; var g = d.createElement(t);g.id = 'doorbellScript';g.type = 'text/javascript';g.async = true;g.src = 'https://embed.doorbell.io/button/'+ - window.doorbellOptions['id']+'?t='+(new Date().getTime());(d.getElementsByTagName('head')[0]||d.getElementsByTagName('body')[0]).appendChild(g); } - if (w.attachEvent) { w.attachEvent('onload', l); } else if (w.addEventListener) { w.addEventListener('load', l, false); } else { l(); } - if (d.readyState == 'complete') { l(); } - }(window, document, 'script')); -</script> -</html> diff --git a/te-frontend/public/main.css b/te-frontend/public/main.css deleted file mode 100644 index 0d6dd8f..0000000 --- a/te-frontend/public/main.css +++ /dev/null @@ -1,3 +0,0 @@ -.logo-font{font-family:titillium web,sans-serif}html{position:relative;min-height:100vh;padding-bottom:100px}/*!* Bootstrap v4.0.0-alpha.2 (http://getbootstrap.com) -* Copyright 2011-2016 Twitter, Inc. -* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)*//*!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{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]{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{*,*::before,*::after,*::first-letter,*::first-line{text-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.tag{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}@-ms-viewport{width:device-width;}html{font-size:16px;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}body{font-family:source sans pro,sans-serif;font-size:1rem;line-height:1.5;color:#373a3c;background-color:#fff}[tabindex="-1"]:focus{outline:none!important}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #818a91}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}a{color:#5ED9C3;text-decoration:none}a:focus,a:hover{color:#5ed9c29a;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:not([href]){color:inherit;text-decoration:none}a:not([href]):focus,a:not([href]):hover{color:inherit;text-decoration:none}a:not([href]):focus{outline:none}pre{margin-top:0;margin-bottom:1rem}figure{margin:0 0 1rem}img{vertical-align:middle}[role=button]{cursor:pointer}a,area,button,[role=button],input,label,select,summary,textarea{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}input,button,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:.5rem;font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1,.h1{font-size:2.5rem}h2,.h2{font-size:2rem}h3,.h3{font-size:1.75rem}h4,.h4{font-size:1.5rem}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}.lead{font-size:1.25rem;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.25rem;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"}.img-fluid,.carousel-inner>.carousel-item>img,.carousel-inner>.carousel-item>a>img{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;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:Menlo,Monaco,Consolas,liberation mono,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}@media(min-width:544px){.container{max-width:576px}}@media(min-width:768px){.container{max-width:720px}}@media(min-width:992px){.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}.row{display:flex;flex-wrap:wrap;margin-left:-15px;margin-right:-15px}.col-xs{position:relative;flex-basis:0;flex-grow:1;max-width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 8.33333%;max-width:8.33333%}.col-xs-2{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 16.66667%;max-width:16.66667%}.col-xs-3{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 25%;max-width:25%}.col-xs-4{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 33.33333%;max-width:33.33333%}.col-xs-5{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 41.66667%;max-width:41.66667%}.col-xs-6{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 50%;max-width:50%}.col-xs-7{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 58.33333%;max-width:58.33333%}.col-xs-8{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 66.66667%;max-width:66.66667%}.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 75%;max-width:75%}.col-xs-10{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 83.33333%;max-width:83.33333%}.col-xs-11{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 91.66667%;max-width:91.66667%}.col-xs-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 100%;max-width:100%}.pull-xs-0{right:auto}.pull-xs-1{right:8.33333%}.pull-xs-2{right:16.66667%}.pull-xs-3{right:25%}.pull-xs-4{right:33.33333%}.pull-xs-5{right:41.66667%}.pull-xs-6{right:50%}.pull-xs-7{right:58.33333%}.pull-xs-8{right:66.66667%}.pull-xs-9{right:75%}.pull-xs-10{right:83.33333%}.pull-xs-11{right:91.66667%}.pull-xs-12{right:100%}.push-xs-0{left:auto}.push-xs-1{left:8.33333%}.push-xs-2{left:16.66667%}.push-xs-3{left:25%}.push-xs-4{left:33.33333%}.push-xs-5{left:41.66667%}.push-xs-6{left:50%}.push-xs-7{left:58.33333%}.push-xs-8{left:66.66667%}.push-xs-9{left:75%}.push-xs-10{left:83.33333%}.push-xs-11{left:91.66667%}.push-xs-12{left:100%}.offset-xs-1{margin-left:8.33333%}.offset-xs-2{margin-left:16.66667%}.offset-xs-3{margin-left:25%}.offset-xs-4{margin-left:33.33333%}.offset-xs-5{margin-left:41.66667%}.offset-xs-6{margin-left:50%}.offset-xs-7{margin-left:58.33333%}.offset-xs-8{margin-left:66.66667%}.offset-xs-9{margin-left:75%}.offset-xs-10{margin-left:83.33333%}.offset-xs-11{margin-left:91.66667%}@media(min-width:544px){.col-sm{position:relative;flex-basis:0;flex-grow:1;max-width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col-sm-1{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 8.33333%;max-width:8.33333%}.col-sm-2{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 16.66667%;max-width:16.66667%}.col-sm-3{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 25%;max-width:25%}.col-sm-4{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 33.33333%;max-width:33.33333%}.col-sm-5{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 41.66667%;max-width:41.66667%}.col-sm-6{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 50%;max-width:50%}.col-sm-7{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 58.33333%;max-width:58.33333%}.col-sm-8{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 66.66667%;max-width:66.66667%}.col-sm-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 75%;max-width:75%}.col-sm-10{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 83.33333%;max-width:83.33333%}.col-sm-11{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 91.66667%;max-width:91.66667%}.col-sm-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 100%;max-width:100%}.pull-sm-0{right:auto}.pull-sm-1{right:8.33333%}.pull-sm-2{right:16.66667%}.pull-sm-3{right:25%}.pull-sm-4{right:33.33333%}.pull-sm-5{right:41.66667%}.pull-sm-6{right:50%}.pull-sm-7{right:58.33333%}.pull-sm-8{right:66.66667%}.pull-sm-9{right:75%}.pull-sm-10{right:83.33333%}.pull-sm-11{right:91.66667%}.pull-sm-12{right:100%}.push-sm-0{left:auto}.push-sm-1{left:8.33333%}.push-sm-2{left:16.66667%}.push-sm-3{left:25%}.push-sm-4{left:33.33333%}.push-sm-5{left:41.66667%}.push-sm-6{left:50%}.push-sm-7{left:58.33333%}.push-sm-8{left:66.66667%}.push-sm-9{left:75%}.push-sm-10{left:83.33333%}.push-sm-11{left:91.66667%}.push-sm-12{left:100%}.offset-sm-0{margin-left:0%}.offset-sm-1{margin-left:8.33333%}.offset-sm-2{margin-left:16.66667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333%}.offset-sm-5{margin-left:41.66667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333%}.offset-sm-8{margin-left:66.66667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333%}.offset-sm-11{margin-left:91.66667%}}@media(min-width:768px){.col-md{position:relative;flex-basis:0;flex-grow:1;max-width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col-md-1{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 8.33333%;max-width:8.33333%}.col-md-2{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 16.66667%;max-width:16.66667%}.col-md-3{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 25%;max-width:25%}.col-md-4{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 33.33333%;max-width:33.33333%}.col-md-5{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 41.66667%;max-width:41.66667%}.col-md-6{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 50%;max-width:50%}.col-md-7{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 58.33333%;max-width:58.33333%}.col-md-8{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 66.66667%;max-width:66.66667%}.col-md-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 75%;max-width:75%}.col-md-10{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 83.33333%;max-width:83.33333%}.col-md-11{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 91.66667%;max-width:91.66667%}.col-md-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 100%;max-width:100%}.pull-md-0{right:auto}.pull-md-1{right:8.33333%}.pull-md-2{right:16.66667%}.pull-md-3{right:25%}.pull-md-4{right:33.33333%}.pull-md-5{right:41.66667%}.pull-md-6{right:50%}.pull-md-7{right:58.33333%}.pull-md-8{right:66.66667%}.pull-md-9{right:75%}.pull-md-10{right:83.33333%}.pull-md-11{right:91.66667%}.pull-md-12{right:100%}.push-md-0{left:auto}.push-md-1{left:8.33333%}.push-md-2{left:16.66667%}.push-md-3{left:25%}.push-md-4{left:33.33333%}.push-md-5{left:41.66667%}.push-md-6{left:50%}.push-md-7{left:58.33333%}.push-md-8{left:66.66667%}.push-md-9{left:75%}.push-md-10{left:83.33333%}.push-md-11{left:91.66667%}.push-md-12{left:100%}.offset-md-0{margin-left:0%}.offset-md-1{margin-left:8.33333%}.offset-md-2{margin-left:16.66667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333%}.offset-md-5{margin-left:41.66667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333%}.offset-md-8{margin-left:66.66667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333%}.offset-md-11{margin-left:91.66667%}}@media(min-width:992px){.col-lg{position:relative;flex-basis:0;flex-grow:1;max-width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col-lg-1{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 8.33333%;max-width:8.33333%}.col-lg-2{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 16.66667%;max-width:16.66667%}.col-lg-3{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 25%;max-width:25%}.col-lg-4{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 33.33333%;max-width:33.33333%}.col-lg-5{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 41.66667%;max-width:41.66667%}.col-lg-6{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 50%;max-width:50%}.col-lg-7{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 58.33333%;max-width:58.33333%}.col-lg-8{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 66.66667%;max-width:66.66667%}.col-lg-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 75%;max-width:75%}.col-lg-10{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 83.33333%;max-width:83.33333%}.col-lg-11{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 91.66667%;max-width:91.66667%}.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 100%;max-width:100%}.pull-lg-0{right:auto}.pull-lg-1{right:8.33333%}.pull-lg-2{right:16.66667%}.pull-lg-3{right:25%}.pull-lg-4{right:33.33333%}.pull-lg-5{right:41.66667%}.pull-lg-6{right:50%}.pull-lg-7{right:58.33333%}.pull-lg-8{right:66.66667%}.pull-lg-9{right:75%}.pull-lg-10{right:83.33333%}.pull-lg-11{right:91.66667%}.pull-lg-12{right:100%}.push-lg-0{left:auto}.push-lg-1{left:8.33333%}.push-lg-2{left:16.66667%}.push-lg-3{left:25%}.push-lg-4{left:33.33333%}.push-lg-5{left:41.66667%}.push-lg-6{left:50%}.push-lg-7{left:58.33333%}.push-lg-8{left:66.66667%}.push-lg-9{left:75%}.push-lg-10{left:83.33333%}.push-lg-11{left:91.66667%}.push-lg-12{left:100%}.offset-lg-0{margin-left:0%}.offset-lg-1{margin-left:8.33333%}.offset-lg-2{margin-left:16.66667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333%}.offset-lg-5{margin-left:41.66667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333%}.offset-lg-8{margin-left:66.66667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333%}.offset-lg-11{margin-left:91.66667%}}@media(min-width:1200px){.col-xl{position:relative;flex-basis:0;flex-grow:1;max-width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col-xl-1{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 8.33333%;max-width:8.33333%}.col-xl-2{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 16.66667%;max-width:16.66667%}.col-xl-3{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 25%;max-width:25%}.col-xl-4{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 33.33333%;max-width:33.33333%}.col-xl-5{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 41.66667%;max-width:41.66667%}.col-xl-6{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 50%;max-width:50%}.col-xl-7{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 58.33333%;max-width:58.33333%}.col-xl-8{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 66.66667%;max-width:66.66667%}.col-xl-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 75%;max-width:75%}.col-xl-10{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 83.33333%;max-width:83.33333%}.col-xl-11{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 91.66667%;max-width:91.66667%}.col-xl-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 100%;max-width:100%}.pull-xl-0{right:auto}.pull-xl-1{right:8.33333%}.pull-xl-2{right:16.66667%}.pull-xl-3{right:25%}.pull-xl-4{right:33.33333%}.pull-xl-5{right:41.66667%}.pull-xl-6{right:50%}.pull-xl-7{right:58.33333%}.pull-xl-8{right:66.66667%}.pull-xl-9{right:75%}.pull-xl-10{right:83.33333%}.pull-xl-11{right:91.66667%}.pull-xl-12{right:100%}.push-xl-0{left:auto}.push-xl-1{left:8.33333%}.push-xl-2{left:16.66667%}.push-xl-3{left:25%}.push-xl-4{left:33.33333%}.push-xl-5{left:41.66667%}.push-xl-6{left:50%}.push-xl-7{left:58.33333%}.push-xl-8{left:66.66667%}.push-xl-9{left:75%}.push-xl-10{left:83.33333%}.push-xl-11{left:91.66667%}.push-xl-12{left:100%}.offset-xl-0{margin-left:0%}.offset-xl-1{margin-left:8.33333%}.offset-xl-2{margin-left:16.66667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333%}.offset-xl-5{margin-left:41.66667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333%}.offset-xl-8{margin-left:66.66667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333%}.offset-xl-11{margin-left:91.66667%}}.table{width:100%;max-width:100%;margin-bottom:1rem}.table th,.table td{padding:.75rem;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 th,.table-sm td{padding:.3rem}.table-bordered{border:1px solid #eceeef}.table-bordered th,.table-bordered td{border:1px solid #eceeef}.table-bordered thead th,.table-bordered thead td{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover tbody tr:hover{background-color:#f5f5f5}.table-active,.table-active>th,.table-active>td{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>th,.table-success>td{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>th,.table-info>td{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>th,.table-warning>td{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>th,.table-danger>td{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:#373a3c}.table-inverse.table-bordered{border:0}.table-inverse th,.table-inverse td,.table-inverse thead th{border-color:#55595c}.table-reflow thead{float:left}.table-reflow tbody{display:block;white-space:nowrap}.table-reflow th,.table-reflow td{border-top:1px solid #eceeef;border-left:1px solid #eceeef}.table-reflow th:last-child,.table-reflow td:last-child{border-right:1px solid #eceeef}.table-reflow thead:last-child tr:last-child th,.table-reflow thead:last-child tr:last-child td,.table-reflow tbody:last-child tr:last-child th,.table-reflow tbody:last-child tr:last-child td,.table-reflow tfoot:last-child tr:last-child th,.table-reflow tfoot:last-child tr:last-child td{border-bottom:1px solid #eceeef}.table-reflow tr{float:left}.table-reflow tr th,.table-reflow tr td{display:block!important;border:1px solid #eceeef}.form-control{display:block;width:100%;padding:.5rem .75rem;font-size:1rem;line-height:1.25;color:#55595c;background-color:#fff;background-image:none;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{border-color:#66afe9;outline:none}.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.5rem}.form-control-file,.form-control-range{display:block}.form-control-label{padding:.5rem .75rem;margin-bottom:0}.form-control-legend{padding:.5rem .75rem;margin-bottom:0;font-size:1rem}_::-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.5rem}_::-webkit-full-page-media.input-sm,.input-group-sm _::-webkit-full-page-media.form-control,input[type=date].input-sm,.input-group-sm input[type=date].form-control,input[type=time].input-sm,.input-group-sm input[type=time].form-control,input[type=datetime-local].input-sm,.input-group-sm input[type=datetime-local].form-control,input[type=month].input-sm,.input-group-sm input[type=month].form-control{line-height:1.8125rem}_::-webkit-full-page-media.input-lg,.input-group-lg _::-webkit-full-page-media.form-control,input[type=date].input-lg,.input-group-lg input[type=date].form-control,input[type=time].input-lg,.input-group-lg input[type=time].form-control,input[type=datetime-local].input-lg,.input-group-lg input[type=datetime-local].form-control,input[type=month].input-lg,.input-group-lg input[type=month].form-control{line-height:3.16667rem}.form-control-static{min-height:2.5rem;padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0}.form-control-static.form-control-sm,.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,.form-control-static.form-control-lg,.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{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}.radio,.checkbox{position:relative;display:block;margin-bottom:.75rem}.radio label,.checkbox label{padding-left:1.25rem;margin-bottom:0;cursor:pointer}.radio label input:only-child,.checkbox label input:only-child{position:static}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-top:.25rem;margin-left:-1.25rem}.radio+.radio,.checkbox+.checkbox{margin-top:-.25rem}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:1.25rem;margin-bottom:0;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:.75rem}input[type=radio]:disabled,input[type=radio].disabled,input[type=checkbox]:disabled,input[type=checkbox].disabled{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label{cursor:not-allowed}.form-control-success,.form-control-warning,.form-control-danger{padding-right:2.25rem;background-repeat:no-repeat;background-position:center right .625rem;background-size:1.25rem 1.25rem}.has-success .text-help,.has-success .form-control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label,.has-success .custom-control{color:#5ED9C3}.has-success .form-control{border-color:#5ED9C3}.has-success .input-group-addon{color:#5ED9C3;border-color:#5ED9C3;background-color:#eaf6ea}.has-success .form-control-feedback{color:#5ED9C3}.has-success .form-control-success{background-image:url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA4IDgnPjxwYXRoIGZpbGw9JyM1Y2I4NWMnIGQ9J00yLjMgNi43M0wuNiA0LjUzYy0uNC0xLjA0LjQ2LTEuNCAxLjEtLjhsMS4xIDEuNCAzLjQtMy44Yy42LS42MyAxLjYtLjI3IDEuMi43bC00IDQuNmMtLjQzLjUtLjguNC0xLjEuMXonLz48L3N2Zz4=)}.has-warning .text-help,.has-warning .form-control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label,.has-warning .custom-control{color:#f0ad4e}.has-warning .form-control{border-color:#f0ad4e}.has-warning .input-group-addon{color:#f0ad4e;border-color:#f0ad4e;background-color:#fff}.has-warning .form-control-feedback{color:#f0ad4e}.has-warning .form-control-warning{background-image:url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA4IDgnPjxwYXRoIGZpbGw9JyNmMGFkNGUnIGQ9J000LjQgNS4zMjRoLS44di0yLjQ2aC44em0wIDEuNDJoLS44VjUuODloLjh6TTMuNzYuNjNMLjA0IDcuMDc1Yy0uMTE1LjIuMDE2LjQyNS4yNi40MjZoNy4zOTdjLjI0MiAwIC4zNzItLjIyNi4yNTgtLjQyNkM2LjcyNiA0LjkyNCA1LjQ3IDIuNzkgNC4yNTMuNjNjLS4xMTMtLjE3NC0uMzktLjE3NC0uNDk0IDB6Jy8+PC9zdmc+)}.has-danger .text-help,.has-danger .form-control-label,.has-danger .radio,.has-danger .checkbox,.has-danger .radio-inline,.has-danger .checkbox-inline,.has-danger.radio label,.has-danger.checkbox label,.has-danger.radio-inline label,.has-danger.checkbox-inline label,.has-danger .custom-control{color:#b85c5c}.has-danger .form-control{border-color:#b85c5c}.has-danger .input-group-addon{color:#b85c5c;border-color:#b85c5c;background-color:#f6eaea}.has-danger .form-control-feedback{color:#b85c5c}.has-danger .form-control-danger{background-image:url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIGZpbGw9JyNkOTUzNGYnIHZpZXdCb3g9Jy0yIC0yIDcgNyc+PHBhdGggc3Ryb2tlPScjZDk1MzRmJyBkPSdNMCAwbDMgM20wLTNMMCAzJy8+PGNpcmNsZSByPScuNScvPjxjaXJjbGUgY3g9JzMnIHI9Jy41Jy8+PGNpcmNsZSBjeT0nMycgcj0nLjUnLz48Y2lyY2xlIGN4PSczJyBjeT0nMycgcj0nLjUnLz48L3N2Zz4=)}@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 .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .form-control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.btn{display:inline-block;font-weight:400;line-height:1.25;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;user-select:none;border:1px solid transparent;padding:.5rem 1rem;font-size:1rem;border-radius:.25rem}.btn:focus,.btn.focus,.btn:active:focus,.btn:active.focus,.btn.active:focus,.btn.active.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:#5ED9C3;border-color:#5ED9C3}.btn-primary:hover{color:#fff;background-color:#38b5b3;border-color:#419641}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#38b5b3;border-color:#419641}.btn-primary:active,.btn-primary.active,.open>.btn-primary.dropdown-toggle{color:#fff;background-color:#38b5b3;border-color:#419641;background-image:none}.btn-primary:active:hover,.btn-primary:active:focus,.btn-primary:active.focus,.btn-primary.active:hover,.btn-primary.active:focus,.btn-primary.active.focus,.open>.btn-primary.dropdown-toggle:hover,.open>.btn-primary.dropdown-toggle:focus,.open>.btn-primary.dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#2d672d}.btn-primary.disabled:focus,.btn-primary.disabled.focus,.btn-primary:disabled:focus,.btn-primary:disabled.focus{background-color:#5ED9C3;border-color:#5ED9C3}.btn-primary.disabled:hover,.btn-primary:disabled:hover{background-color:#5ED9C3;border-color:#5ED9C3}.btn-secondary{color:#373a3c;background-color:#fff;border-color:#ccc}.btn-secondary:hover{color:#373a3c;background-color:#e6e6e6;border-color:#adadad}.btn-secondary:focus,.btn-secondary.focus{color:#373a3c;background-color:#e6e6e6;border-color:#adadad}.btn-secondary:active,.btn-secondary.active,.open>.btn-secondary.dropdown-toggle{color:#373a3c;background-color:#e6e6e6;border-color:#adadad;background-image:none}.btn-secondary:active:hover,.btn-secondary:active:focus,.btn-secondary:active.focus,.btn-secondary.active:hover,.btn-secondary.active:focus,.btn-secondary.active.focus,.open>.btn-secondary.dropdown-toggle:hover,.open>.btn-secondary.dropdown-toggle:focus,.open>.btn-secondary.dropdown-toggle.focus{color:#373a3c;background-color:#d4d4d4;border-color:#8c8c8c}.btn-secondary.disabled:focus,.btn-secondary.disabled.focus,.btn-secondary:disabled:focus,.btn-secondary:disabled.focus{background-color:#fff;border-color:#ccc}.btn-secondary.disabled:hover,.btn-secondary:disabled:hover{background-color:#fff;border-color:#ccc}.btn-info{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#2aabd2}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#2aabd2}.btn-info:active,.btn-info.active,.open>.btn-info.dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#2aabd2;background-image:none}.btn-info:active:hover,.btn-info:active:focus,.btn-info:active.focus,.btn-info.active:hover,.btn-info.active:focus,.btn-info.active.focus,.open>.btn-info.dropdown-toggle:hover,.open>.btn-info.dropdown-toggle:focus,.open>.btn-info.dropdown-toggle.focus{color:#fff;background-color:#269abc;border-color:#1f7e9a}.btn-info.disabled:focus,.btn-info.disabled.focus,.btn-info:disabled:focus,.btn-info:disabled.focus{background-color:#5bc0de;border-color:#5bc0de}.btn-info.disabled:hover,.btn-info:disabled:hover{background-color:#5bc0de;border-color:#5bc0de}.btn-success{color:#fff;background-color:#5ED9C3;border-color:#5ED9C3}.btn-success:hover{color:#fff;background-color:#38b5b3;border-color:#419641}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#38b5b3;border-color:#419641}.btn-success:active,.btn-success.active,.open>.btn-success.dropdown-toggle{color:#fff;background-color:#38b5b3;border-color:#419641;background-image:none}.btn-success:active:hover,.btn-success:active:focus,.btn-success:active.focus,.btn-success.active:hover,.btn-success.active:focus,.btn-success.active.focus,.open>.btn-success.dropdown-toggle:hover,.open>.btn-success.dropdown-toggle:focus,.open>.btn-success.dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#2d672d}.btn-success.disabled:focus,.btn-success.disabled.focus,.btn-success:disabled:focus,.btn-success:disabled.focus{background-color:#5ED9C3;border-color:#5ED9C3}.btn-success.disabled:hover,.btn-success:disabled:hover{background-color:#5ED9C3;border-color:#5ED9C3}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#eb9316}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#eb9316}.btn-warning:active,.btn-warning.active,.open>.btn-warning.dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#eb9316;background-image:none}.btn-warning:active:hover,.btn-warning:active:focus,.btn-warning:active.focus,.btn-warning.active:hover,.btn-warning.active:focus,.btn-warning.active.focus,.open>.btn-warning.dropdown-toggle:hover,.open>.btn-warning.dropdown-toggle:focus,.open>.btn-warning.dropdown-toggle.focus{color:#fff;background-color:#d58512;border-color:#b06d0f}.btn-warning.disabled:focus,.btn-warning.disabled.focus,.btn-warning:disabled:focus,.btn-warning:disabled.focus{background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning.disabled:hover,.btn-warning:disabled:hover{background-color:#f0ad4e;border-color:#f0ad4e}.btn-danger{color:#fff;background-color:#b85c5c;border-color:#b85c5c}.btn-danger:hover{color:#fff;background-color:#9d4444;border-color:#964141}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#9d4444;border-color:#964141}.btn-danger:active,.btn-danger.active,.open>.btn-danger.dropdown-toggle{color:#fff;background-color:#9d4444;border-color:#964141;background-image:none}.btn-danger:active:hover,.btn-danger:active:focus,.btn-danger:active.focus,.btn-danger.active:hover,.btn-danger.active:focus,.btn-danger.active.focus,.open>.btn-danger.dropdown-toggle:hover,.open>.btn-danger.dropdown-toggle:focus,.open>.btn-danger.dropdown-toggle.focus{color:#fff;background-color:#843939;border-color:#672d2d}.btn-danger.disabled:focus,.btn-danger.disabled.focus,.btn-danger:disabled:focus,.btn-danger:disabled.focus{background-color:#b85c5c;border-color:#b85c5c}.btn-danger.disabled:hover,.btn-danger:disabled:hover{background-color:#b85c5c;border-color:#b85c5c}.btn-outline-primary{color:#5ED9C3;background-image:none;background-color:transparent;border-color:#5ED9C3}.btn-outline-primary:hover{color:#fff;background-color:#5ED9C3;border-color:#5ED9C3}.btn-outline-primary:focus,.btn-outline-primary.focus{color:#fff;background-color:#5ED9C3;border-color:#5ED9C3}.btn-outline-primary:active,.btn-outline-primary.active,.open>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#5ED9C3;border-color:#5ED9C3}.btn-outline-primary:active:hover,.btn-outline-primary:active:focus,.btn-outline-primary:active.focus,.btn-outline-primary.active:hover,.btn-outline-primary.active:focus,.btn-outline-primary.active.focus,.open>.btn-outline-primary.dropdown-toggle:hover,.open>.btn-outline-primary.dropdown-toggle:focus,.open>.btn-outline-primary.dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#2d672d}.btn-outline-primary.disabled:focus,.btn-outline-primary.disabled.focus,.btn-outline-primary:disabled:focus,.btn-outline-primary:disabled.focus{border-color:#a3d7a3}.btn-outline-primary.disabled:hover,.btn-outline-primary:disabled:hover{border-color:#a3d7a3}.btn-outline-secondary{color:#ccc;background-image:none;background-color:transparent;border-color:#ccc}.btn-outline-secondary:hover{color:#fff;background-color:#ccc;border-color:#ccc}.btn-outline-secondary:focus,.btn-outline-secondary.focus{color:#fff;background-color:#ccc;border-color:#ccc}.btn-outline-secondary:active,.btn-outline-secondary.active,.open>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#ccc;border-color:#ccc}.btn-outline-secondary:active:hover,.btn-outline-secondary:active:focus,.btn-outline-secondary:active.focus,.btn-outline-secondary.active:hover,.btn-outline-secondary.active:focus,.btn-outline-secondary.active.focus,.open>.btn-outline-secondary.dropdown-toggle:hover,.open>.btn-outline-secondary.dropdown-toggle:focus,.open>.btn-outline-secondary.dropdown-toggle.focus{color:#fff;background-color:#a1a1a1;border-color:#8c8c8c}.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:#5bc0de;background-image:none;background-color:transparent;border-color:#5bc0de}.btn-outline-info:hover{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-info:focus,.btn-outline-info.focus{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-info:active,.btn-outline-info.active,.open>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-info:active:hover,.btn-outline-info:active:focus,.btn-outline-info:active.focus,.btn-outline-info.active:hover,.btn-outline-info.active:focus,.btn-outline-info.active.focus,.open>.btn-outline-info.dropdown-toggle:hover,.open>.btn-outline-info.dropdown-toggle:focus,.open>.btn-outline-info.dropdown-toggle.focus{color:#fff;background-color:#269abc;border-color:#1f7e9a}.btn-outline-info.disabled:focus,.btn-outline-info.disabled.focus,.btn-outline-info:disabled:focus,.btn-outline-info:disabled.focus{border-color:#b0e1ef}.btn-outline-info.disabled:hover,.btn-outline-info:disabled:hover{border-color:#b0e1ef}.btn-outline-success{color:#5ED9C3;background-image:none;background-color:transparent;border-color:#5ED9C3}.btn-outline-success:hover{color:#fff;background-color:#5ED9C3;border-color:#5ED9C3}.btn-outline-success:focus,.btn-outline-success.focus{color:#fff;background-color:#5ED9C3;border-color:#5ED9C3}.btn-outline-success:active,.btn-outline-success.active,.open>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#5ED9C3;border-color:#5ED9C3}.btn-outline-success:active:hover,.btn-outline-success:active:focus,.btn-outline-success:active.focus,.btn-outline-success.active:hover,.btn-outline-success.active:focus,.btn-outline-success.active.focus,.open>.btn-outline-success.dropdown-toggle:hover,.open>.btn-outline-success.dropdown-toggle:focus,.open>.btn-outline-success.dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#2d672d}.btn-outline-success.disabled:focus,.btn-outline-success.disabled.focus,.btn-outline-success:disabled:focus,.btn-outline-success:disabled.focus{border-color:#a3d7a3}.btn-outline-success.disabled:hover,.btn-outline-success:disabled:hover{border-color:#a3d7a3}.btn-outline-warning{color:#f0ad4e;background-image:none;background-color:transparent;border-color:#f0ad4e}.btn-outline-warning:hover{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-warning:focus,.btn-outline-warning.focus{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-warning:active,.btn-outline-warning.active,.open>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-warning:active:hover,.btn-outline-warning:active:focus,.btn-outline-warning:active.focus,.btn-outline-warning.active:hover,.btn-outline-warning.active:focus,.btn-outline-warning.active.focus,.open>.btn-outline-warning.dropdown-toggle:hover,.open>.btn-outline-warning.dropdown-toggle:focus,.open>.btn-outline-warning.dropdown-toggle.focus{color:#fff;background-color:#d58512;border-color:#b06d0f}.btn-outline-warning.disabled:focus,.btn-outline-warning.disabled.focus,.btn-outline-warning:disabled:focus,.btn-outline-warning:disabled.focus{border-color:#f8d9ac}.btn-outline-warning.disabled:hover,.btn-outline-warning:disabled:hover{border-color:#f8d9ac}.btn-outline-danger{color:#b85c5c;background-image:none;background-color:transparent;border-color:#b85c5c}.btn-outline-danger:hover{color:#fff;background-color:#b85c5c;border-color:#b85c5c}.btn-outline-danger:focus,.btn-outline-danger.focus{color:#fff;background-color:#b85c5c;border-color:#b85c5c}.btn-outline-danger:active,.btn-outline-danger.active,.open>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#b85c5c;border-color:#b85c5c}.btn-outline-danger:active:hover,.btn-outline-danger:active:focus,.btn-outline-danger:active.focus,.btn-outline-danger.active:hover,.btn-outline-danger.active:focus,.btn-outline-danger.active.focus,.open>.btn-outline-danger.dropdown-toggle:hover,.open>.btn-outline-danger.dropdown-toggle:focus,.open>.btn-outline-danger.dropdown-toggle.focus{color:#fff;background-color:#843939;border-color:#672d2d}.btn-outline-danger.disabled:focus,.btn-outline-danger.disabled.focus,.btn-outline-danger:disabled:focus,.btn-outline-danger:disabled.focus{border-color:#d7a3a3}.btn-outline-danger.disabled:hover,.btn-outline-danger:disabled:hover{border-color:#d7a3a3}.btn-link{font-weight:400;color:#5ED9C3;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link:disabled{background-color:transparent}.btn-link,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#3d8b3d;text-decoration:underline;background-color:transparent}.btn-link:disabled:focus,.btn-link:disabled:hover{color:#818a91;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:.75rem 1.5rem;font-size:1.25rem;border-radius:.3rem}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;transition-timing-function:ease;transition-duration:.35s;transition-property:height}.dropup,.dropdown{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:1rem;color:#373a3c;text-align:left;list-style:none;background-color:#fff;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:#5ED9C3;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>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:hover,.btn-group-vertical>.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>.btn-lg+.dropdown-toggle,.btn-group-lg.btn-group>.btn+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn .caret{margin-left:0}.btn-lg .caret,.btn-group-lg>.btn .caret{border-width:.3em .3em 0;border-bottom-width:0}.dropup .btn-lg .caret,.dropup .btn-group-lg>.btn .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=radio],[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;width:100%;display:flex}.input-group .form-control{position:relative;z-index:2;flex:1;margin-bottom:0}.input-group .form-control:focus,.input-group .form-control:active,.input-group .form-control:hover{z-index:3}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{white-space:nowrap;vertical-align:middle}.input-group-addon{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;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=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:not(:last-child),.input-group-addon:not(:last-child),.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group>.btn,.input-group-btn:not(:last-child)>.dropdown-toggle,.input-group-btn:not(:first-child)>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:not(:first-child)>.btn-group:not(:last-child)>.btn{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:not(:first-child),.input-group-btn:not(:last-child)>.btn-group:not(:first-child)>.btn{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:focus,.input-group-btn>.btn:active,.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:focus,.input-group-btn:not(:first-child)>.btn:active,.input-group-btn:not(:first-child)>.btn:hover,.input-group-btn:not(:first-child)>.btn-group:focus,.input-group-btn:not(:first-child)>.btn-group:active,.input-group-btn:not(:first-child)>.btn-group:hover{z-index:3}.custom-control{position:relative;display:inline;padding-left:1.5rem;cursor:pointer}.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{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;user-select:none;background-color:#ddd;background-repeat:no-repeat;background-position:center center;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;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA4IDgnPjxwYXRoIGZpbGw9JyNmZmYnIGQ9J002LjU2NC43NWwtMy41OSAzLjYxMi0xLjUzOC0xLjU1TDAgNC4yNiAyLjk3NCA3LjI1IDggMi4xOTN6Jy8+PC9zdmc+)}.custom-checkbox .custom-control-input:indeterminate~.custom-control-indicator{background-color:#0074d9;background-image:url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA0IDQnPjxwYXRoIHN0cm9rZT0nI2ZmZicgZD0nTTAgMmg0Jy8+PC9zdmc+)}.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;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9Jy00IC00IDggOCc+PGNpcmNsZSByPSczJyBmaWxsPScjZmZmJy8+PC9zdmc+)}.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;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA0IDUnPjxwYXRoIGZpbGw9JyMzMzMnIGQ9J00yIDBMMCAyaDR6bTAgNUwwIDNoNHonLz48L3N2Zz4=) no-repeat right .75rem center;background-image:none \9;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:none}.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;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}.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-link.active,.nav-tabs .nav-link.active:focus,.nav-tabs .nav-link.active:hover,.nav-tabs .nav-item.open .nav-link,.nav-tabs .nav-item.open .nav-link:focus,.nav-tabs .nav-item.open .nav-link: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-link.active,.nav-pills .nav-link.active:focus,.nav-pills .nav-link.active:hover,.nav-pills .nav-item.open .nav-link,.nav-pills .nav-item.open .nav-link:focus,.nav-pills .nav-item.open .nav-link:hover{color:#fff;cursor:default;background-color:#5ED9C3}.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-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media(min-width:544px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0}.navbar-fixed-bottom{bottom:0}.navbar-sticky-top{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:992px){.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 .open>.nav-link,.navbar-light .navbar-nav .open>.nav-link:focus,.navbar-light .navbar-nav .open>.nav-link:hover,.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.open,.navbar-light .navbar-nav .nav-link.open:focus,.navbar-light .navbar-nav .nav-link.open:hover,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.active:focus,.navbar-light .navbar-nav .nav-link.active: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 .open>.nav-link,.navbar-dark .navbar-nav .open>.nav-link:focus,.navbar-dark .navbar-nav .open>.nav-link:hover,.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.open,.navbar-dark .navbar-nav .nav-link.open:focus,.navbar-dark .navbar-nav .nav-link.open:hover,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.active:focus,.navbar-dark .navbar-nav .nav-link.active: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;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;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{height:67px;padding:.75rem 1.25rem;background-color:#f5f5f5;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:#5ED9C3;border-color:#5ED9C3}.card-success{background-color:#5ED9C3;border-color:#5ED9C3}.card-info{background-color:#5bc0de;border-color:#5bc0de}.card-warning{background-color:#f0ad4e;border-color:#f0ad4e}.card-danger{background-color:#b85c5c;border-color:#b85c5c}.card-outline-primary{background-color:transparent;border-color:#5ED9C3}.card-outline-secondary{background-color:transparent;border-color:#ccc}.card-outline-info{background-color:transparent;border-color:#5bc0de}.card-outline-success{background-color:transparent;border-color:#5ED9C3}.card-outline-warning{background-color:transparent;border-color:#f0ad4e}.card-outline-danger{background-color:transparent;border-color:#b85c5c}.card-inverse .card-header,.card-inverse .card-footer{border-bottom:1px solid rgba(255,255,255,.2)}.card-inverse .card-header,.card-inverse .card-footer,.card-inverse .card-title,.card-inverse .card-blockquote{color:#fff}.card-inverse .card-link,.card-inverse .card-text,.card-inverse .card-blockquote>footer{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:flex;flex-flow:row wrap;margin-right:-.625rem;margin-left:-.625rem}.card-deck .card{flex:1 0 0;margin-right:.625rem;margin-left:.625rem}}@media(min-width:544px){.card-group{display:flex;flex-flow:row wrap}.card-group .card{flex:1 0 0}.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-top,.card-group .card:not(:first-child):not(:last-child) .card-img-bottom{border-radius:0}}@media(min-width:544px){.card-columns{column-count:3;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:#5ED9C3;border-color:#5ED9C3}.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:#5ED9C3;text-decoration:none;background-color:#fff;border:1px solid #ddd}.page-link:focus,.page-link:hover{color:#3d8b3d;background-color:#eceeef;border-color:#ddd}.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}.tag{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}.tag:empty{display:none}.btn .tag{position:relative;top:-1px}a.tag:focus,a.tag:hover{color:#fff;text-decoration:none;cursor:pointer}.tag-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.tag-default{background-color:#818a91}.tag-default[href]:focus,.tag-default[href]:hover{background-color:#687077}.tag-primary{background-color:#5ED9C3}.tag-primary[href]:focus,.tag-primary[href]:hover{background-color:#38b5b3}.tag-success{background-color:#5ED9C3}.tag-success[href]:focus,.tag-success[href]:hover{background-color:#38b5b3}.tag-info{background-color:#5bc0de}.tag-info[href]:focus,.tag-info[href]:hover{background-color:#31b0d5}.tag-warning{background-color:#f0ad4e}.tag-warning[href]:focus,.tag-warning[href]:hover{background-color:#ec971f}.tag-danger{background-color:#b85c5c}.tag-danger[href]:focus,.tag-danger[href]:hover{background-color:#9d4444}.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}@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;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}base::-moz-progress-bar,.progress[value]{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:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-striped[value]::-moz-progress-bar{background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-striped[value]::-ms-fill{background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}@media screen and (min-width:0\0){.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}}.progress-animated[value]::-webkit-progress-value{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{animation:progress-bar-stripes 2s linear infinite}}.progress-success[value]::-webkit-progress-value{background-color:#5ED9C3}.progress-success[value]::-moz-progress-bar{background-color:#5ED9C3}.progress-success[value]::-ms-fill{background-color:#5ED9C3}@media screen and (min-width:0\0){.progress-success .progress-bar{background-color:#5ED9C3}}.progress-info[value]::-webkit-progress-value{background-color:#5bc0de}.progress-info[value]::-moz-progress-bar{background-color:#5bc0de}.progress-info[value]::-ms-fill{background-color:#5bc0de}@media screen and (min-width:0\0){.progress-info .progress-bar{background-color:#5bc0de}}.progress-warning[value]::-webkit-progress-value{background-color:#f0ad4e}.progress-warning[value]::-moz-progress-bar{background-color:#f0ad4e}.progress-warning[value]::-ms-fill{background-color:#f0ad4e}@media screen and (min-width:0\0){.progress-warning .progress-bar{background-color:#f0ad4e}}.progress-danger[value]::-webkit-progress-value{background-color:#b85c5c}.progress-danger[value]::-moz-progress-bar{background-color:#b85c5c}.progress-danger[value]::-ms-fill{background-color:#b85c5c}@media screen and (min-width:0\0){.progress-danger .progress-bar{background-color:#b85c5c}}.media{display:flex;margin-bottom:1rem}.media-body{flex:1}.media-middle{align-self:center}.media-bottom{align-self:flex-end}.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:#5ED9C3;border-color:#5ED9C3}.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:#eaf6ea}.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 iframe,.embed-responsive embed,.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.85714%}.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.5rem;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{transition:transform .3s ease-out;transform:translate(0,-25%)}.modal.in .modal-dialog{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;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.5}.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:992px){.modal-lg{max-width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:source sans pro,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;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.tooltip-top,.tooltip.bs-tether-element-attached-bottom{padding:5px 0;margin-top:-3px}.tooltip.tooltip-top .tooltip-arrow,.tooltip.bs-tether-element-attached-bottom .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.tooltip-right,.tooltip.bs-tether-element-attached-left{padding:0 5px;margin-left:3px}.tooltip.tooltip-right .tooltip-arrow,.tooltip.bs-tether-element-attached-left .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.tooltip-bottom,.tooltip.bs-tether-element-attached-top{padding:5px 0;margin-top:3px}.tooltip.tooltip-bottom .tooltip-arrow,.tooltip.bs-tether-element-attached-top .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.tooltip-left,.tooltip.bs-tether-element-attached-right{padding:0 5px;margin-left:-3px}.tooltip.tooltip-left .tooltip-arrow,.tooltip.bs-tether-element-attached-right .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:source sans pro,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;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;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover.popover-top,.popover.bs-tether-element-attached-bottom{margin-top:-10px}.popover.popover-top .popover-arrow,.popover.bs-tether-element-attached-bottom .popover-arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.popover-top .popover-arrow::after,.popover.bs-tether-element-attached-bottom .popover-arrow::after{bottom:1px;margin-left:-10px;content:"";border-top-color:#fff;border-bottom-width:0}.popover.popover-right,.popover.bs-tether-element-attached-left{margin-left:10px}.popover.popover-right .popover-arrow,.popover.bs-tether-element-attached-left .popover-arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.popover-right .popover-arrow::after,.popover.bs-tether-element-attached-left .popover-arrow::after{bottom:-10px;left:1px;content:"";border-right-color:#fff;border-left-width:0}.popover.popover-bottom,.popover.bs-tether-element-attached-top{margin-top:10px}.popover.popover-bottom .popover-arrow,.popover.bs-tether-element-attached-top .popover-arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:rgba(0,0,0,.25)}.popover.popover-bottom .popover-arrow::after,.popover.bs-tether-element-attached-top .popover-arrow::after{top:1px;margin-left:-10px;content:"";border-top-width:0;border-bottom-color:#fff}.popover.popover-left,.popover.bs-tether-element-attached-right{margin-left:-10px}.popover.popover-left .popover-arrow,.popover.bs-tether-element-attached-right .popover-arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:rgba(0,0,0,.25)}.popover.popover-left .popover-arrow::after,.popover.bs-tether-element-attached-right .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:1rem;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;transition:.6s ease-in-out left}.carousel-inner>.carousel-item>img,.carousel-inner>.carousel-item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.carousel-item{transition:transform .6s ease-in-out;backface-visibility:hidden;perspective:1000px}.carousel-inner>.carousel-item.next,.carousel-inner>.carousel-item.active.right{left:0;transform:translate3d(100%,0,0)}.carousel-inner>.carousel-item.prev,.carousel-inner>.carousel-item.active.left{left:0;transform:translate3d(-100%,0,0)}.carousel-inner>.carousel-item.next.left,.carousel-inner>.carousel-item.prev.right,.carousel-inner>.carousel-item.active{left: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:linear-gradient(to right,rgba(0,0,0,0.5) 0%,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0%,rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control .icon-prev,.carousel-control .icon-next{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-prev,.carousel-control .icon-next{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{color:#fff!important;background-color:#5ED9C3!important}a.bg-primary:focus,a.bg-primary:hover{background-color:#38b5b3!important}.bg-success{color:#fff!important;background-color:#5ED9C3!important}a.bg-success:focus,a.bg-success:hover{background-color:#38b5b3!important}.bg-info{color:#fff!important;background-color:#5bc0de!important}a.bg-info:focus,a.bg-info:hover{background-color:#31b0d5!important}.bg-warning{color:#fff!important;background-color:#f0ad4e!important}a.bg-warning:focus,a.bg-warning:hover{background-color:#ec971f!important}.bg-danger{color:#fff!important;background-color:#b85c5c!important}a.bg-danger:focus,a.bg-danger:hover{background-color:#9d4444!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:992px){.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!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!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!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!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}.p-a-0{padding: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!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!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!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}.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:992px){.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:#5ED9C3!important}a.text-primary:focus,a.text-primary:hover{color:#38b5b3}.text-success{color:#5ED9C3!important}a.text-success:focus,a.text-success:hover{color:#38b5b3}.text-info{color:#5bc0de!important}a.text-info:focus,a.text-info:hover{color:#31b0d5}.text-warning{color:#f0ad4e!important}a.text-warning:focus,a.text-warning:hover{color:#ec971f}.text-danger{color:#b85c5c!important}a.text-danger:focus,a.text-danger:hover{color:#9d4444}.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:991px){.hidden-md-down{display:none!important}}@media(min-width:992px){.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}}.flex-xs-first{order:-1}.flex-xs-last{order:1}.flex-items-xs-top{align-items:flex-start}.flex-items-xs-middle{align-items:center}.flex-items-xs-bottom{align-items:flex-end}.flex-xs-top{align-self:flex-start}.flex-xs-middle{align-self:center}.flex-xs-bottom{align-self:flex-end}.flex-items-xs-left{justify-content:flex-start}.flex-items-xs-center{justify-content:center}.flex-items-xs-right{justify-content:flex-end}.flex-items-xs-around{justify-content:space-around}.flex-items-xs-between{justify-content:space-between}@media(min-width:544px){.flex-sm-first{order:-1}.flex-sm-last{order:1}}@media(min-width:544px){.flex-items-sm-top{align-items:flex-start}.flex-items-sm-middle{align-items:center}.flex-items-sm-bottom{align-items:flex-end}}@media(min-width:544px){.flex-sm-top{align-self:flex-start}.flex-sm-middle{align-self:center}.flex-sm-bottom{align-self:flex-end}}@media(min-width:544px){.flex-items-sm-left{justify-content:flex-start}.flex-items-sm-center{justify-content:center}.flex-items-sm-right{justify-content:flex-end}.flex-items-sm-around{justify-content:space-around}.flex-items-sm-between{justify-content:space-between}}@media(min-width:768px){.flex-md-first{order:-1}.flex-md-last{order:1}}@media(min-width:768px){.flex-items-md-top{align-items:flex-start}.flex-items-md-middle{align-items:center}.flex-items-md-bottom{align-items:flex-end}}@media(min-width:768px){.flex-md-top{align-self:flex-start}.flex-md-middle{align-self:center}.flex-md-bottom{align-self:flex-end}}@media(min-width:768px){.flex-items-md-left{justify-content:flex-start}.flex-items-md-center{justify-content:center}.flex-items-md-right{justify-content:flex-end}.flex-items-md-around{justify-content:space-around}.flex-items-md-between{justify-content:space-between}}@media(min-width:992px){.flex-lg-first{order:-1}.flex-lg-last{order:1}}@media(min-width:992px){.flex-items-lg-top{align-items:flex-start}.flex-items-lg-middle{align-items:center}.flex-items-lg-bottom{align-items:flex-end}}@media(min-width:992px){.flex-lg-top{align-self:flex-start}.flex-lg-middle{align-self:center}.flex-lg-bottom{align-self:flex-end}}@media(min-width:992px){.flex-items-lg-left{justify-content:flex-start}.flex-items-lg-center{justify-content:center}.flex-items-lg-right{justify-content:flex-end}.flex-items-lg-around{justify-content:space-around}.flex-items-lg-between{justify-content:space-between}}@media(min-width:1200px){.flex-xl-first{order:-1}.flex-xl-last{order:1}}@media(min-width:1200px){.flex-items-xl-top{align-items:flex-start}.flex-items-xl-middle{align-items:center}.flex-items-xl-bottom{align-items:flex-end}}@media(min-width:1200px){.flex-xl-top{align-self:flex-start}.flex-xl-middle{align-self:center}.flex-xl-bottom{align-self:flex-end}}@media(min-width:1200px){.flex-items-xl-left{justify-content:flex-start}.flex-items-xl-center{justify-content:center}.flex-items-xl-right{justify-content:flex-end}.flex-items-xl-around{justify-content:space-around}.flex-items-xl-between{justify-content:space-between}}.tag-default{color:#fff!important;font-size:.8rem;padding-top:.1rem;padding-bottom:.1rem;white-space:nowrap;margin-right:3px;margin-bottom:.2rem;display:inline-block}.tag-default:hover{text-decoration:none}.tag-default.tag-outline{border:1px solid #ddd;color:#aaa!important;background:0 0!important}ul.tag-list{padding-left:0!important;display:inline-block;list-style:none!important}ul.tag-list li{display:inline-block!important}.navbar-brand{font-family:titillium web,sans-serif;font-size:1.5rem!important;padding-top:0!important;margin-right:2rem!important;color:#5ED9C3!important}.nav-link .user-pic{height:26px;border-radius:50px;float:left;margin-right:5px}.nav-link:hover{transition:.1s all}.nav-pills.outline-active .nav-link{border-radius:0;border:none;border-bottom:2px solid transparent;background:0 0;color:#aaa}.nav-pills.outline-active .nav-link:hover{color:#555}.nav-pills.outline-active .nav-link.active{background:#fff!important;border-bottom:2px solid #5ED9C3!important;color:#5ED9C3!important}footer{background:#f3f3f3;margin-top:3rem;padding:1rem 0;position:absolute;bottom:0;width:100%}footer .logo-font{vertical-align:middle}footer .attribution{vertical-align:middle;margin-left:10px;font-size:.8rem;color:#bbb;font-weight:300}.error-messages{color:#b85c5c!important;font-weight:700}.banner{color:#fff;background:#333;padding:2rem;margin-bottom:2rem}.banner h1{text-shadow:0 1px 3px rgba(0,0,0,.3);margin-bottom:0}.container.page{margin-top:1.5rem}.preview-link{color:inherit!important}.preview-link:hover{text-decoration:inherit!important}.article-meta{display:block;position:relative;font-weight:300}.article-meta img{display:inline-block;vertical-align:middle;height:32px;width:32px;border-radius:30px}.article-meta .info{margin:0 1.5rem 0 .3rem;display:inline-block;vertical-align:middle;line-height:1rem}.article-meta .info .author{display:block;font-weight:500!important}.article-meta .info .date{color:#bbb;font-size:.8rem;display:block}.article-preview{border-top:1px solid rgba(0,0,0,.1);padding:1.5rem 0}.article-preview .article-meta{margin:0 0 1rem}.article-preview .preview-link h1{font-weight:600!important;font-size:1.5rem!important;margin-bottom:3px}.article-preview .preview-link p{font-weight:300;font-size:24px;color:#999;margin-bottom:15px;font-size:1rem;line-height:1.3rem}.article-preview .preview-link span{max-width:30%;font-size:.8rem;font-weight:300;color:#bbb;vertical-align:middle}.article-preview .preview-link ul{float:right;max-width:50%;vertical-align:top}.article-preview .preview-link ul li{font-weight:300;font-size:.8rem!important;padding-top:0!important;padding-bottom:0!important}.btn .counter{font-size:.8rem!important}.home-page .banner{background:#5ED9C3;box-shadow:inset 0 8px 8px -8px rgba(0,0,0,.3),inset 0 -8px 8px -8px rgba(0,0,0,.3)}.home-page .banner p{color:#fff;text-align:center;font-size:1.5rem;font-weight:300!important;margin-bottom:0}.home-page .banner h1{text-shadow:0 1px 3px rgba(0,0,0,.3);font-weight:700!important;text-align:center;font-size:3.5rem;padding-bottom:.5rem}.home-page .feed-toggle{margin-bottom:-1px}.home-page .sidebar{padding:5px 10px 10px;background:#f3f3f3;border-radius:4px}.home-page .sidebar p{margin-bottom:.2rem}.article-page .banner{padding:2rem 0}.article-page .banner h1{font-size:2.8rem;font-weight:600}.article-page .banner .btn{opacity:.8}.article-page .banner .btn:hover{transition:.1s all;opacity:1}.article-page .banner .article-meta{margin:2rem 0 0}.article-page .banner .article-meta .author{color:#fff}.article-page .article-content p{font-family:'source serif pro',serif;font-size:1.2rem;line-height:1.8rem;margin-bottom:2rem}.article-page .article-content h1,.article-page .article-content h2,.article-page .article-content h3,.article-page .article-content h4,.article-page .article-content h5,.article-page .article-content h6{font-weight:500!important;margin:1.6rem 0 1rem}.article-page .article-actions{text-align:center;margin:1.5rem 0 3rem}.article-page .article-actions .article-meta .info{text-align:left}.article-page .comment-form .card-block{padding:0}.article-page .comment-form .card-block textarea{border:0;padding:1.25rem}.article-page .comment-form .card-footer .btn{font-weight:700;float:right}.article-page .comment-form .card-footer .comment-author-img{position:absolute;top:110px;height:30px;width:30px}.article-page .card{border:1px solid #e5e5e5;box-shadow:none!important}.article-page .card .card-footer{border-top:1px solid #e5e5e5;box-shadow:none!important;font-size:.8rem;font-weight:300}.article-page .card .comment-author-img{display:inline-block;vertical-align:middle;height:20px;width:20px;border-radius:30px}.article-page .card .comment-author{display:inline-block;vertical-align:middle}.article-page .card .date-posted{display:inline-block;vertical-align:middle;margin-left:5px;color:#bbb}.article-page .card .mod-options{float:right;color:#333;font-size:1rem}.article-page .card .mod-options i{margin-left:5px;opacity:.6;cursor:pointer}.article-page .card .mod-options i:hover{opacity:1}.profile-page .user-info{text-align:center;background:#f3f3f3;padding:2rem 0 1rem}.profile-page .user-info .user-img{width:100px;height:100px;border-radius:100px;margin-bottom:1rem}.profile-page .user-info h4{font-weight:700}.profile-page .user-info p{margin:0 auto .5rem;color:#aaa;max-width:450px;font-weight:300}.profile-page .user-info .action-btn{float:right;color:#999;border:1px solid #999}.profile-page .articles-toggle{margin:1.5rem 0 -1px}.editor-page .tag-list i{font-size:.6rem;margin-right:5px;cursor:pointer} \ No newline at end of file diff --git a/te-frontend/src/agent.js b/te-frontend/src/agent.js deleted file mode 100644 index 29d7e14..0000000 --- a/te-frontend/src/agent.js +++ /dev/null @@ -1,99 +0,0 @@ -import superagentPromise from 'superagent-promise'; -import _superagent from 'superagent'; - -const superagent = superagentPromise(_superagent, global.Promise); - -const API_ROOT = process.env.REACT_APP_API_ROOT || 'https://conduit.productionready.io/api'; - -const encode = encodeURIComponent; -const responseBody = res => res.body; - -let token = null; -const tokenPlugin = req => { - if (token) { - req.set('authorization', `Token ${token}`); - } -} - -const requests = { - del: (url, body) => - superagent.del(`${API_ROOT}${url}`, body).use(tokenPlugin).then(responseBody), - get: url => - superagent.get(`${API_ROOT}${url}`).use(tokenPlugin).then(responseBody), - put: (url, body) => - superagent.put(`${API_ROOT}${url}`, body).use(tokenPlugin).then(responseBody), - post: (url, body) => - superagent.post(`${API_ROOT}${url}`, body).use(tokenPlugin).then(responseBody) -}; - -const Auth = { - current: () => - requests.get('/user'), - login: (email, password) => - requests.post('/users/login', { user: { email, password } }), - register: (username, email, password) => - requests.post('/users', { user: { username, email, password } }), - save: user => - requests.put('/user', { user }), - delete: user => - requests.del('/user', { user }) -}; - -const Tags = { - getAll: () => requests.get('/tags') -}; - -//feed offset was 0 -const limit = (count, p) => `limit=${count}&offset=${p ? p * count : 0}`; -const omitSlug = article => Object.assign({}, article, { slug: undefined }) -const Articles = { - all: page => - requests.get(`/articles?${limit(10, page)}`), - byAuthor: (author, page) => - requests.get(`/articles?author=${encode(author)}&${limit(5, page)}`), - byTag: (tag, page) => - requests.get(`/articles?tag=${encode(tag)}&${limit(10, page)}`), - del: slug => - requests.del(`/articles/${slug}`), - favorite: slug => - requests.post(`/articles/${slug}/favorite`), - favoritedBy: (author, page) => - requests.get(`/articles?favorited=${encode(author)}&${limit(5, page)}`), - feed: (page) => - requests.get(`/articles/feed?${limit(10, page)}`), - get: slug => - requests.get(`/articles/${slug}`), - unfavorite: slug => - requests.del(`/articles/${slug}/favorite`), - update: article => - requests.put(`/articles/${article.slug}`, { article: omitSlug(article) }), - create: article => - requests.post('/articles', { article }) -}; - -const Comments = { - create: (slug, comment) => - requests.post(`/articles/${slug}/comments`, { comment }), - delete: (slug, commentId) => - requests.del(`/articles/${slug}/comments/${commentId}`), - forArticle: slug => - requests.get(`/articles/${slug}/comments`) -}; - -const Profile = { - follow: username => - requests.post(`/profiles/${username}/follow`), - get: username => - requests.get(`/profiles/${username}`), - unfollow: username => - requests.del(`/profiles/${username}/follow`) -}; - -export default { - Articles, - Auth, - Comments, - Profile, - Tags, - setToken: _token => { token = _token; } -}; diff --git a/te-frontend/src/components/App.js b/te-frontend/src/components/App.js deleted file mode 100644 index 8a8ec8a..0000000 --- a/te-frontend/src/components/App.js +++ /dev/null @@ -1,90 +0,0 @@ -import agent from '../agent'; -import Header from './Header'; -import React from 'react'; -import { connect } from 'react-redux'; -import { APP_LOAD, REDIRECT } from '../constants/actionTypes'; -import { Route, Switch } from 'react-router-dom'; -import Article from '../components/Article'; -import Editor from '../components/Editor'; -import edit from '../components/edit'; -import Home from '../components/Home'; -import Login from '../components/Login'; -import Profile from '../components/Profile'; -import ProfileFavorites from '../components/ProfileFavorites'; -import Register from '../components/Register'; -import Settings from '../components/Settings'; -import { store } from '../store'; -import { push } from 'react-router-redux'; -import './App.css'; -import Banner from './Home/Banner'; - -const mapStateToProps = state => { - return { - appLoaded: state.common.appLoaded, - appName: state.common.appName, - currentUser: state.common.currentUser, - redirectTo: state.common.redirectTo - }}; - -const mapDispatchToProps = dispatch => ({ - onLoad: (payload, token) => - dispatch({ type: APP_LOAD, payload, token, skipTracking: true }), - onRedirect: () => - dispatch({ type: REDIRECT }) -}); - -class App extends React.Component { - componentWillReceiveProps(nextProps) { - if (nextProps.redirectTo) { - // this.context.router.replace(nextProps.redirectTo); - store.dispatch(push(nextProps.redirectTo)); - this.props.onRedirect(); - } - } - - componentWillMount() { - const token = window.localStorage.getItem('jwt'); - if (token) { - agent.setToken(token); - } - - this.props.onLoad(token ? agent.Auth.current() : null, token); - } - - render() { - if (this.props.appLoaded) { - return ( - <div> - <Header - appName={this.props.appName} - currentUser={this.props.currentUser} /> - <Banner/> - <Switch> - <Route exact path="/" component={Home}/> - <Route path="/login" component={Login} /> - <Route path="/register" component={Register} /> - <Route path="/edit/:slug" component={edit} /> - <Route path="/editor" component={Editor} /> - <Route path="/article/:id" component={Article} /> - <Route path="/settings" component={Settings} /> - <Route path="/@:username/favorites" component={ProfileFavorites} /> - <Route path="/@:username" component={Profile} key={Math.random()}/> - </Switch> - </div> - ); - } - return ( - <div className=""> - <Header - appName={this.props.appName} - currentUser={this.props.currentUser} /> - </div> - ); - } -} - -// App.contextTypes = { -// router: PropTypes.object.isRequired -// }; - -export default connect(mapStateToProps, mapDispatchToProps)(App); diff --git a/te-frontend/src/components/Article/ArticleActions.js b/te-frontend/src/components/Article/ArticleActions.js deleted file mode 100644 index f1b5f5b..0000000 --- a/te-frontend/src/components/Article/ArticleActions.js +++ /dev/null @@ -1,62 +0,0 @@ -import { Link } from 'react-router-dom'; -import React from 'react'; -import agent from '../../agent'; -import { connect } from 'react-redux'; -import { DELETE_ARTICLE } from '../../constants/actionTypes'; -import swal from 'sweetalert'; - -const mapDispatchToProps = dispatch => ({ - onClickDelete: payload => - dispatch({ type: DELETE_ARTICLE, payload }) -}); - -const ArticleActions = props => { - const article = props.article; - const del = () => { - props.onClickDelete(agent.Articles.del(article.slug)) - }; - - function deleteArticle() { - swal({ - title: "Are you sure?", - text: "Article and comments will be deleted permanently!", - buttons: true, - dangerMode: true, - }) - .then((willDelete) => { - if (willDelete) { - swal("Your article has been deleted!", { - icon: "success", - content: del() - }); - } else { - swal("Canceled!"); - } - }); - } - - if (props.canModify) { - return ( - <span> - - <Link - to={`/edit/${article.slug}`} - className="btn btn-outline-secondary btn-sm"> - <i className="ion-edit"></i> Edit Article - </Link> - - <button className="btn btn-outline-danger btn-sm" onClick={()=>deleteArticle()} style={{marginLeft: 10}}> - <i className="ion-trash-a"></i> Delete Article - </button> - - </span> - ); - } - - return ( - <span> - </span> - ); -}; - -export default connect(() => ({}), mapDispatchToProps)(ArticleActions); diff --git a/te-frontend/src/components/Article/ArticleMeta.js b/te-frontend/src/components/Article/ArticleMeta.js deleted file mode 100644 index c2f490b..0000000 --- a/te-frontend/src/components/Article/ArticleMeta.js +++ /dev/null @@ -1,34 +0,0 @@ -import ArticleActions from './ArticleActions'; -import { Link } from 'react-router-dom'; -import React from 'react'; -import { TwitterShareButton } from "react-share"; - -const ArticleMeta = props => { - const article = props.article; - const link = `${window.location.href}` - - return ( - <div className="article-meta" > - <Link to={`/@${article.author.username}`}> - <img src={article.author.image} alt={article.author.username} - onError={e => { e.currentTarget.src = "https://static.productionready.io/images/smiley-cyrus.jpg"; }}/> - </Link> - - <div className="info"> - <Link to={`/@${article.author.username}`} className="author"> - {article.author.username} - </Link> - <span className="date"> - {new Date(article.createdAt).toLocaleString()} - </span> - </div> - <ArticleActions canModify={props.canModify} article={article}/> - <TwitterShareButton url={link} style={{alignItems: 'right'}}> - {<a class="twitter-share-button" data-show-count="false" target="_blank" style={{margin: 10}}> - <i className="ion-social-twitter"></i>Tweet</a>} - </TwitterShareButton> - </div> - ); -}; - -export default ArticleMeta; diff --git a/te-frontend/src/components/Article/Comment.js b/te-frontend/src/components/Article/Comment.js deleted file mode 100644 index adc2a66..0000000 --- a/te-frontend/src/components/Article/Comment.js +++ /dev/null @@ -1,35 +0,0 @@ -import DeleteButton from './DeleteButton'; -import { Link } from 'react-router-dom'; -import React from 'react'; - -const Comment = props => { - const comment = props.comment; - const show = props.currentUser && - props.currentUser.username === comment.author.username; - return ( - <div className="card"> - <div className="card-block"> - <p className="card-text-mylly">{comment.body}</p> - </div> - <div className="card-footer"> - <Link - to={`/@${comment.author.username}`} - className="comment-author"> - <img src={comment.author.image} className="comment-author-img" alt={comment.author.username} /> - </Link> - - <Link - to={`/@${comment.author.username}`} - className="comment-author"> - {comment.author.username} - </Link> - <span className="date-posted"> - {new Date(comment.createdAt).toLocaleString()} - </span> - <DeleteButton show={show} slug={props.slug} commentId={comment.id} /> - </div> - </div> - ); -}; - -export default Comment; diff --git a/te-frontend/src/components/Article/CommentContainer.js b/te-frontend/src/components/Article/CommentContainer.js deleted file mode 100644 index 625194e..0000000 --- a/te-frontend/src/components/Article/CommentContainer.js +++ /dev/null @@ -1,40 +0,0 @@ -import CommentInput from './CommentInput'; -import CommentList from './CommentList'; -import { Link } from 'react-router-dom'; -import React from 'react'; - -const CommentContainer = props => { - if (props.currentUser) { - return ( - <div className="col-xs-12 col-md-8 offset-md-2"> - <div> - <list-errors errors={props.errors}></list-errors> - <CommentInput slug={props.slug} currentUser={props.currentUser} /> - </div> - - <CommentList - comments={props.comments} - slug={props.slug} - currentUser={props.currentUser} /> - </div> - ); - } else { - return ( - <div className="col-xs-12 col-md-8 offset-md-2"> - <p> - <Link to="/login">Sign in</Link> - or - <Link to="/register">sign up</Link> - to add comments on this article. - </p> - - <CommentList - comments={props.comments} - slug={props.slug} - currentUser={props.currentUser} /> - </div> - ); - } -}; - -export default CommentContainer; diff --git a/te-frontend/src/components/Article/CommentInput.js b/te-frontend/src/components/Article/CommentInput.js deleted file mode 100644 index 91ca5a1..0000000 --- a/te-frontend/src/components/Article/CommentInput.js +++ /dev/null @@ -1,71 +0,0 @@ -import React from 'react'; -import agent from '../../agent'; -import { connect } from 'react-redux'; -import { ADD_COMMENT } from '../../constants/actionTypes'; -import BadWords from '../Badwords'; - -const mapDispatchToProps = dispatch => ({ - onSubmit: payload => - dispatch({ type: ADD_COMMENT, payload }) -}); - -class CommentInput extends React.Component { - constructor() { - super(); - this.state = { - body: '' - }; - - this.setBody = ev => { - this.setState({ body: ev.target.value }); - }; - - this.createComment = ev => { - if (this.state.body < 1) { - ev.preventDefault() - return null - } - ev.preventDefault(); - const payload = agent.Comments.create(this.props.slug, - { body: this.state.body }); - this.setState({ body: '' }); - this.props.onSubmit(payload); - }; - } - - render() { - return ( - <form className="card comment-form" onSubmit={this.createComment}> - <div className="card-block"> - <textarea className="form-control" - placeholder="Write a comment..." - maxlength="1000" - value={this.state.body} - onChange={this.setBody} - rows="3" - onKeyDown={(e) => { - if (e.keyCode === 9) e.preventDefault(); - }}> - </textarea> - </div> - - <div className="card-footer"> - <img - src={this.props.currentUser.image} - className="comment-author-img-mylly" - alt={this.props.currentUser.username} - onError={e => { e.currentTarget.src = "https://static.productionready.io/images/smiley-cyrus.jpg"; }}/> - <BadWords comment={this.state.body}/> - <button - className="btn-primary-mylly" - id="publish" - type="submit"> - Post Comment - </button> - </div> - </form> - ); - } -} - -export default connect(() => ({}), mapDispatchToProps)(CommentInput); diff --git a/te-frontend/src/components/Article/CommentList.js b/te-frontend/src/components/Article/CommentList.js deleted file mode 100644 index b62889d..0000000 --- a/te-frontend/src/components/Article/CommentList.js +++ /dev/null @@ -1,22 +0,0 @@ -import Comment from './Comment'; -import React from 'react'; - -const CommentList = props => { - return ( - <div> - { - props.comments.map(comment => { - return ( - <Comment - comment={comment} - currentUser={props.currentUser} - slug={props.slug} - key={comment.id} /> - ); - }) - } - </div> - ); -}; - -export default CommentList; diff --git a/te-frontend/src/components/Article/DeleteButton.js b/te-frontend/src/components/Article/DeleteButton.js deleted file mode 100644 index 59d70bd..0000000 --- a/te-frontend/src/components/Article/DeleteButton.js +++ /dev/null @@ -1,46 +0,0 @@ -import React from 'react'; -import agent from '../../agent'; -import { connect } from 'react-redux'; -import { DELETE_COMMENT } from '../../constants/actionTypes'; -import swal from 'sweetalert'; - -const mapDispatchToProps = dispatch => ({ - onClick: (payload, commentId) => - dispatch({ type: DELETE_COMMENT, payload, commentId }) -}); - -const DeleteButton = props => { - const del = () => { - const payload = agent.Comments.delete(props.slug, props.commentId); - props.onClick(payload, props.commentId); - }; - - function deleteComment() { - swal({ - title: "Are you sure?", - text: "Comment will be deleted permanently!", - buttons: true, - dangerMode: true, - }) - .then((willDelete) => { - if (willDelete) { - swal("Your comment has been deleted!", { - icon: "success", - content: del() - }); - } else { - swal("Canceled!"); - } - }); - } - if (props.show) { - return ( - <span className="mod-options"> - <i className="ion-trash-a" onClick={()=>deleteComment()}></i> - </span> - ); - } - return null; -}; - -export default connect(() => ({}), mapDispatchToProps)(DeleteButton); diff --git a/te-frontend/src/components/Article/index.js b/te-frontend/src/components/Article/index.js deleted file mode 100644 index 2398114..0000000 --- a/te-frontend/src/components/Article/index.js +++ /dev/null @@ -1,98 +0,0 @@ -import ArticleMeta from './ArticleMeta'; -import CommentContainer from './CommentContainer'; -import React from 'react'; -import agent from '../../agent'; -import { connect } from 'react-redux'; -import marked from 'marked'; -import { ARTICLE_PAGE_LOADED, ARTICLE_PAGE_UNLOADED } from '../../constants/actionTypes'; - -const mapStateToProps = state => ({ - ...state.article, - currentUser: state.common.currentUser -}); - -const mapDispatchToProps = dispatch => ({ - onLoad: payload => - dispatch({ type: ARTICLE_PAGE_LOADED, payload }), - onUnload: () => - dispatch({ type: ARTICLE_PAGE_UNLOADED }) -}); - -class Article extends React.Component { - componentWillMount() { - this.props.onLoad(Promise.all([ - agent.Articles.get(this.props.match.params.id), - agent.Comments.forArticle(this.props.match.params.id) - ])); - } - - componentWillUnmount() { - this.props.onUnload(); - } - - render() { - if (!this.props.article) { - return null; - } - - const markup = { __html: marked(this.props.article.body, { sanitize: true }) }; - const canModify = this.props.currentUser && - this.props.currentUser.username === this.props.article.author.username; - return ( - <div className="article-page"> - - <div className="banner"> - <div className="container"> - - <h1 className="article-title-mylly">{this.props.article.title}</h1> - <h5 style={{ color: '#80ffee' }}>{this.props.article.description}</h5> - <ArticleMeta - article={this.props.article} - canModify={canModify} /> - - </div> - </div> - - <div className="container page"> - - <div className="row article-content"> - <div className="col-xs-12"> - - <div className="article-text-mylly" dangerouslySetInnerHTML={markup}></div> - - <ul className="tag-list"> - { - this.props.article.tagList.map(tag => { - return ( - <li - className="tag-default tag-pill tag-outline" - key={tag}> - {tag} - </li> - ); - }) - } - </ul> - - </div> - </div> - - <hr /> - - <div className="article-actions"> - </div> - - <div className="row"> - <CommentContainer - comments={this.props.comments || []} - errors={this.props.commentErrors} - slug={this.props.match.params.id} - currentUser={this.props.currentUser} /> - </div> - </div> - </div> - ); - } -} - -export default connect(mapStateToProps, mapDispatchToProps)(Article); diff --git a/te-frontend/src/components/ArticleList.js b/te-frontend/src/components/ArticleList.js deleted file mode 100644 index 1c17836..0000000 --- a/te-frontend/src/components/ArticleList.js +++ /dev/null @@ -1,38 +0,0 @@ -import ArticlePreview from './ArticlePreview'; -import ListPagination from './ListPagination'; -import React from 'react'; - -const ArticleList = props => { - if (!props.articles) { - return ( - <div className="article-preview">Loading...</div> - ); - } - - if (props.articles.length === 0) { - return ( - <div className="article-preview"> - No articles are here... yet. - </div> - ); - } - - return ( - <div> - { - props.articles.map(article => { - return ( - <ArticlePreview article={article} key={article.slug} /> - ); - }) - } - - <ListPagination - pager={props.pager} - articlesCount={props.articlesCount} - currentPage={props.currentPage} /> - </div> - ); -}; - -export default ArticleList; diff --git a/te-frontend/src/components/ArticlePreview.js b/te-frontend/src/components/ArticlePreview.js deleted file mode 100644 index 2ac1cfc..0000000 --- a/te-frontend/src/components/ArticlePreview.js +++ /dev/null @@ -1,90 +0,0 @@ -import React from 'react'; -import { Link } from 'react-router-dom'; -import agent from '../agent'; -import { connect } from 'react-redux'; -import { ARTICLE_FAVORITED, ARTICLE_UNFAVORITED } from '../constants/actionTypes'; -import swal from 'sweetalert'; - -const FAVORITED_CLASS = 'btn btn-sm btn-primary'; -const NOT_FAVORITED_CLASS = 'btn btn-sm btn-outline-primary'; - -const mapStateToProps = state => ({ - ...state.articleList, - token: state.common.token -}); - -const mapDispatchToProps = dispatch => ({ - favorite: slug => dispatch({ - type: ARTICLE_FAVORITED, - payload: agent.Articles.favorite(slug) - }), - unfavorite: slug => dispatch({ - type: ARTICLE_UNFAVORITED, - payload: agent.Articles.unfavorite(slug) - }) -}); - -const ArticlePreview = props => { - const article = props.article; - const favoriteButtonClass = article.favorited ? - FAVORITED_CLASS : - NOT_FAVORITED_CLASS; - - const handleClick = ev => { - if (props.token) { - ev.preventDefault(); - if (article.favorited) { - props.unfavorite(article.slug); - } else { - props.favorite(article.slug); - } - } else { - swal("Sign in to favorite article", {buttons: false, timer: 1800}) - } - }; - - return ( - <div className="article-preview" style={{marginBottom:5}}> - <div className="article-meta"> - <Link to={`/@${article.author.username}`}> - <img src={article.author.image} alt={article.author.username} - onError={e => { e.currentTarget.src = "https://static.productionready.io/images/smiley-cyrus.jpg"; }}/> - </Link> - - <div className="info"> - <Link className="author" to={`/@${article.author.username}`}> - {article.author.username} - </Link> - <span className="date"> - {new Date(article.createdAt).toLocaleString()} - </span> - </div> - - <div className="pull-xs-right"> - <button className={favoriteButtonClass} onClick={handleClick}> - <i className="ion-heart"></i> {article.favoritesCount} - </button> - </div> - </div> - - <Link to={`/article/${article.slug}`} className="preview-link"> - <h1 className="preview-link-mylly">{article.title}</h1> - <p className="preview-link-mylly">{article.description}</p> - <span>Read more...</span> - <ul className="tag-list"> - { - article.tagList.map(tag => { - return ( - <li className="tag-default tag-pill tag-outline" key={tag}> - {tag} - </li> - ) - }) - } - </ul> - </Link> - </div> - ); -} - -export default connect(mapStateToProps, mapDispatchToProps)(ArticlePreview); diff --git a/te-frontend/src/components/Editor.js b/te-frontend/src/components/Editor.js deleted file mode 100644 index a912818..0000000 --- a/te-frontend/src/components/Editor.js +++ /dev/null @@ -1,223 +0,0 @@ -import ListErrors from './ListErrors'; -import React from 'react'; -import agent from '../agent'; -import { connect } from 'react-redux'; -import Badwords from './Badwords'; -import { - ADD_TAG, - EDITOR_PAGE_LOADED, - REMOVE_TAG, - ARTICLE_SUBMITTED, - EDITOR_PAGE_UNLOADED, - UPDATE_FIELD_EDITOR -} from '../constants/actionTypes'; - - -const mapStateToProps = state => ({ - ...state.editor -}); - -const mapDispatchToProps = dispatch => ({ - onAddTag: () => - dispatch({ type: ADD_TAG }), - onLoad: payload => - dispatch({ type: EDITOR_PAGE_LOADED, payload }), - onRemoveTag: tag => - dispatch({ type: REMOVE_TAG, tag }), - onSubmit: payload => - dispatch({ type: ARTICLE_SUBMITTED, payload }), - onUnload: payload => - dispatch({ type: EDITOR_PAGE_UNLOADED }), - onUpdateField: (key, value) => - dispatch({ type: UPDATE_FIELD_EDITOR, key, value }) -}); - - -class Editor extends React.Component { - constructor() { - super(); - - const updateFieldEvent = - key => ev => this.props.onUpdateField(key, ev.target.value); - this.changeTitle = updateFieldEvent('title'); - this.changeDescription = updateFieldEvent('description'); - this.changeBody = updateFieldEvent('body'); - this.changeTagInput = updateFieldEvent('tagInput'); - - const errors = (key, error) => this.props.onUpdateField(key, error); - - this.watchForEnter = ev => { - if (this.props.tagInput < 1 || (this.props.tagList || []).length > 3) { - errors('errors', {'Tags:': 'Empty tags not allowed'}); - return null - } - if (ev.keyCode === 13) { - ev.preventDefault(); - this.props.onAddTag(); - errors('errors', {}); - } - }; - - this.clickToAdd = ev => { - if (this.props.tagInput < 1 || (this.props.tagList || []).length > 3) { - errors('errors', {'Tags:': 'Empty tags not allowed'}); - return null - } else { - ev.preventDefault(); - this.props.onAddTag(); - errors('errors', {}); - } - }; - - this.removeTagHandler = tag => () => { - this.props.onRemoveTag(tag); - }; - - this.submitForm = ev => { - if (!this.props.title||!this.props.body||!this.props.description) { - errors('errors', {'Please,': 'fill title and body fields.'}); - } else { - ev.preventDefault(); - const article = { - title: this.props.title, - description: this.props.description, - body: this.props.body, - tagList: this.props.tagList - }; - const slug = { slug: this.props.articleSlug }; - const promise = this.props.articleSlug ? - agent.Articles.update(Object.assign(article, slug)) : - agent.Articles.create(article); - - this.props.onSubmit(promise); - }}; - } - - componentWillReceiveProps(nextProps) { - if (this.props.match.params.slug !== nextProps.match.params.slug) { - if (nextProps.match.params.slug) { - this.props.onUnload(); - return this.props.onLoad(agent.Articles.get(this.props.match.params.slug)); - } - this.props.onLoad(null); - } - } - - componentWillMount() { - if (this.props.match.params.slug) { - return this.props.onLoad(agent.Articles.get(this.props.match.params.slug)); - } - this.props.onLoad(null); - } - - componentWillUnmount() { - this.props.onUnload(); - } - - render() { - return ( - <div className="editor-page"> - <div className="container page"> - <div className="row"> - <div className="col-md-10 offset-md-1 col-xs-12"> - - <form> - <fieldset> - - <fieldset className="form-group"> - <input - className="form-control form-control-lg" - type="text" - placeholder="Article Title" - maxlength="100" - value={this.props.title || ""} - onChange={this.changeTitle} /> - </fieldset> - - <fieldset className="form-group"> - <input - className="form-control" - type="text" - placeholder="What's this article about?" - maxlength="140" - value={this.props.description || ""} - onChange={this.changeDescription} /> - </fieldset> - - <fieldset className="form-group"> - <textarea - className="form-control" - rows="8" - placeholder="Write your article (in markdown)" - maxlength="3000" - value={this.props.body || ""} - onChange={this.changeBody}> - </textarea> - </fieldset> - - <fieldset className="form-group"> - <input - className="form-control" - type="text" - placeholder="Enter tags" - maxlength="15" - value={this.props.tagInput ||""} - onChange={this.changeTagInput} - onKeyUp={this.watchForEnter} - onKeyDown={(e) => { - if (e.keyCode === 9) e.preventDefault(); - }}/> - <span onClick={this.clickToAdd} className="tag-enter">Press Enter or Click to Add</span> - - <div className="tag-list"> - { - (this.props.tagList || []).map(tag => { - return ( - <span className="tag-default tag-pill" key={tag}> - <i className="ion-close-round" - onClick={this.removeTagHandler(tag)}> - </i> - {tag} - </span> - ); - }) - } - </div> - </fieldset> - - <button - className="btn btn-lg pull-xs-right btn-danger m-l-1" - type="button" - onClick={() => this.props.history.goBack()}> - Cancel - </button> - - <button - className="btn btn-lg pull-xs-right btn-primary" - type="button" - id="publish" - disabled={false} - onClick={this.submitForm}> - Publish Article - </button> - - <Badwords title={this.props.title} - description={this.props.description} - body={this.props.body} - tags={this.props.tagInput} - tagList={this.props.tagList || []} - /> - - <ListErrors errors={this.props.errors}></ListErrors> - - </fieldset> - </form> - </div> - </div> - </div> - </div> - ); - } -} - -export default connect(mapStateToProps, mapDispatchToProps)(Editor); diff --git a/te-frontend/src/components/Header.js b/te-frontend/src/components/Header.js deleted file mode 100644 index de49981..0000000 --- a/te-frontend/src/components/Header.js +++ /dev/null @@ -1,94 +0,0 @@ -import React from 'react'; -import { Link } from 'react-router-dom'; -import logo from './images/logo-sm.svg' - - -const LoggedOutView = props => { - if (!props.currentUser) { - return ( - <ul className="nav navbar-nav pull-xs-right"> - - <li className="nav-item"> - <Link to="/" className="nav-link-mylly"> - Home - </Link> - </li> - - <li className="nav-item"> - <Link to="/login" className="nav-link-mylly"> - Sign in - </Link> - </li> - - <li className="nav-item"> - <Link to="/register" className="nav-link-mylly"> - Sign up - </Link> - </li> - - </ul> - ); - } - return null; -}; - -// li classname was "nav-item" -const LoggedInView = props => { - if (props.currentUser) { - return ( - <ul className="nav navbar-nav pull-xs-right"> - - <li className="nav-link-mylly"> - <Link to="/" className="nav-link-mylly"> - Home - </Link> - </li> - - <li className="nav-link-mylly"> - <Link to="/editor" className="nav-link-mylly"> - <i className="ion-compose"></i> New Post - </Link> - </li> - - <li className="nav-link-mylly"> - <Link to="/settings" className="nav-link-mylly"> - <i className="ion-gear-a"></i> Settings - </Link> - </li> - - <li className="nav-link-mylly"> - <Link - to={`/@${props.currentUser.username}`} - className="nav-link-mylly-user"> - <img src={props.currentUser.image} className="user-pic-mylly" title={props.currentUser.username} style={{marginLeft:10}}alt={props.currentUser.username} - onError={e => { e.currentTarget.src = "https://static.productionready.io/images/smiley-cyrus.jpg"; }}/> - </Link> - </li> - - </ul> - ); - } - - return null; -}; - -class Header extends React.Component { - render() { - return ( - <nav className="navbar-mylly"> - <div className="container-mylly"> - <Link to={{ pathname: "https://www.wimmalab.org/" }} target="_blank" className="navbar-brand-mylly"> - <img src={logo} alt="logo" height="20px"/> - {/* {this.props.appName.toLowerCase()} */} - </Link> - - <LoggedOutView currentUser={this.props.currentUser} /> - - <LoggedInView currentUser={this.props.currentUser} /> - </div> - </nav> - ); - } -} - -export default Header; diff --git a/te-frontend/src/components/Home/Banner.js b/te-frontend/src/components/Home/Banner.js deleted file mode 100644 index cc3d52b..0000000 --- a/te-frontend/src/components/Home/Banner.js +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react'; -import logo from '../images/logo_wimma.png' -import { Link } from 'react-router-dom'; -import homehero from '../images/home-hero.png' - -const Banner = ({ appName, token }) => { - if (token) { - return null; - } - return ( // style changed to black - <div className="banner-mylly" style={{ backgroundImage: `url(${homehero})`}}> - <div className="container"> - <Link to="/"> - <img src={logo} alt="logo" height="100px"/> - </Link> - <p>A place to share your knowledge.</p> - </div> - </div> - ); -}; - -export default Banner; diff --git a/te-frontend/src/components/Home/MainView.js b/te-frontend/src/components/Home/MainView.js deleted file mode 100644 index c687523..0000000 --- a/te-frontend/src/components/Home/MainView.js +++ /dev/null @@ -1,96 +0,0 @@ -import ArticleList from '../ArticleList'; -import React from 'react'; -import agent from '../../agent'; -import { connect } from 'react-redux'; -import { CHANGE_TAB } from '../../constants/actionTypes'; - -const YourFeedTab = props => { - if (props.token) { - const clickHandler = ev => { - ev.preventDefault(); - props.onTabClick('feed', agent.Articles.feed, agent.Articles.feed()); - } - - return ( - <li className="nav-item"> - <a href="" - className={ props.tab === 'feed' ? 'nav-link active' : 'nav-link' } - onClick={clickHandler}> - Your Feed - </a> - </li> - ); - } - return null; -}; - -const GlobalFeedTab = props => { - const clickHandler = ev => { - ev.preventDefault(); - props.onTabClick('all', agent.Articles.all, agent.Articles.all()); - }; - return ( - <li className="nav-item"> - <a - href="" - className={ props.tab === 'all' ? 'nav-link active' : 'nav-link' } - onClick={clickHandler}> - Global Feed - </a> - </li> - ); -}; - -const TagFilterTab = props => { - if (!props.tag) { - return null; - } - - return ( - <li className="nav-item" style={{color:'blue'}}> - <a href="" className="nav-link active"> - <i className="ion-pound"></i> {props.tag} - </a> - </li> - ); -}; - -const mapStateToProps = state => ({ - ...state.articleList, - tags: state.home.tags, - token: state.common.token -}); - -const mapDispatchToProps = dispatch => ({ - onTabClick: (tab, pager, payload) => dispatch({ type: CHANGE_TAB, tab, pager, payload }) -}); - -const MainView = props => { - return ( - <div className="col-md-9"> - <div className="feed-toggle"> - <ul className="nav nav-pills outline-active"> - - <YourFeedTab - token={props.token} - tab={props.tab} - onTabClick={props.onTabClick} /> - - <GlobalFeedTab tab={props.tab} onTabClick={props.onTabClick} /> - - <TagFilterTab tag={props.tag} /> - - </ul> - </div> - - <ArticleList - pager={props.pager} - articles={props.articles} - loading={props.loading} - articlesCount={props.articlesCount} - currentPage={props.currentPage} /> - </div> - ); -}; - -export default connect(mapStateToProps, mapDispatchToProps)(MainView); diff --git a/te-frontend/src/components/Home/Tags.js b/te-frontend/src/components/Home/Tags.js deleted file mode 100644 index fb498ae..0000000 --- a/te-frontend/src/components/Home/Tags.js +++ /dev/null @@ -1,36 +0,0 @@ -import React from 'react'; -import agent from '../../agent'; - -const Tags = props => { - const tags = props.tags; - if (tags) { - return ( - <div className="tag-list"> - { - tags.map(tag => { - const handleClick = ev => { - ev.preventDefault(); - props.onClickTag(tag, page => agent.Articles.byTag(tag, page), agent.Articles.byTag(tag)); - }; - - return ( - <a - href="" - className="tag-default tag-pill" - key={tag} - onClick={handleClick}> - {tag} - </a> - ); - }) - } - </div> - ); - } else { - return ( - <div>Loading Tags...</div> - ); - } -}; - -export default Tags; diff --git a/te-frontend/src/components/Home/index.js b/te-frontend/src/components/Home/index.js deleted file mode 100644 index 0ed4ea7..0000000 --- a/te-frontend/src/components/Home/index.js +++ /dev/null @@ -1,77 +0,0 @@ -// import Banner from './Banner'; -import MainView from './MainView'; -import React from 'react'; -import Tags from './Tags'; -import agent from '../../agent'; -import { connect } from 'react-redux'; -import { - HOME_PAGE_LOADED, - HOME_PAGE_UNLOADED, - APPLY_TAG_FILTER -} from '../../constants/actionTypes'; -import Pdf from '../Documents/Tietosuojaseloste.pdf'; - -const Promise = global.Promise; - -const mapStateToProps = state => ({ - ...state.home, - appName: state.common.appName, - token: state.common.token -}); - -const mapDispatchToProps = dispatch => ({ - onClickTag: (tag, pager, payload) => - dispatch({ type: APPLY_TAG_FILTER, tag, pager, payload }), - onLoad: (tab, pager, payload) => - dispatch({ type: HOME_PAGE_LOADED, tab, pager, payload }), - onUnload: () => - dispatch({ type: HOME_PAGE_UNLOADED }) -}); - -class Home extends React.Component { - componentWillMount() { - const tab = this.props.token ? 'feed' : 'all'; - const articlesPromise = this.props.token ? - agent.Articles.feed : - agent.Articles.all; - - this.props.onLoad(tab, articlesPromise, Promise.all([agent.Tags.getAll(), articlesPromise()])); - } - - componentWillUnmount() { - this.props.onUnload(); - } - - render() { - return ( - <div className="home-page"> - - {/* <Banner token={this.props.token} appName={this.props.appName} /> */} - - <div className="container page"> - <div className="row"> - <MainView /> - - <div className="col-md-3"> - <div className="sidebar"> - - <p>Popular Tags</p> - - <Tags - tags={this.props.tags} - onClickTag={this.props.onClickTag} /> - - </div> - </div> - - </div> - </div> - <div className="footer"> - <a href = {Pdf} target = "_blank"><p>Privacy policy</p></a> - </div> - </div> - ); - } -} - -export default connect(mapStateToProps, mapDispatchToProps)(Home); diff --git a/te-frontend/src/components/ListErrors.js b/te-frontend/src/components/ListErrors.js deleted file mode 100644 index 3b40022..0000000 --- a/te-frontend/src/components/ListErrors.js +++ /dev/null @@ -1,26 +0,0 @@ -import React from 'react'; - -class ListErrors extends React.Component { - render() { - const errors = this.props.errors; - if (errors) { - return ( - <ul className="error-messages"> - { - Object.keys(errors).map(key => { - return ( - <li key={key}> - {key} {errors[key]} - </li> - ); - }) - } - </ul> - ); - } else { - return null; - } - } -} - -export default ListErrors; diff --git a/te-frontend/src/components/ListPagination.js b/te-frontend/src/components/ListPagination.js deleted file mode 100644 index ba38a6e..0000000 --- a/te-frontend/src/components/ListPagination.js +++ /dev/null @@ -1,58 +0,0 @@ -import React from 'react'; -import agent from '../agent'; -import { connect } from 'react-redux'; -import { SET_PAGE } from '../constants/actionTypes'; - -const mapDispatchToProps = dispatch => ({ - onSetPage: (page, payload) => - dispatch({ type: SET_PAGE, page, payload }) -}); - -const ListPagination = props => { - if (props.articlesCount <= 10) { - return null; - } - - const range = []; - for (let i = 0; i < Math.ceil(props.articlesCount / 10); ++i) { - range.push(i); - } - - const setPage = page => { - if(props.pager) { - props.onSetPage(page, props.pager(page)); - }else { - props.onSetPage(page, agent.Articles.all(page)) - } - }; - - return ( - <nav> - <ul className="pagination"> - - { - range.map(v => { - const isCurrent = v === props.currentPage; - const onClick = ev => { - ev.preventDefault(); - setPage(v); - }; - return ( - <li - className={ isCurrent ? 'page-item active' : 'page-item' } - onClick={onClick} - key={v.toString()}> - - <a className="page-link" href="">{v + 1}</a> - - </li> - ); - }) - } - - </ul> - </nav> - ); -}; - -export default connect(() => ({}), mapDispatchToProps)(ListPagination); diff --git a/te-frontend/src/components/Login.js b/te-frontend/src/components/Login.js deleted file mode 100644 index a6e895a..0000000 --- a/te-frontend/src/components/Login.js +++ /dev/null @@ -1,109 +0,0 @@ -import { Link } from 'react-router-dom'; -import ListErrors from './ListErrors'; -import React from 'react'; -import agent from '../agent'; -import { connect } from 'react-redux'; -import { - UPDATE_FIELD_AUTH, - LOGIN, - LOGIN_PAGE_UNLOADED -} from '../constants/actionTypes'; -import ShowIcon from '@material-ui/icons/Visibility'; -import ShowOffIcon from '@material-ui/icons/VisibilityOff'; - -const mapStateToProps = state => ({ ...state.auth }); - -const mapDispatchToProps = dispatch => ({ - onChangeEmail: value => - dispatch({ type: UPDATE_FIELD_AUTH, key: 'email', value }), - onChangePassword: value => - dispatch({ type: UPDATE_FIELD_AUTH, key: 'password', value }), - onSubmit: (email, password) => - dispatch({ type: LOGIN, payload: agent.Auth.login(email, password) }), - onUnload: () => - dispatch({ type: LOGIN_PAGE_UNLOADED }) -}); - -class Login extends React.Component { - constructor() { - super(); - this.state = { - password: true, - }; - this.changeEmail = ev => this.props.onChangeEmail(ev.target.value); - this.changePassword = ev => this.props.onChangePassword(ev.target.value); - this.submitForm = (email, password) => ev => { - ev.preventDefault(); - this.props.onSubmit(email, password); - }; - } - - componentWillUnmount() { - this.props.onUnload(); - } - - render() { - const email = this.props.email; - const password = this.props.password; - return ( - <div className="auth-page"> - <div className="container page"> - <div className="row"> - - <div className="col-md-6 offset-md-3 col-xs-12"> - <h1 className="text-xs-center">Sign In</h1> - <p className="text-xs-center"> - <Link to="/register"> - Need an account? - </Link> - </p> - - <form onSubmit={this.submitForm(email, password)}> - <fieldset> - - <fieldset className="form-group"> - <input - className="form-control form-control-lg" - type="email" - placeholder="Email" - value={email} - onChange={this.changeEmail} /> - </fieldset> - - <fieldset className="form-group"> - <input - className="form-control form-control-lg" - type={this.state.password ? "password":"text" } - placeholder="Password" - value={password} - onChange={this.changePassword} /> - <span - className="hideshowbtn" - style={{ top: 173 }} - onMouseDown={()=> this.setState({password:!this.state.password})}> - {this.state.password ? <ShowOffIcon/>:<ShowIcon/>} - </span> - </fieldset> - - - <button - className="btn btn-lg btn-primary pull-xs-right" - type="submit" - disabled={this.props.inProgress}> - Sign in - </button> - - <ListErrors errors={this.props.errors} /> - - </fieldset> - </form> - </div> - - </div> - </div> - </div> - ); - } -} - -export default connect(mapStateToProps, mapDispatchToProps)(Login); diff --git a/te-frontend/src/components/Profile.js b/te-frontend/src/components/Profile.js deleted file mode 100644 index 0310263..0000000 --- a/te-frontend/src/components/Profile.js +++ /dev/null @@ -1,188 +0,0 @@ -import ArticleList from './ArticleList'; -import React from 'react'; -import { Link } from 'react-router-dom'; -import agent from '../agent'; -import { connect } from 'react-redux'; -import { - FOLLOW_USER, - UNFOLLOW_USER, - PROFILE_PAGE_LOADED, - PROFILE_PAGE_UNLOADED, - LOGOUT -} from '../constants/actionTypes'; -import swal from 'sweetalert'; - -const FollowUserButton = props => { - if (props.isUser) { - return null; - } - - let classes = 'btn btn-sm action-btn'; - if (props.user.following) { - classes += ' btn-secondary'; - } else { - classes += ' btn-outline-secondary'; - } - - const handleClick = ev => { - if (props.isUser === null) { - swal("Sign in to follow user", {buttons: false, timer: 1900}) - } else { - ev.preventDefault(); - if (props.user.following) { - props.unfollow(props.user.username) - } else { - props.follow(props.user.username) - } - }}; - - return ( - <button - className={classes} - onClick={handleClick}> - <i className="ion-plus-round"></i> - - {props.user.following ? 'Unfollow' : 'Follow'} {props.user.username} - </button> - ); -}; - -const mapStateToProps = state => ({ - ...state.articleList, - currentUser: state.common.currentUser, - profile: state.profile -}); - -const mapDispatchToProps = dispatch => ({ - onClickLogout: () => dispatch({ type: LOGOUT }), - onFollow: username => dispatch({ - type: FOLLOW_USER, - payload: agent.Profile.follow(username) - }), - onLoad: payload => dispatch({ type: PROFILE_PAGE_LOADED, payload }), - onUnfollow: username => dispatch({ - type: UNFOLLOW_USER, - payload: agent.Profile.unfollow(username) - }), - onUnload: () => dispatch({ type: PROFILE_PAGE_UNLOADED }) -}); - -class Profile extends React.Component { - componentWillMount() { - this.props.onLoad(Promise.all([ - agent.Profile.get(this.props.match.params.username), - agent.Articles.byAuthor(this.props.match.params.username) - ])); - } - - componentWillUnmount() { - this.props.onUnload(); - } - - renderTabs() { - return ( - <ul className="nav nav-pills outline-active"> - <li className="nav-item"> - <Link - className="nav-link active" - to={`/@${this.props.profile.username}`}> - My Articles - </Link> - </li> - - <li className="nav-item"> - <Link - className="nav-link" - to={`/@${this.props.profile.username}/favorites`}> - Favorited Articles - </Link> - </li> - </ul> - ); - } - - render() { - - const EditProfileSettings = props => { - if (props.isUser) { - return ( - <div> - <Link - to="/settings" - className="btn btn-sm btn-outline-secondary action-btn"> - <i className="ion-gear-a"></i> Edit Profile Settings - </Link> - <button - className="btn btn-sm btn-outline-secondary action-btn" - style={{ - color: '#D56047', - borderColor: 'red', - marginRight:10}} - onClick={this.props.onClickLogout}> - <i className="ion-log-out"></i> Logout - </button> - </div> - ); - } - return null; - }; - - const profile = this.props.profile; - if (!profile) { - return null; - } - const isUser = this.props.currentUser && - this.props.profile.username === this.props.currentUser.username; - - return ( - <div className="profile-page"> - - <div className="user-info" > - <div className="container"> - <div className="row"> - <div className="col-xs-12 col-md-10 offset-md-1"> - - <img src={profile.image} className="user-img" alt={profile.username} - onError={e => { e.currentTarget.src = "https://static.productionready.io/images/smiley-cyrus.jpg"; }}/> - <h4>{profile.username}</h4> - <p>{profile.bio}</p> - - <EditProfileSettings isUser={isUser} /> - <FollowUserButton - isUser={isUser} - user={profile} - follow={this.props.onFollow} - unfollow={this.props.onUnfollow} - /> - - </div> - </div> - </div> - </div> - - <div className="container"> - <div className="row"> - - <div className="col-xs-12 col-md-10 offset-md-1"> - - <div className="articles-toggle"> - {this.renderTabs()} - </div> - - <ArticleList - pager={this.props.pager} - articles={this.props.articles} - articlesCount={this.props.articlesCount} - state={this.props.currentPage} /> - </div> - - </div> - </div> - - </div> - ); - } -} - -export default connect(mapStateToProps, mapDispatchToProps)(Profile); -export { Profile, mapStateToProps }; diff --git a/te-frontend/src/components/ProfileFavorites.js b/te-frontend/src/components/ProfileFavorites.js deleted file mode 100644 index 43ddbbe..0000000 --- a/te-frontend/src/components/ProfileFavorites.js +++ /dev/null @@ -1,53 +0,0 @@ -import { Profile, mapStateToProps } from './Profile'; -import React from 'react'; -import { Link } from 'react-router-dom'; -import agent from '../agent'; -import { connect } from 'react-redux'; -import { - PROFILE_PAGE_LOADED, - PROFILE_PAGE_UNLOADED -} from '../constants/actionTypes'; - -const mapDispatchToProps = dispatch => ({ - onLoad: (pager, payload) => - dispatch({ type: PROFILE_PAGE_LOADED, pager, payload }), - onUnload: () => - dispatch({ type: PROFILE_PAGE_UNLOADED }) -}); - -class ProfileFavorites extends Profile { - componentWillMount() { - this.props.onLoad(page => agent.Articles.favoritedBy(this.props.match.params.username, page), Promise.all([ - agent.Profile.get(this.props.match.params.username), - agent.Articles.favoritedBy(this.props.match.params.username) - ])); - } - - componentWillUnmount() { - this.props.onUnload(); - } - - renderTabs() { - return ( - <ul className="nav nav-pills outline-active"> - <li className="nav-item"> - <Link - className="nav-link" - to={`/@${this.props.profile.username}`}> - My Articles - </Link> - </li> - - <li className="nav-item"> - <Link - className="nav-link active" - to={`/@${this.props.profile.username}/favorites`}> - Favorited Articles - </Link> - </li> - </ul> - ); - } -} - -export default connect(mapStateToProps, mapDispatchToProps)(ProfileFavorites); diff --git a/te-frontend/src/components/Register.js b/te-frontend/src/components/Register.js deleted file mode 100644 index 82f7415..0000000 --- a/te-frontend/src/components/Register.js +++ /dev/null @@ -1,164 +0,0 @@ -import { Link } from 'react-router-dom'; -import ListErrors from './ListErrors'; -import React from 'react'; -import agent from '../agent'; -import { connect } from 'react-redux'; -import { - UPDATE_FIELD_AUTH, - REGISTER, - REGISTER_PAGE_UNLOADED -} from '../constants/actionTypes'; -import swal from 'sweetalert'; -import ShowIcon from '@material-ui/icons/Visibility'; -import ShowOffIcon from '@material-ui/icons/VisibilityOff'; - -const mapStateToProps = state => ({ ...state.auth }); - -const mapDispatchToProps = dispatch => ({ - onChangeEmail: value => - dispatch({ type: UPDATE_FIELD_AUTH, key: 'email', value }), - onChangePassword: value => - dispatch({ type: UPDATE_FIELD_AUTH, key: 'password', value }), - onConfirmPassword: value => - dispatch({ type: UPDATE_FIELD_AUTH, key: 'confirmPassword', value }), - onChangeUsername: value => - dispatch({ type: UPDATE_FIELD_AUTH, key: 'username', value }), - onSubmit: (username, email, password,confirmPassword) => { - const payload = agent.Auth.register(username, email, password,confirmPassword); - dispatch({ type: REGISTER, payload }) - }, - onUnload: () => - dispatch({ type: REGISTER_PAGE_UNLOADED }) -}); - -class Register extends React.Component { - constructor() { - super(); - this.state = { - password: true, - confirmPassword:true - }; - this.changeEmail = ev => this.props.onChangeEmail(ev.target.value); - this.changePassword = ev => this.props.onChangePassword(ev.target.value); - this.changeConfirmPassword = ev => this.props.onConfirmPassword(ev.target.value); - this.changeUsername = ev => this.props.onChangeUsername(ev.target.value); - this.submitForm = (username, email, password,confirmPassword) => ev => { - ev.preventDefault(); - - const regex = /^\S{4,}$/; - if (!username||!email||!password) { - swal("All fields required") - return null; - } - - if(!regex.test(password)){ - - swal("Password at least 4 digits! No whitespaces") - return null; - } - if(password !== confirmPassword ) { - - swal("Passwords does not match ") - return null; - } - this.props.onSubmit(username, email, password,confirmPassword); - } - } - - componentWillUnmount() { - this.props.onUnload(); - } - - render() { - const email = this.props.email; - const password = this.props.password; - const confirmPassword = this.props.confirmPassword; - const username = this.props.username; - - return ( - <div className="auth-page"> - <div className="container page"> - <div className="row"> - - <div className="col-md-6 offset-md-3 col-xs-12"> - <h1 className="text-xs-center">Sign Up</h1> - <p className="text-xs-center"> - <Link to="/login"> - Have an account? - </Link> - </p> - - - <form onSubmit={this.submitForm(username, email, password,confirmPassword)}> - <fieldset> - - <fieldset className="form-group"> - <input - pattern=".{1,}" - className="form-control form-control-lg" - type="text" - placeholder="Username" - value={this.props.username || ""} - onChange={this.changeUsername} /> - </fieldset> - - <fieldset className="form-group"> - <input - className="form-control form-control-lg" - type="email" - placeholder="Email" - value={this.props.email || ""} - onChange={this.changeEmail} /> - </fieldset> - - <fieldset className="form-group"> - <input - className="form-control form-control-lg" - type={this.state.password ? "password":"text" } - placeholder="Password" - value={this.props.password || ""} - onChange={this.changePassword} /> - <span - className="hideshowbtn" - style={{top: 240}} - onMouseDown={()=> this.setState({password:!this.state.password})}> - {this.state.password ? <ShowOffIcon/>:<ShowIcon/>} - </span> - </fieldset> - <fieldset className="form-group"> - <input - className="form-control form-control-lg" - type={this.state.confirmPassword ? "password":"text" } - placeholder="Confirm Password" - value={this.props.confirmPassword } - onChange={this.changeConfirmPassword} /> - <span - className="hideshowbtn" style={{top: 305}} - onMouseDown={()=> this.setState({confirmPassword:!this.state.confirmPassword})}> - {this.state.confirmPassword ? <ShowOffIcon/>:<ShowIcon/>} - </span> - </fieldset> - - <button - className="btn btn-lg btn-primary pull-xs-right" - type="submit" - disabled={this.props.inProgress - }> - Sign up - </button> - - <ListErrors errors={this.props.errors} /> - - - </fieldset> - </form> - </div> - - </div> - </div> - </div> - ); - } -} - -export default connect(mapStateToProps, mapDispatchToProps)(Register); diff --git a/te-frontend/src/components/Settings.js b/te-frontend/src/components/Settings.js deleted file mode 100644 index 63a70fa..0000000 --- a/te-frontend/src/components/Settings.js +++ /dev/null @@ -1,248 +0,0 @@ -import ListErrors from './ListErrors'; -import React from 'react'; -import agent from '../agent'; -import { connect } from 'react-redux'; -import { - SETTINGS_SAVED, - SETTINGS_PAGE_UNLOADED, - LOGOUT, - DELETE_USER -} from '../constants/actionTypes'; -import swal from 'sweetalert'; -import ShowIcon from '@material-ui/icons/Visibility'; -import ShowOffIcon from '@material-ui/icons/VisibilityOff'; - -class SettingsForm extends React.Component { - constructor() { - super(); - - this.state = { - image: '', - username: '', - bio: '', - email: '', - password: '', - confirmPassword: "" - }; - - this.updateState = field => ev => { - const state = this.state; - const newState = Object.assign({}, state, { [field]: ev.target.value }); - this.setState(newState); - }; - - this.submitForm = ev => { - ev.preventDefault(); - const regexp = /^\S*$/;//ei välilyöntejä - const user = Object.assign({}, this.state); - if(!regexp.test(user.password) || !regexp.test(user.confirmPassword)){ - swal(" Whitespace not allowed") - return null; - } - - if(user.password !== user.confirmPassword ) { - - swal("Passwords does not match ") - return null; - } - - if (!user.password) { - delete user.password; - } - else if(user.password.length < 4){ - swal("Password too short min 4 digits ") - return - } - else{ - swal({title: 'Password changed' , - timer: 1500, - icon: 'success', - showConfirmButton: false,}) - } - - this.props.onSubmitForm(user); - - }; - } - - componentWillMount() { - if (this.props.currentUser) { - Object.assign(this.state, { - image: this.props.currentUser.image || '', - username: this.props.currentUser.username, - bio: this.props.currentUser.bio, - email: this.props.currentUser.email - }); - } - } - - componentWillReceiveProps(nextProps) { - if (nextProps.currentUser) { - this.setState(Object.assign({}, this.state, { - image: nextProps.currentUser.image || '', - username: nextProps.currentUser.username, - bio: nextProps.currentUser.bio, - email: nextProps.currentUser.email - })); - } - } - - render() { - return ( - <form onSubmit={this.submitForm}> - <fieldset> - - <fieldset className="form-group"> - <input - className="form-control" - type="text" - placeholder="URL of profile picture" - value={this.state.image} - onChange={this.updateState('image')} /> - </fieldset> - - <fieldset className="form-group"> - <input - className="form-control form-control-lg" - type="text" - placeholder="Username" - value={this.state.username} - onChange={this.updateState('username')} /> - </fieldset> - - <fieldset className="form-group"> - <textarea - className="form-control form-control-lg" - rows="8" - placeholder="Short bio about you" - value={this.state.bio} - onChange={this.updateState('bio')}> - </textarea> - </fieldset> - - <fieldset className="form-group"> - <input - className="form-control form-control-lg" - type="email" - placeholder="Email" - value={this.state.email} - onChange={this.updateState('email')} /> - </fieldset> - - <fieldset className="form-group"> - <input - className="form-control form-control-lg" - type={this.state.password ? "password":"text" } - placeholder="New Password" - //value={this.state.password} - onChange={this.updateState('password')} /> - <span - className="hideshowbtn" style={{top: '67%'}} - onMouseDown={()=> this.setState({password:!this.state.password})}> - {this.state.password ? <ShowOffIcon/>:<ShowIcon/>} - </span> - </fieldset> - - <fieldset className="form-group"> - <input - className="form-control form-control-lg" - type={this.state.confirmPassword ? "password":"text" } - placeholder="Confirm Password" - // value={this.state.confirmPassword } - onChange={this.updateState('confirmPassword')} /> - <span - className="hideshowbtn" style={{top: '76%'}} - onMouseDown={()=> this.setState({confirmPassword:!this.state.confirmPassword})}> - {this.state.confirmPassword ? <ShowOffIcon/>:<ShowIcon/>} - </span> - </fieldset> - - <button - className="btn btn-lg btn-primary pull-xs-right" - type="submit" - disabled={this.state.inProgress}> - Update Settings - </button> - - </fieldset> - </form> - ); - } -} - -const mapStateToProps = state => ({ - ...state.settings, - currentUser: state.common.currentUser -}); - -const mapDispatchToProps = dispatch => ({ - onClickLogout: () => dispatch({ type: LOGOUT }), - onClickDeleteUser: user => - dispatch({ type: DELETE_USER, payload: agent.Auth.delete(user) }), - onSubmitForm: user => - dispatch({ type: SETTINGS_SAVED, payload: agent.Auth.save(user) }), - onUnload: () => dispatch({ type: SETTINGS_PAGE_UNLOADED }) -}); - - -class Settings extends React.Component { - - deleteUser() { - swal({ - title: "Are you sure?", - text: "Once deleted, you will not be able to recover your profile! \n All your articles and comments will be deleted!", - icon: "warning", - buttons: true, - dangerMode: true, - }) - .then((willDelete) => { - if (willDelete) { - swal("Poof! Your profile has been deleted!", { - icon: "success", - content: this.props.onClickDeleteUser() - }); - } else { - swal("Canceled!"); - } - }); - } - - render() { - return ( - <div className="settings-page"> - <div className="container page"> - <div className="row"> - <div className="col-md-6 offset-md-3 col-xs-12"> - - <h1 className="text-xs-center">Your Settings</h1> - - <SettingsForm - currentUser={this.props.currentUser} - onSubmitForm={this.props.onSubmitForm} /> - - <ListErrors errors={this.props.errors}></ListErrors> - - <hr /> - - - <button - className="btn btn-outline-danger" - onClick={this.props.onClickLogout}> - Logout - </button> - - <button - className="btn btn-outline-danger pull-xs-right" - onClick={()=>this.deleteUser()}> - Delete account - </button> - - </div> - </div> - </div> - </div> - ); - } -} - -export default connect(mapStateToProps, mapDispatchToProps)(Settings); diff --git a/te-frontend/src/constants/actionTypes.js b/te-frontend/src/constants/actionTypes.js deleted file mode 100644 index f2d4399..0000000 --- a/te-frontend/src/constants/actionTypes.js +++ /dev/null @@ -1,37 +0,0 @@ -export const APP_LOAD = 'APP_LOAD'; -export const REDIRECT = 'REDIRECT'; -export const ARTICLE_SUBMITTED = 'ARTICLE_SUBMITTED'; -export const SETTINGS_SAVED = 'SETTINGS_SAVED'; -export const DELETE_ARTICLE = 'DELETE_ARTICLE'; -export const SETTINGS_PAGE_UNLOADED = 'SETTINGS_PAGE_UNLOADED'; -export const HOME_PAGE_LOADED = 'HOME_PAGE_LOADED'; -export const HOME_PAGE_UNLOADED = 'HOME_PAGE_UNLOADED'; -export const ARTICLE_PAGE_LOADED = 'ARTICLE_PAGE_LOADED'; -export const ARTICLE_PAGE_UNLOADED = 'ARTICLE_PAGE_UNLOADED'; -export const ADD_COMMENT = 'ADD_COMMENT'; -export const DELETE_COMMENT = 'DELETE_COMMENT'; -export const ARTICLE_FAVORITED = 'ARTICLE_FAVORITED'; -export const ARTICLE_UNFAVORITED = 'ARTICLE_UNFAVORITED'; -export const SET_PAGE = 'SET_PAGE'; -export const APPLY_TAG_FILTER = 'APPLY_TAG_FILTER'; -export const CHANGE_TAB = 'CHANGE_TAB'; -export const PROFILE_PAGE_LOADED = 'PROFILE_PAGE_LOADED'; -export const PROFILE_PAGE_UNLOADED = 'PROFILE_PAGE_UNLOADED'; -export const LOGIN = 'LOGIN'; -export const LOGOUT = 'LOGOUT'; -export const REGISTER = 'REGISTER'; -export const LOGIN_PAGE_UNLOADED = 'LOGIN_PAGE_UNLOADED'; -export const REGISTER_PAGE_UNLOADED = 'REGISTER_PAGE_UNLOADED'; -export const ASYNC_START = 'ASYNC_START'; -export const ASYNC_END = 'ASYNC_END'; -export const EDITOR_PAGE_LOADED = 'EDITOR_PAGE_LOADED'; -export const EDITOR_PAGE_UNLOADED = 'EDITOR_PAGE_UNLOADED'; -export const ADD_TAG = 'ADD_TAG'; -export const REMOVE_TAG = 'REMOVE_TAG'; -export const UPDATE_FIELD_AUTH = 'UPDATE_FIELD_AUTH'; -export const UPDATE_FIELD_EDITOR = 'UPDATE_FIELD_EDITOR'; -export const FOLLOW_USER = 'FOLLOW_USER'; -export const UNFOLLOW_USER = 'UNFOLLOW_USER'; -export const PROFILE_FAVORITES_PAGE_UNLOADED = 'PROFILE_FAVORITES_PAGE_UNLOADED'; -export const PROFILE_FAVORITES_PAGE_LOADED = 'PROFILE_FAVORITES_PAGE_LOADED'; -export const DELETE_USER = 'DELETE_USER'; \ No newline at end of file diff --git a/te-frontend/src/index.js b/te-frontend/src/index.js deleted file mode 100644 index 3d20aa2..0000000 --- a/te-frontend/src/index.js +++ /dev/null @@ -1,20 +0,0 @@ -import ReactDOM from 'react-dom'; -import { Provider } from 'react-redux'; -import React from 'react'; -import { store, history} from './store'; - -import { Route, Switch } from 'react-router-dom'; -import { ConnectedRouter } from 'react-router-redux'; - -import App from './components/App'; - -ReactDOM.render(( - <Provider store={store}> - <ConnectedRouter history={history}> - <Switch> - <Route path="/" component={App} /> - </Switch> - </ConnectedRouter> - </Provider> - -), document.getElementById('root')); diff --git a/te-frontend/src/middleware.js b/te-frontend/src/middleware.js deleted file mode 100644 index 17a4d50..0000000 --- a/te-frontend/src/middleware.js +++ /dev/null @@ -1,69 +0,0 @@ -import agent from './agent'; -import { - ASYNC_START, - ASYNC_END, - LOGIN, - LOGOUT, - REGISTER, - DELETE_USER -} from './constants/actionTypes'; - -const promiseMiddleware = store => next => action => { - if (isPromise(action.payload)) { - store.dispatch({ type: ASYNC_START, subtype: action.type }); - - const currentView = store.getState().viewChangeCounter; - const skipTracking = action.skipTracking; - - action.payload.then( - res => { - const currentState = store.getState() - if (!skipTracking && currentState.viewChangeCounter !== currentView) { - return - } - console.log('RESULT', res); - action.payload = res; - store.dispatch({ type: ASYNC_END, promise: action.payload }); - store.dispatch(action); - }, - error => { - const currentState = store.getState() - if (!skipTracking && currentState.viewChangeCounter !== currentView) { - return - } - console.log('ERROR', error); - action.error = true; - action.payload = error.response.body; - if (!action.skipTracking) { - store.dispatch({ type: ASYNC_END, promise: action.payload }); - } - store.dispatch(action); - } - ); - - return; - } - - next(action); -}; - -const localStorageMiddleware = store => next => action => { - if (action.type === REGISTER || action.type === LOGIN) { - if (!action.error) { - window.localStorage.setItem('jwt', action.payload.user.token); - agent.setToken(action.payload.user.token); - } - } else if (action.type === LOGOUT || action.type === DELETE_USER) { - window.localStorage.setItem('jwt', ''); - agent.setToken(null); - } - - next(action); -}; - -function isPromise(v) { - return v && typeof v.then === 'function'; -} - - -export { promiseMiddleware, localStorageMiddleware } diff --git a/te-frontend/src/reducer.js b/te-frontend/src/reducer.js deleted file mode 100644 index 5005911..0000000 --- a/te-frontend/src/reducer.js +++ /dev/null @@ -1,22 +0,0 @@ -import article from './reducers/article'; -import articleList from './reducers/articleList'; -import auth from './reducers/auth'; -import { combineReducers } from 'redux'; -import common from './reducers/common'; -import editor from './reducers/editor'; -import home from './reducers/home'; -import profile from './reducers/profile'; -import settings from './reducers/settings'; -import { routerReducer } from 'react-router-redux'; - -export default combineReducers({ - article, - articleList, - auth, - common, - editor, - home, - profile, - settings, - router: routerReducer -}); diff --git a/te-frontend/src/reducers/article.js b/te-frontend/src/reducers/article.js deleted file mode 100644 index 50ec7a9..0000000 --- a/te-frontend/src/reducers/article.js +++ /dev/null @@ -1,35 +0,0 @@ -import { - ARTICLE_PAGE_LOADED, - ARTICLE_PAGE_UNLOADED, - ADD_COMMENT, - DELETE_COMMENT -} from '../constants/actionTypes'; - -export default (state = {}, action) => { - switch (action.type) { - case ARTICLE_PAGE_LOADED: - return { - ...state, - article: action.payload[0].article, - comments: action.payload[1].comments - }; - case ARTICLE_PAGE_UNLOADED: - return {}; - case ADD_COMMENT: - return { - ...state, - commentErrors: action.error ? action.payload.errors : null, - comments: action.error ? - null : - (state.comments || []).concat([action.payload.comment]) - }; - case DELETE_COMMENT: - const commentId = action.commentId - return { - ...state, - comments: state.comments.filter(comment => comment.id !== commentId) - }; - default: - return state; - } -}; diff --git a/te-frontend/src/reducers/articleList.js b/te-frontend/src/reducers/articleList.js deleted file mode 100644 index 1fe962d..0000000 --- a/te-frontend/src/reducers/articleList.js +++ /dev/null @@ -1,86 +0,0 @@ -import { - ARTICLE_FAVORITED, - ARTICLE_UNFAVORITED, - SET_PAGE, - APPLY_TAG_FILTER, - HOME_PAGE_LOADED, - HOME_PAGE_UNLOADED, - CHANGE_TAB, - PROFILE_PAGE_LOADED, - PROFILE_PAGE_UNLOADED, - PROFILE_FAVORITES_PAGE_LOADED, - PROFILE_FAVORITES_PAGE_UNLOADED -} from '../constants/actionTypes'; - -export default (state = {}, action) => { - switch (action.type) { - case ARTICLE_FAVORITED: - case ARTICLE_UNFAVORITED: - return { - ...state, - articles: state.articles.map(article => { - if (article.slug === action.payload.article.slug) { - return { - ...article, - favorited: action.payload.article.favorited, - favoritesCount: action.payload.article.favoritesCount - }; - } - return article; - }) - }; - case SET_PAGE: - return { - ...state, - articles: action.payload.articles, - articlesCount: action.payload.articlesCount, - currentPage: action.page - }; - case APPLY_TAG_FILTER: - return { - ...state, - pager: action.pager, - articles: action.payload.articles, - articlesCount: action.payload.articlesCount, - tab: null, - tag: action.tag, - currentPage: 0 - }; - case HOME_PAGE_LOADED: - return { - ...state, - pager: action.pager, - tags: action.payload[0].tags, - articles: action.payload[1].articles, - articlesCount: action.payload[1].articlesCount, - currentPage: 0, - tab: action.tab - }; - case HOME_PAGE_UNLOADED: - return {}; - case CHANGE_TAB: - return { - ...state, - pager: action.pager, - articles: action.payload.articles, - articlesCount: action.payload.articlesCount, - tab: action.tab, - currentPage: 0, - tag: null - }; - case PROFILE_PAGE_LOADED: - case PROFILE_FAVORITES_PAGE_LOADED: - return { - ...state, - pager: action.pager, - articles: action.payload[1].articles, - articlesCount: action.payload[1].articlesCount, - currentPage: 0 - }; - case PROFILE_PAGE_UNLOADED: - case PROFILE_FAVORITES_PAGE_UNLOADED: - return {}; - default: - return state; - } -}; diff --git a/te-frontend/src/reducers/auth.js b/te-frontend/src/reducers/auth.js deleted file mode 100644 index 6e83838..0000000 --- a/te-frontend/src/reducers/auth.js +++ /dev/null @@ -1,34 +0,0 @@ -import { - LOGIN, - REGISTER, - LOGIN_PAGE_UNLOADED, - REGISTER_PAGE_UNLOADED, - ASYNC_START, - UPDATE_FIELD_AUTH -} from '../constants/actionTypes'; - -export default (state = {}, action) => { - switch (action.type) { - case LOGIN: - case REGISTER: - return { - ...state, - inProgress: false, - errors: action.error ? action.payload.errors : null - }; - case LOGIN_PAGE_UNLOADED: - case REGISTER_PAGE_UNLOADED: - return {}; - case ASYNC_START: - if (action.subtype === LOGIN || action.subtype === REGISTER) { - return { ...state, inProgress: true }; - } - break; - case UPDATE_FIELD_AUTH: - return { ...state, [action.key]: action.value }; - default: - return state; - } - - return state; -}; diff --git a/te-frontend/src/reducers/common.js b/te-frontend/src/reducers/common.js deleted file mode 100644 index 06d349d..0000000 --- a/te-frontend/src/reducers/common.js +++ /dev/null @@ -1,72 +0,0 @@ -import { - APP_LOAD, - REDIRECT, - LOGOUT, - ARTICLE_SUBMITTED, - SETTINGS_SAVED, - LOGIN, - REGISTER, - DELETE_ARTICLE, - ARTICLE_PAGE_UNLOADED, - EDITOR_PAGE_UNLOADED, - HOME_PAGE_UNLOADED, - PROFILE_PAGE_UNLOADED, - PROFILE_FAVORITES_PAGE_UNLOADED, - SETTINGS_PAGE_UNLOADED, - LOGIN_PAGE_UNLOADED, - REGISTER_PAGE_UNLOADED, - DELETE_USER -} from '../constants/actionTypes'; - -const defaultState = { - appName: 'Conduit', - token: null, - viewChangeCounter: 0 -}; - -export default (state = defaultState, action) => { - switch (action.type) { - case APP_LOAD: - return { - ...state, - token: action.token || null, - appLoaded: true, - currentUser: action.payload ? action.payload.user : null - }; - case REDIRECT: - return { ...state, redirectTo: null }; - case DELETE_USER: - case LOGOUT: - return { ...state, redirectTo: '/', token: null, currentUser: null }; - case ARTICLE_SUBMITTED: - const redirectUrl = action.error ? null : `/article/${action.payload.article.slug}`; - return { ...state, redirectTo: redirectUrl }; - case SETTINGS_SAVED: - return { - ...state, - redirectTo: action.error ? null : '/', - currentUser: action.error ? null : action.payload.user - }; - case LOGIN: - case REGISTER: - return { - ...state, - redirectTo: action.error ? null : '/', - token: action.error ? null : action.payload.user.token, - currentUser: action.error ? null : action.payload.user - }; - case DELETE_ARTICLE: - return { ...state, redirectTo: '/' }; - case ARTICLE_PAGE_UNLOADED: - case EDITOR_PAGE_UNLOADED: - case HOME_PAGE_UNLOADED: - case PROFILE_PAGE_UNLOADED: - case PROFILE_FAVORITES_PAGE_UNLOADED: - case SETTINGS_PAGE_UNLOADED: - case LOGIN_PAGE_UNLOADED: - case REGISTER_PAGE_UNLOADED: - return { ...state, viewChangeCounter: state.viewChangeCounter + 1 }; - default: - return state; - } -}; diff --git a/te-frontend/src/reducers/editor.js b/te-frontend/src/reducers/editor.js deleted file mode 100644 index fd45633..0000000 --- a/te-frontend/src/reducers/editor.js +++ /dev/null @@ -1,54 +0,0 @@ -import { - EDITOR_PAGE_LOADED, - EDITOR_PAGE_UNLOADED, - ARTICLE_SUBMITTED, - ASYNC_START, - ADD_TAG, - REMOVE_TAG, - UPDATE_FIELD_EDITOR -} from '../constants/actionTypes'; - -export default (state = {}, action) => { - switch (action.type) { - case EDITOR_PAGE_LOADED: - return { - ...state, - articleSlug: action.payload ? action.payload.article.slug : '', - title: action.payload ? action.payload.article.title : '', - description: action.payload ? action.payload.article.description : '', - body: action.payload ? action.payload.article.body : '', - tagInput: '', - tagList: action.payload ? action.payload.article.tagList : [] - }; - case EDITOR_PAGE_UNLOADED: - return {}; - case ARTICLE_SUBMITTED: - return { - ...state, - inProgress: null, - errors: action.error ? action.payload.errors : null - }; - case ASYNC_START: - if (action.subtype === ARTICLE_SUBMITTED) { - return { ...state, inProgress: true }; - } - break; - case ADD_TAG: - return { - ...state, - tagList: state.tagList.concat([state.tagInput]), - tagInput: '' - }; - case REMOVE_TAG: - return { - ...state, - tagList: state.tagList.filter(tag => tag !== action.tag) - }; - case UPDATE_FIELD_EDITOR: - return { ...state, [action.key]: action.value }; - default: - return state; - } - - return state; -}; diff --git a/te-frontend/src/reducers/home.js b/te-frontend/src/reducers/home.js deleted file mode 100644 index c1cd49a..0000000 --- a/te-frontend/src/reducers/home.js +++ /dev/null @@ -1,15 +0,0 @@ -import { HOME_PAGE_LOADED, HOME_PAGE_UNLOADED } from '../constants/actionTypes'; - -export default (state = {}, action) => { - switch (action.type) { - case HOME_PAGE_LOADED: - return { - ...state, - tags: action.payload[0].tags - }; - case HOME_PAGE_UNLOADED: - return {}; - default: - return state; - } -}; diff --git a/te-frontend/src/reducers/profile.js b/te-frontend/src/reducers/profile.js deleted file mode 100644 index 5e67a79..0000000 --- a/te-frontend/src/reducers/profile.js +++ /dev/null @@ -1,24 +0,0 @@ -import { - PROFILE_PAGE_LOADED, - PROFILE_PAGE_UNLOADED, - FOLLOW_USER, - UNFOLLOW_USER -} from '../constants/actionTypes'; - -export default (state = {}, action) => { - switch (action.type) { - case PROFILE_PAGE_LOADED: - return { - ...action.payload[0].profile - }; - case PROFILE_PAGE_UNLOADED: - return {}; - case FOLLOW_USER: - case UNFOLLOW_USER: - return { - ...action.payload.profile - }; - default: - return state; - } -}; diff --git a/te-frontend/src/reducers/settings.js b/te-frontend/src/reducers/settings.js deleted file mode 100644 index 8e3751e..0000000 --- a/te-frontend/src/reducers/settings.js +++ /dev/null @@ -1,25 +0,0 @@ -import { - SETTINGS_SAVED, - SETTINGS_PAGE_UNLOADED, - ASYNC_START -} from '../constants/actionTypes'; - -export default (state = {}, action) => { - switch (action.type) { - case SETTINGS_SAVED: - return { - ...state, - inProgress: false, - errors: action.error ? action.payload.errors : null - }; - case SETTINGS_PAGE_UNLOADED: - return {}; - case ASYNC_START: - return { - ...state, - inProgress: true - }; - default: - return state; - } -}; diff --git a/te-frontend/src/store.js b/te-frontend/src/store.js deleted file mode 100644 index 185d866..0000000 --- a/te-frontend/src/store.js +++ /dev/null @@ -1,25 +0,0 @@ -import { applyMiddleware, createStore } from 'redux'; -import { createLogger } from 'redux-logger' -import { composeWithDevTools } from 'redux-devtools-extension/developmentOnly'; -import { promiseMiddleware, localStorageMiddleware } from './middleware'; -import reducer from './reducer'; - -import { routerMiddleware } from 'react-router-redux' -import createHistory from 'history/createBrowserHistory'; - -export const history = createHistory(); - -// Build the middleware for intercepting and dispatching navigation actions -const myRouterMiddleware = routerMiddleware(history); - -const getMiddleware = () => { - if (process.env.NODE_ENV === 'production') { - return applyMiddleware(myRouterMiddleware, promiseMiddleware, localStorageMiddleware); - } else { - // Enable additional logging in non-production environments. - return applyMiddleware(myRouterMiddleware, promiseMiddleware, localStorageMiddleware, createLogger()) - } -}; - -export const store = createStore( - reducer, composeWithDevTools(getMiddleware())); diff --git a/te-frontend/te-frontend-deployment.yaml b/te-frontend/te-frontend-deployment.yaml deleted file mode 100644 index 76d311c..0000000 --- a/te-frontend/te-frontend-deployment.yaml +++ /dev/null @@ -1,33 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: frontend - name: frontend - namespace: default -spec: - replicas: 1 - selector: - matchLabels: - app: frontend - strategy: - rollingUpdate: - maxSurge: 25% - maxUnavailable: 25% - type: RollingUpdate - template: - metadata: - labels: - app: frontend - spec: - containers: - - image: gitlab.labranet.jamk.fi:4567/conduitmiau/te-frontend:frontend - imagePullPolicy: Always - name: frontend - resources: - requests: - cpu: '1' - memory: 1000Mi - - ports: - - containerPort: 4100 diff --git a/te-frontend/te-frontend-service.yaml b/te-frontend/te-frontend-service.yaml deleted file mode 100644 index a195809..0000000 --- a/te-frontend/te-frontend-service.yaml +++ /dev/null @@ -1,13 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: frontend - namespace: default -spec: - type: LoadBalancer - ports: - - nodePort: 30100 - port: 80 - targetPort: 4100 - selector: - app: frontend -- GitLab