diff --git a/backend/.babelrc b/backend/.babelrc
new file mode 100644
index 0000000..f2117b7
--- /dev/null
+++ b/backend/.babelrc
@@ -0,0 +1,9 @@
+{
+ "presets": [
+ "@babel/preset-env"
+ ],
+ "plugins": [
+ "@babel/plugin-transform-runtime",
+ "@babel/plugin-proposal-export-default-from"
+ ]
+}
diff --git a/backend/.editorconfig b/backend/.editorconfig
new file mode 100644
index 0000000..04ba039
--- /dev/null
+++ b/backend/.editorconfig
@@ -0,0 +1,20 @@
+# EditorConfig helps developers define and maintain consistent
+# coding styles between different editors and IDEs
+# editorconfig.org
+
+root = true
+
+[*]
+
+# Change these settings to your own preference
+indent_style = space
+indent_size = 2
+
+# We recommend you to keep these unchanged
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.md]
+trim_trailing_whitespace = false
diff --git a/backend/.env b/backend/.env
new file mode 100644
index 0000000..95a3cfd
--- /dev/null
+++ b/backend/.env
@@ -0,0 +1,2 @@
+MASTER_KEY=dyB4cPIZpFV6X7VIYyKIWRC4GLUKQoV2
+JWT_SECRET=sfDI9AxQb5zpNqVuDB4uB9jw1asIETH2
diff --git a/backend/.eslintrc b/backend/.eslintrc
new file mode 100644
index 0000000..d4f5929
--- /dev/null
+++ b/backend/.eslintrc
@@ -0,0 +1,10 @@
+{
+ "parser": "babel-eslint",
+ "extends": [
+ "standard"
+ ],
+ "env": {
+ "jest": true,
+ "jasmine": true
+ }
+}
diff --git a/backend/.gitignore b/backend/.gitignore
new file mode 100644
index 0000000..23d47e7
--- /dev/null
+++ b/backend/.gitignore
@@ -0,0 +1,11 @@
+.DS_Store
+node_modules
+public
+.tmp
+.idea
+.log
+dist
+npm-debug.log
+.nyc_output
+coverage
+cassettes
diff --git a/backend/.travis.yml b/backend/.travis.yml
new file mode 100644
index 0000000..4418cf3
--- /dev/null
+++ b/backend/.travis.yml
@@ -0,0 +1,19 @@
+language: node_js
+node_js:
+- v4
+- v5
+- v6
+addons:
+ apt:
+ sources:
+ - ubuntu-toolchain-r-test
+ packages:
+ - gcc-4.8
+ - g++-4.8
+script:
+ - npm test -- -i --coverage
+env:
+ global:
+ - CXX=g++-4.8
+ - MASTER_KEY=masterKey
+ - JWT_SECRET=jwtSecret
diff --git a/backend/.yo-rc.json b/backend/.yo-rc.json
new file mode 100644
index 0000000..81ead29
--- /dev/null
+++ b/backend/.yo-rc.json
@@ -0,0 +1,9 @@
+{
+ "generator-rest": {
+ "srcDir": "src",
+ "apiDir": "api",
+ "authMethods": [
+ "password"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/backend/DOCS.md b/backend/DOCS.md
new file mode 100644
index 0000000..a1be626
--- /dev/null
+++ b/backend/DOCS.md
@@ -0,0 +1,397 @@
+# docter-appointment v1.0.0
+
+
+
+- [Appointment](#appointment)
+ - [Create appointment](#create-appointment)
+ - [Delete appointment](#delete-appointment)
+ - [Retrieve appointment](#retrieve-appointment)
+ - [Retrieve appointments](#retrieve-appointments)
+ - [Update appointment](#update-appointment)
+
+- [Auth](#auth)
+ - [Authenticate](#authenticate)
+
+- [Department](#department)
+ - [Create department](#create-department)
+ - [Delete department](#delete-department)
+ - [Retrieve department](#retrieve-department)
+ - [Retrieve departments](#retrieve-departments)
+ - [Update department](#update-department)
+
+- [Doctor](#doctor)
+ - [Create doctor](#create-doctor)
+ - [Delete doctor](#delete-doctor)
+ - [Retrieve doctor](#retrieve-doctor)
+ - [Retrieve doctors](#retrieve-doctors)
+ - [Update doctor](#update-doctor)
+
+- [User](#user)
+ - [Create user](#create-user)
+ - [Delete user](#delete-user)
+ - [Retrieve current user](#retrieve-current-user)
+ - [Retrieve user](#retrieve-user)
+ - [Retrieve users](#retrieve-users)
+ - [Update password](#update-password)
+ - [Update user](#update-user)
+
+
+
+# Appointment
+
+## Create appointment
+
+
+
+ POST /appointments
+
+
+### Parameters
+
+| Name | Type | Description |
+|---------|-----------|--------------------------------------|
+| No | |
Appointment's No.
|
+| Patient-Name | | Appointment's Patient-Name.
|
+| Docter-Name | | Appointment's Docter-Name.
|
+| Date | | Appointment's Date.
|
+| Time | | Appointment's Time.
|
+| Departent | | Appointment's Departent.
|
+
+## Delete appointment
+
+
+
+ DELETE /appointments/:id
+
+
+### Parameters
+
+| Name | Type | Description |
+|---------|-----------|--------------------------------------|
+| access_token | String | admin access token.
|
+
+## Retrieve appointment
+
+
+
+ GET /appointments/:id
+
+
+## Retrieve appointments
+
+
+
+ GET /appointments
+
+
+### Parameters
+
+| Name | Type | Description |
+|---------|-----------|--------------------------------------|
+| access_token | String | admin access token.
|
+| q | String | **optional** Query to search.
|
+| page | Number | **optional** Page number.
|
+| limit | Number | **optional** Amount of returned items.
|
+| sort | String[] | **optional** Order of returned items.
|
+| fields | String[] | **optional** Fields to be returned.
|
+
+## Update appointment
+
+
+
+ PUT /appointments/:id
+
+
+### Parameters
+
+| Name | Type | Description |
+|---------|-----------|--------------------------------------|
+| access_token | String | admin access token.
|
+| No | | Appointment's No.
|
+| Patient-Name | | Appointment's Patient-Name.
|
+| Docter-Name | | Appointment's Docter-Name.
|
+| Date | | Appointment's Date.
|
+| Time | | Appointment's Time.
|
+| Departent | | Appointment's Departent.
|
+
+# Auth
+
+## Authenticate
+
+
+
+ POST /auth
+
+### Headers
+
+| Name | Type | Description |
+|---------|-----------|--------------------------------------|
+| Authorization | String | Basic authorization with email and password.
|
+
+### Parameters
+
+| Name | Type | Description |
+|---------|-----------|--------------------------------------|
+| access_token | String | Master access_token.
|
+
+# Department
+
+## Create department
+
+
+
+ POST /departments
+
+
+### Parameters
+
+| Name | Type | Description |
+|---------|-----------|--------------------------------------|
+| access_token | String | admin access token.
|
+| Id | | Department's Id.
|
+| Name | | Department's Name.
|
+| Nos. | | of Doctor Department's Nos. of Doctor.
|
+
+## Delete department
+
+
+
+ DELETE /departments/:id
+
+
+### Parameters
+
+| Name | Type | Description |
+|---------|-----------|--------------------------------------|
+| access_token | String | admin access token.
|
+
+## Retrieve department
+
+
+
+ GET /departments/:id
+
+
+### Parameters
+
+| Name | Type | Description |
+|---------|-----------|--------------------------------------|
+| access_token | String | admin access token.
|
+
+## Retrieve departments
+
+
+
+ GET /departments
+
+
+### Parameters
+
+| Name | Type | Description |
+|---------|-----------|--------------------------------------|
+| access_token | String | admin access token.
|
+| q | String | **optional** Query to search.
|
+| page | Number | **optional** Page number.
|
+| limit | Number | **optional** Amount of returned items.
|
+| sort | String[] | **optional** Order of returned items.
|
+| fields | String[] | **optional** Fields to be returned.
|
+
+## Update department
+
+
+
+ PUT /departments/:id
+
+
+### Parameters
+
+| Name | Type | Description |
+|---------|-----------|--------------------------------------|
+| access_token | String | admin access token.
|
+| Id | | Department's Id.
|
+| Name | | Department's Name.
|
+| Nos. | | of Doctor Department's Nos. of Doctor.
|
+
+# Doctor
+
+## Create doctor
+
+
+
+ POST /doctors
+
+
+### Parameters
+
+| Name | Type | Description |
+|---------|-----------|--------------------------------------|
+| access_token | String | admin access token.
|
+| Id | | Doctor's Id.
|
+| Name | | Doctor's Name.
|
+| Department | | Doctor's Department.
|
+
+## Delete doctor
+
+
+
+ DELETE /doctors/:id
+
+
+### Parameters
+
+| Name | Type | Description |
+|---------|-----------|--------------------------------------|
+| access_token | String | admin access token.
|
+
+## Retrieve doctor
+
+
+
+ GET /doctors/:id
+
+
+### Parameters
+
+| Name | Type | Description |
+|---------|-----------|--------------------------------------|
+| access_token | String | admin access token.
|
+
+## Retrieve doctors
+
+
+
+ GET /doctors
+
+
+### Parameters
+
+| Name | Type | Description |
+|---------|-----------|--------------------------------------|
+| access_token | String | admin access token.
|
+| q | String | **optional** Query to search.
|
+| page | Number | **optional** Page number.
|
+| limit | Number | **optional** Amount of returned items.
|
+| sort | String[] | **optional** Order of returned items.
|
+| fields | String[] | **optional** Fields to be returned.
|
+
+## Update doctor
+
+
+
+ PUT /doctors/:id
+
+
+### Parameters
+
+| Name | Type | Description |
+|---------|-----------|--------------------------------------|
+| access_token | String | admin access token.
|
+| Id | | Doctor's Id.
|
+| Name | | Doctor's Name.
|
+| Department | | Doctor's Department.
|
+
+# User
+
+## Create user
+
+
+
+ POST /users
+
+
+### Parameters
+
+| Name | Type | Description |
+|---------|-----------|--------------------------------------|
+| access_token | String | Master access_token.
|
+| email | String | User's email.
|
+| password | String | User's password.
|
+| name | String | **optional** User's name.
|
+| picture | String | **optional** User's picture.
|
+| role | String | **optional** User's role.
|
+
+## Delete user
+
+
+
+ DELETE /users/:id
+
+
+### Parameters
+
+| Name | Type | Description |
+|---------|-----------|--------------------------------------|
+| access_token | String | User access_token.
|
+
+## Retrieve current user
+
+
+
+ GET /users/me
+
+
+### Parameters
+
+| Name | Type | Description |
+|---------|-----------|--------------------------------------|
+| access_token | String | User access_token.
|
+
+## Retrieve user
+
+
+
+ GET /users/:id
+
+
+## Retrieve users
+
+
+
+ GET /users
+
+
+### Parameters
+
+| Name | Type | Description |
+|---------|-----------|--------------------------------------|
+| access_token | String | User access_token.
|
+| q | String | **optional** Query to search.
|
+| page | Number | **optional** Page number.
|
+| limit | Number | **optional** Amount of returned items.
|
+| sort | String[] | **optional** Order of returned items.
|
+| fields | String[] | **optional** Fields to be returned.
|
+
+## Update password
+
+
+
+ PUT /users/:id/password
+
+### Headers
+
+| Name | Type | Description |
+|---------|-----------|--------------------------------------|
+| Authorization | String | Basic authorization with email and password.
|
+
+### Parameters
+
+| Name | Type | Description |
+|---------|-----------|--------------------------------------|
+| password | String | User's new password.
|
+
+## Update user
+
+
+
+ PUT /users/:id
+
+
+### Parameters
+
+| Name | Type | Description |
+|---------|-----------|--------------------------------------|
+| access_token | String | User access_token.
|
+| name | String | **optional** User's name.
|
+| picture | String | **optional** User's picture.
|
+
+
diff --git a/backend/README.md b/backend/README.md
new file mode 100644
index 0000000..5bbc6c9
--- /dev/null
+++ b/backend/README.md
@@ -0,0 +1,179 @@
+# DocterAppointment
+
+A RESTful API generated by [generator-rest](https://github.com/diegohaz/generator-rest).
+
+See the API's [documentation](DOCS.md).
+
+## Commands
+
+After you generate your project, these commands are available in `package.json`.
+
+```bash
+npm test # test using Jest
+npm run coverage # test and open the coverage report in the browser
+npm run lint # lint using ESLint
+npm run dev # run the API in development mode
+npm run prod # run the API in production mode
+npm run docs # generate API docs
+```
+
+## Playing locally
+
+First, you will need to install and run [MongoDB](https://www.mongodb.com/) in another terminal instance.
+
+```bash
+$ mongod
+```
+
+Then, run the server in development mode.
+
+```bash
+$ npm run dev
+Express server listening on http://0.0.0.0:9000, in development mode
+```
+
+If you choose to generate the authentication API, you can start to play with it.
+> Note that creating and authenticating users needs a master key (which is defined in the `.env` file)
+
+Create a user (sign up):
+```bash
+curl -X POST http://0.0.0.0:9000/users -i -d "email=test@example.com&password=123456&access_token=MASTER_KEY_HERE"
+```
+
+It will return something like:
+```bash
+HTTP/1.1 201 Created
+...
+{
+ "id": "57d8160eabfa186c7887a8d3",
+ "name": "test",
+ "picture":"https://gravatar.com/avatar/55502f40dc8b7c769880b10874abc9d0?d=identicon",
+ "email": "test@example.com",
+ "createdAt": "2016-09-13T15:06:54.633Z"
+}
+```
+
+Authenticate the user (sign in):
+```bash
+curl -X POST http://0.0.0.0:9000/auth -i -u test@example.com:123456 -d "access_token=MASTER_KEY_HERE"
+```
+
+It will return something like:
+```bash
+HTTP/1.1 201 Created
+...
+{
+ "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9",
+ "user": {
+ "id": "57d8160eabfa186c7887a8d3",
+ "name": "test",
+ "picture": "https://gravatar.com/avatar/55502f40dc8b7c769880b10874abc9d0?d=identicon",
+ "email": "test@example.com",
+ "createdAt":"2016-09-13T15:06:54.633Z"
+ }
+}
+```
+
+Now you can use the `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9` token (it's usually greater than this) to call user protected APIs. For example, you can create a new `article` API using `yo rest:api` and make the `POST /articles` endpoint only accessible to authenticated users. Then, to create a new article you must pass the `access_token` parameter.
+```bash
+curl -X POST http://0.0.0.0:9000/articles -i -d "title=Awesome Article&content=Yeah Baby&access_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
+```
+
+It will return something like:
+```bash
+HTTP/1.1 201 Created
+...
+{
+ "id": "57d819bfabfa186c7887a8d6",
+ "title": "Awesome Article",
+ "content": "Yeah Baby",
+ "createdAt": "2016-09-13T15:22:39.846Z",
+ "updatedAt":"2016-09-13T15:22:39.846Z"
+}
+```
+
+> Some endpoints are only accessible by admin users. To create an admin user, just pass the `role=admin` along to other data when calling `POST /users`.
+
+## Deploy
+
+Here is an example on how to deploy to [Heroku](https://heroku.com) using [Heroku CLI](https://devcenter.heroku.com/articles/heroku-command-line):
+```bash
+# start a new local git repository
+git init
+
+# create a new heroku app
+heroku apps:create my-new-app
+
+# add heroku remote reference to the local repository
+heroku git:remote --app my-new-app
+
+# add the MongoLab addon to the heroku app
+heroku addons:create mongolab
+
+# set the environment variables to the heroku app (see the .env file in root directory)
+heroku config:set MASTER_KEY=masterKey JWT_SECRET=jwtSecret
+
+# commit and push the files
+git add -A
+git commit -m "Initial commit"
+git push heroku master
+
+# open the deployed app in the browser
+heroku open
+```
+
+The second time you deploy, you just need to:
+
+```bash
+git add -A
+git commit -m "Update code"
+git push heroku master
+```
+
+## Directory structure
+
+### Overview
+
+You can customize the `src` and `api` directories.
+
+```
+src/
+├─ api/
+│ ├─ user/
+│ │ ├─ controller.js
+│ │ ├─ index.js
+│ │ ├─ index.test.js
+│ │ ├─ model.js
+│ │ └─ model.test.js
+│ └─ index.js
+├─ services/
+│ ├─ express/
+│ ├─ facebook/
+│ ├─ mongoose/
+│ ├─ passport/
+│ ├─ sendgrid/
+│ └─ your-service/
+├─ app.js
+├─ config.js
+└─ index.js
+```
+
+### src/api/
+
+Here is where the API endpoints are defined. Each API has its own folder.
+
+#### src/api/some-endpoint/model.js
+
+It defines the Mongoose schema and model for the API endpoint. Any changes to the data model should be done here.
+
+#### src/api/some-endpoint/controller.js
+
+This is the API controller file. It defines the main router middlewares which use the API model.
+
+#### src/api/some-endpoint/index.js
+
+This is the entry file of the API. It defines the routes using, along other middlewares (like session, validation etc.), the middlewares defined in the `some-endpoint.controller.js` file.
+
+### services/
+
+Here you can put `helpers`, `libraries` and other types of modules which you want to use in your APIs.
diff --git a/backend/docs/api_data.js b/backend/docs/api_data.js
new file mode 100644
index 0000000..616635b
--- /dev/null
+++ b/backend/docs/api_data.js
@@ -0,0 +1,1805 @@
+define({ "api": [
+ {
+ "type": "post",
+ "url": "/appointments",
+ "title": "Create appointment",
+ "name": "CreateAppointment",
+ "group": "Appointment",
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "No",
+ "description": "Appointment's No.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Patient-Name",
+ "description": "Appointment's Patient-Name.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Docter-Name",
+ "description": "Appointment's Docter-Name.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Date",
+ "description": "Appointment's Date.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Time",
+ "description": "Appointment's Time.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Departent",
+ "description": "Appointment's Departent.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Object",
+ "optional": false,
+ "field": "appointment",
+ "description": "Appointment's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "Appointment not found.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/appointment/index.js",
+ "groupTitle": "Appointment"
+ },
+ {
+ "type": "delete",
+ "url": "/appointments/:id",
+ "title": "Delete appointment",
+ "name": "DeleteAppointment",
+ "group": "Appointment",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "admin access token.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 204": [
+ {
+ "group": "Success 204",
+ "optional": false,
+ "field": "204",
+ "description": "No Content.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "Appointment not found.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/appointment/index.js",
+ "groupTitle": "Appointment"
+ },
+ {
+ "type": "get",
+ "url": "/appointments/:id",
+ "title": "Retrieve appointment",
+ "name": "RetrieveAppointment",
+ "group": "Appointment",
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Object",
+ "optional": false,
+ "field": "appointment",
+ "description": "Appointment's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "Appointment not found.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/appointment/index.js",
+ "groupTitle": "Appointment"
+ },
+ {
+ "type": "get",
+ "url": "/appointments",
+ "title": "Retrieve appointments",
+ "name": "RetrieveAppointments",
+ "group": "Appointment",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "admin access token.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": true,
+ "field": "q",
+ "description": "Query to search.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "Number",
+ "size": "1..30",
+ "optional": true,
+ "field": "page",
+ "defaultValue": "1",
+ "description": "Page number.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "Number",
+ "size": "1..100",
+ "optional": true,
+ "field": "limit",
+ "defaultValue": "30",
+ "description": "Amount of returned items.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String[]",
+ "optional": true,
+ "field": "sort",
+ "defaultValue": "-createdAt",
+ "description": "Order of returned items.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String[]",
+ "optional": true,
+ "field": "fields",
+ "description": "Fields to be returned.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Number",
+ "optional": false,
+ "field": "count",
+ "description": "Total amount of appointments.
"
+ },
+ {
+ "group": "Success 200",
+ "type": "Object[]",
+ "optional": false,
+ "field": "rows",
+ "description": "List of appointments.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/appointment/index.js",
+ "groupTitle": "Appointment"
+ },
+ {
+ "type": "put",
+ "url": "/appointments/:id",
+ "title": "Update appointment",
+ "name": "UpdateAppointment",
+ "group": "Appointment",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "admin access token.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "No",
+ "description": "Appointment's No.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Patient-Name",
+ "description": "Appointment's Patient-Name.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Docter-Name",
+ "description": "Appointment's Docter-Name.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Date",
+ "description": "Appointment's Date.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Time",
+ "description": "Appointment's Time.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Departent",
+ "description": "Appointment's Departent.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Object",
+ "optional": false,
+ "field": "appointment",
+ "description": "Appointment's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "Appointment not found.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/appointment/index.js",
+ "groupTitle": "Appointment"
+ },
+ {
+ "type": "post",
+ "url": "/auth",
+ "title": "Authenticate",
+ "name": "Authenticate",
+ "group": "Auth",
+ "permission": [
+ {
+ "name": "master",
+ "title": "Master access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "header": {
+ "fields": {
+ "Header": [
+ {
+ "group": "Header",
+ "type": "String",
+ "optional": false,
+ "field": "Authorization",
+ "description": "Basic authorization with email and password.
"
+ }
+ ]
+ }
+ },
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "Master access_token.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 201": [
+ {
+ "group": "Success 201",
+ "type": "String",
+ "optional": false,
+ "field": "token",
+ "description": "User access_token
to be passed to other requests.
"
+ },
+ {
+ "group": "Success 201",
+ "type": "Object",
+ "optional": false,
+ "field": "user",
+ "description": "Current user's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "Master access only or invalid credentials.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/auth/index.js",
+ "groupTitle": "Auth"
+ },
+ {
+ "type": "post",
+ "url": "/departments",
+ "title": "Create department",
+ "name": "CreateDepartment",
+ "group": "Department",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "admin access token.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Id",
+ "description": "Department's Id.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Name",
+ "description": "Department's Name.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Nos.",
+ "description": "of Doctor Department's Nos. of Doctor.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Object",
+ "optional": false,
+ "field": "department",
+ "description": "Department's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "Department not found.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/department/index.js",
+ "groupTitle": "Department"
+ },
+ {
+ "type": "delete",
+ "url": "/departments/:id",
+ "title": "Delete department",
+ "name": "DeleteDepartment",
+ "group": "Department",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "admin access token.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 204": [
+ {
+ "group": "Success 204",
+ "optional": false,
+ "field": "204",
+ "description": "No Content.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "Department not found.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/department/index.js",
+ "groupTitle": "Department"
+ },
+ {
+ "type": "get",
+ "url": "/departments/:id",
+ "title": "Retrieve department",
+ "name": "RetrieveDepartment",
+ "group": "Department",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "admin access token.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Object",
+ "optional": false,
+ "field": "department",
+ "description": "Department's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "Department not found.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/department/index.js",
+ "groupTitle": "Department"
+ },
+ {
+ "type": "get",
+ "url": "/departments",
+ "title": "Retrieve departments",
+ "name": "RetrieveDepartments",
+ "group": "Department",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "admin access token.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": true,
+ "field": "q",
+ "description": "Query to search.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "Number",
+ "size": "1..30",
+ "optional": true,
+ "field": "page",
+ "defaultValue": "1",
+ "description": "Page number.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "Number",
+ "size": "1..100",
+ "optional": true,
+ "field": "limit",
+ "defaultValue": "30",
+ "description": "Amount of returned items.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String[]",
+ "optional": true,
+ "field": "sort",
+ "defaultValue": "-createdAt",
+ "description": "Order of returned items.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String[]",
+ "optional": true,
+ "field": "fields",
+ "description": "Fields to be returned.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Number",
+ "optional": false,
+ "field": "count",
+ "description": "Total amount of departments.
"
+ },
+ {
+ "group": "Success 200",
+ "type": "Object[]",
+ "optional": false,
+ "field": "rows",
+ "description": "List of departments.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/department/index.js",
+ "groupTitle": "Department"
+ },
+ {
+ "type": "put",
+ "url": "/departments/:id",
+ "title": "Update department",
+ "name": "UpdateDepartment",
+ "group": "Department",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "admin access token.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Id",
+ "description": "Department's Id.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Name",
+ "description": "Department's Name.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Nos.",
+ "description": "of Doctor Department's Nos. of Doctor.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Object",
+ "optional": false,
+ "field": "department",
+ "description": "Department's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "Department not found.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/department/index.js",
+ "groupTitle": "Department"
+ },
+ {
+ "type": "post",
+ "url": "/doctors",
+ "title": "Create doctor",
+ "name": "CreateDoctor",
+ "group": "Doctor",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "admin access token.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Id",
+ "description": "Doctor's Id.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Name",
+ "description": "Doctor's Name.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Department",
+ "description": "Doctor's Department.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Object",
+ "optional": false,
+ "field": "doctor",
+ "description": "Doctor's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "Doctor not found.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/doctor/index.js",
+ "groupTitle": "Doctor"
+ },
+ {
+ "type": "delete",
+ "url": "/doctors/:id",
+ "title": "Delete doctor",
+ "name": "DeleteDoctor",
+ "group": "Doctor",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "admin access token.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 204": [
+ {
+ "group": "Success 204",
+ "optional": false,
+ "field": "204",
+ "description": "No Content.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "Doctor not found.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/doctor/index.js",
+ "groupTitle": "Doctor"
+ },
+ {
+ "type": "get",
+ "url": "/doctors/:id",
+ "title": "Retrieve doctor",
+ "name": "RetrieveDoctor",
+ "group": "Doctor",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "admin access token.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Object",
+ "optional": false,
+ "field": "doctor",
+ "description": "Doctor's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "Doctor not found.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/doctor/index.js",
+ "groupTitle": "Doctor"
+ },
+ {
+ "type": "get",
+ "url": "/doctors",
+ "title": "Retrieve doctors",
+ "name": "RetrieveDoctors",
+ "group": "Doctor",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "admin access token.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": true,
+ "field": "q",
+ "description": "Query to search.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "Number",
+ "size": "1..30",
+ "optional": true,
+ "field": "page",
+ "defaultValue": "1",
+ "description": "Page number.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "Number",
+ "size": "1..100",
+ "optional": true,
+ "field": "limit",
+ "defaultValue": "30",
+ "description": "Amount of returned items.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String[]",
+ "optional": true,
+ "field": "sort",
+ "defaultValue": "-createdAt",
+ "description": "Order of returned items.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String[]",
+ "optional": true,
+ "field": "fields",
+ "description": "Fields to be returned.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Number",
+ "optional": false,
+ "field": "count",
+ "description": "Total amount of doctors.
"
+ },
+ {
+ "group": "Success 200",
+ "type": "Object[]",
+ "optional": false,
+ "field": "rows",
+ "description": "List of doctors.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/doctor/index.js",
+ "groupTitle": "Doctor"
+ },
+ {
+ "type": "put",
+ "url": "/doctors/:id",
+ "title": "Update doctor",
+ "name": "UpdateDoctor",
+ "group": "Doctor",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "admin access token.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Id",
+ "description": "Doctor's Id.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Name",
+ "description": "Doctor's Name.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Department",
+ "description": "Doctor's Department.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Object",
+ "optional": false,
+ "field": "doctor",
+ "description": "Doctor's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "Doctor not found.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/doctor/index.js",
+ "groupTitle": "Doctor"
+ },
+ {
+ "type": "post",
+ "url": "/users",
+ "title": "Create user",
+ "name": "CreateUser",
+ "group": "User",
+ "permission": [
+ {
+ "name": "master",
+ "title": "Master access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "Master access_token.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "email",
+ "description": "User's email.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String",
+ "size": "6..",
+ "optional": false,
+ "field": "password",
+ "description": "User's password.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": true,
+ "field": "name",
+ "description": "User's name.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": true,
+ "field": "picture",
+ "description": "User's picture.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String",
+ "allowedValues": [
+ "user",
+ "admin"
+ ],
+ "optional": true,
+ "field": "role",
+ "defaultValue": "user",
+ "description": "User's role.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Sucess 201": [
+ {
+ "group": "Sucess 201",
+ "type": "Object",
+ "optional": false,
+ "field": "user",
+ "description": "User's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "Master access only.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "409",
+ "description": "Email already registered.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/user/index.js",
+ "groupTitle": "User"
+ },
+ {
+ "type": "delete",
+ "url": "/users/:id",
+ "title": "Delete user",
+ "name": "DeleteUser",
+ "group": "User",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "User access_token.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 204": [
+ {
+ "group": "Success 204",
+ "optional": false,
+ "field": "204",
+ "description": "No Content.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "Admin access only.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "User not found.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/user/index.js",
+ "groupTitle": "User"
+ },
+ {
+ "type": "get",
+ "url": "/users/me",
+ "title": "Retrieve current user",
+ "name": "RetrieveCurrentUser",
+ "group": "User",
+ "permission": [
+ {
+ "name": "user",
+ "title": "User access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "User access_token.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Object",
+ "optional": false,
+ "field": "user",
+ "description": "User's data.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/user/index.js",
+ "groupTitle": "User"
+ },
+ {
+ "type": "get",
+ "url": "/users/:id",
+ "title": "Retrieve user",
+ "name": "RetrieveUser",
+ "group": "User",
+ "permission": [
+ {
+ "name": "public"
+ }
+ ],
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Object",
+ "optional": false,
+ "field": "user",
+ "description": "User's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "User not found.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/user/index.js",
+ "groupTitle": "User"
+ },
+ {
+ "type": "get",
+ "url": "/users",
+ "title": "Retrieve users",
+ "name": "RetrieveUsers",
+ "group": "User",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "User access_token.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": true,
+ "field": "q",
+ "description": "Query to search.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "Number",
+ "size": "1..30",
+ "optional": true,
+ "field": "page",
+ "defaultValue": "1",
+ "description": "Page number.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "Number",
+ "size": "1..100",
+ "optional": true,
+ "field": "limit",
+ "defaultValue": "30",
+ "description": "Amount of returned items.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String[]",
+ "optional": true,
+ "field": "sort",
+ "defaultValue": "-createdAt",
+ "description": "Order of returned items.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String[]",
+ "optional": true,
+ "field": "fields",
+ "description": "Fields to be returned.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Object[]",
+ "optional": false,
+ "field": "users",
+ "description": "List of users.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "Admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/user/index.js",
+ "groupTitle": "User"
+ },
+ {
+ "type": "put",
+ "url": "/users/:id/password",
+ "title": "Update password",
+ "name": "UpdatePassword",
+ "group": "User",
+ "header": {
+ "fields": {
+ "Header": [
+ {
+ "group": "Header",
+ "type": "String",
+ "optional": false,
+ "field": "Authorization",
+ "description": "Basic authorization with email and password.
"
+ }
+ ]
+ }
+ },
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "size": "6..",
+ "optional": false,
+ "field": "password",
+ "description": "User's new password.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 201": [
+ {
+ "group": "Success 201",
+ "type": "Object",
+ "optional": false,
+ "field": "user",
+ "description": "User's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "Current user access only.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "User not found.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/user/index.js",
+ "groupTitle": "User"
+ },
+ {
+ "type": "put",
+ "url": "/users/:id",
+ "title": "Update user",
+ "name": "UpdateUser",
+ "group": "User",
+ "permission": [
+ {
+ "name": "user",
+ "title": "User access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "User access_token.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": true,
+ "field": "name",
+ "description": "User's name.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": true,
+ "field": "picture",
+ "description": "User's picture.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Object",
+ "optional": false,
+ "field": "user",
+ "description": "User's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "Current user or admin access only.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "User not found.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/user/index.js",
+ "groupTitle": "User"
+ }
+] });
diff --git a/backend/docs/api_data.json b/backend/docs/api_data.json
new file mode 100644
index 0000000..6b41220
--- /dev/null
+++ b/backend/docs/api_data.json
@@ -0,0 +1,1805 @@
+[
+ {
+ "type": "post",
+ "url": "/appointments",
+ "title": "Create appointment",
+ "name": "CreateAppointment",
+ "group": "Appointment",
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "No",
+ "description": "Appointment's No.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Patient-Name",
+ "description": "Appointment's Patient-Name.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Docter-Name",
+ "description": "Appointment's Docter-Name.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Date",
+ "description": "Appointment's Date.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Time",
+ "description": "Appointment's Time.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Departent",
+ "description": "Appointment's Departent.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Object",
+ "optional": false,
+ "field": "appointment",
+ "description": "Appointment's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "Appointment not found.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/appointment/index.js",
+ "groupTitle": "Appointment"
+ },
+ {
+ "type": "delete",
+ "url": "/appointments/:id",
+ "title": "Delete appointment",
+ "name": "DeleteAppointment",
+ "group": "Appointment",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "admin access token.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 204": [
+ {
+ "group": "Success 204",
+ "optional": false,
+ "field": "204",
+ "description": "No Content.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "Appointment not found.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/appointment/index.js",
+ "groupTitle": "Appointment"
+ },
+ {
+ "type": "get",
+ "url": "/appointments/:id",
+ "title": "Retrieve appointment",
+ "name": "RetrieveAppointment",
+ "group": "Appointment",
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Object",
+ "optional": false,
+ "field": "appointment",
+ "description": "Appointment's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "Appointment not found.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/appointment/index.js",
+ "groupTitle": "Appointment"
+ },
+ {
+ "type": "get",
+ "url": "/appointments",
+ "title": "Retrieve appointments",
+ "name": "RetrieveAppointments",
+ "group": "Appointment",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "admin access token.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": true,
+ "field": "q",
+ "description": "Query to search.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "Number",
+ "size": "1..30",
+ "optional": true,
+ "field": "page",
+ "defaultValue": "1",
+ "description": "Page number.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "Number",
+ "size": "1..100",
+ "optional": true,
+ "field": "limit",
+ "defaultValue": "30",
+ "description": "Amount of returned items.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String[]",
+ "optional": true,
+ "field": "sort",
+ "defaultValue": "-createdAt",
+ "description": "Order of returned items.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String[]",
+ "optional": true,
+ "field": "fields",
+ "description": "Fields to be returned.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Number",
+ "optional": false,
+ "field": "count",
+ "description": "Total amount of appointments.
"
+ },
+ {
+ "group": "Success 200",
+ "type": "Object[]",
+ "optional": false,
+ "field": "rows",
+ "description": "List of appointments.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/appointment/index.js",
+ "groupTitle": "Appointment"
+ },
+ {
+ "type": "put",
+ "url": "/appointments/:id",
+ "title": "Update appointment",
+ "name": "UpdateAppointment",
+ "group": "Appointment",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "admin access token.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "No",
+ "description": "Appointment's No.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Patient-Name",
+ "description": "Appointment's Patient-Name.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Docter-Name",
+ "description": "Appointment's Docter-Name.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Date",
+ "description": "Appointment's Date.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Time",
+ "description": "Appointment's Time.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Departent",
+ "description": "Appointment's Departent.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Object",
+ "optional": false,
+ "field": "appointment",
+ "description": "Appointment's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "Appointment not found.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/appointment/index.js",
+ "groupTitle": "Appointment"
+ },
+ {
+ "type": "post",
+ "url": "/auth",
+ "title": "Authenticate",
+ "name": "Authenticate",
+ "group": "Auth",
+ "permission": [
+ {
+ "name": "master",
+ "title": "Master access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "header": {
+ "fields": {
+ "Header": [
+ {
+ "group": "Header",
+ "type": "String",
+ "optional": false,
+ "field": "Authorization",
+ "description": "Basic authorization with email and password.
"
+ }
+ ]
+ }
+ },
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "Master access_token.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 201": [
+ {
+ "group": "Success 201",
+ "type": "String",
+ "optional": false,
+ "field": "token",
+ "description": "User access_token
to be passed to other requests.
"
+ },
+ {
+ "group": "Success 201",
+ "type": "Object",
+ "optional": false,
+ "field": "user",
+ "description": "Current user's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "Master access only or invalid credentials.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/auth/index.js",
+ "groupTitle": "Auth"
+ },
+ {
+ "type": "post",
+ "url": "/departments",
+ "title": "Create department",
+ "name": "CreateDepartment",
+ "group": "Department",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "admin access token.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Id",
+ "description": "Department's Id.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Name",
+ "description": "Department's Name.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Nos.",
+ "description": "of Doctor Department's Nos. of Doctor.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Object",
+ "optional": false,
+ "field": "department",
+ "description": "Department's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "Department not found.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/department/index.js",
+ "groupTitle": "Department"
+ },
+ {
+ "type": "delete",
+ "url": "/departments/:id",
+ "title": "Delete department",
+ "name": "DeleteDepartment",
+ "group": "Department",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "admin access token.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 204": [
+ {
+ "group": "Success 204",
+ "optional": false,
+ "field": "204",
+ "description": "No Content.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "Department not found.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/department/index.js",
+ "groupTitle": "Department"
+ },
+ {
+ "type": "get",
+ "url": "/departments/:id",
+ "title": "Retrieve department",
+ "name": "RetrieveDepartment",
+ "group": "Department",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "admin access token.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Object",
+ "optional": false,
+ "field": "department",
+ "description": "Department's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "Department not found.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/department/index.js",
+ "groupTitle": "Department"
+ },
+ {
+ "type": "get",
+ "url": "/departments",
+ "title": "Retrieve departments",
+ "name": "RetrieveDepartments",
+ "group": "Department",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "admin access token.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": true,
+ "field": "q",
+ "description": "Query to search.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "Number",
+ "size": "1..30",
+ "optional": true,
+ "field": "page",
+ "defaultValue": "1",
+ "description": "Page number.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "Number",
+ "size": "1..100",
+ "optional": true,
+ "field": "limit",
+ "defaultValue": "30",
+ "description": "Amount of returned items.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String[]",
+ "optional": true,
+ "field": "sort",
+ "defaultValue": "-createdAt",
+ "description": "Order of returned items.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String[]",
+ "optional": true,
+ "field": "fields",
+ "description": "Fields to be returned.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Number",
+ "optional": false,
+ "field": "count",
+ "description": "Total amount of departments.
"
+ },
+ {
+ "group": "Success 200",
+ "type": "Object[]",
+ "optional": false,
+ "field": "rows",
+ "description": "List of departments.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/department/index.js",
+ "groupTitle": "Department"
+ },
+ {
+ "type": "put",
+ "url": "/departments/:id",
+ "title": "Update department",
+ "name": "UpdateDepartment",
+ "group": "Department",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "admin access token.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Id",
+ "description": "Department's Id.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Name",
+ "description": "Department's Name.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Nos.",
+ "description": "of Doctor Department's Nos. of Doctor.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Object",
+ "optional": false,
+ "field": "department",
+ "description": "Department's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "Department not found.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/department/index.js",
+ "groupTitle": "Department"
+ },
+ {
+ "type": "post",
+ "url": "/doctors",
+ "title": "Create doctor",
+ "name": "CreateDoctor",
+ "group": "Doctor",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "admin access token.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Id",
+ "description": "Doctor's Id.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Name",
+ "description": "Doctor's Name.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Department",
+ "description": "Doctor's Department.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Object",
+ "optional": false,
+ "field": "doctor",
+ "description": "Doctor's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "Doctor not found.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/doctor/index.js",
+ "groupTitle": "Doctor"
+ },
+ {
+ "type": "delete",
+ "url": "/doctors/:id",
+ "title": "Delete doctor",
+ "name": "DeleteDoctor",
+ "group": "Doctor",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "admin access token.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 204": [
+ {
+ "group": "Success 204",
+ "optional": false,
+ "field": "204",
+ "description": "No Content.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "Doctor not found.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/doctor/index.js",
+ "groupTitle": "Doctor"
+ },
+ {
+ "type": "get",
+ "url": "/doctors/:id",
+ "title": "Retrieve doctor",
+ "name": "RetrieveDoctor",
+ "group": "Doctor",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "admin access token.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Object",
+ "optional": false,
+ "field": "doctor",
+ "description": "Doctor's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "Doctor not found.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/doctor/index.js",
+ "groupTitle": "Doctor"
+ },
+ {
+ "type": "get",
+ "url": "/doctors",
+ "title": "Retrieve doctors",
+ "name": "RetrieveDoctors",
+ "group": "Doctor",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "admin access token.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": true,
+ "field": "q",
+ "description": "Query to search.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "Number",
+ "size": "1..30",
+ "optional": true,
+ "field": "page",
+ "defaultValue": "1",
+ "description": "Page number.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "Number",
+ "size": "1..100",
+ "optional": true,
+ "field": "limit",
+ "defaultValue": "30",
+ "description": "Amount of returned items.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String[]",
+ "optional": true,
+ "field": "sort",
+ "defaultValue": "-createdAt",
+ "description": "Order of returned items.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String[]",
+ "optional": true,
+ "field": "fields",
+ "description": "Fields to be returned.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Number",
+ "optional": false,
+ "field": "count",
+ "description": "Total amount of doctors.
"
+ },
+ {
+ "group": "Success 200",
+ "type": "Object[]",
+ "optional": false,
+ "field": "rows",
+ "description": "List of doctors.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/doctor/index.js",
+ "groupTitle": "Doctor"
+ },
+ {
+ "type": "put",
+ "url": "/doctors/:id",
+ "title": "Update doctor",
+ "name": "UpdateDoctor",
+ "group": "Doctor",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "admin access token.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Id",
+ "description": "Doctor's Id.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Name",
+ "description": "Doctor's Name.
"
+ },
+ {
+ "group": "Parameter",
+ "optional": false,
+ "field": "Department",
+ "description": "Doctor's Department.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Object",
+ "optional": false,
+ "field": "doctor",
+ "description": "Doctor's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "Doctor not found.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/doctor/index.js",
+ "groupTitle": "Doctor"
+ },
+ {
+ "type": "post",
+ "url": "/users",
+ "title": "Create user",
+ "name": "CreateUser",
+ "group": "User",
+ "permission": [
+ {
+ "name": "master",
+ "title": "Master access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "Master access_token.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "email",
+ "description": "User's email.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String",
+ "size": "6..",
+ "optional": false,
+ "field": "password",
+ "description": "User's password.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": true,
+ "field": "name",
+ "description": "User's name.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": true,
+ "field": "picture",
+ "description": "User's picture.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String",
+ "allowedValues": [
+ "user",
+ "admin"
+ ],
+ "optional": true,
+ "field": "role",
+ "defaultValue": "user",
+ "description": "User's role.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Sucess 201": [
+ {
+ "group": "Sucess 201",
+ "type": "Object",
+ "optional": false,
+ "field": "user",
+ "description": "User's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "Master access only.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "409",
+ "description": "Email already registered.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/user/index.js",
+ "groupTitle": "User"
+ },
+ {
+ "type": "delete",
+ "url": "/users/:id",
+ "title": "Delete user",
+ "name": "DeleteUser",
+ "group": "User",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "User access_token.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 204": [
+ {
+ "group": "Success 204",
+ "optional": false,
+ "field": "204",
+ "description": "No Content.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "Admin access only.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "User not found.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/user/index.js",
+ "groupTitle": "User"
+ },
+ {
+ "type": "get",
+ "url": "/users/me",
+ "title": "Retrieve current user",
+ "name": "RetrieveCurrentUser",
+ "group": "User",
+ "permission": [
+ {
+ "name": "user",
+ "title": "User access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "User access_token.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Object",
+ "optional": false,
+ "field": "user",
+ "description": "User's data.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/user/index.js",
+ "groupTitle": "User"
+ },
+ {
+ "type": "get",
+ "url": "/users/:id",
+ "title": "Retrieve user",
+ "name": "RetrieveUser",
+ "group": "User",
+ "permission": [
+ {
+ "name": "public"
+ }
+ ],
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Object",
+ "optional": false,
+ "field": "user",
+ "description": "User's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "User not found.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/user/index.js",
+ "groupTitle": "User"
+ },
+ {
+ "type": "get",
+ "url": "/users",
+ "title": "Retrieve users",
+ "name": "RetrieveUsers",
+ "group": "User",
+ "permission": [
+ {
+ "name": "admin",
+ "title": "Admin access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "User access_token.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": true,
+ "field": "q",
+ "description": "Query to search.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "Number",
+ "size": "1..30",
+ "optional": true,
+ "field": "page",
+ "defaultValue": "1",
+ "description": "Page number.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "Number",
+ "size": "1..100",
+ "optional": true,
+ "field": "limit",
+ "defaultValue": "30",
+ "description": "Amount of returned items.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String[]",
+ "optional": true,
+ "field": "sort",
+ "defaultValue": "-createdAt",
+ "description": "Order of returned items.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String[]",
+ "optional": true,
+ "field": "fields",
+ "description": "Fields to be returned.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Object[]",
+ "optional": false,
+ "field": "users",
+ "description": "List of users.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "Admin access only.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/user/index.js",
+ "groupTitle": "User"
+ },
+ {
+ "type": "put",
+ "url": "/users/:id/password",
+ "title": "Update password",
+ "name": "UpdatePassword",
+ "group": "User",
+ "header": {
+ "fields": {
+ "Header": [
+ {
+ "group": "Header",
+ "type": "String",
+ "optional": false,
+ "field": "Authorization",
+ "description": "Basic authorization with email and password.
"
+ }
+ ]
+ }
+ },
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "size": "6..",
+ "optional": false,
+ "field": "password",
+ "description": "User's new password.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 201": [
+ {
+ "group": "Success 201",
+ "type": "Object",
+ "optional": false,
+ "field": "user",
+ "description": "User's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "Current user access only.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "User not found.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/user/index.js",
+ "groupTitle": "User"
+ },
+ {
+ "type": "put",
+ "url": "/users/:id",
+ "title": "Update user",
+ "name": "UpdateUser",
+ "group": "User",
+ "permission": [
+ {
+ "name": "user",
+ "title": "User access only",
+ "description": "You must pass access_token
parameter or a Bearer Token authorization header to access this endpoint.
"
+ }
+ ],
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "User access_token.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": true,
+ "field": "name",
+ "description": "User's name.
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": true,
+ "field": "picture",
+ "description": "User's picture.
"
+ }
+ ]
+ }
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "Object",
+ "optional": false,
+ "field": "user",
+ "description": "User's data.
"
+ }
+ ]
+ }
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "type": "Object",
+ "optional": false,
+ "field": "400",
+ "description": "Some parameters may contain invalid values.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "401",
+ "description": "Current user or admin access only.
"
+ },
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "404",
+ "description": "User not found.
"
+ }
+ ]
+ }
+ },
+ "version": "0.0.0",
+ "filename": "src/api/user/index.js",
+ "groupTitle": "User"
+ }
+]
diff --git a/backend/docs/api_project.js b/backend/docs/api_project.js
new file mode 100644
index 0000000..c923e9e
--- /dev/null
+++ b/backend/docs/api_project.js
@@ -0,0 +1,14 @@
+define({
+ "name": "docter-appointment",
+ "version": "1.0.0",
+ "description": "",
+ "sampleUrl": false,
+ "defaultVersion": "0.0.0",
+ "apidoc": "0.3.0",
+ "generator": {
+ "name": "apidoc",
+ "time": "2020-10-22T19:01:49.797Z",
+ "url": "http://apidocjs.com",
+ "version": "0.20.1"
+ }
+});
diff --git a/backend/docs/api_project.json b/backend/docs/api_project.json
new file mode 100644
index 0000000..d1da28f
--- /dev/null
+++ b/backend/docs/api_project.json
@@ -0,0 +1,14 @@
+{
+ "name": "docter-appointment",
+ "version": "1.0.0",
+ "description": "",
+ "sampleUrl": false,
+ "defaultVersion": "0.0.0",
+ "apidoc": "0.3.0",
+ "generator": {
+ "name": "apidoc",
+ "time": "2020-10-22T19:01:49.797Z",
+ "url": "http://apidocjs.com",
+ "version": "0.20.1"
+ }
+}
diff --git a/backend/docs/css/style.css b/backend/docs/css/style.css
new file mode 100644
index 0000000..8083dae
--- /dev/null
+++ b/backend/docs/css/style.css
@@ -0,0 +1,577 @@
+/* ------------------------------------------------------------------------------------------
+ * Content
+ * ------------------------------------------------------------------------------------------ */
+body {
+ max-width: 1280px;
+}
+
+body, p, a, div, th, td {
+ font-family: "Source Sans Pro", sans-serif;
+ font-weight: 400;
+ font-size: 16px;
+}
+
+@media (min-width: 1200px) {
+ body.container-fluid {
+ padding-right: 0px;
+ padding-left: 0px;
+ margin-right: 0px;
+ margin-left: 0px;
+ }
+}
+
+td.code {
+ font-size: 14px;
+ font-family: "Source Code Pro", monospace;
+ font-style: normal;
+ font-weight: 400;
+}
+
+#content {
+ padding-top: 16px;
+ z-Index: -1;
+ margin-left: 270px;
+}
+
+p {
+ color: #808080;
+}
+
+h1 {
+ font-family: "Source Sans Pro Semibold", sans-serif;
+ font-weight: normal;
+ font-size: 44px;
+ line-height: 50px;
+ margin: 0 0 10px 0;
+ padding: 0;
+}
+
+h2 {
+ font-family: "Source Sans Pro", sans-serif;
+ font-weight: normal;
+ font-size: 24px;
+ line-height: 40px;
+ margin: 0 0 20px 0;
+ padding: 0;
+}
+
+section {
+ border-top: 1px solid #ebebeb;
+ padding: 30px 0;
+}
+
+section h1 {
+ font-family: "Source Sans Pro", sans-serif;
+ font-weight: 700;
+ font-size: 32px;
+ line-height: 40px;
+ padding-bottom: 14px;
+ margin: 0 0 20px 0;
+ padding: 0;
+}
+
+article {
+ padding: 14px 0 30px 0;
+}
+
+article h1 {
+ font-family: "Source Sans Pro Bold", sans-serif;
+ font-weight: 600;
+ font-size: 24px;
+ line-height: 26px;
+}
+
+article h2 {
+ font-family: "Source Sans Pro", sans-serif;
+ font-weight: 600;
+ font-size: 18px;
+ line-height: 24px;
+ margin: 0 0 10px 0;
+}
+
+article h3 {
+ font-family: "Source Sans Pro", sans-serif;
+ font-weight: 600;
+ font-size: 16px;
+ line-height: 18px;
+ margin: 0 0 10px 0;
+}
+
+article h4 {
+ font-family: "Source Sans Pro", sans-serif;
+ font-weight: 600;
+ font-size: 14px;
+ line-height: 16px;
+ margin: 0 0 8px 0;
+}
+
+table {
+ border-collapse: collapse;
+ width: 100%;
+ margin: 0 0 20px 0;
+}
+
+th {
+ background-color: #f5f5f5;
+ text-align: left;
+ font-family: "Source Sans Pro", sans-serif;
+ font-weight: 700;
+ padding: 4px 8px;
+ border: #e0e0e0 1px solid;
+}
+
+td {
+ vertical-align: top;
+ padding: 10px 8px 0 8px;
+ border: #e0e0e0 1px solid;
+}
+
+#generator .content {
+ color: #b0b0b0;
+ border-top: 1px solid #ebebeb;
+ padding: 10px 0;
+}
+
+.label-optional {
+ float: right;
+ background-color: grey;
+ margin-top: 4px;
+}
+
+.open-left {
+ right: 0;
+ left: auto;
+}
+
+/* ------------------------------------------------------------------------------------------
+ * apidoc - intro
+ * ------------------------------------------------------------------------------------------ */
+
+#apidoc .apidoc {
+ border-top: 1px solid #ebebeb;
+ padding: 30px 0;
+}
+
+#apidoc h1 {
+ font-family: "Source Sans Pro", sans-serif;
+ font-weight: 700;
+ font-size: 32px;
+ line-height: 40px;
+ padding-bottom: 14px;
+ margin: 0 0 20px 0;
+ padding: 0;
+}
+
+#apidoc h2 {
+ font-family: "Source Sans Pro Bold", sans-serif;
+ font-weight: 600;
+ font-size: 22px;
+ line-height: 26px;
+ padding-top: 14px;
+}
+
+/* ------------------------------------------------------------------------------------------
+ * pre / code
+ * ------------------------------------------------------------------------------------------ */
+pre {
+ background-color: #292b36;
+ color: #ffffff;
+ padding: 10px;
+ border-radius: 6px;
+ position: relative;
+ margin: 10px 0 20px 0;
+ overflow-x: auto;
+}
+
+pre.prettyprint {
+ width: 100%;
+}
+
+code.language-text {
+ word-wrap: break-word;
+}
+
+pre.language-json {
+ overflow: auto;
+}
+
+pre.language-html {
+ margin: 0 0 20px 0;
+}
+
+.type {
+ font-family: "Source Sans Pro", sans-serif;
+ font-weight: 600;
+ font-size: 15px;
+ display: inline-block;
+ margin: 0 0 5px 0;
+ padding: 4px 5px;
+ border-radius: 6px;
+ text-transform: uppercase;
+ background-color: #3387CC;
+ color: #ffffff;
+}
+
+.type__get {
+ background-color: green;
+}
+
+.type__put {
+ background-color: #e5c500;
+}
+
+.type__post {
+ background-color: #4070ec;
+}
+
+.type__delete {
+ background-color: #ed0039;
+}
+
+pre.language-api .str {
+ color: #ffffff;
+}
+
+pre.language-api .pln,
+pre.language-api .pun {
+ color: #65B042;
+}
+
+pre code {
+ display: block;
+ font-size: 14px;
+ font-family: "Source Code Pro", monospace;
+ font-style: normal;
+ font-weight: 400;
+ word-wrap: normal;
+ white-space: pre;
+}
+
+pre code.sample-request-response-json {
+ white-space: pre-wrap;
+ max-height: 500px;
+ overflow: auto;
+}
+
+/* ------------------------------------------------------------------------------------------
+ * Sidenav
+ * ------------------------------------------------------------------------------------------ */
+.sidenav {
+ width: 228px;
+ margin: 0;
+ padding: 0 20px 20px 20px;
+ position: fixed;
+ top: 50px;
+ left: 0;
+ bottom: 0;
+ overflow-x: hidden;
+ overflow-y: auto;
+ background-color: #f5f5f5;
+ z-index: 10;
+}
+
+.sidenav > li > a {
+ display: block;
+ width: 192px;
+ margin: 0;
+ padding: 2px 11px;
+ border: 0;
+ border-left: transparent 4px solid;
+ border-right: transparent 4px solid;
+ font-family: "Source Sans Pro", sans-serif;
+ font-weight: 400;
+ font-size: 14px;
+}
+
+.sidenav > li.nav-header {
+ margin-top: 8px;
+ margin-bottom: 8px;
+}
+
+.sidenav > li.nav-header > a {
+ padding: 5px 15px;
+ border: 1px solid #e5e5e5;
+ width: 190px;
+ font-family: "Source Sans Pro", sans-serif;
+ font-weight: 700;
+ font-size: 16px;
+ background-color: #ffffff;
+}
+
+.sidenav > li.active > a {
+ position: relative;
+ z-index: 2;
+ background-color: #0088cc;
+ color: #ffffff;
+}
+
+.sidenav > li.has-modifications a {
+ border-right: #60d060 4px solid;
+}
+
+.sidenav > li.is-new a {
+ border-left: #e5e5e5 4px solid;
+}
+
+/* ------------------------------------------------------------------------------------------
+ * Side nav search
+ * ------------------------------------------------------------------------------------------ */
+.sidenav-search {
+ width: 228px;
+ left: 0px;
+ position: fixed;
+ padding: 16px 20px 10px 20px;
+ background-color: #F5F5F5;
+ z-index: 11;
+}
+
+.sidenav-search .search {
+ height: 26px;
+}
+
+.search-reset {
+ position: absolute;
+ display: block;
+ cursor: pointer;
+ width: 20px;
+ height: 20px;
+ text-align: center;
+ right: 28px;
+ top: 17px;
+ background-color: #fff;
+}
+
+/* ------------------------------------------------------------------------------------------
+ * Compare
+ * ------------------------------------------------------------------------------------------ */
+
+ins {
+ background: #60d060;
+ text-decoration: none;
+ color: #000000;
+}
+
+del {
+ background: #f05050;
+ color: #000000;
+}
+
+.label-ins {
+ background-color: #60d060;
+}
+
+.label-del {
+ background-color: #f05050;
+ text-decoration: line-through;
+}
+
+pre.ins {
+ background-color: #60d060;
+}
+
+pre.del {
+ background-color: #f05050;
+ text-decoration: line-through;
+}
+
+table.ins th,
+table.ins td {
+ background-color: #60d060;
+}
+
+table.del th,
+table.del td {
+ background-color: #f05050;
+ text-decoration: line-through;
+}
+
+tr.ins td {
+ background-color: #60d060;
+}
+
+tr.del td {
+ background-color: #f05050;
+ text-decoration: line-through;
+}
+
+/* ------------------------------------------------------------------------------------------
+ * Spinner
+ * ------------------------------------------------------------------------------------------ */
+
+#loader {
+ position: absolute;
+ width: 100%;
+}
+
+#loader p {
+ padding-top: 80px;
+ margin-left: -4px;
+}
+
+.spinner {
+ margin: 200px auto;
+ width: 60px;
+ height: 60px;
+ position: relative;
+}
+
+.container1 > div, .container2 > div, .container3 > div {
+ width: 14px;
+ height: 14px;
+ background-color: #0088cc;
+
+ border-radius: 100%;
+ position: absolute;
+ -webkit-animation: bouncedelay 1.2s infinite ease-in-out;
+ animation: bouncedelay 1.2s infinite ease-in-out;
+ /* Prevent first frame from flickering when animation starts */
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both;
+}
+
+.spinner .spinner-container {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+}
+
+.container2 {
+ -webkit-transform: rotateZ(45deg);
+ transform: rotateZ(45deg);
+}
+
+.container3 {
+ -webkit-transform: rotateZ(90deg);
+ transform: rotateZ(90deg);
+}
+
+.circle1 { top: 0; left: 0; }
+.circle2 { top: 0; right: 0; }
+.circle3 { right: 0; bottom: 0; }
+.circle4 { left: 0; bottom: 0; }
+
+.container2 .circle1 {
+ -webkit-animation-delay: -1.1s;
+ animation-delay: -1.1s;
+}
+
+.container3 .circle1 {
+ -webkit-animation-delay: -1.0s;
+ animation-delay: -1.0s;
+}
+
+.container1 .circle2 {
+ -webkit-animation-delay: -0.9s;
+ animation-delay: -0.9s;
+}
+
+.container2 .circle2 {
+ -webkit-animation-delay: -0.8s;
+ animation-delay: -0.8s;
+}
+
+.container3 .circle2 {
+ -webkit-animation-delay: -0.7s;
+ animation-delay: -0.7s;
+}
+
+.container1 .circle3 {
+ -webkit-animation-delay: -0.6s;
+ animation-delay: -0.6s;
+}
+
+.container2 .circle3 {
+ -webkit-animation-delay: -0.5s;
+ animation-delay: -0.5s;
+}
+
+.container3 .circle3 {
+ -webkit-animation-delay: -0.4s;
+ animation-delay: -0.4s;
+}
+
+.container1 .circle4 {
+ -webkit-animation-delay: -0.3s;
+ animation-delay: -0.3s;
+}
+
+.container2 .circle4 {
+ -webkit-animation-delay: -0.2s;
+ animation-delay: -0.2s;
+}
+
+.container3 .circle4 {
+ -webkit-animation-delay: -0.1s;
+ animation-delay: -0.1s;
+}
+
+@-webkit-keyframes bouncedelay {
+ 0%, 80%, 100% { -webkit-transform: scale(0.0) }
+ 40% { -webkit-transform: scale(1.0) }
+}
+
+@keyframes bouncedelay {
+ 0%, 80%, 100% {
+ transform: scale(0.0);
+ -webkit-transform: scale(0.0);
+ } 40% {
+ transform: scale(1.0);
+ -webkit-transform: scale(1.0);
+ }
+}
+
+/* ------------------------------------------------------------------------------------------
+ * Tabs
+ * ------------------------------------------------------------------------------------------ */
+ul.nav-tabs {
+ margin: 0;
+}
+
+p.deprecated span{
+ color: #ff0000;
+ font-weight: bold;
+ text-decoration: underline;
+}
+
+/* ------------------------------------------------------------------------------------------
+ * Print
+ * ------------------------------------------------------------------------------------------ */
+
+@media print {
+
+ #sidenav,
+ #version,
+ #versions,
+ section .version,
+ section .versions {
+ display: none;
+ }
+
+ #content {
+ margin-left: 0;
+ }
+
+ a {
+ text-decoration: none;
+ color: inherit;
+ }
+
+ a:after {
+ content: " [" attr(href) "] ";
+ }
+
+ p {
+ color: #000000
+ }
+
+ pre {
+ background-color: #ffffff;
+ color: #000000;
+ padding: 10px;
+ border: #808080 1px solid;
+ border-radius: 6px;
+ position: relative;
+ margin: 10px 0 20px 0;
+ }
+
+} /* /@media print */
diff --git a/backend/docs/fonts/glyphicons-halflings-regular.eot b/backend/docs/fonts/glyphicons-halflings-regular.eot
new file mode 100644
index 0000000..b93a495
Binary files /dev/null and b/backend/docs/fonts/glyphicons-halflings-regular.eot differ
diff --git a/backend/docs/fonts/glyphicons-halflings-regular.svg b/backend/docs/fonts/glyphicons-halflings-regular.svg
new file mode 100644
index 0000000..94fb549
--- /dev/null
+++ b/backend/docs/fonts/glyphicons-halflings-regular.svg
@@ -0,0 +1,288 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/backend/docs/fonts/glyphicons-halflings-regular.ttf b/backend/docs/fonts/glyphicons-halflings-regular.ttf
new file mode 100644
index 0000000..1413fc6
Binary files /dev/null and b/backend/docs/fonts/glyphicons-halflings-regular.ttf differ
diff --git a/backend/docs/fonts/glyphicons-halflings-regular.woff b/backend/docs/fonts/glyphicons-halflings-regular.woff
new file mode 100644
index 0000000..9e61285
Binary files /dev/null and b/backend/docs/fonts/glyphicons-halflings-regular.woff differ
diff --git a/backend/docs/fonts/glyphicons-halflings-regular.woff2 b/backend/docs/fonts/glyphicons-halflings-regular.woff2
new file mode 100644
index 0000000..64539b5
Binary files /dev/null and b/backend/docs/fonts/glyphicons-halflings-regular.woff2 differ
diff --git a/backend/docs/img/favicon.ico b/backend/docs/img/favicon.ico
new file mode 100644
index 0000000..c307a04
Binary files /dev/null and b/backend/docs/img/favicon.ico differ
diff --git a/backend/docs/index.html b/backend/docs/index.html
new file mode 100644
index 0000000..668f606
--- /dev/null
+++ b/backend/docs/index.html
@@ -0,0 +1,687 @@
+
+
+
+
+ Loading...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/backend/docs/locales/ca.js b/backend/docs/locales/ca.js
new file mode 100644
index 0000000..65af5df
--- /dev/null
+++ b/backend/docs/locales/ca.js
@@ -0,0 +1,25 @@
+define({
+ ca: {
+ 'Allowed values:' : 'Valors permesos:',
+ 'Compare all with predecessor': 'Comparar tot amb versió anterior',
+ 'compare changes to:' : 'comparar canvis amb:',
+ 'compared to' : 'comparat amb',
+ 'Default value:' : 'Valor per defecte:',
+ 'Description' : 'Descripció',
+ 'Field' : 'Camp',
+ 'General' : 'General',
+ 'Generated with' : 'Generat amb',
+ 'Name' : 'Nom',
+ 'No response values.' : 'Sense valors en la resposta.',
+ 'optional' : 'opcional',
+ 'Parameter' : 'Paràmetre',
+ 'Permission:' : 'Permisos:',
+ 'Response' : 'Resposta',
+ 'Send' : 'Enviar',
+ 'Send a Sample Request' : 'Enviar una petició d\'exemple',
+ 'show up to version:' : 'mostrar versió:',
+ 'Size range:' : 'Tamany de rang:',
+ 'Type' : 'Tipus',
+ 'url' : 'url'
+ }
+});
diff --git a/backend/docs/locales/cs.js b/backend/docs/locales/cs.js
new file mode 100644
index 0000000..b7796d8
--- /dev/null
+++ b/backend/docs/locales/cs.js
@@ -0,0 +1,25 @@
+define({
+ cs: {
+ 'Allowed values:' : 'Povolené hodnoty:',
+ 'Compare all with predecessor': 'Porovnat vše s předchozími verzemi',
+ 'compare changes to:' : 'porovnat změny s:',
+ 'compared to' : 'porovnat s',
+ 'Default value:' : 'Výchozí hodnota:',
+ 'Description' : 'Popis',
+ 'Field' : 'Pole',
+ 'General' : 'Obecné',
+ 'Generated with' : 'Vygenerováno pomocí',
+ 'Name' : 'Název',
+ 'No response values.' : 'Nebyly vráceny žádné hodnoty.',
+ 'optional' : 'volitelné',
+ 'Parameter' : 'Parametr',
+ 'Permission:' : 'Oprávnění:',
+ 'Response' : 'Odpověď',
+ 'Send' : 'Odeslat',
+ 'Send a Sample Request' : 'Odeslat ukázkový požadavek',
+ 'show up to version:' : 'zobrazit po verzi:',
+ 'Size range:' : 'Rozsah velikosti:',
+ 'Type' : 'Typ',
+ 'url' : 'url'
+ }
+});
diff --git a/backend/docs/locales/de.js b/backend/docs/locales/de.js
new file mode 100644
index 0000000..f66420d
--- /dev/null
+++ b/backend/docs/locales/de.js
@@ -0,0 +1,25 @@
+define({
+ de: {
+ 'Allowed values:' : 'Erlaubte Werte:',
+ 'Compare all with predecessor': 'Vergleiche alle mit ihren Vorgängern',
+ 'compare changes to:' : 'vergleiche Änderungen mit:',
+ 'compared to' : 'verglichen mit',
+ 'Default value:' : 'Standardwert:',
+ 'Description' : 'Beschreibung',
+ 'Field' : 'Feld',
+ 'General' : 'Allgemein',
+ 'Generated with' : 'Erstellt mit',
+ 'Name' : 'Name',
+ 'No response values.' : 'Keine Rückgabewerte.',
+ 'optional' : 'optional',
+ 'Parameter' : 'Parameter',
+ 'Permission:' : 'Berechtigung:',
+ 'Response' : 'Antwort',
+ 'Send' : 'Senden',
+ 'Send a Sample Request' : 'Eine Beispielanfrage senden',
+ 'show up to version:' : 'zeige bis zur Version:',
+ 'Size range:' : 'Größenbereich:',
+ 'Type' : 'Typ',
+ 'url' : 'url'
+ }
+});
diff --git a/backend/docs/locales/es.js b/backend/docs/locales/es.js
new file mode 100644
index 0000000..3d47e80
--- /dev/null
+++ b/backend/docs/locales/es.js
@@ -0,0 +1,25 @@
+define({
+ es: {
+ 'Allowed values:' : 'Valores permitidos:',
+ 'Compare all with predecessor': 'Comparar todo con versión anterior',
+ 'compare changes to:' : 'comparar cambios con:',
+ 'compared to' : 'comparado con',
+ 'Default value:' : 'Valor por defecto:',
+ 'Description' : 'Descripción',
+ 'Field' : 'Campo',
+ 'General' : 'General',
+ 'Generated with' : 'Generado con',
+ 'Name' : 'Nombre',
+ 'No response values.' : 'Sin valores en la respuesta.',
+ 'optional' : 'opcional',
+ 'Parameter' : 'Parámetro',
+ 'Permission:' : 'Permisos:',
+ 'Response' : 'Respuesta',
+ 'Send' : 'Enviar',
+ 'Send a Sample Request' : 'Enviar una petición de ejemplo',
+ 'show up to version:' : 'mostrar a versión:',
+ 'Size range:' : 'Tamaño de rango:',
+ 'Type' : 'Tipo',
+ 'url' : 'url'
+ }
+});
diff --git a/backend/docs/locales/fr.js b/backend/docs/locales/fr.js
new file mode 100644
index 0000000..100a642
--- /dev/null
+++ b/backend/docs/locales/fr.js
@@ -0,0 +1,25 @@
+define({
+ fr: {
+ 'Allowed values:' : 'Valeurs autorisées :',
+ 'Compare all with predecessor': 'Tout comparer avec ...',
+ 'compare changes to:' : 'comparer les changements à :',
+ 'compared to' : 'comparer à',
+ 'Default value:' : 'Valeur par défaut :',
+ 'Description' : 'Description',
+ 'Field' : 'Champ',
+ 'General' : 'Général',
+ 'Generated with' : 'Généré avec',
+ 'Name' : 'Nom',
+ 'No response values.' : 'Aucune valeur de réponse.',
+ 'optional' : 'optionnel',
+ 'Parameter' : 'Paramètre',
+ 'Permission:' : 'Permission :',
+ 'Response' : 'Réponse',
+ 'Send' : 'Envoyer',
+ 'Send a Sample Request' : 'Envoyer une requête représentative',
+ 'show up to version:' : 'Montrer à partir de la version :',
+ 'Size range:' : 'Ordre de grandeur :',
+ 'Type' : 'Type',
+ 'url' : 'url'
+ }
+});
diff --git a/backend/docs/locales/it.js b/backend/docs/locales/it.js
new file mode 100644
index 0000000..8117108
--- /dev/null
+++ b/backend/docs/locales/it.js
@@ -0,0 +1,25 @@
+define({
+ it: {
+ 'Allowed values:' : 'Valori permessi:',
+ 'Compare all with predecessor': 'Confronta tutto con versioni precedenti',
+ 'compare changes to:' : 'confronta modifiche con:',
+ 'compared to' : 'confrontato con',
+ 'Default value:' : 'Valore predefinito:',
+ 'Description' : 'Descrizione',
+ 'Field' : 'Campo',
+ 'General' : 'Generale',
+ 'Generated with' : 'Creato con',
+ 'Name' : 'Nome',
+ 'No response values.' : 'Nessun valore di risposta.',
+ 'optional' : 'opzionale',
+ 'Parameter' : 'Parametro',
+ 'Permission:' : 'Permessi:',
+ 'Response' : 'Risposta',
+ 'Send' : 'Invia',
+ 'Send a Sample Request' : 'Invia una richiesta di esempio',
+ 'show up to version:' : 'mostra alla versione:',
+ 'Size range:' : 'Intervallo dimensione:',
+ 'Type' : 'Tipo',
+ 'url' : 'url'
+ }
+});
diff --git a/backend/docs/locales/locale.js b/backend/docs/locales/locale.js
new file mode 100644
index 0000000..3530705
--- /dev/null
+++ b/backend/docs/locales/locale.js
@@ -0,0 +1,51 @@
+define([
+ './locales/ca.js',
+ './locales/cs.js',
+ './locales/de.js',
+ './locales/es.js',
+ './locales/fr.js',
+ './locales/it.js',
+ './locales/nl.js',
+ './locales/pl.js',
+ './locales/pt_br.js',
+ './locales/ro.js',
+ './locales/ru.js',
+ './locales/tr.js',
+ './locales/vi.js',
+ './locales/zh.js',
+ './locales/zh_cn.js'
+], function() {
+ var langId = (navigator.language || navigator.userLanguage).toLowerCase().replace('-', '_');
+ var language = langId.substr(0, 2);
+ var locales = {};
+
+ for (index in arguments) {
+ for (property in arguments[index])
+ locales[property] = arguments[index][property];
+ }
+ if ( ! locales['en'])
+ locales['en'] = {};
+
+ if ( ! locales[langId] && ! locales[language])
+ language = 'en';
+
+ var locale = (locales[langId] ? locales[langId] : locales[language]);
+
+ function __(text) {
+ var index = locale[text];
+ if (index === undefined)
+ return text;
+ return index;
+ };
+
+ function setLanguage(language) {
+ locale = locales[language];
+ }
+
+ return {
+ __ : __,
+ locales : locales,
+ locale : locale,
+ setLanguage: setLanguage
+ };
+});
diff --git a/backend/docs/locales/nl.js b/backend/docs/locales/nl.js
new file mode 100644
index 0000000..bddfeeb
--- /dev/null
+++ b/backend/docs/locales/nl.js
@@ -0,0 +1,25 @@
+define({
+ nl: {
+ 'Allowed values:' : 'Toegestane waarden:',
+ 'Compare all with predecessor': 'Vergelijk alle met voorgaande versie',
+ 'compare changes to:' : 'vergelijk veranderingen met:',
+ 'compared to' : 'vergelijk met',
+ 'Default value:' : 'Standaard waarde:',
+ 'Description' : 'Omschrijving',
+ 'Field' : 'Veld',
+ 'General' : 'Algemeen',
+ 'Generated with' : 'Gegenereerd met',
+ 'Name' : 'Naam',
+ 'No response values.' : 'Geen response waardes.',
+ 'optional' : 'optioneel',
+ 'Parameter' : 'Parameter',
+ 'Permission:' : 'Permissie:',
+ 'Response' : 'Antwoorden',
+ 'Send' : 'Sturen',
+ 'Send a Sample Request' : 'Stuur een sample aanvragen',
+ 'show up to version:' : 'toon tot en met versie:',
+ 'Size range:' : 'Maatbereik:',
+ 'Type' : 'Type',
+ 'url' : 'url'
+ }
+});
diff --git a/backend/docs/locales/pl.js b/backend/docs/locales/pl.js
new file mode 100644
index 0000000..db645ee
--- /dev/null
+++ b/backend/docs/locales/pl.js
@@ -0,0 +1,25 @@
+define({
+ pl: {
+ 'Allowed values:' : 'Dozwolone wartości:',
+ 'Compare all with predecessor': 'Porównaj z poprzednimi wersjami',
+ 'compare changes to:' : 'porównaj zmiany do:',
+ 'compared to' : 'porównaj do:',
+ 'Default value:' : 'Wartość domyślna:',
+ 'Description' : 'Opis',
+ 'Field' : 'Pole',
+ 'General' : 'Generalnie',
+ 'Generated with' : 'Wygenerowano z',
+ 'Name' : 'Nazwa',
+ 'No response values.' : 'Brak odpowiedzi.',
+ 'optional' : 'opcjonalny',
+ 'Parameter' : 'Parametr',
+ 'Permission:' : 'Uprawnienia:',
+ 'Response' : 'Odpowiedź',
+ 'Send' : 'Wyślij',
+ 'Send a Sample Request' : 'Wyślij przykładowe żądanie',
+ 'show up to version:' : 'pokaż do wersji:',
+ 'Size range:' : 'Zakres rozmiaru:',
+ 'Type' : 'Typ',
+ 'url' : 'url'
+ }
+});
diff --git a/backend/docs/locales/pt_br.js b/backend/docs/locales/pt_br.js
new file mode 100644
index 0000000..2bd78b0
--- /dev/null
+++ b/backend/docs/locales/pt_br.js
@@ -0,0 +1,25 @@
+define({
+ 'pt_br': {
+ 'Allowed values:' : 'Valores permitidos:',
+ 'Compare all with predecessor': 'Compare todos com antecessores',
+ 'compare changes to:' : 'comparar alterações com:',
+ 'compared to' : 'comparado com',
+ 'Default value:' : 'Valor padrão:',
+ 'Description' : 'Descrição',
+ 'Field' : 'Campo',
+ 'General' : 'Geral',
+ 'Generated with' : 'Gerado com',
+ 'Name' : 'Nome',
+ 'No response values.' : 'Sem valores de resposta.',
+ 'optional' : 'opcional',
+ 'Parameter' : 'Parâmetro',
+ 'Permission:' : 'Permissão:',
+ 'Response' : 'Resposta',
+ 'Send' : 'Enviar',
+ 'Send a Sample Request' : 'Enviar um Exemplo de Pedido',
+ 'show up to version:' : 'aparecer para a versão:',
+ 'Size range:' : 'Faixa de tamanho:',
+ 'Type' : 'Tipo',
+ 'url' : 'url'
+ }
+});
diff --git a/backend/docs/locales/ro.js b/backend/docs/locales/ro.js
new file mode 100644
index 0000000..8d4e4ed
--- /dev/null
+++ b/backend/docs/locales/ro.js
@@ -0,0 +1,25 @@
+define({
+ ro: {
+ 'Allowed values:' : 'Valori permise:',
+ 'Compare all with predecessor': 'Compară toate cu versiunea precedentă',
+ 'compare changes to:' : 'compară cu versiunea:',
+ 'compared to' : 'comparat cu',
+ 'Default value:' : 'Valoare implicită:',
+ 'Description' : 'Descriere',
+ 'Field' : 'Câmp',
+ 'General' : 'General',
+ 'Generated with' : 'Generat cu',
+ 'Name' : 'Nume',
+ 'No response values.' : 'Nici o valoare returnată.',
+ 'optional' : 'opțional',
+ 'Parameter' : 'Parametru',
+ 'Permission:' : 'Permisiune:',
+ 'Response' : 'Răspuns',
+ 'Send' : 'Trimite',
+ 'Send a Sample Request' : 'Trimite o cerere de probă',
+ 'show up to version:' : 'arată până la versiunea:',
+ 'Size range:' : 'Interval permis:',
+ 'Type' : 'Tip',
+ 'url' : 'url'
+ }
+});
diff --git a/backend/docs/locales/ru.js b/backend/docs/locales/ru.js
new file mode 100644
index 0000000..c5f3382
--- /dev/null
+++ b/backend/docs/locales/ru.js
@@ -0,0 +1,25 @@
+define({
+ ru: {
+ 'Allowed values:' : 'Допустимые значения:',
+ 'Compare all with predecessor': 'Сравнить с предыдущей версией',
+ 'compare changes to:' : 'сравнить с:',
+ 'compared to' : 'в сравнении с',
+ 'Default value:' : 'По умолчанию:',
+ 'Description' : 'Описание',
+ 'Field' : 'Название',
+ 'General' : 'Общая информация',
+ 'Generated with' : 'Сгенерировано с помощью',
+ 'Name' : 'Название',
+ 'No response values.' : 'Нет значений для ответа.',
+ 'optional' : 'необязательный',
+ 'Parameter' : 'Параметр',
+ 'Permission:' : 'Разрешено:',
+ 'Response' : 'Ответ',
+ 'Send' : 'Отправить',
+ 'Send a Sample Request' : 'Отправить тестовый запрос',
+ 'show up to version:' : 'показать версию:',
+ 'Size range:' : 'Ограничения:',
+ 'Type' : 'Тип',
+ 'url' : 'URL'
+ }
+});
diff --git a/backend/docs/locales/tr.js b/backend/docs/locales/tr.js
new file mode 100644
index 0000000..5c64e52
--- /dev/null
+++ b/backend/docs/locales/tr.js
@@ -0,0 +1,25 @@
+define({
+ tr: {
+ 'Allowed values:' : 'İzin verilen değerler:',
+ 'Compare all with predecessor': 'Tümünü öncekiler ile karşılaştır',
+ 'compare changes to:' : 'değişiklikleri karşılaştır:',
+ 'compared to' : 'karşılaştır',
+ 'Default value:' : 'Varsayılan değer:',
+ 'Description' : 'Açıklama',
+ 'Field' : 'Alan',
+ 'General' : 'Genel',
+ 'Generated with' : 'Oluşturan',
+ 'Name' : 'İsim',
+ 'No response values.' : 'Dönüş verisi yok.',
+ 'optional' : 'opsiyonel',
+ 'Parameter' : 'Parametre',
+ 'Permission:' : 'İzin:',
+ 'Response' : 'Dönüş',
+ 'Send' : 'Gönder',
+ 'Send a Sample Request' : 'Örnek istek gönder',
+ 'show up to version:' : 'bu versiyona kadar göster:',
+ 'Size range:' : 'Boyut aralığı:',
+ 'Type' : 'Tip',
+ 'url' : 'url'
+ }
+});
diff --git a/backend/docs/locales/vi.js b/backend/docs/locales/vi.js
new file mode 100644
index 0000000..7ce7705
--- /dev/null
+++ b/backend/docs/locales/vi.js
@@ -0,0 +1,25 @@
+define({
+ vi: {
+ 'Allowed values:' : 'Giá trị chấp nhận:',
+ 'Compare all with predecessor': 'So sánh với tất cả phiên bản trước',
+ 'compare changes to:' : 'so sánh sự thay đổi với:',
+ 'compared to' : 'so sánh với',
+ 'Default value:' : 'Giá trị mặc định:',
+ 'Description' : 'Chú thích',
+ 'Field' : 'Trường dữ liệu',
+ 'General' : 'Tổng quan',
+ 'Generated with' : 'Được tạo bởi',
+ 'Name' : 'Tên',
+ 'No response values.' : 'Không có kết quả trả về.',
+ 'optional' : 'Tùy chọn',
+ 'Parameter' : 'Tham số',
+ 'Permission:' : 'Quyền hạn:',
+ 'Response' : 'Kết quả',
+ 'Send' : 'Gửi',
+ 'Send a Sample Request' : 'Gửi một yêu cầu mẫu',
+ 'show up to version:' : 'hiển thị phiên bản:',
+ 'Size range:' : 'Kích cỡ:',
+ 'Type' : 'Kiểu',
+ 'url' : 'liên kết'
+ }
+});
diff --git a/backend/docs/locales/zh.js b/backend/docs/locales/zh.js
new file mode 100644
index 0000000..ca5042f
--- /dev/null
+++ b/backend/docs/locales/zh.js
@@ -0,0 +1,25 @@
+define({
+ zh: {
+ 'Allowed values:' : '允許值:',
+ 'Compare all with predecessor': '預先比較所有',
+ 'compare changes to:' : '比較變更:',
+ 'compared to' : '對比',
+ 'Default value:' : '預設值:',
+ 'Description' : '描述',
+ 'Field' : '欄位',
+ 'General' : '概括',
+ 'Generated with' : '生成工具',
+ 'Name' : '名稱',
+ 'No response values.' : '無對應資料.',
+ 'optional' : '選填',
+ 'Parameter' : '參數',
+ 'Permission:' : '權限:',
+ 'Response' : '回應',
+ 'Send' : '發送',
+ 'Send a Sample Request' : '發送試用需求',
+ 'show up to version:' : '顯示到版本:',
+ 'Size range:' : '區間:',
+ 'Type' : '類型',
+ 'url' : '網址'
+ }
+});
diff --git a/backend/docs/locales/zh_cn.js b/backend/docs/locales/zh_cn.js
new file mode 100644
index 0000000..50913e2
--- /dev/null
+++ b/backend/docs/locales/zh_cn.js
@@ -0,0 +1,27 @@
+define({
+ 'zh_cn': {
+ 'Allowed values:' : '允许值:',
+ 'Compare all with predecessor': '与所有较早的比较',
+ 'compare changes to:' : '将当前版本与指定版本比较:',
+ 'compared to' : '相比于',
+ 'Default value:' : '默认值:',
+ 'Description' : '描述',
+ 'Field' : '字段',
+ 'General' : '概要',
+ 'Generated with' : '基于',
+ 'Name' : '名称',
+ 'No response values.' : '无返回值.',
+ 'optional' : '可选',
+ 'Parameter' : '参数',
+ 'Parameters' : '参数',
+ 'Headers' : '头部参数',
+ 'Permission:' : '权限:',
+ 'Response' : '返回',
+ 'Send' : '发送',
+ 'Send a Sample Request' : '发送示例请求',
+ 'show up to version:' : '显示到指定版本:',
+ 'Size range:' : '取值范围:',
+ 'Type' : '类型',
+ 'url' : '网址'
+ }
+});
diff --git a/backend/docs/main.js b/backend/docs/main.js
new file mode 100644
index 0000000..8adc385
--- /dev/null
+++ b/backend/docs/main.js
@@ -0,0 +1,903 @@
+require.config({
+ paths: {
+ bootstrap: './vendor/bootstrap.min',
+ diffMatchPatch: './vendor/diff_match_patch.min',
+ handlebars: './vendor/handlebars.min',
+ handlebarsExtended: './utils/handlebars_helper',
+ jquery: './vendor/jquery.min',
+ locales: './locales/locale',
+ lodash: './vendor/lodash.custom.min',
+ pathToRegexp: './vendor/path-to-regexp/index',
+ prettify: './vendor/prettify/prettify',
+ semver: './vendor/semver.min',
+ utilsSampleRequest: './utils/send_sample_request',
+ webfontloader: './vendor/webfontloader',
+ list: './vendor/list.min'
+ },
+ shim: {
+ bootstrap: {
+ deps: ['jquery']
+ },
+ diffMatchPatch: {
+ exports: 'diff_match_patch'
+ },
+ handlebars: {
+ exports: 'Handlebars'
+ },
+ handlebarsExtended: {
+ deps: ['jquery', 'handlebars'],
+ exports: 'Handlebars'
+ },
+ prettify: {
+ exports: 'prettyPrint'
+ }
+ },
+ urlArgs: 'v=' + (new Date()).getTime(),
+ waitSeconds: 15
+});
+
+require([
+ 'jquery',
+ 'lodash',
+ 'locales',
+ 'handlebarsExtended',
+ './api_project.js',
+ './api_data.js',
+ 'prettify',
+ 'utilsSampleRequest',
+ 'semver',
+ 'webfontloader',
+ 'bootstrap',
+ 'pathToRegexp',
+ 'list'
+], function($, _, locale, Handlebars, apiProject, apiData, prettyPrint, sampleRequest, semver, WebFont) {
+
+ // load google web fonts
+ loadGoogleFontCss();
+
+ var api = apiData.api;
+
+ //
+ // Templates
+ //
+ var templateHeader = Handlebars.compile( $('#template-header').html() );
+ var templateFooter = Handlebars.compile( $('#template-footer').html() );
+ var templateArticle = Handlebars.compile( $('#template-article').html() );
+ var templateCompareArticle = Handlebars.compile( $('#template-compare-article').html() );
+ var templateGenerator = Handlebars.compile( $('#template-generator').html() );
+ var templateProject = Handlebars.compile( $('#template-project').html() );
+ var templateSections = Handlebars.compile( $('#template-sections').html() );
+ var templateSidenav = Handlebars.compile( $('#template-sidenav').html() );
+
+ //
+ // apiProject defaults
+ //
+ if ( ! apiProject.template)
+ apiProject.template = {};
+
+ if (apiProject.template.withCompare == null)
+ apiProject.template.withCompare = true;
+
+ if (apiProject.template.withGenerator == null)
+ apiProject.template.withGenerator = true;
+
+ if (apiProject.template.forceLanguage)
+ locale.setLanguage(apiProject.template.forceLanguage);
+
+ if (apiProject.template.aloneDisplay == null)
+ apiProject.template.aloneDisplay = false;
+
+ // Setup jQuery Ajax
+ $.ajaxSetup(apiProject.template.jQueryAjaxSetup);
+
+ //
+ // Data transform
+ //
+ // grouped by group
+ var apiByGroup = _.groupBy(api, function(entry) {
+ return entry.group;
+ });
+
+ // grouped by group and name
+ var apiByGroupAndName = {};
+ $.each(apiByGroup, function(index, entries) {
+ apiByGroupAndName[index] = _.groupBy(entries, function(entry) {
+ return entry.name;
+ });
+ });
+
+ //
+ // sort api within a group by title ASC and custom order
+ //
+ var newList = [];
+ var umlauts = { 'ä': 'ae', 'ü': 'ue', 'ö': 'oe', 'ß': 'ss' }; // TODO: remove in version 1.0
+ $.each (apiByGroupAndName, function(index, groupEntries) {
+ // get titles from the first entry of group[].name[] (name has versioning)
+ var titles = [];
+ $.each (groupEntries, function(titleName, entries) {
+ var title = entries[0].title;
+ if(title !== undefined) {
+ title.toLowerCase().replace(/[äöüß]/g, function($0) { return umlauts[$0]; });
+ titles.push(title + '#~#' + titleName); // '#~#' keep reference to titleName after sorting
+ }
+ });
+ // sort by name ASC
+ titles.sort();
+
+ // custom order
+ if (apiProject.order)
+ titles = sortByOrder(titles, apiProject.order, '#~#');
+
+ // add single elements to the new list
+ titles.forEach(function(name) {
+ var values = name.split('#~#');
+ var key = values[1];
+ groupEntries[key].forEach(function(entry) {
+ newList.push(entry);
+ });
+ });
+ });
+ // api overwrite with ordered list
+ api = newList;
+
+ //
+ // Group- and Versionlists
+ //
+ var apiGroups = {};
+ var apiGroupTitles = {};
+ var apiVersions = {};
+ apiVersions[apiProject.version] = 1;
+
+ $.each(api, function(index, entry) {
+ apiGroups[entry.group] = 1;
+ apiGroupTitles[entry.group] = entry.groupTitle || entry.group;
+ apiVersions[entry.version] = 1;
+ });
+
+ // sort groups
+ apiGroups = Object.keys(apiGroups);
+ apiGroups.sort();
+
+ // custom order
+ if (apiProject.order)
+ apiGroups = sortByOrder(apiGroups, apiProject.order);
+
+ // sort versions DESC
+ apiVersions = Object.keys(apiVersions);
+ apiVersions.sort(semver.compare);
+ apiVersions.reverse();
+
+ //
+ // create Navigationlist
+ //
+ var nav = [];
+ apiGroups.forEach(function(group) {
+ // Mainmenu entry
+ nav.push({
+ group: group,
+ isHeader: true,
+ title: apiGroupTitles[group]
+ });
+
+ // Submenu
+ var oldName = '';
+ api.forEach(function(entry) {
+ if (entry.group === group) {
+ if (oldName !== entry.name) {
+ nav.push({
+ title: entry.title,
+ group: group,
+ name: entry.name,
+ type: entry.type,
+ version: entry.version,
+ url: entry.url
+ });
+ } else {
+ nav.push({
+ title: entry.title,
+ group: group,
+ hidden: true,
+ name: entry.name,
+ type: entry.type,
+ version: entry.version,
+ url: entry.url
+ });
+ }
+ oldName = entry.name;
+ }
+ });
+ });
+
+ /**
+ * Add navigation items by analyzing the HTML content and searching for h1 and h2 tags
+ * @param nav Object the navigation array
+ * @param content string the compiled HTML content
+ * @param index where to insert items
+ * @return boolean true if any good-looking (i.e. with a group identifier) tag was found
+ */
+ function add_nav(nav, content, index) {
+ var found_level1 = false;
+ if ( ! content) {
+ return found_level1;
+ }
+ var topics = content.match(/(.+?)<\/h(1|2)>/gi);
+ if ( topics ) {
+ topics.forEach(function(entry) {
+ var level = entry.substring(2,3);
+ var title = entry.replace(/<.+?>/g, ''); // Remove all HTML tags for the title
+ var entry_tags = entry.match(/id="api-([^\-]+)(?:-(.+))?"/); // Find the group and name in the id property
+ var group = (entry_tags ? entry_tags[1] : null);
+ var name = (entry_tags ? entry_tags[2] : null);
+ if (level==1 && title && group) {
+ nav.splice(index, 0, {
+ group: group,
+ isHeader: true,
+ title: title,
+ isFixed: true
+ });
+ index++;
+ found_level1 = true;
+ }
+ if (level==2 && title && group && name) {
+ nav.splice(index, 0, {
+ group: group,
+ name: name,
+ isHeader: false,
+ title: title,
+ isFixed: false,
+ version: '1.0'
+ });
+ index++;
+ }
+ });
+ }
+ return found_level1;
+ }
+
+ // Mainmenu Header entry
+ if (apiProject.header) {
+ var found_level1 = add_nav(nav, apiProject.header.content, 0); // Add level 1 and 2 titles
+ if (!found_level1) { // If no Level 1 tags were found, make a title
+ nav.unshift({
+ group: '_',
+ isHeader: true,
+ title: (apiProject.header.title == null) ? locale.__('General') : apiProject.header.title,
+ isFixed: true
+ });
+ }
+ }
+
+ // Mainmenu Footer entry
+ if (apiProject.footer) {
+ var last_nav_index = nav.length;
+ var found_level1 = add_nav(nav, apiProject.footer.content, nav.length); // Add level 1 and 2 titles
+ if (!found_level1 && apiProject.footer.title != null) { // If no Level 1 tags were found, make a title
+ nav.splice(last_nav_index, 0, {
+ group: '_footer',
+ isHeader: true,
+ title: apiProject.footer.title,
+ isFixed: true
+ });
+ }
+ }
+
+ // render pagetitle
+ var title = apiProject.title ? apiProject.title : 'apiDoc: ' + apiProject.name + ' - ' + apiProject.version;
+ $(document).attr('title', title);
+
+ // remove loader
+ $('#loader').remove();
+
+ // render sidenav
+ var fields = {
+ nav: nav
+ };
+ $('#sidenav').append( templateSidenav(fields) );
+
+ // render Generator
+ $('#generator').append( templateGenerator(apiProject) );
+
+ // render Project
+ _.extend(apiProject, { versions: apiVersions});
+ $('#project').append( templateProject(apiProject) );
+
+ // render apiDoc, header/footer documentation
+ if (apiProject.header)
+ $('#header').append( templateHeader(apiProject.header) );
+
+ if (apiProject.footer)
+ $('#footer').append( templateFooter(apiProject.footer) );
+
+ //
+ // Render Sections and Articles
+ //
+ var articleVersions = {};
+ var content = '';
+ apiGroups.forEach(function(groupEntry) {
+ var articles = [];
+ var oldName = '';
+ var fields = {};
+ var title = groupEntry;
+ var description = '';
+ articleVersions[groupEntry] = {};
+
+ // render all articles of a group
+ api.forEach(function(entry) {
+ if(groupEntry === entry.group) {
+ if (oldName !== entry.name) {
+ // determine versions
+ api.forEach(function(versionEntry) {
+ if (groupEntry === versionEntry.group && entry.name === versionEntry.name) {
+ if ( ! articleVersions[entry.group].hasOwnProperty(entry.name) ) {
+ articleVersions[entry.group][entry.name] = [];
+ }
+ articleVersions[entry.group][entry.name].push(versionEntry.version);
+ }
+ });
+ fields = {
+ article: entry,
+ versions: articleVersions[entry.group][entry.name]
+ };
+ } else {
+ fields = {
+ article: entry,
+ hidden: true,
+ versions: articleVersions[entry.group][entry.name]
+ };
+ }
+
+ // add prefix URL for endpoint unless it's already absolute
+ if (apiProject.url) {
+ if (fields.article.url.substr(0, 4).toLowerCase() !== 'http') {
+ fields.article.url = apiProject.url + fields.article.url;
+ }
+ }
+
+ addArticleSettings(fields, entry);
+
+ if (entry.groupTitle)
+ title = entry.groupTitle;
+
+ // TODO: make groupDescription compareable with older versions (not important for the moment)
+ if (entry.groupDescription)
+ description = entry.groupDescription;
+
+ articles.push({
+ article: templateArticle(fields),
+ group: entry.group,
+ name: entry.name,
+ aloneDisplay: apiProject.template.aloneDisplay
+ });
+ oldName = entry.name;
+ }
+ });
+
+ // render Section with Articles
+ var fields = {
+ group: groupEntry,
+ title: title,
+ description: description,
+ articles: articles,
+ aloneDisplay: apiProject.template.aloneDisplay
+ };
+ content += templateSections(fields);
+ });
+ $('#sections').append( content );
+
+ // Bootstrap Scrollspy
+ $(this).scrollspy({ target: '#scrollingNav', offset: 18 });
+
+ // Content-Scroll on Navigation click.
+ $('.sidenav').find('a').on('click', function(e) {
+ e.preventDefault();
+ var id = $(this).attr('href');
+ if ($(id).length > 0)
+ $('html,body').animate({ scrollTop: parseInt($(id).offset().top) }, 400);
+ window.location.hash = $(this).attr('href');
+ });
+
+ // Quickjump on Pageload to hash position.
+ if(window.location.hash) {
+ var id = window.location.hash;
+ if ($(id).length > 0)
+ $('html,body').animate({ scrollTop: parseInt($(id).offset().top) }, 0);
+ }
+
+ /**
+ * Check if Parameter (sub) List has a type Field.
+ * Example: @apiSuccess varname1 No type.
+ * @apiSuccess {String} varname2 With type.
+ *
+ * @param {Object} fields
+ */
+ function _hasTypeInFields(fields) {
+ var result = false;
+ $.each(fields, function(name) {
+ result = result || _.some(fields[name], function(item) { return item.type; });
+ });
+ return result;
+ }
+
+ /**
+ * On Template changes, recall plugins.
+ */
+ function initDynamic() {
+ // Bootstrap popover
+ $('button[data-toggle="popover"]').popover().click(function(e) {
+ e.preventDefault();
+ });
+
+ var version = $('#version strong').html();
+ $('#sidenav li').removeClass('is-new');
+ if (apiProject.template.withCompare) {
+ $('#sidenav li[data-version=\'' + version + '\']').each(function(){
+ var group = $(this).data('group');
+ var name = $(this).data('name');
+ var length = $('#sidenav li[data-group=\'' + group + '\'][data-name=\'' + name + '\']').length;
+ var index = $('#sidenav li[data-group=\'' + group + '\'][data-name=\'' + name + '\']').index($(this));
+ if (length === 1 || index === (length - 1))
+ $(this).addClass('is-new');
+ });
+ }
+
+ // tabs
+ $('.nav-tabs-examples a').click(function (e) {
+ e.preventDefault();
+ $(this).tab('show');
+ });
+ $('.nav-tabs-examples').find('a:first').tab('show');
+
+ // sample header-content-type switch
+ $('.sample-header-content-type-switch').change(function () {
+ var paramName = '.' + $(this).attr('name') + '-fields';
+ var bodyName = '.' + $(this).attr('name') + '-body';
+ var selectName = 'select[name=' + $(this).attr('name') + ']';
+ if ($(this).val() == 'body-json') {
+ $(selectName).val('undefined');
+ $(this).val('body-json');
+ $(paramName).removeClass('hide');
+ $(this).parent().nextAll(paramName).first().addClass('hide');
+ $(bodyName).addClass('hide');
+ $(this).parent().nextAll(bodyName).first().removeClass('hide');
+ } else if ($(this).val() == "body-form-data") {
+ $(selectName).val('undefined');
+ $(this).val('body-form-data');
+ $(bodyName).addClass('hide');
+ $(paramName).removeClass('hide');
+ } else {
+ $(this).parent().nextAll(paramName).first().removeClass('hide')
+ $(this).parent().nextAll(bodyName).first().addClass('hide');
+ }
+ $(this).prev('.sample-request-switch').prop('checked', true);
+ });
+
+ // sample request switch
+ $('.sample-request-switch').click(function (e) {
+ var paramName = '.' + $(this).attr('name') + '-fields';
+ var bodyName = '.' + $(this).attr('name') + '-body';
+ var select = $(this).next('.' + $(this).attr('name') + '-select').val();
+ if($(this).prop("checked")){
+ if (select == 'body-json'){
+ $(this).parent().nextAll(bodyName).first().removeClass('hide');
+ }else {
+ $(this).parent().nextAll(paramName).first().removeClass('hide');
+ }
+ }else {
+ if (select == 'body-json'){
+ $(this).parent().nextAll(bodyName).first().addClass('hide');
+ }else {
+ $(this).parent().nextAll(paramName).first().addClass('hide');
+ }
+ }
+ });
+
+ if (apiProject.template.aloneDisplay){
+ //show group
+ $('.show-group').click(function () {
+ var apiGroup = '.' + $(this).attr('data-group') + '-group';
+ var apiGroupArticle = '.' + $(this).attr('data-group') + '-article';
+ $(".show-api-group").addClass('hide');
+ $(apiGroup).removeClass('hide');
+ $(".show-api-article").addClass('hide');
+ $(apiGroupArticle).removeClass('hide');
+ });
+
+ //show api
+ $('.show-api').click(function () {
+ var apiName = '.' + $(this).attr('data-name') + '-article';
+ var apiGroup = '.' + $(this).attr('data-group') + '-group';
+ $(".show-api-group").addClass('hide');
+ $(apiGroup).removeClass('hide');
+ $(".show-api-article").addClass('hide');
+ $(apiName).removeClass('hide');
+ });
+ }
+
+ // call scrollspy refresh method
+ $(window).scrollspy('refresh');
+
+ // init modules
+ sampleRequest.initDynamic();
+ }
+ initDynamic();
+
+ if (apiProject.template.aloneDisplay) {
+ var hashVal = window.location.hash;
+ if (hashVal != null && hashVal.length !== 0) {
+ $("." + hashVal.slice(1) + "-init").click();
+ }
+ }
+
+ // Pre- / Code-Format
+ prettyPrint();
+
+ //
+ // HTML-Template specific jQuery-Functions
+ //
+ // Change Main Version
+ $('#versions li.version a').on('click', function(e) {
+ e.preventDefault();
+
+ var selectedVersion = $(this).html();
+ $('#version strong').html(selectedVersion);
+
+ // hide all
+ $('article').addClass('hide');
+ $('#sidenav li:not(.nav-fixed)').addClass('hide');
+
+ // show 1st equal or lower Version of each entry
+ $('article[data-version]').each(function(index) {
+ var group = $(this).data('group');
+ var name = $(this).data('name');
+ var version = $(this).data('version');
+
+ if (semver.lte(version, selectedVersion)) {
+ if ($('article[data-group=\'' + group + '\'][data-name=\'' + name + '\']:visible').length === 0) {
+ // enable Article
+ $('article[data-group=\'' + group + '\'][data-name=\'' + name + '\'][data-version=\'' + version + '\']').removeClass('hide');
+ // enable Navigation
+ $('#sidenav li[data-group=\'' + group + '\'][data-name=\'' + name + '\'][data-version=\'' + version + '\']').removeClass('hide');
+ $('#sidenav li.nav-header[data-group=\'' + group + '\']').removeClass('hide');
+ }
+ }
+ });
+
+ // show 1st equal or lower Version of each entry
+ $('article[data-version]').each(function(index) {
+ var group = $(this).data('group');
+ $('section#api-' + group).removeClass('hide');
+ if ($('section#api-' + group + ' article:visible').length === 0) {
+ $('section#api-' + group).addClass('hide');
+ } else {
+ $('section#api-' + group).removeClass('hide');
+ }
+ });
+
+ initDynamic();
+ return;
+ });
+
+ // compare all article with their predecessor
+ $('#compareAllWithPredecessor').on('click', changeAllVersionCompareTo);
+
+ // change version of an article
+ $('article .versions li.version a').on('click', changeVersionCompareTo);
+
+ // compare url-parameter
+ $.urlParam = function(name) {
+ var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href);
+ return (results && results[1]) ? results[1] : null;
+ };
+
+ if ($.urlParam('compare')) {
+ // URL Paramter ?compare=1 is set
+ $('#compareAllWithPredecessor').trigger('click');
+
+ if (window.location.hash) {
+ var id = window.location.hash;
+ $('html,body').animate({ scrollTop: parseInt($(id).offset().top) - 18 }, 0);
+ }
+ }
+
+ /**
+ * Initialize search
+ */
+ var options = {
+ valueNames: [ 'nav-list-item','nav-list-url-item']
+ };
+ var endpointsList = new List('scrollingNav', options);
+
+ /**
+ * Set initial focus to search input
+ */
+ $('#scrollingNav .sidenav-search input.search').focus();
+
+ /**
+ * Detect ESC key to reset search
+ */
+ $(document).keyup(function(e) {
+ if (e.keyCode === 27) $('span.search-reset').click();
+ });
+
+ /**
+ * Search reset
+ */
+ $('span.search-reset').on('click', function() {
+ $('#scrollingNav .sidenav-search input.search')
+ .val("")
+ .focus()
+ ;
+ endpointsList.search();
+ });
+
+ /**
+ * Change version of an article to compare it to an other version.
+ */
+ function changeVersionCompareTo(e) {
+ e.preventDefault();
+
+ var $root = $(this).parents('article');
+ var selectedVersion = $(this).html();
+ var $button = $root.find('.version');
+ var currentVersion = $button.find('strong').html();
+ $button.find('strong').html(selectedVersion);
+
+ var group = $root.data('group');
+ var name = $root.data('name');
+ var version = $root.data('version');
+
+ var compareVersion = $root.data('compare-version');
+
+ if (compareVersion === selectedVersion)
+ return;
+
+ if ( ! compareVersion && version == selectedVersion)
+ return;
+
+ if (compareVersion && articleVersions[group][name][0] === selectedVersion || version === selectedVersion) {
+ // the version of the entry is set to the highest version (reset)
+ resetArticle(group, name, version);
+ } else {
+ var $compareToArticle = $('article[data-group=\'' + group + '\'][data-name=\'' + name + '\'][data-version=\'' + selectedVersion + '\']');
+
+ var sourceEntry = {};
+ var compareEntry = {};
+ $.each(apiByGroupAndName[group][name], function(index, entry) {
+ if (entry.version === version)
+ sourceEntry = entry;
+ if (entry.version === selectedVersion)
+ compareEntry = entry;
+ });
+
+ var fields = {
+ article: sourceEntry,
+ compare: compareEntry,
+ versions: articleVersions[group][name]
+ };
+
+ // add unique id
+ // TODO: replace all group-name-version in template with id.
+ fields.article.id = fields.article.group + '-' + fields.article.name + '-' + fields.article.version;
+ fields.article.id = fields.article.id.replace(/\./g, '_');
+
+ fields.compare.id = fields.compare.group + '-' + fields.compare.name + '-' + fields.compare.version;
+ fields.compare.id = fields.compare.id.replace(/\./g, '_');
+
+ var entry = sourceEntry;
+ if (entry.parameter && entry.parameter.fields)
+ fields._hasTypeInParameterFields = _hasTypeInFields(entry.parameter.fields);
+
+ if (entry.error && entry.error.fields)
+ fields._hasTypeInErrorFields = _hasTypeInFields(entry.error.fields);
+
+ if (entry.success && entry.success.fields)
+ fields._hasTypeInSuccessFields = _hasTypeInFields(entry.success.fields);
+
+ if (entry.info && entry.info.fields)
+ fields._hasTypeInInfoFields = _hasTypeInFields(entry.info.fields);
+
+ var entry = compareEntry;
+ if (fields._hasTypeInParameterFields !== true && entry.parameter && entry.parameter.fields)
+ fields._hasTypeInParameterFields = _hasTypeInFields(entry.parameter.fields);
+
+ if (fields._hasTypeInErrorFields !== true && entry.error && entry.error.fields)
+ fields._hasTypeInErrorFields = _hasTypeInFields(entry.error.fields);
+
+ if (fields._hasTypeInSuccessFields !== true && entry.success && entry.success.fields)
+ fields._hasTypeInSuccessFields = _hasTypeInFields(entry.success.fields);
+
+ if (fields._hasTypeInInfoFields !== true && entry.info && entry.info.fields)
+ fields._hasTypeInInfoFields = _hasTypeInFields(entry.info.fields);
+
+ var content = templateCompareArticle(fields);
+ $root.after(content);
+ var $content = $root.next();
+
+ // Event on.click re-assign
+ $content.find('.versions li.version a').on('click', changeVersionCompareTo);
+
+ // select navigation
+ $('#sidenav li[data-group=\'' + group + '\'][data-name=\'' + name + '\'][data-version=\'' + currentVersion + '\']').addClass('has-modifications');
+
+ $root.remove();
+ // TODO: on change main version or select the highest version re-render
+ }
+
+ initDynamic();
+ }
+
+ /**
+ * Compare all currently selected Versions with their predecessor.
+ */
+ function changeAllVersionCompareTo(e) {
+ e.preventDefault();
+ $('article:visible .versions').each(function(){
+ var $root = $(this).parents('article');
+ var currentVersion = $root.data('version');
+ var $foundElement = null;
+ $(this).find('li.version a').each(function() {
+ var selectVersion = $(this).html();
+ if (selectVersion < currentVersion && ! $foundElement)
+ $foundElement = $(this);
+ });
+
+ if($foundElement)
+ $foundElement.trigger('click');
+ });
+ initDynamic();
+ }
+
+ /**
+ * Sort the fields.
+ */
+ function sortFields(fields_object) {
+ $.each(fields_object, function (key, fields) {
+
+ var reversed = fields.slice().reverse()
+
+ var max_dot_count = Math.max.apply(null, reversed.map(function (item) {
+ return item.field.split(".").length - 1;
+ }))
+
+ for (var dot_count = 1; dot_count <= max_dot_count; dot_count++) {
+ reversed.forEach(function (item, index) {
+ var parts = item.field.split(".");
+ if (parts.length - 1 == dot_count) {
+ var fields_names = fields.map(function (item) { return item.field; });
+ if (parts.slice(1).length >= 1) {
+ var prefix = parts.slice(0, parts.length - 1).join(".");
+ var prefix_index = fields_names.indexOf(prefix);
+ if (prefix_index > -1) {
+ fields.splice(fields_names.indexOf(item.field), 1);
+ fields.splice(prefix_index + 1, 0, item);
+ }
+ }
+ }
+ });
+ }
+ });
+ }
+
+ /**
+ * Add article settings.
+ */
+ function addArticleSettings(fields, entry) {
+ // add unique id
+ // TODO: replace all group-name-version in template with id.
+ fields.id = fields.article.group + '-' + fields.article.name + '-' + fields.article.version;
+ fields.id = fields.id.replace(/\./g, '_');
+
+ if (entry.header && entry.header.fields) {
+ sortFields(entry.header.fields);
+ fields._hasTypeInHeaderFields = _hasTypeInFields(entry.header.fields);
+ }
+
+ if (entry.parameter && entry.parameter.fields) {
+ sortFields(entry.parameter.fields);
+ fields._hasTypeInParameterFields = _hasTypeInFields(entry.parameter.fields);
+ }
+
+ if (entry.error && entry.error.fields) {
+ sortFields(entry.error.fields);
+ fields._hasTypeInErrorFields = _hasTypeInFields(entry.error.fields);
+ }
+
+ if (entry.success && entry.success.fields) {
+ sortFields(entry.success.fields);
+ fields._hasTypeInSuccessFields = _hasTypeInFields(entry.success.fields);
+ }
+
+ if (entry.info && entry.info.fields) {
+ sortFields(entry.info.fields);
+ fields._hasTypeInInfoFields = _hasTypeInFields(entry.info.fields);
+ }
+
+ // add template settings
+ fields.template = apiProject.template;
+ }
+
+ /**
+ * Render Article.
+ */
+ function renderArticle(group, name, version) {
+ var entry = {};
+ $.each(apiByGroupAndName[group][name], function(index, currentEntry) {
+ if (currentEntry.version === version)
+ entry = currentEntry;
+ });
+ var fields = {
+ article: entry,
+ versions: articleVersions[group][name]
+ };
+
+ addArticleSettings(fields, entry);
+
+ return templateArticle(fields);
+ }
+
+ /**
+ * Render original Article and remove the current visible Article.
+ */
+ function resetArticle(group, name, version) {
+ var $root = $('article[data-group=\'' + group + '\'][data-name=\'' + name + '\']:visible');
+ var content = renderArticle(group, name, version);
+
+ $root.after(content);
+ var $content = $root.next();
+
+ // Event on.click needs to be reassigned (should actually work with on ... automatically)
+ $content.find('.versions li.version a').on('click', changeVersionCompareTo);
+
+ $('#sidenav li[data-group=\'' + group + '\'][data-name=\'' + name + '\'][data-version=\'' + version + '\']').removeClass('has-modifications');
+
+ $root.remove();
+ return;
+ }
+
+ /**
+ * Load google fonts.
+ */
+ function loadGoogleFontCss() {
+ WebFont.load({
+ active: function() {
+ // Update scrollspy
+ $(window).scrollspy('refresh')
+ },
+ google: {
+ families: ['Source Code Pro', 'Source Sans Pro:n4,n6,n7']
+ }
+ });
+ }
+
+ /**
+ * Return ordered entries by custom order and append not defined entries to the end.
+ * @param {String[]} elements
+ * @param {String[]} order
+ * @param {String} splitBy
+ * @return {String[]} Custom ordered list.
+ */
+ function sortByOrder(elements, order, splitBy) {
+ var results = [];
+ order.forEach (function(name) {
+ if (splitBy)
+ elements.forEach (function(element) {
+ var parts = element.split(splitBy);
+ var key = parts[0]; // reference keep for sorting
+ if (key == name || parts[1] == name)
+ results.push(element);
+ });
+ else
+ elements.forEach (function(key) {
+ if (key == name)
+ results.push(name);
+ });
+ });
+ // Append all other entries that ar not defined in order
+ elements.forEach(function(element) {
+ if (results.indexOf(element) === -1)
+ results.push(element);
+ });
+ return results;
+ }
+
+});
diff --git a/backend/docs/utils/handlebars_helper.js b/backend/docs/utils/handlebars_helper.js
new file mode 100644
index 0000000..a86733f
--- /dev/null
+++ b/backend/docs/utils/handlebars_helper.js
@@ -0,0 +1,366 @@
+define([
+ 'locales',
+ 'handlebars',
+ 'diffMatchPatch'
+], function(locale, Handlebars, DiffMatchPatch) {
+
+ /**
+ * Return a text as markdown.
+ * Currently only a little helper to replace apidoc-inline Links (#Group:Name).
+ * Should be replaced with a full markdown lib.
+ * @param string text
+ */
+ Handlebars.registerHelper('markdown', function(text) {
+ if ( ! text ) {
+ return text;
+ }
+ text = text.replace(/((\[(.*?)\])?\(#)((.+?):(.+?))(\))/mg, function(match, p1, p2, p3, p4, p5, p6) {
+ var link = p3 || p5 + '/' + p6;
+ return '' + link + ' ';
+ });
+ return text;
+ });
+
+ /**
+ * start/stop timer for simple performance check.
+ */
+ var timer;
+ Handlebars.registerHelper('startTimer', function(text) {
+ timer = new Date();
+ return '';
+ });
+
+ Handlebars.registerHelper('stopTimer', function(text) {
+ console.log(new Date() - timer);
+ return '';
+ });
+
+ /**
+ * Return localized Text.
+ * @param string text
+ */
+ Handlebars.registerHelper('__', function(text) {
+ return locale.__(text);
+ });
+
+ /**
+ * Console log.
+ * @param mixed obj
+ */
+ Handlebars.registerHelper('cl', function(obj) {
+ console.log(obj);
+ return '';
+ });
+
+ /**
+ * Replace underscore with space.
+ * @param string text
+ */
+ Handlebars.registerHelper('underscoreToSpace', function(text) {
+ return text.replace(/(_+)/g, ' ');
+ });
+
+ /**
+ *
+ */
+ Handlebars.registerHelper('assign', function(name) {
+ if(arguments.length > 0) {
+ var type = typeof(arguments[1]);
+ var arg = null;
+ if(type === 'string' || type === 'number' || type === 'boolean') arg = arguments[1];
+ Handlebars.registerHelper(name, function() { return arg; });
+ }
+ return '';
+ });
+
+ /**
+ *
+ */
+ Handlebars.registerHelper('nl2br', function(text) {
+ return _handlebarsNewlineToBreak(text);
+ });
+
+ /**
+ *
+ */
+ Handlebars.registerHelper('if_eq', function(context, options) {
+ var compare = context;
+ // Get length if context is an object
+ if (context instanceof Object && ! (options.hash.compare instanceof Object))
+ compare = Object.keys(context).length;
+
+ if (compare === options.hash.compare)
+ return options.fn(this);
+
+ return options.inverse(this);
+ });
+
+ /**
+ *
+ */
+ Handlebars.registerHelper('if_gt', function(context, options) {
+ var compare = context;
+ // Get length if context is an object
+ if (context instanceof Object && ! (options.hash.compare instanceof Object))
+ compare = Object.keys(context).length;
+
+ if(compare > options.hash.compare)
+ return options.fn(this);
+
+ return options.inverse(this);
+ });
+
+ /**
+ *
+ */
+ var templateCache = {};
+ Handlebars.registerHelper('subTemplate', function(name, sourceContext) {
+ if ( ! templateCache[name])
+ templateCache[name] = Handlebars.compile($('#template-' + name).html());
+
+ var template = templateCache[name];
+ var templateContext = $.extend({}, this, sourceContext.hash);
+ return new Handlebars.SafeString( template(templateContext) );
+ });
+
+ /**
+ *
+ */
+ Handlebars.registerHelper('toLowerCase', function(value) {
+ return (value && typeof value === 'string') ? value.toLowerCase() : '';
+ });
+
+ /**
+ *
+ */
+ Handlebars.registerHelper('splitFill', function(value, splitChar, fillChar) {
+ var splits = value.split(splitChar);
+ return new Array(splits.length).join(fillChar) + splits[splits.length - 1];
+ });
+
+ /**
+ * Convert Newline to HTML-Break (nl2br).
+ *
+ * @param {String} text
+ * @returns {String}
+ */
+ function _handlebarsNewlineToBreak(text) {
+ return ('' + text).replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + ' ' + '$2');
+ }
+
+ /**
+ *
+ */
+ Handlebars.registerHelper('each_compare_list_field', function(source, compare, options) {
+ var fieldName = options.hash.field;
+ var newSource = [];
+ if (source) {
+ source.forEach(function(entry) {
+ var values = entry;
+ values['key'] = entry[fieldName];
+ newSource.push(values);
+ });
+ }
+
+ var newCompare = [];
+ if (compare) {
+ compare.forEach(function(entry) {
+ var values = entry;
+ values['key'] = entry[fieldName];
+ newCompare.push(values);
+ });
+ }
+ return _handlebarsEachCompared('key', newSource, newCompare, options);
+ });
+
+ /**
+ *
+ */
+ Handlebars.registerHelper('each_compare_keys', function(source, compare, options) {
+ var newSource = [];
+ if (source) {
+ var sourceFields = Object.keys(source);
+ sourceFields.forEach(function(name) {
+ var values = {};
+ values['value'] = source[name];
+ values['key'] = name;
+ newSource.push(values);
+ });
+ }
+
+ var newCompare = [];
+ if (compare) {
+ var compareFields = Object.keys(compare);
+ compareFields.forEach(function(name) {
+ var values = {};
+ values['value'] = compare[name];
+ values['key'] = name;
+ newCompare.push(values);
+ });
+ }
+ return _handlebarsEachCompared('key', newSource, newCompare, options);
+ });
+
+ /**
+ *
+ */
+ Handlebars.registerHelper('each_compare_field', function(source, compare, options) {
+ return _handlebarsEachCompared('field', source, compare, options);
+ });
+
+ /**
+ *
+ */
+ Handlebars.registerHelper('each_compare_title', function(source, compare, options) {
+ return _handlebarsEachCompared('title', source, compare, options);
+ });
+
+ /**
+ *
+ */
+ Handlebars.registerHelper('reformat', function(source, type){
+ if (type == 'json')
+ try {
+ return JSON.stringify(JSON.parse(source.trim()),null, " ");
+ } catch(e) {
+
+ }
+ return source
+ });
+
+ /**
+ *
+ */
+ Handlebars.registerHelper('showDiff', function(source, compare, options) {
+ var ds = '';
+ if(source === compare) {
+ ds = source;
+ } else {
+ if( ! source)
+ return compare;
+
+ if( ! compare)
+ return source;
+
+ var d = diffMatchPatch.diff_main(stripHtml(compare), stripHtml(source));
+ diffMatchPatch.diff_cleanupSemantic(d);
+ ds = diffMatchPatch.diff_prettyHtml(d);
+ ds = ds.replace(/¶/gm, '');
+ }
+ if(options === 'nl2br')
+ ds = _handlebarsNewlineToBreak(ds);
+
+ return ds;
+ });
+
+ /**
+ *
+ */
+ function _handlebarsEachCompared(fieldname, source, compare, options)
+ {
+ var dataList = [];
+ var index = 0;
+ if(source) {
+ source.forEach(function(sourceEntry) {
+ var found = false;
+ if (compare) {
+ compare.forEach(function(compareEntry) {
+ if(sourceEntry[fieldname] === compareEntry[fieldname]) {
+ var data = {
+ typeSame: true,
+ source: sourceEntry,
+ compare: compareEntry,
+ index: index
+ };
+ dataList.push(data);
+ found = true;
+ index++;
+ }
+ });
+ }
+ if ( ! found) {
+ var data = {
+ typeIns: true,
+ source: sourceEntry,
+ index: index
+ };
+ dataList.push(data);
+ index++;
+ }
+ });
+ }
+
+ if (compare) {
+ compare.forEach(function(compareEntry) {
+ var found = false;
+ if (source) {
+ source.forEach(function(sourceEntry) {
+ if(sourceEntry[fieldname] === compareEntry[fieldname])
+ found = true;
+ });
+ }
+ if ( ! found) {
+ var data = {
+ typeDel: true,
+ compare: compareEntry,
+ index: index
+ };
+ dataList.push(data);
+ index++;
+ }
+ });
+ }
+
+ var ret = '';
+ var length = dataList.length;
+ for (var index in dataList) {
+ if(index == (length - 1))
+ dataList[index]['_last'] = true;
+ ret = ret + options.fn(dataList[index]);
+ }
+ return ret;
+ }
+
+ var diffMatchPatch = new DiffMatchPatch();
+
+ /**
+ * Overwrite Colors
+ */
+ DiffMatchPatch.prototype.diff_prettyHtml = function(diffs) {
+ var html = [];
+ var pattern_amp = /&/g;
+ var pattern_lt = //g;
+ var pattern_para = /\n/g;
+ for (var x = 0; x < diffs.length; x++) {
+ var op = diffs[x][0]; // Operation (insert, delete, equal)
+ var data = diffs[x][1]; // Text of change.
+ var text = data.replace(pattern_amp, '&').replace(pattern_lt, '<')
+ .replace(pattern_gt, '>').replace(pattern_para, '¶ ');
+ switch (op) {
+ case DIFF_INSERT:
+ html[x] = '' + text + ' ';
+ break;
+ case DIFF_DELETE:
+ html[x] = '' + text + '';
+ break;
+ case DIFF_EQUAL:
+ html[x] = '' + text + ' ';
+ break;
+ }
+ }
+ return html.join('');
+ };
+
+ /**
+ * Fixes html after comparison (#506, #538, #616, #825)
+ */
+ function stripHtml(html){
+ var div = document.createElement("div");
+ div.innerHTML = html;
+ return div.textContent || div.innerText || "";
+ }
+
+ // Exports
+ return Handlebars;
+});
diff --git a/backend/docs/utils/send_sample_request.js b/backend/docs/utils/send_sample_request.js
new file mode 100644
index 0000000..5c99b74
--- /dev/null
+++ b/backend/docs/utils/send_sample_request.js
@@ -0,0 +1,246 @@
+define([
+ 'jquery',
+ 'lodash',
+ './utils/send_sample_request_utils'
+], function($, _, utils) {
+
+ var initDynamic = function() {
+ // Button send
+ $(".sample-request-send").off("click");
+ $(".sample-request-send").on("click", function(e) {
+ e.preventDefault();
+ var $root = $(this).parents("article");
+ var group = $root.data("group");
+ var name = $root.data("name");
+ var version = $root.data("version");
+ sendSampleRequest(group, name, version, $(this).data("sample-request-type"));
+ });
+
+ // Button clear
+ $(".sample-request-clear").off("click");
+ $(".sample-request-clear").on("click", function(e) {
+ e.preventDefault();
+ var $root = $(this).parents("article");
+ var group = $root.data("group");
+ var name = $root.data("name");
+ var version = $root.data("version");
+ clearSampleRequest(group, name, version);
+ });
+ }; // initDynamic
+
+ function sendSampleRequest(group, name, version, type)
+ {
+ var $root = $('article[data-group="' + group + '"][data-name="' + name + '"][data-version="' + version + '"]');
+
+ // Optional header
+ var header = {};
+ $root.find(".sample-request-header:checked").each(function(i, element) {
+ var group = $(element).data("sample-request-header-group-id");
+ $root.find("[data-sample-request-header-group=\"" + group + "\"]").each(function(i, element) {
+ var key = $(element).data("sample-request-header-name");
+ var value = element.value;
+ if (typeof element.optional === 'undefined') {
+ element.optional = true;
+ }
+ if ( ! element.optional && element.defaultValue !== '') {
+ value = element.defaultValue;
+ }
+ header[key] = value;
+ });
+ });
+
+
+ // create JSON dictionary of parameters
+ var param = {};
+ var paramType = {};
+ var bodyFormData = {};
+ var bodyFormDataType = {};
+ var bodyJson = '';
+ $root.find(".sample-request-param:checked").each(function(i, element) {
+ var group = $(element).data("sample-request-param-group-id");
+ var contentType = $(element).nextAll('.sample-header-content-type-switch').first().val();
+ if (contentType == "body-json"){
+ $root.find("[data-sample-request-body-group=\"" + group + "\"]").not(function(){
+ return $(this).val() == "" && $(this).is("[data-sample-request-param-optional='true']");
+ }).each(function(i, element) {
+ if (isJson(element.value)){
+ header['Content-Type'] = 'application/json';
+ bodyJson = element.value;
+ }
+ });
+ }else {
+ $root.find("[data-sample-request-param-group=\"" + group + "\"]").not(function(){
+ return $(this).val() == "" && $(this).is("[data-sample-request-param-optional='true']");
+ }).each(function(i, element) {
+ var key = $(element).data("sample-request-param-name");
+ var value = element.value;
+ if ( ! element.optional && element.defaultValue !== '') {
+ value = element.defaultValue;
+ }
+ if (contentType == "body-form-data"){
+ header['Content-Type'] = 'multipart/form-data'
+ bodyFormData[key] = value;
+ bodyFormDataType[key] = $(element).next().text();
+ }else {
+ param[key] = value;
+ paramType[key] = $(element).next().text();
+ }
+ });
+ }
+ });
+
+ // grab user-inputted URL
+ var url = $root.find(".sample-request-url").val();
+
+ //Convert {param} form to :param
+ url = url.replace(/{/,':').replace(/}/,'');
+
+ // Insert url parameter
+ var pattern = pathToRegexp(url, null);
+ var matches = pattern.exec(url);
+ for (var i = 1; i < matches.length; i++) {
+ var key = matches[i].substr(1);
+ if (param[key] !== undefined) {
+ url = url.replace(matches[i], encodeURIComponent(param[key]));
+
+ // remove URL parameters from list
+ delete param[key];
+ }
+ } // for
+
+ //handle nested objects and parsing fields
+ param = utils.handleNestedAndParsingFields(param, paramType);
+
+ //add url search parameter
+ if (header['Content-Type'] == 'application/json' ){
+ url = url + encodeSearchParams(param);
+ param = bodyJson;
+ }else if (header['Content-Type'] == 'multipart/form-data'){
+ url = url + encodeSearchParams(param);
+ param = bodyFormData;
+ }
+
+ $root.find(".sample-request-response").fadeTo(250, 1);
+ $root.find(".sample-request-response-json").html("Loading...");
+ refreshScrollSpy();
+
+ // send AJAX request, catch success or error callback
+ var ajaxRequest = {
+ url : url,
+ headers : header,
+ data : param,
+ type : type.toUpperCase(),
+ success : displaySuccess,
+ error : displayError
+ };
+
+ $.ajax(ajaxRequest);
+
+
+ function displaySuccess(data, status, jqXHR) {
+ var jsonResponse;
+ try {
+ jsonResponse = JSON.parse(jqXHR.responseText);
+ jsonResponse = JSON.stringify(jsonResponse, null, 4);
+ } catch (e) {
+ jsonResponse = jqXHR.responseText;
+ }
+ $root.find(".sample-request-response-json").text(jsonResponse);
+ refreshScrollSpy();
+ };
+
+ function displayError(jqXHR, textStatus, error) {
+ var message = "Error " + jqXHR.status + ": " + error;
+ var jsonResponse;
+ try {
+ jsonResponse = JSON.parse(jqXHR.responseText);
+ jsonResponse = JSON.stringify(jsonResponse, null, 4);
+ } catch (e) {
+ jsonResponse = jqXHR.responseText;
+ }
+
+ if (jsonResponse)
+ message += "\n" + jsonResponse;
+
+ // flicker on previous error to make clear that there is a new response
+ if($root.find(".sample-request-response").is(":visible"))
+ $root.find(".sample-request-response").fadeTo(1, 0.1);
+
+ $root.find(".sample-request-response").fadeTo(250, 1);
+ $root.find(".sample-request-response-json").text(message);
+ refreshScrollSpy();
+ };
+ }
+
+ function clearSampleRequest(group, name, version)
+ {
+ var $root = $('article[data-group="' + group + '"][data-name="' + name + '"][data-version="' + version + '"]');
+
+ // hide sample response
+ $root.find(".sample-request-response-json").html("");
+ $root.find(".sample-request-response").hide();
+
+ // reset value of parameters
+ $root.find(".sample-request-param").each(function(i, element) {
+ element.value = "";
+ });
+
+ // restore default URL
+ var $urlElement = $root.find(".sample-request-url");
+ $urlElement.val($urlElement.prop("defaultValue"));
+
+ refreshScrollSpy();
+ }
+
+ function refreshScrollSpy()
+ {
+ $('[data-spy="scroll"]').each(function () {
+ $(this).scrollspy("refresh");
+ });
+ }
+
+ function escapeHtml(str) {
+ var div = document.createElement("div");
+ div.appendChild(document.createTextNode(str));
+ return div.innerHTML;
+ }
+
+
+ /**
+ * is Json
+ */
+ function isJson(str) {
+ if (typeof str == 'string') {
+ try {
+ var obj=JSON.parse(str);
+ if(typeof obj == 'object' && obj ){
+ return true;
+ }else{
+ return false;
+ }
+ } catch(e) {
+ return false;
+ }
+ }
+ }
+
+ /**
+ * encode Search Params
+ */
+ function encodeSearchParams(obj) {
+ const params = [];
+ Object.keys(obj).forEach((key) => {
+ let value = obj[key];
+ params.push([key, encodeURIComponent(value)].join('='));
+ })
+ return params.length === 0 ? '' : '?' + params.join('&');
+ }
+
+ /**
+ * Exports.
+ */
+ return {
+ initDynamic: initDynamic
+ };
+
+});
diff --git a/backend/docs/utils/send_sample_request_utils.js b/backend/docs/utils/send_sample_request_utils.js
new file mode 100644
index 0000000..5fef426
--- /dev/null
+++ b/backend/docs/utils/send_sample_request_utils.js
@@ -0,0 +1,51 @@
+//this block is used to make this module works with Node (CommonJS module format)
+if (typeof define !== 'function') {
+ var define = require('amdefine')(module)
+}
+
+define([], function () {
+
+ function handleNestedFields(object, key, params, paramType) {
+ var attributes = key.split('.');
+ var field = attributes[0];
+ params.push(field);
+ if (attributes.length > 1 && paramType[params.join('.')] == 'Object') {
+ var nestedField = attributes.slice(1).join('.');
+ if (!object[field])
+ object[field] = {};
+ if (typeof object[field] == 'object') {
+ object[field][nestedField] = object[key];
+ delete object[key];
+ handleNestedFields(object[field], nestedField, params, paramType);
+ }
+ }
+ }
+
+ function handleNestedFieldsForAllParams(param, paramType) {
+ var result = Object.assign({}, param);
+ Object.keys(result).forEach(function (key) {
+ handleNestedFields(result, key, [], paramType);
+ });
+ return result
+ }
+
+ function handleArraysAndObjectFields(param, paramType) {
+ var result = Object.assign({}, param);
+ Object.keys(paramType).forEach(function (key) {
+ if (result[key] && (paramType[key].endsWith('[]') || paramType[key] === 'Object')) {
+ try {
+ result[key] = JSON.parse(result[key]);
+ } catch (e) {;}
+ }
+ });
+ return result
+ }
+
+ function handleNestedAndParsingFields(param, paramType) {
+ var result = handleArraysAndObjectFields(param, paramType);
+ result = handleNestedFieldsForAllParams(result, paramType);
+ return result;
+ }
+
+ return {handleNestedAndParsingFields};
+});
diff --git a/backend/docs/vendor/bootstrap.min.css b/backend/docs/vendor/bootstrap.min.css
new file mode 100644
index 0000000..5b96335
--- /dev/null
+++ b/backend/docs/vendor/bootstrap.min.css
@@ -0,0 +1,6 @@
+/*!
+ * Bootstrap v3.4.1 (https://getbootstrap.com/)
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid 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}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:"Glyphicons Halflings";src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format("embedded-opentype"),url(../fonts/glyphicons-halflings-regular.woff2) format("woff2"),url(../fonts/glyphicons-halflings-regular.woff) format("woff"),url(../fonts/glyphicons-halflings-regular.ttf) format("truetype"),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format("svg")}.glyphicon{position:relative;top:1px;display:inline-block;font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.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}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:"\2014 \00A0"}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:""}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:"\00A0 \2014"}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.row-no-gutters{margin-right:0;margin-left:0}.row-no-gutters [class*=col-]{padding-right:0;padding-left:0}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;-moz-appearance:none;appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm input[type=time],input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg input[type=time],input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);opacity:.65;-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;background-image:none;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;background-image:none;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;background-image:none;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;background-image:none;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;background-image:none;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;background-image:none;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a: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:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-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-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-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{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-right:15px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-right:-15px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.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:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.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:#c7ddef}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.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}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out,-o-transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:12px;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.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:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:14px;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover>.arrow{border-width:11px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out,-o-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;outline:0;filter:alpha(opacity=90);opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.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:#000\9;background-color:rgba(0,0,0,0);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 screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}
+/*# sourceMappingURL=bootstrap.min.css.map */
\ No newline at end of file
diff --git a/backend/docs/vendor/bootstrap.min.js b/backend/docs/vendor/bootstrap.min.js
new file mode 100644
index 0000000..eb0a8b4
--- /dev/null
+++ b/backend/docs/vendor/bootstrap.min.js
@@ -0,0 +1,6 @@
+/*!
+ * Bootstrap v3.4.1 (https://getbootstrap.com/)
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under the MIT license
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");!function(t){"use strict";var e=jQuery.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1||3this.$items.length-1||t<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){e.to(t)}):i==t?this.pause().cycle():this.slide(idocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&t?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!t?this.scrollbarWidth:""})},s.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},s.prototype.checkScrollbar=function(){var t=window.innerWidth;if(!t){var e=document.documentElement.getBoundingClientRect();t=e.right-Math.abs(e.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0},sanitize:!0,sanitizeFn:null,whiteList:t},m.prototype.init=function(t,e,i){if(this.enabled=!0,this.type=t,this.$element=g(e),this.options=this.getOptions(i),this.$viewport=this.options.viewport&&g(document).find(g.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var o=this.options.trigger.split(" "),n=o.length;n--;){var s=o[n];if("click"==s)this.$element.on("click."+this.type,this.options.selector,g.proxy(this.toggle,this));else if("manual"!=s){var a="hover"==s?"mouseenter":"focusin",r="hover"==s?"mouseleave":"focusout";this.$element.on(a+"."+this.type,this.options.selector,g.proxy(this.enter,this)),this.$element.on(r+"."+this.type,this.options.selector,g.proxy(this.leave,this))}}this.options.selector?this._options=g.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},m.prototype.getDefaults=function(){return m.DEFAULTS},m.prototype.getOptions=function(t){var e=this.$element.data();for(var i in e)e.hasOwnProperty(i)&&-1!==g.inArray(i,o)&&delete e[i];return(t=g.extend({},this.getDefaults(),e,t)).delay&&"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),t.sanitize&&(t.template=n(t.template,t.whiteList,t.sanitizeFn)),t},m.prototype.getDelegateOptions=function(){var i={},o=this.getDefaults();return this._options&&g.each(this._options,function(t,e){o[t]!=e&&(i[t]=e)}),i},m.prototype.enter=function(t){var e=t instanceof this.constructor?t:g(t.currentTarget).data("bs."+this.type);if(e||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data("bs."+this.type,e)),t instanceof g.Event&&(e.inState["focusin"==t.type?"focus":"hover"]=!0),e.tip().hasClass("in")||"in"==e.hoverState)e.hoverState="in";else{if(clearTimeout(e.timeout),e.hoverState="in",!e.options.delay||!e.options.delay.show)return e.show();e.timeout=setTimeout(function(){"in"==e.hoverState&&e.show()},e.options.delay.show)}},m.prototype.isInStateTrue=function(){for(var t in this.inState)if(this.inState[t])return!0;return!1},m.prototype.leave=function(t){var e=t instanceof this.constructor?t:g(t.currentTarget).data("bs."+this.type);if(e||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data("bs."+this.type,e)),t instanceof g.Event&&(e.inState["focusout"==t.type?"focus":"hover"]=!1),!e.isInStateTrue()){if(clearTimeout(e.timeout),e.hoverState="out",!e.options.delay||!e.options.delay.hide)return e.hide();e.timeout=setTimeout(function(){"out"==e.hoverState&&e.hide()},e.options.delay.hide)}},m.prototype.show=function(){var t=g.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(t);var e=g.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(t.isDefaultPrevented()||!e)return;var i=this,o=this.tip(),n=this.getUID(this.type);this.setContent(),o.attr("id",n),this.$element.attr("aria-describedby",n),this.options.animation&&o.addClass("fade");var s="function"==typeof this.options.placement?this.options.placement.call(this,o[0],this.$element[0]):this.options.placement,a=/\s?auto?\s?/i,r=a.test(s);r&&(s=s.replace(a,"")||"top"),o.detach().css({top:0,left:0,display:"block"}).addClass(s).data("bs."+this.type,this),this.options.container?o.appendTo(g(document).find(this.options.container)):o.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var l=this.getPosition(),h=o[0].offsetWidth,d=o[0].offsetHeight;if(r){var p=s,c=this.getPosition(this.$viewport);s="bottom"==s&&l.bottom+d>c.bottom?"top":"top"==s&&l.top-dc.width?"left":"left"==s&&l.left-ha.top+a.height&&(n.top=a.top+a.height-l)}else{var h=e.left-s,d=e.left+s+i;ha.right&&(n.left=a.left+a.width-d)}return n},m.prototype.getTitle=function(){var t=this.$element,e=this.options;return t.attr("data-original-title")||("function"==typeof e.title?e.title.call(t[0]):e.title)},m.prototype.getUID=function(t){for(;t+=~~(1e6*Math.random()),document.getElementById(t););return t},m.prototype.tip=function(){if(!this.$tip&&(this.$tip=g(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},m.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},m.prototype.enable=function(){this.enabled=!0},m.prototype.disable=function(){this.enabled=!1},m.prototype.toggleEnabled=function(){this.enabled=!this.enabled},m.prototype.toggle=function(t){var e=this;t&&((e=g(t.currentTarget).data("bs."+this.type))||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data("bs."+this.type,e))),t?(e.inState.click=!e.inState.click,e.isInStateTrue()?e.enter(e):e.leave(e)):e.tip().hasClass("in")?e.leave(e):e.enter(e)},m.prototype.destroy=function(){var t=this;clearTimeout(this.timeout),this.hide(function(){t.$element.off("."+t.type).removeData("bs."+t.type),t.$tip&&t.$tip.detach(),t.$tip=null,t.$arrow=null,t.$viewport=null,t.$element=null})},m.prototype.sanitizeHtml=function(t){return n(t,this.options.whiteList,this.options.sanitizeFn)};var e=g.fn.tooltip;g.fn.tooltip=function i(o){return this.each(function(){var t=g(this),e=t.data("bs.tooltip"),i="object"==typeof o&&o;!e&&/destroy|hide/.test(o)||(e||t.data("bs.tooltip",e=new m(this,i)),"string"==typeof o&&e[o]())})},g.fn.tooltip.Constructor=m,g.fn.tooltip.noConflict=function(){return g.fn.tooltip=e,this}}(jQuery),function(n){"use strict";var s=function(t,e){this.init("popover",t,e)};if(!n.fn.tooltip)throw new Error("Popover requires tooltip.js");s.VERSION="3.4.1",s.DEFAULTS=n.extend({},n.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),((s.prototype=n.extend({},n.fn.tooltip.Constructor.prototype)).constructor=s).prototype.getDefaults=function(){return s.DEFAULTS},s.prototype.setContent=function(){var t=this.tip(),e=this.getTitle(),i=this.getContent();if(this.options.html){var o=typeof i;this.options.sanitize&&(e=this.sanitizeHtml(e),"string"===o&&(i=this.sanitizeHtml(i))),t.find(".popover-title").html(e),t.find(".popover-content").children().detach().end()["string"===o?"html":"append"](i)}else t.find(".popover-title").text(e),t.find(".popover-content").children().detach().end().text(i);t.removeClass("fade top bottom left right in"),t.find(".popover-title").html()||t.find(".popover-title").hide()},s.prototype.hasContent=function(){return this.getTitle()||this.getContent()},s.prototype.getContent=function(){var t=this.$element,e=this.options;return t.attr("data-content")||("function"==typeof e.content?e.content.call(t[0]):e.content)},s.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var t=n.fn.popover;n.fn.popover=function e(o){return this.each(function(){var t=n(this),e=t.data("bs.popover"),i="object"==typeof o&&o;!e&&/destroy|hide/.test(o)||(e||t.data("bs.popover",e=new s(this,i)),"string"==typeof o&&e[o]())})},n.fn.popover.Constructor=s,n.fn.popover.noConflict=function(){return n.fn.popover=t,this}}(jQuery),function(s){"use strict";function n(t,e){this.$body=s(document.body),this.$scrollElement=s(t).is(document.body)?s(window):s(t),this.options=s.extend({},n.DEFAULTS,e),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",s.proxy(this.process,this)),this.refresh(),this.process()}function e(o){return this.each(function(){var t=s(this),e=t.data("bs.scrollspy"),i="object"==typeof o&&o;e||t.data("bs.scrollspy",e=new n(this,i)),"string"==typeof o&&e[o]()})}n.VERSION="3.4.1",n.DEFAULTS={offset:10},n.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},n.prototype.refresh=function(){var t=this,o="offset",n=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),s.isWindow(this.$scrollElement[0])||(o="position",n=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var t=s(this),e=t.data("target")||t.attr("href"),i=/^#./.test(e)&&s(e);return i&&i.length&&i.is(":visible")&&[[i[o]().top+n,e]]||null}).sort(function(t,e){return t[0]-e[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},n.prototype.process=function(){var t,e=this.$scrollElement.scrollTop()+this.options.offset,i=this.getScrollHeight(),o=this.options.offset+i-this.$scrollElement.height(),n=this.offsets,s=this.targets,a=this.activeTarget;if(this.scrollHeight!=i&&this.refresh(),o<=e)return a!=(t=s[s.length-1])&&this.activate(t);if(a&&e=n[t]&&(n[t+1]===undefined||e .active"),n=i&&r.support.transition&&(o.length&&o.hasClass("fade")||!!e.find("> .fade").length);function s(){o.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),t.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),n?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu").length&&t.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),i&&i()}o.length&&n?o.one("bsTransitionEnd",s).emulateTransitionEnd(a.TRANSITION_DURATION):s(),o.removeClass("in")};var t=r.fn.tab;r.fn.tab=e,r.fn.tab.Constructor=a,r.fn.tab.noConflict=function(){return r.fn.tab=t,this};var i=function(t){t.preventDefault(),e.call(r(this),"show")};r(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',i).on("click.bs.tab.data-api",'[data-toggle="pill"]',i)}(jQuery),function(l){"use strict";var h=function(t,e){this.options=l.extend({},h.DEFAULTS,e);var i=this.options.target===h.DEFAULTS.target?l(this.options.target):l(document).find(this.options.target);this.$target=i.on("scroll.bs.affix.data-api",l.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",l.proxy(this.checkPositionWithEventLoop,this)),this.$element=l(t),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};function i(o){return this.each(function(){var t=l(this),e=t.data("bs.affix"),i="object"==typeof o&&o;e||t.data("bs.affix",e=new h(this,i)),"string"==typeof o&&e[o]()})}h.VERSION="3.4.1",h.RESET="affix affix-top affix-bottom",h.DEFAULTS={offset:0,target:window},h.prototype.getState=function(t,e,i,o){var n=this.$target.scrollTop(),s=this.$element.offset(),a=this.$target.height();if(null!=i&&"top"==this.affixed)return n=this.Diff_Timeout?Number.MAX_VALUE:(new Date).getTime()+1E3*this.Diff_Timeout);if(null==a||null==b)throw Error("Null input. (diff_main)");if(a==b)return a?[[0,a]]:[];"undefined"==typeof c&&(c=!0);var e=c,f=this.diff_commonPrefix(a,b);c=a.substring(0,f);a=a.substring(f);b=b.substring(f);var f=this.diff_commonSuffix(a,b),g=a.substring(a.length-f);a=a.substring(0,a.length-f);b=b.substring(0,b.length-f);a=this.diff_compute_(a,
+b,e,d);c&&a.unshift([0,c]);g&&a.push([0,g]);this.diff_cleanupMerge(a);return a};
+diff_match_patch.prototype.diff_compute_=function(a,b,c,d){if(!a)return[[1,b]];if(!b)return[[-1,a]];var e=a.length>b.length?a:b,f=a.length>b.length?b:a,g=e.indexOf(f);return-1!=g?(c=[[1,e.substring(0,g)],[0,f],[1,e.substring(g+f.length)]],a.length>b.length&&(c[0][0]=c[2][0]=-1),c):1==f.length?[[-1,a],[1,b]]:(e=this.diff_halfMatch_(a,b))?(f=e[0],a=e[1],g=e[2],b=e[3],e=e[4],f=this.diff_main(f,g,c,d),c=this.diff_main(a,b,c,d),f.concat([[0,e]],c)):c&&100c);v++){for(var n=-v+r;n<=v-t;n+=2){var l=g+n,m;m=n==-v||n!=v&&j[l-1]d)t+=2;else if(s>e)r+=2;else if(q&&(l=g+k-n,0<=l&&l=
+u)return this.diff_bisectSplit_(a,b,m,s,c)}}for(n=-v+p;n<=v-w;n+=2){l=g+n;u=n==-v||n!=v&&i[l-1]d)w+=2;else if(m>e)p+=2;else if(!q&&(l=g+k-n,0<=l&&(l=u)))return this.diff_bisectSplit_(a,b,m,s,c)}}return[[-1,a],[1,b]]};
+diff_match_patch.prototype.diff_bisectSplit_=function(a,b,c,d,e){var f=a.substring(0,c),g=b.substring(0,d);a=a.substring(c);b=b.substring(d);f=this.diff_main(f,g,!1,e);e=this.diff_main(a,b,!1,e);return f.concat(e)};
+diff_match_patch.prototype.diff_linesToChars_=function(a,b){function c(a){for(var b="",c=0,f=-1,g=d.length;fd?a=a.substring(c-d):c=a.length?[h,j,n,l,g]:null}if(0>=this.Diff_Timeout)return null;
+var d=a.length>b.length?a:b,e=a.length>b.length?b:a;if(4>d.length||2*e.lengthd[4].length?g:d:d:g;var j;a.length>b.length?(g=h[0],d=h[1],e=h[2],j=h[3]):(e=h[0],j=h[1],g=h[2],d=h[3]);h=h[4];return[g,d,e,j,h]};
+diff_match_patch.prototype.diff_cleanupSemantic=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=0,h=0,j=0,i=0;f=e){if(d>=b.length/2||d>=c.length/2)a.splice(f,0,[0,c.substring(0,d)]),a[f-1][1]=b.substring(0,b.length-d),a[f+1][1]=c.substring(d),f++}else if(e>=b.length/2||e>=c.length/2)a.splice(f,0,[0,b.substring(0,e)]),a[f-1][0]=1,a[f-1][1]=c.substring(0,c.length-e),a[f+1][0]=-1,a[f+1][1]=b.substring(e),f++;f++}f++}};
+diff_match_patch.prototype.diff_cleanupSemanticLossless=function(a){function b(a,b){if(!a||!b)return 6;var c=a.charAt(a.length-1),d=b.charAt(0),e=c.match(diff_match_patch.nonAlphaNumericRegex_),f=d.match(diff_match_patch.nonAlphaNumericRegex_),g=e&&c.match(diff_match_patch.whitespaceRegex_),h=f&&d.match(diff_match_patch.whitespaceRegex_),c=g&&c.match(diff_match_patch.linebreakRegex_),d=h&&d.match(diff_match_patch.linebreakRegex_),i=c&&a.match(diff_match_patch.blanklineEndRegex_),j=d&&b.match(diff_match_patch.blanklineStartRegex_);
+return i||j?5:c||d?4:e&&!g&&h?3:g||h?2:e||f?1:0}for(var c=1;c=i&&(i=k,g=d,h=e,j=f)}a[c-1][1]!=g&&(g?a[c-1][1]=g:(a.splice(c-1,1),c--),a[c][1]=
+h,j?a[c+1][1]=j:(a.splice(c+1,1),c--))}c++}};diff_match_patch.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;diff_match_patch.whitespaceRegex_=/\s/;diff_match_patch.linebreakRegex_=/[\r\n]/;diff_match_patch.blanklineEndRegex_=/\n\r?\n$/;diff_match_patch.blanklineStartRegex_=/^\r?\n\r?\n/;
+diff_match_patch.prototype.diff_cleanupEfficiency=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=!1,h=!1,j=!1,i=!1;fb)break;e=c;f=d}return a.length!=g&&-1===a[g][0]?f:f+(b-e)};
+diff_match_patch.prototype.diff_prettyHtml=function(a){for(var b=[],c=/&/g,d=//g,f=/\n/g,g=0;g");switch(h){case 1:b[g]=''+j+" ";break;case -1:b[g]=''+j+"";break;case 0:b[g]=""+j+" "}}return b.join("")};
+diff_match_patch.prototype.diff_text1=function(a){for(var b=[],c=0;ci)throw Error("Invalid number in diff_fromDelta: "+h);h=a.substring(e,e+=i);"="==f[g].charAt(0)?c[d++]=[0,h]:c[d++]=[-1,h];break;default:if(f[g])throw Error("Invalid diff operation in diff_fromDelta: "+
+f[g]);}}if(e!=a.length)throw Error("Delta length ("+e+") does not equal source text length ("+a.length+").");return c};diff_match_patch.prototype.match_main=function(a,b,c){if(null==a||null==b||null==c)throw Error("Null input. (match_main)");c=Math.max(0,Math.min(c,a.length));return a==b?0:a.length?a.substring(c,c+b.length)==b?c:this.match_bitap_(a,b,c):-1};
+diff_match_patch.prototype.match_bitap_=function(a,b,c){function d(a,d){var e=a/b.length,g=Math.abs(c-d);return!f.Match_Distance?g?1:e:e+g/f.Match_Distance}if(b.length>this.Match_MaxBits)throw Error("Pattern too long for this browser.");var e=this.match_alphabet_(b),f=this,g=this.Match_Threshold,h=a.indexOf(b,c);-1!=h&&(g=Math.min(d(0,h),g),h=a.lastIndexOf(b,c+b.length),-1!=h&&(g=Math.min(d(0,h),g)));for(var j=1<=i;p--){var w=e[a.charAt(p-1)];k[p]=0===t?(k[p+1]<<1|1)&w:(k[p+1]<<1|1)&w|((r[p+1]|r[p])<<1|1)|r[p+1];if(k[p]&j&&(w=d(t,p-1),w<=g))if(g=w,h=p-1,h>c)i=Math.max(1,2*c-h);else break}if(d(t+1,c)>g)break;r=k}return h};
+diff_match_patch.prototype.match_alphabet_=function(a){for(var b={},c=0;c=2*this.Patch_Margin&&
+e&&(this.patch_addContext_(a,h),c.push(a),a=new diff_match_patch.patch_obj,e=0,h=d,f=g)}1!==i&&(f+=k.length);-1!==i&&(g+=k.length)}e&&(this.patch_addContext_(a,h),c.push(a));return c};diff_match_patch.prototype.patch_deepCopy=function(a){for(var b=[],c=0;cthis.Match_MaxBits){if(j=this.match_main(b,h.substring(0,this.Match_MaxBits),g),-1!=j&&(i=this.match_main(b,h.substring(h.length-this.Match_MaxBits),g+h.length-this.Match_MaxBits),-1==i||j>=i))j=-1}else j=this.match_main(b,h,g);
+if(-1==j)e[f]=!1,d-=a[f].length2-a[f].length1;else if(e[f]=!0,d=j-g,g=-1==i?b.substring(j,j+h.length):b.substring(j,i+this.Match_MaxBits),h==g)b=b.substring(0,j)+this.diff_text2(a[f].diffs)+b.substring(j+h.length);else if(g=this.diff_main(h,g,!1),h.length>this.Match_MaxBits&&this.diff_levenshtein(g)/h.length>this.Patch_DeleteThreshold)e[f]=!1;else{this.diff_cleanupSemanticLossless(g);for(var h=0,k,i=0;ie[0][1].length){var f=b-e[0][1].length;e[0][1]=c.substring(e[0][1].length)+e[0][1];d.start1-=f;d.start2-=f;d.length1+=f;d.length2+=f}d=a[a.length-1];e=d.diffs;0==e.length||0!=e[e.length-1][0]?(e.push([0,
+c]),d.length1+=b,d.length2+=b):b>e[e.length-1][1].length&&(f=b-e[e.length-1][1].length,e[e.length-1][1]+=c.substring(0,f),d.length1+=f,d.length2+=f);return c};
+diff_match_patch.prototype.patch_splitMax=function(a){for(var b=this.Match_MaxBits,c=0;c 2*b?(h.length1+=i.length,e+=i.length,j=!1,h.diffs.push([g,i]),d.diffs.shift()):(i=i.substring(0,b-h.length1-this.Patch_Margin),h.length1+=i.length,e+=i.length,0===g?(h.length2+=i.length,f+=i.length):j=!1,h.diffs.push([g,i]),i==d.diffs[0][1]?d.diffs.shift():d.diffs[0][1]=d.diffs[0][1].substring(i.length))}g=this.diff_text2(h.diffs);g=g.substring(g.length-this.Patch_Margin);i=this.diff_text1(d.diffs).substring(0,this.Patch_Margin);""!==i&&
+(h.length1+=i.length,h.length2+=i.length,0!==h.diffs.length&&0===h.diffs[h.diffs.length-1][0]?h.diffs[h.diffs.length-1][1]+=i:h.diffs.push([0,i]));j||a.splice(++c,0,h)}}};diff_match_patch.prototype.patch_toText=function(a){for(var b=[],c=0;c= 2.0.0-beta.1",7:">= 4.0.0"};b.REVISION_CHANGES=o;var p="[object Object]";d.prototype={constructor:d,logger:l["default"],log:l["default"].log,registerHelper:function(a,b){if(f.toString.call(a)===p){if(b)throw new h["default"]("Arg not supported with multiple helpers");f.extend(this.helpers,a)}else this.helpers[a]=b},unregisterHelper:function(a){delete this.helpers[a]},registerPartial:function(a,b){if(f.toString.call(a)===p)f.extend(this.partials,a);else{if("undefined"==typeof b)throw new h["default"]('Attempting to register a partial called "'+a+'" as undefined');this.partials[a]=b}},unregisterPartial:function(a){delete this.partials[a]},registerDecorator:function(a,b){if(f.toString.call(a)===p){if(b)throw new h["default"]("Arg not supported with multiple decorators");f.extend(this.decorators,a)}else this.decorators[a]=b},unregisterDecorator:function(a){delete this.decorators[a]}};var q=l["default"].log;b.log=q,b.createFrame=f.createFrame,b.logger=l["default"]},function(a,b){"use strict";function c(a){return k[a]}function d(a){for(var b=1;bc;c++)if(a[c]===b)return c;return-1}function f(a){if("string"!=typeof a){if(a&&a.toHTML)return a.toHTML();if(null==a)return"";if(!a)return a+"";a=""+a}return m.test(a)?a.replace(l,c):a}function g(a){return a||0===a?p(a)&&0===a.length?!0:!1:!0}function h(a){var b=d({},a);return b._parent=a,b}function i(a,b){return a.path=b,a}function j(a,b){return(a?a+".":"")+b}b.__esModule=!0,b.extend=d,b.indexOf=e,b.escapeExpression=f,b.isEmpty=g,b.createFrame=h,b.blockParams=i,b.appendContextPath=j;var k={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`","=":"="},l=/[&<>"'`=]/g,m=/[&<>"'`=]/,n=Object.prototype.toString;b.toString=n;var o=function(a){return"function"==typeof a};o(/x/)&&(b.isFunction=o=function(a){return"function"==typeof a&&"[object Function]"===n.call(a)}),b.isFunction=o;var p=Array.isArray||function(a){return a&&"object"==typeof a?"[object Array]"===n.call(a):!1};b.isArray=p},function(a,b){"use strict";function c(a,b){var e=b&&b.loc,f=void 0,g=void 0;e&&(f=e.start.line,g=e.start.column,a+=" - "+f+":"+g);for(var h=Error.prototype.constructor.call(this,a),i=0;i0?(c.ids&&(c.ids=[c.name]),a.helpers.each(b,c)):e(this);if(c.data&&c.ids){var g=d.createFrame(c.data);g.contextPath=d.appendContextPath(c.data.contextPath,c.name),c={data:g}}return f(b,c)})},a.exports=b["default"]},function(a,b,c){"use strict";var d=c(1)["default"];b.__esModule=!0;var e=c(5),f=c(6),g=d(f);b["default"]=function(a){a.registerHelper("each",function(a,b){function c(b,c,f){j&&(j.key=b,j.index=c,j.first=0===c,j.last=!!f,k&&(j.contextPath=k+b)),i+=d(a[b],{data:j,blockParams:e.blockParams([a[b],b],[k+b,null])})}if(!b)throw new g["default"]("Must pass iterator to #each");var d=b.fn,f=b.inverse,h=0,i="",j=void 0,k=void 0;if(b.data&&b.ids&&(k=e.appendContextPath(b.data.contextPath,b.ids[0])+"."),e.isFunction(a)&&(a=a.call(this)),b.data&&(j=e.createFrame(b.data)),a&&"object"==typeof a)if(e.isArray(a))for(var l=a.length;l>h;h++)h in a&&c(h,h,h===a.length-1);else{var m=void 0;for(var n in a)a.hasOwnProperty(n)&&(void 0!==m&&c(m,h-1),m=n,h++);void 0!==m&&c(m,h-1,!0)}return 0===h&&(i=f(this)),i})},a.exports=b["default"]},function(a,b,c){"use strict";var d=c(1)["default"];b.__esModule=!0;var e=c(6),f=d(e);b["default"]=function(a){a.registerHelper("helperMissing",function(){if(1!==arguments.length)throw new f["default"]('Missing helper: "'+arguments[arguments.length-1].name+'"')})},a.exports=b["default"]},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5);b["default"]=function(a){a.registerHelper("if",function(a,b){return d.isFunction(a)&&(a=a.call(this)),!b.hash.includeZero&&!a||d.isEmpty(a)?b.inverse(this):b.fn(this)}),a.registerHelper("unless",function(b,c){return a.helpers["if"].call(this,b,{fn:c.inverse,inverse:c.fn,hash:c.hash})})},a.exports=b["default"]},function(a,b){"use strict";b.__esModule=!0,b["default"]=function(a){a.registerHelper("log",function(){for(var b=[void 0],c=arguments[arguments.length-1],d=0;d=0?b:parseInt(a,10)}return a},log:function(a){if(a=e.lookupLevel(a),"undefined"!=typeof console&&e.lookupLevel(e.level)<=a){var b=e.methodMap[a];console[b]||(b="log");for(var c=arguments.length,d=Array(c>1?c-1:0),f=1;c>f;f++)d[f-1]=arguments[f];console[b].apply(console,d)}}};b["default"]=e,a.exports=b["default"]},function(a,b){"use strict";function c(a){this.string=a}b.__esModule=!0,c.prototype.toString=c.prototype.toHTML=function(){return""+this.string},b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(a){var b=a&&a[0]||1,c=r.COMPILER_REVISION;if(b!==c){if(c>b){var d=r.REVISION_CHANGES[c],e=r.REVISION_CHANGES[b];throw new q["default"]("Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version ("+d+") or downgrade your runtime to an older version ("+e+").")}throw new q["default"]("Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version ("+a[1]+").")}}function e(a,b){function c(c,d,e){e.hash&&(d=o.extend({},d,e.hash),e.ids&&(e.ids[0]=!0)),c=b.VM.resolvePartial.call(this,c,d,e);var f=b.VM.invokePartial.call(this,c,d,e);if(null==f&&b.compile&&(e.partials[e.name]=b.compile(c,a.compilerOptions,b),f=e.partials[e.name](d,e)),null!=f){if(e.indent){for(var g=f.split("\n"),h=0,i=g.length;i>h&&(g[h]||h+1!==i);h++)g[h]=e.indent+g[h];f=g.join("\n")}return f}throw new q["default"]("The partial "+e.name+" could not be compiled when running in runtime-only mode")}function d(b){function c(b){return""+a.main(e,b,e.helpers,e.partials,g,i,h)}var f=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],g=f.data;d._setup(f),!f.partial&&a.useData&&(g=j(b,g));var h=void 0,i=a.useBlockParams?[]:void 0;return a.useDepths&&(h=f.depths?b!==f.depths[0]?[b].concat(f.depths):f.depths:[b]),(c=k(a.main,c,e,f.depths||[],g,i))(b,f)}if(!b)throw new q["default"]("No environment passed to template");if(!a||!a.main)throw new q["default"]("Unknown template object: "+typeof a);a.main.decorator=a.main_d,b.VM.checkRevision(a.compiler);var e={strict:function(a,b){if(!(b in a))throw new q["default"]('"'+b+'" not defined in '+a);return a[b]},lookup:function(a,b){for(var c=a.length,d=0;c>d;d++)if(a[d]&&null!=a[d][b])return a[d][b]},lambda:function(a,b){return"function"==typeof a?a.call(b):a},escapeExpression:o.escapeExpression,invokePartial:c,fn:function(b){var c=a[b];return c.decorator=a[b+"_d"],c},programs:[],program:function(a,b,c,d,e){var g=this.programs[a],h=this.fn(a);return b||e||d||c?g=f(this,a,h,b,c,d,e):g||(g=this.programs[a]=f(this,a,h)),g},data:function(a,b){for(;a&&b--;)a=a._parent;return a},merge:function(a,b){var c=a||b;return a&&b&&a!==b&&(c=o.extend({},b,a)),c},noop:b.VM.noop,compilerInfo:a.compiler};return d.isTop=!0,d._setup=function(c){c.partial?(e.helpers=c.helpers,e.partials=c.partials,e.decorators=c.decorators):(e.helpers=e.merge(c.helpers,b.helpers),a.usePartial&&(e.partials=e.merge(c.partials,b.partials)),(a.usePartial||a.useDecorators)&&(e.decorators=e.merge(c.decorators,b.decorators)))},d._child=function(b,c,d,g){if(a.useBlockParams&&!d)throw new q["default"]("must pass block params");if(a.useDepths&&!g)throw new q["default"]("must pass parent depths");return f(e,b,a[b],c,0,d,g)},d}function f(a,b,c,d,e,f,g){function h(b){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],h=g;return g&&b!==g[0]&&(h=[b].concat(g)),c(a,b,a.helpers,a.partials,e.data||d,f&&[e.blockParams].concat(f),h)}return h=k(c,h,a,g,d,f),h.program=b,h.depth=g?g.length:0,h.blockParams=e||0,h}function g(a,b,c){return a?a.call||c.name||(c.name=a,a=c.partials[a]):a="@partial-block"===c.name?c.data["partial-block"]:c.partials[c.name],a}function h(a,b,c){c.partial=!0,c.ids&&(c.data.contextPath=c.ids[0]||c.data.contextPath);var d=void 0;if(c.fn&&c.fn!==i&&(c.data=r.createFrame(c.data),d=c.data["partial-block"]=c.fn,d.partials&&(c.partials=o.extend({},c.partials,d.partials))),void 0===a&&d&&(a=d),void 0===a)throw new q["default"]("The partial "+c.name+" could not be found");return a instanceof Function?a(b,c):void 0}function i(){return""}function j(a,b){return b&&"root"in b||(b=b?r.createFrame(b):{},b.root=a),b}function k(a,b,c,d,e,f){if(a.decorator){var g={};b=a.decorator(b,g,c,d&&d[0],e,f,d),o.extend(b,g)}return b}var l=c(3)["default"],m=c(1)["default"];b.__esModule=!0,b.checkRevision=d,b.template=e,b.wrapProgram=f,b.resolvePartial=g,b.invokePartial=h,b.noop=i;var n=c(5),o=l(n),p=c(6),q=m(p),r=c(4)},function(a,b){(function(c){"use strict";b.__esModule=!0,b["default"]=function(a){var b="undefined"!=typeof c?c:window,d=b.Handlebars;a.noConflict=function(){return b.Handlebars===a&&(b.Handlebars=d),a}},a.exports=b["default"]}).call(b,function(){return this}())},function(a,b){"use strict";b.__esModule=!0;var c={helpers:{helperExpression:function(a){return"SubExpression"===a.type||("MustacheStatement"===a.type||"BlockStatement"===a.type)&&!!(a.params&&a.params.length||a.hash)},scopedId:function(a){return/^\.|this\b/.test(a.original)},simpleId:function(a){return 1===a.parts.length&&!c.helpers.scopedId(a)&&!a.depth}}};b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b){if("Program"===a.type)return a;h["default"].yy=n,n.locInfo=function(a){return new n.SourceLocation(b&&b.srcName,a)};var c=new j["default"](b);return c.accept(h["default"].parse(a))}var e=c(1)["default"],f=c(3)["default"];b.__esModule=!0,b.parse=d;var g=c(23),h=e(g),i=c(24),j=e(i),k=c(26),l=f(k),m=c(5);b.parser=h["default"];var n={};m.extend(n,l)},function(a,b){"use strict";var c=function(){function a(){this.yy={}}var b={trace:function(){},yy:{},symbols_:{error:2,root:3,program:4,EOF:5,program_repetition0:6,statement:7,mustache:8,block:9,rawBlock:10,partial:11,partialBlock:12,content:13,COMMENT:14,CONTENT:15,openRawBlock:16,rawBlock_repetition_plus0:17,END_RAW_BLOCK:18,OPEN_RAW_BLOCK:19,helperName:20,openRawBlock_repetition0:21,openRawBlock_option0:22,CLOSE_RAW_BLOCK:23,openBlock:24,block_option0:25,closeBlock:26,openInverse:27,block_option1:28,OPEN_BLOCK:29,openBlock_repetition0:30,openBlock_option0:31,openBlock_option1:32,CLOSE:33,OPEN_INVERSE:34,openInverse_repetition0:35,openInverse_option0:36,openInverse_option1:37,openInverseChain:38,OPEN_INVERSE_CHAIN:39,openInverseChain_repetition0:40,openInverseChain_option0:41,openInverseChain_option1:42,inverseAndProgram:43,INVERSE:44,inverseChain:45,inverseChain_option0:46,OPEN_ENDBLOCK:47,OPEN:48,mustache_repetition0:49,mustache_option0:50,OPEN_UNESCAPED:51,mustache_repetition1:52,mustache_option1:53,CLOSE_UNESCAPED:54,OPEN_PARTIAL:55,partialName:56,partial_repetition0:57,partial_option0:58,openPartialBlock:59,OPEN_PARTIAL_BLOCK:60,openPartialBlock_repetition0:61,openPartialBlock_option0:62,param:63,sexpr:64,OPEN_SEXPR:65,sexpr_repetition0:66,sexpr_option0:67,CLOSE_SEXPR:68,hash:69,hash_repetition_plus0:70,hashSegment:71,ID:72,EQUALS:73,blockParams:74,OPEN_BLOCK_PARAMS:75,blockParams_repetition_plus0:76,CLOSE_BLOCK_PARAMS:77,path:78,dataName:79,STRING:80,NUMBER:81,BOOLEAN:82,UNDEFINED:83,NULL:84,DATA:85,pathSegments:86,SEP:87,$accept:0,$end:1},terminals_:{2:"error",5:"EOF",14:"COMMENT",15:"CONTENT",18:"END_RAW_BLOCK",19:"OPEN_RAW_BLOCK",23:"CLOSE_RAW_BLOCK",29:"OPEN_BLOCK",33:"CLOSE",34:"OPEN_INVERSE",39:"OPEN_INVERSE_CHAIN",44:"INVERSE",47:"OPEN_ENDBLOCK",48:"OPEN",51:"OPEN_UNESCAPED",54:"CLOSE_UNESCAPED",55:"OPEN_PARTIAL",60:"OPEN_PARTIAL_BLOCK",65:"OPEN_SEXPR",68:"CLOSE_SEXPR",72:"ID",73:"EQUALS",75:"OPEN_BLOCK_PARAMS",77:"CLOSE_BLOCK_PARAMS",80:"STRING",81:"NUMBER",82:"BOOLEAN",83:"UNDEFINED",84:"NULL",85:"DATA",87:"SEP"},productions_:[0,[3,2],[4,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[13,1],[10,3],[16,5],[9,4],[9,4],[24,6],[27,6],[38,6],[43,2],[45,3],[45,1],[26,3],[8,5],[8,5],[11,5],[12,3],[59,5],[63,1],[63,1],[64,5],[69,1],[71,3],[74,3],[20,1],[20,1],[20,1],[20,1],[20,1],[20,1],[20,1],[56,1],[56,1],[79,2],[78,1],[86,3],[86,1],[6,0],[6,2],[17,1],[17,2],[21,0],[21,2],[22,0],[22,1],[25,0],[25,1],[28,0],[28,1],[30,0],[30,2],[31,0],[31,1],[32,0],[32,1],[35,0],[35,2],[36,0],[36,1],[37,0],[37,1],[40,0],[40,2],[41,0],[41,1],[42,0],[42,1],[46,0],[46,1],[49,0],[49,2],[50,0],[50,1],[52,0],[52,2],[53,0],[53,1],[57,0],[57,2],[58,0],[58,1],[61,0],[61,2],[62,0],[62,1],[66,0],[66,2],[67,0],[67,1],[70,1],[70,2],[76,1],[76,2]],performAction:function(a,b,c,d,e,f,g){var h=f.length-1;switch(e){case 1:return f[h-1];case 2:this.$=d.prepareProgram(f[h]);break;case 3:this.$=f[h];break;case 4:this.$=f[h];break;case 5:this.$=f[h];break;case 6:this.$=f[h];break;case 7:this.$=f[h];break;case 8:this.$=f[h];break;case 9:this.$={type:"CommentStatement",value:d.stripComment(f[h]),strip:d.stripFlags(f[h],f[h]),loc:d.locInfo(this._$)};break;case 10:this.$={type:"ContentStatement",original:f[h],value:f[h],loc:d.locInfo(this._$)};break;case 11:this.$=d.prepareRawBlock(f[h-2],f[h-1],f[h],this._$);break;case 12:this.$={path:f[h-3],params:f[h-2],hash:f[h-1]};break;case 13:this.$=d.prepareBlock(f[h-3],f[h-2],f[h-1],f[h],!1,this._$);break;case 14:this.$=d.prepareBlock(f[h-3],f[h-2],f[h-1],f[h],!0,this._$);break;case 15:this.$={open:f[h-5],path:f[h-4],params:f[h-3],hash:f[h-2],blockParams:f[h-1],strip:d.stripFlags(f[h-5],f[h])};break;case 16:this.$={path:f[h-4],params:f[h-3],hash:f[h-2],blockParams:f[h-1],strip:d.stripFlags(f[h-5],f[h])};break;case 17:this.$={path:f[h-4],params:f[h-3],hash:f[h-2],blockParams:f[h-1],strip:d.stripFlags(f[h-5],f[h])};break;case 18:this.$={strip:d.stripFlags(f[h-1],f[h-1]),program:f[h]};break;case 19:var i=d.prepareBlock(f[h-2],f[h-1],f[h],f[h],!1,this._$),j=d.prepareProgram([i],f[h-1].loc);j.chained=!0,this.$={strip:f[h-2].strip,program:j,chain:!0};break;case 20:this.$=f[h];break;case 21:this.$={path:f[h-1],strip:d.stripFlags(f[h-2],f[h])};break;case 22:this.$=d.prepareMustache(f[h-3],f[h-2],f[h-1],f[h-4],d.stripFlags(f[h-4],f[h]),this._$);break;case 23:this.$=d.prepareMustache(f[h-3],f[h-2],f[h-1],f[h-4],d.stripFlags(f[h-4],f[h]),this._$);break;case 24:this.$={type:"PartialStatement",name:f[h-3],params:f[h-2],hash:f[h-1],indent:"",strip:d.stripFlags(f[h-4],f[h]),loc:d.locInfo(this._$)};break;case 25:this.$=d.preparePartialBlock(f[h-2],f[h-1],f[h],this._$);break;case 26:this.$={path:f[h-3],params:f[h-2],hash:f[h-1],strip:d.stripFlags(f[h-4],f[h])};break;case 27:this.$=f[h];break;case 28:this.$=f[h];break;case 29:this.$={type:"SubExpression",path:f[h-3],params:f[h-2],hash:f[h-1],loc:d.locInfo(this._$)};break;case 30:this.$={type:"Hash",pairs:f[h],loc:d.locInfo(this._$)};break;case 31:this.$={type:"HashPair",key:d.id(f[h-2]),value:f[h],loc:d.locInfo(this._$)};break;case 32:this.$=d.id(f[h-1]);break;case 33:this.$=f[h];break;case 34:this.$=f[h];break;case 35:this.$={type:"StringLiteral",value:f[h],original:f[h],loc:d.locInfo(this._$)};break;case 36:this.$={type:"NumberLiteral",value:Number(f[h]),original:Number(f[h]),loc:d.locInfo(this._$)};break;case 37:this.$={type:"BooleanLiteral",value:"true"===f[h],original:"true"===f[h],loc:d.locInfo(this._$)};break;case 38:this.$={type:"UndefinedLiteral",original:void 0,value:void 0,loc:d.locInfo(this._$)};break;case 39:this.$={type:"NullLiteral",original:null,value:null,loc:d.locInfo(this._$)};break;case 40:this.$=f[h];break;case 41:this.$=f[h];break;case 42:this.$=d.preparePath(!0,f[h],this._$);break;case 43:this.$=d.preparePath(!1,f[h],this._$);break;case 44:f[h-2].push({part:d.id(f[h]),original:f[h],separator:f[h-1]}),this.$=f[h-2];break;case 45:this.$=[{part:d.id(f[h]),original:f[h]}];break;case 46:this.$=[];break;case 47:f[h-1].push(f[h]);break;case 48:this.$=[f[h]];break;case 49:f[h-1].push(f[h]);break;case 50:this.$=[];break;case 51:f[h-1].push(f[h]);break;case 58:this.$=[];break;case 59:f[h-1].push(f[h]);break;case 64:this.$=[];break;case 65:f[h-1].push(f[h]);break;case 70:this.$=[];break;case 71:f[h-1].push(f[h]);break;case 78:this.$=[];break;case 79:f[h-1].push(f[h]);break;case 82:this.$=[];break;case 83:f[h-1].push(f[h]);break;case 86:this.$=[];break;case 87:f[h-1].push(f[h]);break;case 90:this.$=[];break;case 91:f[h-1].push(f[h]);break;case 94:this.$=[];break;case 95:f[h-1].push(f[h]);break;case 98:this.$=[f[h]];break;case 99:f[h-1].push(f[h]);break;case 100:this.$=[f[h]];break;case 101:f[h-1].push(f[h])}},table:[{3:1,4:2,5:[2,46],6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{1:[3]},{5:[1,4]},{5:[2,2],7:5,8:6,9:7,10:8,11:9,12:10,13:11,14:[1,12],15:[1,20],16:17,19:[1,23],24:15,27:16,29:[1,21],34:[1,22],39:[2,2],44:[2,2],47:[2,2],48:[1,13],51:[1,14],55:[1,18],59:19,60:[1,24]},{1:[2,1]},{5:[2,47],14:[2,47],15:[2,47],19:[2,47],29:[2,47],34:[2,47],39:[2,47],44:[2,47],47:[2,47],48:[2,47],51:[2,47],55:[2,47],60:[2,47]},{5:[2,3],14:[2,3],15:[2,3],19:[2,3],29:[2,3],34:[2,3],39:[2,3],44:[2,3],47:[2,3],48:[2,3],51:[2,3],55:[2,3],60:[2,3]},{5:[2,4],14:[2,4],15:[2,4],19:[2,4],29:[2,4],34:[2,4],39:[2,4],44:[2,4],47:[2,4],48:[2,4],51:[2,4],55:[2,4],60:[2,4]},{5:[2,5],14:[2,5],15:[2,5],19:[2,5],29:[2,5],34:[2,5],39:[2,5],44:[2,5],47:[2,5],48:[2,5],51:[2,5],55:[2,5],60:[2,5]},{5:[2,6],14:[2,6],15:[2,6],19:[2,6],29:[2,6],34:[2,6],39:[2,6],44:[2,6],47:[2,6],48:[2,6],51:[2,6],55:[2,6],60:[2,6]},{5:[2,7],14:[2,7],15:[2,7],19:[2,7],29:[2,7],34:[2,7],39:[2,7],44:[2,7],47:[2,7],48:[2,7],51:[2,7],55:[2,7],60:[2,7]},{5:[2,8],14:[2,8],15:[2,8],19:[2,8],29:[2,8],34:[2,8],39:[2,8],44:[2,8],47:[2,8],48:[2,8],51:[2,8],55:[2,8],60:[2,8]},{5:[2,9],14:[2,9],15:[2,9],19:[2,9],29:[2,9],34:[2,9],39:[2,9],44:[2,9],47:[2,9],48:[2,9],51:[2,9],55:[2,9],60:[2,9]},{20:25,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:36,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:37,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],39:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{4:38,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{13:40,15:[1,20],17:39},{20:42,56:41,64:43,65:[1,44],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:45,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{5:[2,10],14:[2,10],15:[2,10],18:[2,10],19:[2,10],29:[2,10],34:[2,10],39:[2,10],44:[2,10],47:[2,10],48:[2,10],51:[2,10],55:[2,10],60:[2,10]},{20:46,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:47,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:48,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:42,56:49,64:43,65:[1,44],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[2,78],49:50,65:[2,78],72:[2,78],80:[2,78],81:[2,78],82:[2,78],83:[2,78],84:[2,78],85:[2,78]},{23:[2,33],33:[2,33],54:[2,33],65:[2,33],68:[2,33],72:[2,33],75:[2,33],80:[2,33],81:[2,33],82:[2,33],83:[2,33],84:[2,33],85:[2,33]},{23:[2,34],33:[2,34],54:[2,34],65:[2,34],68:[2,34],72:[2,34],75:[2,34],80:[2,34],81:[2,34],82:[2,34],83:[2,34],84:[2,34],85:[2,34]},{23:[2,35],33:[2,35],54:[2,35],65:[2,35],68:[2,35],72:[2,35],75:[2,35],80:[2,35],81:[2,35],82:[2,35],83:[2,35],84:[2,35],85:[2,35]},{23:[2,36],33:[2,36],54:[2,36],65:[2,36],68:[2,36],72:[2,36],75:[2,36],80:[2,36],81:[2,36],82:[2,36],83:[2,36],84:[2,36],85:[2,36]},{23:[2,37],33:[2,37],54:[2,37],65:[2,37],68:[2,37],72:[2,37],75:[2,37],80:[2,37],81:[2,37],82:[2,37],83:[2,37],84:[2,37],85:[2,37]},{23:[2,38],33:[2,38],54:[2,38],65:[2,38],68:[2,38],72:[2,38],75:[2,38],80:[2,38],81:[2,38],82:[2,38],83:[2,38],84:[2,38],85:[2,38]},{23:[2,39],33:[2,39],54:[2,39],65:[2,39],68:[2,39],72:[2,39],75:[2,39],80:[2,39],81:[2,39],82:[2,39],83:[2,39],84:[2,39],85:[2,39]},{23:[2,43],33:[2,43],54:[2,43],65:[2,43],68:[2,43],72:[2,43],75:[2,43],80:[2,43],81:[2,43],82:[2,43],83:[2,43],84:[2,43],85:[2,43],87:[1,51]},{72:[1,35],86:52},{23:[2,45],33:[2,45],54:[2,45],65:[2,45],68:[2,45],72:[2,45],75:[2,45],80:[2,45],81:[2,45],82:[2,45],83:[2,45],84:[2,45],85:[2,45],87:[2,45]},{52:53,54:[2,82],65:[2,82],72:[2,82],80:[2,82],81:[2,82],82:[2,82],83:[2,82],84:[2,82],85:[2,82]},{25:54,38:56,39:[1,58],43:57,44:[1,59],45:55,47:[2,54]},{28:60,43:61,44:[1,59],47:[2,56]},{13:63,15:[1,20],18:[1,62]},{15:[2,48],18:[2,48]},{33:[2,86],57:64,65:[2,86],72:[2,86],80:[2,86],81:[2,86],82:[2,86],83:[2,86],84:[2,86],85:[2,86]},{33:[2,40],65:[2,40],72:[2,40],80:[2,40],81:[2,40],82:[2,40],83:[2,40],84:[2,40],85:[2,40]},{33:[2,41],65:[2,41],72:[2,41],80:[2,41],81:[2,41],82:[2,41],83:[2,41],84:[2,41],85:[2,41]},{20:65,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{26:66,47:[1,67]},{30:68,33:[2,58],65:[2,58],72:[2,58],75:[2,58],80:[2,58],81:[2,58],82:[2,58],83:[2,58],84:[2,58],85:[2,58]},{33:[2,64],35:69,65:[2,64],72:[2,64],75:[2,64],80:[2,64],81:[2,64],82:[2,64],83:[2,64],84:[2,64],85:[2,64]},{21:70,23:[2,50],65:[2,50],72:[2,50],80:[2,50],81:[2,50],82:[2,50],83:[2,50],84:[2,50],85:[2,50]},{33:[2,90],61:71,65:[2,90],72:[2,90],80:[2,90],81:[2,90],82:[2,90],83:[2,90],84:[2,90],85:[2,90]},{20:75,33:[2,80],50:72,63:73,64:76,65:[1,44],69:74,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{72:[1,80]},{23:[2,42],33:[2,42],54:[2,42],65:[2,42],68:[2,42],72:[2,42],75:[2,42],80:[2,42],81:[2,42],82:[2,42],83:[2,42],84:[2,42],85:[2,42],87:[1,51]},{20:75,53:81,54:[2,84],63:82,64:76,65:[1,44],69:83,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{26:84,47:[1,67]},{47:[2,55]},{4:85,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],39:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{47:[2,20]},{20:86,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:87,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{26:88,47:[1,67]},{47:[2,57]},{5:[2,11],14:[2,11],15:[2,11],19:[2,11],29:[2,11],34:[2,11],39:[2,11],44:[2,11],47:[2,11],48:[2,11],51:[2,11],55:[2,11],60:[2,11]},{15:[2,49],18:[2,49]},{20:75,33:[2,88],58:89,63:90,64:76,65:[1,44],69:91,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{65:[2,94],66:92,68:[2,94],72:[2,94],80:[2,94],81:[2,94],82:[2,94],83:[2,94],84:[2,94],85:[2,94]},{5:[2,25],14:[2,25],15:[2,25],19:[2,25],29:[2,25],34:[2,25],39:[2,25],44:[2,25],47:[2,25],48:[2,25],51:[2,25],55:[2,25],60:[2,25]},{20:93,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,31:94,33:[2,60],63:95,64:76,65:[1,44],69:96,70:77,71:78,72:[1,79],75:[2,60],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,33:[2,66],36:97,63:98,64:76,65:[1,44],69:99,70:77,71:78,72:[1,79],75:[2,66],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,22:100,23:[2,52],63:101,64:76,65:[1,44],69:102,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,33:[2,92],62:103,63:104,64:76,65:[1,44],69:105,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[1,106]},{33:[2,79],65:[2,79],72:[2,79],80:[2,79],81:[2,79],82:[2,79],83:[2,79],84:[2,79],85:[2,79]},{33:[2,81]},{23:[2,27],33:[2,27],54:[2,27],65:[2,27],68:[2,27],72:[2,27],75:[2,27],80:[2,27],81:[2,27],82:[2,27],83:[2,27],84:[2,27],85:[2,27]},{23:[2,28],33:[2,28],54:[2,28],65:[2,28],68:[2,28],72:[2,28],75:[2,28],80:[2,28],81:[2,28],82:[2,28],83:[2,28],84:[2,28],85:[2,28]},{23:[2,30],33:[2,30],54:[2,30],68:[2,30],71:107,72:[1,108],75:[2,30]},{23:[2,98],33:[2,98],54:[2,98],68:[2,98],72:[2,98],75:[2,98]},{23:[2,45],33:[2,45],54:[2,45],65:[2,45],68:[2,45],72:[2,45],73:[1,109],75:[2,45],80:[2,45],81:[2,45],82:[2,45],83:[2,45],84:[2,45],85:[2,45],87:[2,45]},{23:[2,44],33:[2,44],54:[2,44],65:[2,44],68:[2,44],72:[2,44],75:[2,44],80:[2,44],81:[2,44],82:[2,44],83:[2,44],84:[2,44],85:[2,44],87:[2,44]},{54:[1,110]},{54:[2,83],65:[2,83],72:[2,83],80:[2,83],81:[2,83],82:[2,83],83:[2,83],84:[2,83],85:[2,83]},{54:[2,85]},{5:[2,13],14:[2,13],15:[2,13],19:[2,13],29:[2,13],34:[2,13],39:[2,13],44:[2,13],47:[2,13],48:[2,13],51:[2,13],55:[2,13],60:[2,13]},{38:56,39:[1,58],43:57,44:[1,59],45:112,46:111,47:[2,76]},{33:[2,70],40:113,65:[2,70],72:[2,70],75:[2,70],80:[2,70],81:[2,70],82:[2,70],83:[2,70],84:[2,70],85:[2,70]},{47:[2,18]},{5:[2,14],14:[2,14],15:[2,14],19:[2,14],29:[2,14],34:[2,14],39:[2,14],44:[2,14],47:[2,14],48:[2,14],51:[2,14],55:[2,14],60:[2,14]},{33:[1,114]},{33:[2,87],65:[2,87],72:[2,87],80:[2,87],81:[2,87],82:[2,87],83:[2,87],84:[2,87],85:[2,87]},{33:[2,89]},{20:75,63:116,64:76,65:[1,44],67:115,68:[2,96],69:117,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[1,118]},{32:119,33:[2,62],74:120,75:[1,121]},{33:[2,59],65:[2,59],72:[2,59],75:[2,59],80:[2,59],81:[2,59],82:[2,59],83:[2,59],84:[2,59],85:[2,59]},{33:[2,61],75:[2,61]},{33:[2,68],37:122,74:123,75:[1,121]},{33:[2,65],65:[2,65],72:[2,65],75:[2,65],80:[2,65],81:[2,65],82:[2,65],83:[2,65],84:[2,65],85:[2,65]},{33:[2,67],75:[2,67]},{23:[1,124]},{23:[2,51],65:[2,51],72:[2,51],80:[2,51],81:[2,51],82:[2,51],83:[2,51],84:[2,51],85:[2,51]},{23:[2,53]},{33:[1,125]},{33:[2,91],65:[2,91],72:[2,91],80:[2,91],81:[2,91],82:[2,91],83:[2,91],84:[2,91],85:[2,91]},{33:[2,93]},{5:[2,22],14:[2,22],15:[2,22],19:[2,22],29:[2,22],34:[2,22],39:[2,22],44:[2,22],47:[2,22],48:[2,22],51:[2,22],55:[2,22],60:[2,22]},{23:[2,99],33:[2,99],54:[2,99],68:[2,99],72:[2,99],75:[2,99]},{73:[1,109]},{20:75,63:126,64:76,65:[1,44],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{5:[2,23],14:[2,23],15:[2,23],19:[2,23],29:[2,23],34:[2,23],39:[2,23],44:[2,23],47:[2,23],48:[2,23],51:[2,23],55:[2,23],60:[2,23]},{47:[2,19]},{47:[2,77]},{20:75,33:[2,72],41:127,63:128,64:76,65:[1,44],69:129,70:77,71:78,72:[1,79],75:[2,72],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{5:[2,24],14:[2,24],15:[2,24],19:[2,24],29:[2,24],34:[2,24],39:[2,24],44:[2,24],47:[2,24],48:[2,24],51:[2,24],55:[2,24],60:[2,24]},{68:[1,130]},{65:[2,95],68:[2,95],72:[2,95],80:[2,95],81:[2,95],82:[2,95],83:[2,95],84:[2,95],85:[2,95]},{68:[2,97]},{5:[2,21],14:[2,21],15:[2,21],19:[2,21],29:[2,21],34:[2,21],39:[2,21],44:[2,21],47:[2,21],48:[2,21],51:[2,21],55:[2,21],60:[2,21]},{33:[1,131]},{33:[2,63]},{72:[1,133],76:132},{33:[1,134]},{33:[2,69]},{15:[2,12]},{14:[2,26],15:[2,26],19:[2,26],29:[2,26],34:[2,26],47:[2,26],48:[2,26],51:[2,26],55:[2,26],60:[2,26]},{23:[2,31],33:[2,31],54:[2,31],68:[2,31],72:[2,31],75:[2,31]},{33:[2,74],42:135,74:136,75:[1,121]},{33:[2,71],65:[2,71],72:[2,71],75:[2,71],80:[2,71],81:[2,71],82:[2,71],83:[2,71],84:[2,71],85:[2,71]},{33:[2,73],75:[2,73]},{23:[2,29],33:[2,29],54:[2,29],65:[2,29],68:[2,29],72:[2,29],75:[2,29],80:[2,29],81:[2,29],82:[2,29],83:[2,29],84:[2,29],85:[2,29]},{14:[2,15],15:[2,15],19:[2,15],29:[2,15],34:[2,15],39:[2,15],44:[2,15],47:[2,15],48:[2,15],51:[2,15],55:[2,15],60:[2,15]},{72:[1,138],77:[1,137]},{72:[2,100],77:[2,100]},{14:[2,16],15:[2,16],19:[2,16],29:[2,16],34:[2,16],44:[2,16],47:[2,16],
+48:[2,16],51:[2,16],55:[2,16],60:[2,16]},{33:[1,139]},{33:[2,75]},{33:[2,32]},{72:[2,101],77:[2,101]},{14:[2,17],15:[2,17],19:[2,17],29:[2,17],34:[2,17],39:[2,17],44:[2,17],47:[2,17],48:[2,17],51:[2,17],55:[2,17],60:[2,17]}],defaultActions:{4:[2,1],55:[2,55],57:[2,20],61:[2,57],74:[2,81],83:[2,85],87:[2,18],91:[2,89],102:[2,53],105:[2,93],111:[2,19],112:[2,77],117:[2,97],120:[2,63],123:[2,69],124:[2,12],136:[2,75],137:[2,32]},parseError:function(a,b){throw new Error(a)},parse:function(a){function b(){var a;return a=c.lexer.lex()||1,"number"!=typeof a&&(a=c.symbols_[a]||a),a}var c=this,d=[0],e=[null],f=[],g=this.table,h="",i=0,j=0,k=0;this.lexer.setInput(a),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,this.yy.parser=this,"undefined"==typeof this.lexer.yylloc&&(this.lexer.yylloc={});var l=this.lexer.yylloc;f.push(l);var m=this.lexer.options&&this.lexer.options.ranges;"function"==typeof this.yy.parseError&&(this.parseError=this.yy.parseError);for(var n,o,p,q,r,s,t,u,v,w={};;){if(p=d[d.length-1],this.defaultActions[p]?q=this.defaultActions[p]:((null===n||"undefined"==typeof n)&&(n=b()),q=g[p]&&g[p][n]),"undefined"==typeof q||!q.length||!q[0]){var x="";if(!k){v=[];for(s in g[p])this.terminals_[s]&&s>2&&v.push("'"+this.terminals_[s]+"'");x=this.lexer.showPosition?"Parse error on line "+(i+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+v.join(", ")+", got '"+(this.terminals_[n]||n)+"'":"Parse error on line "+(i+1)+": Unexpected "+(1==n?"end of input":"'"+(this.terminals_[n]||n)+"'"),this.parseError(x,{text:this.lexer.match,token:this.terminals_[n]||n,line:this.lexer.yylineno,loc:l,expected:v})}}if(q[0]instanceof Array&&q.length>1)throw new Error("Parse Error: multiple actions possible at state: "+p+", token: "+n);switch(q[0]){case 1:d.push(n),e.push(this.lexer.yytext),f.push(this.lexer.yylloc),d.push(q[1]),n=null,o?(n=o,o=null):(j=this.lexer.yyleng,h=this.lexer.yytext,i=this.lexer.yylineno,l=this.lexer.yylloc,k>0&&k--);break;case 2:if(t=this.productions_[q[1]][1],w.$=e[e.length-t],w._$={first_line:f[f.length-(t||1)].first_line,last_line:f[f.length-1].last_line,first_column:f[f.length-(t||1)].first_column,last_column:f[f.length-1].last_column},m&&(w._$.range=[f[f.length-(t||1)].range[0],f[f.length-1].range[1]]),r=this.performAction.call(w,h,j,i,this.yy,q[1],e,f),"undefined"!=typeof r)return r;t&&(d=d.slice(0,-1*t*2),e=e.slice(0,-1*t),f=f.slice(0,-1*t)),d.push(this.productions_[q[1]][0]),e.push(w.$),f.push(w._$),u=g[d[d.length-2]][d[d.length-1]],d.push(u);break;case 3:return!0}}return!0}},c=function(){var a={EOF:1,parseError:function(a,b){if(!this.yy.parser)throw new Error(a);this.yy.parser.parseError(a,b)},setInput:function(a){return this._input=a,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var a=this._input[0];this.yytext+=a,this.yyleng++,this.offset++,this.match+=a,this.matched+=a;var b=a.match(/(?:\r\n?|\n).*/g);return b?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),a},unput:function(a){var b=a.length,c=a.split(/(?:\r\n?|\n)/g);this._input=a+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-b-1),this.offset-=b;var d=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),c.length-1&&(this.yylineno-=c.length-1);var e=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:c?(c.length===d.length?this.yylloc.first_column:0)+d[d.length-c.length].length-c[0].length:this.yylloc.first_column-b},this.options.ranges&&(this.yylloc.range=[e[0],e[0]+this.yyleng-b]),this},more:function(){return this._more=!0,this},less:function(a){this.unput(this.match.slice(a))},pastInput:function(){var a=this.matched.substr(0,this.matched.length-this.match.length);return(a.length>20?"...":"")+a.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var a=this.match;return a.length<20&&(a+=this._input.substr(0,20-a.length)),(a.substr(0,20)+(a.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var a=this.pastInput(),b=new Array(a.length+1).join("-");return a+this.upcomingInput()+"\n"+b+"^"},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var a,b,c,d,e;this._more||(this.yytext="",this.match="");for(var f=this._currentRules(),g=0;gb[0].length)||(b=c,d=g,this.options.flex));g++);return b?(e=b[0].match(/(?:\r\n?|\n).*/g),e&&(this.yylineno+=e.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:e?e[e.length-1].length-e[e.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+b[0].length},this.yytext+=b[0],this.match+=b[0],this.matches=b,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._input=this._input.slice(b[0].length),this.matched+=b[0],a=this.performAction.call(this,this.yy,this,f[d],this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),a?a:void 0):""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var a=this.next();return"undefined"!=typeof a?a:this.lex()},begin:function(a){this.conditionStack.push(a)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(a){this.begin(a)}};return a.options={},a.performAction=function(a,b,c,d){function e(a,c){return b.yytext=b.yytext.substr(a,b.yyleng-c)}switch(c){case 0:if("\\\\"===b.yytext.slice(-2)?(e(0,1),this.begin("mu")):"\\"===b.yytext.slice(-1)?(e(0,1),this.begin("emu")):this.begin("mu"),b.yytext)return 15;break;case 1:return 15;case 2:return this.popState(),15;case 3:return this.begin("raw"),15;case 4:return this.popState(),"raw"===this.conditionStack[this.conditionStack.length-1]?15:(b.yytext=b.yytext.substr(5,b.yyleng-9),"END_RAW_BLOCK");case 5:return 15;case 6:return this.popState(),14;case 7:return 65;case 8:return 68;case 9:return 19;case 10:return this.popState(),this.begin("raw"),23;case 11:return 55;case 12:return 60;case 13:return 29;case 14:return 47;case 15:return this.popState(),44;case 16:return this.popState(),44;case 17:return 34;case 18:return 39;case 19:return 51;case 20:return 48;case 21:this.unput(b.yytext),this.popState(),this.begin("com");break;case 22:return this.popState(),14;case 23:return 48;case 24:return 73;case 25:return 72;case 26:return 72;case 27:return 87;case 28:break;case 29:return this.popState(),54;case 30:return this.popState(),33;case 31:return b.yytext=e(1,2).replace(/\\"/g,'"'),80;case 32:return b.yytext=e(1,2).replace(/\\'/g,"'"),80;case 33:return 85;case 34:return 82;case 35:return 82;case 36:return 83;case 37:return 84;case 38:return 81;case 39:return 75;case 40:return 77;case 41:return 72;case 42:return b.yytext=b.yytext.replace(/\\([\\\]])/g,"$1"),72;case 43:return"INVALID";case 44:return 5}},a.rules=[/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/,/^(?:\{\{\{\{(?=[^\/]))/,/^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/,/^(?:[^\x00]*?(?=(\{\{\{\{)))/,/^(?:[\s\S]*?--(~)?\}\})/,/^(?:\()/,/^(?:\))/,/^(?:\{\{\{\{)/,/^(?:\}\}\}\})/,/^(?:\{\{(~)?>)/,/^(?:\{\{(~)?#>)/,/^(?:\{\{(~)?#\*?)/,/^(?:\{\{(~)?\/)/,/^(?:\{\{(~)?\^\s*(~)?\}\})/,/^(?:\{\{(~)?\s*else\s*(~)?\}\})/,/^(?:\{\{(~)?\^)/,/^(?:\{\{(~)?\s*else\b)/,/^(?:\{\{(~)?\{)/,/^(?:\{\{(~)?&)/,/^(?:\{\{(~)?!--)/,/^(?:\{\{(~)?![\s\S]*?\}\})/,/^(?:\{\{(~)?\*?)/,/^(?:=)/,/^(?:\.\.)/,/^(?:\.(?=([=~}\s\/.)|])))/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}(~)?\}\})/,/^(?:(~)?\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=([~}\s)])))/,/^(?:false(?=([~}\s)])))/,/^(?:undefined(?=([~}\s)])))/,/^(?:null(?=([~}\s)])))/,/^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/,/^(?:as\s+\|)/,/^(?:\|)/,/^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/,/^(?:\[(\\\]|[^\]])*\])/,/^(?:.)/,/^(?:$)/],a.conditions={mu:{rules:[7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44],inclusive:!1},emu:{rules:[2],inclusive:!1},com:{rules:[6],inclusive:!1},raw:{rules:[3,4,5],inclusive:!1},INITIAL:{rules:[0,1,44],inclusive:!0}},a}();return b.lexer=c,a.prototype=b,b.Parser=a,new a}();b.__esModule=!0,b["default"]=c},function(a,b,c){"use strict";function d(){var a=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];this.options=a}function e(a,b,c){void 0===b&&(b=a.length);var d=a[b-1],e=a[b-2];return d?"ContentStatement"===d.type?(e||!c?/\r?\n\s*?$/:/(^|\r?\n)\s*?$/).test(d.original):void 0:c}function f(a,b,c){void 0===b&&(b=-1);var d=a[b+1],e=a[b+2];return d?"ContentStatement"===d.type?(e||!c?/^\s*?\r?\n/:/^\s*?(\r?\n|$)/).test(d.original):void 0:c}function g(a,b,c){var d=a[null==b?0:b+1];if(d&&"ContentStatement"===d.type&&(c||!d.rightStripped)){var e=d.value;d.value=d.value.replace(c?/^\s+/:/^[ \t]*\r?\n?/,""),d.rightStripped=d.value!==e}}function h(a,b,c){var d=a[null==b?a.length-1:b-1];if(d&&"ContentStatement"===d.type&&(c||!d.leftStripped)){var e=d.value;return d.value=d.value.replace(c?/\s+$/:/[ \t]+$/,""),d.leftStripped=d.value!==e,d.leftStripped}}var i=c(1)["default"];b.__esModule=!0;var j=c(25),k=i(j);d.prototype=new k["default"],d.prototype.Program=function(a){var b=!this.options.ignoreStandalone,c=!this.isRootSeen;this.isRootSeen=!0;for(var d=a.body,i=0,j=d.length;j>i;i++){var k=d[i],l=this.accept(k);if(l){var m=e(d,i,c),n=f(d,i,c),o=l.openStandalone&&m,p=l.closeStandalone&&n,q=l.inlineStandalone&&m&&n;l.close&&g(d,i,!0),l.open&&h(d,i,!0),b&&q&&(g(d,i),h(d,i)&&"PartialStatement"===k.type&&(k.indent=/([ \t]+$)/.exec(d[i-1].original)[1])),b&&o&&(g((k.program||k.inverse).body),h(d,i)),b&&p&&(g(d,i),h((k.inverse||k.program).body))}}return a},d.prototype.BlockStatement=d.prototype.DecoratorBlock=d.prototype.PartialBlockStatement=function(a){this.accept(a.program),this.accept(a.inverse);var b=a.program||a.inverse,c=a.program&&a.inverse,d=c,i=c;if(c&&c.chained)for(d=c.body[0].program;i.chained;)i=i.body[i.body.length-1].program;var j={open:a.openStrip.open,close:a.closeStrip.close,openStandalone:f(b.body),closeStandalone:e((d||b).body)};if(a.openStrip.close&&g(b.body,null,!0),c){var k=a.inverseStrip;k.open&&h(b.body,null,!0),k.close&&g(d.body,null,!0),a.closeStrip.open&&h(i.body,null,!0),!this.options.ignoreStandalone&&e(b.body)&&f(d.body)&&(h(b.body),g(d.body))}else a.closeStrip.open&&h(b.body,null,!0);return j},d.prototype.Decorator=d.prototype.MustacheStatement=function(a){return a.strip},d.prototype.PartialStatement=d.prototype.CommentStatement=function(a){var b=a.strip||{};return{inlineStandalone:!0,open:b.open,close:b.close}},b["default"]=d,a.exports=b["default"]},function(a,b,c){"use strict";function d(){this.parents=[]}function e(a){this.acceptRequired(a,"path"),this.acceptArray(a.params),this.acceptKey(a,"hash")}function f(a){e.call(this,a),this.acceptKey(a,"program"),this.acceptKey(a,"inverse")}function g(a){this.acceptRequired(a,"name"),this.acceptArray(a.params),this.acceptKey(a,"hash")}var h=c(1)["default"];b.__esModule=!0;var i=c(6),j=h(i);d.prototype={constructor:d,mutating:!1,acceptKey:function(a,b){var c=this.accept(a[b]);if(this.mutating){if(c&&!d.prototype[c.type])throw new j["default"]('Unexpected node type "'+c.type+'" found when accepting '+b+" on "+a.type);a[b]=c}},acceptRequired:function(a,b){if(this.acceptKey(a,b),!a[b])throw new j["default"](a.type+" requires "+b)},acceptArray:function(a){for(var b=0,c=a.length;c>b;b++)this.acceptKey(a,b),a[b]||(a.splice(b,1),b--,c--)},accept:function(a){if(a){if(!this[a.type])throw new j["default"]("Unknown type: "+a.type,a);this.current&&this.parents.unshift(this.current),this.current=a;var b=this[a.type](a);return this.current=this.parents.shift(),!this.mutating||b?b:b!==!1?a:void 0}},Program:function(a){this.acceptArray(a.body)},MustacheStatement:e,Decorator:e,BlockStatement:f,DecoratorBlock:f,PartialStatement:g,PartialBlockStatement:function(a){g.call(this,a),this.acceptKey(a,"program")},ContentStatement:function(){},CommentStatement:function(){},SubExpression:e,PathExpression:function(){},StringLiteral:function(){},NumberLiteral:function(){},BooleanLiteral:function(){},UndefinedLiteral:function(){},NullLiteral:function(){},Hash:function(a){this.acceptArray(a.pairs)},HashPair:function(a){this.acceptRequired(a,"value")}},b["default"]=d,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b){if(b=b.path?b.path.original:b,a.path.original!==b){var c={loc:a.path.loc};throw new q["default"](a.path.original+" doesn't match "+b,c)}}function e(a,b){this.source=a,this.start={line:b.first_line,column:b.first_column},this.end={line:b.last_line,column:b.last_column}}function f(a){return/^\[.*\]$/.test(a)?a.substr(1,a.length-2):a}function g(a,b){return{open:"~"===a.charAt(2),close:"~"===b.charAt(b.length-3)}}function h(a){return a.replace(/^\{\{~?\!-?-?/,"").replace(/-?-?~?\}\}$/,"")}function i(a,b,c){c=this.locInfo(c);for(var d=a?"@":"",e=[],f=0,g="",h=0,i=b.length;i>h;h++){var j=b[h].part,k=b[h].original!==j;if(d+=(b[h].separator||"")+j,k||".."!==j&&"."!==j&&"this"!==j)e.push(j);else{if(e.length>0)throw new q["default"]("Invalid path: "+d,{loc:c});".."===j&&(f++,g+="../")}}return{type:"PathExpression",data:a,depth:f,parts:e,original:d,loc:c}}function j(a,b,c,d,e,f){var g=d.charAt(3)||d.charAt(2),h="{"!==g&&"&"!==g,i=/\*/.test(d);return{type:i?"Decorator":"MustacheStatement",path:a,params:b,hash:c,escaped:h,strip:e,loc:this.locInfo(f)}}function k(a,b,c,e){d(a,c),e=this.locInfo(e);var f={type:"Program",body:b,strip:{},loc:e};return{type:"BlockStatement",path:a.path,params:a.params,hash:a.hash,program:f,openStrip:{},inverseStrip:{},closeStrip:{},loc:e}}function l(a,b,c,e,f,g){e&&e.path&&d(a,e);var h=/\*/.test(a.open);b.blockParams=a.blockParams;var i=void 0,j=void 0;if(c){if(h)throw new q["default"]("Unexpected inverse block on decorator",c);c.chain&&(c.program.body[0].closeStrip=e.strip),j=c.strip,i=c.program}return f&&(f=i,i=b,b=f),{type:h?"DecoratorBlock":"BlockStatement",path:a.path,params:a.params,hash:a.hash,program:b,inverse:i,openStrip:a.strip,inverseStrip:j,closeStrip:e&&e.strip,loc:this.locInfo(g)}}function m(a,b){if(!b&&a.length){var c=a[0].loc,d=a[a.length-1].loc;c&&d&&(b={source:c.source,start:{line:c.start.line,column:c.start.column},end:{line:d.end.line,column:d.end.column}})}return{type:"Program",body:a,strip:{},loc:b}}function n(a,b,c,e){return d(a,c),{type:"PartialBlockStatement",name:a.path,params:a.params,hash:a.hash,program:b,openStrip:a.strip,closeStrip:c&&c.strip,loc:this.locInfo(e)}}var o=c(1)["default"];b.__esModule=!0,b.SourceLocation=e,b.id=f,b.stripFlags=g,b.stripComment=h,b.preparePath=i,b.prepareMustache=j,b.prepareRawBlock=k,b.prepareBlock=l,b.prepareProgram=m,b.preparePartialBlock=n;var p=c(6),q=o(p)},function(a,b,c){"use strict";function d(){}function e(a,b,c){if(null==a||"string"!=typeof a&&"Program"!==a.type)throw new k["default"]("You must pass a string or Handlebars AST to Handlebars.precompile. You passed "+a);b=b||{},"data"in b||(b.data=!0),b.compat&&(b.useDepths=!0);var d=c.parse(a,b),e=(new c.Compiler).compile(d,b);return(new c.JavaScriptCompiler).compile(e,b)}function f(a,b,c){function d(){var d=c.parse(a,b),e=(new c.Compiler).compile(d,b),f=(new c.JavaScriptCompiler).compile(e,b,void 0,!0);return c.template(f)}function e(a,b){return f||(f=d()),f.call(this,a,b)}if(void 0===b&&(b={}),null==a||"string"!=typeof a&&"Program"!==a.type)throw new k["default"]("You must pass a string or Handlebars AST to Handlebars.compile. You passed "+a);"data"in b||(b.data=!0),b.compat&&(b.useDepths=!0);var f=void 0;return e._setup=function(a){return f||(f=d()),f._setup(a)},e._child=function(a,b,c,e){return f||(f=d()),f._child(a,b,c,e)},e}function g(a,b){if(a===b)return!0;if(l.isArray(a)&&l.isArray(b)&&a.length===b.length){for(var c=0;cc;c++){var d=this.opcodes[c],e=a.opcodes[c];if(d.opcode!==e.opcode||!g(d.args,e.args))return!1}b=this.children.length;for(var c=0;b>c;c++)if(!this.children[c].equals(a.children[c]))return!1;return!0},guid:0,compile:function(a,b){this.sourceNode=[],this.opcodes=[],this.children=[],this.options=b,this.stringParams=b.stringParams,this.trackIds=b.trackIds,b.blockParams=b.blockParams||[];var c=b.knownHelpers;if(b.knownHelpers={helperMissing:!0,blockHelperMissing:!0,each:!0,"if":!0,unless:!0,"with":!0,log:!0,lookup:!0},c)for(var d in c)d in c&&(b.knownHelpers[d]=c[d]);return this.accept(a)},compileProgram:function(a){var b=new this.compiler,c=b.compile(a,this.options),d=this.guid++;return this.usePartial=this.usePartial||c.usePartial,this.children[d]=c,this.useDepths=this.useDepths||c.useDepths,d},accept:function(a){if(!this[a.type])throw new k["default"]("Unknown type: "+a.type,a);this.sourceNode.unshift(a);var b=this[a.type](a);return this.sourceNode.shift(),b},Program:function(a){this.options.blockParams.unshift(a.blockParams);for(var b=a.body,c=b.length,d=0;c>d;d++)this.accept(b[d]);return this.options.blockParams.shift(),this.isSimple=1===c,this.blockParams=a.blockParams?a.blockParams.length:0,this},BlockStatement:function(a){h(a);var b=a.program,c=a.inverse;b=b&&this.compileProgram(b),c=c&&this.compileProgram(c);var d=this.classifySexpr(a);"helper"===d?this.helperSexpr(a,b,c):"simple"===d?(this.simpleSexpr(a),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.opcode("emptyHash"),this.opcode("blockValue",a.path.original)):(this.ambiguousSexpr(a,b,c),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.opcode("emptyHash"),this.opcode("ambiguousBlockValue")),this.opcode("append")},DecoratorBlock:function(a){var b=a.program&&this.compileProgram(a.program),c=this.setupFullMustacheParams(a,b,void 0),d=a.path;this.useDecorators=!0,this.opcode("registerDecorator",c.length,d.original)},PartialStatement:function(a){this.usePartial=!0;var b=a.program;b&&(b=this.compileProgram(a.program));var c=a.params;if(c.length>1)throw new k["default"]("Unsupported number of partial arguments: "+c.length,a);c.length||(this.options.explicitPartialContext?this.opcode("pushLiteral","undefined"):c.push({type:"PathExpression",parts:[],depth:0}));var d=a.name.original,e="SubExpression"===a.name.type;e&&this.accept(a.name),this.setupFullMustacheParams(a,b,void 0,!0);var f=a.indent||"";this.options.preventIndent&&f&&(this.opcode("appendContent",f),f=""),this.opcode("invokePartial",e,d,f),this.opcode("append")},PartialBlockStatement:function(a){this.PartialStatement(a)},MustacheStatement:function(a){this.SubExpression(a),a.escaped&&!this.options.noEscape?this.opcode("appendEscaped"):this.opcode("append")},Decorator:function(a){this.DecoratorBlock(a)},ContentStatement:function(a){a.value&&this.opcode("appendContent",a.value)},CommentStatement:function(){},SubExpression:function(a){h(a);var b=this.classifySexpr(a);"simple"===b?this.simpleSexpr(a):"helper"===b?this.helperSexpr(a):this.ambiguousSexpr(a)},ambiguousSexpr:function(a,b,c){var d=a.path,e=d.parts[0],f=null!=b||null!=c;this.opcode("getContext",d.depth),this.opcode("pushProgram",b),this.opcode("pushProgram",c),d.strict=!0,this.accept(d),this.opcode("invokeAmbiguous",e,f)},simpleSexpr:function(a){var b=a.path;b.strict=!0,this.accept(b),this.opcode("resolvePossibleLambda")},helperSexpr:function(a,b,c){var d=this.setupFullMustacheParams(a,b,c),e=a.path,f=e.parts[0];if(this.options.knownHelpers[f])this.opcode("invokeKnownHelper",d.length,f);else{if(this.options.knownHelpersOnly)throw new k["default"]("You specified knownHelpersOnly, but used the unknown helper "+f,a);e.strict=!0,e.falsy=!0,this.accept(e),this.opcode("invokeHelper",d.length,e.original,n["default"].helpers.simpleId(e))}},PathExpression:function(a){this.addDepth(a.depth),this.opcode("getContext",a.depth);var b=a.parts[0],c=n["default"].helpers.scopedId(a),d=!a.depth&&!c&&this.blockParamIndex(b);d?this.opcode("lookupBlockParam",d,a.parts):b?a.data?(this.options.data=!0,this.opcode("lookupData",a.depth,a.parts,a.strict)):this.opcode("lookupOnContext",a.parts,a.falsy,a.strict,c):this.opcode("pushContext")},StringLiteral:function(a){this.opcode("pushString",a.value)},NumberLiteral:function(a){this.opcode("pushLiteral",a.value)},BooleanLiteral:function(a){this.opcode("pushLiteral",a.value)},UndefinedLiteral:function(){this.opcode("pushLiteral","undefined")},NullLiteral:function(){this.opcode("pushLiteral","null")},Hash:function(a){var b=a.pairs,c=0,d=b.length;for(this.opcode("pushHash");d>c;c++)this.pushParam(b[c].value);for(;c--;)this.opcode("assignToHash",b[c].key);this.opcode("popHash")},opcode:function(a){this.opcodes.push({opcode:a,args:o.call(arguments,1),loc:this.sourceNode[0].loc})},addDepth:function(a){a&&(this.useDepths=!0)},classifySexpr:function(a){var b=n["default"].helpers.simpleId(a.path),c=b&&!!this.blockParamIndex(a.path.parts[0]),d=!c&&n["default"].helpers.helperExpression(a),e=!c&&(d||b);if(e&&!d){var f=a.path.parts[0],g=this.options;g.knownHelpers[f]?d=!0:g.knownHelpersOnly&&(e=!1)}return d?"helper":e?"ambiguous":"simple"},pushParams:function(a){for(var b=0,c=a.length;c>b;b++)this.pushParam(a[b])},pushParam:function(a){var b=null!=a.value?a.value:a.original||"";if(this.stringParams)b.replace&&(b=b.replace(/^(\.?\.\/)*/g,"").replace(/\//g,".")),a.depth&&this.addDepth(a.depth),this.opcode("getContext",a.depth||0),this.opcode("pushStringParam",b,a.type),"SubExpression"===a.type&&this.accept(a);else{if(this.trackIds){var c=void 0;if(!a.parts||n["default"].helpers.scopedId(a)||a.depth||(c=this.blockParamIndex(a.parts[0])),c){var d=a.parts.slice(1).join(".");this.opcode("pushId","BlockParam",c,d)}else b=a.original||b,b.replace&&(b=b.replace(/^this(?:\.|$)/,"").replace(/^\.\//,"").replace(/^\.$/,"")),this.opcode("pushId",a.type,b)}this.accept(a)}},setupFullMustacheParams:function(a,b,c,d){var e=a.params;return this.pushParams(e),this.opcode("pushProgram",b),this.opcode("pushProgram",c),a.hash?this.accept(a.hash):this.opcode("emptyHash",d),e},blockParamIndex:function(a){for(var b=0,c=this.options.blockParams.length;c>b;b++){var d=this.options.blockParams[b],e=d&&l.indexOf(d,a);if(d&&e>=0)return[b,e]}}}},function(a,b,c){"use strict";function d(a){this.value=a}function e(){}function f(a,b,c,d){var e=b.popStack(),f=0,g=c.length;for(a&&g--;g>f;f++)e=b.nameLookup(e,c[f],d);return a?[b.aliasable("container.strict"),"(",e,", ",b.quotedString(c[f]),")"]:e}var g=c(1)["default"];b.__esModule=!0;var h=c(4),i=c(6),j=g(i),k=c(5),l=c(29),m=g(l);e.prototype={nameLookup:function(a,b){return e.isValidJavaScriptVariableName(b)?[a,".",b]:[a,"[",JSON.stringify(b),"]"]},depthedLookup:function(a){return[this.aliasable("container.lookup"),'(depths, "',a,'")']},compilerInfo:function(){var a=h.COMPILER_REVISION,b=h.REVISION_CHANGES[a];return[a,b]},appendToBuffer:function(a,b,c){return k.isArray(a)||(a=[a]),a=this.source.wrap(a,b),this.environment.isSimple?["return ",a,";"]:c?["buffer += ",a,";"]:(a.appendToBuffer=!0,a)},initializeBuffer:function(){return this.quotedString("")},compile:function(a,b,c,d){this.environment=a,this.options=b,this.stringParams=this.options.stringParams,this.trackIds=this.options.trackIds,this.precompile=!d,this.name=this.environment.name,this.isChild=!!c,this.context=c||{decorators:[],programs:[],environments:[]},this.preamble(),this.stackSlot=0,this.stackVars=[],this.aliases={},this.registers={list:[]},this.hashes=[],this.compileStack=[],this.inlineStack=[],this.blockParams=[],this.compileChildren(a,b),this.useDepths=this.useDepths||a.useDepths||a.useDecorators||this.options.compat,this.useBlockParams=this.useBlockParams||a.useBlockParams;var e=a.opcodes,f=void 0,g=void 0,h=void 0,i=void 0;for(h=0,i=e.length;i>h;h++)f=e[h],this.source.currentLocation=f.loc,g=g||f.loc,this[f.opcode].apply(this,f.args);if(this.source.currentLocation=g,this.pushSource(""),this.stackSlot||this.inlineStack.length||this.compileStack.length)throw new j["default"]("Compile completed with content left on stack");this.decorators.isEmpty()?this.decorators=void 0:(this.useDecorators=!0,this.decorators.prepend("var decorators = container.decorators;\n"),this.decorators.push("return fn;"),d?this.decorators=Function.apply(this,["fn","props","container","depth0","data","blockParams","depths",this.decorators.merge()]):(this.decorators.prepend("function(fn, props, container, depth0, data, blockParams, depths) {\n"),this.decorators.push("}\n"),this.decorators=this.decorators.merge()));var k=this.createFunctionContext(d);if(this.isChild)return k;var l={compiler:this.compilerInfo(),main:k};this.decorators&&(l.main_d=this.decorators,l.useDecorators=!0);var m=this.context,n=m.programs,o=m.decorators;for(h=0,i=n.length;i>h;h++)n[h]&&(l[h]=n[h],o[h]&&(l[h+"_d"]=o[h],l.useDecorators=!0));return this.environment.usePartial&&(l.usePartial=!0),this.options.data&&(l.useData=!0),this.useDepths&&(l.useDepths=!0),this.useBlockParams&&(l.useBlockParams=!0),this.options.compat&&(l.compat=!0),d?l.compilerOptions=this.options:(l.compiler=JSON.stringify(l.compiler),this.source.currentLocation={start:{line:1,column:0}},l=this.objectLiteral(l),b.srcName?(l=l.toStringWithSourceMap({file:b.destName}),l.map=l.map&&l.map.toString()):l=l.toString()),l},preamble:function(){this.lastContext=0,this.source=new m["default"](this.options.srcName),this.decorators=new m["default"](this.options.srcName)},createFunctionContext:function(a){var b="",c=this.stackVars.concat(this.registers.list);c.length>0&&(b+=", "+c.join(", "));var d=0;for(var e in this.aliases){var f=this.aliases[e];this.aliases.hasOwnProperty(e)&&f.children&&f.referenceCount>1&&(b+=", alias"+ ++d+"="+e,f.children[0]="alias"+d)}var g=["container","depth0","helpers","partials","data"];(this.useBlockParams||this.useDepths)&&g.push("blockParams"),this.useDepths&&g.push("depths");var h=this.mergeSource(b);return a?(g.push(h),Function.apply(this,g)):this.source.wrap(["function(",g.join(","),") {\n ",h,"}"])},mergeSource:function(a){var b=this.environment.isSimple,c=!this.forceBuffer,d=void 0,e=void 0,f=void 0,g=void 0;return this.source.each(function(a){a.appendToBuffer?(f?a.prepend(" + "):f=a,g=a):(f&&(e?f.prepend("buffer += "):d=!0,g.add(";"),f=g=void 0),e=!0,b||(c=!1))}),c?f?(f.prepend("return "),g.add(";")):e||this.source.push('return "";'):(a+=", buffer = "+(d?"":this.initializeBuffer()),f?(f.prepend("return buffer + "),g.add(";")):this.source.push("return buffer;")),a&&this.source.prepend("var "+a.substring(2)+(d?"":";\n")),this.source.merge()},blockValue:function(a){var b=this.aliasable("helpers.blockHelperMissing"),c=[this.contextName(0)];this.setupHelperArgs(a,0,c);var d=this.popStack();c.splice(1,0,d),this.push(this.source.functionCall(b,"call",c))},ambiguousBlockValue:function(){var a=this.aliasable("helpers.blockHelperMissing"),b=[this.contextName(0)];this.setupHelperArgs("",0,b,!0),this.flushInline();var c=this.topStack();b.splice(1,0,c),this.pushSource(["if (!",this.lastHelper,") { ",c," = ",this.source.functionCall(a,"call",b),"}"])},appendContent:function(a){this.pendingContent?a=this.pendingContent+a:this.pendingLocation=this.source.currentLocation,this.pendingContent=a},append:function(){if(this.isInline())this.replaceStack(function(a){return[" != null ? ",a,' : ""']}),this.pushSource(this.appendToBuffer(this.popStack()));else{var a=this.popStack();this.pushSource(["if (",a," != null) { ",this.appendToBuffer(a,void 0,!0)," }"]),this.environment.isSimple&&this.pushSource(["else { ",this.appendToBuffer("''",void 0,!0)," }"])}},appendEscaped:function(){this.pushSource(this.appendToBuffer([this.aliasable("container.escapeExpression"),"(",this.popStack(),")"]))},getContext:function(a){this.lastContext=a},pushContext:function(){this.pushStackLiteral(this.contextName(this.lastContext))},lookupOnContext:function(a,b,c,d){var e=0;d||!this.options.compat||this.lastContext?this.pushContext():this.push(this.depthedLookup(a[e++])),this.resolvePath("context",a,e,b,c)},lookupBlockParam:function(a,b){this.useBlockParams=!0,this.push(["blockParams[",a[0],"][",a[1],"]"]),this.resolvePath("context",b,1)},lookupData:function(a,b,c){a?this.pushStackLiteral("container.data(data, "+a+")"):this.pushStackLiteral("data"),this.resolvePath("data",b,0,!0,c)},resolvePath:function(a,b,c,d,e){var g=this;if(this.options.strict||this.options.assumeObjects)return void this.push(f(this.options.strict&&e,this,b,a));for(var h=b.length;h>c;c++)this.replaceStack(function(e){var f=g.nameLookup(e,b[c],a);return d?[" && ",f]:[" != null ? ",f," : ",e]})},resolvePossibleLambda:function(){this.push([this.aliasable("container.lambda"),"(",this.popStack(),", ",this.contextName(0),")"])},pushStringParam:function(a,b){this.pushContext(),this.pushString(b),"SubExpression"!==b&&("string"==typeof a?this.pushString(a):this.pushStackLiteral(a))},emptyHash:function(a){this.trackIds&&this.push("{}"),this.stringParams&&(this.push("{}"),this.push("{}")),this.pushStackLiteral(a?"undefined":"{}")},pushHash:function(){this.hash&&this.hashes.push(this.hash),this.hash={values:[],types:[],contexts:[],ids:[]}},popHash:function(){var a=this.hash;this.hash=this.hashes.pop(),this.trackIds&&this.push(this.objectLiteral(a.ids)),this.stringParams&&(this.push(this.objectLiteral(a.contexts)),this.push(this.objectLiteral(a.types))),this.push(this.objectLiteral(a.values))},pushString:function(a){this.pushStackLiteral(this.quotedString(a))},pushLiteral:function(a){this.pushStackLiteral(a)},pushProgram:function(a){null!=a?this.pushStackLiteral(this.programExpression(a)):this.pushStackLiteral(null)},registerDecorator:function(a,b){var c=this.nameLookup("decorators",b,"decorator"),d=this.setupHelperArgs(b,a);this.decorators.push(["fn = ",this.decorators.functionCall(c,"",["fn","props","container",d])," || fn;"])},invokeHelper:function(a,b,c){var d=this.popStack(),e=this.setupHelper(a,b),f=c?[e.name," || "]:"",g=["("].concat(f,d);this.options.strict||g.push(" || ",this.aliasable("helpers.helperMissing")),g.push(")"),this.push(this.source.functionCall(g,"call",e.callParams))},invokeKnownHelper:function(a,b){var c=this.setupHelper(a,b);this.push(this.source.functionCall(c.name,"call",c.callParams))},invokeAmbiguous:function(a,b){this.useRegister("helper");var c=this.popStack();this.emptyHash();var d=this.setupHelper(0,a,b),e=this.lastHelper=this.nameLookup("helpers",a,"helper"),f=["(","(helper = ",e," || ",c,")"];this.options.strict||(f[0]="(helper = ",f.push(" != null ? helper : ",this.aliasable("helpers.helperMissing"))),this.push(["(",f,d.paramsInit?["),(",d.paramsInit]:[],"),","(typeof helper === ",this.aliasable('"function"')," ? ",this.source.functionCall("helper","call",d.callParams)," : helper))"])},invokePartial:function(a,b,c){var d=[],e=this.setupParams(b,1,d);a&&(b=this.popStack(),delete e.name),c&&(e.indent=JSON.stringify(c)),e.helpers="helpers",e.partials="partials",e.decorators="container.decorators",a?d.unshift(b):d.unshift(this.nameLookup("partials",b,"partial")),this.options.compat&&(e.depths="depths"),e=this.objectLiteral(e),
+d.push(e),this.push(this.source.functionCall("container.invokePartial","",d))},assignToHash:function(a){var b=this.popStack(),c=void 0,d=void 0,e=void 0;this.trackIds&&(e=this.popStack()),this.stringParams&&(d=this.popStack(),c=this.popStack());var f=this.hash;c&&(f.contexts[a]=c),d&&(f.types[a]=d),e&&(f.ids[a]=e),f.values[a]=b},pushId:function(a,b,c){"BlockParam"===a?this.pushStackLiteral("blockParams["+b[0]+"].path["+b[1]+"]"+(c?" + "+JSON.stringify("."+c):"")):"PathExpression"===a?this.pushString(b):"SubExpression"===a?this.pushStackLiteral("true"):this.pushStackLiteral("null")},compiler:e,compileChildren:function(a,b){for(var c=a.children,d=void 0,e=void 0,f=0,g=c.length;g>f;f++){d=c[f],e=new this.compiler;var h=this.matchExistingProgram(d);null==h?(this.context.programs.push(""),h=this.context.programs.length,d.index=h,d.name="program"+h,this.context.programs[h]=e.compile(d,b,this.context,!this.precompile),this.context.decorators[h]=e.decorators,this.context.environments[h]=d,this.useDepths=this.useDepths||e.useDepths,this.useBlockParams=this.useBlockParams||e.useBlockParams):(d.index=h,d.name="program"+h,this.useDepths=this.useDepths||d.useDepths,this.useBlockParams=this.useBlockParams||d.useBlockParams)}},matchExistingProgram:function(a){for(var b=0,c=this.context.environments.length;c>b;b++){var d=this.context.environments[b];if(d&&d.equals(a))return b}},programExpression:function(a){var b=this.environment.children[a],c=[b.index,"data",b.blockParams];return(this.useBlockParams||this.useDepths)&&c.push("blockParams"),this.useDepths&&c.push("depths"),"container.program("+c.join(", ")+")"},useRegister:function(a){this.registers[a]||(this.registers[a]=!0,this.registers.list.push(a))},push:function(a){return a instanceof d||(a=this.source.wrap(a)),this.inlineStack.push(a),a},pushStackLiteral:function(a){this.push(new d(a))},pushSource:function(a){this.pendingContent&&(this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent),this.pendingLocation)),this.pendingContent=void 0),a&&this.source.push(a)},replaceStack:function(a){var b=["("],c=void 0,e=void 0,f=void 0;if(!this.isInline())throw new j["default"]("replaceStack on non-inline");var g=this.popStack(!0);if(g instanceof d)c=[g.value],b=["(",c],f=!0;else{e=!0;var h=this.incrStack();b=["((",this.push(h)," = ",g,")"],c=this.topStack()}var i=a.call(this,c);f||this.popStack(),e&&this.stackSlot--,this.push(b.concat(i,")"))},incrStack:function(){return this.stackSlot++,this.stackSlot>this.stackVars.length&&this.stackVars.push("stack"+this.stackSlot),this.topStackName()},topStackName:function(){return"stack"+this.stackSlot},flushInline:function(){var a=this.inlineStack;this.inlineStack=[];for(var b=0,c=a.length;c>b;b++){var e=a[b];if(e instanceof d)this.compileStack.push(e);else{var f=this.incrStack();this.pushSource([f," = ",e,";"]),this.compileStack.push(f)}}},isInline:function(){return this.inlineStack.length},popStack:function(a){var b=this.isInline(),c=(b?this.inlineStack:this.compileStack).pop();if(!a&&c instanceof d)return c.value;if(!b){if(!this.stackSlot)throw new j["default"]("Invalid stack pop");this.stackSlot--}return c},topStack:function(){var a=this.isInline()?this.inlineStack:this.compileStack,b=a[a.length-1];return b instanceof d?b.value:b},contextName:function(a){return this.useDepths&&a?"depths["+a+"]":"depth"+a},quotedString:function(a){return this.source.quotedString(a)},objectLiteral:function(a){return this.source.objectLiteral(a)},aliasable:function(a){var b=this.aliases[a];return b?(b.referenceCount++,b):(b=this.aliases[a]=this.source.wrap(a),b.aliasable=!0,b.referenceCount=1,b)},setupHelper:function(a,b,c){var d=[],e=this.setupHelperArgs(b,a,d,c),f=this.nameLookup("helpers",b,"helper"),g=this.aliasable(this.contextName(0)+" != null ? "+this.contextName(0)+" : {}");return{params:d,paramsInit:e,name:f,callParams:[g].concat(d)}},setupParams:function(a,b,c){var d={},e=[],f=[],g=[],h=!c,i=void 0;h&&(c=[]),d.name=this.quotedString(a),d.hash=this.popStack(),this.trackIds&&(d.hashIds=this.popStack()),this.stringParams&&(d.hashTypes=this.popStack(),d.hashContexts=this.popStack());var j=this.popStack(),k=this.popStack();(k||j)&&(d.fn=k||"container.noop",d.inverse=j||"container.noop");for(var l=b;l--;)i=this.popStack(),c[l]=i,this.trackIds&&(g[l]=this.popStack()),this.stringParams&&(f[l]=this.popStack(),e[l]=this.popStack());return h&&(d.args=this.source.generateArray(c)),this.trackIds&&(d.ids=this.source.generateArray(g)),this.stringParams&&(d.types=this.source.generateArray(f),d.contexts=this.source.generateArray(e)),this.options.data&&(d.data="data"),this.useBlockParams&&(d.blockParams="blockParams"),d},setupHelperArgs:function(a,b,c,d){var e=this.setupParams(a,b,c);return e=this.objectLiteral(e),d?(this.useRegister("options"),c.push("options"),["options=",e]):c?(c.push(e),""):e}},function(){for(var a="break else new var case finally return void catch for switch while continue function this with default if throw delete in try do instanceof typeof abstract enum int short boolean export interface static byte extends long super char final native synchronized class float package throws const goto private transient debugger implements protected volatile double import public let yield await null true false".split(" "),b=e.RESERVED_WORDS={},c=0,d=a.length;d>c;c++)b[a[c]]=!0}(),e.isValidJavaScriptVariableName=function(a){return!e.RESERVED_WORDS[a]&&/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(a)},b["default"]=e,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b,c){if(f.isArray(a)){for(var d=[],e=0,g=a.length;g>e;e++)d.push(b.wrap(a[e],c));return d}return"boolean"==typeof a||"number"==typeof a?a+"":a}function e(a){this.srcFile=a,this.source=[]}b.__esModule=!0;var f=c(5),g=void 0;try{}catch(h){}g||(g=function(a,b,c,d){this.src="",d&&this.add(d)},g.prototype={add:function(a){f.isArray(a)&&(a=a.join("")),this.src+=a},prepend:function(a){f.isArray(a)&&(a=a.join("")),this.src=a+this.src},toStringWithSourceMap:function(){return{code:this.toString()}},toString:function(){return this.src}}),e.prototype={isEmpty:function(){return!this.source.length},prepend:function(a,b){this.source.unshift(this.wrap(a,b))},push:function(a,b){this.source.push(this.wrap(a,b))},merge:function(){var a=this.empty();return this.each(function(b){a.add([" ",b,"\n"])}),a},each:function(a){for(var b=0,c=this.source.length;c>b;b++)a(this.source[b])},empty:function(){var a=this.currentLocation||{start:{}};return new g(a.start.line,a.start.column,this.srcFile)},wrap:function(a){var b=arguments.length<=1||void 0===arguments[1]?this.currentLocation||{start:{}}:arguments[1];return a instanceof g?a:(a=d(a,this,b),new g(b.start.line,b.start.column,this.srcFile,a))},functionCall:function(a,b,c){return c=this.generateList(c),this.wrap([a,b?"."+b+"(":"(",c,")"])},quotedString:function(a){return'"'+(a+"").replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")+'"'},objectLiteral:function(a){var b=[];for(var c in a)if(a.hasOwnProperty(c)){var e=d(a[c],this);"undefined"!==e&&b.push([this.quotedString(c),":",e])}var f=this.generateList(b);return f.prepend("{"),f.add("}"),f},generateList:function(a){for(var b=this.empty(),c=0,e=a.length;e>c;c++)c&&b.add(","),b.add(d(a[c],this));return b},generateArray:function(a){var b=this.generateList(a);return b.prepend("["),b.add("]"),b}},b["default"]=e,a.exports=b["default"]}])});
\ No newline at end of file
diff --git a/backend/docs/vendor/jquery.min.js b/backend/docs/vendor/jquery.min.js
new file mode 100644
index 0000000..a1c07fd
--- /dev/null
+++ b/backend/docs/vendor/jquery.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML=" ",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML=" ";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""," "],thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/