commit 8b4f09f9d59d812676b084b4179badd884a370a8 Author: Senad Uka Date: Mon May 7 16:07:00 2018 +0200 first commit diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..742fa98 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,3 @@ +module.exports = { + "extends": "airbnb" +}; \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dca99ab --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +.vscode/ +.vscode/* +node_modules/ +node_modules/* +dist +dist/* +yarn.lock +.DS_Store +Dockerfile +yarn-error.log +npm-debug.log \ No newline at end of file diff --git a/.htpasswd b/.htpasswd new file mode 100644 index 0000000..7476f51 --- /dev/null +++ b/.htpasswd @@ -0,0 +1,3 @@ +carlos:{SHA}gIR8SA3ZqhSPKo1WfEFsBuGkl70= +michael:{SHA}se4JYmkoY/PhE5tA+DSiURhGERA= +demo-user:{SHA}se4JYmkoY/PhE5tA+DSiURhGERA= \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..c6cc8c8 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..922c929 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.8 + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..c404abb --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/nemt-portal.iml b/.idea/nemt-portal.iml new file mode 100644 index 0000000..ce6392d --- /dev/null +++ b/.idea/nemt-portal.iml @@ -0,0 +1,16 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..45afa84 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,534 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + o + portal-d + p + port + portal + portal- + portal-a + portal-ap + portal-api + + + + + + + + + + + + + + true + DEFINITION_ORDER + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1524160808787 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/README.MD b/README.MD new file mode 100644 index 0000000..9381b97 --- /dev/null +++ b/README.MD @@ -0,0 +1,3 @@ +- Commands to run + npm install -g yarn + yarn && yarn start \ No newline at end of file diff --git a/bitbucket-pipelines.yml b/bitbucket-pipelines.yml new file mode 100644 index 0000000..6f8386b --- /dev/null +++ b/bitbucket-pipelines.yml @@ -0,0 +1,30 @@ +image: node:8.3.0 +pipelines: + branches: + master: + - step: + script: + - apt-get update -y && apt-get upgrade -y && apt-get dist-upgrade -y && apt-get -y autoremove && apt-get clean + - apt-get install -y python-pip python-dev build-essential + - python --version + - pip install --upgrade pip + - pip install awscli + - npm rebuild node-sass --force + - yarn install + - NODE_ENV=production yarn build + - find ./dist -exec chmod +r {} \; + - echo "Prod Environment" + - aws s3 --region "us-east-2" sync ./dist s3://portal.bcbsinstitute.com --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers + development: + - step: + script: + - apt-get update -y && apt-get upgrade -y && apt-get dist-upgrade -y && apt-get -y autoremove && apt-get clean + - apt-get install -y python-pip python-dev build-essential + - pip install --upgrade pip + - pip install awscli + - npm rebuild node-sass --force + - yarn install + - NODE_ENV=development yarn build + - find ./dist -exec chmod +r {} \; + - echo "Dev Environment" + - aws s3 --region "us-east-2" sync ./dist s3://portal.dev.bcbsinstitute.com --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers diff --git a/config/webpack/Base.js b/config/webpack/Base.js new file mode 100644 index 0000000..f72025a --- /dev/null +++ b/config/webpack/Base.js @@ -0,0 +1,207 @@ +'use strict'; // eslint-disable-line + +/** + * Webpack configuration base class + */ +const fs = require('fs'); +const path = require('path'); + +const npmBase = path.join(__dirname, '../../node_modules'); + +class WebpackBaseConfig { + + constructor() { + this._config = {}; + } + + /** + * Get the list of included packages + * @return {Array} List of included packages + */ + get includedPackages() { + return [].map((pkg) => fs.realpathSync(path.join(npmBase, pkg))); + } + + /** + * Set the config data. + * This will always return a new config + * @param {Object} data Keys to assign + * @return {Object} + */ + set config(data) { + this._config = Object.assign({}, this.defaultSettings, data); + return this._config; + } + + /** + * Get the global config + * @return {Object} config Final webpack config + */ + get config() { + return this._config; + } + + /** + * Get the environment name + * @return {String} The current environment + */ + get env() { + return 'dev'; + } + + /** + * Get the absolute path to src directory + * @return {String} + */ + get srcPathAbsolute() { + return path.resolve('./src'); + } + + /** + * Get the absolute path to tests directory + * @return {String} + */ + get testPathAbsolute() { + return path.resolve('./test'); + } + + /** + * Get the default settings + * @return {Object} + */ + get defaultSettings() { + const cssModulesQuery = { + modules: true, + importLoaders: 1, + localIdentName: '[name]-[local]-[hash:base64:5]' + }; + + return { + context: this.srcPathAbsolute, + devtool: 'eval', + devServer: { + contentBase: ['./public/', './src/'], + publicPath: '/assets/', + historyApiFallback: true, + hot: true, + inline: true, + port: 5000 + }, + entry: './index.js', + module: { + rules: [ + { + enforce: 'pre', + test: /\.js?$/, + include: this.srcPathAbsolute, + loader: 'babel-loader', + query: { + presets: ['es2015', 'react', 'stage-2'] + } + }, + { + test: /^.((?!cssmodule).)*\.css$/, + loaders: [ + { loader: 'style-loader' }, + { loader: 'css-loader' } + ] + }, + { + test: /\.(png|jpg|gif|mp4|ogg|svg|woff|woff2|ttf|eot|ico)$/, + loader: 'file-loader' + }, + { + test: /^.((?!cssmodule).)*\.styl$/, + loaders: [ + { loader: 'style-loader' }, + { loader: 'css-loader' }, + { loader: 'stylus-loader' } + ] + }, + { + test: /\.json$/, + loader: 'json-loader' + }, + { + test: /\.(js|jsx)$/, + include: [].concat( + this.includedPackages, + [this.srcPathAbsolute] + ), + loaders: [ + // Note: Moved this to .babelrc + { loader: 'babel-loader' } + ] + }, + { + test: /\.cssmodule\.(sass|scss)$/, + loaders: [ + { loader: 'style-loader' }, + { + loader: 'css-loader', + query: cssModulesQuery + }, + { loader: 'sass-loader' } + ] + }, + { + test: /\.cssmodule\.css$/, + loaders: [ + { loader: 'style-loader' }, + { + loader: 'css-loader', + query: cssModulesQuery + } + ] + }, + { + test: /\.cssmodule\.less$/, + loaders: [ + { loader: 'style-loader' }, + { + loader: 'css-loader', + query: cssModulesQuery + }, + { loader: 'less-loader' } + ] + }, + { + test: /\.cssmodule\.styl$/, + loaders: [ + { loader: 'style-loader' }, + { + loader: 'css-loader', + query: cssModulesQuery + }, + { loader: 'stylus-loader' } + ] + } + ] + }, + output: { + path: path.resolve('./dist/assets'), + filename: 'app.js', + publicPath: './assets/' + }, + plugins: [], + resolve: { + alias: { + actions: `${this.srcPathAbsolute}/actions/`, + components: `${this.srcPathAbsolute}/components/`, + config: `${this.srcPathAbsolute}/config/${this.env}.js`, + images: `${this.srcPathAbsolute}/images/`, + sources: `${this.srcPathAbsolute}/sources/`, + stores: `${this.srcPathAbsolute}/stores/`, + styles: `${this.srcPathAbsolute}/styles/` + }, + extensions: ['.js', '.jsx'], + modules: [ + this.srcPathAbsolute, + 'node_modules' + ] + } + }; + } +} + +module.exports = WebpackBaseConfig; diff --git a/config/webpack/Dev.js b/config/webpack/Dev.js new file mode 100644 index 0000000..4c422db --- /dev/null +++ b/config/webpack/Dev.js @@ -0,0 +1,78 @@ +'use strict'; + +/** + * Default dev server configuration. + */ +const webpack = require('webpack'); +const WebpackBaseConfig = require('./Base'); + +class WebpackDevConfig extends WebpackBaseConfig { + + constructor() { + super(); + this.config = { + devtool: 'cheap-module-source-map', + entry: [ + 'webpack-dev-server/client?http://0.0.0.0:5000/', + 'webpack/hot/only-dev-server', + 'react-hot-loader/patch', + './client.js' + ], + plugins: [ + new webpack.HotModuleReplacementPlugin(), + new webpack.NoEmitOnErrorsPlugin(), + new webpack.ProvidePlugin({ + $: "jquery", + jQuery: "jquery", + "window.jQuery": "jquery" + }), + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: JSON.stringify(process.env.NODE_ENV), + }, + }), + ] + }; + + this.config.module.rules = this.config.module.rules.concat([ + { + test: /^.((?!cssmodule).)*\.(sass|scss)$/, + loaders: [ + { loader: 'style-loader' }, + { + loader: 'css-loader', + options: { + sourceMap: true + } + }, + { + loader: 'sass-loader', + options: { + sourceMap: true + } + } + ] + }, { + test: /^.((?!cssmodule).)*\.less$/, + use: [ + { loader: "style-loader" }, + { + loader: "css-loader", + options: { + sourceMap: true + } + }, { + loader: "less-loader", + options: { + sourceMap: true + } + } + ] + } + ]) + + // console.log(this.config.module.rules); + } +} + +module.exports = WebpackDevConfig; diff --git a/config/webpack/Dist.js b/config/webpack/Dist.js new file mode 100644 index 0000000..4935b02 --- /dev/null +++ b/config/webpack/Dist.js @@ -0,0 +1,88 @@ +'use strict'; + +/** + * Dist configuration. Used to build the + * final output when running npm run dist. + */ +const webpack = require('webpack'); +const WebpackBaseConfig = require('./Base'); +const CopyWebpackPlugin = require('copy-webpack-plugin'); + +const path = require('path'); +const ROOT = path.resolve(__dirname, '../..'); +function root(args) { + args = Array.prototype.slice.call(arguments, 0); + return path.join.apply(path, [ROOT].concat(args)); +} + +class WebpackDistConfig extends WebpackBaseConfig { + + constructor() { + super(); + this.config = { + cache: false, + devtool: 'source-map', + entry: [ + './client.js' + ], + output: { + path: root('dist'), + publicPath: '/', + filename: 'assets/app.js', + chunkFilename: 'assets/[id].[hash].chunk.js' + }, + plugins: [ + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: JSON.stringify(process.env.NODE_ENV), + }, + }), + new webpack.optimize.AggressiveMergingPlugin(), + new webpack.NoEmitOnErrorsPlugin(), + new webpack.ProvidePlugin({ + $: "jquery", + jQuery: "jquery", + "window.jQuery": "jquery" + }), + new CopyWebpackPlugin([ + { from: root('public/'), to: root('dist/') }, + { from: root('src/assets/images'), to: root('dist/assets/images') }, + //{ from: root('src/assets/images-demo'), to: root('dist/assets/images-demo') }, + ]), + ] + }; + + // Deactivate hot-reloading if we run dist build on the dev server + this.config.devServer.hot = false; + + this.config.module.rules = this.config.module.rules.concat([ + { + test: /^.((?!cssmodule).)*\.(sass|scss)$/, + loaders: [ + { loader: 'style-loader' }, + { loader: 'css-loader' }, + { loader: 'postcss-loader' }, + { loader: 'sass-loader' } + ] + }, { + test: /^.((?!cssmodule).)*\.less$/, + loaders: [ + { loader: 'style-loader' }, + { loader: 'css-loader' }, + { loader: 'postcss-loader' }, + { loader: 'less-loader' } + ] + } + ]) + } + + /** + * Get the environment name + * @return {String} The current environment + */ + get env() { + return 'dist'; + } +} + +module.exports = WebpackDistConfig; diff --git a/config/webpack/Server.js b/config/webpack/Server.js new file mode 100644 index 0000000..e69de29 diff --git a/config/webpack/index.js b/config/webpack/index.js new file mode 100644 index 0000000..240b3dd --- /dev/null +++ b/config/webpack/index.js @@ -0,0 +1,9 @@ +'use strict'; + +const dev = require('./Dev'); +const dist = require('./Dist'); + +module.exports = { + dev, + dist +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..0928bc1 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,11219 @@ +{ + "name": "chmhub", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@devexpress/dx-core": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@devexpress/dx-core/-/dx-core-1.0.2.tgz", + "integrity": "sha512-DWlhz79AUcniGjVrLMaTy6PtJu9ZKYaJupEQxhAve/eq58AbK43JBmW8SM/NucuPrPstTEsFhw0E24B30no1aQ==" + }, + "@devexpress/dx-grid-core": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@devexpress/dx-grid-core/-/dx-grid-core-1.0.2.tgz", + "integrity": "sha512-1KvwDPYzuHNEBbKLqPOCB73MG/qsYZdUGvU/di9GUh+QLOmZywqqzkYnhBa2kfmpwleaHE2OxHi083QnEPMLRg==" + }, + "@devexpress/dx-react-core": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@devexpress/dx-react-core/-/dx-react-core-1.0.2.tgz", + "integrity": "sha512-sAak1mu5YbL1d3a1eX7lHZVv0YFJ0ylKmocPyYYuccBsL4Y88mCsBuYcAVCJ0ytoo/hC3zUZPsVns/yKEzvHug==", + "requires": { + "@devexpress/dx-core": "1.0.2", + "prop-types": "15.6.1" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "fbjs": { + "version": "0.8.16", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", + "requires": { + "core-js": "1.2.7", + "isomorphic-fetch": "2.2.1", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "promise": "7.3.1", + "setimmediate": "1.0.5", + "ua-parser-js": "0.7.13" + } + }, + "prop-types": { + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", + "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==", + "requires": { + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1" + } + } + } + }, + "@devexpress/dx-react-grid": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@devexpress/dx-react-grid/-/dx-react-grid-1.0.2.tgz", + "integrity": "sha512-bDiZgDtEdR4oY6koFGk95z5Gd6gIoR4m3TXtq8wAzxzxTqiJHY9+VkIsozHvhbSFHUUjhCobi996yTeZfprOmQ==", + "requires": { + "@devexpress/dx-grid-core": "1.0.2", + "prop-types": "15.6.1" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "fbjs": { + "version": "0.8.16", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", + "requires": { + "core-js": "1.2.7", + "isomorphic-fetch": "2.2.1", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "promise": "7.3.1", + "setimmediate": "1.0.5", + "ua-parser-js": "0.7.13" + } + }, + "prop-types": { + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", + "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==", + "requires": { + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1" + } + } + } + }, + "@sketchpixy/isomorphic-relay-router": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@sketchpixy/isomorphic-relay-router/-/isomorphic-relay-router-0.8.5.tgz", + "integrity": "sha1-EjKsmo/zuw3gXdwVbvRBjcjmEME=", + "requires": { + "@sketchpixy/react-router-relay": "0.13.4", + "babel-runtime": "6.23.0" + } + }, + "@sketchpixy/react-router-relay": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/@sketchpixy/react-router-relay/-/react-router-relay-0.13.4.tgz", + "integrity": "sha1-KwNGIZng5bre3il+7p0feBqWdHk=", + "requires": { + "babel-runtime": "6.23.0", + "invariant": "2.2.2", + "lodash": "4.17.4", + "react-static-container": "1.0.1" + } + }, + "@sketchpixy/react-router-scroll": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@sketchpixy/react-router-scroll/-/react-router-scroll-0.3.2.tgz", + "integrity": "sha1-+43FgcD1VGTZpC5cilEiFN4XwWY=", + "requires": { + "@sketchpixy/scroll-behavior": "0.8.1", + "warning": "3.0.0" + } + }, + "@sketchpixy/redux-fetch-data": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@sketchpixy/redux-fetch-data/-/redux-fetch-data-0.1.3.tgz", + "integrity": "sha1-xzI7WebV6kq378QDm7N8dx5HqVY=", + "requires": { + "redux-actions": "0.9.1" + } + }, + "@sketchpixy/rubix": { + "version": "2.9.18", + "resolved": "https://registry.npmjs.org/@sketchpixy/rubix/-/rubix-2.9.18.tgz", + "integrity": "sha1-dpF2tyqEHp5WU62A91Pg6Cb2EzQ=", + "requires": { + "@sketchpixy/isomorphic-relay-router": "0.8.5", + "@sketchpixy/react-router-relay": "0.13.4", + "@sketchpixy/react-router-scroll": "0.3.2", + "@sketchpixy/redux-fetch-data": "0.1.3", + "axios": "0.13.1", + "babel-relay-plugin": "0.9.3", + "classnames": "2.2.5", + "express-graphql": "0.5.4", + "graphql": "0.6.2", + "graphql-relay": "0.4.4", + "history": "4.6.3", + "immutable": "3.8.1", + "isomorphic-relay": "0.7.4", + "lodash-compat": "3.10.2", + "pubsub-js": "1.5.7", + "query-string": "4.3.4", + "react": "15.6.1", + "react-bootstrap": "0.30.10", + "react-dom": "15.6.1", + "react-hot-loader": "3.0.0-beta.7", + "react-motion": "0.4.8", + "react-redux": "5.0.5", + "react-relay": "0.9.3", + "react-router": "3.0.5", + "react-router-redux": "4.0.8", + "redux": "3.7.2", + "redux-thunk": "2.2.0", + "request-frame": "1.5.3", + "watch": "0.19.3" + } + }, + "@sketchpixy/scroll-behavior": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@sketchpixy/scroll-behavior/-/scroll-behavior-0.8.1.tgz", + "integrity": "sha1-QYj/k0rY8wt5KIJ+5IwdmrcKgOQ=", + "requires": { + "dom-helpers": "3.2.1", + "invariant": "2.2.2" + } + }, + "abbrev": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", + "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", + "dev": true + }, + "accepts": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "requires": { + "mime-types": "2.1.15", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", + "integrity": "sha512-vOk6uEMctu0vQrvuSqFdJyqj1Q0S5VTDL79qtjo+DhRr+1mmaD+tluFSCZqhvi/JUhXSzoZN2BhtstaPEeE8cw==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "dev": true, + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "3.3.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "ajv": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.2.tgz", + "integrity": "sha1-R8aNaehvXZUxA7AHSpQw3GPaXjk=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "json-schema-traverse": "0.3.1", + "json-stable-stringify": "1.0.1" + } + }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "anymatch": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", + "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=", + "dev": true, + "requires": { + "arrify": "1.0.1", + "micromatch": "2.3.11" + } + }, + "aproba": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.2.tgz", + "integrity": "sha512-ZpYajIfO0j2cOFTO955KUMIKNmj6zhX8kVztMAxFsDaMwz+9Z9SV0uou2pC9HJqcfpffOsjnbrDMvkNy+9RXPw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "dev": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.3" + } + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "aria-query": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-0.7.0.tgz", + "integrity": "sha512-/r2lHl09V3o74+2MLKEdewoj37YZqiQZnfen1O4iNlrOjUgeKuu1U2yF3iKh6HJxqF+OXkLMfQv65Z/cvxD6vA==", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", + "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "dev": true + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.7.0" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "asn1.js": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", + "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=", + "dev": true, + "requires": { + "bn.js": "4.11.7", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + } + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, + "async": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", + "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", + "dev": true, + "requires": { + "lodash": "4.17.4" + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "autoprefixer": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.2.tgz", + "integrity": "sha1-++rwfUj9h44Ggr98vurecorbKxg=", + "dev": true, + "requires": { + "browserslist": "2.1.5", + "caniuse-lite": "1.0.30000701", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "6.0.6", + "postcss-value-parser": "3.3.0" + } + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true + }, + "axios": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.13.1.tgz", + "integrity": "sha1-Pmer/kMzvJ0tX+b70TtGlOr8jfg=", + "requires": { + "follow-redirects": "0.0.7" + } + }, + "axobject-query": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-0.1.0.tgz", + "integrity": "sha1-YvWdvFnJ+SQnWco0mWDnov48NsA=", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7" + } + }, + "babel-code-frame": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", + "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-core": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", + "integrity": "sha1-fdQrBGPHQunVKW3rPsZ6kyLa1yk=", + "dev": true, + "requires": { + "babel-code-frame": "6.22.0", + "babel-generator": "6.25.0", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.24.1", + "babel-runtime": "6.23.0", + "babel-template": "6.25.0", + "babel-traverse": "6.25.0", + "babel-types": "6.25.0", + "babylon": "6.17.4", + "convert-source-map": "1.5.0", + "debug": "2.6.8", + "json5": "0.5.1", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.7", + "slash": "1.0.0", + "source-map": "0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + } + } + }, + "babel-eslint": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", + "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", + "dev": true, + "requires": { + "babel-code-frame": "6.22.0", + "babel-traverse": "6.25.0", + "babel-types": "6.25.0", + "babylon": "6.17.4" + } + }, + "babel-generator": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", + "integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=", + "dev": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.23.0", + "babel-types": "6.25.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.4", + "source-map": "0.5.6", + "trim-right": "1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + } + } + }, + "babel-helper-bindify-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", + "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-traverse": "6.25.0", + "babel-types": "6.25.0" + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "6.24.1", + "babel-runtime": "6.23.0", + "babel-types": "6.25.0" + } + }, + "babel-helper-builder-react-jsx": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.24.1.tgz", + "integrity": "sha1-CteRfjPI11HmRtrKTnfMGTd9LLw=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-types": "6.25.0", + "esutils": "2.0.2" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.23.0", + "babel-traverse": "6.25.0", + "babel-types": "6.25.0" + } + }, + "babel-helper-define-map": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz", + "integrity": "sha1-epdH8ljYlH0y1RX2qhx70CIEoIA=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.23.0", + "babel-types": "6.25.0", + "lodash": "4.17.4" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-traverse": "6.25.0", + "babel-types": "6.25.0" + } + }, + "babel-helper-explode-class": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", + "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", + "dev": true, + "requires": { + "babel-helper-bindify-decorators": "6.24.1", + "babel-runtime": "6.23.0", + "babel-traverse": "6.25.0", + "babel-types": "6.25.0" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.23.0", + "babel-template": "6.25.0", + "babel-traverse": "6.25.0", + "babel-types": "6.25.0" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-types": "6.25.0" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-types": "6.25.0" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-types": "6.25.0" + } + }, + "babel-helper-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz", + "integrity": "sha1-024i+rEAjXnYhkjjIRaGgShFbOg=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-types": "6.25.0", + "lodash": "4.17.4" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.23.0", + "babel-template": "6.25.0", + "babel-traverse": "6.25.0", + "babel-types": "6.25.0" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.23.0", + "babel-template": "6.25.0", + "babel-traverse": "6.25.0", + "babel-types": "6.25.0" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-template": "6.25.0" + } + }, + "babel-loader": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.1.tgz", + "integrity": "sha1-uHE0yLEuPkwqlOBUYIW8aAorhIg=", + "dev": true, + "requires": { + "find-cache-dir": "1.0.0", + "loader-utils": "1.1.0", + "mkdirp": "0.5.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "requires": { + "babel-runtime": "6.23.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0" + } + }, + "babel-plugin-istanbul": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.4.tgz", + "integrity": "sha1-GN3oS/POMp/d8/QQP66SFFbY5Yc=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "istanbul-lib-instrument": "1.7.4", + "test-exclude": "4.1.1" + } + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", + "dev": true + }, + "babel-plugin-syntax-class-constructor-call": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", + "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=", + "dev": true + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", + "dev": true + }, + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", + "dev": true + }, + "babel-plugin-syntax-do-expressions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz", + "integrity": "sha1-V0d1YTmqJtOQ0JQQsDdEugfkeW0=", + "dev": true + }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "babel-plugin-syntax-export-extensions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", + "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=", + "dev": true + }, + "babel-plugin-syntax-flow": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", + "dev": true + }, + "babel-plugin-syntax-function-bind": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz", + "integrity": "sha1-SMSV8Xe98xqYHnMvVa3AvdJgH0Y=", + "dev": true + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-async-generator-functions": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-generators": "6.13.0", + "babel-runtime": "6.23.0" + } + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-functions": "6.13.0", + "babel-runtime": "6.23.0" + } + }, + "babel-plugin-transform-class-constructor-call": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz", + "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", + "dev": true, + "requires": { + "babel-plugin-syntax-class-constructor-call": "6.18.0", + "babel-runtime": "6.23.0", + "babel-template": "6.25.0" + } + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-plugin-syntax-class-properties": "6.13.0", + "babel-runtime": "6.23.0", + "babel-template": "6.25.0" + } + }, + "babel-plugin-transform-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", + "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", + "dev": true, + "requires": { + "babel-helper-explode-class": "6.24.1", + "babel-plugin-syntax-decorators": "6.13.0", + "babel-runtime": "6.23.0", + "babel-template": "6.25.0", + "babel-types": "6.25.0" + } + }, + "babel-plugin-transform-decorators-legacy": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.4.tgz", + "integrity": "sha1-dBtY9sW86eYCfgiC2cmU8E82aSU=", + "dev": true, + "requires": { + "babel-plugin-syntax-decorators": "6.13.0", + "babel-runtime": "6.23.0", + "babel-template": "6.25.0" + } + }, + "babel-plugin-transform-do-expressions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz", + "integrity": "sha1-KMyvkoEtlJws0SgfaQyP3EaK6bs=", + "dev": true, + "requires": { + "babel-plugin-syntax-do-expressions": "6.13.0", + "babel-runtime": "6.23.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz", + "integrity": "sha1-dsKV3DpHQbFmWt/TFnIV3P8ypXY=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-template": "6.25.0", + "babel-traverse": "6.25.0", + "babel-types": "6.25.0", + "lodash": "4.17.4" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "6.24.1", + "babel-helper-function-name": "6.24.1", + "babel-helper-optimise-call-expression": "6.24.1", + "babel-helper-replace-supers": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.23.0", + "babel-template": "6.25.0", + "babel-traverse": "6.25.0", + "babel-types": "6.25.0" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-template": "6.25.0" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-types": "6.25.0" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.23.0", + "babel-types": "6.25.0" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "6.24.1", + "babel-runtime": "6.23.0", + "babel-template": "6.25.0" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz", + "integrity": "sha1-0+MQtA72ZKNmIiAAl8bUQCmPK/4=", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "6.24.1", + "babel-runtime": "6.23.0", + "babel-template": "6.25.0", + "babel-types": "6.25.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.23.0", + "babel-template": "6.25.0" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-runtime": "6.23.0", + "babel-template": "6.25.0" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "requires": { + "babel-helper-replace-supers": "6.24.1", + "babel-runtime": "6.23.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.23.0", + "babel-template": "6.25.0", + "babel-traverse": "6.25.0", + "babel-types": "6.25.0" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-types": "6.25.0" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "6.24.1", + "babel-runtime": "6.23.0", + "babel-types": "6.25.0" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "requires": { + "babel-helper-regex": "6.24.1", + "babel-runtime": "6.23.0", + "regexpu-core": "2.0.0" + } + }, + "babel-plugin-transform-es3-member-expression-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es3-member-expression-literals/-/babel-plugin-transform-es3-member-expression-literals-6.22.0.tgz", + "integrity": "sha1-cz00RPPsxBvvjtGmpOCWV7iWnrs=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0" + } + }, + "babel-plugin-transform-es3-property-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es3-property-literals/-/babel-plugin-transform-es3-property-literals-6.22.0.tgz", + "integrity": "sha1-sgeNWELiKr9A9z6M3pzTcRq9V1g=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", + "babel-plugin-syntax-exponentiation-operator": "6.13.0", + "babel-runtime": "6.23.0" + } + }, + "babel-plugin-transform-export-extensions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", + "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", + "dev": true, + "requires": { + "babel-plugin-syntax-export-extensions": "6.13.0", + "babel-runtime": "6.23.0" + } + }, + "babel-plugin-transform-flow-strip-types": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", + "dev": true, + "requires": { + "babel-plugin-syntax-flow": "6.18.0", + "babel-runtime": "6.23.0" + } + }, + "babel-plugin-transform-function-bind": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz", + "integrity": "sha1-xvuOlqwpajELjPjqQBRiQH3fapc=", + "dev": true, + "requires": { + "babel-plugin-syntax-function-bind": "6.13.0", + "babel-runtime": "6.23.0" + } + }, + "babel-plugin-transform-jscript": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-jscript/-/babel-plugin-transform-jscript-6.22.0.tgz", + "integrity": "sha1-borxK3q6SeCoCRUmFqwFaQszUtw=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz", + "integrity": "sha1-h11ryb52HFiirj/u5dxIldjH+SE=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "6.13.0", + "babel-runtime": "6.23.0" + } + }, + "babel-plugin-transform-react-display-name": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", + "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0" + } + }, + "babel-plugin-transform-react-jsx": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", + "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", + "dev": true, + "requires": { + "babel-helper-builder-react-jsx": "6.24.1", + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.23.0" + } + }, + "babel-plugin-transform-react-jsx-self": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", + "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.23.0" + } + }, + "babel-plugin-transform-react-jsx-source": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", + "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.23.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz", + "integrity": "sha1-uNowWtQ8PJm0hI5P5AN7dw0jxBg=", + "dev": true, + "requires": { + "regenerator-transform": "0.9.11" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-types": "6.25.0" + } + }, + "babel-polyfill": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz", + "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "core-js": "2.4.1", + "regenerator-runtime": "0.10.5" + } + }, + "babel-preset-airbnb": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/babel-preset-airbnb/-/babel-preset-airbnb-2.4.0.tgz", + "integrity": "sha512-Lum0Wf6y8qP4GdToXznf7PV7ecuOckl2Yv0Ww6latW88YIEexip7mFFsJVortjBtqhYpJoOzKG3xOeLllGu68Q==", + "dev": true, + "requires": { + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "6.24.1", + "babel-plugin-transform-es2015-template-literals": "6.22.0", + "babel-plugin-transform-es3-member-expression-literals": "6.22.0", + "babel-plugin-transform-es3-property-literals": "6.22.0", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-jscript": "6.22.0", + "babel-plugin-transform-object-rest-spread": "6.23.0", + "babel-preset-env": "1.6.0", + "babel-preset-react": "6.24.1", + "object.assign": "4.0.4" + } + }, + "babel-preset-env": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.0.tgz", + "integrity": "sha512-OVgtQRuOZKckrILgMA5rvctvFZPv72Gua9Rt006AiPoB0DJKGN07UmaQA+qRrYgK71MVct8fFhT0EyNWYorVew==", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-to-generator": "6.24.1", + "babel-plugin-transform-es2015-arrow-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoping": "6.24.1", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-template-literals": "6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-regenerator": "6.24.1", + "browserslist": "2.1.5", + "invariant": "2.2.2", + "semver": "5.3.0" + } + }, + "babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoping": "6.24.1", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-template-literals": "6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-regenerator": "6.24.1" + } + }, + "babel-preset-es2015-native-modules": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-preset-es2015-native-modules/-/babel-preset-es2015-native-modules-6.9.4.tgz", + "integrity": "sha1-rS4P86LNh5wdj8mUqzO0uA0rUFc=", + "dev": true, + "requires": { + "babel-preset-es2015": "6.24.1" + } + }, + "babel-preset-flow": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", + "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", + "dev": true, + "requires": { + "babel-plugin-transform-flow-strip-types": "6.22.0" + } + }, + "babel-preset-react": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", + "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "6.18.0", + "babel-plugin-transform-react-display-name": "6.25.0", + "babel-plugin-transform-react-jsx": "6.24.1", + "babel-plugin-transform-react-jsx-self": "6.22.0", + "babel-plugin-transform-react-jsx-source": "6.22.0", + "babel-preset-flow": "6.23.0" + } + }, + "babel-preset-stage-0": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz", + "integrity": "sha1-VkLRUEL5E4TX5a+LyIsduVsDnmo=", + "dev": true, + "requires": { + "babel-plugin-transform-do-expressions": "6.22.0", + "babel-plugin-transform-function-bind": "6.22.0", + "babel-preset-stage-1": "6.24.1" + } + }, + "babel-preset-stage-1": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz", + "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", + "dev": true, + "requires": { + "babel-plugin-transform-class-constructor-call": "6.24.1", + "babel-plugin-transform-export-extensions": "6.22.0", + "babel-preset-stage-2": "6.24.1" + } + }, + "babel-preset-stage-2": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", + "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", + "dev": true, + "requires": { + "babel-plugin-syntax-dynamic-import": "6.18.0", + "babel-plugin-transform-class-properties": "6.24.1", + "babel-plugin-transform-decorators": "6.24.1", + "babel-preset-stage-3": "6.24.1" + } + }, + "babel-preset-stage-3": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", + "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", + "dev": true, + "requires": { + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-generator-functions": "6.24.1", + "babel-plugin-transform-async-to-generator": "6.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-object-rest-spread": "6.23.0" + } + }, + "babel-register": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz", + "integrity": "sha1-fhDhOi9xBlvfrVoXh7pFvKbe118=", + "dev": true, + "requires": { + "babel-core": "6.25.0", + "babel-runtime": "6.23.0", + "core-js": "2.4.1", + "home-or-tmp": "2.0.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "source-map-support": "0.4.15" + } + }, + "babel-relay-plugin": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/babel-relay-plugin/-/babel-relay-plugin-0.9.3.tgz", + "integrity": "sha1-Tdkmk/aLAM0ctopwVHD4+c+u1dY=", + "requires": { + "graphql": "0.6.2" + } + }, + "babel-runtime": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.5" + } + }, + "babel-template": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", + "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=", + "requires": { + "babel-runtime": "6.23.0", + "babel-traverse": "6.25.0", + "babel-types": "6.25.0", + "babylon": "6.17.4", + "lodash": "4.17.4" + } + }, + "babel-traverse": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", + "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=", + "requires": { + "babel-code-frame": "6.22.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.23.0", + "babel-types": "6.25.0", + "babylon": "6.17.4", + "debug": "2.6.8", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + } + }, + "babel-types": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", + "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=", + "requires": { + "babel-runtime": "6.23.0", + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.17.4", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", + "integrity": "sha512-kChlV+0SXkjE0vUn9OZ7pBMWRFd8uq3mZe8x1K6jhuNcAFAtEnjchFAqB+dYEXKyd+JpT6eppRR78QAr5gTsUw==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base64-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "big.js": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", + "integrity": "sha1-TK2iGTZS6zyp7I5VyQFWacmAaXg=", + "dev": true + }, + "binary-extensions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz", + "integrity": "sha1-SOyNFt9Dd+rl+liEaCSAr02Vx3Q=", + "dev": true + }, + "bless": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/bless/-/bless-3.0.3.tgz", + "integrity": "sha1-Zec2NiyRsAghgJ70vIVnudl26qY=" + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "bluebird": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", + "dev": true + }, + "bn.js": { + "version": "4.11.7", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", + "integrity": "sha512-LxFiV5mefv0ley0SzqkOPR1bC4EbpPx8LkOz5vMe/Yi15t5hzwgO/G+tc7wOtL4PZTYjwHu8JnEiSLumuSjSfA==", + "dev": true + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "2.1.1", + "deep-equal": "1.0.1", + "dns-equal": "1.0.0", + "dns-txt": "2.0.2", + "multicast-dns": "6.1.1", + "multicast-dns-service-types": "1.1.0" + } + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "bootstrap": { + "version": "4.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.0.0-alpha.6.tgz", + "integrity": "sha1-T1TdM6wN6sOyhAe8LffsYIhpycg=", + "dev": true, + "requires": { + "jquery": "3.2.1", + "tether": "1.4.0" + } + }, + "bowser": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.7.1.tgz", + "integrity": "sha1-pN6PGKGg3JUx6yqSoVIftqm6lqU=" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", + "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=", + "dev": true, + "requires": { + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.0", + "inherits": "2.0.3" + } + }, + "browserify-cipher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "dev": true, + "requires": { + "browserify-aes": "1.0.6", + "browserify-des": "1.0.0", + "evp_bytestokey": "1.0.0" + } + }, + "browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "4.11.7", + "randombytes": "2.0.5" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "4.11.7", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "elliptic": "6.4.0", + "inherits": "2.0.3", + "parse-asn1": "5.1.0" + } + }, + "browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "dev": true, + "requires": { + "pako": "0.2.9" + } + }, + "browserslist": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.1.5.tgz", + "integrity": "sha1-6IJVDfPRzW1IHBo+ADjyuvE6RxE=", + "dev": true, + "requires": { + "caniuse-lite": "1.0.30000701", + "electron-to-chromium": "1.3.15" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "1.2.1", + "ieee754": "1.1.8", + "isarray": "1.0.0" + } + }, + "buffer-indexof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.0.tgz", + "integrity": "sha1-9U9kfE9OJSKLqmVqLlfkPV8nCYI=", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.5.0.tgz", + "integrity": "sha1-TJQj6i0lLCcMQbK97+/5u2tiwGo=" + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + } + }, + "caniuse-api": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", + "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", + "dev": true, + "requires": { + "browserslist": "1.7.7", + "caniuse-db": "1.0.30000701", + "lodash.memoize": "4.1.2", + "lodash.uniq": "4.5.0" + }, + "dependencies": { + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "dev": true, + "requires": { + "caniuse-db": "1.0.30000701", + "electron-to-chromium": "1.3.15" + } + } + } + }, + "caniuse-db": { + "version": "1.0.30000701", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000701.tgz", + "integrity": "sha1-LjKwaZO/Pb2QtD2T8E4m0Rr93Lo=", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30000701", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000701.tgz", + "integrity": "sha1-nWc89rdNyz1cIdITF2sBGsakW6o=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "0.2.7" + } + }, + "chain-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chain-function/-/chain-function-1.0.0.tgz", + "integrity": "sha1-DUqzfn4Y6tC9xHuSB2QRjOWHM9w=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "change-emitter": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/change-emitter/-/change-emitter-0.1.6.tgz", + "integrity": "sha1-6LL+PX8at9aaMhma/5HqaTFAlRU=" + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "1.3.0", + "async-each": "1.0.1", + "fsevents": "1.1.2", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "circular-json": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.1.tgz", + "integrity": "sha1-vos2rvzN6LPKeqLWr8B6NyQsDS0=", + "dev": true + }, + "clap": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.0.tgz", + "integrity": "sha1-WckP4+E3EEdG/xlGmiemNP9oyFc=", + "dev": true, + "requires": { + "chalk": "1.1.3" + } + }, + "classnames": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", + "integrity": "sha1-+zgB1FNGdknvNgPH1hoCvRKb3m0=" + }, + "cli-width": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", + "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "clone": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", + "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", + "dev": true + }, + "clone-deep": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.3.0.tgz", + "integrity": "sha1-NIxhrpzb4O3+BT2R/0zFIdeQ7eg=", + "dev": true, + "requires": { + "for-own": "1.0.0", + "is-plain-object": "2.0.4", + "kind-of": "3.2.2", + "shallow-clone": "0.1.2" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "coa": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", + "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "dev": true, + "requires": { + "q": "1.5.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "color": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", + "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", + "dev": true, + "requires": { + "clone": "1.0.2", + "color-convert": "1.9.0", + "color-string": "0.3.0" + } + }, + "color-convert": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", + "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-string": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", + "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "colormin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", + "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", + "dev": true, + "requires": { + "color": "0.11.4", + "css-color-names": "0.0.4", + "has": "1.0.1" + } + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compressible": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.10.tgz", + "integrity": "sha1-/tocf3YXkScyspv4zyYlKiC57s0=", + "dev": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "compression": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.0.tgz", + "integrity": "sha1-AwyfGY8WQ6BX13anOOki2kNzAS0=", + "dev": true, + "requires": { + "accepts": "1.3.3", + "bytes": "2.5.0", + "compressible": "2.0.10", + "debug": "2.6.8", + "on-headers": "1.0.1", + "safe-buffer": "5.1.1", + "vary": "1.1.1" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + } + }, + "connect-history-api-fallback": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz", + "integrity": "sha1-5R0X+PDvDbkKZP20feMFFVbp8Wk=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "0.1.4" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", + "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0=" + }, + "convert-source-map": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", + "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "copy-webpack-plugin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.0.1.tgz", + "integrity": "sha1-lyjjg7lDFgUNDHRjlY8rhcCqggA=", + "dev": true, + "requires": { + "bluebird": "2.11.0", + "fs-extra": "0.26.7", + "glob": "6.0.4", + "is-glob": "3.1.0", + "loader-utils": "0.2.17", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "node-dir": "0.1.17" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "3.1.3", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } + } + } + }, + "core-js": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", + "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.1.3.tgz", + "integrity": "sha1-lSdx6w3dwcs/ovb75RpSLpOz7go=", + "dev": true, + "requires": { + "is-directory": "0.3.1", + "js-yaml": "3.9.0", + "minimist": "1.2.0", + "object-assign": "4.1.1", + "os-homedir": "1.0.2", + "parse-json": "2.2.0", + "require-from-string": "1.2.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "create-ecdh": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "dev": true, + "requires": { + "bn.js": "4.11.7", + "elliptic": "6.4.0" + } + }, + "create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "sha.js": "2.4.8" + } + }, + "create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.8" + } + }, + "create-react-class": { + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.0.tgz", + "integrity": "sha1-q0SEl8JlZuHilBPogyB9V8/nvtQ=", + "requires": { + "fbjs": "0.8.12", + "loose-envify": "1.3.1", + "object-assign": "4.1.1" + } + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "which": "1.2.14" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "crypto-browserify": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", + "integrity": "sha512-Na7ZlwCOqoaW5RwUK1WpXws2kv8mNhWdTlzob0UXulk6G9BDbyiJaGTYBIX61Ozn9l1EPPJpICZb4DaOpT9NlQ==", + "dev": true, + "requires": { + "browserify-cipher": "1.0.0", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.0", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "diffie-hellman": "5.0.2", + "inherits": "2.0.3", + "pbkdf2": "3.0.12", + "public-encrypt": "4.0.0", + "randombytes": "2.0.5" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-in-js-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-1.0.3.tgz", + "integrity": "sha1-msfgL3Y8+F2UAXZmVl7WiltfMhU=", + "requires": { + "hyphenate-style-name": "1.0.2" + } + }, + "css-loader": { + "version": "0.28.4", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.4.tgz", + "integrity": "sha1-bPNXkZLONV6LONX0Ldeh8uyJjQ8=", + "dev": true, + "requires": { + "babel-code-frame": "6.22.0", + "css-selector-tokenizer": "0.7.0", + "cssnano": "3.10.0", + "icss-utils": "2.1.0", + "loader-utils": "1.1.0", + "lodash.camelcase": "4.3.0", + "object-assign": "4.1.1", + "postcss": "5.2.17", + "postcss-modules-extract-imports": "1.1.0", + "postcss-modules-local-by-default": "1.2.0", + "postcss-modules-scope": "1.1.0", + "postcss-modules-values": "1.3.0", + "postcss-value-parser": "3.3.0", + "source-list-map": "0.1.8" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "css-selector-tokenizer": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", + "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", + "dev": true, + "requires": { + "cssesc": "0.1.0", + "fastparse": "1.1.1", + "regexpu-core": "1.0.0" + }, + "dependencies": { + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "1.3.2", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + } + } + }, + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true + }, + "cssnano": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", + "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", + "dev": true, + "requires": { + "autoprefixer": "6.7.7", + "decamelize": "1.2.0", + "defined": "1.0.0", + "has": "1.0.1", + "object-assign": "4.1.1", + "postcss": "5.2.17", + "postcss-calc": "5.3.1", + "postcss-colormin": "2.2.2", + "postcss-convert-values": "2.6.1", + "postcss-discard-comments": "2.0.4", + "postcss-discard-duplicates": "2.1.0", + "postcss-discard-empty": "2.1.0", + "postcss-discard-overridden": "0.1.1", + "postcss-discard-unused": "2.2.3", + "postcss-filter-plugins": "2.0.2", + "postcss-merge-idents": "2.1.7", + "postcss-merge-longhand": "2.0.2", + "postcss-merge-rules": "2.1.2", + "postcss-minify-font-values": "1.0.5", + "postcss-minify-gradients": "1.0.5", + "postcss-minify-params": "1.2.2", + "postcss-minify-selectors": "2.1.1", + "postcss-normalize-charset": "1.1.1", + "postcss-normalize-url": "3.0.8", + "postcss-ordered-values": "2.2.3", + "postcss-reduce-idents": "2.4.0", + "postcss-reduce-initial": "1.0.1", + "postcss-reduce-transforms": "1.0.4", + "postcss-svgo": "2.1.6", + "postcss-unique-selectors": "2.0.2", + "postcss-value-parser": "3.3.0", + "postcss-zindex": "2.2.0" + }, + "dependencies": { + "autoprefixer": { + "version": "6.7.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", + "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "dev": true, + "requires": { + "browserslist": "1.7.7", + "caniuse-db": "1.0.30000701", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "5.2.17", + "postcss-value-parser": "3.3.0" + } + }, + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "dev": true, + "requires": { + "caniuse-db": "1.0.30000701", + "electron-to-chromium": "1.3.15" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "csso": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", + "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", + "dev": true, + "requires": { + "clap": "1.2.0", + "source-map": "0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + } + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.24" + } + }, + "damerau-levenshtein": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", + "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-eql": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-2.0.2.tgz", + "integrity": "sha1-sbrAblbwp2d3aG1Qyf63XC7XZ5o=", + "requires": { + "type-detect": "3.0.0" + } + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "2.0.5", + "object-keys": "1.0.11" + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", + "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM=" + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "detect-node": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", + "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "dev": true, + "requires": { + "bn.js": "4.11.7", + "miller-rabin": "4.0.0", + "randombytes": "2.0.5" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.1.1.tgz", + "integrity": "sha1-I2nUUDivBF84mOb6VoYq7T9AKWw=", + "dev": true, + "requires": { + "ip": "1.1.5", + "safe-buffer": "5.1.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "1.1.0" + } + }, + "doctrine": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", + "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, + "dom-helpers": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.2.1.tgz", + "integrity": "sha1-MgPgf+0he9H0JLAZc1WC/Deyglo=" + }, + "dom-walk": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" + }, + "domain-browser": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "echarts": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-3.6.2.tgz", + "integrity": "sha1-hilUyLWBC/+HpIsN4EFu2MS7HDY=", + "requires": { + "zrender": "3.5.2" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "electron-to-chromium": { + "version": "1.3.15", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.15.tgz", + "integrity": "sha1-CDl5NIkcvPrrvRi4KpW1pIETg2k=", + "dev": true + }, + "element-resize-event": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/element-resize-event/-/element-resize-event-2.0.9.tgz", + "integrity": "sha1-L14VgaKW61J1IQwUG8VjQuIY+HY=" + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "dev": true, + "requires": { + "bn.js": "4.11.7", + "brorand": "1.1.0", + "hash.js": "1.1.3", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "emoji-regex": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.0.tgz", + "integrity": "sha512-Vja85njef5T0kGfRUFkyl0etU9+49L1LNKR5oE41wAGRtJR64/a+JX3I8YCIur/uXj4Kt4cNe5i8bfd58ilgKQ==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "0.4.18" + } + }, + "enhanced-resolve": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.3.0.tgz", + "integrity": "sha512-2qbxE7ek3YxPJ1ML6V+satHkzHpJQKWkRHmRx6mfAoW59yP8YH8BFplbegSP+u2hBd6B6KCOpvJQ3dZAP+hkpg==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "memory-fs": "0.4.1", + "object-assign": "4.1.1", + "tapable": "0.2.6" + } + }, + "errno": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", + "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", + "dev": true, + "requires": { + "prr": "0.0.0" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "error-stack-parser": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-1.3.6.tgz", + "integrity": "sha1-4Oc7k+QXE40c18C3RrGkoUhUwpI=", + "requires": { + "stackframe": "0.3.1" + } + }, + "es-abstract": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.7.0.tgz", + "integrity": "sha1-363ndOAb/Nl/lhgCmMRJyGI/uUw=", + "dev": true, + "requires": { + "es-to-primitive": "1.1.1", + "function-bind": "1.1.0", + "is-callable": "1.1.3", + "is-regex": "1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" + } + }, + "es5-ext": { + "version": "0.10.24", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.24.tgz", + "integrity": "sha1-pVh3yZJLwMjZvTwsvhdJWsFwmxQ=", + "dev": true, + "requires": { + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", + "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.24", + "es6-symbol": "3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.24", + "es6-iterator": "2.0.1", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-promise": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.0.5.tgz", + "integrity": "sha1-eILzCt3lskDM+n99eMVIMwlRrkI=", + "dev": true + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.24", + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.24" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.24", + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, + "eslint": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", + "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "dev": true, + "requires": { + "babel-code-frame": "6.22.0", + "chalk": "1.1.3", + "concat-stream": "1.6.0", + "debug": "2.6.8", + "doctrine": "2.0.0", + "escope": "3.6.0", + "espree": "3.4.3", + "esquery": "1.0.0", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "glob": "7.1.2", + "globals": "9.18.0", + "ignore": "3.3.3", + "imurmurhash": "0.1.4", + "inquirer": "0.12.0", + "is-my-json-valid": "2.16.0", + "is-resolvable": "1.0.0", + "js-yaml": "3.9.0", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "1.2.1", + "progress": "1.1.8", + "require-uncached": "1.0.3", + "shelljs": "0.7.8", + "strip-bom": "3.0.0", + "strip-json-comments": "2.0.1", + "table": "3.8.3", + "text-table": "0.2.0", + "user-home": "2.0.0" + }, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "1.0.1" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "inquirer": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "requires": { + "ansi-escapes": "1.4.0", + "ansi-regex": "2.1.1", + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-width": "2.1.0", + "figures": "1.7.0", + "lodash": "4.17.4", + "readline2": "1.0.1", + "run-async": "0.1.0", + "rx-lite": "3.1.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "through": "2.3.8" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + }, + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "shelljs": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "dev": true, + "requires": { + "glob": "7.1.2", + "interpret": "1.0.3", + "rechoir": "0.6.2" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "table": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "dev": true, + "requires": { + "ajv": "4.11.8", + "ajv-keywords": "1.5.1", + "chalk": "1.1.3", + "lodash": "4.17.4", + "slice-ansi": "0.0.4", + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + } + } + }, + "eslint-config-airbnb": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-15.0.2.tgz", + "integrity": "sha512-4nI0Jp3ekTPuYKa2r8R8jq/CsDDaCwXkzV0V0BFyFSKJlQclAqJaJFXM/E6EjSFzVnK2PYNlEiIR3524Z0i2Mw==", + "dev": true, + "requires": { + "eslint-config-airbnb-base": "11.2.0" + } + }, + "eslint-config-airbnb-base": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-11.2.0.tgz", + "integrity": "sha1-GancRIGib3CQRUXsBAEWh2AY+FM=", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.1.tgz", + "integrity": "sha512-yUtXS15gIcij68NmXmP9Ni77AQuCN0itXbCc/jWd8C6/yKZaSNXicpC8cgvjnxVdmfsosIXrjpzFq7GcDryb6A==", + "dev": true, + "requires": { + "debug": "2.6.8", + "resolve": "1.3.3" + } + }, + "eslint-loader": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.9.0.tgz", + "integrity": "sha512-40aN976qSNPyb9ejTqjEthZITpls1SVKtwguahmH1dzGCwQU/vySE+xX33VZmD8csU0ahVNCtFlsPgKqRBiqgg==", + "dev": true, + "requires": { + "loader-fs-cache": "1.0.1", + "loader-utils": "1.1.0", + "object-assign": "4.1.1", + "object-hash": "1.1.8", + "rimraf": "2.6.1" + } + }, + "eslint-module-utils": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", + "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", + "dev": true, + "requires": { + "debug": "2.6.8", + "pkg-dir": "1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "1.1.2" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.7.0.tgz", + "integrity": "sha512-HGYmpU9f/zJaQiKNQOVfHUh2oLWW3STBrCgH0sHTX1xtsxYlH1zjLh8FlQGEIdZSdTbUMaV36WaZ6ImXkenGxQ==", + "dev": true, + "requires": { + "builtin-modules": "1.1.1", + "contains-path": "0.1.0", + "debug": "2.6.8", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "0.3.1", + "eslint-module-utils": "2.1.1", + "has": "1.0.1", + "lodash.cond": "4.5.2", + "minimatch": "3.0.4", + "read-pkg-up": "2.0.0" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "eslint-plugin-jsx-a11y": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-5.1.1.tgz", + "integrity": "sha512-5I9SpoP7gT4wBFOtXT8/tXNPYohHBVfyVfO17vkbC7r9kEIxYJF12D3pKqhk8+xnk12rfxKClS3WCFpVckFTPQ==", + "dev": true, + "requires": { + "aria-query": "0.7.0", + "array-includes": "3.0.3", + "ast-types-flow": "0.0.7", + "axobject-query": "0.1.0", + "damerau-levenshtein": "1.0.4", + "emoji-regex": "6.5.0", + "jsx-ast-utils": "1.4.1" + } + }, + "eslint-plugin-react": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.1.0.tgz", + "integrity": "sha1-J3cKzzn1/UnNCvQIPOWBBOs5DUw=", + "dev": true, + "requires": { + "doctrine": "2.0.0", + "has": "1.0.1", + "jsx-ast-utils": "1.4.1" + } + }, + "espree": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.4.3.tgz", + "integrity": "sha1-KRC1zNSc6JPC//+qtP2LOjG4I3Q=", + "dev": true, + "requires": { + "acorn": "5.1.1", + "acorn-jsx": "3.0.1" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, + "esquery": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, + "requires": { + "estraverse": "4.2.0", + "object-assign": "4.1.1" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "etag": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz", + "integrity": "sha1-b2Ma7zNtbEY2K1F2QETOIWvjwFE=" + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.24" + } + }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "eventsource": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "dev": true, + "requires": { + "original": "1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", + "integrity": "sha1-SXtmrZ/vZc18CKYYCCS6FHa2blM=", + "dev": true, + "requires": { + "create-hash": "1.1.3" + } + }, + "exec-sh": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.0.tgz", + "integrity": "sha1-FPdd4/INKG75MwmbLOUKkDWc7xA=", + "requires": { + "merge": "1.2.0" + } + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "express": { + "version": "4.15.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.15.3.tgz", + "integrity": "sha1-urZdDwOqgMNYQIly/HAPkWlEtmI=", + "requires": { + "accepts": "1.3.3", + "array-flatten": "1.1.1", + "content-disposition": "0.5.2", + "content-type": "1.0.2", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.7", + "depd": "1.1.0", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.0", + "finalhandler": "1.0.3", + "fresh": "0.5.0", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.1", + "path-to-regexp": "0.1.7", + "proxy-addr": "1.1.4", + "qs": "6.4.0", + "range-parser": "1.2.0", + "send": "0.15.3", + "serve-static": "1.12.3", + "setprototypeof": "1.0.3", + "statuses": "1.3.1", + "type-is": "1.6.15", + "utils-merge": "1.0.0", + "vary": "1.1.1" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "debug": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "express-graphql": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/express-graphql/-/express-graphql-0.5.4.tgz", + "integrity": "sha1-QTR34+/abXQ354j372yZSRTnn4g=", + "requires": { + "accepts": "1.3.3", + "content-type": "1.0.2", + "http-errors": "1.6.1", + "raw-body": "2.2.0" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "extract-zip": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.5.0.tgz", + "integrity": "sha1-ksz22B73Cp+kwXRxFMzvbYaIpsQ=", + "dev": true, + "requires": { + "concat-stream": "1.5.0", + "debug": "0.7.4", + "mkdirp": "0.5.0", + "yauzl": "2.4.1" + }, + "dependencies": { + "concat-stream": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.0.tgz", + "integrity": "sha1-U/fUPFHF5D+ByP3QMyHGMb5o1hE=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.0.6", + "typedarray": "0.0.6" + } + }, + "debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", + "dev": true + }, + "mkdirp": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "0.10.31", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "extsprintf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastparse": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", + "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": "0.6.5" + } + }, + "fbjs": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.12.tgz", + "integrity": "sha1-ELXZL3bUVXX9Y6IX1OoCvqL47QQ=", + "requires": { + "core-js": "1.2.7", + "isomorphic-fetch": "2.2.1", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "promise": "7.3.1", + "setimmediate": "1.0.5", + "ua-parser-js": "0.7.13" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + } + } + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "1.2.0" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "1.2.2", + "object-assign": "4.1.1" + } + }, + "file-loader": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-0.11.2.tgz", + "integrity": "sha512-N+uhF3mswIFeziHQjGScJ/yHXYt3DiLBeC+9vWW+WjUBiClMSOlV1YrXQi+7KM2aA3Rn4Bybgv+uXFQbfkzpvg==", + "dev": true, + "requires": { + "loader-utils": "1.1.0" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "finalhandler": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.3.tgz", + "integrity": "sha1-70fneVDpmXgOhgIqVg4yF+DQzIk=", + "requires": { + "debug": "2.6.7", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.1", + "statuses": "1.3.1", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "1.0.1", + "make-dir": "1.0.0", + "pkg-dir": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "flat-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", + "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", + "dev": true, + "requires": { + "circular-json": "0.3.1", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + } + }, + "flatten": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", + "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", + "dev": true + }, + "flux-standard-action": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/flux-standard-action/-/flux-standard-action-0.6.1.tgz", + "integrity": "sha1-bzQhG5SDTqHDzDD056+tPQ+/caI=", + "requires": { + "lodash.isplainobject": "3.2.0" + } + }, + "follow-redirects": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-0.0.7.tgz", + "integrity": "sha1-NLkLqyqRGqNHVx2pDyK9NuzYqRk=", + "requires": { + "debug": "2.6.8", + "stream-consume": "0.1.0" + } + }, + "font-awesome": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", + "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "formsy-material-ui": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/formsy-material-ui/-/formsy-material-ui-0.6.3.tgz", + "integrity": "sha1-GyAylh4bFaAip08Tnxtd/pTUTXk=", + "requires": { + "keycode": "2.1.9" + } + }, + "forwarded": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", + "integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M=" + }, + "fresh": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", + "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=" + }, + "front-matter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-2.1.0.tgz", + "integrity": "sha1-C9/0LLrSs1wHrHCFgReJdZ+YWMA=", + "dev": true, + "requires": { + "js-yaml": "3.9.0" + } + }, + "fs-extra": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", + "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1", + "path-is-absolute": "1.0.1", + "rimraf": "2.6.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", + "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.6.2", + "node-pre-gyp": "0.6.36" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.36", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "function-bind": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", + "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "1.1.2", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "gaze": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", + "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", + "dev": true, + "requires": { + "globule": "1.2.0" + } + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "1.0.2" + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "global": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", + "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "requires": { + "min-document": "2.19.0", + "process": "0.5.2" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "globule": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", + "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", + "dev": true, + "requires": { + "glob": "7.1.2", + "lodash": "4.17.4", + "minimatch": "3.0.4" + } + }, + "gonzales-pe": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-3.4.7.tgz", + "integrity": "sha1-F8e+Z61sr/Ynej44esc26YPSgOw=", + "dev": true, + "requires": { + "minimist": "1.1.3" + }, + "dependencies": { + "minimist": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz", + "integrity": "sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag=", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "graphql": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.6.2.tgz", + "integrity": "sha1-Gc3LF+WGLWQ5agaE+S975k6Q568=", + "requires": { + "iterall": "1.0.2" + } + }, + "graphql-relay": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/graphql-relay/-/graphql-relay-0.4.4.tgz", + "integrity": "sha1-h2plREW2r0U5+By5vv1c1+rRKd0=" + }, + "handle-thing": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", + "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "dev": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "dev": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + }, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + } + } + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "hasha": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", + "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", + "dev": true, + "requires": { + "is-stream": "1.1.0", + "pinkie-promise": "2.0.1" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "history": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/history/-/history-4.6.3.tgz", + "integrity": "sha1-bXI6hxLFgda+836MJvSu3G64aWc=", + "requires": { + "invariant": "2.2.2", + "loose-envify": "1.3.1", + "resolve-pathname": "2.1.0", + "value-equal": "0.2.1", + "warning": "3.0.0" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "1.1.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "hoist-non-react-statics": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", + "integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs=" + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "obuf": "1.1.1", + "readable-stream": "2.3.3", + "wbuf": "1.7.2" + } + }, + "html-comment-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", + "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=", + "dev": true + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz", + "integrity": "sha1-X4uO2YrKVFZWv1cplzh/kEpyIlc=", + "requires": { + "depd": "1.1.0", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.3.1" + } + }, + "http-proxy": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", + "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", + "dev": true, + "requires": { + "eventemitter3": "1.2.0", + "requires-port": "1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", + "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", + "dev": true, + "requires": { + "http-proxy": "1.16.2", + "is-glob": "3.1.0", + "lodash": "4.17.4", + "micromatch": "2.3.11" + }, + "dependencies": { + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.1" + } + }, + "https-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", + "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", + "dev": true + }, + "hyphenate-style-name": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz", + "integrity": "sha1-MRYKNpMK2vH8BMYHT360FGXU7Es=" + }, + "iconv-lite": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", + "integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA==" + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", + "dev": true + }, + "icss-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", + "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", + "dev": true, + "requires": { + "postcss": "6.0.6" + } + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", + "dev": true + }, + "ignore": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.3.tgz", + "integrity": "sha1-QyNS5XrM2HqzEQ6C0/6g5HgSFW0=", + "dev": true + }, + "immutable": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.1.tgz", + "integrity": "sha1-IAgH8Rqw9ycQ6khVQt4IgHX2jNI=" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inline-style-prefixer": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-3.0.6.tgz", + "integrity": "sha1-sn/jCbQWijHq84yOjGCrnnwRcx8=", + "requires": { + "bowser": "1.7.1", + "css-in-js-utils": "1.0.3" + } + }, + "internal-ip": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", + "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", + "dev": true, + "requires": { + "meow": "3.7.0" + } + }, + "interpret": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", + "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", + "dev": true + }, + "intl-locales-supported": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/intl-locales-supported/-/intl-locales-supported-1.0.0.tgz", + "integrity": "sha1-mp2U2/EEqHgYiBlS3LeCBT8K7vo=" + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "requires": { + "loose-envify": "1.3.1" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ipaddr.js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.3.0.tgz", + "integrity": "sha1-HgOlL9rYOou7KyXL9JmLTP/NPew=" + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "1.8.0" + } + }, + "is-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "dev": true + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-my-json-valid": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz", + "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=", + "dev": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "1.0.1" + } + }, + "is-resolvable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", + "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", + "dev": true, + "requires": { + "tryit": "1.0.3" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-svg": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", + "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "dev": true, + "requires": { + "html-comment-regex": "1.1.1" + } + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "1.7.1", + "whatwg-fetch": "2.0.3" + } + }, + "isomorphic-relay": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/isomorphic-relay/-/isomorphic-relay-0.7.4.tgz", + "integrity": "sha1-QHAvpQ0XKmnk9gIoqm0SIMJk7Sw=", + "requires": { + "babel-runtime": "6.23.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", + "integrity": "sha512-0+1vDkmzxqJIn5rcoEqapSB4DmPxE31EtI2dF2aCkV5esN9EWHxZ0dwgDClivMXJqE7zaYQxq30hj5L0nlTN5Q==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.4.tgz", + "integrity": "sha1-6f2SDkdn89Ge3HZeLWs/XMvQ7qg=", + "dev": true, + "requires": { + "babel-generator": "6.25.0", + "babel-template": "6.25.0", + "babel-traverse": "6.25.0", + "babel-types": "6.25.0", + "babylon": "6.17.4", + "istanbul-lib-coverage": "1.1.1", + "semver": "5.3.0" + } + }, + "iterall": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.0.2.tgz", + "integrity": "sha1-QaLpbOntpeYcdn7l3DEjc7sEbpE=" + }, + "jquery": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz", + "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=" + }, + "jquery-slimscroll": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/jquery-slimscroll/-/jquery-slimscroll-1.3.8.tgz", + "integrity": "sha1-hIHETnpHaHZTkIoo9/cK7WTITjY=", + "requires": { + "jquery": "3.2.1" + } + }, + "js-base64": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "integrity": "sha1-8OgK4DmkvWVLXygfyT8EqRSn/M4=", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "js-yaml": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.9.0.tgz", + "integrity": "sha512-0LoUNELX4S+iofCT8f4uEHIiRBR+c2AINyC8qRWfC6QNruLtxVZRJaPcu/xwMgFIgDxF25tGHaDjvxzJCNE9yw==", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-loader": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.4.tgz", + "integrity": "sha1-i6oTZaYy9Yo8RtIBdfxgAsluN94=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "jsprim": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", + "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "jsuri": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsuri/-/jsuri-1.3.1.tgz", + "integrity": "sha1-zZP8aoeyVRQst7D0efAFF6uTle0=" + }, + "jsx-ast-utils": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", + "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=", + "dev": true + }, + "kew": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", + "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", + "dev": true + }, + "keycode": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.1.9.tgz", + "integrity": "sha1-lkojxU5IiUBbSGGlyfBIDUUUHfo=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "loader-fs-cache": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz", + "integrity": "sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw=", + "dev": true, + "requires": { + "find-cache-dir": "0.1.1", + "mkdirp": "0.5.1" + }, + "dependencies": { + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "requires": { + "commondir": "1.0.1", + "mkdirp": "0.5.1", + "pkg-dir": "1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "1.1.2" + } + } + } + }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.1.3", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "lodash-compat": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/lodash-compat/-/lodash-compat-3.10.2.tgz", + "integrity": "sha1-xpQBKKnTD46QLNLPmf0Muk7PwYM=" + }, + "lodash-es": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.4.tgz", + "integrity": "sha1-3MHXVS4VCgZABzupyzHXDwMpUOc=" + }, + "lodash._basefor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", + "integrity": "sha1-dVC06SGO8J+tJDQ7YSAhx5tMIMI=" + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "dev": true + }, + "lodash.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.cond": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", + "dev": true + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + }, + "lodash.isplainobject": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-3.2.0.tgz", + "integrity": "sha1-moI4rhayAEMpYM1zRlEtASP79MU=", + "requires": { + "lodash._basefor": "3.0.3", + "lodash.isarguments": "3.1.0", + "lodash.keysin": "3.0.8" + } + }, + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", + "dev": true + }, + "lodash.keysin": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/lodash.keysin/-/lodash.keysin-3.0.8.tgz", + "integrity": "sha1-IsRJPrvtsUJ5YqVLRFssinZ/tH8=", + "requires": { + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz", + "integrity": "sha1-aYhLoUSsM/5plzemCG3v+t0PicU=" + }, + "lodash.mergewith": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz", + "integrity": "sha1-FQzwoWeR9ZA7iJHqsVRgknS96lU=", + "dev": true + }, + "lodash.tail": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", + "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", + "dev": true + }, + "lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "3.0.2" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "macaddress": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", + "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=", + "dev": true + }, + "make-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz", + "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "material-ui": { + "version": "0.18.5", + "resolved": "https://registry.npmjs.org/material-ui/-/material-ui-0.18.5.tgz", + "integrity": "sha512-ZJxfuq6hO+u2JrXVjC1WSyQRX9vHoPyGiTiFohkVdZ5BGqhvTJs9zVZl9x36qGDdZ4Wtw5cMOms/BkwQ2TaoDQ==", + "requires": { + "babel-runtime": "6.23.0", + "inline-style-prefixer": "3.0.6", + "keycode": "2.1.9", + "lodash.merge": "4.6.0", + "lodash.throttle": "4.1.1", + "prop-types": "15.5.10", + "react-event-listener": "0.4.5", + "react-transition-group": "1.2.0", + "recompose": "0.23.4", + "simple-assign": "0.1.0", + "warning": "3.0.0" + } + }, + "material-ui-geosuggest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/material-ui-geosuggest/-/material-ui-geosuggest-0.7.1.tgz", + "integrity": "sha1-uF5dQDeBboHjVMLOYqtPXv24h9w=", + "requires": { + "babel-runtime": "6.23.0", + "material-ui": "0.16.7" + }, + "dependencies": { + "inline-style-prefixer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-2.0.5.tgz", + "integrity": "sha1-wVPH6I/YT+9cYC6VqBaLJ3BnH+c=", + "requires": { + "bowser": "1.7.1", + "hyphenate-style-name": "1.0.2" + } + }, + "material-ui": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/material-ui/-/material-ui-0.16.7.tgz", + "integrity": "sha1-XsUIDV8ieBcJLESRBd+cvIgHlBw=", + "requires": { + "babel-runtime": "6.23.0", + "inline-style-prefixer": "2.0.5", + "keycode": "2.1.9", + "lodash.merge": "4.6.0", + "lodash.throttle": "4.1.1", + "react-addons-create-fragment": "15.6.0", + "react-addons-transition-group": "15.6.0", + "react-event-listener": "0.4.5", + "recompose": "0.21.2", + "simple-assign": "0.1.0", + "warning": "3.0.0" + } + }, + "recompose": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.21.2.tgz", + "integrity": "sha1-/z+9sjl7HHfEfUUb4qY7kpXURoE=", + "requires": { + "change-emitter": "0.1.6", + "fbjs": "0.8.12", + "hoist-non-react-statics": "1.2.0", + "symbol-observable": "1.0.4" + } + } + } + }, + "math-expression-evaluator": { + "version": "1.2.17", + "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", + "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "0.1.4", + "readable-stream": "2.3.3" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "merge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", + "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.3" + } + }, + "miller-rabin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", + "integrity": "sha1-SmL7HUKTPAVYOYL0xxb2+55sbT0=", + "dev": true, + "requires": { + "bn.js": "4.11.7", + "brorand": "1.1.0" + } + }, + "mime": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz", + "integrity": "sha1-WR2E02U6awtKO5343lqoEI5y5eA=" + }, + "mime-db": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", + "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=" + }, + "mime-types": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", + "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", + "requires": { + "mime-db": "1.27.0" + } + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "requires": { + "dom-walk": "0.1.1" + } + }, + "minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "dev": true, + "requires": { + "for-in": "0.1.8", + "is-extendable": "0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multicast-dns": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.1.1.tgz", + "integrity": "sha1-bn3oalcIcqsXBYrepxYLvsqBTd4=", + "dev": true, + "requires": { + "dns-packet": "1.1.1", + "thunky": "0.1.0" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "nan": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", + "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "node-dir": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", + "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=", + "dev": true, + "requires": { + "minimatch": "3.0.4" + } + }, + "node-fetch": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.1.tgz", + "integrity": "sha512-j8XsFGCLw79vWXkZtMSmmLaOk9z5SQ9bV/tkbZVCqvgwzrjAGq66igobLofHtF63NvMTp2WjytpsNTGKa+XRIQ==", + "requires": { + "encoding": "0.1.12", + "is-stream": "1.1.0" + } + }, + "node-forge": { + "version": "0.6.33", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.6.33.tgz", + "integrity": "sha1-RjgRh59XPUUVWtap9D3ClujoXrw=", + "dev": true + }, + "node-gyp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz", + "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=", + "dev": true, + "requires": { + "fstream": "1.0.11", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "npmlog": "4.1.2", + "osenv": "0.1.4", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "which": "1.2.14" + } + }, + "node-libs-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz", + "integrity": "sha1-o6WeyXAkmFtG6Vg3lkb5bEthZkY=", + "dev": true, + "requires": { + "assert": "1.4.1", + "browserify-zlib": "0.1.4", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.11.1", + "domain-browser": "1.1.7", + "events": "1.1.1", + "https-browserify": "0.0.1", + "os-browserify": "0.2.1", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.3", + "stream-browserify": "2.0.1", + "stream-http": "2.7.2", + "string_decoder": "0.10.31", + "timers-browserify": "2.0.2", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.3", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "node-sass": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.5.3.tgz", + "integrity": "sha1-0JydEXlkEjnRuX/8YjH9zsU+FWg=", + "dev": true, + "requires": { + "async-foreach": "0.1.3", + "chalk": "1.1.3", + "cross-spawn": "3.0.1", + "gaze": "1.1.2", + "get-stdin": "4.0.1", + "glob": "7.1.2", + "in-publish": "2.0.0", + "lodash.assign": "4.2.0", + "lodash.clonedeep": "4.5.0", + "lodash.mergewith": "4.6.0", + "meow": "3.7.0", + "mkdirp": "0.5.1", + "nan": "2.6.2", + "node-gyp": "3.6.2", + "npmlog": "4.1.2", + "request": "2.81.0", + "sass-graph": "2.2.4", + "stdout-stream": "1.4.0" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1.1.0" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.3.0", + "validate-npm-package-license": "3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.0.2" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "4.1.1", + "prepend-http": "1.0.4", + "query-string": "4.3.4", + "sort-keys": "1.1.2" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "null-loader": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-0.1.1.tgz", + "integrity": "sha1-F76av80/8OFRL2/Er8sfUDk3j64=", + "dev": true + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-hash": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.1.8.tgz", + "integrity": "sha1-KKZZz5h9lqTavnhgKJ87UybEoDw=", + "dev": true + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "dev": true + }, + "object.assign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz", + "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "function-bind": "1.1.0", + "object-keys": "1.0.11" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "obuf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz", + "integrity": "sha1-EEEktsYCxnlogaBCVB0220OlJk4=", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "opn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", + "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", + "dev": true, + "requires": { + "object-assign": "4.1.1", + "pinkie-promise": "2.0.1" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + } + }, + "original": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", + "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", + "dev": true, + "requires": { + "url-parse": "1.0.5" + }, + "dependencies": { + "url-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", + "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", + "dev": true, + "requires": { + "querystringify": "0.0.4", + "requires-port": "1.0.0" + } + } + } + }, + "os-browserify": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", + "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "p-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", + "dev": true + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.1.0" + } + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "dev": true + }, + "parse-asn1": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "dev": true, + "requires": { + "asn1.js": "4.9.1", + "browserify-aes": "1.0.6", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.0", + "pbkdf2": "3.0.12" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "parseurl": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", + "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pbkdf2": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.12.tgz", + "integrity": "sha1-vjZ4XFBn6kjYBv+SMojF91C2uKI=", + "dev": true, + "requires": { + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.8" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "phantomjs-prebuilt": { + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.14.tgz", + "integrity": "sha1-1T0xH8+30dCN2yQBRVjxGIxRbaA=", + "dev": true, + "requires": { + "es6-promise": "4.0.5", + "extract-zip": "1.5.0", + "fs-extra": "1.0.0", + "hasha": "2.2.0", + "kew": "0.7.0", + "progress": "1.1.8", + "request": "2.79.0", + "request-progress": "2.0.1", + "which": "1.2.14" + }, + "dependencies": { + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true + }, + "fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1" + } + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "commander": "2.11.0", + "is-my-json-valid": "2.16.0", + "pinkie-promise": "2.0.1" + } + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "dev": true + }, + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.11.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "qs": "6.3.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.4.3", + "uuid": "3.1.0" + } + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true + } + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "2.1.0" + } + }, + "portfinder": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", + "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", + "dev": true, + "requires": { + "async": "1.5.2", + "debug": "2.6.8", + "mkdirp": "0.5.1" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "postcss": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.6.tgz", + "integrity": "sha1-u6TVjohPx4yEDRU54Q7dqruPc70=", + "dev": true, + "requires": { + "chalk": "2.0.1", + "source-map": "0.5.6", + "supports-color": "4.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.1.0.tgz", + "integrity": "sha1-CcIC1ckX7CMYjKpcnLkXnNlUd1A=", + "dev": true, + "requires": { + "color-convert": "1.9.0" + } + }, + "chalk": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz", + "integrity": "sha512-Mp+FXEI+FrwY/XYV45b2YD3E8i3HwnEAoFcM0qlZzq/RZ9RwWitt2Y/c7cqRAz70U7hfekqx6qNYthuKFO6K0g==", + "dev": true, + "requires": { + "ansi-styles": "3.1.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.2.0" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.0.tgz", + "integrity": "sha512-Ts0Mu/A1S1aZxEJNG88I4Oc9rcZSBFNac5e27yh4j2mqbhZSSzR1Ah79EYwSn9Zuh7lrlGD2cVGzw1RKGzyLSg==", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "postcss-calc": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", + "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", + "dev": true, + "requires": { + "postcss": "5.2.17", + "postcss-message-helpers": "2.0.0", + "reduce-css-calc": "1.3.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-colormin": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", + "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", + "dev": true, + "requires": { + "colormin": "1.1.2", + "postcss": "5.2.17", + "postcss-value-parser": "3.3.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-convert-values": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", + "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", + "dev": true, + "requires": { + "postcss": "5.2.17", + "postcss-value-parser": "3.3.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-discard-comments": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", + "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", + "dev": true, + "requires": { + "postcss": "5.2.17" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-discard-duplicates": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", + "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", + "dev": true, + "requires": { + "postcss": "5.2.17" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-discard-empty": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", + "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", + "dev": true, + "requires": { + "postcss": "5.2.17" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-discard-overridden": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", + "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", + "dev": true, + "requires": { + "postcss": "5.2.17" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-discard-unused": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", + "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", + "dev": true, + "requires": { + "postcss": "5.2.17", + "uniqs": "2.0.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-filter-plugins": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", + "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", + "dev": true, + "requires": { + "postcss": "5.2.17", + "uniqid": "4.1.1" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-load-config": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", + "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", + "dev": true, + "requires": { + "cosmiconfig": "2.1.3", + "object-assign": "4.1.1", + "postcss-load-options": "1.2.0", + "postcss-load-plugins": "2.3.0" + } + }, + "postcss-load-options": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", + "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", + "dev": true, + "requires": { + "cosmiconfig": "2.1.3", + "object-assign": "4.1.1" + } + }, + "postcss-load-plugins": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", + "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", + "dev": true, + "requires": { + "cosmiconfig": "2.1.3", + "object-assign": "4.1.1" + } + }, + "postcss-loader": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.6.tgz", + "integrity": "sha512-HIq7yy1hh9KI472Y38iSRV4WupZUNy6zObkxQM/ZuInoaE2+PyX4NcO6jjP5HG5mXL7j5kcNEl0fAG4Kva7O9w==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "postcss": "6.0.6", + "postcss-load-config": "1.2.0", + "schema-utils": "0.3.0" + } + }, + "postcss-merge-idents": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", + "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", + "dev": true, + "requires": { + "has": "1.0.1", + "postcss": "5.2.17", + "postcss-value-parser": "3.3.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-merge-longhand": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", + "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", + "dev": true, + "requires": { + "postcss": "5.2.17" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-merge-rules": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", + "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", + "dev": true, + "requires": { + "browserslist": "1.7.7", + "caniuse-api": "1.6.1", + "postcss": "5.2.17", + "postcss-selector-parser": "2.2.3", + "vendors": "1.0.1" + }, + "dependencies": { + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "dev": true, + "requires": { + "caniuse-db": "1.0.30000701", + "electron-to-chromium": "1.3.15" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-message-helpers": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", + "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", + "dev": true + }, + "postcss-minify-font-values": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", + "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", + "dev": true, + "requires": { + "object-assign": "4.1.1", + "postcss": "5.2.17", + "postcss-value-parser": "3.3.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-minify-gradients": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", + "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", + "dev": true, + "requires": { + "postcss": "5.2.17", + "postcss-value-parser": "3.3.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-minify-params": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", + "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", + "dev": true, + "requires": { + "alphanum-sort": "1.0.2", + "postcss": "5.2.17", + "postcss-value-parser": "3.3.0", + "uniqs": "2.0.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-minify-selectors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", + "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", + "dev": true, + "requires": { + "alphanum-sort": "1.0.2", + "has": "1.0.1", + "postcss": "5.2.17", + "postcss-selector-parser": "2.2.3" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", + "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", + "dev": true, + "requires": { + "postcss": "6.0.6" + } + }, + "postcss-modules-local-by-default": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "dev": true, + "requires": { + "css-selector-tokenizer": "0.7.0", + "postcss": "6.0.6" + } + }, + "postcss-modules-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "dev": true, + "requires": { + "css-selector-tokenizer": "0.7.0", + "postcss": "6.0.6" + } + }, + "postcss-modules-values": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "dev": true, + "requires": { + "icss-replace-symbols": "1.1.0", + "postcss": "6.0.6" + } + }, + "postcss-normalize-charset": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", + "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", + "dev": true, + "requires": { + "postcss": "5.2.17" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-normalize-url": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", + "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", + "dev": true, + "requires": { + "is-absolute-url": "2.1.0", + "normalize-url": "1.9.1", + "postcss": "5.2.17", + "postcss-value-parser": "3.3.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-ordered-values": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", + "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", + "dev": true, + "requires": { + "postcss": "5.2.17", + "postcss-value-parser": "3.3.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-reduce-idents": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", + "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", + "dev": true, + "requires": { + "postcss": "5.2.17", + "postcss-value-parser": "3.3.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-reduce-initial": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", + "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", + "dev": true, + "requires": { + "postcss": "5.2.17" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-reduce-transforms": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", + "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", + "dev": true, + "requires": { + "has": "1.0.1", + "postcss": "5.2.17", + "postcss-value-parser": "3.3.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", + "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", + "dev": true, + "requires": { + "flatten": "1.0.2", + "indexes-of": "1.0.1", + "uniq": "1.0.1" + } + }, + "postcss-svgo": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", + "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", + "dev": true, + "requires": { + "is-svg": "2.1.0", + "postcss": "5.2.17", + "postcss-value-parser": "3.3.0", + "svgo": "0.7.2" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-unique-selectors": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", + "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", + "dev": true, + "requires": { + "alphanum-sort": "1.0.2", + "postcss": "5.2.17", + "uniqs": "2.0.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-value-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", + "dev": true + }, + "postcss-zindex": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", + "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", + "dev": true, + "requires": { + "has": "1.0.1", + "postcss": "5.2.17", + "uniqs": "2.0.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.1.9", + "source-map": "0.5.6", + "supports-color": "3.2.3" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "private": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", + "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=", + "dev": true + }, + "process": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "2.0.6" + } + }, + "prop-types": { + "version": "15.5.10", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", + "integrity": "sha1-J5ffwxJhguOpXj37suiT3ddFYVQ=", + "requires": { + "fbjs": "0.8.12", + "loose-envify": "1.3.1" + } + }, + "proxy-addr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.4.tgz", + "integrity": "sha1-J+VF9pYKRKYn2bREZ+NcG2tM4vM=", + "requires": { + "forwarded": "0.1.0", + "ipaddr.js": "1.3.0" + } + }, + "prr": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", + "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "dev": true, + "requires": { + "bn.js": "4.11.7", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "parse-asn1": "5.1.0", + "randombytes": "2.0.5" + } + }, + "pubsub-js": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/pubsub-js/-/pubsub-js-1.5.7.tgz", + "integrity": "sha1-qfOGrBQbCQWxnLst1XJWJl+XV0Q=" + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "q": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.0.tgz", + "integrity": "sha1-3QG6ydBtMObyGa7LglPunr3DCPE=", + "dev": true + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "requires": { + "object-assign": "4.1.1", + "strict-uri-encode": "1.1.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", + "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=", + "dev": true + }, + "raf": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.3.2.tgz", + "integrity": "sha1-DBO+C1tJtG921maSSNUnzysC/ic=", + "requires": { + "performance-now": "2.1.0" + } + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "randombytes": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", + "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz", + "integrity": "sha1-mUl2z2pQlqQRYoQEkvC9xdbn+5Y=", + "requires": { + "bytes": "2.5.0", + "iconv-lite": "0.4.18", + "unpipe": "1.0.0" + } + }, + "rc-queue-anim": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/rc-queue-anim/-/rc-queue-anim-1.0.5.tgz", + "integrity": "sha1-95jmbu2KCZeizn7zGCS/0XWtKxw=", + "requires": { + "babel-runtime": "6.23.0", + "prop-types": "15.5.10", + "rc-tween-one": "1.2.9" + } + }, + "rc-tween-one": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/rc-tween-one/-/rc-tween-one-1.2.9.tgz", + "integrity": "sha1-MgWYqUAvm36b4xsopJ+dsv5ZDGI=", + "requires": { + "babel-runtime": "6.23.0", + "deep-eql": "2.0.2", + "prop-types": "15.5.10", + "raf": "3.3.2", + "style-utils": "0.1.13", + "tween-functions": "1.2.0" + } + }, + "react": { + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/react/-/react-15.6.1.tgz", + "integrity": "sha1-uqhDTsZ4C96ZfNw4C3nNM7ljk98=", + "requires": { + "create-react-class": "15.6.0", + "fbjs": "0.8.12", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "prop-types": "15.5.10" + } + }, + "react-addons-create-fragment": { + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/react-addons-create-fragment/-/react-addons-create-fragment-15.6.0.tgz", + "integrity": "sha1-r5GiKx+wld0B8a+6Q7/Q71idiyA=", + "requires": { + "fbjs": "0.8.12", + "loose-envify": "1.3.1", + "object-assign": "4.1.1" + } + }, + "react-addons-transition-group": { + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/react-addons-transition-group/-/react-addons-transition-group-15.6.0.tgz", + "integrity": "sha1-DyILn5WX2zqAqI29b+gF/GRM4hw=", + "requires": { + "react-transition-group": "1.2.0" + } + }, + "react-bootstrap": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-0.30.10.tgz", + "integrity": "sha1-27ppCVlfKvTZGTfbD5bsjC3y0ag=", + "requires": { + "babel-runtime": "6.23.0", + "classnames": "2.2.5", + "dom-helpers": "3.2.1", + "invariant": "2.2.2", + "keycode": "2.1.9", + "prop-types": "15.5.10", + "react-overlays": "0.6.12", + "react-prop-types": "0.4.0", + "uncontrollable": "4.1.0", + "warning": "3.0.0" + } + }, + "react-deep-force-update": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/react-deep-force-update/-/react-deep-force-update-2.0.1.tgz", + "integrity": "sha1-T39sEsPn3kLzRZkqPFGCNvoeytM=" + }, + "react-dom": { + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.1.tgz", + "integrity": "sha1-LLDtQZEDjlPCCes6eaI+Kkz5lHA=", + "requires": { + "fbjs": "0.8.12", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "prop-types": "15.5.10" + } + }, + "react-draggable": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-3.0.5.tgz", + "integrity": "sha512-qo76q6+pafyGllbmfc+CgWfOkwY9v3UoJa3jp6xG2vdsRY8uJTN1kqNievLj0uVNjEqCvZ0OFiEBxlAJNj3OTg==", + "requires": { + "classnames": "2.2.5", + "prop-types": "15.6.0" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "fbjs": { + "version": "0.8.16", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", + "requires": { + "core-js": "1.2.7", + "isomorphic-fetch": "2.2.1", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "promise": "7.3.1", + "setimmediate": "1.0.5", + "ua-parser-js": "0.7.13" + } + }, + "prop-types": { + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", + "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", + "requires": { + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1" + } + } + } + }, + "react-event-listener": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/react-event-listener/-/react-event-listener-0.4.5.tgz", + "integrity": "sha1-4+iVoJcM8U7o+JAROvaBl6vz0LE=", + "requires": { + "babel-runtime": "6.23.0", + "fbjs": "0.8.12", + "prop-types": "15.5.10", + "warning": "3.0.0" + } + }, + "react-hot-loader": { + "version": "3.0.0-beta.7", + "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-3.0.0-beta.7.tgz", + "integrity": "sha1-1YR7gWXXMcTVsw2G1dRxYieg+oM=", + "requires": { + "babel-template": "6.25.0", + "global": "4.3.2", + "react-deep-force-update": "2.0.1", + "react-proxy": "3.0.0-alpha.1", + "redbox-react": "1.4.3", + "source-map": "0.4.4" + } + }, + "react-imgix": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/react-imgix/-/react-imgix-7.1.1.tgz", + "integrity": "sha512-xg6kRZ2Q8F/H0hcu+KFJbgbVQiYTs+vZCCny8Uel9YdYNpZFGxhXXfmDPtY6BviTpbkpkWOkhyVWV6Fmx626vw==", + "requires": { + "js-base64": "2.4.3", + "jsuri": "1.3.1" + }, + "dependencies": { + "js-base64": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", + "integrity": "sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw==" + } + } + }, + "react-motion": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/react-motion/-/react-motion-0.4.8.tgz", + "integrity": "sha1-I7st0nwtjgDSKeRVctEF789Ao14=", + "requires": { + "create-react-class": "15.6.0", + "performance-now": "2.1.0", + "prop-types": "15.5.10", + "raf": "3.3.2" + } + }, + "react-overlays": { + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-0.6.12.tgz", + "integrity": "sha1-oHnHUMxCnX20x0dKlbS1QDPiVcM=", + "requires": { + "classnames": "2.2.5", + "dom-helpers": "3.2.1", + "react-prop-types": "0.4.0", + "warning": "3.0.0" + } + }, + "react-prop-types": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/react-prop-types/-/react-prop-types-0.4.0.tgz", + "integrity": "sha1-+ZsL+0AGkpya8gUefBQUpcdbk9A=", + "requires": { + "warning": "3.0.0" + } + }, + "react-proxy": { + "version": "3.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/react-proxy/-/react-proxy-3.0.0-alpha.1.tgz", + "integrity": "sha1-RABCa8+oDKpnJMd1VpUxUgn6Swc=", + "requires": { + "lodash": "4.17.4" + } + }, + "react-redux": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.0.5.tgz", + "integrity": "sha1-+OjHsjlCJXblLWt9sGQ5RpvphGo=", + "requires": { + "create-react-class": "15.6.0", + "hoist-non-react-statics": "1.2.0", + "invariant": "2.2.2", + "lodash": "4.17.4", + "lodash-es": "4.17.4", + "loose-envify": "1.3.1", + "prop-types": "15.5.10" + } + }, + "react-relay": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/react-relay/-/react-relay-0.9.3.tgz", + "integrity": "sha1-dN3Y7S1g/ecwNHGtpTBjQvXbmaY=", + "requires": { + "babel-runtime": "6.23.0", + "fbjs": "0.8.12", + "react-static-container": "1.0.1" + } + }, + "react-router": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-3.0.5.tgz", + "integrity": "sha1-w7eHN1gEWou8lWKu9P9LyMznwTY=", + "requires": { + "create-react-class": "15.6.0", + "history": "3.3.0", + "hoist-non-react-statics": "1.2.0", + "invariant": "2.2.2", + "loose-envify": "1.3.1", + "prop-types": "15.5.10", + "warning": "3.0.0" + }, + "dependencies": { + "history": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/history/-/history-3.3.0.tgz", + "integrity": "sha1-/O3M6PEpdTcVRdc1RhAzV5ptrpw=", + "requires": { + "invariant": "2.2.2", + "loose-envify": "1.3.1", + "query-string": "4.3.4", + "warning": "3.0.0" + } + } + } + }, + "react-router-redux": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/react-router-redux/-/react-router-redux-4.0.8.tgz", + "integrity": "sha1-InQDWWtRUeGCN32rg1tdRfD4BU4=" + }, + "react-static-container": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-static-container/-/react-static-container-1.0.1.tgz", + "integrity": "sha1-aUwN1oqJa4eVGa+1SDmcwZicmrA=" + }, + "react-tap-event-plugin": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/react-tap-event-plugin/-/react-tap-event-plugin-2.0.1.tgz", + "integrity": "sha1-MWvrO8ZVbinshppyk+icgmqQdNI=", + "requires": { + "fbjs": "0.8.12" + } + }, + "react-transition-group": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-1.2.0.tgz", + "integrity": "sha1-tR/JIbDDg1p+98Vxx5/ILHPpIE8=", + "requires": { + "chain-function": "1.0.0", + "dom-helpers": "3.2.1", + "loose-envify": "1.3.1", + "prop-types": "15.5.10", + "warning": "3.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + } + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.3", + "set-immediate-shim": "1.0.1" + } + }, + "readline2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "mute-stream": "0.0.5" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "dev": true + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "1.3.3" + } + }, + "recompose": { + "version": "0.23.4", + "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.23.4.tgz", + "integrity": "sha1-rwnk4IQk7/pEnJt5MDcWb3swZEo=", + "requires": { + "change-emitter": "0.1.6", + "fbjs": "0.8.12", + "hoist-non-react-statics": "1.2.0", + "symbol-observable": "1.0.4" + } + }, + "redbox-react": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/redbox-react/-/redbox-react-1.4.3.tgz", + "integrity": "sha512-P/N+y57/FVUQWbgpfTf/2wjgxEhxQuA6FRLv0ipZKLFv5v8mp6qs5inFyBwJQYAgaMrntZRCvKdz1vGwkCNs7A==", + "requires": { + "error-stack-parser": "1.3.6", + "object-assign": "4.1.1", + "prop-types": "15.5.10", + "sourcemapped-stacktrace": "1.1.6" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "reduce-css-calc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", + "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "math-expression-evaluator": "1.2.17", + "reduce-function-call": "1.0.2" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + } + } + }, + "reduce-function-call": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", + "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", + "dev": true, + "requires": { + "balanced-match": "0.4.2" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + } + } + }, + "reduce-reducers": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/reduce-reducers/-/reduce-reducers-0.1.2.tgz", + "integrity": "sha1-+htHGLxSkqcd3R5dg5yb6pdw8Us=" + }, + "redux": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", + "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "requires": { + "lodash": "4.17.4", + "lodash-es": "4.17.4", + "loose-envify": "1.3.1", + "symbol-observable": "1.0.4" + } + }, + "redux-actions": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/redux-actions/-/redux-actions-0.9.1.tgz", + "integrity": "sha1-pydnZUvCFCTD3z9iQHgP+ohyeDw=", + "requires": { + "flux-standard-action": "0.6.1", + "reduce-reducers": "0.1.2" + } + }, + "redux-thunk": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.2.0.tgz", + "integrity": "sha1-5hWhbha0ehmlFXZhM9Hj6Zt4UuU=" + }, + "regenerate": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", + "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=", + "dev": true + }, + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + }, + "regenerator-transform": { + "version": "0.9.11", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.11.tgz", + "integrity": "sha1-On0GdSDLe3F2dp61/4aGkb7+EoM=", + "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-types": "6.25.0", + "private": "0.1.7" + } + }, + "regex-cache": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", + "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3", + "is-primitive": "2.0.0" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "1.3.2", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", + "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + }, + "dependencies": { + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "dev": true + } + } + }, + "request-frame": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/request-frame/-/request-frame-1.5.3.tgz", + "integrity": "sha1-gTwxYNmwI1g4iaqpdzibaPyqLj0=" + }, + "request-progress": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", + "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", + "dev": true, + "requires": { + "throttleit": "1.0.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", + "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "resolve-pathname": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.1.0.tgz", + "integrity": "sha1-6DWIAbhrg7F1YNTjw4LXrvIQCUQ=" + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "dev": true, + "requires": { + "hash-base": "2.0.2", + "inherits": "2.0.3" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "dev": true, + "requires": { + "glob": "7.1.2", + "lodash": "4.17.4", + "scss-tokenizer": "0.2.3", + "yargs": "7.1.0" + } + }, + "sass-lint": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/sass-lint/-/sass-lint-1.10.2.tgz", + "integrity": "sha1-glvWsNp53dNqQv+uW21ErEkiUCs=", + "dev": true, + "requires": { + "commander": "2.11.0", + "eslint": "2.13.1", + "front-matter": "2.1.0", + "fs-extra": "1.0.0", + "glob": "7.1.2", + "globule": "1.2.0", + "gonzales-pe": "3.4.7", + "js-yaml": "3.9.0", + "lodash.capitalize": "4.2.1", + "lodash.kebabcase": "4.1.1", + "merge": "1.2.0", + "path-is-absolute": "1.0.1", + "util": "0.10.3" + }, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "1.0.1" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, + "eslint": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-2.13.1.tgz", + "integrity": "sha1-5MyPoPAJ+4KaquI4VaKTYL4fbBE=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "concat-stream": "1.6.0", + "debug": "2.6.8", + "doctrine": "1.5.0", + "es6-map": "0.1.5", + "escope": "3.6.0", + "espree": "3.4.3", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "1.3.1", + "glob": "7.1.2", + "globals": "9.18.0", + "ignore": "3.3.3", + "imurmurhash": "0.1.4", + "inquirer": "0.12.0", + "is-my-json-valid": "2.16.0", + "is-resolvable": "1.0.0", + "js-yaml": "3.9.0", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "optionator": "0.8.2", + "path-is-absolute": "1.0.1", + "path-is-inside": "1.0.2", + "pluralize": "1.2.1", + "progress": "1.1.8", + "require-uncached": "1.0.3", + "shelljs": "0.6.1", + "strip-json-comments": "1.0.4", + "table": "3.8.3", + "text-table": "0.2.0", + "user-home": "2.0.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "file-entry-cache": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.3.1.tgz", + "integrity": "sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g=", + "dev": true, + "requires": { + "flat-cache": "1.2.2", + "object-assign": "4.1.1" + } + }, + "fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1" + } + }, + "inquirer": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "requires": { + "ansi-escapes": "1.4.0", + "ansi-regex": "2.1.1", + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-width": "2.1.0", + "figures": "1.7.0", + "lodash": "4.17.4", + "readline2": "1.0.1", + "run-async": "0.1.0", + "rx-lite": "3.1.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "through": "2.3.8" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + }, + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true + }, + "table": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "dev": true, + "requires": { + "ajv": "4.11.8", + "ajv-keywords": "1.5.1", + "chalk": "1.1.3", + "lodash": "4.17.4", + "slice-ansi": "0.0.4", + "string-width": "2.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.0.tgz", + "integrity": "sha1-AwZkVh/BRslCPsfZeP4kV0N/5tA=", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + } + } + }, + "sass-loader": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-6.0.6.tgz", + "integrity": "sha512-c3/Zc+iW+qqDip6kXPYLEgsAu2lf4xz0EZDplB7EmSUMda12U1sGJPetH55B/j9eu0bTtKzKlNPWWyYC7wFNyQ==", + "dev": true, + "requires": { + "async": "2.5.0", + "clone-deep": "0.3.0", + "loader-utils": "1.1.0", + "lodash.tail": "4.1.1", + "pify": "3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "5.2.2" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "requires": { + "js-base64": "2.1.9", + "source-map": "0.4.4" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.9.1.tgz", + "integrity": "sha1-zdpEktcNSGVw+HxlVGAjVY4d+lo=", + "dev": true, + "requires": { + "node-forge": "0.6.33" + } + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + }, + "send": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/send/-/send-0.15.3.tgz", + "integrity": "sha1-UBP5+ZAj31DRvZiSwZ4979HVMwk=", + "requires": { + "debug": "2.6.7", + "depd": "1.1.0", + "destroy": "1.0.4", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.0", + "fresh": "0.5.0", + "http-errors": "1.6.1", + "mime": "1.3.4", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + }, + "dependencies": { + "debug": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", + "requires": { + "ms": "2.0.0" + } + }, + "mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" + } + } + }, + "serve-index": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.0.tgz", + "integrity": "sha1-0rKA/FYNYW7oG0i/D6gqvtJIXOc=", + "dev": true, + "requires": { + "accepts": "1.3.3", + "batch": "0.6.1", + "debug": "2.6.8", + "escape-html": "1.0.3", + "http-errors": "1.6.1", + "mime-types": "2.1.15", + "parseurl": "1.3.1" + } + }, + "serve-static": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.3.tgz", + "integrity": "sha1-n0uhni8wMMVH+K+ZEHg47DjVseI=", + "requires": { + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "parseurl": "1.3.1", + "send": "0.15.3" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + }, + "sha.js": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz", + "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "shallow-clone": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", + "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", + "dev": true, + "requires": { + "is-extendable": "0.1.1", + "kind-of": "2.0.1", + "lazy-cache": "0.2.7", + "mixin-object": "2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", + "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "shelljs": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz", + "integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "simple-assign": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/simple-assign/-/simple-assign-0.1.0.tgz", + "integrity": "sha1-F/0wZqXz13OPUDIbsPFMooHMS6o=" + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sockjs": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", + "integrity": "sha1-2bKJMWyn33dZXvKZ4HXw+TfrQgc=", + "dev": true, + "requires": { + "faye-websocket": "0.10.0", + "uuid": "2.0.3" + }, + "dependencies": { + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "dev": true + } + } + }, + "sockjs-client": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.2.tgz", + "integrity": "sha1-8CEqhVDkyUaMjM6u79LjSTwDOtU=", + "dev": true, + "requires": { + "debug": "2.6.8", + "eventsource": "0.1.6", + "faye-websocket": "0.11.1", + "inherits": "2.0.3", + "json3": "3.3.2", + "url-parse": "1.1.9" + }, + "dependencies": { + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "dev": true, + "requires": { + "websocket-driver": "0.6.5" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "1.1.0" + } + }, + "source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": "1.0.1" + } + }, + "source-map-support": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", + "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=", + "dev": true, + "requires": { + "source-map": "0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + } + } + }, + "sourcemapped-stacktrace": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/sourcemapped-stacktrace/-/sourcemapped-stacktrace-1.1.6.tgz", + "integrity": "sha1-ES2HSclCw807Yw36yVFFd7hqOlE=", + "requires": { + "source-map": "0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" + } + } + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "spdy": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", + "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "dev": true, + "requires": { + "debug": "2.6.8", + "handle-thing": "1.2.5", + "http-deceiver": "1.2.7", + "safe-buffer": "5.1.1", + "select-hose": "2.0.0", + "spdy-transport": "2.0.20" + } + }, + "spdy-transport": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.0.20.tgz", + "integrity": "sha1-c15yBUxIayNU/onnAiVgBKOazk0=", + "dev": true, + "requires": { + "debug": "2.6.8", + "detect-node": "2.0.3", + "hpack.js": "2.1.6", + "obuf": "1.1.1", + "readable-stream": "2.3.3", + "safe-buffer": "5.1.1", + "wbuf": "1.7.2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "stackframe": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-0.3.1.tgz", + "integrity": "sha1-M6qE8Rd6VUjIk1Uzy/6zQgl19aQ=" + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + }, + "stdout-stream": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz", + "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", + "dev": true, + "requires": { + "readable-stream": "2.3.3" + } + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "stream-consume": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz", + "integrity": "sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8=" + }, + "stream-http": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", + "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "dev": true, + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "style-loader": { + "version": "0.18.2", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.18.2.tgz", + "integrity": "sha512-WPpJPZGUxWYHWIUMNNOYqql7zh85zGmr84FdTVWq52WTIkqlW9xSxD3QYWi/T31cqn9UNSsietVEgGn2aaSCzw==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "schema-utils": "0.3.0" + } + }, + "style-utils": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/style-utils/-/style-utils-0.1.13.tgz", + "integrity": "sha1-nfXHUNqkGGXyI4/Rb24SuToKJqA=" + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "svgo": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", + "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "dev": true, + "requires": { + "coa": "1.0.4", + "colors": "1.1.2", + "csso": "2.3.2", + "js-yaml": "3.7.0", + "mkdirp": "0.5.1", + "sax": "1.2.4", + "whet.extend": "0.9.9" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "js-yaml": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "2.7.3" + } + } + } + }, + "symbol-observable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz", + "integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0=" + }, + "tapable": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.6.tgz", + "integrity": "sha1-IGvo4YiGC1FEJTdebxrom/sB/Y0=", + "dev": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "test-exclude": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.1.1.tgz", + "integrity": "sha512-35+Asrsk3XHJDBgf/VRFexPgh3UyETv8IAn/LRTiZjVy6rjPVqdEk8dJcJYBzl1w0XCJM48lvTy8SfEsCWS4nA==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "micromatch": "2.3.11", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "require-main-filename": "1.0.1" + } + }, + "tether": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/tether/-/tether-1.4.0.tgz", + "integrity": "sha1-D5+hcfdb9YSF2BSelHmdeudNHBo=", + "dev": true + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "thunky": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz", + "integrity": "sha1-vzAUaCTituZ7Dy16Ssi+smkIaE4=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.2.tgz", + "integrity": "sha1-q0iDz1l9zVCvIRNJoA+8pWrIa4Y=", + "dev": true, + "requires": { + "setimmediate": "1.0.5" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + }, + "tough-cookie": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tryit": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tween-functions": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz", + "integrity": "sha1-GuOlDnxguz3vd06scHrLynO7w/8=" + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2" + } + }, + "type-detect": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-3.0.0.tgz", + "integrity": "sha1-RtDMhVOrt7E6NSsNbeov1Y8tm1U=" + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.15" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.13.tgz", + "integrity": "sha1-zZ3S+GSTs/RNvu7zeA/adMXuFL4=" + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "requires": { + "source-map": "0.5.6", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "dev": true, + "requires": { + "source-map": "0.5.6", + "uglify-js": "2.8.29", + "webpack-sources": "1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + } + } + }, + "uncontrollable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-4.1.0.tgz", + "integrity": "sha1-4DWCkSUuGGUiLZCTmxny9J+Bwak=", + "requires": { + "invariant": "2.2.2" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqid": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", + "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", + "dev": true, + "requires": { + "macaddress": "0.2.8" + } + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-loader": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.5.9.tgz", + "integrity": "sha512-B7QYFyvv+fOBqBVeefsxv6koWWtjmHaMFT6KZWti4KRw8YUD/hOU+3AECvXuzyVawIBx3z7zQRejXCDSO5kk1Q==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "mime": "1.3.6" + } + }, + "url-parse": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.1.9.tgz", + "integrity": "sha1-xn8dd11R8KGJEd17P/rSe7nlvRk=", + "dev": true, + "requires": { + "querystringify": "1.0.0", + "requires-port": "1.0.0" + }, + "dependencies": { + "querystringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", + "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=", + "dev": true + } + } + }, + "user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "value-equal": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.2.1.tgz", + "integrity": "sha1-wiCjBDYfzmmU277ao8fhobiVhx0=" + }, + "vary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz", + "integrity": "sha1-Z1Neu2lMHVIldFeYRmUyP1h+jTc=" + }, + "vendors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz", + "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI=", + "dev": true + }, + "verror": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "dev": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "1.3.1" + } + }, + "watch": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.19.3.tgz", + "integrity": "sha1-eCIa7o4tviPNRFiRfaMe7OVLN2Y=", + "requires": { + "exec-sh": "0.2.0", + "minimist": "0.0.8" + } + }, + "watchpack": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", + "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", + "dev": true, + "requires": { + "async": "2.5.0", + "chokidar": "1.7.0", + "graceful-fs": "4.1.11" + } + }, + "wbuf": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.2.tgz", + "integrity": "sha1-1pe5nx9ZUS3ydRvkJ2nBWAtYAf4=", + "dev": true, + "requires": { + "minimalistic-assert": "1.0.0" + } + }, + "webpack": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.3.0.tgz", + "integrity": "sha1-zi+eB2Vmq6kfdIhxM6iD/X2hh7w=", + "dev": true, + "requires": { + "acorn": "5.1.1", + "acorn-dynamic-import": "2.0.2", + "ajv": "5.2.2", + "ajv-keywords": "2.1.0", + "async": "2.5.0", + "enhanced-resolve": "3.3.0", + "escope": "3.6.0", + "interpret": "1.0.3", + "json-loader": "0.5.4", + "json5": "0.5.1", + "loader-runner": "2.3.0", + "loader-utils": "1.1.0", + "memory-fs": "0.4.1", + "mkdirp": "0.5.1", + "node-libs-browser": "2.0.0", + "source-map": "0.5.6", + "supports-color": "3.2.3", + "tapable": "0.2.6", + "uglifyjs-webpack-plugin": "0.4.6", + "watchpack": "1.4.0", + "webpack-sources": "1.0.1", + "yargs": "6.6.0" + }, + "dependencies": { + "ajv-keywords": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.0.tgz", + "integrity": "sha1-opbhf3v658HOT34N5T0pyzIWLfA=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "4.2.1" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "3.0.0" + } + } + } + }, + "webpack-dev-middleware": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.11.0.tgz", + "integrity": "sha1-CWkdCXOjCtH4Ksc6EuIIfwpHVPk=", + "dev": true, + "requires": { + "memory-fs": "0.4.1", + "mime": "1.3.6", + "path-is-absolute": "1.0.1", + "range-parser": "1.2.0" + } + }, + "webpack-dev-server": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.5.1.tgz", + "integrity": "sha1-oC5yaoe7YD211xq7fW0mSb8Qx2k=", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "3.5.0", + "chokidar": "1.7.0", + "compression": "1.7.0", + "connect-history-api-fallback": "1.3.0", + "del": "3.0.0", + "express": "4.15.3", + "html-entities": "1.2.1", + "http-proxy-middleware": "0.17.4", + "internal-ip": "1.2.0", + "opn": "4.0.2", + "portfinder": "1.0.13", + "selfsigned": "1.9.1", + "serve-index": "1.9.0", + "sockjs": "0.3.18", + "sockjs-client": "1.1.2", + "spdy": "3.4.7", + "strip-ansi": "3.0.1", + "supports-color": "3.2.3", + "webpack-dev-middleware": "1.11.0", + "yargs": "6.6.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "6.1.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "p-map": "1.1.1", + "pify": "3.0.0", + "rimraf": "2.6.1" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "p-map": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.1.1.tgz", + "integrity": "sha1-BfXkrpegaDcbwqXMhr+9vBnErno=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "4.2.1" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "3.0.0" + } + } + } + }, + "webpack-sources": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.1.tgz", + "integrity": "sha512-05tMxipUCwHqYaVS8xc7sYPTly8PzXayRCB4dTxLhWTqlKUiwH6ezmEe0OSreL1c30LAuA3Zqmc+uEBUGFJDjw==", + "dev": true, + "requires": { + "source-list-map": "2.0.0", + "source-map": "0.5.6" + }, + "dependencies": { + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "dev": true + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + } + } + }, + "websocket-driver": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "dev": true, + "requires": { + "websocket-extensions": "0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz", + "integrity": "sha1-domUmcGEtu91Q3fC27DNbLVdKec=", + "dev": true + }, + "whatwg-fetch": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" + }, + "whet.extend": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", + "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", + "dev": true + }, + "which": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "dev": true, + "requires": { + "string-width": "1.0.2" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "0.5.1" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + } + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "requires": { + "camelcase": "3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + } + } + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "requires": { + "fd-slicer": "1.0.1" + } + }, + "zrender": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-3.5.2.tgz", + "integrity": "sha1-53DL6Xi19JgcG5PZuEFHo0dPIdI=" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..f0ca223 --- /dev/null +++ b/package.json @@ -0,0 +1,121 @@ +{ + "name": "chmhub", + "private": true, + "version": "1.0.0", + "main": "", + "scripts": { + "clean": "rimraf dist/*", + "build": "npm run clean && webpack --progress --bail --env dist -p", + "lint": "eslint ./src", + "lint-fix": "eslint ./src --fix", + "lint-sass": "sass-lint -c .sass-lint.yml 'src/styles/**/*.scss' -v -q", + "posttest": "npm run lint", + "reinstall": "rimraf node_modules && rm -f package-lock.json && npm install", + "serve:dev": "webpack-dev-server --open --env dev", + "serve:dist": "webpack-dev-server --open --env dist -p --progress", + "start": "npm run serve:dev", + "sass": "node-sass --include-path ./node_modules --include-path ./public sass/main.scss src/main.css && blessc -f src/main.css" + }, + "dependencies": { + "@devexpress/dx-react-core": "^1.0.2", + "@devexpress/dx-react-grid": "^1.0.2", + "@sketchpixy/rubix": "^2.9.18", + "axios": "^0.17.1", + "bless": "^3.0.3", + "classnames": "~2.2.5", + "code-point-at": "^1.1.0", + "cookies": "^0.7.1", + "core-js": "~2.4.0", + "datatables": "^1.10.13", + "datatables.net": "^1.10.16", + "datatables.net-responsive": "^2.2.1", + "datatables.net-responsive-dt": "^2.1.1", + "dateformat": "^3.0.2", + "echarts": "^3.6.1", + "element-resize-event": "^2.0.9", + "express": "^4.15.3", + "font-awesome": "~4.7.0", + "formsy-material-ui": "^0.6.3", + "formsy-react": "^0.18.0", + "fs": "^0.0.1-security", + "history": "^4.6.1", + "intl-locales-supported": "^1.0.0", + "jquery": "^3.2.1", + "jquery-slimscroll": "~1.3.8", + "material-ui": "0.18.5", + "material-ui-autocomplete-google-places": "^2.2.0", + "material-ui-datatables": "^0.18.1", + "material-ui-geosuggest": "^0.7.1", + "material-ui-places": "^1.1.7", + "mime": "^1.3.6", + "moment": "^2.19.4", + "p-map": "^1.1.1", + "prop-types": "^15.5.10", + "qs": "^6.5.0", + "ramda": "^0.25.0", + "rc-queue-anim": "^1.0.4", + "react": "^15.5.4", + "react-cookie": "^2.1.2", + "react-data-components": "^1.1.1", + "react-dom": "^15.5.4", + "react-draggable": "^3.0.5", + "react-geosuggest": "^2.5.0", + "react-geosuggest-sw": "^1.4.13", + "react-google-maps": "^7.2.0", + "react-helmet": "^5.1.3", + "react-hot-loader": "^3.0.0-beta.6", + "react-imgix": "^7.1.1", + "react-jquery-datatables": "^0.7.1", + "react-materialui-notifications": "^0.5.1", + "react-places-autocomplete": "^5.4.2", + "react-redux": "^5.0.5", + "react-router": "^3.0.4", + "react-router-redux": "^4.0.8", + "react-tap-event-plugin": "^2.0.1", + "react-websocket": "^2.0.0", + "redux": "^3.7.1", + "tablesaw": "^3.0.3" + }, + "devDependencies": { + "autoprefixer": "^7.1.1", + "babel-core": "^6.24.1", + "babel-eslint": "^7.2.3", + "babel-loader": "^7.0.0", + "babel-plugin-istanbul": "^4.1.4", + "babel-plugin-transform-decorators-legacy": "^1.3.4", + "babel-plugin-transform-object-rest-spread": "^6.23.0", + "babel-polyfill": "^6.23.0", + "babel-preset-airbnb": "^2.0.0", + "babel-preset-es2015-native-modules": "^6.6.0", + "babel-preset-react": "^6.24.1", + "babel-preset-stage-0": "^6.24.1", + "babel-preset-stage-1": "^6.24.1", + "babel-preset-stage-2": "^6.24.1", + "bootstrap": "~4.0.0-alpha.6", + "copy-webpack-plugin": "^4.0.1", + "css-loader": "^0.28.4", + "eslint": "^3.19.0", + "eslint-config-airbnb": "^15.0.2", + "eslint-loader": "^1.7.1", + "eslint-plugin-import": "^2.7.0", + "eslint-plugin-jsx-a11y": "^5.1.1", + "eslint-plugin-react": "^7.1.0", + "file-loader": "^0.11.2", + "glob": "^7.1.2", + "node-sass": "^4.5.3", + "null-loader": "^0.1.1", + "phantomjs-prebuilt": "^2.1.7", + "postcss-loader": "^2.0.5", + "rimraf": "^2.6.1", + "sass-lint": "^1.10.2", + "sass-loader": "^6.0.5", + "style-loader": "^0.18.2", + "url-loader": "^0.5.8", + "webpack": "^3.1.0", + "webpack-dev-server": "^2.4.5" + }, + "engines": { + "node": ">=6.9.0", + "npm": ">= 3" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..ecd4ea1 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,7 @@ +module.exports = { + plugins: { + 'autoprefixer': { + browsers: ['last 2 version'] + }, + } +} diff --git a/public/.htpasswd b/public/.htpasswd new file mode 100644 index 0000000..bfd4c63 --- /dev/null +++ b/public/.htpasswd @@ -0,0 +1,3 @@ +demo-test:LhJ/eoc1PDM2s +michael:qupNb4K4t0s1k +carlos:8fFCRXgcE1VSs diff --git a/public/bower_components/Chart.js/.bower.json b/public/bower_components/Chart.js/.bower.json new file mode 100755 index 0000000..f83a064 --- /dev/null +++ b/public/bower_components/Chart.js/.bower.json @@ -0,0 +1,21 @@ +{ + "name": "Chart.js", + "version": "1.0.2", + "description": "Simple HTML5 Charts using the canvas element", + "homepage": "https://github.com/nnnick/Chart.js", + "author": "nnnick", + "main": [ + "Chart.js" + ], + "dependencies": {}, + "_release": "1.0.2", + "_resolution": { + "type": "version", + "tag": "v1.0.2", + "commit": "930b16a0af59201dcfcd1594b0e7540db4d04c9f" + }, + "_source": "https://github.com/nnnick/Chart.js.git", + "_target": "~1.0.2", + "_originalSource": "chartjs", + "_direct": true +} \ No newline at end of file diff --git a/public/bower_components/Chart.js/.travis.yml b/public/bower_components/Chart.js/.travis.yml new file mode 100755 index 0000000..c66ea5f --- /dev/null +++ b/public/bower_components/Chart.js/.travis.yml @@ -0,0 +1,13 @@ +language: node_js +node_js: + - "0.11" + - "0.10" + +before_script: + - npm install + +script: + - gulp test + +notifications: + slack: chartjs:pcfCZR6ugg5TEcaLtmIfQYuA diff --git a/public/bower_components/Chart.js/CONTRIBUTING.md b/public/bower_components/Chart.js/CONTRIBUTING.md new file mode 100755 index 0000000..714bdd2 --- /dev/null +++ b/public/bower_components/Chart.js/CONTRIBUTING.md @@ -0,0 +1,55 @@ +Contributing to Chart.js +======================== + +Contributions to Chart.js are welcome and encouraged, but please have a look through the guidelines in this document before raising an issue, or writing code for the project. + + +Using issues +------------ + +The [issue tracker](https://github.com/nnnick/Chart.js/issues) is the preferred channel for reporting bugs, requesting new features and submitting pull requests. + +If you're suggesting a new chart type, please take a look at [writing new chart types](https://github.com/nnnick/Chart.js/blob/master/docs/06-Advanced.md#writing-new-chart-types) in the documentation, and some of the [community extensions](https://github.com/nnnick/Chart.js/blob/master/docs/06-Advanced.md#community-extensions) that have been created already. + +To keep the library lightweight for everyone, it's unlikely we'll add many more chart types to the core of Chart.js, but issues are a good medium to design and spec out how new chart types could work and look. + +Please do not use issues for support requests. For help using Chart.js, please take a look at the [`chartjs`](http://stackoverflow.com/questions/tagged/chartjs) tag on Stack Overflow. + + +Reporting bugs +-------------- + +Well structured, detailed bug reports are hugely valuable for the project. + +Guidlines for reporting bugs: + + - Check the issue search to see if it has already been reported + - Isolate the problem to a simple test case + - Provide a demonstration of the problem on [JS Bin](http://jsbin.com) or similar + +Please provide any additional details associated with the bug, if it's browser or screen density specific, or only happens with a certain configuration or data. + + +Pull requests +------------- + +Clear, concise pull requests are excellent at continuing the project's community driven growth. But please review [these guidelines](https://github.com/blog/1943-how-to-write-the-perfect-pull-request) and the guidelines below before starting work on the project. + +Guidlines: + + - Please create an issue first: + - For bugs, we can discuss the fixing approach + - For enhancements, we can discuss if it is within the project scope and avoid duplicate effort + - Please make changes to the files in [`/src`](https://github.com/nnnick/Chart.js/tree/master/src), not `Chart.js` or `Chart.min.js` in the repo root directory, this avoids merge conflicts + - Tabs for indentation, not spaces please + - If adding new functionality, please also update the relevant `.md` file in [`/docs`](https://github.com/nnnick/Chart.js/tree/master/docs) + - Please make your commits in logical sections with clear commit messages + +Joining the Project +------------- + - Active committers and contributors are invited to introduce yourself and request commit access to this project. Please send an email to hello@nickdownie.com or file an issue. + +License +------- + +By contributing your code, you agree to license your contribution under the [MIT license](https://github.com/nnnick/Chart.js/blob/master/LICENSE.md). diff --git a/public/bower_components/Chart.js/Chart.js b/public/bower_components/Chart.js/Chart.js new file mode 100755 index 0000000..c264262 --- /dev/null +++ b/public/bower_components/Chart.js/Chart.js @@ -0,0 +1,3477 @@ +/*! + * Chart.js + * http://chartjs.org/ + * Version: 1.0.2 + * + * Copyright 2015 Nick Downie + * Released under the MIT license + * https://github.com/nnnick/Chart.js/blob/master/LICENSE.md + */ + + +(function(){ + + "use strict"; + + //Declare root variable - window in the browser, global on the server + var root = this, + previous = root.Chart; + + //Occupy the global variable of Chart, and create a simple base class + var Chart = function(context){ + var chart = this; + this.canvas = context.canvas; + + this.ctx = context; + + //Variables global to the chart + var computeDimension = function(element,dimension) + { + if (element['offset'+dimension]) + { + return element['offset'+dimension]; + } + else + { + return document.defaultView.getComputedStyle(element).getPropertyValue(dimension); + } + } + + var width = this.width = computeDimension(context.canvas,'Width'); + var height = this.height = computeDimension(context.canvas,'Height'); + + // Firefox requires this to work correctly + context.canvas.width = width; + context.canvas.height = height; + + var width = this.width = context.canvas.width; + var height = this.height = context.canvas.height; + this.aspectRatio = this.width / this.height; + //High pixel density displays - multiply the size of the canvas height/width by the device pixel ratio, then scale. + helpers.retinaScale(this); + + return this; + }; + //Globally expose the defaults to allow for user updating/changing + Chart.defaults = { + global: { + // Boolean - Whether to animate the chart + animation: true, + + // Number - Number of animation steps + animationSteps: 60, + + // String - Animation easing effect + animationEasing: "easeOutQuart", + + // Boolean - If we should show the scale at all + showScale: true, + + // Boolean - If we want to override with a hard coded scale + scaleOverride: false, + + // ** Required if scaleOverride is true ** + // Number - The number of steps in a hard coded scale + scaleSteps: null, + // Number - The value jump in the hard coded scale + scaleStepWidth: null, + // Number - The scale starting value + scaleStartValue: null, + + // String - Colour of the scale line + scaleLineColor: "rgba(0,0,0,.1)", + + // Number - Pixel width of the scale line + scaleLineWidth: 1, + + // Boolean - Whether to show labels on the scale + scaleShowLabels: true, + + // Interpolated JS string - can access value + scaleLabel: "<%=value%>", + + // Boolean - Whether the scale should stick to integers, and not show any floats even if drawing space is there + scaleIntegersOnly: true, + + // Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value + scaleBeginAtZero: false, + + // String - Scale label font declaration for the scale label + scaleFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + + // Number - Scale label font size in pixels + scaleFontSize: 12, + + // String - Scale label font weight style + scaleFontStyle: "normal", + + // String - Scale label font colour + scaleFontColor: "#666", + + // Boolean - whether or not the chart should be responsive and resize when the browser does. + responsive: false, + + // Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container + maintainAspectRatio: true, + + // Boolean - Determines whether to draw tooltips on the canvas or not - attaches events to touchmove & mousemove + showTooltips: true, + + // Boolean - Determines whether to draw built-in tooltip or call custom tooltip function + customTooltips: false, + + // Array - Array of string names to attach tooltip events + tooltipEvents: ["mousemove", "touchstart", "touchmove", "mouseout"], + + // String - Tooltip background colour + tooltipFillColor: "rgba(0,0,0,0.8)", + + // String - Tooltip label font declaration for the scale label + tooltipFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + + // Number - Tooltip label font size in pixels + tooltipFontSize: 14, + + // String - Tooltip font weight style + tooltipFontStyle: "normal", + + // String - Tooltip label font colour + tooltipFontColor: "#fff", + + // String - Tooltip title font declaration for the scale label + tooltipTitleFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + + // Number - Tooltip title font size in pixels + tooltipTitleFontSize: 14, + + // String - Tooltip title font weight style + tooltipTitleFontStyle: "bold", + + // String - Tooltip title font colour + tooltipTitleFontColor: "#fff", + + // Number - pixel width of padding around tooltip text + tooltipYPadding: 6, + + // Number - pixel width of padding around tooltip text + tooltipXPadding: 6, + + // Number - Size of the caret on the tooltip + tooltipCaretSize: 8, + + // Number - Pixel radius of the tooltip border + tooltipCornerRadius: 6, + + // Number - Pixel offset from point x to tooltip edge + tooltipXOffset: 10, + + // String - Template string for single tooltips + tooltipTemplate: "<%if (label){%><%=label%>: <%}%><%= value %>", + + // String - Template string for single tooltips + multiTooltipTemplate: "<%= value %>", + + // String - Colour behind the legend colour block + multiTooltipKeyBackground: '#fff', + + // Function - Will fire on animation progression. + onAnimationProgress: function(){}, + + // Function - Will fire on animation completion. + onAnimationComplete: function(){} + + } + }; + + //Create a dictionary of chart types, to allow for extension of existing types + Chart.types = {}; + + //Global Chart helpers object for utility methods and classes + var helpers = Chart.helpers = {}; + + //-- Basic js utility methods + var each = helpers.each = function(loopable,callback,self){ + var additionalArgs = Array.prototype.slice.call(arguments, 3); + // Check to see if null or undefined firstly. + if (loopable){ + if (loopable.length === +loopable.length){ + var i; + for (i=0; i= 0; i--) { + var currentItem = arrayToSearch[i]; + if (filterCallback(currentItem)){ + return currentItem; + } + } + }, + inherits = helpers.inherits = function(extensions){ + //Basic javascript inheritance based on the model created in Backbone.js + var parent = this; + var ChartElement = (extensions && extensions.hasOwnProperty("constructor")) ? extensions.constructor : function(){ return parent.apply(this, arguments); }; + + var Surrogate = function(){ this.constructor = ChartElement;}; + Surrogate.prototype = parent.prototype; + ChartElement.prototype = new Surrogate(); + + ChartElement.extend = inherits; + + if (extensions) extend(ChartElement.prototype, extensions); + + ChartElement.__super__ = parent.prototype; + + return ChartElement; + }, + noop = helpers.noop = function(){}, + uid = helpers.uid = (function(){ + var id=0; + return function(){ + return "chart-" + id++; + }; + })(), + warn = helpers.warn = function(str){ + //Method for warning of errors + if (window.console && typeof window.console.warn == "function") console.warn(str); + }, + amd = helpers.amd = (typeof define == 'function' && define.amd), + //-- Math methods + isNumber = helpers.isNumber = function(n){ + return !isNaN(parseFloat(n)) && isFinite(n); + }, + max = helpers.max = function(array){ + return Math.max.apply( Math, array ); + }, + min = helpers.min = function(array){ + return Math.min.apply( Math, array ); + }, + cap = helpers.cap = function(valueToCap,maxValue,minValue){ + if(isNumber(maxValue)) { + if( valueToCap > maxValue ) { + return maxValue; + } + } + else if(isNumber(minValue)){ + if ( valueToCap < minValue ){ + return minValue; + } + } + return valueToCap; + }, + getDecimalPlaces = helpers.getDecimalPlaces = function(num){ + if (num%1!==0 && isNumber(num)){ + return num.toString().split(".")[1].length; + } + else { + return 0; + } + }, + toRadians = helpers.radians = function(degrees){ + return degrees * (Math.PI/180); + }, + // Gets the angle from vertical upright to the point about a centre. + getAngleFromPoint = helpers.getAngleFromPoint = function(centrePoint, anglePoint){ + var distanceFromXCenter = anglePoint.x - centrePoint.x, + distanceFromYCenter = anglePoint.y - centrePoint.y, + radialDistanceFromCenter = Math.sqrt( distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter); + + + var angle = Math.PI * 2 + Math.atan2(distanceFromYCenter, distanceFromXCenter); + + //If the segment is in the top left quadrant, we need to add another rotation to the angle + if (distanceFromXCenter < 0 && distanceFromYCenter < 0){ + angle += Math.PI*2; + } + + return { + angle: angle, + distance: radialDistanceFromCenter + }; + }, + aliasPixel = helpers.aliasPixel = function(pixelWidth){ + return (pixelWidth % 2 === 0) ? 0 : 0.5; + }, + splineCurve = helpers.splineCurve = function(FirstPoint,MiddlePoint,AfterPoint,t){ + //Props to Rob Spencer at scaled innovation for his post on splining between points + //http://scaledinnovation.com/analytics/splines/aboutSplines.html + var d01=Math.sqrt(Math.pow(MiddlePoint.x-FirstPoint.x,2)+Math.pow(MiddlePoint.y-FirstPoint.y,2)), + d12=Math.sqrt(Math.pow(AfterPoint.x-MiddlePoint.x,2)+Math.pow(AfterPoint.y-MiddlePoint.y,2)), + fa=t*d01/(d01+d12),// scaling factor for triangle Ta + fb=t*d12/(d01+d12); + return { + inner : { + x : MiddlePoint.x-fa*(AfterPoint.x-FirstPoint.x), + y : MiddlePoint.y-fa*(AfterPoint.y-FirstPoint.y) + }, + outer : { + x: MiddlePoint.x+fb*(AfterPoint.x-FirstPoint.x), + y : MiddlePoint.y+fb*(AfterPoint.y-FirstPoint.y) + } + }; + }, + calculateOrderOfMagnitude = helpers.calculateOrderOfMagnitude = function(val){ + return Math.floor(Math.log(val) / Math.LN10); + }, + calculateScaleRange = helpers.calculateScaleRange = function(valuesArray, drawingSize, textSize, startFromZero, integersOnly){ + + //Set a minimum step of two - a point at the top of the graph, and a point at the base + var minSteps = 2, + maxSteps = Math.floor(drawingSize/(textSize * 1.5)), + skipFitting = (minSteps >= maxSteps); + + var maxValue = max(valuesArray), + minValue = min(valuesArray); + + // We need some degree of seperation here to calculate the scales if all the values are the same + // Adding/minusing 0.5 will give us a range of 1. + if (maxValue === minValue){ + maxValue += 0.5; + // So we don't end up with a graph with a negative start value if we've said always start from zero + if (minValue >= 0.5 && !startFromZero){ + minValue -= 0.5; + } + else{ + // Make up a whole number above the values + maxValue += 0.5; + } + } + + var valueRange = Math.abs(maxValue - minValue), + rangeOrderOfMagnitude = calculateOrderOfMagnitude(valueRange), + graphMax = Math.ceil(maxValue / (1 * Math.pow(10, rangeOrderOfMagnitude))) * Math.pow(10, rangeOrderOfMagnitude), + graphMin = (startFromZero) ? 0 : Math.floor(minValue / (1 * Math.pow(10, rangeOrderOfMagnitude))) * Math.pow(10, rangeOrderOfMagnitude), + graphRange = graphMax - graphMin, + stepValue = Math.pow(10, rangeOrderOfMagnitude), + numberOfSteps = Math.round(graphRange / stepValue); + + //If we have more space on the graph we'll use it to give more definition to the data + while((numberOfSteps > maxSteps || (numberOfSteps * 2) < maxSteps) && !skipFitting) { + if(numberOfSteps > maxSteps){ + stepValue *=2; + numberOfSteps = Math.round(graphRange/stepValue); + // Don't ever deal with a decimal number of steps - cancel fitting and just use the minimum number of steps. + if (numberOfSteps % 1 !== 0){ + skipFitting = true; + } + } + //We can fit in double the amount of scale points on the scale + else{ + //If user has declared ints only, and the step value isn't a decimal + if (integersOnly && rangeOrderOfMagnitude >= 0){ + //If the user has said integers only, we need to check that making the scale more granular wouldn't make it a float + if(stepValue/2 % 1 === 0){ + stepValue /=2; + numberOfSteps = Math.round(graphRange/stepValue); + } + //If it would make it a float break out of the loop + else{ + break; + } + } + //If the scale doesn't have to be an int, make the scale more granular anyway. + else{ + stepValue /=2; + numberOfSteps = Math.round(graphRange/stepValue); + } + + } + } + + if (skipFitting){ + numberOfSteps = minSteps; + stepValue = graphRange / numberOfSteps; + } + + return { + steps : numberOfSteps, + stepValue : stepValue, + min : graphMin, + max : graphMin + (numberOfSteps * stepValue) + }; + + }, + /* jshint ignore:start */ + // Blows up jshint errors based on the new Function constructor + //Templating methods + //Javascript micro templating by John Resig - source at http://ejohn.org/blog/javascript-micro-templating/ + template = helpers.template = function(templateString, valuesObject){ + + // If templateString is function rather than string-template - call the function for valuesObject + + if(templateString instanceof Function){ + return templateString(valuesObject); + } + + var cache = {}; + function tmpl(str, data){ + // Figure out if we're getting a template, or if we need to + // load the template - and be sure to cache the result. + var fn = !/\W/.test(str) ? + cache[str] = cache[str] : + + // Generate a reusable function that will serve as a template + // generator (and which will be cached). + new Function("obj", + "var p=[],print=function(){p.push.apply(p,arguments);};" + + + // Introduce the data as local variables using with(){} + "with(obj){p.push('" + + + // Convert the template into pure JavaScript + str + .replace(/[\r\t\n]/g, " ") + .split("<%").join("\t") + .replace(/((^|%>)[^\t]*)'/g, "$1\r") + .replace(/\t=(.*?)%>/g, "',$1,'") + .split("\t").join("');") + .split("%>").join("p.push('") + .split("\r").join("\\'") + + "');}return p.join('');" + ); + + // Provide some basic currying to the user + return data ? fn( data ) : fn; + } + return tmpl(templateString,valuesObject); + }, + /* jshint ignore:end */ + generateLabels = helpers.generateLabels = function(templateString,numberOfSteps,graphMin,stepValue){ + var labelsArray = new Array(numberOfSteps); + if (labelTemplateString){ + each(labelsArray,function(val,index){ + labelsArray[index] = template(templateString,{value: (graphMin + (stepValue*(index+1)))}); + }); + } + return labelsArray; + }, + //--Animation methods + //Easing functions adapted from Robert Penner's easing equations + //http://www.robertpenner.com/easing/ + easingEffects = helpers.easingEffects = { + linear: function (t) { + return t; + }, + easeInQuad: function (t) { + return t * t; + }, + easeOutQuad: function (t) { + return -1 * t * (t - 2); + }, + easeInOutQuad: function (t) { + if ((t /= 1 / 2) < 1) return 1 / 2 * t * t; + return -1 / 2 * ((--t) * (t - 2) - 1); + }, + easeInCubic: function (t) { + return t * t * t; + }, + easeOutCubic: function (t) { + return 1 * ((t = t / 1 - 1) * t * t + 1); + }, + easeInOutCubic: function (t) { + if ((t /= 1 / 2) < 1) return 1 / 2 * t * t * t; + return 1 / 2 * ((t -= 2) * t * t + 2); + }, + easeInQuart: function (t) { + return t * t * t * t; + }, + easeOutQuart: function (t) { + return -1 * ((t = t / 1 - 1) * t * t * t - 1); + }, + easeInOutQuart: function (t) { + if ((t /= 1 / 2) < 1) return 1 / 2 * t * t * t * t; + return -1 / 2 * ((t -= 2) * t * t * t - 2); + }, + easeInQuint: function (t) { + return 1 * (t /= 1) * t * t * t * t; + }, + easeOutQuint: function (t) { + return 1 * ((t = t / 1 - 1) * t * t * t * t + 1); + }, + easeInOutQuint: function (t) { + if ((t /= 1 / 2) < 1) return 1 / 2 * t * t * t * t * t; + return 1 / 2 * ((t -= 2) * t * t * t * t + 2); + }, + easeInSine: function (t) { + return -1 * Math.cos(t / 1 * (Math.PI / 2)) + 1; + }, + easeOutSine: function (t) { + return 1 * Math.sin(t / 1 * (Math.PI / 2)); + }, + easeInOutSine: function (t) { + return -1 / 2 * (Math.cos(Math.PI * t / 1) - 1); + }, + easeInExpo: function (t) { + return (t === 0) ? 1 : 1 * Math.pow(2, 10 * (t / 1 - 1)); + }, + easeOutExpo: function (t) { + return (t === 1) ? 1 : 1 * (-Math.pow(2, -10 * t / 1) + 1); + }, + easeInOutExpo: function (t) { + if (t === 0) return 0; + if (t === 1) return 1; + if ((t /= 1 / 2) < 1) return 1 / 2 * Math.pow(2, 10 * (t - 1)); + return 1 / 2 * (-Math.pow(2, -10 * --t) + 2); + }, + easeInCirc: function (t) { + if (t >= 1) return t; + return -1 * (Math.sqrt(1 - (t /= 1) * t) - 1); + }, + easeOutCirc: function (t) { + return 1 * Math.sqrt(1 - (t = t / 1 - 1) * t); + }, + easeInOutCirc: function (t) { + if ((t /= 1 / 2) < 1) return -1 / 2 * (Math.sqrt(1 - t * t) - 1); + return 1 / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1); + }, + easeInElastic: function (t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) return 0; + if ((t /= 1) == 1) return 1; + if (!p) p = 1 * 0.3; + if (a < Math.abs(1)) { + a = 1; + s = p / 4; + } else s = p / (2 * Math.PI) * Math.asin(1 / a); + return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p)); + }, + easeOutElastic: function (t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) return 0; + if ((t /= 1) == 1) return 1; + if (!p) p = 1 * 0.3; + if (a < Math.abs(1)) { + a = 1; + s = p / 4; + } else s = p / (2 * Math.PI) * Math.asin(1 / a); + return a * Math.pow(2, -10 * t) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) + 1; + }, + easeInOutElastic: function (t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) return 0; + if ((t /= 1 / 2) == 2) return 1; + if (!p) p = 1 * (0.3 * 1.5); + if (a < Math.abs(1)) { + a = 1; + s = p / 4; + } else s = p / (2 * Math.PI) * Math.asin(1 / a); + if (t < 1) return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p)); + return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) * 0.5 + 1; + }, + easeInBack: function (t) { + var s = 1.70158; + return 1 * (t /= 1) * t * ((s + 1) * t - s); + }, + easeOutBack: function (t) { + var s = 1.70158; + return 1 * ((t = t / 1 - 1) * t * ((s + 1) * t + s) + 1); + }, + easeInOutBack: function (t) { + var s = 1.70158; + if ((t /= 1 / 2) < 1) return 1 / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)); + return 1 / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2); + }, + easeInBounce: function (t) { + return 1 - easingEffects.easeOutBounce(1 - t); + }, + easeOutBounce: function (t) { + if ((t /= 1) < (1 / 2.75)) { + return 1 * (7.5625 * t * t); + } else if (t < (2 / 2.75)) { + return 1 * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75); + } else if (t < (2.5 / 2.75)) { + return 1 * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375); + } else { + return 1 * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375); + } + }, + easeInOutBounce: function (t) { + if (t < 1 / 2) return easingEffects.easeInBounce(t * 2) * 0.5; + return easingEffects.easeOutBounce(t * 2 - 1) * 0.5 + 1 * 0.5; + } + }, + //Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/ + requestAnimFrame = helpers.requestAnimFrame = (function(){ + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(callback) { + return window.setTimeout(callback, 1000 / 60); + }; + })(), + cancelAnimFrame = helpers.cancelAnimFrame = (function(){ + return window.cancelAnimationFrame || + window.webkitCancelAnimationFrame || + window.mozCancelAnimationFrame || + window.oCancelAnimationFrame || + window.msCancelAnimationFrame || + function(callback) { + return window.clearTimeout(callback, 1000 / 60); + }; + })(), + animationLoop = helpers.animationLoop = function(callback,totalSteps,easingString,onProgress,onComplete,chartInstance){ + + var currentStep = 0, + easingFunction = easingEffects[easingString] || easingEffects.linear; + + var animationFrame = function(){ + currentStep++; + var stepDecimal = currentStep/totalSteps; + var easeDecimal = easingFunction(stepDecimal); + + callback.call(chartInstance,easeDecimal,stepDecimal, currentStep); + onProgress.call(chartInstance,easeDecimal,stepDecimal); + if (currentStep < totalSteps){ + chartInstance.animationFrame = requestAnimFrame(animationFrame); + } else{ + onComplete.apply(chartInstance); + } + }; + requestAnimFrame(animationFrame); + }, + //-- DOM methods + getRelativePosition = helpers.getRelativePosition = function(evt){ + var mouseX, mouseY; + var e = evt.originalEvent || evt, + canvas = evt.currentTarget || evt.srcElement, + boundingRect = canvas.getBoundingClientRect(); + + if (e.touches){ + mouseX = e.touches[0].clientX - boundingRect.left; + mouseY = e.touches[0].clientY - boundingRect.top; + + } + else{ + mouseX = e.clientX - boundingRect.left; + mouseY = e.clientY - boundingRect.top; + } + + return { + x : mouseX, + y : mouseY + }; + + }, + addEvent = helpers.addEvent = function(node,eventType,method){ + if (node.addEventListener){ + node.addEventListener(eventType,method); + } else if (node.attachEvent){ + node.attachEvent("on"+eventType, method); + } else { + node["on"+eventType] = method; + } + }, + removeEvent = helpers.removeEvent = function(node, eventType, handler){ + if (node.removeEventListener){ + node.removeEventListener(eventType, handler, false); + } else if (node.detachEvent){ + node.detachEvent("on"+eventType,handler); + } else{ + node["on" + eventType] = noop; + } + }, + bindEvents = helpers.bindEvents = function(chartInstance, arrayOfEvents, handler){ + // Create the events object if it's not already present + if (!chartInstance.events) chartInstance.events = {}; + + each(arrayOfEvents,function(eventName){ + chartInstance.events[eventName] = function(){ + handler.apply(chartInstance, arguments); + }; + addEvent(chartInstance.chart.canvas,eventName,chartInstance.events[eventName]); + }); + }, + unbindEvents = helpers.unbindEvents = function (chartInstance, arrayOfEvents) { + each(arrayOfEvents, function(handler,eventName){ + removeEvent(chartInstance.chart.canvas, eventName, handler); + }); + }, + getMaximumWidth = helpers.getMaximumWidth = function(domNode){ + var container = domNode.parentNode; + // TODO = check cross browser stuff with this. + return container.clientWidth; + }, + getMaximumHeight = helpers.getMaximumHeight = function(domNode){ + var container = domNode.parentNode; + // TODO = check cross browser stuff with this. + return container.clientHeight; + }, + getMaximumSize = helpers.getMaximumSize = helpers.getMaximumWidth, // legacy support + retinaScale = helpers.retinaScale = function(chart){ + var ctx = chart.ctx, + width = chart.canvas.width, + height = chart.canvas.height; + + if (window.devicePixelRatio) { + ctx.canvas.style.width = width + "px"; + ctx.canvas.style.height = height + "px"; + ctx.canvas.height = height * window.devicePixelRatio; + ctx.canvas.width = width * window.devicePixelRatio; + ctx.scale(window.devicePixelRatio, window.devicePixelRatio); + } + }, + //-- Canvas methods + clear = helpers.clear = function(chart){ + chart.ctx.clearRect(0,0,chart.width,chart.height); + }, + fontString = helpers.fontString = function(pixelSize,fontStyle,fontFamily){ + return fontStyle + " " + pixelSize+"px " + fontFamily; + }, + longestText = helpers.longestText = function(ctx,font,arrayOfStrings){ + ctx.font = font; + var longest = 0; + each(arrayOfStrings,function(string){ + var textWidth = ctx.measureText(string).width; + longest = (textWidth > longest) ? textWidth : longest; + }); + return longest; + }, + drawRoundedRectangle = helpers.drawRoundedRectangle = function(ctx,x,y,width,height,radius){ + ctx.beginPath(); + ctx.moveTo(x + radius, y); + ctx.lineTo(x + width - radius, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + radius); + ctx.lineTo(x + width, y + height - radius); + ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); + ctx.lineTo(x + radius, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - radius); + ctx.lineTo(x, y + radius); + ctx.quadraticCurveTo(x, y, x + radius, y); + ctx.closePath(); + }; + + + //Store a reference to each instance - allowing us to globally resize chart instances on window resize. + //Destroy method on the chart will remove the instance of the chart from this reference. + Chart.instances = {}; + + Chart.Type = function(data,options,chart){ + this.options = options; + this.chart = chart; + this.id = uid(); + //Add the chart instance to the global namespace + Chart.instances[this.id] = this; + + // Initialize is always called when a chart type is created + // By default it is a no op, but it should be extended + if (options.responsive){ + this.resize(); + } + this.initialize.call(this,data); + }; + + //Core methods that'll be a part of every chart type + extend(Chart.Type.prototype,{ + initialize : function(){return this;}, + clear : function(){ + clear(this.chart); + return this; + }, + stop : function(){ + // Stops any current animation loop occuring + cancelAnimFrame(this.animationFrame); + return this; + }, + resize : function(callback){ + this.stop(); + var canvas = this.chart.canvas, + newWidth = getMaximumWidth(this.chart.canvas), + newHeight = this.options.maintainAspectRatio ? newWidth / this.chart.aspectRatio : getMaximumHeight(this.chart.canvas); + + canvas.width = this.chart.width = newWidth; + canvas.height = this.chart.height = newHeight; + + retinaScale(this.chart); + + if (typeof callback === "function"){ + callback.apply(this, Array.prototype.slice.call(arguments, 1)); + } + return this; + }, + reflow : noop, + render : function(reflow){ + if (reflow){ + this.reflow(); + } + if (this.options.animation && !reflow){ + helpers.animationLoop( + this.draw, + this.options.animationSteps, + this.options.animationEasing, + this.options.onAnimationProgress, + this.options.onAnimationComplete, + this + ); + } + else{ + this.draw(); + this.options.onAnimationComplete.call(this); + } + return this; + }, + generateLegend : function(){ + return template(this.options.legendTemplate,this); + }, + destroy : function(){ + this.clear(); + unbindEvents(this, this.events); + var canvas = this.chart.canvas; + + // Reset canvas height/width attributes starts a fresh with the canvas context + canvas.width = this.chart.width; + canvas.height = this.chart.height; + + // < IE9 doesn't support removeProperty + if (canvas.style.removeProperty) { + canvas.style.removeProperty('width'); + canvas.style.removeProperty('height'); + } else { + canvas.style.removeAttribute('width'); + canvas.style.removeAttribute('height'); + } + + delete Chart.instances[this.id]; + }, + showTooltip : function(ChartElements, forceRedraw){ + // Only redraw the chart if we've actually changed what we're hovering on. + if (typeof this.activeElements === 'undefined') this.activeElements = []; + + var isChanged = (function(Elements){ + var changed = false; + + if (Elements.length !== this.activeElements.length){ + changed = true; + return changed; + } + + each(Elements, function(element, index){ + if (element !== this.activeElements[index]){ + changed = true; + } + }, this); + return changed; + }).call(this, ChartElements); + + if (!isChanged && !forceRedraw){ + return; + } + else{ + this.activeElements = ChartElements; + } + this.draw(); + if(this.options.customTooltips){ + this.options.customTooltips(false); + } + if (ChartElements.length > 0){ + // If we have multiple datasets, show a MultiTooltip for all of the data points at that index + if (this.datasets && this.datasets.length > 1) { + var dataArray, + dataIndex; + + for (var i = this.datasets.length - 1; i >= 0; i--) { + dataArray = this.datasets[i].points || this.datasets[i].bars || this.datasets[i].segments; + dataIndex = indexOf(dataArray, ChartElements[0]); + if (dataIndex !== -1){ + break; + } + } + var tooltipLabels = [], + tooltipColors = [], + medianPosition = (function(index) { + + // Get all the points at that particular index + var Elements = [], + dataCollection, + xPositions = [], + yPositions = [], + xMax, + yMax, + xMin, + yMin; + helpers.each(this.datasets, function(dataset){ + dataCollection = dataset.points || dataset.bars || dataset.segments; + if (dataCollection[dataIndex] && dataCollection[dataIndex].hasValue()){ + Elements.push(dataCollection[dataIndex]); + } + }); + + helpers.each(Elements, function(element) { + xPositions.push(element.x); + yPositions.push(element.y); + + + //Include any colour information about the element + tooltipLabels.push(helpers.template(this.options.multiTooltipTemplate, element)); + tooltipColors.push({ + fill: element._saved.fillColor || element.fillColor, + stroke: element._saved.strokeColor || element.strokeColor + }); + + }, this); + + yMin = min(yPositions); + yMax = max(yPositions); + + xMin = min(xPositions); + xMax = max(xPositions); + + return { + x: (xMin > this.chart.width/2) ? xMin : xMax, + y: (yMin + yMax)/2 + }; + }).call(this, dataIndex); + + new Chart.MultiTooltip({ + x: medianPosition.x, + y: medianPosition.y, + xPadding: this.options.tooltipXPadding, + yPadding: this.options.tooltipYPadding, + xOffset: this.options.tooltipXOffset, + fillColor: this.options.tooltipFillColor, + textColor: this.options.tooltipFontColor, + fontFamily: this.options.tooltipFontFamily, + fontStyle: this.options.tooltipFontStyle, + fontSize: this.options.tooltipFontSize, + titleTextColor: this.options.tooltipTitleFontColor, + titleFontFamily: this.options.tooltipTitleFontFamily, + titleFontStyle: this.options.tooltipTitleFontStyle, + titleFontSize: this.options.tooltipTitleFontSize, + cornerRadius: this.options.tooltipCornerRadius, + labels: tooltipLabels, + legendColors: tooltipColors, + legendColorBackground : this.options.multiTooltipKeyBackground, + title: ChartElements[0].label, + chart: this.chart, + ctx: this.chart.ctx, + custom: this.options.customTooltips + }).draw(); + + } else { + each(ChartElements, function(Element) { + var tooltipPosition = Element.tooltipPosition(); + new Chart.Tooltip({ + x: Math.round(tooltipPosition.x), + y: Math.round(tooltipPosition.y), + xPadding: this.options.tooltipXPadding, + yPadding: this.options.tooltipYPadding, + fillColor: this.options.tooltipFillColor, + textColor: this.options.tooltipFontColor, + fontFamily: this.options.tooltipFontFamily, + fontStyle: this.options.tooltipFontStyle, + fontSize: this.options.tooltipFontSize, + caretHeight: this.options.tooltipCaretSize, + cornerRadius: this.options.tooltipCornerRadius, + text: template(this.options.tooltipTemplate, Element), + chart: this.chart, + custom: this.options.customTooltips + }).draw(); + }, this); + } + } + return this; + }, + toBase64Image : function(){ + return this.chart.canvas.toDataURL.apply(this.chart.canvas, arguments); + } + }); + + Chart.Type.extend = function(extensions){ + + var parent = this; + + var ChartType = function(){ + return parent.apply(this,arguments); + }; + + //Copy the prototype object of the this class + ChartType.prototype = clone(parent.prototype); + //Now overwrite some of the properties in the base class with the new extensions + extend(ChartType.prototype, extensions); + + ChartType.extend = Chart.Type.extend; + + if (extensions.name || parent.prototype.name){ + + var chartName = extensions.name || parent.prototype.name; + //Assign any potential default values of the new chart type + + //If none are defined, we'll use a clone of the chart type this is being extended from. + //I.e. if we extend a line chart, we'll use the defaults from the line chart if our new chart + //doesn't define some defaults of their own. + + var baseDefaults = (Chart.defaults[parent.prototype.name]) ? clone(Chart.defaults[parent.prototype.name]) : {}; + + Chart.defaults[chartName] = extend(baseDefaults,extensions.defaults); + + Chart.types[chartName] = ChartType; + + //Register this new chart type in the Chart prototype + Chart.prototype[chartName] = function(data,options){ + var config = merge(Chart.defaults.global, Chart.defaults[chartName], options || {}); + return new ChartType(data,config,this); + }; + } else{ + warn("Name not provided for this chart, so it hasn't been registered"); + } + return parent; + }; + + Chart.Element = function(configuration){ + extend(this,configuration); + this.initialize.apply(this,arguments); + this.save(); + }; + extend(Chart.Element.prototype,{ + initialize : function(){}, + restore : function(props){ + if (!props){ + extend(this,this._saved); + } else { + each(props,function(key){ + this[key] = this._saved[key]; + },this); + } + return this; + }, + save : function(){ + this._saved = clone(this); + delete this._saved._saved; + return this; + }, + update : function(newProps){ + each(newProps,function(value,key){ + this._saved[key] = this[key]; + this[key] = value; + },this); + return this; + }, + transition : function(props,ease){ + each(props,function(value,key){ + this[key] = ((value - this._saved[key]) * ease) + this._saved[key]; + },this); + return this; + }, + tooltipPosition : function(){ + return { + x : this.x, + y : this.y + }; + }, + hasValue: function(){ + return isNumber(this.value); + } + }); + + Chart.Element.extend = inherits; + + + Chart.Point = Chart.Element.extend({ + display: true, + inRange: function(chartX,chartY){ + var hitDetectionRange = this.hitDetectionRadius + this.radius; + return ((Math.pow(chartX-this.x, 2)+Math.pow(chartY-this.y, 2)) < Math.pow(hitDetectionRange,2)); + }, + draw : function(){ + if (this.display){ + var ctx = this.ctx; + ctx.beginPath(); + + ctx.arc(this.x, this.y, this.radius, 0, Math.PI*2); + ctx.closePath(); + + ctx.strokeStyle = this.strokeColor; + ctx.lineWidth = this.strokeWidth; + + ctx.fillStyle = this.fillColor; + + ctx.fill(); + ctx.stroke(); + } + + + //Quick debug for bezier curve splining + //Highlights control points and the line between them. + //Handy for dev - stripped in the min version. + + // ctx.save(); + // ctx.fillStyle = "black"; + // ctx.strokeStyle = "black" + // ctx.beginPath(); + // ctx.arc(this.controlPoints.inner.x,this.controlPoints.inner.y, 2, 0, Math.PI*2); + // ctx.fill(); + + // ctx.beginPath(); + // ctx.arc(this.controlPoints.outer.x,this.controlPoints.outer.y, 2, 0, Math.PI*2); + // ctx.fill(); + + // ctx.moveTo(this.controlPoints.inner.x,this.controlPoints.inner.y); + // ctx.lineTo(this.x, this.y); + // ctx.lineTo(this.controlPoints.outer.x,this.controlPoints.outer.y); + // ctx.stroke(); + + // ctx.restore(); + + + + } + }); + + Chart.Arc = Chart.Element.extend({ + inRange : function(chartX,chartY){ + + var pointRelativePosition = helpers.getAngleFromPoint(this, { + x: chartX, + y: chartY + }); + + //Check if within the range of the open/close angle + var betweenAngles = (pointRelativePosition.angle >= this.startAngle && pointRelativePosition.angle <= this.endAngle), + withinRadius = (pointRelativePosition.distance >= this.innerRadius && pointRelativePosition.distance <= this.outerRadius); + + return (betweenAngles && withinRadius); + //Ensure within the outside of the arc centre, but inside arc outer + }, + tooltipPosition : function(){ + var centreAngle = this.startAngle + ((this.endAngle - this.startAngle) / 2), + rangeFromCentre = (this.outerRadius - this.innerRadius) / 2 + this.innerRadius; + return { + x : this.x + (Math.cos(centreAngle) * rangeFromCentre), + y : this.y + (Math.sin(centreAngle) * rangeFromCentre) + }; + }, + draw : function(animationPercent){ + + var easingDecimal = animationPercent || 1; + + var ctx = this.ctx; + + ctx.beginPath(); + + ctx.arc(this.x, this.y, this.outerRadius, this.startAngle, this.endAngle); + + ctx.arc(this.x, this.y, this.innerRadius, this.endAngle, this.startAngle, true); + + ctx.closePath(); + ctx.strokeStyle = this.strokeColor; + ctx.lineWidth = this.strokeWidth; + + ctx.fillStyle = this.fillColor; + + ctx.fill(); + ctx.lineJoin = 'bevel'; + + if (this.showStroke){ + ctx.stroke(); + } + } + }); + + Chart.Rectangle = Chart.Element.extend({ + draw : function(){ + var ctx = this.ctx, + halfWidth = this.width/2, + leftX = this.x - halfWidth, + rightX = this.x + halfWidth, + top = this.base - (this.base - this.y), + halfStroke = this.strokeWidth / 2; + + // Canvas doesn't allow us to stroke inside the width so we can + // adjust the sizes to fit if we're setting a stroke on the line + if (this.showStroke){ + leftX += halfStroke; + rightX -= halfStroke; + top += halfStroke; + } + + ctx.beginPath(); + + ctx.fillStyle = this.fillColor; + ctx.strokeStyle = this.strokeColor; + ctx.lineWidth = this.strokeWidth; + + // It'd be nice to keep this class totally generic to any rectangle + // and simply specify which border to miss out. + ctx.moveTo(leftX, this.base); + ctx.lineTo(leftX, top); + ctx.lineTo(rightX, top); + ctx.lineTo(rightX, this.base); + ctx.fill(); + if (this.showStroke){ + ctx.stroke(); + } + }, + height : function(){ + return this.base - this.y; + }, + inRange : function(chartX,chartY){ + return (chartX >= this.x - this.width/2 && chartX <= this.x + this.width/2) && (chartY >= this.y && chartY <= this.base); + } + }); + + Chart.Tooltip = Chart.Element.extend({ + draw : function(){ + + var ctx = this.chart.ctx; + + ctx.font = fontString(this.fontSize,this.fontStyle,this.fontFamily); + + this.xAlign = "center"; + this.yAlign = "above"; + + //Distance between the actual element.y position and the start of the tooltip caret + var caretPadding = this.caretPadding = 2; + + var tooltipWidth = ctx.measureText(this.text).width + 2*this.xPadding, + tooltipRectHeight = this.fontSize + 2*this.yPadding, + tooltipHeight = tooltipRectHeight + this.caretHeight + caretPadding; + + if (this.x + tooltipWidth/2 >this.chart.width){ + this.xAlign = "left"; + } else if (this.x - tooltipWidth/2 < 0){ + this.xAlign = "right"; + } + + if (this.y - tooltipHeight < 0){ + this.yAlign = "below"; + } + + + var tooltipX = this.x - tooltipWidth/2, + tooltipY = this.y - tooltipHeight; + + ctx.fillStyle = this.fillColor; + + // Custom Tooltips + if(this.custom){ + this.custom(this); + } + else{ + switch(this.yAlign) + { + case "above": + //Draw a caret above the x/y + ctx.beginPath(); + ctx.moveTo(this.x,this.y - caretPadding); + ctx.lineTo(this.x + this.caretHeight, this.y - (caretPadding + this.caretHeight)); + ctx.lineTo(this.x - this.caretHeight, this.y - (caretPadding + this.caretHeight)); + ctx.closePath(); + ctx.fill(); + break; + case "below": + tooltipY = this.y + caretPadding + this.caretHeight; + //Draw a caret below the x/y + ctx.beginPath(); + ctx.moveTo(this.x, this.y + caretPadding); + ctx.lineTo(this.x + this.caretHeight, this.y + caretPadding + this.caretHeight); + ctx.lineTo(this.x - this.caretHeight, this.y + caretPadding + this.caretHeight); + ctx.closePath(); + ctx.fill(); + break; + } + + switch(this.xAlign) + { + case "left": + tooltipX = this.x - tooltipWidth + (this.cornerRadius + this.caretHeight); + break; + case "right": + tooltipX = this.x - (this.cornerRadius + this.caretHeight); + break; + } + + drawRoundedRectangle(ctx,tooltipX,tooltipY,tooltipWidth,tooltipRectHeight,this.cornerRadius); + + ctx.fill(); + + ctx.fillStyle = this.textColor; + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + ctx.fillText(this.text, tooltipX + tooltipWidth/2, tooltipY + tooltipRectHeight/2); + } + } + }); + + Chart.MultiTooltip = Chart.Element.extend({ + initialize : function(){ + this.font = fontString(this.fontSize,this.fontStyle,this.fontFamily); + + this.titleFont = fontString(this.titleFontSize,this.titleFontStyle,this.titleFontFamily); + + this.height = (this.labels.length * this.fontSize) + ((this.labels.length-1) * (this.fontSize/2)) + (this.yPadding*2) + this.titleFontSize *1.5; + + this.ctx.font = this.titleFont; + + var titleWidth = this.ctx.measureText(this.title).width, + //Label has a legend square as well so account for this. + labelWidth = longestText(this.ctx,this.font,this.labels) + this.fontSize + 3, + longestTextWidth = max([labelWidth,titleWidth]); + + this.width = longestTextWidth + (this.xPadding*2); + + + var halfHeight = this.height/2; + + //Check to ensure the height will fit on the canvas + if (this.y - halfHeight < 0 ){ + this.y = halfHeight; + } else if (this.y + halfHeight > this.chart.height){ + this.y = this.chart.height - halfHeight; + } + + //Decide whether to align left or right based on position on canvas + if (this.x > this.chart.width/2){ + this.x -= this.xOffset + this.width; + } else { + this.x += this.xOffset; + } + + + }, + getLineHeight : function(index){ + var baseLineHeight = this.y - (this.height/2) + this.yPadding, + afterTitleIndex = index-1; + + //If the index is zero, we're getting the title + if (index === 0){ + return baseLineHeight + this.titleFontSize/2; + } else{ + return baseLineHeight + ((this.fontSize*1.5*afterTitleIndex) + this.fontSize/2) + this.titleFontSize * 1.5; + } + + }, + draw : function(){ + // Custom Tooltips + if(this.custom){ + this.custom(this); + } + else{ + drawRoundedRectangle(this.ctx,this.x,this.y - this.height/2,this.width,this.height,this.cornerRadius); + var ctx = this.ctx; + ctx.fillStyle = this.fillColor; + ctx.fill(); + ctx.closePath(); + + ctx.textAlign = "left"; + ctx.textBaseline = "middle"; + ctx.fillStyle = this.titleTextColor; + ctx.font = this.titleFont; + + ctx.fillText(this.title,this.x + this.xPadding, this.getLineHeight(0)); + + ctx.font = this.font; + helpers.each(this.labels,function(label,index){ + ctx.fillStyle = this.textColor; + ctx.fillText(label,this.x + this.xPadding + this.fontSize + 3, this.getLineHeight(index + 1)); + + //A bit gnarly, but clearing this rectangle breaks when using explorercanvas (clears whole canvas) + //ctx.clearRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize); + //Instead we'll make a white filled block to put the legendColour palette over. + + ctx.fillStyle = this.legendColorBackground; + ctx.fillRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize); + + ctx.fillStyle = this.legendColors[index].fill; + ctx.fillRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize); + + + },this); + } + } + }); + + Chart.Scale = Chart.Element.extend({ + initialize : function(){ + this.fit(); + }, + buildYLabels : function(){ + this.yLabels = []; + + var stepDecimalPlaces = getDecimalPlaces(this.stepValue); + + for (var i=0; i<=this.steps; i++){ + this.yLabels.push(template(this.templateString,{value:(this.min + (i * this.stepValue)).toFixed(stepDecimalPlaces)})); + } + this.yLabelWidth = (this.display && this.showLabels) ? longestText(this.ctx,this.font,this.yLabels) : 0; + }, + addXLabel : function(label){ + this.xLabels.push(label); + this.valuesCount++; + this.fit(); + }, + removeXLabel : function(){ + this.xLabels.shift(); + this.valuesCount--; + this.fit(); + }, + // Fitting loop to rotate x Labels and figure out what fits there, and also calculate how many Y steps to use + fit: function(){ + // First we need the width of the yLabels, assuming the xLabels aren't rotated + + // To do that we need the base line at the top and base of the chart, assuming there is no x label rotation + this.startPoint = (this.display) ? this.fontSize : 0; + this.endPoint = (this.display) ? this.height - (this.fontSize * 1.5) - 5 : this.height; // -5 to pad labels + + // Apply padding settings to the start and end point. + this.startPoint += this.padding; + this.endPoint -= this.padding; + + // Cache the starting height, so can determine if we need to recalculate the scale yAxis + var cachedHeight = this.endPoint - this.startPoint, + cachedYLabelWidth; + + // Build the current yLabels so we have an idea of what size they'll be to start + /* + * This sets what is returned from calculateScaleRange as static properties of this class: + * + this.steps; + this.stepValue; + this.min; + this.max; + * + */ + this.calculateYRange(cachedHeight); + + // With these properties set we can now build the array of yLabels + // and also the width of the largest yLabel + this.buildYLabels(); + + this.calculateXLabelRotation(); + + while((cachedHeight > this.endPoint - this.startPoint)){ + cachedHeight = this.endPoint - this.startPoint; + cachedYLabelWidth = this.yLabelWidth; + + this.calculateYRange(cachedHeight); + this.buildYLabels(); + + // Only go through the xLabel loop again if the yLabel width has changed + if (cachedYLabelWidth < this.yLabelWidth){ + this.calculateXLabelRotation(); + } + } + + }, + calculateXLabelRotation : function(){ + //Get the width of each grid by calculating the difference + //between x offsets between 0 and 1. + + this.ctx.font = this.font; + + var firstWidth = this.ctx.measureText(this.xLabels[0]).width, + lastWidth = this.ctx.measureText(this.xLabels[this.xLabels.length - 1]).width, + firstRotated, + lastRotated; + + + this.xScalePaddingRight = lastWidth/2 + 3; + this.xScalePaddingLeft = (firstWidth/2 > this.yLabelWidth + 10) ? firstWidth/2 : this.yLabelWidth + 10; + + this.xLabelRotation = 0; + if (this.display){ + var originalLabelWidth = longestText(this.ctx,this.font,this.xLabels), + cosRotation, + firstRotatedWidth; + this.xLabelWidth = originalLabelWidth; + //Allow 3 pixels x2 padding either side for label readability + var xGridWidth = Math.floor(this.calculateX(1) - this.calculateX(0)) - 6; + + //Max label rotate should be 90 - also act as a loop counter + while ((this.xLabelWidth > xGridWidth && this.xLabelRotation === 0) || (this.xLabelWidth > xGridWidth && this.xLabelRotation <= 90 && this.xLabelRotation > 0)){ + cosRotation = Math.cos(toRadians(this.xLabelRotation)); + + firstRotated = cosRotation * firstWidth; + lastRotated = cosRotation * lastWidth; + + // We're right aligning the text now. + if (firstRotated + this.fontSize / 2 > this.yLabelWidth + 8){ + this.xScalePaddingLeft = firstRotated + this.fontSize / 2; + } + this.xScalePaddingRight = this.fontSize/2; + + + this.xLabelRotation++; + this.xLabelWidth = cosRotation * originalLabelWidth; + + } + if (this.xLabelRotation > 0){ + this.endPoint -= Math.sin(toRadians(this.xLabelRotation))*originalLabelWidth + 3; + } + } + else{ + this.xLabelWidth = 0; + this.xScalePaddingRight = this.padding; + this.xScalePaddingLeft = this.padding; + } + + }, + // Needs to be overidden in each Chart type + // Otherwise we need to pass all the data into the scale class + calculateYRange: noop, + drawingArea: function(){ + return this.startPoint - this.endPoint; + }, + calculateY : function(value){ + var scalingFactor = this.drawingArea() / (this.min - this.max); + return this.endPoint - (scalingFactor * (value - this.min)); + }, + calculateX : function(index){ + var isRotated = (this.xLabelRotation > 0), + // innerWidth = (this.offsetGridLines) ? this.width - offsetLeft - this.padding : this.width - (offsetLeft + halfLabelWidth * 2) - this.padding, + innerWidth = this.width - (this.xScalePaddingLeft + this.xScalePaddingRight), + valueWidth = innerWidth/Math.max((this.valuesCount - ((this.offsetGridLines) ? 0 : 1)), 1), + valueOffset = (valueWidth * index) + this.xScalePaddingLeft; + + if (this.offsetGridLines){ + valueOffset += (valueWidth/2); + } + + return Math.round(valueOffset); + }, + update : function(newProps){ + helpers.extend(this, newProps); + this.fit(); + }, + draw : function(){ + var ctx = this.ctx, + yLabelGap = (this.endPoint - this.startPoint) / this.steps, + xStart = Math.round(this.xScalePaddingLeft); + if (this.display){ + ctx.fillStyle = this.textColor; + ctx.font = this.font; + each(this.yLabels,function(labelString,index){ + var yLabelCenter = this.endPoint - (yLabelGap * index), + linePositionY = Math.round(yLabelCenter), + drawHorizontalLine = this.showHorizontalLines; + + ctx.textAlign = "right"; + ctx.textBaseline = "middle"; + if (this.showLabels){ + ctx.fillText(labelString,xStart - 10,yLabelCenter); + } + + // This is X axis, so draw it + if (index === 0 && !drawHorizontalLine){ + drawHorizontalLine = true; + } + + if (drawHorizontalLine){ + ctx.beginPath(); + } + + if (index > 0){ + // This is a grid line in the centre, so drop that + ctx.lineWidth = this.gridLineWidth; + ctx.strokeStyle = this.gridLineColor; + } else { + // This is the first line on the scale + ctx.lineWidth = this.lineWidth; + ctx.strokeStyle = this.lineColor; + } + + linePositionY += helpers.aliasPixel(ctx.lineWidth); + + if(drawHorizontalLine){ + ctx.moveTo(xStart, linePositionY); + ctx.lineTo(this.width, linePositionY); + ctx.stroke(); + ctx.closePath(); + } + + ctx.lineWidth = this.lineWidth; + ctx.strokeStyle = this.lineColor; + ctx.beginPath(); + ctx.moveTo(xStart - 5, linePositionY); + ctx.lineTo(xStart, linePositionY); + ctx.stroke(); + ctx.closePath(); + + },this); + + each(this.xLabels,function(label,index){ + var xPos = this.calculateX(index) + aliasPixel(this.lineWidth), + // Check to see if line/bar here and decide where to place the line + linePos = this.calculateX(index - (this.offsetGridLines ? 0.5 : 0)) + aliasPixel(this.lineWidth), + isRotated = (this.xLabelRotation > 0), + drawVerticalLine = this.showVerticalLines; + + // This is Y axis, so draw it + if (index === 0 && !drawVerticalLine){ + drawVerticalLine = true; + } + + if (drawVerticalLine){ + ctx.beginPath(); + } + + if (index > 0){ + // This is a grid line in the centre, so drop that + ctx.lineWidth = this.gridLineWidth; + ctx.strokeStyle = this.gridLineColor; + } else { + // This is the first line on the scale + ctx.lineWidth = this.lineWidth; + ctx.strokeStyle = this.lineColor; + } + + if (drawVerticalLine){ + ctx.moveTo(linePos,this.endPoint); + ctx.lineTo(linePos,this.startPoint - 3); + ctx.stroke(); + ctx.closePath(); + } + + + ctx.lineWidth = this.lineWidth; + ctx.strokeStyle = this.lineColor; + + + // Small lines at the bottom of the base grid line + ctx.beginPath(); + ctx.moveTo(linePos,this.endPoint); + ctx.lineTo(linePos,this.endPoint + 5); + ctx.stroke(); + ctx.closePath(); + + ctx.save(); + ctx.translate(xPos,(isRotated) ? this.endPoint + 12 : this.endPoint + 8); + ctx.rotate(toRadians(this.xLabelRotation)*-1); + ctx.font = this.font; + ctx.textAlign = (isRotated) ? "right" : "center"; + ctx.textBaseline = (isRotated) ? "middle" : "top"; + ctx.fillText(label, 0, 0); + ctx.restore(); + },this); + + } + } + + }); + + Chart.RadialScale = Chart.Element.extend({ + initialize: function(){ + this.size = min([this.height, this.width]); + this.drawingArea = (this.display) ? (this.size/2) - (this.fontSize/2 + this.backdropPaddingY) : (this.size/2); + }, + calculateCenterOffset: function(value){ + // Take into account half font size + the yPadding of the top value + var scalingFactor = this.drawingArea / (this.max - this.min); + + return (value - this.min) * scalingFactor; + }, + update : function(){ + if (!this.lineArc){ + this.setScaleSize(); + } else { + this.drawingArea = (this.display) ? (this.size/2) - (this.fontSize/2 + this.backdropPaddingY) : (this.size/2); + } + this.buildYLabels(); + }, + buildYLabels: function(){ + this.yLabels = []; + + var stepDecimalPlaces = getDecimalPlaces(this.stepValue); + + for (var i=0; i<=this.steps; i++){ + this.yLabels.push(template(this.templateString,{value:(this.min + (i * this.stepValue)).toFixed(stepDecimalPlaces)})); + } + }, + getCircumference : function(){ + return ((Math.PI*2) / this.valuesCount); + }, + setScaleSize: function(){ + /* + * Right, this is really confusing and there is a lot of maths going on here + * The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9 + * + * Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif + * + * Solution: + * + * We assume the radius of the polygon is half the size of the canvas at first + * at each index we check if the text overlaps. + * + * Where it does, we store that angle and that index. + * + * After finding the largest index and angle we calculate how much we need to remove + * from the shape radius to move the point inwards by that x. + * + * We average the left and right distances to get the maximum shape radius that can fit in the box + * along with labels. + * + * Once we have that, we can find the centre point for the chart, by taking the x text protrusion + * on each side, removing that from the size, halving it and adding the left x protrusion width. + * + * This will mean we have a shape fitted to the canvas, as large as it can be with the labels + * and position it in the most space efficient manner + * + * https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif + */ + + + // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width. + // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points + var largestPossibleRadius = min([(this.height/2 - this.pointLabelFontSize - 5), this.width/2]), + pointPosition, + i, + textWidth, + halfTextWidth, + furthestRight = this.width, + furthestRightIndex, + furthestRightAngle, + furthestLeft = 0, + furthestLeftIndex, + furthestLeftAngle, + xProtrusionLeft, + xProtrusionRight, + radiusReductionRight, + radiusReductionLeft, + maxWidthRadius; + this.ctx.font = fontString(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily); + for (i=0;i furthestRight) { + furthestRight = pointPosition.x + halfTextWidth; + furthestRightIndex = i; + } + if (pointPosition.x - halfTextWidth < furthestLeft) { + furthestLeft = pointPosition.x - halfTextWidth; + furthestLeftIndex = i; + } + } + else if (i < this.valuesCount/2) { + // Less than half the values means we'll left align the text + if (pointPosition.x + textWidth > furthestRight) { + furthestRight = pointPosition.x + textWidth; + furthestRightIndex = i; + } + } + else if (i > this.valuesCount/2){ + // More than half the values means we'll right align the text + if (pointPosition.x - textWidth < furthestLeft) { + furthestLeft = pointPosition.x - textWidth; + furthestLeftIndex = i; + } + } + } + + xProtrusionLeft = furthestLeft; + + xProtrusionRight = Math.ceil(furthestRight - this.width); + + furthestRightAngle = this.getIndexAngle(furthestRightIndex); + + furthestLeftAngle = this.getIndexAngle(furthestLeftIndex); + + radiusReductionRight = xProtrusionRight / Math.sin(furthestRightAngle + Math.PI/2); + + radiusReductionLeft = xProtrusionLeft / Math.sin(furthestLeftAngle + Math.PI/2); + + // Ensure we actually need to reduce the size of the chart + radiusReductionRight = (isNumber(radiusReductionRight)) ? radiusReductionRight : 0; + radiusReductionLeft = (isNumber(radiusReductionLeft)) ? radiusReductionLeft : 0; + + this.drawingArea = largestPossibleRadius - (radiusReductionLeft + radiusReductionRight)/2; + + //this.drawingArea = min([maxWidthRadius, (this.height - (2 * (this.pointLabelFontSize + 5)))/2]) + this.setCenterPoint(radiusReductionLeft, radiusReductionRight); + + }, + setCenterPoint: function(leftMovement, rightMovement){ + + var maxRight = this.width - rightMovement - this.drawingArea, + maxLeft = leftMovement + this.drawingArea; + + this.xCenter = (maxLeft + maxRight)/2; + // Always vertically in the centre as the text height doesn't change + this.yCenter = (this.height/2); + }, + + getIndexAngle : function(index){ + var angleMultiplier = (Math.PI * 2) / this.valuesCount; + // Start from the top instead of right, so remove a quarter of the circle + + return index * angleMultiplier - (Math.PI/2); + }, + getPointPosition : function(index, distanceFromCenter){ + var thisAngle = this.getIndexAngle(index); + return { + x : (Math.cos(thisAngle) * distanceFromCenter) + this.xCenter, + y : (Math.sin(thisAngle) * distanceFromCenter) + this.yCenter + }; + }, + draw: function(){ + if (this.display){ + var ctx = this.ctx; + each(this.yLabels, function(label, index){ + // Don't draw a centre value + if (index > 0){ + var yCenterOffset = index * (this.drawingArea/this.steps), + yHeight = this.yCenter - yCenterOffset, + pointPosition; + + // Draw circular lines around the scale + if (this.lineWidth > 0){ + ctx.strokeStyle = this.lineColor; + ctx.lineWidth = this.lineWidth; + + if(this.lineArc){ + ctx.beginPath(); + ctx.arc(this.xCenter, this.yCenter, yCenterOffset, 0, Math.PI*2); + ctx.closePath(); + ctx.stroke(); + } else{ + ctx.beginPath(); + for (var i=0;i= 0; i--) { + if (this.angleLineWidth > 0){ + var outerPosition = this.getPointPosition(i, this.calculateCenterOffset(this.max)); + ctx.beginPath(); + ctx.moveTo(this.xCenter, this.yCenter); + ctx.lineTo(outerPosition.x, outerPosition.y); + ctx.stroke(); + ctx.closePath(); + } + // Extra 3px out for some label spacing + var pointLabelPosition = this.getPointPosition(i, this.calculateCenterOffset(this.max) + 5); + ctx.font = fontString(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily); + ctx.fillStyle = this.pointLabelFontColor; + + var labelsCount = this.labels.length, + halfLabelsCount = this.labels.length/2, + quarterLabelsCount = halfLabelsCount/2, + upperHalf = (i < quarterLabelsCount || i > labelsCount - quarterLabelsCount), + exactQuarter = (i === quarterLabelsCount || i === labelsCount - quarterLabelsCount); + if (i === 0){ + ctx.textAlign = 'center'; + } else if(i === halfLabelsCount){ + ctx.textAlign = 'center'; + } else if (i < halfLabelsCount){ + ctx.textAlign = 'left'; + } else { + ctx.textAlign = 'right'; + } + + // Set the correct text baseline based on outer positioning + if (exactQuarter){ + ctx.textBaseline = 'middle'; + } else if (upperHalf){ + ctx.textBaseline = 'bottom'; + } else { + ctx.textBaseline = 'top'; + } + + ctx.fillText(this.labels[i], pointLabelPosition.x, pointLabelPosition.y); + } + } + } + } + }); + + // Attach global event to resize each chart instance when the browser resizes + helpers.addEvent(window, "resize", (function(){ + // Basic debounce of resize function so it doesn't hurt performance when resizing browser. + var timeout; + return function(){ + clearTimeout(timeout); + timeout = setTimeout(function(){ + each(Chart.instances,function(instance){ + // If the responsive flag is set in the chart instance config + // Cascade the resize event down to the chart. + if (instance.options.responsive){ + instance.resize(instance.render, true); + } + }); + }, 50); + }; + })()); + + + if (amd) { + define(function(){ + return Chart; + }); + } else if (typeof module === 'object' && module.exports) { + module.exports = Chart; + } + + root.Chart = Chart; + + Chart.noConflict = function(){ + root.Chart = previous; + return Chart; + }; + +}).call(this); + +(function(){ + "use strict"; + + var root = this, + Chart = root.Chart, + helpers = Chart.helpers; + + + var defaultConfig = { + //Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value + scaleBeginAtZero : true, + + //Boolean - Whether grid lines are shown across the chart + scaleShowGridLines : true, + + //String - Colour of the grid lines + scaleGridLineColor : "rgba(0,0,0,.05)", + + //Number - Width of the grid lines + scaleGridLineWidth : 1, + + //Boolean - Whether to show horizontal lines (except X axis) + scaleShowHorizontalLines: true, + + //Boolean - Whether to show vertical lines (except Y axis) + scaleShowVerticalLines: true, + + //Boolean - If there is a stroke on each bar + barShowStroke : true, + + //Number - Pixel width of the bar stroke + barStrokeWidth : 2, + + //Number - Spacing between each of the X value sets + barValueSpacing : 5, + + //Number - Spacing between data sets within X values + barDatasetSpacing : 1, + + //String - A legend template + legendTemplate : "
    -legend\"><% for (var i=0; i
  • \"><%if(datasets[i].label){%><%=datasets[i].label%><%}%>
  • <%}%>
" + + }; + + + Chart.Type.extend({ + name: "Bar", + defaults : defaultConfig, + initialize: function(data){ + + //Expose options as a scope variable here so we can access it in the ScaleClass + var options = this.options; + + this.ScaleClass = Chart.Scale.extend({ + offsetGridLines : true, + calculateBarX : function(datasetCount, datasetIndex, barIndex){ + //Reusable method for calculating the xPosition of a given bar based on datasetIndex & width of the bar + var xWidth = this.calculateBaseWidth(), + xAbsolute = this.calculateX(barIndex) - (xWidth/2), + barWidth = this.calculateBarWidth(datasetCount); + + return xAbsolute + (barWidth * datasetIndex) + (datasetIndex * options.barDatasetSpacing) + barWidth/2; + }, + calculateBaseWidth : function(){ + return (this.calculateX(1) - this.calculateX(0)) - (2*options.barValueSpacing); + }, + calculateBarWidth : function(datasetCount){ + //The padding between datasets is to the right of each bar, providing that there are more than 1 dataset + var baseWidth = this.calculateBaseWidth() - ((datasetCount - 1) * options.barDatasetSpacing); + + return (baseWidth / datasetCount); + } + }); + + this.datasets = []; + + //Set up tooltip events on the chart + if (this.options.showTooltips){ + helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ + var activeBars = (evt.type !== 'mouseout') ? this.getBarsAtEvent(evt) : []; + + this.eachBars(function(bar){ + bar.restore(['fillColor', 'strokeColor']); + }); + helpers.each(activeBars, function(activeBar){ + activeBar.fillColor = activeBar.highlightFill; + activeBar.strokeColor = activeBar.highlightStroke; + }); + this.showTooltip(activeBars); + }); + } + + //Declare the extension of the default point, to cater for the options passed in to the constructor + this.BarClass = Chart.Rectangle.extend({ + strokeWidth : this.options.barStrokeWidth, + showStroke : this.options.barShowStroke, + ctx : this.chart.ctx + }); + + //Iterate through each of the datasets, and build this into a property of the chart + helpers.each(data.datasets,function(dataset,datasetIndex){ + + var datasetObject = { + label : dataset.label || null, + fillColor : dataset.fillColor, + strokeColor : dataset.strokeColor, + bars : [] + }; + + this.datasets.push(datasetObject); + + helpers.each(dataset.data,function(dataPoint,index){ + //Add a new point for each piece of data, passing any required data to draw. + datasetObject.bars.push(new this.BarClass({ + value : dataPoint, + label : data.labels[index], + datasetLabel: dataset.label, + strokeColor : dataset.strokeColor, + fillColor : dataset.fillColor, + highlightFill : dataset.highlightFill || dataset.fillColor, + highlightStroke : dataset.highlightStroke || dataset.strokeColor + })); + },this); + + },this); + + this.buildScale(data.labels); + + this.BarClass.prototype.base = this.scale.endPoint; + + this.eachBars(function(bar, index, datasetIndex){ + helpers.extend(bar, { + width : this.scale.calculateBarWidth(this.datasets.length), + x: this.scale.calculateBarX(this.datasets.length, datasetIndex, index), + y: this.scale.endPoint + }); + bar.save(); + }, this); + + this.render(); + }, + update : function(){ + this.scale.update(); + // Reset any highlight colours before updating. + helpers.each(this.activeElements, function(activeElement){ + activeElement.restore(['fillColor', 'strokeColor']); + }); + + this.eachBars(function(bar){ + bar.save(); + }); + this.render(); + }, + eachBars : function(callback){ + helpers.each(this.datasets,function(dataset, datasetIndex){ + helpers.each(dataset.bars, callback, this, datasetIndex); + },this); + }, + getBarsAtEvent : function(e){ + var barsArray = [], + eventPosition = helpers.getRelativePosition(e), + datasetIterator = function(dataset){ + barsArray.push(dataset.bars[barIndex]); + }, + barIndex; + + for (var datasetIndex = 0; datasetIndex < this.datasets.length; datasetIndex++) { + for (barIndex = 0; barIndex < this.datasets[datasetIndex].bars.length; barIndex++) { + if (this.datasets[datasetIndex].bars[barIndex].inRange(eventPosition.x,eventPosition.y)){ + helpers.each(this.datasets, datasetIterator); + return barsArray; + } + } + } + + return barsArray; + }, + buildScale : function(labels){ + var self = this; + + var dataTotal = function(){ + var values = []; + self.eachBars(function(bar){ + values.push(bar.value); + }); + return values; + }; + + var scaleOptions = { + templateString : this.options.scaleLabel, + height : this.chart.height, + width : this.chart.width, + ctx : this.chart.ctx, + textColor : this.options.scaleFontColor, + fontSize : this.options.scaleFontSize, + fontStyle : this.options.scaleFontStyle, + fontFamily : this.options.scaleFontFamily, + valuesCount : labels.length, + beginAtZero : this.options.scaleBeginAtZero, + integersOnly : this.options.scaleIntegersOnly, + calculateYRange: function(currentHeight){ + var updatedRanges = helpers.calculateScaleRange( + dataTotal(), + currentHeight, + this.fontSize, + this.beginAtZero, + this.integersOnly + ); + helpers.extend(this, updatedRanges); + }, + xLabels : labels, + font : helpers.fontString(this.options.scaleFontSize, this.options.scaleFontStyle, this.options.scaleFontFamily), + lineWidth : this.options.scaleLineWidth, + lineColor : this.options.scaleLineColor, + showHorizontalLines : this.options.scaleShowHorizontalLines, + showVerticalLines : this.options.scaleShowVerticalLines, + gridLineWidth : (this.options.scaleShowGridLines) ? this.options.scaleGridLineWidth : 0, + gridLineColor : (this.options.scaleShowGridLines) ? this.options.scaleGridLineColor : "rgba(0,0,0,0)", + padding : (this.options.showScale) ? 0 : (this.options.barShowStroke) ? this.options.barStrokeWidth : 0, + showLabels : this.options.scaleShowLabels, + display : this.options.showScale + }; + + if (this.options.scaleOverride){ + helpers.extend(scaleOptions, { + calculateYRange: helpers.noop, + steps: this.options.scaleSteps, + stepValue: this.options.scaleStepWidth, + min: this.options.scaleStartValue, + max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth) + }); + } + + this.scale = new this.ScaleClass(scaleOptions); + }, + addData : function(valuesArray,label){ + //Map the values array for each of the datasets + helpers.each(valuesArray,function(value,datasetIndex){ + //Add a new point for each piece of data, passing any required data to draw. + this.datasets[datasetIndex].bars.push(new this.BarClass({ + value : value, + label : label, + x: this.scale.calculateBarX(this.datasets.length, datasetIndex, this.scale.valuesCount+1), + y: this.scale.endPoint, + width : this.scale.calculateBarWidth(this.datasets.length), + base : this.scale.endPoint, + strokeColor : this.datasets[datasetIndex].strokeColor, + fillColor : this.datasets[datasetIndex].fillColor + })); + },this); + + this.scale.addXLabel(label); + //Then re-render the chart. + this.update(); + }, + removeData : function(){ + this.scale.removeXLabel(); + //Then re-render the chart. + helpers.each(this.datasets,function(dataset){ + dataset.bars.shift(); + },this); + this.update(); + }, + reflow : function(){ + helpers.extend(this.BarClass.prototype,{ + y: this.scale.endPoint, + base : this.scale.endPoint + }); + var newScaleProps = helpers.extend({ + height : this.chart.height, + width : this.chart.width + }); + this.scale.update(newScaleProps); + }, + draw : function(ease){ + var easingDecimal = ease || 1; + this.clear(); + + var ctx = this.chart.ctx; + + this.scale.draw(easingDecimal); + + //Draw all the bars for each dataset + helpers.each(this.datasets,function(dataset,datasetIndex){ + helpers.each(dataset.bars,function(bar,index){ + if (bar.hasValue()){ + bar.base = this.scale.endPoint; + //Transition then draw + bar.transition({ + x : this.scale.calculateBarX(this.datasets.length, datasetIndex, index), + y : this.scale.calculateY(bar.value), + width : this.scale.calculateBarWidth(this.datasets.length) + }, easingDecimal).draw(); + } + },this); + + },this); + } + }); + + +}).call(this); + +(function(){ + "use strict"; + + var root = this, + Chart = root.Chart, + //Cache a local reference to Chart.helpers + helpers = Chart.helpers; + + var defaultConfig = { + //Boolean - Whether we should show a stroke on each segment + segmentShowStroke : true, + + //String - The colour of each segment stroke + segmentStrokeColor : "#fff", + + //Number - The width of each segment stroke + segmentStrokeWidth : 2, + + //The percentage of the chart that we cut out of the middle. + percentageInnerCutout : 50, + + //Number - Amount of animation steps + animationSteps : 100, + + //String - Animation easing effect + animationEasing : "easeOutBounce", + + //Boolean - Whether we animate the rotation of the Doughnut + animateRotate : true, + + //Boolean - Whether we animate scaling the Doughnut from the centre + animateScale : false, + + //String - A legend template + legendTemplate : "
    -legend\"><% for (var i=0; i
  • \"><%if(segments[i].label){%><%=segments[i].label%><%}%>
  • <%}%>
" + + }; + + + Chart.Type.extend({ + //Passing in a name registers this chart in the Chart namespace + name: "Doughnut", + //Providing a defaults will also register the deafults in the chart namespace + defaults : defaultConfig, + //Initialize is fired when the chart is initialized - Data is passed in as a parameter + //Config is automatically merged by the core of Chart.js, and is available at this.options + initialize: function(data){ + + //Declare segments as a static property to prevent inheriting across the Chart type prototype + this.segments = []; + this.outerRadius = (helpers.min([this.chart.width,this.chart.height]) - this.options.segmentStrokeWidth/2)/2; + + this.SegmentArc = Chart.Arc.extend({ + ctx : this.chart.ctx, + x : this.chart.width/2, + y : this.chart.height/2 + }); + + //Set up tooltip events on the chart + if (this.options.showTooltips){ + helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ + var activeSegments = (evt.type !== 'mouseout') ? this.getSegmentsAtEvent(evt) : []; + + helpers.each(this.segments,function(segment){ + segment.restore(["fillColor"]); + }); + helpers.each(activeSegments,function(activeSegment){ + activeSegment.fillColor = activeSegment.highlightColor; + }); + this.showTooltip(activeSegments); + }); + } + this.calculateTotal(data); + + helpers.each(data,function(datapoint, index){ + this.addData(datapoint, index, true); + },this); + + this.render(); + }, + getSegmentsAtEvent : function(e){ + var segmentsArray = []; + + var location = helpers.getRelativePosition(e); + + helpers.each(this.segments,function(segment){ + if (segment.inRange(location.x,location.y)) segmentsArray.push(segment); + },this); + return segmentsArray; + }, + addData : function(segment, atIndex, silent){ + var index = atIndex || this.segments.length; + this.segments.splice(index, 0, new this.SegmentArc({ + value : segment.value, + outerRadius : (this.options.animateScale) ? 0 : this.outerRadius, + innerRadius : (this.options.animateScale) ? 0 : (this.outerRadius/100) * this.options.percentageInnerCutout, + fillColor : segment.color, + highlightColor : segment.highlight || segment.color, + showStroke : this.options.segmentShowStroke, + strokeWidth : this.options.segmentStrokeWidth, + strokeColor : this.options.segmentStrokeColor, + startAngle : Math.PI * 1.5, + circumference : (this.options.animateRotate) ? 0 : this.calculateCircumference(segment.value), + label : segment.label + })); + if (!silent){ + this.reflow(); + this.update(); + } + }, + calculateCircumference : function(value){ + return (Math.PI*2)*(Math.abs(value) / this.total); + }, + calculateTotal : function(data){ + this.total = 0; + helpers.each(data,function(segment){ + this.total += Math.abs(segment.value); + },this); + }, + update : function(){ + this.calculateTotal(this.segments); + + // Reset any highlight colours before updating. + helpers.each(this.activeElements, function(activeElement){ + activeElement.restore(['fillColor']); + }); + + helpers.each(this.segments,function(segment){ + segment.save(); + }); + this.render(); + }, + + removeData: function(atIndex){ + var indexToDelete = (helpers.isNumber(atIndex)) ? atIndex : this.segments.length-1; + this.segments.splice(indexToDelete, 1); + this.reflow(); + this.update(); + }, + + reflow : function(){ + helpers.extend(this.SegmentArc.prototype,{ + x : this.chart.width/2, + y : this.chart.height/2 + }); + this.outerRadius = (helpers.min([this.chart.width,this.chart.height]) - this.options.segmentStrokeWidth/2)/2; + helpers.each(this.segments, function(segment){ + segment.update({ + outerRadius : this.outerRadius, + innerRadius : (this.outerRadius/100) * this.options.percentageInnerCutout + }); + }, this); + }, + draw : function(easeDecimal){ + var animDecimal = (easeDecimal) ? easeDecimal : 1; + this.clear(); + helpers.each(this.segments,function(segment,index){ + segment.transition({ + circumference : this.calculateCircumference(segment.value), + outerRadius : this.outerRadius, + innerRadius : (this.outerRadius/100) * this.options.percentageInnerCutout + },animDecimal); + + segment.endAngle = segment.startAngle + segment.circumference; + + segment.draw(); + if (index === 0){ + segment.startAngle = Math.PI * 1.5; + } + //Check to see if it's the last segment, if not get the next and update the start angle + if (index < this.segments.length-1){ + this.segments[index+1].startAngle = segment.endAngle; + } + },this); + + } + }); + + Chart.types.Doughnut.extend({ + name : "Pie", + defaults : helpers.merge(defaultConfig,{percentageInnerCutout : 0}) + }); + +}).call(this); +(function(){ + "use strict"; + + var root = this, + Chart = root.Chart, + helpers = Chart.helpers; + + var defaultConfig = { + + ///Boolean - Whether grid lines are shown across the chart + scaleShowGridLines : true, + + //String - Colour of the grid lines + scaleGridLineColor : "rgba(0,0,0,.05)", + + //Number - Width of the grid lines + scaleGridLineWidth : 1, + + //Boolean - Whether to show horizontal lines (except X axis) + scaleShowHorizontalLines: true, + + //Boolean - Whether to show vertical lines (except Y axis) + scaleShowVerticalLines: true, + + //Boolean - Whether the line is curved between points + bezierCurve : true, + + //Number - Tension of the bezier curve between points + bezierCurveTension : 0.4, + + //Boolean - Whether to show a dot for each point + pointDot : true, + + //Number - Radius of each point dot in pixels + pointDotRadius : 4, + + //Number - Pixel width of point dot stroke + pointDotStrokeWidth : 1, + + //Number - amount extra to add to the radius to cater for hit detection outside the drawn point + pointHitDetectionRadius : 20, + + //Boolean - Whether to show a stroke for datasets + datasetStroke : true, + + //Number - Pixel width of dataset stroke + datasetStrokeWidth : 2, + + //Boolean - Whether to fill the dataset with a colour + datasetFill : true, + + //String - A legend template + legendTemplate : "
    -legend\"><% for (var i=0; i
  • \"><%if(datasets[i].label){%><%=datasets[i].label%><%}%>
  • <%}%>
" + + }; + + + Chart.Type.extend({ + name: "Line", + defaults : defaultConfig, + initialize: function(data){ + //Declare the extension of the default point, to cater for the options passed in to the constructor + this.PointClass = Chart.Point.extend({ + strokeWidth : this.options.pointDotStrokeWidth, + radius : this.options.pointDotRadius, + display: this.options.pointDot, + hitDetectionRadius : this.options.pointHitDetectionRadius, + ctx : this.chart.ctx, + inRange : function(mouseX){ + return (Math.pow(mouseX-this.x, 2) < Math.pow(this.radius + this.hitDetectionRadius,2)); + } + }); + + this.datasets = []; + + //Set up tooltip events on the chart + if (this.options.showTooltips){ + helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ + var activePoints = (evt.type !== 'mouseout') ? this.getPointsAtEvent(evt) : []; + this.eachPoints(function(point){ + point.restore(['fillColor', 'strokeColor']); + }); + helpers.each(activePoints, function(activePoint){ + activePoint.fillColor = activePoint.highlightFill; + activePoint.strokeColor = activePoint.highlightStroke; + }); + this.showTooltip(activePoints); + }); + } + + //Iterate through each of the datasets, and build this into a property of the chart + helpers.each(data.datasets,function(dataset){ + + var datasetObject = { + label : dataset.label || null, + fillColor : dataset.fillColor, + strokeColor : dataset.strokeColor, + pointColor : dataset.pointColor, + pointStrokeColor : dataset.pointStrokeColor, + points : [] + }; + + this.datasets.push(datasetObject); + + + helpers.each(dataset.data,function(dataPoint,index){ + //Add a new point for each piece of data, passing any required data to draw. + datasetObject.points.push(new this.PointClass({ + value : dataPoint, + label : data.labels[index], + datasetLabel: dataset.label, + strokeColor : dataset.pointStrokeColor, + fillColor : dataset.pointColor, + highlightFill : dataset.pointHighlightFill || dataset.pointColor, + highlightStroke : dataset.pointHighlightStroke || dataset.pointStrokeColor + })); + },this); + + this.buildScale(data.labels); + + + this.eachPoints(function(point, index){ + helpers.extend(point, { + x: this.scale.calculateX(index), + y: this.scale.endPoint + }); + point.save(); + }, this); + + },this); + + + this.render(); + }, + update : function(){ + this.scale.update(); + // Reset any highlight colours before updating. + helpers.each(this.activeElements, function(activeElement){ + activeElement.restore(['fillColor', 'strokeColor']); + }); + this.eachPoints(function(point){ + point.save(); + }); + this.render(); + }, + eachPoints : function(callback){ + helpers.each(this.datasets,function(dataset){ + helpers.each(dataset.points,callback,this); + },this); + }, + getPointsAtEvent : function(e){ + var pointsArray = [], + eventPosition = helpers.getRelativePosition(e); + helpers.each(this.datasets,function(dataset){ + helpers.each(dataset.points,function(point){ + if (point.inRange(eventPosition.x,eventPosition.y)) pointsArray.push(point); + }); + },this); + return pointsArray; + }, + buildScale : function(labels){ + var self = this; + + var dataTotal = function(){ + var values = []; + self.eachPoints(function(point){ + values.push(point.value); + }); + + return values; + }; + + var scaleOptions = { + templateString : this.options.scaleLabel, + height : this.chart.height, + width : this.chart.width, + ctx : this.chart.ctx, + textColor : this.options.scaleFontColor, + fontSize : this.options.scaleFontSize, + fontStyle : this.options.scaleFontStyle, + fontFamily : this.options.scaleFontFamily, + valuesCount : labels.length, + beginAtZero : this.options.scaleBeginAtZero, + integersOnly : this.options.scaleIntegersOnly, + calculateYRange : function(currentHeight){ + var updatedRanges = helpers.calculateScaleRange( + dataTotal(), + currentHeight, + this.fontSize, + this.beginAtZero, + this.integersOnly + ); + helpers.extend(this, updatedRanges); + }, + xLabels : labels, + font : helpers.fontString(this.options.scaleFontSize, this.options.scaleFontStyle, this.options.scaleFontFamily), + lineWidth : this.options.scaleLineWidth, + lineColor : this.options.scaleLineColor, + showHorizontalLines : this.options.scaleShowHorizontalLines, + showVerticalLines : this.options.scaleShowVerticalLines, + gridLineWidth : (this.options.scaleShowGridLines) ? this.options.scaleGridLineWidth : 0, + gridLineColor : (this.options.scaleShowGridLines) ? this.options.scaleGridLineColor : "rgba(0,0,0,0)", + padding: (this.options.showScale) ? 0 : this.options.pointDotRadius + this.options.pointDotStrokeWidth, + showLabels : this.options.scaleShowLabels, + display : this.options.showScale + }; + + if (this.options.scaleOverride){ + helpers.extend(scaleOptions, { + calculateYRange: helpers.noop, + steps: this.options.scaleSteps, + stepValue: this.options.scaleStepWidth, + min: this.options.scaleStartValue, + max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth) + }); + } + + + this.scale = new Chart.Scale(scaleOptions); + }, + addData : function(valuesArray,label){ + //Map the values array for each of the datasets + + helpers.each(valuesArray,function(value,datasetIndex){ + //Add a new point for each piece of data, passing any required data to draw. + this.datasets[datasetIndex].points.push(new this.PointClass({ + value : value, + label : label, + x: this.scale.calculateX(this.scale.valuesCount+1), + y: this.scale.endPoint, + strokeColor : this.datasets[datasetIndex].pointStrokeColor, + fillColor : this.datasets[datasetIndex].pointColor + })); + },this); + + this.scale.addXLabel(label); + //Then re-render the chart. + this.update(); + }, + removeData : function(){ + this.scale.removeXLabel(); + //Then re-render the chart. + helpers.each(this.datasets,function(dataset){ + dataset.points.shift(); + },this); + this.update(); + }, + reflow : function(){ + var newScaleProps = helpers.extend({ + height : this.chart.height, + width : this.chart.width + }); + this.scale.update(newScaleProps); + }, + draw : function(ease){ + var easingDecimal = ease || 1; + this.clear(); + + var ctx = this.chart.ctx; + + // Some helper methods for getting the next/prev points + var hasValue = function(item){ + return item.value !== null; + }, + nextPoint = function(point, collection, index){ + return helpers.findNextWhere(collection, hasValue, index) || point; + }, + previousPoint = function(point, collection, index){ + return helpers.findPreviousWhere(collection, hasValue, index) || point; + }; + + this.scale.draw(easingDecimal); + + + helpers.each(this.datasets,function(dataset){ + var pointsWithValues = helpers.where(dataset.points, hasValue); + + //Transition each point first so that the line and point drawing isn't out of sync + //We can use this extra loop to calculate the control points of this dataset also in this loop + + helpers.each(dataset.points, function(point, index){ + if (point.hasValue()){ + point.transition({ + y : this.scale.calculateY(point.value), + x : this.scale.calculateX(index) + }, easingDecimal); + } + },this); + + + // Control points need to be calculated in a seperate loop, because we need to know the current x/y of the point + // This would cause issues when there is no animation, because the y of the next point would be 0, so beziers would be skewed + if (this.options.bezierCurve){ + helpers.each(pointsWithValues, function(point, index){ + var tension = (index > 0 && index < pointsWithValues.length - 1) ? this.options.bezierCurveTension : 0; + point.controlPoints = helpers.splineCurve( + previousPoint(point, pointsWithValues, index), + point, + nextPoint(point, pointsWithValues, index), + tension + ); + + // Prevent the bezier going outside of the bounds of the graph + + // Cap puter bezier handles to the upper/lower scale bounds + if (point.controlPoints.outer.y > this.scale.endPoint){ + point.controlPoints.outer.y = this.scale.endPoint; + } + else if (point.controlPoints.outer.y < this.scale.startPoint){ + point.controlPoints.outer.y = this.scale.startPoint; + } + + // Cap inner bezier handles to the upper/lower scale bounds + if (point.controlPoints.inner.y > this.scale.endPoint){ + point.controlPoints.inner.y = this.scale.endPoint; + } + else if (point.controlPoints.inner.y < this.scale.startPoint){ + point.controlPoints.inner.y = this.scale.startPoint; + } + },this); + } + + + //Draw the line between all the points + ctx.lineWidth = this.options.datasetStrokeWidth; + ctx.strokeStyle = dataset.strokeColor; + ctx.beginPath(); + + helpers.each(pointsWithValues, function(point, index){ + if (index === 0){ + ctx.moveTo(point.x, point.y); + } + else{ + if(this.options.bezierCurve){ + var previous = previousPoint(point, pointsWithValues, index); + + ctx.bezierCurveTo( + previous.controlPoints.outer.x, + previous.controlPoints.outer.y, + point.controlPoints.inner.x, + point.controlPoints.inner.y, + point.x, + point.y + ); + } + else{ + ctx.lineTo(point.x,point.y); + } + } + }, this); + + ctx.stroke(); + + if (this.options.datasetFill && pointsWithValues.length > 0){ + //Round off the line by going to the base of the chart, back to the start, then fill. + ctx.lineTo(pointsWithValues[pointsWithValues.length - 1].x, this.scale.endPoint); + ctx.lineTo(pointsWithValues[0].x, this.scale.endPoint); + ctx.fillStyle = dataset.fillColor; + ctx.closePath(); + ctx.fill(); + } + + //Now draw the points over the line + //A little inefficient double looping, but better than the line + //lagging behind the point positions + helpers.each(pointsWithValues,function(point){ + point.draw(); + }); + },this); + } + }); + + +}).call(this); + +(function(){ + "use strict"; + + var root = this, + Chart = root.Chart, + //Cache a local reference to Chart.helpers + helpers = Chart.helpers; + + var defaultConfig = { + //Boolean - Show a backdrop to the scale label + scaleShowLabelBackdrop : true, + + //String - The colour of the label backdrop + scaleBackdropColor : "rgba(255,255,255,0.75)", + + // Boolean - Whether the scale should begin at zero + scaleBeginAtZero : true, + + //Number - The backdrop padding above & below the label in pixels + scaleBackdropPaddingY : 2, + + //Number - The backdrop padding to the side of the label in pixels + scaleBackdropPaddingX : 2, + + //Boolean - Show line for each value in the scale + scaleShowLine : true, + + //Boolean - Stroke a line around each segment in the chart + segmentShowStroke : true, + + //String - The colour of the stroke on each segement. + segmentStrokeColor : "#fff", + + //Number - The width of the stroke value in pixels + segmentStrokeWidth : 2, + + //Number - Amount of animation steps + animationSteps : 100, + + //String - Animation easing effect. + animationEasing : "easeOutBounce", + + //Boolean - Whether to animate the rotation of the chart + animateRotate : true, + + //Boolean - Whether to animate scaling the chart from the centre + animateScale : false, + + //String - A legend template + legendTemplate : "
    -legend\"><% for (var i=0; i
  • \"><%if(segments[i].label){%><%=segments[i].label%><%}%>
  • <%}%>
" + }; + + + Chart.Type.extend({ + //Passing in a name registers this chart in the Chart namespace + name: "PolarArea", + //Providing a defaults will also register the deafults in the chart namespace + defaults : defaultConfig, + //Initialize is fired when the chart is initialized - Data is passed in as a parameter + //Config is automatically merged by the core of Chart.js, and is available at this.options + initialize: function(data){ + this.segments = []; + //Declare segment class as a chart instance specific class, so it can share props for this instance + this.SegmentArc = Chart.Arc.extend({ + showStroke : this.options.segmentShowStroke, + strokeWidth : this.options.segmentStrokeWidth, + strokeColor : this.options.segmentStrokeColor, + ctx : this.chart.ctx, + innerRadius : 0, + x : this.chart.width/2, + y : this.chart.height/2 + }); + this.scale = new Chart.RadialScale({ + display: this.options.showScale, + fontStyle: this.options.scaleFontStyle, + fontSize: this.options.scaleFontSize, + fontFamily: this.options.scaleFontFamily, + fontColor: this.options.scaleFontColor, + showLabels: this.options.scaleShowLabels, + showLabelBackdrop: this.options.scaleShowLabelBackdrop, + backdropColor: this.options.scaleBackdropColor, + backdropPaddingY : this.options.scaleBackdropPaddingY, + backdropPaddingX: this.options.scaleBackdropPaddingX, + lineWidth: (this.options.scaleShowLine) ? this.options.scaleLineWidth : 0, + lineColor: this.options.scaleLineColor, + lineArc: true, + width: this.chart.width, + height: this.chart.height, + xCenter: this.chart.width/2, + yCenter: this.chart.height/2, + ctx : this.chart.ctx, + templateString: this.options.scaleLabel, + valuesCount: data.length + }); + + this.updateScaleRange(data); + + this.scale.update(); + + helpers.each(data,function(segment,index){ + this.addData(segment,index,true); + },this); + + //Set up tooltip events on the chart + if (this.options.showTooltips){ + helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ + var activeSegments = (evt.type !== 'mouseout') ? this.getSegmentsAtEvent(evt) : []; + helpers.each(this.segments,function(segment){ + segment.restore(["fillColor"]); + }); + helpers.each(activeSegments,function(activeSegment){ + activeSegment.fillColor = activeSegment.highlightColor; + }); + this.showTooltip(activeSegments); + }); + } + + this.render(); + }, + getSegmentsAtEvent : function(e){ + var segmentsArray = []; + + var location = helpers.getRelativePosition(e); + + helpers.each(this.segments,function(segment){ + if (segment.inRange(location.x,location.y)) segmentsArray.push(segment); + },this); + return segmentsArray; + }, + addData : function(segment, atIndex, silent){ + var index = atIndex || this.segments.length; + + this.segments.splice(index, 0, new this.SegmentArc({ + fillColor: segment.color, + highlightColor: segment.highlight || segment.color, + label: segment.label, + value: segment.value, + outerRadius: (this.options.animateScale) ? 0 : this.scale.calculateCenterOffset(segment.value), + circumference: (this.options.animateRotate) ? 0 : this.scale.getCircumference(), + startAngle: Math.PI * 1.5 + })); + if (!silent){ + this.reflow(); + this.update(); + } + }, + removeData: function(atIndex){ + var indexToDelete = (helpers.isNumber(atIndex)) ? atIndex : this.segments.length-1; + this.segments.splice(indexToDelete, 1); + this.reflow(); + this.update(); + }, + calculateTotal: function(data){ + this.total = 0; + helpers.each(data,function(segment){ + this.total += segment.value; + },this); + this.scale.valuesCount = this.segments.length; + }, + updateScaleRange: function(datapoints){ + var valuesArray = []; + helpers.each(datapoints,function(segment){ + valuesArray.push(segment.value); + }); + + var scaleSizes = (this.options.scaleOverride) ? + { + steps: this.options.scaleSteps, + stepValue: this.options.scaleStepWidth, + min: this.options.scaleStartValue, + max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth) + } : + helpers.calculateScaleRange( + valuesArray, + helpers.min([this.chart.width, this.chart.height])/2, + this.options.scaleFontSize, + this.options.scaleBeginAtZero, + this.options.scaleIntegersOnly + ); + + helpers.extend( + this.scale, + scaleSizes, + { + size: helpers.min([this.chart.width, this.chart.height]), + xCenter: this.chart.width/2, + yCenter: this.chart.height/2 + } + ); + + }, + update : function(){ + this.calculateTotal(this.segments); + + helpers.each(this.segments,function(segment){ + segment.save(); + }); + + this.reflow(); + this.render(); + }, + reflow : function(){ + helpers.extend(this.SegmentArc.prototype,{ + x : this.chart.width/2, + y : this.chart.height/2 + }); + this.updateScaleRange(this.segments); + this.scale.update(); + + helpers.extend(this.scale,{ + xCenter: this.chart.width/2, + yCenter: this.chart.height/2 + }); + + helpers.each(this.segments, function(segment){ + segment.update({ + outerRadius : this.scale.calculateCenterOffset(segment.value) + }); + }, this); + + }, + draw : function(ease){ + var easingDecimal = ease || 1; + //Clear & draw the canvas + this.clear(); + helpers.each(this.segments,function(segment, index){ + segment.transition({ + circumference : this.scale.getCircumference(), + outerRadius : this.scale.calculateCenterOffset(segment.value) + },easingDecimal); + + segment.endAngle = segment.startAngle + segment.circumference; + + // If we've removed the first segment we need to set the first one to + // start at the top. + if (index === 0){ + segment.startAngle = Math.PI * 1.5; + } + + //Check to see if it's the last segment, if not get the next and update the start angle + if (index < this.segments.length - 1){ + this.segments[index+1].startAngle = segment.endAngle; + } + segment.draw(); + }, this); + this.scale.draw(); + } + }); + +}).call(this); +(function(){ + "use strict"; + + var root = this, + Chart = root.Chart, + helpers = Chart.helpers; + + + + Chart.Type.extend({ + name: "Radar", + defaults:{ + //Boolean - Whether to show lines for each scale point + scaleShowLine : true, + + //Boolean - Whether we show the angle lines out of the radar + angleShowLineOut : true, + + //Boolean - Whether to show labels on the scale + scaleShowLabels : false, + + // Boolean - Whether the scale should begin at zero + scaleBeginAtZero : true, + + //String - Colour of the angle line + angleLineColor : "rgba(0,0,0,.1)", + + //Number - Pixel width of the angle line + angleLineWidth : 1, + + //String - Point label font declaration + pointLabelFontFamily : "'Arial'", + + //String - Point label font weight + pointLabelFontStyle : "normal", + + //Number - Point label font size in pixels + pointLabelFontSize : 10, + + //String - Point label font colour + pointLabelFontColor : "#666", + + //Boolean - Whether to show a dot for each point + pointDot : true, + + //Number - Radius of each point dot in pixels + pointDotRadius : 3, + + //Number - Pixel width of point dot stroke + pointDotStrokeWidth : 1, + + //Number - amount extra to add to the radius to cater for hit detection outside the drawn point + pointHitDetectionRadius : 20, + + //Boolean - Whether to show a stroke for datasets + datasetStroke : true, + + //Number - Pixel width of dataset stroke + datasetStrokeWidth : 2, + + //Boolean - Whether to fill the dataset with a colour + datasetFill : true, + + //String - A legend template + legendTemplate : "
    -legend\"><% for (var i=0; i
  • \"><%if(datasets[i].label){%><%=datasets[i].label%><%}%>
  • <%}%>
" + + }, + + initialize: function(data){ + this.PointClass = Chart.Point.extend({ + strokeWidth : this.options.pointDotStrokeWidth, + radius : this.options.pointDotRadius, + display: this.options.pointDot, + hitDetectionRadius : this.options.pointHitDetectionRadius, + ctx : this.chart.ctx + }); + + this.datasets = []; + + this.buildScale(data); + + //Set up tooltip events on the chart + if (this.options.showTooltips){ + helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ + var activePointsCollection = (evt.type !== 'mouseout') ? this.getPointsAtEvent(evt) : []; + + this.eachPoints(function(point){ + point.restore(['fillColor', 'strokeColor']); + }); + helpers.each(activePointsCollection, function(activePoint){ + activePoint.fillColor = activePoint.highlightFill; + activePoint.strokeColor = activePoint.highlightStroke; + }); + + this.showTooltip(activePointsCollection); + }); + } + + //Iterate through each of the datasets, and build this into a property of the chart + helpers.each(data.datasets,function(dataset){ + + var datasetObject = { + label: dataset.label || null, + fillColor : dataset.fillColor, + strokeColor : dataset.strokeColor, + pointColor : dataset.pointColor, + pointStrokeColor : dataset.pointStrokeColor, + points : [] + }; + + this.datasets.push(datasetObject); + + helpers.each(dataset.data,function(dataPoint,index){ + //Add a new point for each piece of data, passing any required data to draw. + var pointPosition; + if (!this.scale.animation){ + pointPosition = this.scale.getPointPosition(index, this.scale.calculateCenterOffset(dataPoint)); + } + datasetObject.points.push(new this.PointClass({ + value : dataPoint, + label : data.labels[index], + datasetLabel: dataset.label, + x: (this.options.animation) ? this.scale.xCenter : pointPosition.x, + y: (this.options.animation) ? this.scale.yCenter : pointPosition.y, + strokeColor : dataset.pointStrokeColor, + fillColor : dataset.pointColor, + highlightFill : dataset.pointHighlightFill || dataset.pointColor, + highlightStroke : dataset.pointHighlightStroke || dataset.pointStrokeColor + })); + },this); + + },this); + + this.render(); + }, + eachPoints : function(callback){ + helpers.each(this.datasets,function(dataset){ + helpers.each(dataset.points,callback,this); + },this); + }, + + getPointsAtEvent : function(evt){ + var mousePosition = helpers.getRelativePosition(evt), + fromCenter = helpers.getAngleFromPoint({ + x: this.scale.xCenter, + y: this.scale.yCenter + }, mousePosition); + + var anglePerIndex = (Math.PI * 2) /this.scale.valuesCount, + pointIndex = Math.round((fromCenter.angle - Math.PI * 1.5) / anglePerIndex), + activePointsCollection = []; + + // If we're at the top, make the pointIndex 0 to get the first of the array. + if (pointIndex >= this.scale.valuesCount || pointIndex < 0){ + pointIndex = 0; + } + + if (fromCenter.distance <= this.scale.drawingArea){ + helpers.each(this.datasets, function(dataset){ + activePointsCollection.push(dataset.points[pointIndex]); + }); + } + + return activePointsCollection; + }, + + buildScale : function(data){ + this.scale = new Chart.RadialScale({ + display: this.options.showScale, + fontStyle: this.options.scaleFontStyle, + fontSize: this.options.scaleFontSize, + fontFamily: this.options.scaleFontFamily, + fontColor: this.options.scaleFontColor, + showLabels: this.options.scaleShowLabels, + showLabelBackdrop: this.options.scaleShowLabelBackdrop, + backdropColor: this.options.scaleBackdropColor, + backdropPaddingY : this.options.scaleBackdropPaddingY, + backdropPaddingX: this.options.scaleBackdropPaddingX, + lineWidth: (this.options.scaleShowLine) ? this.options.scaleLineWidth : 0, + lineColor: this.options.scaleLineColor, + angleLineColor : this.options.angleLineColor, + angleLineWidth : (this.options.angleShowLineOut) ? this.options.angleLineWidth : 0, + // Point labels at the edge of each line + pointLabelFontColor : this.options.pointLabelFontColor, + pointLabelFontSize : this.options.pointLabelFontSize, + pointLabelFontFamily : this.options.pointLabelFontFamily, + pointLabelFontStyle : this.options.pointLabelFontStyle, + height : this.chart.height, + width: this.chart.width, + xCenter: this.chart.width/2, + yCenter: this.chart.height/2, + ctx : this.chart.ctx, + templateString: this.options.scaleLabel, + labels: data.labels, + valuesCount: data.datasets[0].data.length + }); + + this.scale.setScaleSize(); + this.updateScaleRange(data.datasets); + this.scale.buildYLabels(); + }, + updateScaleRange: function(datasets){ + var valuesArray = (function(){ + var totalDataArray = []; + helpers.each(datasets,function(dataset){ + if (dataset.data){ + totalDataArray = totalDataArray.concat(dataset.data); + } + else { + helpers.each(dataset.points, function(point){ + totalDataArray.push(point.value); + }); + } + }); + return totalDataArray; + })(); + + + var scaleSizes = (this.options.scaleOverride) ? + { + steps: this.options.scaleSteps, + stepValue: this.options.scaleStepWidth, + min: this.options.scaleStartValue, + max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth) + } : + helpers.calculateScaleRange( + valuesArray, + helpers.min([this.chart.width, this.chart.height])/2, + this.options.scaleFontSize, + this.options.scaleBeginAtZero, + this.options.scaleIntegersOnly + ); + + helpers.extend( + this.scale, + scaleSizes + ); + + }, + addData : function(valuesArray,label){ + //Map the values array for each of the datasets + this.scale.valuesCount++; + helpers.each(valuesArray,function(value,datasetIndex){ + var pointPosition = this.scale.getPointPosition(this.scale.valuesCount, this.scale.calculateCenterOffset(value)); + this.datasets[datasetIndex].points.push(new this.PointClass({ + value : value, + label : label, + x: pointPosition.x, + y: pointPosition.y, + strokeColor : this.datasets[datasetIndex].pointStrokeColor, + fillColor : this.datasets[datasetIndex].pointColor + })); + },this); + + this.scale.labels.push(label); + + this.reflow(); + + this.update(); + }, + removeData : function(){ + this.scale.valuesCount--; + this.scale.labels.shift(); + helpers.each(this.datasets,function(dataset){ + dataset.points.shift(); + },this); + this.reflow(); + this.update(); + }, + update : function(){ + this.eachPoints(function(point){ + point.save(); + }); + this.reflow(); + this.render(); + }, + reflow: function(){ + helpers.extend(this.scale, { + width : this.chart.width, + height: this.chart.height, + size : helpers.min([this.chart.width, this.chart.height]), + xCenter: this.chart.width/2, + yCenter: this.chart.height/2 + }); + this.updateScaleRange(this.datasets); + this.scale.setScaleSize(); + this.scale.buildYLabels(); + }, + draw : function(ease){ + var easeDecimal = ease || 1, + ctx = this.chart.ctx; + this.clear(); + this.scale.draw(); + + helpers.each(this.datasets,function(dataset){ + + //Transition each point first so that the line and point drawing isn't out of sync + helpers.each(dataset.points,function(point,index){ + if (point.hasValue()){ + point.transition(this.scale.getPointPosition(index, this.scale.calculateCenterOffset(point.value)), easeDecimal); + } + },this); + + + + //Draw the line between all the points + ctx.lineWidth = this.options.datasetStrokeWidth; + ctx.strokeStyle = dataset.strokeColor; + ctx.beginPath(); + helpers.each(dataset.points,function(point,index){ + if (index === 0){ + ctx.moveTo(point.x,point.y); + } + else{ + ctx.lineTo(point.x,point.y); + } + },this); + ctx.closePath(); + ctx.stroke(); + + ctx.fillStyle = dataset.fillColor; + ctx.fill(); + + //Now draw the points over the line + //A little inefficient double looping, but better than the line + //lagging behind the point positions + helpers.each(dataset.points,function(point){ + if (point.hasValue()){ + point.draw(); + } + }); + + },this); + + } + + }); + + + + + +}).call(this); \ No newline at end of file diff --git a/public/bower_components/Chart.js/Chart.min.js b/public/bower_components/Chart.js/Chart.min.js new file mode 100755 index 0000000..3a0a2c8 --- /dev/null +++ b/public/bower_components/Chart.js/Chart.min.js @@ -0,0 +1,11 @@ +/*! + * Chart.js + * http://chartjs.org/ + * Version: 1.0.2 + * + * Copyright 2015 Nick Downie + * Released under the MIT license + * https://github.com/nnnick/Chart.js/blob/master/LICENSE.md + */ +(function(){"use strict";var t=this,i=t.Chart,e=function(t){this.canvas=t.canvas,this.ctx=t;var i=function(t,i){return t["offset"+i]?t["offset"+i]:document.defaultView.getComputedStyle(t).getPropertyValue(i)},e=this.width=i(t.canvas,"Width"),n=this.height=i(t.canvas,"Height");t.canvas.width=e,t.canvas.height=n;var e=this.width=t.canvas.width,n=this.height=t.canvas.height;return this.aspectRatio=this.width/this.height,s.retinaScale(this),this};e.defaults={global:{animation:!0,animationSteps:60,animationEasing:"easeOutQuart",showScale:!0,scaleOverride:!1,scaleSteps:null,scaleStepWidth:null,scaleStartValue:null,scaleLineColor:"rgba(0,0,0,.1)",scaleLineWidth:1,scaleShowLabels:!0,scaleLabel:"<%=value%>",scaleIntegersOnly:!0,scaleBeginAtZero:!1,scaleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",scaleFontSize:12,scaleFontStyle:"normal",scaleFontColor:"#666",responsive:!1,maintainAspectRatio:!0,showTooltips:!0,customTooltips:!1,tooltipEvents:["mousemove","touchstart","touchmove","mouseout"],tooltipFillColor:"rgba(0,0,0,0.8)",tooltipFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipFontSize:14,tooltipFontStyle:"normal",tooltipFontColor:"#fff",tooltipTitleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipTitleFontSize:14,tooltipTitleFontStyle:"bold",tooltipTitleFontColor:"#fff",tooltipYPadding:6,tooltipXPadding:6,tooltipCaretSize:8,tooltipCornerRadius:6,tooltipXOffset:10,tooltipTemplate:"<%if (label){%><%=label%>: <%}%><%= value %>",multiTooltipTemplate:"<%= value %>",multiTooltipKeyBackground:"#fff",onAnimationProgress:function(){},onAnimationComplete:function(){}}},e.types={};var s=e.helpers={},n=s.each=function(t,i,e){var s=Array.prototype.slice.call(arguments,3);if(t)if(t.length===+t.length){var n;for(n=0;n=0;s--){var n=t[s];if(i(n))return n}},s.inherits=function(t){var i=this,e=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return i.apply(this,arguments)},s=function(){this.constructor=e};return s.prototype=i.prototype,e.prototype=new s,e.extend=r,t&&a(e.prototype,t),e.__super__=i.prototype,e}),c=s.noop=function(){},u=s.uid=function(){var t=0;return function(){return"chart-"+t++}}(),d=s.warn=function(t){window.console&&"function"==typeof window.console.warn&&console.warn(t)},p=s.amd="function"==typeof define&&define.amd,f=s.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},g=s.max=function(t){return Math.max.apply(Math,t)},m=s.min=function(t){return Math.min.apply(Math,t)},v=(s.cap=function(t,i,e){if(f(i)){if(t>i)return i}else if(f(e)&&e>t)return e;return t},s.getDecimalPlaces=function(t){return t%1!==0&&f(t)?t.toString().split(".")[1].length:0}),S=s.radians=function(t){return t*(Math.PI/180)},x=(s.getAngleFromPoint=function(t,i){var e=i.x-t.x,s=i.y-t.y,n=Math.sqrt(e*e+s*s),o=2*Math.PI+Math.atan2(s,e);return 0>e&&0>s&&(o+=2*Math.PI),{angle:o,distance:n}},s.aliasPixel=function(t){return t%2===0?0:.5}),y=(s.splineCurve=function(t,i,e,s){var n=Math.sqrt(Math.pow(i.x-t.x,2)+Math.pow(i.y-t.y,2)),o=Math.sqrt(Math.pow(e.x-i.x,2)+Math.pow(e.y-i.y,2)),a=s*n/(n+o),h=s*o/(n+o);return{inner:{x:i.x-a*(e.x-t.x),y:i.y-a*(e.y-t.y)},outer:{x:i.x+h*(e.x-t.x),y:i.y+h*(e.y-t.y)}}},s.calculateOrderOfMagnitude=function(t){return Math.floor(Math.log(t)/Math.LN10)}),C=(s.calculateScaleRange=function(t,i,e,s,n){var o=2,a=Math.floor(i/(1.5*e)),h=o>=a,l=g(t),r=m(t);l===r&&(l+=.5,r>=.5&&!s?r-=.5:l+=.5);for(var c=Math.abs(l-r),u=y(c),d=Math.ceil(l/(1*Math.pow(10,u)))*Math.pow(10,u),p=s?0:Math.floor(r/(1*Math.pow(10,u)))*Math.pow(10,u),f=d-p,v=Math.pow(10,u),S=Math.round(f/v);(S>a||a>2*S)&&!h;)if(S>a)v*=2,S=Math.round(f/v),S%1!==0&&(h=!0);else if(n&&u>=0){if(v/2%1!==0)break;v/=2,S=Math.round(f/v)}else v/=2,S=Math.round(f/v);return h&&(S=o,v=f/S),{steps:S,stepValue:v,min:p,max:p+S*v}},s.template=function(t,i){function e(t,i){var e=/\W/.test(t)?new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+t.replace(/[\r\t\n]/g," ").split("<%").join(" ").replace(/((^|%>)[^\t]*)'/g,"$1\r").replace(/\t=(.*?)%>/g,"',$1,'").split(" ").join("');").split("%>").join("p.push('").split("\r").join("\\'")+"');}return p.join('');"):s[t]=s[t];return i?e(i):e}if(t instanceof Function)return t(i);var s={};return e(t,i)}),w=(s.generateLabels=function(t,i,e,s){var o=new Array(i);return labelTemplateString&&n(o,function(i,n){o[n]=C(t,{value:e+s*(n+1)})}),o},s.easingEffects={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-1*t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-0.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return 1*((t=t/1-1)*t*t+1)},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-1*((t=t/1-1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-0.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return 1*(t/=1)*t*t*t*t},easeOutQuint:function(t){return 1*((t=t/1-1)*t*t*t*t+1)},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return-1*Math.cos(t/1*(Math.PI/2))+1},easeOutSine:function(t){return 1*Math.sin(t/1*(Math.PI/2))},easeInOutSine:function(t){return-0.5*(Math.cos(Math.PI*t/1)-1)},easeInExpo:function(t){return 0===t?1:1*Math.pow(2,10*(t/1-1))},easeOutExpo:function(t){return 1===t?1:1*(-Math.pow(2,-10*t/1)+1)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(-Math.pow(2,-10*--t)+2)},easeInCirc:function(t){return t>=1?t:-1*(Math.sqrt(1-(t/=1)*t)-1)},easeOutCirc:function(t){return 1*Math.sqrt(1-(t=t/1-1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-0.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var i=1.70158,e=0,s=1;return 0===t?0:1==(t/=1)?1:(e||(e=.3),st?-.5*s*Math.pow(2,10*(t-=1))*Math.sin(2*(1*t-i)*Math.PI/e):s*Math.pow(2,-10*(t-=1))*Math.sin(2*(1*t-i)*Math.PI/e)*.5+1)},easeInBack:function(t){var i=1.70158;return 1*(t/=1)*t*((i+1)*t-i)},easeOutBack:function(t){var i=1.70158;return 1*((t=t/1-1)*t*((i+1)*t+i)+1)},easeInOutBack:function(t){var i=1.70158;return(t/=.5)<1?.5*t*t*(((i*=1.525)+1)*t-i):.5*((t-=2)*t*(((i*=1.525)+1)*t+i)+2)},easeInBounce:function(t){return 1-w.easeOutBounce(1-t)},easeOutBounce:function(t){return(t/=1)<1/2.75?7.5625*t*t:2/2.75>t?1*(7.5625*(t-=1.5/2.75)*t+.75):2.5/2.75>t?1*(7.5625*(t-=2.25/2.75)*t+.9375):1*(7.5625*(t-=2.625/2.75)*t+.984375)},easeInOutBounce:function(t){return.5>t?.5*w.easeInBounce(2*t):.5*w.easeOutBounce(2*t-1)+.5}}),b=s.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)}}(),P=s.cancelAnimFrame=function(){return window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||window.oCancelAnimationFrame||window.msCancelAnimationFrame||function(t){return window.clearTimeout(t,1e3/60)}}(),L=(s.animationLoop=function(t,i,e,s,n,o){var a=0,h=w[e]||w.linear,l=function(){a++;var e=a/i,r=h(e);t.call(o,r,e,a),s.call(o,r,e),i>a?o.animationFrame=b(l):n.apply(o)};b(l)},s.getRelativePosition=function(t){var i,e,s=t.originalEvent||t,n=t.currentTarget||t.srcElement,o=n.getBoundingClientRect();return s.touches?(i=s.touches[0].clientX-o.left,e=s.touches[0].clientY-o.top):(i=s.clientX-o.left,e=s.clientY-o.top),{x:i,y:e}},s.addEvent=function(t,i,e){t.addEventListener?t.addEventListener(i,e):t.attachEvent?t.attachEvent("on"+i,e):t["on"+i]=e}),k=s.removeEvent=function(t,i,e){t.removeEventListener?t.removeEventListener(i,e,!1):t.detachEvent?t.detachEvent("on"+i,e):t["on"+i]=c},F=(s.bindEvents=function(t,i,e){t.events||(t.events={}),n(i,function(i){t.events[i]=function(){e.apply(t,arguments)},L(t.chart.canvas,i,t.events[i])})},s.unbindEvents=function(t,i){n(i,function(i,e){k(t.chart.canvas,e,i)})}),R=s.getMaximumWidth=function(t){var i=t.parentNode;return i.clientWidth},T=s.getMaximumHeight=function(t){var i=t.parentNode;return i.clientHeight},A=(s.getMaximumSize=s.getMaximumWidth,s.retinaScale=function(t){var i=t.ctx,e=t.canvas.width,s=t.canvas.height;window.devicePixelRatio&&(i.canvas.style.width=e+"px",i.canvas.style.height=s+"px",i.canvas.height=s*window.devicePixelRatio,i.canvas.width=e*window.devicePixelRatio,i.scale(window.devicePixelRatio,window.devicePixelRatio))}),M=s.clear=function(t){t.ctx.clearRect(0,0,t.width,t.height)},W=s.fontString=function(t,i,e){return i+" "+t+"px "+e},z=s.longestText=function(t,i,e){t.font=i;var s=0;return n(e,function(i){var e=t.measureText(i).width;s=e>s?e:s}),s},B=s.drawRoundedRectangle=function(t,i,e,s,n,o){t.beginPath(),t.moveTo(i+o,e),t.lineTo(i+s-o,e),t.quadraticCurveTo(i+s,e,i+s,e+o),t.lineTo(i+s,e+n-o),t.quadraticCurveTo(i+s,e+n,i+s-o,e+n),t.lineTo(i+o,e+n),t.quadraticCurveTo(i,e+n,i,e+n-o),t.lineTo(i,e+o),t.quadraticCurveTo(i,e,i+o,e),t.closePath()};e.instances={},e.Type=function(t,i,s){this.options=i,this.chart=s,this.id=u(),e.instances[this.id]=this,i.responsive&&this.resize(),this.initialize.call(this,t)},a(e.Type.prototype,{initialize:function(){return this},clear:function(){return M(this.chart),this},stop:function(){return P(this.animationFrame),this},resize:function(t){this.stop();var i=this.chart.canvas,e=R(this.chart.canvas),s=this.options.maintainAspectRatio?e/this.chart.aspectRatio:T(this.chart.canvas);return i.width=this.chart.width=e,i.height=this.chart.height=s,A(this.chart),"function"==typeof t&&t.apply(this,Array.prototype.slice.call(arguments,1)),this},reflow:c,render:function(t){return t&&this.reflow(),this.options.animation&&!t?s.animationLoop(this.draw,this.options.animationSteps,this.options.animationEasing,this.options.onAnimationProgress,this.options.onAnimationComplete,this):(this.draw(),this.options.onAnimationComplete.call(this)),this},generateLegend:function(){return C(this.options.legendTemplate,this)},destroy:function(){this.clear(),F(this,this.events);var t=this.chart.canvas;t.width=this.chart.width,t.height=this.chart.height,t.style.removeProperty?(t.style.removeProperty("width"),t.style.removeProperty("height")):(t.style.removeAttribute("width"),t.style.removeAttribute("height")),delete e.instances[this.id]},showTooltip:function(t,i){"undefined"==typeof this.activeElements&&(this.activeElements=[]);var o=function(t){var i=!1;return t.length!==this.activeElements.length?i=!0:(n(t,function(t,e){t!==this.activeElements[e]&&(i=!0)},this),i)}.call(this,t);if(o||i){if(this.activeElements=t,this.draw(),this.options.customTooltips&&this.options.customTooltips(!1),t.length>0)if(this.datasets&&this.datasets.length>1){for(var a,h,r=this.datasets.length-1;r>=0&&(a=this.datasets[r].points||this.datasets[r].bars||this.datasets[r].segments,h=l(a,t[0]),-1===h);r--);var c=[],u=[],d=function(){var t,i,e,n,o,a=[],l=[],r=[];return s.each(this.datasets,function(i){t=i.points||i.bars||i.segments,t[h]&&t[h].hasValue()&&a.push(t[h])}),s.each(a,function(t){l.push(t.x),r.push(t.y),c.push(s.template(this.options.multiTooltipTemplate,t)),u.push({fill:t._saved.fillColor||t.fillColor,stroke:t._saved.strokeColor||t.strokeColor})},this),o=m(r),e=g(r),n=m(l),i=g(l),{x:n>this.chart.width/2?n:i,y:(o+e)/2}}.call(this,h);new e.MultiTooltip({x:d.x,y:d.y,xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,xOffset:this.options.tooltipXOffset,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,titleTextColor:this.options.tooltipTitleFontColor,titleFontFamily:this.options.tooltipTitleFontFamily,titleFontStyle:this.options.tooltipTitleFontStyle,titleFontSize:this.options.tooltipTitleFontSize,cornerRadius:this.options.tooltipCornerRadius,labels:c,legendColors:u,legendColorBackground:this.options.multiTooltipKeyBackground,title:t[0].label,chart:this.chart,ctx:this.chart.ctx,custom:this.options.customTooltips}).draw()}else n(t,function(t){var i=t.tooltipPosition();new e.Tooltip({x:Math.round(i.x),y:Math.round(i.y),xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,caretHeight:this.options.tooltipCaretSize,cornerRadius:this.options.tooltipCornerRadius,text:C(this.options.tooltipTemplate,t),chart:this.chart,custom:this.options.customTooltips}).draw()},this);return this}},toBase64Image:function(){return this.chart.canvas.toDataURL.apply(this.chart.canvas,arguments)}}),e.Type.extend=function(t){var i=this,s=function(){return i.apply(this,arguments)};if(s.prototype=o(i.prototype),a(s.prototype,t),s.extend=e.Type.extend,t.name||i.prototype.name){var n=t.name||i.prototype.name,l=e.defaults[i.prototype.name]?o(e.defaults[i.prototype.name]):{};e.defaults[n]=a(l,t.defaults),e.types[n]=s,e.prototype[n]=function(t,i){var o=h(e.defaults.global,e.defaults[n],i||{});return new s(t,o,this)}}else d("Name not provided for this chart, so it hasn't been registered");return i},e.Element=function(t){a(this,t),this.initialize.apply(this,arguments),this.save()},a(e.Element.prototype,{initialize:function(){},restore:function(t){return t?n(t,function(t){this[t]=this._saved[t]},this):a(this,this._saved),this},save:function(){return this._saved=o(this),delete this._saved._saved,this},update:function(t){return n(t,function(t,i){this._saved[i]=this[i],this[i]=t},this),this},transition:function(t,i){return n(t,function(t,e){this[e]=(t-this._saved[e])*i+this._saved[e]},this),this},tooltipPosition:function(){return{x:this.x,y:this.y}},hasValue:function(){return f(this.value)}}),e.Element.extend=r,e.Point=e.Element.extend({display:!0,inRange:function(t,i){var e=this.hitDetectionRadius+this.radius;return Math.pow(t-this.x,2)+Math.pow(i-this.y,2)=this.startAngle&&e.angle<=this.endAngle,o=e.distance>=this.innerRadius&&e.distance<=this.outerRadius;return n&&o},tooltipPosition:function(){var t=this.startAngle+(this.endAngle-this.startAngle)/2,i=(this.outerRadius-this.innerRadius)/2+this.innerRadius;return{x:this.x+Math.cos(t)*i,y:this.y+Math.sin(t)*i}},draw:function(t){var i=this.ctx;i.beginPath(),i.arc(this.x,this.y,this.outerRadius,this.startAngle,this.endAngle),i.arc(this.x,this.y,this.innerRadius,this.endAngle,this.startAngle,!0),i.closePath(),i.strokeStyle=this.strokeColor,i.lineWidth=this.strokeWidth,i.fillStyle=this.fillColor,i.fill(),i.lineJoin="bevel",this.showStroke&&i.stroke()}}),e.Rectangle=e.Element.extend({draw:function(){var t=this.ctx,i=this.width/2,e=this.x-i,s=this.x+i,n=this.base-(this.base-this.y),o=this.strokeWidth/2;this.showStroke&&(e+=o,s-=o,n+=o),t.beginPath(),t.fillStyle=this.fillColor,t.strokeStyle=this.strokeColor,t.lineWidth=this.strokeWidth,t.moveTo(e,this.base),t.lineTo(e,n),t.lineTo(s,n),t.lineTo(s,this.base),t.fill(),this.showStroke&&t.stroke()},height:function(){return this.base-this.y},inRange:function(t,i){return t>=this.x-this.width/2&&t<=this.x+this.width/2&&i>=this.y&&i<=this.base}}),e.Tooltip=e.Element.extend({draw:function(){var t=this.chart.ctx;t.font=W(this.fontSize,this.fontStyle,this.fontFamily),this.xAlign="center",this.yAlign="above";var i=this.caretPadding=2,e=t.measureText(this.text).width+2*this.xPadding,s=this.fontSize+2*this.yPadding,n=s+this.caretHeight+i;this.x+e/2>this.chart.width?this.xAlign="left":this.x-e/2<0&&(this.xAlign="right"),this.y-n<0&&(this.yAlign="below");var o=this.x-e/2,a=this.y-n;if(t.fillStyle=this.fillColor,this.custom)this.custom(this);else{switch(this.yAlign){case"above":t.beginPath(),t.moveTo(this.x,this.y-i),t.lineTo(this.x+this.caretHeight,this.y-(i+this.caretHeight)),t.lineTo(this.x-this.caretHeight,this.y-(i+this.caretHeight)),t.closePath(),t.fill();break;case"below":a=this.y+i+this.caretHeight,t.beginPath(),t.moveTo(this.x,this.y+i),t.lineTo(this.x+this.caretHeight,this.y+i+this.caretHeight),t.lineTo(this.x-this.caretHeight,this.y+i+this.caretHeight),t.closePath(),t.fill()}switch(this.xAlign){case"left":o=this.x-e+(this.cornerRadius+this.caretHeight);break;case"right":o=this.x-(this.cornerRadius+this.caretHeight)}B(t,o,a,e,s,this.cornerRadius),t.fill(),t.fillStyle=this.textColor,t.textAlign="center",t.textBaseline="middle",t.fillText(this.text,o+e/2,a+s/2)}}}),e.MultiTooltip=e.Element.extend({initialize:function(){this.font=W(this.fontSize,this.fontStyle,this.fontFamily),this.titleFont=W(this.titleFontSize,this.titleFontStyle,this.titleFontFamily),this.height=this.labels.length*this.fontSize+(this.labels.length-1)*(this.fontSize/2)+2*this.yPadding+1.5*this.titleFontSize,this.ctx.font=this.titleFont;var t=this.ctx.measureText(this.title).width,i=z(this.ctx,this.font,this.labels)+this.fontSize+3,e=g([i,t]);this.width=e+2*this.xPadding;var s=this.height/2;this.y-s<0?this.y=s:this.y+s>this.chart.height&&(this.y=this.chart.height-s),this.x>this.chart.width/2?this.x-=this.xOffset+this.width:this.x+=this.xOffset},getLineHeight:function(t){var i=this.y-this.height/2+this.yPadding,e=t-1;return 0===t?i+this.titleFontSize/2:i+(1.5*this.fontSize*e+this.fontSize/2)+1.5*this.titleFontSize},draw:function(){if(this.custom)this.custom(this);else{B(this.ctx,this.x,this.y-this.height/2,this.width,this.height,this.cornerRadius);var t=this.ctx;t.fillStyle=this.fillColor,t.fill(),t.closePath(),t.textAlign="left",t.textBaseline="middle",t.fillStyle=this.titleTextColor,t.font=this.titleFont,t.fillText(this.title,this.x+this.xPadding,this.getLineHeight(0)),t.font=this.font,s.each(this.labels,function(i,e){t.fillStyle=this.textColor,t.fillText(i,this.x+this.xPadding+this.fontSize+3,this.getLineHeight(e+1)),t.fillStyle=this.legendColorBackground,t.fillRect(this.x+this.xPadding,this.getLineHeight(e+1)-this.fontSize/2,this.fontSize,this.fontSize),t.fillStyle=this.legendColors[e].fill,t.fillRect(this.x+this.xPadding,this.getLineHeight(e+1)-this.fontSize/2,this.fontSize,this.fontSize)},this)}}}),e.Scale=e.Element.extend({initialize:function(){this.fit()},buildYLabels:function(){this.yLabels=[];for(var t=v(this.stepValue),i=0;i<=this.steps;i++)this.yLabels.push(C(this.templateString,{value:(this.min+i*this.stepValue).toFixed(t)}));this.yLabelWidth=this.display&&this.showLabels?z(this.ctx,this.font,this.yLabels):0},addXLabel:function(t){this.xLabels.push(t),this.valuesCount++,this.fit()},removeXLabel:function(){this.xLabels.shift(),this.valuesCount--,this.fit()},fit:function(){this.startPoint=this.display?this.fontSize:0,this.endPoint=this.display?this.height-1.5*this.fontSize-5:this.height,this.startPoint+=this.padding,this.endPoint-=this.padding;var t,i=this.endPoint-this.startPoint;for(this.calculateYRange(i),this.buildYLabels(),this.calculateXLabelRotation();i>this.endPoint-this.startPoint;)i=this.endPoint-this.startPoint,t=this.yLabelWidth,this.calculateYRange(i),this.buildYLabels(),tthis.yLabelWidth+10?e/2:this.yLabelWidth+10,this.xLabelRotation=0,this.display){var n,o=z(this.ctx,this.font,this.xLabels);this.xLabelWidth=o;for(var a=Math.floor(this.calculateX(1)-this.calculateX(0))-6;this.xLabelWidth>a&&0===this.xLabelRotation||this.xLabelWidth>a&&this.xLabelRotation<=90&&this.xLabelRotation>0;)n=Math.cos(S(this.xLabelRotation)),t=n*e,i=n*s,t+this.fontSize/2>this.yLabelWidth+8&&(this.xScalePaddingLeft=t+this.fontSize/2),this.xScalePaddingRight=this.fontSize/2,this.xLabelRotation++,this.xLabelWidth=n*o;this.xLabelRotation>0&&(this.endPoint-=Math.sin(S(this.xLabelRotation))*o+3)}else this.xLabelWidth=0,this.xScalePaddingRight=this.padding,this.xScalePaddingLeft=this.padding},calculateYRange:c,drawingArea:function(){return this.startPoint-this.endPoint},calculateY:function(t){var i=this.drawingArea()/(this.min-this.max);return this.endPoint-i*(t-this.min)},calculateX:function(t){var i=(this.xLabelRotation>0,this.width-(this.xScalePaddingLeft+this.xScalePaddingRight)),e=i/Math.max(this.valuesCount-(this.offsetGridLines?0:1),1),s=e*t+this.xScalePaddingLeft;return this.offsetGridLines&&(s+=e/2),Math.round(s)},update:function(t){s.extend(this,t),this.fit()},draw:function(){var t=this.ctx,i=(this.endPoint-this.startPoint)/this.steps,e=Math.round(this.xScalePaddingLeft);this.display&&(t.fillStyle=this.textColor,t.font=this.font,n(this.yLabels,function(n,o){var a=this.endPoint-i*o,h=Math.round(a),l=this.showHorizontalLines;t.textAlign="right",t.textBaseline="middle",this.showLabels&&t.fillText(n,e-10,a),0!==o||l||(l=!0),l&&t.beginPath(),o>0?(t.lineWidth=this.gridLineWidth,t.strokeStyle=this.gridLineColor):(t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor),h+=s.aliasPixel(t.lineWidth),l&&(t.moveTo(e,h),t.lineTo(this.width,h),t.stroke(),t.closePath()),t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor,t.beginPath(),t.moveTo(e-5,h),t.lineTo(e,h),t.stroke(),t.closePath()},this),n(this.xLabels,function(i,e){var s=this.calculateX(e)+x(this.lineWidth),n=this.calculateX(e-(this.offsetGridLines?.5:0))+x(this.lineWidth),o=this.xLabelRotation>0,a=this.showVerticalLines;0!==e||a||(a=!0),a&&t.beginPath(),e>0?(t.lineWidth=this.gridLineWidth,t.strokeStyle=this.gridLineColor):(t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor),a&&(t.moveTo(n,this.endPoint),t.lineTo(n,this.startPoint-3),t.stroke(),t.closePath()),t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor,t.beginPath(),t.moveTo(n,this.endPoint),t.lineTo(n,this.endPoint+5),t.stroke(),t.closePath(),t.save(),t.translate(s,o?this.endPoint+12:this.endPoint+8),t.rotate(-1*S(this.xLabelRotation)),t.font=this.font,t.textAlign=o?"right":"center",t.textBaseline=o?"middle":"top",t.fillText(i,0,0),t.restore()},this))}}),e.RadialScale=e.Element.extend({initialize:function(){this.size=m([this.height,this.width]),this.drawingArea=this.display?this.size/2-(this.fontSize/2+this.backdropPaddingY):this.size/2},calculateCenterOffset:function(t){var i=this.drawingArea/(this.max-this.min);return(t-this.min)*i},update:function(){this.lineArc?this.drawingArea=this.display?this.size/2-(this.fontSize/2+this.backdropPaddingY):this.size/2:this.setScaleSize(),this.buildYLabels()},buildYLabels:function(){this.yLabels=[];for(var t=v(this.stepValue),i=0;i<=this.steps;i++)this.yLabels.push(C(this.templateString,{value:(this.min+i*this.stepValue).toFixed(t)}))},getCircumference:function(){return 2*Math.PI/this.valuesCount},setScaleSize:function(){var t,i,e,s,n,o,a,h,l,r,c,u,d=m([this.height/2-this.pointLabelFontSize-5,this.width/2]),p=this.width,g=0;for(this.ctx.font=W(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily),i=0;ip&&(p=t.x+s,n=i),t.x-sp&&(p=t.x+e,n=i):i>this.valuesCount/2&&t.x-e0){var s,n=e*(this.drawingArea/this.steps),o=this.yCenter-n;if(this.lineWidth>0)if(t.strokeStyle=this.lineColor,t.lineWidth=this.lineWidth,this.lineArc)t.beginPath(),t.arc(this.xCenter,this.yCenter,n,0,2*Math.PI),t.closePath(),t.stroke();else{t.beginPath();for(var a=0;a=0;i--){if(this.angleLineWidth>0){var e=this.getPointPosition(i,this.calculateCenterOffset(this.max));t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(e.x,e.y),t.stroke(),t.closePath()}var s=this.getPointPosition(i,this.calculateCenterOffset(this.max)+5);t.font=W(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily),t.fillStyle=this.pointLabelFontColor;var o=this.labels.length,a=this.labels.length/2,h=a/2,l=h>i||i>o-h,r=i===h||i===o-h;t.textAlign=0===i?"center":i===a?"center":a>i?"left":"right",t.textBaseline=r?"middle":l?"bottom":"top",t.fillText(this.labels[i],s.x,s.y)}}}}}),s.addEvent(window,"resize",function(){var t;return function(){clearTimeout(t),t=setTimeout(function(){n(e.instances,function(t){t.options.responsive&&t.resize(t.render,!0)})},50)}}()),p?define(function(){return e}):"object"==typeof module&&module.exports&&(module.exports=e),t.Chart=e,e.noConflict=function(){return t.Chart=i,e}}).call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={scaleBeginAtZero:!0,scaleShowGridLines:!0,scaleGridLineColor:"rgba(0,0,0,.05)",scaleGridLineWidth:1,scaleShowHorizontalLines:!0,scaleShowVerticalLines:!0,barShowStroke:!0,barStrokeWidth:2,barValueSpacing:5,barDatasetSpacing:1,legendTemplate:'
    <% for (var i=0; i
  • <%if(datasets[i].label){%><%=datasets[i].label%><%}%>
  • <%}%>
'};i.Type.extend({name:"Bar",defaults:s,initialize:function(t){var s=this.options;this.ScaleClass=i.Scale.extend({offsetGridLines:!0,calculateBarX:function(t,i,e){var n=this.calculateBaseWidth(),o=this.calculateX(e)-n/2,a=this.calculateBarWidth(t);return o+a*i+i*s.barDatasetSpacing+a/2},calculateBaseWidth:function(){return this.calculateX(1)-this.calculateX(0)-2*s.barValueSpacing},calculateBarWidth:function(t){var i=this.calculateBaseWidth()-(t-1)*s.barDatasetSpacing;return i/t}}),this.datasets=[],this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getBarsAtEvent(t):[];this.eachBars(function(t){t.restore(["fillColor","strokeColor"])}),e.each(i,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(i)}),this.BarClass=i.Rectangle.extend({strokeWidth:this.options.barStrokeWidth,showStroke:this.options.barShowStroke,ctx:this.chart.ctx}),e.each(t.datasets,function(i){var s={label:i.label||null,fillColor:i.fillColor,strokeColor:i.strokeColor,bars:[]};this.datasets.push(s),e.each(i.data,function(e,n){s.bars.push(new this.BarClass({value:e,label:t.labels[n],datasetLabel:i.label,strokeColor:i.strokeColor,fillColor:i.fillColor,highlightFill:i.highlightFill||i.fillColor,highlightStroke:i.highlightStroke||i.strokeColor}))},this)},this),this.buildScale(t.labels),this.BarClass.prototype.base=this.scale.endPoint,this.eachBars(function(t,i,s){e.extend(t,{width:this.scale.calculateBarWidth(this.datasets.length),x:this.scale.calculateBarX(this.datasets.length,s,i),y:this.scale.endPoint}),t.save()},this),this.render()},update:function(){this.scale.update(),e.each(this.activeElements,function(t){t.restore(["fillColor","strokeColor"])}),this.eachBars(function(t){t.save()}),this.render()},eachBars:function(t){e.each(this.datasets,function(i,s){e.each(i.bars,t,this,s)},this)},getBarsAtEvent:function(t){for(var i,s=[],n=e.getRelativePosition(t),o=function(t){s.push(t.bars[i])},a=0;a<% for (var i=0; i
  • <%if(segments[i].label){%><%=segments[i].label%><%}%>
  • <%}%>'};i.Type.extend({name:"Doughnut",defaults:s,initialize:function(t){this.segments=[],this.outerRadius=(e.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2,this.SegmentArc=i.Arc.extend({ctx:this.chart.ctx,x:this.chart.width/2,y:this.chart.height/2}),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getSegmentsAtEvent(t):[];e.each(this.segments,function(t){t.restore(["fillColor"])}),e.each(i,function(t){t.fillColor=t.highlightColor}),this.showTooltip(i)}),this.calculateTotal(t),e.each(t,function(t,i){this.addData(t,i,!0)},this),this.render()},getSegmentsAtEvent:function(t){var i=[],s=e.getRelativePosition(t);return e.each(this.segments,function(t){t.inRange(s.x,s.y)&&i.push(t)},this),i},addData:function(t,i,e){var s=i||this.segments.length;this.segments.splice(s,0,new this.SegmentArc({value:t.value,outerRadius:this.options.animateScale?0:this.outerRadius,innerRadius:this.options.animateScale?0:this.outerRadius/100*this.options.percentageInnerCutout,fillColor:t.color,highlightColor:t.highlight||t.color,showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,startAngle:1.5*Math.PI,circumference:this.options.animateRotate?0:this.calculateCircumference(t.value),label:t.label})),e||(this.reflow(),this.update())},calculateCircumference:function(t){return 2*Math.PI*(Math.abs(t)/this.total)},calculateTotal:function(t){this.total=0,e.each(t,function(t){this.total+=Math.abs(t.value)},this)},update:function(){this.calculateTotal(this.segments),e.each(this.activeElements,function(t){t.restore(["fillColor"])}),e.each(this.segments,function(t){t.save()}),this.render()},removeData:function(t){var i=e.isNumber(t)?t:this.segments.length-1;this.segments.splice(i,1),this.reflow(),this.update()},reflow:function(){e.extend(this.SegmentArc.prototype,{x:this.chart.width/2,y:this.chart.height/2}),this.outerRadius=(e.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2,e.each(this.segments,function(t){t.update({outerRadius:this.outerRadius,innerRadius:this.outerRadius/100*this.options.percentageInnerCutout})},this)},draw:function(t){var i=t?t:1;this.clear(),e.each(this.segments,function(t,e){t.transition({circumference:this.calculateCircumference(t.value),outerRadius:this.outerRadius,innerRadius:this.outerRadius/100*this.options.percentageInnerCutout},i),t.endAngle=t.startAngle+t.circumference,t.draw(),0===e&&(t.startAngle=1.5*Math.PI),e<% for (var i=0; i
  • <%if(datasets[i].label){%><%=datasets[i].label%><%}%>
  • <%}%>'};i.Type.extend({name:"Line",defaults:s,initialize:function(t){this.PointClass=i.Point.extend({strokeWidth:this.options.pointDotStrokeWidth,radius:this.options.pointDotRadius,display:this.options.pointDot,hitDetectionRadius:this.options.pointHitDetectionRadius,ctx:this.chart.ctx,inRange:function(t){return Math.pow(t-this.x,2)0&&ithis.scale.endPoint?t.controlPoints.outer.y=this.scale.endPoint:t.controlPoints.outer.ythis.scale.endPoint?t.controlPoints.inner.y=this.scale.endPoint:t.controlPoints.inner.y0&&(s.lineTo(h[h.length-1].x,this.scale.endPoint),s.lineTo(h[0].x,this.scale.endPoint),s.fillStyle=t.fillColor,s.closePath(),s.fill()),e.each(h,function(t){t.draw()})},this)}})}.call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={scaleShowLabelBackdrop:!0,scaleBackdropColor:"rgba(255,255,255,0.75)",scaleBeginAtZero:!0,scaleBackdropPaddingY:2,scaleBackdropPaddingX:2,scaleShowLine:!0,segmentShowStroke:!0,segmentStrokeColor:"#fff",segmentStrokeWidth:2,animationSteps:100,animationEasing:"easeOutBounce",animateRotate:!0,animateScale:!1,legendTemplate:'
      <% for (var i=0; i
    • <%if(segments[i].label){%><%=segments[i].label%><%}%>
    • <%}%>
    '};i.Type.extend({name:"PolarArea",defaults:s,initialize:function(t){this.segments=[],this.SegmentArc=i.Arc.extend({showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,ctx:this.chart.ctx,innerRadius:0,x:this.chart.width/2,y:this.chart.height/2}),this.scale=new i.RadialScale({display:this.options.showScale,fontStyle:this.options.scaleFontStyle,fontSize:this.options.scaleFontSize,fontFamily:this.options.scaleFontFamily,fontColor:this.options.scaleFontColor,showLabels:this.options.scaleShowLabels,showLabelBackdrop:this.options.scaleShowLabelBackdrop,backdropColor:this.options.scaleBackdropColor,backdropPaddingY:this.options.scaleBackdropPaddingY,backdropPaddingX:this.options.scaleBackdropPaddingX,lineWidth:this.options.scaleShowLine?this.options.scaleLineWidth:0,lineColor:this.options.scaleLineColor,lineArc:!0,width:this.chart.width,height:this.chart.height,xCenter:this.chart.width/2,yCenter:this.chart.height/2,ctx:this.chart.ctx,templateString:this.options.scaleLabel,valuesCount:t.length}),this.updateScaleRange(t),this.scale.update(),e.each(t,function(t,i){this.addData(t,i,!0)},this),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getSegmentsAtEvent(t):[];e.each(this.segments,function(t){t.restore(["fillColor"])}),e.each(i,function(t){t.fillColor=t.highlightColor}),this.showTooltip(i)}),this.render()},getSegmentsAtEvent:function(t){var i=[],s=e.getRelativePosition(t);return e.each(this.segments,function(t){t.inRange(s.x,s.y)&&i.push(t)},this),i},addData:function(t,i,e){var s=i||this.segments.length;this.segments.splice(s,0,new this.SegmentArc({fillColor:t.color,highlightColor:t.highlight||t.color,label:t.label,value:t.value,outerRadius:this.options.animateScale?0:this.scale.calculateCenterOffset(t.value),circumference:this.options.animateRotate?0:this.scale.getCircumference(),startAngle:1.5*Math.PI})),e||(this.reflow(),this.update())},removeData:function(t){var i=e.isNumber(t)?t:this.segments.length-1;this.segments.splice(i,1),this.reflow(),this.update()},calculateTotal:function(t){this.total=0,e.each(t,function(t){this.total+=t.value},this),this.scale.valuesCount=this.segments.length},updateScaleRange:function(t){var i=[];e.each(t,function(t){i.push(t.value)});var s=this.options.scaleOverride?{steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}:e.calculateScaleRange(i,e.min([this.chart.width,this.chart.height])/2,this.options.scaleFontSize,this.options.scaleBeginAtZero,this.options.scaleIntegersOnly);e.extend(this.scale,s,{size:e.min([this.chart.width,this.chart.height]),xCenter:this.chart.width/2,yCenter:this.chart.height/2})},update:function(){this.calculateTotal(this.segments),e.each(this.segments,function(t){t.save()}),this.reflow(),this.render()},reflow:function(){e.extend(this.SegmentArc.prototype,{x:this.chart.width/2,y:this.chart.height/2}),this.updateScaleRange(this.segments),this.scale.update(),e.extend(this.scale,{xCenter:this.chart.width/2,yCenter:this.chart.height/2}),e.each(this.segments,function(t){t.update({outerRadius:this.scale.calculateCenterOffset(t.value)})},this)},draw:function(t){var i=t||1;this.clear(),e.each(this.segments,function(t,e){t.transition({circumference:this.scale.getCircumference(),outerRadius:this.scale.calculateCenterOffset(t.value)},i),t.endAngle=t.startAngle+t.circumference,0===e&&(t.startAngle=1.5*Math.PI),e<% for (var i=0; i
  • <%if(datasets[i].label){%><%=datasets[i].label%><%}%>
  • <%}%>'},initialize:function(t){this.PointClass=i.Point.extend({strokeWidth:this.options.pointDotStrokeWidth,radius:this.options.pointDotRadius,display:this.options.pointDot,hitDetectionRadius:this.options.pointHitDetectionRadius,ctx:this.chart.ctx}),this.datasets=[],this.buildScale(t),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getPointsAtEvent(t):[];this.eachPoints(function(t){t.restore(["fillColor","strokeColor"])}),e.each(i,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(i)}),e.each(t.datasets,function(i){var s={label:i.label||null,fillColor:i.fillColor,strokeColor:i.strokeColor,pointColor:i.pointColor,pointStrokeColor:i.pointStrokeColor,points:[]};this.datasets.push(s),e.each(i.data,function(e,n){var o;this.scale.animation||(o=this.scale.getPointPosition(n,this.scale.calculateCenterOffset(e))),s.points.push(new this.PointClass({value:e,label:t.labels[n],datasetLabel:i.label,x:this.options.animation?this.scale.xCenter:o.x,y:this.options.animation?this.scale.yCenter:o.y,strokeColor:i.pointStrokeColor,fillColor:i.pointColor,highlightFill:i.pointHighlightFill||i.pointColor,highlightStroke:i.pointHighlightStroke||i.pointStrokeColor}))},this)},this),this.render()},eachPoints:function(t){e.each(this.datasets,function(i){e.each(i.points,t,this)},this)},getPointsAtEvent:function(t){var i=e.getRelativePosition(t),s=e.getAngleFromPoint({x:this.scale.xCenter,y:this.scale.yCenter},i),n=2*Math.PI/this.scale.valuesCount,o=Math.round((s.angle-1.5*Math.PI)/n),a=[];return(o>=this.scale.valuesCount||0>o)&&(o=0),s.distance<=this.scale.drawingArea&&e.each(this.datasets,function(t){a.push(t.points[o])}),a},buildScale:function(t){this.scale=new i.RadialScale({display:this.options.showScale,fontStyle:this.options.scaleFontStyle,fontSize:this.options.scaleFontSize,fontFamily:this.options.scaleFontFamily,fontColor:this.options.scaleFontColor,showLabels:this.options.scaleShowLabels,showLabelBackdrop:this.options.scaleShowLabelBackdrop,backdropColor:this.options.scaleBackdropColor,backdropPaddingY:this.options.scaleBackdropPaddingY,backdropPaddingX:this.options.scaleBackdropPaddingX,lineWidth:this.options.scaleShowLine?this.options.scaleLineWidth:0,lineColor:this.options.scaleLineColor,angleLineColor:this.options.angleLineColor,angleLineWidth:this.options.angleShowLineOut?this.options.angleLineWidth:0,pointLabelFontColor:this.options.pointLabelFontColor,pointLabelFontSize:this.options.pointLabelFontSize,pointLabelFontFamily:this.options.pointLabelFontFamily,pointLabelFontStyle:this.options.pointLabelFontStyle,height:this.chart.height,width:this.chart.width,xCenter:this.chart.width/2,yCenter:this.chart.height/2,ctx:this.chart.ctx,templateString:this.options.scaleLabel,labels:t.labels,valuesCount:t.datasets[0].data.length}),this.scale.setScaleSize(),this.updateScaleRange(t.datasets),this.scale.buildYLabels()},updateScaleRange:function(t){var i=function(){var i=[];return e.each(t,function(t){t.data?i=i.concat(t.data):e.each(t.points,function(t){i.push(t.value)})}),i}(),s=this.options.scaleOverride?{steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}:e.calculateScaleRange(i,e.min([this.chart.width,this.chart.height])/2,this.options.scaleFontSize,this.options.scaleBeginAtZero,this.options.scaleIntegersOnly);e.extend(this.scale,s)},addData:function(t,i){this.scale.valuesCount++,e.each(t,function(t,e){var s=this.scale.getPointPosition(this.scale.valuesCount,this.scale.calculateCenterOffset(t));this.datasets[e].points.push(new this.PointClass({value:t,label:i,x:s.x,y:s.y,strokeColor:this.datasets[e].pointStrokeColor,fillColor:this.datasets[e].pointColor}))},this),this.scale.labels.push(i),this.reflow(),this.update()},removeData:function(){this.scale.valuesCount--,this.scale.labels.shift(),e.each(this.datasets,function(t){t.points.shift()},this),this.reflow(),this.update()},update:function(){this.eachPoints(function(t){t.save()}),this.reflow(),this.render()},reflow:function(){e.extend(this.scale,{width:this.chart.width,height:this.chart.height,size:e.min([this.chart.width,this.chart.height]),xCenter:this.chart.width/2,yCenter:this.chart.height/2}),this.updateScaleRange(this.datasets),this.scale.setScaleSize(),this.scale.buildYLabels()},draw:function(t){var i=t||1,s=this.chart.ctx;this.clear(),this.scale.draw(),e.each(this.datasets,function(t){e.each(t.points,function(t,e){t.hasValue()&&t.transition(this.scale.getPointPosition(e,this.scale.calculateCenterOffset(t.value)),i)},this),s.lineWidth=this.options.datasetStrokeWidth,s.strokeStyle=t.strokeColor,s.beginPath(),e.each(t.points,function(t,i){0===i?s.moveTo(t.x,t.y):s.lineTo(t.x,t.y)},this),s.closePath(),s.stroke(),s.fillStyle=t.fillColor,s.fill(),e.each(t.points,function(t){t.hasValue()&&t.draw()})},this)}})}.call(this); \ No newline at end of file diff --git a/public/bower_components/Chart.js/LICENSE.md b/public/bower_components/Chart.js/LICENSE.md new file mode 100755 index 0000000..e10bc0f --- /dev/null +++ b/public/bower_components/Chart.js/LICENSE.md @@ -0,0 +1,7 @@ +Copyright (c) 2013-2015 Nick Downie + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/public/bower_components/Chart.js/README.md b/public/bower_components/Chart.js/README.md new file mode 100755 index 0000000..7c4fa8b --- /dev/null +++ b/public/bower_components/Chart.js/README.md @@ -0,0 +1,20 @@ +# Chart.js + +[![Build Status](https://travis-ci.org/nnnick/Chart.js.svg?branch=master)](https://travis-ci.org/nnnick/Chart.js) [![Code Climate](https://codeclimate.com/github/nnnick/Chart.js/badges/gpa.svg)](https://codeclimate.com/github/nnnick/Chart.js) + + +*Simple HTML5 Charts using the canvas element* [chartjs.org](http://www.chartjs.org) + +## Documentation + +You can find documentation at [chartjs.org/docs](http://www.chartjs.org/docs/). The markdown files that build the site are available under `/docs`. Please note - in some of the json examples of configuration you might notice some liquid tags - this is just for the generating the site html, please disregard. + +## Bugs, issues and contributing + +Before submitting an issue or a pull request to the project, please take a moment to look over the [contributing guidelines](https://github.com/nnnick/Chart.js/blob/master/CONTRIBUTING.md) first. + +For support using Chart.js, please post questions with the [`chartjs` tag on Stack Overflow](http://stackoverflow.com/questions/tagged/chartjs). + +## License + +Chart.js is available under the [MIT license](http://opensource.org/licenses/MIT). diff --git a/public/bower_components/Chart.js/bower.json b/public/bower_components/Chart.js/bower.json new file mode 100755 index 0000000..f26f81e --- /dev/null +++ b/public/bower_components/Chart.js/bower.json @@ -0,0 +1,11 @@ +{ + "name": "Chart.js", + "version": "1.0.2", + "description": "Simple HTML5 Charts using the canvas element", + "homepage": "https://github.com/nnnick/Chart.js", + "author": "nnnick", + "main": [ + "Chart.js" + ], + "dependencies": {} +} \ No newline at end of file diff --git a/public/bower_components/Chart.js/docs/00-Getting-Started.md b/public/bower_components/Chart.js/docs/00-Getting-Started.md new file mode 100755 index 0000000..273b10f --- /dev/null +++ b/public/bower_components/Chart.js/docs/00-Getting-Started.md @@ -0,0 +1,203 @@ +--- +title: Getting started +anchor: getting-started +--- + +###Include Chart.js + +First we need to include the Chart.js library on the page. The library occupies a global variable of `Chart`. + +```html + +``` + +Alternatively, if you're using an AMD loader for JavaScript modules, that is also supported in the Chart.js core. Please note: the library will still occupy a global variable of `Chart`, even if it detects `define` and `define.amd`. If this is a problem, you can call `noConflict` to restore the global Chart variable to it's previous owner. + +```javascript +// Using requirejs +require(['path/to/Chartjs'], function(Chart){ + // Use Chart.js as normal here. + + // Chart.noConflict restores the Chart global variable to it's previous owner + // The function returns what was previously Chart, allowing you to reassign. + var Chartjs = Chart.noConflict(); + +}); +``` + +You can also grab Chart.js using bower: + +```bash +bower install Chart.js --save +``` + +###Creating a chart + +To create a chart, we need to instantiate the `Chart` class. To do this, we need to pass in the 2d context of where we want to draw the chart. Here's an example. + +```html + +``` + +```javascript +// Get the context of the canvas element we want to select +var ctx = document.getElementById("myChart").getContext("2d"); +var myNewChart = new Chart(ctx).PolarArea(data); +``` + +We can also get the context of our canvas with jQuery. To do this, we need to get the DOM node out of the jQuery collection, and call the `getContext("2d")` method on that. + +```javascript +// Get context with jQuery - using jQuery's .get() method. +var ctx = $("#myChart").get(0).getContext("2d"); +// This will get the first returned node in the jQuery collection. +var myNewChart = new Chart(ctx); +``` + +After we've instantiated the Chart class on the canvas we want to draw on, Chart.js will handle the scaling for retina displays. + +With the Chart class set up, we can go on to create one of the charts Chart.js has available. In the example below, we would be drawing a Polar area chart. + +```javascript +new Chart(ctx).PolarArea(data, options); +``` + +We call a method of the name of the chart we want to create. We pass in the data for that chart type, and the options for that chart as parameters. Chart.js will merge the global defaults with chart type specific defaults, then merge any options passed in as a second argument after data. + +###Global chart configuration + +This concept was introduced in Chart.js 1.0 to keep configuration DRY, and allow for changing options globally across chart types, avoiding the need to specify options for each instance, or the default for a particular chart type. + +```javascript +Chart.defaults.global = { + // Boolean - Whether to animate the chart + animation: true, + + // Number - Number of animation steps + animationSteps: 60, + + // String - Animation easing effect + animationEasing: "easeOutQuart", + + // Boolean - If we should show the scale at all + showScale: true, + + // Boolean - If we want to override with a hard coded scale + scaleOverride: false, + + // ** Required if scaleOverride is true ** + // Number - The number of steps in a hard coded scale + scaleSteps: null, + // Number - The value jump in the hard coded scale + scaleStepWidth: null, + // Number - The scale starting value + scaleStartValue: null, + + // String - Colour of the scale line + scaleLineColor: "rgba(0,0,0,.1)", + + // Number - Pixel width of the scale line + scaleLineWidth: 1, + + // Boolean - Whether to show labels on the scale + scaleShowLabels: true, + + // Interpolated JS string - can access value + scaleLabel: "<%=value%>", + + // Boolean - Whether the scale should stick to integers, not floats even if drawing space is there + scaleIntegersOnly: true, + + // Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value + scaleBeginAtZero: false, + + // String - Scale label font declaration for the scale label + scaleFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + + // Number - Scale label font size in pixels + scaleFontSize: 12, + + // String - Scale label font weight style + scaleFontStyle: "normal", + + // String - Scale label font colour + scaleFontColor: "#666", + + // Boolean - whether or not the chart should be responsive and resize when the browser does. + responsive: false, + + // Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container + maintainAspectRatio: true, + + // Boolean - Determines whether to draw tooltips on the canvas or not + showTooltips: true, + + // Function - Determines whether to execute the customTooltips function instead of drawing the built in tooltips (See [Advanced - External Tooltips](#advanced-usage-custom-tooltips)) + customTooltips: false, + + // Array - Array of string names to attach tooltip events + tooltipEvents: ["mousemove", "touchstart", "touchmove"], + + // String - Tooltip background colour + tooltipFillColor: "rgba(0,0,0,0.8)", + + // String - Tooltip label font declaration for the scale label + tooltipFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + + // Number - Tooltip label font size in pixels + tooltipFontSize: 14, + + // String - Tooltip font weight style + tooltipFontStyle: "normal", + + // String - Tooltip label font colour + tooltipFontColor: "#fff", + + // String - Tooltip title font declaration for the scale label + tooltipTitleFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + + // Number - Tooltip title font size in pixels + tooltipTitleFontSize: 14, + + // String - Tooltip title font weight style + tooltipTitleFontStyle: "bold", + + // String - Tooltip title font colour + tooltipTitleFontColor: "#fff", + + // Number - pixel width of padding around tooltip text + tooltipYPadding: 6, + + // Number - pixel width of padding around tooltip text + tooltipXPadding: 6, + + // Number - Size of the caret on the tooltip + tooltipCaretSize: 8, + + // Number - Pixel radius of the tooltip border + tooltipCornerRadius: 6, + + // Number - Pixel offset from point x to tooltip edge + tooltipXOffset: 10, + {% raw %} + // String - Template string for single tooltips + tooltipTemplate: "<%if (label){%><%=label%>: <%}%><%= value %>", + {% endraw %} + // String - Template string for multiple tooltips + multiTooltipTemplate: "<%= value %>", + + // Function - Will fire on animation progression. + onAnimationProgress: function(){}, + + // Function - Will fire on animation completion. + onAnimationComplete: function(){} +} +``` + +If for example, you wanted all charts created to be responsive, and resize when the browser window does, the following setting can be changed: + +```javascript +Chart.defaults.global.responsive = true; +``` + +Now, every time we create a chart, `options.responsive` will be `true`. diff --git a/public/bower_components/Chart.js/docs/01-Line-Chart.md b/public/bower_components/Chart.js/docs/01-Line-Chart.md new file mode 100755 index 0000000..1a5ae84 --- /dev/null +++ b/public/bower_components/Chart.js/docs/01-Line-Chart.md @@ -0,0 +1,166 @@ +--- +title: Line Chart +anchor: line-chart +--- +###Introduction +A line chart is a way of plotting data points on a line. + +Often, it is used to show trend data, and the comparison of two data sets. + +
    + +
    + +###Example usage +```javascript +var myLineChart = new Chart(ctx).Line(data, options); +``` +###Data structure + +```javascript +var data = { + labels: ["January", "February", "March", "April", "May", "June", "July"], + datasets: [ + { + label: "My First dataset", + fillColor: "rgba(220,220,220,0.2)", + strokeColor: "rgba(220,220,220,1)", + pointColor: "rgba(220,220,220,1)", + pointStrokeColor: "#fff", + pointHighlightFill: "#fff", + pointHighlightStroke: "rgba(220,220,220,1)", + data: [65, 59, 80, 81, 56, 55, 40] + }, + { + label: "My Second dataset", + fillColor: "rgba(151,187,205,0.2)", + strokeColor: "rgba(151,187,205,1)", + pointColor: "rgba(151,187,205,1)", + pointStrokeColor: "#fff", + pointHighlightFill: "#fff", + pointHighlightStroke: "rgba(151,187,205,1)", + data: [28, 48, 40, 19, 86, 27, 90] + } + ] +}; +``` + +The line chart requires an array of labels for each of the data points. This is shown on the X axis. +The data for line charts is broken up into an array of datasets. Each dataset has a colour for the fill, a colour for the line and colours for the points and strokes of the points. These colours are strings just like CSS. You can use RGBA, RGB, HEX or HSL notation. + +The label key on each dataset is optional, and can be used when generating a scale for the chart. + +### Chart options + +These are the customisation options specific to Line charts. These options are merged with the [global chart configuration options](#getting-started-global-chart-configuration), and form the options of the chart. + +```javascript +{ + + ///Boolean - Whether grid lines are shown across the chart + scaleShowGridLines : true, + + //String - Colour of the grid lines + scaleGridLineColor : "rgba(0,0,0,.05)", + + //Number - Width of the grid lines + scaleGridLineWidth : 1, + + //Boolean - Whether to show horizontal lines (except X axis) + scaleShowHorizontalLines: true, + + //Boolean - Whether to show vertical lines (except Y axis) + scaleShowVerticalLines: true, + + //Boolean - Whether the line is curved between points + bezierCurve : true, + + //Number - Tension of the bezier curve between points + bezierCurveTension : 0.4, + + //Boolean - Whether to show a dot for each point + pointDot : true, + + //Number - Radius of each point dot in pixels + pointDotRadius : 4, + + //Number - Pixel width of point dot stroke + pointDotStrokeWidth : 1, + + //Number - amount extra to add to the radius to cater for hit detection outside the drawn point + pointHitDetectionRadius : 20, + + //Boolean - Whether to show a stroke for datasets + datasetStroke : true, + + //Number - Pixel width of dataset stroke + datasetStrokeWidth : 2, + + //Boolean - Whether to fill the dataset with a colour + datasetFill : true, + {% raw %} + //String - A legend template + legendTemplate : "
      -legend\"><% for (var i=0; i
    • \"><%if(datasets[i].label){%><%=datasets[i].label%><%}%>
    • <%}%>
    " + {% endraw %} +}; +``` + +You can override these for your `Chart` instance by passing a second argument into the `Line` method as an object with the keys you want to override. + +For example, we could have a line chart without bezier curves between points by doing the following: + +```javascript +new Chart(ctx).Line(data, { + bezierCurve: false +}); +// This will create a chart with all of the default options, merged from the global config, +// and the Line chart defaults, but this particular instance will have `bezierCurve` set to false. +``` + +We can also change these defaults values for each Line type that is created, this object is available at `Chart.defaults.Line`. + + +### Prototype methods + +#### .getPointsAtEvent( event ) + +Calling `getPointsAtEvent(event)` on your Chart instance passing an argument of an event, or jQuery event, will return the point elements that are at that the same position of that event. + +```javascript +canvas.onclick = function(evt){ + var activePoints = myLineChart.getPointsAtEvent(evt); + // => activePoints is an array of points on the canvas that are at the same position as the click event. +}; +``` + +This functionality may be useful for implementing DOM based tooltips, or triggering custom behaviour in your application. + +#### .update( ) + +Calling `update()` on your Chart instance will re-render the chart with any updated values, allowing you to edit the value of multiple existing points, then render those in one animated render loop. + +```javascript +myLineChart.datasets[0].points[2].value = 50; +// Would update the first dataset's value of 'March' to be 50 +myLineChart.update(); +// Calling update now animates the position of March from 90 to 50. +``` + +#### .addData( valuesArray, label ) + +Calling `addData(valuesArray, label)` on your Chart instance passing an array of values for each dataset, along with a label for those points. + +```javascript +// The values array passed into addData should be one for each dataset in the chart +myLineChart.addData([40, 60], "August"); +// This new data will now animate at the end of the chart. +``` + +#### .removeData( ) + +Calling `removeData()` on your Chart instance will remove the first value for all datasets on the chart. + +```javascript +myLineChart.removeData(); +// The chart will remove the first point and animate other points into place +``` diff --git a/public/bower_components/Chart.js/docs/02-Bar-Chart.md b/public/bower_components/Chart.js/docs/02-Bar-Chart.md new file mode 100755 index 0000000..cc23f38 --- /dev/null +++ b/public/bower_components/Chart.js/docs/02-Bar-Chart.md @@ -0,0 +1,149 @@ +--- +title: Bar Chart +anchor: bar-chart +--- + +### Introduction +A bar chart is a way of showing data as bars. + +It is sometimes used to show trend data, and the comparison of multiple data sets side by side. + +
    + +
    + +### Example usage +```javascript +var myBarChart = new Chart(ctx).Bar(data, options); +``` + +### Data structure + +```javascript +var data = { + labels: ["January", "February", "March", "April", "May", "June", "July"], + datasets: [ + { + label: "My First dataset", + fillColor: "rgba(220,220,220,0.5)", + strokeColor: "rgba(220,220,220,0.8)", + highlightFill: "rgba(220,220,220,0.75)", + highlightStroke: "rgba(220,220,220,1)", + data: [65, 59, 80, 81, 56, 55, 40] + }, + { + label: "My Second dataset", + fillColor: "rgba(151,187,205,0.5)", + strokeColor: "rgba(151,187,205,0.8)", + highlightFill: "rgba(151,187,205,0.75)", + highlightStroke: "rgba(151,187,205,1)", + data: [28, 48, 40, 19, 86, 27, 90] + } + ] +}; +``` +The bar chart has the a very similar data structure to the line chart, and has an array of datasets, each with colours and an array of data. Again, colours are in CSS format. +We have an array of labels too for display. In the example, we are showing the same data as the previous line chart example. + +The label key on each dataset is optional, and can be used when generating a scale for the chart. + +### Chart Options + +These are the customisation options specific to Bar charts. These options are merged with the [global chart configuration options](#getting-started-global-chart-configuration), and form the options of the chart. + +```javascript +{ + //Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value + scaleBeginAtZero : true, + + //Boolean - Whether grid lines are shown across the chart + scaleShowGridLines : true, + + //String - Colour of the grid lines + scaleGridLineColor : "rgba(0,0,0,.05)", + + //Number - Width of the grid lines + scaleGridLineWidth : 1, + + //Boolean - Whether to show horizontal lines (except X axis) + scaleShowHorizontalLines: true, + + //Boolean - Whether to show vertical lines (except Y axis) + scaleShowVerticalLines: true, + + //Boolean - If there is a stroke on each bar + barShowStroke : true, + + //Number - Pixel width of the bar stroke + barStrokeWidth : 2, + + //Number - Spacing between each of the X value sets + barValueSpacing : 5, + + //Number - Spacing between data sets within X values + barDatasetSpacing : 1, + {% raw %} + //String - A legend template + legendTemplate : "
      -legend\"><% for (var i=0; i
    • \"><%if(datasets[i].label){%><%=datasets[i].label%><%}%>
    • <%}%>
    " + {% endraw %} +} +``` + +You can override these for your `Chart` instance by passing a second argument into the `Bar` method as an object with the keys you want to override. + +For example, we could have a bar chart without a stroke on each bar by doing the following: + +```javascript +new Chart(ctx).Bar(data, { + barShowStroke: false +}); +// This will create a chart with all of the default options, merged from the global config, +// and the Bar chart defaults but this particular instance will have `barShowStroke` set to false. +``` + +We can also change these defaults values for each Bar type that is created, this object is available at `Chart.defaults.Bar`. + +### Prototype methods + +#### .getBarsAtEvent( event ) + +Calling `getBarsAtEvent(event)` on your Chart instance passing an argument of an event, or jQuery event, will return the bar elements that are at that the same position of that event. + +```javascript +canvas.onclick = function(evt){ + var activeBars = myBarChart.getBarsAtEvent(evt); + // => activeBars is an array of bars on the canvas that are at the same position as the click event. +}; +``` + +This functionality may be useful for implementing DOM based tooltips, or triggering custom behaviour in your application. + +#### .update( ) + +Calling `update()` on your Chart instance will re-render the chart with any updated values, allowing you to edit the value of multiple existing points, then render those in one animated render loop. + +```javascript +myBarChart.datasets[0].bars[2].value = 50; +// Would update the first dataset's value of 'March' to be 50 +myBarChart.update(); +// Calling update now animates the position of March from 90 to 50. +``` + +#### .addData( valuesArray, label ) + +Calling `addData(valuesArray, label)` on your Chart instance passing an array of values for each dataset, along with a label for those bars. + +```javascript +// The values array passed into addData should be one for each dataset in the chart +myBarChart.addData([40, 60], "August"); +// The new data will now animate at the end of the chart. +``` + +#### .removeData( ) + +Calling `removeData()` on your Chart instance will remove the first value for all datasets on the chart. + +```javascript +myBarChart.removeData(); +// The chart will now animate and remove the first bar +``` diff --git a/public/bower_components/Chart.js/docs/03-Radar-Chart.md b/public/bower_components/Chart.js/docs/03-Radar-Chart.md new file mode 100755 index 0000000..03dcf6e --- /dev/null +++ b/public/bower_components/Chart.js/docs/03-Radar-Chart.md @@ -0,0 +1,177 @@ +--- +title: Radar Chart +anchor: radar-chart +--- + +###Introduction +A radar chart is a way of showing multiple data points and the variation between them. + +They are often useful for comparing the points of two or more different data sets. + +
    + +
    + +###Example usage + +```javascript +var myRadarChart = new Chart(ctx).Radar(data, options); +``` + +###Data structure +```javascript +var data = { + labels: ["Eating", "Drinking", "Sleeping", "Designing", "Coding", "Cycling", "Running"], + datasets: [ + { + label: "My First dataset", + fillColor: "rgba(220,220,220,0.2)", + strokeColor: "rgba(220,220,220,1)", + pointColor: "rgba(220,220,220,1)", + pointStrokeColor: "#fff", + pointHighlightFill: "#fff", + pointHighlightStroke: "rgba(220,220,220,1)", + data: [65, 59, 90, 81, 56, 55, 40] + }, + { + label: "My Second dataset", + fillColor: "rgba(151,187,205,0.2)", + strokeColor: "rgba(151,187,205,1)", + pointColor: "rgba(151,187,205,1)", + pointStrokeColor: "#fff", + pointHighlightFill: "#fff", + pointHighlightStroke: "rgba(151,187,205,1)", + data: [28, 48, 40, 19, 96, 27, 100] + } + ] +}; +``` +For a radar chart, to provide context of what each point means, we include an array of strings that show around each point in the chart. +For the radar chart data, we have an array of datasets. Each of these is an object, with a fill colour, a stroke colour, a colour for the fill of each point, and a colour for the stroke of each point. We also have an array of data values. + +The label key on each dataset is optional, and can be used when generating a scale for the chart. + +### Chart options + +These are the customisation options specific to Radar charts. These options are merged with the [global chart configuration options](#getting-started-global-chart-configuration), and form the options of the chart. + + +```javascript +{ + //Boolean - Whether to show lines for each scale point + scaleShowLine : true, + + //Boolean - Whether we show the angle lines out of the radar + angleShowLineOut : true, + + //Boolean - Whether to show labels on the scale + scaleShowLabels : false, + + // Boolean - Whether the scale should begin at zero + scaleBeginAtZero : true, + + //String - Colour of the angle line + angleLineColor : "rgba(0,0,0,.1)", + + //Number - Pixel width of the angle line + angleLineWidth : 1, + + //String - Point label font declaration + pointLabelFontFamily : "'Arial'", + + //String - Point label font weight + pointLabelFontStyle : "normal", + + //Number - Point label font size in pixels + pointLabelFontSize : 10, + + //String - Point label font colour + pointLabelFontColor : "#666", + + //Boolean - Whether to show a dot for each point + pointDot : true, + + //Number - Radius of each point dot in pixels + pointDotRadius : 3, + + //Number - Pixel width of point dot stroke + pointDotStrokeWidth : 1, + + //Number - amount extra to add to the radius to cater for hit detection outside the drawn point + pointHitDetectionRadius : 20, + + //Boolean - Whether to show a stroke for datasets + datasetStroke : true, + + //Number - Pixel width of dataset stroke + datasetStrokeWidth : 2, + + //Boolean - Whether to fill the dataset with a colour + datasetFill : true, + {% raw %} + //String - A legend template + legendTemplate : "
      -legend\"><% for (var i=0; i
    • \"><%if(datasets[i].label){%><%=datasets[i].label%><%}%>
    • <%}%>
    " + {% endraw %} +} +``` + + +You can override these for your `Chart` instance by passing a second argument into the `Radar` method as an object with the keys you want to override. + +For example, we could have a radar chart without a point for each on piece of data by doing the following: + +```javascript +new Chart(ctx).Radar(data, { + pointDot: false +}); +// This will create a chart with all of the default options, merged from the global config, +// and the Bar chart defaults but this particular instance will have `pointDot` set to false. +``` + +We can also change these defaults values for each Radar type that is created, this object is available at `Chart.defaults.Radar`. + + +### Prototype methods + +#### .getPointsAtEvent( event ) + +Calling `getPointsAtEvent(event)` on your Chart instance passing an argument of an event, or jQuery event, will return the point elements that are at that the same position of that event. + +```javascript +canvas.onclick = function(evt){ + var activePoints = myRadarChart.getPointsAtEvent(evt); + // => activePoints is an array of points on the canvas that are at the same position as the click event. +}; +``` + +This functionality may be useful for implementing DOM based tooltips, or triggering custom behaviour in your application. + +#### .update( ) + +Calling `update()` on your Chart instance will re-render the chart with any updated values, allowing you to edit the value of multiple existing points, then render those in one animated render loop. + +```javascript +myRadarChart.datasets[0].points[2].value = 50; +// Would update the first dataset's value of 'Sleeping' to be 50 +myRadarChart.update(); +// Calling update now animates the position of Sleeping from 90 to 50. +``` + +#### .addData( valuesArray, label ) + +Calling `addData(valuesArray, label)` on your Chart instance passing an array of values for each dataset, along with a label for those points. + +```javascript +// The values array passed into addData should be one for each dataset in the chart +myRadarChart.addData([40, 60], "Dancing"); +// The new data will now animate at the end of the chart. +``` + +#### .removeData( ) + +Calling `removeData()` on your Chart instance will remove the first value for all datasets on the chart. + +```javascript +myRadarChart.removeData(); +// Other points will now animate to their correct positions. +``` \ No newline at end of file diff --git a/public/bower_components/Chart.js/docs/04-Polar-Area-Chart.md b/public/bower_components/Chart.js/docs/04-Polar-Area-Chart.md new file mode 100755 index 0000000..658da54 --- /dev/null +++ b/public/bower_components/Chart.js/docs/04-Polar-Area-Chart.md @@ -0,0 +1,172 @@ +--- +title: Polar Area Chart +anchor: polar-area-chart +--- +### Introduction +Polar area charts are similar to pie charts, but each segment has the same angle - the radius of the segment differs depending on the value. + +This type of chart is often useful when we want to show a comparison data similar to a pie chart, but also show a scale of values for context. + +
    + +
    + +### Example usage + +```javascript +new Chart(ctx).PolarArea(data, options); +``` + +### Data structure + +```javascript +var data = [ + { + value: 300, + color:"#F7464A", + highlight: "#FF5A5E", + label: "Red" + }, + { + value: 50, + color: "#46BFBD", + highlight: "#5AD3D1", + label: "Green" + }, + { + value: 100, + color: "#FDB45C", + highlight: "#FFC870", + label: "Yellow" + }, + { + value: 40, + color: "#949FB1", + highlight: "#A8B3C5", + label: "Grey" + }, + { + value: 120, + color: "#4D5360", + highlight: "#616774", + label: "Dark Grey" + } + +]; +``` +As you can see, for the chart data you pass in an array of objects, with a value and a colour. The value attribute should be a number, while the color attribute should be a string. Similar to CSS, for this string you can use HEX notation, RGB, RGBA or HSL. + +### Chart options + +These are the customisation options specific to Polar Area charts. These options are merged with the [global chart configuration options](#getting-started-global-chart-configuration), and form the options of the chart. + +```javascript +{ + //Boolean - Show a backdrop to the scale label + scaleShowLabelBackdrop : true, + + //String - The colour of the label backdrop + scaleBackdropColor : "rgba(255,255,255,0.75)", + + // Boolean - Whether the scale should begin at zero + scaleBeginAtZero : true, + + //Number - The backdrop padding above & below the label in pixels + scaleBackdropPaddingY : 2, + + //Number - The backdrop padding to the side of the label in pixels + scaleBackdropPaddingX : 2, + + //Boolean - Show line for each value in the scale + scaleShowLine : true, + + //Boolean - Stroke a line around each segment in the chart + segmentShowStroke : true, + + //String - The colour of the stroke on each segement. + segmentStrokeColor : "#fff", + + //Number - The width of the stroke value in pixels + segmentStrokeWidth : 2, + + //Number - Amount of animation steps + animationSteps : 100, + + //String - Animation easing effect. + animationEasing : "easeOutBounce", + + //Boolean - Whether to animate the rotation of the chart + animateRotate : true, + + //Boolean - Whether to animate scaling the chart from the centre + animateScale : false, + {% raw %} + //String - A legend template + legendTemplate : "
      -legend\"><% for (var i=0; i
    • \"><%if(segments[i].label){%><%=segments[i].label%><%}%>
    • <%}%>
    " + {% endraw %} +} +``` + +You can override these for your `Chart` instance by passing a second argument into the `PolarArea` method as an object with the keys you want to override. + +For example, we could have a polar area chart with a black stroke on each segment like so: + +```javascript +new Chart(ctx).PolarArea(data, { + segmentStrokeColor: "#000000" +}); +// This will create a chart with all of the default options, merged from the global config, +// and the PolarArea chart defaults but this particular instance will have `segmentStrokeColor` set to `"#000000"`. +``` + +We can also change these defaults values for each PolarArea type that is created, this object is available at `Chart.defaults.PolarArea`. + +### Prototype methods + +#### .getSegmentsAtEvent( event ) + +Calling `getSegmentsAtEvent(event)` on your Chart instance passing an argument of an event, or jQuery event, will return the segment elements that are at that the same position of that event. + +```javascript +canvas.onclick = function(evt){ + var activePoints = myPolarAreaChart.getSegmentsAtEvent(evt); + // => activePoints is an array of segments on the canvas that are at the same position as the click event. +}; +``` + +This functionality may be useful for implementing DOM based tooltips, or triggering custom behaviour in your application. + +#### .update( ) + +Calling `update()` on your Chart instance will re-render the chart with any updated values, allowing you to edit the value of multiple existing points, then render those in one animated render loop. + +```javascript +myPolarAreaChart.segments[1].value = 10; +// Would update the first dataset's value of 'Green' to be 10 +myPolarAreaChart.update(); +// Calling update now animates the position of Green from 50 to 10. +``` + +#### .addData( segmentData, index ) + +Calling `addData(segmentData, index)` on your Chart instance passing an object in the same format as in the constructor. There is an option second argument of 'index', this determines at what index the new segment should be inserted into the chart. + +```javascript +// An object in the same format as the original data source +myPolarAreaChart.addData({ + value: 130, + color: "#B48EAD", + highlight: "#C69CBE", + label: "Purple" +}); +// The new segment will now animate in. +``` + +#### .removeData( index ) + +Calling `removeData(index)` on your Chart instance will remove segment at that particular index. If none is provided, it will default to the last segment. + +```javascript +myPolarAreaChart.removeData(); +// Other segments will update to fill the empty space left. +``` \ No newline at end of file diff --git a/public/bower_components/Chart.js/docs/05-Pie-Doughnut-Chart.md b/public/bower_components/Chart.js/docs/05-Pie-Doughnut-Chart.md new file mode 100755 index 0000000..dd9de6f --- /dev/null +++ b/public/bower_components/Chart.js/docs/05-Pie-Doughnut-Chart.md @@ -0,0 +1,158 @@ +--- +title: Pie & Doughnut Charts +anchor: doughnut-pie-chart +--- +###Introduction +Pie and doughnut charts are probably the most commonly used chart there are. They are divided into segments, the arc of each segment shows the proportional value of each piece of data. + +They are excellent at showing the relational proportions between data. + +Pie and doughnut charts are effectively the same class in Chart.js, but have one different default value - their `percentageInnerCutout`. This equates what percentage of the inner should be cut out. This defaults to `0` for pie charts, and `50` for doughnuts. + +They are also registered under two aliases in the `Chart` core. Other than their different default value, and different alias, they are exactly the same. + +
    + +
    + +
    + +
    + + +### Example usage + +```javascript +// For a pie chart +var myPieChart = new Chart(ctx[0]).Pie(data,options); + +// And for a doughnut chart +var myDoughnutChart = new Chart(ctx[1]).Doughnut(data,options); +``` + +### Data structure + +```javascript +var data = [ + { + value: 300, + color:"#F7464A", + highlight: "#FF5A5E", + label: "Red" + }, + { + value: 50, + color: "#46BFBD", + highlight: "#5AD3D1", + label: "Green" + }, + { + value: 100, + color: "#FDB45C", + highlight: "#FFC870", + label: "Yellow" + } +] +``` + +For a pie chart, you must pass in an array of objects with a value and a color property. The value attribute should be a number, Chart.js will total all of the numbers and calculate the relative proportion of each. The color attribute should be a string. Similar to CSS, for this string you can use HEX notation, RGB, RGBA or HSL. + +### Chart options + +These are the customisation options specific to Pie & Doughnut charts. These options are merged with the [global chart configuration options](#getting-started-global-chart-configuration), and form the options of the chart. + +```javascript +{ + //Boolean - Whether we should show a stroke on each segment + segmentShowStroke : true, + + //String - The colour of each segment stroke + segmentStrokeColor : "#fff", + + //Number - The width of each segment stroke + segmentStrokeWidth : 2, + + //Number - The percentage of the chart that we cut out of the middle + percentageInnerCutout : 50, // This is 0 for Pie charts + + //Number - Amount of animation steps + animationSteps : 100, + + //String - Animation easing effect + animationEasing : "easeOutBounce", + + //Boolean - Whether we animate the rotation of the Doughnut + animateRotate : true, + + //Boolean - Whether we animate scaling the Doughnut from the centre + animateScale : false, + {% raw %} + //String - A legend template + legendTemplate : "
      -legend\"><% for (var i=0; i
    • \"><%if(segments[i].label){%><%=segments[i].label%><%}%>
    • <%}%>
    " + {% endraw %} +} +``` +You can override these for your `Chart` instance by passing a second argument into the `Doughnut` method as an object with the keys you want to override. + +For example, we could have a doughnut chart that animates by scaling out from the centre like so: + +```javascript +new Chart(ctx).Doughnut(data, { + animateScale: true +}); +// This will create a chart with all of the default options, merged from the global config, +// and the Doughnut chart defaults but this particular instance will have `animateScale` set to `true`. +``` + +We can also change these default values for each Doughnut type that is created, this object is available at `Chart.defaults.Doughnut`. Pie charts also have a clone of these defaults available to change at `Chart.defaults.Pie`, with the only difference being `percentageInnerCutout` being set to 0. + +### Prototype methods + +#### .getSegmentsAtEvent( event ) + +Calling `getSegmentsAtEvent(event)` on your Chart instance passing an argument of an event, or jQuery event, will return the segment elements that are at the same position of that event. + +```javascript +canvas.onclick = function(evt){ + var activePoints = myDoughnutChart.getSegmentsAtEvent(evt); + // => activePoints is an array of segments on the canvas that are at the same position as the click event. +}; +``` + +This functionality may be useful for implementing DOM based tooltips, or triggering custom behaviour in your application. + +#### .update( ) + +Calling `update()` on your Chart instance will re-render the chart with any updated values, allowing you to edit the value of multiple existing points, then render those in one animated render loop. + +```javascript +myDoughnutChart.segments[1].value = 10; +// Would update the first dataset's value of 'Green' to be 10 +myDoughnutChart.update(); +// Calling update now animates the circumference of the segment 'Green' from 50 to 10. +// and transitions other segment widths +``` + +#### .addData( segmentData, index ) + +Calling `addData(segmentData, index)` on your Chart instance passing an object in the same format as in the constructor. There is an optional second argument of 'index', this determines at what index the new segment should be inserted into the chart. + +```javascript +// An object in the same format as the original data source +myDoughnutChart.addData({ + value: 130, + color: "#B48EAD", + highlight: "#C69CBE", + label: "Purple" +}); +// The new segment will now animate in. +``` + +#### .removeData( index ) + +Calling `removeData(index)` on your Chart instance will remove segment at that particular index. If none is provided, it will default to the last segment. + +```javascript +myDoughnutChart.removeData(); +// Other segments will update to fill the empty space left. +``` diff --git a/public/bower_components/Chart.js/docs/06-Advanced.md b/public/bower_components/Chart.js/docs/06-Advanced.md new file mode 100755 index 0000000..f0495bf --- /dev/null +++ b/public/bower_components/Chart.js/docs/06-Advanced.md @@ -0,0 +1,185 @@ +--- +title: Advanced usage +anchor: advanced-usage +--- + + +### Prototype methods + +For each chart, there are a set of global prototype methods on the shared `ChartType` which you may find useful. These are available on all charts created with Chart.js, but for the examples, let's use a line chart we've made. + +```javascript +// For example: +var myLineChart = new Chart(ctx).Line(data); +``` + +#### .clear() + +Will clear the chart canvas. Used extensively internally between animation frames, but you might find it useful. + +```javascript +// Will clear the canvas that myLineChart is drawn on +myLineChart.clear(); +// => returns 'this' for chainability +``` + +#### .stop() + +Use this to stop any current animation loop. This will pause the chart during any current animation frame. Call `.render()` to re-animate. + +```javascript +// Stops the charts animation loop at its current frame +myLineChart.stop(); +// => returns 'this' for chainability +``` + +#### .resize() + +Use this to manually resize the canvas element. This is run each time the browser is resized, but you can call this method manually if you change the size of the canvas nodes container element. + +```javascript +// Resizes & redraws to fill its container element +myLineChart.resize(); +// => returns 'this' for chainability +``` + +#### .destroy() + +Use this to destroy any chart instances that are created. This will clean up any references stored to the chart object within Chart.js, along with any associated event listeners attached by Chart.js. + +```javascript +// Destroys a specific chart instance +myLineChart.destroy(); +``` + +#### .toBase64Image() + +This returns a base 64 encoded string of the chart in it's current state. + +```javascript +myLineChart.toBase64Image(); +// => returns png data url of the image on the canvas +``` + +#### .generateLegend() + +Returns an HTML string of a legend for that chart. The template for this legend is at `legendTemplate` in the chart options. + +```javascript +myLineChart.generateLegend(); +// => returns HTML string of a legend for this chart +``` + +### External Tooltips + +You can enable custom tooltips in the global or chart configuration like so: + +```javascript +var myPieChart = new Chart(ctx).Pie(data, { + customTooltips: function(tooltip) { + + // tooltip will be false if tooltip is not visible or should be hidden + if (!tooltip) { + return; + } + + // Otherwise, tooltip will be an object with all tooltip properties like: + + // tooltip.caretHeight + // tooltip.caretPadding + // tooltip.chart + // tooltip.cornerRadius + // tooltip.fillColor + // tooltip.font... + // tooltip.text + // tooltip.x + // tooltip.y + // etc... + + }; +}); +``` + +See files `sample/pie-customTooltips.html` and `sample/line-customTooltips.html` for examples on how to get started. + + +### Writing new chart types + +Chart.js 1.0 has been rewritten to provide a platform for developers to create their own custom chart types, and be able to share and utilise them through the Chart.js API. + +The format is relatively simple, there are a set of utility helper methods under `Chart.helpers`, including things such as looping over collections, requesting animation frames, and easing equations. + +On top of this, there are also some simple base classes of Chart elements, these all extend from `Chart.Element`, and include things such as points, bars and scales. + +```javascript +Chart.Type.extend({ + // Passing in a name registers this chart in the Chart namespace + name: "Scatter", + // Providing a defaults will also register the deafults in the chart namespace + defaults : { + options: "Here", + available: "at this.options" + }, + // Initialize is fired when the chart is initialized - Data is passed in as a parameter + // Config is automatically merged by the core of Chart.js, and is available at this.options + initialize: function(data){ + this.chart.ctx // The drawing context for this chart + this.chart.canvas // the canvas node for this chart + }, + // Used to draw something on the canvas + draw: function() { + } +}); + +// Now we can create a new instance of our chart, using the Chart.js API +new Chart(ctx).Scatter(data); +// initialize is now run +``` + +### Extending existing chart types + +We can also extend existing chart types, and expose them to the API in the same way. Let's say for example, we might want to run some more code when we initialize every Line chart. + +```javascript +// Notice now we're extending the particular Line chart type, rather than the base class. +Chart.types.Line.extend({ + // Passing in a name registers this chart in the Chart namespace in the same way + name: "LineAlt", + initialize: function(data){ + console.log('My Line chart extension'); + Chart.types.Line.prototype.initialize.apply(this, arguments); + } +}); + +// Creates a line chart in the same way +new Chart(ctx).LineAlt(data); +// but this logs 'My Line chart extension' in the console. +``` + +### Community extensions + +- Stacked Bar Chart by @Regaddi +- Error bars (bar and line charts) by @CAYdenberg + +### Creating custom builds + +Chart.js uses gulp to build the library into a single JavaScript file. We can use this same build script with custom parameters in order to build a custom version. + +Firstly, we need to ensure development dependencies are installed. With node and npm installed, after cloning the Chart.js repo to a local directory, and navigating to that directory in the command line, we can run the following: + +```bash +npm install +npm install -g gulp +``` + +This will install the local development dependencies for Chart.js, along with a CLI for the JavaScript task runner gulp. + +Now, we can run the `gulp build` task, and pass in a comma seperated list of types as an argument to build a custom version of Chart.js with only specified chart types. + +Here we will create a version of Chart.js with only Line, Radar and Bar charts included: + +```bash +gulp build --types=Line,Radar,Bar +``` + +This will output to the `/custom` directory, and write two files, Chart.js, and Chart.min.js with only those chart types included. diff --git a/public/bower_components/Chart.js/docs/07-Notes.md b/public/bower_components/Chart.js/docs/07-Notes.md new file mode 100755 index 0000000..8ba5a59 --- /dev/null +++ b/public/bower_components/Chart.js/docs/07-Notes.md @@ -0,0 +1,42 @@ +--- +title: Notes +anchor: notes +--- + +### Browser support +Browser support for the canvas element is available in all modern & major mobile browsers (caniuse.com/canvas). + +For IE8 & below, I would recommend using the polyfill ExplorerCanvas - available at https://code.google.com/p/explorercanvas/. It falls back to Internet explorer's format VML when canvas support is not available. Example use: + +```html + + + +``` + +Usually I would recommend feature detection to choose whether or not to load a polyfill, rather than IE conditional comments, however in this case, VML is a Microsoft proprietary format, so it will only work in IE. + +Some important points to note in my experience using ExplorerCanvas as a fallback. + +- Initialise charts on load rather than DOMContentReady when using the library, as sometimes a race condition will occur, and it will result in an error when trying to get the 2d context of a canvas. +- New VML DOM elements are being created for each animation frame and there is no hardware acceleration. As a result animation is usually slow and jerky, with flashing text. It is a good idea to dynamically turn off animation based on canvas support. I recommend using the excellent Modernizr to do this. +- When declaring fonts, the library explorercanvas requires the font name to be in single quotes inside the string. For example, instead of your scaleFontFamily property being simply "Arial", explorercanvas support, use "'Arial'" instead. Chart.js does this for default values. + +### Bugs & issues + +Please report these on the GitHub page - at github.com/nnnick/Chart.js. If you could include a link to a simple jsbin or similar to demonstrate the issue, that'd be really helpful. + + +### Contributing +New contributions to the library are welcome, just a couple of guidelines: + +- Tabs for indentation, not spaces please. +- Please ensure you're changing the individual files in `/src`, not the concatenated output in the `Chart.js` file in the root of the repo. +- Please check that your code will pass `jshint` code standards, `gulp jshint` will run this for you. +- Please keep pull requests concise, and document new functionality in the relevant `.md` file. +- Consider whether your changes are useful for all users, or if creating a Chart.js extension would be more appropriate. + +### License +Chart.js is open source and available under the MIT license. \ No newline at end of file diff --git a/public/bower_components/Chart.js/gulpfile.js b/public/bower_components/Chart.js/gulpfile.js new file mode 100755 index 0000000..e8fe1c7 --- /dev/null +++ b/public/bower_components/Chart.js/gulpfile.js @@ -0,0 +1,137 @@ +var gulp = require('gulp'), + concat = require('gulp-concat'), + uglify = require('gulp-uglify'), + util = require('gulp-util'), + jshint = require('gulp-jshint'), + size = require('gulp-size'), + connect = require('gulp-connect'), + replace = require('gulp-replace'), + htmlv = require('gulp-html-validator'), + inquirer = require('inquirer'), + semver = require('semver'), + exec = require('child_process').exec, + fs = require('fs'), + package = require('./package.json'), + bower = require('./bower.json'); + +var srcDir = './src/'; +/* + * Usage : gulp build --types=Bar,Line,Doughnut + * Output: - A built Chart.js file with Core and types Bar, Line and Doughnut concatenated together + * - A minified version of this code, in Chart.min.js + */ + +gulp.task('build', function(){ + + // Default to all of the chart types, with Chart.Core first + var srcFiles = [FileName('Core')], + isCustom = !!(util.env.types), + outputDir = (isCustom) ? 'custom' : '.'; + if (isCustom){ + util.env.types.split(',').forEach(function(type){ return srcFiles.push(FileName(type))}); + } + else{ + // Seems gulp-concat remove duplicates - nice! + // So we can use this to sort out dependency order - aka include Core first! + srcFiles.push(srcDir+'*'); + } + + return gulp.src(srcFiles) + .pipe(concat('Chart.js')) + .pipe(replace('{{ version }}', package.version)) + .pipe(gulp.dest(outputDir)) + .pipe(uglify({preserveComments:'some'})) + .pipe(concat('Chart.min.js')) + .pipe(gulp.dest(outputDir)); + + function FileName(moduleName){ + return srcDir+'Chart.'+moduleName+'.js'; + }; +}); + +/* + * Usage : gulp bump + * Prompts: Version increment to bump + * Output: - New version number written into package.json & bower.json + */ + +gulp.task('bump', function(complete){ + util.log('Current version:', util.colors.cyan(package.version)); + var choices = ['major', 'premajor', 'minor', 'preminor', 'patch', 'prepatch', 'prerelease'].map(function(versionType){ + return versionType + ' (v' + semver.inc(package.version, versionType) + ')'; + }); + inquirer.prompt({ + type: 'list', + name: 'version', + message: 'What version update would you like?', + choices: choices + }, function(res){ + var increment = res.version.split(' ')[0], + newVersion = semver.inc(package.version, increment); + + // Set the new versions into the bower/package object + package.version = newVersion; + bower.version = newVersion; + + // Write these to their own files, then build the output + fs.writeFileSync('package.json', JSON.stringify(package, null, 2)); + fs.writeFileSync('bower.json', JSON.stringify(bower, null, 2)); + + complete(); + }); +}); + +gulp.task('release', ['build'], function(){ + exec('git tag -a v' + package.version); +}); + +gulp.task('jshint', function(){ + return gulp.src(srcDir + '*.js') + .pipe(jshint()) + .pipe(jshint.reporter('default')); +}); + +gulp.task('valid', function(){ + return gulp.src('samples/*.html') + .pipe(htmlv()); +}); + +gulp.task('library-size', function(){ + return gulp.src('Chart.min.js') + .pipe(size({ + gzip: true + })); +}); + +gulp.task('module-sizes', function(){ + return gulp.src(srcDir + '*.js') + .pipe(uglify({preserveComments:'some'})) + .pipe(size({ + showFiles: true, + gzip: true + })) +}); + +gulp.task('watch', function(){ + gulp.watch('./src/*', ['build']); +}); + +gulp.task('test', ['jshint', 'valid']); + +gulp.task('size', ['library-size', 'module-sizes']); + +gulp.task('default', ['build', 'watch']); + +gulp.task('server', function(){ + connect.server({ + port: 8000 + }); +}); + +// Convenience task for opening the project straight from the command line +gulp.task('_open', function(){ + exec('open http://localhost:8000'); + exec('subl .'); +}); + +gulp.task('dev', ['server', 'default']); diff --git a/public/bower_components/Chart.js/package.json b/public/bower_components/Chart.js/package.json new file mode 100755 index 0000000..9ac4a0e --- /dev/null +++ b/public/bower_components/Chart.js/package.json @@ -0,0 +1,28 @@ +{ + "name": "chart.js", + "homepage": "http://www.chartjs.org", + "description": "Simple HTML5 charts using the canvas element.", + "version": "1.0.2", + "main": "Chart.js", + "repository": { + "type": "git", + "url": "https://github.com/nnnick/Chart.js.git" + }, + "dependences": {}, + "devDependencies": { + "gulp": "3.5.x", + "gulp-concat": "~2.1.x", + "gulp-connect": "~2.0.5", + "gulp-jshint": "~1.5.1", + "gulp-replace": "^0.4.0", + "gulp-size": "~0.4.0", + "gulp-uglify": "~0.2.x", + "gulp-util": "~2.2.x", + "gulp-html-validator": "^0.0.2", + "inquirer": "^0.5.1", + "semver": "^3.0.1" + }, + "spm": { + "main": "Chart.js" + } +} \ No newline at end of file diff --git a/public/bower_components/Chart.js/samples/bar.html b/public/bower_components/Chart.js/samples/bar.html new file mode 100755 index 0000000..5bf4b5b --- /dev/null +++ b/public/bower_components/Chart.js/samples/bar.html @@ -0,0 +1,45 @@ + + + + Bar Chart + + + +
    + +
    + + + + + diff --git a/public/bower_components/Chart.js/samples/doughnut.html b/public/bower_components/Chart.js/samples/doughnut.html new file mode 100755 index 0000000..fdf7539 --- /dev/null +++ b/public/bower_components/Chart.js/samples/doughnut.html @@ -0,0 +1,67 @@ + + + + Doughnut Chart + + + + +
    + +
    + + + + + diff --git a/public/bower_components/Chart.js/samples/line-customTooltips.html b/public/bower_components/Chart.js/samples/line-customTooltips.html new file mode 100755 index 0000000..4dc46e1 --- /dev/null +++ b/public/bower_components/Chart.js/samples/line-customTooltips.html @@ -0,0 +1,129 @@ + + + + + Line Chart with Custom Tooltips + + + + + + + +
    + +
    +
    + +
    + +
    + + + + + + diff --git a/public/bower_components/Chart.js/samples/line.html b/public/bower_components/Chart.js/samples/line.html new file mode 100755 index 0000000..ccd0dad --- /dev/null +++ b/public/bower_components/Chart.js/samples/line.html @@ -0,0 +1,54 @@ + + + + Line Chart + + + +
    +
    + +
    +
    + + + + + diff --git a/public/bower_components/Chart.js/samples/pie-customTooltips.html b/public/bower_components/Chart.js/samples/pie-customTooltips.html new file mode 100755 index 0000000..732317d --- /dev/null +++ b/public/bower_components/Chart.js/samples/pie-customTooltips.html @@ -0,0 +1,156 @@ + + + + + Pie Chart with Custom Tooltips + + + + + + + +
    + +
    +
    + +
    + +
    + + + + + + diff --git a/public/bower_components/Chart.js/samples/pie.html b/public/bower_components/Chart.js/samples/pie.html new file mode 100755 index 0000000..255a499 --- /dev/null +++ b/public/bower_components/Chart.js/samples/pie.html @@ -0,0 +1,58 @@ + + + + Pie Chart + + + +
    + +
    + + + + + diff --git a/public/bower_components/Chart.js/samples/polar-area.html b/public/bower_components/Chart.js/samples/polar-area.html new file mode 100755 index 0000000..d3d3f01 --- /dev/null +++ b/public/bower_components/Chart.js/samples/polar-area.html @@ -0,0 +1,60 @@ + + + + Polar Area Chart + + + +
    + +
    + + + + + diff --git a/public/bower_components/Chart.js/samples/radar.html b/public/bower_components/Chart.js/samples/radar.html new file mode 100755 index 0000000..6a04f87 --- /dev/null +++ b/public/bower_components/Chart.js/samples/radar.html @@ -0,0 +1,53 @@ + + + + Radar Chart + + + + + +
    + +
    + + + + + diff --git a/public/bower_components/Chart.js/src/Chart.Bar.js b/public/bower_components/Chart.js/src/Chart.Bar.js new file mode 100755 index 0000000..87fb26d --- /dev/null +++ b/public/bower_components/Chart.js/src/Chart.Bar.js @@ -0,0 +1,302 @@ +(function(){ + "use strict"; + + var root = this, + Chart = root.Chart, + helpers = Chart.helpers; + + + var defaultConfig = { + //Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value + scaleBeginAtZero : true, + + //Boolean - Whether grid lines are shown across the chart + scaleShowGridLines : true, + + //String - Colour of the grid lines + scaleGridLineColor : "rgba(0,0,0,.05)", + + //Number - Width of the grid lines + scaleGridLineWidth : 1, + + //Boolean - Whether to show horizontal lines (except X axis) + scaleShowHorizontalLines: true, + + //Boolean - Whether to show vertical lines (except Y axis) + scaleShowVerticalLines: true, + + //Boolean - If there is a stroke on each bar + barShowStroke : true, + + //Number - Pixel width of the bar stroke + barStrokeWidth : 2, + + //Number - Spacing between each of the X value sets + barValueSpacing : 5, + + //Number - Spacing between data sets within X values + barDatasetSpacing : 1, + + //String - A legend template + legendTemplate : "
      -legend\"><% for (var i=0; i
    • \"><%if(datasets[i].label){%><%=datasets[i].label%><%}%>
    • <%}%>
    " + + }; + + + Chart.Type.extend({ + name: "Bar", + defaults : defaultConfig, + initialize: function(data){ + + //Expose options as a scope variable here so we can access it in the ScaleClass + var options = this.options; + + this.ScaleClass = Chart.Scale.extend({ + offsetGridLines : true, + calculateBarX : function(datasetCount, datasetIndex, barIndex){ + //Reusable method for calculating the xPosition of a given bar based on datasetIndex & width of the bar + var xWidth = this.calculateBaseWidth(), + xAbsolute = this.calculateX(barIndex) - (xWidth/2), + barWidth = this.calculateBarWidth(datasetCount); + + return xAbsolute + (barWidth * datasetIndex) + (datasetIndex * options.barDatasetSpacing) + barWidth/2; + }, + calculateBaseWidth : function(){ + return (this.calculateX(1) - this.calculateX(0)) - (2*options.barValueSpacing); + }, + calculateBarWidth : function(datasetCount){ + //The padding between datasets is to the right of each bar, providing that there are more than 1 dataset + var baseWidth = this.calculateBaseWidth() - ((datasetCount - 1) * options.barDatasetSpacing); + + return (baseWidth / datasetCount); + } + }); + + this.datasets = []; + + //Set up tooltip events on the chart + if (this.options.showTooltips){ + helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ + var activeBars = (evt.type !== 'mouseout') ? this.getBarsAtEvent(evt) : []; + + this.eachBars(function(bar){ + bar.restore(['fillColor', 'strokeColor']); + }); + helpers.each(activeBars, function(activeBar){ + activeBar.fillColor = activeBar.highlightFill; + activeBar.strokeColor = activeBar.highlightStroke; + }); + this.showTooltip(activeBars); + }); + } + + //Declare the extension of the default point, to cater for the options passed in to the constructor + this.BarClass = Chart.Rectangle.extend({ + strokeWidth : this.options.barStrokeWidth, + showStroke : this.options.barShowStroke, + ctx : this.chart.ctx + }); + + //Iterate through each of the datasets, and build this into a property of the chart + helpers.each(data.datasets,function(dataset,datasetIndex){ + + var datasetObject = { + label : dataset.label || null, + fillColor : dataset.fillColor, + strokeColor : dataset.strokeColor, + bars : [] + }; + + this.datasets.push(datasetObject); + + helpers.each(dataset.data,function(dataPoint,index){ + //Add a new point for each piece of data, passing any required data to draw. + datasetObject.bars.push(new this.BarClass({ + value : dataPoint, + label : data.labels[index], + datasetLabel: dataset.label, + strokeColor : dataset.strokeColor, + fillColor : dataset.fillColor, + highlightFill : dataset.highlightFill || dataset.fillColor, + highlightStroke : dataset.highlightStroke || dataset.strokeColor + })); + },this); + + },this); + + this.buildScale(data.labels); + + this.BarClass.prototype.base = this.scale.endPoint; + + this.eachBars(function(bar, index, datasetIndex){ + helpers.extend(bar, { + width : this.scale.calculateBarWidth(this.datasets.length), + x: this.scale.calculateBarX(this.datasets.length, datasetIndex, index), + y: this.scale.endPoint + }); + bar.save(); + }, this); + + this.render(); + }, + update : function(){ + this.scale.update(); + // Reset any highlight colours before updating. + helpers.each(this.activeElements, function(activeElement){ + activeElement.restore(['fillColor', 'strokeColor']); + }); + + this.eachBars(function(bar){ + bar.save(); + }); + this.render(); + }, + eachBars : function(callback){ + helpers.each(this.datasets,function(dataset, datasetIndex){ + helpers.each(dataset.bars, callback, this, datasetIndex); + },this); + }, + getBarsAtEvent : function(e){ + var barsArray = [], + eventPosition = helpers.getRelativePosition(e), + datasetIterator = function(dataset){ + barsArray.push(dataset.bars[barIndex]); + }, + barIndex; + + for (var datasetIndex = 0; datasetIndex < this.datasets.length; datasetIndex++) { + for (barIndex = 0; barIndex < this.datasets[datasetIndex].bars.length; barIndex++) { + if (this.datasets[datasetIndex].bars[barIndex].inRange(eventPosition.x,eventPosition.y)){ + helpers.each(this.datasets, datasetIterator); + return barsArray; + } + } + } + + return barsArray; + }, + buildScale : function(labels){ + var self = this; + + var dataTotal = function(){ + var values = []; + self.eachBars(function(bar){ + values.push(bar.value); + }); + return values; + }; + + var scaleOptions = { + templateString : this.options.scaleLabel, + height : this.chart.height, + width : this.chart.width, + ctx : this.chart.ctx, + textColor : this.options.scaleFontColor, + fontSize : this.options.scaleFontSize, + fontStyle : this.options.scaleFontStyle, + fontFamily : this.options.scaleFontFamily, + valuesCount : labels.length, + beginAtZero : this.options.scaleBeginAtZero, + integersOnly : this.options.scaleIntegersOnly, + calculateYRange: function(currentHeight){ + var updatedRanges = helpers.calculateScaleRange( + dataTotal(), + currentHeight, + this.fontSize, + this.beginAtZero, + this.integersOnly + ); + helpers.extend(this, updatedRanges); + }, + xLabels : labels, + font : helpers.fontString(this.options.scaleFontSize, this.options.scaleFontStyle, this.options.scaleFontFamily), + lineWidth : this.options.scaleLineWidth, + lineColor : this.options.scaleLineColor, + showHorizontalLines : this.options.scaleShowHorizontalLines, + showVerticalLines : this.options.scaleShowVerticalLines, + gridLineWidth : (this.options.scaleShowGridLines) ? this.options.scaleGridLineWidth : 0, + gridLineColor : (this.options.scaleShowGridLines) ? this.options.scaleGridLineColor : "rgba(0,0,0,0)", + padding : (this.options.showScale) ? 0 : (this.options.barShowStroke) ? this.options.barStrokeWidth : 0, + showLabels : this.options.scaleShowLabels, + display : this.options.showScale + }; + + if (this.options.scaleOverride){ + helpers.extend(scaleOptions, { + calculateYRange: helpers.noop, + steps: this.options.scaleSteps, + stepValue: this.options.scaleStepWidth, + min: this.options.scaleStartValue, + max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth) + }); + } + + this.scale = new this.ScaleClass(scaleOptions); + }, + addData : function(valuesArray,label){ + //Map the values array for each of the datasets + helpers.each(valuesArray,function(value,datasetIndex){ + //Add a new point for each piece of data, passing any required data to draw. + this.datasets[datasetIndex].bars.push(new this.BarClass({ + value : value, + label : label, + x: this.scale.calculateBarX(this.datasets.length, datasetIndex, this.scale.valuesCount+1), + y: this.scale.endPoint, + width : this.scale.calculateBarWidth(this.datasets.length), + base : this.scale.endPoint, + strokeColor : this.datasets[datasetIndex].strokeColor, + fillColor : this.datasets[datasetIndex].fillColor + })); + },this); + + this.scale.addXLabel(label); + //Then re-render the chart. + this.update(); + }, + removeData : function(){ + this.scale.removeXLabel(); + //Then re-render the chart. + helpers.each(this.datasets,function(dataset){ + dataset.bars.shift(); + },this); + this.update(); + }, + reflow : function(){ + helpers.extend(this.BarClass.prototype,{ + y: this.scale.endPoint, + base : this.scale.endPoint + }); + var newScaleProps = helpers.extend({ + height : this.chart.height, + width : this.chart.width + }); + this.scale.update(newScaleProps); + }, + draw : function(ease){ + var easingDecimal = ease || 1; + this.clear(); + + var ctx = this.chart.ctx; + + this.scale.draw(easingDecimal); + + //Draw all the bars for each dataset + helpers.each(this.datasets,function(dataset,datasetIndex){ + helpers.each(dataset.bars,function(bar,index){ + if (bar.hasValue()){ + bar.base = this.scale.endPoint; + //Transition then draw + bar.transition({ + x : this.scale.calculateBarX(this.datasets.length, datasetIndex, index), + y : this.scale.calculateY(bar.value), + width : this.scale.calculateBarWidth(this.datasets.length) + }, easingDecimal).draw(); + } + },this); + + },this); + } + }); + + +}).call(this); diff --git a/public/bower_components/Chart.js/src/Chart.Core.js b/public/bower_components/Chart.js/src/Chart.Core.js new file mode 100755 index 0000000..5dccd2e --- /dev/null +++ b/public/bower_components/Chart.js/src/Chart.Core.js @@ -0,0 +1,2021 @@ +/*! + * Chart.js + * http://chartjs.org/ + * Version: {{ version }} + * + * Copyright 2015 Nick Downie + * Released under the MIT license + * https://github.com/nnnick/Chart.js/blob/master/LICENSE.md + */ + + +(function(){ + + "use strict"; + + //Declare root variable - window in the browser, global on the server + var root = this, + previous = root.Chart; + + //Occupy the global variable of Chart, and create a simple base class + var Chart = function(context){ + var chart = this; + this.canvas = context.canvas; + + this.ctx = context; + + //Variables global to the chart + var computeDimension = function(element,dimension) + { + if (element['offset'+dimension]) + { + return element['offset'+dimension]; + } + else + { + return document.defaultView.getComputedStyle(element).getPropertyValue(dimension); + } + } + + var width = this.width = computeDimension(context.canvas,'Width'); + var height = this.height = computeDimension(context.canvas,'Height'); + + // Firefox requires this to work correctly + context.canvas.width = width; + context.canvas.height = height; + + var width = this.width = context.canvas.width; + var height = this.height = context.canvas.height; + this.aspectRatio = this.width / this.height; + //High pixel density displays - multiply the size of the canvas height/width by the device pixel ratio, then scale. + helpers.retinaScale(this); + + return this; + }; + //Globally expose the defaults to allow for user updating/changing + Chart.defaults = { + global: { + // Boolean - Whether to animate the chart + animation: true, + + // Number - Number of animation steps + animationSteps: 60, + + // String - Animation easing effect + animationEasing: "easeOutQuart", + + // Boolean - If we should show the scale at all + showScale: true, + + // Boolean - If we want to override with a hard coded scale + scaleOverride: false, + + // ** Required if scaleOverride is true ** + // Number - The number of steps in a hard coded scale + scaleSteps: null, + // Number - The value jump in the hard coded scale + scaleStepWidth: null, + // Number - The scale starting value + scaleStartValue: null, + + // String - Colour of the scale line + scaleLineColor: "rgba(0,0,0,.1)", + + // Number - Pixel width of the scale line + scaleLineWidth: 1, + + // Boolean - Whether to show labels on the scale + scaleShowLabels: true, + + // Interpolated JS string - can access value + scaleLabel: "<%=value%>", + + // Boolean - Whether the scale should stick to integers, and not show any floats even if drawing space is there + scaleIntegersOnly: true, + + // Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value + scaleBeginAtZero: false, + + // String - Scale label font declaration for the scale label + scaleFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + + // Number - Scale label font size in pixels + scaleFontSize: 12, + + // String - Scale label font weight style + scaleFontStyle: "normal", + + // String - Scale label font colour + scaleFontColor: "#666", + + // Boolean - whether or not the chart should be responsive and resize when the browser does. + responsive: false, + + // Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container + maintainAspectRatio: true, + + // Boolean - Determines whether to draw tooltips on the canvas or not - attaches events to touchmove & mousemove + showTooltips: true, + + // Boolean - Determines whether to draw built-in tooltip or call custom tooltip function + customTooltips: false, + + // Array - Array of string names to attach tooltip events + tooltipEvents: ["mousemove", "touchstart", "touchmove", "mouseout"], + + // String - Tooltip background colour + tooltipFillColor: "rgba(0,0,0,0.8)", + + // String - Tooltip label font declaration for the scale label + tooltipFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + + // Number - Tooltip label font size in pixels + tooltipFontSize: 14, + + // String - Tooltip font weight style + tooltipFontStyle: "normal", + + // String - Tooltip label font colour + tooltipFontColor: "#fff", + + // String - Tooltip title font declaration for the scale label + tooltipTitleFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + + // Number - Tooltip title font size in pixels + tooltipTitleFontSize: 14, + + // String - Tooltip title font weight style + tooltipTitleFontStyle: "bold", + + // String - Tooltip title font colour + tooltipTitleFontColor: "#fff", + + // Number - pixel width of padding around tooltip text + tooltipYPadding: 6, + + // Number - pixel width of padding around tooltip text + tooltipXPadding: 6, + + // Number - Size of the caret on the tooltip + tooltipCaretSize: 8, + + // Number - Pixel radius of the tooltip border + tooltipCornerRadius: 6, + + // Number - Pixel offset from point x to tooltip edge + tooltipXOffset: 10, + + // String - Template string for single tooltips + tooltipTemplate: "<%if (label){%><%=label%>: <%}%><%= value %>", + + // String - Template string for single tooltips + multiTooltipTemplate: "<%= value %>", + + // String - Colour behind the legend colour block + multiTooltipKeyBackground: '#fff', + + // Function - Will fire on animation progression. + onAnimationProgress: function(){}, + + // Function - Will fire on animation completion. + onAnimationComplete: function(){} + + } + }; + + //Create a dictionary of chart types, to allow for extension of existing types + Chart.types = {}; + + //Global Chart helpers object for utility methods and classes + var helpers = Chart.helpers = {}; + + //-- Basic js utility methods + var each = helpers.each = function(loopable,callback,self){ + var additionalArgs = Array.prototype.slice.call(arguments, 3); + // Check to see if null or undefined firstly. + if (loopable){ + if (loopable.length === +loopable.length){ + var i; + for (i=0; i= 0; i--) { + var currentItem = arrayToSearch[i]; + if (filterCallback(currentItem)){ + return currentItem; + } + } + }, + inherits = helpers.inherits = function(extensions){ + //Basic javascript inheritance based on the model created in Backbone.js + var parent = this; + var ChartElement = (extensions && extensions.hasOwnProperty("constructor")) ? extensions.constructor : function(){ return parent.apply(this, arguments); }; + + var Surrogate = function(){ this.constructor = ChartElement;}; + Surrogate.prototype = parent.prototype; + ChartElement.prototype = new Surrogate(); + + ChartElement.extend = inherits; + + if (extensions) extend(ChartElement.prototype, extensions); + + ChartElement.__super__ = parent.prototype; + + return ChartElement; + }, + noop = helpers.noop = function(){}, + uid = helpers.uid = (function(){ + var id=0; + return function(){ + return "chart-" + id++; + }; + })(), + warn = helpers.warn = function(str){ + //Method for warning of errors + if (window.console && typeof window.console.warn == "function") console.warn(str); + }, + amd = helpers.amd = (typeof define == 'function' && define.amd), + //-- Math methods + isNumber = helpers.isNumber = function(n){ + return !isNaN(parseFloat(n)) && isFinite(n); + }, + max = helpers.max = function(array){ + return Math.max.apply( Math, array ); + }, + min = helpers.min = function(array){ + return Math.min.apply( Math, array ); + }, + cap = helpers.cap = function(valueToCap,maxValue,minValue){ + if(isNumber(maxValue)) { + if( valueToCap > maxValue ) { + return maxValue; + } + } + else if(isNumber(minValue)){ + if ( valueToCap < minValue ){ + return minValue; + } + } + return valueToCap; + }, + getDecimalPlaces = helpers.getDecimalPlaces = function(num){ + if (num%1!==0 && isNumber(num)){ + return num.toString().split(".")[1].length; + } + else { + return 0; + } + }, + toRadians = helpers.radians = function(degrees){ + return degrees * (Math.PI/180); + }, + // Gets the angle from vertical upright to the point about a centre. + getAngleFromPoint = helpers.getAngleFromPoint = function(centrePoint, anglePoint){ + var distanceFromXCenter = anglePoint.x - centrePoint.x, + distanceFromYCenter = anglePoint.y - centrePoint.y, + radialDistanceFromCenter = Math.sqrt( distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter); + + + var angle = Math.PI * 2 + Math.atan2(distanceFromYCenter, distanceFromXCenter); + + //If the segment is in the top left quadrant, we need to add another rotation to the angle + if (distanceFromXCenter < 0 && distanceFromYCenter < 0){ + angle += Math.PI*2; + } + + return { + angle: angle, + distance: radialDistanceFromCenter + }; + }, + aliasPixel = helpers.aliasPixel = function(pixelWidth){ + return (pixelWidth % 2 === 0) ? 0 : 0.5; + }, + splineCurve = helpers.splineCurve = function(FirstPoint,MiddlePoint,AfterPoint,t){ + //Props to Rob Spencer at scaled innovation for his post on splining between points + //http://scaledinnovation.com/analytics/splines/aboutSplines.html + var d01=Math.sqrt(Math.pow(MiddlePoint.x-FirstPoint.x,2)+Math.pow(MiddlePoint.y-FirstPoint.y,2)), + d12=Math.sqrt(Math.pow(AfterPoint.x-MiddlePoint.x,2)+Math.pow(AfterPoint.y-MiddlePoint.y,2)), + fa=t*d01/(d01+d12),// scaling factor for triangle Ta + fb=t*d12/(d01+d12); + return { + inner : { + x : MiddlePoint.x-fa*(AfterPoint.x-FirstPoint.x), + y : MiddlePoint.y-fa*(AfterPoint.y-FirstPoint.y) + }, + outer : { + x: MiddlePoint.x+fb*(AfterPoint.x-FirstPoint.x), + y : MiddlePoint.y+fb*(AfterPoint.y-FirstPoint.y) + } + }; + }, + calculateOrderOfMagnitude = helpers.calculateOrderOfMagnitude = function(val){ + return Math.floor(Math.log(val) / Math.LN10); + }, + calculateScaleRange = helpers.calculateScaleRange = function(valuesArray, drawingSize, textSize, startFromZero, integersOnly){ + + //Set a minimum step of two - a point at the top of the graph, and a point at the base + var minSteps = 2, + maxSteps = Math.floor(drawingSize/(textSize * 1.5)), + skipFitting = (minSteps >= maxSteps); + + var maxValue = max(valuesArray), + minValue = min(valuesArray); + + // We need some degree of seperation here to calculate the scales if all the values are the same + // Adding/minusing 0.5 will give us a range of 1. + if (maxValue === minValue){ + maxValue += 0.5; + // So we don't end up with a graph with a negative start value if we've said always start from zero + if (minValue >= 0.5 && !startFromZero){ + minValue -= 0.5; + } + else{ + // Make up a whole number above the values + maxValue += 0.5; + } + } + + var valueRange = Math.abs(maxValue - minValue), + rangeOrderOfMagnitude = calculateOrderOfMagnitude(valueRange), + graphMax = Math.ceil(maxValue / (1 * Math.pow(10, rangeOrderOfMagnitude))) * Math.pow(10, rangeOrderOfMagnitude), + graphMin = (startFromZero) ? 0 : Math.floor(minValue / (1 * Math.pow(10, rangeOrderOfMagnitude))) * Math.pow(10, rangeOrderOfMagnitude), + graphRange = graphMax - graphMin, + stepValue = Math.pow(10, rangeOrderOfMagnitude), + numberOfSteps = Math.round(graphRange / stepValue); + + //If we have more space on the graph we'll use it to give more definition to the data + while((numberOfSteps > maxSteps || (numberOfSteps * 2) < maxSteps) && !skipFitting) { + if(numberOfSteps > maxSteps){ + stepValue *=2; + numberOfSteps = Math.round(graphRange/stepValue); + // Don't ever deal with a decimal number of steps - cancel fitting and just use the minimum number of steps. + if (numberOfSteps % 1 !== 0){ + skipFitting = true; + } + } + //We can fit in double the amount of scale points on the scale + else{ + //If user has declared ints only, and the step value isn't a decimal + if (integersOnly && rangeOrderOfMagnitude >= 0){ + //If the user has said integers only, we need to check that making the scale more granular wouldn't make it a float + if(stepValue/2 % 1 === 0){ + stepValue /=2; + numberOfSteps = Math.round(graphRange/stepValue); + } + //If it would make it a float break out of the loop + else{ + break; + } + } + //If the scale doesn't have to be an int, make the scale more granular anyway. + else{ + stepValue /=2; + numberOfSteps = Math.round(graphRange/stepValue); + } + + } + } + + if (skipFitting){ + numberOfSteps = minSteps; + stepValue = graphRange / numberOfSteps; + } + + return { + steps : numberOfSteps, + stepValue : stepValue, + min : graphMin, + max : graphMin + (numberOfSteps * stepValue) + }; + + }, + /* jshint ignore:start */ + // Blows up jshint errors based on the new Function constructor + //Templating methods + //Javascript micro templating by John Resig - source at http://ejohn.org/blog/javascript-micro-templating/ + template = helpers.template = function(templateString, valuesObject){ + + // If templateString is function rather than string-template - call the function for valuesObject + + if(templateString instanceof Function){ + return templateString(valuesObject); + } + + var cache = {}; + function tmpl(str, data){ + // Figure out if we're getting a template, or if we need to + // load the template - and be sure to cache the result. + var fn = !/\W/.test(str) ? + cache[str] = cache[str] : + + // Generate a reusable function that will serve as a template + // generator (and which will be cached). + new Function("obj", + "var p=[],print=function(){p.push.apply(p,arguments);};" + + + // Introduce the data as local variables using with(){} + "with(obj){p.push('" + + + // Convert the template into pure JavaScript + str + .replace(/[\r\t\n]/g, " ") + .split("<%").join("\t") + .replace(/((^|%>)[^\t]*)'/g, "$1\r") + .replace(/\t=(.*?)%>/g, "',$1,'") + .split("\t").join("');") + .split("%>").join("p.push('") + .split("\r").join("\\'") + + "');}return p.join('');" + ); + + // Provide some basic currying to the user + return data ? fn( data ) : fn; + } + return tmpl(templateString,valuesObject); + }, + /* jshint ignore:end */ + generateLabels = helpers.generateLabels = function(templateString,numberOfSteps,graphMin,stepValue){ + var labelsArray = new Array(numberOfSteps); + if (labelTemplateString){ + each(labelsArray,function(val,index){ + labelsArray[index] = template(templateString,{value: (graphMin + (stepValue*(index+1)))}); + }); + } + return labelsArray; + }, + //--Animation methods + //Easing functions adapted from Robert Penner's easing equations + //http://www.robertpenner.com/easing/ + easingEffects = helpers.easingEffects = { + linear: function (t) { + return t; + }, + easeInQuad: function (t) { + return t * t; + }, + easeOutQuad: function (t) { + return -1 * t * (t - 2); + }, + easeInOutQuad: function (t) { + if ((t /= 1 / 2) < 1) return 1 / 2 * t * t; + return -1 / 2 * ((--t) * (t - 2) - 1); + }, + easeInCubic: function (t) { + return t * t * t; + }, + easeOutCubic: function (t) { + return 1 * ((t = t / 1 - 1) * t * t + 1); + }, + easeInOutCubic: function (t) { + if ((t /= 1 / 2) < 1) return 1 / 2 * t * t * t; + return 1 / 2 * ((t -= 2) * t * t + 2); + }, + easeInQuart: function (t) { + return t * t * t * t; + }, + easeOutQuart: function (t) { + return -1 * ((t = t / 1 - 1) * t * t * t - 1); + }, + easeInOutQuart: function (t) { + if ((t /= 1 / 2) < 1) return 1 / 2 * t * t * t * t; + return -1 / 2 * ((t -= 2) * t * t * t - 2); + }, + easeInQuint: function (t) { + return 1 * (t /= 1) * t * t * t * t; + }, + easeOutQuint: function (t) { + return 1 * ((t = t / 1 - 1) * t * t * t * t + 1); + }, + easeInOutQuint: function (t) { + if ((t /= 1 / 2) < 1) return 1 / 2 * t * t * t * t * t; + return 1 / 2 * ((t -= 2) * t * t * t * t + 2); + }, + easeInSine: function (t) { + return -1 * Math.cos(t / 1 * (Math.PI / 2)) + 1; + }, + easeOutSine: function (t) { + return 1 * Math.sin(t / 1 * (Math.PI / 2)); + }, + easeInOutSine: function (t) { + return -1 / 2 * (Math.cos(Math.PI * t / 1) - 1); + }, + easeInExpo: function (t) { + return (t === 0) ? 1 : 1 * Math.pow(2, 10 * (t / 1 - 1)); + }, + easeOutExpo: function (t) { + return (t === 1) ? 1 : 1 * (-Math.pow(2, -10 * t / 1) + 1); + }, + easeInOutExpo: function (t) { + if (t === 0) return 0; + if (t === 1) return 1; + if ((t /= 1 / 2) < 1) return 1 / 2 * Math.pow(2, 10 * (t - 1)); + return 1 / 2 * (-Math.pow(2, -10 * --t) + 2); + }, + easeInCirc: function (t) { + if (t >= 1) return t; + return -1 * (Math.sqrt(1 - (t /= 1) * t) - 1); + }, + easeOutCirc: function (t) { + return 1 * Math.sqrt(1 - (t = t / 1 - 1) * t); + }, + easeInOutCirc: function (t) { + if ((t /= 1 / 2) < 1) return -1 / 2 * (Math.sqrt(1 - t * t) - 1); + return 1 / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1); + }, + easeInElastic: function (t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) return 0; + if ((t /= 1) == 1) return 1; + if (!p) p = 1 * 0.3; + if (a < Math.abs(1)) { + a = 1; + s = p / 4; + } else s = p / (2 * Math.PI) * Math.asin(1 / a); + return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p)); + }, + easeOutElastic: function (t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) return 0; + if ((t /= 1) == 1) return 1; + if (!p) p = 1 * 0.3; + if (a < Math.abs(1)) { + a = 1; + s = p / 4; + } else s = p / (2 * Math.PI) * Math.asin(1 / a); + return a * Math.pow(2, -10 * t) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) + 1; + }, + easeInOutElastic: function (t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) return 0; + if ((t /= 1 / 2) == 2) return 1; + if (!p) p = 1 * (0.3 * 1.5); + if (a < Math.abs(1)) { + a = 1; + s = p / 4; + } else s = p / (2 * Math.PI) * Math.asin(1 / a); + if (t < 1) return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p)); + return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) * 0.5 + 1; + }, + easeInBack: function (t) { + var s = 1.70158; + return 1 * (t /= 1) * t * ((s + 1) * t - s); + }, + easeOutBack: function (t) { + var s = 1.70158; + return 1 * ((t = t / 1 - 1) * t * ((s + 1) * t + s) + 1); + }, + easeInOutBack: function (t) { + var s = 1.70158; + if ((t /= 1 / 2) < 1) return 1 / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)); + return 1 / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2); + }, + easeInBounce: function (t) { + return 1 - easingEffects.easeOutBounce(1 - t); + }, + easeOutBounce: function (t) { + if ((t /= 1) < (1 / 2.75)) { + return 1 * (7.5625 * t * t); + } else if (t < (2 / 2.75)) { + return 1 * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75); + } else if (t < (2.5 / 2.75)) { + return 1 * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375); + } else { + return 1 * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375); + } + }, + easeInOutBounce: function (t) { + if (t < 1 / 2) return easingEffects.easeInBounce(t * 2) * 0.5; + return easingEffects.easeOutBounce(t * 2 - 1) * 0.5 + 1 * 0.5; + } + }, + //Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/ + requestAnimFrame = helpers.requestAnimFrame = (function(){ + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(callback) { + return window.setTimeout(callback, 1000 / 60); + }; + })(), + cancelAnimFrame = helpers.cancelAnimFrame = (function(){ + return window.cancelAnimationFrame || + window.webkitCancelAnimationFrame || + window.mozCancelAnimationFrame || + window.oCancelAnimationFrame || + window.msCancelAnimationFrame || + function(callback) { + return window.clearTimeout(callback, 1000 / 60); + }; + })(), + animationLoop = helpers.animationLoop = function(callback,totalSteps,easingString,onProgress,onComplete,chartInstance){ + + var currentStep = 0, + easingFunction = easingEffects[easingString] || easingEffects.linear; + + var animationFrame = function(){ + currentStep++; + var stepDecimal = currentStep/totalSteps; + var easeDecimal = easingFunction(stepDecimal); + + callback.call(chartInstance,easeDecimal,stepDecimal, currentStep); + onProgress.call(chartInstance,easeDecimal,stepDecimal); + if (currentStep < totalSteps){ + chartInstance.animationFrame = requestAnimFrame(animationFrame); + } else{ + onComplete.apply(chartInstance); + } + }; + requestAnimFrame(animationFrame); + }, + //-- DOM methods + getRelativePosition = helpers.getRelativePosition = function(evt){ + var mouseX, mouseY; + var e = evt.originalEvent || evt, + canvas = evt.currentTarget || evt.srcElement, + boundingRect = canvas.getBoundingClientRect(); + + if (e.touches){ + mouseX = e.touches[0].clientX - boundingRect.left; + mouseY = e.touches[0].clientY - boundingRect.top; + + } + else{ + mouseX = e.clientX - boundingRect.left; + mouseY = e.clientY - boundingRect.top; + } + + return { + x : mouseX, + y : mouseY + }; + + }, + addEvent = helpers.addEvent = function(node,eventType,method){ + if (node.addEventListener){ + node.addEventListener(eventType,method); + } else if (node.attachEvent){ + node.attachEvent("on"+eventType, method); + } else { + node["on"+eventType] = method; + } + }, + removeEvent = helpers.removeEvent = function(node, eventType, handler){ + if (node.removeEventListener){ + node.removeEventListener(eventType, handler, false); + } else if (node.detachEvent){ + node.detachEvent("on"+eventType,handler); + } else{ + node["on" + eventType] = noop; + } + }, + bindEvents = helpers.bindEvents = function(chartInstance, arrayOfEvents, handler){ + // Create the events object if it's not already present + if (!chartInstance.events) chartInstance.events = {}; + + each(arrayOfEvents,function(eventName){ + chartInstance.events[eventName] = function(){ + handler.apply(chartInstance, arguments); + }; + addEvent(chartInstance.chart.canvas,eventName,chartInstance.events[eventName]); + }); + }, + unbindEvents = helpers.unbindEvents = function (chartInstance, arrayOfEvents) { + each(arrayOfEvents, function(handler,eventName){ + removeEvent(chartInstance.chart.canvas, eventName, handler); + }); + }, + getMaximumWidth = helpers.getMaximumWidth = function(domNode){ + var container = domNode.parentNode; + // TODO = check cross browser stuff with this. + return container.clientWidth; + }, + getMaximumHeight = helpers.getMaximumHeight = function(domNode){ + var container = domNode.parentNode; + // TODO = check cross browser stuff with this. + return container.clientHeight; + }, + getMaximumSize = helpers.getMaximumSize = helpers.getMaximumWidth, // legacy support + retinaScale = helpers.retinaScale = function(chart){ + var ctx = chart.ctx, + width = chart.canvas.width, + height = chart.canvas.height; + + if (window.devicePixelRatio) { + ctx.canvas.style.width = width + "px"; + ctx.canvas.style.height = height + "px"; + ctx.canvas.height = height * window.devicePixelRatio; + ctx.canvas.width = width * window.devicePixelRatio; + ctx.scale(window.devicePixelRatio, window.devicePixelRatio); + } + }, + //-- Canvas methods + clear = helpers.clear = function(chart){ + chart.ctx.clearRect(0,0,chart.width,chart.height); + }, + fontString = helpers.fontString = function(pixelSize,fontStyle,fontFamily){ + return fontStyle + " " + pixelSize+"px " + fontFamily; + }, + longestText = helpers.longestText = function(ctx,font,arrayOfStrings){ + ctx.font = font; + var longest = 0; + each(arrayOfStrings,function(string){ + var textWidth = ctx.measureText(string).width; + longest = (textWidth > longest) ? textWidth : longest; + }); + return longest; + }, + drawRoundedRectangle = helpers.drawRoundedRectangle = function(ctx,x,y,width,height,radius){ + ctx.beginPath(); + ctx.moveTo(x + radius, y); + ctx.lineTo(x + width - radius, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + radius); + ctx.lineTo(x + width, y + height - radius); + ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); + ctx.lineTo(x + radius, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - radius); + ctx.lineTo(x, y + radius); + ctx.quadraticCurveTo(x, y, x + radius, y); + ctx.closePath(); + }; + + + //Store a reference to each instance - allowing us to globally resize chart instances on window resize. + //Destroy method on the chart will remove the instance of the chart from this reference. + Chart.instances = {}; + + Chart.Type = function(data,options,chart){ + this.options = options; + this.chart = chart; + this.id = uid(); + //Add the chart instance to the global namespace + Chart.instances[this.id] = this; + + // Initialize is always called when a chart type is created + // By default it is a no op, but it should be extended + if (options.responsive){ + this.resize(); + } + this.initialize.call(this,data); + }; + + //Core methods that'll be a part of every chart type + extend(Chart.Type.prototype,{ + initialize : function(){return this;}, + clear : function(){ + clear(this.chart); + return this; + }, + stop : function(){ + // Stops any current animation loop occuring + cancelAnimFrame(this.animationFrame); + return this; + }, + resize : function(callback){ + this.stop(); + var canvas = this.chart.canvas, + newWidth = getMaximumWidth(this.chart.canvas), + newHeight = this.options.maintainAspectRatio ? newWidth / this.chart.aspectRatio : getMaximumHeight(this.chart.canvas); + + canvas.width = this.chart.width = newWidth; + canvas.height = this.chart.height = newHeight; + + retinaScale(this.chart); + + if (typeof callback === "function"){ + callback.apply(this, Array.prototype.slice.call(arguments, 1)); + } + return this; + }, + reflow : noop, + render : function(reflow){ + if (reflow){ + this.reflow(); + } + if (this.options.animation && !reflow){ + helpers.animationLoop( + this.draw, + this.options.animationSteps, + this.options.animationEasing, + this.options.onAnimationProgress, + this.options.onAnimationComplete, + this + ); + } + else{ + this.draw(); + this.options.onAnimationComplete.call(this); + } + return this; + }, + generateLegend : function(){ + return template(this.options.legendTemplate,this); + }, + destroy : function(){ + this.clear(); + unbindEvents(this, this.events); + var canvas = this.chart.canvas; + + // Reset canvas height/width attributes starts a fresh with the canvas context + canvas.width = this.chart.width; + canvas.height = this.chart.height; + + // < IE9 doesn't support removeProperty + if (canvas.style.removeProperty) { + canvas.style.removeProperty('width'); + canvas.style.removeProperty('height'); + } else { + canvas.style.removeAttribute('width'); + canvas.style.removeAttribute('height'); + } + + delete Chart.instances[this.id]; + }, + showTooltip : function(ChartElements, forceRedraw){ + // Only redraw the chart if we've actually changed what we're hovering on. + if (typeof this.activeElements === 'undefined') this.activeElements = []; + + var isChanged = (function(Elements){ + var changed = false; + + if (Elements.length !== this.activeElements.length){ + changed = true; + return changed; + } + + each(Elements, function(element, index){ + if (element !== this.activeElements[index]){ + changed = true; + } + }, this); + return changed; + }).call(this, ChartElements); + + if (!isChanged && !forceRedraw){ + return; + } + else{ + this.activeElements = ChartElements; + } + this.draw(); + if(this.options.customTooltips){ + this.options.customTooltips(false); + } + if (ChartElements.length > 0){ + // If we have multiple datasets, show a MultiTooltip for all of the data points at that index + if (this.datasets && this.datasets.length > 1) { + var dataArray, + dataIndex; + + for (var i = this.datasets.length - 1; i >= 0; i--) { + dataArray = this.datasets[i].points || this.datasets[i].bars || this.datasets[i].segments; + dataIndex = indexOf(dataArray, ChartElements[0]); + if (dataIndex !== -1){ + break; + } + } + var tooltipLabels = [], + tooltipColors = [], + medianPosition = (function(index) { + + // Get all the points at that particular index + var Elements = [], + dataCollection, + xPositions = [], + yPositions = [], + xMax, + yMax, + xMin, + yMin; + helpers.each(this.datasets, function(dataset){ + dataCollection = dataset.points || dataset.bars || dataset.segments; + if (dataCollection[dataIndex] && dataCollection[dataIndex].hasValue()){ + Elements.push(dataCollection[dataIndex]); + } + }); + + helpers.each(Elements, function(element) { + xPositions.push(element.x); + yPositions.push(element.y); + + + //Include any colour information about the element + tooltipLabels.push(helpers.template(this.options.multiTooltipTemplate, element)); + tooltipColors.push({ + fill: element._saved.fillColor || element.fillColor, + stroke: element._saved.strokeColor || element.strokeColor + }); + + }, this); + + yMin = min(yPositions); + yMax = max(yPositions); + + xMin = min(xPositions); + xMax = max(xPositions); + + return { + x: (xMin > this.chart.width/2) ? xMin : xMax, + y: (yMin + yMax)/2 + }; + }).call(this, dataIndex); + + new Chart.MultiTooltip({ + x: medianPosition.x, + y: medianPosition.y, + xPadding: this.options.tooltipXPadding, + yPadding: this.options.tooltipYPadding, + xOffset: this.options.tooltipXOffset, + fillColor: this.options.tooltipFillColor, + textColor: this.options.tooltipFontColor, + fontFamily: this.options.tooltipFontFamily, + fontStyle: this.options.tooltipFontStyle, + fontSize: this.options.tooltipFontSize, + titleTextColor: this.options.tooltipTitleFontColor, + titleFontFamily: this.options.tooltipTitleFontFamily, + titleFontStyle: this.options.tooltipTitleFontStyle, + titleFontSize: this.options.tooltipTitleFontSize, + cornerRadius: this.options.tooltipCornerRadius, + labels: tooltipLabels, + legendColors: tooltipColors, + legendColorBackground : this.options.multiTooltipKeyBackground, + title: ChartElements[0].label, + chart: this.chart, + ctx: this.chart.ctx, + custom: this.options.customTooltips + }).draw(); + + } else { + each(ChartElements, function(Element) { + var tooltipPosition = Element.tooltipPosition(); + new Chart.Tooltip({ + x: Math.round(tooltipPosition.x), + y: Math.round(tooltipPosition.y), + xPadding: this.options.tooltipXPadding, + yPadding: this.options.tooltipYPadding, + fillColor: this.options.tooltipFillColor, + textColor: this.options.tooltipFontColor, + fontFamily: this.options.tooltipFontFamily, + fontStyle: this.options.tooltipFontStyle, + fontSize: this.options.tooltipFontSize, + caretHeight: this.options.tooltipCaretSize, + cornerRadius: this.options.tooltipCornerRadius, + text: template(this.options.tooltipTemplate, Element), + chart: this.chart, + custom: this.options.customTooltips + }).draw(); + }, this); + } + } + return this; + }, + toBase64Image : function(){ + return this.chart.canvas.toDataURL.apply(this.chart.canvas, arguments); + } + }); + + Chart.Type.extend = function(extensions){ + + var parent = this; + + var ChartType = function(){ + return parent.apply(this,arguments); + }; + + //Copy the prototype object of the this class + ChartType.prototype = clone(parent.prototype); + //Now overwrite some of the properties in the base class with the new extensions + extend(ChartType.prototype, extensions); + + ChartType.extend = Chart.Type.extend; + + if (extensions.name || parent.prototype.name){ + + var chartName = extensions.name || parent.prototype.name; + //Assign any potential default values of the new chart type + + //If none are defined, we'll use a clone of the chart type this is being extended from. + //I.e. if we extend a line chart, we'll use the defaults from the line chart if our new chart + //doesn't define some defaults of their own. + + var baseDefaults = (Chart.defaults[parent.prototype.name]) ? clone(Chart.defaults[parent.prototype.name]) : {}; + + Chart.defaults[chartName] = extend(baseDefaults,extensions.defaults); + + Chart.types[chartName] = ChartType; + + //Register this new chart type in the Chart prototype + Chart.prototype[chartName] = function(data,options){ + var config = merge(Chart.defaults.global, Chart.defaults[chartName], options || {}); + return new ChartType(data,config,this); + }; + } else{ + warn("Name not provided for this chart, so it hasn't been registered"); + } + return parent; + }; + + Chart.Element = function(configuration){ + extend(this,configuration); + this.initialize.apply(this,arguments); + this.save(); + }; + extend(Chart.Element.prototype,{ + initialize : function(){}, + restore : function(props){ + if (!props){ + extend(this,this._saved); + } else { + each(props,function(key){ + this[key] = this._saved[key]; + },this); + } + return this; + }, + save : function(){ + this._saved = clone(this); + delete this._saved._saved; + return this; + }, + update : function(newProps){ + each(newProps,function(value,key){ + this._saved[key] = this[key]; + this[key] = value; + },this); + return this; + }, + transition : function(props,ease){ + each(props,function(value,key){ + this[key] = ((value - this._saved[key]) * ease) + this._saved[key]; + },this); + return this; + }, + tooltipPosition : function(){ + return { + x : this.x, + y : this.y + }; + }, + hasValue: function(){ + return isNumber(this.value); + } + }); + + Chart.Element.extend = inherits; + + + Chart.Point = Chart.Element.extend({ + display: true, + inRange: function(chartX,chartY){ + var hitDetectionRange = this.hitDetectionRadius + this.radius; + return ((Math.pow(chartX-this.x, 2)+Math.pow(chartY-this.y, 2)) < Math.pow(hitDetectionRange,2)); + }, + draw : function(){ + if (this.display){ + var ctx = this.ctx; + ctx.beginPath(); + + ctx.arc(this.x, this.y, this.radius, 0, Math.PI*2); + ctx.closePath(); + + ctx.strokeStyle = this.strokeColor; + ctx.lineWidth = this.strokeWidth; + + ctx.fillStyle = this.fillColor; + + ctx.fill(); + ctx.stroke(); + } + + + //Quick debug for bezier curve splining + //Highlights control points and the line between them. + //Handy for dev - stripped in the min version. + + // ctx.save(); + // ctx.fillStyle = "black"; + // ctx.strokeStyle = "black" + // ctx.beginPath(); + // ctx.arc(this.controlPoints.inner.x,this.controlPoints.inner.y, 2, 0, Math.PI*2); + // ctx.fill(); + + // ctx.beginPath(); + // ctx.arc(this.controlPoints.outer.x,this.controlPoints.outer.y, 2, 0, Math.PI*2); + // ctx.fill(); + + // ctx.moveTo(this.controlPoints.inner.x,this.controlPoints.inner.y); + // ctx.lineTo(this.x, this.y); + // ctx.lineTo(this.controlPoints.outer.x,this.controlPoints.outer.y); + // ctx.stroke(); + + // ctx.restore(); + + + + } + }); + + Chart.Arc = Chart.Element.extend({ + inRange : function(chartX,chartY){ + + var pointRelativePosition = helpers.getAngleFromPoint(this, { + x: chartX, + y: chartY + }); + + //Check if within the range of the open/close angle + var betweenAngles = (pointRelativePosition.angle >= this.startAngle && pointRelativePosition.angle <= this.endAngle), + withinRadius = (pointRelativePosition.distance >= this.innerRadius && pointRelativePosition.distance <= this.outerRadius); + + return (betweenAngles && withinRadius); + //Ensure within the outside of the arc centre, but inside arc outer + }, + tooltipPosition : function(){ + var centreAngle = this.startAngle + ((this.endAngle - this.startAngle) / 2), + rangeFromCentre = (this.outerRadius - this.innerRadius) / 2 + this.innerRadius; + return { + x : this.x + (Math.cos(centreAngle) * rangeFromCentre), + y : this.y + (Math.sin(centreAngle) * rangeFromCentre) + }; + }, + draw : function(animationPercent){ + + var easingDecimal = animationPercent || 1; + + var ctx = this.ctx; + + ctx.beginPath(); + + ctx.arc(this.x, this.y, this.outerRadius, this.startAngle, this.endAngle); + + ctx.arc(this.x, this.y, this.innerRadius, this.endAngle, this.startAngle, true); + + ctx.closePath(); + ctx.strokeStyle = this.strokeColor; + ctx.lineWidth = this.strokeWidth; + + ctx.fillStyle = this.fillColor; + + ctx.fill(); + ctx.lineJoin = 'bevel'; + + if (this.showStroke){ + ctx.stroke(); + } + } + }); + + Chart.Rectangle = Chart.Element.extend({ + draw : function(){ + var ctx = this.ctx, + halfWidth = this.width/2, + leftX = this.x - halfWidth, + rightX = this.x + halfWidth, + top = this.base - (this.base - this.y), + halfStroke = this.strokeWidth / 2; + + // Canvas doesn't allow us to stroke inside the width so we can + // adjust the sizes to fit if we're setting a stroke on the line + if (this.showStroke){ + leftX += halfStroke; + rightX -= halfStroke; + top += halfStroke; + } + + ctx.beginPath(); + + ctx.fillStyle = this.fillColor; + ctx.strokeStyle = this.strokeColor; + ctx.lineWidth = this.strokeWidth; + + // It'd be nice to keep this class totally generic to any rectangle + // and simply specify which border to miss out. + ctx.moveTo(leftX, this.base); + ctx.lineTo(leftX, top); + ctx.lineTo(rightX, top); + ctx.lineTo(rightX, this.base); + ctx.fill(); + if (this.showStroke){ + ctx.stroke(); + } + }, + height : function(){ + return this.base - this.y; + }, + inRange : function(chartX,chartY){ + return (chartX >= this.x - this.width/2 && chartX <= this.x + this.width/2) && (chartY >= this.y && chartY <= this.base); + } + }); + + Chart.Tooltip = Chart.Element.extend({ + draw : function(){ + + var ctx = this.chart.ctx; + + ctx.font = fontString(this.fontSize,this.fontStyle,this.fontFamily); + + this.xAlign = "center"; + this.yAlign = "above"; + + //Distance between the actual element.y position and the start of the tooltip caret + var caretPadding = this.caretPadding = 2; + + var tooltipWidth = ctx.measureText(this.text).width + 2*this.xPadding, + tooltipRectHeight = this.fontSize + 2*this.yPadding, + tooltipHeight = tooltipRectHeight + this.caretHeight + caretPadding; + + if (this.x + tooltipWidth/2 >this.chart.width){ + this.xAlign = "left"; + } else if (this.x - tooltipWidth/2 < 0){ + this.xAlign = "right"; + } + + if (this.y - tooltipHeight < 0){ + this.yAlign = "below"; + } + + + var tooltipX = this.x - tooltipWidth/2, + tooltipY = this.y - tooltipHeight; + + ctx.fillStyle = this.fillColor; + + // Custom Tooltips + if(this.custom){ + this.custom(this); + } + else{ + switch(this.yAlign) + { + case "above": + //Draw a caret above the x/y + ctx.beginPath(); + ctx.moveTo(this.x,this.y - caretPadding); + ctx.lineTo(this.x + this.caretHeight, this.y - (caretPadding + this.caretHeight)); + ctx.lineTo(this.x - this.caretHeight, this.y - (caretPadding + this.caretHeight)); + ctx.closePath(); + ctx.fill(); + break; + case "below": + tooltipY = this.y + caretPadding + this.caretHeight; + //Draw a caret below the x/y + ctx.beginPath(); + ctx.moveTo(this.x, this.y + caretPadding); + ctx.lineTo(this.x + this.caretHeight, this.y + caretPadding + this.caretHeight); + ctx.lineTo(this.x - this.caretHeight, this.y + caretPadding + this.caretHeight); + ctx.closePath(); + ctx.fill(); + break; + } + + switch(this.xAlign) + { + case "left": + tooltipX = this.x - tooltipWidth + (this.cornerRadius + this.caretHeight); + break; + case "right": + tooltipX = this.x - (this.cornerRadius + this.caretHeight); + break; + } + + drawRoundedRectangle(ctx,tooltipX,tooltipY,tooltipWidth,tooltipRectHeight,this.cornerRadius); + + ctx.fill(); + + ctx.fillStyle = this.textColor; + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + ctx.fillText(this.text, tooltipX + tooltipWidth/2, tooltipY + tooltipRectHeight/2); + } + } + }); + + Chart.MultiTooltip = Chart.Element.extend({ + initialize : function(){ + this.font = fontString(this.fontSize,this.fontStyle,this.fontFamily); + + this.titleFont = fontString(this.titleFontSize,this.titleFontStyle,this.titleFontFamily); + + this.height = (this.labels.length * this.fontSize) + ((this.labels.length-1) * (this.fontSize/2)) + (this.yPadding*2) + this.titleFontSize *1.5; + + this.ctx.font = this.titleFont; + + var titleWidth = this.ctx.measureText(this.title).width, + //Label has a legend square as well so account for this. + labelWidth = longestText(this.ctx,this.font,this.labels) + this.fontSize + 3, + longestTextWidth = max([labelWidth,titleWidth]); + + this.width = longestTextWidth + (this.xPadding*2); + + + var halfHeight = this.height/2; + + //Check to ensure the height will fit on the canvas + if (this.y - halfHeight < 0 ){ + this.y = halfHeight; + } else if (this.y + halfHeight > this.chart.height){ + this.y = this.chart.height - halfHeight; + } + + //Decide whether to align left or right based on position on canvas + if (this.x > this.chart.width/2){ + this.x -= this.xOffset + this.width; + } else { + this.x += this.xOffset; + } + + + }, + getLineHeight : function(index){ + var baseLineHeight = this.y - (this.height/2) + this.yPadding, + afterTitleIndex = index-1; + + //If the index is zero, we're getting the title + if (index === 0){ + return baseLineHeight + this.titleFontSize/2; + } else{ + return baseLineHeight + ((this.fontSize*1.5*afterTitleIndex) + this.fontSize/2) + this.titleFontSize * 1.5; + } + + }, + draw : function(){ + // Custom Tooltips + if(this.custom){ + this.custom(this); + } + else{ + drawRoundedRectangle(this.ctx,this.x,this.y - this.height/2,this.width,this.height,this.cornerRadius); + var ctx = this.ctx; + ctx.fillStyle = this.fillColor; + ctx.fill(); + ctx.closePath(); + + ctx.textAlign = "left"; + ctx.textBaseline = "middle"; + ctx.fillStyle = this.titleTextColor; + ctx.font = this.titleFont; + + ctx.fillText(this.title,this.x + this.xPadding, this.getLineHeight(0)); + + ctx.font = this.font; + helpers.each(this.labels,function(label,index){ + ctx.fillStyle = this.textColor; + ctx.fillText(label,this.x + this.xPadding + this.fontSize + 3, this.getLineHeight(index + 1)); + + //A bit gnarly, but clearing this rectangle breaks when using explorercanvas (clears whole canvas) + //ctx.clearRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize); + //Instead we'll make a white filled block to put the legendColour palette over. + + ctx.fillStyle = this.legendColorBackground; + ctx.fillRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize); + + ctx.fillStyle = this.legendColors[index].fill; + ctx.fillRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize); + + + },this); + } + } + }); + + Chart.Scale = Chart.Element.extend({ + initialize : function(){ + this.fit(); + }, + buildYLabels : function(){ + this.yLabels = []; + + var stepDecimalPlaces = getDecimalPlaces(this.stepValue); + + for (var i=0; i<=this.steps; i++){ + this.yLabels.push(template(this.templateString,{value:(this.min + (i * this.stepValue)).toFixed(stepDecimalPlaces)})); + } + this.yLabelWidth = (this.display && this.showLabels) ? longestText(this.ctx,this.font,this.yLabels) : 0; + }, + addXLabel : function(label){ + this.xLabels.push(label); + this.valuesCount++; + this.fit(); + }, + removeXLabel : function(){ + this.xLabels.shift(); + this.valuesCount--; + this.fit(); + }, + // Fitting loop to rotate x Labels and figure out what fits there, and also calculate how many Y steps to use + fit: function(){ + // First we need the width of the yLabels, assuming the xLabels aren't rotated + + // To do that we need the base line at the top and base of the chart, assuming there is no x label rotation + this.startPoint = (this.display) ? this.fontSize : 0; + this.endPoint = (this.display) ? this.height - (this.fontSize * 1.5) - 5 : this.height; // -5 to pad labels + + // Apply padding settings to the start and end point. + this.startPoint += this.padding; + this.endPoint -= this.padding; + + // Cache the starting height, so can determine if we need to recalculate the scale yAxis + var cachedHeight = this.endPoint - this.startPoint, + cachedYLabelWidth; + + // Build the current yLabels so we have an idea of what size they'll be to start + /* + * This sets what is returned from calculateScaleRange as static properties of this class: + * + this.steps; + this.stepValue; + this.min; + this.max; + * + */ + this.calculateYRange(cachedHeight); + + // With these properties set we can now build the array of yLabels + // and also the width of the largest yLabel + this.buildYLabels(); + + this.calculateXLabelRotation(); + + while((cachedHeight > this.endPoint - this.startPoint)){ + cachedHeight = this.endPoint - this.startPoint; + cachedYLabelWidth = this.yLabelWidth; + + this.calculateYRange(cachedHeight); + this.buildYLabels(); + + // Only go through the xLabel loop again if the yLabel width has changed + if (cachedYLabelWidth < this.yLabelWidth){ + this.calculateXLabelRotation(); + } + } + + }, + calculateXLabelRotation : function(){ + //Get the width of each grid by calculating the difference + //between x offsets between 0 and 1. + + this.ctx.font = this.font; + + var firstWidth = this.ctx.measureText(this.xLabels[0]).width, + lastWidth = this.ctx.measureText(this.xLabels[this.xLabels.length - 1]).width, + firstRotated, + lastRotated; + + + this.xScalePaddingRight = lastWidth/2 + 3; + this.xScalePaddingLeft = (firstWidth/2 > this.yLabelWidth + 10) ? firstWidth/2 : this.yLabelWidth + 10; + + this.xLabelRotation = 0; + if (this.display){ + var originalLabelWidth = longestText(this.ctx,this.font,this.xLabels), + cosRotation, + firstRotatedWidth; + this.xLabelWidth = originalLabelWidth; + //Allow 3 pixels x2 padding either side for label readability + var xGridWidth = Math.floor(this.calculateX(1) - this.calculateX(0)) - 6; + + //Max label rotate should be 90 - also act as a loop counter + while ((this.xLabelWidth > xGridWidth && this.xLabelRotation === 0) || (this.xLabelWidth > xGridWidth && this.xLabelRotation <= 90 && this.xLabelRotation > 0)){ + cosRotation = Math.cos(toRadians(this.xLabelRotation)); + + firstRotated = cosRotation * firstWidth; + lastRotated = cosRotation * lastWidth; + + // We're right aligning the text now. + if (firstRotated + this.fontSize / 2 > this.yLabelWidth + 8){ + this.xScalePaddingLeft = firstRotated + this.fontSize / 2; + } + this.xScalePaddingRight = this.fontSize/2; + + + this.xLabelRotation++; + this.xLabelWidth = cosRotation * originalLabelWidth; + + } + if (this.xLabelRotation > 0){ + this.endPoint -= Math.sin(toRadians(this.xLabelRotation))*originalLabelWidth + 3; + } + } + else{ + this.xLabelWidth = 0; + this.xScalePaddingRight = this.padding; + this.xScalePaddingLeft = this.padding; + } + + }, + // Needs to be overidden in each Chart type + // Otherwise we need to pass all the data into the scale class + calculateYRange: noop, + drawingArea: function(){ + return this.startPoint - this.endPoint; + }, + calculateY : function(value){ + var scalingFactor = this.drawingArea() / (this.min - this.max); + return this.endPoint - (scalingFactor * (value - this.min)); + }, + calculateX : function(index){ + var isRotated = (this.xLabelRotation > 0), + // innerWidth = (this.offsetGridLines) ? this.width - offsetLeft - this.padding : this.width - (offsetLeft + halfLabelWidth * 2) - this.padding, + innerWidth = this.width - (this.xScalePaddingLeft + this.xScalePaddingRight), + valueWidth = innerWidth/Math.max((this.valuesCount - ((this.offsetGridLines) ? 0 : 1)), 1), + valueOffset = (valueWidth * index) + this.xScalePaddingLeft; + + if (this.offsetGridLines){ + valueOffset += (valueWidth/2); + } + + return Math.round(valueOffset); + }, + update : function(newProps){ + helpers.extend(this, newProps); + this.fit(); + }, + draw : function(){ + var ctx = this.ctx, + yLabelGap = (this.endPoint - this.startPoint) / this.steps, + xStart = Math.round(this.xScalePaddingLeft); + if (this.display){ + ctx.fillStyle = this.textColor; + ctx.font = this.font; + each(this.yLabels,function(labelString,index){ + var yLabelCenter = this.endPoint - (yLabelGap * index), + linePositionY = Math.round(yLabelCenter), + drawHorizontalLine = this.showHorizontalLines; + + ctx.textAlign = "right"; + ctx.textBaseline = "middle"; + if (this.showLabels){ + ctx.fillText(labelString,xStart - 10,yLabelCenter); + } + + // This is X axis, so draw it + if (index === 0 && !drawHorizontalLine){ + drawHorizontalLine = true; + } + + if (drawHorizontalLine){ + ctx.beginPath(); + } + + if (index > 0){ + // This is a grid line in the centre, so drop that + ctx.lineWidth = this.gridLineWidth; + ctx.strokeStyle = this.gridLineColor; + } else { + // This is the first line on the scale + ctx.lineWidth = this.lineWidth; + ctx.strokeStyle = this.lineColor; + } + + linePositionY += helpers.aliasPixel(ctx.lineWidth); + + if(drawHorizontalLine){ + ctx.moveTo(xStart, linePositionY); + ctx.lineTo(this.width, linePositionY); + ctx.stroke(); + ctx.closePath(); + } + + ctx.lineWidth = this.lineWidth; + ctx.strokeStyle = this.lineColor; + ctx.beginPath(); + ctx.moveTo(xStart - 5, linePositionY); + ctx.lineTo(xStart, linePositionY); + ctx.stroke(); + ctx.closePath(); + + },this); + + each(this.xLabels,function(label,index){ + var xPos = this.calculateX(index) + aliasPixel(this.lineWidth), + // Check to see if line/bar here and decide where to place the line + linePos = this.calculateX(index - (this.offsetGridLines ? 0.5 : 0)) + aliasPixel(this.lineWidth), + isRotated = (this.xLabelRotation > 0), + drawVerticalLine = this.showVerticalLines; + + // This is Y axis, so draw it + if (index === 0 && !drawVerticalLine){ + drawVerticalLine = true; + } + + if (drawVerticalLine){ + ctx.beginPath(); + } + + if (index > 0){ + // This is a grid line in the centre, so drop that + ctx.lineWidth = this.gridLineWidth; + ctx.strokeStyle = this.gridLineColor; + } else { + // This is the first line on the scale + ctx.lineWidth = this.lineWidth; + ctx.strokeStyle = this.lineColor; + } + + if (drawVerticalLine){ + ctx.moveTo(linePos,this.endPoint); + ctx.lineTo(linePos,this.startPoint - 3); + ctx.stroke(); + ctx.closePath(); + } + + + ctx.lineWidth = this.lineWidth; + ctx.strokeStyle = this.lineColor; + + + // Small lines at the bottom of the base grid line + ctx.beginPath(); + ctx.moveTo(linePos,this.endPoint); + ctx.lineTo(linePos,this.endPoint + 5); + ctx.stroke(); + ctx.closePath(); + + ctx.save(); + ctx.translate(xPos,(isRotated) ? this.endPoint + 12 : this.endPoint + 8); + ctx.rotate(toRadians(this.xLabelRotation)*-1); + ctx.font = this.font; + ctx.textAlign = (isRotated) ? "right" : "center"; + ctx.textBaseline = (isRotated) ? "middle" : "top"; + ctx.fillText(label, 0, 0); + ctx.restore(); + },this); + + } + } + + }); + + Chart.RadialScale = Chart.Element.extend({ + initialize: function(){ + this.size = min([this.height, this.width]); + this.drawingArea = (this.display) ? (this.size/2) - (this.fontSize/2 + this.backdropPaddingY) : (this.size/2); + }, + calculateCenterOffset: function(value){ + // Take into account half font size + the yPadding of the top value + var scalingFactor = this.drawingArea / (this.max - this.min); + + return (value - this.min) * scalingFactor; + }, + update : function(){ + if (!this.lineArc){ + this.setScaleSize(); + } else { + this.drawingArea = (this.display) ? (this.size/2) - (this.fontSize/2 + this.backdropPaddingY) : (this.size/2); + } + this.buildYLabels(); + }, + buildYLabels: function(){ + this.yLabels = []; + + var stepDecimalPlaces = getDecimalPlaces(this.stepValue); + + for (var i=0; i<=this.steps; i++){ + this.yLabels.push(template(this.templateString,{value:(this.min + (i * this.stepValue)).toFixed(stepDecimalPlaces)})); + } + }, + getCircumference : function(){ + return ((Math.PI*2) / this.valuesCount); + }, + setScaleSize: function(){ + /* + * Right, this is really confusing and there is a lot of maths going on here + * The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9 + * + * Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif + * + * Solution: + * + * We assume the radius of the polygon is half the size of the canvas at first + * at each index we check if the text overlaps. + * + * Where it does, we store that angle and that index. + * + * After finding the largest index and angle we calculate how much we need to remove + * from the shape radius to move the point inwards by that x. + * + * We average the left and right distances to get the maximum shape radius that can fit in the box + * along with labels. + * + * Once we have that, we can find the centre point for the chart, by taking the x text protrusion + * on each side, removing that from the size, halving it and adding the left x protrusion width. + * + * This will mean we have a shape fitted to the canvas, as large as it can be with the labels + * and position it in the most space efficient manner + * + * https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif + */ + + + // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width. + // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points + var largestPossibleRadius = min([(this.height/2 - this.pointLabelFontSize - 5), this.width/2]), + pointPosition, + i, + textWidth, + halfTextWidth, + furthestRight = this.width, + furthestRightIndex, + furthestRightAngle, + furthestLeft = 0, + furthestLeftIndex, + furthestLeftAngle, + xProtrusionLeft, + xProtrusionRight, + radiusReductionRight, + radiusReductionLeft, + maxWidthRadius; + this.ctx.font = fontString(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily); + for (i=0;i furthestRight) { + furthestRight = pointPosition.x + halfTextWidth; + furthestRightIndex = i; + } + if (pointPosition.x - halfTextWidth < furthestLeft) { + furthestLeft = pointPosition.x - halfTextWidth; + furthestLeftIndex = i; + } + } + else if (i < this.valuesCount/2) { + // Less than half the values means we'll left align the text + if (pointPosition.x + textWidth > furthestRight) { + furthestRight = pointPosition.x + textWidth; + furthestRightIndex = i; + } + } + else if (i > this.valuesCount/2){ + // More than half the values means we'll right align the text + if (pointPosition.x - textWidth < furthestLeft) { + furthestLeft = pointPosition.x - textWidth; + furthestLeftIndex = i; + } + } + } + + xProtrusionLeft = furthestLeft; + + xProtrusionRight = Math.ceil(furthestRight - this.width); + + furthestRightAngle = this.getIndexAngle(furthestRightIndex); + + furthestLeftAngle = this.getIndexAngle(furthestLeftIndex); + + radiusReductionRight = xProtrusionRight / Math.sin(furthestRightAngle + Math.PI/2); + + radiusReductionLeft = xProtrusionLeft / Math.sin(furthestLeftAngle + Math.PI/2); + + // Ensure we actually need to reduce the size of the chart + radiusReductionRight = (isNumber(radiusReductionRight)) ? radiusReductionRight : 0; + radiusReductionLeft = (isNumber(radiusReductionLeft)) ? radiusReductionLeft : 0; + + this.drawingArea = largestPossibleRadius - (radiusReductionLeft + radiusReductionRight)/2; + + //this.drawingArea = min([maxWidthRadius, (this.height - (2 * (this.pointLabelFontSize + 5)))/2]) + this.setCenterPoint(radiusReductionLeft, radiusReductionRight); + + }, + setCenterPoint: function(leftMovement, rightMovement){ + + var maxRight = this.width - rightMovement - this.drawingArea, + maxLeft = leftMovement + this.drawingArea; + + this.xCenter = (maxLeft + maxRight)/2; + // Always vertically in the centre as the text height doesn't change + this.yCenter = (this.height/2); + }, + + getIndexAngle : function(index){ + var angleMultiplier = (Math.PI * 2) / this.valuesCount; + // Start from the top instead of right, so remove a quarter of the circle + + return index * angleMultiplier - (Math.PI/2); + }, + getPointPosition : function(index, distanceFromCenter){ + var thisAngle = this.getIndexAngle(index); + return { + x : (Math.cos(thisAngle) * distanceFromCenter) + this.xCenter, + y : (Math.sin(thisAngle) * distanceFromCenter) + this.yCenter + }; + }, + draw: function(){ + if (this.display){ + var ctx = this.ctx; + each(this.yLabels, function(label, index){ + // Don't draw a centre value + if (index > 0){ + var yCenterOffset = index * (this.drawingArea/this.steps), + yHeight = this.yCenter - yCenterOffset, + pointPosition; + + // Draw circular lines around the scale + if (this.lineWidth > 0){ + ctx.strokeStyle = this.lineColor; + ctx.lineWidth = this.lineWidth; + + if(this.lineArc){ + ctx.beginPath(); + ctx.arc(this.xCenter, this.yCenter, yCenterOffset, 0, Math.PI*2); + ctx.closePath(); + ctx.stroke(); + } else{ + ctx.beginPath(); + for (var i=0;i= 0; i--) { + if (this.angleLineWidth > 0){ + var outerPosition = this.getPointPosition(i, this.calculateCenterOffset(this.max)); + ctx.beginPath(); + ctx.moveTo(this.xCenter, this.yCenter); + ctx.lineTo(outerPosition.x, outerPosition.y); + ctx.stroke(); + ctx.closePath(); + } + // Extra 3px out for some label spacing + var pointLabelPosition = this.getPointPosition(i, this.calculateCenterOffset(this.max) + 5); + ctx.font = fontString(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily); + ctx.fillStyle = this.pointLabelFontColor; + + var labelsCount = this.labels.length, + halfLabelsCount = this.labels.length/2, + quarterLabelsCount = halfLabelsCount/2, + upperHalf = (i < quarterLabelsCount || i > labelsCount - quarterLabelsCount), + exactQuarter = (i === quarterLabelsCount || i === labelsCount - quarterLabelsCount); + if (i === 0){ + ctx.textAlign = 'center'; + } else if(i === halfLabelsCount){ + ctx.textAlign = 'center'; + } else if (i < halfLabelsCount){ + ctx.textAlign = 'left'; + } else { + ctx.textAlign = 'right'; + } + + // Set the correct text baseline based on outer positioning + if (exactQuarter){ + ctx.textBaseline = 'middle'; + } else if (upperHalf){ + ctx.textBaseline = 'bottom'; + } else { + ctx.textBaseline = 'top'; + } + + ctx.fillText(this.labels[i], pointLabelPosition.x, pointLabelPosition.y); + } + } + } + } + }); + + // Attach global event to resize each chart instance when the browser resizes + helpers.addEvent(window, "resize", (function(){ + // Basic debounce of resize function so it doesn't hurt performance when resizing browser. + var timeout; + return function(){ + clearTimeout(timeout); + timeout = setTimeout(function(){ + each(Chart.instances,function(instance){ + // If the responsive flag is set in the chart instance config + // Cascade the resize event down to the chart. + if (instance.options.responsive){ + instance.resize(instance.render, true); + } + }); + }, 50); + }; + })()); + + + if (amd) { + define(function(){ + return Chart; + }); + } else if (typeof module === 'object' && module.exports) { + module.exports = Chart; + } + + root.Chart = Chart; + + Chart.noConflict = function(){ + root.Chart = previous; + return Chart; + }; + +}).call(this); diff --git a/public/bower_components/Chart.js/src/Chart.Doughnut.js b/public/bower_components/Chart.js/src/Chart.Doughnut.js new file mode 100755 index 0000000..a892b0e --- /dev/null +++ b/public/bower_components/Chart.js/src/Chart.Doughnut.js @@ -0,0 +1,184 @@ +(function(){ + "use strict"; + + var root = this, + Chart = root.Chart, + //Cache a local reference to Chart.helpers + helpers = Chart.helpers; + + var defaultConfig = { + //Boolean - Whether we should show a stroke on each segment + segmentShowStroke : true, + + //String - The colour of each segment stroke + segmentStrokeColor : "#fff", + + //Number - The width of each segment stroke + segmentStrokeWidth : 2, + + //The percentage of the chart that we cut out of the middle. + percentageInnerCutout : 50, + + //Number - Amount of animation steps + animationSteps : 100, + + //String - Animation easing effect + animationEasing : "easeOutBounce", + + //Boolean - Whether we animate the rotation of the Doughnut + animateRotate : true, + + //Boolean - Whether we animate scaling the Doughnut from the centre + animateScale : false, + + //String - A legend template + legendTemplate : "
      -legend\"><% for (var i=0; i
    • \"><%if(segments[i].label){%><%=segments[i].label%><%}%>
    • <%}%>
    " + + }; + + + Chart.Type.extend({ + //Passing in a name registers this chart in the Chart namespace + name: "Doughnut", + //Providing a defaults will also register the deafults in the chart namespace + defaults : defaultConfig, + //Initialize is fired when the chart is initialized - Data is passed in as a parameter + //Config is automatically merged by the core of Chart.js, and is available at this.options + initialize: function(data){ + + //Declare segments as a static property to prevent inheriting across the Chart type prototype + this.segments = []; + this.outerRadius = (helpers.min([this.chart.width,this.chart.height]) - this.options.segmentStrokeWidth/2)/2; + + this.SegmentArc = Chart.Arc.extend({ + ctx : this.chart.ctx, + x : this.chart.width/2, + y : this.chart.height/2 + }); + + //Set up tooltip events on the chart + if (this.options.showTooltips){ + helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ + var activeSegments = (evt.type !== 'mouseout') ? this.getSegmentsAtEvent(evt) : []; + + helpers.each(this.segments,function(segment){ + segment.restore(["fillColor"]); + }); + helpers.each(activeSegments,function(activeSegment){ + activeSegment.fillColor = activeSegment.highlightColor; + }); + this.showTooltip(activeSegments); + }); + } + this.calculateTotal(data); + + helpers.each(data,function(datapoint, index){ + this.addData(datapoint, index, true); + },this); + + this.render(); + }, + getSegmentsAtEvent : function(e){ + var segmentsArray = []; + + var location = helpers.getRelativePosition(e); + + helpers.each(this.segments,function(segment){ + if (segment.inRange(location.x,location.y)) segmentsArray.push(segment); + },this); + return segmentsArray; + }, + addData : function(segment, atIndex, silent){ + var index = atIndex || this.segments.length; + this.segments.splice(index, 0, new this.SegmentArc({ + value : segment.value, + outerRadius : (this.options.animateScale) ? 0 : this.outerRadius, + innerRadius : (this.options.animateScale) ? 0 : (this.outerRadius/100) * this.options.percentageInnerCutout, + fillColor : segment.color, + highlightColor : segment.highlight || segment.color, + showStroke : this.options.segmentShowStroke, + strokeWidth : this.options.segmentStrokeWidth, + strokeColor : this.options.segmentStrokeColor, + startAngle : Math.PI * 1.5, + circumference : (this.options.animateRotate) ? 0 : this.calculateCircumference(segment.value), + label : segment.label + })); + if (!silent){ + this.reflow(); + this.update(); + } + }, + calculateCircumference : function(value){ + return (Math.PI*2)*(Math.abs(value) / this.total); + }, + calculateTotal : function(data){ + this.total = 0; + helpers.each(data,function(segment){ + this.total += Math.abs(segment.value); + },this); + }, + update : function(){ + this.calculateTotal(this.segments); + + // Reset any highlight colours before updating. + helpers.each(this.activeElements, function(activeElement){ + activeElement.restore(['fillColor']); + }); + + helpers.each(this.segments,function(segment){ + segment.save(); + }); + this.render(); + }, + + removeData: function(atIndex){ + var indexToDelete = (helpers.isNumber(atIndex)) ? atIndex : this.segments.length-1; + this.segments.splice(indexToDelete, 1); + this.reflow(); + this.update(); + }, + + reflow : function(){ + helpers.extend(this.SegmentArc.prototype,{ + x : this.chart.width/2, + y : this.chart.height/2 + }); + this.outerRadius = (helpers.min([this.chart.width,this.chart.height]) - this.options.segmentStrokeWidth/2)/2; + helpers.each(this.segments, function(segment){ + segment.update({ + outerRadius : this.outerRadius, + innerRadius : (this.outerRadius/100) * this.options.percentageInnerCutout + }); + }, this); + }, + draw : function(easeDecimal){ + var animDecimal = (easeDecimal) ? easeDecimal : 1; + this.clear(); + helpers.each(this.segments,function(segment,index){ + segment.transition({ + circumference : this.calculateCircumference(segment.value), + outerRadius : this.outerRadius, + innerRadius : (this.outerRadius/100) * this.options.percentageInnerCutout + },animDecimal); + + segment.endAngle = segment.startAngle + segment.circumference; + + segment.draw(); + if (index === 0){ + segment.startAngle = Math.PI * 1.5; + } + //Check to see if it's the last segment, if not get the next and update the start angle + if (index < this.segments.length-1){ + this.segments[index+1].startAngle = segment.endAngle; + } + },this); + + } + }); + + Chart.types.Doughnut.extend({ + name : "Pie", + defaults : helpers.merge(defaultConfig,{percentageInnerCutout : 0}) + }); + +}).call(this); \ No newline at end of file diff --git a/public/bower_components/Chart.js/src/Chart.Line.js b/public/bower_components/Chart.js/src/Chart.Line.js new file mode 100755 index 0000000..34ad85b --- /dev/null +++ b/public/bower_components/Chart.js/src/Chart.Line.js @@ -0,0 +1,374 @@ +(function(){ + "use strict"; + + var root = this, + Chart = root.Chart, + helpers = Chart.helpers; + + var defaultConfig = { + + ///Boolean - Whether grid lines are shown across the chart + scaleShowGridLines : true, + + //String - Colour of the grid lines + scaleGridLineColor : "rgba(0,0,0,.05)", + + //Number - Width of the grid lines + scaleGridLineWidth : 1, + + //Boolean - Whether to show horizontal lines (except X axis) + scaleShowHorizontalLines: true, + + //Boolean - Whether to show vertical lines (except Y axis) + scaleShowVerticalLines: true, + + //Boolean - Whether the line is curved between points + bezierCurve : true, + + //Number - Tension of the bezier curve between points + bezierCurveTension : 0.4, + + //Boolean - Whether to show a dot for each point + pointDot : true, + + //Number - Radius of each point dot in pixels + pointDotRadius : 4, + + //Number - Pixel width of point dot stroke + pointDotStrokeWidth : 1, + + //Number - amount extra to add to the radius to cater for hit detection outside the drawn point + pointHitDetectionRadius : 20, + + //Boolean - Whether to show a stroke for datasets + datasetStroke : true, + + //Number - Pixel width of dataset stroke + datasetStrokeWidth : 2, + + //Boolean - Whether to fill the dataset with a colour + datasetFill : true, + + //String - A legend template + legendTemplate : "
      -legend\"><% for (var i=0; i
    • \"><%if(datasets[i].label){%><%=datasets[i].label%><%}%>
    • <%}%>
    " + + }; + + + Chart.Type.extend({ + name: "Line", + defaults : defaultConfig, + initialize: function(data){ + //Declare the extension of the default point, to cater for the options passed in to the constructor + this.PointClass = Chart.Point.extend({ + strokeWidth : this.options.pointDotStrokeWidth, + radius : this.options.pointDotRadius, + display: this.options.pointDot, + hitDetectionRadius : this.options.pointHitDetectionRadius, + ctx : this.chart.ctx, + inRange : function(mouseX){ + return (Math.pow(mouseX-this.x, 2) < Math.pow(this.radius + this.hitDetectionRadius,2)); + } + }); + + this.datasets = []; + + //Set up tooltip events on the chart + if (this.options.showTooltips){ + helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ + var activePoints = (evt.type !== 'mouseout') ? this.getPointsAtEvent(evt) : []; + this.eachPoints(function(point){ + point.restore(['fillColor', 'strokeColor']); + }); + helpers.each(activePoints, function(activePoint){ + activePoint.fillColor = activePoint.highlightFill; + activePoint.strokeColor = activePoint.highlightStroke; + }); + this.showTooltip(activePoints); + }); + } + + //Iterate through each of the datasets, and build this into a property of the chart + helpers.each(data.datasets,function(dataset){ + + var datasetObject = { + label : dataset.label || null, + fillColor : dataset.fillColor, + strokeColor : dataset.strokeColor, + pointColor : dataset.pointColor, + pointStrokeColor : dataset.pointStrokeColor, + points : [] + }; + + this.datasets.push(datasetObject); + + + helpers.each(dataset.data,function(dataPoint,index){ + //Add a new point for each piece of data, passing any required data to draw. + datasetObject.points.push(new this.PointClass({ + value : dataPoint, + label : data.labels[index], + datasetLabel: dataset.label, + strokeColor : dataset.pointStrokeColor, + fillColor : dataset.pointColor, + highlightFill : dataset.pointHighlightFill || dataset.pointColor, + highlightStroke : dataset.pointHighlightStroke || dataset.pointStrokeColor + })); + },this); + + this.buildScale(data.labels); + + + this.eachPoints(function(point, index){ + helpers.extend(point, { + x: this.scale.calculateX(index), + y: this.scale.endPoint + }); + point.save(); + }, this); + + },this); + + + this.render(); + }, + update : function(){ + this.scale.update(); + // Reset any highlight colours before updating. + helpers.each(this.activeElements, function(activeElement){ + activeElement.restore(['fillColor', 'strokeColor']); + }); + this.eachPoints(function(point){ + point.save(); + }); + this.render(); + }, + eachPoints : function(callback){ + helpers.each(this.datasets,function(dataset){ + helpers.each(dataset.points,callback,this); + },this); + }, + getPointsAtEvent : function(e){ + var pointsArray = [], + eventPosition = helpers.getRelativePosition(e); + helpers.each(this.datasets,function(dataset){ + helpers.each(dataset.points,function(point){ + if (point.inRange(eventPosition.x,eventPosition.y)) pointsArray.push(point); + }); + },this); + return pointsArray; + }, + buildScale : function(labels){ + var self = this; + + var dataTotal = function(){ + var values = []; + self.eachPoints(function(point){ + values.push(point.value); + }); + + return values; + }; + + var scaleOptions = { + templateString : this.options.scaleLabel, + height : this.chart.height, + width : this.chart.width, + ctx : this.chart.ctx, + textColor : this.options.scaleFontColor, + fontSize : this.options.scaleFontSize, + fontStyle : this.options.scaleFontStyle, + fontFamily : this.options.scaleFontFamily, + valuesCount : labels.length, + beginAtZero : this.options.scaleBeginAtZero, + integersOnly : this.options.scaleIntegersOnly, + calculateYRange : function(currentHeight){ + var updatedRanges = helpers.calculateScaleRange( + dataTotal(), + currentHeight, + this.fontSize, + this.beginAtZero, + this.integersOnly + ); + helpers.extend(this, updatedRanges); + }, + xLabels : labels, + font : helpers.fontString(this.options.scaleFontSize, this.options.scaleFontStyle, this.options.scaleFontFamily), + lineWidth : this.options.scaleLineWidth, + lineColor : this.options.scaleLineColor, + showHorizontalLines : this.options.scaleShowHorizontalLines, + showVerticalLines : this.options.scaleShowVerticalLines, + gridLineWidth : (this.options.scaleShowGridLines) ? this.options.scaleGridLineWidth : 0, + gridLineColor : (this.options.scaleShowGridLines) ? this.options.scaleGridLineColor : "rgba(0,0,0,0)", + padding: (this.options.showScale) ? 0 : this.options.pointDotRadius + this.options.pointDotStrokeWidth, + showLabels : this.options.scaleShowLabels, + display : this.options.showScale + }; + + if (this.options.scaleOverride){ + helpers.extend(scaleOptions, { + calculateYRange: helpers.noop, + steps: this.options.scaleSteps, + stepValue: this.options.scaleStepWidth, + min: this.options.scaleStartValue, + max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth) + }); + } + + + this.scale = new Chart.Scale(scaleOptions); + }, + addData : function(valuesArray,label){ + //Map the values array for each of the datasets + + helpers.each(valuesArray,function(value,datasetIndex){ + //Add a new point for each piece of data, passing any required data to draw. + this.datasets[datasetIndex].points.push(new this.PointClass({ + value : value, + label : label, + x: this.scale.calculateX(this.scale.valuesCount+1), + y: this.scale.endPoint, + strokeColor : this.datasets[datasetIndex].pointStrokeColor, + fillColor : this.datasets[datasetIndex].pointColor + })); + },this); + + this.scale.addXLabel(label); + //Then re-render the chart. + this.update(); + }, + removeData : function(){ + this.scale.removeXLabel(); + //Then re-render the chart. + helpers.each(this.datasets,function(dataset){ + dataset.points.shift(); + },this); + this.update(); + }, + reflow : function(){ + var newScaleProps = helpers.extend({ + height : this.chart.height, + width : this.chart.width + }); + this.scale.update(newScaleProps); + }, + draw : function(ease){ + var easingDecimal = ease || 1; + this.clear(); + + var ctx = this.chart.ctx; + + // Some helper methods for getting the next/prev points + var hasValue = function(item){ + return item.value !== null; + }, + nextPoint = function(point, collection, index){ + return helpers.findNextWhere(collection, hasValue, index) || point; + }, + previousPoint = function(point, collection, index){ + return helpers.findPreviousWhere(collection, hasValue, index) || point; + }; + + this.scale.draw(easingDecimal); + + + helpers.each(this.datasets,function(dataset){ + var pointsWithValues = helpers.where(dataset.points, hasValue); + + //Transition each point first so that the line and point drawing isn't out of sync + //We can use this extra loop to calculate the control points of this dataset also in this loop + + helpers.each(dataset.points, function(point, index){ + if (point.hasValue()){ + point.transition({ + y : this.scale.calculateY(point.value), + x : this.scale.calculateX(index) + }, easingDecimal); + } + },this); + + + // Control points need to be calculated in a seperate loop, because we need to know the current x/y of the point + // This would cause issues when there is no animation, because the y of the next point would be 0, so beziers would be skewed + if (this.options.bezierCurve){ + helpers.each(pointsWithValues, function(point, index){ + var tension = (index > 0 && index < pointsWithValues.length - 1) ? this.options.bezierCurveTension : 0; + point.controlPoints = helpers.splineCurve( + previousPoint(point, pointsWithValues, index), + point, + nextPoint(point, pointsWithValues, index), + tension + ); + + // Prevent the bezier going outside of the bounds of the graph + + // Cap puter bezier handles to the upper/lower scale bounds + if (point.controlPoints.outer.y > this.scale.endPoint){ + point.controlPoints.outer.y = this.scale.endPoint; + } + else if (point.controlPoints.outer.y < this.scale.startPoint){ + point.controlPoints.outer.y = this.scale.startPoint; + } + + // Cap inner bezier handles to the upper/lower scale bounds + if (point.controlPoints.inner.y > this.scale.endPoint){ + point.controlPoints.inner.y = this.scale.endPoint; + } + else if (point.controlPoints.inner.y < this.scale.startPoint){ + point.controlPoints.inner.y = this.scale.startPoint; + } + },this); + } + + + //Draw the line between all the points + ctx.lineWidth = this.options.datasetStrokeWidth; + ctx.strokeStyle = dataset.strokeColor; + ctx.beginPath(); + + helpers.each(pointsWithValues, function(point, index){ + if (index === 0){ + ctx.moveTo(point.x, point.y); + } + else{ + if(this.options.bezierCurve){ + var previous = previousPoint(point, pointsWithValues, index); + + ctx.bezierCurveTo( + previous.controlPoints.outer.x, + previous.controlPoints.outer.y, + point.controlPoints.inner.x, + point.controlPoints.inner.y, + point.x, + point.y + ); + } + else{ + ctx.lineTo(point.x,point.y); + } + } + }, this); + + ctx.stroke(); + + if (this.options.datasetFill && pointsWithValues.length > 0){ + //Round off the line by going to the base of the chart, back to the start, then fill. + ctx.lineTo(pointsWithValues[pointsWithValues.length - 1].x, this.scale.endPoint); + ctx.lineTo(pointsWithValues[0].x, this.scale.endPoint); + ctx.fillStyle = dataset.fillColor; + ctx.closePath(); + ctx.fill(); + } + + //Now draw the points over the line + //A little inefficient double looping, but better than the line + //lagging behind the point positions + helpers.each(pointsWithValues,function(point){ + point.draw(); + }); + },this); + } + }); + + +}).call(this); diff --git a/public/bower_components/Chart.js/src/Chart.PolarArea.js b/public/bower_components/Chart.js/src/Chart.PolarArea.js new file mode 100755 index 0000000..8f2b9c5 --- /dev/null +++ b/public/bower_components/Chart.js/src/Chart.PolarArea.js @@ -0,0 +1,250 @@ +(function(){ + "use strict"; + + var root = this, + Chart = root.Chart, + //Cache a local reference to Chart.helpers + helpers = Chart.helpers; + + var defaultConfig = { + //Boolean - Show a backdrop to the scale label + scaleShowLabelBackdrop : true, + + //String - The colour of the label backdrop + scaleBackdropColor : "rgba(255,255,255,0.75)", + + // Boolean - Whether the scale should begin at zero + scaleBeginAtZero : true, + + //Number - The backdrop padding above & below the label in pixels + scaleBackdropPaddingY : 2, + + //Number - The backdrop padding to the side of the label in pixels + scaleBackdropPaddingX : 2, + + //Boolean - Show line for each value in the scale + scaleShowLine : true, + + //Boolean - Stroke a line around each segment in the chart + segmentShowStroke : true, + + //String - The colour of the stroke on each segement. + segmentStrokeColor : "#fff", + + //Number - The width of the stroke value in pixels + segmentStrokeWidth : 2, + + //Number - Amount of animation steps + animationSteps : 100, + + //String - Animation easing effect. + animationEasing : "easeOutBounce", + + //Boolean - Whether to animate the rotation of the chart + animateRotate : true, + + //Boolean - Whether to animate scaling the chart from the centre + animateScale : false, + + //String - A legend template + legendTemplate : "
      -legend\"><% for (var i=0; i
    • \"><%if(segments[i].label){%><%=segments[i].label%><%}%>
    • <%}%>
    " + }; + + + Chart.Type.extend({ + //Passing in a name registers this chart in the Chart namespace + name: "PolarArea", + //Providing a defaults will also register the deafults in the chart namespace + defaults : defaultConfig, + //Initialize is fired when the chart is initialized - Data is passed in as a parameter + //Config is automatically merged by the core of Chart.js, and is available at this.options + initialize: function(data){ + this.segments = []; + //Declare segment class as a chart instance specific class, so it can share props for this instance + this.SegmentArc = Chart.Arc.extend({ + showStroke : this.options.segmentShowStroke, + strokeWidth : this.options.segmentStrokeWidth, + strokeColor : this.options.segmentStrokeColor, + ctx : this.chart.ctx, + innerRadius : 0, + x : this.chart.width/2, + y : this.chart.height/2 + }); + this.scale = new Chart.RadialScale({ + display: this.options.showScale, + fontStyle: this.options.scaleFontStyle, + fontSize: this.options.scaleFontSize, + fontFamily: this.options.scaleFontFamily, + fontColor: this.options.scaleFontColor, + showLabels: this.options.scaleShowLabels, + showLabelBackdrop: this.options.scaleShowLabelBackdrop, + backdropColor: this.options.scaleBackdropColor, + backdropPaddingY : this.options.scaleBackdropPaddingY, + backdropPaddingX: this.options.scaleBackdropPaddingX, + lineWidth: (this.options.scaleShowLine) ? this.options.scaleLineWidth : 0, + lineColor: this.options.scaleLineColor, + lineArc: true, + width: this.chart.width, + height: this.chart.height, + xCenter: this.chart.width/2, + yCenter: this.chart.height/2, + ctx : this.chart.ctx, + templateString: this.options.scaleLabel, + valuesCount: data.length + }); + + this.updateScaleRange(data); + + this.scale.update(); + + helpers.each(data,function(segment,index){ + this.addData(segment,index,true); + },this); + + //Set up tooltip events on the chart + if (this.options.showTooltips){ + helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ + var activeSegments = (evt.type !== 'mouseout') ? this.getSegmentsAtEvent(evt) : []; + helpers.each(this.segments,function(segment){ + segment.restore(["fillColor"]); + }); + helpers.each(activeSegments,function(activeSegment){ + activeSegment.fillColor = activeSegment.highlightColor; + }); + this.showTooltip(activeSegments); + }); + } + + this.render(); + }, + getSegmentsAtEvent : function(e){ + var segmentsArray = []; + + var location = helpers.getRelativePosition(e); + + helpers.each(this.segments,function(segment){ + if (segment.inRange(location.x,location.y)) segmentsArray.push(segment); + },this); + return segmentsArray; + }, + addData : function(segment, atIndex, silent){ + var index = atIndex || this.segments.length; + + this.segments.splice(index, 0, new this.SegmentArc({ + fillColor: segment.color, + highlightColor: segment.highlight || segment.color, + label: segment.label, + value: segment.value, + outerRadius: (this.options.animateScale) ? 0 : this.scale.calculateCenterOffset(segment.value), + circumference: (this.options.animateRotate) ? 0 : this.scale.getCircumference(), + startAngle: Math.PI * 1.5 + })); + if (!silent){ + this.reflow(); + this.update(); + } + }, + removeData: function(atIndex){ + var indexToDelete = (helpers.isNumber(atIndex)) ? atIndex : this.segments.length-1; + this.segments.splice(indexToDelete, 1); + this.reflow(); + this.update(); + }, + calculateTotal: function(data){ + this.total = 0; + helpers.each(data,function(segment){ + this.total += segment.value; + },this); + this.scale.valuesCount = this.segments.length; + }, + updateScaleRange: function(datapoints){ + var valuesArray = []; + helpers.each(datapoints,function(segment){ + valuesArray.push(segment.value); + }); + + var scaleSizes = (this.options.scaleOverride) ? + { + steps: this.options.scaleSteps, + stepValue: this.options.scaleStepWidth, + min: this.options.scaleStartValue, + max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth) + } : + helpers.calculateScaleRange( + valuesArray, + helpers.min([this.chart.width, this.chart.height])/2, + this.options.scaleFontSize, + this.options.scaleBeginAtZero, + this.options.scaleIntegersOnly + ); + + helpers.extend( + this.scale, + scaleSizes, + { + size: helpers.min([this.chart.width, this.chart.height]), + xCenter: this.chart.width/2, + yCenter: this.chart.height/2 + } + ); + + }, + update : function(){ + this.calculateTotal(this.segments); + + helpers.each(this.segments,function(segment){ + segment.save(); + }); + + this.reflow(); + this.render(); + }, + reflow : function(){ + helpers.extend(this.SegmentArc.prototype,{ + x : this.chart.width/2, + y : this.chart.height/2 + }); + this.updateScaleRange(this.segments); + this.scale.update(); + + helpers.extend(this.scale,{ + xCenter: this.chart.width/2, + yCenter: this.chart.height/2 + }); + + helpers.each(this.segments, function(segment){ + segment.update({ + outerRadius : this.scale.calculateCenterOffset(segment.value) + }); + }, this); + + }, + draw : function(ease){ + var easingDecimal = ease || 1; + //Clear & draw the canvas + this.clear(); + helpers.each(this.segments,function(segment, index){ + segment.transition({ + circumference : this.scale.getCircumference(), + outerRadius : this.scale.calculateCenterOffset(segment.value) + },easingDecimal); + + segment.endAngle = segment.startAngle + segment.circumference; + + // If we've removed the first segment we need to set the first one to + // start at the top. + if (index === 0){ + segment.startAngle = Math.PI * 1.5; + } + + //Check to see if it's the last segment, if not get the next and update the start angle + if (index < this.segments.length - 1){ + this.segments[index+1].startAngle = segment.endAngle; + } + segment.draw(); + }, this); + this.scale.draw(); + } + }); + +}).call(this); \ No newline at end of file diff --git a/public/bower_components/Chart.js/src/Chart.Radar.js b/public/bower_components/Chart.js/src/Chart.Radar.js new file mode 100755 index 0000000..134fd2d --- /dev/null +++ b/public/bower_components/Chart.js/src/Chart.Radar.js @@ -0,0 +1,343 @@ +(function(){ + "use strict"; + + var root = this, + Chart = root.Chart, + helpers = Chart.helpers; + + + + Chart.Type.extend({ + name: "Radar", + defaults:{ + //Boolean - Whether to show lines for each scale point + scaleShowLine : true, + + //Boolean - Whether we show the angle lines out of the radar + angleShowLineOut : true, + + //Boolean - Whether to show labels on the scale + scaleShowLabels : false, + + // Boolean - Whether the scale should begin at zero + scaleBeginAtZero : true, + + //String - Colour of the angle line + angleLineColor : "rgba(0,0,0,.1)", + + //Number - Pixel width of the angle line + angleLineWidth : 1, + + //String - Point label font declaration + pointLabelFontFamily : "'Arial'", + + //String - Point label font weight + pointLabelFontStyle : "normal", + + //Number - Point label font size in pixels + pointLabelFontSize : 10, + + //String - Point label font colour + pointLabelFontColor : "#666", + + //Boolean - Whether to show a dot for each point + pointDot : true, + + //Number - Radius of each point dot in pixels + pointDotRadius : 3, + + //Number - Pixel width of point dot stroke + pointDotStrokeWidth : 1, + + //Number - amount extra to add to the radius to cater for hit detection outside the drawn point + pointHitDetectionRadius : 20, + + //Boolean - Whether to show a stroke for datasets + datasetStroke : true, + + //Number - Pixel width of dataset stroke + datasetStrokeWidth : 2, + + //Boolean - Whether to fill the dataset with a colour + datasetFill : true, + + //String - A legend template + legendTemplate : "
      -legend\"><% for (var i=0; i
    • \"><%if(datasets[i].label){%><%=datasets[i].label%><%}%>
    • <%}%>
    " + + }, + + initialize: function(data){ + this.PointClass = Chart.Point.extend({ + strokeWidth : this.options.pointDotStrokeWidth, + radius : this.options.pointDotRadius, + display: this.options.pointDot, + hitDetectionRadius : this.options.pointHitDetectionRadius, + ctx : this.chart.ctx + }); + + this.datasets = []; + + this.buildScale(data); + + //Set up tooltip events on the chart + if (this.options.showTooltips){ + helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ + var activePointsCollection = (evt.type !== 'mouseout') ? this.getPointsAtEvent(evt) : []; + + this.eachPoints(function(point){ + point.restore(['fillColor', 'strokeColor']); + }); + helpers.each(activePointsCollection, function(activePoint){ + activePoint.fillColor = activePoint.highlightFill; + activePoint.strokeColor = activePoint.highlightStroke; + }); + + this.showTooltip(activePointsCollection); + }); + } + + //Iterate through each of the datasets, and build this into a property of the chart + helpers.each(data.datasets,function(dataset){ + + var datasetObject = { + label: dataset.label || null, + fillColor : dataset.fillColor, + strokeColor : dataset.strokeColor, + pointColor : dataset.pointColor, + pointStrokeColor : dataset.pointStrokeColor, + points : [] + }; + + this.datasets.push(datasetObject); + + helpers.each(dataset.data,function(dataPoint,index){ + //Add a new point for each piece of data, passing any required data to draw. + var pointPosition; + if (!this.scale.animation){ + pointPosition = this.scale.getPointPosition(index, this.scale.calculateCenterOffset(dataPoint)); + } + datasetObject.points.push(new this.PointClass({ + value : dataPoint, + label : data.labels[index], + datasetLabel: dataset.label, + x: (this.options.animation) ? this.scale.xCenter : pointPosition.x, + y: (this.options.animation) ? this.scale.yCenter : pointPosition.y, + strokeColor : dataset.pointStrokeColor, + fillColor : dataset.pointColor, + highlightFill : dataset.pointHighlightFill || dataset.pointColor, + highlightStroke : dataset.pointHighlightStroke || dataset.pointStrokeColor + })); + },this); + + },this); + + this.render(); + }, + eachPoints : function(callback){ + helpers.each(this.datasets,function(dataset){ + helpers.each(dataset.points,callback,this); + },this); + }, + + getPointsAtEvent : function(evt){ + var mousePosition = helpers.getRelativePosition(evt), + fromCenter = helpers.getAngleFromPoint({ + x: this.scale.xCenter, + y: this.scale.yCenter + }, mousePosition); + + var anglePerIndex = (Math.PI * 2) /this.scale.valuesCount, + pointIndex = Math.round((fromCenter.angle - Math.PI * 1.5) / anglePerIndex), + activePointsCollection = []; + + // If we're at the top, make the pointIndex 0 to get the first of the array. + if (pointIndex >= this.scale.valuesCount || pointIndex < 0){ + pointIndex = 0; + } + + if (fromCenter.distance <= this.scale.drawingArea){ + helpers.each(this.datasets, function(dataset){ + activePointsCollection.push(dataset.points[pointIndex]); + }); + } + + return activePointsCollection; + }, + + buildScale : function(data){ + this.scale = new Chart.RadialScale({ + display: this.options.showScale, + fontStyle: this.options.scaleFontStyle, + fontSize: this.options.scaleFontSize, + fontFamily: this.options.scaleFontFamily, + fontColor: this.options.scaleFontColor, + showLabels: this.options.scaleShowLabels, + showLabelBackdrop: this.options.scaleShowLabelBackdrop, + backdropColor: this.options.scaleBackdropColor, + backdropPaddingY : this.options.scaleBackdropPaddingY, + backdropPaddingX: this.options.scaleBackdropPaddingX, + lineWidth: (this.options.scaleShowLine) ? this.options.scaleLineWidth : 0, + lineColor: this.options.scaleLineColor, + angleLineColor : this.options.angleLineColor, + angleLineWidth : (this.options.angleShowLineOut) ? this.options.angleLineWidth : 0, + // Point labels at the edge of each line + pointLabelFontColor : this.options.pointLabelFontColor, + pointLabelFontSize : this.options.pointLabelFontSize, + pointLabelFontFamily : this.options.pointLabelFontFamily, + pointLabelFontStyle : this.options.pointLabelFontStyle, + height : this.chart.height, + width: this.chart.width, + xCenter: this.chart.width/2, + yCenter: this.chart.height/2, + ctx : this.chart.ctx, + templateString: this.options.scaleLabel, + labels: data.labels, + valuesCount: data.datasets[0].data.length + }); + + this.scale.setScaleSize(); + this.updateScaleRange(data.datasets); + this.scale.buildYLabels(); + }, + updateScaleRange: function(datasets){ + var valuesArray = (function(){ + var totalDataArray = []; + helpers.each(datasets,function(dataset){ + if (dataset.data){ + totalDataArray = totalDataArray.concat(dataset.data); + } + else { + helpers.each(dataset.points, function(point){ + totalDataArray.push(point.value); + }); + } + }); + return totalDataArray; + })(); + + + var scaleSizes = (this.options.scaleOverride) ? + { + steps: this.options.scaleSteps, + stepValue: this.options.scaleStepWidth, + min: this.options.scaleStartValue, + max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth) + } : + helpers.calculateScaleRange( + valuesArray, + helpers.min([this.chart.width, this.chart.height])/2, + this.options.scaleFontSize, + this.options.scaleBeginAtZero, + this.options.scaleIntegersOnly + ); + + helpers.extend( + this.scale, + scaleSizes + ); + + }, + addData : function(valuesArray,label){ + //Map the values array for each of the datasets + this.scale.valuesCount++; + helpers.each(valuesArray,function(value,datasetIndex){ + var pointPosition = this.scale.getPointPosition(this.scale.valuesCount, this.scale.calculateCenterOffset(value)); + this.datasets[datasetIndex].points.push(new this.PointClass({ + value : value, + label : label, + x: pointPosition.x, + y: pointPosition.y, + strokeColor : this.datasets[datasetIndex].pointStrokeColor, + fillColor : this.datasets[datasetIndex].pointColor + })); + },this); + + this.scale.labels.push(label); + + this.reflow(); + + this.update(); + }, + removeData : function(){ + this.scale.valuesCount--; + this.scale.labels.shift(); + helpers.each(this.datasets,function(dataset){ + dataset.points.shift(); + },this); + this.reflow(); + this.update(); + }, + update : function(){ + this.eachPoints(function(point){ + point.save(); + }); + this.reflow(); + this.render(); + }, + reflow: function(){ + helpers.extend(this.scale, { + width : this.chart.width, + height: this.chart.height, + size : helpers.min([this.chart.width, this.chart.height]), + xCenter: this.chart.width/2, + yCenter: this.chart.height/2 + }); + this.updateScaleRange(this.datasets); + this.scale.setScaleSize(); + this.scale.buildYLabels(); + }, + draw : function(ease){ + var easeDecimal = ease || 1, + ctx = this.chart.ctx; + this.clear(); + this.scale.draw(); + + helpers.each(this.datasets,function(dataset){ + + //Transition each point first so that the line and point drawing isn't out of sync + helpers.each(dataset.points,function(point,index){ + if (point.hasValue()){ + point.transition(this.scale.getPointPosition(index, this.scale.calculateCenterOffset(point.value)), easeDecimal); + } + },this); + + + + //Draw the line between all the points + ctx.lineWidth = this.options.datasetStrokeWidth; + ctx.strokeStyle = dataset.strokeColor; + ctx.beginPath(); + helpers.each(dataset.points,function(point,index){ + if (index === 0){ + ctx.moveTo(point.x,point.y); + } + else{ + ctx.lineTo(point.x,point.y); + } + },this); + ctx.closePath(); + ctx.stroke(); + + ctx.fillStyle = dataset.fillColor; + ctx.fill(); + + //Now draw the points over the line + //A little inefficient double looping, but better than the line + //lagging behind the point positions + helpers.each(dataset.points,function(point){ + if (point.hasValue()){ + point.draw(); + } + }); + + },this); + + } + + }); + + + + + +}).call(this); \ No newline at end of file diff --git a/public/bower_components/PACE/.bower.json b/public/bower_components/PACE/.bower.json new file mode 100755 index 0000000..ef853fd --- /dev/null +++ b/public/bower_components/PACE/.bower.json @@ -0,0 +1,45 @@ +{ + "name": "PACE", + "main": "pace.js", + "version": "1.0.2", + "homepage": "http://github.hubspot.com/pace/docs/welcome", + "authors": [ + "Zack Bloom ", + "Adam Schwartz " + ], + "description": "Automatic page load progress bar", + "keywords": [ + "loading", + "load", + "pageload", + "progress", + "activity", + "ajax", + "spinner", + "progress", + "bar", + "automatic", + "client-side" + ], + "license": "MIT", + "ignore": [ + ".*", + "Gruntfile.coffee", + "bower_components", + "docs", + "node_modules", + "package.json", + "templates", + "tests" + ], + "_release": "1.0.2", + "_resolution": { + "type": "version", + "tag": "v1.0.2", + "commit": "c6846cbf6b928e9903b569269fa9fbf32f2554f4" + }, + "_source": "https://github.com/HubSpot/pace.git", + "_target": "~1.0.2", + "_originalSource": "pace", + "_direct": true +} \ No newline at end of file diff --git a/public/bower_components/PACE/LICENSE b/public/bower_components/PACE/LICENSE new file mode 100755 index 0000000..d746b04 --- /dev/null +++ b/public/bower_components/PACE/LICENSE @@ -0,0 +1,8 @@ +Copyright (c) 2013 HubSpot, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/public/bower_components/PACE/README.md b/public/bower_components/PACE/README.md new file mode 100755 index 0000000..47bdc12 --- /dev/null +++ b/public/bower_components/PACE/README.md @@ -0,0 +1,27 @@ +pace +==== + + + + + +An automatic web page progress bar. + +Include [pace.js](https://raw.github.com/HubSpot/pace/v1.0.2/pace.min.js) and a [theme](http://github.hubspot.com/pace/docs/welcome/) of your choice to your page and you are done! + +Pace will automatically monitor your Ajax requests, event loop lag, document ready state and elements on your page to decide on the progress. + +If you use AMD or Browserify, require pace.js and call `pace.start()` as early in the loading process as is possible. + +### [Demo](http://github.hubspot.com/pace/docs/welcome/) + +### [Documentation](http://github.hubspot.com/pace/) + +### Example + +```html + + + + +``` diff --git a/public/bower_components/PACE/bower.json b/public/bower_components/PACE/bower.json new file mode 100755 index 0000000..82e4b0f --- /dev/null +++ b/public/bower_components/PACE/bower.json @@ -0,0 +1,35 @@ +{ + "name": "PACE", + "main": "pace.js", + "version": "1.0.2", + "homepage": "http://github.hubspot.com/pace/docs/welcome", + "authors": [ + "Zack Bloom ", + "Adam Schwartz " + ], + "description": "Automatic page load progress bar", + "keywords": [ + "loading", + "load", + "pageload", + "progress", + "activity", + "ajax", + "spinner", + "progress", + "bar", + "automatic", + "client-side" + ], + "license": "MIT", + "ignore": [ + ".*", + "Gruntfile.coffee", + "bower_components", + "docs", + "node_modules", + "package.json", + "templates", + "tests" + ] +} diff --git a/public/bower_components/PACE/install.json b/public/bower_components/PACE/install.json new file mode 100755 index 0000000..f9540c2 --- /dev/null +++ b/public/bower_components/PACE/install.json @@ -0,0 +1,86 @@ +{ + "resources": { + "head": [ + { + "type": "script", + "src": "./pace.js", + "moduleType": "global", + "exports": ["Pace"] + }, + { + "type": "style", + "src": "./themes/{{ options.color }}/pace-theme-{{ options.theme }}.css" + } + ] + }, + "options": { + "properties": { + "color": { + "title": "Color", + "type": "string", + "enum": [ + "black", + "white", + "silver", + "red", + "orange", + "yellow", + "green", + "blue", + "pink", + "purple" + ], + "enumNames": { + "black": "Black", + "white": "White", + "silver": "Silver", + "red": "Red", + "orange": "Orange", + "yellow": "Yellow", + "green": "Green", + "blue": "Blue", + "pink": "Pink", + "purple": "Purple" + }, + "default": "blue" + }, + "theme": { + "title": "Theme", + "type": "string", + "enum": [ + "barber-shop", + "big-counter", + "bounce", + "center-atom", + "center-circle", + "center-radar", + "center-simple", + "corner-indicator", + "fill-left", + "flash", + "flat-top", + "loading-bar", + "mac-osx", + "minimal" + ], + "enumNames": { + "barber-shop": "Barber Shop", + "big-counter": "Big Counter", + "bounce": "Bounce", + "center-atom": "Center Atom", + "center-circle": "Center Circle", + "center-radar": "Center Radar", + "center-simple": "Center Simple", + "corner-indicator": "Corner Indicator", + "fill-left": "Fill Left", + "flash": "Flash", + "flat-top": "Flat Top", + "loading-bar": "Loading Bar", + "mac-osx": "Mac OS X", + "minimal": "Minimal" + }, + "default": "barber-shop" + } + } + } +} diff --git a/public/bower_components/PACE/pace.coffee b/public/bower_components/PACE/pace.coffee new file mode 100755 index 0000000..219e1d6 --- /dev/null +++ b/public/bower_components/PACE/pace.coffee @@ -0,0 +1,755 @@ +defaultOptions = + # How long should it take for the bar to animate to a new + # point after receiving it + catchupTime: 100 + + # How quickly should the bar be moving before it has any progress + # info from a new source in %/ms + initialRate: .03 + + # What is the minimum amount of time the bar should be on the + # screen. Irrespective of this number, the bar will always be on screen for + # 33 * (100 / maxProgressPerFrame) + ghostTime ms. + minTime: 250 + + # What is the minimum amount of time the bar should sit after the last + # update before disappearing + ghostTime: 100 + + # Its easy for a bunch of the bar to be eaten in the first few frames + # before we know how much there is to load. This limits how much of + # the bar can be used per frame + maxProgressPerFrame: 20 + + # This tweaks the animation easing + easeFactor: 1.25 + + # Should pace automatically start when the page is loaded, or should it wait for `start` to + # be called? Always false if pace is loaded with AMD or CommonJS. + startOnPageLoad: true + + # Should we restart the browser when pushState or replaceState is called? (Generally + # means ajax navigation has occured) + restartOnPushState: true + + # Should we show the progress bar for every ajax request (not just regular or ajax-y page + # navigation)? Set to false to disable. + # + # If so, how many ms does the request have to be running for before we show the progress? + restartOnRequestAfter: 500 + + # What element should the pace element be appended to on the page? + target: 'body' + + elements: + # How frequently in ms should we check for the elements being tested for + # using the element monitor? + checkInterval: 100 + + # What elements should we wait for before deciding the page is fully loaded (not required) + selectors: ['body'] + + eventLag: + # When we first start measuring event lag, not much is going on in the browser yet, so it's + # not uncommon for the numbers to be abnormally low for the first few samples. This configures + # how many samples we need before we consider a low number to mean completion. + minSamples: 10 + + # How many samples should we average to decide what the current lag is? + sampleCount: 3 + + # Above how many ms of lag is the CPU considered busy? + lagThreshold: 3 + + ajax: + # Which HTTP methods should we track? + trackMethods: ['GET'] + + # Should we track web socket connections? + trackWebSockets: true + + # A list of regular expressions or substrings of URLS we should ignore (for both tracking and restarting) + ignoreURLs: [] + +now = -> + performance?.now?() ? +new Date + +requestAnimationFrame = window.requestAnimationFrame or window.mozRequestAnimationFrame or + window.webkitRequestAnimationFrame or window.msRequestAnimationFrame + +cancelAnimationFrame = window.cancelAnimationFrame or window.mozCancelAnimationFrame + +if not requestAnimationFrame? + requestAnimationFrame = (fn) -> + setTimeout fn, 50 + + cancelAnimationFrame = (id) -> + clearTimeout id + +runAnimation = (fn) -> + last = now() + tick = -> + diff = now() - last + + if diff >= 33 + # Don't run faster than 30 fps + + last = now() + fn diff, -> + requestAnimationFrame tick + else + setTimeout tick, (33 - diff) + + tick() + +result = (obj, key, args...) -> + if typeof obj[key] is 'function' + obj[key](args...) + else + obj[key] + +extend = (out, sources...) -> + for source in sources when source + for own key, val of source + if out[key]? and typeof out[key] is 'object' and val? and typeof val is 'object' + extend(out[key], val) + else + out[key] = val + out + +avgAmplitude = (arr) -> + sum = count = 0 + for v in arr + sum += Math.abs(v) + count++ + + sum / count + +getFromDOM = (key='options', json=true) -> + el = document.querySelector "[data-pace-#{ key }]" + + return unless el + + data = el.getAttribute "data-pace-#{ key }" + + return data if not json + + try + return JSON.parse data + catch e + console?.error "Error parsing inline pace options", e + +class Evented + on: (event, handler, ctx, once=false) -> + @bindings ?= {} + @bindings[event] ?= [] + @bindings[event].push {handler, ctx, once} + + once: (event, handler, ctx) -> + @on(event, handler, ctx, true) + + off: (event, handler) -> + return unless @bindings?[event]? + + if not handler? + delete @bindings[event] + else + i = 0 + while i < @bindings[event].length + if @bindings[event][i].handler is handler + @bindings[event].splice i, 1 + else + i++ + + trigger: (event, args...) -> + if @bindings?[event] + i = 0 + while i < @bindings[event].length + {handler, ctx, once} = @bindings[event][i] + + handler.apply(ctx ? @, args) + + if once + @bindings[event].splice i, 1 + else + i++ + +Pace = window.Pace or {} +window.Pace = Pace + +extend Pace, Evented:: + +options = Pace.options = extend {}, defaultOptions, window.paceOptions, getFromDOM() + +for source in ['ajax', 'document', 'eventLag', 'elements'] + # true enables them without configuration, so we grab the config from the defaults + if options[source] is true + options[source] = defaultOptions[source] + +class NoTargetError extends Error + +class Bar + constructor: -> + @progress = 0 + + getElement: -> + if not @el? + targetElement = document.querySelector options.target + + if not targetElement + throw new NoTargetError + + @el = document.createElement 'div' + @el.className = "pace pace-active" + + document.body.className = document.body.className.replace /pace-done/g, '' + document.body.className += ' pace-running' + + @el.innerHTML = ''' +
    +
    +
    +
    + ''' + if targetElement.firstChild? + targetElement.insertBefore @el, targetElement.firstChild + else + targetElement.appendChild @el + + @el + + finish: -> + el = @getElement() + + el.className = el.className.replace 'pace-active', '' + el.className += ' pace-inactive' + + document.body.className = document.body.className.replace 'pace-running', '' + document.body.className += ' pace-done' + + update: (prog) -> + @progress = prog + + do @render + + destroy: -> + try + @getElement().parentNode.removeChild(@getElement()) + catch NoTargetError + + @el = undefined + + render: -> + if not document.querySelector(options.target)? + return false + + el = @getElement() + + transform = "translate3d(#{ @progress }%, 0, 0)" + for key in ['webkitTransform', 'msTransform', 'transform'] + el.children[0].style[key] = transform + + if not @lastRenderedProgress or @lastRenderedProgress|0 != @progress|0 + # The whole-part of the number has changed + + el.children[0].setAttribute 'data-progress-text', "#{ @progress|0 }%" + + if @progress >= 100 + # We cap it at 99 so we can use prefix-based attribute selectors + progressStr = '99' + else + progressStr = if @progress < 10 then "0" else "" + progressStr += @progress|0 + + el.children[0].setAttribute 'data-progress', "#{ progressStr }" + + @lastRenderedProgress = @progress + + done: -> + @progress >= 100 + +class Events + constructor: -> + @bindings = {} + + trigger: (name, val) -> + if @bindings[name]? + for binding in @bindings[name] + binding.call @, val + + on: (name, fn) -> + @bindings[name] ?= [] + @bindings[name].push fn + +_XMLHttpRequest = window.XMLHttpRequest +_XDomainRequest = window.XDomainRequest +_WebSocket = window.WebSocket + +extendNative = (to, from) -> + for key of from:: + try + if not to[key]? and typeof from[key] isnt 'function' + if typeof Object.defineProperty is 'function' + Object.defineProperty(to, key, { + get: -> + return from::[key]; + , + configurable: true, + enumerable: true }) + else + to[key] = from::[key] + catch e + +ignoreStack = [] + +Pace.ignore = (fn, args...) -> + ignoreStack.unshift 'ignore' + ret = fn(args...) + ignoreStack.shift() + ret + +Pace.track = (fn, args...) -> + ignoreStack.unshift 'track' + ret = fn(args...) + ignoreStack.shift() + ret + +shouldTrack = (method='GET') -> + if ignoreStack[0] is 'track' + return 'force' + + if not ignoreStack.length and options.ajax + if method is 'socket' and options.ajax.trackWebSockets + return true + else if method.toUpperCase() in options.ajax.trackMethods + return true + + return false + +# We should only ever instantiate one of these +class RequestIntercept extends Events + constructor: -> + super + + monitorXHR = (req) => + _open = req.open + req.open = (type, url, async) => + if shouldTrack(type) + @trigger 'request', {type, url, request: req} + + _open.apply req, arguments + + window.XMLHttpRequest = (flags) -> + req = new _XMLHttpRequest(flags) + + monitorXHR req + + req + + try + extendNative window.XMLHttpRequest, _XMLHttpRequest + + if _XDomainRequest? + window.XDomainRequest = -> + req = new _XDomainRequest + + monitorXHR req + + req + + try + extendNative window.XDomainRequest, _XDomainRequest + + if _WebSocket? and options.ajax.trackWebSockets + window.WebSocket = (url, protocols) => + if protocols? + req = new _WebSocket(url, protocols) + else + req = new _WebSocket(url) + + if shouldTrack('socket') + @trigger 'request', {type: 'socket', url, protocols, request: req} + + req + + try + extendNative window.WebSocket, _WebSocket + +_intercept = null +getIntercept = -> + if not _intercept? + _intercept = new RequestIntercept + _intercept + +shouldIgnoreURL = (url) -> + for pattern in options.ajax.ignoreURLs + if typeof pattern is 'string' + if url.indexOf(pattern) isnt -1 + return true + + else + if pattern.test(url) + return true + + return false + +# If we want to start the progress bar +# on every request, we need to hear the request +# and then inject it into the new ajax monitor +# start will have created. + +getIntercept().on 'request', ({type, request, url}) -> + return if shouldIgnoreURL(url) + + if not Pace.running and (options.restartOnRequestAfter isnt false or shouldTrack(type) is 'force') + args = arguments + + after = options.restartOnRequestAfter or 0 + if typeof after is 'boolean' + after = 0 + + setTimeout -> + if type is 'socket' + stillActive = request.readyState < 2 + else + stillActive = 0 < request.readyState < 4 + + if stillActive + Pace.restart() + + for source in Pace.sources + if source instanceof AjaxMonitor + source.watch args... + break + , after + +class AjaxMonitor + constructor: -> + @elements = [] + + getIntercept().on 'request', => @watch arguments... + + watch: ({type, request, url}) -> + return if shouldIgnoreURL(url) + + if type is 'socket' + tracker = new SocketRequestTracker(request) + else + tracker = new XHRRequestTracker(request) + + @elements.push tracker + +class XHRRequestTracker + constructor: (request) -> + @progress = 0 + + if window.ProgressEvent? + # We're dealing with a modern browser with progress event support + + size = null + request.addEventListener 'progress', (evt) => + if evt.lengthComputable + @progress = 100 * evt.loaded / evt.total + else + # If it's chunked encoding, we have no way of knowing the total length of the + # response, all we can do is increment the progress with backoff such that we + # never hit 100% until it's done. + @progress = @progress + (100 - @progress) / 2 + , false + + for event in ['load', 'abort', 'timeout', 'error'] + request.addEventListener event, => + @progress = 100 + , false + + else + _onreadystatechange = request.onreadystatechange + request.onreadystatechange = => + if request.readyState in [0, 4] + @progress = 100 + else if request.readyState is 3 + @progress = 50 + + _onreadystatechange?(arguments...) + +class SocketRequestTracker + constructor: (request) -> + @progress = 0 + + for event in ['error', 'open'] + request.addEventListener event, => + @progress = 100 + , false + +class ElementMonitor + constructor: (options={}) -> + @elements = [] + + options.selectors ?= [] + for selector in options.selectors + @elements.push new ElementTracker selector + +class ElementTracker + constructor: (@selector) -> + @progress = 0 + + @check() + + check: -> + if document.querySelector(@selector) + @done() + else + setTimeout (=> @check()), + options.elements.checkInterval + + done: -> + @progress = 100 + +class DocumentMonitor + states: + loading: 0 + interactive: 50 + complete: 100 + + constructor: -> + @progress = @states[document.readyState] ? 100 + + _onreadystatechange = document.onreadystatechange + document.onreadystatechange = => + if @states[document.readyState]? + @progress = @states[document.readyState] + + _onreadystatechange?(arguments...) + +class EventLagMonitor + constructor: -> + @progress = 0 + + avg = 0 + + samples = [] + + points = 0 + last = now() + interval = setInterval => + diff = now() - last - 50 + last = now() + + samples.push diff + + if samples.length > options.eventLag.sampleCount + samples.shift() + + avg = avgAmplitude samples + + if ++points >= options.eventLag.minSamples and avg < options.eventLag.lagThreshold + @progress = 100 + + clearInterval interval + else + @progress = 100 * (3 / (avg + 3)) + + , 50 + +class Scaler + constructor: (@source) -> + @last = @sinceLastUpdate = 0 + @rate = options.initialRate + @catchup = 0 + @progress = @lastProgress = 0 + + if @source? + @progress = result(@source, 'progress') + + tick: (frameTime, val) -> + val ?= result(@source, 'progress') + + if val >= 100 + @done = true + + if val == @last + @sinceLastUpdate += frameTime + else + if @sinceLastUpdate + @rate = (val - @last) / @sinceLastUpdate + + @catchup = (val - @progress) / options.catchupTime + + @sinceLastUpdate = 0 + @last = val + + if val > @progress + # After we've got a datapoint, we have catchupTime to + # get the progress bar to reflect that new data + @progress += @catchup * frameTime + + scaling = (1 - Math.pow(@progress / 100, options.easeFactor)) + + # Based on the rate of the last update, we preemptively update + # the progress bar, scaling it so it can never hit 100% until we + # know it's done. + @progress += scaling * @rate * frameTime + + @progress = Math.min(@lastProgress + options.maxProgressPerFrame, @progress) + + @progress = Math.max(0, @progress) + @progress = Math.min(100, @progress) + + @lastProgress = @progress + + @progress + +sources = null +scalers = null +bar = null +uniScaler = null +animation = null +cancelAnimation = null +Pace.running = false + +handlePushState = -> + if options.restartOnPushState + Pace.restart() + +# We reset the bar whenever it looks like an ajax navigation has occured. +if window.history.pushState? + _pushState = window.history.pushState + window.history.pushState = -> + handlePushState() + + _pushState.apply window.history, arguments + +if window.history.replaceState? + _replaceState = window.history.replaceState + window.history.replaceState = -> + handlePushState() + + _replaceState.apply window.history, arguments + +SOURCE_KEYS = + ajax: AjaxMonitor + elements: ElementMonitor + document: DocumentMonitor + eventLag: EventLagMonitor + +do init = -> + Pace.sources = sources = [] + + for type in ['ajax', 'elements', 'document', 'eventLag'] + if options[type] isnt false + sources.push new SOURCE_KEYS[type](options[type]) + + for source in options.extraSources ? [] + sources.push new source(options) + + Pace.bar = bar = new Bar + + # Each source of progress data has it's own scaler to smooth its output + scalers = [] + + # We have an extra scaler for the final output to keep things looking nice as we add and + # remove sources + uniScaler = new Scaler + +Pace.stop = -> + Pace.trigger 'stop' + Pace.running = false + + bar.destroy() + + # Not all browsers support cancelAnimationFrame + cancelAnimation = true + + if animation? + cancelAnimationFrame? animation + animation = null + + init() + +Pace.restart = -> + Pace.trigger 'restart' + Pace.stop() + Pace.start() + +Pace.go = -> + Pace.running = true + + bar.render() + + start = now() + + cancelAnimation = false + animation = runAnimation (frameTime, enqueueNextFrame) -> + # Every source gives us a progress number from 0 - 100 + # It's up to us to figure out how to turn that into a smoothly moving bar + # + # Their progress numbers can only increment. We try to interpolate + # between the numbers. + + remaining = 100 - bar.progress + + count = sum = 0 + done = true + # A source is composed of a bunch of elements, each with a raw, unscaled progress + for source, i in sources + scalerList = scalers[i] ?= [] + + elements = source.elements ? [source] + + # Each element is given it's own scaler, which turns its value into something + # smoothed for display + for element, j in elements + scaler = scalerList[j] ?= new Scaler element + + done &= scaler.done + + continue if scaler.done + + count++ + sum += scaler.tick(frameTime) + + avg = sum / count + + bar.update uniScaler.tick(frameTime, avg) + + if bar.done() or done or cancelAnimation + bar.update 100 + + Pace.trigger 'done' + + setTimeout -> + bar.finish() + + Pace.running = false + + Pace.trigger 'hide' + , Math.max(options.ghostTime, Math.max(options.minTime - (now() - start), 0)) + else + enqueueNextFrame() + +Pace.start = (_options) -> + extend options, _options + + Pace.running = true + + try + bar.render() + catch NoTargetError + + # It's usually possible to render a bit before the document declares itself ready + if not document.querySelector('.pace') + setTimeout Pace.start, 50 + else + Pace.trigger 'start' + Pace.go() + +if typeof define is 'function' and define.amd + # AMD + define ['pace'], -> Pace +else if typeof exports is 'object' + # CommonJS + module.exports = Pace +else + # Global + if options.startOnPageLoad + Pace.start() diff --git a/public/bower_components/PACE/pace.js b/public/bower_components/PACE/pace.js new file mode 100755 index 0000000..c7efc2f --- /dev/null +++ b/public/bower_components/PACE/pace.js @@ -0,0 +1,935 @@ +(function() { + var AjaxMonitor, Bar, DocumentMonitor, ElementMonitor, ElementTracker, EventLagMonitor, Evented, Events, NoTargetError, Pace, RequestIntercept, SOURCE_KEYS, Scaler, SocketRequestTracker, XHRRequestTracker, animation, avgAmplitude, bar, cancelAnimation, cancelAnimationFrame, defaultOptions, extend, extendNative, getFromDOM, getIntercept, handlePushState, ignoreStack, init, now, options, requestAnimationFrame, result, runAnimation, scalers, shouldIgnoreURL, shouldTrack, source, sources, uniScaler, _WebSocket, _XDomainRequest, _XMLHttpRequest, _i, _intercept, _len, _pushState, _ref, _ref1, _replaceState, + __slice = [].slice, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; + + defaultOptions = { + catchupTime: 100, + initialRate: .03, + minTime: 250, + ghostTime: 100, + maxProgressPerFrame: 20, + easeFactor: 1.25, + startOnPageLoad: true, + restartOnPushState: true, + restartOnRequestAfter: 500, + target: 'body', + elements: { + checkInterval: 100, + selectors: ['body'] + }, + eventLag: { + minSamples: 10, + sampleCount: 3, + lagThreshold: 3 + }, + ajax: { + trackMethods: ['GET'], + trackWebSockets: true, + ignoreURLs: [] + } + }; + + now = function() { + var _ref; + return (_ref = typeof performance !== "undefined" && performance !== null ? typeof performance.now === "function" ? performance.now() : void 0 : void 0) != null ? _ref : +(new Date); + }; + + requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; + + cancelAnimationFrame = window.cancelAnimationFrame || window.mozCancelAnimationFrame; + + if (requestAnimationFrame == null) { + requestAnimationFrame = function(fn) { + return setTimeout(fn, 50); + }; + cancelAnimationFrame = function(id) { + return clearTimeout(id); + }; + } + + runAnimation = function(fn) { + var last, tick; + last = now(); + tick = function() { + var diff; + diff = now() - last; + if (diff >= 33) { + last = now(); + return fn(diff, function() { + return requestAnimationFrame(tick); + }); + } else { + return setTimeout(tick, 33 - diff); + } + }; + return tick(); + }; + + result = function() { + var args, key, obj; + obj = arguments[0], key = arguments[1], args = 3 <= arguments.length ? __slice.call(arguments, 2) : []; + if (typeof obj[key] === 'function') { + return obj[key].apply(obj, args); + } else { + return obj[key]; + } + }; + + extend = function() { + var key, out, source, sources, val, _i, _len; + out = arguments[0], sources = 2 <= arguments.length ? __slice.call(arguments, 1) : []; + for (_i = 0, _len = sources.length; _i < _len; _i++) { + source = sources[_i]; + if (source) { + for (key in source) { + if (!__hasProp.call(source, key)) continue; + val = source[key]; + if ((out[key] != null) && typeof out[key] === 'object' && (val != null) && typeof val === 'object') { + extend(out[key], val); + } else { + out[key] = val; + } + } + } + } + return out; + }; + + avgAmplitude = function(arr) { + var count, sum, v, _i, _len; + sum = count = 0; + for (_i = 0, _len = arr.length; _i < _len; _i++) { + v = arr[_i]; + sum += Math.abs(v); + count++; + } + return sum / count; + }; + + getFromDOM = function(key, json) { + var data, e, el; + if (key == null) { + key = 'options'; + } + if (json == null) { + json = true; + } + el = document.querySelector("[data-pace-" + key + "]"); + if (!el) { + return; + } + data = el.getAttribute("data-pace-" + key); + if (!json) { + return data; + } + try { + return JSON.parse(data); + } catch (_error) { + e = _error; + return typeof console !== "undefined" && console !== null ? console.error("Error parsing inline pace options", e) : void 0; + } + }; + + Evented = (function() { + function Evented() {} + + Evented.prototype.on = function(event, handler, ctx, once) { + var _base; + if (once == null) { + once = false; + } + if (this.bindings == null) { + this.bindings = {}; + } + if ((_base = this.bindings)[event] == null) { + _base[event] = []; + } + return this.bindings[event].push({ + handler: handler, + ctx: ctx, + once: once + }); + }; + + Evented.prototype.once = function(event, handler, ctx) { + return this.on(event, handler, ctx, true); + }; + + Evented.prototype.off = function(event, handler) { + var i, _ref, _results; + if (((_ref = this.bindings) != null ? _ref[event] : void 0) == null) { + return; + } + if (handler == null) { + return delete this.bindings[event]; + } else { + i = 0; + _results = []; + while (i < this.bindings[event].length) { + if (this.bindings[event][i].handler === handler) { + _results.push(this.bindings[event].splice(i, 1)); + } else { + _results.push(i++); + } + } + return _results; + } + }; + + Evented.prototype.trigger = function() { + var args, ctx, event, handler, i, once, _ref, _ref1, _results; + event = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; + if ((_ref = this.bindings) != null ? _ref[event] : void 0) { + i = 0; + _results = []; + while (i < this.bindings[event].length) { + _ref1 = this.bindings[event][i], handler = _ref1.handler, ctx = _ref1.ctx, once = _ref1.once; + handler.apply(ctx != null ? ctx : this, args); + if (once) { + _results.push(this.bindings[event].splice(i, 1)); + } else { + _results.push(i++); + } + } + return _results; + } + }; + + return Evented; + + })(); + + Pace = window.Pace || {}; + + window.Pace = Pace; + + extend(Pace, Evented.prototype); + + options = Pace.options = extend({}, defaultOptions, window.paceOptions, getFromDOM()); + + _ref = ['ajax', 'document', 'eventLag', 'elements']; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + source = _ref[_i]; + if (options[source] === true) { + options[source] = defaultOptions[source]; + } + } + + NoTargetError = (function(_super) { + __extends(NoTargetError, _super); + + function NoTargetError() { + _ref1 = NoTargetError.__super__.constructor.apply(this, arguments); + return _ref1; + } + + return NoTargetError; + + })(Error); + + Bar = (function() { + function Bar() { + this.progress = 0; + } + + Bar.prototype.getElement = function() { + var targetElement; + if (this.el == null) { + targetElement = document.querySelector(options.target); + if (!targetElement) { + throw new NoTargetError; + } + this.el = document.createElement('div'); + this.el.className = "pace pace-active"; + document.body.className = document.body.className.replace(/pace-done/g, ''); + document.body.className += ' pace-running'; + this.el.innerHTML = '
    \n
    \n
    \n
    '; + if (targetElement.firstChild != null) { + targetElement.insertBefore(this.el, targetElement.firstChild); + } else { + targetElement.appendChild(this.el); + } + } + return this.el; + }; + + Bar.prototype.finish = function() { + var el; + el = this.getElement(); + el.className = el.className.replace('pace-active', ''); + el.className += ' pace-inactive'; + document.body.className = document.body.className.replace('pace-running', ''); + return document.body.className += ' pace-done'; + }; + + Bar.prototype.update = function(prog) { + this.progress = prog; + return this.render(); + }; + + Bar.prototype.destroy = function() { + try { + this.getElement().parentNode.removeChild(this.getElement()); + } catch (_error) { + NoTargetError = _error; + } + return this.el = void 0; + }; + + Bar.prototype.render = function() { + var el, key, progressStr, transform, _j, _len1, _ref2; + if (document.querySelector(options.target) == null) { + return false; + } + el = this.getElement(); + transform = "translate3d(" + this.progress + "%, 0, 0)"; + _ref2 = ['webkitTransform', 'msTransform', 'transform']; + for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { + key = _ref2[_j]; + el.children[0].style[key] = transform; + } + if (!this.lastRenderedProgress || this.lastRenderedProgress | 0 !== this.progress | 0) { + el.children[0].setAttribute('data-progress-text', "" + (this.progress | 0) + "%"); + if (this.progress >= 100) { + progressStr = '99'; + } else { + progressStr = this.progress < 10 ? "0" : ""; + progressStr += this.progress | 0; + } + el.children[0].setAttribute('data-progress', "" + progressStr); + } + return this.lastRenderedProgress = this.progress; + }; + + Bar.prototype.done = function() { + return this.progress >= 100; + }; + + return Bar; + + })(); + + Events = (function() { + function Events() { + this.bindings = {}; + } + + Events.prototype.trigger = function(name, val) { + var binding, _j, _len1, _ref2, _results; + if (this.bindings[name] != null) { + _ref2 = this.bindings[name]; + _results = []; + for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { + binding = _ref2[_j]; + _results.push(binding.call(this, val)); + } + return _results; + } + }; + + Events.prototype.on = function(name, fn) { + var _base; + if ((_base = this.bindings)[name] == null) { + _base[name] = []; + } + return this.bindings[name].push(fn); + }; + + return Events; + + })(); + + _XMLHttpRequest = window.XMLHttpRequest; + + _XDomainRequest = window.XDomainRequest; + + _WebSocket = window.WebSocket; + + extendNative = function(to, from) { + var e, key, _results; + _results = []; + for (key in from.prototype) { + try { + if ((to[key] == null) && typeof from[key] !== 'function') { + if (typeof Object.defineProperty === 'function') { + _results.push(Object.defineProperty(to, key, { + get: function() { + return from.prototype[key]; + }, + configurable: true, + enumerable: true + })); + } else { + _results.push(to[key] = from.prototype[key]); + } + } else { + _results.push(void 0); + } + } catch (_error) { + e = _error; + } + } + return _results; + }; + + ignoreStack = []; + + Pace.ignore = function() { + var args, fn, ret; + fn = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; + ignoreStack.unshift('ignore'); + ret = fn.apply(null, args); + ignoreStack.shift(); + return ret; + }; + + Pace.track = function() { + var args, fn, ret; + fn = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; + ignoreStack.unshift('track'); + ret = fn.apply(null, args); + ignoreStack.shift(); + return ret; + }; + + shouldTrack = function(method) { + var _ref2; + if (method == null) { + method = 'GET'; + } + if (ignoreStack[0] === 'track') { + return 'force'; + } + if (!ignoreStack.length && options.ajax) { + if (method === 'socket' && options.ajax.trackWebSockets) { + return true; + } else if (_ref2 = method.toUpperCase(), __indexOf.call(options.ajax.trackMethods, _ref2) >= 0) { + return true; + } + } + return false; + }; + + RequestIntercept = (function(_super) { + __extends(RequestIntercept, _super); + + function RequestIntercept() { + var monitorXHR, + _this = this; + RequestIntercept.__super__.constructor.apply(this, arguments); + monitorXHR = function(req) { + var _open; + _open = req.open; + return req.open = function(type, url, async) { + if (shouldTrack(type)) { + _this.trigger('request', { + type: type, + url: url, + request: req + }); + } + return _open.apply(req, arguments); + }; + }; + window.XMLHttpRequest = function(flags) { + var req; + req = new _XMLHttpRequest(flags); + monitorXHR(req); + return req; + }; + try { + extendNative(window.XMLHttpRequest, _XMLHttpRequest); + } catch (_error) {} + if (_XDomainRequest != null) { + window.XDomainRequest = function() { + var req; + req = new _XDomainRequest; + monitorXHR(req); + return req; + }; + try { + extendNative(window.XDomainRequest, _XDomainRequest); + } catch (_error) {} + } + if ((_WebSocket != null) && options.ajax.trackWebSockets) { + window.WebSocket = function(url, protocols) { + var req; + if (protocols != null) { + req = new _WebSocket(url, protocols); + } else { + req = new _WebSocket(url); + } + if (shouldTrack('socket')) { + _this.trigger('request', { + type: 'socket', + url: url, + protocols: protocols, + request: req + }); + } + return req; + }; + try { + extendNative(window.WebSocket, _WebSocket); + } catch (_error) {} + } + } + + return RequestIntercept; + + })(Events); + + _intercept = null; + + getIntercept = function() { + if (_intercept == null) { + _intercept = new RequestIntercept; + } + return _intercept; + }; + + shouldIgnoreURL = function(url) { + var pattern, _j, _len1, _ref2; + _ref2 = options.ajax.ignoreURLs; + for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { + pattern = _ref2[_j]; + if (typeof pattern === 'string') { + if (url.indexOf(pattern) !== -1) { + return true; + } + } else { + if (pattern.test(url)) { + return true; + } + } + } + return false; + }; + + getIntercept().on('request', function(_arg) { + var after, args, request, type, url; + type = _arg.type, request = _arg.request, url = _arg.url; + if (shouldIgnoreURL(url)) { + return; + } + if (!Pace.running && (options.restartOnRequestAfter !== false || shouldTrack(type) === 'force')) { + args = arguments; + after = options.restartOnRequestAfter || 0; + if (typeof after === 'boolean') { + after = 0; + } + return setTimeout(function() { + var stillActive, _j, _len1, _ref2, _ref3, _results; + if (type === 'socket') { + stillActive = request.readyState < 2; + } else { + stillActive = (0 < (_ref2 = request.readyState) && _ref2 < 4); + } + if (stillActive) { + Pace.restart(); + _ref3 = Pace.sources; + _results = []; + for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) { + source = _ref3[_j]; + if (source instanceof AjaxMonitor) { + source.watch.apply(source, args); + break; + } else { + _results.push(void 0); + } + } + return _results; + } + }, after); + } + }); + + AjaxMonitor = (function() { + function AjaxMonitor() { + var _this = this; + this.elements = []; + getIntercept().on('request', function() { + return _this.watch.apply(_this, arguments); + }); + } + + AjaxMonitor.prototype.watch = function(_arg) { + var request, tracker, type, url; + type = _arg.type, request = _arg.request, url = _arg.url; + if (shouldIgnoreURL(url)) { + return; + } + if (type === 'socket') { + tracker = new SocketRequestTracker(request); + } else { + tracker = new XHRRequestTracker(request); + } + return this.elements.push(tracker); + }; + + return AjaxMonitor; + + })(); + + XHRRequestTracker = (function() { + function XHRRequestTracker(request) { + var event, size, _j, _len1, _onreadystatechange, _ref2, + _this = this; + this.progress = 0; + if (window.ProgressEvent != null) { + size = null; + request.addEventListener('progress', function(evt) { + if (evt.lengthComputable) { + return _this.progress = 100 * evt.loaded / evt.total; + } else { + return _this.progress = _this.progress + (100 - _this.progress) / 2; + } + }, false); + _ref2 = ['load', 'abort', 'timeout', 'error']; + for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { + event = _ref2[_j]; + request.addEventListener(event, function() { + return _this.progress = 100; + }, false); + } + } else { + _onreadystatechange = request.onreadystatechange; + request.onreadystatechange = function() { + var _ref3; + if ((_ref3 = request.readyState) === 0 || _ref3 === 4) { + _this.progress = 100; + } else if (request.readyState === 3) { + _this.progress = 50; + } + return typeof _onreadystatechange === "function" ? _onreadystatechange.apply(null, arguments) : void 0; + }; + } + } + + return XHRRequestTracker; + + })(); + + SocketRequestTracker = (function() { + function SocketRequestTracker(request) { + var event, _j, _len1, _ref2, + _this = this; + this.progress = 0; + _ref2 = ['error', 'open']; + for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { + event = _ref2[_j]; + request.addEventListener(event, function() { + return _this.progress = 100; + }, false); + } + } + + return SocketRequestTracker; + + })(); + + ElementMonitor = (function() { + function ElementMonitor(options) { + var selector, _j, _len1, _ref2; + if (options == null) { + options = {}; + } + this.elements = []; + if (options.selectors == null) { + options.selectors = []; + } + _ref2 = options.selectors; + for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { + selector = _ref2[_j]; + this.elements.push(new ElementTracker(selector)); + } + } + + return ElementMonitor; + + })(); + + ElementTracker = (function() { + function ElementTracker(selector) { + this.selector = selector; + this.progress = 0; + this.check(); + } + + ElementTracker.prototype.check = function() { + var _this = this; + if (document.querySelector(this.selector)) { + return this.done(); + } else { + return setTimeout((function() { + return _this.check(); + }), options.elements.checkInterval); + } + }; + + ElementTracker.prototype.done = function() { + return this.progress = 100; + }; + + return ElementTracker; + + })(); + + DocumentMonitor = (function() { + DocumentMonitor.prototype.states = { + loading: 0, + interactive: 50, + complete: 100 + }; + + function DocumentMonitor() { + var _onreadystatechange, _ref2, + _this = this; + this.progress = (_ref2 = this.states[document.readyState]) != null ? _ref2 : 100; + _onreadystatechange = document.onreadystatechange; + document.onreadystatechange = function() { + if (_this.states[document.readyState] != null) { + _this.progress = _this.states[document.readyState]; + } + return typeof _onreadystatechange === "function" ? _onreadystatechange.apply(null, arguments) : void 0; + }; + } + + return DocumentMonitor; + + })(); + + EventLagMonitor = (function() { + function EventLagMonitor() { + var avg, interval, last, points, samples, + _this = this; + this.progress = 0; + avg = 0; + samples = []; + points = 0; + last = now(); + interval = setInterval(function() { + var diff; + diff = now() - last - 50; + last = now(); + samples.push(diff); + if (samples.length > options.eventLag.sampleCount) { + samples.shift(); + } + avg = avgAmplitude(samples); + if (++points >= options.eventLag.minSamples && avg < options.eventLag.lagThreshold) { + _this.progress = 100; + return clearInterval(interval); + } else { + return _this.progress = 100 * (3 / (avg + 3)); + } + }, 50); + } + + return EventLagMonitor; + + })(); + + Scaler = (function() { + function Scaler(source) { + this.source = source; + this.last = this.sinceLastUpdate = 0; + this.rate = options.initialRate; + this.catchup = 0; + this.progress = this.lastProgress = 0; + if (this.source != null) { + this.progress = result(this.source, 'progress'); + } + } + + Scaler.prototype.tick = function(frameTime, val) { + var scaling; + if (val == null) { + val = result(this.source, 'progress'); + } + if (val >= 100) { + this.done = true; + } + if (val === this.last) { + this.sinceLastUpdate += frameTime; + } else { + if (this.sinceLastUpdate) { + this.rate = (val - this.last) / this.sinceLastUpdate; + } + this.catchup = (val - this.progress) / options.catchupTime; + this.sinceLastUpdate = 0; + this.last = val; + } + if (val > this.progress) { + this.progress += this.catchup * frameTime; + } + scaling = 1 - Math.pow(this.progress / 100, options.easeFactor); + this.progress += scaling * this.rate * frameTime; + this.progress = Math.min(this.lastProgress + options.maxProgressPerFrame, this.progress); + this.progress = Math.max(0, this.progress); + this.progress = Math.min(100, this.progress); + this.lastProgress = this.progress; + return this.progress; + }; + + return Scaler; + + })(); + + sources = null; + + scalers = null; + + bar = null; + + uniScaler = null; + + animation = null; + + cancelAnimation = null; + + Pace.running = false; + + handlePushState = function() { + if (options.restartOnPushState) { + return Pace.restart(); + } + }; + + if (window.history.pushState != null) { + _pushState = window.history.pushState; + window.history.pushState = function() { + handlePushState(); + return _pushState.apply(window.history, arguments); + }; + } + + if (window.history.replaceState != null) { + _replaceState = window.history.replaceState; + window.history.replaceState = function() { + handlePushState(); + return _replaceState.apply(window.history, arguments); + }; + } + + SOURCE_KEYS = { + ajax: AjaxMonitor, + elements: ElementMonitor, + document: DocumentMonitor, + eventLag: EventLagMonitor + }; + + (init = function() { + var type, _j, _k, _len1, _len2, _ref2, _ref3, _ref4; + Pace.sources = sources = []; + _ref2 = ['ajax', 'elements', 'document', 'eventLag']; + for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { + type = _ref2[_j]; + if (options[type] !== false) { + sources.push(new SOURCE_KEYS[type](options[type])); + } + } + _ref4 = (_ref3 = options.extraSources) != null ? _ref3 : []; + for (_k = 0, _len2 = _ref4.length; _k < _len2; _k++) { + source = _ref4[_k]; + sources.push(new source(options)); + } + Pace.bar = bar = new Bar; + scalers = []; + return uniScaler = new Scaler; + })(); + + Pace.stop = function() { + Pace.trigger('stop'); + Pace.running = false; + bar.destroy(); + cancelAnimation = true; + if (animation != null) { + if (typeof cancelAnimationFrame === "function") { + cancelAnimationFrame(animation); + } + animation = null; + } + return init(); + }; + + Pace.restart = function() { + Pace.trigger('restart'); + Pace.stop(); + return Pace.start(); + }; + + Pace.go = function() { + var start; + Pace.running = true; + bar.render(); + start = now(); + cancelAnimation = false; + return animation = runAnimation(function(frameTime, enqueueNextFrame) { + var avg, count, done, element, elements, i, j, remaining, scaler, scalerList, sum, _j, _k, _len1, _len2, _ref2; + remaining = 100 - bar.progress; + count = sum = 0; + done = true; + for (i = _j = 0, _len1 = sources.length; _j < _len1; i = ++_j) { + source = sources[i]; + scalerList = scalers[i] != null ? scalers[i] : scalers[i] = []; + elements = (_ref2 = source.elements) != null ? _ref2 : [source]; + for (j = _k = 0, _len2 = elements.length; _k < _len2; j = ++_k) { + element = elements[j]; + scaler = scalerList[j] != null ? scalerList[j] : scalerList[j] = new Scaler(element); + done &= scaler.done; + if (scaler.done) { + continue; + } + count++; + sum += scaler.tick(frameTime); + } + } + avg = sum / count; + bar.update(uniScaler.tick(frameTime, avg)); + if (bar.done() || done || cancelAnimation) { + bar.update(100); + Pace.trigger('done'); + return setTimeout(function() { + bar.finish(); + Pace.running = false; + return Pace.trigger('hide'); + }, Math.max(options.ghostTime, Math.max(options.minTime - (now() - start), 0))); + } else { + return enqueueNextFrame(); + } + }); + }; + + Pace.start = function(_options) { + extend(options, _options); + Pace.running = true; + try { + bar.render(); + } catch (_error) { + NoTargetError = _error; + } + if (!document.querySelector('.pace')) { + return setTimeout(Pace.start, 50); + } else { + Pace.trigger('start'); + return Pace.go(); + } + }; + + if (typeof define === 'function' && define.amd) { + define(['pace'], function() { + return Pace; + }); + } else if (typeof exports === 'object') { + module.exports = Pace; + } else { + if (options.startOnPageLoad) { + Pace.start(); + } + } + +}).call(this); diff --git a/public/bower_components/PACE/pace.min.js b/public/bower_components/PACE/pace.min.js new file mode 100755 index 0000000..234f9b3 --- /dev/null +++ b/public/bower_components/PACE/pace.min.js @@ -0,0 +1,2 @@ +/*! pace 1.0.2 */ +(function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X=[].slice,Y={}.hasOwnProperty,Z=function(a,b){function c(){this.constructor=a}for(var d in b)Y.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},$=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};for(u={catchupTime:100,initialRate:.03,minTime:250,ghostTime:100,maxProgressPerFrame:20,easeFactor:1.25,startOnPageLoad:!0,restartOnPushState:!0,restartOnRequestAfter:500,target:"body",elements:{checkInterval:100,selectors:["body"]},eventLag:{minSamples:10,sampleCount:3,lagThreshold:3},ajax:{trackMethods:["GET"],trackWebSockets:!0,ignoreURLs:[]}},C=function(){var a;return null!=(a="undefined"!=typeof performance&&null!==performance&&"function"==typeof performance.now?performance.now():void 0)?a:+new Date},E=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame,t=window.cancelAnimationFrame||window.mozCancelAnimationFrame,null==E&&(E=function(a){return setTimeout(a,50)},t=function(a){return clearTimeout(a)}),G=function(a){var b,c;return b=C(),(c=function(){var d;return d=C()-b,d>=33?(b=C(),a(d,function(){return E(c)})):setTimeout(c,33-d)})()},F=function(){var a,b,c;return c=arguments[0],b=arguments[1],a=3<=arguments.length?X.call(arguments,2):[],"function"==typeof c[b]?c[b].apply(c,a):c[b]},v=function(){var a,b,c,d,e,f,g;for(b=arguments[0],d=2<=arguments.length?X.call(arguments,1):[],f=0,g=d.length;g>f;f++)if(c=d[f])for(a in c)Y.call(c,a)&&(e=c[a],null!=b[a]&&"object"==typeof b[a]&&null!=e&&"object"==typeof e?v(b[a],e):b[a]=e);return b},q=function(a){var b,c,d,e,f;for(c=b=0,e=0,f=a.length;f>e;e++)d=a[e],c+=Math.abs(d),b++;return c/b},x=function(a,b){var c,d,e;if(null==a&&(a="options"),null==b&&(b=!0),e=document.querySelector("[data-pace-"+a+"]")){if(c=e.getAttribute("data-pace-"+a),!b)return c;try{return JSON.parse(c)}catch(f){return d=f,"undefined"!=typeof console&&null!==console?console.error("Error parsing inline pace options",d):void 0}}},g=function(){function a(){}return a.prototype.on=function(a,b,c,d){var e;return null==d&&(d=!1),null==this.bindings&&(this.bindings={}),null==(e=this.bindings)[a]&&(e[a]=[]),this.bindings[a].push({handler:b,ctx:c,once:d})},a.prototype.once=function(a,b,c){return this.on(a,b,c,!0)},a.prototype.off=function(a,b){var c,d,e;if(null!=(null!=(d=this.bindings)?d[a]:void 0)){if(null==b)return delete this.bindings[a];for(c=0,e=[];cQ;Q++)K=U[Q],D[K]===!0&&(D[K]=u[K]);i=function(a){function b(){return V=b.__super__.constructor.apply(this,arguments)}return Z(b,a),b}(Error),b=function(){function a(){this.progress=0}return a.prototype.getElement=function(){var a;if(null==this.el){if(a=document.querySelector(D.target),!a)throw new i;this.el=document.createElement("div"),this.el.className="pace pace-active",document.body.className=document.body.className.replace(/pace-done/g,""),document.body.className+=" pace-running",this.el.innerHTML='
    \n
    \n
    \n
    ',null!=a.firstChild?a.insertBefore(this.el,a.firstChild):a.appendChild(this.el)}return this.el},a.prototype.finish=function(){var a;return a=this.getElement(),a.className=a.className.replace("pace-active",""),a.className+=" pace-inactive",document.body.className=document.body.className.replace("pace-running",""),document.body.className+=" pace-done"},a.prototype.update=function(a){return this.progress=a,this.render()},a.prototype.destroy=function(){try{this.getElement().parentNode.removeChild(this.getElement())}catch(a){i=a}return this.el=void 0},a.prototype.render=function(){var a,b,c,d,e,f,g;if(null==document.querySelector(D.target))return!1;for(a=this.getElement(),d="translate3d("+this.progress+"%, 0, 0)",g=["webkitTransform","msTransform","transform"],e=0,f=g.length;f>e;e++)b=g[e],a.children[0].style[b]=d;return(!this.lastRenderedProgress||this.lastRenderedProgress|0!==this.progress|0)&&(a.children[0].setAttribute("data-progress-text",""+(0|this.progress)+"%"),this.progress>=100?c="99":(c=this.progress<10?"0":"",c+=0|this.progress),a.children[0].setAttribute("data-progress",""+c)),this.lastRenderedProgress=this.progress},a.prototype.done=function(){return this.progress>=100},a}(),h=function(){function a(){this.bindings={}}return a.prototype.trigger=function(a,b){var c,d,e,f,g;if(null!=this.bindings[a]){for(f=this.bindings[a],g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(c.call(this,b));return g}},a.prototype.on=function(a,b){var c;return null==(c=this.bindings)[a]&&(c[a]=[]),this.bindings[a].push(b)},a}(),P=window.XMLHttpRequest,O=window.XDomainRequest,N=window.WebSocket,w=function(a,b){var c,d,e;e=[];for(d in b.prototype)try{e.push(null==a[d]&&"function"!=typeof b[d]?"function"==typeof Object.defineProperty?Object.defineProperty(a,d,{get:function(){return b.prototype[d]},configurable:!0,enumerable:!0}):a[d]=b.prototype[d]:void 0)}catch(f){c=f}return e},A=[],j.ignore=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?X.call(arguments,1):[],A.unshift("ignore"),c=b.apply(null,a),A.shift(),c},j.track=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?X.call(arguments,1):[],A.unshift("track"),c=b.apply(null,a),A.shift(),c},J=function(a){var b;if(null==a&&(a="GET"),"track"===A[0])return"force";if(!A.length&&D.ajax){if("socket"===a&&D.ajax.trackWebSockets)return!0;if(b=a.toUpperCase(),$.call(D.ajax.trackMethods,b)>=0)return!0}return!1},k=function(a){function b(){var a,c=this;b.__super__.constructor.apply(this,arguments),a=function(a){var b;return b=a.open,a.open=function(d,e){return J(d)&&c.trigger("request",{type:d,url:e,request:a}),b.apply(a,arguments)}},window.XMLHttpRequest=function(b){var c;return c=new P(b),a(c),c};try{w(window.XMLHttpRequest,P)}catch(d){}if(null!=O){window.XDomainRequest=function(){var b;return b=new O,a(b),b};try{w(window.XDomainRequest,O)}catch(d){}}if(null!=N&&D.ajax.trackWebSockets){window.WebSocket=function(a,b){var d;return d=null!=b?new N(a,b):new N(a),J("socket")&&c.trigger("request",{type:"socket",url:a,protocols:b,request:d}),d};try{w(window.WebSocket,N)}catch(d){}}}return Z(b,a),b}(h),R=null,y=function(){return null==R&&(R=new k),R},I=function(a){var b,c,d,e;for(e=D.ajax.ignoreURLs,c=0,d=e.length;d>c;c++)if(b=e[c],"string"==typeof b){if(-1!==a.indexOf(b))return!0}else if(b.test(a))return!0;return!1},y().on("request",function(b){var c,d,e,f,g;return f=b.type,e=b.request,g=b.url,I(g)?void 0:j.running||D.restartOnRequestAfter===!1&&"force"!==J(f)?void 0:(d=arguments,c=D.restartOnRequestAfter||0,"boolean"==typeof c&&(c=0),setTimeout(function(){var b,c,g,h,i,k;if(b="socket"===f?e.readyState<2:0<(h=e.readyState)&&4>h){for(j.restart(),i=j.sources,k=[],c=0,g=i.length;g>c;c++){if(K=i[c],K instanceof a){K.watch.apply(K,d);break}k.push(void 0)}return k}},c))}),a=function(){function a(){var a=this;this.elements=[],y().on("request",function(){return a.watch.apply(a,arguments)})}return a.prototype.watch=function(a){var b,c,d,e;return d=a.type,b=a.request,e=a.url,I(e)?void 0:(c="socket"===d?new n(b):new o(b),this.elements.push(c))},a}(),o=function(){function a(a){var b,c,d,e,f,g,h=this;if(this.progress=0,null!=window.ProgressEvent)for(c=null,a.addEventListener("progress",function(a){return h.progress=a.lengthComputable?100*a.loaded/a.total:h.progress+(100-h.progress)/2},!1),g=["load","abort","timeout","error"],d=0,e=g.length;e>d;d++)b=g[d],a.addEventListener(b,function(){return h.progress=100},!1);else f=a.onreadystatechange,a.onreadystatechange=function(){var b;return 0===(b=a.readyState)||4===b?h.progress=100:3===a.readyState&&(h.progress=50),"function"==typeof f?f.apply(null,arguments):void 0}}return a}(),n=function(){function a(a){var b,c,d,e,f=this;for(this.progress=0,e=["error","open"],c=0,d=e.length;d>c;c++)b=e[c],a.addEventListener(b,function(){return f.progress=100},!1)}return a}(),d=function(){function a(a){var b,c,d,f;for(null==a&&(a={}),this.elements=[],null==a.selectors&&(a.selectors=[]),f=a.selectors,c=0,d=f.length;d>c;c++)b=f[c],this.elements.push(new e(b))}return a}(),e=function(){function a(a){this.selector=a,this.progress=0,this.check()}return a.prototype.check=function(){var a=this;return document.querySelector(this.selector)?this.done():setTimeout(function(){return a.check()},D.elements.checkInterval)},a.prototype.done=function(){return this.progress=100},a}(),c=function(){function a(){var a,b,c=this;this.progress=null!=(b=this.states[document.readyState])?b:100,a=document.onreadystatechange,document.onreadystatechange=function(){return null!=c.states[document.readyState]&&(c.progress=c.states[document.readyState]),"function"==typeof a?a.apply(null,arguments):void 0}}return a.prototype.states={loading:0,interactive:50,complete:100},a}(),f=function(){function a(){var a,b,c,d,e,f=this;this.progress=0,a=0,e=[],d=0,c=C(),b=setInterval(function(){var g;return g=C()-c-50,c=C(),e.push(g),e.length>D.eventLag.sampleCount&&e.shift(),a=q(e),++d>=D.eventLag.minSamples&&a=100&&(this.done=!0),b===this.last?this.sinceLastUpdate+=a:(this.sinceLastUpdate&&(this.rate=(b-this.last)/this.sinceLastUpdate),this.catchup=(b-this.progress)/D.catchupTime,this.sinceLastUpdate=0,this.last=b),b>this.progress&&(this.progress+=this.catchup*a),c=1-Math.pow(this.progress/100,D.easeFactor),this.progress+=c*this.rate*a,this.progress=Math.min(this.lastProgress+D.maxProgressPerFrame,this.progress),this.progress=Math.max(0,this.progress),this.progress=Math.min(100,this.progress),this.lastProgress=this.progress,this.progress},a}(),L=null,H=null,r=null,M=null,p=null,s=null,j.running=!1,z=function(){return D.restartOnPushState?j.restart():void 0},null!=window.history.pushState&&(T=window.history.pushState,window.history.pushState=function(){return z(),T.apply(window.history,arguments)}),null!=window.history.replaceState&&(W=window.history.replaceState,window.history.replaceState=function(){return z(),W.apply(window.history,arguments)}),l={ajax:a,elements:d,document:c,eventLag:f},(B=function(){var a,c,d,e,f,g,h,i;for(j.sources=L=[],g=["ajax","elements","document","eventLag"],c=0,e=g.length;e>c;c++)a=g[c],D[a]!==!1&&L.push(new l[a](D[a]));for(i=null!=(h=D.extraSources)?h:[],d=0,f=i.length;f>d;d++)K=i[d],L.push(new K(D));return j.bar=r=new b,H=[],M=new m})(),j.stop=function(){return j.trigger("stop"),j.running=!1,r.destroy(),s=!0,null!=p&&("function"==typeof t&&t(p),p=null),B()},j.restart=function(){return j.trigger("restart"),j.stop(),j.start()},j.go=function(){var a;return j.running=!0,r.render(),a=C(),s=!1,p=G(function(b,c){var d,e,f,g,h,i,k,l,n,o,p,q,t,u,v,w;for(l=100-r.progress,e=p=0,f=!0,i=q=0,u=L.length;u>q;i=++q)for(K=L[i],o=null!=H[i]?H[i]:H[i]=[],h=null!=(w=K.elements)?w:[K],k=t=0,v=h.length;v>t;k=++t)g=h[k],n=null!=o[k]?o[k]:o[k]=new m(g),f&=n.done,n.done||(e++,p+=n.tick(b));return d=p/e,r.update(M.tick(b,d)),r.done()||f||s?(r.update(100),j.trigger("done"),setTimeout(function(){return r.finish(),j.running=!1,j.trigger("hide")},Math.max(D.ghostTime,Math.max(D.minTime-(C()-a),0)))):c()})},j.start=function(a){v(D,a),j.running=!0;try{r.render()}catch(b){i=b}return document.querySelector(".pace")?(j.trigger("start"),j.go()):setTimeout(j.start,50)},"function"==typeof define&&define.amd?define(["pace"],function(){return j}):"object"==typeof exports?module.exports=j:D.startOnPageLoad&&j.start()}).call(this); \ No newline at end of file diff --git a/public/bower_components/PACE/themes/black/pace-theme-barber-shop.css b/public/bower_components/PACE/themes/black/pace-theme-barber-shop.css new file mode 100755 index 0000000..b47be4c --- /dev/null +++ b/public/bower_components/PACE/themes/black/pace-theme-barber-shop.css @@ -0,0 +1,83 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + overflow: hidden; + position: fixed; + top: 0; + left: 0; + z-index: 2000; + width: 100%; + height: 12px; + background: #fff; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: #000000; + position: fixed; + top: 0; + bottom: 0; + right: 100%; + width: 100%; + overflow: hidden; +} + +.pace .pace-activity { + position: fixed; + top: 0; + right: -32px; + bottom: 0; + left: 0; + + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.2)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.2)), color-stop(0.75, rgba(255, 255, 255, 0.2)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + -webkit-background-size: 32px 32px; + -moz-background-size: 32px 32px; + -o-background-size: 32px 32px; + background-size: 32px 32px; + + -webkit-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -moz-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -ms-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -o-animation: pace-theme-barber-shop-motion 500ms linear infinite; + animation: pace-theme-barber-shop-motion 500ms linear infinite; +} + +@-webkit-keyframes pace-theme-barber-shop-motion { + 0% { -webkit-transform: none; transform: none; } + 100% { -webkit-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-moz-keyframes pace-theme-barber-shop-motion { + 0% { -moz-transform: none; transform: none; } + 100% { -moz-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-o-keyframes pace-theme-barber-shop-motion { + 0% { -o-transform: none; transform: none; } + 100% { -o-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-ms-keyframes pace-theme-barber-shop-motion { + 0% { -ms-transform: none; transform: none; } + 100% { -ms-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@keyframes pace-theme-barber-shop-motion { + 0% { transform: none; transform: none; } + 100% { transform: translate(-32px, 0); transform: translate(-32px, 0); } +} diff --git a/public/bower_components/PACE/themes/black/pace-theme-big-counter.css b/public/bower_components/PACE/themes/black/pace-theme-big-counter.css new file mode 100755 index 0000000..99d53ac --- /dev/null +++ b/public/bower_components/PACE/themes/black/pace-theme-big-counter.css @@ -0,0 +1,40 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace.pace-inactive .pace-progress { + display: none; +} + +.pace .pace-progress { + position: fixed; + z-index: 2000; + top: 0; + right: 0; + height: 5rem; + width: 5rem; + + -webkit-transform: translate3d(0, 0, 0) !important; + -ms-transform: translate3d(0, 0, 0) !important; + transform: translate3d(0, 0, 0) !important; +} + +.pace .pace-progress:after { + display: block; + position: absolute; + top: 0; + right: .5rem; + content: attr(data-progress-text); + font-family: "Helvetica Neue", sans-serif; + font-weight: 100; + font-size: 5rem; + line-height: 1; + text-align: right; + color: rgba(0, 0, 0, 0.19999999999999996); +} diff --git a/public/bower_components/PACE/themes/black/pace-theme-bounce.css b/public/bower_components/PACE/themes/black/pace-theme-bounce.css new file mode 100755 index 0000000..6ef4986 --- /dev/null +++ b/public/bower_components/PACE/themes/black/pace-theme-bounce.css @@ -0,0 +1,231 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + width: 140px; + height: 300px; + position: fixed; + top: -90px; + right: -20px; + z-index: 2000; + -webkit-transform: scale(0); + -moz-transform: scale(0); + -ms-transform: scale(0); + -o-transform: scale(0); + transform: scale(0); + opacity: 0; + -webkit-transition: all 2s linear 0s; + -moz-transition: all 2s linear 0s; + transition: all 2s linear 0s; +} + +.pace.pace-active { + -webkit-transform: scale(.25); + -moz-transform: scale(.25); + -ms-transform: scale(.25); + -o-transform: scale(.25); + transform: scale(.25); + opacity: 1; +} + +.pace .pace-activity { + width: 140px; + height: 140px; + border-radius: 70px; + background: #000000; + position: absolute; + top: 0; + z-index: 1911; + -webkit-animation: pace-bounce 1s infinite; + -moz-animation: pace-bounce 1s infinite; + -o-animation: pace-bounce 1s infinite; + -ms-animation: pace-bounce 1s infinite; + animation: pace-bounce 1s infinite; +} + +.pace .pace-progress { + position: absolute; + display: block; + left: 50%; + bottom: 0; + z-index: 1910; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -webkit-transform: scaleY(.3) !important; + -moz-transform: scaleY(.3) !important; + -ms-transform: scaleY(.3) !important; + -o-transform: scaleY(.3) !important; + transform: scaleY(.3) !important; + -webkit-animation: pace-compress .5s infinite alternate; + -moz-animation: pace-compress .5s infinite alternate; + -o-animation: pace-compress .5s infinite alternate; + -ms-animation: pace-compress .5s infinite alternate; + animation: pace-compress .5s infinite alternate; +} + +@-webkit-keyframes pace-bounce { + 0% { + top: 0; + -webkit-animation-timing-function: ease-in; + } + 40% {} + 50% { + top: 140px; + height: 140px; + -webkit-animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + -webkit-animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + -webkit-animation-timing-function: ease-out; + } + 95% { + top: 0; + -webkit-animation-timing-function: ease-in; + } + 100% { + top: 0; + -webkit-animation-timing-function: ease-in; + } +} + +@-moz-keyframes pace-bounce { + 0% { + top: 0; + -moz-animation-timing-function: ease-in; + } + 40% {} + 50% { + top: 140px; + height: 140px; + -moz-animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + -moz-animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + -moz-animation-timing-function: ease-out;} + 95% { + top: 0; + -moz-animation-timing-function: ease-in; + } + 100% {top: 0; + -moz-animation-timing-function: ease-in; + } +} + +@keyframes pace-bounce { + 0% { + top: 0; + animation-timing-function: ease-in; + } + 50% { + top: 140px; + height: 140px; + animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + animation-timing-function: ease-out; + } + 95% { + top: 0; + animation-timing-function: ease-in; + } + 100% { + top: 0; + animation-timing-function: ease-in; + } +} + +@-webkit-keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -webkit-animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + -webkit-animation-timing-function: ease-out; + } +} + +@-moz-keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -moz-animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + -moz-animation-timing-function: ease-out; + } +} + +@keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + animation-timing-function: ease-out; + } +} \ No newline at end of file diff --git a/public/bower_components/PACE/themes/black/pace-theme-center-atom.css b/public/bower_components/PACE/themes/black/pace-theme-center-atom.css new file mode 100755 index 0000000..3d8f4e1 --- /dev/null +++ b/public/bower_components/PACE/themes/black/pace-theme-center-atom.css @@ -0,0 +1,131 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace.pace-inactive { + display: none; +} + +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + height: 60px; + width: 100px; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace .pace-progress { + z-index: 2000; + position: absolute; + height: 60px; + width: 100px; + + -webkit-transform: translate3d(0, 0, 0) !important; + -ms-transform: translate3d(0, 0, 0) !important; + transform: translate3d(0, 0, 0) !important; +} + +.pace .pace-progress:before { + content: attr(data-progress-text); + text-align: center; + color: #fff; + background: #000000; + border-radius: 50%; + font-family: "Helvetica Neue", sans-serif; + font-size: 14px; + font-weight: 100; + line-height: 1; + padding: 20% 0 7px; + width: 50%; + height: 40%; + margin: 10px 0 0 30px; + display: block; + z-index: 999; + position: absolute; +} + +.pace .pace-activity { + font-size: 15px; + line-height: 1; + z-index: 2000; + position: absolute; + height: 60px; + width: 100px; + + display: block; + -webkit-animation: pace-theme-center-atom-spin 2s linear infinite; + -moz-animation: pace-theme-center-atom-spin 2s linear infinite; + -o-animation: pace-theme-center-atom-spin 2s linear infinite; + animation: pace-theme-center-atom-spin 2s linear infinite; +} + +.pace .pace-activity { + border-radius: 50%; + border: 5px solid #000000; + content: ' '; + display: block; + position: absolute; + top: 0; + left: 0; + height: 60px; + width: 100px; +} + +.pace .pace-activity:after { + border-radius: 50%; + border: 5px solid #000000; + content: ' '; + display: block; + position: absolute; + top: -5px; + left: -5px; + height: 60px; + width: 100px; + + -webkit-transform: rotate(60deg); + -moz-transform: rotate(60deg); + -o-transform: rotate(60deg); + transform: rotate(60deg); +} + +.pace .pace-activity:before { + border-radius: 50%; + border: 5px solid #000000; + content: ' '; + display: block; + position: absolute; + top: -5px; + left: -5px; + height: 60px; + width: 100px; + + -webkit-transform: rotate(120deg); + -moz-transform: rotate(120deg); + -o-transform: rotate(120deg); + transform: rotate(120deg); +} + +@-webkit-keyframes pace-theme-center-atom-spin { + 0% { -webkit-transform: rotate(0deg) } + 100% { -webkit-transform: rotate(359deg) } +} +@-moz-keyframes pace-theme-center-atom-spin { + 0% { -moz-transform: rotate(0deg) } + 100% { -moz-transform: rotate(359deg) } +} +@-o-keyframes pace-theme-center-atom-spin { + 0% { -o-transform: rotate(0deg) } + 100% { -o-transform: rotate(359deg) } +} +@keyframes pace-theme-center-atom-spin { + 0% { transform: rotate(0deg) } + 100% { transform: rotate(359deg) } +} diff --git a/public/bower_components/PACE/themes/black/pace-theme-center-circle.css b/public/bower_components/PACE/themes/black/pace-theme-center-circle.css new file mode 100755 index 0000000..2721f9a --- /dev/null +++ b/public/bower_components/PACE/themes/black/pace-theme-center-circle.css @@ -0,0 +1,90 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + -webkit-perspective: 12rem; + -moz-perspective: 12rem; + -ms-perspective: 12rem; + -o-perspective: 12rem; + perspective: 12rem; + + z-index: 2000; + position: fixed; + height: 6rem; + width: 6rem; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace.pace-inactive .pace-progress { + display: none; +} + +.pace .pace-progress { + position: fixed; + z-index: 2000; + display: block; + position: absolute; + left: 0; + top: 0; + height: 6rem; + width: 6rem !important; + line-height: 6rem; + font-size: 2rem; + border-radius: 50%; + background: rgba(0, 0, 0, 0.8); + color: #fff; + font-family: "Helvetica Neue", sans-serif; + font-weight: 100; + text-align: center; + + -webkit-animation: pace-theme-center-circle-spin linear infinite 2s; + -moz-animation: pace-theme-center-circle-spin linear infinite 2s; + -ms-animation: pace-theme-center-circle-spin linear infinite 2s; + -o-animation: pace-theme-center-circle-spin linear infinite 2s; + animation: pace-theme-center-circle-spin linear infinite 2s; + + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + -ms-transform-style: preserve-3d; + -o-transform-style: preserve-3d; + transform-style: preserve-3d; +} + +.pace .pace-progress:after { + content: attr(data-progress-text); + display: block; +} + +@-webkit-keyframes pace-theme-center-circle-spin { + from { -webkit-transform: rotateY(0deg) } + to { -webkit-transform: rotateY(360deg) } +} + +@-moz-keyframes pace-theme-center-circle-spin { + from { -moz-transform: rotateY(0deg) } + to { -moz-transform: rotateY(360deg) } +} + +@-ms-keyframes pace-theme-center-circle-spin { + from { -ms-transform: rotateY(0deg) } + to { -ms-transform: rotateY(360deg) } +} + +@-o-keyframes pace-theme-center-circle-spin { + from { -o-transform: rotateY(0deg) } + to { -o-transform: rotateY(360deg) } +} + +@keyframes pace-theme-center-circle-spin { + from { transform: rotateY(0deg) } + to { transform: rotateY(360deg) } +} diff --git a/public/bower_components/PACE/themes/black/pace-theme-center-radar.css b/public/bower_components/PACE/themes/black/pace-theme-center-radar.css new file mode 100755 index 0000000..214667e --- /dev/null +++ b/public/bower_components/PACE/themes/black/pace-theme-center-radar.css @@ -0,0 +1,74 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + height: 90px; + width: 90px; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace.pace-inactive .pace-activity { + display: none; +} + +.pace .pace-activity { + position: fixed; + z-index: 2000; + display: block; + position: absolute; + left: -30px; + top: -30px; + height: 90px; + width: 90px; + display: block; + border-width: 30px; + border-style: double; + border-color: #000000 transparent transparent; + border-radius: 50%; + + -webkit-animation: spin 1s linear infinite; + -moz-animation: spin 1s linear infinite; + -o-animation: spin 1s linear infinite; + animation: spin 1s linear infinite; +} + +.pace .pace-activity:before { + content: ' '; + position: absolute; + top: 10px; + left: 10px; + height: 50px; + width: 50px; + display: block; + border-width: 10px; + border-style: solid; + border-color: #000000 transparent transparent; + border-radius: 50%; +} + +@-webkit-keyframes spin { + 100% { -webkit-transform: rotate(359deg); } +} + +@-moz-keyframes spin { + 100% { -moz-transform: rotate(359deg); } +} + +@-o-keyframes spin { + 100% { -moz-transform: rotate(359deg); } +} + +@keyframes spin { + 100% { transform: rotate(359deg); } +} diff --git a/public/bower_components/PACE/themes/black/pace-theme-center-simple.css b/public/bower_components/PACE/themes/black/pace-theme-center-simple.css new file mode 100755 index 0000000..e7e368e --- /dev/null +++ b/public/bower_components/PACE/themes/black/pace-theme-center-simple.css @@ -0,0 +1,52 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; + height: 5px; + width: 200px; + background: #fff; + border: 1px solid #000000; + + overflow: hidden; +} + +.pace .pace-progress { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + max-width: 200px; + position: fixed; + z-index: 2000; + display: block; + position: absolute; + top: 0; + right: 100%; + height: 100%; + width: 100%; + background: #000000; +} + +.pace.pace-inactive { + display: none; +} \ No newline at end of file diff --git a/public/bower_components/PACE/themes/black/pace-theme-corner-indicator.css b/public/bower_components/PACE/themes/black/pace-theme-corner-indicator.css new file mode 100755 index 0000000..98c7cd6 --- /dev/null +++ b/public/bower_components/PACE/themes/black/pace-theme-corner-indicator.css @@ -0,0 +1,73 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace .pace-activity { + display: block; + position: fixed; + z-index: 2000; + top: 0; + right: 0; + width: 300px; + height: 300px; + background: #000000; + -webkit-transition: -webkit-transform 0.3s; + transition: transform 0.3s; + -webkit-transform: translateX(100%) translateY(-100%) rotate(45deg); + transform: translateX(100%) translateY(-100%) rotate(45deg); + pointer-events: none; +} + +.pace.pace-active .pace-activity { + -webkit-transform: translateX(50%) translateY(-50%) rotate(45deg); + transform: translateX(50%) translateY(-50%) rotate(45deg); +} + +.pace .pace-activity::before, +.pace .pace-activity::after { + -moz-box-sizing: border-box; + box-sizing: border-box; + position: absolute; + bottom: 30px; + left: 50%; + display: block; + border: 5px solid #fff; + border-radius: 50%; + content: ''; +} + +.pace .pace-activity::before { + margin-left: -40px; + width: 80px; + height: 80px; + border-right-color: rgba(0, 0, 0, .2); + border-left-color: rgba(0, 0, 0, .2); + -webkit-animation: pace-theme-corner-indicator-spin 3s linear infinite; + animation: pace-theme-corner-indicator-spin 3s linear infinite; +} + +.pace .pace-activity::after { + bottom: 50px; + margin-left: -20px; + width: 40px; + height: 40px; + border-top-color: rgba(0, 0, 0, .2); + border-bottom-color: rgba(0, 0, 0, .2); + -webkit-animation: pace-theme-corner-indicator-spin 1s linear infinite; + animation: pace-theme-corner-indicator-spin 1s linear infinite; +} + +@-webkit-keyframes pace-theme-corner-indicator-spin { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(359deg); } +} +@keyframes pace-theme-corner-indicator-spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(359deg); } +} diff --git a/public/bower_components/PACE/themes/black/pace-theme-fill-left.css b/public/bower_components/PACE/themes/black/pace-theme-fill-left.css new file mode 100755 index 0000000..474ce65 --- /dev/null +++ b/public/bower_components/PACE/themes/black/pace-theme-fill-left.css @@ -0,0 +1,22 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: rgba(0, 0, 0, 0.19999999999999996); + position: fixed; + z-index: -1; + top: 0; + right: 100%; + bottom: 0; + width: 100%; +} diff --git a/public/bower_components/PACE/themes/black/pace-theme-flash.css b/public/bower_components/PACE/themes/black/pace-theme-flash.css new file mode 100755 index 0000000..089ded0 --- /dev/null +++ b/public/bower_components/PACE/themes/black/pace-theme-flash.css @@ -0,0 +1,77 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background: #000000; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 2px; +} + +.pace .pace-progress-inner { + display: block; + position: absolute; + right: 0px; + width: 100px; + height: 100%; + box-shadow: 0 0 10px #000000, 0 0 5px #000000; + opacity: 1.0; + -webkit-transform: rotate(3deg) translate(0px, -4px); + -moz-transform: rotate(3deg) translate(0px, -4px); + -ms-transform: rotate(3deg) translate(0px, -4px); + -o-transform: rotate(3deg) translate(0px, -4px); + transform: rotate(3deg) translate(0px, -4px); +} + +.pace .pace-activity { + display: block; + position: fixed; + z-index: 2000; + top: 15px; + right: 15px; + width: 14px; + height: 14px; + border: solid 2px transparent; + border-top-color: #000000; + border-left-color: #000000; + border-radius: 10px; + -webkit-animation: pace-spinner 400ms linear infinite; + -moz-animation: pace-spinner 400ms linear infinite; + -ms-animation: pace-spinner 400ms linear infinite; + -o-animation: pace-spinner 400ms linear infinite; + animation: pace-spinner 400ms linear infinite; +} + +@-webkit-keyframes pace-spinner { + 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } +} +@-moz-keyframes pace-spinner { + 0% { -moz-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -moz-transform: rotate(360deg); transform: rotate(360deg); } +} +@-o-keyframes pace-spinner { + 0% { -o-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -o-transform: rotate(360deg); transform: rotate(360deg); } +} +@-ms-keyframes pace-spinner { + 0% { -ms-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -ms-transform: rotate(360deg); transform: rotate(360deg); } +} +@keyframes pace-spinner { + 0% { transform: rotate(0deg); transform: rotate(0deg); } + 100% { transform: rotate(360deg); transform: rotate(360deg); } +} diff --git a/public/bower_components/PACE/themes/black/pace-theme-flat-top.css b/public/bower_components/PACE/themes/black/pace-theme-flat-top.css new file mode 100755 index 0000000..0fa069b --- /dev/null +++ b/public/bower_components/PACE/themes/black/pace-theme-flat-top.css @@ -0,0 +1,41 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + position: fixed; + top: 0; + left: 0; + width: 100%; + + -webkit-transform: translate3d(0, -50px, 0); + -ms-transform: translate3d(0, -50px, 0); + transform: translate3d(0, -50px, 0); + + -webkit-transition: -webkit-transform .5s ease-out; + -ms-transition: -webkit-transform .5s ease-out; + transition: transform .5s ease-out; +} + +.pace.pace-active { + -webkit-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} + +.pace .pace-progress { + display: block; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 10px; + background: #000000; + + pointer-events: none; +} diff --git a/public/bower_components/PACE/themes/black/pace-theme-loading-bar.css b/public/bower_components/PACE/themes/black/pace-theme-loading-bar.css new file mode 100755 index 0000000..1b94202 --- /dev/null +++ b/public/bower_components/PACE/themes/black/pace-theme-loading-bar.css @@ -0,0 +1,198 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; + + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + z-index: 2000; + position: fixed; + margin: auto; + top: 12px; + left: 0; + right: 0; + bottom: 0; + width: 200px; + height: 50px; + overflow: hidden; +} + +.pace .pace-progress { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + display: block; + position: absolute; + right: 100%; + margin-right: -7px; + width: 93%; + top: 7px; + height: 14px; + font-size: 12px; + background: #000000; + color: #000000; + line-height: 60px; + font-weight: bold; + font-family: Helvetica, Arial, "Lucida Grande", sans-serif; + + -webkit-box-shadow: 120px 0 #fff, 240px 0 #fff; + -ms-box-shadow: 120px 0 #fff, 240px 0 #fff; + box-shadow: 120px 0 #fff, 240px 0 #fff; +} + +.pace .pace-progress:after { + content: attr(data-progress-text); + display: inline-block; + position: fixed; + width: 45px; + text-align: right; + right: 0; + padding-right: 16px; + top: 4px; +} + +.pace .pace-progress[data-progress-text="0%"]:after { right: -200px } +.pace .pace-progress[data-progress-text="1%"]:after { right: -198.14px } +.pace .pace-progress[data-progress-text="2%"]:after { right: -196.28px } +.pace .pace-progress[data-progress-text="3%"]:after { right: -194.42px } +.pace .pace-progress[data-progress-text="4%"]:after { right: -192.56px } +.pace .pace-progress[data-progress-text="5%"]:after { right: -190.7px } +.pace .pace-progress[data-progress-text="6%"]:after { right: -188.84px } +.pace .pace-progress[data-progress-text="7%"]:after { right: -186.98px } +.pace .pace-progress[data-progress-text="8%"]:after { right: -185.12px } +.pace .pace-progress[data-progress-text="9%"]:after { right: -183.26px } +.pace .pace-progress[data-progress-text="10%"]:after { right: -181.4px } +.pace .pace-progress[data-progress-text="11%"]:after { right: -179.54px } +.pace .pace-progress[data-progress-text="12%"]:after { right: -177.68px } +.pace .pace-progress[data-progress-text="13%"]:after { right: -175.82px } +.pace .pace-progress[data-progress-text="14%"]:after { right: -173.96px } +.pace .pace-progress[data-progress-text="15%"]:after { right: -172.1px } +.pace .pace-progress[data-progress-text="16%"]:after { right: -170.24px } +.pace .pace-progress[data-progress-text="17%"]:after { right: -168.38px } +.pace .pace-progress[data-progress-text="18%"]:after { right: -166.52px } +.pace .pace-progress[data-progress-text="19%"]:after { right: -164.66px } +.pace .pace-progress[data-progress-text="20%"]:after { right: -162.8px } +.pace .pace-progress[data-progress-text="21%"]:after { right: -160.94px } +.pace .pace-progress[data-progress-text="22%"]:after { right: -159.08px } +.pace .pace-progress[data-progress-text="23%"]:after { right: -157.22px } +.pace .pace-progress[data-progress-text="24%"]:after { right: -155.36px } +.pace .pace-progress[data-progress-text="25%"]:after { right: -153.5px } +.pace .pace-progress[data-progress-text="26%"]:after { right: -151.64px } +.pace .pace-progress[data-progress-text="27%"]:after { right: -149.78px } +.pace .pace-progress[data-progress-text="28%"]:after { right: -147.92px } +.pace .pace-progress[data-progress-text="29%"]:after { right: -146.06px } +.pace .pace-progress[data-progress-text="30%"]:after { right: -144.2px } +.pace .pace-progress[data-progress-text="31%"]:after { right: -142.34px } +.pace .pace-progress[data-progress-text="32%"]:after { right: -140.48px } +.pace .pace-progress[data-progress-text="33%"]:after { right: -138.62px } +.pace .pace-progress[data-progress-text="34%"]:after { right: -136.76px } +.pace .pace-progress[data-progress-text="35%"]:after { right: -134.9px } +.pace .pace-progress[data-progress-text="36%"]:after { right: -133.04px } +.pace .pace-progress[data-progress-text="37%"]:after { right: -131.18px } +.pace .pace-progress[data-progress-text="38%"]:after { right: -129.32px } +.pace .pace-progress[data-progress-text="39%"]:after { right: -127.46px } +.pace .pace-progress[data-progress-text="40%"]:after { right: -125.6px } +.pace .pace-progress[data-progress-text="41%"]:after { right: -123.74px } +.pace .pace-progress[data-progress-text="42%"]:after { right: -121.88px } +.pace .pace-progress[data-progress-text="43%"]:after { right: -120.02px } +.pace .pace-progress[data-progress-text="44%"]:after { right: -118.16px } +.pace .pace-progress[data-progress-text="45%"]:after { right: -116.3px } +.pace .pace-progress[data-progress-text="46%"]:after { right: -114.44px } +.pace .pace-progress[data-progress-text="47%"]:after { right: -112.58px } +.pace .pace-progress[data-progress-text="48%"]:after { right: -110.72px } +.pace .pace-progress[data-progress-text="49%"]:after { right: -108.86px } +.pace .pace-progress[data-progress-text="50%"]:after { right: -107px } +.pace .pace-progress[data-progress-text="51%"]:after { right: -105.14px } +.pace .pace-progress[data-progress-text="52%"]:after { right: -103.28px } +.pace .pace-progress[data-progress-text="53%"]:after { right: -101.42px } +.pace .pace-progress[data-progress-text="54%"]:after { right: -99.56px } +.pace .pace-progress[data-progress-text="55%"]:after { right: -97.7px } +.pace .pace-progress[data-progress-text="56%"]:after { right: -95.84px } +.pace .pace-progress[data-progress-text="57%"]:after { right: -93.98px } +.pace .pace-progress[data-progress-text="58%"]:after { right: -92.12px } +.pace .pace-progress[data-progress-text="59%"]:after { right: -90.26px } +.pace .pace-progress[data-progress-text="60%"]:after { right: -88.4px } +.pace .pace-progress[data-progress-text="61%"]:after { right: -86.53999999999999px } +.pace .pace-progress[data-progress-text="62%"]:after { right: -84.68px } +.pace .pace-progress[data-progress-text="63%"]:after { right: -82.82px } +.pace .pace-progress[data-progress-text="64%"]:after { right: -80.96000000000001px } +.pace .pace-progress[data-progress-text="65%"]:after { right: -79.1px } +.pace .pace-progress[data-progress-text="66%"]:after { right: -77.24px } +.pace .pace-progress[data-progress-text="67%"]:after { right: -75.38px } +.pace .pace-progress[data-progress-text="68%"]:after { right: -73.52px } +.pace .pace-progress[data-progress-text="69%"]:after { right: -71.66px } +.pace .pace-progress[data-progress-text="70%"]:after { right: -69.8px } +.pace .pace-progress[data-progress-text="71%"]:after { right: -67.94px } +.pace .pace-progress[data-progress-text="72%"]:after { right: -66.08px } +.pace .pace-progress[data-progress-text="73%"]:after { right: -64.22px } +.pace .pace-progress[data-progress-text="74%"]:after { right: -62.36px } +.pace .pace-progress[data-progress-text="75%"]:after { right: -60.5px } +.pace .pace-progress[data-progress-text="76%"]:after { right: -58.64px } +.pace .pace-progress[data-progress-text="77%"]:after { right: -56.78px } +.pace .pace-progress[data-progress-text="78%"]:after { right: -54.92px } +.pace .pace-progress[data-progress-text="79%"]:after { right: -53.06px } +.pace .pace-progress[data-progress-text="80%"]:after { right: -51.2px } +.pace .pace-progress[data-progress-text="81%"]:after { right: -49.34px } +.pace .pace-progress[data-progress-text="82%"]:after { right: -47.480000000000004px } +.pace .pace-progress[data-progress-text="83%"]:after { right: -45.62px } +.pace .pace-progress[data-progress-text="84%"]:after { right: -43.76px } +.pace .pace-progress[data-progress-text="85%"]:after { right: -41.9px } +.pace .pace-progress[data-progress-text="86%"]:after { right: -40.04px } +.pace .pace-progress[data-progress-text="87%"]:after { right: -38.18px } +.pace .pace-progress[data-progress-text="88%"]:after { right: -36.32px } +.pace .pace-progress[data-progress-text="89%"]:after { right: -34.46px } +.pace .pace-progress[data-progress-text="90%"]:after { right: -32.6px } +.pace .pace-progress[data-progress-text="91%"]:after { right: -30.740000000000002px } +.pace .pace-progress[data-progress-text="92%"]:after { right: -28.880000000000003px } +.pace .pace-progress[data-progress-text="93%"]:after { right: -27.02px } +.pace .pace-progress[data-progress-text="94%"]:after { right: -25.16px } +.pace .pace-progress[data-progress-text="95%"]:after { right: -23.3px } +.pace .pace-progress[data-progress-text="96%"]:after { right: -21.439999999999998px } +.pace .pace-progress[data-progress-text="97%"]:after { right: -19.58px } +.pace .pace-progress[data-progress-text="98%"]:after { right: -17.72px } +.pace .pace-progress[data-progress-text="99%"]:after { right: -15.86px } +.pace .pace-progress[data-progress-text="100%"]:after { right: -14px } + + +.pace .pace-activity { + position: absolute; + width: 100%; + height: 28px; + z-index: 2001; + box-shadow: inset 0 0 0 2px #000000, inset 0 0 0 7px #FFF; + border-radius: 10px; +} + +.pace.pace-inactive { + display: none; +} diff --git a/public/bower_components/PACE/themes/black/pace-theme-mac-osx.css b/public/bower_components/PACE/themes/black/pace-theme-mac-osx.css new file mode 100755 index 0000000..f096d2c --- /dev/null +++ b/public/bower_components/PACE/themes/black/pace-theme-mac-osx.css @@ -0,0 +1,87 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + overflow: hidden; + position: fixed; + top: 0; + left: 0; + z-index: 2000; + width: 100%; + height: 12px; + background: #fff; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: #000000; + position: fixed; + top: 0; + right: 100%; + width: 100%; + height: 12px; + overflow: hidden; + + -webkit-border-radius: 0 0 4px 0; + -moz-border-radius: 0 0 4px 0; + -o-border-radius: 0 0 4px 0; + border-radius: 0 0 4px 0; + + -webkit-box-shadow: inset -1px 0 #000000, inset 0 -1px #000000, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + -moz-box-shadow: inset -1px 0 #000000, inset 0 -1px #000000, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + -o-box-shadow: inset -1px 0 #000000, inset 0 -1px #000000, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + box-shadow: inset -1px 0 #000000, inset 0 -1px #000000, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); +} + +.pace .pace-activity { + position: fixed; + top: 0; + left: 0; + right: -28px; + bottom: 0; + + -webkit-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + -moz-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + -o-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + + -webkit-background-size: 28px 100%; + -moz-background-size: 28px 100%; + -o-background-size: 28px 100%; + background-size: 28px 100%; + + -webkit-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -moz-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -ms-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -o-animation: pace-theme-mac-osx-motion 500ms linear infinite; + animation: pace-theme-mac-osx-motion 500ms linear infinite; +} + +@-webkit-keyframes pace-theme-mac-osx-motion { + 0% { -webkit-transform: none; transform: none; } + 100% { -webkit-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-moz-keyframes pace-theme-mac-osx-motion { + 0% { -moz-transform: none; transform: none; } + 100% { -moz-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-o-keyframes pace-theme-mac-osx-motion { + 0% { -o-transform: none; transform: none; } + 100% { -o-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-ms-keyframes pace-theme-mac-osx-motion { + 0% { -ms-transform: none; transform: none; } + 100% { -ms-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@keyframes pace-theme-mac-osx-motion { + 0% { transform: none; transform: none; } + 100% { transform: translate(-28px, 0); transform: translate(-28px, 0); } +} diff --git a/public/bower_components/PACE/themes/black/pace-theme-minimal.css b/public/bower_components/PACE/themes/black/pace-theme-minimal.css new file mode 100755 index 0000000..671ef84 --- /dev/null +++ b/public/bower_components/PACE/themes/black/pace-theme-minimal.css @@ -0,0 +1,23 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background: #000000; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 2px; +} diff --git a/public/bower_components/PACE/themes/blue/pace-theme-barber-shop.css b/public/bower_components/PACE/themes/blue/pace-theme-barber-shop.css new file mode 100755 index 0000000..f4285bd --- /dev/null +++ b/public/bower_components/PACE/themes/blue/pace-theme-barber-shop.css @@ -0,0 +1,83 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + overflow: hidden; + position: fixed; + top: 0; + left: 0; + z-index: 2000; + width: 100%; + height: 12px; + background: #fff; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: #2299dd; + position: fixed; + top: 0; + bottom: 0; + right: 100%; + width: 100%; + overflow: hidden; +} + +.pace .pace-activity { + position: fixed; + top: 0; + right: -32px; + bottom: 0; + left: 0; + + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.2)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.2)), color-stop(0.75, rgba(255, 255, 255, 0.2)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + -webkit-background-size: 32px 32px; + -moz-background-size: 32px 32px; + -o-background-size: 32px 32px; + background-size: 32px 32px; + + -webkit-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -moz-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -ms-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -o-animation: pace-theme-barber-shop-motion 500ms linear infinite; + animation: pace-theme-barber-shop-motion 500ms linear infinite; +} + +@-webkit-keyframes pace-theme-barber-shop-motion { + 0% { -webkit-transform: none; transform: none; } + 100% { -webkit-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-moz-keyframes pace-theme-barber-shop-motion { + 0% { -moz-transform: none; transform: none; } + 100% { -moz-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-o-keyframes pace-theme-barber-shop-motion { + 0% { -o-transform: none; transform: none; } + 100% { -o-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-ms-keyframes pace-theme-barber-shop-motion { + 0% { -ms-transform: none; transform: none; } + 100% { -ms-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@keyframes pace-theme-barber-shop-motion { + 0% { transform: none; transform: none; } + 100% { transform: translate(-32px, 0); transform: translate(-32px, 0); } +} diff --git a/public/bower_components/PACE/themes/blue/pace-theme-big-counter.css b/public/bower_components/PACE/themes/blue/pace-theme-big-counter.css new file mode 100755 index 0000000..d9c576d --- /dev/null +++ b/public/bower_components/PACE/themes/blue/pace-theme-big-counter.css @@ -0,0 +1,40 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace.pace-inactive .pace-progress { + display: none; +} + +.pace .pace-progress { + position: fixed; + z-index: 2000; + top: 0; + right: 0; + height: 5rem; + width: 5rem; + + -webkit-transform: translate3d(0, 0, 0) !important; + -ms-transform: translate3d(0, 0, 0) !important; + transform: translate3d(0, 0, 0) !important; +} + +.pace .pace-progress:after { + display: block; + position: absolute; + top: 0; + right: .5rem; + content: attr(data-progress-text); + font-family: "Helvetica Neue", sans-serif; + font-weight: 100; + font-size: 5rem; + line-height: 1; + text-align: right; + color: rgba(34, 153, 221, 0.19999999999999996); +} diff --git a/public/bower_components/PACE/themes/blue/pace-theme-bounce.css b/public/bower_components/PACE/themes/blue/pace-theme-bounce.css new file mode 100755 index 0000000..f479865 --- /dev/null +++ b/public/bower_components/PACE/themes/blue/pace-theme-bounce.css @@ -0,0 +1,231 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + width: 140px; + height: 300px; + position: fixed; + top: -90px; + right: -20px; + z-index: 2000; + -webkit-transform: scale(0); + -moz-transform: scale(0); + -ms-transform: scale(0); + -o-transform: scale(0); + transform: scale(0); + opacity: 0; + -webkit-transition: all 2s linear 0s; + -moz-transition: all 2s linear 0s; + transition: all 2s linear 0s; +} + +.pace.pace-active { + -webkit-transform: scale(.25); + -moz-transform: scale(.25); + -ms-transform: scale(.25); + -o-transform: scale(.25); + transform: scale(.25); + opacity: 1; +} + +.pace .pace-activity { + width: 140px; + height: 140px; + border-radius: 70px; + background: #2299dd; + position: absolute; + top: 0; + z-index: 1911; + -webkit-animation: pace-bounce 1s infinite; + -moz-animation: pace-bounce 1s infinite; + -o-animation: pace-bounce 1s infinite; + -ms-animation: pace-bounce 1s infinite; + animation: pace-bounce 1s infinite; +} + +.pace .pace-progress { + position: absolute; + display: block; + left: 50%; + bottom: 0; + z-index: 1910; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -webkit-transform: scaleY(.3) !important; + -moz-transform: scaleY(.3) !important; + -ms-transform: scaleY(.3) !important; + -o-transform: scaleY(.3) !important; + transform: scaleY(.3) !important; + -webkit-animation: pace-compress .5s infinite alternate; + -moz-animation: pace-compress .5s infinite alternate; + -o-animation: pace-compress .5s infinite alternate; + -ms-animation: pace-compress .5s infinite alternate; + animation: pace-compress .5s infinite alternate; +} + +@-webkit-keyframes pace-bounce { + 0% { + top: 0; + -webkit-animation-timing-function: ease-in; + } + 40% {} + 50% { + top: 140px; + height: 140px; + -webkit-animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + -webkit-animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + -webkit-animation-timing-function: ease-out; + } + 95% { + top: 0; + -webkit-animation-timing-function: ease-in; + } + 100% { + top: 0; + -webkit-animation-timing-function: ease-in; + } +} + +@-moz-keyframes pace-bounce { + 0% { + top: 0; + -moz-animation-timing-function: ease-in; + } + 40% {} + 50% { + top: 140px; + height: 140px; + -moz-animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + -moz-animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + -moz-animation-timing-function: ease-out;} + 95% { + top: 0; + -moz-animation-timing-function: ease-in; + } + 100% {top: 0; + -moz-animation-timing-function: ease-in; + } +} + +@keyframes pace-bounce { + 0% { + top: 0; + animation-timing-function: ease-in; + } + 50% { + top: 140px; + height: 140px; + animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + animation-timing-function: ease-out; + } + 95% { + top: 0; + animation-timing-function: ease-in; + } + 100% { + top: 0; + animation-timing-function: ease-in; + } +} + +@-webkit-keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -webkit-animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + -webkit-animation-timing-function: ease-out; + } +} + +@-moz-keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -moz-animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + -moz-animation-timing-function: ease-out; + } +} + +@keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + animation-timing-function: ease-out; + } +} \ No newline at end of file diff --git a/public/bower_components/PACE/themes/blue/pace-theme-center-atom.css b/public/bower_components/PACE/themes/blue/pace-theme-center-atom.css new file mode 100755 index 0000000..c178cd8 --- /dev/null +++ b/public/bower_components/PACE/themes/blue/pace-theme-center-atom.css @@ -0,0 +1,131 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace.pace-inactive { + display: none; +} + +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + height: 60px; + width: 100px; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace .pace-progress { + z-index: 2000; + position: absolute; + height: 60px; + width: 100px; + + -webkit-transform: translate3d(0, 0, 0) !important; + -ms-transform: translate3d(0, 0, 0) !important; + transform: translate3d(0, 0, 0) !important; +} + +.pace .pace-progress:before { + content: attr(data-progress-text); + text-align: center; + color: #fff; + background: #2299dd; + border-radius: 50%; + font-family: "Helvetica Neue", sans-serif; + font-size: 14px; + font-weight: 100; + line-height: 1; + padding: 20% 0 7px; + width: 50%; + height: 40%; + margin: 10px 0 0 30px; + display: block; + z-index: 999; + position: absolute; +} + +.pace .pace-activity { + font-size: 15px; + line-height: 1; + z-index: 2000; + position: absolute; + height: 60px; + width: 100px; + + display: block; + -webkit-animation: pace-theme-center-atom-spin 2s linear infinite; + -moz-animation: pace-theme-center-atom-spin 2s linear infinite; + -o-animation: pace-theme-center-atom-spin 2s linear infinite; + animation: pace-theme-center-atom-spin 2s linear infinite; +} + +.pace .pace-activity { + border-radius: 50%; + border: 5px solid #2299dd; + content: ' '; + display: block; + position: absolute; + top: 0; + left: 0; + height: 60px; + width: 100px; +} + +.pace .pace-activity:after { + border-radius: 50%; + border: 5px solid #2299dd; + content: ' '; + display: block; + position: absolute; + top: -5px; + left: -5px; + height: 60px; + width: 100px; + + -webkit-transform: rotate(60deg); + -moz-transform: rotate(60deg); + -o-transform: rotate(60deg); + transform: rotate(60deg); +} + +.pace .pace-activity:before { + border-radius: 50%; + border: 5px solid #2299dd; + content: ' '; + display: block; + position: absolute; + top: -5px; + left: -5px; + height: 60px; + width: 100px; + + -webkit-transform: rotate(120deg); + -moz-transform: rotate(120deg); + -o-transform: rotate(120deg); + transform: rotate(120deg); +} + +@-webkit-keyframes pace-theme-center-atom-spin { + 0% { -webkit-transform: rotate(0deg) } + 100% { -webkit-transform: rotate(359deg) } +} +@-moz-keyframes pace-theme-center-atom-spin { + 0% { -moz-transform: rotate(0deg) } + 100% { -moz-transform: rotate(359deg) } +} +@-o-keyframes pace-theme-center-atom-spin { + 0% { -o-transform: rotate(0deg) } + 100% { -o-transform: rotate(359deg) } +} +@keyframes pace-theme-center-atom-spin { + 0% { transform: rotate(0deg) } + 100% { transform: rotate(359deg) } +} diff --git a/public/bower_components/PACE/themes/blue/pace-theme-center-circle.css b/public/bower_components/PACE/themes/blue/pace-theme-center-circle.css new file mode 100755 index 0000000..403ab0d --- /dev/null +++ b/public/bower_components/PACE/themes/blue/pace-theme-center-circle.css @@ -0,0 +1,90 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + -webkit-perspective: 12rem; + -moz-perspective: 12rem; + -ms-perspective: 12rem; + -o-perspective: 12rem; + perspective: 12rem; + + z-index: 2000; + position: fixed; + height: 6rem; + width: 6rem; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace.pace-inactive .pace-progress { + display: none; +} + +.pace .pace-progress { + position: fixed; + z-index: 2000; + display: block; + position: absolute; + left: 0; + top: 0; + height: 6rem; + width: 6rem !important; + line-height: 6rem; + font-size: 2rem; + border-radius: 50%; + background: rgba(34, 153, 221, 0.8); + color: #fff; + font-family: "Helvetica Neue", sans-serif; + font-weight: 100; + text-align: center; + + -webkit-animation: pace-theme-center-circle-spin linear infinite 2s; + -moz-animation: pace-theme-center-circle-spin linear infinite 2s; + -ms-animation: pace-theme-center-circle-spin linear infinite 2s; + -o-animation: pace-theme-center-circle-spin linear infinite 2s; + animation: pace-theme-center-circle-spin linear infinite 2s; + + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + -ms-transform-style: preserve-3d; + -o-transform-style: preserve-3d; + transform-style: preserve-3d; +} + +.pace .pace-progress:after { + content: attr(data-progress-text); + display: block; +} + +@-webkit-keyframes pace-theme-center-circle-spin { + from { -webkit-transform: rotateY(0deg) } + to { -webkit-transform: rotateY(360deg) } +} + +@-moz-keyframes pace-theme-center-circle-spin { + from { -moz-transform: rotateY(0deg) } + to { -moz-transform: rotateY(360deg) } +} + +@-ms-keyframes pace-theme-center-circle-spin { + from { -ms-transform: rotateY(0deg) } + to { -ms-transform: rotateY(360deg) } +} + +@-o-keyframes pace-theme-center-circle-spin { + from { -o-transform: rotateY(0deg) } + to { -o-transform: rotateY(360deg) } +} + +@keyframes pace-theme-center-circle-spin { + from { transform: rotateY(0deg) } + to { transform: rotateY(360deg) } +} diff --git a/public/bower_components/PACE/themes/blue/pace-theme-center-radar.css b/public/bower_components/PACE/themes/blue/pace-theme-center-radar.css new file mode 100755 index 0000000..018362f --- /dev/null +++ b/public/bower_components/PACE/themes/blue/pace-theme-center-radar.css @@ -0,0 +1,74 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + height: 90px; + width: 90px; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace.pace-inactive .pace-activity { + display: none; +} + +.pace .pace-activity { + position: fixed; + z-index: 2000; + display: block; + position: absolute; + left: -30px; + top: -30px; + height: 90px; + width: 90px; + display: block; + border-width: 30px; + border-style: double; + border-color: #2299dd transparent transparent; + border-radius: 50%; + + -webkit-animation: spin 1s linear infinite; + -moz-animation: spin 1s linear infinite; + -o-animation: spin 1s linear infinite; + animation: spin 1s linear infinite; +} + +.pace .pace-activity:before { + content: ' '; + position: absolute; + top: 10px; + left: 10px; + height: 50px; + width: 50px; + display: block; + border-width: 10px; + border-style: solid; + border-color: #2299dd transparent transparent; + border-radius: 50%; +} + +@-webkit-keyframes spin { + 100% { -webkit-transform: rotate(359deg); } +} + +@-moz-keyframes spin { + 100% { -moz-transform: rotate(359deg); } +} + +@-o-keyframes spin { + 100% { -moz-transform: rotate(359deg); } +} + +@keyframes spin { + 100% { transform: rotate(359deg); } +} diff --git a/public/bower_components/PACE/themes/blue/pace-theme-center-simple.css b/public/bower_components/PACE/themes/blue/pace-theme-center-simple.css new file mode 100755 index 0000000..0844d31 --- /dev/null +++ b/public/bower_components/PACE/themes/blue/pace-theme-center-simple.css @@ -0,0 +1,52 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; + height: 5px; + width: 200px; + background: #fff; + border: 1px solid #2299dd; + + overflow: hidden; +} + +.pace .pace-progress { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + max-width: 200px; + position: fixed; + z-index: 2000; + display: block; + position: absolute; + top: 0; + right: 100%; + height: 100%; + width: 100%; + background: #2299dd; +} + +.pace.pace-inactive { + display: none; +} \ No newline at end of file diff --git a/public/bower_components/PACE/themes/blue/pace-theme-corner-indicator.css b/public/bower_components/PACE/themes/blue/pace-theme-corner-indicator.css new file mode 100755 index 0000000..e0cc57e --- /dev/null +++ b/public/bower_components/PACE/themes/blue/pace-theme-corner-indicator.css @@ -0,0 +1,73 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace .pace-activity { + display: block; + position: fixed; + z-index: 2000; + top: 0; + right: 0; + width: 300px; + height: 300px; + background: #2299dd; + -webkit-transition: -webkit-transform 0.3s; + transition: transform 0.3s; + -webkit-transform: translateX(100%) translateY(-100%) rotate(45deg); + transform: translateX(100%) translateY(-100%) rotate(45deg); + pointer-events: none; +} + +.pace.pace-active .pace-activity { + -webkit-transform: translateX(50%) translateY(-50%) rotate(45deg); + transform: translateX(50%) translateY(-50%) rotate(45deg); +} + +.pace .pace-activity::before, +.pace .pace-activity::after { + -moz-box-sizing: border-box; + box-sizing: border-box; + position: absolute; + bottom: 30px; + left: 50%; + display: block; + border: 5px solid #fff; + border-radius: 50%; + content: ''; +} + +.pace .pace-activity::before { + margin-left: -40px; + width: 80px; + height: 80px; + border-right-color: rgba(0, 0, 0, .2); + border-left-color: rgba(0, 0, 0, .2); + -webkit-animation: pace-theme-corner-indicator-spin 3s linear infinite; + animation: pace-theme-corner-indicator-spin 3s linear infinite; +} + +.pace .pace-activity::after { + bottom: 50px; + margin-left: -20px; + width: 40px; + height: 40px; + border-top-color: rgba(0, 0, 0, .2); + border-bottom-color: rgba(0, 0, 0, .2); + -webkit-animation: pace-theme-corner-indicator-spin 1s linear infinite; + animation: pace-theme-corner-indicator-spin 1s linear infinite; +} + +@-webkit-keyframes pace-theme-corner-indicator-spin { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(359deg); } +} +@keyframes pace-theme-corner-indicator-spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(359deg); } +} diff --git a/public/bower_components/PACE/themes/blue/pace-theme-fill-left.css b/public/bower_components/PACE/themes/blue/pace-theme-fill-left.css new file mode 100755 index 0000000..acbaf45 --- /dev/null +++ b/public/bower_components/PACE/themes/blue/pace-theme-fill-left.css @@ -0,0 +1,22 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: rgba(34, 153, 221, 0.19999999999999996); + position: fixed; + z-index: -1; + top: 0; + right: 100%; + bottom: 0; + width: 100%; +} diff --git a/public/bower_components/PACE/themes/blue/pace-theme-flash.css b/public/bower_components/PACE/themes/blue/pace-theme-flash.css new file mode 100755 index 0000000..d9bca46 --- /dev/null +++ b/public/bower_components/PACE/themes/blue/pace-theme-flash.css @@ -0,0 +1,77 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background: #2299dd; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 2px; +} + +.pace .pace-progress-inner { + display: block; + position: absolute; + right: 0px; + width: 100px; + height: 100%; + box-shadow: 0 0 10px #2299dd, 0 0 5px #2299dd; + opacity: 1.0; + -webkit-transform: rotate(3deg) translate(0px, -4px); + -moz-transform: rotate(3deg) translate(0px, -4px); + -ms-transform: rotate(3deg) translate(0px, -4px); + -o-transform: rotate(3deg) translate(0px, -4px); + transform: rotate(3deg) translate(0px, -4px); +} + +.pace .pace-activity { + display: block; + position: fixed; + z-index: 2000; + top: 15px; + right: 15px; + width: 14px; + height: 14px; + border: solid 2px transparent; + border-top-color: #2299dd; + border-left-color: #2299dd; + border-radius: 10px; + -webkit-animation: pace-spinner 400ms linear infinite; + -moz-animation: pace-spinner 400ms linear infinite; + -ms-animation: pace-spinner 400ms linear infinite; + -o-animation: pace-spinner 400ms linear infinite; + animation: pace-spinner 400ms linear infinite; +} + +@-webkit-keyframes pace-spinner { + 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } +} +@-moz-keyframes pace-spinner { + 0% { -moz-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -moz-transform: rotate(360deg); transform: rotate(360deg); } +} +@-o-keyframes pace-spinner { + 0% { -o-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -o-transform: rotate(360deg); transform: rotate(360deg); } +} +@-ms-keyframes pace-spinner { + 0% { -ms-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -ms-transform: rotate(360deg); transform: rotate(360deg); } +} +@keyframes pace-spinner { + 0% { transform: rotate(0deg); transform: rotate(0deg); } + 100% { transform: rotate(360deg); transform: rotate(360deg); } +} diff --git a/public/bower_components/PACE/themes/blue/pace-theme-flat-top.css b/public/bower_components/PACE/themes/blue/pace-theme-flat-top.css new file mode 100755 index 0000000..6a76bbf --- /dev/null +++ b/public/bower_components/PACE/themes/blue/pace-theme-flat-top.css @@ -0,0 +1,41 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + position: fixed; + top: 0; + left: 0; + width: 100%; + + -webkit-transform: translate3d(0, -50px, 0); + -ms-transform: translate3d(0, -50px, 0); + transform: translate3d(0, -50px, 0); + + -webkit-transition: -webkit-transform .5s ease-out; + -ms-transition: -webkit-transform .5s ease-out; + transition: transform .5s ease-out; +} + +.pace.pace-active { + -webkit-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} + +.pace .pace-progress { + display: block; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 10px; + background: #2299dd; + + pointer-events: none; +} diff --git a/public/bower_components/PACE/themes/blue/pace-theme-loading-bar.css b/public/bower_components/PACE/themes/blue/pace-theme-loading-bar.css new file mode 100755 index 0000000..8448a5e --- /dev/null +++ b/public/bower_components/PACE/themes/blue/pace-theme-loading-bar.css @@ -0,0 +1,198 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; + + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + z-index: 2000; + position: fixed; + margin: auto; + top: 12px; + left: 0; + right: 0; + bottom: 0; + width: 200px; + height: 50px; + overflow: hidden; +} + +.pace .pace-progress { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + display: block; + position: absolute; + right: 100%; + margin-right: -7px; + width: 93%; + top: 7px; + height: 14px; + font-size: 12px; + background: #2299dd; + color: #2299dd; + line-height: 60px; + font-weight: bold; + font-family: Helvetica, Arial, "Lucida Grande", sans-serif; + + -webkit-box-shadow: 120px 0 #fff, 240px 0 #fff; + -ms-box-shadow: 120px 0 #fff, 240px 0 #fff; + box-shadow: 120px 0 #fff, 240px 0 #fff; +} + +.pace .pace-progress:after { + content: attr(data-progress-text); + display: inline-block; + position: fixed; + width: 45px; + text-align: right; + right: 0; + padding-right: 16px; + top: 4px; +} + +.pace .pace-progress[data-progress-text="0%"]:after { right: -200px } +.pace .pace-progress[data-progress-text="1%"]:after { right: -198.14px } +.pace .pace-progress[data-progress-text="2%"]:after { right: -196.28px } +.pace .pace-progress[data-progress-text="3%"]:after { right: -194.42px } +.pace .pace-progress[data-progress-text="4%"]:after { right: -192.56px } +.pace .pace-progress[data-progress-text="5%"]:after { right: -190.7px } +.pace .pace-progress[data-progress-text="6%"]:after { right: -188.84px } +.pace .pace-progress[data-progress-text="7%"]:after { right: -186.98px } +.pace .pace-progress[data-progress-text="8%"]:after { right: -185.12px } +.pace .pace-progress[data-progress-text="9%"]:after { right: -183.26px } +.pace .pace-progress[data-progress-text="10%"]:after { right: -181.4px } +.pace .pace-progress[data-progress-text="11%"]:after { right: -179.54px } +.pace .pace-progress[data-progress-text="12%"]:after { right: -177.68px } +.pace .pace-progress[data-progress-text="13%"]:after { right: -175.82px } +.pace .pace-progress[data-progress-text="14%"]:after { right: -173.96px } +.pace .pace-progress[data-progress-text="15%"]:after { right: -172.1px } +.pace .pace-progress[data-progress-text="16%"]:after { right: -170.24px } +.pace .pace-progress[data-progress-text="17%"]:after { right: -168.38px } +.pace .pace-progress[data-progress-text="18%"]:after { right: -166.52px } +.pace .pace-progress[data-progress-text="19%"]:after { right: -164.66px } +.pace .pace-progress[data-progress-text="20%"]:after { right: -162.8px } +.pace .pace-progress[data-progress-text="21%"]:after { right: -160.94px } +.pace .pace-progress[data-progress-text="22%"]:after { right: -159.08px } +.pace .pace-progress[data-progress-text="23%"]:after { right: -157.22px } +.pace .pace-progress[data-progress-text="24%"]:after { right: -155.36px } +.pace .pace-progress[data-progress-text="25%"]:after { right: -153.5px } +.pace .pace-progress[data-progress-text="26%"]:after { right: -151.64px } +.pace .pace-progress[data-progress-text="27%"]:after { right: -149.78px } +.pace .pace-progress[data-progress-text="28%"]:after { right: -147.92px } +.pace .pace-progress[data-progress-text="29%"]:after { right: -146.06px } +.pace .pace-progress[data-progress-text="30%"]:after { right: -144.2px } +.pace .pace-progress[data-progress-text="31%"]:after { right: -142.34px } +.pace .pace-progress[data-progress-text="32%"]:after { right: -140.48px } +.pace .pace-progress[data-progress-text="33%"]:after { right: -138.62px } +.pace .pace-progress[data-progress-text="34%"]:after { right: -136.76px } +.pace .pace-progress[data-progress-text="35%"]:after { right: -134.9px } +.pace .pace-progress[data-progress-text="36%"]:after { right: -133.04px } +.pace .pace-progress[data-progress-text="37%"]:after { right: -131.18px } +.pace .pace-progress[data-progress-text="38%"]:after { right: -129.32px } +.pace .pace-progress[data-progress-text="39%"]:after { right: -127.46px } +.pace .pace-progress[data-progress-text="40%"]:after { right: -125.6px } +.pace .pace-progress[data-progress-text="41%"]:after { right: -123.74px } +.pace .pace-progress[data-progress-text="42%"]:after { right: -121.88px } +.pace .pace-progress[data-progress-text="43%"]:after { right: -120.02px } +.pace .pace-progress[data-progress-text="44%"]:after { right: -118.16px } +.pace .pace-progress[data-progress-text="45%"]:after { right: -116.3px } +.pace .pace-progress[data-progress-text="46%"]:after { right: -114.44px } +.pace .pace-progress[data-progress-text="47%"]:after { right: -112.58px } +.pace .pace-progress[data-progress-text="48%"]:after { right: -110.72px } +.pace .pace-progress[data-progress-text="49%"]:after { right: -108.86px } +.pace .pace-progress[data-progress-text="50%"]:after { right: -107px } +.pace .pace-progress[data-progress-text="51%"]:after { right: -105.14px } +.pace .pace-progress[data-progress-text="52%"]:after { right: -103.28px } +.pace .pace-progress[data-progress-text="53%"]:after { right: -101.42px } +.pace .pace-progress[data-progress-text="54%"]:after { right: -99.56px } +.pace .pace-progress[data-progress-text="55%"]:after { right: -97.7px } +.pace .pace-progress[data-progress-text="56%"]:after { right: -95.84px } +.pace .pace-progress[data-progress-text="57%"]:after { right: -93.98px } +.pace .pace-progress[data-progress-text="58%"]:after { right: -92.12px } +.pace .pace-progress[data-progress-text="59%"]:after { right: -90.26px } +.pace .pace-progress[data-progress-text="60%"]:after { right: -88.4px } +.pace .pace-progress[data-progress-text="61%"]:after { right: -86.53999999999999px } +.pace .pace-progress[data-progress-text="62%"]:after { right: -84.68px } +.pace .pace-progress[data-progress-text="63%"]:after { right: -82.82px } +.pace .pace-progress[data-progress-text="64%"]:after { right: -80.96000000000001px } +.pace .pace-progress[data-progress-text="65%"]:after { right: -79.1px } +.pace .pace-progress[data-progress-text="66%"]:after { right: -77.24px } +.pace .pace-progress[data-progress-text="67%"]:after { right: -75.38px } +.pace .pace-progress[data-progress-text="68%"]:after { right: -73.52px } +.pace .pace-progress[data-progress-text="69%"]:after { right: -71.66px } +.pace .pace-progress[data-progress-text="70%"]:after { right: -69.8px } +.pace .pace-progress[data-progress-text="71%"]:after { right: -67.94px } +.pace .pace-progress[data-progress-text="72%"]:after { right: -66.08px } +.pace .pace-progress[data-progress-text="73%"]:after { right: -64.22px } +.pace .pace-progress[data-progress-text="74%"]:after { right: -62.36px } +.pace .pace-progress[data-progress-text="75%"]:after { right: -60.5px } +.pace .pace-progress[data-progress-text="76%"]:after { right: -58.64px } +.pace .pace-progress[data-progress-text="77%"]:after { right: -56.78px } +.pace .pace-progress[data-progress-text="78%"]:after { right: -54.92px } +.pace .pace-progress[data-progress-text="79%"]:after { right: -53.06px } +.pace .pace-progress[data-progress-text="80%"]:after { right: -51.2px } +.pace .pace-progress[data-progress-text="81%"]:after { right: -49.34px } +.pace .pace-progress[data-progress-text="82%"]:after { right: -47.480000000000004px } +.pace .pace-progress[data-progress-text="83%"]:after { right: -45.62px } +.pace .pace-progress[data-progress-text="84%"]:after { right: -43.76px } +.pace .pace-progress[data-progress-text="85%"]:after { right: -41.9px } +.pace .pace-progress[data-progress-text="86%"]:after { right: -40.04px } +.pace .pace-progress[data-progress-text="87%"]:after { right: -38.18px } +.pace .pace-progress[data-progress-text="88%"]:after { right: -36.32px } +.pace .pace-progress[data-progress-text="89%"]:after { right: -34.46px } +.pace .pace-progress[data-progress-text="90%"]:after { right: -32.6px } +.pace .pace-progress[data-progress-text="91%"]:after { right: -30.740000000000002px } +.pace .pace-progress[data-progress-text="92%"]:after { right: -28.880000000000003px } +.pace .pace-progress[data-progress-text="93%"]:after { right: -27.02px } +.pace .pace-progress[data-progress-text="94%"]:after { right: -25.16px } +.pace .pace-progress[data-progress-text="95%"]:after { right: -23.3px } +.pace .pace-progress[data-progress-text="96%"]:after { right: -21.439999999999998px } +.pace .pace-progress[data-progress-text="97%"]:after { right: -19.58px } +.pace .pace-progress[data-progress-text="98%"]:after { right: -17.72px } +.pace .pace-progress[data-progress-text="99%"]:after { right: -15.86px } +.pace .pace-progress[data-progress-text="100%"]:after { right: -14px } + + +.pace .pace-activity { + position: absolute; + width: 100%; + height: 28px; + z-index: 2001; + box-shadow: inset 0 0 0 2px #2299dd, inset 0 0 0 7px #FFF; + border-radius: 10px; +} + +.pace.pace-inactive { + display: none; +} diff --git a/public/bower_components/PACE/themes/blue/pace-theme-mac-osx.css b/public/bower_components/PACE/themes/blue/pace-theme-mac-osx.css new file mode 100755 index 0000000..175f3b2 --- /dev/null +++ b/public/bower_components/PACE/themes/blue/pace-theme-mac-osx.css @@ -0,0 +1,87 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + overflow: hidden; + position: fixed; + top: 0; + left: 0; + z-index: 2000; + width: 100%; + height: 12px; + background: #fff; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: #0087E1; + position: fixed; + top: 0; + right: 100%; + width: 100%; + height: 12px; + overflow: hidden; + + -webkit-border-radius: 0 0 4px 0; + -moz-border-radius: 0 0 4px 0; + -o-border-radius: 0 0 4px 0; + border-radius: 0 0 4px 0; + + -webkit-box-shadow: inset -1px 0 #00558F, inset 0 -1px #00558F, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + -moz-box-shadow: inset -1px 0 #00558F, inset 0 -1px #00558F, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + -o-box-shadow: inset -1px 0 #00558F, inset 0 -1px #00558F, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + box-shadow: inset -1px 0 #00558F, inset 0 -1px #00558F, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); +} + +.pace .pace-activity { + position: fixed; + top: 0; + left: 0; + right: -28px; + bottom: 0; + + -webkit-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + -moz-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + -o-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + + -webkit-background-size: 28px 100%; + -moz-background-size: 28px 100%; + -o-background-size: 28px 100%; + background-size: 28px 100%; + + -webkit-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -moz-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -ms-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -o-animation: pace-theme-mac-osx-motion 500ms linear infinite; + animation: pace-theme-mac-osx-motion 500ms linear infinite; +} + +@-webkit-keyframes pace-theme-mac-osx-motion { + 0% { -webkit-transform: none; transform: none; } + 100% { -webkit-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-moz-keyframes pace-theme-mac-osx-motion { + 0% { -moz-transform: none; transform: none; } + 100% { -moz-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-o-keyframes pace-theme-mac-osx-motion { + 0% { -o-transform: none; transform: none; } + 100% { -o-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-ms-keyframes pace-theme-mac-osx-motion { + 0% { -ms-transform: none; transform: none; } + 100% { -ms-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@keyframes pace-theme-mac-osx-motion { + 0% { transform: none; transform: none; } + 100% { transform: translate(-28px, 0); transform: translate(-28px, 0); } +} diff --git a/public/bower_components/PACE/themes/blue/pace-theme-minimal.css b/public/bower_components/PACE/themes/blue/pace-theme-minimal.css new file mode 100755 index 0000000..a344a19 --- /dev/null +++ b/public/bower_components/PACE/themes/blue/pace-theme-minimal.css @@ -0,0 +1,23 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background: #2299dd; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 2px; +} diff --git a/public/bower_components/PACE/themes/green/pace-theme-barber-shop.css b/public/bower_components/PACE/themes/green/pace-theme-barber-shop.css new file mode 100755 index 0000000..d06a96c --- /dev/null +++ b/public/bower_components/PACE/themes/green/pace-theme-barber-shop.css @@ -0,0 +1,83 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + overflow: hidden; + position: fixed; + top: 0; + left: 0; + z-index: 2000; + width: 100%; + height: 12px; + background: #fff; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: #22df80; + position: fixed; + top: 0; + bottom: 0; + right: 100%; + width: 100%; + overflow: hidden; +} + +.pace .pace-activity { + position: fixed; + top: 0; + right: -32px; + bottom: 0; + left: 0; + + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.2)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.2)), color-stop(0.75, rgba(255, 255, 255, 0.2)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + -webkit-background-size: 32px 32px; + -moz-background-size: 32px 32px; + -o-background-size: 32px 32px; + background-size: 32px 32px; + + -webkit-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -moz-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -ms-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -o-animation: pace-theme-barber-shop-motion 500ms linear infinite; + animation: pace-theme-barber-shop-motion 500ms linear infinite; +} + +@-webkit-keyframes pace-theme-barber-shop-motion { + 0% { -webkit-transform: none; transform: none; } + 100% { -webkit-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-moz-keyframes pace-theme-barber-shop-motion { + 0% { -moz-transform: none; transform: none; } + 100% { -moz-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-o-keyframes pace-theme-barber-shop-motion { + 0% { -o-transform: none; transform: none; } + 100% { -o-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-ms-keyframes pace-theme-barber-shop-motion { + 0% { -ms-transform: none; transform: none; } + 100% { -ms-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@keyframes pace-theme-barber-shop-motion { + 0% { transform: none; transform: none; } + 100% { transform: translate(-32px, 0); transform: translate(-32px, 0); } +} diff --git a/public/bower_components/PACE/themes/green/pace-theme-big-counter.css b/public/bower_components/PACE/themes/green/pace-theme-big-counter.css new file mode 100755 index 0000000..7317468 --- /dev/null +++ b/public/bower_components/PACE/themes/green/pace-theme-big-counter.css @@ -0,0 +1,40 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace.pace-inactive .pace-progress { + display: none; +} + +.pace .pace-progress { + position: fixed; + z-index: 2000; + top: 0; + right: 0; + height: 5rem; + width: 5rem; + + -webkit-transform: translate3d(0, 0, 0) !important; + -ms-transform: translate3d(0, 0, 0) !important; + transform: translate3d(0, 0, 0) !important; +} + +.pace .pace-progress:after { + display: block; + position: absolute; + top: 0; + right: .5rem; + content: attr(data-progress-text); + font-family: "Helvetica Neue", sans-serif; + font-weight: 100; + font-size: 5rem; + line-height: 1; + text-align: right; + color: rgba(34, 223, 128, 0.19999999999999996); +} diff --git a/public/bower_components/PACE/themes/green/pace-theme-bounce.css b/public/bower_components/PACE/themes/green/pace-theme-bounce.css new file mode 100755 index 0000000..d17f375 --- /dev/null +++ b/public/bower_components/PACE/themes/green/pace-theme-bounce.css @@ -0,0 +1,231 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + width: 140px; + height: 300px; + position: fixed; + top: -90px; + right: -20px; + z-index: 2000; + -webkit-transform: scale(0); + -moz-transform: scale(0); + -ms-transform: scale(0); + -o-transform: scale(0); + transform: scale(0); + opacity: 0; + -webkit-transition: all 2s linear 0s; + -moz-transition: all 2s linear 0s; + transition: all 2s linear 0s; +} + +.pace.pace-active { + -webkit-transform: scale(.25); + -moz-transform: scale(.25); + -ms-transform: scale(.25); + -o-transform: scale(.25); + transform: scale(.25); + opacity: 1; +} + +.pace .pace-activity { + width: 140px; + height: 140px; + border-radius: 70px; + background: #22df80; + position: absolute; + top: 0; + z-index: 1911; + -webkit-animation: pace-bounce 1s infinite; + -moz-animation: pace-bounce 1s infinite; + -o-animation: pace-bounce 1s infinite; + -ms-animation: pace-bounce 1s infinite; + animation: pace-bounce 1s infinite; +} + +.pace .pace-progress { + position: absolute; + display: block; + left: 50%; + bottom: 0; + z-index: 1910; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -webkit-transform: scaleY(.3) !important; + -moz-transform: scaleY(.3) !important; + -ms-transform: scaleY(.3) !important; + -o-transform: scaleY(.3) !important; + transform: scaleY(.3) !important; + -webkit-animation: pace-compress .5s infinite alternate; + -moz-animation: pace-compress .5s infinite alternate; + -o-animation: pace-compress .5s infinite alternate; + -ms-animation: pace-compress .5s infinite alternate; + animation: pace-compress .5s infinite alternate; +} + +@-webkit-keyframes pace-bounce { + 0% { + top: 0; + -webkit-animation-timing-function: ease-in; + } + 40% {} + 50% { + top: 140px; + height: 140px; + -webkit-animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + -webkit-animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + -webkit-animation-timing-function: ease-out; + } + 95% { + top: 0; + -webkit-animation-timing-function: ease-in; + } + 100% { + top: 0; + -webkit-animation-timing-function: ease-in; + } +} + +@-moz-keyframes pace-bounce { + 0% { + top: 0; + -moz-animation-timing-function: ease-in; + } + 40% {} + 50% { + top: 140px; + height: 140px; + -moz-animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + -moz-animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + -moz-animation-timing-function: ease-out;} + 95% { + top: 0; + -moz-animation-timing-function: ease-in; + } + 100% {top: 0; + -moz-animation-timing-function: ease-in; + } +} + +@keyframes pace-bounce { + 0% { + top: 0; + animation-timing-function: ease-in; + } + 50% { + top: 140px; + height: 140px; + animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + animation-timing-function: ease-out; + } + 95% { + top: 0; + animation-timing-function: ease-in; + } + 100% { + top: 0; + animation-timing-function: ease-in; + } +} + +@-webkit-keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -webkit-animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + -webkit-animation-timing-function: ease-out; + } +} + +@-moz-keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -moz-animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + -moz-animation-timing-function: ease-out; + } +} + +@keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + animation-timing-function: ease-out; + } +} \ No newline at end of file diff --git a/public/bower_components/PACE/themes/green/pace-theme-center-atom.css b/public/bower_components/PACE/themes/green/pace-theme-center-atom.css new file mode 100755 index 0000000..54f86fd --- /dev/null +++ b/public/bower_components/PACE/themes/green/pace-theme-center-atom.css @@ -0,0 +1,131 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace.pace-inactive { + display: none; +} + +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + height: 60px; + width: 100px; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace .pace-progress { + z-index: 2000; + position: absolute; + height: 60px; + width: 100px; + + -webkit-transform: translate3d(0, 0, 0) !important; + -ms-transform: translate3d(0, 0, 0) !important; + transform: translate3d(0, 0, 0) !important; +} + +.pace .pace-progress:before { + content: attr(data-progress-text); + text-align: center; + color: #fff; + background: #22df80; + border-radius: 50%; + font-family: "Helvetica Neue", sans-serif; + font-size: 14px; + font-weight: 100; + line-height: 1; + padding: 20% 0 7px; + width: 50%; + height: 40%; + margin: 10px 0 0 30px; + display: block; + z-index: 999; + position: absolute; +} + +.pace .pace-activity { + font-size: 15px; + line-height: 1; + z-index: 2000; + position: absolute; + height: 60px; + width: 100px; + + display: block; + -webkit-animation: pace-theme-center-atom-spin 2s linear infinite; + -moz-animation: pace-theme-center-atom-spin 2s linear infinite; + -o-animation: pace-theme-center-atom-spin 2s linear infinite; + animation: pace-theme-center-atom-spin 2s linear infinite; +} + +.pace .pace-activity { + border-radius: 50%; + border: 5px solid #22df80; + content: ' '; + display: block; + position: absolute; + top: 0; + left: 0; + height: 60px; + width: 100px; +} + +.pace .pace-activity:after { + border-radius: 50%; + border: 5px solid #22df80; + content: ' '; + display: block; + position: absolute; + top: -5px; + left: -5px; + height: 60px; + width: 100px; + + -webkit-transform: rotate(60deg); + -moz-transform: rotate(60deg); + -o-transform: rotate(60deg); + transform: rotate(60deg); +} + +.pace .pace-activity:before { + border-radius: 50%; + border: 5px solid #22df80; + content: ' '; + display: block; + position: absolute; + top: -5px; + left: -5px; + height: 60px; + width: 100px; + + -webkit-transform: rotate(120deg); + -moz-transform: rotate(120deg); + -o-transform: rotate(120deg); + transform: rotate(120deg); +} + +@-webkit-keyframes pace-theme-center-atom-spin { + 0% { -webkit-transform: rotate(0deg) } + 100% { -webkit-transform: rotate(359deg) } +} +@-moz-keyframes pace-theme-center-atom-spin { + 0% { -moz-transform: rotate(0deg) } + 100% { -moz-transform: rotate(359deg) } +} +@-o-keyframes pace-theme-center-atom-spin { + 0% { -o-transform: rotate(0deg) } + 100% { -o-transform: rotate(359deg) } +} +@keyframes pace-theme-center-atom-spin { + 0% { transform: rotate(0deg) } + 100% { transform: rotate(359deg) } +} diff --git a/public/bower_components/PACE/themes/green/pace-theme-center-circle.css b/public/bower_components/PACE/themes/green/pace-theme-center-circle.css new file mode 100755 index 0000000..f34927c --- /dev/null +++ b/public/bower_components/PACE/themes/green/pace-theme-center-circle.css @@ -0,0 +1,90 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + -webkit-perspective: 12rem; + -moz-perspective: 12rem; + -ms-perspective: 12rem; + -o-perspective: 12rem; + perspective: 12rem; + + z-index: 2000; + position: fixed; + height: 6rem; + width: 6rem; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace.pace-inactive .pace-progress { + display: none; +} + +.pace .pace-progress { + position: fixed; + z-index: 2000; + display: block; + position: absolute; + left: 0; + top: 0; + height: 6rem; + width: 6rem !important; + line-height: 6rem; + font-size: 2rem; + border-radius: 50%; + background: rgba(34, 223, 128, 0.8); + color: #fff; + font-family: "Helvetica Neue", sans-serif; + font-weight: 100; + text-align: center; + + -webkit-animation: pace-theme-center-circle-spin linear infinite 2s; + -moz-animation: pace-theme-center-circle-spin linear infinite 2s; + -ms-animation: pace-theme-center-circle-spin linear infinite 2s; + -o-animation: pace-theme-center-circle-spin linear infinite 2s; + animation: pace-theme-center-circle-spin linear infinite 2s; + + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + -ms-transform-style: preserve-3d; + -o-transform-style: preserve-3d; + transform-style: preserve-3d; +} + +.pace .pace-progress:after { + content: attr(data-progress-text); + display: block; +} + +@-webkit-keyframes pace-theme-center-circle-spin { + from { -webkit-transform: rotateY(0deg) } + to { -webkit-transform: rotateY(360deg) } +} + +@-moz-keyframes pace-theme-center-circle-spin { + from { -moz-transform: rotateY(0deg) } + to { -moz-transform: rotateY(360deg) } +} + +@-ms-keyframes pace-theme-center-circle-spin { + from { -ms-transform: rotateY(0deg) } + to { -ms-transform: rotateY(360deg) } +} + +@-o-keyframes pace-theme-center-circle-spin { + from { -o-transform: rotateY(0deg) } + to { -o-transform: rotateY(360deg) } +} + +@keyframes pace-theme-center-circle-spin { + from { transform: rotateY(0deg) } + to { transform: rotateY(360deg) } +} diff --git a/public/bower_components/PACE/themes/green/pace-theme-center-radar.css b/public/bower_components/PACE/themes/green/pace-theme-center-radar.css new file mode 100755 index 0000000..c0b7674 --- /dev/null +++ b/public/bower_components/PACE/themes/green/pace-theme-center-radar.css @@ -0,0 +1,74 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + height: 90px; + width: 90px; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace.pace-inactive .pace-activity { + display: none; +} + +.pace .pace-activity { + position: fixed; + z-index: 2000; + display: block; + position: absolute; + left: -30px; + top: -30px; + height: 90px; + width: 90px; + display: block; + border-width: 30px; + border-style: double; + border-color: #22df80 transparent transparent; + border-radius: 50%; + + -webkit-animation: spin 1s linear infinite; + -moz-animation: spin 1s linear infinite; + -o-animation: spin 1s linear infinite; + animation: spin 1s linear infinite; +} + +.pace .pace-activity:before { + content: ' '; + position: absolute; + top: 10px; + left: 10px; + height: 50px; + width: 50px; + display: block; + border-width: 10px; + border-style: solid; + border-color: #22df80 transparent transparent; + border-radius: 50%; +} + +@-webkit-keyframes spin { + 100% { -webkit-transform: rotate(359deg); } +} + +@-moz-keyframes spin { + 100% { -moz-transform: rotate(359deg); } +} + +@-o-keyframes spin { + 100% { -moz-transform: rotate(359deg); } +} + +@keyframes spin { + 100% { transform: rotate(359deg); } +} diff --git a/public/bower_components/PACE/themes/green/pace-theme-center-simple.css b/public/bower_components/PACE/themes/green/pace-theme-center-simple.css new file mode 100755 index 0000000..fa1f427 --- /dev/null +++ b/public/bower_components/PACE/themes/green/pace-theme-center-simple.css @@ -0,0 +1,52 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; + height: 5px; + width: 200px; + background: #fff; + border: 1px solid #22df80; + + overflow: hidden; +} + +.pace .pace-progress { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + max-width: 200px; + position: fixed; + z-index: 2000; + display: block; + position: absolute; + top: 0; + right: 100%; + height: 100%; + width: 100%; + background: #22df80; +} + +.pace.pace-inactive { + display: none; +} \ No newline at end of file diff --git a/public/bower_components/PACE/themes/green/pace-theme-corner-indicator.css b/public/bower_components/PACE/themes/green/pace-theme-corner-indicator.css new file mode 100755 index 0000000..35ad92c --- /dev/null +++ b/public/bower_components/PACE/themes/green/pace-theme-corner-indicator.css @@ -0,0 +1,73 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace .pace-activity { + display: block; + position: fixed; + z-index: 2000; + top: 0; + right: 0; + width: 300px; + height: 300px; + background: #22df80; + -webkit-transition: -webkit-transform 0.3s; + transition: transform 0.3s; + -webkit-transform: translateX(100%) translateY(-100%) rotate(45deg); + transform: translateX(100%) translateY(-100%) rotate(45deg); + pointer-events: none; +} + +.pace.pace-active .pace-activity { + -webkit-transform: translateX(50%) translateY(-50%) rotate(45deg); + transform: translateX(50%) translateY(-50%) rotate(45deg); +} + +.pace .pace-activity::before, +.pace .pace-activity::after { + -moz-box-sizing: border-box; + box-sizing: border-box; + position: absolute; + bottom: 30px; + left: 50%; + display: block; + border: 5px solid #fff; + border-radius: 50%; + content: ''; +} + +.pace .pace-activity::before { + margin-left: -40px; + width: 80px; + height: 80px; + border-right-color: rgba(0, 0, 0, .2); + border-left-color: rgba(0, 0, 0, .2); + -webkit-animation: pace-theme-corner-indicator-spin 3s linear infinite; + animation: pace-theme-corner-indicator-spin 3s linear infinite; +} + +.pace .pace-activity::after { + bottom: 50px; + margin-left: -20px; + width: 40px; + height: 40px; + border-top-color: rgba(0, 0, 0, .2); + border-bottom-color: rgba(0, 0, 0, .2); + -webkit-animation: pace-theme-corner-indicator-spin 1s linear infinite; + animation: pace-theme-corner-indicator-spin 1s linear infinite; +} + +@-webkit-keyframes pace-theme-corner-indicator-spin { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(359deg); } +} +@keyframes pace-theme-corner-indicator-spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(359deg); } +} diff --git a/public/bower_components/PACE/themes/green/pace-theme-fill-left.css b/public/bower_components/PACE/themes/green/pace-theme-fill-left.css new file mode 100755 index 0000000..3bfa926 --- /dev/null +++ b/public/bower_components/PACE/themes/green/pace-theme-fill-left.css @@ -0,0 +1,22 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: rgba(34, 223, 128, 0.19999999999999996); + position: fixed; + z-index: -1; + top: 0; + right: 100%; + bottom: 0; + width: 100%; +} diff --git a/public/bower_components/PACE/themes/green/pace-theme-flash.css b/public/bower_components/PACE/themes/green/pace-theme-flash.css new file mode 100755 index 0000000..812779b --- /dev/null +++ b/public/bower_components/PACE/themes/green/pace-theme-flash.css @@ -0,0 +1,77 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background: #22df80; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 2px; +} + +.pace .pace-progress-inner { + display: block; + position: absolute; + right: 0px; + width: 100px; + height: 100%; + box-shadow: 0 0 10px #22df80, 0 0 5px #22df80; + opacity: 1.0; + -webkit-transform: rotate(3deg) translate(0px, -4px); + -moz-transform: rotate(3deg) translate(0px, -4px); + -ms-transform: rotate(3deg) translate(0px, -4px); + -o-transform: rotate(3deg) translate(0px, -4px); + transform: rotate(3deg) translate(0px, -4px); +} + +.pace .pace-activity { + display: block; + position: fixed; + z-index: 2000; + top: 15px; + right: 15px; + width: 14px; + height: 14px; + border: solid 2px transparent; + border-top-color: #22df80; + border-left-color: #22df80; + border-radius: 10px; + -webkit-animation: pace-spinner 400ms linear infinite; + -moz-animation: pace-spinner 400ms linear infinite; + -ms-animation: pace-spinner 400ms linear infinite; + -o-animation: pace-spinner 400ms linear infinite; + animation: pace-spinner 400ms linear infinite; +} + +@-webkit-keyframes pace-spinner { + 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } +} +@-moz-keyframes pace-spinner { + 0% { -moz-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -moz-transform: rotate(360deg); transform: rotate(360deg); } +} +@-o-keyframes pace-spinner { + 0% { -o-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -o-transform: rotate(360deg); transform: rotate(360deg); } +} +@-ms-keyframes pace-spinner { + 0% { -ms-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -ms-transform: rotate(360deg); transform: rotate(360deg); } +} +@keyframes pace-spinner { + 0% { transform: rotate(0deg); transform: rotate(0deg); } + 100% { transform: rotate(360deg); transform: rotate(360deg); } +} diff --git a/public/bower_components/PACE/themes/green/pace-theme-flat-top.css b/public/bower_components/PACE/themes/green/pace-theme-flat-top.css new file mode 100755 index 0000000..75c6327 --- /dev/null +++ b/public/bower_components/PACE/themes/green/pace-theme-flat-top.css @@ -0,0 +1,41 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + position: fixed; + top: 0; + left: 0; + width: 100%; + + -webkit-transform: translate3d(0, -50px, 0); + -ms-transform: translate3d(0, -50px, 0); + transform: translate3d(0, -50px, 0); + + -webkit-transition: -webkit-transform .5s ease-out; + -ms-transition: -webkit-transform .5s ease-out; + transition: transform .5s ease-out; +} + +.pace.pace-active { + -webkit-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} + +.pace .pace-progress { + display: block; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 10px; + background: #22df80; + + pointer-events: none; +} diff --git a/public/bower_components/PACE/themes/green/pace-theme-loading-bar.css b/public/bower_components/PACE/themes/green/pace-theme-loading-bar.css new file mode 100755 index 0000000..3280418 --- /dev/null +++ b/public/bower_components/PACE/themes/green/pace-theme-loading-bar.css @@ -0,0 +1,198 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; + + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + z-index: 2000; + position: fixed; + margin: auto; + top: 12px; + left: 0; + right: 0; + bottom: 0; + width: 200px; + height: 50px; + overflow: hidden; +} + +.pace .pace-progress { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + display: block; + position: absolute; + right: 100%; + margin-right: -7px; + width: 93%; + top: 7px; + height: 14px; + font-size: 12px; + background: #22df80; + color: #22df80; + line-height: 60px; + font-weight: bold; + font-family: Helvetica, Arial, "Lucida Grande", sans-serif; + + -webkit-box-shadow: 120px 0 #fff, 240px 0 #fff; + -ms-box-shadow: 120px 0 #fff, 240px 0 #fff; + box-shadow: 120px 0 #fff, 240px 0 #fff; +} + +.pace .pace-progress:after { + content: attr(data-progress-text); + display: inline-block; + position: fixed; + width: 45px; + text-align: right; + right: 0; + padding-right: 16px; + top: 4px; +} + +.pace .pace-progress[data-progress-text="0%"]:after { right: -200px } +.pace .pace-progress[data-progress-text="1%"]:after { right: -198.14px } +.pace .pace-progress[data-progress-text="2%"]:after { right: -196.28px } +.pace .pace-progress[data-progress-text="3%"]:after { right: -194.42px } +.pace .pace-progress[data-progress-text="4%"]:after { right: -192.56px } +.pace .pace-progress[data-progress-text="5%"]:after { right: -190.7px } +.pace .pace-progress[data-progress-text="6%"]:after { right: -188.84px } +.pace .pace-progress[data-progress-text="7%"]:after { right: -186.98px } +.pace .pace-progress[data-progress-text="8%"]:after { right: -185.12px } +.pace .pace-progress[data-progress-text="9%"]:after { right: -183.26px } +.pace .pace-progress[data-progress-text="10%"]:after { right: -181.4px } +.pace .pace-progress[data-progress-text="11%"]:after { right: -179.54px } +.pace .pace-progress[data-progress-text="12%"]:after { right: -177.68px } +.pace .pace-progress[data-progress-text="13%"]:after { right: -175.82px } +.pace .pace-progress[data-progress-text="14%"]:after { right: -173.96px } +.pace .pace-progress[data-progress-text="15%"]:after { right: -172.1px } +.pace .pace-progress[data-progress-text="16%"]:after { right: -170.24px } +.pace .pace-progress[data-progress-text="17%"]:after { right: -168.38px } +.pace .pace-progress[data-progress-text="18%"]:after { right: -166.52px } +.pace .pace-progress[data-progress-text="19%"]:after { right: -164.66px } +.pace .pace-progress[data-progress-text="20%"]:after { right: -162.8px } +.pace .pace-progress[data-progress-text="21%"]:after { right: -160.94px } +.pace .pace-progress[data-progress-text="22%"]:after { right: -159.08px } +.pace .pace-progress[data-progress-text="23%"]:after { right: -157.22px } +.pace .pace-progress[data-progress-text="24%"]:after { right: -155.36px } +.pace .pace-progress[data-progress-text="25%"]:after { right: -153.5px } +.pace .pace-progress[data-progress-text="26%"]:after { right: -151.64px } +.pace .pace-progress[data-progress-text="27%"]:after { right: -149.78px } +.pace .pace-progress[data-progress-text="28%"]:after { right: -147.92px } +.pace .pace-progress[data-progress-text="29%"]:after { right: -146.06px } +.pace .pace-progress[data-progress-text="30%"]:after { right: -144.2px } +.pace .pace-progress[data-progress-text="31%"]:after { right: -142.34px } +.pace .pace-progress[data-progress-text="32%"]:after { right: -140.48px } +.pace .pace-progress[data-progress-text="33%"]:after { right: -138.62px } +.pace .pace-progress[data-progress-text="34%"]:after { right: -136.76px } +.pace .pace-progress[data-progress-text="35%"]:after { right: -134.9px } +.pace .pace-progress[data-progress-text="36%"]:after { right: -133.04px } +.pace .pace-progress[data-progress-text="37%"]:after { right: -131.18px } +.pace .pace-progress[data-progress-text="38%"]:after { right: -129.32px } +.pace .pace-progress[data-progress-text="39%"]:after { right: -127.46px } +.pace .pace-progress[data-progress-text="40%"]:after { right: -125.6px } +.pace .pace-progress[data-progress-text="41%"]:after { right: -123.74px } +.pace .pace-progress[data-progress-text="42%"]:after { right: -121.88px } +.pace .pace-progress[data-progress-text="43%"]:after { right: -120.02px } +.pace .pace-progress[data-progress-text="44%"]:after { right: -118.16px } +.pace .pace-progress[data-progress-text="45%"]:after { right: -116.3px } +.pace .pace-progress[data-progress-text="46%"]:after { right: -114.44px } +.pace .pace-progress[data-progress-text="47%"]:after { right: -112.58px } +.pace .pace-progress[data-progress-text="48%"]:after { right: -110.72px } +.pace .pace-progress[data-progress-text="49%"]:after { right: -108.86px } +.pace .pace-progress[data-progress-text="50%"]:after { right: -107px } +.pace .pace-progress[data-progress-text="51%"]:after { right: -105.14px } +.pace .pace-progress[data-progress-text="52%"]:after { right: -103.28px } +.pace .pace-progress[data-progress-text="53%"]:after { right: -101.42px } +.pace .pace-progress[data-progress-text="54%"]:after { right: -99.56px } +.pace .pace-progress[data-progress-text="55%"]:after { right: -97.7px } +.pace .pace-progress[data-progress-text="56%"]:after { right: -95.84px } +.pace .pace-progress[data-progress-text="57%"]:after { right: -93.98px } +.pace .pace-progress[data-progress-text="58%"]:after { right: -92.12px } +.pace .pace-progress[data-progress-text="59%"]:after { right: -90.26px } +.pace .pace-progress[data-progress-text="60%"]:after { right: -88.4px } +.pace .pace-progress[data-progress-text="61%"]:after { right: -86.53999999999999px } +.pace .pace-progress[data-progress-text="62%"]:after { right: -84.68px } +.pace .pace-progress[data-progress-text="63%"]:after { right: -82.82px } +.pace .pace-progress[data-progress-text="64%"]:after { right: -80.96000000000001px } +.pace .pace-progress[data-progress-text="65%"]:after { right: -79.1px } +.pace .pace-progress[data-progress-text="66%"]:after { right: -77.24px } +.pace .pace-progress[data-progress-text="67%"]:after { right: -75.38px } +.pace .pace-progress[data-progress-text="68%"]:after { right: -73.52px } +.pace .pace-progress[data-progress-text="69%"]:after { right: -71.66px } +.pace .pace-progress[data-progress-text="70%"]:after { right: -69.8px } +.pace .pace-progress[data-progress-text="71%"]:after { right: -67.94px } +.pace .pace-progress[data-progress-text="72%"]:after { right: -66.08px } +.pace .pace-progress[data-progress-text="73%"]:after { right: -64.22px } +.pace .pace-progress[data-progress-text="74%"]:after { right: -62.36px } +.pace .pace-progress[data-progress-text="75%"]:after { right: -60.5px } +.pace .pace-progress[data-progress-text="76%"]:after { right: -58.64px } +.pace .pace-progress[data-progress-text="77%"]:after { right: -56.78px } +.pace .pace-progress[data-progress-text="78%"]:after { right: -54.92px } +.pace .pace-progress[data-progress-text="79%"]:after { right: -53.06px } +.pace .pace-progress[data-progress-text="80%"]:after { right: -51.2px } +.pace .pace-progress[data-progress-text="81%"]:after { right: -49.34px } +.pace .pace-progress[data-progress-text="82%"]:after { right: -47.480000000000004px } +.pace .pace-progress[data-progress-text="83%"]:after { right: -45.62px } +.pace .pace-progress[data-progress-text="84%"]:after { right: -43.76px } +.pace .pace-progress[data-progress-text="85%"]:after { right: -41.9px } +.pace .pace-progress[data-progress-text="86%"]:after { right: -40.04px } +.pace .pace-progress[data-progress-text="87%"]:after { right: -38.18px } +.pace .pace-progress[data-progress-text="88%"]:after { right: -36.32px } +.pace .pace-progress[data-progress-text="89%"]:after { right: -34.46px } +.pace .pace-progress[data-progress-text="90%"]:after { right: -32.6px } +.pace .pace-progress[data-progress-text="91%"]:after { right: -30.740000000000002px } +.pace .pace-progress[data-progress-text="92%"]:after { right: -28.880000000000003px } +.pace .pace-progress[data-progress-text="93%"]:after { right: -27.02px } +.pace .pace-progress[data-progress-text="94%"]:after { right: -25.16px } +.pace .pace-progress[data-progress-text="95%"]:after { right: -23.3px } +.pace .pace-progress[data-progress-text="96%"]:after { right: -21.439999999999998px } +.pace .pace-progress[data-progress-text="97%"]:after { right: -19.58px } +.pace .pace-progress[data-progress-text="98%"]:after { right: -17.72px } +.pace .pace-progress[data-progress-text="99%"]:after { right: -15.86px } +.pace .pace-progress[data-progress-text="100%"]:after { right: -14px } + + +.pace .pace-activity { + position: absolute; + width: 100%; + height: 28px; + z-index: 2001; + box-shadow: inset 0 0 0 2px #22df80, inset 0 0 0 7px #FFF; + border-radius: 10px; +} + +.pace.pace-inactive { + display: none; +} diff --git a/public/bower_components/PACE/themes/green/pace-theme-mac-osx.css b/public/bower_components/PACE/themes/green/pace-theme-mac-osx.css new file mode 100755 index 0000000..56dad0d --- /dev/null +++ b/public/bower_components/PACE/themes/green/pace-theme-mac-osx.css @@ -0,0 +1,87 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + overflow: hidden; + position: fixed; + top: 0; + left: 0; + z-index: 2000; + width: 100%; + height: 12px; + background: #fff; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: #00E466; + position: fixed; + top: 0; + right: 100%; + width: 100%; + height: 12px; + overflow: hidden; + + -webkit-border-radius: 0 0 4px 0; + -moz-border-radius: 0 0 4px 0; + -o-border-radius: 0 0 4px 0; + border-radius: 0 0 4px 0; + + -webkit-box-shadow: inset -1px 0 #009140, inset 0 -1px #009140, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + -moz-box-shadow: inset -1px 0 #009140, inset 0 -1px #009140, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + -o-box-shadow: inset -1px 0 #009140, inset 0 -1px #009140, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + box-shadow: inset -1px 0 #009140, inset 0 -1px #009140, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); +} + +.pace .pace-activity { + position: fixed; + top: 0; + left: 0; + right: -28px; + bottom: 0; + + -webkit-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + -moz-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + -o-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + + -webkit-background-size: 28px 100%; + -moz-background-size: 28px 100%; + -o-background-size: 28px 100%; + background-size: 28px 100%; + + -webkit-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -moz-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -ms-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -o-animation: pace-theme-mac-osx-motion 500ms linear infinite; + animation: pace-theme-mac-osx-motion 500ms linear infinite; +} + +@-webkit-keyframes pace-theme-mac-osx-motion { + 0% { -webkit-transform: none; transform: none; } + 100% { -webkit-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-moz-keyframes pace-theme-mac-osx-motion { + 0% { -moz-transform: none; transform: none; } + 100% { -moz-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-o-keyframes pace-theme-mac-osx-motion { + 0% { -o-transform: none; transform: none; } + 100% { -o-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-ms-keyframes pace-theme-mac-osx-motion { + 0% { -ms-transform: none; transform: none; } + 100% { -ms-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@keyframes pace-theme-mac-osx-motion { + 0% { transform: none; transform: none; } + 100% { transform: translate(-28px, 0); transform: translate(-28px, 0); } +} diff --git a/public/bower_components/PACE/themes/green/pace-theme-minimal.css b/public/bower_components/PACE/themes/green/pace-theme-minimal.css new file mode 100755 index 0000000..914d0fb --- /dev/null +++ b/public/bower_components/PACE/themes/green/pace-theme-minimal.css @@ -0,0 +1,23 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background: #22df80; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 2px; +} diff --git a/public/bower_components/PACE/themes/orange/pace-theme-barber-shop.css b/public/bower_components/PACE/themes/orange/pace-theme-barber-shop.css new file mode 100755 index 0000000..129924e --- /dev/null +++ b/public/bower_components/PACE/themes/orange/pace-theme-barber-shop.css @@ -0,0 +1,83 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + overflow: hidden; + position: fixed; + top: 0; + left: 0; + z-index: 2000; + width: 100%; + height: 12px; + background: #fff; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: #eb7a55; + position: fixed; + top: 0; + bottom: 0; + right: 100%; + width: 100%; + overflow: hidden; +} + +.pace .pace-activity { + position: fixed; + top: 0; + right: -32px; + bottom: 0; + left: 0; + + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.2)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.2)), color-stop(0.75, rgba(255, 255, 255, 0.2)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + -webkit-background-size: 32px 32px; + -moz-background-size: 32px 32px; + -o-background-size: 32px 32px; + background-size: 32px 32px; + + -webkit-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -moz-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -ms-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -o-animation: pace-theme-barber-shop-motion 500ms linear infinite; + animation: pace-theme-barber-shop-motion 500ms linear infinite; +} + +@-webkit-keyframes pace-theme-barber-shop-motion { + 0% { -webkit-transform: none; transform: none; } + 100% { -webkit-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-moz-keyframes pace-theme-barber-shop-motion { + 0% { -moz-transform: none; transform: none; } + 100% { -moz-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-o-keyframes pace-theme-barber-shop-motion { + 0% { -o-transform: none; transform: none; } + 100% { -o-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-ms-keyframes pace-theme-barber-shop-motion { + 0% { -ms-transform: none; transform: none; } + 100% { -ms-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@keyframes pace-theme-barber-shop-motion { + 0% { transform: none; transform: none; } + 100% { transform: translate(-32px, 0); transform: translate(-32px, 0); } +} diff --git a/public/bower_components/PACE/themes/orange/pace-theme-big-counter.css b/public/bower_components/PACE/themes/orange/pace-theme-big-counter.css new file mode 100755 index 0000000..00308d9 --- /dev/null +++ b/public/bower_components/PACE/themes/orange/pace-theme-big-counter.css @@ -0,0 +1,40 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace.pace-inactive .pace-progress { + display: none; +} + +.pace .pace-progress { + position: fixed; + z-index: 2000; + top: 0; + right: 0; + height: 5rem; + width: 5rem; + + -webkit-transform: translate3d(0, 0, 0) !important; + -ms-transform: translate3d(0, 0, 0) !important; + transform: translate3d(0, 0, 0) !important; +} + +.pace .pace-progress:after { + display: block; + position: absolute; + top: 0; + right: .5rem; + content: attr(data-progress-text); + font-family: "Helvetica Neue", sans-serif; + font-weight: 100; + font-size: 5rem; + line-height: 1; + text-align: right; + color: rgba(235, 122, 85, 0.19999999999999996); +} diff --git a/public/bower_components/PACE/themes/orange/pace-theme-bounce.css b/public/bower_components/PACE/themes/orange/pace-theme-bounce.css new file mode 100755 index 0000000..f94c75d --- /dev/null +++ b/public/bower_components/PACE/themes/orange/pace-theme-bounce.css @@ -0,0 +1,231 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + width: 140px; + height: 300px; + position: fixed; + top: -90px; + right: -20px; + z-index: 2000; + -webkit-transform: scale(0); + -moz-transform: scale(0); + -ms-transform: scale(0); + -o-transform: scale(0); + transform: scale(0); + opacity: 0; + -webkit-transition: all 2s linear 0s; + -moz-transition: all 2s linear 0s; + transition: all 2s linear 0s; +} + +.pace.pace-active { + -webkit-transform: scale(.25); + -moz-transform: scale(.25); + -ms-transform: scale(.25); + -o-transform: scale(.25); + transform: scale(.25); + opacity: 1; +} + +.pace .pace-activity { + width: 140px; + height: 140px; + border-radius: 70px; + background: #eb7a55; + position: absolute; + top: 0; + z-index: 1911; + -webkit-animation: pace-bounce 1s infinite; + -moz-animation: pace-bounce 1s infinite; + -o-animation: pace-bounce 1s infinite; + -ms-animation: pace-bounce 1s infinite; + animation: pace-bounce 1s infinite; +} + +.pace .pace-progress { + position: absolute; + display: block; + left: 50%; + bottom: 0; + z-index: 1910; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -webkit-transform: scaleY(.3) !important; + -moz-transform: scaleY(.3) !important; + -ms-transform: scaleY(.3) !important; + -o-transform: scaleY(.3) !important; + transform: scaleY(.3) !important; + -webkit-animation: pace-compress .5s infinite alternate; + -moz-animation: pace-compress .5s infinite alternate; + -o-animation: pace-compress .5s infinite alternate; + -ms-animation: pace-compress .5s infinite alternate; + animation: pace-compress .5s infinite alternate; +} + +@-webkit-keyframes pace-bounce { + 0% { + top: 0; + -webkit-animation-timing-function: ease-in; + } + 40% {} + 50% { + top: 140px; + height: 140px; + -webkit-animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + -webkit-animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + -webkit-animation-timing-function: ease-out; + } + 95% { + top: 0; + -webkit-animation-timing-function: ease-in; + } + 100% { + top: 0; + -webkit-animation-timing-function: ease-in; + } +} + +@-moz-keyframes pace-bounce { + 0% { + top: 0; + -moz-animation-timing-function: ease-in; + } + 40% {} + 50% { + top: 140px; + height: 140px; + -moz-animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + -moz-animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + -moz-animation-timing-function: ease-out;} + 95% { + top: 0; + -moz-animation-timing-function: ease-in; + } + 100% {top: 0; + -moz-animation-timing-function: ease-in; + } +} + +@keyframes pace-bounce { + 0% { + top: 0; + animation-timing-function: ease-in; + } + 50% { + top: 140px; + height: 140px; + animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + animation-timing-function: ease-out; + } + 95% { + top: 0; + animation-timing-function: ease-in; + } + 100% { + top: 0; + animation-timing-function: ease-in; + } +} + +@-webkit-keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -webkit-animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + -webkit-animation-timing-function: ease-out; + } +} + +@-moz-keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -moz-animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + -moz-animation-timing-function: ease-out; + } +} + +@keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + animation-timing-function: ease-out; + } +} \ No newline at end of file diff --git a/public/bower_components/PACE/themes/orange/pace-theme-center-atom.css b/public/bower_components/PACE/themes/orange/pace-theme-center-atom.css new file mode 100755 index 0000000..9c55e38 --- /dev/null +++ b/public/bower_components/PACE/themes/orange/pace-theme-center-atom.css @@ -0,0 +1,131 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace.pace-inactive { + display: none; +} + +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + height: 60px; + width: 100px; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace .pace-progress { + z-index: 2000; + position: absolute; + height: 60px; + width: 100px; + + -webkit-transform: translate3d(0, 0, 0) !important; + -ms-transform: translate3d(0, 0, 0) !important; + transform: translate3d(0, 0, 0) !important; +} + +.pace .pace-progress:before { + content: attr(data-progress-text); + text-align: center; + color: #fff; + background: #eb7a55; + border-radius: 50%; + font-family: "Helvetica Neue", sans-serif; + font-size: 14px; + font-weight: 100; + line-height: 1; + padding: 20% 0 7px; + width: 50%; + height: 40%; + margin: 10px 0 0 30px; + display: block; + z-index: 999; + position: absolute; +} + +.pace .pace-activity { + font-size: 15px; + line-height: 1; + z-index: 2000; + position: absolute; + height: 60px; + width: 100px; + + display: block; + -webkit-animation: pace-theme-center-atom-spin 2s linear infinite; + -moz-animation: pace-theme-center-atom-spin 2s linear infinite; + -o-animation: pace-theme-center-atom-spin 2s linear infinite; + animation: pace-theme-center-atom-spin 2s linear infinite; +} + +.pace .pace-activity { + border-radius: 50%; + border: 5px solid #eb7a55; + content: ' '; + display: block; + position: absolute; + top: 0; + left: 0; + height: 60px; + width: 100px; +} + +.pace .pace-activity:after { + border-radius: 50%; + border: 5px solid #eb7a55; + content: ' '; + display: block; + position: absolute; + top: -5px; + left: -5px; + height: 60px; + width: 100px; + + -webkit-transform: rotate(60deg); + -moz-transform: rotate(60deg); + -o-transform: rotate(60deg); + transform: rotate(60deg); +} + +.pace .pace-activity:before { + border-radius: 50%; + border: 5px solid #eb7a55; + content: ' '; + display: block; + position: absolute; + top: -5px; + left: -5px; + height: 60px; + width: 100px; + + -webkit-transform: rotate(120deg); + -moz-transform: rotate(120deg); + -o-transform: rotate(120deg); + transform: rotate(120deg); +} + +@-webkit-keyframes pace-theme-center-atom-spin { + 0% { -webkit-transform: rotate(0deg) } + 100% { -webkit-transform: rotate(359deg) } +} +@-moz-keyframes pace-theme-center-atom-spin { + 0% { -moz-transform: rotate(0deg) } + 100% { -moz-transform: rotate(359deg) } +} +@-o-keyframes pace-theme-center-atom-spin { + 0% { -o-transform: rotate(0deg) } + 100% { -o-transform: rotate(359deg) } +} +@keyframes pace-theme-center-atom-spin { + 0% { transform: rotate(0deg) } + 100% { transform: rotate(359deg) } +} diff --git a/public/bower_components/PACE/themes/orange/pace-theme-center-circle.css b/public/bower_components/PACE/themes/orange/pace-theme-center-circle.css new file mode 100755 index 0000000..0334a17 --- /dev/null +++ b/public/bower_components/PACE/themes/orange/pace-theme-center-circle.css @@ -0,0 +1,90 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + -webkit-perspective: 12rem; + -moz-perspective: 12rem; + -ms-perspective: 12rem; + -o-perspective: 12rem; + perspective: 12rem; + + z-index: 2000; + position: fixed; + height: 6rem; + width: 6rem; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace.pace-inactive .pace-progress { + display: none; +} + +.pace .pace-progress { + position: fixed; + z-index: 2000; + display: block; + position: absolute; + left: 0; + top: 0; + height: 6rem; + width: 6rem !important; + line-height: 6rem; + font-size: 2rem; + border-radius: 50%; + background: rgba(235, 122, 85, 0.8); + color: #fff; + font-family: "Helvetica Neue", sans-serif; + font-weight: 100; + text-align: center; + + -webkit-animation: pace-theme-center-circle-spin linear infinite 2s; + -moz-animation: pace-theme-center-circle-spin linear infinite 2s; + -ms-animation: pace-theme-center-circle-spin linear infinite 2s; + -o-animation: pace-theme-center-circle-spin linear infinite 2s; + animation: pace-theme-center-circle-spin linear infinite 2s; + + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + -ms-transform-style: preserve-3d; + -o-transform-style: preserve-3d; + transform-style: preserve-3d; +} + +.pace .pace-progress:after { + content: attr(data-progress-text); + display: block; +} + +@-webkit-keyframes pace-theme-center-circle-spin { + from { -webkit-transform: rotateY(0deg) } + to { -webkit-transform: rotateY(360deg) } +} + +@-moz-keyframes pace-theme-center-circle-spin { + from { -moz-transform: rotateY(0deg) } + to { -moz-transform: rotateY(360deg) } +} + +@-ms-keyframes pace-theme-center-circle-spin { + from { -ms-transform: rotateY(0deg) } + to { -ms-transform: rotateY(360deg) } +} + +@-o-keyframes pace-theme-center-circle-spin { + from { -o-transform: rotateY(0deg) } + to { -o-transform: rotateY(360deg) } +} + +@keyframes pace-theme-center-circle-spin { + from { transform: rotateY(0deg) } + to { transform: rotateY(360deg) } +} diff --git a/public/bower_components/PACE/themes/orange/pace-theme-center-radar.css b/public/bower_components/PACE/themes/orange/pace-theme-center-radar.css new file mode 100755 index 0000000..4b0addc --- /dev/null +++ b/public/bower_components/PACE/themes/orange/pace-theme-center-radar.css @@ -0,0 +1,74 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + height: 90px; + width: 90px; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace.pace-inactive .pace-activity { + display: none; +} + +.pace .pace-activity { + position: fixed; + z-index: 2000; + display: block; + position: absolute; + left: -30px; + top: -30px; + height: 90px; + width: 90px; + display: block; + border-width: 30px; + border-style: double; + border-color: #eb7a55 transparent transparent; + border-radius: 50%; + + -webkit-animation: spin 1s linear infinite; + -moz-animation: spin 1s linear infinite; + -o-animation: spin 1s linear infinite; + animation: spin 1s linear infinite; +} + +.pace .pace-activity:before { + content: ' '; + position: absolute; + top: 10px; + left: 10px; + height: 50px; + width: 50px; + display: block; + border-width: 10px; + border-style: solid; + border-color: #eb7a55 transparent transparent; + border-radius: 50%; +} + +@-webkit-keyframes spin { + 100% { -webkit-transform: rotate(359deg); } +} + +@-moz-keyframes spin { + 100% { -moz-transform: rotate(359deg); } +} + +@-o-keyframes spin { + 100% { -moz-transform: rotate(359deg); } +} + +@keyframes spin { + 100% { transform: rotate(359deg); } +} diff --git a/public/bower_components/PACE/themes/orange/pace-theme-center-simple.css b/public/bower_components/PACE/themes/orange/pace-theme-center-simple.css new file mode 100755 index 0000000..5a5e979 --- /dev/null +++ b/public/bower_components/PACE/themes/orange/pace-theme-center-simple.css @@ -0,0 +1,52 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; + height: 5px; + width: 200px; + background: #fff; + border: 1px solid #eb7a55; + + overflow: hidden; +} + +.pace .pace-progress { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + max-width: 200px; + position: fixed; + z-index: 2000; + display: block; + position: absolute; + top: 0; + right: 100%; + height: 100%; + width: 100%; + background: #eb7a55; +} + +.pace.pace-inactive { + display: none; +} \ No newline at end of file diff --git a/public/bower_components/PACE/themes/orange/pace-theme-corner-indicator.css b/public/bower_components/PACE/themes/orange/pace-theme-corner-indicator.css new file mode 100755 index 0000000..eda7fe4 --- /dev/null +++ b/public/bower_components/PACE/themes/orange/pace-theme-corner-indicator.css @@ -0,0 +1,73 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace .pace-activity { + display: block; + position: fixed; + z-index: 2000; + top: 0; + right: 0; + width: 300px; + height: 300px; + background: #eb7a55; + -webkit-transition: -webkit-transform 0.3s; + transition: transform 0.3s; + -webkit-transform: translateX(100%) translateY(-100%) rotate(45deg); + transform: translateX(100%) translateY(-100%) rotate(45deg); + pointer-events: none; +} + +.pace.pace-active .pace-activity { + -webkit-transform: translateX(50%) translateY(-50%) rotate(45deg); + transform: translateX(50%) translateY(-50%) rotate(45deg); +} + +.pace .pace-activity::before, +.pace .pace-activity::after { + -moz-box-sizing: border-box; + box-sizing: border-box; + position: absolute; + bottom: 30px; + left: 50%; + display: block; + border: 5px solid #fff; + border-radius: 50%; + content: ''; +} + +.pace .pace-activity::before { + margin-left: -40px; + width: 80px; + height: 80px; + border-right-color: rgba(0, 0, 0, .2); + border-left-color: rgba(0, 0, 0, .2); + -webkit-animation: pace-theme-corner-indicator-spin 3s linear infinite; + animation: pace-theme-corner-indicator-spin 3s linear infinite; +} + +.pace .pace-activity::after { + bottom: 50px; + margin-left: -20px; + width: 40px; + height: 40px; + border-top-color: rgba(0, 0, 0, .2); + border-bottom-color: rgba(0, 0, 0, .2); + -webkit-animation: pace-theme-corner-indicator-spin 1s linear infinite; + animation: pace-theme-corner-indicator-spin 1s linear infinite; +} + +@-webkit-keyframes pace-theme-corner-indicator-spin { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(359deg); } +} +@keyframes pace-theme-corner-indicator-spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(359deg); } +} diff --git a/public/bower_components/PACE/themes/orange/pace-theme-fill-left.css b/public/bower_components/PACE/themes/orange/pace-theme-fill-left.css new file mode 100755 index 0000000..a775dae --- /dev/null +++ b/public/bower_components/PACE/themes/orange/pace-theme-fill-left.css @@ -0,0 +1,22 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: rgba(235, 122, 85, 0.19999999999999996); + position: fixed; + z-index: -1; + top: 0; + right: 100%; + bottom: 0; + width: 100%; +} diff --git a/public/bower_components/PACE/themes/orange/pace-theme-flash.css b/public/bower_components/PACE/themes/orange/pace-theme-flash.css new file mode 100755 index 0000000..b226496 --- /dev/null +++ b/public/bower_components/PACE/themes/orange/pace-theme-flash.css @@ -0,0 +1,77 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background: #eb7a55; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 2px; +} + +.pace .pace-progress-inner { + display: block; + position: absolute; + right: 0px; + width: 100px; + height: 100%; + box-shadow: 0 0 10px #eb7a55, 0 0 5px #eb7a55; + opacity: 1.0; + -webkit-transform: rotate(3deg) translate(0px, -4px); + -moz-transform: rotate(3deg) translate(0px, -4px); + -ms-transform: rotate(3deg) translate(0px, -4px); + -o-transform: rotate(3deg) translate(0px, -4px); + transform: rotate(3deg) translate(0px, -4px); +} + +.pace .pace-activity { + display: block; + position: fixed; + z-index: 2000; + top: 15px; + right: 15px; + width: 14px; + height: 14px; + border: solid 2px transparent; + border-top-color: #eb7a55; + border-left-color: #eb7a55; + border-radius: 10px; + -webkit-animation: pace-spinner 400ms linear infinite; + -moz-animation: pace-spinner 400ms linear infinite; + -ms-animation: pace-spinner 400ms linear infinite; + -o-animation: pace-spinner 400ms linear infinite; + animation: pace-spinner 400ms linear infinite; +} + +@-webkit-keyframes pace-spinner { + 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } +} +@-moz-keyframes pace-spinner { + 0% { -moz-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -moz-transform: rotate(360deg); transform: rotate(360deg); } +} +@-o-keyframes pace-spinner { + 0% { -o-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -o-transform: rotate(360deg); transform: rotate(360deg); } +} +@-ms-keyframes pace-spinner { + 0% { -ms-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -ms-transform: rotate(360deg); transform: rotate(360deg); } +} +@keyframes pace-spinner { + 0% { transform: rotate(0deg); transform: rotate(0deg); } + 100% { transform: rotate(360deg); transform: rotate(360deg); } +} diff --git a/public/bower_components/PACE/themes/orange/pace-theme-flat-top.css b/public/bower_components/PACE/themes/orange/pace-theme-flat-top.css new file mode 100755 index 0000000..7e2c1ab --- /dev/null +++ b/public/bower_components/PACE/themes/orange/pace-theme-flat-top.css @@ -0,0 +1,41 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + position: fixed; + top: 0; + left: 0; + width: 100%; + + -webkit-transform: translate3d(0, -50px, 0); + -ms-transform: translate3d(0, -50px, 0); + transform: translate3d(0, -50px, 0); + + -webkit-transition: -webkit-transform .5s ease-out; + -ms-transition: -webkit-transform .5s ease-out; + transition: transform .5s ease-out; +} + +.pace.pace-active { + -webkit-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} + +.pace .pace-progress { + display: block; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 10px; + background: #eb7a55; + + pointer-events: none; +} diff --git a/public/bower_components/PACE/themes/orange/pace-theme-loading-bar.css b/public/bower_components/PACE/themes/orange/pace-theme-loading-bar.css new file mode 100755 index 0000000..7d468c3 --- /dev/null +++ b/public/bower_components/PACE/themes/orange/pace-theme-loading-bar.css @@ -0,0 +1,198 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; + + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + z-index: 2000; + position: fixed; + margin: auto; + top: 12px; + left: 0; + right: 0; + bottom: 0; + width: 200px; + height: 50px; + overflow: hidden; +} + +.pace .pace-progress { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + display: block; + position: absolute; + right: 100%; + margin-right: -7px; + width: 93%; + top: 7px; + height: 14px; + font-size: 12px; + background: #eb7a55; + color: #eb7a55; + line-height: 60px; + font-weight: bold; + font-family: Helvetica, Arial, "Lucida Grande", sans-serif; + + -webkit-box-shadow: 120px 0 #fff, 240px 0 #fff; + -ms-box-shadow: 120px 0 #fff, 240px 0 #fff; + box-shadow: 120px 0 #fff, 240px 0 #fff; +} + +.pace .pace-progress:after { + content: attr(data-progress-text); + display: inline-block; + position: fixed; + width: 45px; + text-align: right; + right: 0; + padding-right: 16px; + top: 4px; +} + +.pace .pace-progress[data-progress-text="0%"]:after { right: -200px } +.pace .pace-progress[data-progress-text="1%"]:after { right: -198.14px } +.pace .pace-progress[data-progress-text="2%"]:after { right: -196.28px } +.pace .pace-progress[data-progress-text="3%"]:after { right: -194.42px } +.pace .pace-progress[data-progress-text="4%"]:after { right: -192.56px } +.pace .pace-progress[data-progress-text="5%"]:after { right: -190.7px } +.pace .pace-progress[data-progress-text="6%"]:after { right: -188.84px } +.pace .pace-progress[data-progress-text="7%"]:after { right: -186.98px } +.pace .pace-progress[data-progress-text="8%"]:after { right: -185.12px } +.pace .pace-progress[data-progress-text="9%"]:after { right: -183.26px } +.pace .pace-progress[data-progress-text="10%"]:after { right: -181.4px } +.pace .pace-progress[data-progress-text="11%"]:after { right: -179.54px } +.pace .pace-progress[data-progress-text="12%"]:after { right: -177.68px } +.pace .pace-progress[data-progress-text="13%"]:after { right: -175.82px } +.pace .pace-progress[data-progress-text="14%"]:after { right: -173.96px } +.pace .pace-progress[data-progress-text="15%"]:after { right: -172.1px } +.pace .pace-progress[data-progress-text="16%"]:after { right: -170.24px } +.pace .pace-progress[data-progress-text="17%"]:after { right: -168.38px } +.pace .pace-progress[data-progress-text="18%"]:after { right: -166.52px } +.pace .pace-progress[data-progress-text="19%"]:after { right: -164.66px } +.pace .pace-progress[data-progress-text="20%"]:after { right: -162.8px } +.pace .pace-progress[data-progress-text="21%"]:after { right: -160.94px } +.pace .pace-progress[data-progress-text="22%"]:after { right: -159.08px } +.pace .pace-progress[data-progress-text="23%"]:after { right: -157.22px } +.pace .pace-progress[data-progress-text="24%"]:after { right: -155.36px } +.pace .pace-progress[data-progress-text="25%"]:after { right: -153.5px } +.pace .pace-progress[data-progress-text="26%"]:after { right: -151.64px } +.pace .pace-progress[data-progress-text="27%"]:after { right: -149.78px } +.pace .pace-progress[data-progress-text="28%"]:after { right: -147.92px } +.pace .pace-progress[data-progress-text="29%"]:after { right: -146.06px } +.pace .pace-progress[data-progress-text="30%"]:after { right: -144.2px } +.pace .pace-progress[data-progress-text="31%"]:after { right: -142.34px } +.pace .pace-progress[data-progress-text="32%"]:after { right: -140.48px } +.pace .pace-progress[data-progress-text="33%"]:after { right: -138.62px } +.pace .pace-progress[data-progress-text="34%"]:after { right: -136.76px } +.pace .pace-progress[data-progress-text="35%"]:after { right: -134.9px } +.pace .pace-progress[data-progress-text="36%"]:after { right: -133.04px } +.pace .pace-progress[data-progress-text="37%"]:after { right: -131.18px } +.pace .pace-progress[data-progress-text="38%"]:after { right: -129.32px } +.pace .pace-progress[data-progress-text="39%"]:after { right: -127.46px } +.pace .pace-progress[data-progress-text="40%"]:after { right: -125.6px } +.pace .pace-progress[data-progress-text="41%"]:after { right: -123.74px } +.pace .pace-progress[data-progress-text="42%"]:after { right: -121.88px } +.pace .pace-progress[data-progress-text="43%"]:after { right: -120.02px } +.pace .pace-progress[data-progress-text="44%"]:after { right: -118.16px } +.pace .pace-progress[data-progress-text="45%"]:after { right: -116.3px } +.pace .pace-progress[data-progress-text="46%"]:after { right: -114.44px } +.pace .pace-progress[data-progress-text="47%"]:after { right: -112.58px } +.pace .pace-progress[data-progress-text="48%"]:after { right: -110.72px } +.pace .pace-progress[data-progress-text="49%"]:after { right: -108.86px } +.pace .pace-progress[data-progress-text="50%"]:after { right: -107px } +.pace .pace-progress[data-progress-text="51%"]:after { right: -105.14px } +.pace .pace-progress[data-progress-text="52%"]:after { right: -103.28px } +.pace .pace-progress[data-progress-text="53%"]:after { right: -101.42px } +.pace .pace-progress[data-progress-text="54%"]:after { right: -99.56px } +.pace .pace-progress[data-progress-text="55%"]:after { right: -97.7px } +.pace .pace-progress[data-progress-text="56%"]:after { right: -95.84px } +.pace .pace-progress[data-progress-text="57%"]:after { right: -93.98px } +.pace .pace-progress[data-progress-text="58%"]:after { right: -92.12px } +.pace .pace-progress[data-progress-text="59%"]:after { right: -90.26px } +.pace .pace-progress[data-progress-text="60%"]:after { right: -88.4px } +.pace .pace-progress[data-progress-text="61%"]:after { right: -86.53999999999999px } +.pace .pace-progress[data-progress-text="62%"]:after { right: -84.68px } +.pace .pace-progress[data-progress-text="63%"]:after { right: -82.82px } +.pace .pace-progress[data-progress-text="64%"]:after { right: -80.96000000000001px } +.pace .pace-progress[data-progress-text="65%"]:after { right: -79.1px } +.pace .pace-progress[data-progress-text="66%"]:after { right: -77.24px } +.pace .pace-progress[data-progress-text="67%"]:after { right: -75.38px } +.pace .pace-progress[data-progress-text="68%"]:after { right: -73.52px } +.pace .pace-progress[data-progress-text="69%"]:after { right: -71.66px } +.pace .pace-progress[data-progress-text="70%"]:after { right: -69.8px } +.pace .pace-progress[data-progress-text="71%"]:after { right: -67.94px } +.pace .pace-progress[data-progress-text="72%"]:after { right: -66.08px } +.pace .pace-progress[data-progress-text="73%"]:after { right: -64.22px } +.pace .pace-progress[data-progress-text="74%"]:after { right: -62.36px } +.pace .pace-progress[data-progress-text="75%"]:after { right: -60.5px } +.pace .pace-progress[data-progress-text="76%"]:after { right: -58.64px } +.pace .pace-progress[data-progress-text="77%"]:after { right: -56.78px } +.pace .pace-progress[data-progress-text="78%"]:after { right: -54.92px } +.pace .pace-progress[data-progress-text="79%"]:after { right: -53.06px } +.pace .pace-progress[data-progress-text="80%"]:after { right: -51.2px } +.pace .pace-progress[data-progress-text="81%"]:after { right: -49.34px } +.pace .pace-progress[data-progress-text="82%"]:after { right: -47.480000000000004px } +.pace .pace-progress[data-progress-text="83%"]:after { right: -45.62px } +.pace .pace-progress[data-progress-text="84%"]:after { right: -43.76px } +.pace .pace-progress[data-progress-text="85%"]:after { right: -41.9px } +.pace .pace-progress[data-progress-text="86%"]:after { right: -40.04px } +.pace .pace-progress[data-progress-text="87%"]:after { right: -38.18px } +.pace .pace-progress[data-progress-text="88%"]:after { right: -36.32px } +.pace .pace-progress[data-progress-text="89%"]:after { right: -34.46px } +.pace .pace-progress[data-progress-text="90%"]:after { right: -32.6px } +.pace .pace-progress[data-progress-text="91%"]:after { right: -30.740000000000002px } +.pace .pace-progress[data-progress-text="92%"]:after { right: -28.880000000000003px } +.pace .pace-progress[data-progress-text="93%"]:after { right: -27.02px } +.pace .pace-progress[data-progress-text="94%"]:after { right: -25.16px } +.pace .pace-progress[data-progress-text="95%"]:after { right: -23.3px } +.pace .pace-progress[data-progress-text="96%"]:after { right: -21.439999999999998px } +.pace .pace-progress[data-progress-text="97%"]:after { right: -19.58px } +.pace .pace-progress[data-progress-text="98%"]:after { right: -17.72px } +.pace .pace-progress[data-progress-text="99%"]:after { right: -15.86px } +.pace .pace-progress[data-progress-text="100%"]:after { right: -14px } + + +.pace .pace-activity { + position: absolute; + width: 100%; + height: 28px; + z-index: 2001; + box-shadow: inset 0 0 0 2px #eb7a55, inset 0 0 0 7px #FFF; + border-radius: 10px; +} + +.pace.pace-inactive { + display: none; +} diff --git a/public/bower_components/PACE/themes/orange/pace-theme-mac-osx.css b/public/bower_components/PACE/themes/orange/pace-theme-mac-osx.css new file mode 100755 index 0000000..4cfe25c --- /dev/null +++ b/public/bower_components/PACE/themes/orange/pace-theme-mac-osx.css @@ -0,0 +1,87 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + overflow: hidden; + position: fixed; + top: 0; + left: 0; + z-index: 2000; + width: 100%; + height: 12px; + background: #fff; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: #FF2C00; + position: fixed; + top: 0; + right: 100%; + width: 100%; + height: 12px; + overflow: hidden; + + -webkit-border-radius: 0 0 4px 0; + -moz-border-radius: 0 0 4px 0; + -o-border-radius: 0 0 4px 0; + border-radius: 0 0 4px 0; + + -webkit-box-shadow: inset -1px 0 #BF1B00, inset 0 -1px #BF1B00, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + -moz-box-shadow: inset -1px 0 #BF1B00, inset 0 -1px #BF1B00, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + -o-box-shadow: inset -1px 0 #BF1B00, inset 0 -1px #BF1B00, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + box-shadow: inset -1px 0 #BF1B00, inset 0 -1px #BF1B00, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); +} + +.pace .pace-activity { + position: fixed; + top: 0; + left: 0; + right: -28px; + bottom: 0; + + -webkit-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + -moz-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + -o-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + + -webkit-background-size: 28px 100%; + -moz-background-size: 28px 100%; + -o-background-size: 28px 100%; + background-size: 28px 100%; + + -webkit-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -moz-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -ms-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -o-animation: pace-theme-mac-osx-motion 500ms linear infinite; + animation: pace-theme-mac-osx-motion 500ms linear infinite; +} + +@-webkit-keyframes pace-theme-mac-osx-motion { + 0% { -webkit-transform: none; transform: none; } + 100% { -webkit-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-moz-keyframes pace-theme-mac-osx-motion { + 0% { -moz-transform: none; transform: none; } + 100% { -moz-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-o-keyframes pace-theme-mac-osx-motion { + 0% { -o-transform: none; transform: none; } + 100% { -o-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-ms-keyframes pace-theme-mac-osx-motion { + 0% { -ms-transform: none; transform: none; } + 100% { -ms-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@keyframes pace-theme-mac-osx-motion { + 0% { transform: none; transform: none; } + 100% { transform: translate(-28px, 0); transform: translate(-28px, 0); } +} diff --git a/public/bower_components/PACE/themes/orange/pace-theme-minimal.css b/public/bower_components/PACE/themes/orange/pace-theme-minimal.css new file mode 100755 index 0000000..e02aab1 --- /dev/null +++ b/public/bower_components/PACE/themes/orange/pace-theme-minimal.css @@ -0,0 +1,23 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background: #eb7a55; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 2px; +} diff --git a/public/bower_components/PACE/themes/pink/pace-theme-barber-shop.css b/public/bower_components/PACE/themes/pink/pace-theme-barber-shop.css new file mode 100755 index 0000000..deb3d5e --- /dev/null +++ b/public/bower_components/PACE/themes/pink/pace-theme-barber-shop.css @@ -0,0 +1,83 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + overflow: hidden; + position: fixed; + top: 0; + left: 0; + z-index: 2000; + width: 100%; + height: 12px; + background: #fff; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: #e90f92; + position: fixed; + top: 0; + bottom: 0; + right: 100%; + width: 100%; + overflow: hidden; +} + +.pace .pace-activity { + position: fixed; + top: 0; + right: -32px; + bottom: 0; + left: 0; + + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.2)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.2)), color-stop(0.75, rgba(255, 255, 255, 0.2)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + -webkit-background-size: 32px 32px; + -moz-background-size: 32px 32px; + -o-background-size: 32px 32px; + background-size: 32px 32px; + + -webkit-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -moz-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -ms-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -o-animation: pace-theme-barber-shop-motion 500ms linear infinite; + animation: pace-theme-barber-shop-motion 500ms linear infinite; +} + +@-webkit-keyframes pace-theme-barber-shop-motion { + 0% { -webkit-transform: none; transform: none; } + 100% { -webkit-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-moz-keyframes pace-theme-barber-shop-motion { + 0% { -moz-transform: none; transform: none; } + 100% { -moz-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-o-keyframes pace-theme-barber-shop-motion { + 0% { -o-transform: none; transform: none; } + 100% { -o-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-ms-keyframes pace-theme-barber-shop-motion { + 0% { -ms-transform: none; transform: none; } + 100% { -ms-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@keyframes pace-theme-barber-shop-motion { + 0% { transform: none; transform: none; } + 100% { transform: translate(-32px, 0); transform: translate(-32px, 0); } +} diff --git a/public/bower_components/PACE/themes/pink/pace-theme-big-counter.css b/public/bower_components/PACE/themes/pink/pace-theme-big-counter.css new file mode 100755 index 0000000..396f7aa --- /dev/null +++ b/public/bower_components/PACE/themes/pink/pace-theme-big-counter.css @@ -0,0 +1,40 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace.pace-inactive .pace-progress { + display: none; +} + +.pace .pace-progress { + position: fixed; + z-index: 2000; + top: 0; + right: 0; + height: 5rem; + width: 5rem; + + -webkit-transform: translate3d(0, 0, 0) !important; + -ms-transform: translate3d(0, 0, 0) !important; + transform: translate3d(0, 0, 0) !important; +} + +.pace .pace-progress:after { + display: block; + position: absolute; + top: 0; + right: .5rem; + content: attr(data-progress-text); + font-family: "Helvetica Neue", sans-serif; + font-weight: 100; + font-size: 5rem; + line-height: 1; + text-align: right; + color: rgba(233, 15, 146, 0.19999999999999996); +} diff --git a/public/bower_components/PACE/themes/pink/pace-theme-bounce.css b/public/bower_components/PACE/themes/pink/pace-theme-bounce.css new file mode 100755 index 0000000..26fecda --- /dev/null +++ b/public/bower_components/PACE/themes/pink/pace-theme-bounce.css @@ -0,0 +1,231 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + width: 140px; + height: 300px; + position: fixed; + top: -90px; + right: -20px; + z-index: 2000; + -webkit-transform: scale(0); + -moz-transform: scale(0); + -ms-transform: scale(0); + -o-transform: scale(0); + transform: scale(0); + opacity: 0; + -webkit-transition: all 2s linear 0s; + -moz-transition: all 2s linear 0s; + transition: all 2s linear 0s; +} + +.pace.pace-active { + -webkit-transform: scale(.25); + -moz-transform: scale(.25); + -ms-transform: scale(.25); + -o-transform: scale(.25); + transform: scale(.25); + opacity: 1; +} + +.pace .pace-activity { + width: 140px; + height: 140px; + border-radius: 70px; + background: #e90f92; + position: absolute; + top: 0; + z-index: 1911; + -webkit-animation: pace-bounce 1s infinite; + -moz-animation: pace-bounce 1s infinite; + -o-animation: pace-bounce 1s infinite; + -ms-animation: pace-bounce 1s infinite; + animation: pace-bounce 1s infinite; +} + +.pace .pace-progress { + position: absolute; + display: block; + left: 50%; + bottom: 0; + z-index: 1910; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -webkit-transform: scaleY(.3) !important; + -moz-transform: scaleY(.3) !important; + -ms-transform: scaleY(.3) !important; + -o-transform: scaleY(.3) !important; + transform: scaleY(.3) !important; + -webkit-animation: pace-compress .5s infinite alternate; + -moz-animation: pace-compress .5s infinite alternate; + -o-animation: pace-compress .5s infinite alternate; + -ms-animation: pace-compress .5s infinite alternate; + animation: pace-compress .5s infinite alternate; +} + +@-webkit-keyframes pace-bounce { + 0% { + top: 0; + -webkit-animation-timing-function: ease-in; + } + 40% {} + 50% { + top: 140px; + height: 140px; + -webkit-animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + -webkit-animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + -webkit-animation-timing-function: ease-out; + } + 95% { + top: 0; + -webkit-animation-timing-function: ease-in; + } + 100% { + top: 0; + -webkit-animation-timing-function: ease-in; + } +} + +@-moz-keyframes pace-bounce { + 0% { + top: 0; + -moz-animation-timing-function: ease-in; + } + 40% {} + 50% { + top: 140px; + height: 140px; + -moz-animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + -moz-animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + -moz-animation-timing-function: ease-out;} + 95% { + top: 0; + -moz-animation-timing-function: ease-in; + } + 100% {top: 0; + -moz-animation-timing-function: ease-in; + } +} + +@keyframes pace-bounce { + 0% { + top: 0; + animation-timing-function: ease-in; + } + 50% { + top: 140px; + height: 140px; + animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + animation-timing-function: ease-out; + } + 95% { + top: 0; + animation-timing-function: ease-in; + } + 100% { + top: 0; + animation-timing-function: ease-in; + } +} + +@-webkit-keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -webkit-animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + -webkit-animation-timing-function: ease-out; + } +} + +@-moz-keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -moz-animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + -moz-animation-timing-function: ease-out; + } +} + +@keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + animation-timing-function: ease-out; + } +} \ No newline at end of file diff --git a/public/bower_components/PACE/themes/pink/pace-theme-center-atom.css b/public/bower_components/PACE/themes/pink/pace-theme-center-atom.css new file mode 100755 index 0000000..e255d08 --- /dev/null +++ b/public/bower_components/PACE/themes/pink/pace-theme-center-atom.css @@ -0,0 +1,131 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace.pace-inactive { + display: none; +} + +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + height: 60px; + width: 100px; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace .pace-progress { + z-index: 2000; + position: absolute; + height: 60px; + width: 100px; + + -webkit-transform: translate3d(0, 0, 0) !important; + -ms-transform: translate3d(0, 0, 0) !important; + transform: translate3d(0, 0, 0) !important; +} + +.pace .pace-progress:before { + content: attr(data-progress-text); + text-align: center; + color: #fff; + background: #e90f92; + border-radius: 50%; + font-family: "Helvetica Neue", sans-serif; + font-size: 14px; + font-weight: 100; + line-height: 1; + padding: 20% 0 7px; + width: 50%; + height: 40%; + margin: 10px 0 0 30px; + display: block; + z-index: 999; + position: absolute; +} + +.pace .pace-activity { + font-size: 15px; + line-height: 1; + z-index: 2000; + position: absolute; + height: 60px; + width: 100px; + + display: block; + -webkit-animation: pace-theme-center-atom-spin 2s linear infinite; + -moz-animation: pace-theme-center-atom-spin 2s linear infinite; + -o-animation: pace-theme-center-atom-spin 2s linear infinite; + animation: pace-theme-center-atom-spin 2s linear infinite; +} + +.pace .pace-activity { + border-radius: 50%; + border: 5px solid #e90f92; + content: ' '; + display: block; + position: absolute; + top: 0; + left: 0; + height: 60px; + width: 100px; +} + +.pace .pace-activity:after { + border-radius: 50%; + border: 5px solid #e90f92; + content: ' '; + display: block; + position: absolute; + top: -5px; + left: -5px; + height: 60px; + width: 100px; + + -webkit-transform: rotate(60deg); + -moz-transform: rotate(60deg); + -o-transform: rotate(60deg); + transform: rotate(60deg); +} + +.pace .pace-activity:before { + border-radius: 50%; + border: 5px solid #e90f92; + content: ' '; + display: block; + position: absolute; + top: -5px; + left: -5px; + height: 60px; + width: 100px; + + -webkit-transform: rotate(120deg); + -moz-transform: rotate(120deg); + -o-transform: rotate(120deg); + transform: rotate(120deg); +} + +@-webkit-keyframes pace-theme-center-atom-spin { + 0% { -webkit-transform: rotate(0deg) } + 100% { -webkit-transform: rotate(359deg) } +} +@-moz-keyframes pace-theme-center-atom-spin { + 0% { -moz-transform: rotate(0deg) } + 100% { -moz-transform: rotate(359deg) } +} +@-o-keyframes pace-theme-center-atom-spin { + 0% { -o-transform: rotate(0deg) } + 100% { -o-transform: rotate(359deg) } +} +@keyframes pace-theme-center-atom-spin { + 0% { transform: rotate(0deg) } + 100% { transform: rotate(359deg) } +} diff --git a/public/bower_components/PACE/themes/pink/pace-theme-center-circle.css b/public/bower_components/PACE/themes/pink/pace-theme-center-circle.css new file mode 100755 index 0000000..c3aa0f2 --- /dev/null +++ b/public/bower_components/PACE/themes/pink/pace-theme-center-circle.css @@ -0,0 +1,90 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + -webkit-perspective: 12rem; + -moz-perspective: 12rem; + -ms-perspective: 12rem; + -o-perspective: 12rem; + perspective: 12rem; + + z-index: 2000; + position: fixed; + height: 6rem; + width: 6rem; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace.pace-inactive .pace-progress { + display: none; +} + +.pace .pace-progress { + position: fixed; + z-index: 2000; + display: block; + position: absolute; + left: 0; + top: 0; + height: 6rem; + width: 6rem !important; + line-height: 6rem; + font-size: 2rem; + border-radius: 50%; + background: rgba(233, 15, 146, 0.8); + color: #fff; + font-family: "Helvetica Neue", sans-serif; + font-weight: 100; + text-align: center; + + -webkit-animation: pace-theme-center-circle-spin linear infinite 2s; + -moz-animation: pace-theme-center-circle-spin linear infinite 2s; + -ms-animation: pace-theme-center-circle-spin linear infinite 2s; + -o-animation: pace-theme-center-circle-spin linear infinite 2s; + animation: pace-theme-center-circle-spin linear infinite 2s; + + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + -ms-transform-style: preserve-3d; + -o-transform-style: preserve-3d; + transform-style: preserve-3d; +} + +.pace .pace-progress:after { + content: attr(data-progress-text); + display: block; +} + +@-webkit-keyframes pace-theme-center-circle-spin { + from { -webkit-transform: rotateY(0deg) } + to { -webkit-transform: rotateY(360deg) } +} + +@-moz-keyframes pace-theme-center-circle-spin { + from { -moz-transform: rotateY(0deg) } + to { -moz-transform: rotateY(360deg) } +} + +@-ms-keyframes pace-theme-center-circle-spin { + from { -ms-transform: rotateY(0deg) } + to { -ms-transform: rotateY(360deg) } +} + +@-o-keyframes pace-theme-center-circle-spin { + from { -o-transform: rotateY(0deg) } + to { -o-transform: rotateY(360deg) } +} + +@keyframes pace-theme-center-circle-spin { + from { transform: rotateY(0deg) } + to { transform: rotateY(360deg) } +} diff --git a/public/bower_components/PACE/themes/pink/pace-theme-center-radar.css b/public/bower_components/PACE/themes/pink/pace-theme-center-radar.css new file mode 100755 index 0000000..45e3a10 --- /dev/null +++ b/public/bower_components/PACE/themes/pink/pace-theme-center-radar.css @@ -0,0 +1,74 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + height: 90px; + width: 90px; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace.pace-inactive .pace-activity { + display: none; +} + +.pace .pace-activity { + position: fixed; + z-index: 2000; + display: block; + position: absolute; + left: -30px; + top: -30px; + height: 90px; + width: 90px; + display: block; + border-width: 30px; + border-style: double; + border-color: #e90f92 transparent transparent; + border-radius: 50%; + + -webkit-animation: spin 1s linear infinite; + -moz-animation: spin 1s linear infinite; + -o-animation: spin 1s linear infinite; + animation: spin 1s linear infinite; +} + +.pace .pace-activity:before { + content: ' '; + position: absolute; + top: 10px; + left: 10px; + height: 50px; + width: 50px; + display: block; + border-width: 10px; + border-style: solid; + border-color: #e90f92 transparent transparent; + border-radius: 50%; +} + +@-webkit-keyframes spin { + 100% { -webkit-transform: rotate(359deg); } +} + +@-moz-keyframes spin { + 100% { -moz-transform: rotate(359deg); } +} + +@-o-keyframes spin { + 100% { -moz-transform: rotate(359deg); } +} + +@keyframes spin { + 100% { transform: rotate(359deg); } +} diff --git a/public/bower_components/PACE/themes/pink/pace-theme-center-simple.css b/public/bower_components/PACE/themes/pink/pace-theme-center-simple.css new file mode 100755 index 0000000..446bd67 --- /dev/null +++ b/public/bower_components/PACE/themes/pink/pace-theme-center-simple.css @@ -0,0 +1,52 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; + height: 5px; + width: 200px; + background: #fff; + border: 1px solid #e90f92; + + overflow: hidden; +} + +.pace .pace-progress { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + max-width: 200px; + position: fixed; + z-index: 2000; + display: block; + position: absolute; + top: 0; + right: 100%; + height: 100%; + width: 100%; + background: #e90f92; +} + +.pace.pace-inactive { + display: none; +} \ No newline at end of file diff --git a/public/bower_components/PACE/themes/pink/pace-theme-corner-indicator.css b/public/bower_components/PACE/themes/pink/pace-theme-corner-indicator.css new file mode 100755 index 0000000..f971a18 --- /dev/null +++ b/public/bower_components/PACE/themes/pink/pace-theme-corner-indicator.css @@ -0,0 +1,73 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace .pace-activity { + display: block; + position: fixed; + z-index: 2000; + top: 0; + right: 0; + width: 300px; + height: 300px; + background: #e90f92; + -webkit-transition: -webkit-transform 0.3s; + transition: transform 0.3s; + -webkit-transform: translateX(100%) translateY(-100%) rotate(45deg); + transform: translateX(100%) translateY(-100%) rotate(45deg); + pointer-events: none; +} + +.pace.pace-active .pace-activity { + -webkit-transform: translateX(50%) translateY(-50%) rotate(45deg); + transform: translateX(50%) translateY(-50%) rotate(45deg); +} + +.pace .pace-activity::before, +.pace .pace-activity::after { + -moz-box-sizing: border-box; + box-sizing: border-box; + position: absolute; + bottom: 30px; + left: 50%; + display: block; + border: 5px solid #fff; + border-radius: 50%; + content: ''; +} + +.pace .pace-activity::before { + margin-left: -40px; + width: 80px; + height: 80px; + border-right-color: rgba(0, 0, 0, .2); + border-left-color: rgba(0, 0, 0, .2); + -webkit-animation: pace-theme-corner-indicator-spin 3s linear infinite; + animation: pace-theme-corner-indicator-spin 3s linear infinite; +} + +.pace .pace-activity::after { + bottom: 50px; + margin-left: -20px; + width: 40px; + height: 40px; + border-top-color: rgba(0, 0, 0, .2); + border-bottom-color: rgba(0, 0, 0, .2); + -webkit-animation: pace-theme-corner-indicator-spin 1s linear infinite; + animation: pace-theme-corner-indicator-spin 1s linear infinite; +} + +@-webkit-keyframes pace-theme-corner-indicator-spin { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(359deg); } +} +@keyframes pace-theme-corner-indicator-spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(359deg); } +} diff --git a/public/bower_components/PACE/themes/pink/pace-theme-fill-left.css b/public/bower_components/PACE/themes/pink/pace-theme-fill-left.css new file mode 100755 index 0000000..aaa1f85 --- /dev/null +++ b/public/bower_components/PACE/themes/pink/pace-theme-fill-left.css @@ -0,0 +1,22 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: rgba(233, 15, 146, 0.19999999999999996); + position: fixed; + z-index: -1; + top: 0; + right: 100%; + bottom: 0; + width: 100%; +} diff --git a/public/bower_components/PACE/themes/pink/pace-theme-flash.css b/public/bower_components/PACE/themes/pink/pace-theme-flash.css new file mode 100755 index 0000000..e428c5c --- /dev/null +++ b/public/bower_components/PACE/themes/pink/pace-theme-flash.css @@ -0,0 +1,77 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background: #e90f92; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 2px; +} + +.pace .pace-progress-inner { + display: block; + position: absolute; + right: 0px; + width: 100px; + height: 100%; + box-shadow: 0 0 10px #e90f92, 0 0 5px #e90f92; + opacity: 1.0; + -webkit-transform: rotate(3deg) translate(0px, -4px); + -moz-transform: rotate(3deg) translate(0px, -4px); + -ms-transform: rotate(3deg) translate(0px, -4px); + -o-transform: rotate(3deg) translate(0px, -4px); + transform: rotate(3deg) translate(0px, -4px); +} + +.pace .pace-activity { + display: block; + position: fixed; + z-index: 2000; + top: 15px; + right: 15px; + width: 14px; + height: 14px; + border: solid 2px transparent; + border-top-color: #e90f92; + border-left-color: #e90f92; + border-radius: 10px; + -webkit-animation: pace-spinner 400ms linear infinite; + -moz-animation: pace-spinner 400ms linear infinite; + -ms-animation: pace-spinner 400ms linear infinite; + -o-animation: pace-spinner 400ms linear infinite; + animation: pace-spinner 400ms linear infinite; +} + +@-webkit-keyframes pace-spinner { + 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } +} +@-moz-keyframes pace-spinner { + 0% { -moz-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -moz-transform: rotate(360deg); transform: rotate(360deg); } +} +@-o-keyframes pace-spinner { + 0% { -o-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -o-transform: rotate(360deg); transform: rotate(360deg); } +} +@-ms-keyframes pace-spinner { + 0% { -ms-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -ms-transform: rotate(360deg); transform: rotate(360deg); } +} +@keyframes pace-spinner { + 0% { transform: rotate(0deg); transform: rotate(0deg); } + 100% { transform: rotate(360deg); transform: rotate(360deg); } +} diff --git a/public/bower_components/PACE/themes/pink/pace-theme-flat-top.css b/public/bower_components/PACE/themes/pink/pace-theme-flat-top.css new file mode 100755 index 0000000..fff9781 --- /dev/null +++ b/public/bower_components/PACE/themes/pink/pace-theme-flat-top.css @@ -0,0 +1,41 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + position: fixed; + top: 0; + left: 0; + width: 100%; + + -webkit-transform: translate3d(0, -50px, 0); + -ms-transform: translate3d(0, -50px, 0); + transform: translate3d(0, -50px, 0); + + -webkit-transition: -webkit-transform .5s ease-out; + -ms-transition: -webkit-transform .5s ease-out; + transition: transform .5s ease-out; +} + +.pace.pace-active { + -webkit-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} + +.pace .pace-progress { + display: block; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 10px; + background: #e90f92; + + pointer-events: none; +} diff --git a/public/bower_components/PACE/themes/pink/pace-theme-loading-bar.css b/public/bower_components/PACE/themes/pink/pace-theme-loading-bar.css new file mode 100755 index 0000000..e147a0f --- /dev/null +++ b/public/bower_components/PACE/themes/pink/pace-theme-loading-bar.css @@ -0,0 +1,198 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; + + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + z-index: 2000; + position: fixed; + margin: auto; + top: 12px; + left: 0; + right: 0; + bottom: 0; + width: 200px; + height: 50px; + overflow: hidden; +} + +.pace .pace-progress { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + display: block; + position: absolute; + right: 100%; + margin-right: -7px; + width: 93%; + top: 7px; + height: 14px; + font-size: 12px; + background: #e90f92; + color: #e90f92; + line-height: 60px; + font-weight: bold; + font-family: Helvetica, Arial, "Lucida Grande", sans-serif; + + -webkit-box-shadow: 120px 0 #fff, 240px 0 #fff; + -ms-box-shadow: 120px 0 #fff, 240px 0 #fff; + box-shadow: 120px 0 #fff, 240px 0 #fff; +} + +.pace .pace-progress:after { + content: attr(data-progress-text); + display: inline-block; + position: fixed; + width: 45px; + text-align: right; + right: 0; + padding-right: 16px; + top: 4px; +} + +.pace .pace-progress[data-progress-text="0%"]:after { right: -200px } +.pace .pace-progress[data-progress-text="1%"]:after { right: -198.14px } +.pace .pace-progress[data-progress-text="2%"]:after { right: -196.28px } +.pace .pace-progress[data-progress-text="3%"]:after { right: -194.42px } +.pace .pace-progress[data-progress-text="4%"]:after { right: -192.56px } +.pace .pace-progress[data-progress-text="5%"]:after { right: -190.7px } +.pace .pace-progress[data-progress-text="6%"]:after { right: -188.84px } +.pace .pace-progress[data-progress-text="7%"]:after { right: -186.98px } +.pace .pace-progress[data-progress-text="8%"]:after { right: -185.12px } +.pace .pace-progress[data-progress-text="9%"]:after { right: -183.26px } +.pace .pace-progress[data-progress-text="10%"]:after { right: -181.4px } +.pace .pace-progress[data-progress-text="11%"]:after { right: -179.54px } +.pace .pace-progress[data-progress-text="12%"]:after { right: -177.68px } +.pace .pace-progress[data-progress-text="13%"]:after { right: -175.82px } +.pace .pace-progress[data-progress-text="14%"]:after { right: -173.96px } +.pace .pace-progress[data-progress-text="15%"]:after { right: -172.1px } +.pace .pace-progress[data-progress-text="16%"]:after { right: -170.24px } +.pace .pace-progress[data-progress-text="17%"]:after { right: -168.38px } +.pace .pace-progress[data-progress-text="18%"]:after { right: -166.52px } +.pace .pace-progress[data-progress-text="19%"]:after { right: -164.66px } +.pace .pace-progress[data-progress-text="20%"]:after { right: -162.8px } +.pace .pace-progress[data-progress-text="21%"]:after { right: -160.94px } +.pace .pace-progress[data-progress-text="22%"]:after { right: -159.08px } +.pace .pace-progress[data-progress-text="23%"]:after { right: -157.22px } +.pace .pace-progress[data-progress-text="24%"]:after { right: -155.36px } +.pace .pace-progress[data-progress-text="25%"]:after { right: -153.5px } +.pace .pace-progress[data-progress-text="26%"]:after { right: -151.64px } +.pace .pace-progress[data-progress-text="27%"]:after { right: -149.78px } +.pace .pace-progress[data-progress-text="28%"]:after { right: -147.92px } +.pace .pace-progress[data-progress-text="29%"]:after { right: -146.06px } +.pace .pace-progress[data-progress-text="30%"]:after { right: -144.2px } +.pace .pace-progress[data-progress-text="31%"]:after { right: -142.34px } +.pace .pace-progress[data-progress-text="32%"]:after { right: -140.48px } +.pace .pace-progress[data-progress-text="33%"]:after { right: -138.62px } +.pace .pace-progress[data-progress-text="34%"]:after { right: -136.76px } +.pace .pace-progress[data-progress-text="35%"]:after { right: -134.9px } +.pace .pace-progress[data-progress-text="36%"]:after { right: -133.04px } +.pace .pace-progress[data-progress-text="37%"]:after { right: -131.18px } +.pace .pace-progress[data-progress-text="38%"]:after { right: -129.32px } +.pace .pace-progress[data-progress-text="39%"]:after { right: -127.46px } +.pace .pace-progress[data-progress-text="40%"]:after { right: -125.6px } +.pace .pace-progress[data-progress-text="41%"]:after { right: -123.74px } +.pace .pace-progress[data-progress-text="42%"]:after { right: -121.88px } +.pace .pace-progress[data-progress-text="43%"]:after { right: -120.02px } +.pace .pace-progress[data-progress-text="44%"]:after { right: -118.16px } +.pace .pace-progress[data-progress-text="45%"]:after { right: -116.3px } +.pace .pace-progress[data-progress-text="46%"]:after { right: -114.44px } +.pace .pace-progress[data-progress-text="47%"]:after { right: -112.58px } +.pace .pace-progress[data-progress-text="48%"]:after { right: -110.72px } +.pace .pace-progress[data-progress-text="49%"]:after { right: -108.86px } +.pace .pace-progress[data-progress-text="50%"]:after { right: -107px } +.pace .pace-progress[data-progress-text="51%"]:after { right: -105.14px } +.pace .pace-progress[data-progress-text="52%"]:after { right: -103.28px } +.pace .pace-progress[data-progress-text="53%"]:after { right: -101.42px } +.pace .pace-progress[data-progress-text="54%"]:after { right: -99.56px } +.pace .pace-progress[data-progress-text="55%"]:after { right: -97.7px } +.pace .pace-progress[data-progress-text="56%"]:after { right: -95.84px } +.pace .pace-progress[data-progress-text="57%"]:after { right: -93.98px } +.pace .pace-progress[data-progress-text="58%"]:after { right: -92.12px } +.pace .pace-progress[data-progress-text="59%"]:after { right: -90.26px } +.pace .pace-progress[data-progress-text="60%"]:after { right: -88.4px } +.pace .pace-progress[data-progress-text="61%"]:after { right: -86.53999999999999px } +.pace .pace-progress[data-progress-text="62%"]:after { right: -84.68px } +.pace .pace-progress[data-progress-text="63%"]:after { right: -82.82px } +.pace .pace-progress[data-progress-text="64%"]:after { right: -80.96000000000001px } +.pace .pace-progress[data-progress-text="65%"]:after { right: -79.1px } +.pace .pace-progress[data-progress-text="66%"]:after { right: -77.24px } +.pace .pace-progress[data-progress-text="67%"]:after { right: -75.38px } +.pace .pace-progress[data-progress-text="68%"]:after { right: -73.52px } +.pace .pace-progress[data-progress-text="69%"]:after { right: -71.66px } +.pace .pace-progress[data-progress-text="70%"]:after { right: -69.8px } +.pace .pace-progress[data-progress-text="71%"]:after { right: -67.94px } +.pace .pace-progress[data-progress-text="72%"]:after { right: -66.08px } +.pace .pace-progress[data-progress-text="73%"]:after { right: -64.22px } +.pace .pace-progress[data-progress-text="74%"]:after { right: -62.36px } +.pace .pace-progress[data-progress-text="75%"]:after { right: -60.5px } +.pace .pace-progress[data-progress-text="76%"]:after { right: -58.64px } +.pace .pace-progress[data-progress-text="77%"]:after { right: -56.78px } +.pace .pace-progress[data-progress-text="78%"]:after { right: -54.92px } +.pace .pace-progress[data-progress-text="79%"]:after { right: -53.06px } +.pace .pace-progress[data-progress-text="80%"]:after { right: -51.2px } +.pace .pace-progress[data-progress-text="81%"]:after { right: -49.34px } +.pace .pace-progress[data-progress-text="82%"]:after { right: -47.480000000000004px } +.pace .pace-progress[data-progress-text="83%"]:after { right: -45.62px } +.pace .pace-progress[data-progress-text="84%"]:after { right: -43.76px } +.pace .pace-progress[data-progress-text="85%"]:after { right: -41.9px } +.pace .pace-progress[data-progress-text="86%"]:after { right: -40.04px } +.pace .pace-progress[data-progress-text="87%"]:after { right: -38.18px } +.pace .pace-progress[data-progress-text="88%"]:after { right: -36.32px } +.pace .pace-progress[data-progress-text="89%"]:after { right: -34.46px } +.pace .pace-progress[data-progress-text="90%"]:after { right: -32.6px } +.pace .pace-progress[data-progress-text="91%"]:after { right: -30.740000000000002px } +.pace .pace-progress[data-progress-text="92%"]:after { right: -28.880000000000003px } +.pace .pace-progress[data-progress-text="93%"]:after { right: -27.02px } +.pace .pace-progress[data-progress-text="94%"]:after { right: -25.16px } +.pace .pace-progress[data-progress-text="95%"]:after { right: -23.3px } +.pace .pace-progress[data-progress-text="96%"]:after { right: -21.439999999999998px } +.pace .pace-progress[data-progress-text="97%"]:after { right: -19.58px } +.pace .pace-progress[data-progress-text="98%"]:after { right: -17.72px } +.pace .pace-progress[data-progress-text="99%"]:after { right: -15.86px } +.pace .pace-progress[data-progress-text="100%"]:after { right: -14px } + + +.pace .pace-activity { + position: absolute; + width: 100%; + height: 28px; + z-index: 2001; + box-shadow: inset 0 0 0 2px #e90f92, inset 0 0 0 7px #FFF; + border-radius: 10px; +} + +.pace.pace-inactive { + display: none; +} diff --git a/public/bower_components/PACE/themes/pink/pace-theme-mac-osx.css b/public/bower_components/PACE/themes/pink/pace-theme-mac-osx.css new file mode 100755 index 0000000..d3b87e9 --- /dev/null +++ b/public/bower_components/PACE/themes/pink/pace-theme-mac-osx.css @@ -0,0 +1,87 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + overflow: hidden; + position: fixed; + top: 0; + left: 0; + z-index: 2000; + width: 100%; + height: 12px; + background: #fff; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: #F40080; + position: fixed; + top: 0; + right: 100%; + width: 100%; + height: 12px; + overflow: hidden; + + -webkit-border-radius: 0 0 4px 0; + -moz-border-radius: 0 0 4px 0; + -o-border-radius: 0 0 4px 0; + border-radius: 0 0 4px 0; + + -webkit-box-shadow: inset -1px 0 #9F0053, inset 0 -1px #9F0053, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + -moz-box-shadow: inset -1px 0 #9F0053, inset 0 -1px #9F0053, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + -o-box-shadow: inset -1px 0 #9F0053, inset 0 -1px #9F0053, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + box-shadow: inset -1px 0 #9F0053, inset 0 -1px #9F0053, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); +} + +.pace .pace-activity { + position: fixed; + top: 0; + left: 0; + right: -28px; + bottom: 0; + + -webkit-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + -moz-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + -o-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + + -webkit-background-size: 28px 100%; + -moz-background-size: 28px 100%; + -o-background-size: 28px 100%; + background-size: 28px 100%; + + -webkit-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -moz-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -ms-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -o-animation: pace-theme-mac-osx-motion 500ms linear infinite; + animation: pace-theme-mac-osx-motion 500ms linear infinite; +} + +@-webkit-keyframes pace-theme-mac-osx-motion { + 0% { -webkit-transform: none; transform: none; } + 100% { -webkit-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-moz-keyframes pace-theme-mac-osx-motion { + 0% { -moz-transform: none; transform: none; } + 100% { -moz-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-o-keyframes pace-theme-mac-osx-motion { + 0% { -o-transform: none; transform: none; } + 100% { -o-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-ms-keyframes pace-theme-mac-osx-motion { + 0% { -ms-transform: none; transform: none; } + 100% { -ms-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@keyframes pace-theme-mac-osx-motion { + 0% { transform: none; transform: none; } + 100% { transform: translate(-28px, 0); transform: translate(-28px, 0); } +} diff --git a/public/bower_components/PACE/themes/pink/pace-theme-minimal.css b/public/bower_components/PACE/themes/pink/pace-theme-minimal.css new file mode 100755 index 0000000..619bdcd --- /dev/null +++ b/public/bower_components/PACE/themes/pink/pace-theme-minimal.css @@ -0,0 +1,23 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background: #e90f92; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 2px; +} diff --git a/public/bower_components/PACE/themes/purple/pace-theme-barber-shop.css b/public/bower_components/PACE/themes/purple/pace-theme-barber-shop.css new file mode 100755 index 0000000..1f323bb --- /dev/null +++ b/public/bower_components/PACE/themes/purple/pace-theme-barber-shop.css @@ -0,0 +1,83 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + overflow: hidden; + position: fixed; + top: 0; + left: 0; + z-index: 2000; + width: 100%; + height: 12px; + background: #fff; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: #7c60e0; + position: fixed; + top: 0; + bottom: 0; + right: 100%; + width: 100%; + overflow: hidden; +} + +.pace .pace-activity { + position: fixed; + top: 0; + right: -32px; + bottom: 0; + left: 0; + + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.2)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.2)), color-stop(0.75, rgba(255, 255, 255, 0.2)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + -webkit-background-size: 32px 32px; + -moz-background-size: 32px 32px; + -o-background-size: 32px 32px; + background-size: 32px 32px; + + -webkit-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -moz-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -ms-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -o-animation: pace-theme-barber-shop-motion 500ms linear infinite; + animation: pace-theme-barber-shop-motion 500ms linear infinite; +} + +@-webkit-keyframes pace-theme-barber-shop-motion { + 0% { -webkit-transform: none; transform: none; } + 100% { -webkit-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-moz-keyframes pace-theme-barber-shop-motion { + 0% { -moz-transform: none; transform: none; } + 100% { -moz-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-o-keyframes pace-theme-barber-shop-motion { + 0% { -o-transform: none; transform: none; } + 100% { -o-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-ms-keyframes pace-theme-barber-shop-motion { + 0% { -ms-transform: none; transform: none; } + 100% { -ms-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@keyframes pace-theme-barber-shop-motion { + 0% { transform: none; transform: none; } + 100% { transform: translate(-32px, 0); transform: translate(-32px, 0); } +} diff --git a/public/bower_components/PACE/themes/purple/pace-theme-big-counter.css b/public/bower_components/PACE/themes/purple/pace-theme-big-counter.css new file mode 100755 index 0000000..51ac58e --- /dev/null +++ b/public/bower_components/PACE/themes/purple/pace-theme-big-counter.css @@ -0,0 +1,40 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace.pace-inactive .pace-progress { + display: none; +} + +.pace .pace-progress { + position: fixed; + z-index: 2000; + top: 0; + right: 0; + height: 5rem; + width: 5rem; + + -webkit-transform: translate3d(0, 0, 0) !important; + -ms-transform: translate3d(0, 0, 0) !important; + transform: translate3d(0, 0, 0) !important; +} + +.pace .pace-progress:after { + display: block; + position: absolute; + top: 0; + right: .5rem; + content: attr(data-progress-text); + font-family: "Helvetica Neue", sans-serif; + font-weight: 100; + font-size: 5rem; + line-height: 1; + text-align: right; + color: rgba(124, 96, 224, 0.19999999999999996); +} diff --git a/public/bower_components/PACE/themes/purple/pace-theme-bounce.css b/public/bower_components/PACE/themes/purple/pace-theme-bounce.css new file mode 100755 index 0000000..f93f986 --- /dev/null +++ b/public/bower_components/PACE/themes/purple/pace-theme-bounce.css @@ -0,0 +1,231 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + width: 140px; + height: 300px; + position: fixed; + top: -90px; + right: -20px; + z-index: 2000; + -webkit-transform: scale(0); + -moz-transform: scale(0); + -ms-transform: scale(0); + -o-transform: scale(0); + transform: scale(0); + opacity: 0; + -webkit-transition: all 2s linear 0s; + -moz-transition: all 2s linear 0s; + transition: all 2s linear 0s; +} + +.pace.pace-active { + -webkit-transform: scale(.25); + -moz-transform: scale(.25); + -ms-transform: scale(.25); + -o-transform: scale(.25); + transform: scale(.25); + opacity: 1; +} + +.pace .pace-activity { + width: 140px; + height: 140px; + border-radius: 70px; + background: #7c60e0; + position: absolute; + top: 0; + z-index: 1911; + -webkit-animation: pace-bounce 1s infinite; + -moz-animation: pace-bounce 1s infinite; + -o-animation: pace-bounce 1s infinite; + -ms-animation: pace-bounce 1s infinite; + animation: pace-bounce 1s infinite; +} + +.pace .pace-progress { + position: absolute; + display: block; + left: 50%; + bottom: 0; + z-index: 1910; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -webkit-transform: scaleY(.3) !important; + -moz-transform: scaleY(.3) !important; + -ms-transform: scaleY(.3) !important; + -o-transform: scaleY(.3) !important; + transform: scaleY(.3) !important; + -webkit-animation: pace-compress .5s infinite alternate; + -moz-animation: pace-compress .5s infinite alternate; + -o-animation: pace-compress .5s infinite alternate; + -ms-animation: pace-compress .5s infinite alternate; + animation: pace-compress .5s infinite alternate; +} + +@-webkit-keyframes pace-bounce { + 0% { + top: 0; + -webkit-animation-timing-function: ease-in; + } + 40% {} + 50% { + top: 140px; + height: 140px; + -webkit-animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + -webkit-animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + -webkit-animation-timing-function: ease-out; + } + 95% { + top: 0; + -webkit-animation-timing-function: ease-in; + } + 100% { + top: 0; + -webkit-animation-timing-function: ease-in; + } +} + +@-moz-keyframes pace-bounce { + 0% { + top: 0; + -moz-animation-timing-function: ease-in; + } + 40% {} + 50% { + top: 140px; + height: 140px; + -moz-animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + -moz-animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + -moz-animation-timing-function: ease-out;} + 95% { + top: 0; + -moz-animation-timing-function: ease-in; + } + 100% {top: 0; + -moz-animation-timing-function: ease-in; + } +} + +@keyframes pace-bounce { + 0% { + top: 0; + animation-timing-function: ease-in; + } + 50% { + top: 140px; + height: 140px; + animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + animation-timing-function: ease-out; + } + 95% { + top: 0; + animation-timing-function: ease-in; + } + 100% { + top: 0; + animation-timing-function: ease-in; + } +} + +@-webkit-keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -webkit-animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + -webkit-animation-timing-function: ease-out; + } +} + +@-moz-keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -moz-animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + -moz-animation-timing-function: ease-out; + } +} + +@keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + animation-timing-function: ease-out; + } +} \ No newline at end of file diff --git a/public/bower_components/PACE/themes/purple/pace-theme-center-atom.css b/public/bower_components/PACE/themes/purple/pace-theme-center-atom.css new file mode 100755 index 0000000..33b4015 --- /dev/null +++ b/public/bower_components/PACE/themes/purple/pace-theme-center-atom.css @@ -0,0 +1,131 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace.pace-inactive { + display: none; +} + +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + height: 60px; + width: 100px; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace .pace-progress { + z-index: 2000; + position: absolute; + height: 60px; + width: 100px; + + -webkit-transform: translate3d(0, 0, 0) !important; + -ms-transform: translate3d(0, 0, 0) !important; + transform: translate3d(0, 0, 0) !important; +} + +.pace .pace-progress:before { + content: attr(data-progress-text); + text-align: center; + color: #fff; + background: #7c60e0; + border-radius: 50%; + font-family: "Helvetica Neue", sans-serif; + font-size: 14px; + font-weight: 100; + line-height: 1; + padding: 20% 0 7px; + width: 50%; + height: 40%; + margin: 10px 0 0 30px; + display: block; + z-index: 999; + position: absolute; +} + +.pace .pace-activity { + font-size: 15px; + line-height: 1; + z-index: 2000; + position: absolute; + height: 60px; + width: 100px; + + display: block; + -webkit-animation: pace-theme-center-atom-spin 2s linear infinite; + -moz-animation: pace-theme-center-atom-spin 2s linear infinite; + -o-animation: pace-theme-center-atom-spin 2s linear infinite; + animation: pace-theme-center-atom-spin 2s linear infinite; +} + +.pace .pace-activity { + border-radius: 50%; + border: 5px solid #7c60e0; + content: ' '; + display: block; + position: absolute; + top: 0; + left: 0; + height: 60px; + width: 100px; +} + +.pace .pace-activity:after { + border-radius: 50%; + border: 5px solid #7c60e0; + content: ' '; + display: block; + position: absolute; + top: -5px; + left: -5px; + height: 60px; + width: 100px; + + -webkit-transform: rotate(60deg); + -moz-transform: rotate(60deg); + -o-transform: rotate(60deg); + transform: rotate(60deg); +} + +.pace .pace-activity:before { + border-radius: 50%; + border: 5px solid #7c60e0; + content: ' '; + display: block; + position: absolute; + top: -5px; + left: -5px; + height: 60px; + width: 100px; + + -webkit-transform: rotate(120deg); + -moz-transform: rotate(120deg); + -o-transform: rotate(120deg); + transform: rotate(120deg); +} + +@-webkit-keyframes pace-theme-center-atom-spin { + 0% { -webkit-transform: rotate(0deg) } + 100% { -webkit-transform: rotate(359deg) } +} +@-moz-keyframes pace-theme-center-atom-spin { + 0% { -moz-transform: rotate(0deg) } + 100% { -moz-transform: rotate(359deg) } +} +@-o-keyframes pace-theme-center-atom-spin { + 0% { -o-transform: rotate(0deg) } + 100% { -o-transform: rotate(359deg) } +} +@keyframes pace-theme-center-atom-spin { + 0% { transform: rotate(0deg) } + 100% { transform: rotate(359deg) } +} diff --git a/public/bower_components/PACE/themes/purple/pace-theme-center-circle.css b/public/bower_components/PACE/themes/purple/pace-theme-center-circle.css new file mode 100755 index 0000000..08938b0 --- /dev/null +++ b/public/bower_components/PACE/themes/purple/pace-theme-center-circle.css @@ -0,0 +1,90 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + -webkit-perspective: 12rem; + -moz-perspective: 12rem; + -ms-perspective: 12rem; + -o-perspective: 12rem; + perspective: 12rem; + + z-index: 2000; + position: fixed; + height: 6rem; + width: 6rem; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace.pace-inactive .pace-progress { + display: none; +} + +.pace .pace-progress { + position: fixed; + z-index: 2000; + display: block; + position: absolute; + left: 0; + top: 0; + height: 6rem; + width: 6rem !important; + line-height: 6rem; + font-size: 2rem; + border-radius: 50%; + background: rgba(124, 96, 224, 0.8); + color: #fff; + font-family: "Helvetica Neue", sans-serif; + font-weight: 100; + text-align: center; + + -webkit-animation: pace-theme-center-circle-spin linear infinite 2s; + -moz-animation: pace-theme-center-circle-spin linear infinite 2s; + -ms-animation: pace-theme-center-circle-spin linear infinite 2s; + -o-animation: pace-theme-center-circle-spin linear infinite 2s; + animation: pace-theme-center-circle-spin linear infinite 2s; + + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + -ms-transform-style: preserve-3d; + -o-transform-style: preserve-3d; + transform-style: preserve-3d; +} + +.pace .pace-progress:after { + content: attr(data-progress-text); + display: block; +} + +@-webkit-keyframes pace-theme-center-circle-spin { + from { -webkit-transform: rotateY(0deg) } + to { -webkit-transform: rotateY(360deg) } +} + +@-moz-keyframes pace-theme-center-circle-spin { + from { -moz-transform: rotateY(0deg) } + to { -moz-transform: rotateY(360deg) } +} + +@-ms-keyframes pace-theme-center-circle-spin { + from { -ms-transform: rotateY(0deg) } + to { -ms-transform: rotateY(360deg) } +} + +@-o-keyframes pace-theme-center-circle-spin { + from { -o-transform: rotateY(0deg) } + to { -o-transform: rotateY(360deg) } +} + +@keyframes pace-theme-center-circle-spin { + from { transform: rotateY(0deg) } + to { transform: rotateY(360deg) } +} diff --git a/public/bower_components/PACE/themes/purple/pace-theme-center-radar.css b/public/bower_components/PACE/themes/purple/pace-theme-center-radar.css new file mode 100755 index 0000000..428a2f9 --- /dev/null +++ b/public/bower_components/PACE/themes/purple/pace-theme-center-radar.css @@ -0,0 +1,74 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + height: 90px; + width: 90px; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace.pace-inactive .pace-activity { + display: none; +} + +.pace .pace-activity { + position: fixed; + z-index: 2000; + display: block; + position: absolute; + left: -30px; + top: -30px; + height: 90px; + width: 90px; + display: block; + border-width: 30px; + border-style: double; + border-color: #7c60e0 transparent transparent; + border-radius: 50%; + + -webkit-animation: spin 1s linear infinite; + -moz-animation: spin 1s linear infinite; + -o-animation: spin 1s linear infinite; + animation: spin 1s linear infinite; +} + +.pace .pace-activity:before { + content: ' '; + position: absolute; + top: 10px; + left: 10px; + height: 50px; + width: 50px; + display: block; + border-width: 10px; + border-style: solid; + border-color: #7c60e0 transparent transparent; + border-radius: 50%; +} + +@-webkit-keyframes spin { + 100% { -webkit-transform: rotate(359deg); } +} + +@-moz-keyframes spin { + 100% { -moz-transform: rotate(359deg); } +} + +@-o-keyframes spin { + 100% { -moz-transform: rotate(359deg); } +} + +@keyframes spin { + 100% { transform: rotate(359deg); } +} diff --git a/public/bower_components/PACE/themes/purple/pace-theme-center-simple.css b/public/bower_components/PACE/themes/purple/pace-theme-center-simple.css new file mode 100755 index 0000000..3b3df67 --- /dev/null +++ b/public/bower_components/PACE/themes/purple/pace-theme-center-simple.css @@ -0,0 +1,52 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; + height: 5px; + width: 200px; + background: #fff; + border: 1px solid #7c60e0; + + overflow: hidden; +} + +.pace .pace-progress { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + max-width: 200px; + position: fixed; + z-index: 2000; + display: block; + position: absolute; + top: 0; + right: 100%; + height: 100%; + width: 100%; + background: #7c60e0; +} + +.pace.pace-inactive { + display: none; +} \ No newline at end of file diff --git a/public/bower_components/PACE/themes/purple/pace-theme-corner-indicator.css b/public/bower_components/PACE/themes/purple/pace-theme-corner-indicator.css new file mode 100755 index 0000000..0d2060f --- /dev/null +++ b/public/bower_components/PACE/themes/purple/pace-theme-corner-indicator.css @@ -0,0 +1,73 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace .pace-activity { + display: block; + position: fixed; + z-index: 2000; + top: 0; + right: 0; + width: 300px; + height: 300px; + background: #7c60e0; + -webkit-transition: -webkit-transform 0.3s; + transition: transform 0.3s; + -webkit-transform: translateX(100%) translateY(-100%) rotate(45deg); + transform: translateX(100%) translateY(-100%) rotate(45deg); + pointer-events: none; +} + +.pace.pace-active .pace-activity { + -webkit-transform: translateX(50%) translateY(-50%) rotate(45deg); + transform: translateX(50%) translateY(-50%) rotate(45deg); +} + +.pace .pace-activity::before, +.pace .pace-activity::after { + -moz-box-sizing: border-box; + box-sizing: border-box; + position: absolute; + bottom: 30px; + left: 50%; + display: block; + border: 5px solid #fff; + border-radius: 50%; + content: ''; +} + +.pace .pace-activity::before { + margin-left: -40px; + width: 80px; + height: 80px; + border-right-color: rgba(0, 0, 0, .2); + border-left-color: rgba(0, 0, 0, .2); + -webkit-animation: pace-theme-corner-indicator-spin 3s linear infinite; + animation: pace-theme-corner-indicator-spin 3s linear infinite; +} + +.pace .pace-activity::after { + bottom: 50px; + margin-left: -20px; + width: 40px; + height: 40px; + border-top-color: rgba(0, 0, 0, .2); + border-bottom-color: rgba(0, 0, 0, .2); + -webkit-animation: pace-theme-corner-indicator-spin 1s linear infinite; + animation: pace-theme-corner-indicator-spin 1s linear infinite; +} + +@-webkit-keyframes pace-theme-corner-indicator-spin { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(359deg); } +} +@keyframes pace-theme-corner-indicator-spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(359deg); } +} diff --git a/public/bower_components/PACE/themes/purple/pace-theme-fill-left.css b/public/bower_components/PACE/themes/purple/pace-theme-fill-left.css new file mode 100755 index 0000000..d5b3897 --- /dev/null +++ b/public/bower_components/PACE/themes/purple/pace-theme-fill-left.css @@ -0,0 +1,22 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: rgba(124, 96, 224, 0.19999999999999996); + position: fixed; + z-index: -1; + top: 0; + right: 100%; + bottom: 0; + width: 100%; +} diff --git a/public/bower_components/PACE/themes/purple/pace-theme-flash.css b/public/bower_components/PACE/themes/purple/pace-theme-flash.css new file mode 100755 index 0000000..046cbef --- /dev/null +++ b/public/bower_components/PACE/themes/purple/pace-theme-flash.css @@ -0,0 +1,77 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background: #7c60e0; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 2px; +} + +.pace .pace-progress-inner { + display: block; + position: absolute; + right: 0px; + width: 100px; + height: 100%; + box-shadow: 0 0 10px #7c60e0, 0 0 5px #7c60e0; + opacity: 1.0; + -webkit-transform: rotate(3deg) translate(0px, -4px); + -moz-transform: rotate(3deg) translate(0px, -4px); + -ms-transform: rotate(3deg) translate(0px, -4px); + -o-transform: rotate(3deg) translate(0px, -4px); + transform: rotate(3deg) translate(0px, -4px); +} + +.pace .pace-activity { + display: block; + position: fixed; + z-index: 2000; + top: 15px; + right: 15px; + width: 14px; + height: 14px; + border: solid 2px transparent; + border-top-color: #7c60e0; + border-left-color: #7c60e0; + border-radius: 10px; + -webkit-animation: pace-spinner 400ms linear infinite; + -moz-animation: pace-spinner 400ms linear infinite; + -ms-animation: pace-spinner 400ms linear infinite; + -o-animation: pace-spinner 400ms linear infinite; + animation: pace-spinner 400ms linear infinite; +} + +@-webkit-keyframes pace-spinner { + 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } +} +@-moz-keyframes pace-spinner { + 0% { -moz-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -moz-transform: rotate(360deg); transform: rotate(360deg); } +} +@-o-keyframes pace-spinner { + 0% { -o-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -o-transform: rotate(360deg); transform: rotate(360deg); } +} +@-ms-keyframes pace-spinner { + 0% { -ms-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -ms-transform: rotate(360deg); transform: rotate(360deg); } +} +@keyframes pace-spinner { + 0% { transform: rotate(0deg); transform: rotate(0deg); } + 100% { transform: rotate(360deg); transform: rotate(360deg); } +} diff --git a/public/bower_components/PACE/themes/purple/pace-theme-flat-top.css b/public/bower_components/PACE/themes/purple/pace-theme-flat-top.css new file mode 100755 index 0000000..e13cc88 --- /dev/null +++ b/public/bower_components/PACE/themes/purple/pace-theme-flat-top.css @@ -0,0 +1,41 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + position: fixed; + top: 0; + left: 0; + width: 100%; + + -webkit-transform: translate3d(0, -50px, 0); + -ms-transform: translate3d(0, -50px, 0); + transform: translate3d(0, -50px, 0); + + -webkit-transition: -webkit-transform .5s ease-out; + -ms-transition: -webkit-transform .5s ease-out; + transition: transform .5s ease-out; +} + +.pace.pace-active { + -webkit-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} + +.pace .pace-progress { + display: block; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 10px; + background: #7c60e0; + + pointer-events: none; +} diff --git a/public/bower_components/PACE/themes/purple/pace-theme-loading-bar.css b/public/bower_components/PACE/themes/purple/pace-theme-loading-bar.css new file mode 100755 index 0000000..a62c6ba --- /dev/null +++ b/public/bower_components/PACE/themes/purple/pace-theme-loading-bar.css @@ -0,0 +1,198 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; + + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + z-index: 2000; + position: fixed; + margin: auto; + top: 12px; + left: 0; + right: 0; + bottom: 0; + width: 200px; + height: 50px; + overflow: hidden; +} + +.pace .pace-progress { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + display: block; + position: absolute; + right: 100%; + margin-right: -7px; + width: 93%; + top: 7px; + height: 14px; + font-size: 12px; + background: #7c60e0; + color: #7c60e0; + line-height: 60px; + font-weight: bold; + font-family: Helvetica, Arial, "Lucida Grande", sans-serif; + + -webkit-box-shadow: 120px 0 #fff, 240px 0 #fff; + -ms-box-shadow: 120px 0 #fff, 240px 0 #fff; + box-shadow: 120px 0 #fff, 240px 0 #fff; +} + +.pace .pace-progress:after { + content: attr(data-progress-text); + display: inline-block; + position: fixed; + width: 45px; + text-align: right; + right: 0; + padding-right: 16px; + top: 4px; +} + +.pace .pace-progress[data-progress-text="0%"]:after { right: -200px } +.pace .pace-progress[data-progress-text="1%"]:after { right: -198.14px } +.pace .pace-progress[data-progress-text="2%"]:after { right: -196.28px } +.pace .pace-progress[data-progress-text="3%"]:after { right: -194.42px } +.pace .pace-progress[data-progress-text="4%"]:after { right: -192.56px } +.pace .pace-progress[data-progress-text="5%"]:after { right: -190.7px } +.pace .pace-progress[data-progress-text="6%"]:after { right: -188.84px } +.pace .pace-progress[data-progress-text="7%"]:after { right: -186.98px } +.pace .pace-progress[data-progress-text="8%"]:after { right: -185.12px } +.pace .pace-progress[data-progress-text="9%"]:after { right: -183.26px } +.pace .pace-progress[data-progress-text="10%"]:after { right: -181.4px } +.pace .pace-progress[data-progress-text="11%"]:after { right: -179.54px } +.pace .pace-progress[data-progress-text="12%"]:after { right: -177.68px } +.pace .pace-progress[data-progress-text="13%"]:after { right: -175.82px } +.pace .pace-progress[data-progress-text="14%"]:after { right: -173.96px } +.pace .pace-progress[data-progress-text="15%"]:after { right: -172.1px } +.pace .pace-progress[data-progress-text="16%"]:after { right: -170.24px } +.pace .pace-progress[data-progress-text="17%"]:after { right: -168.38px } +.pace .pace-progress[data-progress-text="18%"]:after { right: -166.52px } +.pace .pace-progress[data-progress-text="19%"]:after { right: -164.66px } +.pace .pace-progress[data-progress-text="20%"]:after { right: -162.8px } +.pace .pace-progress[data-progress-text="21%"]:after { right: -160.94px } +.pace .pace-progress[data-progress-text="22%"]:after { right: -159.08px } +.pace .pace-progress[data-progress-text="23%"]:after { right: -157.22px } +.pace .pace-progress[data-progress-text="24%"]:after { right: -155.36px } +.pace .pace-progress[data-progress-text="25%"]:after { right: -153.5px } +.pace .pace-progress[data-progress-text="26%"]:after { right: -151.64px } +.pace .pace-progress[data-progress-text="27%"]:after { right: -149.78px } +.pace .pace-progress[data-progress-text="28%"]:after { right: -147.92px } +.pace .pace-progress[data-progress-text="29%"]:after { right: -146.06px } +.pace .pace-progress[data-progress-text="30%"]:after { right: -144.2px } +.pace .pace-progress[data-progress-text="31%"]:after { right: -142.34px } +.pace .pace-progress[data-progress-text="32%"]:after { right: -140.48px } +.pace .pace-progress[data-progress-text="33%"]:after { right: -138.62px } +.pace .pace-progress[data-progress-text="34%"]:after { right: -136.76px } +.pace .pace-progress[data-progress-text="35%"]:after { right: -134.9px } +.pace .pace-progress[data-progress-text="36%"]:after { right: -133.04px } +.pace .pace-progress[data-progress-text="37%"]:after { right: -131.18px } +.pace .pace-progress[data-progress-text="38%"]:after { right: -129.32px } +.pace .pace-progress[data-progress-text="39%"]:after { right: -127.46px } +.pace .pace-progress[data-progress-text="40%"]:after { right: -125.6px } +.pace .pace-progress[data-progress-text="41%"]:after { right: -123.74px } +.pace .pace-progress[data-progress-text="42%"]:after { right: -121.88px } +.pace .pace-progress[data-progress-text="43%"]:after { right: -120.02px } +.pace .pace-progress[data-progress-text="44%"]:after { right: -118.16px } +.pace .pace-progress[data-progress-text="45%"]:after { right: -116.3px } +.pace .pace-progress[data-progress-text="46%"]:after { right: -114.44px } +.pace .pace-progress[data-progress-text="47%"]:after { right: -112.58px } +.pace .pace-progress[data-progress-text="48%"]:after { right: -110.72px } +.pace .pace-progress[data-progress-text="49%"]:after { right: -108.86px } +.pace .pace-progress[data-progress-text="50%"]:after { right: -107px } +.pace .pace-progress[data-progress-text="51%"]:after { right: -105.14px } +.pace .pace-progress[data-progress-text="52%"]:after { right: -103.28px } +.pace .pace-progress[data-progress-text="53%"]:after { right: -101.42px } +.pace .pace-progress[data-progress-text="54%"]:after { right: -99.56px } +.pace .pace-progress[data-progress-text="55%"]:after { right: -97.7px } +.pace .pace-progress[data-progress-text="56%"]:after { right: -95.84px } +.pace .pace-progress[data-progress-text="57%"]:after { right: -93.98px } +.pace .pace-progress[data-progress-text="58%"]:after { right: -92.12px } +.pace .pace-progress[data-progress-text="59%"]:after { right: -90.26px } +.pace .pace-progress[data-progress-text="60%"]:after { right: -88.4px } +.pace .pace-progress[data-progress-text="61%"]:after { right: -86.53999999999999px } +.pace .pace-progress[data-progress-text="62%"]:after { right: -84.68px } +.pace .pace-progress[data-progress-text="63%"]:after { right: -82.82px } +.pace .pace-progress[data-progress-text="64%"]:after { right: -80.96000000000001px } +.pace .pace-progress[data-progress-text="65%"]:after { right: -79.1px } +.pace .pace-progress[data-progress-text="66%"]:after { right: -77.24px } +.pace .pace-progress[data-progress-text="67%"]:after { right: -75.38px } +.pace .pace-progress[data-progress-text="68%"]:after { right: -73.52px } +.pace .pace-progress[data-progress-text="69%"]:after { right: -71.66px } +.pace .pace-progress[data-progress-text="70%"]:after { right: -69.8px } +.pace .pace-progress[data-progress-text="71%"]:after { right: -67.94px } +.pace .pace-progress[data-progress-text="72%"]:after { right: -66.08px } +.pace .pace-progress[data-progress-text="73%"]:after { right: -64.22px } +.pace .pace-progress[data-progress-text="74%"]:after { right: -62.36px } +.pace .pace-progress[data-progress-text="75%"]:after { right: -60.5px } +.pace .pace-progress[data-progress-text="76%"]:after { right: -58.64px } +.pace .pace-progress[data-progress-text="77%"]:after { right: -56.78px } +.pace .pace-progress[data-progress-text="78%"]:after { right: -54.92px } +.pace .pace-progress[data-progress-text="79%"]:after { right: -53.06px } +.pace .pace-progress[data-progress-text="80%"]:after { right: -51.2px } +.pace .pace-progress[data-progress-text="81%"]:after { right: -49.34px } +.pace .pace-progress[data-progress-text="82%"]:after { right: -47.480000000000004px } +.pace .pace-progress[data-progress-text="83%"]:after { right: -45.62px } +.pace .pace-progress[data-progress-text="84%"]:after { right: -43.76px } +.pace .pace-progress[data-progress-text="85%"]:after { right: -41.9px } +.pace .pace-progress[data-progress-text="86%"]:after { right: -40.04px } +.pace .pace-progress[data-progress-text="87%"]:after { right: -38.18px } +.pace .pace-progress[data-progress-text="88%"]:after { right: -36.32px } +.pace .pace-progress[data-progress-text="89%"]:after { right: -34.46px } +.pace .pace-progress[data-progress-text="90%"]:after { right: -32.6px } +.pace .pace-progress[data-progress-text="91%"]:after { right: -30.740000000000002px } +.pace .pace-progress[data-progress-text="92%"]:after { right: -28.880000000000003px } +.pace .pace-progress[data-progress-text="93%"]:after { right: -27.02px } +.pace .pace-progress[data-progress-text="94%"]:after { right: -25.16px } +.pace .pace-progress[data-progress-text="95%"]:after { right: -23.3px } +.pace .pace-progress[data-progress-text="96%"]:after { right: -21.439999999999998px } +.pace .pace-progress[data-progress-text="97%"]:after { right: -19.58px } +.pace .pace-progress[data-progress-text="98%"]:after { right: -17.72px } +.pace .pace-progress[data-progress-text="99%"]:after { right: -15.86px } +.pace .pace-progress[data-progress-text="100%"]:after { right: -14px } + + +.pace .pace-activity { + position: absolute; + width: 100%; + height: 28px; + z-index: 2001; + box-shadow: inset 0 0 0 2px #7c60e0, inset 0 0 0 7px #FFF; + border-radius: 10px; +} + +.pace.pace-inactive { + display: none; +} diff --git a/public/bower_components/PACE/themes/purple/pace-theme-mac-osx.css b/public/bower_components/PACE/themes/purple/pace-theme-mac-osx.css new file mode 100755 index 0000000..6046e6b --- /dev/null +++ b/public/bower_components/PACE/themes/purple/pace-theme-mac-osx.css @@ -0,0 +1,87 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + overflow: hidden; + position: fixed; + top: 0; + left: 0; + z-index: 2000; + width: 100%; + height: 12px; + background: #fff; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: #3000FF; + position: fixed; + top: 0; + right: 100%; + width: 100%; + height: 12px; + overflow: hidden; + + -webkit-border-radius: 0 0 4px 0; + -moz-border-radius: 0 0 4px 0; + -o-border-radius: 0 0 4px 0; + border-radius: 0 0 4px 0; + + -webkit-box-shadow: inset -1px 0 #1D00AF, inset 0 -1px #1D00AF, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + -moz-box-shadow: inset -1px 0 #1D00AF, inset 0 -1px #1D00AF, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + -o-box-shadow: inset -1px 0 #1D00AF, inset 0 -1px #1D00AF, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + box-shadow: inset -1px 0 #1D00AF, inset 0 -1px #1D00AF, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); +} + +.pace .pace-activity { + position: fixed; + top: 0; + left: 0; + right: -28px; + bottom: 0; + + -webkit-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + -moz-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + -o-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + + -webkit-background-size: 28px 100%; + -moz-background-size: 28px 100%; + -o-background-size: 28px 100%; + background-size: 28px 100%; + + -webkit-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -moz-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -ms-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -o-animation: pace-theme-mac-osx-motion 500ms linear infinite; + animation: pace-theme-mac-osx-motion 500ms linear infinite; +} + +@-webkit-keyframes pace-theme-mac-osx-motion { + 0% { -webkit-transform: none; transform: none; } + 100% { -webkit-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-moz-keyframes pace-theme-mac-osx-motion { + 0% { -moz-transform: none; transform: none; } + 100% { -moz-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-o-keyframes pace-theme-mac-osx-motion { + 0% { -o-transform: none; transform: none; } + 100% { -o-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-ms-keyframes pace-theme-mac-osx-motion { + 0% { -ms-transform: none; transform: none; } + 100% { -ms-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@keyframes pace-theme-mac-osx-motion { + 0% { transform: none; transform: none; } + 100% { transform: translate(-28px, 0); transform: translate(-28px, 0); } +} diff --git a/public/bower_components/PACE/themes/purple/pace-theme-minimal.css b/public/bower_components/PACE/themes/purple/pace-theme-minimal.css new file mode 100755 index 0000000..f81c2ae --- /dev/null +++ b/public/bower_components/PACE/themes/purple/pace-theme-minimal.css @@ -0,0 +1,23 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background: #7c60e0; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 2px; +} diff --git a/public/bower_components/PACE/themes/red/pace-theme-barber-shop.css b/public/bower_components/PACE/themes/red/pace-theme-barber-shop.css new file mode 100755 index 0000000..0c90ed6 --- /dev/null +++ b/public/bower_components/PACE/themes/red/pace-theme-barber-shop.css @@ -0,0 +1,83 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + overflow: hidden; + position: fixed; + top: 0; + left: 0; + z-index: 2000; + width: 100%; + height: 12px; + background: #fff; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: #ee3148; + position: fixed; + top: 0; + bottom: 0; + right: 100%; + width: 100%; + overflow: hidden; +} + +.pace .pace-activity { + position: fixed; + top: 0; + right: -32px; + bottom: 0; + left: 0; + + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.2)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.2)), color-stop(0.75, rgba(255, 255, 255, 0.2)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + -webkit-background-size: 32px 32px; + -moz-background-size: 32px 32px; + -o-background-size: 32px 32px; + background-size: 32px 32px; + + -webkit-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -moz-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -ms-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -o-animation: pace-theme-barber-shop-motion 500ms linear infinite; + animation: pace-theme-barber-shop-motion 500ms linear infinite; +} + +@-webkit-keyframes pace-theme-barber-shop-motion { + 0% { -webkit-transform: none; transform: none; } + 100% { -webkit-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-moz-keyframes pace-theme-barber-shop-motion { + 0% { -moz-transform: none; transform: none; } + 100% { -moz-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-o-keyframes pace-theme-barber-shop-motion { + 0% { -o-transform: none; transform: none; } + 100% { -o-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-ms-keyframes pace-theme-barber-shop-motion { + 0% { -ms-transform: none; transform: none; } + 100% { -ms-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@keyframes pace-theme-barber-shop-motion { + 0% { transform: none; transform: none; } + 100% { transform: translate(-32px, 0); transform: translate(-32px, 0); } +} diff --git a/public/bower_components/PACE/themes/red/pace-theme-big-counter.css b/public/bower_components/PACE/themes/red/pace-theme-big-counter.css new file mode 100755 index 0000000..dc3dcdd --- /dev/null +++ b/public/bower_components/PACE/themes/red/pace-theme-big-counter.css @@ -0,0 +1,40 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace.pace-inactive .pace-progress { + display: none; +} + +.pace .pace-progress { + position: fixed; + z-index: 2000; + top: 0; + right: 0; + height: 5rem; + width: 5rem; + + -webkit-transform: translate3d(0, 0, 0) !important; + -ms-transform: translate3d(0, 0, 0) !important; + transform: translate3d(0, 0, 0) !important; +} + +.pace .pace-progress:after { + display: block; + position: absolute; + top: 0; + right: .5rem; + content: attr(data-progress-text); + font-family: "Helvetica Neue", sans-serif; + font-weight: 100; + font-size: 5rem; + line-height: 1; + text-align: right; + color: rgba(238, 49, 72, 0.19999999999999996); +} diff --git a/public/bower_components/PACE/themes/red/pace-theme-bounce.css b/public/bower_components/PACE/themes/red/pace-theme-bounce.css new file mode 100755 index 0000000..dc43966 --- /dev/null +++ b/public/bower_components/PACE/themes/red/pace-theme-bounce.css @@ -0,0 +1,231 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + width: 140px; + height: 300px; + position: fixed; + top: -90px; + right: -20px; + z-index: 2000; + -webkit-transform: scale(0); + -moz-transform: scale(0); + -ms-transform: scale(0); + -o-transform: scale(0); + transform: scale(0); + opacity: 0; + -webkit-transition: all 2s linear 0s; + -moz-transition: all 2s linear 0s; + transition: all 2s linear 0s; +} + +.pace.pace-active { + -webkit-transform: scale(.25); + -moz-transform: scale(.25); + -ms-transform: scale(.25); + -o-transform: scale(.25); + transform: scale(.25); + opacity: 1; +} + +.pace .pace-activity { + width: 140px; + height: 140px; + border-radius: 70px; + background: #ee3148; + position: absolute; + top: 0; + z-index: 1911; + -webkit-animation: pace-bounce 1s infinite; + -moz-animation: pace-bounce 1s infinite; + -o-animation: pace-bounce 1s infinite; + -ms-animation: pace-bounce 1s infinite; + animation: pace-bounce 1s infinite; +} + +.pace .pace-progress { + position: absolute; + display: block; + left: 50%; + bottom: 0; + z-index: 1910; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -webkit-transform: scaleY(.3) !important; + -moz-transform: scaleY(.3) !important; + -ms-transform: scaleY(.3) !important; + -o-transform: scaleY(.3) !important; + transform: scaleY(.3) !important; + -webkit-animation: pace-compress .5s infinite alternate; + -moz-animation: pace-compress .5s infinite alternate; + -o-animation: pace-compress .5s infinite alternate; + -ms-animation: pace-compress .5s infinite alternate; + animation: pace-compress .5s infinite alternate; +} + +@-webkit-keyframes pace-bounce { + 0% { + top: 0; + -webkit-animation-timing-function: ease-in; + } + 40% {} + 50% { + top: 140px; + height: 140px; + -webkit-animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + -webkit-animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + -webkit-animation-timing-function: ease-out; + } + 95% { + top: 0; + -webkit-animation-timing-function: ease-in; + } + 100% { + top: 0; + -webkit-animation-timing-function: ease-in; + } +} + +@-moz-keyframes pace-bounce { + 0% { + top: 0; + -moz-animation-timing-function: ease-in; + } + 40% {} + 50% { + top: 140px; + height: 140px; + -moz-animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + -moz-animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + -moz-animation-timing-function: ease-out;} + 95% { + top: 0; + -moz-animation-timing-function: ease-in; + } + 100% {top: 0; + -moz-animation-timing-function: ease-in; + } +} + +@keyframes pace-bounce { + 0% { + top: 0; + animation-timing-function: ease-in; + } + 50% { + top: 140px; + height: 140px; + animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + animation-timing-function: ease-out; + } + 95% { + top: 0; + animation-timing-function: ease-in; + } + 100% { + top: 0; + animation-timing-function: ease-in; + } +} + +@-webkit-keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -webkit-animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + -webkit-animation-timing-function: ease-out; + } +} + +@-moz-keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -moz-animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + -moz-animation-timing-function: ease-out; + } +} + +@keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + animation-timing-function: ease-out; + } +} \ No newline at end of file diff --git a/public/bower_components/PACE/themes/red/pace-theme-center-atom.css b/public/bower_components/PACE/themes/red/pace-theme-center-atom.css new file mode 100755 index 0000000..b25ccc1 --- /dev/null +++ b/public/bower_components/PACE/themes/red/pace-theme-center-atom.css @@ -0,0 +1,131 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace.pace-inactive { + display: none; +} + +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + height: 60px; + width: 100px; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace .pace-progress { + z-index: 2000; + position: absolute; + height: 60px; + width: 100px; + + -webkit-transform: translate3d(0, 0, 0) !important; + -ms-transform: translate3d(0, 0, 0) !important; + transform: translate3d(0, 0, 0) !important; +} + +.pace .pace-progress:before { + content: attr(data-progress-text); + text-align: center; + color: #fff; + background: #ee3148; + border-radius: 50%; + font-family: "Helvetica Neue", sans-serif; + font-size: 14px; + font-weight: 100; + line-height: 1; + padding: 20% 0 7px; + width: 50%; + height: 40%; + margin: 10px 0 0 30px; + display: block; + z-index: 999; + position: absolute; +} + +.pace .pace-activity { + font-size: 15px; + line-height: 1; + z-index: 2000; + position: absolute; + height: 60px; + width: 100px; + + display: block; + -webkit-animation: pace-theme-center-atom-spin 2s linear infinite; + -moz-animation: pace-theme-center-atom-spin 2s linear infinite; + -o-animation: pace-theme-center-atom-spin 2s linear infinite; + animation: pace-theme-center-atom-spin 2s linear infinite; +} + +.pace .pace-activity { + border-radius: 50%; + border: 5px solid #ee3148; + content: ' '; + display: block; + position: absolute; + top: 0; + left: 0; + height: 60px; + width: 100px; +} + +.pace .pace-activity:after { + border-radius: 50%; + border: 5px solid #ee3148; + content: ' '; + display: block; + position: absolute; + top: -5px; + left: -5px; + height: 60px; + width: 100px; + + -webkit-transform: rotate(60deg); + -moz-transform: rotate(60deg); + -o-transform: rotate(60deg); + transform: rotate(60deg); +} + +.pace .pace-activity:before { + border-radius: 50%; + border: 5px solid #ee3148; + content: ' '; + display: block; + position: absolute; + top: -5px; + left: -5px; + height: 60px; + width: 100px; + + -webkit-transform: rotate(120deg); + -moz-transform: rotate(120deg); + -o-transform: rotate(120deg); + transform: rotate(120deg); +} + +@-webkit-keyframes pace-theme-center-atom-spin { + 0% { -webkit-transform: rotate(0deg) } + 100% { -webkit-transform: rotate(359deg) } +} +@-moz-keyframes pace-theme-center-atom-spin { + 0% { -moz-transform: rotate(0deg) } + 100% { -moz-transform: rotate(359deg) } +} +@-o-keyframes pace-theme-center-atom-spin { + 0% { -o-transform: rotate(0deg) } + 100% { -o-transform: rotate(359deg) } +} +@keyframes pace-theme-center-atom-spin { + 0% { transform: rotate(0deg) } + 100% { transform: rotate(359deg) } +} diff --git a/public/bower_components/PACE/themes/red/pace-theme-center-circle.css b/public/bower_components/PACE/themes/red/pace-theme-center-circle.css new file mode 100755 index 0000000..7af81d2 --- /dev/null +++ b/public/bower_components/PACE/themes/red/pace-theme-center-circle.css @@ -0,0 +1,90 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + -webkit-perspective: 12rem; + -moz-perspective: 12rem; + -ms-perspective: 12rem; + -o-perspective: 12rem; + perspective: 12rem; + + z-index: 2000; + position: fixed; + height: 6rem; + width: 6rem; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace.pace-inactive .pace-progress { + display: none; +} + +.pace .pace-progress { + position: fixed; + z-index: 2000; + display: block; + position: absolute; + left: 0; + top: 0; + height: 6rem; + width: 6rem !important; + line-height: 6rem; + font-size: 2rem; + border-radius: 50%; + background: rgba(238, 49, 72, 0.8); + color: #fff; + font-family: "Helvetica Neue", sans-serif; + font-weight: 100; + text-align: center; + + -webkit-animation: pace-theme-center-circle-spin linear infinite 2s; + -moz-animation: pace-theme-center-circle-spin linear infinite 2s; + -ms-animation: pace-theme-center-circle-spin linear infinite 2s; + -o-animation: pace-theme-center-circle-spin linear infinite 2s; + animation: pace-theme-center-circle-spin linear infinite 2s; + + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + -ms-transform-style: preserve-3d; + -o-transform-style: preserve-3d; + transform-style: preserve-3d; +} + +.pace .pace-progress:after { + content: attr(data-progress-text); + display: block; +} + +@-webkit-keyframes pace-theme-center-circle-spin { + from { -webkit-transform: rotateY(0deg) } + to { -webkit-transform: rotateY(360deg) } +} + +@-moz-keyframes pace-theme-center-circle-spin { + from { -moz-transform: rotateY(0deg) } + to { -moz-transform: rotateY(360deg) } +} + +@-ms-keyframes pace-theme-center-circle-spin { + from { -ms-transform: rotateY(0deg) } + to { -ms-transform: rotateY(360deg) } +} + +@-o-keyframes pace-theme-center-circle-spin { + from { -o-transform: rotateY(0deg) } + to { -o-transform: rotateY(360deg) } +} + +@keyframes pace-theme-center-circle-spin { + from { transform: rotateY(0deg) } + to { transform: rotateY(360deg) } +} diff --git a/public/bower_components/PACE/themes/red/pace-theme-center-radar.css b/public/bower_components/PACE/themes/red/pace-theme-center-radar.css new file mode 100755 index 0000000..f16ae0a --- /dev/null +++ b/public/bower_components/PACE/themes/red/pace-theme-center-radar.css @@ -0,0 +1,74 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + height: 90px; + width: 90px; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace.pace-inactive .pace-activity { + display: none; +} + +.pace .pace-activity { + position: fixed; + z-index: 2000; + display: block; + position: absolute; + left: -30px; + top: -30px; + height: 90px; + width: 90px; + display: block; + border-width: 30px; + border-style: double; + border-color: #ee3148 transparent transparent; + border-radius: 50%; + + -webkit-animation: spin 1s linear infinite; + -moz-animation: spin 1s linear infinite; + -o-animation: spin 1s linear infinite; + animation: spin 1s linear infinite; +} + +.pace .pace-activity:before { + content: ' '; + position: absolute; + top: 10px; + left: 10px; + height: 50px; + width: 50px; + display: block; + border-width: 10px; + border-style: solid; + border-color: #ee3148 transparent transparent; + border-radius: 50%; +} + +@-webkit-keyframes spin { + 100% { -webkit-transform: rotate(359deg); } +} + +@-moz-keyframes spin { + 100% { -moz-transform: rotate(359deg); } +} + +@-o-keyframes spin { + 100% { -moz-transform: rotate(359deg); } +} + +@keyframes spin { + 100% { transform: rotate(359deg); } +} diff --git a/public/bower_components/PACE/themes/red/pace-theme-center-simple.css b/public/bower_components/PACE/themes/red/pace-theme-center-simple.css new file mode 100755 index 0000000..e4a2111 --- /dev/null +++ b/public/bower_components/PACE/themes/red/pace-theme-center-simple.css @@ -0,0 +1,52 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; + height: 5px; + width: 200px; + background: #fff; + border: 1px solid #ee3148; + + overflow: hidden; +} + +.pace .pace-progress { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + max-width: 200px; + position: fixed; + z-index: 2000; + display: block; + position: absolute; + top: 0; + right: 100%; + height: 100%; + width: 100%; + background: #ee3148; +} + +.pace.pace-inactive { + display: none; +} \ No newline at end of file diff --git a/public/bower_components/PACE/themes/red/pace-theme-corner-indicator.css b/public/bower_components/PACE/themes/red/pace-theme-corner-indicator.css new file mode 100755 index 0000000..9994388 --- /dev/null +++ b/public/bower_components/PACE/themes/red/pace-theme-corner-indicator.css @@ -0,0 +1,73 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace .pace-activity { + display: block; + position: fixed; + z-index: 2000; + top: 0; + right: 0; + width: 300px; + height: 300px; + background: #ee3148; + -webkit-transition: -webkit-transform 0.3s; + transition: transform 0.3s; + -webkit-transform: translateX(100%) translateY(-100%) rotate(45deg); + transform: translateX(100%) translateY(-100%) rotate(45deg); + pointer-events: none; +} + +.pace.pace-active .pace-activity { + -webkit-transform: translateX(50%) translateY(-50%) rotate(45deg); + transform: translateX(50%) translateY(-50%) rotate(45deg); +} + +.pace .pace-activity::before, +.pace .pace-activity::after { + -moz-box-sizing: border-box; + box-sizing: border-box; + position: absolute; + bottom: 30px; + left: 50%; + display: block; + border: 5px solid #fff; + border-radius: 50%; + content: ''; +} + +.pace .pace-activity::before { + margin-left: -40px; + width: 80px; + height: 80px; + border-right-color: rgba(0, 0, 0, .2); + border-left-color: rgba(0, 0, 0, .2); + -webkit-animation: pace-theme-corner-indicator-spin 3s linear infinite; + animation: pace-theme-corner-indicator-spin 3s linear infinite; +} + +.pace .pace-activity::after { + bottom: 50px; + margin-left: -20px; + width: 40px; + height: 40px; + border-top-color: rgba(0, 0, 0, .2); + border-bottom-color: rgba(0, 0, 0, .2); + -webkit-animation: pace-theme-corner-indicator-spin 1s linear infinite; + animation: pace-theme-corner-indicator-spin 1s linear infinite; +} + +@-webkit-keyframes pace-theme-corner-indicator-spin { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(359deg); } +} +@keyframes pace-theme-corner-indicator-spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(359deg); } +} diff --git a/public/bower_components/PACE/themes/red/pace-theme-fill-left.css b/public/bower_components/PACE/themes/red/pace-theme-fill-left.css new file mode 100755 index 0000000..eb7c57d --- /dev/null +++ b/public/bower_components/PACE/themes/red/pace-theme-fill-left.css @@ -0,0 +1,22 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: rgba(238, 49, 72, 0.19999999999999996); + position: fixed; + z-index: -1; + top: 0; + right: 100%; + bottom: 0; + width: 100%; +} diff --git a/public/bower_components/PACE/themes/red/pace-theme-flash.css b/public/bower_components/PACE/themes/red/pace-theme-flash.css new file mode 100755 index 0000000..7eb57d8 --- /dev/null +++ b/public/bower_components/PACE/themes/red/pace-theme-flash.css @@ -0,0 +1,77 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background: #ee3148; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 2px; +} + +.pace .pace-progress-inner { + display: block; + position: absolute; + right: 0px; + width: 100px; + height: 100%; + box-shadow: 0 0 10px #ee3148, 0 0 5px #ee3148; + opacity: 1.0; + -webkit-transform: rotate(3deg) translate(0px, -4px); + -moz-transform: rotate(3deg) translate(0px, -4px); + -ms-transform: rotate(3deg) translate(0px, -4px); + -o-transform: rotate(3deg) translate(0px, -4px); + transform: rotate(3deg) translate(0px, -4px); +} + +.pace .pace-activity { + display: block; + position: fixed; + z-index: 2000; + top: 15px; + right: 15px; + width: 14px; + height: 14px; + border: solid 2px transparent; + border-top-color: #ee3148; + border-left-color: #ee3148; + border-radius: 10px; + -webkit-animation: pace-spinner 400ms linear infinite; + -moz-animation: pace-spinner 400ms linear infinite; + -ms-animation: pace-spinner 400ms linear infinite; + -o-animation: pace-spinner 400ms linear infinite; + animation: pace-spinner 400ms linear infinite; +} + +@-webkit-keyframes pace-spinner { + 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } +} +@-moz-keyframes pace-spinner { + 0% { -moz-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -moz-transform: rotate(360deg); transform: rotate(360deg); } +} +@-o-keyframes pace-spinner { + 0% { -o-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -o-transform: rotate(360deg); transform: rotate(360deg); } +} +@-ms-keyframes pace-spinner { + 0% { -ms-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -ms-transform: rotate(360deg); transform: rotate(360deg); } +} +@keyframes pace-spinner { + 0% { transform: rotate(0deg); transform: rotate(0deg); } + 100% { transform: rotate(360deg); transform: rotate(360deg); } +} diff --git a/public/bower_components/PACE/themes/red/pace-theme-flat-top.css b/public/bower_components/PACE/themes/red/pace-theme-flat-top.css new file mode 100755 index 0000000..02bc696 --- /dev/null +++ b/public/bower_components/PACE/themes/red/pace-theme-flat-top.css @@ -0,0 +1,41 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + position: fixed; + top: 0; + left: 0; + width: 100%; + + -webkit-transform: translate3d(0, -50px, 0); + -ms-transform: translate3d(0, -50px, 0); + transform: translate3d(0, -50px, 0); + + -webkit-transition: -webkit-transform .5s ease-out; + -ms-transition: -webkit-transform .5s ease-out; + transition: transform .5s ease-out; +} + +.pace.pace-active { + -webkit-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} + +.pace .pace-progress { + display: block; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 10px; + background: #ee3148; + + pointer-events: none; +} diff --git a/public/bower_components/PACE/themes/red/pace-theme-loading-bar.css b/public/bower_components/PACE/themes/red/pace-theme-loading-bar.css new file mode 100755 index 0000000..9d86bf8 --- /dev/null +++ b/public/bower_components/PACE/themes/red/pace-theme-loading-bar.css @@ -0,0 +1,198 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; + + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + z-index: 2000; + position: fixed; + margin: auto; + top: 12px; + left: 0; + right: 0; + bottom: 0; + width: 200px; + height: 50px; + overflow: hidden; +} + +.pace .pace-progress { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + display: block; + position: absolute; + right: 100%; + margin-right: -7px; + width: 93%; + top: 7px; + height: 14px; + font-size: 12px; + background: #ee3148; + color: #ee3148; + line-height: 60px; + font-weight: bold; + font-family: Helvetica, Arial, "Lucida Grande", sans-serif; + + -webkit-box-shadow: 120px 0 #fff, 240px 0 #fff; + -ms-box-shadow: 120px 0 #fff, 240px 0 #fff; + box-shadow: 120px 0 #fff, 240px 0 #fff; +} + +.pace .pace-progress:after { + content: attr(data-progress-text); + display: inline-block; + position: fixed; + width: 45px; + text-align: right; + right: 0; + padding-right: 16px; + top: 4px; +} + +.pace .pace-progress[data-progress-text="0%"]:after { right: -200px } +.pace .pace-progress[data-progress-text="1%"]:after { right: -198.14px } +.pace .pace-progress[data-progress-text="2%"]:after { right: -196.28px } +.pace .pace-progress[data-progress-text="3%"]:after { right: -194.42px } +.pace .pace-progress[data-progress-text="4%"]:after { right: -192.56px } +.pace .pace-progress[data-progress-text="5%"]:after { right: -190.7px } +.pace .pace-progress[data-progress-text="6%"]:after { right: -188.84px } +.pace .pace-progress[data-progress-text="7%"]:after { right: -186.98px } +.pace .pace-progress[data-progress-text="8%"]:after { right: -185.12px } +.pace .pace-progress[data-progress-text="9%"]:after { right: -183.26px } +.pace .pace-progress[data-progress-text="10%"]:after { right: -181.4px } +.pace .pace-progress[data-progress-text="11%"]:after { right: -179.54px } +.pace .pace-progress[data-progress-text="12%"]:after { right: -177.68px } +.pace .pace-progress[data-progress-text="13%"]:after { right: -175.82px } +.pace .pace-progress[data-progress-text="14%"]:after { right: -173.96px } +.pace .pace-progress[data-progress-text="15%"]:after { right: -172.1px } +.pace .pace-progress[data-progress-text="16%"]:after { right: -170.24px } +.pace .pace-progress[data-progress-text="17%"]:after { right: -168.38px } +.pace .pace-progress[data-progress-text="18%"]:after { right: -166.52px } +.pace .pace-progress[data-progress-text="19%"]:after { right: -164.66px } +.pace .pace-progress[data-progress-text="20%"]:after { right: -162.8px } +.pace .pace-progress[data-progress-text="21%"]:after { right: -160.94px } +.pace .pace-progress[data-progress-text="22%"]:after { right: -159.08px } +.pace .pace-progress[data-progress-text="23%"]:after { right: -157.22px } +.pace .pace-progress[data-progress-text="24%"]:after { right: -155.36px } +.pace .pace-progress[data-progress-text="25%"]:after { right: -153.5px } +.pace .pace-progress[data-progress-text="26%"]:after { right: -151.64px } +.pace .pace-progress[data-progress-text="27%"]:after { right: -149.78px } +.pace .pace-progress[data-progress-text="28%"]:after { right: -147.92px } +.pace .pace-progress[data-progress-text="29%"]:after { right: -146.06px } +.pace .pace-progress[data-progress-text="30%"]:after { right: -144.2px } +.pace .pace-progress[data-progress-text="31%"]:after { right: -142.34px } +.pace .pace-progress[data-progress-text="32%"]:after { right: -140.48px } +.pace .pace-progress[data-progress-text="33%"]:after { right: -138.62px } +.pace .pace-progress[data-progress-text="34%"]:after { right: -136.76px } +.pace .pace-progress[data-progress-text="35%"]:after { right: -134.9px } +.pace .pace-progress[data-progress-text="36%"]:after { right: -133.04px } +.pace .pace-progress[data-progress-text="37%"]:after { right: -131.18px } +.pace .pace-progress[data-progress-text="38%"]:after { right: -129.32px } +.pace .pace-progress[data-progress-text="39%"]:after { right: -127.46px } +.pace .pace-progress[data-progress-text="40%"]:after { right: -125.6px } +.pace .pace-progress[data-progress-text="41%"]:after { right: -123.74px } +.pace .pace-progress[data-progress-text="42%"]:after { right: -121.88px } +.pace .pace-progress[data-progress-text="43%"]:after { right: -120.02px } +.pace .pace-progress[data-progress-text="44%"]:after { right: -118.16px } +.pace .pace-progress[data-progress-text="45%"]:after { right: -116.3px } +.pace .pace-progress[data-progress-text="46%"]:after { right: -114.44px } +.pace .pace-progress[data-progress-text="47%"]:after { right: -112.58px } +.pace .pace-progress[data-progress-text="48%"]:after { right: -110.72px } +.pace .pace-progress[data-progress-text="49%"]:after { right: -108.86px } +.pace .pace-progress[data-progress-text="50%"]:after { right: -107px } +.pace .pace-progress[data-progress-text="51%"]:after { right: -105.14px } +.pace .pace-progress[data-progress-text="52%"]:after { right: -103.28px } +.pace .pace-progress[data-progress-text="53%"]:after { right: -101.42px } +.pace .pace-progress[data-progress-text="54%"]:after { right: -99.56px } +.pace .pace-progress[data-progress-text="55%"]:after { right: -97.7px } +.pace .pace-progress[data-progress-text="56%"]:after { right: -95.84px } +.pace .pace-progress[data-progress-text="57%"]:after { right: -93.98px } +.pace .pace-progress[data-progress-text="58%"]:after { right: -92.12px } +.pace .pace-progress[data-progress-text="59%"]:after { right: -90.26px } +.pace .pace-progress[data-progress-text="60%"]:after { right: -88.4px } +.pace .pace-progress[data-progress-text="61%"]:after { right: -86.53999999999999px } +.pace .pace-progress[data-progress-text="62%"]:after { right: -84.68px } +.pace .pace-progress[data-progress-text="63%"]:after { right: -82.82px } +.pace .pace-progress[data-progress-text="64%"]:after { right: -80.96000000000001px } +.pace .pace-progress[data-progress-text="65%"]:after { right: -79.1px } +.pace .pace-progress[data-progress-text="66%"]:after { right: -77.24px } +.pace .pace-progress[data-progress-text="67%"]:after { right: -75.38px } +.pace .pace-progress[data-progress-text="68%"]:after { right: -73.52px } +.pace .pace-progress[data-progress-text="69%"]:after { right: -71.66px } +.pace .pace-progress[data-progress-text="70%"]:after { right: -69.8px } +.pace .pace-progress[data-progress-text="71%"]:after { right: -67.94px } +.pace .pace-progress[data-progress-text="72%"]:after { right: -66.08px } +.pace .pace-progress[data-progress-text="73%"]:after { right: -64.22px } +.pace .pace-progress[data-progress-text="74%"]:after { right: -62.36px } +.pace .pace-progress[data-progress-text="75%"]:after { right: -60.5px } +.pace .pace-progress[data-progress-text="76%"]:after { right: -58.64px } +.pace .pace-progress[data-progress-text="77%"]:after { right: -56.78px } +.pace .pace-progress[data-progress-text="78%"]:after { right: -54.92px } +.pace .pace-progress[data-progress-text="79%"]:after { right: -53.06px } +.pace .pace-progress[data-progress-text="80%"]:after { right: -51.2px } +.pace .pace-progress[data-progress-text="81%"]:after { right: -49.34px } +.pace .pace-progress[data-progress-text="82%"]:after { right: -47.480000000000004px } +.pace .pace-progress[data-progress-text="83%"]:after { right: -45.62px } +.pace .pace-progress[data-progress-text="84%"]:after { right: -43.76px } +.pace .pace-progress[data-progress-text="85%"]:after { right: -41.9px } +.pace .pace-progress[data-progress-text="86%"]:after { right: -40.04px } +.pace .pace-progress[data-progress-text="87%"]:after { right: -38.18px } +.pace .pace-progress[data-progress-text="88%"]:after { right: -36.32px } +.pace .pace-progress[data-progress-text="89%"]:after { right: -34.46px } +.pace .pace-progress[data-progress-text="90%"]:after { right: -32.6px } +.pace .pace-progress[data-progress-text="91%"]:after { right: -30.740000000000002px } +.pace .pace-progress[data-progress-text="92%"]:after { right: -28.880000000000003px } +.pace .pace-progress[data-progress-text="93%"]:after { right: -27.02px } +.pace .pace-progress[data-progress-text="94%"]:after { right: -25.16px } +.pace .pace-progress[data-progress-text="95%"]:after { right: -23.3px } +.pace .pace-progress[data-progress-text="96%"]:after { right: -21.439999999999998px } +.pace .pace-progress[data-progress-text="97%"]:after { right: -19.58px } +.pace .pace-progress[data-progress-text="98%"]:after { right: -17.72px } +.pace .pace-progress[data-progress-text="99%"]:after { right: -15.86px } +.pace .pace-progress[data-progress-text="100%"]:after { right: -14px } + + +.pace .pace-activity { + position: absolute; + width: 100%; + height: 28px; + z-index: 2001; + box-shadow: inset 0 0 0 2px #ee3148, inset 0 0 0 7px #FFF; + border-radius: 10px; +} + +.pace.pace-inactive { + display: none; +} diff --git a/public/bower_components/PACE/themes/red/pace-theme-mac-osx.css b/public/bower_components/PACE/themes/red/pace-theme-mac-osx.css new file mode 100755 index 0000000..613f736 --- /dev/null +++ b/public/bower_components/PACE/themes/red/pace-theme-mac-osx.css @@ -0,0 +1,87 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + overflow: hidden; + position: fixed; + top: 0; + left: 0; + z-index: 2000; + width: 100%; + height: 12px; + background: #fff; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: #FF0000; + position: fixed; + top: 0; + right: 100%; + width: 100%; + height: 12px; + overflow: hidden; + + -webkit-border-radius: 0 0 4px 0; + -moz-border-radius: 0 0 4px 0; + -o-border-radius: 0 0 4px 0; + border-radius: 0 0 4px 0; + + -webkit-box-shadow: inset -1px 0 #AF0000, inset 0 -1px #AF0000, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + -moz-box-shadow: inset -1px 0 #AF0000, inset 0 -1px #AF0000, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + -o-box-shadow: inset -1px 0 #AF0000, inset 0 -1px #AF0000, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + box-shadow: inset -1px 0 #AF0000, inset 0 -1px #AF0000, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); +} + +.pace .pace-activity { + position: fixed; + top: 0; + left: 0; + right: -28px; + bottom: 0; + + -webkit-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + -moz-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + -o-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + + -webkit-background-size: 28px 100%; + -moz-background-size: 28px 100%; + -o-background-size: 28px 100%; + background-size: 28px 100%; + + -webkit-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -moz-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -ms-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -o-animation: pace-theme-mac-osx-motion 500ms linear infinite; + animation: pace-theme-mac-osx-motion 500ms linear infinite; +} + +@-webkit-keyframes pace-theme-mac-osx-motion { + 0% { -webkit-transform: none; transform: none; } + 100% { -webkit-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-moz-keyframes pace-theme-mac-osx-motion { + 0% { -moz-transform: none; transform: none; } + 100% { -moz-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-o-keyframes pace-theme-mac-osx-motion { + 0% { -o-transform: none; transform: none; } + 100% { -o-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-ms-keyframes pace-theme-mac-osx-motion { + 0% { -ms-transform: none; transform: none; } + 100% { -ms-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@keyframes pace-theme-mac-osx-motion { + 0% { transform: none; transform: none; } + 100% { transform: translate(-28px, 0); transform: translate(-28px, 0); } +} diff --git a/public/bower_components/PACE/themes/red/pace-theme-minimal.css b/public/bower_components/PACE/themes/red/pace-theme-minimal.css new file mode 100755 index 0000000..c84e12b --- /dev/null +++ b/public/bower_components/PACE/themes/red/pace-theme-minimal.css @@ -0,0 +1,23 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background: #ee3148; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 2px; +} diff --git a/public/bower_components/PACE/themes/silver/pace-theme-barber-shop.css b/public/bower_components/PACE/themes/silver/pace-theme-barber-shop.css new file mode 100755 index 0000000..18addba --- /dev/null +++ b/public/bower_components/PACE/themes/silver/pace-theme-barber-shop.css @@ -0,0 +1,83 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + overflow: hidden; + position: fixed; + top: 0; + left: 0; + z-index: 2000; + width: 100%; + height: 12px; + background: #fff; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: #d6d6d6; + position: fixed; + top: 0; + bottom: 0; + right: 100%; + width: 100%; + overflow: hidden; +} + +.pace .pace-activity { + position: fixed; + top: 0; + right: -32px; + bottom: 0; + left: 0; + + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.2)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.2)), color-stop(0.75, rgba(255, 255, 255, 0.2)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + -webkit-background-size: 32px 32px; + -moz-background-size: 32px 32px; + -o-background-size: 32px 32px; + background-size: 32px 32px; + + -webkit-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -moz-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -ms-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -o-animation: pace-theme-barber-shop-motion 500ms linear infinite; + animation: pace-theme-barber-shop-motion 500ms linear infinite; +} + +@-webkit-keyframes pace-theme-barber-shop-motion { + 0% { -webkit-transform: none; transform: none; } + 100% { -webkit-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-moz-keyframes pace-theme-barber-shop-motion { + 0% { -moz-transform: none; transform: none; } + 100% { -moz-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-o-keyframes pace-theme-barber-shop-motion { + 0% { -o-transform: none; transform: none; } + 100% { -o-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-ms-keyframes pace-theme-barber-shop-motion { + 0% { -ms-transform: none; transform: none; } + 100% { -ms-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@keyframes pace-theme-barber-shop-motion { + 0% { transform: none; transform: none; } + 100% { transform: translate(-32px, 0); transform: translate(-32px, 0); } +} diff --git a/public/bower_components/PACE/themes/silver/pace-theme-big-counter.css b/public/bower_components/PACE/themes/silver/pace-theme-big-counter.css new file mode 100755 index 0000000..8b88b8d --- /dev/null +++ b/public/bower_components/PACE/themes/silver/pace-theme-big-counter.css @@ -0,0 +1,40 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace.pace-inactive .pace-progress { + display: none; +} + +.pace .pace-progress { + position: fixed; + z-index: 2000; + top: 0; + right: 0; + height: 5rem; + width: 5rem; + + -webkit-transform: translate3d(0, 0, 0) !important; + -ms-transform: translate3d(0, 0, 0) !important; + transform: translate3d(0, 0, 0) !important; +} + +.pace .pace-progress:after { + display: block; + position: absolute; + top: 0; + right: .5rem; + content: attr(data-progress-text); + font-family: "Helvetica Neue", sans-serif; + font-weight: 100; + font-size: 5rem; + line-height: 1; + text-align: right; + color: rgba(214, 214, 214, 0.19999999999999996); +} diff --git a/public/bower_components/PACE/themes/silver/pace-theme-bounce.css b/public/bower_components/PACE/themes/silver/pace-theme-bounce.css new file mode 100755 index 0000000..760dacd --- /dev/null +++ b/public/bower_components/PACE/themes/silver/pace-theme-bounce.css @@ -0,0 +1,231 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + width: 140px; + height: 300px; + position: fixed; + top: -90px; + right: -20px; + z-index: 2000; + -webkit-transform: scale(0); + -moz-transform: scale(0); + -ms-transform: scale(0); + -o-transform: scale(0); + transform: scale(0); + opacity: 0; + -webkit-transition: all 2s linear 0s; + -moz-transition: all 2s linear 0s; + transition: all 2s linear 0s; +} + +.pace.pace-active { + -webkit-transform: scale(.25); + -moz-transform: scale(.25); + -ms-transform: scale(.25); + -o-transform: scale(.25); + transform: scale(.25); + opacity: 1; +} + +.pace .pace-activity { + width: 140px; + height: 140px; + border-radius: 70px; + background: #d6d6d6; + position: absolute; + top: 0; + z-index: 1911; + -webkit-animation: pace-bounce 1s infinite; + -moz-animation: pace-bounce 1s infinite; + -o-animation: pace-bounce 1s infinite; + -ms-animation: pace-bounce 1s infinite; + animation: pace-bounce 1s infinite; +} + +.pace .pace-progress { + position: absolute; + display: block; + left: 50%; + bottom: 0; + z-index: 1910; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -webkit-transform: scaleY(.3) !important; + -moz-transform: scaleY(.3) !important; + -ms-transform: scaleY(.3) !important; + -o-transform: scaleY(.3) !important; + transform: scaleY(.3) !important; + -webkit-animation: pace-compress .5s infinite alternate; + -moz-animation: pace-compress .5s infinite alternate; + -o-animation: pace-compress .5s infinite alternate; + -ms-animation: pace-compress .5s infinite alternate; + animation: pace-compress .5s infinite alternate; +} + +@-webkit-keyframes pace-bounce { + 0% { + top: 0; + -webkit-animation-timing-function: ease-in; + } + 40% {} + 50% { + top: 140px; + height: 140px; + -webkit-animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + -webkit-animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + -webkit-animation-timing-function: ease-out; + } + 95% { + top: 0; + -webkit-animation-timing-function: ease-in; + } + 100% { + top: 0; + -webkit-animation-timing-function: ease-in; + } +} + +@-moz-keyframes pace-bounce { + 0% { + top: 0; + -moz-animation-timing-function: ease-in; + } + 40% {} + 50% { + top: 140px; + height: 140px; + -moz-animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + -moz-animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + -moz-animation-timing-function: ease-out;} + 95% { + top: 0; + -moz-animation-timing-function: ease-in; + } + 100% {top: 0; + -moz-animation-timing-function: ease-in; + } +} + +@keyframes pace-bounce { + 0% { + top: 0; + animation-timing-function: ease-in; + } + 50% { + top: 140px; + height: 140px; + animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + animation-timing-function: ease-out; + } + 95% { + top: 0; + animation-timing-function: ease-in; + } + 100% { + top: 0; + animation-timing-function: ease-in; + } +} + +@-webkit-keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -webkit-animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + -webkit-animation-timing-function: ease-out; + } +} + +@-moz-keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -moz-animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + -moz-animation-timing-function: ease-out; + } +} + +@keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + animation-timing-function: ease-out; + } +} \ No newline at end of file diff --git a/public/bower_components/PACE/themes/silver/pace-theme-center-atom.css b/public/bower_components/PACE/themes/silver/pace-theme-center-atom.css new file mode 100755 index 0000000..4d46d80 --- /dev/null +++ b/public/bower_components/PACE/themes/silver/pace-theme-center-atom.css @@ -0,0 +1,131 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace.pace-inactive { + display: none; +} + +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + height: 60px; + width: 100px; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace .pace-progress { + z-index: 2000; + position: absolute; + height: 60px; + width: 100px; + + -webkit-transform: translate3d(0, 0, 0) !important; + -ms-transform: translate3d(0, 0, 0) !important; + transform: translate3d(0, 0, 0) !important; +} + +.pace .pace-progress:before { + content: attr(data-progress-text); + text-align: center; + color: #fff; + background: #d6d6d6; + border-radius: 50%; + font-family: "Helvetica Neue", sans-serif; + font-size: 14px; + font-weight: 100; + line-height: 1; + padding: 20% 0 7px; + width: 50%; + height: 40%; + margin: 10px 0 0 30px; + display: block; + z-index: 999; + position: absolute; +} + +.pace .pace-activity { + font-size: 15px; + line-height: 1; + z-index: 2000; + position: absolute; + height: 60px; + width: 100px; + + display: block; + -webkit-animation: pace-theme-center-atom-spin 2s linear infinite; + -moz-animation: pace-theme-center-atom-spin 2s linear infinite; + -o-animation: pace-theme-center-atom-spin 2s linear infinite; + animation: pace-theme-center-atom-spin 2s linear infinite; +} + +.pace .pace-activity { + border-radius: 50%; + border: 5px solid #d6d6d6; + content: ' '; + display: block; + position: absolute; + top: 0; + left: 0; + height: 60px; + width: 100px; +} + +.pace .pace-activity:after { + border-radius: 50%; + border: 5px solid #d6d6d6; + content: ' '; + display: block; + position: absolute; + top: -5px; + left: -5px; + height: 60px; + width: 100px; + + -webkit-transform: rotate(60deg); + -moz-transform: rotate(60deg); + -o-transform: rotate(60deg); + transform: rotate(60deg); +} + +.pace .pace-activity:before { + border-radius: 50%; + border: 5px solid #d6d6d6; + content: ' '; + display: block; + position: absolute; + top: -5px; + left: -5px; + height: 60px; + width: 100px; + + -webkit-transform: rotate(120deg); + -moz-transform: rotate(120deg); + -o-transform: rotate(120deg); + transform: rotate(120deg); +} + +@-webkit-keyframes pace-theme-center-atom-spin { + 0% { -webkit-transform: rotate(0deg) } + 100% { -webkit-transform: rotate(359deg) } +} +@-moz-keyframes pace-theme-center-atom-spin { + 0% { -moz-transform: rotate(0deg) } + 100% { -moz-transform: rotate(359deg) } +} +@-o-keyframes pace-theme-center-atom-spin { + 0% { -o-transform: rotate(0deg) } + 100% { -o-transform: rotate(359deg) } +} +@keyframes pace-theme-center-atom-spin { + 0% { transform: rotate(0deg) } + 100% { transform: rotate(359deg) } +} diff --git a/public/bower_components/PACE/themes/silver/pace-theme-center-circle.css b/public/bower_components/PACE/themes/silver/pace-theme-center-circle.css new file mode 100755 index 0000000..d2d3eb4 --- /dev/null +++ b/public/bower_components/PACE/themes/silver/pace-theme-center-circle.css @@ -0,0 +1,90 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + -webkit-perspective: 12rem; + -moz-perspective: 12rem; + -ms-perspective: 12rem; + -o-perspective: 12rem; + perspective: 12rem; + + z-index: 2000; + position: fixed; + height: 6rem; + width: 6rem; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace.pace-inactive .pace-progress { + display: none; +} + +.pace .pace-progress { + position: fixed; + z-index: 2000; + display: block; + position: absolute; + left: 0; + top: 0; + height: 6rem; + width: 6rem !important; + line-height: 6rem; + font-size: 2rem; + border-radius: 50%; + background: rgba(214, 214, 214, 0.8); + color: #fff; + font-family: "Helvetica Neue", sans-serif; + font-weight: 100; + text-align: center; + + -webkit-animation: pace-theme-center-circle-spin linear infinite 2s; + -moz-animation: pace-theme-center-circle-spin linear infinite 2s; + -ms-animation: pace-theme-center-circle-spin linear infinite 2s; + -o-animation: pace-theme-center-circle-spin linear infinite 2s; + animation: pace-theme-center-circle-spin linear infinite 2s; + + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + -ms-transform-style: preserve-3d; + -o-transform-style: preserve-3d; + transform-style: preserve-3d; +} + +.pace .pace-progress:after { + content: attr(data-progress-text); + display: block; +} + +@-webkit-keyframes pace-theme-center-circle-spin { + from { -webkit-transform: rotateY(0deg) } + to { -webkit-transform: rotateY(360deg) } +} + +@-moz-keyframes pace-theme-center-circle-spin { + from { -moz-transform: rotateY(0deg) } + to { -moz-transform: rotateY(360deg) } +} + +@-ms-keyframes pace-theme-center-circle-spin { + from { -ms-transform: rotateY(0deg) } + to { -ms-transform: rotateY(360deg) } +} + +@-o-keyframes pace-theme-center-circle-spin { + from { -o-transform: rotateY(0deg) } + to { -o-transform: rotateY(360deg) } +} + +@keyframes pace-theme-center-circle-spin { + from { transform: rotateY(0deg) } + to { transform: rotateY(360deg) } +} diff --git a/public/bower_components/PACE/themes/silver/pace-theme-center-radar.css b/public/bower_components/PACE/themes/silver/pace-theme-center-radar.css new file mode 100755 index 0000000..c3bc55d --- /dev/null +++ b/public/bower_components/PACE/themes/silver/pace-theme-center-radar.css @@ -0,0 +1,74 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + height: 90px; + width: 90px; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace.pace-inactive .pace-activity { + display: none; +} + +.pace .pace-activity { + position: fixed; + z-index: 2000; + display: block; + position: absolute; + left: -30px; + top: -30px; + height: 90px; + width: 90px; + display: block; + border-width: 30px; + border-style: double; + border-color: #d6d6d6 transparent transparent; + border-radius: 50%; + + -webkit-animation: spin 1s linear infinite; + -moz-animation: spin 1s linear infinite; + -o-animation: spin 1s linear infinite; + animation: spin 1s linear infinite; +} + +.pace .pace-activity:before { + content: ' '; + position: absolute; + top: 10px; + left: 10px; + height: 50px; + width: 50px; + display: block; + border-width: 10px; + border-style: solid; + border-color: #d6d6d6 transparent transparent; + border-radius: 50%; +} + +@-webkit-keyframes spin { + 100% { -webkit-transform: rotate(359deg); } +} + +@-moz-keyframes spin { + 100% { -moz-transform: rotate(359deg); } +} + +@-o-keyframes spin { + 100% { -moz-transform: rotate(359deg); } +} + +@keyframes spin { + 100% { transform: rotate(359deg); } +} diff --git a/public/bower_components/PACE/themes/silver/pace-theme-center-simple.css b/public/bower_components/PACE/themes/silver/pace-theme-center-simple.css new file mode 100755 index 0000000..ffdd90e --- /dev/null +++ b/public/bower_components/PACE/themes/silver/pace-theme-center-simple.css @@ -0,0 +1,52 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; + height: 5px; + width: 200px; + background: #fff; + border: 1px solid #d6d6d6; + + overflow: hidden; +} + +.pace .pace-progress { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + max-width: 200px; + position: fixed; + z-index: 2000; + display: block; + position: absolute; + top: 0; + right: 100%; + height: 100%; + width: 100%; + background: #d6d6d6; +} + +.pace.pace-inactive { + display: none; +} \ No newline at end of file diff --git a/public/bower_components/PACE/themes/silver/pace-theme-corner-indicator.css b/public/bower_components/PACE/themes/silver/pace-theme-corner-indicator.css new file mode 100755 index 0000000..4090e68 --- /dev/null +++ b/public/bower_components/PACE/themes/silver/pace-theme-corner-indicator.css @@ -0,0 +1,73 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace .pace-activity { + display: block; + position: fixed; + z-index: 2000; + top: 0; + right: 0; + width: 300px; + height: 300px; + background: #d6d6d6; + -webkit-transition: -webkit-transform 0.3s; + transition: transform 0.3s; + -webkit-transform: translateX(100%) translateY(-100%) rotate(45deg); + transform: translateX(100%) translateY(-100%) rotate(45deg); + pointer-events: none; +} + +.pace.pace-active .pace-activity { + -webkit-transform: translateX(50%) translateY(-50%) rotate(45deg); + transform: translateX(50%) translateY(-50%) rotate(45deg); +} + +.pace .pace-activity::before, +.pace .pace-activity::after { + -moz-box-sizing: border-box; + box-sizing: border-box; + position: absolute; + bottom: 30px; + left: 50%; + display: block; + border: 5px solid #fff; + border-radius: 50%; + content: ''; +} + +.pace .pace-activity::before { + margin-left: -40px; + width: 80px; + height: 80px; + border-right-color: rgba(0, 0, 0, .2); + border-left-color: rgba(0, 0, 0, .2); + -webkit-animation: pace-theme-corner-indicator-spin 3s linear infinite; + animation: pace-theme-corner-indicator-spin 3s linear infinite; +} + +.pace .pace-activity::after { + bottom: 50px; + margin-left: -20px; + width: 40px; + height: 40px; + border-top-color: rgba(0, 0, 0, .2); + border-bottom-color: rgba(0, 0, 0, .2); + -webkit-animation: pace-theme-corner-indicator-spin 1s linear infinite; + animation: pace-theme-corner-indicator-spin 1s linear infinite; +} + +@-webkit-keyframes pace-theme-corner-indicator-spin { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(359deg); } +} +@keyframes pace-theme-corner-indicator-spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(359deg); } +} diff --git a/public/bower_components/PACE/themes/silver/pace-theme-fill-left.css b/public/bower_components/PACE/themes/silver/pace-theme-fill-left.css new file mode 100755 index 0000000..1193580 --- /dev/null +++ b/public/bower_components/PACE/themes/silver/pace-theme-fill-left.css @@ -0,0 +1,22 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: rgba(214, 214, 214, 0.19999999999999996); + position: fixed; + z-index: -1; + top: 0; + right: 100%; + bottom: 0; + width: 100%; +} diff --git a/public/bower_components/PACE/themes/silver/pace-theme-flash.css b/public/bower_components/PACE/themes/silver/pace-theme-flash.css new file mode 100755 index 0000000..b546248 --- /dev/null +++ b/public/bower_components/PACE/themes/silver/pace-theme-flash.css @@ -0,0 +1,77 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background: #d6d6d6; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 2px; +} + +.pace .pace-progress-inner { + display: block; + position: absolute; + right: 0px; + width: 100px; + height: 100%; + box-shadow: 0 0 10px #d6d6d6, 0 0 5px #d6d6d6; + opacity: 1.0; + -webkit-transform: rotate(3deg) translate(0px, -4px); + -moz-transform: rotate(3deg) translate(0px, -4px); + -ms-transform: rotate(3deg) translate(0px, -4px); + -o-transform: rotate(3deg) translate(0px, -4px); + transform: rotate(3deg) translate(0px, -4px); +} + +.pace .pace-activity { + display: block; + position: fixed; + z-index: 2000; + top: 15px; + right: 15px; + width: 14px; + height: 14px; + border: solid 2px transparent; + border-top-color: #d6d6d6; + border-left-color: #d6d6d6; + border-radius: 10px; + -webkit-animation: pace-spinner 400ms linear infinite; + -moz-animation: pace-spinner 400ms linear infinite; + -ms-animation: pace-spinner 400ms linear infinite; + -o-animation: pace-spinner 400ms linear infinite; + animation: pace-spinner 400ms linear infinite; +} + +@-webkit-keyframes pace-spinner { + 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } +} +@-moz-keyframes pace-spinner { + 0% { -moz-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -moz-transform: rotate(360deg); transform: rotate(360deg); } +} +@-o-keyframes pace-spinner { + 0% { -o-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -o-transform: rotate(360deg); transform: rotate(360deg); } +} +@-ms-keyframes pace-spinner { + 0% { -ms-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -ms-transform: rotate(360deg); transform: rotate(360deg); } +} +@keyframes pace-spinner { + 0% { transform: rotate(0deg); transform: rotate(0deg); } + 100% { transform: rotate(360deg); transform: rotate(360deg); } +} diff --git a/public/bower_components/PACE/themes/silver/pace-theme-flat-top.css b/public/bower_components/PACE/themes/silver/pace-theme-flat-top.css new file mode 100755 index 0000000..b7c46c5 --- /dev/null +++ b/public/bower_components/PACE/themes/silver/pace-theme-flat-top.css @@ -0,0 +1,41 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + position: fixed; + top: 0; + left: 0; + width: 100%; + + -webkit-transform: translate3d(0, -50px, 0); + -ms-transform: translate3d(0, -50px, 0); + transform: translate3d(0, -50px, 0); + + -webkit-transition: -webkit-transform .5s ease-out; + -ms-transition: -webkit-transform .5s ease-out; + transition: transform .5s ease-out; +} + +.pace.pace-active { + -webkit-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} + +.pace .pace-progress { + display: block; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 10px; + background: #d6d6d6; + + pointer-events: none; +} diff --git a/public/bower_components/PACE/themes/silver/pace-theme-loading-bar.css b/public/bower_components/PACE/themes/silver/pace-theme-loading-bar.css new file mode 100755 index 0000000..1786717 --- /dev/null +++ b/public/bower_components/PACE/themes/silver/pace-theme-loading-bar.css @@ -0,0 +1,198 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; + + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + z-index: 2000; + position: fixed; + margin: auto; + top: 12px; + left: 0; + right: 0; + bottom: 0; + width: 200px; + height: 50px; + overflow: hidden; +} + +.pace .pace-progress { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + display: block; + position: absolute; + right: 100%; + margin-right: -7px; + width: 93%; + top: 7px; + height: 14px; + font-size: 12px; + background: #d6d6d6; + color: #d6d6d6; + line-height: 60px; + font-weight: bold; + font-family: Helvetica, Arial, "Lucida Grande", sans-serif; + + -webkit-box-shadow: 120px 0 #fff, 240px 0 #fff; + -ms-box-shadow: 120px 0 #fff, 240px 0 #fff; + box-shadow: 120px 0 #fff, 240px 0 #fff; +} + +.pace .pace-progress:after { + content: attr(data-progress-text); + display: inline-block; + position: fixed; + width: 45px; + text-align: right; + right: 0; + padding-right: 16px; + top: 4px; +} + +.pace .pace-progress[data-progress-text="0%"]:after { right: -200px } +.pace .pace-progress[data-progress-text="1%"]:after { right: -198.14px } +.pace .pace-progress[data-progress-text="2%"]:after { right: -196.28px } +.pace .pace-progress[data-progress-text="3%"]:after { right: -194.42px } +.pace .pace-progress[data-progress-text="4%"]:after { right: -192.56px } +.pace .pace-progress[data-progress-text="5%"]:after { right: -190.7px } +.pace .pace-progress[data-progress-text="6%"]:after { right: -188.84px } +.pace .pace-progress[data-progress-text="7%"]:after { right: -186.98px } +.pace .pace-progress[data-progress-text="8%"]:after { right: -185.12px } +.pace .pace-progress[data-progress-text="9%"]:after { right: -183.26px } +.pace .pace-progress[data-progress-text="10%"]:after { right: -181.4px } +.pace .pace-progress[data-progress-text="11%"]:after { right: -179.54px } +.pace .pace-progress[data-progress-text="12%"]:after { right: -177.68px } +.pace .pace-progress[data-progress-text="13%"]:after { right: -175.82px } +.pace .pace-progress[data-progress-text="14%"]:after { right: -173.96px } +.pace .pace-progress[data-progress-text="15%"]:after { right: -172.1px } +.pace .pace-progress[data-progress-text="16%"]:after { right: -170.24px } +.pace .pace-progress[data-progress-text="17%"]:after { right: -168.38px } +.pace .pace-progress[data-progress-text="18%"]:after { right: -166.52px } +.pace .pace-progress[data-progress-text="19%"]:after { right: -164.66px } +.pace .pace-progress[data-progress-text="20%"]:after { right: -162.8px } +.pace .pace-progress[data-progress-text="21%"]:after { right: -160.94px } +.pace .pace-progress[data-progress-text="22%"]:after { right: -159.08px } +.pace .pace-progress[data-progress-text="23%"]:after { right: -157.22px } +.pace .pace-progress[data-progress-text="24%"]:after { right: -155.36px } +.pace .pace-progress[data-progress-text="25%"]:after { right: -153.5px } +.pace .pace-progress[data-progress-text="26%"]:after { right: -151.64px } +.pace .pace-progress[data-progress-text="27%"]:after { right: -149.78px } +.pace .pace-progress[data-progress-text="28%"]:after { right: -147.92px } +.pace .pace-progress[data-progress-text="29%"]:after { right: -146.06px } +.pace .pace-progress[data-progress-text="30%"]:after { right: -144.2px } +.pace .pace-progress[data-progress-text="31%"]:after { right: -142.34px } +.pace .pace-progress[data-progress-text="32%"]:after { right: -140.48px } +.pace .pace-progress[data-progress-text="33%"]:after { right: -138.62px } +.pace .pace-progress[data-progress-text="34%"]:after { right: -136.76px } +.pace .pace-progress[data-progress-text="35%"]:after { right: -134.9px } +.pace .pace-progress[data-progress-text="36%"]:after { right: -133.04px } +.pace .pace-progress[data-progress-text="37%"]:after { right: -131.18px } +.pace .pace-progress[data-progress-text="38%"]:after { right: -129.32px } +.pace .pace-progress[data-progress-text="39%"]:after { right: -127.46px } +.pace .pace-progress[data-progress-text="40%"]:after { right: -125.6px } +.pace .pace-progress[data-progress-text="41%"]:after { right: -123.74px } +.pace .pace-progress[data-progress-text="42%"]:after { right: -121.88px } +.pace .pace-progress[data-progress-text="43%"]:after { right: -120.02px } +.pace .pace-progress[data-progress-text="44%"]:after { right: -118.16px } +.pace .pace-progress[data-progress-text="45%"]:after { right: -116.3px } +.pace .pace-progress[data-progress-text="46%"]:after { right: -114.44px } +.pace .pace-progress[data-progress-text="47%"]:after { right: -112.58px } +.pace .pace-progress[data-progress-text="48%"]:after { right: -110.72px } +.pace .pace-progress[data-progress-text="49%"]:after { right: -108.86px } +.pace .pace-progress[data-progress-text="50%"]:after { right: -107px } +.pace .pace-progress[data-progress-text="51%"]:after { right: -105.14px } +.pace .pace-progress[data-progress-text="52%"]:after { right: -103.28px } +.pace .pace-progress[data-progress-text="53%"]:after { right: -101.42px } +.pace .pace-progress[data-progress-text="54%"]:after { right: -99.56px } +.pace .pace-progress[data-progress-text="55%"]:after { right: -97.7px } +.pace .pace-progress[data-progress-text="56%"]:after { right: -95.84px } +.pace .pace-progress[data-progress-text="57%"]:after { right: -93.98px } +.pace .pace-progress[data-progress-text="58%"]:after { right: -92.12px } +.pace .pace-progress[data-progress-text="59%"]:after { right: -90.26px } +.pace .pace-progress[data-progress-text="60%"]:after { right: -88.4px } +.pace .pace-progress[data-progress-text="61%"]:after { right: -86.53999999999999px } +.pace .pace-progress[data-progress-text="62%"]:after { right: -84.68px } +.pace .pace-progress[data-progress-text="63%"]:after { right: -82.82px } +.pace .pace-progress[data-progress-text="64%"]:after { right: -80.96000000000001px } +.pace .pace-progress[data-progress-text="65%"]:after { right: -79.1px } +.pace .pace-progress[data-progress-text="66%"]:after { right: -77.24px } +.pace .pace-progress[data-progress-text="67%"]:after { right: -75.38px } +.pace .pace-progress[data-progress-text="68%"]:after { right: -73.52px } +.pace .pace-progress[data-progress-text="69%"]:after { right: -71.66px } +.pace .pace-progress[data-progress-text="70%"]:after { right: -69.8px } +.pace .pace-progress[data-progress-text="71%"]:after { right: -67.94px } +.pace .pace-progress[data-progress-text="72%"]:after { right: -66.08px } +.pace .pace-progress[data-progress-text="73%"]:after { right: -64.22px } +.pace .pace-progress[data-progress-text="74%"]:after { right: -62.36px } +.pace .pace-progress[data-progress-text="75%"]:after { right: -60.5px } +.pace .pace-progress[data-progress-text="76%"]:after { right: -58.64px } +.pace .pace-progress[data-progress-text="77%"]:after { right: -56.78px } +.pace .pace-progress[data-progress-text="78%"]:after { right: -54.92px } +.pace .pace-progress[data-progress-text="79%"]:after { right: -53.06px } +.pace .pace-progress[data-progress-text="80%"]:after { right: -51.2px } +.pace .pace-progress[data-progress-text="81%"]:after { right: -49.34px } +.pace .pace-progress[data-progress-text="82%"]:after { right: -47.480000000000004px } +.pace .pace-progress[data-progress-text="83%"]:after { right: -45.62px } +.pace .pace-progress[data-progress-text="84%"]:after { right: -43.76px } +.pace .pace-progress[data-progress-text="85%"]:after { right: -41.9px } +.pace .pace-progress[data-progress-text="86%"]:after { right: -40.04px } +.pace .pace-progress[data-progress-text="87%"]:after { right: -38.18px } +.pace .pace-progress[data-progress-text="88%"]:after { right: -36.32px } +.pace .pace-progress[data-progress-text="89%"]:after { right: -34.46px } +.pace .pace-progress[data-progress-text="90%"]:after { right: -32.6px } +.pace .pace-progress[data-progress-text="91%"]:after { right: -30.740000000000002px } +.pace .pace-progress[data-progress-text="92%"]:after { right: -28.880000000000003px } +.pace .pace-progress[data-progress-text="93%"]:after { right: -27.02px } +.pace .pace-progress[data-progress-text="94%"]:after { right: -25.16px } +.pace .pace-progress[data-progress-text="95%"]:after { right: -23.3px } +.pace .pace-progress[data-progress-text="96%"]:after { right: -21.439999999999998px } +.pace .pace-progress[data-progress-text="97%"]:after { right: -19.58px } +.pace .pace-progress[data-progress-text="98%"]:after { right: -17.72px } +.pace .pace-progress[data-progress-text="99%"]:after { right: -15.86px } +.pace .pace-progress[data-progress-text="100%"]:after { right: -14px } + + +.pace .pace-activity { + position: absolute; + width: 100%; + height: 28px; + z-index: 2001; + box-shadow: inset 0 0 0 2px #d6d6d6, inset 0 0 0 7px #FFF; + border-radius: 10px; +} + +.pace.pace-inactive { + display: none; +} diff --git a/public/bower_components/PACE/themes/silver/pace-theme-mac-osx.css b/public/bower_components/PACE/themes/silver/pace-theme-mac-osx.css new file mode 100755 index 0000000..6c84a81 --- /dev/null +++ b/public/bower_components/PACE/themes/silver/pace-theme-mac-osx.css @@ -0,0 +1,87 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + overflow: hidden; + position: fixed; + top: 0; + left: 0; + z-index: 2000; + width: 100%; + height: 12px; + background: #fff; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: #ABABAB; + position: fixed; + top: 0; + right: 100%; + width: 100%; + height: 12px; + overflow: hidden; + + -webkit-border-radius: 0 0 4px 0; + -moz-border-radius: 0 0 4px 0; + -o-border-radius: 0 0 4px 0; + border-radius: 0 0 4px 0; + + -webkit-box-shadow: inset -1px 0 #6B6B6B, inset 0 -1px #6B6B6B, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + -moz-box-shadow: inset -1px 0 #6B6B6B, inset 0 -1px #6B6B6B, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + -o-box-shadow: inset -1px 0 #6B6B6B, inset 0 -1px #6B6B6B, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + box-shadow: inset -1px 0 #6B6B6B, inset 0 -1px #6B6B6B, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); +} + +.pace .pace-activity { + position: fixed; + top: 0; + left: 0; + right: -28px; + bottom: 0; + + -webkit-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + -moz-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + -o-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + + -webkit-background-size: 28px 100%; + -moz-background-size: 28px 100%; + -o-background-size: 28px 100%; + background-size: 28px 100%; + + -webkit-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -moz-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -ms-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -o-animation: pace-theme-mac-osx-motion 500ms linear infinite; + animation: pace-theme-mac-osx-motion 500ms linear infinite; +} + +@-webkit-keyframes pace-theme-mac-osx-motion { + 0% { -webkit-transform: none; transform: none; } + 100% { -webkit-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-moz-keyframes pace-theme-mac-osx-motion { + 0% { -moz-transform: none; transform: none; } + 100% { -moz-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-o-keyframes pace-theme-mac-osx-motion { + 0% { -o-transform: none; transform: none; } + 100% { -o-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-ms-keyframes pace-theme-mac-osx-motion { + 0% { -ms-transform: none; transform: none; } + 100% { -ms-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@keyframes pace-theme-mac-osx-motion { + 0% { transform: none; transform: none; } + 100% { transform: translate(-28px, 0); transform: translate(-28px, 0); } +} diff --git a/public/bower_components/PACE/themes/silver/pace-theme-minimal.css b/public/bower_components/PACE/themes/silver/pace-theme-minimal.css new file mode 100755 index 0000000..9255af3 --- /dev/null +++ b/public/bower_components/PACE/themes/silver/pace-theme-minimal.css @@ -0,0 +1,23 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background: #d6d6d6; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 2px; +} diff --git a/public/bower_components/PACE/themes/white/pace-theme-barber-shop.css b/public/bower_components/PACE/themes/white/pace-theme-barber-shop.css new file mode 100755 index 0000000..9eb7e75 --- /dev/null +++ b/public/bower_components/PACE/themes/white/pace-theme-barber-shop.css @@ -0,0 +1,83 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + overflow: hidden; + position: fixed; + top: 0; + left: 0; + z-index: 2000; + width: 100%; + height: 12px; + background: #fff; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: #ffffff; + position: fixed; + top: 0; + bottom: 0; + right: 100%; + width: 100%; + overflow: hidden; +} + +.pace .pace-activity { + position: fixed; + top: 0; + right: -32px; + bottom: 0; + left: 0; + + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.2)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.2)), color-stop(0.75, rgba(255, 255, 255, 0.2)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + -webkit-background-size: 32px 32px; + -moz-background-size: 32px 32px; + -o-background-size: 32px 32px; + background-size: 32px 32px; + + -webkit-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -moz-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -ms-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -o-animation: pace-theme-barber-shop-motion 500ms linear infinite; + animation: pace-theme-barber-shop-motion 500ms linear infinite; +} + +@-webkit-keyframes pace-theme-barber-shop-motion { + 0% { -webkit-transform: none; transform: none; } + 100% { -webkit-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-moz-keyframes pace-theme-barber-shop-motion { + 0% { -moz-transform: none; transform: none; } + 100% { -moz-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-o-keyframes pace-theme-barber-shop-motion { + 0% { -o-transform: none; transform: none; } + 100% { -o-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-ms-keyframes pace-theme-barber-shop-motion { + 0% { -ms-transform: none; transform: none; } + 100% { -ms-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@keyframes pace-theme-barber-shop-motion { + 0% { transform: none; transform: none; } + 100% { transform: translate(-32px, 0); transform: translate(-32px, 0); } +} diff --git a/public/bower_components/PACE/themes/white/pace-theme-big-counter.css b/public/bower_components/PACE/themes/white/pace-theme-big-counter.css new file mode 100755 index 0000000..4ffdda4 --- /dev/null +++ b/public/bower_components/PACE/themes/white/pace-theme-big-counter.css @@ -0,0 +1,40 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace.pace-inactive .pace-progress { + display: none; +} + +.pace .pace-progress { + position: fixed; + z-index: 2000; + top: 0; + right: 0; + height: 5rem; + width: 5rem; + + -webkit-transform: translate3d(0, 0, 0) !important; + -ms-transform: translate3d(0, 0, 0) !important; + transform: translate3d(0, 0, 0) !important; +} + +.pace .pace-progress:after { + display: block; + position: absolute; + top: 0; + right: .5rem; + content: attr(data-progress-text); + font-family: "Helvetica Neue", sans-serif; + font-weight: 100; + font-size: 5rem; + line-height: 1; + text-align: right; + color: rgba(255, 255, 255, 0.19999999999999996); +} diff --git a/public/bower_components/PACE/themes/white/pace-theme-bounce.css b/public/bower_components/PACE/themes/white/pace-theme-bounce.css new file mode 100755 index 0000000..ba65dcf --- /dev/null +++ b/public/bower_components/PACE/themes/white/pace-theme-bounce.css @@ -0,0 +1,231 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + width: 140px; + height: 300px; + position: fixed; + top: -90px; + right: -20px; + z-index: 2000; + -webkit-transform: scale(0); + -moz-transform: scale(0); + -ms-transform: scale(0); + -o-transform: scale(0); + transform: scale(0); + opacity: 0; + -webkit-transition: all 2s linear 0s; + -moz-transition: all 2s linear 0s; + transition: all 2s linear 0s; +} + +.pace.pace-active { + -webkit-transform: scale(.25); + -moz-transform: scale(.25); + -ms-transform: scale(.25); + -o-transform: scale(.25); + transform: scale(.25); + opacity: 1; +} + +.pace .pace-activity { + width: 140px; + height: 140px; + border-radius: 70px; + background: #ffffff; + position: absolute; + top: 0; + z-index: 1911; + -webkit-animation: pace-bounce 1s infinite; + -moz-animation: pace-bounce 1s infinite; + -o-animation: pace-bounce 1s infinite; + -ms-animation: pace-bounce 1s infinite; + animation: pace-bounce 1s infinite; +} + +.pace .pace-progress { + position: absolute; + display: block; + left: 50%; + bottom: 0; + z-index: 1910; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -webkit-transform: scaleY(.3) !important; + -moz-transform: scaleY(.3) !important; + -ms-transform: scaleY(.3) !important; + -o-transform: scaleY(.3) !important; + transform: scaleY(.3) !important; + -webkit-animation: pace-compress .5s infinite alternate; + -moz-animation: pace-compress .5s infinite alternate; + -o-animation: pace-compress .5s infinite alternate; + -ms-animation: pace-compress .5s infinite alternate; + animation: pace-compress .5s infinite alternate; +} + +@-webkit-keyframes pace-bounce { + 0% { + top: 0; + -webkit-animation-timing-function: ease-in; + } + 40% {} + 50% { + top: 140px; + height: 140px; + -webkit-animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + -webkit-animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + -webkit-animation-timing-function: ease-out; + } + 95% { + top: 0; + -webkit-animation-timing-function: ease-in; + } + 100% { + top: 0; + -webkit-animation-timing-function: ease-in; + } +} + +@-moz-keyframes pace-bounce { + 0% { + top: 0; + -moz-animation-timing-function: ease-in; + } + 40% {} + 50% { + top: 140px; + height: 140px; + -moz-animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + -moz-animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + -moz-animation-timing-function: ease-out;} + 95% { + top: 0; + -moz-animation-timing-function: ease-in; + } + 100% {top: 0; + -moz-animation-timing-function: ease-in; + } +} + +@keyframes pace-bounce { + 0% { + top: 0; + animation-timing-function: ease-in; + } + 50% { + top: 140px; + height: 140px; + animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + animation-timing-function: ease-out; + } + 95% { + top: 0; + animation-timing-function: ease-in; + } + 100% { + top: 0; + animation-timing-function: ease-in; + } +} + +@-webkit-keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -webkit-animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + -webkit-animation-timing-function: ease-out; + } +} + +@-moz-keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -moz-animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + -moz-animation-timing-function: ease-out; + } +} + +@keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + animation-timing-function: ease-out; + } +} \ No newline at end of file diff --git a/public/bower_components/PACE/themes/white/pace-theme-center-atom.css b/public/bower_components/PACE/themes/white/pace-theme-center-atom.css new file mode 100755 index 0000000..48f5bc6 --- /dev/null +++ b/public/bower_components/PACE/themes/white/pace-theme-center-atom.css @@ -0,0 +1,131 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace.pace-inactive { + display: none; +} + +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + height: 60px; + width: 100px; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace .pace-progress { + z-index: 2000; + position: absolute; + height: 60px; + width: 100px; + + -webkit-transform: translate3d(0, 0, 0) !important; + -ms-transform: translate3d(0, 0, 0) !important; + transform: translate3d(0, 0, 0) !important; +} + +.pace .pace-progress:before { + content: attr(data-progress-text); + text-align: center; + color: #fff; + background: #ffffff; + border-radius: 50%; + font-family: "Helvetica Neue", sans-serif; + font-size: 14px; + font-weight: 100; + line-height: 1; + padding: 20% 0 7px; + width: 50%; + height: 40%; + margin: 10px 0 0 30px; + display: block; + z-index: 999; + position: absolute; +} + +.pace .pace-activity { + font-size: 15px; + line-height: 1; + z-index: 2000; + position: absolute; + height: 60px; + width: 100px; + + display: block; + -webkit-animation: pace-theme-center-atom-spin 2s linear infinite; + -moz-animation: pace-theme-center-atom-spin 2s linear infinite; + -o-animation: pace-theme-center-atom-spin 2s linear infinite; + animation: pace-theme-center-atom-spin 2s linear infinite; +} + +.pace .pace-activity { + border-radius: 50%; + border: 5px solid #ffffff; + content: ' '; + display: block; + position: absolute; + top: 0; + left: 0; + height: 60px; + width: 100px; +} + +.pace .pace-activity:after { + border-radius: 50%; + border: 5px solid #ffffff; + content: ' '; + display: block; + position: absolute; + top: -5px; + left: -5px; + height: 60px; + width: 100px; + + -webkit-transform: rotate(60deg); + -moz-transform: rotate(60deg); + -o-transform: rotate(60deg); + transform: rotate(60deg); +} + +.pace .pace-activity:before { + border-radius: 50%; + border: 5px solid #ffffff; + content: ' '; + display: block; + position: absolute; + top: -5px; + left: -5px; + height: 60px; + width: 100px; + + -webkit-transform: rotate(120deg); + -moz-transform: rotate(120deg); + -o-transform: rotate(120deg); + transform: rotate(120deg); +} + +@-webkit-keyframes pace-theme-center-atom-spin { + 0% { -webkit-transform: rotate(0deg) } + 100% { -webkit-transform: rotate(359deg) } +} +@-moz-keyframes pace-theme-center-atom-spin { + 0% { -moz-transform: rotate(0deg) } + 100% { -moz-transform: rotate(359deg) } +} +@-o-keyframes pace-theme-center-atom-spin { + 0% { -o-transform: rotate(0deg) } + 100% { -o-transform: rotate(359deg) } +} +@keyframes pace-theme-center-atom-spin { + 0% { transform: rotate(0deg) } + 100% { transform: rotate(359deg) } +} diff --git a/public/bower_components/PACE/themes/white/pace-theme-center-circle.css b/public/bower_components/PACE/themes/white/pace-theme-center-circle.css new file mode 100755 index 0000000..9709f4c --- /dev/null +++ b/public/bower_components/PACE/themes/white/pace-theme-center-circle.css @@ -0,0 +1,90 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + -webkit-perspective: 12rem; + -moz-perspective: 12rem; + -ms-perspective: 12rem; + -o-perspective: 12rem; + perspective: 12rem; + + z-index: 2000; + position: fixed; + height: 6rem; + width: 6rem; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace.pace-inactive .pace-progress { + display: none; +} + +.pace .pace-progress { + position: fixed; + z-index: 2000; + display: block; + position: absolute; + left: 0; + top: 0; + height: 6rem; + width: 6rem !important; + line-height: 6rem; + font-size: 2rem; + border-radius: 50%; + background: rgba(255, 255, 255, 0.8); + color: #fff; + font-family: "Helvetica Neue", sans-serif; + font-weight: 100; + text-align: center; + + -webkit-animation: pace-theme-center-circle-spin linear infinite 2s; + -moz-animation: pace-theme-center-circle-spin linear infinite 2s; + -ms-animation: pace-theme-center-circle-spin linear infinite 2s; + -o-animation: pace-theme-center-circle-spin linear infinite 2s; + animation: pace-theme-center-circle-spin linear infinite 2s; + + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + -ms-transform-style: preserve-3d; + -o-transform-style: preserve-3d; + transform-style: preserve-3d; +} + +.pace .pace-progress:after { + content: attr(data-progress-text); + display: block; +} + +@-webkit-keyframes pace-theme-center-circle-spin { + from { -webkit-transform: rotateY(0deg) } + to { -webkit-transform: rotateY(360deg) } +} + +@-moz-keyframes pace-theme-center-circle-spin { + from { -moz-transform: rotateY(0deg) } + to { -moz-transform: rotateY(360deg) } +} + +@-ms-keyframes pace-theme-center-circle-spin { + from { -ms-transform: rotateY(0deg) } + to { -ms-transform: rotateY(360deg) } +} + +@-o-keyframes pace-theme-center-circle-spin { + from { -o-transform: rotateY(0deg) } + to { -o-transform: rotateY(360deg) } +} + +@keyframes pace-theme-center-circle-spin { + from { transform: rotateY(0deg) } + to { transform: rotateY(360deg) } +} diff --git a/public/bower_components/PACE/themes/white/pace-theme-center-radar.css b/public/bower_components/PACE/themes/white/pace-theme-center-radar.css new file mode 100755 index 0000000..adc9f68 --- /dev/null +++ b/public/bower_components/PACE/themes/white/pace-theme-center-radar.css @@ -0,0 +1,74 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + height: 90px; + width: 90px; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace.pace-inactive .pace-activity { + display: none; +} + +.pace .pace-activity { + position: fixed; + z-index: 2000; + display: block; + position: absolute; + left: -30px; + top: -30px; + height: 90px; + width: 90px; + display: block; + border-width: 30px; + border-style: double; + border-color: #ffffff transparent transparent; + border-radius: 50%; + + -webkit-animation: spin 1s linear infinite; + -moz-animation: spin 1s linear infinite; + -o-animation: spin 1s linear infinite; + animation: spin 1s linear infinite; +} + +.pace .pace-activity:before { + content: ' '; + position: absolute; + top: 10px; + left: 10px; + height: 50px; + width: 50px; + display: block; + border-width: 10px; + border-style: solid; + border-color: #ffffff transparent transparent; + border-radius: 50%; +} + +@-webkit-keyframes spin { + 100% { -webkit-transform: rotate(359deg); } +} + +@-moz-keyframes spin { + 100% { -moz-transform: rotate(359deg); } +} + +@-o-keyframes spin { + 100% { -moz-transform: rotate(359deg); } +} + +@keyframes spin { + 100% { transform: rotate(359deg); } +} diff --git a/public/bower_components/PACE/themes/white/pace-theme-center-simple.css b/public/bower_components/PACE/themes/white/pace-theme-center-simple.css new file mode 100755 index 0000000..ff369fc --- /dev/null +++ b/public/bower_components/PACE/themes/white/pace-theme-center-simple.css @@ -0,0 +1,52 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; + height: 5px; + width: 200px; + background: #fff; + border: 1px solid #ffffff; + + overflow: hidden; +} + +.pace .pace-progress { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + max-width: 200px; + position: fixed; + z-index: 2000; + display: block; + position: absolute; + top: 0; + right: 100%; + height: 100%; + width: 100%; + background: #ffffff; +} + +.pace.pace-inactive { + display: none; +} \ No newline at end of file diff --git a/public/bower_components/PACE/themes/white/pace-theme-corner-indicator.css b/public/bower_components/PACE/themes/white/pace-theme-corner-indicator.css new file mode 100755 index 0000000..b1670ce --- /dev/null +++ b/public/bower_components/PACE/themes/white/pace-theme-corner-indicator.css @@ -0,0 +1,73 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace .pace-activity { + display: block; + position: fixed; + z-index: 2000; + top: 0; + right: 0; + width: 300px; + height: 300px; + background: #ffffff; + -webkit-transition: -webkit-transform 0.3s; + transition: transform 0.3s; + -webkit-transform: translateX(100%) translateY(-100%) rotate(45deg); + transform: translateX(100%) translateY(-100%) rotate(45deg); + pointer-events: none; +} + +.pace.pace-active .pace-activity { + -webkit-transform: translateX(50%) translateY(-50%) rotate(45deg); + transform: translateX(50%) translateY(-50%) rotate(45deg); +} + +.pace .pace-activity::before, +.pace .pace-activity::after { + -moz-box-sizing: border-box; + box-sizing: border-box; + position: absolute; + bottom: 30px; + left: 50%; + display: block; + border: 5px solid #fff; + border-radius: 50%; + content: ''; +} + +.pace .pace-activity::before { + margin-left: -40px; + width: 80px; + height: 80px; + border-right-color: rgba(0, 0, 0, .2); + border-left-color: rgba(0, 0, 0, .2); + -webkit-animation: pace-theme-corner-indicator-spin 3s linear infinite; + animation: pace-theme-corner-indicator-spin 3s linear infinite; +} + +.pace .pace-activity::after { + bottom: 50px; + margin-left: -20px; + width: 40px; + height: 40px; + border-top-color: rgba(0, 0, 0, .2); + border-bottom-color: rgba(0, 0, 0, .2); + -webkit-animation: pace-theme-corner-indicator-spin 1s linear infinite; + animation: pace-theme-corner-indicator-spin 1s linear infinite; +} + +@-webkit-keyframes pace-theme-corner-indicator-spin { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(359deg); } +} +@keyframes pace-theme-corner-indicator-spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(359deg); } +} diff --git a/public/bower_components/PACE/themes/white/pace-theme-fill-left.css b/public/bower_components/PACE/themes/white/pace-theme-fill-left.css new file mode 100755 index 0000000..ca74632 --- /dev/null +++ b/public/bower_components/PACE/themes/white/pace-theme-fill-left.css @@ -0,0 +1,22 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: rgba(255, 255, 255, 0.19999999999999996); + position: fixed; + z-index: -1; + top: 0; + right: 100%; + bottom: 0; + width: 100%; +} diff --git a/public/bower_components/PACE/themes/white/pace-theme-flash.css b/public/bower_components/PACE/themes/white/pace-theme-flash.css new file mode 100755 index 0000000..e3d458c --- /dev/null +++ b/public/bower_components/PACE/themes/white/pace-theme-flash.css @@ -0,0 +1,77 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background: #ffffff; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 2px; +} + +.pace .pace-progress-inner { + display: block; + position: absolute; + right: 0px; + width: 100px; + height: 100%; + box-shadow: 0 0 10px #ffffff, 0 0 5px #ffffff; + opacity: 1.0; + -webkit-transform: rotate(3deg) translate(0px, -4px); + -moz-transform: rotate(3deg) translate(0px, -4px); + -ms-transform: rotate(3deg) translate(0px, -4px); + -o-transform: rotate(3deg) translate(0px, -4px); + transform: rotate(3deg) translate(0px, -4px); +} + +.pace .pace-activity { + display: block; + position: fixed; + z-index: 2000; + top: 15px; + right: 15px; + width: 14px; + height: 14px; + border: solid 2px transparent; + border-top-color: #ffffff; + border-left-color: #ffffff; + border-radius: 10px; + -webkit-animation: pace-spinner 400ms linear infinite; + -moz-animation: pace-spinner 400ms linear infinite; + -ms-animation: pace-spinner 400ms linear infinite; + -o-animation: pace-spinner 400ms linear infinite; + animation: pace-spinner 400ms linear infinite; +} + +@-webkit-keyframes pace-spinner { + 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } +} +@-moz-keyframes pace-spinner { + 0% { -moz-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -moz-transform: rotate(360deg); transform: rotate(360deg); } +} +@-o-keyframes pace-spinner { + 0% { -o-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -o-transform: rotate(360deg); transform: rotate(360deg); } +} +@-ms-keyframes pace-spinner { + 0% { -ms-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -ms-transform: rotate(360deg); transform: rotate(360deg); } +} +@keyframes pace-spinner { + 0% { transform: rotate(0deg); transform: rotate(0deg); } + 100% { transform: rotate(360deg); transform: rotate(360deg); } +} diff --git a/public/bower_components/PACE/themes/white/pace-theme-flat-top.css b/public/bower_components/PACE/themes/white/pace-theme-flat-top.css new file mode 100755 index 0000000..a07a599 --- /dev/null +++ b/public/bower_components/PACE/themes/white/pace-theme-flat-top.css @@ -0,0 +1,41 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + position: fixed; + top: 0; + left: 0; + width: 100%; + + -webkit-transform: translate3d(0, -50px, 0); + -ms-transform: translate3d(0, -50px, 0); + transform: translate3d(0, -50px, 0); + + -webkit-transition: -webkit-transform .5s ease-out; + -ms-transition: -webkit-transform .5s ease-out; + transition: transform .5s ease-out; +} + +.pace.pace-active { + -webkit-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} + +.pace .pace-progress { + display: block; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 10px; + background: #ffffff; + + pointer-events: none; +} diff --git a/public/bower_components/PACE/themes/white/pace-theme-loading-bar.css b/public/bower_components/PACE/themes/white/pace-theme-loading-bar.css new file mode 100755 index 0000000..ec57d2b --- /dev/null +++ b/public/bower_components/PACE/themes/white/pace-theme-loading-bar.css @@ -0,0 +1,198 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; + + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + z-index: 2000; + position: fixed; + margin: auto; + top: 12px; + left: 0; + right: 0; + bottom: 0; + width: 200px; + height: 50px; + overflow: hidden; +} + +.pace .pace-progress { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + display: block; + position: absolute; + right: 100%; + margin-right: -7px; + width: 93%; + top: 7px; + height: 14px; + font-size: 12px; + background: #ffffff; + color: #ffffff; + line-height: 60px; + font-weight: bold; + font-family: Helvetica, Arial, "Lucida Grande", sans-serif; + + -webkit-box-shadow: 120px 0 #fff, 240px 0 #fff; + -ms-box-shadow: 120px 0 #fff, 240px 0 #fff; + box-shadow: 120px 0 #fff, 240px 0 #fff; +} + +.pace .pace-progress:after { + content: attr(data-progress-text); + display: inline-block; + position: fixed; + width: 45px; + text-align: right; + right: 0; + padding-right: 16px; + top: 4px; +} + +.pace .pace-progress[data-progress-text="0%"]:after { right: -200px } +.pace .pace-progress[data-progress-text="1%"]:after { right: -198.14px } +.pace .pace-progress[data-progress-text="2%"]:after { right: -196.28px } +.pace .pace-progress[data-progress-text="3%"]:after { right: -194.42px } +.pace .pace-progress[data-progress-text="4%"]:after { right: -192.56px } +.pace .pace-progress[data-progress-text="5%"]:after { right: -190.7px } +.pace .pace-progress[data-progress-text="6%"]:after { right: -188.84px } +.pace .pace-progress[data-progress-text="7%"]:after { right: -186.98px } +.pace .pace-progress[data-progress-text="8%"]:after { right: -185.12px } +.pace .pace-progress[data-progress-text="9%"]:after { right: -183.26px } +.pace .pace-progress[data-progress-text="10%"]:after { right: -181.4px } +.pace .pace-progress[data-progress-text="11%"]:after { right: -179.54px } +.pace .pace-progress[data-progress-text="12%"]:after { right: -177.68px } +.pace .pace-progress[data-progress-text="13%"]:after { right: -175.82px } +.pace .pace-progress[data-progress-text="14%"]:after { right: -173.96px } +.pace .pace-progress[data-progress-text="15%"]:after { right: -172.1px } +.pace .pace-progress[data-progress-text="16%"]:after { right: -170.24px } +.pace .pace-progress[data-progress-text="17%"]:after { right: -168.38px } +.pace .pace-progress[data-progress-text="18%"]:after { right: -166.52px } +.pace .pace-progress[data-progress-text="19%"]:after { right: -164.66px } +.pace .pace-progress[data-progress-text="20%"]:after { right: -162.8px } +.pace .pace-progress[data-progress-text="21%"]:after { right: -160.94px } +.pace .pace-progress[data-progress-text="22%"]:after { right: -159.08px } +.pace .pace-progress[data-progress-text="23%"]:after { right: -157.22px } +.pace .pace-progress[data-progress-text="24%"]:after { right: -155.36px } +.pace .pace-progress[data-progress-text="25%"]:after { right: -153.5px } +.pace .pace-progress[data-progress-text="26%"]:after { right: -151.64px } +.pace .pace-progress[data-progress-text="27%"]:after { right: -149.78px } +.pace .pace-progress[data-progress-text="28%"]:after { right: -147.92px } +.pace .pace-progress[data-progress-text="29%"]:after { right: -146.06px } +.pace .pace-progress[data-progress-text="30%"]:after { right: -144.2px } +.pace .pace-progress[data-progress-text="31%"]:after { right: -142.34px } +.pace .pace-progress[data-progress-text="32%"]:after { right: -140.48px } +.pace .pace-progress[data-progress-text="33%"]:after { right: -138.62px } +.pace .pace-progress[data-progress-text="34%"]:after { right: -136.76px } +.pace .pace-progress[data-progress-text="35%"]:after { right: -134.9px } +.pace .pace-progress[data-progress-text="36%"]:after { right: -133.04px } +.pace .pace-progress[data-progress-text="37%"]:after { right: -131.18px } +.pace .pace-progress[data-progress-text="38%"]:after { right: -129.32px } +.pace .pace-progress[data-progress-text="39%"]:after { right: -127.46px } +.pace .pace-progress[data-progress-text="40%"]:after { right: -125.6px } +.pace .pace-progress[data-progress-text="41%"]:after { right: -123.74px } +.pace .pace-progress[data-progress-text="42%"]:after { right: -121.88px } +.pace .pace-progress[data-progress-text="43%"]:after { right: -120.02px } +.pace .pace-progress[data-progress-text="44%"]:after { right: -118.16px } +.pace .pace-progress[data-progress-text="45%"]:after { right: -116.3px } +.pace .pace-progress[data-progress-text="46%"]:after { right: -114.44px } +.pace .pace-progress[data-progress-text="47%"]:after { right: -112.58px } +.pace .pace-progress[data-progress-text="48%"]:after { right: -110.72px } +.pace .pace-progress[data-progress-text="49%"]:after { right: -108.86px } +.pace .pace-progress[data-progress-text="50%"]:after { right: -107px } +.pace .pace-progress[data-progress-text="51%"]:after { right: -105.14px } +.pace .pace-progress[data-progress-text="52%"]:after { right: -103.28px } +.pace .pace-progress[data-progress-text="53%"]:after { right: -101.42px } +.pace .pace-progress[data-progress-text="54%"]:after { right: -99.56px } +.pace .pace-progress[data-progress-text="55%"]:after { right: -97.7px } +.pace .pace-progress[data-progress-text="56%"]:after { right: -95.84px } +.pace .pace-progress[data-progress-text="57%"]:after { right: -93.98px } +.pace .pace-progress[data-progress-text="58%"]:after { right: -92.12px } +.pace .pace-progress[data-progress-text="59%"]:after { right: -90.26px } +.pace .pace-progress[data-progress-text="60%"]:after { right: -88.4px } +.pace .pace-progress[data-progress-text="61%"]:after { right: -86.53999999999999px } +.pace .pace-progress[data-progress-text="62%"]:after { right: -84.68px } +.pace .pace-progress[data-progress-text="63%"]:after { right: -82.82px } +.pace .pace-progress[data-progress-text="64%"]:after { right: -80.96000000000001px } +.pace .pace-progress[data-progress-text="65%"]:after { right: -79.1px } +.pace .pace-progress[data-progress-text="66%"]:after { right: -77.24px } +.pace .pace-progress[data-progress-text="67%"]:after { right: -75.38px } +.pace .pace-progress[data-progress-text="68%"]:after { right: -73.52px } +.pace .pace-progress[data-progress-text="69%"]:after { right: -71.66px } +.pace .pace-progress[data-progress-text="70%"]:after { right: -69.8px } +.pace .pace-progress[data-progress-text="71%"]:after { right: -67.94px } +.pace .pace-progress[data-progress-text="72%"]:after { right: -66.08px } +.pace .pace-progress[data-progress-text="73%"]:after { right: -64.22px } +.pace .pace-progress[data-progress-text="74%"]:after { right: -62.36px } +.pace .pace-progress[data-progress-text="75%"]:after { right: -60.5px } +.pace .pace-progress[data-progress-text="76%"]:after { right: -58.64px } +.pace .pace-progress[data-progress-text="77%"]:after { right: -56.78px } +.pace .pace-progress[data-progress-text="78%"]:after { right: -54.92px } +.pace .pace-progress[data-progress-text="79%"]:after { right: -53.06px } +.pace .pace-progress[data-progress-text="80%"]:after { right: -51.2px } +.pace .pace-progress[data-progress-text="81%"]:after { right: -49.34px } +.pace .pace-progress[data-progress-text="82%"]:after { right: -47.480000000000004px } +.pace .pace-progress[data-progress-text="83%"]:after { right: -45.62px } +.pace .pace-progress[data-progress-text="84%"]:after { right: -43.76px } +.pace .pace-progress[data-progress-text="85%"]:after { right: -41.9px } +.pace .pace-progress[data-progress-text="86%"]:after { right: -40.04px } +.pace .pace-progress[data-progress-text="87%"]:after { right: -38.18px } +.pace .pace-progress[data-progress-text="88%"]:after { right: -36.32px } +.pace .pace-progress[data-progress-text="89%"]:after { right: -34.46px } +.pace .pace-progress[data-progress-text="90%"]:after { right: -32.6px } +.pace .pace-progress[data-progress-text="91%"]:after { right: -30.740000000000002px } +.pace .pace-progress[data-progress-text="92%"]:after { right: -28.880000000000003px } +.pace .pace-progress[data-progress-text="93%"]:after { right: -27.02px } +.pace .pace-progress[data-progress-text="94%"]:after { right: -25.16px } +.pace .pace-progress[data-progress-text="95%"]:after { right: -23.3px } +.pace .pace-progress[data-progress-text="96%"]:after { right: -21.439999999999998px } +.pace .pace-progress[data-progress-text="97%"]:after { right: -19.58px } +.pace .pace-progress[data-progress-text="98%"]:after { right: -17.72px } +.pace .pace-progress[data-progress-text="99%"]:after { right: -15.86px } +.pace .pace-progress[data-progress-text="100%"]:after { right: -14px } + + +.pace .pace-activity { + position: absolute; + width: 100%; + height: 28px; + z-index: 2001; + box-shadow: inset 0 0 0 2px #ffffff, inset 0 0 0 7px #FFF; + border-radius: 10px; +} + +.pace.pace-inactive { + display: none; +} diff --git a/public/bower_components/PACE/themes/white/pace-theme-mac-osx.css b/public/bower_components/PACE/themes/white/pace-theme-mac-osx.css new file mode 100755 index 0000000..a7c27e7 --- /dev/null +++ b/public/bower_components/PACE/themes/white/pace-theme-mac-osx.css @@ -0,0 +1,87 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + overflow: hidden; + position: fixed; + top: 0; + left: 0; + z-index: 2000; + width: 100%; + height: 12px; + background: #fff; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: #CCCCCC; + position: fixed; + top: 0; + right: 100%; + width: 100%; + height: 12px; + overflow: hidden; + + -webkit-border-radius: 0 0 4px 0; + -moz-border-radius: 0 0 4px 0; + -o-border-radius: 0 0 4px 0; + border-radius: 0 0 4px 0; + + -webkit-box-shadow: inset -1px 0 #808080, inset 0 -1px #808080, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + -moz-box-shadow: inset -1px 0 #808080, inset 0 -1px #808080, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + -o-box-shadow: inset -1px 0 #808080, inset 0 -1px #808080, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + box-shadow: inset -1px 0 #808080, inset 0 -1px #808080, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); +} + +.pace .pace-activity { + position: fixed; + top: 0; + left: 0; + right: -28px; + bottom: 0; + + -webkit-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + -moz-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + -o-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + + -webkit-background-size: 28px 100%; + -moz-background-size: 28px 100%; + -o-background-size: 28px 100%; + background-size: 28px 100%; + + -webkit-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -moz-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -ms-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -o-animation: pace-theme-mac-osx-motion 500ms linear infinite; + animation: pace-theme-mac-osx-motion 500ms linear infinite; +} + +@-webkit-keyframes pace-theme-mac-osx-motion { + 0% { -webkit-transform: none; transform: none; } + 100% { -webkit-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-moz-keyframes pace-theme-mac-osx-motion { + 0% { -moz-transform: none; transform: none; } + 100% { -moz-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-o-keyframes pace-theme-mac-osx-motion { + 0% { -o-transform: none; transform: none; } + 100% { -o-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-ms-keyframes pace-theme-mac-osx-motion { + 0% { -ms-transform: none; transform: none; } + 100% { -ms-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@keyframes pace-theme-mac-osx-motion { + 0% { transform: none; transform: none; } + 100% { transform: translate(-28px, 0); transform: translate(-28px, 0); } +} diff --git a/public/bower_components/PACE/themes/white/pace-theme-minimal.css b/public/bower_components/PACE/themes/white/pace-theme-minimal.css new file mode 100755 index 0000000..25c203a --- /dev/null +++ b/public/bower_components/PACE/themes/white/pace-theme-minimal.css @@ -0,0 +1,23 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background: #ffffff; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 2px; +} diff --git a/public/bower_components/PACE/themes/yellow/pace-theme-barber-shop.css b/public/bower_components/PACE/themes/yellow/pace-theme-barber-shop.css new file mode 100755 index 0000000..34b89dd --- /dev/null +++ b/public/bower_components/PACE/themes/yellow/pace-theme-barber-shop.css @@ -0,0 +1,83 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + overflow: hidden; + position: fixed; + top: 0; + left: 0; + z-index: 2000; + width: 100%; + height: 12px; + background: #fff; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: #fcd25a; + position: fixed; + top: 0; + bottom: 0; + right: 100%; + width: 100%; + overflow: hidden; +} + +.pace .pace-activity { + position: fixed; + top: 0; + right: -32px; + bottom: 0; + left: 0; + + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.2)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.2)), color-stop(0.75, rgba(255, 255, 255, 0.2)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + -webkit-background-size: 32px 32px; + -moz-background-size: 32px 32px; + -o-background-size: 32px 32px; + background-size: 32px 32px; + + -webkit-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -moz-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -ms-animation: pace-theme-barber-shop-motion 500ms linear infinite; + -o-animation: pace-theme-barber-shop-motion 500ms linear infinite; + animation: pace-theme-barber-shop-motion 500ms linear infinite; +} + +@-webkit-keyframes pace-theme-barber-shop-motion { + 0% { -webkit-transform: none; transform: none; } + 100% { -webkit-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-moz-keyframes pace-theme-barber-shop-motion { + 0% { -moz-transform: none; transform: none; } + 100% { -moz-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-o-keyframes pace-theme-barber-shop-motion { + 0% { -o-transform: none; transform: none; } + 100% { -o-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@-ms-keyframes pace-theme-barber-shop-motion { + 0% { -ms-transform: none; transform: none; } + 100% { -ms-transform: translate(-32px, 0); transform: translate(-32px, 0); } +} +@keyframes pace-theme-barber-shop-motion { + 0% { transform: none; transform: none; } + 100% { transform: translate(-32px, 0); transform: translate(-32px, 0); } +} diff --git a/public/bower_components/PACE/themes/yellow/pace-theme-big-counter.css b/public/bower_components/PACE/themes/yellow/pace-theme-big-counter.css new file mode 100755 index 0000000..bb5f529 --- /dev/null +++ b/public/bower_components/PACE/themes/yellow/pace-theme-big-counter.css @@ -0,0 +1,40 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace.pace-inactive .pace-progress { + display: none; +} + +.pace .pace-progress { + position: fixed; + z-index: 2000; + top: 0; + right: 0; + height: 5rem; + width: 5rem; + + -webkit-transform: translate3d(0, 0, 0) !important; + -ms-transform: translate3d(0, 0, 0) !important; + transform: translate3d(0, 0, 0) !important; +} + +.pace .pace-progress:after { + display: block; + position: absolute; + top: 0; + right: .5rem; + content: attr(data-progress-text); + font-family: "Helvetica Neue", sans-serif; + font-weight: 100; + font-size: 5rem; + line-height: 1; + text-align: right; + color: rgba(252, 210, 90, 0.19999999999999996); +} diff --git a/public/bower_components/PACE/themes/yellow/pace-theme-bounce.css b/public/bower_components/PACE/themes/yellow/pace-theme-bounce.css new file mode 100755 index 0000000..e1707bc --- /dev/null +++ b/public/bower_components/PACE/themes/yellow/pace-theme-bounce.css @@ -0,0 +1,231 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + width: 140px; + height: 300px; + position: fixed; + top: -90px; + right: -20px; + z-index: 2000; + -webkit-transform: scale(0); + -moz-transform: scale(0); + -ms-transform: scale(0); + -o-transform: scale(0); + transform: scale(0); + opacity: 0; + -webkit-transition: all 2s linear 0s; + -moz-transition: all 2s linear 0s; + transition: all 2s linear 0s; +} + +.pace.pace-active { + -webkit-transform: scale(.25); + -moz-transform: scale(.25); + -ms-transform: scale(.25); + -o-transform: scale(.25); + transform: scale(.25); + opacity: 1; +} + +.pace .pace-activity { + width: 140px; + height: 140px; + border-radius: 70px; + background: #fcd25a; + position: absolute; + top: 0; + z-index: 1911; + -webkit-animation: pace-bounce 1s infinite; + -moz-animation: pace-bounce 1s infinite; + -o-animation: pace-bounce 1s infinite; + -ms-animation: pace-bounce 1s infinite; + animation: pace-bounce 1s infinite; +} + +.pace .pace-progress { + position: absolute; + display: block; + left: 50%; + bottom: 0; + z-index: 1910; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -webkit-transform: scaleY(.3) !important; + -moz-transform: scaleY(.3) !important; + -ms-transform: scaleY(.3) !important; + -o-transform: scaleY(.3) !important; + transform: scaleY(.3) !important; + -webkit-animation: pace-compress .5s infinite alternate; + -moz-animation: pace-compress .5s infinite alternate; + -o-animation: pace-compress .5s infinite alternate; + -ms-animation: pace-compress .5s infinite alternate; + animation: pace-compress .5s infinite alternate; +} + +@-webkit-keyframes pace-bounce { + 0% { + top: 0; + -webkit-animation-timing-function: ease-in; + } + 40% {} + 50% { + top: 140px; + height: 140px; + -webkit-animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + -webkit-animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + -webkit-animation-timing-function: ease-out; + } + 95% { + top: 0; + -webkit-animation-timing-function: ease-in; + } + 100% { + top: 0; + -webkit-animation-timing-function: ease-in; + } +} + +@-moz-keyframes pace-bounce { + 0% { + top: 0; + -moz-animation-timing-function: ease-in; + } + 40% {} + 50% { + top: 140px; + height: 140px; + -moz-animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + -moz-animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + -moz-animation-timing-function: ease-out;} + 95% { + top: 0; + -moz-animation-timing-function: ease-in; + } + 100% {top: 0; + -moz-animation-timing-function: ease-in; + } +} + +@keyframes pace-bounce { + 0% { + top: 0; + animation-timing-function: ease-in; + } + 50% { + top: 140px; + height: 140px; + animation-timing-function: ease-out; + } + 55% { + top: 160px; + height: 120px; + border-radius: 70px / 60px; + animation-timing-function: ease-in; + } + 65% { + top: 120px; + height: 140px; + border-radius: 70px; + animation-timing-function: ease-out; + } + 95% { + top: 0; + animation-timing-function: ease-in; + } + 100% { + top: 0; + animation-timing-function: ease-in; + } +} + +@-webkit-keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -webkit-animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + -webkit-animation-timing-function: ease-out; + } +} + +@-moz-keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + -moz-animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + -moz-animation-timing-function: ease-out; + } +} + +@keyframes pace-compress { + 0% { + bottom: 0; + margin-left: -30px; + width: 60px; + height: 75px; + background: rgba(20, 20, 20, .1); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .1); + border-radius: 30px / 40px; + animation-timing-function: ease-in; + } + 100% { + bottom: 30px; + margin-left: -10px; + width: 20px; + height: 5px; + background: rgba(20, 20, 20, .3); + box-shadow: 0 0 20px 35px rgba(20, 20, 20, .3); + border-radius: 20px / 20px; + animation-timing-function: ease-out; + } +} \ No newline at end of file diff --git a/public/bower_components/PACE/themes/yellow/pace-theme-center-atom.css b/public/bower_components/PACE/themes/yellow/pace-theme-center-atom.css new file mode 100755 index 0000000..fe16659 --- /dev/null +++ b/public/bower_components/PACE/themes/yellow/pace-theme-center-atom.css @@ -0,0 +1,131 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace.pace-inactive { + display: none; +} + +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + height: 60px; + width: 100px; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace .pace-progress { + z-index: 2000; + position: absolute; + height: 60px; + width: 100px; + + -webkit-transform: translate3d(0, 0, 0) !important; + -ms-transform: translate3d(0, 0, 0) !important; + transform: translate3d(0, 0, 0) !important; +} + +.pace .pace-progress:before { + content: attr(data-progress-text); + text-align: center; + color: #fff; + background: #fcd25a; + border-radius: 50%; + font-family: "Helvetica Neue", sans-serif; + font-size: 14px; + font-weight: 100; + line-height: 1; + padding: 20% 0 7px; + width: 50%; + height: 40%; + margin: 10px 0 0 30px; + display: block; + z-index: 999; + position: absolute; +} + +.pace .pace-activity { + font-size: 15px; + line-height: 1; + z-index: 2000; + position: absolute; + height: 60px; + width: 100px; + + display: block; + -webkit-animation: pace-theme-center-atom-spin 2s linear infinite; + -moz-animation: pace-theme-center-atom-spin 2s linear infinite; + -o-animation: pace-theme-center-atom-spin 2s linear infinite; + animation: pace-theme-center-atom-spin 2s linear infinite; +} + +.pace .pace-activity { + border-radius: 50%; + border: 5px solid #fcd25a; + content: ' '; + display: block; + position: absolute; + top: 0; + left: 0; + height: 60px; + width: 100px; +} + +.pace .pace-activity:after { + border-radius: 50%; + border: 5px solid #fcd25a; + content: ' '; + display: block; + position: absolute; + top: -5px; + left: -5px; + height: 60px; + width: 100px; + + -webkit-transform: rotate(60deg); + -moz-transform: rotate(60deg); + -o-transform: rotate(60deg); + transform: rotate(60deg); +} + +.pace .pace-activity:before { + border-radius: 50%; + border: 5px solid #fcd25a; + content: ' '; + display: block; + position: absolute; + top: -5px; + left: -5px; + height: 60px; + width: 100px; + + -webkit-transform: rotate(120deg); + -moz-transform: rotate(120deg); + -o-transform: rotate(120deg); + transform: rotate(120deg); +} + +@-webkit-keyframes pace-theme-center-atom-spin { + 0% { -webkit-transform: rotate(0deg) } + 100% { -webkit-transform: rotate(359deg) } +} +@-moz-keyframes pace-theme-center-atom-spin { + 0% { -moz-transform: rotate(0deg) } + 100% { -moz-transform: rotate(359deg) } +} +@-o-keyframes pace-theme-center-atom-spin { + 0% { -o-transform: rotate(0deg) } + 100% { -o-transform: rotate(359deg) } +} +@keyframes pace-theme-center-atom-spin { + 0% { transform: rotate(0deg) } + 100% { transform: rotate(359deg) } +} diff --git a/public/bower_components/PACE/themes/yellow/pace-theme-center-circle.css b/public/bower_components/PACE/themes/yellow/pace-theme-center-circle.css new file mode 100755 index 0000000..bbda8bf --- /dev/null +++ b/public/bower_components/PACE/themes/yellow/pace-theme-center-circle.css @@ -0,0 +1,90 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + -webkit-perspective: 12rem; + -moz-perspective: 12rem; + -ms-perspective: 12rem; + -o-perspective: 12rem; + perspective: 12rem; + + z-index: 2000; + position: fixed; + height: 6rem; + width: 6rem; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace.pace-inactive .pace-progress { + display: none; +} + +.pace .pace-progress { + position: fixed; + z-index: 2000; + display: block; + position: absolute; + left: 0; + top: 0; + height: 6rem; + width: 6rem !important; + line-height: 6rem; + font-size: 2rem; + border-radius: 50%; + background: rgba(252, 210, 90, 0.8); + color: #fff; + font-family: "Helvetica Neue", sans-serif; + font-weight: 100; + text-align: center; + + -webkit-animation: pace-theme-center-circle-spin linear infinite 2s; + -moz-animation: pace-theme-center-circle-spin linear infinite 2s; + -ms-animation: pace-theme-center-circle-spin linear infinite 2s; + -o-animation: pace-theme-center-circle-spin linear infinite 2s; + animation: pace-theme-center-circle-spin linear infinite 2s; + + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + -ms-transform-style: preserve-3d; + -o-transform-style: preserve-3d; + transform-style: preserve-3d; +} + +.pace .pace-progress:after { + content: attr(data-progress-text); + display: block; +} + +@-webkit-keyframes pace-theme-center-circle-spin { + from { -webkit-transform: rotateY(0deg) } + to { -webkit-transform: rotateY(360deg) } +} + +@-moz-keyframes pace-theme-center-circle-spin { + from { -moz-transform: rotateY(0deg) } + to { -moz-transform: rotateY(360deg) } +} + +@-ms-keyframes pace-theme-center-circle-spin { + from { -ms-transform: rotateY(0deg) } + to { -ms-transform: rotateY(360deg) } +} + +@-o-keyframes pace-theme-center-circle-spin { + from { -o-transform: rotateY(0deg) } + to { -o-transform: rotateY(360deg) } +} + +@keyframes pace-theme-center-circle-spin { + from { transform: rotateY(0deg) } + to { transform: rotateY(360deg) } +} diff --git a/public/bower_components/PACE/themes/yellow/pace-theme-center-radar.css b/public/bower_components/PACE/themes/yellow/pace-theme-center-radar.css new file mode 100755 index 0000000..3259336 --- /dev/null +++ b/public/bower_components/PACE/themes/yellow/pace-theme-center-radar.css @@ -0,0 +1,74 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + height: 90px; + width: 90px; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pace.pace-inactive .pace-activity { + display: none; +} + +.pace .pace-activity { + position: fixed; + z-index: 2000; + display: block; + position: absolute; + left: -30px; + top: -30px; + height: 90px; + width: 90px; + display: block; + border-width: 30px; + border-style: double; + border-color: #fcd25a transparent transparent; + border-radius: 50%; + + -webkit-animation: spin 1s linear infinite; + -moz-animation: spin 1s linear infinite; + -o-animation: spin 1s linear infinite; + animation: spin 1s linear infinite; +} + +.pace .pace-activity:before { + content: ' '; + position: absolute; + top: 10px; + left: 10px; + height: 50px; + width: 50px; + display: block; + border-width: 10px; + border-style: solid; + border-color: #fcd25a transparent transparent; + border-radius: 50%; +} + +@-webkit-keyframes spin { + 100% { -webkit-transform: rotate(359deg); } +} + +@-moz-keyframes spin { + 100% { -moz-transform: rotate(359deg); } +} + +@-o-keyframes spin { + 100% { -moz-transform: rotate(359deg); } +} + +@keyframes spin { + 100% { transform: rotate(359deg); } +} diff --git a/public/bower_components/PACE/themes/yellow/pace-theme-center-simple.css b/public/bower_components/PACE/themes/yellow/pace-theme-center-simple.css new file mode 100755 index 0000000..93b6f37 --- /dev/null +++ b/public/bower_components/PACE/themes/yellow/pace-theme-center-simple.css @@ -0,0 +1,52 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + z-index: 2000; + position: fixed; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; + height: 5px; + width: 200px; + background: #fff; + border: 1px solid #fcd25a; + + overflow: hidden; +} + +.pace .pace-progress { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + max-width: 200px; + position: fixed; + z-index: 2000; + display: block; + position: absolute; + top: 0; + right: 100%; + height: 100%; + width: 100%; + background: #fcd25a; +} + +.pace.pace-inactive { + display: none; +} \ No newline at end of file diff --git a/public/bower_components/PACE/themes/yellow/pace-theme-corner-indicator.css b/public/bower_components/PACE/themes/yellow/pace-theme-corner-indicator.css new file mode 100755 index 0000000..8276189 --- /dev/null +++ b/public/bower_components/PACE/themes/yellow/pace-theme-corner-indicator.css @@ -0,0 +1,73 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace .pace-activity { + display: block; + position: fixed; + z-index: 2000; + top: 0; + right: 0; + width: 300px; + height: 300px; + background: #fcd25a; + -webkit-transition: -webkit-transform 0.3s; + transition: transform 0.3s; + -webkit-transform: translateX(100%) translateY(-100%) rotate(45deg); + transform: translateX(100%) translateY(-100%) rotate(45deg); + pointer-events: none; +} + +.pace.pace-active .pace-activity { + -webkit-transform: translateX(50%) translateY(-50%) rotate(45deg); + transform: translateX(50%) translateY(-50%) rotate(45deg); +} + +.pace .pace-activity::before, +.pace .pace-activity::after { + -moz-box-sizing: border-box; + box-sizing: border-box; + position: absolute; + bottom: 30px; + left: 50%; + display: block; + border: 5px solid #fff; + border-radius: 50%; + content: ''; +} + +.pace .pace-activity::before { + margin-left: -40px; + width: 80px; + height: 80px; + border-right-color: rgba(0, 0, 0, .2); + border-left-color: rgba(0, 0, 0, .2); + -webkit-animation: pace-theme-corner-indicator-spin 3s linear infinite; + animation: pace-theme-corner-indicator-spin 3s linear infinite; +} + +.pace .pace-activity::after { + bottom: 50px; + margin-left: -20px; + width: 40px; + height: 40px; + border-top-color: rgba(0, 0, 0, .2); + border-bottom-color: rgba(0, 0, 0, .2); + -webkit-animation: pace-theme-corner-indicator-spin 1s linear infinite; + animation: pace-theme-corner-indicator-spin 1s linear infinite; +} + +@-webkit-keyframes pace-theme-corner-indicator-spin { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(359deg); } +} +@keyframes pace-theme-corner-indicator-spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(359deg); } +} diff --git a/public/bower_components/PACE/themes/yellow/pace-theme-fill-left.css b/public/bower_components/PACE/themes/yellow/pace-theme-fill-left.css new file mode 100755 index 0000000..03a2333 --- /dev/null +++ b/public/bower_components/PACE/themes/yellow/pace-theme-fill-left.css @@ -0,0 +1,22 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: rgba(252, 210, 90, 0.19999999999999996); + position: fixed; + z-index: -1; + top: 0; + right: 100%; + bottom: 0; + width: 100%; +} diff --git a/public/bower_components/PACE/themes/yellow/pace-theme-flash.css b/public/bower_components/PACE/themes/yellow/pace-theme-flash.css new file mode 100755 index 0000000..4c01ddf --- /dev/null +++ b/public/bower_components/PACE/themes/yellow/pace-theme-flash.css @@ -0,0 +1,77 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background: #fcd25a; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 2px; +} + +.pace .pace-progress-inner { + display: block; + position: absolute; + right: 0px; + width: 100px; + height: 100%; + box-shadow: 0 0 10px #fcd25a, 0 0 5px #fcd25a; + opacity: 1.0; + -webkit-transform: rotate(3deg) translate(0px, -4px); + -moz-transform: rotate(3deg) translate(0px, -4px); + -ms-transform: rotate(3deg) translate(0px, -4px); + -o-transform: rotate(3deg) translate(0px, -4px); + transform: rotate(3deg) translate(0px, -4px); +} + +.pace .pace-activity { + display: block; + position: fixed; + z-index: 2000; + top: 15px; + right: 15px; + width: 14px; + height: 14px; + border: solid 2px transparent; + border-top-color: #fcd25a; + border-left-color: #fcd25a; + border-radius: 10px; + -webkit-animation: pace-spinner 400ms linear infinite; + -moz-animation: pace-spinner 400ms linear infinite; + -ms-animation: pace-spinner 400ms linear infinite; + -o-animation: pace-spinner 400ms linear infinite; + animation: pace-spinner 400ms linear infinite; +} + +@-webkit-keyframes pace-spinner { + 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } +} +@-moz-keyframes pace-spinner { + 0% { -moz-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -moz-transform: rotate(360deg); transform: rotate(360deg); } +} +@-o-keyframes pace-spinner { + 0% { -o-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -o-transform: rotate(360deg); transform: rotate(360deg); } +} +@-ms-keyframes pace-spinner { + 0% { -ms-transform: rotate(0deg); transform: rotate(0deg); } + 100% { -ms-transform: rotate(360deg); transform: rotate(360deg); } +} +@keyframes pace-spinner { + 0% { transform: rotate(0deg); transform: rotate(0deg); } + 100% { transform: rotate(360deg); transform: rotate(360deg); } +} diff --git a/public/bower_components/PACE/themes/yellow/pace-theme-flat-top.css b/public/bower_components/PACE/themes/yellow/pace-theme-flat-top.css new file mode 100755 index 0000000..b2efa0f --- /dev/null +++ b/public/bower_components/PACE/themes/yellow/pace-theme-flat-top.css @@ -0,0 +1,41 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + position: fixed; + top: 0; + left: 0; + width: 100%; + + -webkit-transform: translate3d(0, -50px, 0); + -ms-transform: translate3d(0, -50px, 0); + transform: translate3d(0, -50px, 0); + + -webkit-transition: -webkit-transform .5s ease-out; + -ms-transition: -webkit-transform .5s ease-out; + transition: transform .5s ease-out; +} + +.pace.pace-active { + -webkit-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} + +.pace .pace-progress { + display: block; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 10px; + background: #fcd25a; + + pointer-events: none; +} diff --git a/public/bower_components/PACE/themes/yellow/pace-theme-loading-bar.css b/public/bower_components/PACE/themes/yellow/pace-theme-loading-bar.css new file mode 100755 index 0000000..43bb98d --- /dev/null +++ b/public/bower_components/PACE/themes/yellow/pace-theme-loading-bar.css @@ -0,0 +1,198 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; + + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + z-index: 2000; + position: fixed; + margin: auto; + top: 12px; + left: 0; + right: 0; + bottom: 0; + width: 200px; + height: 50px; + overflow: hidden; +} + +.pace .pace-progress { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + display: block; + position: absolute; + right: 100%; + margin-right: -7px; + width: 93%; + top: 7px; + height: 14px; + font-size: 12px; + background: #fcd25a; + color: #fcd25a; + line-height: 60px; + font-weight: bold; + font-family: Helvetica, Arial, "Lucida Grande", sans-serif; + + -webkit-box-shadow: 120px 0 #fff, 240px 0 #fff; + -ms-box-shadow: 120px 0 #fff, 240px 0 #fff; + box-shadow: 120px 0 #fff, 240px 0 #fff; +} + +.pace .pace-progress:after { + content: attr(data-progress-text); + display: inline-block; + position: fixed; + width: 45px; + text-align: right; + right: 0; + padding-right: 16px; + top: 4px; +} + +.pace .pace-progress[data-progress-text="0%"]:after { right: -200px } +.pace .pace-progress[data-progress-text="1%"]:after { right: -198.14px } +.pace .pace-progress[data-progress-text="2%"]:after { right: -196.28px } +.pace .pace-progress[data-progress-text="3%"]:after { right: -194.42px } +.pace .pace-progress[data-progress-text="4%"]:after { right: -192.56px } +.pace .pace-progress[data-progress-text="5%"]:after { right: -190.7px } +.pace .pace-progress[data-progress-text="6%"]:after { right: -188.84px } +.pace .pace-progress[data-progress-text="7%"]:after { right: -186.98px } +.pace .pace-progress[data-progress-text="8%"]:after { right: -185.12px } +.pace .pace-progress[data-progress-text="9%"]:after { right: -183.26px } +.pace .pace-progress[data-progress-text="10%"]:after { right: -181.4px } +.pace .pace-progress[data-progress-text="11%"]:after { right: -179.54px } +.pace .pace-progress[data-progress-text="12%"]:after { right: -177.68px } +.pace .pace-progress[data-progress-text="13%"]:after { right: -175.82px } +.pace .pace-progress[data-progress-text="14%"]:after { right: -173.96px } +.pace .pace-progress[data-progress-text="15%"]:after { right: -172.1px } +.pace .pace-progress[data-progress-text="16%"]:after { right: -170.24px } +.pace .pace-progress[data-progress-text="17%"]:after { right: -168.38px } +.pace .pace-progress[data-progress-text="18%"]:after { right: -166.52px } +.pace .pace-progress[data-progress-text="19%"]:after { right: -164.66px } +.pace .pace-progress[data-progress-text="20%"]:after { right: -162.8px } +.pace .pace-progress[data-progress-text="21%"]:after { right: -160.94px } +.pace .pace-progress[data-progress-text="22%"]:after { right: -159.08px } +.pace .pace-progress[data-progress-text="23%"]:after { right: -157.22px } +.pace .pace-progress[data-progress-text="24%"]:after { right: -155.36px } +.pace .pace-progress[data-progress-text="25%"]:after { right: -153.5px } +.pace .pace-progress[data-progress-text="26%"]:after { right: -151.64px } +.pace .pace-progress[data-progress-text="27%"]:after { right: -149.78px } +.pace .pace-progress[data-progress-text="28%"]:after { right: -147.92px } +.pace .pace-progress[data-progress-text="29%"]:after { right: -146.06px } +.pace .pace-progress[data-progress-text="30%"]:after { right: -144.2px } +.pace .pace-progress[data-progress-text="31%"]:after { right: -142.34px } +.pace .pace-progress[data-progress-text="32%"]:after { right: -140.48px } +.pace .pace-progress[data-progress-text="33%"]:after { right: -138.62px } +.pace .pace-progress[data-progress-text="34%"]:after { right: -136.76px } +.pace .pace-progress[data-progress-text="35%"]:after { right: -134.9px } +.pace .pace-progress[data-progress-text="36%"]:after { right: -133.04px } +.pace .pace-progress[data-progress-text="37%"]:after { right: -131.18px } +.pace .pace-progress[data-progress-text="38%"]:after { right: -129.32px } +.pace .pace-progress[data-progress-text="39%"]:after { right: -127.46px } +.pace .pace-progress[data-progress-text="40%"]:after { right: -125.6px } +.pace .pace-progress[data-progress-text="41%"]:after { right: -123.74px } +.pace .pace-progress[data-progress-text="42%"]:after { right: -121.88px } +.pace .pace-progress[data-progress-text="43%"]:after { right: -120.02px } +.pace .pace-progress[data-progress-text="44%"]:after { right: -118.16px } +.pace .pace-progress[data-progress-text="45%"]:after { right: -116.3px } +.pace .pace-progress[data-progress-text="46%"]:after { right: -114.44px } +.pace .pace-progress[data-progress-text="47%"]:after { right: -112.58px } +.pace .pace-progress[data-progress-text="48%"]:after { right: -110.72px } +.pace .pace-progress[data-progress-text="49%"]:after { right: -108.86px } +.pace .pace-progress[data-progress-text="50%"]:after { right: -107px } +.pace .pace-progress[data-progress-text="51%"]:after { right: -105.14px } +.pace .pace-progress[data-progress-text="52%"]:after { right: -103.28px } +.pace .pace-progress[data-progress-text="53%"]:after { right: -101.42px } +.pace .pace-progress[data-progress-text="54%"]:after { right: -99.56px } +.pace .pace-progress[data-progress-text="55%"]:after { right: -97.7px } +.pace .pace-progress[data-progress-text="56%"]:after { right: -95.84px } +.pace .pace-progress[data-progress-text="57%"]:after { right: -93.98px } +.pace .pace-progress[data-progress-text="58%"]:after { right: -92.12px } +.pace .pace-progress[data-progress-text="59%"]:after { right: -90.26px } +.pace .pace-progress[data-progress-text="60%"]:after { right: -88.4px } +.pace .pace-progress[data-progress-text="61%"]:after { right: -86.53999999999999px } +.pace .pace-progress[data-progress-text="62%"]:after { right: -84.68px } +.pace .pace-progress[data-progress-text="63%"]:after { right: -82.82px } +.pace .pace-progress[data-progress-text="64%"]:after { right: -80.96000000000001px } +.pace .pace-progress[data-progress-text="65%"]:after { right: -79.1px } +.pace .pace-progress[data-progress-text="66%"]:after { right: -77.24px } +.pace .pace-progress[data-progress-text="67%"]:after { right: -75.38px } +.pace .pace-progress[data-progress-text="68%"]:after { right: -73.52px } +.pace .pace-progress[data-progress-text="69%"]:after { right: -71.66px } +.pace .pace-progress[data-progress-text="70%"]:after { right: -69.8px } +.pace .pace-progress[data-progress-text="71%"]:after { right: -67.94px } +.pace .pace-progress[data-progress-text="72%"]:after { right: -66.08px } +.pace .pace-progress[data-progress-text="73%"]:after { right: -64.22px } +.pace .pace-progress[data-progress-text="74%"]:after { right: -62.36px } +.pace .pace-progress[data-progress-text="75%"]:after { right: -60.5px } +.pace .pace-progress[data-progress-text="76%"]:after { right: -58.64px } +.pace .pace-progress[data-progress-text="77%"]:after { right: -56.78px } +.pace .pace-progress[data-progress-text="78%"]:after { right: -54.92px } +.pace .pace-progress[data-progress-text="79%"]:after { right: -53.06px } +.pace .pace-progress[data-progress-text="80%"]:after { right: -51.2px } +.pace .pace-progress[data-progress-text="81%"]:after { right: -49.34px } +.pace .pace-progress[data-progress-text="82%"]:after { right: -47.480000000000004px } +.pace .pace-progress[data-progress-text="83%"]:after { right: -45.62px } +.pace .pace-progress[data-progress-text="84%"]:after { right: -43.76px } +.pace .pace-progress[data-progress-text="85%"]:after { right: -41.9px } +.pace .pace-progress[data-progress-text="86%"]:after { right: -40.04px } +.pace .pace-progress[data-progress-text="87%"]:after { right: -38.18px } +.pace .pace-progress[data-progress-text="88%"]:after { right: -36.32px } +.pace .pace-progress[data-progress-text="89%"]:after { right: -34.46px } +.pace .pace-progress[data-progress-text="90%"]:after { right: -32.6px } +.pace .pace-progress[data-progress-text="91%"]:after { right: -30.740000000000002px } +.pace .pace-progress[data-progress-text="92%"]:after { right: -28.880000000000003px } +.pace .pace-progress[data-progress-text="93%"]:after { right: -27.02px } +.pace .pace-progress[data-progress-text="94%"]:after { right: -25.16px } +.pace .pace-progress[data-progress-text="95%"]:after { right: -23.3px } +.pace .pace-progress[data-progress-text="96%"]:after { right: -21.439999999999998px } +.pace .pace-progress[data-progress-text="97%"]:after { right: -19.58px } +.pace .pace-progress[data-progress-text="98%"]:after { right: -17.72px } +.pace .pace-progress[data-progress-text="99%"]:after { right: -15.86px } +.pace .pace-progress[data-progress-text="100%"]:after { right: -14px } + + +.pace .pace-activity { + position: absolute; + width: 100%; + height: 28px; + z-index: 2001; + box-shadow: inset 0 0 0 2px #fcd25a, inset 0 0 0 7px #FFF; + border-radius: 10px; +} + +.pace.pace-inactive { + display: none; +} diff --git a/public/bower_components/PACE/themes/yellow/pace-theme-mac-osx.css b/public/bower_components/PACE/themes/yellow/pace-theme-mac-osx.css new file mode 100755 index 0000000..ae0fa67 --- /dev/null +++ b/public/bower_components/PACE/themes/yellow/pace-theme-mac-osx.css @@ -0,0 +1,87 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + + overflow: hidden; + position: fixed; + top: 0; + left: 0; + z-index: 2000; + width: 100%; + height: 12px; + background: #fff; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background-color: #FFE000; + position: fixed; + top: 0; + right: 100%; + width: 100%; + height: 12px; + overflow: hidden; + + -webkit-border-radius: 0 0 4px 0; + -moz-border-radius: 0 0 4px 0; + -o-border-radius: 0 0 4px 0; + border-radius: 0 0 4px 0; + + -webkit-box-shadow: inset -1px 0 #E49900, inset 0 -1px #E49900, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + -moz-box-shadow: inset -1px 0 #E49900, inset 0 -1px #E49900, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + -o-box-shadow: inset -1px 0 #E49900, inset 0 -1px #E49900, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); + box-shadow: inset -1px 0 #E49900, inset 0 -1px #E49900, inset 0 2px rgba(255, 255, 255, 0.5), inset 0 6px rgba(255, 255, 255, .3); +} + +.pace .pace-activity { + position: fixed; + top: 0; + left: 0; + right: -28px; + bottom: 0; + + -webkit-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + -moz-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + -o-background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + background-image: radial-gradient(rgba(255, 255, 255, .65) 0%, rgba(255, 255, 255, .15) 100%); + + -webkit-background-size: 28px 100%; + -moz-background-size: 28px 100%; + -o-background-size: 28px 100%; + background-size: 28px 100%; + + -webkit-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -moz-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -ms-animation: pace-theme-mac-osx-motion 500ms linear infinite; + -o-animation: pace-theme-mac-osx-motion 500ms linear infinite; + animation: pace-theme-mac-osx-motion 500ms linear infinite; +} + +@-webkit-keyframes pace-theme-mac-osx-motion { + 0% { -webkit-transform: none; transform: none; } + 100% { -webkit-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-moz-keyframes pace-theme-mac-osx-motion { + 0% { -moz-transform: none; transform: none; } + 100% { -moz-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-o-keyframes pace-theme-mac-osx-motion { + 0% { -o-transform: none; transform: none; } + 100% { -o-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@-ms-keyframes pace-theme-mac-osx-motion { + 0% { -ms-transform: none; transform: none; } + 100% { -ms-transform: translate(-28px, 0); transform: translate(-28px, 0); } +} +@keyframes pace-theme-mac-osx-motion { + 0% { transform: none; transform: none; } + 100% { transform: translate(-28px, 0); transform: translate(-28px, 0); } +} diff --git a/public/bower_components/PACE/themes/yellow/pace-theme-minimal.css b/public/bower_components/PACE/themes/yellow/pace-theme-minimal.css new file mode 100755 index 0000000..02b080c --- /dev/null +++ b/public/bower_components/PACE/themes/yellow/pace-theme-minimal.css @@ -0,0 +1,23 @@ +/* This is a compiled file, you should be editing the file in the templates directory */ +.pace { + -webkit-pointer-events: none; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background: #fcd25a; + position: fixed; + z-index: 2000; + top: 0; + right: 100%; + width: 100%; + height: 2px; +} diff --git a/public/bower_components/blueimp-gallery/.bower.json b/public/bower_components/blueimp-gallery/.bower.json new file mode 100755 index 0000000..587659c --- /dev/null +++ b/public/bower_components/blueimp-gallery/.bower.json @@ -0,0 +1,15 @@ +{ + "name": "blueimp-gallery", + "homepage": "https://github.com/blueimp/Gallery", + "version": "2.21.3", + "_release": "2.21.3", + "_resolution": { + "type": "version", + "tag": "v2.21.3", + "commit": "e876fc84061b9ccd8668d87cc1c496b226ef62ae" + }, + "_source": "https://github.com/blueimp/Gallery.git", + "_target": "^2.21.3", + "_originalSource": "blueimp-gallery", + "_direct": true +} \ No newline at end of file diff --git a/public/bower_components/blueimp-gallery/LICENSE.txt b/public/bower_components/blueimp-gallery/LICENSE.txt new file mode 100755 index 0000000..45cd380 --- /dev/null +++ b/public/bower_components/blueimp-gallery/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (C) 2013, 2016 Sebastian Tschan, https://blueimp.net + +The Swipe implementation is based on https://github.com/bradbirdsall/Swipe, +licensed also under the MIT license. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/public/bower_components/blueimp-gallery/README.md b/public/bower_components/blueimp-gallery/README.md new file mode 100755 index 0000000..354cdca --- /dev/null +++ b/public/bower_components/blueimp-gallery/README.md @@ -0,0 +1,1095 @@ +# blueimp Gallery + +- [Demo](#demo) +- [Description](#description) +- [Setup](#setup) + - [Lightbox setup](#lightbox-setup) + - [Controls](#controls) + - [Carousel setup](#carousel-setup) +- [Keyboard shortcuts](#keyboard-shortcuts) +- [Options](#options) + - [Default options](#default-options) + - [Event callbacks](#event-callbacks) + - [Carousel options](#carousel-options) + - [Indicator options](#indicator-options) + - [Fullscreen options](#fullscreen-options) + - [Video options](#video-options) + - [Video factory options](#video-factory-options) + - [YouTube options](#youtube-options) + - [Vimeo options](#vimeo-options) + - [Container and element options](#container-and-element-options) + - [Property options](#property-options) +- [API](#api) + - [Initialization](#initialization) + - [API methods](#api-methods) + - [Videos](#videos) + - [HTML5 video player](#html5-video-player) + - [Multiple video sources](#multiple-video-sources) + - [YouTube](#youtube) + - [Vimeo](#vimeo) + - [Additional Gallery elements](#additional-gallery-elements) + - [Additional content types](#additional-content-types) + - [Example HTML text factory implementation](#example-html-text-factory-implementation) + - [jQuery plugin](#jquery-plugin) + - [jQuery plugin setup](#jquery-plugin-setup) + - [HTML5 data-attributes](#html5-data-attributes) + - [Container ids and link grouping](#container-ids-and-link-grouping) + - [Gallery object](#gallery-object) + - [jQuery events](#jquery-events) +- [Requirements](#requirements) +- [Browsers](#browsers) + - [Desktop browsers](#desktop-browsers) + - [Mobile browsers](#mobile-browsers) +- [License](#license) +- [Credits](#credits) + +## Demo +[blueimp Gallery Demo](https://blueimp.github.io/Gallery/) + +## Description +blueimp Gallery is a touch-enabled, responsive and customizable image and video +gallery, carousel and lightbox, optimized for both mobile and desktop web +browsers. +It features swipe, mouse and keyboard navigation, transition effects, slideshow +functionality, fullscreen support and on-demand content loading and can be +extended to display additional content types. + +## Setup + +### Lightbox setup +Copy the **css**, **img** and **js** directories to your website. + +Include the Gallery stylesheet in the head section of your webpage: + +```html + +``` + +Add the following HTML snippet with the Gallery widget to the body of your +webpage: + +```html + + +``` + +Include the Gallery script at the bottom of the body of your webpage: + +```html + +``` + +Create a list of links to image files, optionally with enclosed thumbnails and +add them to the body of your webpage, before including the Gallery script: + +```html + +``` + +Add the following JavaScript code after including the Gallery script, to display +the images in the Gallery lightbox on click of the links: + +```html + +``` + +### Controls +To initialize the Gallery with visible controls, add the CSS class +**blueimp-gallery-controls** to the Gallery widget: + +```html + +``` + +### Carousel setup +To display the images in an inline carousel instead of a lightbox, follow the +[lightbox setup](#lightbox-setup) and add the CSS class +**blueimp-gallery-carousel** to the Gallery widget and remove the child element +with the **close** class, or add a new Gallery widget with a different **id** +to your webpage: + +```html + + +``` + +Add the following JavaScript code after including the Gallery script to +initialize the carousel: + +```html + +``` + +## Keyboard shortcuts +The Gallery can be controlled with the following keyboard shortcuts: + +* **Return**: Toggle controls visibility. +* **Esc**: Close the Gallery lightbox. +* **Space**: Toggle the slideshow (play/pause). +* **Left**: Move to the previous slide. +* **Right**: Move to the next slide. + +Please note that setting the **carousel** option to **true** disables the +keyboard shortcuts by default. + +## Options + +### Default options +The following are the default options set by the core Gallery library: + +```js +var options = { + // The Id, element or querySelector of the gallery widget: + container: '#blueimp-gallery', + // The tag name, Id, element or querySelector of the slides container: + slidesContainer: 'div', + // The tag name, Id, element or querySelector of the title element: + titleElement: 'h3', + // The class to add when the gallery is visible: + displayClass: 'blueimp-gallery-display', + // The class to add when the gallery controls are visible: + controlsClass: 'blueimp-gallery-controls', + // The class to add when the gallery only displays one element: + singleClass: 'blueimp-gallery-single', + // The class to add when the left edge has been reached: + leftEdgeClass: 'blueimp-gallery-left', + // The class to add when the right edge has been reached: + rightEdgeClass: 'blueimp-gallery-right', + // The class to add when the automatic slideshow is active: + playingClass: 'blueimp-gallery-playing', + // The class for all slides: + slideClass: 'slide', + // The slide class for loading elements: + slideLoadingClass: 'slide-loading', + // The slide class for elements that failed to load: + slideErrorClass: 'slide-error', + // The class for the content element loaded into each slide: + slideContentClass: 'slide-content', + // The class for the "toggle" control: + toggleClass: 'toggle', + // The class for the "prev" control: + prevClass: 'prev', + // The class for the "next" control: + nextClass: 'next', + // The class for the "close" control: + closeClass: 'close', + // The class for the "play-pause" toggle control: + playPauseClass: 'play-pause', + // The list object property (or data attribute) with the object type: + typeProperty: 'type', + // The list object property (or data attribute) with the object title: + titleProperty: 'title', + // The list object property (or data attribute) with the object URL: + urlProperty: 'href', + // The list object property (or data attribute) with the object srcset URL(s): + srcsetProperty: 'urlset', + // The gallery listens for transitionend events before triggering the + // opened and closed events, unless the following option is set to false: + displayTransition: true, + // Defines if the gallery slides are cleared from the gallery modal, + // or reused for the next gallery initialization: + clearSlides: true, + // Defines if images should be stretched to fill the available space, + // while maintaining their aspect ratio (will only be enabled for browsers + // supporting background-size="contain", which excludes IE < 9). + // Set to "cover", to make images cover all available space (requires + // support for background-size="cover", which excludes IE < 9): + stretchImages: false, + // Toggle the controls on pressing the Return key: + toggleControlsOnReturn: true, + // Toggle the controls on slide click: + toggleControlsOnSlideClick: true, + // Toggle the automatic slideshow interval on pressing the Space key: + toggleSlideshowOnSpace: true, + // Navigate the gallery by pressing left and right on the keyboard: + enableKeyboardNavigation: true, + // Close the gallery on pressing the ESC key: + closeOnEscape: true, + // Close the gallery when clicking on an empty slide area: + closeOnSlideClick: true, + // Close the gallery by swiping up or down: + closeOnSwipeUpOrDown: true, + // Emulate touch events on mouse-pointer devices such as desktop browsers: + emulateTouchEvents: true, + // Stop touch events from bubbling up to ancestor elements of the Gallery: + stopTouchEventsPropagation: false, + // Hide the page scrollbars: + hidePageScrollbars: true, + // Stops any touches on the container from scrolling the page: + disableScroll: true, + // Carousel mode (shortcut for carousel specific options): + carousel: false, + // Allow continuous navigation, moving from last to first + // and from first to last slide: + continuous: true, + // Remove elements outside of the preload range from the DOM: + unloadElements: true, + // Start with the automatic slideshow: + startSlideshow: false, + // Delay in milliseconds between slides for the automatic slideshow: + slideshowInterval: 5000, + // The starting index as integer. + // Can also be an object of the given list, + // or an equal object with the same url property: + index: 0, + // The number of elements to load around the current index: + preloadRange: 2, + // The transition speed between slide changes in milliseconds: + transitionSpeed: 400, + // The transition speed for automatic slide changes, set to an integer + // greater 0 to override the default transition speed: + slideshowTransitionSpeed: undefined, + // The event object for which the default action will be canceled + // on Gallery initialization (e.g. the click event to open the Gallery): + event: undefined, + // Callback function executed when the Gallery is initialized. + // Is called with the gallery instance as "this" object: + onopen: undefined, + // Callback function executed when the Gallery has been initialized + // and the initialization transition has been completed. + // Is called with the gallery instance as "this" object: + onopened: undefined, + // Callback function executed on slide change. + // Is called with the gallery instance as "this" object and the + // current index and slide as arguments: + onslide: undefined, + // Callback function executed after the slide change transition. + // Is called with the gallery instance as "this" object and the + // current index and slide as arguments: + onslideend: undefined, + // Callback function executed on slide content load. + // Is called with the gallery instance as "this" object and the + // slide index and slide element as arguments: + onslidecomplete: undefined, + // Callback function executed when the Gallery is about to be closed. + // Is called with the gallery instance as "this" object: + onclose: undefined, + // Callback function executed when the Gallery has been closed + // and the closing transition has been completed. + // Is called with the gallery instance as "this" object: + onclosed: undefined +}; +``` + +### Event callbacks +Event callbacks can be set as function properties of the options object passed +to the Gallery initialization function: + +```js +var gallery = blueimp.Gallery( + linkList, + { + onopen: function () { + // Callback function executed when the Gallery is initialized. + }, + onopened: function () { + // Callback function executed when the Gallery has been initialized + // and the initialization transition has been completed. + }, + onslide: function (index, slide) { + // Callback function executed on slide change. + }, + onslideend: function (index, slide) { + // Callback function executed after the slide change transition. + }, + onslidecomplete: function (index, slide) { + // Callback function executed on slide content load. + }, + onclose: function () { + // Callback function executed when the Gallery is about to be closed. + }, + onclosed: function () { + // Callback function executed when the Gallery has been closed + // and the closing transition has been completed. + } + } +); +``` + +### Carousel options +If the **carousel** option is **true**, the following options are set to +different default values: + +```js +var carouselOptions = { + hidePageScrollbars: false, + toggleControlsOnReturn: false, + toggleSlideshowOnSpace: false, + enableKeyboardNavigation: false, + closeOnEscape: false, + closeOnSlideClick: false, + closeOnSwipeUpOrDown: false, + disableScroll: false, + startSlideshow: true +}; +``` + +The options object passed to the Gallery function extends the default options +and also those options set via **carousel** mode. + +### Indicator options +The following are the additional default options set for the slide position +indicator: + +```js +var indicatorOptions = { + // The tag name, Id, element or querySelector of the indicator container: + indicatorContainer: 'ol', + // The class for the active indicator: + activeIndicatorClass: 'active', + // The list object property (or data attribute) with the thumbnail URL, + // used as alternative to a thumbnail child element: + thumbnailProperty: 'thumbnail', + // Defines if the gallery indicators should display a thumbnail: + thumbnailIndicators: true +}; +``` + +### Fullscreen options +The following are the additional default options set for the fullscreen mode: + +```js +var fullscreenOptions = { + // Defines if the gallery should open in fullscreen mode: + fullScreen: false +}; +``` + +### Video options + +#### Video factory options +The following are the additional default options set for the video factory: + +```js +var videoFactoryOptions = { + // The class for video content elements: + videoContentClass: 'video-content', + // The class for video when it is loading: + videoLoadingClass: 'video-loading', + // The class for video when it is playing: + videoPlayingClass: 'video-playing', + // The list object property (or data attribute) for the video poster URL: + videoPosterProperty: 'poster', + // The list object property (or data attribute) for the video sources array: + videoSourcesProperty: 'sources' +}; +``` +#### YouTube options +Options for [YouTube](https://www.youtube.com/) videos: + +```js +var youTubeOptions = { + // The list object property (or data attribute) with the YouTube video id: + youTubeVideoIdProperty: 'youtube', + // Optional object with parameters passed to the YouTube video player: + // https://developers.google.com/youtube/player_parameters + youTubePlayerVars: undefined, + // Require a click on the native YouTube player for the initial playback: + youTubeClickToPlay: true +}; +``` + +#### Vimeo options +Options for [Vimeo](https://vimeo.com/) videos: + +```js +var vimeoOptions = { + // The list object property (or data attribute) with the Vimeo video id: + vimeoVideoIdProperty: 'vimeo', + // The URL for the Vimeo video player, can be extended with custom parameters: + // https://developer.vimeo.com/player/embedding + vimeoPlayerUrl: '//player.vimeo.com/video/VIDEO_ID?api=1&player_id=PLAYER_ID', + // The prefix for the Vimeo video player ID: + vimeoPlayerIdPrefix: 'vimeo-player-', + // Require a click on the native Vimeo player for the initial playback: + vimeoClickToPlay: true +}; +``` + +### Container and element options +The widget **container** option can be set as id string (with "#" as prefix) or +element node, so the following are equivalent: + +```js +var options = { + container: '#blueimp-gallery' +}; +``` + +```js +var options = { + container: document.getElementById('blueimp-gallery') +}; +``` + +The **slidesContainer**, **titleElement** and **indicatorContainer** options can +also be defined using a tag name, which selects the first tag of this kind found +inside of the widget container: + +```js +var options = { + slidesContainer: 'div', + titleElement: 'h3', + indicatorContainer: 'ol' +}; +``` + +It is also possible to define the container and element options with a more +complex +[querySelector](https://developer.mozilla.org/en-US/docs/Web/API/document.querySelector), +which is supported by IE8+ and all modern web browsers. + +If the helper script is replaced with [jQuery](https://jquery.com/), +the container and element options can be any valid jQuery selector. + +### Property options +The options ending with "Property" define how the properties of each link +element are accessed. +For example, the **urlProperty** is by default set to **href**. This allows to +define link elements with **href** or **data-href** attributes: + +```html + +``` + +If the links are passed as JavaScript array, it is also possible to define +nested property names, by using the native JavaScript accessor syntax for the +property string: + +```js +blueimp.Gallery( + [ + { + data: {urls: ['https://example.org/images/banana.jpg']} + }, + { + data: {urls: ['https://example.org/images/apple.jpg']} + } + ], + { + urlProperty: 'data.urls[0]' + } +); +``` + +## API + +### Initialization +The blueimp Gallery can be initialized by simply calling it as a function with +an array of links as first argument and an optional options object as second +argument: + +```js +var gallery = blueimp.Gallery(links, options); +``` + +The links array can be a list of URL strings or a list of objects with URL +properties: + +```js +var gallery = blueimp.Gallery([ + 'https://example.org/images/banana.jpg', + 'https://example.org/images/apple.jpg', + 'https://example.org/images/orange.jpg' +]); +``` + +```js +var gallery = blueimp.Gallery([ + { + title: 'Banana', + href: 'https://example.org/images/banana.jpg', + type: 'image/jpeg', + thumbnail: 'https://example.org/thumbnails/banana.jpg' + }, + { + title: 'Apple', + href: 'https://example.org/images/apple.jpg', + type: 'image/jpeg', + thumbnail: 'https://example.org/thumbnails/apple.jpg' + } +]); +``` + +The URL property name defined by each list object can be configured via the +**urlProperty** option. By default, it is set to **href**, which allows to pass +a list of HTML link elements as first argument. + +For images, the **thumbnail** property defines the URL of the image thumbnail, +which is used for the indicator navigation displayed at the bottom of the +Gallery, if the controls are visible. + +The object returned by executing the Gallery function (the **gallery** variable +in the example code above) is a new instance of the Gallery and allows to access +the public [API methods](#api-methods) provided by the Gallery. +The Gallery initialization function returns **false** if the given list was +empty, the Gallery widget is missing, or the browser doesn't pass the +functionality test. + +### API methods +The Gallery object returned by executing the Gallery function provides the +following public API methods: + +```js +// Return the current slide index position: +var pos = gallery.getIndex(); + +// Return the total number of slides: +var count = gallery.getNumber(); + +// Move to the previous slide: +gallery.prev(); + +// Move to the next slide: +gallery.next(); + +// Move to the given slide index with the (optional) given duraction speed in milliseconds: +gallery.slide(index, duration); + +// Start an automatic slideshow with the given interval in milliseconds (optional): +gallery.play(interval); + +// Stop the automatic slideshow: +gallery.pause(); + +// Add additional slides after Gallery initialization: +gallery.add(list); + +// Close and deinitialize the Gallery: +gallery.close(); +``` + +### Videos + +#### HTML5 video player + +The Gallery can be initialized with a list of videos instead of images, or a +combination of both: + +```js +blueimp.Gallery([ + { + title: 'Fruits', + href: 'https://example.org/videos/fruits.mp4', + type: 'video/mp4', + poster: 'https://example.org/images/fruits.jpg' + }, + { + title: 'Banana', + href: 'https://example.org/images/banana.jpg', + type: 'image/jpeg', + thumbnail: 'https://example.org/thumbnails/banana.jpg' + } +]); +``` + +The Gallery uses the **type** property to determine the content type of the +object to display. +If the type property is empty or doesn't exist, the default type **image** is +assumed. +Objects with a video type will be displayed in a +[HTML5 video element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video) +if the browser supports the video content type. + +For videos, the **poster** property defines the URL of the poster image to +display, before the video is started. + +#### Multiple video sources +To provide multiple video formats, the **sources** property of a list object can +be set to an array of objects with **href** and **type** properties for each +video source. The first video format in the list that the browser can play will +be displayed: + +```js +blueimp.Gallery([ + { + title: 'Fruits', + type: 'video/*', + poster: 'https://example.org/images/fruits.jpg', + sources: [ + { + href: 'https://example.org/videos/fruits.mp4', + type: 'video/mp4' + }, + { + href: 'https://example.org/videos/fruits.ogg', + type: 'video/ogg' + } + ] + } +]); +``` + +It is also possible to define the video sources as data-attribute on a link +element in [JSON](https://developer.mozilla.org/en-US/docs/JSON) array format: + +```html + +``` + +#### YouTube +The Gallery can display [YouTube](https://www.youtube.com/) videos for Gallery +items with a **type** of **text/html** and a **youtube** property +(configurable via [YouTube options](#youtube-options)) with the YouTube +video-ID: + +```js +blueimp.Gallery([ + { + title: 'A YouYube video', + href: 'https://www.youtube.com/watch?v=VIDEO_ID', + type: 'text/html', + youtube: 'VIDEO_ID', + poster: 'https://img.youtube.com/vi/VIDEO_ID/maxresdefault.jpg' + }, + { + title: 'Banana', + href: 'https://example.org/images/banana.jpg', + type: 'image/jpeg', + thumbnail: 'https://example.org/thumbnails/banana.jpg' + } +]); +``` + +If the `href` and `poster` properties are undefined, they are set automatically +based on the video ID. + +Please note that the Gallery YouTube integration requires a browser with +[postMessage](https://developer.mozilla.org/en-US/docs/Web/API/window.postMessage) +support, which excludes IE7. + +#### Vimeo +The Gallery can display [Vimeo](https://vimeo.com/) videos for Gallery items +with a **type** of **text/html** and a **vimeo** property +(configurable via [Vimeo options](#vimeo-options)) with the Vimeo video-ID: + +```js +blueimp.Gallery([ + { + title: 'A Vimeo video', + href: 'https://vimeo.com/VIDEO_ID', + type: 'text/html', + vimeo: 'VIDEO_ID', + poster: 'https://secure-b.vimeocdn.com/ts/POSTER_ID.jpg' + }, + { + title: 'Banana', + href: 'https://example.org/images/banana.jpg', + type: 'image/jpeg', + thumbnail: 'https://example.org/thumbnails/banana.jpg' + } +]); +``` + +If the `href` property is undefined, it is set automatically based on the +video ID. + +Please note that the Gallery Vimeo integration requires a browser with +[postMessage](https://developer.mozilla.org/en-US/docs/Web/API/window.postMessage) +support, which excludes IE7. + +### Additional Gallery elements +It is possible to add additional elements to the Gallery widget, e.g. a +description label. + +First, add the desired HTML element to the Gallery widget: + +```html + +``` + +Next, add the desired element styles to your CSS file: + +```css +.blueimp-gallery > .description { + position: absolute; + top: 30px; + left: 15px; + color: #fff; + display: none; +} +.blueimp-gallery-controls > .description { + display: block; +} +``` + +Then, add the additional element information to each of your links: + +```html + +``` + +Finally, initialize the Gallery with an onslide callback option, to set the +element content based on the information from the current link: + +```js +blueimp.Gallery( + document.getElementById('links'), + { + onslide: function (index, slide) { + var text = this.list[index].getAttribute('data-description'), + node = this.container.find('.description'); + node.empty(); + if (text) { + node[0].appendChild(document.createTextNode(text)); + } + } + } +); +``` + +### Additional content types +By extending the Gallery prototype with new factory methods, additional content +types can be displayed. By default, blueimp Gallery provides the +**imageFactory** and **videoFactory** methods for **image** and **video** +content types respectively. + +The Gallery uses the **type** property of each content object to determine which +factory method to use. The **type** defines the +[Internet media type](https://en.wikipedia.org/wiki/Internet_media_type) of the +content object and is composed of two or more parts: A type, a subtype, and zero +or more optional parameters, e.g. **text/html; charset=UTF-8** for an HTML +document with UTF-8 encoding. +The main type (the string in front of the slash, **text** in the example above) +is concatenated with the string **Factory** to create the factory method name, +e.g. **textFactory**. + +#### Example HTML text factory implementation +Please note that the textFactory script has to be included after the core +Gallery script, but before including the [YouTube](#youtube) and [Vimeo](#vimeo) +integration plugins, which extend the textFactory implementation to handle +YouTube and Vimeo video links. + +Please also note that although blueimp Gallery doesn't require +[jQuery](https://jquery.com/), the following example uses it for convenience. + +Extend the Gallery prototype with the **textFactory** method: + +```js +blueimp.Gallery.prototype.textFactory = function (obj, callback) { + var $element = $('
    ') + .addClass('text-content') + .attr('title', obj.title); + $.get(obj.href) + .done(function (result) { + $element.html(result); + callback({ + type: 'load', + target: $element[0] + }); + }) + .fail(function () { + callback({ + type: 'error', + target: $element[0] + }); + }); + return $element[0]; +}; +``` + +Next, add the **text-content** class to the Gallery CSS: + +```css +.blueimp-gallery > .slides > .slide > .text-content { + overflow: auto; + margin: 60px auto; + padding: 0 60px; + max-width: 920px; + text-align: left; +} +``` + +With the previous changes in place, the Gallery can now handle HTML content +types: + +```js +blueimp.Gallery([ + { + title: 'Noodle soup', + href: 'https://example.org/text/noodle-soup.html', + type: 'text/html' + }, + { + title: 'Tomato salad', + href: 'https://example.org/text/tomato-salad.html', + type: 'text/html' + } +]); +``` + +### jQuery plugin + +#### jQuery plugin setup +The blueimp Gallery jQuery plugin registers a global click handler to open links +with **data-gallery** attribute in the Gallery lightbox. + +To use it, follow the [lightbox setup](#lightbox-setup) guide, but replace the +minified Gallery script with the jQuery plugin version and include it after +including [jQuery](https://jquery.com/): + +```html + + +``` + +Next, add the attribute **data-gallery** to your Gallery links: + +```html + +``` + +The onclick handler from the [lightbox setup](#lightbox-setup) guide is not +required and can be removed. + +#### HTML5 data-attributes +Options for the Gallery lightbox opened via the jQuery plugin can be defined as +[HTML5 data-attributes](https://api.jquery.com/data/#data-html5) on the Gallery +widget container. + +The jQuery plugin also introduces the additional **filter** option, which is +applied to the Gallery links via +[jQuery's filter method](https://api.jquery.com/filter/) and allows to remove +duplicates from the list: + +```html + +``` + +This will initialize the Gallery with the option **startSlideshow** set to +**true**. +It will also filter the Gallery links so that only links with an even index +number will be included. + +#### Container ids and link grouping +If the **data-gallery** attribute value is a valid id string +(e.g. "#blueimp-gallery"), it is used as container option. +Setting **data-gallery** to a non-empty string also allows to group links into +different sets of Gallery images: + +```html + + +``` + +This will open the links with the **data-gallery** attribute +**#blueimp-gallery-fruits** in the Gallery widget with the id +**blueimp-gallery-fruits**, and the links with the **data-gallery** attribute +**#blueimp-gallery-vegetables** in the Gallery widget with the id +**blueimp-gallery-vegetables**. + +#### Gallery object +The gallery object is stored via +[jQuery data storage](https://api.jquery.com/category/miscellaneous/data-storage/) +on the Gallery widget when the Gallery is opened and can be retrieved the +following way: + +```js +var gallery = $('#blueimp-gallery').data('gallery'); +``` + +This gallery object provides all methods outlined in the API methods section. + +#### jQuery events +The jQuery plugin triggers Gallery events on the widget container, with event +names equivalent to the gallery [event callbacks](#event-callbacks): + +```js +$('#blueimp-gallery') + .on('open', function (event) { + // Gallery open event handler + }) + .on('opened', function (event) { + // Gallery opened event handler + }) + .on('slide', function (event, index, slide) { + // Gallery slide event handler + }) + .on('slideend', function (event, index, slide) { + // Gallery slideend event handler + }) + .on('slidecomplete', function (event, index, slide) { + // Gallery slidecomplete event handler + }) + .on('close', function (event) { + // Gallery close event handler + }) + .on('closed', function (event) { + // Gallery closed event handler + }); +``` + +## Requirements +blueimp Gallery doesn't require any other libraries and can be used standalone +without any dependencies. + +You can also use the individual source files instead of the standalone minified +version: + +```html + + + + + + + + + + + +``` + +The helper script can be replaced by [jQuery](https://jquery.com/) v. 1.7+. +The fullscreen, indicator, video, youtube and vimeo source files are optional if +their functionality is not required. + +The [jQuery plugin](#jquery-plugin) requires +[jQuery](https://jquery.com/) v. 1.7+ and the basic Gallery script, while the +fullscreen, indicator, video, youtube and vimeo source files are also optional: + +```html + + + + + + + + +``` + +Please note that the jQuery plugin is an optional extension and not required for +the Gallery functionality. + +## Browsers +blueimp Gallery has been tested with and supports the following browsers: + +### Desktop browsers + +* Google Chrome 14.0+ +* Apple Safari 4.0+ +* Mozilla Firefox 4.0+ +* Opera 10.0+ +* Microsoft Internet Explorer 7.0+ + +### Mobile browsers + +* Apple Safari on iOS 6.0+ +* Google Chrome on iOS 6.0+ +* Google Chrome on Android 4.0+ +* Default Browser on Android 2.3+ +* Opera Mobile 12.0+ + +## License +Released under the [MIT license](http://www.opensource.org/licenses/MIT). + +## Credits +The swipe implementation is based on code from the +[Swipe](http://swipejs.com/) library. diff --git a/public/bower_components/blueimp-gallery/css/blueimp-gallery-indicator.css b/public/bower_components/blueimp-gallery/css/blueimp-gallery-indicator.css new file mode 100755 index 0000000..74ed340 --- /dev/null +++ b/public/bower_components/blueimp-gallery/css/blueimp-gallery-indicator.css @@ -0,0 +1,71 @@ +@charset "UTF-8"; +/* + * blueimp Gallery Indicator CSS + * https://github.com/blueimp/Gallery + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +.blueimp-gallery > .indicator { + position: absolute; + top: auto; + right: 15px; + bottom: 15px; + left: 15px; + margin: 0 40px; + padding: 0; + list-style: none; + text-align: center; + line-height: 10px; + display: none; +} +.blueimp-gallery > .indicator > li { + display: inline-block; + width: 9px; + height: 9px; + margin: 6px 3px 0 3px; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + border: 1px solid transparent; + background: #ccc; + background: rgba(255, 255, 255, 0.25) center no-repeat; + border-radius: 5px; + box-shadow: 0 0 2px #000; + opacity: 0.5; + cursor: pointer; +} +.blueimp-gallery > .indicator > li:hover, +.blueimp-gallery > .indicator > .active { + background-color: #fff; + border-color: #fff; + opacity: 1; +} +.blueimp-gallery-controls > .indicator { + display: block; + /* Fix z-index issues (controls behind slide element) on Android: */ + -webkit-transform: translateZ(0); + -moz-transform: translateZ(0); + -ms-transform: translateZ(0); + -o-transform: translateZ(0); + transform: translateZ(0); +} +.blueimp-gallery-single > .indicator { + display: none; +} +.blueimp-gallery > .indicator { + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* IE7 fixes */ +*+html .blueimp-gallery > .indicator > li { + display: inline; +} diff --git a/public/bower_components/blueimp-gallery/css/blueimp-gallery-video.css b/public/bower_components/blueimp-gallery/css/blueimp-gallery-video.css new file mode 100755 index 0000000..2804090 --- /dev/null +++ b/public/bower_components/blueimp-gallery/css/blueimp-gallery-video.css @@ -0,0 +1,87 @@ +@charset "UTF-8"; +/* + * blueimp Gallery Video Factory CSS + * https://github.com/blueimp/Gallery + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +.blueimp-gallery > .slides > .slide > .video-content > img { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; + width: auto; + height: auto; + max-width: 100%; + max-height: 100%; + /* Prevent artifacts in Mozilla Firefox: */ + -moz-backface-visibility: hidden; +} +.blueimp-gallery > .slides > .slide > .video-content > video { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.blueimp-gallery > .slides > .slide > .video-content > iframe { + position: absolute; + top: 100%; + left: 0; + width: 100%; + height: 100%; + border: none; +} +.blueimp-gallery > .slides > .slide > .video-playing > iframe { + top: 0; +} +.blueimp-gallery > .slides > .slide > .video-content > a { + position: absolute; + top: 50%; + right: 0; + left: 0; + margin: -64px auto 0; + width: 128px; + height: 128px; + background: url(../img/video-play.png) center no-repeat; + opacity: 0.8; + cursor: pointer; +} +.blueimp-gallery > .slides > .slide > .video-content > a:hover { + opacity: 1; +} +.blueimp-gallery > .slides > .slide > .video-playing > a, +.blueimp-gallery > .slides > .slide > .video-playing > img { + display: none; +} +.blueimp-gallery > .slides > .slide > .video-content > video { + display: none; +} +.blueimp-gallery > .slides > .slide > .video-playing > video { + display: block; +} +.blueimp-gallery > .slides > .slide > .video-loading > a { + background: url(../img/loading.gif) center no-repeat; + background-size: 64px 64px; +} + +/* Replace PNGs with SVGs for capable browsers (excluding IE<9) */ +body:last-child .blueimp-gallery > .slides > .slide > .video-content:not(.video-loading) > a { + background-image: url(../img/video-play.svg); +} + +/* IE7 fixes */ +*+html .blueimp-gallery > .slides > .slide > .video-content { + height: 100%; +} +*+html .blueimp-gallery > .slides > .slide > .video-content > a { + left: 50%; + margin-left: -64px; +} diff --git a/public/bower_components/blueimp-gallery/css/blueimp-gallery.css b/public/bower_components/blueimp-gallery/css/blueimp-gallery.css new file mode 100755 index 0000000..b47ea20 --- /dev/null +++ b/public/bower_components/blueimp-gallery/css/blueimp-gallery.css @@ -0,0 +1,226 @@ +@charset "UTF-8"; +/* + * blueimp Gallery CSS + * https://github.com/blueimp/Gallery + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +.blueimp-gallery, +.blueimp-gallery > .slides > .slide > .slide-content { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + /* Prevent artifacts in Mozilla Firefox: */ + -moz-backface-visibility: hidden; +} +.blueimp-gallery > .slides > .slide > .slide-content { + margin: auto; + width: auto; + height: auto; + max-width: 100%; + max-height: 100%; + opacity: 1; +} +.blueimp-gallery { + position: fixed; + z-index: 999999; + overflow: hidden; + background: #000; + background: rgba(0, 0, 0, 0.9); + opacity: 0; + display: none; + direction: ltr; + -ms-touch-action: none; + touch-action: none; +} +.blueimp-gallery-carousel { + position: relative; + z-index: auto; + margin: 1em auto; + /* Set the carousel width/height ratio to 16/9: */ + padding-bottom: 56.25%; + box-shadow: 0 0 10px #000; + -ms-touch-action: pan-y; + touch-action: pan-y; +} +.blueimp-gallery-display { + display: block; + opacity: 1; +} +.blueimp-gallery > .slides { + position: relative; + height: 100%; + overflow: hidden; +} +.blueimp-gallery-carousel > .slides { + position: absolute; +} +.blueimp-gallery > .slides > .slide { + position: relative; + float: left; + height: 100%; + text-align: center; + -webkit-transition-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1.000); + -moz-transition-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1.000); + -ms-transition-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1.000); + -o-transition-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1.000); + transition-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1.000); +} +.blueimp-gallery, +.blueimp-gallery > .slides > .slide > .slide-content { + -webkit-transition: opacity 0.2s linear; + -moz-transition: opacity 0.2s linear; + -ms-transition: opacity 0.2s linear; + -o-transition: opacity 0.2s linear; + transition: opacity 0.2s linear; +} +.blueimp-gallery > .slides > .slide-loading { + background: url(../img/loading.gif) center no-repeat; + background-size: 64px 64px; +} +.blueimp-gallery > .slides > .slide-loading > .slide-content { + opacity: 0; +} +.blueimp-gallery > .slides > .slide-error { + background: url(../img/error.png) center no-repeat; +} +.blueimp-gallery > .slides > .slide-error > .slide-content { + display: none; +} +.blueimp-gallery > .prev, +.blueimp-gallery > .next { + position: absolute; + top: 50%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -23px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #fff; + text-decoration: none; + text-shadow: 0 0 2px #000; + text-align: center; + background: #222; + background: rgba(0, 0, 0, 0.5); + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + border: 3px solid #fff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + cursor: pointer; + display: none; +} +.blueimp-gallery > .next { + left: auto; + right: 15px; +} +.blueimp-gallery > .close, +.blueimp-gallery > .title { + position: absolute; + top: 15px; + left: 15px; + margin: 0 40px 0 0; + font-size: 20px; + line-height: 30px; + color: #fff; + text-shadow: 0 0 2px #000; + opacity: 0.8; + display: none; +} +.blueimp-gallery > .close { + padding: 15px; + right: 15px; + left: auto; + margin: -15px; + font-size: 30px; + text-decoration: none; + cursor: pointer; +} +.blueimp-gallery > .play-pause { + position: absolute; + right: 15px; + bottom: 15px; + width: 15px; + height: 15px; + background: url(../img/play-pause.png) 0 0 no-repeat; + cursor: pointer; + opacity: 0.5; + display: none; +} +.blueimp-gallery-playing > .play-pause { + background-position: -15px 0; +} +.blueimp-gallery > .prev:hover, +.blueimp-gallery > .next:hover, +.blueimp-gallery > .close:hover, +.blueimp-gallery > .title:hover, +.blueimp-gallery > .play-pause:hover { + color: #fff; + opacity: 1; +} +.blueimp-gallery-controls > .prev, +.blueimp-gallery-controls > .next, +.blueimp-gallery-controls > .close, +.blueimp-gallery-controls > .title, +.blueimp-gallery-controls > .play-pause { + display: block; + /* Fix z-index issues (controls behind slide element) on Android: */ + -webkit-transform: translateZ(0); + -moz-transform: translateZ(0); + -ms-transform: translateZ(0); + -o-transform: translateZ(0); + transform: translateZ(0); +} +.blueimp-gallery-single > .prev, +.blueimp-gallery-left > .prev, +.blueimp-gallery-single > .next, +.blueimp-gallery-right > .next, +.blueimp-gallery-single > .play-pause { + display: none; +} +.blueimp-gallery > .slides > .slide > .slide-content, +.blueimp-gallery > .prev, +.blueimp-gallery > .next, +.blueimp-gallery > .close, +.blueimp-gallery > .play-pause { + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* Replace PNGs with SVGs for capable browsers (excluding IE<9) */ +body:last-child .blueimp-gallery > .slides > .slide-error { + background-image: url(../img/error.svg); +} +body:last-child .blueimp-gallery > .play-pause { + width: 20px; + height: 20px; + background-size: 40px 20px; + background-image: url(../img/play-pause.svg); +} +body:last-child .blueimp-gallery-playing > .play-pause { + background-position: -20px 0; +} + +/* IE7 fixes */ +*+html .blueimp-gallery > .slides > .slide { + min-height: 300px; +} +*+html .blueimp-gallery > .slides > .slide > .slide-content { + position: relative; +} diff --git a/public/bower_components/blueimp-gallery/css/blueimp-gallery.less b/public/bower_components/blueimp-gallery/css/blueimp-gallery.less new file mode 100755 index 0000000..dc5ba44 --- /dev/null +++ b/public/bower_components/blueimp-gallery/css/blueimp-gallery.less @@ -0,0 +1,3 @@ +@import (inline) 'blueimp-gallery.css'; +@import (inline) 'blueimp-gallery-indicator.css'; +@import (inline) 'blueimp-gallery-video.css'; diff --git a/public/bower_components/blueimp-gallery/css/blueimp-gallery.min.css b/public/bower_components/blueimp-gallery/css/blueimp-gallery.min.css new file mode 100755 index 0000000..42a66d5 --- /dev/null +++ b/public/bower_components/blueimp-gallery/css/blueimp-gallery.min.css @@ -0,0 +1 @@ +@charset "UTF-8";.blueimp-gallery,.blueimp-gallery>.slides>.slide>.slide-content{position:absolute;top:0;right:0;bottom:0;left:0;-moz-backface-visibility:hidden}.blueimp-gallery>.slides>.slide>.slide-content{margin:auto;width:auto;height:auto;max-width:100%;max-height:100%;opacity:1}.blueimp-gallery{position:fixed;z-index:999999;overflow:hidden;background:#000;background:rgba(0,0,0,.9);opacity:0;display:none;direction:ltr;-ms-touch-action:none;touch-action:none}.blueimp-gallery-carousel{position:relative;z-index:auto;margin:1em auto;padding-bottom:56.25%;box-shadow:0 0 10px #000;-ms-touch-action:pan-y;touch-action:pan-y}.blueimp-gallery-display{display:block;opacity:1}.blueimp-gallery>.slides{position:relative;height:100%;overflow:hidden}.blueimp-gallery-carousel>.slides{position:absolute}.blueimp-gallery>.slides>.slide{position:relative;float:left;height:100%;text-align:center;-webkit-transition-timing-function:cubic-bezier(.645,.045,.355,1);-moz-transition-timing-function:cubic-bezier(.645,.045,.355,1);-ms-transition-timing-function:cubic-bezier(.645,.045,.355,1);-o-transition-timing-function:cubic-bezier(.645,.045,.355,1);transition-timing-function:cubic-bezier(.645,.045,.355,1)}.blueimp-gallery,.blueimp-gallery>.slides>.slide>.slide-content{-webkit-transition:opacity .2s linear;-moz-transition:opacity .2s linear;-ms-transition:opacity .2s linear;-o-transition:opacity .2s linear;transition:opacity .2s linear}.blueimp-gallery>.slides>.slide-loading{background:url(../img/loading.gif) center no-repeat;background-size:64px 64px}.blueimp-gallery>.slides>.slide-loading>.slide-content{opacity:0}.blueimp-gallery>.slides>.slide-error{background:url(../img/error.png) center no-repeat}.blueimp-gallery>.slides>.slide-error>.slide-content{display:none}.blueimp-gallery>.next,.blueimp-gallery>.prev{position:absolute;top:50%;left:15px;width:40px;height:40px;margin-top:-23px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-decoration:none;text-shadow:0 0 2px #000;text-align:center;background:#222;background:rgba(0,0,0,.5);-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;cursor:pointer;display:none}.blueimp-gallery>.next{left:auto;right:15px}.blueimp-gallery>.close,.blueimp-gallery>.title{position:absolute;top:15px;left:15px;margin:0 40px 0 0;font-size:20px;line-height:30px;color:#fff;text-shadow:0 0 2px #000;opacity:.8;display:none}.blueimp-gallery>.close{padding:15px;right:15px;left:auto;margin:-15px;font-size:30px;text-decoration:none;cursor:pointer}.blueimp-gallery>.play-pause{position:absolute;right:15px;bottom:15px;width:15px;height:15px;background:url(../img/play-pause.png) 0 0 no-repeat;cursor:pointer;opacity:.5;display:none}.blueimp-gallery-playing>.play-pause{background-position:-15px 0}.blueimp-gallery>.close:hover,.blueimp-gallery>.next:hover,.blueimp-gallery>.play-pause:hover,.blueimp-gallery>.prev:hover,.blueimp-gallery>.title:hover{color:#fff;opacity:1}.blueimp-gallery-controls>.close,.blueimp-gallery-controls>.next,.blueimp-gallery-controls>.play-pause,.blueimp-gallery-controls>.prev,.blueimp-gallery-controls>.title{display:block;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0)}.blueimp-gallery-left>.prev,.blueimp-gallery-right>.next,.blueimp-gallery-single>.next,.blueimp-gallery-single>.play-pause,.blueimp-gallery-single>.prev{display:none}.blueimp-gallery>.close,.blueimp-gallery>.next,.blueimp-gallery>.play-pause,.blueimp-gallery>.prev,.blueimp-gallery>.slides>.slide>.slide-content{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body:last-child .blueimp-gallery>.slides>.slide-error{background-image:url(../img/error.svg)}body:last-child .blueimp-gallery>.play-pause{width:20px;height:20px;background-size:40px 20px;background-image:url(../img/play-pause.svg)}body:last-child .blueimp-gallery-playing>.play-pause{background-position:-20px 0}.blueimp-gallery>.indicator{position:absolute;top:auto;right:15px;bottom:15px;left:15px;margin:0 40px;padding:0;list-style:none;text-align:center;line-height:10px;display:none}.blueimp-gallery>.indicator>li{display:inline-block;width:9px;height:9px;margin:6px 3px 0 3px;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;border:1px solid transparent;background:#ccc;background:rgba(255,255,255,.25) center no-repeat;border-radius:5px;box-shadow:0 0 2px #000;opacity:.5;cursor:pointer}.blueimp-gallery>.indicator>.active,.blueimp-gallery>.indicator>li:hover{background-color:#fff;border-color:#fff;opacity:1}.blueimp-gallery-controls>.indicator{display:block;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0)}.blueimp-gallery-single>.indicator{display:none}.blueimp-gallery>.indicator{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.blueimp-gallery>.slides>.slide>.video-content>img{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto;width:auto;height:auto;max-width:100%;max-height:100%;-moz-backface-visibility:hidden}.blueimp-gallery>.slides>.slide>.video-content>video{position:absolute;top:0;left:0;width:100%;height:100%}.blueimp-gallery>.slides>.slide>.video-content>iframe{position:absolute;top:100%;left:0;width:100%;height:100%;border:none}.blueimp-gallery>.slides>.slide>.video-playing>iframe{top:0}.blueimp-gallery>.slides>.slide>.video-content>a{position:absolute;top:50%;right:0;left:0;margin:-64px auto 0;width:128px;height:128px;background:url(../img/video-play.png) center no-repeat;opacity:.8;cursor:pointer}.blueimp-gallery>.slides>.slide>.video-content>a:hover{opacity:1}.blueimp-gallery>.slides>.slide>.video-playing>a,.blueimp-gallery>.slides>.slide>.video-playing>img{display:none}.blueimp-gallery>.slides>.slide>.video-content>video{display:none}.blueimp-gallery>.slides>.slide>.video-playing>video{display:block}.blueimp-gallery>.slides>.slide>.video-loading>a{background:url(../img/loading.gif) center no-repeat;background-size:64px 64px}body:last-child .blueimp-gallery>.slides>.slide>.video-content:not(.video-loading)>a{background-image:url(../img/video-play.svg)}/*# sourceMappingURL=blueimp-gallery.min.css.map */ \ No newline at end of file diff --git a/public/bower_components/blueimp-gallery/css/blueimp-gallery.min.css.map b/public/bower_components/blueimp-gallery/css/blueimp-gallery.min.css.map new file mode 100755 index 0000000..f6cafce --- /dev/null +++ b/public/bower_components/blueimp-gallery/css/blueimp-gallery.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["blueimp-gallery.css","blueimp-gallery-indicator.css","blueimp-gallery-video.css"],"names":[],"mappings":"iBAYA,iBACA,+CACE,SAAU,SACV,IAAK,EACL,MAAO,EACP,OAAQ,EACR,KAAM,EAEN,yBAAyE,OAE3E,+CACE,OAAQ,KACR,MAAO,KACP,OAAQ,KACR,UAAW,KACX,WAAY,KACZ,QAAS,EAEX,iBACE,SAAU,MACV,QAAS,OACT,SAAU,OACV,WAAY,KACZ,WAAY,eACZ,QAAS,EACT,QAAS,KACT,UAAW,IACX,iBAAkB,KAClB,aAAc,KAEhB,0BACE,SAAU,SACV,QAAS,KACT,OAAQ,IAAI,KAEZ,eAAkH,OAClH,WAAY,EAAE,EAAE,KAAK,KACrB,iBAAkB,MAClB,aAAc,MAEhB,yBACE,QAAS,MACT,QAAS,EAEX,yBACE,SAAU,SACV,OAAQ,KACR,SAAU,OAEZ,kCACE,SAAU,SAEZ,gCACE,SAAU,SACV,MAAO,KACP,OAAQ,KACR,WAAY,OACZ,mCAAoC,+BACjC,gCAAiC,+BAChC,+BAAgC,+BAC/B,8BAA+B,+BAC5B,2BAA4B,+BAEtC,iBACA,+CACE,mBAAoB,QAAQ,IAAK,OAC9B,gBAAiB,QAAQ,IAAK,OAC7B,eAAgB,QAAQ,IAAK,OAC5B,cAAe,QAAQ,IAAK,OACzB,WAAY,QAAQ,IAAK,OAEnC,wCACE,WAAY,wBAAuB,OAAO,UAC1C,gBAAiB,KAAK,KAExB,uDACE,QAAS,EAEX,sCACE,WAAY,sBAAqB,OAAO,UAE1C,qDACE,QAAS,KAGX,uBADA,uBAEE,SAAU,SACV,IAAK,IACL,KAAM,KACN,MAAO,KACP,OAAQ,KACR,WAAY,MACZ,YAAa,iBAAkB,UAAW,MAAO,WACjD,UAAW,KACX,YAAa,IACb,YAAa,KACb,MAAO,KACP,gBAAiB,KACjB,YAAa,EAAE,EAAE,IAAI,KACrB,WAAY,OACZ,WAAY,KACZ,WAAY,eACZ,mBAAoB,YACjB,gBAAiB,YACZ,WAAY,YACpB,OAAQ,IAAI,MAAM,KAClB,sBAAuB,KACpB,mBAAoB,KACf,cAAe,KACvB,QAAS,GACT,OAAQ,QACR,QAAS,KAEX,uBACE,KAAM,KACN,MAAO,KAET,wBACA,wBACE,SAAU,SACV,IAAK,KACL,KAAM,KACN,OAAQ,EAAE,KAAK,EAAE,EACjB,UAAW,KACX,YAAa,KACb,MAAO,KACP,YAAa,EAAE,EAAE,IAAI,KACrB,QAAS,GACT,QAAS,KAEX,wBACE,QAAS,KACT,MAAO,KACP,KAAM,KACN,OAAQ,MACR,UAAW,KACX,gBAAiB,KACjB,OAAQ,QAEV,6BACE,SAAU,SACV,MAAO,KACP,OAAQ,KACR,MAAO,KACP,OAAQ,KACR,WAAY,2BAA0B,EAAE,EAAE,UAC1C,OAAQ,QACR,QAAS,GACT,QAAS,KAEX,qCACE,oBAAqB,MAAM,EAI7B,8BADA,6BAGA,mCAJA,6BAGA,8BAEE,MAAO,KACP,QAAS,EAIX,iCADA,gCAGA,sCAJA,gCAGA,iCAEE,QAAS,MAET,kBAA0L,cACvL,eAAgB,cACf,cAAe,cACd,aAAc,cACX,UAAW,cAGrB,4BAEA,6BADA,8BAEA,oCAJA,8BAKE,QAAS,KAKX,wBADA,uBAEA,6BAHA,uBADA,+CAKE,oBAAqB,KACpB,mBAAoB,KAClB,iBAAkB,KACjB,gBAAiB,KACb,YAAa,KAIvB,sDACE,iBAAkB,sBAEpB,6CACE,MAAO,KACP,OAAQ,KACR,gBAAiB,KAAK,KACtB,iBAAkB,2BAEpB,qDACE,oBAAqB,MAAM,EC5M7B,4BACE,SAAU,SACV,IAAK,KACL,MAAO,KACP,OAAQ,KACR,KAAM,KACN,OAAQ,EAAE,KACV,QAAS,EACT,WAAY,KACZ,WAAY,OACZ,YAAa,KACb,QAAS,KAEX,+BACE,QAAS,aACT,MAAO,IACP,OAAQ,IACR,OAAQ,IAAI,IAAI,EAAE,IAClB,mBAAoB,YACjB,gBAAiB,YACZ,WAAY,YACpB,OAAQ,IAAI,MAAM,YAClB,WAAY,KACZ,WAAY,sBAA0B,OAAO,UAC7C,cAAe,IACf,WAAY,EAAE,EAAE,IAAI,KACpB,QAAS,GACT,OAAQ,QAGV,oCADA,qCAEE,iBAAkB,KAClB,aAAc,KACd,QAAS,EAEX,qCACE,QAAS,MAET,kBAA2F,cACxF,eAAgB,cACf,cAAe,cACd,aAAc,cACX,UAAW,cAErB,mCACE,QAAS,KAEX,4BACE,oBAAqB,KACpB,mBAAoB,KAClB,iBAAkB,KACjB,gBAAiB,KACb,YAAa,KCpDvB,mDACE,SAAU,SACV,IAAK,EACL,MAAO,EACP,OAAQ,EACR,KAAM,EACN,OAAQ,KACR,MAAO,KACP,OAAQ,KACR,UAAW,KACX,WAAY,KAEZ,yBAAyE,OAE3E,qDACE,SAAU,SACV,IAAK,EACL,KAAM,EACN,MAAO,KACP,OAAQ,KAEV,sDACE,SAAU,SACV,IAAK,KACL,KAAM,EACN,MAAO,KACP,OAAQ,KACR,OAAQ,KAEV,sDACE,IAAK,EAEP,iDACE,SAAU,SACV,IAAK,IACL,MAAO,EACP,KAAM,EACN,OAAQ,MAAM,KAAK,EACnB,MAAO,MACP,OAAQ,MACR,WAAY,2BAA0B,OAAO,UAC7C,QAAS,GACT,OAAQ,QAEV,uDACE,QAAS,EAEX,iDACA,mDACE,QAAS,KAEX,qDACE,QAAS,KAEX,qDACE,QAAS,MAEX,iDACE,WAAY,wBAAuB,OAAO,UAC1C,gBAAiB,KAAK,KAIxB,qFACE,iBAAkB"} \ No newline at end of file diff --git a/public/bower_components/blueimp-gallery/css/demo.css b/public/bower_components/blueimp-gallery/css/demo.css new file mode 100755 index 0000000..7b7b08b --- /dev/null +++ b/public/bower_components/blueimp-gallery/css/demo.css @@ -0,0 +1,51 @@ +/* + * blueimp Gallery Demo CSS + * https://github.com/blueimp/Gallery + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +body { + max-width: 750px; + margin: 0 auto; + padding: 1em; + font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, sans-serif; + font-size: 1em; + line-height: 1.4em; + background: #222; + color: #fff; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +a { + color: orange; + text-decoration: none; +} +img { + border: 0; + vertical-align: middle; +} +h1 { + line-height: 1em; +} +h2, +.links { + text-align: center; +} + +@media (min-width: 481px) { + .navigation { + list-style: none; + padding: 0; + } + .navigation li { + display: inline-block; + } + .navigation li:not(:first-child):before { + content: '| '; + } +} diff --git a/public/bower_components/blueimp-gallery/img/error.png b/public/bower_components/blueimp-gallery/img/error.png new file mode 100755 index 0000000..a5577c3 Binary files /dev/null and b/public/bower_components/blueimp-gallery/img/error.png differ diff --git a/public/bower_components/blueimp-gallery/img/error.svg b/public/bower_components/blueimp-gallery/img/error.svg new file mode 100755 index 0000000..184206a --- /dev/null +++ b/public/bower_components/blueimp-gallery/img/error.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/bower_components/blueimp-gallery/img/loading.gif b/public/bower_components/blueimp-gallery/img/loading.gif new file mode 100755 index 0000000..90f28cb Binary files /dev/null and b/public/bower_components/blueimp-gallery/img/loading.gif differ diff --git a/public/bower_components/blueimp-gallery/img/play-pause.png b/public/bower_components/blueimp-gallery/img/play-pause.png new file mode 100755 index 0000000..ece6cfb Binary files /dev/null and b/public/bower_components/blueimp-gallery/img/play-pause.png differ diff --git a/public/bower_components/blueimp-gallery/img/play-pause.svg b/public/bower_components/blueimp-gallery/img/play-pause.svg new file mode 100755 index 0000000..a7f1f50 --- /dev/null +++ b/public/bower_components/blueimp-gallery/img/play-pause.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/bower_components/blueimp-gallery/img/video-play.png b/public/bower_components/blueimp-gallery/img/video-play.png new file mode 100755 index 0000000..353e3a5 Binary files /dev/null and b/public/bower_components/blueimp-gallery/img/video-play.png differ diff --git a/public/bower_components/blueimp-gallery/img/video-play.svg b/public/bower_components/blueimp-gallery/img/video-play.svg new file mode 100755 index 0000000..b5ea206 --- /dev/null +++ b/public/bower_components/blueimp-gallery/img/video-play.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/bower_components/blueimp-gallery/index.html b/public/bower_components/blueimp-gallery/index.html new file mode 100755 index 0000000..a174c45 --- /dev/null +++ b/public/bower_components/blueimp-gallery/index.html @@ -0,0 +1,84 @@ + + + + + + +blueimp Gallery + + + + + + + + +

    blueimp Gallery

    +

    blueimp Gallery is a touch-enabled, responsive and customizable image & video gallery, carousel and lightbox, optimized for both mobile and desktop web browsers.
    +It features swipe, mouse and keyboard navigation, transition effects, slideshow functionality, fullscreen support and on-demand content loading and can be extended to display additional content types.

    + +

    blueimp Gallery is based on Swipe.

    +
    +

    Carousel image gallery

    + + +
    +

    Carousel video gallery

    + + +
    +

    Lightbox image gallery

    + + + + + + + + + + + + + + + + diff --git a/public/bower_components/blueimp-gallery/js/blueimp-gallery-fullscreen.js b/public/bower_components/blueimp-gallery/js/blueimp-gallery-fullscreen.js new file mode 100755 index 0000000..ee40257 --- /dev/null +++ b/public/bower_components/blueimp-gallery/js/blueimp-gallery-fullscreen.js @@ -0,0 +1,89 @@ +/* + * blueimp Gallery Fullscreen JS + * https://github.com/blueimp/Gallery + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* global define, window, document */ + +;(function (factory) { + 'use strict' + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + './blueimp-helper', + './blueimp-gallery' + ], factory) + } else { + // Browser globals: + factory( + window.blueimp.helper || window.jQuery, + window.blueimp.Gallery + ) + } +}(function ($, Gallery) { + 'use strict' + + $.extend(Gallery.prototype.options, { + // Defines if the gallery should open in fullscreen mode: + fullScreen: false + }) + + var initialize = Gallery.prototype.initialize + var close = Gallery.prototype.close + + $.extend(Gallery.prototype, { + getFullScreenElement: function () { + return document.fullscreenElement || + document.webkitFullscreenElement || + document.mozFullScreenElement || + document.msFullscreenElement + }, + + requestFullScreen: function (element) { + if (element.requestFullscreen) { + element.requestFullscreen() + } else if (element.webkitRequestFullscreen) { + element.webkitRequestFullscreen() + } else if (element.mozRequestFullScreen) { + element.mozRequestFullScreen() + } else if (element.msRequestFullscreen) { + element.msRequestFullscreen() + } + }, + + exitFullScreen: function () { + if (document.exitFullscreen) { + document.exitFullscreen() + } else if (document.webkitCancelFullScreen) { + document.webkitCancelFullScreen() + } else if (document.mozCancelFullScreen) { + document.mozCancelFullScreen() + } else if (document.msExitFullscreen) { + document.msExitFullscreen() + } + }, + + initialize: function () { + initialize.call(this) + if (this.options.fullScreen && !this.getFullScreenElement()) { + this.requestFullScreen(this.container[0]) + } + }, + + close: function () { + if (this.getFullScreenElement() === this.container[0]) { + this.exitFullScreen() + } + close.call(this) + } + + }) + + return Gallery +})) diff --git a/public/bower_components/blueimp-gallery/js/blueimp-gallery-indicator.js b/public/bower_components/blueimp-gallery/js/blueimp-gallery-indicator.js new file mode 100755 index 0000000..0470f63 --- /dev/null +++ b/public/bower_components/blueimp-gallery/js/blueimp-gallery-indicator.js @@ -0,0 +1,155 @@ +/* + * blueimp Gallery Indicator JS + * https://github.com/blueimp/Gallery + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* global define, window, document */ + +;(function (factory) { + 'use strict' + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + './blueimp-helper', + './blueimp-gallery' + ], factory) + } else { + // Browser globals: + factory( + window.blueimp.helper || window.jQuery, + window.blueimp.Gallery + ) + } +}(function ($, Gallery) { + 'use strict' + + $.extend(Gallery.prototype.options, { + // The tag name, Id, element or querySelector of the indicator container: + indicatorContainer: 'ol', + // The class for the active indicator: + activeIndicatorClass: 'active', + // The list object property (or data attribute) with the thumbnail URL, + // used as alternative to a thumbnail child element: + thumbnailProperty: 'thumbnail', + // Defines if the gallery indicators should display a thumbnail: + thumbnailIndicators: true + }) + + var initSlides = Gallery.prototype.initSlides + var addSlide = Gallery.prototype.addSlide + var resetSlides = Gallery.prototype.resetSlides + var handleClick = Gallery.prototype.handleClick + var handleSlide = Gallery.prototype.handleSlide + var handleClose = Gallery.prototype.handleClose + + $.extend(Gallery.prototype, { + createIndicator: function (obj) { + var indicator = this.indicatorPrototype.cloneNode(false) + var title = this.getItemProperty(obj, this.options.titleProperty) + var thumbnailProperty = this.options.thumbnailProperty + var thumbnailUrl + var thumbnail + if (this.options.thumbnailIndicators) { + if (thumbnailProperty) { + thumbnailUrl = this.getItemProperty(obj, thumbnailProperty) + } + if (thumbnailUrl === undefined) { + thumbnail = obj.getElementsByTagName && $(obj).find('img')[0] + if (thumbnail) { + thumbnailUrl = thumbnail.src + } + } + if (thumbnailUrl) { + indicator.style.backgroundImage = 'url("' + thumbnailUrl + '")' + } + } + if (title) { + indicator.title = title + } + return indicator + }, + + addIndicator: function (index) { + if (this.indicatorContainer.length) { + var indicator = this.createIndicator(this.list[index]) + indicator.setAttribute('data-index', index) + this.indicatorContainer[0].appendChild(indicator) + this.indicators.push(indicator) + } + }, + + setActiveIndicator: function (index) { + if (this.indicators) { + if (this.activeIndicator) { + this.activeIndicator + .removeClass(this.options.activeIndicatorClass) + } + this.activeIndicator = $(this.indicators[index]) + this.activeIndicator + .addClass(this.options.activeIndicatorClass) + } + }, + + initSlides: function (reload) { + if (!reload) { + this.indicatorContainer = this.container.find( + this.options.indicatorContainer + ) + if (this.indicatorContainer.length) { + this.indicatorPrototype = document.createElement('li') + this.indicators = this.indicatorContainer[0].children + } + } + initSlides.call(this, reload) + }, + + addSlide: function (index) { + addSlide.call(this, index) + this.addIndicator(index) + }, + + resetSlides: function () { + resetSlides.call(this) + this.indicatorContainer.empty() + this.indicators = [] + }, + + handleClick: function (event) { + var target = event.target || event.srcElement + var parent = target.parentNode + if (parent === this.indicatorContainer[0]) { + // Click on indicator element + this.preventDefault(event) + this.slide(this.getNodeIndex(target)) + } else if (parent.parentNode === this.indicatorContainer[0]) { + // Click on indicator child element + this.preventDefault(event) + this.slide(this.getNodeIndex(parent)) + } else { + return handleClick.call(this, event) + } + }, + + handleSlide: function (index) { + handleSlide.call(this, index) + this.setActiveIndicator(index) + }, + + handleClose: function () { + if (this.activeIndicator) { + this.activeIndicator + .removeClass(this.options.activeIndicatorClass) + } + handleClose.call(this) + } + + }) + + return Gallery +})) diff --git a/public/bower_components/blueimp-gallery/js/blueimp-gallery-video.js b/public/bower_components/blueimp-gallery/js/blueimp-gallery-video.js new file mode 100755 index 0000000..3d5ef35 --- /dev/null +++ b/public/bower_components/blueimp-gallery/js/blueimp-gallery-video.js @@ -0,0 +1,171 @@ +/* + * blueimp Gallery Video Factory JS + * https://github.com/blueimp/Gallery + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* global define, window, document */ + +;(function (factory) { + 'use strict' + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + './blueimp-helper', + './blueimp-gallery' + ], factory) + } else { + // Browser globals: + factory( + window.blueimp.helper || window.jQuery, + window.blueimp.Gallery + ) + } +}(function ($, Gallery) { + 'use strict' + + $.extend(Gallery.prototype.options, { + // The class for video content elements: + videoContentClass: 'video-content', + // The class for video when it is loading: + videoLoadingClass: 'video-loading', + // The class for video when it is playing: + videoPlayingClass: 'video-playing', + // The list object property (or data attribute) for the video poster URL: + videoPosterProperty: 'poster', + // The list object property (or data attribute) for the video sources array: + videoSourcesProperty: 'sources' + }) + + var handleSlide = Gallery.prototype.handleSlide + + $.extend(Gallery.prototype, { + handleSlide: function (index) { + handleSlide.call(this, index) + if (this.playingVideo) { + this.playingVideo.pause() + } + }, + + videoFactory: function (obj, callback, videoInterface) { + var that = this + var options = this.options + var videoContainerNode = this.elementPrototype.cloneNode(false) + var videoContainer = $(videoContainerNode) + var errorArgs = [{ + type: 'error', + target: videoContainerNode + }] + var video = videoInterface || document.createElement('video') + var url = this.getItemProperty(obj, options.urlProperty) + var type = this.getItemProperty(obj, options.typeProperty) + var title = this.getItemProperty(obj, options.titleProperty) + var posterUrl = this.getItemProperty(obj, options.videoPosterProperty) + var posterImage + var sources = this.getItemProperty( + obj, + options.videoSourcesProperty + ) + var source + var playMediaControl + var isLoading + var hasControls + videoContainer.addClass(options.videoContentClass) + if (title) { + videoContainerNode.title = title + } + if (video.canPlayType) { + if (url && type && video.canPlayType(type)) { + video.src = url + } else { + while (sources && sources.length) { + source = sources.shift() + url = this.getItemProperty(source, options.urlProperty) + type = this.getItemProperty(source, options.typeProperty) + if (url && type && video.canPlayType(type)) { + video.src = url + break + } + } + } + } + if (posterUrl) { + video.poster = posterUrl + posterImage = this.imagePrototype.cloneNode(false) + $(posterImage).addClass(options.toggleClass) + posterImage.src = posterUrl + posterImage.draggable = false + videoContainerNode.appendChild(posterImage) + } + playMediaControl = document.createElement('a') + playMediaControl.setAttribute('target', '_blank') + if (!videoInterface) { + playMediaControl.setAttribute('download', title) + } + playMediaControl.href = url + if (video.src) { + video.controls = true + ;(videoInterface || $(video)) + .on('error', function () { + that.setTimeout(callback, errorArgs) + }) + .on('pause', function () { + if (video.seeking) return + isLoading = false + videoContainer + .removeClass(that.options.videoLoadingClass) + .removeClass(that.options.videoPlayingClass) + if (hasControls) { + that.container.addClass(that.options.controlsClass) + } + delete that.playingVideo + if (that.interval) { + that.play() + } + }) + .on('playing', function () { + isLoading = false + videoContainer + .removeClass(that.options.videoLoadingClass) + .addClass(that.options.videoPlayingClass) + if (that.container.hasClass(that.options.controlsClass)) { + hasControls = true + that.container.removeClass(that.options.controlsClass) + } else { + hasControls = false + } + }) + .on('play', function () { + window.clearTimeout(that.timeout) + isLoading = true + videoContainer.addClass(that.options.videoLoadingClass) + that.playingVideo = video + }) + $(playMediaControl).on('click', function (event) { + that.preventDefault(event) + if (isLoading) { + video.pause() + } else { + video.play() + } + }) + videoContainerNode.appendChild( + (videoInterface && videoInterface.element) || video + ) + } + videoContainerNode.appendChild(playMediaControl) + this.setTimeout(callback, [{ + type: 'load', + target: videoContainerNode + }]) + return videoContainerNode + } + }) + + return Gallery +})) diff --git a/public/bower_components/blueimp-gallery/js/blueimp-gallery-vimeo.js b/public/bower_components/blueimp-gallery/js/blueimp-gallery-vimeo.js new file mode 100755 index 0000000..2045347 --- /dev/null +++ b/public/bower_components/blueimp-gallery/js/blueimp-gallery-vimeo.js @@ -0,0 +1,213 @@ +/* + * blueimp Gallery Vimeo Video Factory JS + * https://github.com/blueimp/Gallery + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* global define, window, document, $f */ + +;(function (factory) { + 'use strict' + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + './blueimp-helper', + './blueimp-gallery-video' + ], factory) + } else { + // Browser globals: + factory( + window.blueimp.helper || window.jQuery, + window.blueimp.Gallery + ) + } +}(function ($, Gallery) { + 'use strict' + + if (!window.postMessage) { + return Gallery + } + + $.extend(Gallery.prototype.options, { + // The list object property (or data attribute) with the Vimeo video id: + vimeoVideoIdProperty: 'vimeo', + // The URL for the Vimeo video player, can be extended with custom parameters: + // https://developer.vimeo.com/player/embedding + vimeoPlayerUrl: '//player.vimeo.com/video/VIDEO_ID?api=1&player_id=PLAYER_ID', + // The prefix for the Vimeo video player ID: + vimeoPlayerIdPrefix: 'vimeo-player-', + // Require a click on the native Vimeo player for the initial playback: + vimeoClickToPlay: true + }) + + var textFactory = Gallery.prototype.textFactory || + Gallery.prototype.imageFactory + var VimeoPlayer = function (url, videoId, playerId, clickToPlay) { + this.url = url + this.videoId = videoId + this.playerId = playerId + this.clickToPlay = clickToPlay + this.element = document.createElement('div') + this.listeners = {} + } + var counter = 0 + + $.extend(VimeoPlayer.prototype, { + canPlayType: function () { + return true + }, + + on: function (type, func) { + this.listeners[type] = func + return this + }, + + loadAPI: function () { + var that = this + var apiUrl = '//f.vimeocdn.com/js/froogaloop2.min.js' + var scriptTags = document.getElementsByTagName('script') + var i = scriptTags.length + var scriptTag + var called + function callback () { + if (!called && that.playOnReady) { + that.play() + } + called = true + } + while (i) { + i -= 1 + if (scriptTags[i].src === apiUrl) { + scriptTag = scriptTags[i] + break + } + } + if (!scriptTag) { + scriptTag = document.createElement('script') + scriptTag.src = apiUrl + } + $(scriptTag).on('load', callback) + scriptTags[0].parentNode.insertBefore(scriptTag, scriptTags[0]) + // Fix for cached scripts on IE 8: + if (/loaded|complete/.test(scriptTag.readyState)) { + callback() + } + }, + + onReady: function () { + var that = this + this.ready = true + this.player.addEvent('play', function () { + that.hasPlayed = true + that.onPlaying() + }) + this.player.addEvent('pause', function () { + that.onPause() + }) + this.player.addEvent('finish', function () { + that.onPause() + }) + if (this.playOnReady) { + this.play() + } + }, + + onPlaying: function () { + if (this.playStatus < 2) { + this.listeners.playing() + this.playStatus = 2 + } + }, + + onPause: function () { + this.listeners.pause() + delete this.playStatus + }, + + insertIframe: function () { + var iframe = document.createElement('iframe') + iframe.src = this.url + .replace('VIDEO_ID', this.videoId) + .replace('PLAYER_ID', this.playerId) + iframe.id = this.playerId + this.element.parentNode.replaceChild(iframe, this.element) + this.element = iframe + }, + + play: function () { + var that = this + if (!this.playStatus) { + this.listeners.play() + this.playStatus = 1 + } + if (this.ready) { + if (!this.hasPlayed && (this.clickToPlay || (window.navigator && + /iP(hone|od|ad)/.test(window.navigator.platform)))) { + // Manually trigger the playing callback if clickToPlay + // is enabled and to workaround a limitation in iOS, + // which requires synchronous user interaction to start + // the video playback: + this.onPlaying() + } else { + this.player.api('play') + } + } else { + this.playOnReady = true + if (!window.$f) { + this.loadAPI() + } else if (!this.player) { + this.insertIframe() + this.player = $f(this.element) + this.player.addEvent('ready', function () { + that.onReady() + }) + } + } + }, + + pause: function () { + if (this.ready) { + this.player.api('pause') + } else if (this.playStatus) { + delete this.playOnReady + this.listeners.pause() + delete this.playStatus + } + } + + }) + + $.extend(Gallery.prototype, { + VimeoPlayer: VimeoPlayer, + + textFactory: function (obj, callback) { + var options = this.options + var videoId = this.getItemProperty(obj, options.vimeoVideoIdProperty) + if (videoId) { + if (this.getItemProperty(obj, options.urlProperty) === undefined) { + obj[options.urlProperty] = '//vimeo.com/' + videoId + } + counter += 1 + return this.videoFactory( + obj, + callback, + new VimeoPlayer( + options.vimeoPlayerUrl, + videoId, + options.vimeoPlayerIdPrefix + counter, + options.vimeoClickToPlay + ) + ) + } + return textFactory.call(this, obj, callback) + } + + }) + + return Gallery +})) diff --git a/public/bower_components/blueimp-gallery/js/blueimp-gallery-youtube.js b/public/bower_components/blueimp-gallery/js/blueimp-gallery-youtube.js new file mode 100755 index 0000000..9d4f23e --- /dev/null +++ b/public/bower_components/blueimp-gallery/js/blueimp-gallery-youtube.js @@ -0,0 +1,228 @@ +/* + * blueimp Gallery YouTube Video Factory JS + * https://github.com/blueimp/Gallery + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* global define, window, document, YT */ + +;(function (factory) { + 'use strict' + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + './blueimp-helper', + './blueimp-gallery-video' + ], factory) + } else { + // Browser globals: + factory( + window.blueimp.helper || window.jQuery, + window.blueimp.Gallery + ) + } +}(function ($, Gallery) { + 'use strict' + + if (!window.postMessage) { + return Gallery + } + + $.extend(Gallery.prototype.options, { + // The list object property (or data attribute) with the YouTube video id: + youTubeVideoIdProperty: 'youtube', + // Optional object with parameters passed to the YouTube video player: + // https://developers.google.com/youtube/player_parameters + youTubePlayerVars: { + wmode: 'transparent' + }, + // Require a click on the native YouTube player for the initial playback: + youTubeClickToPlay: true + }) + + var textFactory = Gallery.prototype.textFactory || + Gallery.prototype.imageFactory + var YouTubePlayer = function (videoId, playerVars, clickToPlay) { + this.videoId = videoId + this.playerVars = playerVars + this.clickToPlay = clickToPlay + this.element = document.createElement('div') + this.listeners = {} + } + + $.extend(YouTubePlayer.prototype, { + canPlayType: function () { + return true + }, + + on: function (type, func) { + this.listeners[type] = func + return this + }, + + loadAPI: function () { + var that = this + var onYouTubeIframeAPIReady = window.onYouTubeIframeAPIReady + var apiUrl = '//www.youtube.com/iframe_api' + var scriptTags = document.getElementsByTagName('script') + var i = scriptTags.length + var scriptTag + window.onYouTubeIframeAPIReady = function () { + if (onYouTubeIframeAPIReady) { + onYouTubeIframeAPIReady.apply(this) + } + if (that.playOnReady) { + that.play() + } + } + while (i) { + i -= 1 + if (scriptTags[i].src === apiUrl) { + return + } + } + scriptTag = document.createElement('script') + scriptTag.src = apiUrl + scriptTags[0].parentNode.insertBefore(scriptTag, scriptTags[0]) + }, + + onReady: function () { + this.ready = true + if (this.playOnReady) { + this.play() + } + }, + + onPlaying: function () { + if (this.playStatus < 2) { + this.listeners.playing() + this.playStatus = 2 + } + }, + + onPause: function () { + Gallery.prototype.setTimeout.call( + this, + this.checkSeek, + null, + 2000 + ) + }, + + checkSeek: function () { + if (this.stateChange === YT.PlayerState.PAUSED || + this.stateChange === YT.PlayerState.ENDED) { + // check if current state change is actually paused + this.listeners.pause() + delete this.playStatus + } + }, + + onStateChange: function (event) { + switch (event.data) { + case YT.PlayerState.PLAYING: + this.hasPlayed = true + this.onPlaying() + break + case YT.PlayerState.PAUSED: + case YT.PlayerState.ENDED: + this.onPause() + break + } + // Save most recent state change to this.stateChange + this.stateChange = event.data + }, + + onError: function (event) { + this.listeners.error(event) + }, + + play: function () { + var that = this + if (!this.playStatus) { + this.listeners.play() + this.playStatus = 1 + } + if (this.ready) { + if (!this.hasPlayed && (this.clickToPlay || (window.navigator && + /iP(hone|od|ad)/.test(window.navigator.platform)))) { + // Manually trigger the playing callback if clickToPlay + // is enabled and to workaround a limitation in iOS, + // which requires synchronous user interaction to start + // the video playback: + this.onPlaying() + } else { + this.player.playVideo() + } + } else { + this.playOnReady = true + if (!(window.YT && YT.Player)) { + this.loadAPI() + } else if (!this.player) { + this.player = new YT.Player(this.element, { + videoId: this.videoId, + playerVars: this.playerVars, + events: { + onReady: function () { + that.onReady() + }, + onStateChange: function (event) { + that.onStateChange(event) + }, + onError: function (event) { + that.onError(event) + } + } + }) + } + } + }, + + pause: function () { + if (this.ready) { + this.player.pauseVideo() + } else if (this.playStatus) { + delete this.playOnReady + this.listeners.pause() + delete this.playStatus + } + } + + }) + + $.extend(Gallery.prototype, { + YouTubePlayer: YouTubePlayer, + + textFactory: function (obj, callback) { + var options = this.options + var videoId = this.getItemProperty(obj, options.youTubeVideoIdProperty) + if (videoId) { + if (this.getItemProperty(obj, options.urlProperty) === undefined) { + obj[options.urlProperty] = '//www.youtube.com/watch?v=' + videoId + } + if (this.getItemProperty(obj, options.videoPosterProperty) === undefined) { + obj[options.videoPosterProperty] = '//img.youtube.com/vi/' + videoId + + '/maxresdefault.jpg' + } + return this.videoFactory( + obj, + callback, + new YouTubePlayer( + videoId, + options.youTubePlayerVars, + options.youTubeClickToPlay + ) + ) + } + return textFactory.call(this, obj, callback) + } + + }) + + return Gallery +})) diff --git a/public/bower_components/blueimp-gallery/js/blueimp-gallery.js b/public/bower_components/blueimp-gallery/js/blueimp-gallery.js new file mode 100755 index 0000000..5c7244b --- /dev/null +++ b/public/bower_components/blueimp-gallery/js/blueimp-gallery.js @@ -0,0 +1,1377 @@ +/* + * blueimp Gallery JS + * https://github.com/blueimp/Gallery + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Swipe implementation based on + * https://github.com/bradbirdsall/Swipe + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* global define, window, document, DocumentTouch */ + +;(function (factory) { + 'use strict' + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define(['./blueimp-helper'], factory) + } else { + // Browser globals: + window.blueimp = window.blueimp || {} + window.blueimp.Gallery = factory( + window.blueimp.helper || window.jQuery + ) + } +}(function ($) { + 'use strict' + + function Gallery (list, options) { + if (document.body.style.maxHeight === undefined) { + // document.body.style.maxHeight is undefined on IE6 and lower + return null + } + if (!this || this.options !== Gallery.prototype.options) { + // Called as function instead of as constructor, + // so we simply return a new instance: + return new Gallery(list, options) + } + if (!list || !list.length) { + this.console.log( + 'blueimp Gallery: No or empty list provided as first argument.', + list + ) + return + } + this.list = list + this.num = list.length + this.initOptions(options) + this.initialize() + } + + $.extend(Gallery.prototype, { + options: { + // The Id, element or querySelector of the gallery widget: + container: '#blueimp-gallery', + // The tag name, Id, element or querySelector of the slides container: + slidesContainer: 'div', + // The tag name, Id, element or querySelector of the title element: + titleElement: 'h3', + // The class to add when the gallery is visible: + displayClass: 'blueimp-gallery-display', + // The class to add when the gallery controls are visible: + controlsClass: 'blueimp-gallery-controls', + // The class to add when the gallery only displays one element: + singleClass: 'blueimp-gallery-single', + // The class to add when the left edge has been reached: + leftEdgeClass: 'blueimp-gallery-left', + // The class to add when the right edge has been reached: + rightEdgeClass: 'blueimp-gallery-right', + // The class to add when the automatic slideshow is active: + playingClass: 'blueimp-gallery-playing', + // The class for all slides: + slideClass: 'slide', + // The slide class for loading elements: + slideLoadingClass: 'slide-loading', + // The slide class for elements that failed to load: + slideErrorClass: 'slide-error', + // The class for the content element loaded into each slide: + slideContentClass: 'slide-content', + // The class for the "toggle" control: + toggleClass: 'toggle', + // The class for the "prev" control: + prevClass: 'prev', + // The class for the "next" control: + nextClass: 'next', + // The class for the "close" control: + closeClass: 'close', + // The class for the "play-pause" toggle control: + playPauseClass: 'play-pause', + // The list object property (or data attribute) with the object type: + typeProperty: 'type', + // The list object property (or data attribute) with the object title: + titleProperty: 'title', + // The list object property (or data attribute) with the object URL: + urlProperty: 'href', + // The list object property (or data attribute) with the object srcset URL(s): + srcsetProperty: 'urlset', + // The gallery listens for transitionend events before triggering the + // opened and closed events, unless the following option is set to false: + displayTransition: true, + // Defines if the gallery slides are cleared from the gallery modal, + // or reused for the next gallery initialization: + clearSlides: true, + // Defines if images should be stretched to fill the available space, + // while maintaining their aspect ratio (will only be enabled for browsers + // supporting background-size="contain", which excludes IE < 9). + // Set to "cover", to make images cover all available space (requires + // support for background-size="cover", which excludes IE < 9): + stretchImages: false, + // Toggle the controls on pressing the Return key: + toggleControlsOnReturn: true, + // Toggle the controls on slide click: + toggleControlsOnSlideClick: true, + // Toggle the automatic slideshow interval on pressing the Space key: + toggleSlideshowOnSpace: true, + // Navigate the gallery by pressing left and right on the keyboard: + enableKeyboardNavigation: true, + // Close the gallery on pressing the Esc key: + closeOnEscape: true, + // Close the gallery when clicking on an empty slide area: + closeOnSlideClick: true, + // Close the gallery by swiping up or down: + closeOnSwipeUpOrDown: true, + // Emulate touch events on mouse-pointer devices such as desktop browsers: + emulateTouchEvents: true, + // Stop touch events from bubbling up to ancestor elements of the Gallery: + stopTouchEventsPropagation: false, + // Hide the page scrollbars: + hidePageScrollbars: true, + // Stops any touches on the container from scrolling the page: + disableScroll: true, + // Carousel mode (shortcut for carousel specific options): + carousel: false, + // Allow continuous navigation, moving from last to first + // and from first to last slide: + continuous: true, + // Remove elements outside of the preload range from the DOM: + unloadElements: true, + // Start with the automatic slideshow: + startSlideshow: false, + // Delay in milliseconds between slides for the automatic slideshow: + slideshowInterval: 5000, + // The starting index as integer. + // Can also be an object of the given list, + // or an equal object with the same url property: + index: 0, + // The number of elements to load around the current index: + preloadRange: 2, + // The transition speed between slide changes in milliseconds: + transitionSpeed: 400, + // The transition speed for automatic slide changes, set to an integer + // greater 0 to override the default transition speed: + slideshowTransitionSpeed: undefined, + // The event object for which the default action will be canceled + // on Gallery initialization (e.g. the click event to open the Gallery): + event: undefined, + // Callback function executed when the Gallery is initialized. + // Is called with the gallery instance as "this" object: + onopen: undefined, + // Callback function executed when the Gallery has been initialized + // and the initialization transition has been completed. + // Is called with the gallery instance as "this" object: + onopened: undefined, + // Callback function executed on slide change. + // Is called with the gallery instance as "this" object and the + // current index and slide as arguments: + onslide: undefined, + // Callback function executed after the slide change transition. + // Is called with the gallery instance as "this" object and the + // current index and slide as arguments: + onslideend: undefined, + // Callback function executed on slide content load. + // Is called with the gallery instance as "this" object and the + // slide index and slide element as arguments: + onslidecomplete: undefined, + // Callback function executed when the Gallery is about to be closed. + // Is called with the gallery instance as "this" object: + onclose: undefined, + // Callback function executed when the Gallery has been closed + // and the closing transition has been completed. + // Is called with the gallery instance as "this" object: + onclosed: undefined + }, + + carouselOptions: { + hidePageScrollbars: false, + toggleControlsOnReturn: false, + toggleSlideshowOnSpace: false, + enableKeyboardNavigation: false, + closeOnEscape: false, + closeOnSlideClick: false, + closeOnSwipeUpOrDown: false, + disableScroll: false, + startSlideshow: true + }, + + console: window.console && typeof window.console.log === 'function' + ? window.console + : {log: function () {}}, + + // Detect touch, transition, transform and background-size support: + support: (function (element) { + var support = { + touch: window.ontouchstart !== undefined || + (window.DocumentTouch && document instanceof DocumentTouch) + } + var transitions = { + webkitTransition: { + end: 'webkitTransitionEnd', + prefix: '-webkit-' + }, + MozTransition: { + end: 'transitionend', + prefix: '-moz-' + }, + OTransition: { + end: 'otransitionend', + prefix: '-o-' + }, + transition: { + end: 'transitionend', + prefix: '' + } + } + var prop + for (prop in transitions) { + if (transitions.hasOwnProperty(prop) && + element.style[prop] !== undefined) { + support.transition = transitions[prop] + support.transition.name = prop + break + } + } + function elementTests () { + var transition = support.transition + var prop + var translateZ + document.body.appendChild(element) + if (transition) { + prop = transition.name.slice(0, -9) + 'ransform' + if (element.style[prop] !== undefined) { + element.style[prop] = 'translateZ(0)' + translateZ = window.getComputedStyle(element) + .getPropertyValue(transition.prefix + 'transform') + support.transform = { + prefix: transition.prefix, + name: prop, + translate: true, + translateZ: !!translateZ && translateZ !== 'none' + } + } + } + if (element.style.backgroundSize !== undefined) { + support.backgroundSize = {} + element.style.backgroundSize = 'contain' + support.backgroundSize.contain = window + .getComputedStyle(element) + .getPropertyValue('background-size') === 'contain' + element.style.backgroundSize = 'cover' + support.backgroundSize.cover = window + .getComputedStyle(element) + .getPropertyValue('background-size') === 'cover' + } + document.body.removeChild(element) + } + if (document.body) { + elementTests() + } else { + $(document).on('DOMContentLoaded', elementTests) + } + return support + // Test element, has to be standard HTML and must not be hidden + // for the CSS3 tests using window.getComputedStyle to be applicable: + }(document.createElement('div'))), + + requestAnimationFrame: window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame, + + initialize: function () { + this.initStartIndex() + if (this.initWidget() === false) { + return false + } + this.initEventListeners() + // Load the slide at the given index: + this.onslide(this.index) + // Manually trigger the slideend event for the initial slide: + this.ontransitionend() + // Start the automatic slideshow if applicable: + if (this.options.startSlideshow) { + this.play() + } + }, + + slide: function (to, speed) { + window.clearTimeout(this.timeout) + var index = this.index + var direction + var naturalDirection + var diff + if (index === to || this.num === 1) { + return + } + if (!speed) { + speed = this.options.transitionSpeed + } + if (this.support.transform) { + if (!this.options.continuous) { + to = this.circle(to) + } + // 1: backward, -1: forward: + direction = Math.abs(index - to) / (index - to) + // Get the actual position of the slide: + if (this.options.continuous) { + naturalDirection = direction + direction = -this.positions[this.circle(to)] / this.slideWidth + // If going forward but to < index, use to = slides.length + to + // If going backward but to > index, use to = -slides.length + to + if (direction !== naturalDirection) { + to = -direction * this.num + to + } + } + diff = Math.abs(index - to) - 1 + // Move all the slides between index and to in the right direction: + while (diff) { + diff -= 1 + this.move( + this.circle((to > index ? to : index) - diff - 1), + this.slideWidth * direction, + 0 + ) + } + to = this.circle(to) + this.move(index, this.slideWidth * direction, speed) + this.move(to, 0, speed) + if (this.options.continuous) { + this.move( + this.circle(to - direction), + -(this.slideWidth * direction), + 0 + ) + } + } else { + to = this.circle(to) + this.animate(index * -this.slideWidth, to * -this.slideWidth, speed) + } + this.onslide(to) + }, + + getIndex: function () { + return this.index + }, + + getNumber: function () { + return this.num + }, + + prev: function () { + if (this.options.continuous || this.index) { + this.slide(this.index - 1) + } + }, + + next: function () { + if (this.options.continuous || this.index < this.num - 1) { + this.slide(this.index + 1) + } + }, + + play: function (time) { + var that = this + window.clearTimeout(this.timeout) + this.interval = time || this.options.slideshowInterval + if (this.elements[this.index] > 1) { + this.timeout = this.setTimeout( + (!this.requestAnimationFrame && this.slide) || function (to, speed) { + that.animationFrameId = that.requestAnimationFrame.call( + window, + function () { + that.slide(to, speed) + } + ) + }, + [this.index + 1, this.options.slideshowTransitionSpeed], + this.interval + ) + } + this.container.addClass(this.options.playingClass) + }, + + pause: function () { + window.clearTimeout(this.timeout) + this.interval = null + this.container.removeClass(this.options.playingClass) + }, + + add: function (list) { + var i + if (!list.concat) { + // Make a real array out of the list to add: + list = Array.prototype.slice.call(list) + } + if (!this.list.concat) { + // Make a real array out of the Gallery list: + this.list = Array.prototype.slice.call(this.list) + } + this.list = this.list.concat(list) + this.num = this.list.length + if (this.num > 2 && this.options.continuous === null) { + this.options.continuous = true + this.container.removeClass(this.options.leftEdgeClass) + } + this.container + .removeClass(this.options.rightEdgeClass) + .removeClass(this.options.singleClass) + for (i = this.num - list.length; i < this.num; i += 1) { + this.addSlide(i) + this.positionSlide(i) + } + this.positions.length = this.num + this.initSlides(true) + }, + + resetSlides: function () { + this.slidesContainer.empty() + this.unloadAllSlides() + this.slides = [] + }, + + handleClose: function () { + var options = this.options + this.destroyEventListeners() + // Cancel the slideshow: + this.pause() + this.container[0].style.display = 'none' + this.container + .removeClass(options.displayClass) + .removeClass(options.singleClass) + .removeClass(options.leftEdgeClass) + .removeClass(options.rightEdgeClass) + if (options.hidePageScrollbars) { + document.body.style.overflow = this.bodyOverflowStyle + } + if (this.options.clearSlides) { + this.resetSlides() + } + if (this.options.onclosed) { + this.options.onclosed.call(this) + } + }, + + close: function () { + var that = this + function closeHandler (event) { + if (event.target === that.container[0]) { + that.container.off( + that.support.transition.end, + closeHandler + ) + that.handleClose() + } + } + if (this.options.onclose) { + this.options.onclose.call(this) + } + if (this.support.transition && this.options.displayTransition) { + this.container.on( + this.support.transition.end, + closeHandler + ) + this.container.removeClass(this.options.displayClass) + } else { + this.handleClose() + } + }, + + circle: function (index) { + // Always return a number inside of the slides index range: + return (this.num + (index % this.num)) % this.num + }, + + move: function (index, dist, speed) { + this.translateX(index, dist, speed) + this.positions[index] = dist + }, + + translate: function (index, x, y, speed) { + var style = this.slides[index].style + var transition = this.support.transition + var transform = this.support.transform + style[transition.name + 'Duration'] = speed + 'ms' + style[transform.name] = 'translate(' + x + 'px, ' + y + 'px)' + + (transform.translateZ ? ' translateZ(0)' : '') + }, + + translateX: function (index, x, speed) { + this.translate(index, x, 0, speed) + }, + + translateY: function (index, y, speed) { + this.translate(index, 0, y, speed) + }, + + animate: function (from, to, speed) { + if (!speed) { + this.slidesContainer[0].style.left = to + 'px' + return + } + var that = this + var start = new Date().getTime() + var timer = window.setInterval(function () { + var timeElap = new Date().getTime() - start + if (timeElap > speed) { + that.slidesContainer[0].style.left = to + 'px' + that.ontransitionend() + window.clearInterval(timer) + return + } + that.slidesContainer[0].style.left = (((to - from) * + (Math.floor((timeElap / speed) * 100) / 100)) + + from) + 'px' + }, 4) + }, + + preventDefault: function (event) { + if (event.preventDefault) { + event.preventDefault() + } else { + event.returnValue = false + } + }, + + stopPropagation: function (event) { + if (event.stopPropagation) { + event.stopPropagation() + } else { + event.cancelBubble = true + } + }, + + onresize: function () { + this.initSlides(true) + }, + + onmousedown: function (event) { + // Trigger on clicks of the left mouse button only + // and exclude video elements: + if (event.which && event.which === 1 && + event.target.nodeName !== 'VIDEO') { + // Preventing the default mousedown action is required + // to make touch emulation work with Firefox: + event.preventDefault() + ;(event.originalEvent || event).touches = [{ + pageX: event.pageX, + pageY: event.pageY + }] + this.ontouchstart(event) + } + }, + + onmousemove: function (event) { + if (this.touchStart) { + (event.originalEvent || event).touches = [{ + pageX: event.pageX, + pageY: event.pageY + }] + this.ontouchmove(event) + } + }, + + onmouseup: function (event) { + if (this.touchStart) { + this.ontouchend(event) + delete this.touchStart + } + }, + + onmouseout: function (event) { + if (this.touchStart) { + var target = event.target + var related = event.relatedTarget + if (!related || (related !== target && + !$.contains(target, related))) { + this.onmouseup(event) + } + } + }, + + ontouchstart: function (event) { + if (this.options.stopTouchEventsPropagation) { + this.stopPropagation(event) + } + // jQuery doesn't copy touch event properties by default, + // so we have to access the originalEvent object: + var touches = (event.originalEvent || event).touches[0] + this.touchStart = { + // Remember the initial touch coordinates: + x: touches.pageX, + y: touches.pageY, + // Store the time to determine touch duration: + time: Date.now() + } + // Helper variable to detect scroll movement: + this.isScrolling = undefined + // Reset delta values: + this.touchDelta = {} + }, + + ontouchmove: function (event) { + if (this.options.stopTouchEventsPropagation) { + this.stopPropagation(event) + } + // jQuery doesn't copy touch event properties by default, + // so we have to access the originalEvent object: + var touches = (event.originalEvent || event).touches[0] + var scale = (event.originalEvent || event).scale + var index = this.index + var touchDeltaX + var indices + // Ensure this is a one touch swipe and not, e.g. a pinch: + if (touches.length > 1 || (scale && scale !== 1)) { + return + } + if (this.options.disableScroll) { + event.preventDefault() + } + // Measure change in x and y coordinates: + this.touchDelta = { + x: touches.pageX - this.touchStart.x, + y: touches.pageY - this.touchStart.y + } + touchDeltaX = this.touchDelta.x + // Detect if this is a vertical scroll movement (run only once per touch): + if (this.isScrolling === undefined) { + this.isScrolling = this.isScrolling || + Math.abs(touchDeltaX) < Math.abs(this.touchDelta.y) + } + if (!this.isScrolling) { + // Always prevent horizontal scroll: + event.preventDefault() + // Stop the slideshow: + window.clearTimeout(this.timeout) + if (this.options.continuous) { + indices = [ + this.circle(index + 1), + index, + this.circle(index - 1) + ] + } else { + // Increase resistance if first slide and sliding left + // or last slide and sliding right: + this.touchDelta.x = touchDeltaX = + touchDeltaX / + ( + ((!index && touchDeltaX > 0) || + (index === this.num - 1 && touchDeltaX < 0)) + ? (Math.abs(touchDeltaX) / this.slideWidth + 1) + : 1 + ) + indices = [index] + if (index) { + indices.push(index - 1) + } + if (index < this.num - 1) { + indices.unshift(index + 1) + } + } + while (indices.length) { + index = indices.pop() + this.translateX(index, touchDeltaX + this.positions[index], 0) + } + } else if (this.options.closeOnSwipeUpOrDown) { + this.translateY(index, this.touchDelta.y + this.positions[index], 0) + } + }, + + ontouchend: function (event) { + if (this.options.stopTouchEventsPropagation) { + this.stopPropagation(event) + } + var index = this.index + var speed = this.options.transitionSpeed + var slideWidth = this.slideWidth + var isShortDuration = Number(Date.now() - this.touchStart.time) < 250 + // Determine if slide attempt triggers next/prev slide: + var isValidSlide = + (isShortDuration && Math.abs(this.touchDelta.x) > 20) || + Math.abs(this.touchDelta.x) > slideWidth / 2 + // Determine if slide attempt is past start or end: + var isPastBounds = (!index && this.touchDelta.x > 0) || + (index === this.num - 1 && this.touchDelta.x < 0) + var isValidClose = !isValidSlide && this.options.closeOnSwipeUpOrDown && + ((isShortDuration && Math.abs(this.touchDelta.y) > 20) || + Math.abs(this.touchDelta.y) > this.slideHeight / 2) + var direction + var indexForward + var indexBackward + var distanceForward + var distanceBackward + if (this.options.continuous) { + isPastBounds = false + } + // Determine direction of swipe (true: right, false: left): + direction = this.touchDelta.x < 0 ? -1 : 1 + if (!this.isScrolling) { + if (isValidSlide && !isPastBounds) { + indexForward = index + direction + indexBackward = index - direction + distanceForward = slideWidth * direction + distanceBackward = -slideWidth * direction + if (this.options.continuous) { + this.move(this.circle(indexForward), distanceForward, 0) + this.move(this.circle(index - 2 * direction), distanceBackward, 0) + } else if (indexForward >= 0 && + indexForward < this.num) { + this.move(indexForward, distanceForward, 0) + } + this.move(index, this.positions[index] + distanceForward, speed) + this.move( + this.circle(indexBackward), + this.positions[this.circle(indexBackward)] + distanceForward, + speed + ) + index = this.circle(indexBackward) + this.onslide(index) + } else { + // Move back into position + if (this.options.continuous) { + this.move(this.circle(index - 1), -slideWidth, speed) + this.move(index, 0, speed) + this.move(this.circle(index + 1), slideWidth, speed) + } else { + if (index) { + this.move(index - 1, -slideWidth, speed) + } + this.move(index, 0, speed) + if (index < this.num - 1) { + this.move(index + 1, slideWidth, speed) + } + } + } + } else { + if (isValidClose) { + this.close() + } else { + // Move back into position + this.translateY(index, 0, speed) + } + } + }, + + ontouchcancel: function (event) { + if (this.touchStart) { + this.ontouchend(event) + delete this.touchStart + } + }, + + ontransitionend: function (event) { + var slide = this.slides[this.index] + if (!event || slide === event.target) { + if (this.interval) { + this.play() + } + this.setTimeout( + this.options.onslideend, + [this.index, slide] + ) + } + }, + + oncomplete: function (event) { + var target = event.target || event.srcElement + var parent = target && target.parentNode + var index + if (!target || !parent) { + return + } + index = this.getNodeIndex(parent) + $(parent).removeClass(this.options.slideLoadingClass) + if (event.type === 'error') { + $(parent).addClass(this.options.slideErrorClass) + this.elements[index] = 3 // Fail + } else { + this.elements[index] = 2 // Done + } + // Fix for IE7's lack of support for percentage max-height: + if (target.clientHeight > this.container[0].clientHeight) { + target.style.maxHeight = this.container[0].clientHeight + } + if (this.interval && this.slides[this.index] === parent) { + this.play() + } + this.setTimeout( + this.options.onslidecomplete, + [index, parent] + ) + }, + + onload: function (event) { + this.oncomplete(event) + }, + + onerror: function (event) { + this.oncomplete(event) + }, + + onkeydown: function (event) { + switch (event.which || event.keyCode) { + case 13: // Return + if (this.options.toggleControlsOnReturn) { + this.preventDefault(event) + this.toggleControls() + } + break + case 27: // Esc + if (this.options.closeOnEscape) { + this.close() + // prevent Esc from closing other things + event.stopImmediatePropagation() + } + break + case 32: // Space + if (this.options.toggleSlideshowOnSpace) { + this.preventDefault(event) + this.toggleSlideshow() + } + break + case 37: // Left + if (this.options.enableKeyboardNavigation) { + this.preventDefault(event) + this.prev() + } + break + case 39: // Right + if (this.options.enableKeyboardNavigation) { + this.preventDefault(event) + this.next() + } + break + } + }, + + handleClick: function (event) { + var options = this.options + var target = event.target || event.srcElement + var parent = target.parentNode + function isTarget (className) { + return $(target).hasClass(className) || + $(parent).hasClass(className) + } + if (isTarget(options.toggleClass)) { + // Click on "toggle" control + this.preventDefault(event) + this.toggleControls() + } else if (isTarget(options.prevClass)) { + // Click on "prev" control + this.preventDefault(event) + this.prev() + } else if (isTarget(options.nextClass)) { + // Click on "next" control + this.preventDefault(event) + this.next() + } else if (isTarget(options.closeClass)) { + // Click on "close" control + this.preventDefault(event) + this.close() + } else if (isTarget(options.playPauseClass)) { + // Click on "play-pause" control + this.preventDefault(event) + this.toggleSlideshow() + } else if (parent === this.slidesContainer[0]) { + // Click on slide background + if (options.closeOnSlideClick) { + this.preventDefault(event) + this.close() + } else if (options.toggleControlsOnSlideClick) { + this.preventDefault(event) + this.toggleControls() + } + } else if (parent.parentNode && + parent.parentNode === this.slidesContainer[0]) { + // Click on displayed element + if (options.toggleControlsOnSlideClick) { + this.preventDefault(event) + this.toggleControls() + } + } + }, + + onclick: function (event) { + if (this.options.emulateTouchEvents && + this.touchDelta && (Math.abs(this.touchDelta.x) > 20 || + Math.abs(this.touchDelta.y) > 20)) { + delete this.touchDelta + return + } + return this.handleClick(event) + }, + + updateEdgeClasses: function (index) { + if (!index) { + this.container.addClass(this.options.leftEdgeClass) + } else { + this.container.removeClass(this.options.leftEdgeClass) + } + if (index === this.num - 1) { + this.container.addClass(this.options.rightEdgeClass) + } else { + this.container.removeClass(this.options.rightEdgeClass) + } + }, + + handleSlide: function (index) { + if (!this.options.continuous) { + this.updateEdgeClasses(index) + } + this.loadElements(index) + if (this.options.unloadElements) { + this.unloadElements(index) + } + this.setTitle(index) + }, + + onslide: function (index) { + this.index = index + this.handleSlide(index) + this.setTimeout(this.options.onslide, [index, this.slides[index]]) + }, + + setTitle: function (index) { + var text = this.slides[index].firstChild.title + var titleElement = this.titleElement + if (titleElement.length) { + this.titleElement.empty() + if (text) { + titleElement[0].appendChild(document.createTextNode(text)) + } + } + }, + + setTimeout: function (func, args, wait) { + var that = this + return func && window.setTimeout(function () { + func.apply(that, args || []) + }, wait || 0) + }, + + imageFactory: function (obj, callback) { + var that = this + var img = this.imagePrototype.cloneNode(false) + var url = obj + var backgroundSize = this.options.stretchImages + var called + var element + var title + function callbackWrapper (event) { + if (!called) { + event = { + type: event.type, + target: element + } + if (!element.parentNode) { + // Fix for IE7 firing the load event for + // cached images before the element could + // be added to the DOM: + return that.setTimeout(callbackWrapper, [event]) + } + called = true + $(img).off('load error', callbackWrapper) + if (backgroundSize) { + if (event.type === 'load') { + element.style.background = 'url("' + url + + '") center no-repeat' + element.style.backgroundSize = backgroundSize + } + } + callback(event) + } + } + if (typeof url !== 'string') { + url = this.getItemProperty(obj, this.options.urlProperty) + title = this.getItemProperty(obj, this.options.titleProperty) + } + if (backgroundSize === true) { + backgroundSize = 'contain' + } + backgroundSize = this.support.backgroundSize && + this.support.backgroundSize[backgroundSize] && backgroundSize + if (backgroundSize) { + element = this.elementPrototype.cloneNode(false) + } else { + element = img + img.draggable = false + } + if (title) { + element.title = title + } + $(img).on('load error', callbackWrapper) + img.src = url + return element + }, + + createElement: function (obj, callback) { + var type = obj && this.getItemProperty(obj, this.options.typeProperty) + var factory = (type && this[type.split('/')[0] + 'Factory']) || + this.imageFactory + var element = obj && factory.call(this, obj, callback) + var srcset = this.getItemProperty(obj, this.options.srcsetProperty) + if (!element) { + element = this.elementPrototype.cloneNode(false) + this.setTimeout(callback, [{ + type: 'error', + target: element + }]) + } + if (srcset) { + element.setAttribute('srcset', srcset) + } + $(element).addClass(this.options.slideContentClass) + return element + }, + + loadElement: function (index) { + if (!this.elements[index]) { + if (this.slides[index].firstChild) { + this.elements[index] = $(this.slides[index]) + .hasClass(this.options.slideErrorClass) ? 3 : 2 + } else { + this.elements[index] = 1 // Loading + $(this.slides[index]).addClass(this.options.slideLoadingClass) + this.slides[index].appendChild(this.createElement( + this.list[index], + this.proxyListener + )) + } + } + }, + + loadElements: function (index) { + var limit = Math.min(this.num, this.options.preloadRange * 2 + 1) + var j = index + var i + for (i = 0; i < limit; i += 1) { + // First load the current slide element (0), + // then the next one (+1), + // then the previous one (-2), + // then the next after next (+2), etc.: + j += i * (i % 2 === 0 ? -1 : 1) + // Connect the ends of the list to load slide elements for + // continuous navigation: + j = this.circle(j) + this.loadElement(j) + } + }, + + unloadElements: function (index) { + var i, + diff + for (i in this.elements) { + if (this.elements.hasOwnProperty(i)) { + diff = Math.abs(index - i) + if (diff > this.options.preloadRange && + diff + this.options.preloadRange < this.num) { + this.unloadSlide(i) + delete this.elements[i] + } + } + } + }, + + addSlide: function (index) { + var slide = this.slidePrototype.cloneNode(false) + slide.setAttribute('data-index', index) + this.slidesContainer[0].appendChild(slide) + this.slides.push(slide) + }, + + positionSlide: function (index) { + var slide = this.slides[index] + slide.style.width = this.slideWidth + 'px' + if (this.support.transform) { + slide.style.left = (index * -this.slideWidth) + 'px' + this.move( + index, this.index > index + ? -this.slideWidth + : (this.index < index ? this.slideWidth : 0), + 0 + ) + } + }, + + initSlides: function (reload) { + var clearSlides, + i + if (!reload) { + this.positions = [] + this.positions.length = this.num + this.elements = {} + this.imagePrototype = document.createElement('img') + this.elementPrototype = document.createElement('div') + this.slidePrototype = document.createElement('div') + $(this.slidePrototype).addClass(this.options.slideClass) + this.slides = this.slidesContainer[0].children + clearSlides = this.options.clearSlides || + this.slides.length !== this.num + } + this.slideWidth = this.container[0].offsetWidth + this.slideHeight = this.container[0].offsetHeight + this.slidesContainer[0].style.width = + (this.num * this.slideWidth) + 'px' + if (clearSlides) { + this.resetSlides() + } + for (i = 0; i < this.num; i += 1) { + if (clearSlides) { + this.addSlide(i) + } + this.positionSlide(i) + } + // Reposition the slides before and after the given index: + if (this.options.continuous && this.support.transform) { + this.move(this.circle(this.index - 1), -this.slideWidth, 0) + this.move(this.circle(this.index + 1), this.slideWidth, 0) + } + if (!this.support.transform) { + this.slidesContainer[0].style.left = + (this.index * -this.slideWidth) + 'px' + } + }, + + unloadSlide: function (index) { + var slide, + firstChild + slide = this.slides[index] + firstChild = slide.firstChild + if (firstChild !== null) { + slide.removeChild(firstChild) + } + }, + + unloadAllSlides: function () { + var i, + len + for (i = 0, len = this.slides.length; i < len; i++) { + this.unloadSlide(i) + } + }, + + toggleControls: function () { + var controlsClass = this.options.controlsClass + if (this.container.hasClass(controlsClass)) { + this.container.removeClass(controlsClass) + } else { + this.container.addClass(controlsClass) + } + }, + + toggleSlideshow: function () { + if (!this.interval) { + this.play() + } else { + this.pause() + } + }, + + getNodeIndex: function (element) { + return parseInt(element.getAttribute('data-index'), 10) + }, + + getNestedProperty: function (obj, property) { + property.replace( + // Matches native JavaScript notation in a String, + // e.g. '["doubleQuoteProp"].dotProp[2]' + /\[(?:'([^']+)'|"([^"]+)"|(\d+))\]|(?:(?:^|\.)([^\.\[]+))/g, + function (str, singleQuoteProp, doubleQuoteProp, arrayIndex, dotProp) { + var prop = dotProp || singleQuoteProp || doubleQuoteProp || + (arrayIndex && parseInt(arrayIndex, 10)) + if (str && obj) { + obj = obj[prop] + } + } + ) + return obj + }, + + getDataProperty: function (obj, property) { + if (obj.getAttribute) { + var prop = obj.getAttribute('data-' + + property.replace(/([A-Z])/g, '-$1').toLowerCase()) + if (typeof prop === 'string') { + if (/^(true|false|null|-?\d+(\.\d+)?|\{[\s\S]*\}|\[[\s\S]*\])$/ + .test(prop)) { + try { + return $.parseJSON(prop) + } catch (ignore) {} + } + return prop + } + } + }, + + getItemProperty: function (obj, property) { + var prop = obj[property] + if (prop === undefined) { + prop = this.getDataProperty(obj, property) + if (prop === undefined) { + prop = this.getNestedProperty(obj, property) + } + } + return prop + }, + + initStartIndex: function () { + var index = this.options.index + var urlProperty = this.options.urlProperty + var i + // Check if the index is given as a list object: + if (index && typeof index !== 'number') { + for (i = 0; i < this.num; i += 1) { + if (this.list[i] === index || + this.getItemProperty(this.list[i], urlProperty) === + this.getItemProperty(index, urlProperty)) { + index = i + break + } + } + } + // Make sure the index is in the list range: + this.index = this.circle(parseInt(index, 10) || 0) + }, + + initEventListeners: function () { + var that = this + var slidesContainer = this.slidesContainer + function proxyListener (event) { + var type = that.support.transition && + that.support.transition.end === event.type + ? 'transitionend' + : event.type + that['on' + type](event) + } + $(window).on('resize', proxyListener) + $(document.body).on('keydown', proxyListener) + this.container.on('click', proxyListener) + if (this.support.touch) { + slidesContainer + .on('touchstart touchmove touchend touchcancel', proxyListener) + } else if (this.options.emulateTouchEvents && + this.support.transition) { + slidesContainer + .on('mousedown mousemove mouseup mouseout', proxyListener) + } + if (this.support.transition) { + slidesContainer.on( + this.support.transition.end, + proxyListener + ) + } + this.proxyListener = proxyListener + }, + + destroyEventListeners: function () { + var slidesContainer = this.slidesContainer + var proxyListener = this.proxyListener + $(window).off('resize', proxyListener) + $(document.body).off('keydown', proxyListener) + this.container.off('click', proxyListener) + if (this.support.touch) { + slidesContainer + .off('touchstart touchmove touchend touchcancel', proxyListener) + } else if (this.options.emulateTouchEvents && + this.support.transition) { + slidesContainer + .off('mousedown mousemove mouseup mouseout', proxyListener) + } + if (this.support.transition) { + slidesContainer.off( + this.support.transition.end, + proxyListener + ) + } + }, + + handleOpen: function () { + if (this.options.onopened) { + this.options.onopened.call(this) + } + }, + + initWidget: function () { + var that = this + function openHandler (event) { + if (event.target === that.container[0]) { + that.container.off( + that.support.transition.end, + openHandler + ) + that.handleOpen() + } + } + this.container = $(this.options.container) + if (!this.container.length) { + this.console.log( + 'blueimp Gallery: Widget container not found.', + this.options.container + ) + return false + } + this.slidesContainer = this.container.find( + this.options.slidesContainer + ).first() + if (!this.slidesContainer.length) { + this.console.log( + 'blueimp Gallery: Slides container not found.', + this.options.slidesContainer + ) + return false + } + this.titleElement = this.container.find( + this.options.titleElement + ).first() + if (this.num === 1) { + this.container.addClass(this.options.singleClass) + } + if (this.options.onopen) { + this.options.onopen.call(this) + } + if (this.support.transition && this.options.displayTransition) { + this.container.on( + this.support.transition.end, + openHandler + ) + } else { + this.handleOpen() + } + if (this.options.hidePageScrollbars) { + // Hide the page scrollbars: + this.bodyOverflowStyle = document.body.style.overflow + document.body.style.overflow = 'hidden' + } + this.container[0].style.display = 'block' + this.initSlides() + this.container.addClass(this.options.displayClass) + }, + + initOptions: function (options) { + // Create a copy of the prototype options: + this.options = $.extend({}, this.options) + // Check if carousel mode is enabled: + if ((options && options.carousel) || + (this.options.carousel && (!options || options.carousel !== false))) { + $.extend(this.options, this.carouselOptions) + } + // Override any given options: + $.extend(this.options, options) + if (this.num < 3) { + // 1 or 2 slides cannot be displayed continuous, + // remember the original option by setting to null instead of false: + this.options.continuous = this.options.continuous ? null : false + } + if (!this.support.transition) { + this.options.emulateTouchEvents = false + } + if (this.options.event) { + this.preventDefault(this.options.event) + } + } + + }) + + return Gallery +})) diff --git a/public/bower_components/blueimp-gallery/js/blueimp-gallery.min.js b/public/bower_components/blueimp-gallery/js/blueimp-gallery.min.js new file mode 100755 index 0000000..8146cd0 --- /dev/null +++ b/public/bower_components/blueimp-gallery/js/blueimp-gallery.min.js @@ -0,0 +1,3 @@ +!function(){"use strict";function t(t,e){var i;for(i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t}function e(t){if(!this||this.find!==e.prototype.find)return new e(t);if(this.length=0,t)if("string"==typeof t&&(t=this.find(t)),t.nodeType||t===t.window)this.length=1,this[0]=t;else{var i=t.length;for(this.length=i;i;)i-=1,this[i]=t[i]}}e.extend=t,e.contains=function(t,e){do if(e=e.parentNode,e===t)return!0;while(e);return!1},e.parseJSON=function(t){return window.JSON&&JSON.parse(t)},t(e.prototype,{find:function(t){var i=this[0]||document;return"string"==typeof t&&(t=i.querySelectorAll?i.querySelectorAll(t):"#"===t.charAt(0)?i.getElementById(t.slice(1)):i.getElementsByTagName(t)),new e(t)},hasClass:function(t){return this[0]?new RegExp("(^|\\s+)"+t+"(\\s+|$)").test(this[0].className):!1},addClass:function(t){for(var e,i=this.length;i;){if(i-=1,e=this[i],!e.className)return e.className=t,this;if(this.hasClass(t))return this;e.className+=" "+t}return this},removeClass:function(t){for(var e,i=new RegExp("(^|\\s+)"+t+"(\\s+|$)"),s=this.length;s;)s-=1,e=this[s],e.className=e.className.replace(i," ");return this},on:function(t,e){for(var i,s,n=t.split(/\s+/);n.length;)for(t=n.shift(),i=this.length;i;)i-=1,s=this[i],s.addEventListener?s.addEventListener(t,e,!1):s.attachEvent&&s.attachEvent("on"+t,e);return this},off:function(t,e){for(var i,s,n=t.split(/\s+/);n.length;)for(t=n.shift(),i=this.length;i;)i-=1,s=this[i],s.removeEventListener?s.removeEventListener(t,e,!1):s.detachEvent&&s.detachEvent("on"+t,e);return this},empty:function(){for(var t,e=this.length;e;)for(e-=1,t=this[e];t.hasChildNodes();)t.removeChild(t.lastChild);return this},first:function(){return new e(this[0])}}),"function"==typeof define&&define.amd?define(function(){return e}):(window.blueimp=window.blueimp||{},window.blueimp.helper=e)}(),function(t){"use strict";"function"==typeof define&&define.amd?define(["./blueimp-helper"],t):(window.blueimp=window.blueimp||{},window.blueimp.Gallery=t(window.blueimp.helper||window.jQuery))}(function(t){"use strict";function e(t,i){return void 0===document.body.style.maxHeight?null:this&&this.options===e.prototype.options?t&&t.length?(this.list=t,this.num=t.length,this.initOptions(i),void this.initialize()):void this.console.log("blueimp Gallery: No or empty list provided as first argument.",t):new e(t,i)}return t.extend(e.prototype,{options:{container:"#blueimp-gallery",slidesContainer:"div",titleElement:"h3",displayClass:"blueimp-gallery-display",controlsClass:"blueimp-gallery-controls",singleClass:"blueimp-gallery-single",leftEdgeClass:"blueimp-gallery-left",rightEdgeClass:"blueimp-gallery-right",playingClass:"blueimp-gallery-playing",slideClass:"slide",slideLoadingClass:"slide-loading",slideErrorClass:"slide-error",slideContentClass:"slide-content",toggleClass:"toggle",prevClass:"prev",nextClass:"next",closeClass:"close",playPauseClass:"play-pause",typeProperty:"type",titleProperty:"title",urlProperty:"href",srcsetProperty:"urlset",displayTransition:!0,clearSlides:!0,stretchImages:!1,toggleControlsOnReturn:!0,toggleControlsOnSlideClick:!0,toggleSlideshowOnSpace:!0,enableKeyboardNavigation:!0,closeOnEscape:!0,closeOnSlideClick:!0,closeOnSwipeUpOrDown:!0,emulateTouchEvents:!0,stopTouchEventsPropagation:!1,hidePageScrollbars:!0,disableScroll:!0,carousel:!1,continuous:!0,unloadElements:!0,startSlideshow:!1,slideshowInterval:5e3,index:0,preloadRange:2,transitionSpeed:400,slideshowTransitionSpeed:void 0,event:void 0,onopen:void 0,onopened:void 0,onslide:void 0,onslideend:void 0,onslidecomplete:void 0,onclose:void 0,onclosed:void 0},carouselOptions:{hidePageScrollbars:!1,toggleControlsOnReturn:!1,toggleSlideshowOnSpace:!1,enableKeyboardNavigation:!1,closeOnEscape:!1,closeOnSlideClick:!1,closeOnSwipeUpOrDown:!1,disableScroll:!1,startSlideshow:!0},console:window.console&&"function"==typeof window.console.log?window.console:{log:function(){}},support:function(e){function i(){var t,i,s=n.transition;document.body.appendChild(e),s&&(t=s.name.slice(0,-9)+"ransform",void 0!==e.style[t]&&(e.style[t]="translateZ(0)",i=window.getComputedStyle(e).getPropertyValue(s.prefix+"transform"),n.transform={prefix:s.prefix,name:t,translate:!0,translateZ:!!i&&"none"!==i})),void 0!==e.style.backgroundSize&&(n.backgroundSize={},e.style.backgroundSize="contain",n.backgroundSize.contain="contain"===window.getComputedStyle(e).getPropertyValue("background-size"),e.style.backgroundSize="cover",n.backgroundSize.cover="cover"===window.getComputedStyle(e).getPropertyValue("background-size")),document.body.removeChild(e)}var s,n={touch:void 0!==window.ontouchstart||window.DocumentTouch&&document instanceof DocumentTouch},o={webkitTransition:{end:"webkitTransitionEnd",prefix:"-webkit-"},MozTransition:{end:"transitionend",prefix:"-moz-"},OTransition:{end:"otransitionend",prefix:"-o-"},transition:{end:"transitionend",prefix:""}};for(s in o)if(o.hasOwnProperty(s)&&void 0!==e.style[s]){n.transition=o[s],n.transition.name=s;break}return document.body?i():t(document).on("DOMContentLoaded",i),n}(document.createElement("div")),requestAnimationFrame:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame,initialize:function(){return this.initStartIndex(),this.initWidget()===!1?!1:(this.initEventListeners(),this.onslide(this.index),this.ontransitionend(),void(this.options.startSlideshow&&this.play()))},slide:function(t,e){window.clearTimeout(this.timeout);var i,s,n,o=this.index;if(o!==t&&1!==this.num){if(e||(e=this.options.transitionSpeed),this.support.transform){for(this.options.continuous||(t=this.circle(t)),i=Math.abs(o-t)/(o-t),this.options.continuous&&(s=i,i=-this.positions[this.circle(t)]/this.slideWidth,i!==s&&(t=-i*this.num+t)),n=Math.abs(o-t)-1;n;)n-=1,this.move(this.circle((t>o?t:o)-n-1),this.slideWidth*i,0);t=this.circle(t),this.move(o,this.slideWidth*i,e),this.move(t,0,e),this.options.continuous&&this.move(this.circle(t-i),-(this.slideWidth*i),0)}else t=this.circle(t),this.animate(o*-this.slideWidth,t*-this.slideWidth,e);this.onslide(t)}},getIndex:function(){return this.index},getNumber:function(){return this.num},prev:function(){(this.options.continuous||this.index)&&this.slide(this.index-1)},next:function(){(this.options.continuous||this.index1&&(this.timeout=this.setTimeout(!this.requestAnimationFrame&&this.slide||function(t,i){e.animationFrameId=e.requestAnimationFrame.call(window,function(){e.slide(t,i)})},[this.index+1,this.options.slideshowTransitionSpeed],this.interval)),this.container.addClass(this.options.playingClass)},pause:function(){window.clearTimeout(this.timeout),this.interval=null,this.container.removeClass(this.options.playingClass)},add:function(t){var e;for(t.concat||(t=Array.prototype.slice.call(t)),this.list.concat||(this.list=Array.prototype.slice.call(this.list)),this.list=this.list.concat(t),this.num=this.list.length,this.num>2&&null===this.options.continuous&&(this.options.continuous=!0,this.container.removeClass(this.options.leftEdgeClass)),this.container.removeClass(this.options.rightEdgeClass).removeClass(this.options.singleClass),e=this.num-t.length;ei?(s.slidesContainer[0].style.left=e+"px",s.ontransitionend(),void window.clearInterval(o)):void(s.slidesContainer[0].style.left=(e-t)*(Math.floor(r/i*100)/100)+t+"px")},4)},preventDefault:function(t){t.preventDefault?t.preventDefault():t.returnValue=!1},stopPropagation:function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},onresize:function(){this.initSlides(!0)},onmousedown:function(t){t.which&&1===t.which&&"VIDEO"!==t.target.nodeName&&(t.preventDefault(),(t.originalEvent||t).touches=[{pageX:t.pageX,pageY:t.pageY}],this.ontouchstart(t))},onmousemove:function(t){this.touchStart&&((t.originalEvent||t).touches=[{pageX:t.pageX,pageY:t.pageY}],this.ontouchmove(t))},onmouseup:function(t){this.touchStart&&(this.ontouchend(t),delete this.touchStart)},onmouseout:function(e){if(this.touchStart){var i=e.target,s=e.relatedTarget;(!s||s!==i&&!t.contains(i,s))&&this.onmouseup(e)}},ontouchstart:function(t){this.options.stopTouchEventsPropagation&&this.stopPropagation(t);var e=(t.originalEvent||t).touches[0];this.touchStart={x:e.pageX,y:e.pageY,time:Date.now()},this.isScrolling=void 0,this.touchDelta={}},ontouchmove:function(t){this.options.stopTouchEventsPropagation&&this.stopPropagation(t);var e,i,s=(t.originalEvent||t).touches[0],n=(t.originalEvent||t).scale,o=this.index;if(!(s.length>1||n&&1!==n))if(this.options.disableScroll&&t.preventDefault(),this.touchDelta={x:s.pageX-this.touchStart.x,y:s.pageY-this.touchStart.y},e=this.touchDelta.x,void 0===this.isScrolling&&(this.isScrolling=this.isScrolling||Math.abs(e)0||o===this.num-1&&0>e?Math.abs(e)/this.slideWidth+1:1,i=[o],o&&i.push(o-1),o20||Math.abs(this.touchDelta.x)>a/2,c=!r&&this.touchDelta.x>0||r===this.num-1&&this.touchDelta.x<0,u=!d&&this.options.closeOnSwipeUpOrDown&&(h&&Math.abs(this.touchDelta.y)>20||Math.abs(this.touchDelta.y)>this.slideHeight/2);this.options.continuous&&(c=!1),e=this.touchDelta.x<0?-1:1,this.isScrolling?u?this.close():this.translateY(r,0,l):d&&!c?(i=r+e,s=r-e,n=a*e,o=-a*e,this.options.continuous?(this.move(this.circle(i),n,0),this.move(this.circle(r-2*e),o,0)):i>=0&&ithis.container[0].clientHeight&&(s.style.maxHeight=this.container[0].clientHeight),this.interval&&this.slides[this.index]===n&&this.play(),this.setTimeout(this.options.onslidecomplete,[i,n]))},onload:function(t){this.oncomplete(t)},onerror:function(t){this.oncomplete(t)},onkeydown:function(t){switch(t.which||t.keyCode){case 13:this.options.toggleControlsOnReturn&&(this.preventDefault(t),this.toggleControls());break;case 27:this.options.closeOnEscape&&(this.close(),t.stopImmediatePropagation());break;case 32:this.options.toggleSlideshowOnSpace&&(this.preventDefault(t),this.toggleSlideshow());break;case 37:this.options.enableKeyboardNavigation&&(this.preventDefault(t),this.prev());break;case 39:this.options.enableKeyboardNavigation&&(this.preventDefault(t),this.next())}},handleClick:function(e){function i(e){return t(n).hasClass(e)||t(o).hasClass(e)}var s=this.options,n=e.target||e.srcElement,o=n.parentNode;i(s.toggleClass)?(this.preventDefault(e),this.toggleControls()):i(s.prevClass)?(this.preventDefault(e),this.prev()):i(s.nextClass)?(this.preventDefault(e),this.next()):i(s.closeClass)?(this.preventDefault(e),this.close()):i(s.playPauseClass)?(this.preventDefault(e),this.toggleSlideshow()):o===this.slidesContainer[0]?s.closeOnSlideClick?(this.preventDefault(e),this.close()):s.toggleControlsOnSlideClick&&(this.preventDefault(e),this.toggleControls()):o.parentNode&&o.parentNode===this.slidesContainer[0]&&s.toggleControlsOnSlideClick&&(this.preventDefault(e),this.toggleControls())},onclick:function(t){return this.options.emulateTouchEvents&&this.touchDelta&&(Math.abs(this.touchDelta.x)>20||Math.abs(this.touchDelta.y)>20)?void delete this.touchDelta:this.handleClick(t)},updateEdgeClasses:function(t){t?this.container.removeClass(this.options.leftEdgeClass):this.container.addClass(this.options.leftEdgeClass),t===this.num-1?this.container.addClass(this.options.rightEdgeClass):this.container.removeClass(this.options.rightEdgeClass)},handleSlide:function(t){this.options.continuous||this.updateEdgeClasses(t),this.loadElements(t),this.options.unloadElements&&this.unloadElements(t),this.setTitle(t)},onslide:function(t){this.index=t,this.handleSlide(t),this.setTimeout(this.options.onslide,[t,this.slides[t]])},setTitle:function(t){var e=this.slides[t].firstChild.title,i=this.titleElement;i.length&&(this.titleElement.empty(),e&&i[0].appendChild(document.createTextNode(e)))},setTimeout:function(t,e,i){var s=this;return t&&window.setTimeout(function(){t.apply(s,e||[])},i||0)},imageFactory:function(e,i){function s(e){if(!n){if(e={type:e.type,target:o},!o.parentNode)return l.setTimeout(s,[e]);n=!0,t(a).off("load error",s),d&&"load"===e.type&&(o.style.background='url("'+h+'") center no-repeat',o.style.backgroundSize=d),i(e)}}var n,o,r,l=this,a=this.imagePrototype.cloneNode(!1),h=e,d=this.options.stretchImages;return"string"!=typeof h&&(h=this.getItemProperty(e,this.options.urlProperty),r=this.getItemProperty(e,this.options.titleProperty)),d===!0&&(d="contain"),d=this.support.backgroundSize&&this.support.backgroundSize[d]&&d,d?o=this.elementPrototype.cloneNode(!1):(o=a,a.draggable=!1),r&&(o.title=r),t(a).on("load error",s),a.src=h,o},createElement:function(e,i){var s=e&&this.getItemProperty(e,this.options.typeProperty),n=s&&this[s.split("/")[0]+"Factory"]||this.imageFactory,o=e&&n.call(this,e,i),r=this.getItemProperty(e,this.options.srcsetProperty);return o||(o=this.elementPrototype.cloneNode(!1),this.setTimeout(i,[{type:"error",target:o}])),r&&o.setAttribute("srcset",r),t(o).addClass(this.options.slideContentClass),o},loadElement:function(e){this.elements[e]||(this.slides[e].firstChild?this.elements[e]=t(this.slides[e]).hasClass(this.options.slideErrorClass)?3:2:(this.elements[e]=1,t(this.slides[e]).addClass(this.options.slideLoadingClass),this.slides[e].appendChild(this.createElement(this.list[e],this.proxyListener))))},loadElements:function(t){var e,i=Math.min(this.num,2*this.options.preloadRange+1),s=t;for(e=0;i>e;e+=1)s+=e*(e%2===0?-1:1),s=this.circle(s),this.loadElement(s)},unloadElements:function(t){var e,i;for(e in this.elements)this.elements.hasOwnProperty(e)&&(i=Math.abs(t-e),i>this.options.preloadRange&&i+this.options.preloadRanget?-this.slideWidth:this.indext;t++)this.unloadSlide(t)},toggleControls:function(){var t=this.options.controlsClass;this.container.hasClass(t)?this.container.removeClass(t):this.container.addClass(t)},toggleSlideshow:function(){this.interval?this.pause():this.play()},getNodeIndex:function(t){return parseInt(t.getAttribute("data-index"),10)},getNestedProperty:function(t,e){return e.replace(/\[(?:'([^']+)'|"([^"]+)"|(\d+))\]|(?:(?:^|\.)([^\.\[]+))/g,function(e,i,s,n,o){var r=o||i||s||n&&parseInt(n,10);e&&t&&(t=t[r])}),t},getDataProperty:function(e,i){if(e.getAttribute){var s=e.getAttribute("data-"+i.replace(/([A-Z])/g,"-$1").toLowerCase());if("string"==typeof s){if(/^(true|false|null|-?\d+(\.\d+)?|\{[\s\S]*\}|\[[\s\S]*\])$/.test(s))try{return t.parseJSON(s)}catch(n){}return s}}},getItemProperty:function(t,e){var i=t[e];return void 0===i&&(i=this.getDataProperty(t,e),void 0===i&&(i=this.getNestedProperty(t,e))),i},initStartIndex:function(){var t,e=this.options.index,i=this.options.urlProperty;if(e&&"number"!=typeof e)for(t=0;t') + .append($('').prop('src', baseUrl + '_s.jpg')) + .prop('href', baseUrl + '_b.jpg') + .prop('title', photo.title) + .attr('data-gallery', '') + .appendTo(linksContainer) + carouselLinks.push({ + href: baseUrl + '_c.jpg', + title: photo.title + }) + }) + // Initialize the Gallery as image carousel: + blueimp.Gallery(carouselLinks, { + container: '#blueimp-image-carousel', + carousel: true + }) + }) + + // Initialize the Gallery as video carousel: + blueimp.Gallery([ + { + title: 'Sintel', + href: 'https://archive.org/download/Sintel/sintel-2048-surround_512kb.mp4', + type: 'video/mp4', + poster: 'https://i.imgur.com/MUSw4Zu.jpg' + }, + { + title: 'Big Buck Bunny', + href: 'https://upload.wikimedia.org/wikipedia/commons/7/75/' + + 'Big_Buck_Bunny_Trailer_400p.ogg', + type: 'video/ogg', + poster: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/70/' + + 'Big.Buck.Bunny.-.Opening.Screen.png/' + + '800px-Big.Buck.Bunny.-.Opening.Screen.png' + }, + { + title: 'Elephants Dream', + href: 'https://upload.wikimedia.org/wikipedia/commons/transcoded/8/83/' + + 'Elephants_Dream_%28high_quality%29.ogv/' + + 'Elephants_Dream_%28high_quality%29.ogv.360p.webm', + type: 'video/webm', + poster: 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/90/' + + 'Elephants_Dream_s1_proog.jpg/800px-Elephants_Dream_s1_proog.jpg' + }, + { + title: 'LES TWINS - An Industry Ahead', + type: 'text/html', + youtube: 'zi4CIXpx7Bg' + }, + { + title: 'KN1GHT - Last Moon', + type: 'text/html', + vimeo: '73686146', + poster: 'https://secure-a.vimeocdn.com/ts/448/835/448835699_960.jpg' + } + ], { + container: '#blueimp-video-carousel', + carousel: true + }) +}) diff --git a/public/bower_components/blueimp-gallery/js/jquery.blueimp-gallery.js b/public/bower_components/blueimp-gallery/js/jquery.blueimp-gallery.js new file mode 100755 index 0000000..462989e --- /dev/null +++ b/public/bower_components/blueimp-gallery/js/jquery.blueimp-gallery.js @@ -0,0 +1,83 @@ +/* + * blueimp Gallery jQuery plugin + * https://github.com/blueimp/Gallery + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* global define, window, document */ + +;(function (factory) { + 'use strict' + if (typeof define === 'function' && define.amd) { + define([ + 'jquery', + './blueimp-gallery' + ], factory) + } else { + factory( + window.jQuery, + window.blueimp.Gallery + ) + } +}(function ($, Gallery) { + 'use strict' + + // Global click handler to open links with data-gallery attribute + // in the Gallery lightbox: + $(document).on('click', '[data-gallery]', function (event) { + // Get the container id from the data-gallery attribute: + var id = $(this).data('gallery') + var widget = $(id) + var container = (widget.length && widget) || + $(Gallery.prototype.options.container) + var callbacks = { + onopen: function () { + container + .data('gallery', this) + .trigger('open') + }, + onopened: function () { + container.trigger('opened') + }, + onslide: function () { + container.trigger('slide', arguments) + }, + onslideend: function () { + container.trigger('slideend', arguments) + }, + onslidecomplete: function () { + container.trigger('slidecomplete', arguments) + }, + onclose: function () { + container.trigger('close') + }, + onclosed: function () { + container + .trigger('closed') + .removeData('gallery') + } + } + var options = $.extend( + // Retrieve custom options from data-attributes + // on the Gallery widget: + container.data(), + { + container: container[0], + index: this, + event: event + }, + callbacks + ) + // Select all links with the same data-gallery attribute: + var links = $('[data-gallery="' + id + '"]') + if (options.filter) { + links = links.filter(options.filter) + } + return new Gallery(links, options) + }) +})) diff --git a/public/bower_components/blueimp-gallery/js/jquery.blueimp-gallery.min.js b/public/bower_components/blueimp-gallery/js/jquery.blueimp-gallery.min.js new file mode 100755 index 0000000..a25f9f9 --- /dev/null +++ b/public/bower_components/blueimp-gallery/js/jquery.blueimp-gallery.min.js @@ -0,0 +1,2 @@ +!function(t){"use strict";"function"==typeof define&&define.amd?define(["./blueimp-helper"],t):(window.blueimp=window.blueimp||{},window.blueimp.Gallery=t(window.blueimp.helper||window.jQuery))}(function(t){"use strict";function e(t,i){return void 0===document.body.style.maxHeight?null:this&&this.options===e.prototype.options?t&&t.length?(this.list=t,this.num=t.length,this.initOptions(i),void this.initialize()):void this.console.log("blueimp Gallery: No or empty list provided as first argument.",t):new e(t,i)}return t.extend(e.prototype,{options:{container:"#blueimp-gallery",slidesContainer:"div",titleElement:"h3",displayClass:"blueimp-gallery-display",controlsClass:"blueimp-gallery-controls",singleClass:"blueimp-gallery-single",leftEdgeClass:"blueimp-gallery-left",rightEdgeClass:"blueimp-gallery-right",playingClass:"blueimp-gallery-playing",slideClass:"slide",slideLoadingClass:"slide-loading",slideErrorClass:"slide-error",slideContentClass:"slide-content",toggleClass:"toggle",prevClass:"prev",nextClass:"next",closeClass:"close",playPauseClass:"play-pause",typeProperty:"type",titleProperty:"title",urlProperty:"href",srcsetProperty:"urlset",displayTransition:!0,clearSlides:!0,stretchImages:!1,toggleControlsOnReturn:!0,toggleControlsOnSlideClick:!0,toggleSlideshowOnSpace:!0,enableKeyboardNavigation:!0,closeOnEscape:!0,closeOnSlideClick:!0,closeOnSwipeUpOrDown:!0,emulateTouchEvents:!0,stopTouchEventsPropagation:!1,hidePageScrollbars:!0,disableScroll:!0,carousel:!1,continuous:!0,unloadElements:!0,startSlideshow:!1,slideshowInterval:5e3,index:0,preloadRange:2,transitionSpeed:400,slideshowTransitionSpeed:void 0,event:void 0,onopen:void 0,onopened:void 0,onslide:void 0,onslideend:void 0,onslidecomplete:void 0,onclose:void 0,onclosed:void 0},carouselOptions:{hidePageScrollbars:!1,toggleControlsOnReturn:!1,toggleSlideshowOnSpace:!1,enableKeyboardNavigation:!1,closeOnEscape:!1,closeOnSlideClick:!1,closeOnSwipeUpOrDown:!1,disableScroll:!1,startSlideshow:!0},console:window.console&&"function"==typeof window.console.log?window.console:{log:function(){}},support:function(e){function i(){var t,i,s=o.transition;document.body.appendChild(e),s&&(t=s.name.slice(0,-9)+"ransform",void 0!==e.style[t]&&(e.style[t]="translateZ(0)",i=window.getComputedStyle(e).getPropertyValue(s.prefix+"transform"),o.transform={prefix:s.prefix,name:t,translate:!0,translateZ:!!i&&"none"!==i})),void 0!==e.style.backgroundSize&&(o.backgroundSize={},e.style.backgroundSize="contain",o.backgroundSize.contain="contain"===window.getComputedStyle(e).getPropertyValue("background-size"),e.style.backgroundSize="cover",o.backgroundSize.cover="cover"===window.getComputedStyle(e).getPropertyValue("background-size")),document.body.removeChild(e)}var s,o={touch:void 0!==window.ontouchstart||window.DocumentTouch&&document instanceof DocumentTouch},n={webkitTransition:{end:"webkitTransitionEnd",prefix:"-webkit-"},MozTransition:{end:"transitionend",prefix:"-moz-"},OTransition:{end:"otransitionend",prefix:"-o-"},transition:{end:"transitionend",prefix:""}};for(s in n)if(n.hasOwnProperty(s)&&void 0!==e.style[s]){o.transition=n[s],o.transition.name=s;break}return document.body?i():t(document).on("DOMContentLoaded",i),o}(document.createElement("div")),requestAnimationFrame:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame,initialize:function(){return this.initStartIndex(),this.initWidget()===!1?!1:(this.initEventListeners(),this.onslide(this.index),this.ontransitionend(),void(this.options.startSlideshow&&this.play()))},slide:function(t,e){window.clearTimeout(this.timeout);var i,s,o,n=this.index;if(n!==t&&1!==this.num){if(e||(e=this.options.transitionSpeed),this.support.transform){for(this.options.continuous||(t=this.circle(t)),i=Math.abs(n-t)/(n-t),this.options.continuous&&(s=i,i=-this.positions[this.circle(t)]/this.slideWidth,i!==s&&(t=-i*this.num+t)),o=Math.abs(n-t)-1;o;)o-=1,this.move(this.circle((t>n?t:n)-o-1),this.slideWidth*i,0);t=this.circle(t),this.move(n,this.slideWidth*i,e),this.move(t,0,e),this.options.continuous&&this.move(this.circle(t-i),-(this.slideWidth*i),0)}else t=this.circle(t),this.animate(n*-this.slideWidth,t*-this.slideWidth,e);this.onslide(t)}},getIndex:function(){return this.index},getNumber:function(){return this.num},prev:function(){(this.options.continuous||this.index)&&this.slide(this.index-1)},next:function(){(this.options.continuous||this.index1&&(this.timeout=this.setTimeout(!this.requestAnimationFrame&&this.slide||function(t,i){e.animationFrameId=e.requestAnimationFrame.call(window,function(){e.slide(t,i)})},[this.index+1,this.options.slideshowTransitionSpeed],this.interval)),this.container.addClass(this.options.playingClass)},pause:function(){window.clearTimeout(this.timeout),this.interval=null,this.container.removeClass(this.options.playingClass)},add:function(t){var e;for(t.concat||(t=Array.prototype.slice.call(t)),this.list.concat||(this.list=Array.prototype.slice.call(this.list)),this.list=this.list.concat(t),this.num=this.list.length,this.num>2&&null===this.options.continuous&&(this.options.continuous=!0,this.container.removeClass(this.options.leftEdgeClass)),this.container.removeClass(this.options.rightEdgeClass).removeClass(this.options.singleClass),e=this.num-t.length;ei?(s.slidesContainer[0].style.left=e+"px",s.ontransitionend(),void window.clearInterval(n)):void(s.slidesContainer[0].style.left=(e-t)*(Math.floor(l/i*100)/100)+t+"px")},4)},preventDefault:function(t){t.preventDefault?t.preventDefault():t.returnValue=!1},stopPropagation:function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},onresize:function(){this.initSlides(!0)},onmousedown:function(t){t.which&&1===t.which&&"VIDEO"!==t.target.nodeName&&(t.preventDefault(),(t.originalEvent||t).touches=[{pageX:t.pageX,pageY:t.pageY}],this.ontouchstart(t))},onmousemove:function(t){this.touchStart&&((t.originalEvent||t).touches=[{pageX:t.pageX,pageY:t.pageY}],this.ontouchmove(t))},onmouseup:function(t){this.touchStart&&(this.ontouchend(t),delete this.touchStart)},onmouseout:function(e){if(this.touchStart){var i=e.target,s=e.relatedTarget;(!s||s!==i&&!t.contains(i,s))&&this.onmouseup(e)}},ontouchstart:function(t){this.options.stopTouchEventsPropagation&&this.stopPropagation(t);var e=(t.originalEvent||t).touches[0];this.touchStart={x:e.pageX,y:e.pageY,time:Date.now()},this.isScrolling=void 0,this.touchDelta={}},ontouchmove:function(t){this.options.stopTouchEventsPropagation&&this.stopPropagation(t);var e,i,s=(t.originalEvent||t).touches[0],o=(t.originalEvent||t).scale,n=this.index;if(!(s.length>1||o&&1!==o))if(this.options.disableScroll&&t.preventDefault(),this.touchDelta={x:s.pageX-this.touchStart.x,y:s.pageY-this.touchStart.y},e=this.touchDelta.x,void 0===this.isScrolling&&(this.isScrolling=this.isScrolling||Math.abs(e)0||n===this.num-1&&0>e?Math.abs(e)/this.slideWidth+1:1,i=[n],n&&i.push(n-1),n20||Math.abs(this.touchDelta.x)>r/2,c=!l&&this.touchDelta.x>0||l===this.num-1&&this.touchDelta.x<0,u=!d&&this.options.closeOnSwipeUpOrDown&&(h&&Math.abs(this.touchDelta.y)>20||Math.abs(this.touchDelta.y)>this.slideHeight/2);this.options.continuous&&(c=!1),e=this.touchDelta.x<0?-1:1,this.isScrolling?u?this.close():this.translateY(l,0,a):d&&!c?(i=l+e,s=l-e,o=r*e,n=-r*e,this.options.continuous?(this.move(this.circle(i),o,0),this.move(this.circle(l-2*e),n,0)):i>=0&&ithis.container[0].clientHeight&&(s.style.maxHeight=this.container[0].clientHeight),this.interval&&this.slides[this.index]===o&&this.play(),this.setTimeout(this.options.onslidecomplete,[i,o]))},onload:function(t){this.oncomplete(t)},onerror:function(t){this.oncomplete(t)},onkeydown:function(t){switch(t.which||t.keyCode){case 13:this.options.toggleControlsOnReturn&&(this.preventDefault(t),this.toggleControls());break;case 27:this.options.closeOnEscape&&(this.close(),t.stopImmediatePropagation());break;case 32:this.options.toggleSlideshowOnSpace&&(this.preventDefault(t),this.toggleSlideshow());break;case 37:this.options.enableKeyboardNavigation&&(this.preventDefault(t),this.prev());break;case 39:this.options.enableKeyboardNavigation&&(this.preventDefault(t),this.next())}},handleClick:function(e){function i(e){return t(o).hasClass(e)||t(n).hasClass(e)}var s=this.options,o=e.target||e.srcElement,n=o.parentNode;i(s.toggleClass)?(this.preventDefault(e),this.toggleControls()):i(s.prevClass)?(this.preventDefault(e),this.prev()):i(s.nextClass)?(this.preventDefault(e),this.next()):i(s.closeClass)?(this.preventDefault(e),this.close()):i(s.playPauseClass)?(this.preventDefault(e),this.toggleSlideshow()):n===this.slidesContainer[0]?s.closeOnSlideClick?(this.preventDefault(e),this.close()):s.toggleControlsOnSlideClick&&(this.preventDefault(e),this.toggleControls()):n.parentNode&&n.parentNode===this.slidesContainer[0]&&s.toggleControlsOnSlideClick&&(this.preventDefault(e),this.toggleControls())},onclick:function(t){return this.options.emulateTouchEvents&&this.touchDelta&&(Math.abs(this.touchDelta.x)>20||Math.abs(this.touchDelta.y)>20)?void delete this.touchDelta:this.handleClick(t)},updateEdgeClasses:function(t){t?this.container.removeClass(this.options.leftEdgeClass):this.container.addClass(this.options.leftEdgeClass),t===this.num-1?this.container.addClass(this.options.rightEdgeClass):this.container.removeClass(this.options.rightEdgeClass)},handleSlide:function(t){this.options.continuous||this.updateEdgeClasses(t),this.loadElements(t),this.options.unloadElements&&this.unloadElements(t),this.setTitle(t)},onslide:function(t){this.index=t,this.handleSlide(t),this.setTimeout(this.options.onslide,[t,this.slides[t]])},setTitle:function(t){var e=this.slides[t].firstChild.title,i=this.titleElement;i.length&&(this.titleElement.empty(),e&&i[0].appendChild(document.createTextNode(e)))},setTimeout:function(t,e,i){var s=this;return t&&window.setTimeout(function(){t.apply(s,e||[])},i||0)},imageFactory:function(e,i){function s(e){if(!o){if(e={type:e.type,target:n},!n.parentNode)return a.setTimeout(s,[e]);o=!0,t(r).off("load error",s),d&&"load"===e.type&&(n.style.background='url("'+h+'") center no-repeat',n.style.backgroundSize=d),i(e)}}var o,n,l,a=this,r=this.imagePrototype.cloneNode(!1),h=e,d=this.options.stretchImages;return"string"!=typeof h&&(h=this.getItemProperty(e,this.options.urlProperty),l=this.getItemProperty(e,this.options.titleProperty)),d===!0&&(d="contain"),d=this.support.backgroundSize&&this.support.backgroundSize[d]&&d,d?n=this.elementPrototype.cloneNode(!1):(n=r,r.draggable=!1),l&&(n.title=l),t(r).on("load error",s),r.src=h,n},createElement:function(e,i){var s=e&&this.getItemProperty(e,this.options.typeProperty),o=s&&this[s.split("/")[0]+"Factory"]||this.imageFactory,n=e&&o.call(this,e,i),l=this.getItemProperty(e,this.options.srcsetProperty);return n||(n=this.elementPrototype.cloneNode(!1),this.setTimeout(i,[{type:"error",target:n}])),l&&n.setAttribute("srcset",l),t(n).addClass(this.options.slideContentClass),n},loadElement:function(e){this.elements[e]||(this.slides[e].firstChild?this.elements[e]=t(this.slides[e]).hasClass(this.options.slideErrorClass)?3:2:(this.elements[e]=1,t(this.slides[e]).addClass(this.options.slideLoadingClass),this.slides[e].appendChild(this.createElement(this.list[e],this.proxyListener))))},loadElements:function(t){var e,i=Math.min(this.num,2*this.options.preloadRange+1),s=t;for(e=0;i>e;e+=1)s+=e*(e%2===0?-1:1),s=this.circle(s),this.loadElement(s)},unloadElements:function(t){var e,i;for(e in this.elements)this.elements.hasOwnProperty(e)&&(i=Math.abs(t-e),i>this.options.preloadRange&&i+this.options.preloadRanget?-this.slideWidth:this.indext;t++)this.unloadSlide(t)},toggleControls:function(){var t=this.options.controlsClass;this.container.hasClass(t)?this.container.removeClass(t):this.container.addClass(t)},toggleSlideshow:function(){this.interval?this.pause():this.play()},getNodeIndex:function(t){return parseInt(t.getAttribute("data-index"),10)},getNestedProperty:function(t,e){return e.replace(/\[(?:'([^']+)'|"([^"]+)"|(\d+))\]|(?:(?:^|\.)([^\.\[]+))/g,function(e,i,s,o,n){var l=n||i||s||o&&parseInt(o,10);e&&t&&(t=t[l])}),t},getDataProperty:function(e,i){if(e.getAttribute){var s=e.getAttribute("data-"+i.replace(/([A-Z])/g,"-$1").toLowerCase());if("string"==typeof s){if(/^(true|false|null|-?\d+(\.\d+)?|\{[\s\S]*\}|\[[\s\S]*\])$/.test(s))try{return t.parseJSON(s)}catch(o){}return s}}},getItemProperty:function(t,e){var i=t[e];return void 0===i&&(i=this.getDataProperty(t,e),void 0===i&&(i=this.getNestedProperty(t,e))),i},initStartIndex:function(){var t,e=this.options.index,i=this.options.urlProperty;if(e&&"number"!=typeof e)for(t=0;t= 0 && j < len ? [ this[j] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: deletedIds.sort, + splice: deletedIds.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var src, copyIsArray, copy, name, options, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + isWindow: function( obj ) { + /* jshint eqeqeq: false */ + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + // adding 1 corrects loss of precision from parseFloat (#15100) + return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0; + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + isPlainObject: function( obj ) { + var key; + + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Support: IE<9 + // Handle iteration over inherited properties before own properties. + if ( support.ownLast ) { + for ( key in obj ) { + return hasOwn.call( obj, key ); + } + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call(obj) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && jQuery.trim( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + // args is for internal usage only + each: function( obj, callback, args ) { + var value, + i = 0, + length = obj.length, + isArray = isArraylike( obj ); + + if ( args ) { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } + } + + return obj; + }, + + // Support: Android<4.1, IE<9 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArraylike( Object(arr) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + var len; + + if ( arr ) { + if ( indexOf ) { + return indexOf.call( arr, elem, i ); + } + + len = arr.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in arr && arr[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + while ( j < len ) { + first[ i++ ] = second[ j++ ]; + } + + // Support: IE<9 + // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) + if ( len !== len ) { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, + i = 0, + length = elems.length, + isArray = isArraylike( elems ), + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var args, proxy, tmp; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: function() { + return +( new Date() ); + }, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +function isArraylike( obj ) { + + // Support: iOS 8.2 (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + if ( obj.nodeType === 1 && length ) { + return true; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.2.0-pre + * http://sizzlejs.com/ + * + * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-16 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // http://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + // http://www.w3.org/TR/css3-syntax/#characters + characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Loosely modeled on CSS identifier characters + // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors + // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = characterEncoding.replace( "w", "w#" ), + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + characterEncoding + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + characterEncoding + ")" ), + "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), + "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var match, elem, m, nodeType, + // QSA vars + i, groups, old, nid, newContext, newSelector; + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + + context = context || document; + results = results || []; + nodeType = context.nodeType; + + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + if ( !seed && documentIsHTML ) { + + // Try to shortcut find operations when possible (e.g., not under DocumentFragment) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + // Speed-up: Sizzle("#ID") + if ( (m = match[1]) ) { + if ( nodeType === 9 ) { + elem = context.getElementById( m ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document (jQuery #6963) + if ( elem && elem.parentNode ) { + // Handle the case where IE, Opera, and Webkit return items + // by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + } else { + // Context is not a document + if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && + contains( context, elem ) && elem.id === m ) { + results.push( elem ); + return results; + } + } + + // Speed-up: Sizzle("TAG") + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Speed-up: Sizzle(".CLASS") + } else if ( (m = match[3]) && support.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // QSA path + if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + nid = old = expando; + newContext = context; + newSelector = nodeType !== 1 && selector; + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + groups = tokenize( selector ); + + if ( (old = context.getAttribute("id")) ) { + nid = old.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", nid ); + } + nid = "[id='" + nid + "'] "; + + i = groups.length; + while ( i-- ) { + groups[i] = nid + toSelector( groups[i] ); + } + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; + newSelector = groups.join(","); + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch(qsaError) { + } finally { + if ( !old ) { + context.removeAttribute("id"); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {Function(string, Object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = attrs.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, parent, + doc = node ? node.ownerDocument || node : preferredDoc; + + // If no document and documentElement is available, return + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Set our document + document = doc; + docElem = doc.documentElement; + parent = doc.defaultView; + + // Support: IE>8 + // If iframe document is assigned to "document" variable and if iframe has been reloaded, + // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 + // IE6-8 do not support the defaultView property so parent will be undefined + if ( parent && parent !== parent.top ) { + // IE11 does not have attachEvent, so all must suffer + if ( parent.addEventListener ) { + parent.addEventListener( "unload", unloadHandler, false ); + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", unloadHandler ); + } + } + + /* Support tests + ---------------------------------------------------------------------- */ + documentIsHTML = !isXML( doc ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( doc.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( doc.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !doc.getElementsByName || !doc.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var m = context.getElementById( id ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + docElem.appendChild( div ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+ + if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibing-combinator selector` fails + if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = doc.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully does not implement inclusive descendent + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === doc ? -1 : + b === doc ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return doc; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, outerCache, node, diff, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + // Seek `elem` from a previously-cached index + outerCache = parent[ expando ] || (parent[ expando ] = {}); + cache = outerCache[ type ] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = cache[0] === dirruns && cache[2]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + // Use previously-cached element index if available + } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { + diff = cache[1]; + + // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) + } else { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { + // Cache the index of each encountered element + if ( useCache ) { + (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + if ( (oldCache = outerCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + outerCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context !== document && context; + } + + // Add elements passing elementMatchers directly to results + // Keep `i` a string if there are no elements so `matchedCount` will be "00" below + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // Apply set filters to unmatched elements + matchedCount += i; + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is no seed and only one group + if ( match.length === 1 ) { + + // Take a shortcut and set the context if the root selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.pseudos; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + }); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + }); + + } + + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not; + }); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + })); +}; + +jQuery.fn.extend({ + find: function( selector ) { + var i, + ret = [], + self = this, + len = self.length; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function( selector ) { + return this.pushStack( winnow(this, selector || [], false) ); + }, + not: function( selector ) { + return this.pushStack( winnow(this, selector || [], true) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +}); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // Use the correct document accordingly with window argument (sandbox) + document = window.document, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function( selector, context ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + + // scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[1], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return typeof rootjQuery.ready !== "undefined" ? + rootjQuery.ready( selector ) : + // Execute immediately if ready is not present + selector( jQuery ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.extend({ + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +jQuery.fn.extend({ + has: function( target ) { + var i, + targets = jQuery( target, this ), + len = targets.length; + + return this.filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { + // Always skip document fragments + if ( cur.nodeType < 11 && (pos ? + pos.index(cur) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector(cur, selectors)) ) { + + matched.push( cur ); + break; + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.unique( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter(selector) + ); + } +}); + +function sibling( cur, dir ) { + do { + cur = cur[ dir ]; + } while ( cur && cur.nodeType !== 1 ); + + return cur; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + if ( this.length > 1 ) { + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + ret = jQuery.unique( ret ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + } + + return this.pushStack( ret ); + }; +}); +var rnotwhite = (/\S+/g); + + + +// String to Object options format cache +var optionsCache = {}; + +// Convert String-formatted options into Object-formatted ones and store in cache +function createOptions( options ) { + var object = optionsCache[ options ] = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + }); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + ( optionsCache[ options ] || createOptions( options ) ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list was already fired + fired, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // First callback to fire (used internally by add and fireWith) + firingStart, + // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = !options.once && [], + // Fire callbacks + fire = function( data ) { + memory = options.memory && data; + fired = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + firing = true; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { + memory = false; // To prevent further calls using add + break; + } + } + firing = false; + if ( list ) { + if ( stack ) { + if ( stack.length ) { + fire( stack.shift() ); + } + } else if ( memory ) { + list = []; + } else { + self.disable(); + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + // First, we save the current length + var start = list.length; + (function add( args ) { + jQuery.each( args, function( _, arg ) { + var type = jQuery.type( arg ); + if ( type === "function" ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && type !== "string" ) { + // Inspect recursively + add( arg ); + } + }); + })( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away + } else if ( memory ) { + firingStart = start; + fire( memory ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + // Handle firing indexes + if ( firing ) { + if ( index <= firingLength ) { + firingLength--; + } + if ( index <= firingIndex ) { + firingIndex--; + } + } + } + }); + } + return this; + }, + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); + }, + // Remove all callbacks from the list + empty: function() { + list = []; + firingLength = 0; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( list && ( !fired || stack ) ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + if ( firing ) { + stack.push( args ); + } else { + fire( args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +jQuery.extend({ + + Deferred: function( func ) { + var tuples = [ + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], + [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], + [ "notify", "progress", jQuery.Callbacks("memory") ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred(function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[1] ](function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .done( newDefer.resolve ) + .fail( newDefer.reject ) + .progress( newDefer.notify ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); + } + }); + }); + fns = null; + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[1] ] = list.add; + + // Handle state + if ( stateString ) { + list.add(function() { + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[0] ] = function() { + deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[0] + "With" ] = list.fireWith; + }); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( values === progressValues ) { + deferred.notifyWith( contexts, values ); + + } else if ( !(--remaining) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ) + .progress( updateFunc( i, progressContexts, progressValues ) ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +}); + + +// The deferred used on DOM ready +var readyList; + +jQuery.fn.ready = function( fn ) { + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; +}; + +jQuery.extend({ + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); + } + } +}); + +/** + * Clean-up method for dom ready events + */ +function detach() { + if ( document.addEventListener ) { + document.removeEventListener( "DOMContentLoaded", completed, false ); + window.removeEventListener( "load", completed, false ); + + } else { + document.detachEvent( "onreadystatechange", completed ); + window.detachEvent( "onload", completed ); + } +} + +/** + * The ready event handler and self cleanup method + */ +function completed() { + // readyState === "complete" is good enough for us to call the dom ready in oldIE + if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) { + detach(); + jQuery.ready(); + } +} + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called after the browser event has already occurred. + // we once tried to use readyState "interactive" here, but it caused issues like the one + // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + setTimeout( jQuery.ready ); + + // Standards-based browsers support DOMContentLoaded + } else if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed, false ); + + // If IE event model is used + } else { + // Ensure firing before onload, maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", completed ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", completed ); + + // If IE and not a frame + // continually check to see if the document is ready + var top = false; + + try { + top = window.frameElement == null && document.documentElement; + } catch(e) {} + + if ( top && top.doScroll ) { + (function doScrollCheck() { + if ( !jQuery.isReady ) { + + try { + // Use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + top.doScroll("left"); + } catch(e) { + return setTimeout( doScrollCheck, 50 ); + } + + // detach all dom ready events + detach(); + + // and execute any waiting functions + jQuery.ready(); + } + })(); + } + } + } + return readyList.promise( obj ); +}; + + +var strundefined = typeof undefined; + + + +// Support: IE<9 +// Iteration over object's inherited properties before its own +var i; +for ( i in jQuery( support ) ) { + break; +} +support.ownLast = i !== "0"; + +// Note: most support tests are defined in their respective modules. +// false until the test is run +support.inlineBlockNeedsLayout = false; + +// Execute ASAP in case we need to set body.style.zoom +jQuery(function() { + // Minified: var a,b,c,d + var val, div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + // Return for frameset docs that don't have a body + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + if ( typeof div.style.zoom !== strundefined ) { + // Support: IE<8 + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; + + support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; + if ( val ) { + // Prevent IE 6 from affecting layout for positioned elements #11048 + // Prevent IE from shrinking the body in IE 7 mode #12869 + // Support: IE<8 + body.style.zoom = 1; + } + } + + body.removeChild( container ); +}); + + + + +(function() { + var div = document.createElement( "div" ); + + // Execute the test only if not already executed in another module. + if (support.deleteExpando == null) { + // Support: IE<9 + support.deleteExpando = true; + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + } + + // Null elements to avoid leaks in IE. + div = null; +})(); + + +/** + * Determines whether an object can have data + */ +jQuery.acceptData = function( elem ) { + var noData = jQuery.noData[ (elem.nodeName + " ").toLowerCase() ], + nodeType = +elem.nodeType || 1; + + // Do not set data on non-element DOM nodes because it will not be cleared (#8335). + return nodeType !== 1 && nodeType !== 9 ? + false : + + // Nodes accept data unless otherwise specified; rejection can be conditional + !noData || noData !== true && elem.getAttribute("classid") === noData; +}; + + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /([A-Z])/g; + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + var name; + for ( name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + +function internalData( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var ret, thisCache, + internalKey = jQuery.expando, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + // Avoid exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( typeof name === "string" ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; +} + +function internalRemoveData( elem, name, pvt ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split(" "); + } + } + } else { + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = name.concat( jQuery.map( name, jQuery.camelCase ) ); + } + + i = name.length; + while ( i-- ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject( cache[ id ] ) ) { + return; + } + } + + // Destroy the cache + if ( isNode ) { + jQuery.cleanData( [ elem ], true ); + + // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) + /* jshint eqeqeq: false */ + } else if ( support.deleteExpando || cache != cache.window ) { + /* jshint eqeqeq: true */ + delete cache[ id ]; + + // When all else fails, null + } else { + cache[ id ] = null; + } +} + +jQuery.extend({ + cache: {}, + + // The following elements (space-suffixed to avoid Object.prototype collisions) + // throw uncatchable exceptions if you attempt to set expando properties + noData: { + "applet ": true, + "embed ": true, + // ...but Flash objects (which have this classid) *can* handle expandos + "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data ) { + return internalData( elem, name, data ); + }, + + removeData: function( elem, name ) { + return internalRemoveData( elem, name ); + }, + + // For internal use only. + _data: function( elem, name, data ) { + return internalData( elem, name, data, true ); + }, + + _removeData: function( elem, name ) { + return internalRemoveData( elem, name, true ); + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var i, name, data, + elem = this[0], + attrs = elem && elem.attributes; + + // Special expections of .data basically thwart jQuery.access, + // so implement the relevant behavior ourselves + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice(5) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + return arguments.length > 1 ? + + // Sets one value + this.each(function() { + jQuery.data( this, key, value ); + }) : + + // Gets one value + // Try to fetch any internally stored data first + elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + + +jQuery.extend({ + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray(data) ) { + queue = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return jQuery._data( elem, key ) || jQuery._data( elem, key, { + empty: jQuery.Callbacks("once memory").add(function() { + jQuery._removeData( elem, type + "queue" ); + jQuery._removeData( elem, key ); + }) + }); + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[0], type ); + } + + return data === undefined ? + this : + this.each(function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +}); +var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHidden = function( elem, el ) { + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); + }; + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + length = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < length; i++ ) { + fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[0], key ) : emptyGet; +}; +var rcheckableType = (/^(?:checkbox|radio)$/i); + + + +(function() { + // Minified: var a,b,c + var input = document.createElement( "input" ), + div = document.createElement( "div" ), + fragment = document.createDocumentFragment(); + + // Setup + div.innerHTML = "
    a"; + + // IE strips leading whitespace when .innerHTML is used + support.leadingWhitespace = div.firstChild.nodeType === 3; + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + support.tbody = !div.getElementsByTagName( "tbody" ).length; + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + support.html5Clone = + document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>"; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + input.type = "checkbox"; + input.checked = true; + fragment.appendChild( input ); + support.appendChecked = input.checked; + + // Make sure textarea (and checkbox) defaultValue is properly cloned + // Support: IE6-IE11+ + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // #11217 - WebKit loses check when the name is after the checked attribute + fragment.appendChild( div ); + div.innerHTML = ""; + + // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 + // old WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<9 + // Opera does not clone events (and typeof div.attachEvent === undefined). + // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() + support.noCloneEvent = true; + if ( div.attachEvent ) { + div.attachEvent( "onclick", function() { + support.noCloneEvent = false; + }); + + div.cloneNode( true ).click(); + } + + // Execute the test only if not already executed in another module. + if (support.deleteExpando == null) { + // Support: IE<9 + support.deleteExpando = true; + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + } +})(); + + +(function() { + var i, eventName, + div = document.createElement( "div" ); + + // Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event) + for ( i in { submit: true, change: true, focusin: true }) { + eventName = "on" + i; + + if ( !(support[ i + "Bubbles" ] = eventName in window) ) { + // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) + div.setAttribute( eventName, "t" ); + support[ i + "Bubbles" ] = div.attributes[ eventName ].expando === false; + } + } + + // Null elements to avoid leaks in IE. + div = null; +})(); + + +var rformElems = /^(?:input|select|textarea)$/i, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + var tmp, events, t, handleObjIn, + special, eventHandle, handleObj, + handlers, type, namespaces, origType, + elemData = jQuery._data( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !(events = elemData.events) ) { + events = elemData.events = {}; + } + if ( !(eventHandle = elemData.handle) ) { + eventHandle = elemData.handle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !(handlers = events[ type ]) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + var j, handleObj, tmp, + origCount, t, events, + special, handlers, type, + namespaces, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery._removeData( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + var handle, ontype, cur, + bubbleType, special, tmp, i, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf(".") >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf(":") < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join("."); + event.namespace_re = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === (elem.ownerDocument || document) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && jQuery.acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && + jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + try { + elem[ type ](); + } catch ( e ) { + // IE<9 dies on focus/blur to hidden element (#1486,#12518) + // only reproducible on winXP IE8 native, not IE9 in IE8 mode + } + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, ret, handleObj, matched, j, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( (event.result = ret) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var sel, handleObj, matches, i, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // Avoid non-left-click bubbling in Firefox (#3861) + if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { + + /* jshint eqeqeq: false */ + for ( ; cur != this; cur = cur.parentNode || this ) { + /* jshint eqeqeq: true */ + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) >= 0 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, handlers: matches }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); + } + + return handlerQueue; + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: IE<9 + // Fix target property (#1925) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Support: Chrome 23+, Safari? + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Support: IE<9 + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) + event.metaKey = !!event.metaKey; + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var body, eventDoc, doc, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + special: { + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + try { + this.focus(); + return false; + } catch ( e ) { + // Support: IE<9 + // If we error on focus to hidden element (#1486, #12518), + // let .trigger() run the handlers + } + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 + // detachEvent needed property on element, by name of that event, to properly expose it to GC + if ( typeof elem[ name ] === strundefined ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + // Support: IE < 9, Android < 4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + if ( !e ) { + return; + } + + // If preventDefault exists, run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // Support: IE + // Otherwise set the returnValue property of the original event to false + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + if ( !e ) { + return; + } + // If stopPropagation exists, run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + + // Support: IE + // Set the cancelBubble property of the original event to true + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && e.stopImmediatePropagation ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !jQuery._data( form, "submitBubbles" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submit_bubble = true; + }); + jQuery._data( form, "submitBubbles", true ); + } + }); + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( event._submit_bubble ) { + delete event._submit_bubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + } + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + } + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event, true ); + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + jQuery._data( elem, "changeBubbles", true ); + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + jQuery._removeData( doc, fix ); + } else { + jQuery._data( doc, fix, attaches ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var type, origFn; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on( types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + var elem = this[0]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +}); + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, + rtagName = /<([\w:]+)/, + rtbody = /\s*$/g, + + // We have to close these tags to support XHTML (#13200) + wrapMap = { + option: [ 1, "" ], + legend: [ 1, "
    ", "
    " ], + area: [ 1, "", "" ], + param: [ 1, "", "" ], + thead: [ 1, "", "
    " ], + tr: [ 2, "", "
    " ], + col: [ 2, "", "
    " ], + td: [ 3, "", "
    " ], + + // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, + // unless wrapped in a div with non-breaking characters in front of it. + _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
    ", "
    " ] + }, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement("div") ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +function getAll( context, tag ) { + var elems, elem, + i = 0, + found = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== strundefined ? context.querySelectorAll( tag || "*" ) : + undefined; + + if ( !found ) { + for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) { + if ( !tag || jQuery.nodeName( elem, tag ) ) { + found.push( elem ); + } else { + jQuery.merge( found, getAll( elem, tag ) ); + } + } + } + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], found ) : + found; +} + +// Used in buildFragment, fixes the defaultChecked property +function fixDefaultChecked( elem ) { + if ( rcheckableType.test( elem.type ) ) { + elem.defaultChecked = elem.checked; + } +} + +// Support: IE<8 +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName("tbody")[0] || + elem.appendChild( elem.ownerDocument.createElement("tbody") ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + if ( match ) { + elem.type = match[1]; + } else { + elem.removeAttribute("type"); + } + return elem; +} + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var elem, + i = 0; + for ( ; (elem = elems[i]) != null; i++ ) { + jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) ); + } +} + +function cloneCopyEvent( src, dest ) { + + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function fixCloneNodeIssues( src, dest ) { + var nodeName, e, data; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 copies events bound via attachEvent when using cloneNode. + if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { + data = jQuery._data( dest ); + + for ( e in data.events ) { + jQuery.removeEvent( dest, e, data.handle ); + } + + // Event data gets referenced instead of copied if the expando gets copied too + dest.removeAttribute( jQuery.expando ); + } + + // IE blanks contents when cloning scripts, and tries to evaluate newly-set text + if ( nodeName === "script" && dest.text !== src.text ) { + disableScript( dest ).text = src.text; + restoreScript( dest ); + + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + } else if ( nodeName === "object" ) { + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.defaultSelected = dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var destElements, node, clone, i, srcElements, + inPage = jQuery.contains( elem.ownerDocument, elem ); + + if ( support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( (!support.noCloneEvent || !support.noCloneChecked) && + (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + // Fix all IE cloning issues + for ( i = 0; (node = srcElements[i]) != null; ++i ) { + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[i] ) { + fixCloneNodeIssues( node, destElements[i] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0; (node = srcElements[i]) != null; i++ ) { + cloneCopyEvent( node, destElements[i] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + destElements = srcElements = node = null; + + // Return the cloned set + return clone; + }, + + buildFragment: function( elems, context, scripts, selection ) { + var j, elem, contains, + tmp, tag, tbody, wrap, + l = elems.length, + + // Ensure a safe fragment + safe = createSafeFragment( context ), + + nodes = [], + i = 0; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || safe.appendChild( context.createElement("div") ); + + // Deserialize a standard representation + tag = (rtagName.exec( elem ) || [ "", "" ])[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + + tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[2]; + + // Descend through wrappers to the right content + j = wrap[0]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Manually add leading whitespace removed by IE + if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { + nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) ); + } + + // Remove IE's autoinserted from table fragments + if ( !support.tbody ) { + + // String was a , *may* have spurious + elem = tag === "table" && !rtbody.test( elem ) ? + tmp.firstChild : + + // String was a bare or + wrap[1] === "
    " && !rtbody.test( elem ) ? + tmp : + 0; + + j = elem && elem.childNodes.length; + while ( j-- ) { + if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) { + elem.removeChild( tbody ); + } + } + } + + jQuery.merge( nodes, tmp.childNodes ); + + // Fix #12392 for WebKit and IE > 9 + tmp.textContent = ""; + + // Fix #12392 for oldIE + while ( tmp.firstChild ) { + tmp.removeChild( tmp.firstChild ); + } + + // Remember the top-level container for proper cleanup + tmp = safe.lastChild; + } + } + } + + // Fix #11356: Clear elements from fragment + if ( tmp ) { + safe.removeChild( tmp ); + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !support.appendChecked ) { + jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); + } + + i = 0; + while ( (elem = nodes[ i++ ]) ) { + + // #4087 - If origin and destination elements are the same, and this is + // that element, do not do anything + if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( safe.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( (elem = tmp[ j++ ]) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + tmp = null; + + return safe; + }, + + cleanData: function( elems, /* internal */ acceptData ) { + var elem, type, id, data, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + deleteExpando = support.deleteExpando, + special = jQuery.event.special; + + for ( ; (elem = elems[i]) != null; i++ ) { + if ( acceptData || jQuery.acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( deleteExpando ) { + delete elem[ internalKey ]; + + } else if ( typeof elem.removeAttribute !== strundefined ) { + elem.removeAttribute( internalKey ); + + } else { + elem[ internalKey ] = null; + } + + deletedIds.push( id ); + } + } + } + } + } +}); + +jQuery.fn.extend({ + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); + }, null, value, arguments.length ); + }, + + append: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + }); + }, + + before: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + }); + }, + + after: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + }); + }, + + remove: function( selector, keepData /* Internal Use Only */ ) { + var elem, + elems = selector ? jQuery.filter( selector, this ) : this, + i = 0; + + for ( ; (elem = elems[i]) != null; i++ ) { + + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem ) ); + } + + if ( elem.parentNode ) { + if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { + setGlobalEval( getAll( elem, "script" ) ); + } + elem.parentNode.removeChild( elem ); + } + } + + return this; + }, + + empty: function() { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + + // If this is a select, ensure that it displays empty (#12336) + // Support: IE<9 + if ( elem.options && jQuery.nodeName( elem, "select" ) ) { + elem.options.length = 0; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map(function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ (rtagName.exec( value ) || [ "", "" ])[ 1 ].toLowerCase() ] ) { + + value = value.replace( rxhtmlTag, "<$1>" ); + + try { + for (; i < l; i++ ) { + // Remove element nodes and prevent memory leaks + elem = this[i] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch(e) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var arg = arguments[ 0 ]; + + // Make the changes, replacing each context element with the new content + this.domManip( arguments, function( elem ) { + arg = this.parentNode; + + jQuery.cleanData( getAll( this ) ); + + if ( arg ) { + arg.replaceChild( elem, this ); + } + }); + + // Force removal if there was no new content (e.g., from empty arguments) + return arg && (arg.length || arg.nodeType) ? this : this.remove(); + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, callback ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var first, node, hasScripts, + scripts, doc, fragment, + i = 0, + l = this.length, + set = this, + iNoClone = l - 1, + value = args[0], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return this.each(function( index ) { + var self = set.eq( index ); + if ( isFunction ) { + args[0] = value.call( this, index, self.html() ); + } + self.domManip( args, callback ); + }); + } + + if ( l ) { + fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + if ( first ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( this[i], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { + + if ( node.src ) { + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) ); + } + } + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + } + } + + return this; + } +}); + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone(true); + jQuery( insert[i] )[ original ]( elems ); + + // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +}); + + +var iframe, + elemdisplay = {}; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var style, + elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + // getDefaultComputedStyle might be reliably used only on attached element + display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? + + // Use of this method is a temporary fix (more like optmization) until something better comes along, + // since it was removed from specification and supported only in FF + style.display : jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = (iframe || jQuery( " + + + + + +

    Messenger

    +

    Alerts for the 21st century

    + +
    + Download this project as a .zip file + Download this project as a tar.gz file +
    + + + + +
    +
    +

    HubSpot Messaging Library

    + +
      +
    • Show transactional messages in your app. +
    • Wrap AJAX requests with progress, success and error messages. +
    • Add action links to your messages. +
    • 4kb minified and compressed. +
    • Works in everything modern, and IE7 and above. +
    + +

    Demo

    + + + + +

    Requires

    + +
      +
    • jQuery
    • +
    • Plays well with, but doesn't require, Bootstrap
    + +

    Including

    + +

    JS

    + +
    /build/js/messenger.min.js
    +/build/js/messenger-theme-future.js
    +
    + +

    CSS

    + +
    /build/css/messenger.css
    +/build/css/messenger-theme-future.css
    +
    + +

    + Also available as a Rails gem and on cdnjs. +

    + +

    Really Quick Usage

    +
    +
    +# Replace:
    +$.ajax
    +    url: "/some-url"
    +    success: ->
    +
    +# With:
    +Messenger().run
    +    errorMessage: "This did not go well."
    +,
    +    url: "/some-url"
    +    success: ->
    +
    +
    +

    Usage Click Code to Edit

    +
    +
    +

    Change Location

    +
    +
    +
    +

    Change Theme

    +
      +
      +
      +

      Change Language

      +
        +
      • JavaScript
      • +
      • CoffeeScript
      • +
      +
      +
      +
      +
      +
      +
      +Messenger().post "Your request has succeded!"
      +
      +Messenger().post
      +    message: 'There was an explosion while processing your request.'
      +    type: 'error'
      +    showCloseButton: true
      +
      +msg = Messenger().post "My Message"
      +msg.update "I changed my mind, this is my message"
      +msg.hide()
      +
      +# Want to put actions at the end of your messages?
      +msg = Messenger().post
      +    message: 'Launching thermonuclear war...'
      +    type: 'info'
      +    actions:
      +        cancel:
      +            label: 'cancel launch'
      +            action: ->
      +                msg.update
      +                    message: 'Thermonuclear war averted'
      +                    type: 'success'
      +                    actions: false
      +
      +# This guy will 500 a few times, then succeed
      +i = 0
      +Messenger().run
      +  errorMessage: 'Error destroying alien planet'
      +  successMessage: 'Alien planet destroyed!'
      +
      +  action: (opts) ->
      +    if (++i < 3)
      +      opts.error({status: 500, readyState: 0, responseText: 0})
      +    else
      +      opts.success()
      +
      +
      +# Have an error? How about auto retrys with a Gmail-style countdown
      +# (hidden in the future theme)?:
      +msg = Messenger().post
      +    message: "I'm sorry Hal, I just can't do that."
      +    actions:
      +        retry:
      +            label: 'retry now'
      +            phrase: 'Retrying TIME'
      +            auto: true
      +            delay: 10
      +            action: ->
      +                # Do some retrying...
      +
      +        cancel:
      +            action: ->
      +                do msg.cancel
      +
      +# You can bind to action events as well:
      +msg.on 'action:retry', ->
      +    alert('Hey, you retried!')
      +
      +# Need more control? You can bind events backbone-style based
      +# on the type of message.
      +msg.update
      +    events:
      +        'success click': ->
      +            # Will fire when the user clicks the message
      +            # in a success state.
      +
      +        'error click a.awesome-class': ->
      +            # Rock on
      +
      +# Need your message to hide after a while, or when the Backbone
      +# router changes the page?
      +Messenger().post
      +    message: "Weeeeee"
      +
      +    hideAfter: 10
      +    hideOnNavigate: true
      +
      +# You can use the id property to ensure that only one
      +# instance of a message will appear on the page at a time
      +# (the older message will be hidden).
      +Messenger().post
      +  message: "Only one at a time!"
      +  id: "Only-one-message"
      +
      +# When you add the singleton attribute, it ensures that no
      +# other messages with that id will ever be shown again
      +# (the newer message will be hidden).
      +Messenger().post
      +  message: "It's just me!"
      +  id: '4'
      +  singleton: true
      +
      +Messenger().post
      +  message: "You'll never see me"
      +  id: '4'
      +  singleton: true
      +
      +# Rather than hiding and showing multiple messages
      +# you can also maintain a single message between
      +# requests.
      +msg = Messenger().run()
      +Messenger().run({messageInstance: msg})
      +
      +# Don't want your message hidden on a long page? (Not necessary
      +# if you're using the default fixed positioning)
      +msg = Messenger().post
      +    message: "You'll see me!"
      +
      +    scrollTo: true
      +    # Requires jQuery scrollTo plugin
      +
      +msg.scrollTo() # also works
      +
      +# Lazy/smart? How about messenger does it all for you?  All the
      +# retry magic comes with.
      +Messenger().run
      +    successMessage: 'Data saved.'
      +    errorMessage: 'Error saving data'
      +    progressMessage: 'Saving data' # Don't include messages you
      +                                   # don't want to appear.
      +
      +    # Any standard message opts can go here
      +,
      +    # All the standard jQuery ajax options here
      +
      +    url: '/data'
      +
      +# Need to override the messages based on the response?
      +Messenger().run
      +    errorMessage: 'Oops'
      +,
      +    url: '/data'
      +    error: (xhr) ->
      +        # Whatever you return from your handlers will replace
      +        # the default messages
      +
      +        if xhr?.status is 404
      +            return "Data not found"
      +
      +        # Return true or undefined for your predefined message
      +        # Return false to not show any message
      +
      +        return true
      +
      +# Sometimes you only want to show the success message when a
      +# retry succeeds, not if a retry wasen't required:
      +Messenger().run
      +    successMessage: 'Successfully saved.'
      +    errorMessage: 'Error saving'
      +
      +    showSuccessWithoutError: false
      +,
      +    url: '/data'
      +
      +# You don't have to use $.ajax as your action, messenger works
      +# great for any async process:
      +Messenger().run
      +    successMessage: 'Bomb defused successfully'
      +
      +    action: defuseBomb
      +    # You can put options for defuseBomb here
      +    # It will be passed success and error callbacks
      +
      +# Need to hide all messages?
      +Messenger().hideAll()
      +
      +# If your action responds with a promise-like thing, its
      +# methods will be copied onto the message:
      +
      +Messenger().run({}, {url: 'a'}).fail(-> alert "Uh oh")
      +
      +# Do you use Backbone? Hook all backbone calls:
      +Messenger().hookBackboneAjax()
      +
      +# By default, there will be no error message (just background
      +# retries), return an error message from your backbone error handler,
      +# or add an errorMessage to the messenger opts to set one.
      +# You can override these options by passing them into
      +# hookBackboneAjax, or adding a {'messenger': } hash to your
      +# fetch call.
      +
      +# You don't have to use the global messenger
      +$('div#message-container').messenger().post "My message"
      +
      +# By default, the global messenger will create an ActionMessenger
      +# instance fixed to the bottom-right corner of the screen.
      +
      +# You can pass an instance of messenger into globalMessenger
      +# to override the default position.
      +myAwesomeMessenger = $('.mess').messenger()
      +Messenger({instance: myAwesomeMessenger});
      +
      +Messenger() # <-- Will return your messenger
      +
      +Messenger({'parentLocations': ['.page', 'body']});
      +# Will try to insert the messenger into the el matching
      +# .page before inserting it into the page.
      +
      +# This can be important if you're not using fixed positioning.
      +
      +# All the options for globalMessenger and their defaults:
      +
      +{
      +  'parentLocations': ['body'],
      +  'maxMessages': 9,
      +  'extraClasses': 'messenger-fixed messenger-on-right messenger-on-bottom messenger-theme-future',
      +  'instance': undefined,
      +  'messageDefaults': {
      +    # Default message options
      +    hideAfter: 10,
      +    scroll: true,
      +    closeButtonText: "×",
      +    escapeText: false
      +  }
      +}
      +
      +# You can also set default options on the Messenger.options object.
      +Messenger.options = {'extraClasses': 'messenger-fixed messenger-on-left'}
      +
      +
      + +

      Contributing

      + +

      We welcome contributors!

      +

      +The build process requires nodejs and grunt-cli. +You can build the output files by running grunt. +The automated tests can be run by opening SpecRunner.html in a browser. +

      +

      +There is plenty to be done, pick an issue and start hacking! +

      +
      +
      + + + + + + + + + + + diff --git a/public/bower_components/messenger/docs/welcome/javascripts/demo.js b/public/bower_components/messenger/docs/welcome/javascripts/demo.js new file mode 100755 index 0000000..b9f8095 --- /dev/null +++ b/public/bower_components/messenger/docs/welcome/javascripts/demo.js @@ -0,0 +1,41 @@ +$(function(){ + Messenger().post("Thanks for checking out Messenger!"); + + var loc = ['bottom', 'right']; + var style = 'flat'; + + var $output = $('.controls output'); + var $lsel = $('.location-selector'); + var $tsel = $('.theme-selector'); + + var update = function(){ + var classes = 'messenger-fixed'; + + for (var i=0; i < loc.length; i++) + classes += ' messenger-on-' + loc[i]; + + $.globalMessenger({ extraClasses: classes, theme: style }); + Messenger.options = { extraClasses: classes, theme: style }; + + $output.text("Messenger.options = {\n extraClasses: '" + classes + "',\n theme: '" + style + "'\n}"); + }; + + update(); + + $lsel.locationSelector() + .on('update', function(pos){ + loc = pos; + + update(); + }) + ; + + $tsel.themeSelector({ + themes: ['flat', 'future', 'block', 'air', 'ice'] + }).on('update', function(theme){ + style = theme; + + update(); + }); + +}); \ No newline at end of file diff --git a/public/bower_components/messenger/docs/welcome/javascripts/execute.coffee b/public/bower_components/messenger/docs/welcome/javascripts/execute.coffee new file mode 100755 index 0000000..67e2109 --- /dev/null +++ b/public/bower_components/messenger/docs/welcome/javascripts/execute.coffee @@ -0,0 +1,19 @@ +$.fn.executr = (opts) -> + defaults = + codeSelector: 'code[executable]' + + opts = $.extend {}, defaults, opts + + this.on 'click', opts.codeSelector, (e) -> + $target = $ e.target + $code = $target.parents(opts.codeSelector) + + ctx = window + if opts.setUp? + CoffeeScript.run opts.setUp, ctx + + CoffeeScript.run $code.text(), ctx + + if opts.tearDown? + CoffeeScript.run opts.tearDown, ctx + diff --git a/public/bower_components/messenger/docs/welcome/javascripts/location-sel.coffee b/public/bower_components/messenger/docs/welcome/javascripts/location-sel.coffee new file mode 100755 index 0000000..8fdc605 --- /dev/null +++ b/public/bower_components/messenger/docs/welcome/javascripts/location-sel.coffee @@ -0,0 +1,41 @@ +class LocationSelector extends Backbone.View + className: 'location-selector' + + events: + 'click .bit': 'handleClick' + + render: -> + @$el.html '' + + do @draw + + draw: -> + @_addBit 'top left' + @_addBit 'top right' + @_addBit 'top' + + @_addBit 'bottom left' + @_addBit 'bottom right' + @_addBit 'bottom' + + _addBit: (classes) -> + bit = $ '
      ' + bit.addClass "bit #{ classes }" + bit.attr 'data-position', classes + @$el.append bit + + bit + + handleClick: (e) -> + $bit = $ e.target + + @trigger 'update', $bit.attr('data-position').split(' ') + +$.fn.locationSelector = (opts) -> + loc = new LocationSelector $.extend {}, opts, + el: this + + $(this).addClass loc.className + loc.render() + + loc diff --git a/public/bower_components/messenger/docs/welcome/javascripts/location-sel.js b/public/bower_components/messenger/docs/welcome/javascripts/location-sel.js new file mode 100755 index 0000000..f43a374 --- /dev/null +++ b/public/bower_components/messenger/docs/welcome/javascripts/location-sel.js @@ -0,0 +1,63 @@ +(function() { + var LocationSelector, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + LocationSelector = (function(_super) { + + __extends(LocationSelector, _super); + + function LocationSelector() { + return LocationSelector.__super__.constructor.apply(this, arguments); + } + + LocationSelector.prototype.className = 'location-selector'; + + LocationSelector.prototype.events = { + 'click .bit': 'handleClick' + }; + + LocationSelector.prototype.render = function() { + this.$el.html(''); + return this.draw(); + }; + + LocationSelector.prototype.draw = function() { + this._addBit('top left'); + this._addBit('top right'); + this._addBit('top'); + this._addBit('bottom left'); + this._addBit('bottom right'); + return this._addBit('bottom'); + }; + + LocationSelector.prototype._addBit = function(classes) { + var bit; + bit = $('
      '); + bit.addClass("bit " + classes); + bit.attr('data-position', classes); + this.$el.append(bit); + return bit; + }; + + LocationSelector.prototype.handleClick = function(e) { + var $bit; + $bit = $(e.target); + return this.trigger('update', $bit.attr('data-position').split(' ')); + }; + + return LocationSelector; + + })(Backbone.View); + + $.fn.locationSelector = function(opts) { + var loc; + loc = new LocationSelector($.extend({}, opts, { + el: this + })); + $(this).addClass(loc.className); + loc.render(); + return loc; + }; + +}).call(this); diff --git a/public/bower_components/messenger/docs/welcome/javascripts/main.js b/public/bower_components/messenger/docs/welcome/javascripts/main.js new file mode 100755 index 0000000..d8135d3 --- /dev/null +++ b/public/bower_components/messenger/docs/welcome/javascripts/main.js @@ -0,0 +1 @@ +console.log('This would be the main JS file.'); diff --git a/public/bower_components/messenger/docs/welcome/javascripts/theme-sel.coffee b/public/bower_components/messenger/docs/welcome/javascripts/theme-sel.coffee new file mode 100755 index 0000000..cab8aca --- /dev/null +++ b/public/bower_components/messenger/docs/welcome/javascripts/theme-sel.coffee @@ -0,0 +1,30 @@ +class ThemeSelector extends Backbone.View + tagName: 'ul' + className: 'theme-selector' + + events: + 'click li': 'handleClick' + + render: -> + @$el.html '' + + for theme in @options.themes + $li = $ '
    • ' + $li.attr 'data-id', theme + $li.text theme + + @$el.append $li + + handleClick: (e) -> + $li = $ e.target + + @trigger 'update', $li.attr('data-id') + +$.fn.themeSelector = (opts) -> + sel = new ThemeSelector $.extend {}, opts, + el: this + + $(this).addClass sel.className + sel.render() + + sel diff --git a/public/bower_components/messenger/docs/welcome/javascripts/theme-sel.js b/public/bower_components/messenger/docs/welcome/javascripts/theme-sel.js new file mode 100755 index 0000000..c96374f --- /dev/null +++ b/public/bower_components/messenger/docs/welcome/javascripts/theme-sel.js @@ -0,0 +1,57 @@ +(function() { + var ThemeSelector, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + ThemeSelector = (function(_super) { + + __extends(ThemeSelector, _super); + + function ThemeSelector() { + return ThemeSelector.__super__.constructor.apply(this, arguments); + } + + ThemeSelector.prototype.tagName = 'ul'; + + ThemeSelector.prototype.className = 'theme-selector'; + + ThemeSelector.prototype.events = { + 'click li': 'handleClick' + }; + + ThemeSelector.prototype.render = function() { + var $li, theme, _i, _len, _ref, _results; + this.$el.html(''); + _ref = this.options.themes; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + theme = _ref[_i]; + $li = $('
    • '); + $li.attr('data-id', theme); + $li.text(theme); + _results.push(this.$el.append($li)); + } + return _results; + }; + + ThemeSelector.prototype.handleClick = function(e) { + var $li; + $li = $(e.target); + return this.trigger('update', $li.attr('data-id')); + }; + + return ThemeSelector; + + })(Backbone.View); + + $.fn.themeSelector = function(opts) { + var sel; + sel = new ThemeSelector($.extend({}, opts, { + el: this + })); + $(this).addClass(sel.className); + sel.render(); + return sel; + }; + +}).call(this); diff --git a/public/bower_components/messenger/docs/welcome/lib/executr/LICENSE b/public/bower_components/messenger/docs/welcome/lib/executr/LICENSE new file mode 100755 index 0000000..d746b04 --- /dev/null +++ b/public/bower_components/messenger/docs/welcome/lib/executr/LICENSE @@ -0,0 +1,8 @@ +Copyright (c) 2013 HubSpot, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/public/bower_components/messenger/docs/welcome/lib/executr/README.md b/public/bower_components/messenger/docs/welcome/lib/executr/README.md new file mode 100755 index 0000000..d0b9658 --- /dev/null +++ b/public/bower_components/messenger/docs/welcome/lib/executr/README.md @@ -0,0 +1,93 @@ +## executr + +Let your users execute and play with the CoffeeScript and JavaScript in your documentation + +### Example + +See our messenger documentation for an example: http://hubspot.github.com/messenger/ + +### Including + +````html + + + + + + + + + + + + + +```` + +### Usage + +The code blocks you wish to be executable should be wrapped in ``. + +Run `$.executr` on the container of multiple code elements, the body, or a single code block. + +The blocks will be converted into CodeMirror Editors, and a run button will be added. If you're not interested +in the code being editable, take a look at the v1.1 tag. + +Only the text (not tags) in the block will be executed, feel free to wrap your already-syntax-highlighted code. + +The code editor will assume the height + 10px and width of the code element. + +````html +
      
      +$ ->
      +  alert "Testing!"
      +
      +```` + +````javascript +$(function(){ + $('body').executr(); +}); +```` + +You can also make javascript executable, by either adding a `data-type="javascript"` attribute to the code +block, or by adding `defaultType: 'javascript'` to the executr call. + +````html + +alert("Testing!"); + +```` + +### Other Options + +$.executr can be passed the following options + +````coffeescript +{ + codeSelector: 'code[executable]' # The jQuery selector items to be bound must match + + outputTo: 'div.output' # An element which should receive the output. + appendOutput: true # Whether output should replace the contents of outputTo, or append to it + + defaultType: 'coffeescript' # The default source languange, if not supplied as a data-type attribute + type: 'coffeescript' # The type to force on all code blocks, even if otherwise specified. Can also be a function. + coffeeOptions: {} # Extra options for the CoffeeScript compiler + + codeMirrorOptions: {} # Extra options for CodeMirror + + setUp: -> # Code to run before each code block + tearDown: -> # Code to run after each code block +} +```` + +#### Events + +Executr will fire two events on the element it is bound to: + +- `executrBeforeExecute(code string, normalized code language, executr options)` +- `executrAfterExecute(code output, code string, normalized code language, executr options)` + +#### Contributing + +You can build the project by running `./build.sh`. It requires the CoffeeScript compiler. diff --git a/public/bower_components/messenger/docs/welcome/lib/executr/build.sh b/public/bower_components/messenger/docs/welcome/lib/executr/build.sh new file mode 100755 index 0000000..c9b1500 --- /dev/null +++ b/public/bower_components/messenger/docs/welcome/lib/executr/build.sh @@ -0,0 +1,4 @@ +cp src/css/* build/css + +coffee -o build/js src/coffee + diff --git a/public/bower_components/messenger/docs/welcome/lib/executr/build/css/executr.css b/public/bower_components/messenger/docs/welcome/lib/executr/build/css/executr.css new file mode 100755 index 0000000..8b80bf8 --- /dev/null +++ b/public/bower_components/messenger/docs/welcome/lib/executr/build/css/executr.css @@ -0,0 +1,38 @@ +code[executable] { + display: block; +} + +.executr-code-editor { + overflow: hidden; + position: relative; + box-sizing: border-box; +} +.executr-code-editor .CodeMirror pre { + box-shadow: none; + border-width: 0; + line-height: 1.3; + font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; + font-size: 13px; +} +.executr-code-editor .executr-run-button { + width: 84px; + padding: 0 10px; + font-size: 24px; + z-index: 5; + border-width: 0; + background-color: #DDD; + + position: absolute; + top: 0; + bottom: 0; + right: 0; + + opacity: 0.5; +} +.executr-code-editor .executr-run-button:hover { + opacity: 0.8; +} + +.CodeMirror { + height: auto; +} \ No newline at end of file diff --git a/public/bower_components/messenger/docs/welcome/lib/executr/build/js/executr.js b/public/bower_components/messenger/docs/welcome/lib/executr/build/js/executr.js new file mode 100755 index 0000000..2023796 --- /dev/null +++ b/public/bower_components/messenger/docs/welcome/lib/executr/build/js/executr.js @@ -0,0 +1,217 @@ +(function() { + var Editor, converters, getCodeElement, insertOutput, normalizeType, runners; + var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + runners = { + 'javascript': function(opts, code) { + return eval(code); + } + }; + converters = { + 'coffeescript:javascript': function(opts, code) { + var csOptions; + csOptions = $.extend({}, opts.coffeeOptions, { + bare: true + }); + return CoffeeScript.compile(code, csOptions); + }, + 'javascript:coffeescript': function(opts, code) { + var out; + if (Js2coffee) { + return out = Js2coffee.build(code); + } else { + console.error("Can't convert javascript to coffeescript"); + return code; + } + } + }; + normalizeType = function(codeType) { + switch (codeType.toLowerCase()) { + case 'js': + case 'javascript': + case 'text/javascript': + case 'application/javascript': + return 'javascript'; + case 'cs': + case 'coffee': + case 'coffeescript': + case 'text/coffeescript': + case 'application/coffeescript': + return 'coffeescript'; + default: + return console.error("Code type " + codeType + " not understood."); + } + }; + Editor = (function() { + function Editor(args) { + this.el = args.el; + this.opts = args.opts; + this.codeCache = {}; + this.$el = $(this.el); + this.buildEditor(); + this.addRunButton(); + this.addListeners(); + } + Editor.prototype.getValue = function() { + return this.editor.getValue(); + }; + Editor.prototype.addListeners = function() { + return this.$el.on('executrSwitchType', __bind(function(e, type) { + return this.switchType(type); + }, this)); + }; + Editor.prototype.addRunButton = function() { + this.$runButton = $(' + + diff --git a/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/LICENSE b/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/LICENSE new file mode 100755 index 0000000..482d55e --- /dev/null +++ b/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/LICENSE @@ -0,0 +1,23 @@ +Copyright (C) 2013 by Marijn Haverbeke + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +Please note that some subdirectories of the CodeMirror distribution +include their own LICENSE files, and are released under different +licences. diff --git a/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/codemirror.css b/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/codemirror.css new file mode 100755 index 0000000..1ceb080 --- /dev/null +++ b/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/codemirror.css @@ -0,0 +1,240 @@ +/* BASICS */ + +.CodeMirror { + /* Set height, width, borders, and global font properties here */ + font-family: monospace; + height: 300px; +} +.CodeMirror-scroll { + /* Set scrolling behaviour here */ + overflow: auto; +} + +/* PADDING */ + +.CodeMirror-lines { + padding: 4px 0; /* Vertical padding around content */ +} +.CodeMirror pre { + padding: 0 4px; /* Horizontal padding of content */ +} + +.CodeMirror-scrollbar-filler { + background-color: white; /* The little square between H and V scrollbars */ +} + +/* GUTTER */ + +.CodeMirror-gutters { + border-right: 1px solid #ddd; + background-color: #f7f7f7; +} +.CodeMirror-linenumbers {} +.CodeMirror-linenumber { + padding: 0 3px 0 5px; + min-width: 20px; + text-align: right; + color: #999; +} + +/* CURSOR */ + +.CodeMirror div.CodeMirror-cursor { + border-left: 1px solid black; +} +/* Shown when moving in bi-directional text */ +.CodeMirror div.CodeMirror-secondarycursor { + border-left: 1px solid silver; +} +.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor { + width: auto; + border: 0; + background: transparent; + background: rgba(0, 200, 0, .4); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#6600c800, endColorstr=#4c00c800); +} +/* Kludge to turn off filter in ie9+, which also accepts rgba */ +.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor:not(#nonsense_id) { + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} +/* Can style cursor different in overwrite (non-insert) mode */ +.CodeMirror div.CodeMirror-cursor.CodeMirror-overwrite {} + +/* DEFAULT THEME */ + +.cm-s-default .cm-keyword {color: #708;} +.cm-s-default .cm-atom {color: #219;} +.cm-s-default .cm-number {color: #164;} +.cm-s-default .cm-def {color: #00f;} +.cm-s-default .cm-variable {color: black;} +.cm-s-default .cm-variable-2 {color: #05a;} +.cm-s-default .cm-variable-3 {color: #085;} +.cm-s-default .cm-property {color: black;} +.cm-s-default .cm-operator {color: black;} +.cm-s-default .cm-comment {color: #a50;} +.cm-s-default .cm-string {color: #a11;} +.cm-s-default .cm-string-2 {color: #f50;} +.cm-s-default .cm-meta {color: #555;} +.cm-s-default .cm-error {color: #f00;} +.cm-s-default .cm-qualifier {color: #555;} +.cm-s-default .cm-builtin {color: #30a;} +.cm-s-default .cm-bracket {color: #997;} +.cm-s-default .cm-tag {color: #170;} +.cm-s-default .cm-attribute {color: #00c;} +.cm-s-default .cm-header {color: blue;} +.cm-s-default .cm-quote {color: #090;} +.cm-s-default .cm-hr {color: #999;} +.cm-s-default .cm-link {color: #00c;} + +.cm-negative {color: #d44;} +.cm-positive {color: #292;} +.cm-header, .cm-strong {font-weight: bold;} +.cm-em {font-style: italic;} +.cm-emstrong {font-style: italic; font-weight: bold;} +.cm-link {text-decoration: underline;} + +.cm-invalidchar {color: #f00;} + +div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;} +div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} + +/* STOP */ + +/* The rest of this file contains styles related to the mechanics of + the editor. You probably shouldn't touch them. */ + +.CodeMirror { + line-height: 1; + position: relative; + overflow: hidden; +} + +.CodeMirror-scroll { + /* 30px is the magic margin used to hide the element's real scrollbars */ + /* See overflow: hidden in .CodeMirror, and the paddings in .CodeMirror-sizer */ + margin-bottom: -30px; margin-right: -30px; + padding-bottom: 30px; padding-right: 30px; + height: 100%; + outline: none; /* Prevent dragging from highlighting the element */ + position: relative; +} +.CodeMirror-sizer { + position: relative; +} + +/* The fake, visible scrollbars. Used to force redraw during scrolling + before actuall scrolling happens, thus preventing shaking and + flickering artifacts. */ +.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler { + position: absolute; + z-index: 6; + display: none; +} +.CodeMirror-vscrollbar { + right: 0; top: 0; + overflow-x: hidden; + overflow-y: scroll; +} +.CodeMirror-hscrollbar { + bottom: 0; left: 0; + overflow-y: hidden; + overflow-x: scroll; +} +.CodeMirror-scrollbar-filler { + right: 0; bottom: 0; + z-index: 6; +} + +.CodeMirror-gutters { + position: absolute; left: 0; top: 0; + height: 100%; + z-index: 3; +} +.CodeMirror-gutter { + height: 100%; + display: inline-block; + /* Hack to make IE7 behave */ + *zoom:1; + *display:inline; +} +.CodeMirror-gutter-elt { + position: absolute; + cursor: default; + z-index: 4; +} + +.CodeMirror-lines { + cursor: text; +} +.CodeMirror pre { + /* Reset some styles that the rest of the page might have set */ + -moz-border-radius: 0; -webkit-border-radius: 0; -o-border-radius: 0; border-radius: 0; + border-width: 0; + background: transparent; + font-family: inherit; + font-size: inherit; + margin: 0; + white-space: pre; + word-wrap: normal; + line-height: inherit; + color: inherit; + z-index: 2; + position: relative; + overflow: visible; +} +.CodeMirror-wrap pre { + word-wrap: break-word; + white-space: pre-wrap; + word-break: normal; +} +.CodeMirror-linebackground { + position: absolute; + left: 0; right: 0; top: 0; bottom: 0; + z-index: 0; +} + +.CodeMirror-linewidget { + position: relative; + z-index: 2; + overflow: auto; +} + +.CodeMirror-wrap .CodeMirror-scroll { + overflow-x: hidden; +} + +.CodeMirror-measure { + position: absolute; + width: 100%; height: 0px; + overflow: hidden; + visibility: hidden; +} +.CodeMirror-measure pre { position: static; } + +.CodeMirror div.CodeMirror-cursor { + position: absolute; + visibility: hidden; + border-right: none; + width: 0; +} +.CodeMirror-focused div.CodeMirror-cursor { + visibility: visible; +} + +.CodeMirror-selected { background: #d9d9d9; } +.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; } + +.cm-searching { + background: #ffa; + background: rgba(255, 255, 0, .4); +} + +/* IE7 hack to prevent it from returning funny offsetTops on the spans */ +.CodeMirror span { *vertical-align: text-bottom; } + +@media print { + /* Hide the cursor when printing */ + .CodeMirror div.CodeMirror-cursor { + visibility: hidden; + } +} diff --git a/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/codemirror.js b/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/codemirror.js new file mode 100755 index 0000000..8fa0e94 --- /dev/null +++ b/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/codemirror.js @@ -0,0 +1,4786 @@ +// CodeMirror version 3.02 +// +// CodeMirror is the only global var we claim +window.CodeMirror = (function() { + "use strict"; + + // BROWSER SNIFFING + + // Crude, but necessary to handle a number of hard-to-feature-detect + // bugs and behavior differences. + var gecko = /gecko\/\d/i.test(navigator.userAgent); + var ie = /MSIE \d/.test(navigator.userAgent); + var ie_lt8 = ie && (document.documentMode == null || document.documentMode < 8); + var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9); + var webkit = /WebKit\//.test(navigator.userAgent); + var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(navigator.userAgent); + var chrome = /Chrome\//.test(navigator.userAgent); + var opera = /Opera\//.test(navigator.userAgent); + var safari = /Apple Computer/.test(navigator.vendor); + var khtml = /KHTML\//.test(navigator.userAgent); + var mac_geLion = /Mac OS X 1\d\D([7-9]|\d\d)\D/.test(navigator.userAgent); + var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent); + var phantom = /PhantomJS/.test(navigator.userAgent); + + var ios = /AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent); + // This is woefully incomplete. Suggestions for alternative methods welcome. + var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent); + var mac = ios || /Mac/.test(navigator.platform); + var windows = /windows/i.test(navigator.platform); + + var opera_version = opera && navigator.userAgent.match(/Version\/(\d*\.\d*)/); + if (opera_version) opera_version = Number(opera_version[1]); + // Some browsers use the wrong event properties to signal cmd/ctrl on OS X + var flipCtrlCmd = mac && (qtwebkit || opera && (opera_version == null || opera_version < 12.11)); + + // Optimize some code when these features are not used + var sawReadOnlySpans = false, sawCollapsedSpans = false; + + // CONSTRUCTOR + + function CodeMirror(place, options) { + if (!(this instanceof CodeMirror)) return new CodeMirror(place, options); + + this.options = options = options || {}; + // Determine effective options based on given values and defaults. + for (var opt in defaults) if (!options.hasOwnProperty(opt) && defaults.hasOwnProperty(opt)) + options[opt] = defaults[opt]; + setGuttersForLineNumbers(options); + + var display = this.display = makeDisplay(place); + display.wrapper.CodeMirror = this; + updateGutters(this); + if (options.autofocus && !mobile) focusInput(this); + + this.view = makeView(new BranchChunk([new LeafChunk([makeLine("", null, textHeight(display))])])); + this.nextOpId = 0; + loadMode(this); + themeChanged(this); + if (options.lineWrapping) + this.display.wrapper.className += " CodeMirror-wrap"; + + // Initialize the content. + this.setValue(options.value || ""); + // Override magic textarea content restore that IE sometimes does + // on our hidden textarea on reload + if (ie) setTimeout(bind(resetInput, this, true), 20); + this.view.history = makeHistory(); + + registerEventHandlers(this); + // IE throws unspecified error in certain cases, when + // trying to access activeElement before onload + var hasFocus; try { hasFocus = (document.activeElement == display.input); } catch(e) { } + if (hasFocus || (options.autofocus && !mobile)) setTimeout(bind(onFocus, this), 20); + else onBlur(this); + + operation(this, function() { + for (var opt in optionHandlers) + if (optionHandlers.propertyIsEnumerable(opt)) + optionHandlers[opt](this, options[opt], Init); + for (var i = 0; i < initHooks.length; ++i) initHooks[i](this); + })(); + } + + // DISPLAY CONSTRUCTOR + + function makeDisplay(place) { + var d = {}; + var input = d.input = elt("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none;"); + if (webkit) input.style.width = "1000px"; + else input.setAttribute("wrap", "off"); + input.setAttribute("autocorrect", "off"); input.setAttribute("autocapitalize", "off"); + // Wraps and hides input textarea + d.inputDiv = elt("div", [input], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"); + // The actual fake scrollbars. + d.scrollbarH = elt("div", [elt("div", null, null, "height: 1px")], "CodeMirror-hscrollbar"); + d.scrollbarV = elt("div", [elt("div", null, null, "width: 1px")], "CodeMirror-vscrollbar"); + d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler"); + // DIVs containing the selection and the actual code + d.lineDiv = elt("div"); + d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1"); + // Blinky cursor, and element used to ensure cursor fits at the end of a line + d.cursor = elt("div", "\u00a0", "CodeMirror-cursor"); + // Secondary cursor, shown when on a 'jump' in bi-directional text + d.otherCursor = elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor"); + // Used to measure text size + d.measure = elt("div", null, "CodeMirror-measure"); + // Wraps everything that needs to exist inside the vertically-padded coordinate system + d.lineSpace = elt("div", [d.measure, d.selectionDiv, d.lineDiv, d.cursor, d.otherCursor], + null, "position: relative; outline: none"); + // Moved around its parent to cover visible view + d.mover = elt("div", [elt("div", [d.lineSpace], "CodeMirror-lines")], null, "position: relative"); + // Set to the height of the text, causes scrolling + d.sizer = elt("div", [d.mover], "CodeMirror-sizer"); + // D is needed because behavior of elts with overflow: auto and padding is inconsistent across browsers + d.heightForcer = elt("div", "\u00a0", null, "position: absolute; height: " + scrollerCutOff + "px"); + // Will contain the gutters, if any + d.gutters = elt("div", null, "CodeMirror-gutters"); + d.lineGutter = null; + // Helper element to properly size the gutter backgrounds + var scrollerInner = elt("div", [d.sizer, d.heightForcer, d.gutters], null, "position: relative; min-height: 100%"); + // Provides scrolling + d.scroller = elt("div", [scrollerInner], "CodeMirror-scroll"); + d.scroller.setAttribute("tabIndex", "-1"); + // The element in which the editor lives. + d.wrapper = elt("div", [d.inputDiv, d.scrollbarH, d.scrollbarV, + d.scrollbarFiller, d.scroller], "CodeMirror"); + // Work around IE7 z-index bug + if (ie_lt8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; } + if (place.appendChild) place.appendChild(d.wrapper); else place(d.wrapper); + + // Needed to hide big blue blinking cursor on Mobile Safari + if (ios) input.style.width = "0px"; + if (!webkit) d.scroller.draggable = true; + // Needed to handle Tab key in KHTML + if (khtml) { d.inputDiv.style.height = "1px"; d.inputDiv.style.position = "absolute"; } + // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8). + else if (ie_lt8) d.scrollbarH.style.minWidth = d.scrollbarV.style.minWidth = "18px"; + + // Current visible range (may be bigger than the view window). + d.viewOffset = d.showingFrom = d.showingTo = d.lastSizeC = 0; + + // Used to only resize the line number gutter when necessary (when + // the amount of lines crosses a boundary that makes its width change) + d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null; + // See readInput and resetInput + d.prevInput = ""; + // Set to true when a non-horizontal-scrolling widget is added. As + // an optimization, widget aligning is skipped when d is false. + d.alignWidgets = false; + // Flag that indicates whether we currently expect input to appear + // (after some event like 'keypress' or 'input') and are polling + // intensively. + d.pollingFast = false; + // Self-resetting timeout for the poller + d.poll = new Delayed(); + // True when a drag from the editor is active + d.draggingText = false; + + d.cachedCharWidth = d.cachedTextHeight = null; + d.measureLineCache = []; + d.measureLineCachePos = 0; + + // Tracks when resetInput has punted to just putting a short + // string instead of the (large) selection. + d.inaccurateSelection = false; + + // Used to adjust overwrite behaviour when a paste has been + // detected + d.pasteIncoming = false; + + // Used for measuring wheel scrolling granularity + d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null; + + return d; + } + + // VIEW CONSTRUCTOR + + function makeView(doc) { + var selPos = {line: 0, ch: 0}; + return { + doc: doc, + // frontier is the point up to which the content has been parsed, + frontier: 0, highlight: new Delayed(), + sel: {from: selPos, to: selPos, head: selPos, anchor: selPos, shift: false, extend: false}, + scrollTop: 0, scrollLeft: 0, + overwrite: false, focused: false, + // Tracks the maximum line length so that + // the horizontal scrollbar can be kept + // static when scrolling. + maxLine: getLine(doc, 0), + maxLineLength: 0, + maxLineChanged: false, + suppressEdits: false, + goalColumn: null, + cantEdit: false, + keyMaps: [], + overlays: [], + modeGen: 0 + }; + } + + // STATE UPDATES + + // Used to get the editor into a consistent state again when options change. + + function loadMode(cm) { + var doc = cm.view.doc; + cm.view.mode = CodeMirror.getMode(cm.options, cm.options.mode); + doc.iter(0, doc.size, function(line) { + if (line.stateAfter) line.stateAfter = null; + if (line.styles) line.styles = null; + }); + cm.view.frontier = 0; + startWorker(cm, 100); + cm.view.modeGen++; + if (cm.curOp) regChange(cm, 0, doc.size); + } + + function wrappingChanged(cm) { + var doc = cm.view.doc, th = textHeight(cm.display); + if (cm.options.lineWrapping) { + cm.display.wrapper.className += " CodeMirror-wrap"; + var perLine = cm.display.scroller.clientWidth / charWidth(cm.display) - 3; + doc.iter(0, doc.size, function(line) { + if (line.height == 0) return; + var guess = Math.ceil(line.text.length / perLine) || 1; + if (guess != 1) updateLineHeight(line, guess * th); + }); + cm.display.sizer.style.minWidth = ""; + } else { + cm.display.wrapper.className = cm.display.wrapper.className.replace(" CodeMirror-wrap", ""); + computeMaxLength(cm.view); + doc.iter(0, doc.size, function(line) { + if (line.height != 0) updateLineHeight(line, th); + }); + } + regChange(cm, 0, doc.size); + clearCaches(cm); + setTimeout(function(){updateScrollbars(cm.display, cm.view.doc.height);}, 100); + } + + function keyMapChanged(cm) { + var style = keyMap[cm.options.keyMap].style; + cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-keymap-\S+/g, "") + + (style ? " cm-keymap-" + style : ""); + } + + function themeChanged(cm) { + cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + + cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-"); + clearCaches(cm); + } + + function guttersChanged(cm) { + updateGutters(cm); + updateDisplay(cm, true); + } + + function updateGutters(cm) { + var gutters = cm.display.gutters, specs = cm.options.gutters; + removeChildren(gutters); + for (var i = 0; i < specs.length; ++i) { + var gutterClass = specs[i]; + var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + gutterClass)); + if (gutterClass == "CodeMirror-linenumbers") { + cm.display.lineGutter = gElt; + gElt.style.width = (cm.display.lineNumWidth || 1) + "px"; + } + } + gutters.style.display = i ? "" : "none"; + } + + function lineLength(doc, line) { + if (line.height == 0) return 0; + var len = line.text.length, merged, cur = line; + while (merged = collapsedSpanAtStart(cur)) { + var found = merged.find(); + cur = getLine(doc, found.from.line); + len += found.from.ch - found.to.ch; + } + cur = line; + while (merged = collapsedSpanAtEnd(cur)) { + var found = merged.find(); + len -= cur.text.length - found.from.ch; + cur = getLine(doc, found.to.line); + len += cur.text.length - found.to.ch; + } + return len; + } + + function computeMaxLength(view) { + view.maxLine = getLine(view.doc, 0); + view.maxLineLength = lineLength(view.doc, view.maxLine); + view.maxLineChanged = true; + view.doc.iter(1, view.doc.size, function(line) { + var len = lineLength(view.doc, line); + if (len > view.maxLineLength) { + view.maxLineLength = len; + view.maxLine = line; + } + }); + } + + // Make sure the gutters options contains the element + // "CodeMirror-linenumbers" when the lineNumbers option is true. + function setGuttersForLineNumbers(options) { + var found = false; + for (var i = 0; i < options.gutters.length; ++i) { + if (options.gutters[i] == "CodeMirror-linenumbers") { + if (options.lineNumbers) found = true; + else options.gutters.splice(i--, 1); + } + } + if (!found && options.lineNumbers) + options.gutters.push("CodeMirror-linenumbers"); + } + + // SCROLLBARS + + // Re-synchronize the fake scrollbars with the actual size of the + // content. Optionally force a scrollTop. + function updateScrollbars(d /* display */, docHeight) { + var totalHeight = docHeight + 2 * paddingTop(d); + d.sizer.style.minHeight = d.heightForcer.style.top = totalHeight + "px"; + var scrollHeight = Math.max(totalHeight, d.scroller.scrollHeight); + var needsH = d.scroller.scrollWidth > d.scroller.clientWidth; + var needsV = scrollHeight > d.scroller.clientHeight; + if (needsV) { + d.scrollbarV.style.display = "block"; + d.scrollbarV.style.bottom = needsH ? scrollbarWidth(d.measure) + "px" : "0"; + d.scrollbarV.firstChild.style.height = + (scrollHeight - d.scroller.clientHeight + d.scrollbarV.clientHeight) + "px"; + } else d.scrollbarV.style.display = ""; + if (needsH) { + d.scrollbarH.style.display = "block"; + d.scrollbarH.style.right = needsV ? scrollbarWidth(d.measure) + "px" : "0"; + d.scrollbarH.firstChild.style.width = + (d.scroller.scrollWidth - d.scroller.clientWidth + d.scrollbarH.clientWidth) + "px"; + } else d.scrollbarH.style.display = ""; + if (needsH && needsV) { + d.scrollbarFiller.style.display = "block"; + d.scrollbarFiller.style.height = d.scrollbarFiller.style.width = scrollbarWidth(d.measure) + "px"; + } else d.scrollbarFiller.style.display = ""; + + if (mac_geLion && scrollbarWidth(d.measure) === 0) + d.scrollbarV.style.minWidth = d.scrollbarH.style.minHeight = mac_geMountainLion ? "18px" : "12px"; + } + + function visibleLines(display, doc, viewPort) { + var top = display.scroller.scrollTop, height = display.wrapper.clientHeight; + if (typeof viewPort == "number") top = viewPort; + else if (viewPort) {top = viewPort.top; height = viewPort.bottom - viewPort.top;} + top = Math.floor(top - paddingTop(display)); + var bottom = Math.ceil(top + height); + return {from: lineAtHeight(doc, top), to: lineAtHeight(doc, bottom)}; + } + + // LINE NUMBERS + + function alignHorizontally(cm) { + var display = cm.display; + if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) return; + var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.view.scrollLeft; + var gutterW = display.gutters.offsetWidth, l = comp + "px"; + for (var n = display.lineDiv.firstChild; n; n = n.nextSibling) if (n.alignable) { + for (var i = 0, a = n.alignable; i < a.length; ++i) a[i].style.left = l; + } + if (cm.options.fixedGutter) + display.gutters.style.left = (comp + gutterW) + "px"; + } + + function maybeUpdateLineNumberWidth(cm) { + if (!cm.options.lineNumbers) return false; + var doc = cm.view.doc, last = lineNumberFor(cm.options, doc.size - 1), display = cm.display; + if (last.length != display.lineNumChars) { + var test = display.measure.appendChild(elt("div", [elt("div", last)], + "CodeMirror-linenumber CodeMirror-gutter-elt")); + var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW; + display.lineGutter.style.width = ""; + display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding); + display.lineNumWidth = display.lineNumInnerWidth + padding; + display.lineNumChars = display.lineNumInnerWidth ? last.length : -1; + display.lineGutter.style.width = display.lineNumWidth + "px"; + return true; + } + return false; + } + + function lineNumberFor(options, i) { + return String(options.lineNumberFormatter(i + options.firstLineNumber)); + } + function compensateForHScroll(display) { + return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left; + } + + // DISPLAY DRAWING + + function updateDisplay(cm, changes, viewPort) { + var oldFrom = cm.display.showingFrom, oldTo = cm.display.showingTo; + var updated = updateDisplayInner(cm, changes, viewPort); + if (updated) { + signalLater(cm, cm, "update", cm); + if (cm.display.showingFrom != oldFrom || cm.display.showingTo != oldTo) + signalLater(cm, cm, "viewportChange", cm, cm.display.showingFrom, cm.display.showingTo); + } + updateSelection(cm); + updateScrollbars(cm.display, cm.view.doc.height); + + return updated; + } + + // Uses a set of changes plus the current scroll position to + // determine which DOM updates have to be made, and makes the + // updates. + function updateDisplayInner(cm, changes, viewPort) { + var display = cm.display, doc = cm.view.doc; + if (!display.wrapper.clientWidth) { + display.showingFrom = display.showingTo = display.viewOffset = 0; + return; + } + + // Compute the new visible window + // If scrollTop is specified, use that to determine which lines + // to render instead of the current scrollbar position. + var visible = visibleLines(display, doc, viewPort); + // Bail out if the visible area is already rendered and nothing changed. + if (changes !== true && changes.length == 0 && + visible.from > display.showingFrom && visible.to < display.showingTo) + return; + + if (changes && maybeUpdateLineNumberWidth(cm)) + changes = true; + var gutterW = display.sizer.style.marginLeft = display.gutters.offsetWidth + "px"; + display.scrollbarH.style.left = cm.options.fixedGutter ? gutterW : "0"; + + // When merged lines are present, the line that needs to be + // redrawn might not be the one that was changed. + if (changes !== true && sawCollapsedSpans) + for (var i = 0; i < changes.length; ++i) { + var ch = changes[i], merged; + while (merged = collapsedSpanAtStart(getLine(doc, ch.from))) { + var from = merged.find().from.line; + if (ch.diff) ch.diff -= ch.from - from; + ch.from = from; + } + } + + // Used to determine which lines need their line numbers updated + var positionsChangedFrom = changes === true ? 0 : Infinity; + if (cm.options.lineNumbers && changes && changes !== true) + for (var i = 0; i < changes.length; ++i) + if (changes[i].diff) { positionsChangedFrom = changes[i].from; break; } + + var from = Math.max(visible.from - cm.options.viewportMargin, 0); + var to = Math.min(doc.size, visible.to + cm.options.viewportMargin); + if (display.showingFrom < from && from - display.showingFrom < 20) from = display.showingFrom; + if (display.showingTo > to && display.showingTo - to < 20) to = Math.min(doc.size, display.showingTo); + if (sawCollapsedSpans) { + from = lineNo(visualLine(doc, getLine(doc, from))); + while (to < doc.size && lineIsHidden(getLine(doc, to))) ++to; + } + + // Create a range of theoretically intact lines, and punch holes + // in that using the change info. + var intact = changes === true ? [] : + computeIntact([{from: display.showingFrom, to: display.showingTo}], changes); + // Clip off the parts that won't be visible + var intactLines = 0; + for (var i = 0; i < intact.length; ++i) { + var range = intact[i]; + if (range.from < from) range.from = from; + if (range.to > to) range.to = to; + if (range.from >= range.to) intact.splice(i--, 1); + else intactLines += range.to - range.from; + } + if (intactLines == to - from && from == display.showingFrom && to == display.showingTo) + return; + intact.sort(function(a, b) {return a.from - b.from;}); + + var focused = document.activeElement; + if (intactLines < (to - from) * .7) display.lineDiv.style.display = "none"; + patchDisplay(cm, from, to, intact, positionsChangedFrom); + display.lineDiv.style.display = ""; + if (document.activeElement != focused && focused.offsetHeight) focused.focus(); + + var different = from != display.showingFrom || to != display.showingTo || + display.lastSizeC != display.wrapper.clientHeight; + // This is just a bogus formula that detects when the editor is + // resized or the font size changes. + if (different) display.lastSizeC = display.wrapper.clientHeight; + display.showingFrom = from; display.showingTo = to; + startWorker(cm, 100); + + var prevBottom = display.lineDiv.offsetTop; + for (var node = display.lineDiv.firstChild, height; node; node = node.nextSibling) if (node.lineObj) { + if (ie_lt8) { + var bot = node.offsetTop + node.offsetHeight; + height = bot - prevBottom; + prevBottom = bot; + } else { + var box = node.getBoundingClientRect(); + height = box.bottom - box.top; + } + var diff = node.lineObj.height - height; + if (height < 2) height = textHeight(display); + if (diff > .001 || diff < -.001) { + updateLineHeight(node.lineObj, height); + var widgets = node.lineObj.widgets; + if (widgets) for (var i = 0; i < widgets.length; ++i) + widgets[i].height = widgets[i].node.offsetHeight; + } + } + display.viewOffset = heightAtLine(cm, getLine(doc, from)); + // Position the mover div to align with the current virtual scroll position + display.mover.style.top = display.viewOffset + "px"; + + if (visibleLines(display, doc, viewPort).to >= to) + updateDisplayInner(cm, [], viewPort); + return true; + } + + function computeIntact(intact, changes) { + for (var i = 0, l = changes.length || 0; i < l; ++i) { + var change = changes[i], intact2 = [], diff = change.diff || 0; + for (var j = 0, l2 = intact.length; j < l2; ++j) { + var range = intact[j]; + if (change.to <= range.from && change.diff) { + intact2.push({from: range.from + diff, to: range.to + diff}); + } else if (change.to <= range.from || change.from >= range.to) { + intact2.push(range); + } else { + if (change.from > range.from) + intact2.push({from: range.from, to: change.from}); + if (change.to < range.to) + intact2.push({from: change.to + diff, to: range.to + diff}); + } + } + intact = intact2; + } + return intact; + } + + function getDimensions(cm) { + var d = cm.display, left = {}, width = {}; + for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) { + left[cm.options.gutters[i]] = n.offsetLeft; + width[cm.options.gutters[i]] = n.offsetWidth; + } + return {fixedPos: compensateForHScroll(d), + gutterTotalWidth: d.gutters.offsetWidth, + gutterLeft: left, + gutterWidth: width, + wrapperWidth: d.wrapper.clientWidth}; + } + + function patchDisplay(cm, from, to, intact, updateNumbersFrom) { + var dims = getDimensions(cm); + var display = cm.display, lineNumbers = cm.options.lineNumbers; + if (!intact.length && (!webkit || !cm.display.currentWheelTarget)) + removeChildren(display.lineDiv); + var container = display.lineDiv, cur = container.firstChild; + + function rm(node) { + var next = node.nextSibling; + if (webkit && mac && cm.display.currentWheelTarget == node) { + node.style.display = "none"; + node.lineObj = null; + } else { + node.parentNode.removeChild(node); + } + return next; + } + + var nextIntact = intact.shift(), lineNo = from; + cm.view.doc.iter(from, to, function(line) { + if (nextIntact && nextIntact.to == lineNo) nextIntact = intact.shift(); + if (lineIsHidden(line)) { + if (line.height != 0) updateLineHeight(line, 0); + if (line.widgets && cur.previousSibling) for (var i = 0; i < line.widgets.length; ++i) + if (line.widgets[i].showIfHidden) { + var prev = cur.previousSibling; + if (prev.nodeType == "pre") { + var wrap = elt("div", null, null, "position: relative"); + prev.parentNode.replaceChild(wrap, prev); + wrap.appendChild(prev); + prev = wrap; + } + prev.appendChild(buildLineWidget(line.widgets[i], prev, dims)); + } + } else if (nextIntact && nextIntact.from <= lineNo && nextIntact.to > lineNo) { + // This line is intact. Skip to the actual node. Update its + // line number if needed. + while (cur.lineObj != line) cur = rm(cur); + if (lineNumbers && updateNumbersFrom <= lineNo && cur.lineNumber) + setTextContent(cur.lineNumber, lineNumberFor(cm.options, lineNo)); + cur = cur.nextSibling; + } else { + // This line needs to be generated. + var lineNode = buildLineElement(cm, line, lineNo, dims); + container.insertBefore(lineNode, cur); + lineNode.lineObj = line; + } + ++lineNo; + }); + while (cur) cur = rm(cur); + } + + function buildLineElement(cm, line, lineNo, dims) { + var lineElement = lineContent(cm, line); + var markers = line.gutterMarkers, display = cm.display; + + if (!cm.options.lineNumbers && !markers && !line.bgClass && !line.wrapClass && + (!line.widgets || !line.widgets.length)) return lineElement; + + // Lines with gutter elements or a background class need + // to be wrapped again, and have the extra elements added + // to the wrapper div + + var wrap = elt("div", null, line.wrapClass, "position: relative"); + if (cm.options.lineNumbers || markers) { + var gutterWrap = wrap.appendChild(elt("div", null, null, "position: absolute; left: " + + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px")); + if (cm.options.fixedGutter) wrap.alignable = [gutterWrap]; + if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"])) + wrap.lineNumber = gutterWrap.appendChild( + elt("div", lineNumberFor(cm.options, lineNo), + "CodeMirror-linenumber CodeMirror-gutter-elt", + "left: " + dims.gutterLeft["CodeMirror-linenumbers"] + "px; width: " + + display.lineNumInnerWidth + "px")); + if (markers) + for (var k = 0; k < cm.options.gutters.length; ++k) { + var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id]; + if (found) + gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", "left: " + + dims.gutterLeft[id] + "px; width: " + dims.gutterWidth[id] + "px")); + } + } + // Kludge to make sure the styled element lies behind the selection (by z-index) + if (line.bgClass) + wrap.appendChild(elt("div", "\u00a0", line.bgClass + " CodeMirror-linebackground")); + wrap.appendChild(lineElement); + if (line.widgets) for (var i = 0, ws = line.widgets; i < ws.length; ++i) { + var widget = ws[i], node = buildLineWidget(widget, wrap, dims); + if (widget.above) + wrap.insertBefore(node, cm.options.lineNumbers && line.height != 0 ? gutterWrap : lineElement); + else + wrap.appendChild(node); + } + if (ie_lt8) wrap.style.zIndex = 2; + return wrap; + } + + function buildLineWidget(widget, wrap, dims) { + var node = elt("div", [widget.node], "CodeMirror-linewidget"); + node.widget = widget; + if (widget.noHScroll) { + (wrap.alignable || (wrap.alignable = [])).push(node); + var width = dims.wrapperWidth; + node.style.left = dims.fixedPos + "px"; + if (!widget.coverGutter) { + width -= dims.gutterTotalWidth; + node.style.paddingLeft = dims.gutterTotalWidth + "px"; + } + node.style.width = width + "px"; + } + if (widget.coverGutter) { + node.style.zIndex = 5; + node.style.position = "relative"; + if (!widget.noHScroll) node.style.marginLeft = -dims.gutterTotalWidth + "px"; + } + return node; + } + + // SELECTION / CURSOR + + function updateSelection(cm) { + var display = cm.display; + var collapsed = posEq(cm.view.sel.from, cm.view.sel.to); + if (collapsed || cm.options.showCursorWhenSelecting) + updateSelectionCursor(cm); + else + display.cursor.style.display = display.otherCursor.style.display = "none"; + if (!collapsed) + updateSelectionRange(cm); + else + display.selectionDiv.style.display = "none"; + + // Move the hidden textarea near the cursor to prevent scrolling artifacts + var headPos = cursorCoords(cm, cm.view.sel.head, "div"); + var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect(); + display.inputDiv.style.top = Math.max(0, Math.min(display.wrapper.clientHeight - 10, + headPos.top + lineOff.top - wrapOff.top)) + "px"; + display.inputDiv.style.left = Math.max(0, Math.min(display.wrapper.clientWidth - 10, + headPos.left + lineOff.left - wrapOff.left)) + "px"; + } + + // No selection, plain cursor + function updateSelectionCursor(cm) { + var display = cm.display, pos = cursorCoords(cm, cm.view.sel.head, "div"); + display.cursor.style.left = pos.left + "px"; + display.cursor.style.top = pos.top + "px"; + display.cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px"; + display.cursor.style.display = ""; + + if (pos.other) { + display.otherCursor.style.display = ""; + display.otherCursor.style.left = pos.other.left + "px"; + display.otherCursor.style.top = pos.other.top + "px"; + display.otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px"; + } else { display.otherCursor.style.display = "none"; } + } + + // Highlight selection + function updateSelectionRange(cm) { + var display = cm.display, doc = cm.view.doc, sel = cm.view.sel; + var fragment = document.createDocumentFragment(); + var clientWidth = display.lineSpace.offsetWidth, pl = paddingLeft(cm.display); + + function add(left, top, width, bottom) { + if (top < 0) top = 0; + fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left + + "px; top: " + top + "px; width: " + (width == null ? clientWidth - left : width) + + "px; height: " + (bottom - top) + "px")); + } + + function drawForLine(line, fromArg, toArg, retTop) { + var lineObj = getLine(doc, line); + var lineLen = lineObj.text.length, rVal = retTop ? Infinity : -Infinity; + function coords(ch) { + return charCoords(cm, {line: line, ch: ch}, "div", lineObj); + } + + iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir) { + var leftPos = coords(dir == "rtl" ? to - 1 : from); + var rightPos = coords(dir == "rtl" ? from : to - 1); + var left = leftPos.left, right = rightPos.right; + if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part + add(left, leftPos.top, null, leftPos.bottom); + left = pl; + if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top); + } + if (toArg == null && to == lineLen) right = clientWidth; + if (fromArg == null && from == 0) left = pl; + rVal = retTop ? Math.min(rightPos.top, rVal) : Math.max(rightPos.bottom, rVal); + if (left < pl + 1) left = pl; + add(left, rightPos.top, right - left, rightPos.bottom); + }); + return rVal; + } + + if (sel.from.line == sel.to.line) { + drawForLine(sel.from.line, sel.from.ch, sel.to.ch); + } else { + var fromObj = getLine(doc, sel.from.line); + var cur = fromObj, merged, path = [sel.from.line, sel.from.ch], singleLine; + while (merged = collapsedSpanAtEnd(cur)) { + var found = merged.find(); + path.push(found.from.ch, found.to.line, found.to.ch); + if (found.to.line == sel.to.line) { + path.push(sel.to.ch); + singleLine = true; + break; + } + cur = getLine(doc, found.to.line); + } + + // This is a single, merged line + if (singleLine) { + for (var i = 0; i < path.length; i += 3) + drawForLine(path[i], path[i+1], path[i+2]); + } else { + var middleTop, middleBot, toObj = getLine(doc, sel.to.line); + if (sel.from.ch) + // Draw the first line of selection. + middleTop = drawForLine(sel.from.line, sel.from.ch, null, false); + else + // Simply include it in the middle block. + middleTop = heightAtLine(cm, fromObj) - display.viewOffset; + + if (!sel.to.ch) + middleBot = heightAtLine(cm, toObj) - display.viewOffset; + else + middleBot = drawForLine(sel.to.line, collapsedSpanAtStart(toObj) ? null : 0, sel.to.ch, true); + + if (middleTop < middleBot) add(pl, middleTop, null, middleBot); + } + } + + removeChildrenAndAdd(display.selectionDiv, fragment); + display.selectionDiv.style.display = ""; + } + + // Cursor-blinking + function restartBlink(cm) { + var display = cm.display; + clearInterval(display.blinker); + var on = true; + display.cursor.style.visibility = display.otherCursor.style.visibility = ""; + display.blinker = setInterval(function() { + if (!display.cursor.offsetHeight) return; + display.cursor.style.visibility = display.otherCursor.style.visibility = (on = !on) ? "" : "hidden"; + }, cm.options.cursorBlinkRate); + } + + // HIGHLIGHT WORKER + + function startWorker(cm, time) { + if (cm.view.mode.startState && cm.view.frontier < cm.display.showingTo) + cm.view.highlight.set(time, bind(highlightWorker, cm)); + } + + function highlightWorker(cm) { + var view = cm.view, doc = view.doc; + if (view.frontier >= cm.display.showingTo) return; + var end = +new Date + cm.options.workTime; + var state = copyState(view.mode, getStateBefore(cm, view.frontier)); + var changed = [], prevChange; + doc.iter(view.frontier, Math.min(doc.size, cm.display.showingTo + 500), function(line) { + if (view.frontier >= cm.display.showingFrom) { // Visible + var oldStyles = line.styles; + line.styles = highlightLine(cm, line, state); + var ischange = !oldStyles || oldStyles.length != line.styles.length; + for (var i = 0; !ischange && i < oldStyles.length; ++i) + ischange = oldStyles[i] != line.styles[i]; + if (ischange) { + if (prevChange && prevChange.end == view.frontier) prevChange.end++; + else changed.push(prevChange = {start: view.frontier, end: view.frontier + 1}); + } + line.stateAfter = copyState(view.mode, state); + } else { + processLine(cm, line, state); + line.stateAfter = view.frontier % 5 == 0 ? copyState(view.mode, state) : null; + } + ++view.frontier; + if (+new Date > end) { + startWorker(cm, cm.options.workDelay); + return true; + } + }); + if (changed.length) + operation(cm, function() { + for (var i = 0; i < changed.length; ++i) + regChange(this, changed[i].start, changed[i].end); + })(); + } + + // Finds the line to start with when starting a parse. Tries to + // find a line with a stateAfter, so that it can start with a + // valid state. If that fails, it returns the line with the + // smallest indentation, which tends to need the least context to + // parse correctly. + function findStartLine(cm, n) { + var minindent, minline, doc = cm.view.doc; + for (var search = n, lim = n - 100; search > lim; --search) { + if (search == 0) return 0; + var line = getLine(doc, search-1); + if (line.stateAfter) return search; + var indented = countColumn(line.text, null, cm.options.tabSize); + if (minline == null || minindent > indented) { + minline = search - 1; + minindent = indented; + } + } + return minline; + } + + function getStateBefore(cm, n) { + var view = cm.view; + if (!view.mode.startState) return true; + var pos = findStartLine(cm, n), state = pos && getLine(view.doc, pos-1).stateAfter; + if (!state) state = startState(view.mode); + else state = copyState(view.mode, state); + view.doc.iter(pos, n, function(line) { + processLine(cm, line, state); + var save = pos == n - 1 || pos % 5 == 0 || pos >= view.showingFrom && pos < view.showingTo; + line.stateAfter = save ? copyState(view.mode, state) : null; + ++pos; + }); + return state; + } + + // POSITION MEASUREMENT + + function paddingTop(display) {return display.lineSpace.offsetTop;} + function paddingLeft(display) { + var e = removeChildrenAndAdd(display.measure, elt("pre")).appendChild(elt("span", "x")); + return e.offsetLeft; + } + + function measureChar(cm, line, ch, data) { + var dir = -1; + data = data || measureLine(cm, line); + + for (var pos = ch;; pos += dir) { + var r = data[pos]; + if (r) break; + if (dir < 0 && pos == 0) dir = 1; + } + return {left: pos < ch ? r.right : r.left, + right: pos > ch ? r.left : r.right, + top: r.top, bottom: r.bottom}; + } + + function measureLine(cm, line) { + // First look in the cache + var display = cm.display, cache = cm.display.measureLineCache; + for (var i = 0; i < cache.length; ++i) { + var memo = cache[i]; + if (memo.text == line.text && memo.markedSpans == line.markedSpans && + display.scroller.clientWidth == memo.width) + return memo.measure; + } + + var measure = measureLineInner(cm, line); + // Store result in the cache + var memo = {text: line.text, width: display.scroller.clientWidth, + markedSpans: line.markedSpans, measure: measure}; + if (cache.length == 16) cache[++display.measureLineCachePos % 16] = memo; + else cache.push(memo); + return measure; + } + + function measureLineInner(cm, line) { + var display = cm.display, measure = emptyArray(line.text.length); + var pre = lineContent(cm, line, measure); + + // IE does not cache element positions of inline elements between + // calls to getBoundingClientRect. This makes the loop below, + // which gathers the positions of all the characters on the line, + // do an amount of layout work quadratic to the number of + // characters. When line wrapping is off, we try to improve things + // by first subdividing the line into a bunch of inline blocks, so + // that IE can reuse most of the layout information from caches + // for those blocks. This does interfere with line wrapping, so it + // doesn't work when wrapping is on, but in that case the + // situation is slightly better, since IE does cache line-wrapping + // information and only recomputes per-line. + if (ie && !ie_lt8 && !cm.options.lineWrapping && pre.childNodes.length > 100) { + var fragment = document.createDocumentFragment(); + var chunk = 10, n = pre.childNodes.length; + for (var i = 0, chunks = Math.ceil(n / chunk); i < chunks; ++i) { + var wrap = elt("div", null, null, "display: inline-block"); + for (var j = 0; j < chunk && n; ++j) { + wrap.appendChild(pre.firstChild); + --n; + } + fragment.appendChild(wrap); + } + pre.appendChild(fragment); + } + + removeChildrenAndAdd(display.measure, pre); + + var outer = display.lineDiv.getBoundingClientRect(); + var vranges = [], data = emptyArray(line.text.length), maxBot = pre.offsetHeight; + for (var i = 0, cur; i < measure.length; ++i) if (cur = measure[i]) { + var size = cur.getBoundingClientRect(); + var top = Math.max(0, size.top - outer.top), bot = Math.min(size.bottom - outer.top, maxBot); + for (var j = 0; j < vranges.length; j += 2) { + var rtop = vranges[j], rbot = vranges[j+1]; + if (rtop > bot || rbot < top) continue; + if (rtop <= top && rbot >= bot || + top <= rtop && bot >= rbot || + Math.min(bot, rbot) - Math.max(top, rtop) >= (bot - top) >> 1) { + vranges[j] = Math.min(top, rtop); + vranges[j+1] = Math.max(bot, rbot); + break; + } + } + if (j == vranges.length) vranges.push(top, bot); + data[i] = {left: size.left - outer.left, right: size.right - outer.left, top: j}; + } + for (var i = 0, cur; i < data.length; ++i) if (cur = data[i]) { + var vr = cur.top; + cur.top = vranges[vr]; cur.bottom = vranges[vr+1]; + } + return data; + } + + function clearCaches(cm) { + cm.display.measureLineCache.length = cm.display.measureLineCachePos = 0; + cm.display.cachedCharWidth = cm.display.cachedTextHeight = null; + cm.view.maxLineChanged = true; + } + + // Context is one of "line", "div" (display.lineDiv), "local"/null (editor), or "page" + function intoCoordSystem(cm, lineObj, rect, context) { + if (lineObj.widgets) for (var i = 0; i < lineObj.widgets.length; ++i) if (lineObj.widgets[i].above) { + var size = widgetHeight(lineObj.widgets[i]); + rect.top += size; rect.bottom += size; + } + if (context == "line") return rect; + if (!context) context = "local"; + var yOff = heightAtLine(cm, lineObj); + if (context != "local") yOff -= cm.display.viewOffset; + if (context == "page") { + var lOff = cm.display.lineSpace.getBoundingClientRect(); + yOff += lOff.top + (window.pageYOffset || (document.documentElement || document.body).scrollTop); + var xOff = lOff.left + (window.pageXOffset || (document.documentElement || document.body).scrollLeft); + rect.left += xOff; rect.right += xOff; + } + rect.top += yOff; rect.bottom += yOff; + return rect; + } + + function charCoords(cm, pos, context, lineObj) { + if (!lineObj) lineObj = getLine(cm.view.doc, pos.line); + return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch), context); + } + + function cursorCoords(cm, pos, context, lineObj, measurement) { + lineObj = lineObj || getLine(cm.view.doc, pos.line); + if (!measurement) measurement = measureLine(cm, lineObj); + function get(ch, right) { + var m = measureChar(cm, lineObj, ch, measurement); + if (right) m.left = m.right; else m.right = m.left; + return intoCoordSystem(cm, lineObj, m, context); + } + var order = getOrder(lineObj), ch = pos.ch; + if (!order) return get(ch); + var main, other, linedir = order[0].level; + for (var i = 0; i < order.length; ++i) { + var part = order[i], rtl = part.level % 2, nb, here; + if (part.from < ch && part.to > ch) return get(ch, rtl); + var left = rtl ? part.to : part.from, right = rtl ? part.from : part.to; + if (left == ch) { + // Opera and IE return bogus offsets and widths for edges + // where the direction flips, but only for the side with the + // lower level. So we try to use the side with the higher + // level. + if (i && part.level < (nb = order[i-1]).level) here = get(nb.level % 2 ? nb.from : nb.to - 1, true); + else here = get(rtl && part.from != part.to ? ch - 1 : ch); + if (rtl == linedir) main = here; else other = here; + } else if (right == ch) { + var nb = i < order.length - 1 && order[i+1]; + if (!rtl && nb && nb.from == nb.to) continue; + if (nb && part.level < nb.level) here = get(nb.level % 2 ? nb.to - 1 : nb.from); + else here = get(rtl ? ch : ch - 1, true); + if (rtl == linedir) main = here; else other = here; + } + } + if (linedir && !ch) other = get(order[0].to - 1); + if (!main) return other; + if (other) main.other = other; + return main; + } + + // Coords must be lineSpace-local + function coordsChar(cm, x, y) { + var doc = cm.view.doc; + y += cm.display.viewOffset; + if (y < 0) return {line: 0, ch: 0, outside: true}; + var lineNo = lineAtHeight(doc, y); + if (lineNo >= doc.size) return {line: doc.size - 1, ch: getLine(doc, doc.size - 1).text.length}; + if (x < 0) x = 0; + + for (;;) { + var lineObj = getLine(doc, lineNo); + var found = coordsCharInner(cm, lineObj, lineNo, x, y); + var merged = collapsedSpanAtEnd(lineObj); + var mergedPos = merged && merged.find(); + if (merged && found.ch >= mergedPos.from.ch) + lineNo = mergedPos.to.line; + else + return found; + } + } + + function coordsCharInner(cm, lineObj, lineNo, x, y) { + var innerOff = y - heightAtLine(cm, lineObj); + var wrongLine = false, cWidth = cm.display.wrapper.clientWidth; + var measurement = measureLine(cm, lineObj); + + function getX(ch) { + var sp = cursorCoords(cm, {line: lineNo, ch: ch}, "line", + lineObj, measurement); + wrongLine = true; + if (innerOff > sp.bottom) return Math.max(0, sp.left - cWidth); + else if (innerOff < sp.top) return sp.left + cWidth; + else wrongLine = false; + return sp.left; + } + + var bidi = getOrder(lineObj), dist = lineObj.text.length; + var from = lineLeft(lineObj), to = lineRight(lineObj); + var fromX = paddingLeft(cm.display), toX = getX(to); + + if (x > toX) return {line: lineNo, ch: to, outside: wrongLine}; + // Do a binary search between these bounds. + for (;;) { + if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) { + var after = x - fromX < toX - x, ch = after ? from : to; + while (isExtendingChar.test(lineObj.text.charAt(ch))) ++ch; + return {line: lineNo, ch: ch, after: after, outside: wrongLine}; + } + var step = Math.ceil(dist / 2), middle = from + step; + if (bidi) { + middle = from; + for (var i = 0; i < step; ++i) middle = moveVisually(lineObj, middle, 1); + } + var middleX = getX(middle); + if (middleX > x) {to = middle; toX = middleX; if (wrongLine) toX += 1000; dist -= step;} + else {from = middle; fromX = middleX; dist = step;} + } + } + + var measureText; + function textHeight(display) { + if (display.cachedTextHeight != null) return display.cachedTextHeight; + if (measureText == null) { + measureText = elt("pre"); + // Measure a bunch of lines, for browsers that compute + // fractional heights. + for (var i = 0; i < 49; ++i) { + measureText.appendChild(document.createTextNode("x")); + measureText.appendChild(elt("br")); + } + measureText.appendChild(document.createTextNode("x")); + } + removeChildrenAndAdd(display.measure, measureText); + var height = measureText.offsetHeight / 50; + if (height > 3) display.cachedTextHeight = height; + removeChildren(display.measure); + return height || 1; + } + + function charWidth(display) { + if (display.cachedCharWidth != null) return display.cachedCharWidth; + var anchor = elt("span", "x"); + var pre = elt("pre", [anchor]); + removeChildrenAndAdd(display.measure, pre); + var width = anchor.offsetWidth; + if (width > 2) display.cachedCharWidth = width; + return width || 10; + } + + // OPERATIONS + + // Operations are used to wrap changes in such a way that each + // change won't have to update the cursor and display (which would + // be awkward, slow, and error-prone), but instead updates are + // batched and then all combined and executed at once. + + function startOperation(cm) { + if (cm.curOp) ++cm.curOp.depth; + else cm.curOp = { + // Nested operations delay update until the outermost one + // finishes. + depth: 1, + // An array of ranges of lines that have to be updated. See + // updateDisplay. + changes: [], + delayedCallbacks: [], + updateInput: null, + userSelChange: null, + textChanged: null, + selectionChanged: false, + updateMaxLine: false, + id: ++cm.nextOpId + }; + } + + function endOperation(cm) { + var op = cm.curOp; + if (--op.depth) return; + cm.curOp = null; + var view = cm.view, display = cm.display; + if (op.updateMaxLine) computeMaxLength(view); + if (view.maxLineChanged && !cm.options.lineWrapping) { + var width = measureChar(cm, view.maxLine, view.maxLine.text.length).right; + display.sizer.style.minWidth = (width + 3 + scrollerCutOff) + "px"; + view.maxLineChanged = false; + var maxScrollLeft = Math.max(0, display.sizer.offsetLeft + display.sizer.offsetWidth - display.scroller.clientWidth); + if (maxScrollLeft < view.scrollLeft) + setScrollLeft(cm, Math.min(display.scroller.scrollLeft, maxScrollLeft), true); + } + var newScrollPos, updated; + if (op.selectionChanged) { + var coords = cursorCoords(cm, view.sel.head); + newScrollPos = calculateScrollPos(cm, coords.left, coords.top, coords.left, coords.bottom); + } + if (op.changes.length || newScrollPos && newScrollPos.scrollTop != null) + updated = updateDisplay(cm, op.changes, newScrollPos && newScrollPos.scrollTop); + if (!updated && op.selectionChanged) updateSelection(cm); + if (newScrollPos) scrollCursorIntoView(cm); + if (op.selectionChanged) restartBlink(cm); + + if (view.focused && op.updateInput) + resetInput(cm, op.userSelChange); + + if (op.textChanged) + signal(cm, "change", cm, op.textChanged); + if (op.selectionChanged) signal(cm, "cursorActivity", cm); + for (var i = 0; i < op.delayedCallbacks.length; ++i) op.delayedCallbacks[i](cm); + } + + // Wraps a function in an operation. Returns the wrapped function. + function operation(cm1, f) { + return function() { + var cm = cm1 || this; + startOperation(cm); + try {var result = f.apply(cm, arguments);} + finally {endOperation(cm);} + return result; + }; + } + + function regChange(cm, from, to, lendiff) { + cm.curOp.changes.push({from: from, to: to, diff: lendiff}); + } + + // INPUT HANDLING + + function slowPoll(cm) { + if (cm.view.pollingFast) return; + cm.display.poll.set(cm.options.pollInterval, function() { + readInput(cm); + if (cm.view.focused) slowPoll(cm); + }); + } + + function fastPoll(cm) { + var missed = false; + cm.display.pollingFast = true; + function p() { + var changed = readInput(cm); + if (!changed && !missed) {missed = true; cm.display.poll.set(60, p);} + else {cm.display.pollingFast = false; slowPoll(cm);} + } + cm.display.poll.set(20, p); + } + + // prevInput is a hack to work with IME. If we reset the textarea + // on every change, that breaks IME. So we look for changes + // compared to the previous content instead. (Modern browsers have + // events that indicate IME taking place, but these are not widely + // supported or compatible enough yet to rely on.) + function readInput(cm) { + var input = cm.display.input, prevInput = cm.display.prevInput, view = cm.view, sel = view.sel; + if (!view.focused || hasSelection(input) || isReadOnly(cm)) return false; + var text = input.value; + if (text == prevInput && posEq(sel.from, sel.to)) return false; + startOperation(cm); + view.sel.shift = false; + var same = 0, l = Math.min(prevInput.length, text.length); + while (same < l && prevInput[same] == text[same]) ++same; + var from = sel.from, to = sel.to; + if (same < prevInput.length) + from = {line: from.line, ch: from.ch - (prevInput.length - same)}; + else if (view.overwrite && posEq(from, to) && !cm.display.pasteIncoming) + to = {line: to.line, ch: Math.min(getLine(cm.view.doc, to.line).text.length, to.ch + (text.length - same))}; + var updateInput = cm.curOp.updateInput; + updateDoc(cm, from, to, splitLines(text.slice(same)), "end", + cm.display.pasteIncoming ? "paste" : "input", {from: from, to: to}); + cm.curOp.updateInput = updateInput; + if (text.length > 1000) input.value = cm.display.prevInput = ""; + else cm.display.prevInput = text; + endOperation(cm); + cm.display.pasteIncoming = false; + return true; + } + + function resetInput(cm, user) { + var view = cm.view, minimal, selected; + if (!posEq(view.sel.from, view.sel.to)) { + cm.display.prevInput = ""; + minimal = hasCopyEvent && + (view.sel.to.line - view.sel.from.line > 100 || (selected = cm.getSelection()).length > 1000); + if (minimal) cm.display.input.value = "-"; + else cm.display.input.value = selected || cm.getSelection(); + if (view.focused) selectInput(cm.display.input); + } else if (user) cm.display.prevInput = cm.display.input.value = ""; + cm.display.inaccurateSelection = minimal; + } + + function focusInput(cm) { + if (cm.options.readOnly != "nocursor" && (ie || document.activeElement != cm.display.input)) + cm.display.input.focus(); + } + + function isReadOnly(cm) { + return cm.options.readOnly || cm.view.cantEdit; + } + + // EVENT HANDLERS + + function registerEventHandlers(cm) { + var d = cm.display; + on(d.scroller, "mousedown", operation(cm, onMouseDown)); + on(d.scroller, "dblclick", operation(cm, e_preventDefault)); + on(d.lineSpace, "selectstart", function(e) { + if (!eventInWidget(d, e)) e_preventDefault(e); + }); + // Gecko browsers fire contextmenu *after* opening the menu, at + // which point we can't mess with it anymore. Context menu is + // handled in onMouseDown for Gecko. + if (!gecko) on(d.scroller, "contextmenu", function(e) {onContextMenu(cm, e);}); + + on(d.scroller, "scroll", function() { + setScrollTop(cm, d.scroller.scrollTop); + setScrollLeft(cm, d.scroller.scrollLeft, true); + signal(cm, "scroll", cm); + }); + on(d.scrollbarV, "scroll", function() { + setScrollTop(cm, d.scrollbarV.scrollTop); + }); + on(d.scrollbarH, "scroll", function() { + setScrollLeft(cm, d.scrollbarH.scrollLeft); + }); + + on(d.scroller, "mousewheel", function(e){onScrollWheel(cm, e);}); + on(d.scroller, "DOMMouseScroll", function(e){onScrollWheel(cm, e);}); + + function reFocus() { if (cm.view.focused) setTimeout(bind(focusInput, cm), 0); } + on(d.scrollbarH, "mousedown", reFocus); + on(d.scrollbarV, "mousedown", reFocus); + // Prevent wrapper from ever scrolling + on(d.wrapper, "scroll", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; }); + + if (!window.registered) window.registered = 0; + ++window.registered; + function onResize() { + // Might be a text scaling operation, clear size caches. + d.cachedCharWidth = d.cachedTextHeight = null; + clearCaches(cm); + updateDisplay(cm, true); + } + on(window, "resize", onResize); + // Above handler holds on to the editor and its data structures. + // Here we poll to unregister it when the editor is no longer in + // the document, so that it can be garbage-collected. + setTimeout(function unregister() { + for (var p = d.wrapper.parentNode; p && p != document.body; p = p.parentNode) {} + if (p) setTimeout(unregister, 5000); + else {--window.registered; off(window, "resize", onResize);} + }, 5000); + + on(d.input, "keyup", operation(cm, function(e) { + if (cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return; + if (e_prop(e, "keyCode") == 16) cm.view.sel.shift = false; + })); + on(d.input, "input", bind(fastPoll, cm)); + on(d.input, "keydown", operation(cm, onKeyDown)); + on(d.input, "keypress", operation(cm, onKeyPress)); + on(d.input, "focus", bind(onFocus, cm)); + on(d.input, "blur", bind(onBlur, cm)); + + function drag_(e) { + if (cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e))) return; + e_stop(e); + } + if (cm.options.dragDrop) { + on(d.scroller, "dragstart", function(e){onDragStart(cm, e);}); + on(d.scroller, "dragenter", drag_); + on(d.scroller, "dragover", drag_); + on(d.scroller, "drop", operation(cm, onDrop)); + } + on(d.scroller, "paste", function(e){ + if (eventInWidget(d, e)) return; + focusInput(cm); + fastPoll(cm); + }); + on(d.input, "paste", function() { + d.pasteIncoming = true; + fastPoll(cm); + }); + + function prepareCopy() { + if (d.inaccurateSelection) { + d.prevInput = ""; + d.inaccurateSelection = false; + d.input.value = cm.getSelection(); + selectInput(d.input); + } + } + on(d.input, "cut", prepareCopy); + on(d.input, "copy", prepareCopy); + + // Needed to handle Tab key in KHTML + if (khtml) on(d.sizer, "mouseup", function() { + if (document.activeElement == d.input) d.input.blur(); + focusInput(cm); + }); + } + + function eventInWidget(display, e) { + for (var n = e_target(e); n != display.wrapper; n = n.parentNode) { + if (!n) return true; + if (/\bCodeMirror-(?:line)?widget\b/.test(n.className) || + n.parentNode == display.sizer && n != display.mover) return true; + } + } + + function posFromMouse(cm, e, liberal) { + var display = cm.display; + if (!liberal) { + var target = e_target(e); + if (target == display.scrollbarH || target == display.scrollbarH.firstChild || + target == display.scrollbarV || target == display.scrollbarV.firstChild || + target == display.scrollbarFiller) return null; + } + var x, y, space = display.lineSpace.getBoundingClientRect(); + // Fails unpredictably on IE[67] when mouse is dragged around quickly. + try { x = e.clientX; y = e.clientY; } catch (e) { return null; } + return coordsChar(cm, x - space.left, y - space.top); + } + + var lastClick, lastDoubleClick; + function onMouseDown(e) { + var cm = this, display = cm.display, view = cm.view, sel = view.sel, doc = view.doc; + sel.shift = e_prop(e, "shiftKey"); + + if (eventInWidget(display, e)) { + if (!webkit) { + display.scroller.draggable = false; + setTimeout(function(){display.scroller.draggable = true;}, 100); + } + return; + } + if (clickInGutter(cm, e)) return; + var start = posFromMouse(cm, e); + + switch (e_button(e)) { + case 3: + if (gecko) onContextMenu.call(cm, cm, e); + return; + case 2: + if (start) extendSelection(cm, start); + setTimeout(bind(focusInput, cm), 20); + e_preventDefault(e); + return; + } + // For button 1, if it was clicked inside the editor + // (posFromMouse returning non-null), we have to adjust the + // selection. + if (!start) {if (e_target(e) == display.scroller) e_preventDefault(e); return;} + + if (!view.focused) onFocus(cm); + + var now = +new Date, type = "single"; + if (lastDoubleClick && lastDoubleClick.time > now - 400 && posEq(lastDoubleClick.pos, start)) { + type = "triple"; + e_preventDefault(e); + setTimeout(bind(focusInput, cm), 20); + selectLine(cm, start.line); + } else if (lastClick && lastClick.time > now - 400 && posEq(lastClick.pos, start)) { + type = "double"; + lastDoubleClick = {time: now, pos: start}; + e_preventDefault(e); + var word = findWordAt(getLine(doc, start.line).text, start); + extendSelection(cm, word.from, word.to); + } else { lastClick = {time: now, pos: start}; } + + var last = start; + if (cm.options.dragDrop && dragAndDrop && !isReadOnly(cm) && !posEq(sel.from, sel.to) && + !posLess(start, sel.from) && !posLess(sel.to, start) && type == "single") { + var dragEnd = operation(cm, function(e2) { + if (webkit) display.scroller.draggable = false; + view.draggingText = false; + off(document, "mouseup", dragEnd); + off(display.scroller, "drop", dragEnd); + if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) { + e_preventDefault(e2); + extendSelection(cm, start); + focusInput(cm); + } + }); + // Let the drag handler handle this. + if (webkit) display.scroller.draggable = true; + view.draggingText = dragEnd; + // IE's approach to draggable + if (display.scroller.dragDrop) display.scroller.dragDrop(); + on(document, "mouseup", dragEnd); + on(display.scroller, "drop", dragEnd); + return; + } + e_preventDefault(e); + if (type == "single") extendSelection(cm, clipPos(doc, start)); + + var startstart = sel.from, startend = sel.to; + + function doSelect(cur) { + if (type == "single") { + extendSelection(cm, clipPos(doc, start), cur); + return; + } + + startstart = clipPos(doc, startstart); + startend = clipPos(doc, startend); + if (type == "double") { + var word = findWordAt(getLine(doc, cur.line).text, cur); + if (posLess(cur, startstart)) extendSelection(cm, word.from, startend); + else extendSelection(cm, startstart, word.to); + } else if (type == "triple") { + if (posLess(cur, startstart)) extendSelection(cm, startend, clipPos(doc, {line: cur.line, ch: 0})); + else extendSelection(cm, startstart, clipPos(doc, {line: cur.line + 1, ch: 0})); + } + } + + var editorSize = display.wrapper.getBoundingClientRect(); + // Used to ensure timeout re-tries don't fire when another extend + // happened in the meantime (clearTimeout isn't reliable -- at + // least on Chrome, the timeouts still happen even when cleared, + // if the clear happens after their scheduled firing time). + var counter = 0; + + function extend(e) { + var curCount = ++counter; + var cur = posFromMouse(cm, e, true); + if (!cur) return; + if (!posEq(cur, last)) { + if (!view.focused) onFocus(cm); + last = cur; + doSelect(cur); + var visible = visibleLines(display, doc); + if (cur.line >= visible.to || cur.line < visible.from) + setTimeout(operation(cm, function(){if (counter == curCount) extend(e);}), 150); + } else { + var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0; + if (outside) setTimeout(operation(cm, function() { + if (counter != curCount) return; + display.scroller.scrollTop += outside; + extend(e); + }), 50); + } + } + + function done(e) { + counter = Infinity; + var cur = posFromMouse(cm, e); + if (cur) doSelect(cur); + e_preventDefault(e); + focusInput(cm); + off(document, "mousemove", move); + off(document, "mouseup", up); + } + + var move = operation(cm, function(e) { + if (!ie && !e_button(e)) done(e); + else extend(e); + }); + var up = operation(cm, done); + on(document, "mousemove", move); + on(document, "mouseup", up); + } + + function onDrop(e) { + var cm = this; + if (eventInWidget(cm.display, e) || (cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e)))) + return; + e_preventDefault(e); + var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files; + if (!pos || isReadOnly(cm)) return; + if (files && files.length && window.FileReader && window.File) { + var n = files.length, text = Array(n), read = 0; + var loadFile = function(file, i) { + var reader = new FileReader; + reader.onload = function() { + text[i] = reader.result; + if (++read == n) { + pos = clipPos(cm.view.doc, pos); + operation(cm, function() { + var end = replaceRange(cm, text.join(""), pos, pos, "paste"); + setSelection(cm, pos, end); + })(); + } + }; + reader.readAsText(file); + }; + for (var i = 0; i < n; ++i) loadFile(files[i], i); + } else { + // Don't do a replace if the drop happened inside of the selected text. + if (cm.view.draggingText && !(posLess(pos, cm.view.sel.from) || posLess(cm.view.sel.to, pos))) { + cm.view.draggingText(e); + // Ensure the editor is re-focused + setTimeout(bind(focusInput, cm), 20); + return; + } + try { + var text = e.dataTransfer.getData("Text"); + if (text) { + var curFrom = cm.view.sel.from, curTo = cm.view.sel.to; + setSelection(cm, pos, pos); + if (cm.view.draggingText) replaceRange(cm, "", curFrom, curTo, "paste"); + cm.replaceSelection(text, null, "paste"); + focusInput(cm); + onFocus(cm); + } + } + catch(e){} + } + } + + function clickInGutter(cm, e) { + var display = cm.display; + try { var mX = e.clientX, mY = e.clientY; } + catch(e) { return false; } + + if (mX >= Math.floor(display.gutters.getBoundingClientRect().right)) return false; + e_preventDefault(e); + if (!hasHandler(cm, "gutterClick")) return true; + + var lineBox = display.lineDiv.getBoundingClientRect(); + if (mY > lineBox.bottom) return true; + mY -= lineBox.top - display.viewOffset; + + for (var i = 0; i < cm.options.gutters.length; ++i) { + var g = display.gutters.childNodes[i]; + if (g && g.getBoundingClientRect().right >= mX) { + var line = lineAtHeight(cm.view.doc, mY); + var gutter = cm.options.gutters[i]; + signalLater(cm, cm, "gutterClick", cm, line, gutter, e); + break; + } + } + return true; + } + + function onDragStart(cm, e) { + if (eventInWidget(cm.display, e)) return; + + var txt = cm.getSelection(); + e.dataTransfer.setData("Text", txt); + + // Use dummy image instead of default browsers image. + // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there. + if (e.dataTransfer.setDragImage && !safari) { + var img = elt("img", null, null, "position: fixed; left: 0; top: 0;"); + if (opera) { + img.width = img.height = 1; + cm.display.wrapper.appendChild(img); + // Force a relayout, or Opera won't use our image for some obscure reason + img._top = img.offsetTop; + } + e.dataTransfer.setDragImage(img, 0, 0); + if (opera) img.parentNode.removeChild(img); + } + } + + function setScrollTop(cm, val) { + if (Math.abs(cm.view.scrollTop - val) < 2) return; + cm.view.scrollTop = val; + if (!gecko) updateDisplay(cm, [], val); + if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val; + if (cm.display.scrollbarV.scrollTop != val) cm.display.scrollbarV.scrollTop = val; + if (gecko) updateDisplay(cm, []); + } + function setScrollLeft(cm, val, isScroller) { + if (isScroller ? val == cm.view.scrollLeft : Math.abs(cm.view.scrollLeft - val) < 2) return; + val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth); + cm.view.scrollLeft = val; + alignHorizontally(cm); + if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val; + if (cm.display.scrollbarH.scrollLeft != val) cm.display.scrollbarH.scrollLeft = val; + } + + // Since the delta values reported on mouse wheel events are + // unstandardized between browsers and even browser versions, and + // generally horribly unpredictable, this code starts by measuring + // the scroll effect that the first few mouse wheel events have, + // and, from that, detects the way it can convert deltas to pixel + // offsets afterwards. + // + // The reason we want to know the amount a wheel event will scroll + // is that it gives us a chance to update the display before the + // actual scrolling happens, reducing flickering. + + var wheelSamples = 0, wheelPixelsPerUnit = null; + // Fill in a browser-detected starting value on browsers where we + // know one. These don't have to be accurate -- the result of them + // being wrong would just be a slight flicker on the first wheel + // scroll (if it is large enough). + if (ie) wheelPixelsPerUnit = -.53; + else if (gecko) wheelPixelsPerUnit = 15; + else if (chrome) wheelPixelsPerUnit = -.7; + else if (safari) wheelPixelsPerUnit = -1/3; + + function onScrollWheel(cm, e) { + var dx = e.wheelDeltaX, dy = e.wheelDeltaY; + if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) dx = e.detail; + if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) dy = e.detail; + else if (dy == null) dy = e.wheelDelta; + + // Webkit browsers on OS X abort momentum scrolls when the target + // of the scroll event is removed from the scrollable element. + // This hack (see related code in patchDisplay) makes sure the + // element is kept around. + if (dy && mac && webkit) { + for (var cur = e.target; cur != scroll; cur = cur.parentNode) { + if (cur.lineObj) { + cm.display.currentWheelTarget = cur; + break; + } + } + } + + var display = cm.display, scroll = display.scroller; + // On some browsers, horizontal scrolling will cause redraws to + // happen before the gutter has been realigned, causing it to + // wriggle around in a most unseemly way. When we have an + // estimated pixels/delta value, we just handle horizontal + // scrolling entirely here. It'll be slightly off from native, but + // better than glitching out. + if (dx && !gecko && !opera && wheelPixelsPerUnit != null) { + if (dy) + setScrollTop(cm, Math.max(0, Math.min(scroll.scrollTop + dy * wheelPixelsPerUnit, scroll.scrollHeight - scroll.clientHeight))); + setScrollLeft(cm, Math.max(0, Math.min(scroll.scrollLeft + dx * wheelPixelsPerUnit, scroll.scrollWidth - scroll.clientWidth))); + e_preventDefault(e); + display.wheelStartX = null; // Abort measurement, if in progress + return; + } + + if (dy && wheelPixelsPerUnit != null) { + var pixels = dy * wheelPixelsPerUnit; + var top = cm.view.scrollTop, bot = top + display.wrapper.clientHeight; + if (pixels < 0) top = Math.max(0, top + pixels - 50); + else bot = Math.min(cm.view.doc.height, bot + pixels + 50); + updateDisplay(cm, [], {top: top, bottom: bot}); + } + + if (wheelSamples < 20) { + if (display.wheelStartX == null) { + display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop; + display.wheelDX = dx; display.wheelDY = dy; + setTimeout(function() { + if (display.wheelStartX == null) return; + var movedX = scroll.scrollLeft - display.wheelStartX; + var movedY = scroll.scrollTop - display.wheelStartY; + var sample = (movedY && display.wheelDY && movedY / display.wheelDY) || + (movedX && display.wheelDX && movedX / display.wheelDX); + display.wheelStartX = display.wheelStartY = null; + if (!sample) return; + wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1); + ++wheelSamples; + }, 200); + } else { + display.wheelDX += dx; display.wheelDY += dy; + } + } + } + + function doHandleBinding(cm, bound, dropShift) { + if (typeof bound == "string") { + bound = commands[bound]; + if (!bound) return false; + } + // Ensure previous input has been read, so that the handler sees a + // consistent view of the document + if (cm.display.pollingFast && readInput(cm)) cm.display.pollingFast = false; + var view = cm.view, prevShift = view.sel.shift; + try { + if (isReadOnly(cm)) view.suppressEdits = true; + if (dropShift) view.sel.shift = false; + bound(cm); + } catch(e) { + if (e != Pass) throw e; + return false; + } finally { + view.sel.shift = prevShift; + view.suppressEdits = false; + } + return true; + } + + function allKeyMaps(cm) { + var maps = cm.view.keyMaps.slice(0); + maps.push(cm.options.keyMap); + if (cm.options.extraKeys) maps.unshift(cm.options.extraKeys); + return maps; + } + + var maybeTransition; + function handleKeyBinding(cm, e) { + // Handle auto keymap transitions + var startMap = getKeyMap(cm.options.keyMap), next = startMap.auto; + clearTimeout(maybeTransition); + if (next && !isModifierKey(e)) maybeTransition = setTimeout(function() { + if (getKeyMap(cm.options.keyMap) == startMap) + cm.options.keyMap = (next.call ? next.call(null, cm) : next); + }, 50); + + var name = keyNames[e_prop(e, "keyCode")], handled = false; + if (name == null || e.altGraphKey) return false; + if (e_prop(e, "altKey")) name = "Alt-" + name; + if (e_prop(e, flipCtrlCmd ? "metaKey" : "ctrlKey")) name = "Ctrl-" + name; + if (e_prop(e, flipCtrlCmd ? "ctrlKey" : "metaKey")) name = "Cmd-" + name; + + var stopped = false; + function stop() { stopped = true; } + var keymaps = allKeyMaps(cm); + + if (e_prop(e, "shiftKey")) { + handled = lookupKey("Shift-" + name, keymaps, + function(b) {return doHandleBinding(cm, b, true);}, stop) + || lookupKey(name, keymaps, function(b) { + if (typeof b == "string" && /^go[A-Z]/.test(b)) return doHandleBinding(cm, b); + }, stop); + } else { + handled = lookupKey(name, keymaps, + function(b) { return doHandleBinding(cm, b); }, stop); + } + if (stopped) handled = false; + if (handled) { + e_preventDefault(e); + restartBlink(cm); + if (ie_lt9) { e.oldKeyCode = e.keyCode; e.keyCode = 0; } + } + return handled; + } + + function handleCharBinding(cm, e, ch) { + var handled = lookupKey("'" + ch + "'", allKeyMaps(cm), + function(b) { return doHandleBinding(cm, b, true); }); + if (handled) { + e_preventDefault(e); + restartBlink(cm); + } + return handled; + } + + var lastStoppedKey = null; + function onKeyDown(e) { + var cm = this; + if (!cm.view.focused) onFocus(cm); + if (ie && e.keyCode == 27) { e.returnValue = false; } + if (cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return; + var code = e_prop(e, "keyCode"); + // IE does strange things with escape. + cm.view.sel.shift = code == 16 || e_prop(e, "shiftKey"); + // First give onKeyEvent option a chance to handle this. + var handled = handleKeyBinding(cm, e); + if (opera) { + lastStoppedKey = handled ? code : null; + // Opera has no cut event... we try to at least catch the key combo + if (!handled && code == 88 && !hasCopyEvent && e_prop(e, mac ? "metaKey" : "ctrlKey")) + cm.replaceSelection(""); + } + } + + function onKeyPress(e) { + var cm = this; + if (cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return; + var keyCode = e_prop(e, "keyCode"), charCode = e_prop(e, "charCode"); + if (opera && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;} + if (((opera && (!e.which || e.which < 10)) || khtml) && handleKeyBinding(cm, e)) return; + var ch = String.fromCharCode(charCode == null ? keyCode : charCode); + if (this.options.electricChars && this.view.mode.electricChars && + this.options.smartIndent && !isReadOnly(this) && + this.view.mode.electricChars.indexOf(ch) > -1) + setTimeout(operation(cm, function() {indentLine(cm, cm.view.sel.to.line, "smart");}), 75); + if (handleCharBinding(cm, e, ch)) return; + fastPoll(cm); + } + + function onFocus(cm) { + if (cm.options.readOnly == "nocursor") return; + if (!cm.view.focused) { + signal(cm, "focus", cm); + cm.view.focused = true; + if (cm.display.scroller.className.search(/\bCodeMirror-focused\b/) == -1) + cm.display.scroller.className += " CodeMirror-focused"; + resetInput(cm, true); + } + slowPoll(cm); + restartBlink(cm); + } + function onBlur(cm) { + if (cm.view.focused) { + signal(cm, "blur", cm); + cm.view.focused = false; + cm.display.scroller.className = cm.display.scroller.className.replace(" CodeMirror-focused", ""); + } + clearInterval(cm.display.blinker); + setTimeout(function() {if (!cm.view.focused) cm.view.sel.shift = false;}, 150); + } + + var detectingSelectAll; + function onContextMenu(cm, e) { + var display = cm.display; + if (eventInWidget(display, e)) return; + + var sel = cm.view.sel; + var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop; + if (!pos || opera) return; // Opera is difficult. + if (posEq(sel.from, sel.to) || posLess(pos, sel.from) || !posLess(pos, sel.to)) + operation(cm, setSelection)(cm, pos, pos); + + var oldCSS = display.input.style.cssText; + display.inputDiv.style.position = "absolute"; + display.input.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (e.clientY - 5) + + "px; left: " + (e.clientX - 5) + "px; z-index: 1000; background: white; outline: none;" + + "border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);"; + focusInput(cm); + resetInput(cm, true); + // Adds "Select all" to context menu in FF + if (posEq(sel.from, sel.to)) display.input.value = display.prevInput = " "; + + function rehide() { + display.inputDiv.style.position = "relative"; + display.input.style.cssText = oldCSS; + if (ie_lt9) display.scrollbarV.scrollTop = display.scroller.scrollTop = scrollPos; + slowPoll(cm); + + // Try to detect the user choosing select-all + if (display.input.selectionStart != null) { + clearTimeout(detectingSelectAll); + var extval = display.input.value = " " + (posEq(sel.from, sel.to) ? "" : display.input.value), i = 0; + display.prevInput = " "; + display.input.selectionStart = 1; display.input.selectionEnd = extval.length; + detectingSelectAll = setTimeout(function poll(){ + if (display.prevInput == " " && display.input.selectionStart == 0) + operation(cm, commands.selectAll)(cm); + else if (i++ < 10) detectingSelectAll = setTimeout(poll, 500); + else resetInput(cm); + }, 200); + } + } + + if (gecko) { + e_stop(e); + on(window, "mouseup", function mouseup() { + off(window, "mouseup", mouseup); + setTimeout(rehide, 20); + }); + } else { + setTimeout(rehide, 50); + } + } + + // UPDATING + + // Replace the range from from to to by the strings in newText. + // Afterwards, set the selection to selFrom, selTo. + function updateDoc(cm, from, to, newText, selUpdate, origin) { + // Possibly split or suppress the update based on the presence + // of read-only spans in its range. + var split = sawReadOnlySpans && + removeReadOnlyRanges(cm.view.doc, from, to); + if (split) { + for (var i = split.length - 1; i >= 1; --i) + updateDocInner(cm, split[i].from, split[i].to, [""], origin); + if (split.length) + return updateDocInner(cm, split[0].from, split[0].to, newText, selUpdate, origin); + } else { + return updateDocInner(cm, from, to, newText, selUpdate, origin); + } + } + + function updateDocInner(cm, from, to, newText, selUpdate, origin) { + if (cm.view.suppressEdits) return; + + var view = cm.view, doc = view.doc, old = []; + doc.iter(from.line, to.line + 1, function(line) { + old.push(newHL(line.text, line.markedSpans)); + }); + var startSelFrom = view.sel.from, startSelTo = view.sel.to; + var lines = updateMarkedSpans(hlSpans(old[0]), hlSpans(lst(old)), from.ch, to.ch, newText); + var retval = updateDocNoUndo(cm, from, to, lines, selUpdate, origin); + if (view.history) addChange(cm, from.line, newText.length, old, origin, + startSelFrom, startSelTo, view.sel.from, view.sel.to); + return retval; + } + + function unredoHelper(cm, type) { + var doc = cm.view.doc, hist = cm.view.history; + var set = (type == "undo" ? hist.done : hist.undone).pop(); + if (!set) return; + var anti = {events: [], fromBefore: set.fromAfter, toBefore: set.toAfter, + fromAfter: set.fromBefore, toAfter: set.toBefore}; + for (var i = set.events.length - 1; i >= 0; i -= 1) { + hist.dirtyCounter += type == "undo" ? -1 : 1; + var change = set.events[i]; + var replaced = [], end = change.start + change.added; + doc.iter(change.start, end, function(line) { replaced.push(newHL(line.text, line.markedSpans)); }); + anti.events.push({start: change.start, added: change.old.length, old: replaced}); + var selPos = i ? null : {from: set.fromBefore, to: set.toBefore}; + updateDocNoUndo(cm, {line: change.start, ch: 0}, {line: end - 1, ch: getLine(doc, end-1).text.length}, + change.old, selPos, type); + } + (type == "undo" ? hist.undone : hist.done).push(anti); + } + + function updateDocNoUndo(cm, from, to, lines, selUpdate, origin) { + var view = cm.view, doc = view.doc, display = cm.display; + if (view.suppressEdits) return; + + var nlines = to.line - from.line, firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line); + var recomputeMaxLength = false, checkWidthStart = from.line; + if (!cm.options.lineWrapping) { + checkWidthStart = lineNo(visualLine(doc, firstLine)); + doc.iter(checkWidthStart, to.line + 1, function(line) { + if (line == view.maxLine) { + recomputeMaxLength = true; + return true; + } + }); + } + + var lastHL = lst(lines), th = textHeight(display); + + // First adjust the line structure + if (from.ch == 0 && to.ch == 0 && hlText(lastHL) == "") { + // This is a whole-line replace. Treated specially to make + // sure line objects move the way they are supposed to. + var added = []; + for (var i = 0, e = lines.length - 1; i < e; ++i) + added.push(makeLine(hlText(lines[i]), hlSpans(lines[i]), th)); + updateLine(cm, lastLine, lastLine.text, hlSpans(lastHL)); + if (nlines) doc.remove(from.line, nlines, cm); + if (added.length) doc.insert(from.line, added); + } else if (firstLine == lastLine) { + if (lines.length == 1) { + updateLine(cm, firstLine, firstLine.text.slice(0, from.ch) + hlText(lines[0]) + + firstLine.text.slice(to.ch), hlSpans(lines[0])); + } else { + for (var added = [], i = 1, e = lines.length - 1; i < e; ++i) + added.push(makeLine(hlText(lines[i]), hlSpans(lines[i]), th)); + added.push(makeLine(hlText(lastHL) + firstLine.text.slice(to.ch), hlSpans(lastHL), th)); + updateLine(cm, firstLine, firstLine.text.slice(0, from.ch) + hlText(lines[0]), hlSpans(lines[0])); + doc.insert(from.line + 1, added); + } + } else if (lines.length == 1) { + updateLine(cm, firstLine, firstLine.text.slice(0, from.ch) + hlText(lines[0]) + + lastLine.text.slice(to.ch), hlSpans(lines[0])); + doc.remove(from.line + 1, nlines, cm); + } else { + var added = []; + updateLine(cm, firstLine, firstLine.text.slice(0, from.ch) + hlText(lines[0]), hlSpans(lines[0])); + updateLine(cm, lastLine, hlText(lastHL) + lastLine.text.slice(to.ch), hlSpans(lastHL)); + for (var i = 1, e = lines.length - 1; i < e; ++i) + added.push(makeLine(hlText(lines[i]), hlSpans(lines[i]), th)); + if (nlines > 1) doc.remove(from.line + 1, nlines - 1, cm); + doc.insert(from.line + 1, added); + } + + if (cm.options.lineWrapping) { + var perLine = Math.max(5, display.scroller.clientWidth / charWidth(display) - 3); + doc.iter(from.line, from.line + lines.length, function(line) { + if (line.height == 0) return; + var guess = (Math.ceil(line.text.length / perLine) || 1) * th; + if (guess != line.height) updateLineHeight(line, guess); + }); + } else { + doc.iter(checkWidthStart, from.line + lines.length, function(line) { + var len = lineLength(doc, line); + if (len > view.maxLineLength) { + view.maxLine = line; + view.maxLineLength = len; + view.maxLineChanged = true; + recomputeMaxLength = false; + } + }); + if (recomputeMaxLength) cm.curOp.updateMaxLine = true; + } + + // Adjust frontier, schedule worker + view.frontier = Math.min(view.frontier, from.line); + startWorker(cm, 400); + + var lendiff = lines.length - nlines - 1; + // Remember that these lines changed, for updating the display + regChange(cm, from.line, to.line + 1, lendiff); + if (hasHandler(cm, "change")) { + // Normalize lines to contain only strings, since that's what + // the change event handler expects + for (var i = 0; i < lines.length; ++i) + if (typeof lines[i] != "string") lines[i] = lines[i].text; + var changeObj = {from: from, to: to, text: lines, origin: origin}; + if (cm.curOp.textChanged) { + for (var cur = cm.curOp.textChanged; cur.next; cur = cur.next) {} + cur.next = changeObj; + } else cm.curOp.textChanged = changeObj; + } + + // Update the selection + var newSelFrom, newSelTo, end = {line: from.line + lines.length - 1, + ch: hlText(lastHL).length + (lines.length == 1 ? from.ch : 0)}; + if (selUpdate && typeof selUpdate != "string") { + if (selUpdate.from) { newSelFrom = selUpdate.from; newSelTo = selUpdate.to; } + else newSelFrom = newSelTo = selUpdate; + } else if (selUpdate == "end") { + newSelFrom = newSelTo = end; + } else if (selUpdate == "start") { + newSelFrom = newSelTo = from; + } else if (selUpdate == "around") { + newSelFrom = from; newSelTo = end; + } else { + var adjustPos = function(pos) { + if (posLess(pos, from)) return pos; + if (!posLess(to, pos)) return end; + var line = pos.line + lendiff; + var ch = pos.ch; + if (pos.line == to.line) + ch += hlText(lastHL).length - (to.ch - (to.line == from.line ? from.ch : 0)); + return {line: line, ch: ch}; + }; + newSelFrom = adjustPos(view.sel.from); + newSelTo = adjustPos(view.sel.to); + } + setSelection(cm, newSelFrom, newSelTo, null, true); + return end; + } + + function replaceRange(cm, code, from, to, origin) { + if (!to) to = from; + if (posLess(to, from)) { var tmp = to; to = from; from = tmp; } + return updateDoc(cm, from, to, splitLines(code), null, origin); + } + + // SELECTION + + function posEq(a, b) {return a.line == b.line && a.ch == b.ch;} + function posLess(a, b) {return a.line < b.line || (a.line == b.line && a.ch < b.ch);} + function copyPos(x) {return {line: x.line, ch: x.ch};} + + function clipLine(doc, n) {return Math.max(0, Math.min(n, doc.size-1));} + function clipPos(doc, pos) { + if (pos.line < 0) return {line: 0, ch: 0}; + if (pos.line >= doc.size) return {line: doc.size-1, ch: getLine(doc, doc.size-1).text.length}; + var ch = pos.ch, linelen = getLine(doc, pos.line).text.length; + if (ch == null || ch > linelen) return {line: pos.line, ch: linelen}; + else if (ch < 0) return {line: pos.line, ch: 0}; + else return pos; + } + function isLine(doc, l) {return l >= 0 && l < doc.size;} + + // If shift is held, this will move the selection anchor. Otherwise, + // it'll set the whole selection. + function extendSelection(cm, pos, other, bias) { + var sel = cm.view.sel; + if (sel.shift || sel.extend) { + var anchor = sel.anchor; + if (other) { + var posBefore = posLess(pos, anchor); + if (posBefore != posLess(other, anchor)) { + anchor = pos; + pos = other; + } else if (posBefore != posLess(pos, other)) { + pos = other; + } + } + setSelection(cm, anchor, pos, bias); + } else { + setSelection(cm, pos, other || pos, bias); + } + cm.curOp.userSelChange = true; + } + + // Update the selection. Last two args are only used by + // updateDoc, since they have to be expressed in the line + // numbers before the update. + function setSelection(cm, anchor, head, bias, checkAtomic) { + cm.view.goalColumn = null; + var sel = cm.view.sel; + // Skip over atomic spans. + if (checkAtomic || !posEq(anchor, sel.anchor)) + anchor = skipAtomic(cm, anchor, bias, checkAtomic != "push"); + if (checkAtomic || !posEq(head, sel.head)) + head = skipAtomic(cm, head, bias, checkAtomic != "push"); + + if (posEq(sel.anchor, anchor) && posEq(sel.head, head)) return; + + sel.anchor = anchor; sel.head = head; + var inv = posLess(head, anchor); + sel.from = inv ? head : anchor; + sel.to = inv ? anchor : head; + + cm.curOp.updateInput = true; + cm.curOp.selectionChanged = true; + } + + function reCheckSelection(cm) { + setSelection(cm, cm.view.sel.from, cm.view.sel.to, null, "push"); + } + + function skipAtomic(cm, pos, bias, mayClear) { + var doc = cm.view.doc, flipped = false, curPos = pos; + var dir = bias || 1; + cm.view.cantEdit = false; + search: for (;;) { + var line = getLine(doc, curPos.line), toClear; + if (line.markedSpans) { + for (var i = 0; i < line.markedSpans.length; ++i) { + var sp = line.markedSpans[i], m = sp.marker; + if ((sp.from == null || (m.inclusiveLeft ? sp.from <= curPos.ch : sp.from < curPos.ch)) && + (sp.to == null || (m.inclusiveRight ? sp.to >= curPos.ch : sp.to > curPos.ch))) { + if (mayClear && m.clearOnEnter) { + (toClear || (toClear = [])).push(m); + continue; + } else if (!m.atomic) continue; + var newPos = m.find()[dir < 0 ? "from" : "to"]; + if (posEq(newPos, curPos)) { + newPos.ch += dir; + if (newPos.ch < 0) { + if (newPos.line) newPos = clipPos(doc, {line: newPos.line - 1}); + else newPos = null; + } else if (newPos.ch > line.text.length) { + if (newPos.line < doc.size - 1) newPos = {line: newPos.line + 1, ch: 0}; + else newPos = null; + } + if (!newPos) { + if (flipped) { + // Driven in a corner -- no valid cursor position found at all + // -- try again *with* clearing, if we didn't already + if (!mayClear) return skipAtomic(cm, pos, bias, true); + // Otherwise, turn off editing until further notice, and return the start of the doc + cm.view.cantEdit = true; + return {line: 0, ch: 0}; + } + flipped = true; newPos = pos; dir = -dir; + } + } + curPos = newPos; + continue search; + } + } + if (toClear) for (var i = 0; i < toClear.length; ++i) toClear[i].clear(); + } + return curPos; + } + } + + // SCROLLING + + function scrollCursorIntoView(cm) { + var view = cm.view; + var coords = scrollPosIntoView(cm, view.sel.head); + if (!view.focused) return; + var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null; + if (coords.top + box.top < 0) doScroll = true; + else if (coords.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false; + if (doScroll != null && !phantom) { + var hidden = display.cursor.style.display == "none"; + if (hidden) { + display.cursor.style.display = ""; + display.cursor.style.left = coords.left + "px"; + display.cursor.style.top = (coords.top - display.viewOffset) + "px"; + } + display.cursor.scrollIntoView(doScroll); + if (hidden) display.cursor.style.display = "none"; + } + } + + function scrollPosIntoView(cm, pos) { + for (;;) { + var changed = false, coords = cursorCoords(cm, pos); + var scrollPos = calculateScrollPos(cm, coords.left, coords.top, coords.left, coords.bottom); + var startTop = cm.view.scrollTop, startLeft = cm.view.scrollLeft; + if (scrollPos.scrollTop != null) { + setScrollTop(cm, scrollPos.scrollTop); + if (Math.abs(cm.view.scrollTop - startTop) > 1) changed = true; + } + if (scrollPos.scrollLeft != null) { + setScrollLeft(cm, scrollPos.scrollLeft); + if (Math.abs(cm.view.scrollLeft - startLeft) > 1) changed = true; + } + if (!changed) return coords; + } + } + + function scrollIntoView(cm, x1, y1, x2, y2) { + var scrollPos = calculateScrollPos(cm, x1, y1, x2, y2); + if (scrollPos.scrollTop != null) setScrollTop(cm, scrollPos.scrollTop); + if (scrollPos.scrollLeft != null) setScrollLeft(cm, scrollPos.scrollLeft); + } + + function calculateScrollPos(cm, x1, y1, x2, y2) { + var display = cm.display, pt = paddingTop(display); + y1 += pt; y2 += pt; + var screen = display.scroller.clientHeight - scrollerCutOff, screentop = display.scroller.scrollTop, result = {}; + var docBottom = cm.view.doc.height + 2 * pt; + var atTop = y1 < pt + 10, atBottom = y2 + pt > docBottom - 10; + if (y1 < screentop) result.scrollTop = atTop ? 0 : Math.max(0, y1); + else if (y2 > screentop + screen) result.scrollTop = (atBottom ? docBottom : y2) - screen; + + var screenw = display.scroller.clientWidth - scrollerCutOff, screenleft = display.scroller.scrollLeft; + x1 += display.gutters.offsetWidth; x2 += display.gutters.offsetWidth; + var gutterw = display.gutters.offsetWidth; + var atLeft = x1 < gutterw + 10; + if (x1 < screenleft + gutterw || atLeft) { + if (atLeft) x1 = 0; + result.scrollLeft = Math.max(0, x1 - 10 - gutterw); + } else if (x2 > screenw + screenleft - 3) { + result.scrollLeft = x2 + 10 - screenw; + } + return result; + } + + // API UTILITIES + + function indentLine(cm, n, how, aggressive) { + var doc = cm.view.doc; + if (!how) how = "add"; + if (how == "smart") { + if (!cm.view.mode.indent) how = "prev"; + else var state = getStateBefore(cm, n); + } + + var tabSize = cm.options.tabSize; + var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize); + var curSpaceString = line.text.match(/^\s*/)[0], indentation; + if (how == "smart") { + indentation = cm.view.mode.indent(state, line.text.slice(curSpaceString.length), line.text); + if (indentation == Pass) { + if (!aggressive) return; + how = "prev"; + } + } + if (how == "prev") { + if (n) indentation = countColumn(getLine(doc, n-1).text, null, tabSize); + else indentation = 0; + } + else if (how == "add") indentation = curSpace + cm.options.indentUnit; + else if (how == "subtract") indentation = curSpace - cm.options.indentUnit; + indentation = Math.max(0, indentation); + + var indentString = "", pos = 0; + if (cm.options.indentWithTabs) + for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";} + if (pos < indentation) indentString += spaceStr(indentation - pos); + + if (indentString != curSpaceString) + replaceRange(cm, indentString, {line: n, ch: 0}, {line: n, ch: curSpaceString.length}, "input"); + line.stateAfter = null; + } + + function changeLine(cm, handle, op) { + var no = handle, line = handle, doc = cm.view.doc; + if (typeof handle == "number") line = getLine(doc, clipLine(doc, handle)); + else no = lineNo(handle); + if (no == null) return null; + if (op(line, no)) regChange(cm, no, no + 1); + else return null; + return line; + } + + function findPosH(cm, dir, unit, visually) { + var doc = cm.view.doc, end = cm.view.sel.head, line = end.line, ch = end.ch; + var lineObj = getLine(doc, line); + function findNextLine() { + var l = line + dir; + if (l < 0 || l == doc.size) return false; + line = l; + return lineObj = getLine(doc, l); + } + function moveOnce(boundToLine) { + var next = (visually ? moveVisually : moveLogically)(lineObj, ch, dir, true); + if (next == null) { + if (!boundToLine && findNextLine()) { + if (visually) ch = (dir < 0 ? lineRight : lineLeft)(lineObj); + else ch = dir < 0 ? lineObj.text.length : 0; + } else return false; + } else ch = next; + return true; + } + if (unit == "char") moveOnce(); + else if (unit == "column") moveOnce(true); + else if (unit == "word") { + var sawWord = false; + for (;;) { + if (dir < 0) if (!moveOnce()) break; + if (isWordChar(lineObj.text.charAt(ch))) sawWord = true; + else if (sawWord) {if (dir < 0) {dir = 1; moveOnce();} break;} + if (dir > 0) if (!moveOnce()) break; + } + } + return skipAtomic(cm, {line: line, ch: ch}, dir, true); + } + + function findWordAt(line, pos) { + var start = pos.ch, end = pos.ch; + if (line) { + if (pos.after === false || end == line.length) --start; else ++end; + var startChar = line.charAt(start); + var check = isWordChar(startChar) ? isWordChar : + /\s/.test(startChar) ? function(ch) {return /\s/.test(ch);} : + function(ch) {return !/\s/.test(ch) && !isWordChar(ch);}; + while (start > 0 && check(line.charAt(start - 1))) --start; + while (end < line.length && check(line.charAt(end))) ++end; + } + return {from: {line: pos.line, ch: start}, to: {line: pos.line, ch: end}}; + } + + function selectLine(cm, line) { + extendSelection(cm, {line: line, ch: 0}, clipPos(cm.view.doc, {line: line + 1, ch: 0})); + } + + // PROTOTYPE + + // The publicly visible API. Note that operation(null, f) means + // 'wrap f in an operation, performed on its `this` parameter' + + CodeMirror.prototype = { + getValue: function(lineSep) { + var text = [], doc = this.view.doc; + doc.iter(0, doc.size, function(line) { text.push(line.text); }); + return text.join(lineSep || "\n"); + }, + + setValue: operation(null, function(code) { + var doc = this.view.doc, top = {line: 0, ch: 0}, lastLen = getLine(doc, doc.size-1).text.length; + updateDocInner(this, top, {line: doc.size - 1, ch: lastLen}, splitLines(code), top, top, "setValue"); + }), + + getSelection: function(lineSep) { return this.getRange(this.view.sel.from, this.view.sel.to, lineSep); }, + + replaceSelection: operation(null, function(code, collapse, origin) { + var sel = this.view.sel; + updateDoc(this, sel.from, sel.to, splitLines(code), collapse || "around", origin); + }), + + focus: function(){window.focus(); focusInput(this); onFocus(this); fastPoll(this);}, + + setOption: function(option, value) { + var options = this.options, old = options[option]; + if (options[option] == value && option != "mode") return; + options[option] = value; + if (optionHandlers.hasOwnProperty(option)) + operation(this, optionHandlers[option])(this, value, old); + }, + + getOption: function(option) {return this.options[option];}, + + getMode: function() {return this.view.mode;}, + + addKeyMap: function(map) { + this.view.keyMaps.push(map); + }, + + removeKeyMap: function(map) { + var maps = this.view.keyMaps; + for (var i = 0; i < maps.length; ++i) + if ((typeof map == "string" ? maps[i].name : maps[i]) == map) { + maps.splice(i, 1); + return true; + } + }, + + addOverlay: operation(null, function(spec, options) { + var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec); + if (mode.startState) throw new Error("Overlays may not be stateful."); + this.view.overlays.push({mode: mode, modeSpec: spec, opaque: options && options.opaque}); + this.view.modeGen++; + regChange(this, 0, this.view.doc.size); + }), + removeOverlay: operation(null, function(spec) { + var overlays = this.view.overlays; + for (var i = 0; i < overlays.length; ++i) { + if (overlays[i].modeSpec == spec) { + overlays.splice(i, 1); + this.view.modeGen++; + regChange(this, 0, this.view.doc.size); + return; + } + } + }), + + undo: operation(null, function() {unredoHelper(this, "undo");}), + redo: operation(null, function() {unredoHelper(this, "redo");}), + + indentLine: operation(null, function(n, dir, aggressive) { + if (typeof dir != "string") { + if (dir == null) dir = this.options.smartIndent ? "smart" : "prev"; + else dir = dir ? "add" : "subtract"; + } + if (isLine(this.view.doc, n)) indentLine(this, n, dir, aggressive); + }), + + indentSelection: operation(null, function(how) { + var sel = this.view.sel; + if (posEq(sel.from, sel.to)) return indentLine(this, sel.from.line, how); + var e = sel.to.line - (sel.to.ch ? 0 : 1); + for (var i = sel.from.line; i <= e; ++i) indentLine(this, i, how); + }), + + historySize: function() { + var hist = this.view.history; + return {undo: hist.done.length, redo: hist.undone.length}; + }, + + clearHistory: function() {this.view.history = makeHistory();}, + + markClean: function() { + this.view.history.dirtyCounter = 0; + this.view.history.lastOp = this.view.history.lastOrigin = null; + }, + + isClean: function () {return this.view.history.dirtyCounter == 0;}, + + getHistory: function() { + var hist = this.view.history; + function cp(arr) { + for (var i = 0, nw = [], nwelt; i < arr.length; ++i) { + var set = arr[i]; + nw.push({events: nwelt = [], fromBefore: set.fromBefore, toBefore: set.toBefore, + fromAfter: set.fromAfter, toAfter: set.toAfter}); + for (var j = 0, elt = set.events; j < elt.length; ++j) { + var old = [], cur = elt[j]; + nwelt.push({start: cur.start, added: cur.added, old: old}); + for (var k = 0; k < cur.old.length; ++k) old.push(hlText(cur.old[k])); + } + } + return nw; + } + return {done: cp(hist.done), undone: cp(hist.undone)}; + }, + + setHistory: function(histData) { + var hist = this.view.history = makeHistory(); + hist.done = histData.done; + hist.undone = histData.undone; + }, + + // Fetch the parser token for a given character. Useful for hacks + // that want to inspect the mode state (say, for completion). + getTokenAt: function(pos) { + var doc = this.view.doc; + pos = clipPos(doc, pos); + var state = getStateBefore(this, pos.line), mode = this.view.mode; + var line = getLine(doc, pos.line); + var stream = new StringStream(line.text, this.options.tabSize); + while (stream.pos < pos.ch && !stream.eol()) { + stream.start = stream.pos; + var style = mode.token(stream, state); + } + return {start: stream.start, + end: stream.pos, + string: stream.current(), + className: style || null, // Deprecated, use 'type' instead + type: style || null, + state: state}; + }, + + getStateAfter: function(line) { + var doc = this.view.doc; + line = clipLine(doc, line == null ? doc.size - 1: line); + return getStateBefore(this, line + 1); + }, + + cursorCoords: function(start, mode) { + var pos, sel = this.view.sel; + if (start == null) pos = sel.head; + else if (typeof start == "object") pos = clipPos(this.view.doc, start); + else pos = start ? sel.from : sel.to; + return cursorCoords(this, pos, mode || "page"); + }, + + charCoords: function(pos, mode) { + return charCoords(this, clipPos(this.view.doc, pos), mode || "page"); + }, + + coordsChar: function(coords) { + var off = this.display.lineSpace.getBoundingClientRect(); + return coordsChar(this, coords.left - off.left, coords.top - off.top); + }, + + defaultTextHeight: function() { return textHeight(this.display); }, + + markText: operation(null, function(from, to, options) { + return markText(this, clipPos(this.view.doc, from), clipPos(this.view.doc, to), + options, "range"); + }), + + setBookmark: operation(null, function(pos, widget) { + pos = clipPos(this.view.doc, pos); + return markText(this, pos, pos, widget ? {replacedWith: widget} : {}, "bookmark"); + }), + + findMarksAt: function(pos) { + var doc = this.view.doc; + pos = clipPos(doc, pos); + var markers = [], spans = getLine(doc, pos.line).markedSpans; + if (spans) for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if ((span.from == null || span.from <= pos.ch) && + (span.to == null || span.to >= pos.ch)) + markers.push(span.marker); + } + return markers; + }, + + setGutterMarker: operation(null, function(line, gutterID, value) { + return changeLine(this, line, function(line) { + var markers = line.gutterMarkers || (line.gutterMarkers = {}); + markers[gutterID] = value; + if (!value && isEmpty(markers)) line.gutterMarkers = null; + return true; + }); + }), + + clearGutter: operation(null, function(gutterID) { + var i = 0, cm = this, doc = cm.view.doc; + doc.iter(0, doc.size, function(line) { + if (line.gutterMarkers && line.gutterMarkers[gutterID]) { + line.gutterMarkers[gutterID] = null; + regChange(cm, i, i + 1); + if (isEmpty(line.gutterMarkers)) line.gutterMarkers = null; + } + ++i; + }); + }), + + addLineClass: operation(null, function(handle, where, cls) { + return changeLine(this, handle, function(line) { + var prop = where == "text" ? "textClass" : where == "background" ? "bgClass" : "wrapClass"; + if (!line[prop]) line[prop] = cls; + else if (new RegExp("\\b" + cls + "\\b").test(line[prop])) return false; + else line[prop] += " " + cls; + return true; + }); + }), + + removeLineClass: operation(null, function(handle, where, cls) { + return changeLine(this, handle, function(line) { + var prop = where == "text" ? "textClass" : where == "background" ? "bgClass" : "wrapClass"; + var cur = line[prop]; + if (!cur) return false; + else if (cls == null) line[prop] = null; + else { + var upd = cur.replace(new RegExp("^" + cls + "\\b\\s*|\\s*\\b" + cls + "\\b"), ""); + if (upd == cur) return false; + line[prop] = upd || null; + } + return true; + }); + }), + + addLineWidget: operation(null, function(handle, node, options) { + return addLineWidget(this, handle, node, options); + }), + + removeLineWidget: function(widget) { widget.clear(); }, + + lineInfo: function(line) { + if (typeof line == "number") { + if (!isLine(this.view.doc, line)) return null; + var n = line; + line = getLine(this.view.doc, line); + if (!line) return null; + } else { + var n = lineNo(line); + if (n == null) return null; + } + return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers, + textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass, + widgets: line.widgets}; + }, + + getViewport: function() { return {from: this.display.showingFrom, to: this.display.showingTo};}, + + addWidget: function(pos, node, scroll, vert, horiz) { + var display = this.display; + pos = cursorCoords(this, clipPos(this.view.doc, pos)); + var top = pos.top, left = pos.left; + node.style.position = "absolute"; + display.sizer.appendChild(node); + if (vert == "over") top = pos.top; + else if (vert == "near") { + var vspace = Math.max(display.wrapper.clientHeight, this.view.doc.height), + hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth); + if (pos.bottom + node.offsetHeight > vspace && pos.top > node.offsetHeight) + top = pos.top - node.offsetHeight; + if (left + node.offsetWidth > hspace) + left = hspace - node.offsetWidth; + } + node.style.top = (top + paddingTop(display)) + "px"; + node.style.left = node.style.right = ""; + if (horiz == "right") { + left = display.sizer.clientWidth - node.offsetWidth; + node.style.right = "0px"; + } else { + if (horiz == "left") left = 0; + else if (horiz == "middle") left = (display.sizer.clientWidth - node.offsetWidth) / 2; + node.style.left = left + "px"; + } + if (scroll) + scrollIntoView(this, left, top, left + node.offsetWidth, top + node.offsetHeight); + }, + + lineCount: function() {return this.view.doc.size;}, + + clipPos: function(pos) {return clipPos(this.view.doc, pos);}, + + getCursor: function(start) { + var sel = this.view.sel, pos; + if (start == null || start == "head") pos = sel.head; + else if (start == "anchor") pos = sel.anchor; + else if (start == "end" || start === false) pos = sel.to; + else pos = sel.from; + return copyPos(pos); + }, + + somethingSelected: function() {return !posEq(this.view.sel.from, this.view.sel.to);}, + + setCursor: operation(null, function(line, ch, extend) { + var pos = clipPos(this.view.doc, typeof line == "number" ? {line: line, ch: ch || 0} : line); + if (extend) extendSelection(this, pos); + else setSelection(this, pos, pos); + }), + + setSelection: operation(null, function(anchor, head) { + var doc = this.view.doc; + setSelection(this, clipPos(doc, anchor), clipPos(doc, head || anchor)); + }), + + extendSelection: operation(null, function(from, to) { + var doc = this.view.doc; + extendSelection(this, clipPos(doc, from), to && clipPos(doc, to)); + }), + + setExtending: function(val) {this.view.sel.extend = val;}, + + getLine: function(line) {var l = this.getLineHandle(line); return l && l.text;}, + + getLineHandle: function(line) { + var doc = this.view.doc; + if (isLine(doc, line)) return getLine(doc, line); + }, + + getLineNumber: function(line) {return lineNo(line);}, + + setLine: operation(null, function(line, text) { + if (isLine(this.view.doc, line)) + replaceRange(this, text, {line: line, ch: 0}, {line: line, ch: getLine(this.view.doc, line).text.length}); + }), + + removeLine: operation(null, function(line) { + if (isLine(this.view.doc, line)) + replaceRange(this, "", {line: line, ch: 0}, clipPos(this.view.doc, {line: line+1, ch: 0})); + }), + + replaceRange: operation(null, function(code, from, to) { + var doc = this.view.doc; + from = clipPos(doc, from); + to = to ? clipPos(doc, to) : from; + return replaceRange(this, code, from, to); + }), + + getRange: function(from, to, lineSep) { + var doc = this.view.doc; + from = clipPos(doc, from); to = clipPos(doc, to); + var l1 = from.line, l2 = to.line; + if (l1 == l2) return getLine(doc, l1).text.slice(from.ch, to.ch); + var code = [getLine(doc, l1).text.slice(from.ch)]; + doc.iter(l1 + 1, l2, function(line) { code.push(line.text); }); + code.push(getLine(doc, l2).text.slice(0, to.ch)); + return code.join(lineSep || "\n"); + }, + + triggerOnKeyDown: operation(null, onKeyDown), + + execCommand: function(cmd) {return commands[cmd](this);}, + + // Stuff used by commands, probably not much use to outside code. + moveH: operation(null, function(dir, unit) { + var sel = this.view.sel, pos = dir < 0 ? sel.from : sel.to; + if (sel.shift || sel.extend || posEq(sel.from, sel.to)) + pos = findPosH(this, dir, unit, this.options.rtlMoveVisually); + extendSelection(this, pos, pos, dir); + }), + + deleteH: operation(null, function(dir, unit) { + var sel = this.view.sel; + if (!posEq(sel.from, sel.to)) replaceRange(this, "", sel.from, sel.to, "delete"); + else replaceRange(this, "", sel.from, findPosH(this, dir, unit, false), "delete"); + this.curOp.userSelChange = true; + }), + + moveV: operation(null, function(dir, unit) { + var view = this.view, doc = view.doc, display = this.display; + var cur = view.sel.head, pos = cursorCoords(this, cur, "div"); + var x = pos.left, y; + if (view.goalColumn != null) x = view.goalColumn; + if (unit == "page") { + var pageSize = Math.min(display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight); + y = pos.top + dir * pageSize; + } else if (unit == "line") { + y = dir > 0 ? pos.bottom + 3 : pos.top - 3; + } + do { + var target = coordsChar(this, x, y); + y += dir * 5; + } while (target.outside && (dir < 0 ? y > 0 : y < doc.height)); + + if (unit == "page") display.scrollbarV.scrollTop += charCoords(this, target, "div").top - pos.top; + extendSelection(this, target, target, dir); + view.goalColumn = x; + }), + + toggleOverwrite: function() { + if (this.view.overwrite = !this.view.overwrite) + this.display.cursor.className += " CodeMirror-overwrite"; + else + this.display.cursor.className = this.display.cursor.className.replace(" CodeMirror-overwrite", ""); + }, + + posFromIndex: function(off) { + var lineNo = 0, ch, doc = this.view.doc; + doc.iter(0, doc.size, function(line) { + var sz = line.text.length + 1; + if (sz > off) { ch = off; return true; } + off -= sz; + ++lineNo; + }); + return clipPos(doc, {line: lineNo, ch: ch}); + }, + indexFromPos: function (coords) { + coords = clipPos(this.view.doc, coords); + var index = coords.ch; + this.view.doc.iter(0, coords.line, function (line) { + index += line.text.length + 1; + }); + return index; + }, + + scrollTo: function(x, y) { + if (x != null) this.display.scrollbarH.scrollLeft = this.display.scroller.scrollLeft = x; + if (y != null) this.display.scrollbarV.scrollTop = this.display.scroller.scrollTop = y; + updateDisplay(this, []); + }, + getScrollInfo: function() { + var scroller = this.display.scroller, co = scrollerCutOff; + return {left: scroller.scrollLeft, top: scroller.scrollTop, + height: scroller.scrollHeight - co, width: scroller.scrollWidth - co, + clientHeight: scroller.clientHeight - co, clientWidth: scroller.clientWidth - co}; + }, + + scrollIntoView: function(pos) { + if (typeof pos == "number") pos = {line: pos, ch: 0}; + if (!pos || pos.line != null) { + pos = pos ? clipPos(this.view.doc, pos) : this.view.sel.head; + scrollPosIntoView(this, pos); + } else { + scrollIntoView(this, pos.left, pos.top, pos.right, pos.bottom); + } + }, + + setSize: function(width, height) { + function interpret(val) { + return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; + } + if (width != null) this.display.wrapper.style.width = interpret(width); + if (height != null) this.display.wrapper.style.height = interpret(height); + this.refresh(); + }, + + on: function(type, f) {on(this, type, f);}, + off: function(type, f) {off(this, type, f);}, + + operation: function(f){return operation(this, f)();}, + + refresh: function() { + clearCaches(this); + var sTop = this.view.scrollTop, sLeft = this.view.scrollLeft; + if (this.display.scroller.scrollHeight > sTop) + this.display.scrollbarV.scrollTop = this.display.scroller.scrollTop = sTop; + if (this.display.scroller.scrollWidth > sLeft) + this.display.scrollbarH.scrollLeft = this.display.scroller.scrollLeft = sLeft; + updateDisplay(this, true); + }, + + getInputField: function(){return this.display.input;}, + getWrapperElement: function(){return this.display.wrapper;}, + getScrollerElement: function(){return this.display.scroller;}, + getGutterElement: function(){return this.display.gutters;} + }; + + // OPTION DEFAULTS + + var optionHandlers = CodeMirror.optionHandlers = {}; + + // The default configuration options. + var defaults = CodeMirror.defaults = {}; + + function option(name, deflt, handle, notOnInit) { + CodeMirror.defaults[name] = deflt; + if (handle) optionHandlers[name] = + notOnInit ? function(cm, val, old) {if (old != Init) handle(cm, val, old);} : handle; + } + + var Init = CodeMirror.Init = {toString: function(){return "CodeMirror.Init";}}; + + // These two are, on init, called from the constructor because they + // have to be initialized before the editor can start at all. + option("value", "", function(cm, val) {cm.setValue(val);}, true); + option("mode", null, loadMode, true); + + option("indentUnit", 2, loadMode, true); + option("indentWithTabs", false); + option("smartIndent", true); + option("tabSize", 4, function(cm) { + loadMode(cm); + clearCaches(cm); + updateDisplay(cm, true); + }, true); + option("electricChars", true); + option("rtlMoveVisually", !windows); + + option("theme", "default", function(cm) { + themeChanged(cm); + guttersChanged(cm); + }, true); + option("keyMap", "default", keyMapChanged); + option("extraKeys", null); + + option("onKeyEvent", null); + option("onDragEvent", null); + + option("lineWrapping", false, wrappingChanged, true); + option("gutters", [], function(cm) { + setGuttersForLineNumbers(cm.options); + guttersChanged(cm); + }, true); + option("fixedGutter", true, function(cm, val) { + cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0"; + cm.refresh(); + }, true); + option("lineNumbers", false, function(cm) { + setGuttersForLineNumbers(cm.options); + guttersChanged(cm); + }, true); + option("firstLineNumber", 1, guttersChanged, true); + option("lineNumberFormatter", function(integer) {return integer;}, guttersChanged, true); + option("showCursorWhenSelecting", false, updateSelection, true); + + option("readOnly", false, function(cm, val) { + if (val == "nocursor") {onBlur(cm); cm.display.input.blur();} + else if (!val) resetInput(cm, true); + }); + option("dragDrop", true); + + option("cursorBlinkRate", 530); + option("cursorHeight", 1); + option("workTime", 100); + option("workDelay", 100); + option("flattenSpans", true); + option("pollInterval", 100); + option("undoDepth", 40); + option("viewportMargin", 10, function(cm){cm.refresh();}, true); + + option("tabindex", null, function(cm, val) { + cm.display.input.tabIndex = val || ""; + }); + option("autofocus", null); + + // MODE DEFINITION AND QUERYING + + // Known modes, by name and by MIME + var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {}; + + CodeMirror.defineMode = function(name, mode) { + if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name; + if (arguments.length > 2) { + mode.dependencies = []; + for (var i = 2; i < arguments.length; ++i) mode.dependencies.push(arguments[i]); + } + modes[name] = mode; + }; + + CodeMirror.defineMIME = function(mime, spec) { + mimeModes[mime] = spec; + }; + + CodeMirror.resolveMode = function(spec) { + if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) + spec = mimeModes[spec]; + else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) + return CodeMirror.resolveMode("application/xml"); + if (typeof spec == "string") return {name: spec}; + else return spec || {name: "null"}; + }; + + CodeMirror.getMode = function(options, spec) { + spec = CodeMirror.resolveMode(spec); + var mfactory = modes[spec.name]; + if (!mfactory) return CodeMirror.getMode(options, "text/plain"); + var modeObj = mfactory(options, spec); + if (modeExtensions.hasOwnProperty(spec.name)) { + var exts = modeExtensions[spec.name]; + for (var prop in exts) { + if (!exts.hasOwnProperty(prop)) continue; + if (modeObj.hasOwnProperty(prop)) modeObj["_" + prop] = modeObj[prop]; + modeObj[prop] = exts[prop]; + } + } + modeObj.name = spec.name; + return modeObj; + }; + + CodeMirror.defineMode("null", function() { + return {token: function(stream) {stream.skipToEnd();}}; + }); + CodeMirror.defineMIME("text/plain", "null"); + + var modeExtensions = CodeMirror.modeExtensions = {}; + CodeMirror.extendMode = function(mode, properties) { + var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {}); + for (var prop in properties) if (properties.hasOwnProperty(prop)) + exts[prop] = properties[prop]; + }; + + // EXTENSIONS + + CodeMirror.defineExtension = function(name, func) { + CodeMirror.prototype[name] = func; + }; + + CodeMirror.defineOption = option; + + var initHooks = []; + CodeMirror.defineInitHook = function(f) {initHooks.push(f);}; + + // MODE STATE HANDLING + + // Utility functions for working with state. Exported because modes + // sometimes need to do this. + function copyState(mode, state) { + if (state === true) return state; + if (mode.copyState) return mode.copyState(state); + var nstate = {}; + for (var n in state) { + var val = state[n]; + if (val instanceof Array) val = val.concat([]); + nstate[n] = val; + } + return nstate; + } + CodeMirror.copyState = copyState; + + function startState(mode, a1, a2) { + return mode.startState ? mode.startState(a1, a2) : true; + } + CodeMirror.startState = startState; + + CodeMirror.innerMode = function(mode, state) { + while (mode.innerMode) { + var info = mode.innerMode(state); + state = info.state; + mode = info.mode; + } + return info || {mode: mode, state: state}; + }; + + // STANDARD COMMANDS + + var commands = CodeMirror.commands = { + selectAll: function(cm) {cm.setSelection({line: 0, ch: 0}, {line: cm.lineCount() - 1});}, + killLine: function(cm) { + var from = cm.getCursor(true), to = cm.getCursor(false), sel = !posEq(from, to); + if (!sel && cm.getLine(from.line).length == from.ch) + cm.replaceRange("", from, {line: from.line + 1, ch: 0}, "delete"); + else cm.replaceRange("", from, sel ? to : {line: from.line}, "delete"); + }, + deleteLine: function(cm) { + var l = cm.getCursor().line; + cm.replaceRange("", {line: l, ch: 0}, {line: l}, "delete"); + }, + undo: function(cm) {cm.undo();}, + redo: function(cm) {cm.redo();}, + goDocStart: function(cm) {cm.extendSelection({line: 0, ch: 0});}, + goDocEnd: function(cm) {cm.extendSelection({line: cm.lineCount() - 1});}, + goLineStart: function(cm) { + cm.extendSelection(lineStart(cm, cm.getCursor().line)); + }, + goLineStartSmart: function(cm) { + var cur = cm.getCursor(), start = lineStart(cm, cur.line); + var line = cm.getLineHandle(start.line); + var order = getOrder(line); + if (!order || order[0].level == 0) { + var firstNonWS = Math.max(0, line.text.search(/\S/)); + var inWS = cur.line == start.line && cur.ch <= firstNonWS && cur.ch; + cm.extendSelection({line: start.line, ch: inWS ? 0 : firstNonWS}); + } else cm.extendSelection(start); + }, + goLineEnd: function(cm) { + cm.extendSelection(lineEnd(cm, cm.getCursor().line)); + }, + goLineUp: function(cm) {cm.moveV(-1, "line");}, + goLineDown: function(cm) {cm.moveV(1, "line");}, + goPageUp: function(cm) {cm.moveV(-1, "page");}, + goPageDown: function(cm) {cm.moveV(1, "page");}, + goCharLeft: function(cm) {cm.moveH(-1, "char");}, + goCharRight: function(cm) {cm.moveH(1, "char");}, + goColumnLeft: function(cm) {cm.moveH(-1, "column");}, + goColumnRight: function(cm) {cm.moveH(1, "column");}, + goWordLeft: function(cm) {cm.moveH(-1, "word");}, + goWordRight: function(cm) {cm.moveH(1, "word");}, + delCharBefore: function(cm) {cm.deleteH(-1, "char");}, + delCharAfter: function(cm) {cm.deleteH(1, "char");}, + delWordBefore: function(cm) {cm.deleteH(-1, "word");}, + delWordAfter: function(cm) {cm.deleteH(1, "word");}, + indentAuto: function(cm) {cm.indentSelection("smart");}, + indentMore: function(cm) {cm.indentSelection("add");}, + indentLess: function(cm) {cm.indentSelection("subtract");}, + insertTab: function(cm) {cm.replaceSelection("\t", "end", "input");}, + defaultTab: function(cm) { + if (cm.somethingSelected()) cm.indentSelection("add"); + else cm.replaceSelection("\t", "end", "input"); + }, + transposeChars: function(cm) { + var cur = cm.getCursor(), line = cm.getLine(cur.line); + if (cur.ch > 0 && cur.ch < line.length - 1) + cm.replaceRange(line.charAt(cur.ch) + line.charAt(cur.ch - 1), + {line: cur.line, ch: cur.ch - 1}, {line: cur.line, ch: cur.ch + 1}); + }, + newlineAndIndent: function(cm) { + operation(cm, function() { + cm.replaceSelection("\n", "end", "input"); + cm.indentLine(cm.getCursor().line, null, true); + })(); + }, + toggleOverwrite: function(cm) {cm.toggleOverwrite();} + }; + + // STANDARD KEYMAPS + + var keyMap = CodeMirror.keyMap = {}; + keyMap.basic = { + "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown", + "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown", + "Delete": "delCharAfter", "Backspace": "delCharBefore", "Tab": "defaultTab", "Shift-Tab": "indentAuto", + "Enter": "newlineAndIndent", "Insert": "toggleOverwrite" + }; + // Note that the save and find-related commands aren't defined by + // default. Unknown commands are simply ignored. + keyMap.pcDefault = { + "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo", + "Ctrl-Home": "goDocStart", "Alt-Up": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Down": "goDocEnd", + "Ctrl-Left": "goWordLeft", "Ctrl-Right": "goWordRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd", + "Ctrl-Backspace": "delWordBefore", "Ctrl-Delete": "delWordAfter", "Ctrl-S": "save", "Ctrl-F": "find", + "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll", + "Ctrl-[": "indentLess", "Ctrl-]": "indentMore", + fallthrough: "basic" + }; + keyMap.macDefault = { + "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo", + "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goWordLeft", + "Alt-Right": "goWordRight", "Cmd-Left": "goLineStart", "Cmd-Right": "goLineEnd", "Alt-Backspace": "delWordBefore", + "Ctrl-Alt-Backspace": "delWordAfter", "Alt-Delete": "delWordAfter", "Cmd-S": "save", "Cmd-F": "find", + "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll", + "Cmd-[": "indentLess", "Cmd-]": "indentMore", + fallthrough: ["basic", "emacsy"] + }; + keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault; + keyMap.emacsy = { + "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown", + "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd", + "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore", + "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars" + }; + + // KEYMAP DISPATCH + + function getKeyMap(val) { + if (typeof val == "string") return keyMap[val]; + else return val; + } + + function lookupKey(name, maps, handle, stop) { + function lookup(map) { + map = getKeyMap(map); + var found = map[name]; + if (found === false) { + if (stop) stop(); + return true; + } + if (found != null && handle(found)) return true; + if (map.nofallthrough) { + if (stop) stop(); + return true; + } + var fallthrough = map.fallthrough; + if (fallthrough == null) return false; + if (Object.prototype.toString.call(fallthrough) != "[object Array]") + return lookup(fallthrough); + for (var i = 0, e = fallthrough.length; i < e; ++i) { + if (lookup(fallthrough[i])) return true; + } + return false; + } + + for (var i = 0; i < maps.length; ++i) + if (lookup(maps[i])) return true; + } + function isModifierKey(event) { + var name = keyNames[e_prop(event, "keyCode")]; + return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod"; + } + CodeMirror.isModifierKey = isModifierKey; + + // FROMTEXTAREA + + CodeMirror.fromTextArea = function(textarea, options) { + if (!options) options = {}; + options.value = textarea.value; + if (!options.tabindex && textarea.tabindex) + options.tabindex = textarea.tabindex; + // Set autofocus to true if this textarea is focused, or if it has + // autofocus and no other element is focused. + if (options.autofocus == null) { + var hasFocus = document.body; + // doc.activeElement occasionally throws on IE + try { hasFocus = document.activeElement; } catch(e) {} + options.autofocus = hasFocus == textarea || + textarea.getAttribute("autofocus") != null && hasFocus == document.body; + } + + function save() {textarea.value = cm.getValue();} + if (textarea.form) { + // Deplorable hack to make the submit method do the right thing. + on(textarea.form, "submit", save); + var form = textarea.form, realSubmit = form.submit; + try { + form.submit = function wrappedSubmit() { + save(); + form.submit = realSubmit; + form.submit(); + form.submit = wrappedSubmit; + }; + } catch(e) {} + } + + textarea.style.display = "none"; + var cm = CodeMirror(function(node) { + textarea.parentNode.insertBefore(node, textarea.nextSibling); + }, options); + cm.save = save; + cm.getTextArea = function() { return textarea; }; + cm.toTextArea = function() { + save(); + textarea.parentNode.removeChild(cm.getWrapperElement()); + textarea.style.display = ""; + if (textarea.form) { + off(textarea.form, "submit", save); + if (typeof textarea.form.submit == "function") + textarea.form.submit = realSubmit; + } + }; + return cm; + }; + + // STRING STREAM + + // Fed to the mode parsers, provides helper functions to make + // parsers more succinct. + + // The character stream used by a mode's parser. + function StringStream(string, tabSize) { + this.pos = this.start = 0; + this.string = string; + this.tabSize = tabSize || 8; + } + + StringStream.prototype = { + eol: function() {return this.pos >= this.string.length;}, + sol: function() {return this.pos == 0;}, + peek: function() {return this.string.charAt(this.pos) || undefined;}, + next: function() { + if (this.pos < this.string.length) + return this.string.charAt(this.pos++); + }, + eat: function(match) { + var ch = this.string.charAt(this.pos); + if (typeof match == "string") var ok = ch == match; + else var ok = ch && (match.test ? match.test(ch) : match(ch)); + if (ok) {++this.pos; return ch;} + }, + eatWhile: function(match) { + var start = this.pos; + while (this.eat(match)){} + return this.pos > start; + }, + eatSpace: function() { + var start = this.pos; + while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos; + return this.pos > start; + }, + skipToEnd: function() {this.pos = this.string.length;}, + skipTo: function(ch) { + var found = this.string.indexOf(ch, this.pos); + if (found > -1) {this.pos = found; return true;} + }, + backUp: function(n) {this.pos -= n;}, + column: function() {return countColumn(this.string, this.start, this.tabSize);}, + indentation: function() {return countColumn(this.string, null, this.tabSize);}, + match: function(pattern, consume, caseInsensitive) { + if (typeof pattern == "string") { + var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;}; + if (cased(this.string).indexOf(cased(pattern), this.pos) == this.pos) { + if (consume !== false) this.pos += pattern.length; + return true; + } + } else { + var match = this.string.slice(this.pos).match(pattern); + if (match && match.index > 0) return null; + if (match && consume !== false) this.pos += match[0].length; + return match; + } + }, + current: function(){return this.string.slice(this.start, this.pos);} + }; + CodeMirror.StringStream = StringStream; + + // TEXTMARKERS + + function TextMarker(cm, type) { + this.lines = []; + this.type = type; + this.cm = cm; + } + CodeMirror.TextMarker = TextMarker; + + TextMarker.prototype.clear = function() { + if (this.explicitlyCleared) return; + startOperation(this.cm); + var view = this.cm.view, min = null, max = null; + for (var i = 0; i < this.lines.length; ++i) { + var line = this.lines[i]; + var span = getMarkedSpanFor(line.markedSpans, this); + if (span.to != null) max = lineNo(line); + line.markedSpans = removeMarkedSpan(line.markedSpans, span); + if (span.from != null) + min = lineNo(line); + else if (this.collapsed && !lineIsHidden(line)) + updateLineHeight(line, textHeight(this.cm.display)); + } + if (this.collapsed && !this.cm.options.lineWrapping) for (var i = 0; i < this.lines.length; ++i) { + var visual = visualLine(view.doc, this.lines[i]), len = lineLength(view.doc, visual); + if (len > view.maxLineLength) { + view.maxLine = visual; + view.maxLineLength = len; + view.maxLineChanged = true; + } + } + + if (min != null) regChange(this.cm, min, max + 1); + this.lines.length = 0; + this.explicitlyCleared = true; + if (this.collapsed && this.cm.view.cantEdit) { + this.cm.view.cantEdit = false; + reCheckSelection(this.cm); + } + endOperation(this.cm); + signalLater(this.cm, this, "clear"); + }; + + TextMarker.prototype.find = function() { + var from, to; + for (var i = 0; i < this.lines.length; ++i) { + var line = this.lines[i]; + var span = getMarkedSpanFor(line.markedSpans, this); + if (span.from != null || span.to != null) { + var found = lineNo(line); + if (span.from != null) from = {line: found, ch: span.from}; + if (span.to != null) to = {line: found, ch: span.to}; + } + } + if (this.type == "bookmark") return from; + return from && {from: from, to: to}; + }; + + TextMarker.prototype.getOptions = function(copyWidget) { + var repl = this.replacedWith; + return {className: this.className, + inclusiveLeft: this.inclusiveLeft, inclusiveRight: this.inclusiveRight, + atomic: this.atomic, + collapsed: this.collapsed, + clearOnEnter: this.clearOnEnter, + replacedWith: copyWidget ? repl && repl.cloneNode(true) : repl, + readOnly: this.readOnly, + startStyle: this.startStyle, endStyle: this.endStyle}; + }; + + function markText(cm, from, to, options, type) { + var doc = cm.view.doc; + var marker = new TextMarker(cm, type); + if (type == "range" && !posLess(from, to)) return marker; + if (options) for (var opt in options) if (options.hasOwnProperty(opt)) + marker[opt] = options[opt]; + if (marker.replacedWith) { + marker.collapsed = true; + marker.replacedWith = elt("span", [marker.replacedWith], "CodeMirror-widget"); + } + if (marker.collapsed) sawCollapsedSpans = true; + + var curLine = from.line, size = 0, collapsedAtStart, collapsedAtEnd; + doc.iter(curLine, to.line + 1, function(line) { + if (marker.collapsed && !cm.options.lineWrapping && visualLine(doc, line) == cm.view.maxLine) + cm.curOp.updateMaxLine = true; + var span = {from: null, to: null, marker: marker}; + size += line.text.length; + if (curLine == from.line) {span.from = from.ch; size -= from.ch;} + if (curLine == to.line) {span.to = to.ch; size -= line.text.length - to.ch;} + if (marker.collapsed) { + if (curLine == to.line) collapsedAtEnd = collapsedSpanAt(line, to.ch); + if (curLine == from.line) collapsedAtStart = collapsedSpanAt(line, from.ch); + else updateLineHeight(line, 0); + } + addMarkedSpan(line, span); + ++curLine; + }); + if (marker.collapsed) doc.iter(from.line, to.line + 1, function(line) { + if (lineIsHidden(line)) updateLineHeight(line, 0); + }); + + if (marker.readOnly) { + sawReadOnlySpans = true; + if (cm.view.history.done.length || cm.view.history.undone.length) + cm.clearHistory(); + } + if (marker.collapsed) { + if (collapsedAtStart != collapsedAtEnd) + throw new Error("Inserting collapsed marker overlapping an existing one"); + marker.size = size; + marker.atomic = true; + } + if (marker.className || marker.startStyle || marker.endStyle || marker.collapsed) + regChange(cm, from.line, to.line + 1); + if (marker.atomic) reCheckSelection(cm); + return marker; + } + + // TEXTMARKER SPANS + + function getMarkedSpanFor(spans, marker) { + if (spans) for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if (span.marker == marker) return span; + } + } + function removeMarkedSpan(spans, span) { + for (var r, i = 0; i < spans.length; ++i) + if (spans[i] != span) (r || (r = [])).push(spans[i]); + return r; + } + function addMarkedSpan(line, span) { + line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span]; + span.marker.lines.push(line); + } + + function markedSpansBefore(old, startCh) { + if (old) for (var i = 0, nw; i < old.length; ++i) { + var span = old[i], marker = span.marker; + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh); + if (startsBefore || marker.type == "bookmark" && span.from == startCh) { + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh); + (nw || (nw = [])).push({from: span.from, + to: endsAfter ? null : span.to, + marker: marker}); + } + } + return nw; + } + + function markedSpansAfter(old, startCh, endCh) { + if (old) for (var i = 0, nw; i < old.length; ++i) { + var span = old[i], marker = span.marker; + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh); + if (endsAfter || marker.type == "bookmark" && span.from == endCh && span.from != startCh) { + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh); + (nw || (nw = [])).push({from: startsBefore ? null : span.from - endCh, + to: span.to == null ? null : span.to - endCh, + marker: marker}); + } + } + return nw; + } + + function updateMarkedSpans(oldFirst, oldLast, startCh, endCh, newText) { + if (!oldFirst && !oldLast) return newText; + // Get the spans that 'stick out' on both sides + var first = markedSpansBefore(oldFirst, startCh); + var last = markedSpansAfter(oldLast, startCh, endCh); + + // Next, merge those two ends + var sameLine = newText.length == 1, offset = lst(newText).length + (sameLine ? startCh : 0); + if (first) { + // Fix up .to properties of first + for (var i = 0; i < first.length; ++i) { + var span = first[i]; + if (span.to == null) { + var found = getMarkedSpanFor(last, span.marker); + if (!found) span.to = startCh; + else if (sameLine) span.to = found.to == null ? null : found.to + offset; + } + } + } + if (last) { + // Fix up .from in last (or move them into first in case of sameLine) + for (var i = 0; i < last.length; ++i) { + var span = last[i]; + if (span.to != null) span.to += offset; + if (span.from == null) { + var found = getMarkedSpanFor(first, span.marker); + if (!found) { + span.from = offset; + if (sameLine) (first || (first = [])).push(span); + } + } else { + span.from += offset; + if (sameLine) (first || (first = [])).push(span); + } + } + } + + var newMarkers = [newHL(newText[0], first)]; + if (!sameLine) { + // Fill gap with whole-line-spans + var gap = newText.length - 2, gapMarkers; + if (gap > 0 && first) + for (var i = 0; i < first.length; ++i) + if (first[i].to == null) + (gapMarkers || (gapMarkers = [])).push({from: null, to: null, marker: first[i].marker}); + for (var i = 0; i < gap; ++i) + newMarkers.push(newHL(newText[i+1], gapMarkers)); + newMarkers.push(newHL(lst(newText), last)); + } + return newMarkers; + } + + function removeReadOnlyRanges(doc, from, to) { + var markers = null; + doc.iter(from.line, to.line + 1, function(line) { + if (line.markedSpans) for (var i = 0; i < line.markedSpans.length; ++i) { + var mark = line.markedSpans[i].marker; + if (mark.readOnly && (!markers || indexOf(markers, mark) == -1)) + (markers || (markers = [])).push(mark); + } + }); + if (!markers) return null; + var parts = [{from: from, to: to}]; + for (var i = 0; i < markers.length; ++i) { + var m = markers[i].find(); + for (var j = 0; j < parts.length; ++j) { + var p = parts[j]; + if (!posLess(m.from, p.to) || posLess(m.to, p.from)) continue; + var newParts = [j, 1]; + if (posLess(p.from, m.from)) newParts.push({from: p.from, to: m.from}); + if (posLess(m.to, p.to)) newParts.push({from: m.to, to: p.to}); + parts.splice.apply(parts, newParts); + j += newParts.length - 1; + } + } + return parts; + } + + function collapsedSpanAt(line, ch) { + var sps = sawCollapsedSpans && line.markedSpans, found; + if (sps) for (var sp, i = 0; i < sps.length; ++i) { + sp = sps[i]; + if (!sp.marker.collapsed) continue; + if ((sp.from == null || sp.from < ch) && + (sp.to == null || sp.to > ch) && + (!found || found.width < sp.marker.width)) + found = sp.marker; + } + return found; + } + function collapsedSpanAtStart(line) { return collapsedSpanAt(line, -1); } + function collapsedSpanAtEnd(line) { return collapsedSpanAt(line, line.text.length + 1); } + + function visualLine(doc, line) { + var merged; + while (merged = collapsedSpanAtStart(line)) + line = getLine(doc, merged.find().from.line); + return line; + } + + function lineIsHidden(line) { + var sps = sawCollapsedSpans && line.markedSpans; + if (sps) for (var sp, i = 0; i < sps.length; ++i) { + sp = sps[i]; + if (!sp.marker.collapsed) continue; + if (sp.from == null) return true; + if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(line, sp)) + return true; + } + } + function lineIsHiddenInner(line, span) { + if (span.to == null) { + var end = span.marker.find().to, endLine = getLine(lineDoc(line), end.line); + return lineIsHiddenInner(endLine, getMarkedSpanFor(endLine.markedSpans, span.marker)); + } + if (span.marker.inclusiveRight && span.to == line.text.length) + return true; + for (var sp, i = 0; i < line.markedSpans.length; ++i) { + sp = line.markedSpans[i]; + if (sp.marker.collapsed && sp.from == span.to && + (sp.marker.inclusiveLeft || span.marker.inclusiveRight) && + lineIsHiddenInner(line, sp)) return true; + } + } + + // hl stands for history-line, a data structure that can be either a + // string (line without markers) or a {text, markedSpans} object. + function hlText(val) { return typeof val == "string" ? val : val.text; } + function hlSpans(val) { + if (typeof val == "string") return null; + var spans = val.markedSpans, out = null; + for (var i = 0; i < spans.length; ++i) { + if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i); } + else if (out) out.push(spans[i]); + } + return !out ? spans : out.length ? out : null; + } + function newHL(text, spans) { return spans ? {text: text, markedSpans: spans} : text; } + + function detachMarkedSpans(line) { + var spans = line.markedSpans; + if (!spans) return; + for (var i = 0; i < spans.length; ++i) { + var lines = spans[i].marker.lines; + var ix = indexOf(lines, line); + lines.splice(ix, 1); + } + line.markedSpans = null; + } + + function attachMarkedSpans(line, spans) { + if (!spans) return; + for (var i = 0; i < spans.length; ++i) + spans[i].marker.lines.push(line); + line.markedSpans = spans; + } + + // LINE WIDGETS + + var LineWidget = CodeMirror.LineWidget = function(cm, node, options) { + for (var opt in options) if (options.hasOwnProperty(opt)) + this[opt] = options[opt]; + this.cm = cm; + this.node = node; + }; + function widgetOperation(f) { + return function() { + startOperation(this.cm); + try {var result = f.apply(this, arguments);} + finally {endOperation(this.cm);} + return result; + }; + } + LineWidget.prototype.clear = widgetOperation(function() { + var ws = this.line.widgets, no = lineNo(this.line); + if (no == null || !ws) return; + for (var i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1); + updateLineHeight(this.line, Math.max(0, this.line.height - widgetHeight(this))); + regChange(this.cm, no, no + 1); + }); + LineWidget.prototype.changed = widgetOperation(function() { + var oldH = this.height; + this.height = null; + var diff = widgetHeight(this) - oldH; + if (!diff) return; + updateLineHeight(this.line, this.line.height + diff); + var no = lineNo(this.line); + regChange(this.cm, no, no + 1); + }); + + function widgetHeight(widget) { + if (widget.height != null) return widget.height; + if (!widget.node.parentNode || widget.node.parentNode.nodeType != 1) + removeChildrenAndAdd(widget.cm.display.measure, elt("div", [widget.node], null, "position: relative")); + return widget.height = widget.node.offsetHeight; + } + + function addLineWidget(cm, handle, node, options) { + var widget = new LineWidget(cm, node, options); + if (widget.noHScroll) cm.display.alignWidgets = true; + changeLine(cm, handle, function(line) { + (line.widgets || (line.widgets = [])).push(widget); + widget.line = line; + if (!lineIsHidden(line) || widget.showIfHidden) { + var aboveVisible = heightAtLine(cm, line) < cm.display.scroller.scrollTop; + updateLineHeight(line, line.height + widgetHeight(widget)); + if (aboveVisible) + setTimeout(function() {cm.display.scroller.scrollTop += widget.height;}); + } + return true; + }); + return widget; + } + + // LINE DATA STRUCTURE + + // Line objects. These hold state related to a line, including + // highlighting info (the styles array). + function makeLine(text, markedSpans, height) { + var line = {text: text, height: height}; + attachMarkedSpans(line, markedSpans); + if (lineIsHidden(line)) line.height = 0; + return line; + } + + function updateLine(cm, line, text, markedSpans) { + line.text = text; + if (line.stateAfter) line.stateAfter = null; + if (line.styles) line.styles = null; + if (line.order != null) line.order = null; + detachMarkedSpans(line); + attachMarkedSpans(line, markedSpans); + if (lineIsHidden(line)) line.height = 0; + else if (!line.height) line.height = textHeight(cm.display); + signalLater(cm, line, "change"); + } + + function cleanUpLine(line) { + line.parent = null; + detachMarkedSpans(line); + } + + // Run the given mode's parser over a line, update the styles + // array, which contains alternating fragments of text and CSS + // classes. + function runMode(cm, text, mode, state, f) { + var flattenSpans = cm.options.flattenSpans; + var curText = "", curStyle = null; + var stream = new StringStream(text, cm.options.tabSize); + if (text == "" && mode.blankLine) mode.blankLine(state); + while (!stream.eol()) { + var style = mode.token(stream, state); + if (stream.pos > 5000) { + flattenSpans = false; + // Webkit seems to refuse to render text nodes longer than 57444 characters + stream.pos = Math.min(text.length, stream.start + 50000); + style = null; + } + var substr = stream.current(); + stream.start = stream.pos; + if (!flattenSpans || curStyle != style) { + if (curText) f(curText, curStyle); + curText = substr; curStyle = style; + } else curText = curText + substr; + } + if (curText) f(curText, curStyle); + } + + function highlightLine(cm, line, state) { + // A styles array always starts with a number identifying the + // mode/overlays that it is based on (for easy invalidation). + var st = [cm.view.modeGen]; + // Compute the base array of styles + runMode(cm, line.text, cm.view.mode, state, function(txt, style) {st.push(txt, style);}); + + // Run overlays, adjust style array. + for (var o = 0; o < cm.view.overlays.length; ++o) { + var overlay = cm.view.overlays[o], i = 1; + runMode(cm, line.text, overlay.mode, true, function(txt, style) { + var start = i, len = txt.length; + // Ensure there's a token end at the current position, and that i points at it + while (len) { + var cur = st[i], len_ = cur.length; + if (len_ <= len) { + len -= len_; + } else { + st.splice(i, 1, cur.slice(0, len), st[i+1], cur.slice(len)); + len = 0; + } + i += 2; + } + if (!style) return; + if (overlay.opaque) { + st.splice(start, i - start, txt, style); + i = start + 2; + } else { + for (; start < i; start += 2) { + var cur = st[start+1]; + st[start+1] = cur ? cur + " " + style : style; + } + } + }); + } + + return st; + } + + function getLineStyles(cm, line) { + if (!line.styles || line.styles[0] != cm.view.modeGen) + line.styles = highlightLine(cm, line, line.stateAfter = getStateBefore(cm, lineNo(line))); + return line.styles; + } + + // Lightweight form of highlight -- proceed over this line and + // update state, but don't save a style array. + function processLine(cm, line, state) { + var mode = cm.view.mode; + var stream = new StringStream(line.text, cm.options.tabSize); + if (line.text == "" && mode.blankLine) mode.blankLine(state); + while (!stream.eol() && stream.pos <= 5000) { + mode.token(stream, state); + stream.start = stream.pos; + } + } + + var styleToClassCache = {}; + function styleToClass(style) { + if (!style) return null; + return styleToClassCache[style] || + (styleToClassCache[style] = "cm-" + style.replace(/ +/g, " cm-")); + } + + function lineContent(cm, realLine, measure) { + var merged, line = realLine, lineBefore, sawBefore, simple = true; + while (merged = collapsedSpanAtStart(line)) { + simple = false; + line = getLine(cm.view.doc, merged.find().from.line); + if (!lineBefore) lineBefore = line; + } + + var builder = {pre: elt("pre"), col: 0, pos: 0, display: !measure, + measure: null, addedOne: false, cm: cm}; + if (line.textClass) builder.pre.className = line.textClass; + + do { + builder.measure = line == realLine && measure; + builder.pos = 0; + builder.addToken = builder.measure ? buildTokenMeasure : buildToken; + if (measure && sawBefore && line != realLine && !builder.addedOne) { + measure[0] = builder.pre.appendChild(zeroWidthElement(cm.display.measure)); + builder.addedOne = true; + } + var next = insertLineContent(line, builder, getLineStyles(cm, line)); + sawBefore = line == lineBefore; + if (next) { + line = getLine(cm.view.doc, next.to.line); + simple = false; + } + } while (next); + + if (measure && !builder.addedOne) + measure[0] = builder.pre.appendChild(simple ? elt("span", "\u00a0") : zeroWidthElement(cm.display.measure)); + if (!builder.pre.firstChild && !lineIsHidden(realLine)) + builder.pre.appendChild(document.createTextNode("\u00a0")); + + return builder.pre; + } + + var tokenSpecialChars = /[\t\u0000-\u0019\u200b\u2028\u2029\uFEFF]/g; + function buildToken(builder, text, style, startStyle, endStyle) { + if (!text) return; + if (!tokenSpecialChars.test(text)) { + builder.col += text.length; + var content = document.createTextNode(text); + } else { + var content = document.createDocumentFragment(), pos = 0; + while (true) { + tokenSpecialChars.lastIndex = pos; + var m = tokenSpecialChars.exec(text); + var skipped = m ? m.index - pos : text.length - pos; + if (skipped) { + content.appendChild(document.createTextNode(text.slice(pos, pos + skipped))); + builder.col += skipped; + } + if (!m) break; + pos += skipped + 1; + if (m[0] == "\t") { + var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize; + content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab")); + builder.col += tabWidth; + } else { + var token = elt("span", "\u2022", "cm-invalidchar"); + token.title = "\\u" + m[0].charCodeAt(0).toString(16); + content.appendChild(token); + builder.col += 1; + } + } + } + if (style || startStyle || endStyle || builder.measure) { + var fullStyle = style || ""; + if (startStyle) fullStyle += startStyle; + if (endStyle) fullStyle += endStyle; + return builder.pre.appendChild(elt("span", [content], fullStyle)); + } + builder.pre.appendChild(content); + } + + function buildTokenMeasure(builder, text, style, startStyle, endStyle) { + for (var i = 0; i < text.length; ++i) { + if (i && i < text.length && + builder.cm.options.lineWrapping && + spanAffectsWrapping.test(text.slice(i - 1, i + 1))) + builder.pre.appendChild(elt("wbr")); + builder.measure[builder.pos++] = + buildToken(builder, text.charAt(i), style, + i == 0 && startStyle, i == text.length - 1 && endStyle); + } + if (text.length) builder.addedOne = true; + } + + function buildCollapsedSpan(builder, size, widget) { + if (widget) { + if (!builder.display) widget = widget.cloneNode(true); + builder.pre.appendChild(widget); + if (builder.measure && size) { + builder.measure[builder.pos] = widget; + builder.addedOne = true; + } + } + builder.pos += size; + } + + // Outputs a number of spans to make up a line, taking highlighting + // and marked text into account. + function insertLineContent(line, builder, styles) { + var spans = line.markedSpans; + if (!spans) { + for (var i = 1; i < styles.length; i+=2) + builder.addToken(builder, styles[i], styleToClass(styles[i+1])); + return; + } + + var allText = line.text, len = allText.length; + var pos = 0, i = 1, text = "", style; + var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed; + for (;;) { + if (nextChange == pos) { // Update current marker set + spanStyle = spanEndStyle = spanStartStyle = ""; + collapsed = null; nextChange = Infinity; + var foundBookmark = null; + for (var j = 0; j < spans.length; ++j) { + var sp = spans[j], m = sp.marker; + if (sp.from <= pos && (sp.to == null || sp.to > pos)) { + if (sp.to != null && nextChange > sp.to) { nextChange = sp.to; spanEndStyle = ""; } + if (m.className) spanStyle += " " + m.className; + if (m.startStyle && sp.from == pos) spanStartStyle += " " + m.startStyle; + if (m.endStyle && sp.to == nextChange) spanEndStyle += " " + m.endStyle; + if (m.collapsed && (!collapsed || collapsed.marker.width < m.width)) + collapsed = sp; + } else if (sp.from > pos && nextChange > sp.from) { + nextChange = sp.from; + } + if (m.type == "bookmark" && sp.from == pos && m.replacedWith) + foundBookmark = m.replacedWith; + } + if (collapsed && (collapsed.from || 0) == pos) { + buildCollapsedSpan(builder, (collapsed.to == null ? len : collapsed.to) - pos, + collapsed.from != null && collapsed.marker.replacedWith); + if (collapsed.to == null) return collapsed.marker.find(); + } + if (foundBookmark && !collapsed) buildCollapsedSpan(builder, 0, foundBookmark); + } + if (pos >= len) break; + + var upto = Math.min(len, nextChange); + while (true) { + if (text) { + var end = pos + text.length; + if (!collapsed) { + var tokenText = end > upto ? text.slice(0, upto - pos) : text; + builder.addToken(builder, tokenText, style + spanStyle, + spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : ""); + } + if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;} + pos = end; + spanStartStyle = ""; + } + text = styles[i++]; style = styleToClass(styles[i++]); + } + } + } + + // DOCUMENT DATA STRUCTURE + + function LeafChunk(lines) { + this.lines = lines; + this.parent = null; + for (var i = 0, e = lines.length, height = 0; i < e; ++i) { + lines[i].parent = this; + height += lines[i].height; + } + this.height = height; + } + + LeafChunk.prototype = { + chunkSize: function() { return this.lines.length; }, + remove: function(at, n, cm) { + for (var i = at, e = at + n; i < e; ++i) { + var line = this.lines[i]; + this.height -= line.height; + cleanUpLine(line); + signalLater(cm, line, "delete"); + } + this.lines.splice(at, n); + }, + collapse: function(lines) { + lines.splice.apply(lines, [lines.length, 0].concat(this.lines)); + }, + insertHeight: function(at, lines, height) { + this.height += height; + this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at)); + for (var i = 0, e = lines.length; i < e; ++i) lines[i].parent = this; + }, + iterN: function(at, n, op) { + for (var e = at + n; at < e; ++at) + if (op(this.lines[at])) return true; + } + }; + + function BranchChunk(children) { + this.children = children; + var size = 0, height = 0; + for (var i = 0, e = children.length; i < e; ++i) { + var ch = children[i]; + size += ch.chunkSize(); height += ch.height; + ch.parent = this; + } + this.size = size; + this.height = height; + this.parent = null; + } + + BranchChunk.prototype = { + chunkSize: function() { return this.size; }, + remove: function(at, n, callbacks) { + this.size -= n; + for (var i = 0; i < this.children.length; ++i) { + var child = this.children[i], sz = child.chunkSize(); + if (at < sz) { + var rm = Math.min(n, sz - at), oldHeight = child.height; + child.remove(at, rm, callbacks); + this.height -= oldHeight - child.height; + if (sz == rm) { this.children.splice(i--, 1); child.parent = null; } + if ((n -= rm) == 0) break; + at = 0; + } else at -= sz; + } + if (this.size - n < 25) { + var lines = []; + this.collapse(lines); + this.children = [new LeafChunk(lines)]; + this.children[0].parent = this; + } + }, + collapse: function(lines) { + for (var i = 0, e = this.children.length; i < e; ++i) this.children[i].collapse(lines); + }, + insert: function(at, lines) { + var height = 0; + for (var i = 0, e = lines.length; i < e; ++i) height += lines[i].height; + this.insertHeight(at, lines, height); + }, + insertHeight: function(at, lines, height) { + this.size += lines.length; + this.height += height; + for (var i = 0, e = this.children.length; i < e; ++i) { + var child = this.children[i], sz = child.chunkSize(); + if (at <= sz) { + child.insertHeight(at, lines, height); + if (child.lines && child.lines.length > 50) { + while (child.lines.length > 50) { + var spilled = child.lines.splice(child.lines.length - 25, 25); + var newleaf = new LeafChunk(spilled); + child.height -= newleaf.height; + this.children.splice(i + 1, 0, newleaf); + newleaf.parent = this; + } + this.maybeSpill(); + } + break; + } + at -= sz; + } + }, + maybeSpill: function() { + if (this.children.length <= 10) return; + var me = this; + do { + var spilled = me.children.splice(me.children.length - 5, 5); + var sibling = new BranchChunk(spilled); + if (!me.parent) { // Become the parent node + var copy = new BranchChunk(me.children); + copy.parent = me; + me.children = [copy, sibling]; + me = copy; + } else { + me.size -= sibling.size; + me.height -= sibling.height; + var myIndex = indexOf(me.parent.children, me); + me.parent.children.splice(myIndex + 1, 0, sibling); + } + sibling.parent = me.parent; + } while (me.children.length > 10); + me.parent.maybeSpill(); + }, + iter: function(from, to, op) { this.iterN(from, to - from, op); }, + iterN: function(at, n, op) { + for (var i = 0, e = this.children.length; i < e; ++i) { + var child = this.children[i], sz = child.chunkSize(); + if (at < sz) { + var used = Math.min(n, sz - at); + if (child.iterN(at, used, op)) return true; + if ((n -= used) == 0) break; + at = 0; + } else at -= sz; + } + } + }; + + // LINE UTILITIES + + function getLine(chunk, n) { + while (!chunk.lines) { + for (var i = 0;; ++i) { + var child = chunk.children[i], sz = child.chunkSize(); + if (n < sz) { chunk = child; break; } + n -= sz; + } + } + return chunk.lines[n]; + } + + function updateLineHeight(line, height) { + var diff = height - line.height; + for (var n = line; n; n = n.parent) n.height += diff; + } + + function lineNo(line) { + if (line.parent == null) return null; + var cur = line.parent, no = indexOf(cur.lines, line); + for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) { + for (var i = 0;; ++i) { + if (chunk.children[i] == cur) break; + no += chunk.children[i].chunkSize(); + } + } + return no; + } + + function lineDoc(line) { + for (var d = line.parent; d.parent; d = d.parent) {} + return d; + } + + function lineAtHeight(chunk, h) { + var n = 0; + outer: do { + for (var i = 0, e = chunk.children.length; i < e; ++i) { + var child = chunk.children[i], ch = child.height; + if (h < ch) { chunk = child; continue outer; } + h -= ch; + n += child.chunkSize(); + } + return n; + } while (!chunk.lines); + for (var i = 0, e = chunk.lines.length; i < e; ++i) { + var line = chunk.lines[i], lh = line.height; + if (h < lh) break; + h -= lh; + } + return n + i; + } + + function heightAtLine(cm, lineObj) { + lineObj = visualLine(cm.view.doc, lineObj); + + var h = 0, chunk = lineObj.parent; + for (var i = 0; i < chunk.lines.length; ++i) { + var line = chunk.lines[i]; + if (line == lineObj) break; + else h += line.height; + } + for (var p = chunk.parent; p; chunk = p, p = chunk.parent) { + for (var i = 0; i < p.children.length; ++i) { + var cur = p.children[i]; + if (cur == chunk) break; + else h += cur.height; + } + } + return h; + } + + function getOrder(line) { + var order = line.order; + if (order == null) order = line.order = bidiOrdering(line.text); + return order; + } + + // HISTORY + + function makeHistory() { + return { + // Arrays of history events. Doing something adds an event to + // done and clears undo. Undoing moves events from done to + // undone, redoing moves them in the other direction. + done: [], undone: [], + // Used to track when changes can be merged into a single undo + // event + lastTime: 0, lastOp: null, lastOrigin: null, + // Used by the isClean() method + dirtyCounter: 0 + }; + } + + function addChange(cm, start, added, old, origin, fromBefore, toBefore, fromAfter, toAfter) { + var history = cm.view.history; + history.undone.length = 0; + var time = +new Date, cur = lst(history.done); + + if (cur && + (history.lastOp == cm.curOp.id || + history.lastOrigin == origin && (origin == "input" || origin == "delete") && + history.lastTime > time - 600)) { + // Merge this change into the last event + var last = lst(cur.events); + if (last.start > start + old.length || last.start + last.added < start) { + // Doesn't intersect with last sub-event, add new sub-event + cur.events.push({start: start, added: added, old: old}); + } else { + // Patch up the last sub-event + var startBefore = Math.max(0, last.start - start), + endAfter = Math.max(0, (start + old.length) - (last.start + last.added)); + for (var i = startBefore; i > 0; --i) last.old.unshift(old[i - 1]); + for (var i = endAfter; i > 0; --i) last.old.push(old[old.length - i]); + if (startBefore) last.start = start; + last.added += added - (old.length - startBefore - endAfter); + } + cur.fromAfter = fromAfter; cur.toAfter = toAfter; + } else { + // Can not be merged, start a new event. + cur = {events: [{start: start, added: added, old: old}], + fromBefore: fromBefore, toBefore: toBefore, fromAfter: fromAfter, toAfter: toAfter}; + history.done.push(cur); + while (history.done.length > cm.options.undoDepth) + history.done.shift(); + if (history.dirtyCounter < 0) + // The user has made a change after undoing past the last clean state. + // We can never get back to a clean state now until markClean() is called. + history.dirtyCounter = NaN; + else + history.dirtyCounter++; + } + history.lastTime = time; + history.lastOp = cm.curOp.id; + history.lastOrigin = origin; + } + + // EVENT OPERATORS + + function stopMethod() {e_stop(this);} + // Ensure an event has a stop method. + function addStop(event) { + if (!event.stop) event.stop = stopMethod; + return event; + } + + function e_preventDefault(e) { + if (e.preventDefault) e.preventDefault(); + else e.returnValue = false; + } + function e_stopPropagation(e) { + if (e.stopPropagation) e.stopPropagation(); + else e.cancelBubble = true; + } + function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);} + CodeMirror.e_stop = e_stop; + CodeMirror.e_preventDefault = e_preventDefault; + CodeMirror.e_stopPropagation = e_stopPropagation; + + function e_target(e) {return e.target || e.srcElement;} + function e_button(e) { + var b = e.which; + if (b == null) { + if (e.button & 1) b = 1; + else if (e.button & 2) b = 3; + else if (e.button & 4) b = 2; + } + if (mac && e.ctrlKey && b == 1) b = 3; + return b; + } + + // Allow 3rd-party code to override event properties by adding an override + // object to an event object. + function e_prop(e, prop) { + var overridden = e.override && e.override.hasOwnProperty(prop); + return overridden ? e.override[prop] : e[prop]; + } + + // EVENT HANDLING + + function on(emitter, type, f) { + if (emitter.addEventListener) + emitter.addEventListener(type, f, false); + else if (emitter.attachEvent) + emitter.attachEvent("on" + type, f); + else { + var map = emitter._handlers || (emitter._handlers = {}); + var arr = map[type] || (map[type] = []); + arr.push(f); + } + } + + function off(emitter, type, f) { + if (emitter.removeEventListener) + emitter.removeEventListener(type, f, false); + else if (emitter.detachEvent) + emitter.detachEvent("on" + type, f); + else { + var arr = emitter._handlers && emitter._handlers[type]; + if (!arr) return; + for (var i = 0; i < arr.length; ++i) + if (arr[i] == f) { arr.splice(i, 1); break; } + } + } + + function signal(emitter, type /*, values...*/) { + var arr = emitter._handlers && emitter._handlers[type]; + if (!arr) return; + var args = Array.prototype.slice.call(arguments, 2); + for (var i = 0; i < arr.length; ++i) arr[i].apply(null, args); + } + + function signalLater(cm, emitter, type /*, values...*/) { + var arr = emitter._handlers && emitter._handlers[type]; + if (!arr) return; + var args = Array.prototype.slice.call(arguments, 3), flist = cm.curOp && cm.curOp.delayedCallbacks; + function bnd(f) {return function(){f.apply(null, args);};}; + for (var i = 0; i < arr.length; ++i) + if (flist) flist.push(bnd(arr[i])); + else arr[i].apply(null, args); + } + + function hasHandler(emitter, type) { + var arr = emitter._handlers && emitter._handlers[type]; + return arr && arr.length > 0; + } + + CodeMirror.on = on; CodeMirror.off = off; CodeMirror.signal = signal; + + // MISC UTILITIES + + // Number of pixels added to scroller and sizer to hide scrollbar + var scrollerCutOff = 30; + + // Returned or thrown by various protocols to signal 'I'm not + // handling this'. + var Pass = CodeMirror.Pass = {toString: function(){return "CodeMirror.Pass";}}; + + function Delayed() {this.id = null;} + Delayed.prototype = {set: function(ms, f) {clearTimeout(this.id); this.id = setTimeout(f, ms);}}; + + // Counts the column offset in a string, taking tabs into account. + // Used mostly to find indentation. + function countColumn(string, end, tabSize) { + if (end == null) { + end = string.search(/[^\s\u00a0]/); + if (end == -1) end = string.length; + } + for (var i = 0, n = 0; i < end; ++i) { + if (string.charAt(i) == "\t") n += tabSize - (n % tabSize); + else ++n; + } + return n; + } + CodeMirror.countColumn = countColumn; + + var spaceStrs = [""]; + function spaceStr(n) { + while (spaceStrs.length <= n) + spaceStrs.push(lst(spaceStrs) + " "); + return spaceStrs[n]; + } + + function lst(arr) { return arr[arr.length-1]; } + + function selectInput(node) { + if (ios) { // Mobile Safari apparently has a bug where select() is broken. + node.selectionStart = 0; + node.selectionEnd = node.value.length; + } else node.select(); + } + + function indexOf(collection, elt) { + if (collection.indexOf) return collection.indexOf(elt); + for (var i = 0, e = collection.length; i < e; ++i) + if (collection[i] == elt) return i; + return -1; + } + + function emptyArray(size) { + for (var a = [], i = 0; i < size; ++i) a.push(undefined); + return a; + } + + function bind(f) { + var args = Array.prototype.slice.call(arguments, 1); + return function(){return f.apply(null, args);}; + } + + var nonASCIISingleCaseWordChar = /[\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc]/; + function isWordChar(ch) { + return /\w/.test(ch) || ch > "\x80" && + (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)); + } + + function isEmpty(obj) { + var c = 0; + for (var n in obj) if (obj.hasOwnProperty(n) && obj[n]) ++c; + return !c; + } + + var isExtendingChar = /[\u0300-\u036F\u0483-\u0487\u0488-\u0489\u0591-\u05BD\u05BF\u05C1-\u05C2\u05C4-\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7-\u06E8\u06EA-\u06ED\uA66F\uA670-\uA672\uA674-\uA67D\uA69F]/; + + // DOM UTILITIES + + function elt(tag, content, className, style) { + var e = document.createElement(tag); + if (className) e.className = className; + if (style) e.style.cssText = style; + if (typeof content == "string") setTextContent(e, content); + else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]); + return e; + } + + function removeChildren(e) { + // IE will break all parent-child relations in subnodes when setting innerHTML + if (!ie) e.innerHTML = ""; + else while (e.firstChild) e.removeChild(e.firstChild); + return e; + } + + function removeChildrenAndAdd(parent, e) { + return removeChildren(parent).appendChild(e); + } + + function setTextContent(e, str) { + if (ie_lt9) { + e.innerHTML = ""; + e.appendChild(document.createTextNode(str)); + } else e.textContent = str; + } + + // FEATURE DETECTION + + // Detect drag-and-drop + var dragAndDrop = function() { + // There is *some* kind of drag-and-drop support in IE6-8, but I + // couldn't get it to work yet. + if (ie_lt9) return false; + var div = elt('div'); + return "draggable" in div || "dragDrop" in div; + }(); + + // For a reason I have yet to figure out, some browsers disallow + // word wrapping between certain characters *only* if a new inline + // element is started between them. This makes it hard to reliably + // measure the position of things, since that requires inserting an + // extra span. This terribly fragile set of regexps matches the + // character combinations that suffer from this phenomenon on the + // various browsers. + var spanAffectsWrapping = /^$/; // Won't match any two-character string + if (gecko) spanAffectsWrapping = /$'/; + else if (safari) spanAffectsWrapping = /\-[^ \-?]|\?[^ !'\"\),.\-\/:;\?\]\}]/; + else if (chrome) spanAffectsWrapping = /\-[^ \-\.?]|\?[^ \-\.?\]\}:;!'\"\),\/]|[\.!\"#&%\)*+,:;=>\]|\}~][\(\{\[<]|\$'/; + + var knownScrollbarWidth; + function scrollbarWidth(measure) { + if (knownScrollbarWidth != null) return knownScrollbarWidth; + var test = elt("div", null, null, "width: 50px; height: 50px; overflow-x: scroll"); + removeChildrenAndAdd(measure, test); + if (test.offsetWidth) + knownScrollbarWidth = test.offsetHeight - test.clientHeight; + return knownScrollbarWidth || 0; + } + + var zwspSupported; + function zeroWidthElement(measure) { + if (zwspSupported == null) { + var test = elt("span", "\u200b"); + removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")])); + if (measure.firstChild.offsetHeight != 0) + zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !ie_lt8; + } + if (zwspSupported) return elt("span", "\u200b"); + else return elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px"); + } + + // See if "".split is the broken IE version, if so, provide an + // alternative way to split lines. + var splitLines = "\n\nb".split(/\n/).length != 3 ? function(string) { + var pos = 0, result = [], l = string.length; + while (pos <= l) { + var nl = string.indexOf("\n", pos); + if (nl == -1) nl = string.length; + var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl); + var rt = line.indexOf("\r"); + if (rt != -1) { + result.push(line.slice(0, rt)); + pos += rt + 1; + } else { + result.push(line); + pos = nl + 1; + } + } + return result; + } : function(string){return string.split(/\r\n?|\n/);}; + CodeMirror.splitLines = splitLines; + + var hasSelection = window.getSelection ? function(te) { + try { return te.selectionStart != te.selectionEnd; } + catch(e) { return false; } + } : function(te) { + try {var range = te.ownerDocument.selection.createRange();} + catch(e) {} + if (!range || range.parentElement() != te) return false; + return range.compareEndPoints("StartToEnd", range) != 0; + }; + + var hasCopyEvent = (function() { + var e = elt("div"); + if ("oncopy" in e) return true; + e.setAttribute("oncopy", "return;"); + return typeof e.oncopy == 'function'; + })(); + + // KEY NAMING + + var keyNames = {3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt", + 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", + 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert", + 46: "Delete", 59: ";", 91: "Mod", 92: "Mod", 93: "Mod", 109: "-", 107: "=", 127: "Delete", + 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", + 221: "]", 222: "'", 63276: "PageUp", 63277: "PageDown", 63275: "End", 63273: "Home", + 63234: "Left", 63232: "Up", 63235: "Right", 63233: "Down", 63302: "Insert", 63272: "Delete"}; + CodeMirror.keyNames = keyNames; + (function() { + // Number keys + for (var i = 0; i < 10; i++) keyNames[i + 48] = String(i); + // Alphabetic keys + for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i); + // Function keys + for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = "F" + i; + })(); + + // BIDI HELPERS + + function iterateBidiSections(order, from, to, f) { + if (!order) return f(from, to, "ltr"); + for (var i = 0; i < order.length; ++i) { + var part = order[i]; + if (part.from < to && part.to > from || from == to && part.to == from) + f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr"); + } + } + + function bidiLeft(part) { return part.level % 2 ? part.to : part.from; } + function bidiRight(part) { return part.level % 2 ? part.from : part.to; } + + function lineLeft(line) { var order = getOrder(line); return order ? bidiLeft(order[0]) : 0; } + function lineRight(line) { + var order = getOrder(line); + if (!order) return line.text.length; + return bidiRight(lst(order)); + } + + function lineStart(cm, lineN) { + var line = getLine(cm.view.doc, lineN); + var visual = visualLine(cm.view.doc, line); + if (visual != line) lineN = lineNo(visual); + var order = getOrder(visual); + var ch = !order ? 0 : order[0].level % 2 ? lineRight(visual) : lineLeft(visual); + return {line: lineN, ch: ch}; + } + function lineEnd(cm, lineNo) { + var merged, line; + while (merged = collapsedSpanAtEnd(line = getLine(cm.view.doc, lineNo))) + lineNo = merged.find().to.line; + var order = getOrder(line); + var ch = !order ? line.text.length : order[0].level % 2 ? lineLeft(line) : lineRight(line); + return {line: lineNo, ch: ch}; + } + + // This is somewhat involved. It is needed in order to move + // 'visually' through bi-directional text -- i.e., pressing left + // should make the cursor go left, even when in RTL text. The + // tricky part is the 'jumps', where RTL and LTR text touch each + // other. This often requires the cursor offset to move more than + // one unit, in order to visually move one unit. + function moveVisually(line, start, dir, byUnit) { + var bidi = getOrder(line); + if (!bidi) return moveLogically(line, start, dir, byUnit); + var moveOneUnit = byUnit ? function(pos, dir) { + do pos += dir; + while (pos > 0 && isExtendingChar.test(line.text.charAt(pos))); + return pos; + } : function(pos, dir) { return pos + dir; }; + var linedir = bidi[0].level; + for (var i = 0; i < bidi.length; ++i) { + var part = bidi[i], sticky = part.level % 2 == linedir; + if ((part.from < start && part.to > start) || + (sticky && (part.from == start || part.to == start))) break; + } + var target = moveOneUnit(start, part.level % 2 ? -dir : dir); + + while (target != null) { + if (part.level % 2 == linedir) { + if (target < part.from || target > part.to) { + part = bidi[i += dir]; + target = part && (dir > 0 == part.level % 2 ? moveOneUnit(part.to, -1) : moveOneUnit(part.from, 1)); + } else break; + } else { + if (target == bidiLeft(part)) { + part = bidi[--i]; + target = part && bidiRight(part); + } else if (target == bidiRight(part)) { + part = bidi[++i]; + target = part && bidiLeft(part); + } else break; + } + } + + return target < 0 || target > line.text.length ? null : target; + } + + function moveLogically(line, start, dir, byUnit) { + var target = start + dir; + if (byUnit) while (target > 0 && isExtendingChar.test(line.text.charAt(target))) target += dir; + return target < 0 || target > line.text.length ? null : target; + } + + // Bidirectional ordering algorithm + // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm + // that this (partially) implements. + + // One-char codes used for character types: + // L (L): Left-to-Right + // R (R): Right-to-Left + // r (AL): Right-to-Left Arabic + // 1 (EN): European Number + // + (ES): European Number Separator + // % (ET): European Number Terminator + // n (AN): Arabic Number + // , (CS): Common Number Separator + // m (NSM): Non-Spacing Mark + // b (BN): Boundary Neutral + // s (B): Paragraph Separator + // t (S): Segment Separator + // w (WS): Whitespace + // N (ON): Other Neutrals + + // Returns null if characters are ordered as they appear + // (left-to-right), or an array of sections ({from, to, level} + // objects) in the order in which they occur visually. + var bidiOrdering = (function() { + // Character types for codepoints 0 to 0xff + var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLL"; + // Character types for codepoints 0x600 to 0x6ff + var arabicTypes = "rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmmrrrrrrrrrrrrrrrrrr"; + function charType(code) { + if (code <= 0xff) return lowTypes.charAt(code); + else if (0x590 <= code && code <= 0x5f4) return "R"; + else if (0x600 <= code && code <= 0x6ff) return arabicTypes.charAt(code - 0x600); + else if (0x700 <= code && code <= 0x8ac) return "r"; + else return "L"; + } + + var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/; + var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/; + // Browsers seem to always treat the boundaries of block elements as being L. + var outerType = "L"; + + return function charOrdering(str) { + if (!bidiRE.test(str)) return false; + var len = str.length, types = []; + for (var i = 0, type; i < len; ++i) + types.push(type = charType(str.charCodeAt(i))); + + // W1. Examine each non-spacing mark (NSM) in the level run, and + // change the type of the NSM to the type of the previous + // character. If the NSM is at the start of the level run, it will + // get the type of sor. + for (var i = 0, prev = outerType; i < len; ++i) { + var type = types[i]; + if (type == "m") types[i] = prev; + else prev = type; + } + + // W2. Search backwards from each instance of a European number + // until the first strong type (R, L, AL, or sor) is found. If an + // AL is found, change the type of the European number to Arabic + // number. + // W3. Change all ALs to R. + for (var i = 0, cur = outerType; i < len; ++i) { + var type = types[i]; + if (type == "1" && cur == "r") types[i] = "n"; + else if (isStrong.test(type)) { cur = type; if (type == "r") types[i] = "R"; } + } + + // W4. A single European separator between two European numbers + // changes to a European number. A single common separator between + // two numbers of the same type changes to that type. + for (var i = 1, prev = types[0]; i < len - 1; ++i) { + var type = types[i]; + if (type == "+" && prev == "1" && types[i+1] == "1") types[i] = "1"; + else if (type == "," && prev == types[i+1] && + (prev == "1" || prev == "n")) types[i] = prev; + prev = type; + } + + // W5. A sequence of European terminators adjacent to European + // numbers changes to all European numbers. + // W6. Otherwise, separators and terminators change to Other + // Neutral. + for (var i = 0; i < len; ++i) { + var type = types[i]; + if (type == ",") types[i] = "N"; + else if (type == "%") { + for (var end = i + 1; end < len && types[end] == "%"; ++end) {} + var replace = (i && types[i-1] == "!") || (end < len - 1 && types[end] == "1") ? "1" : "N"; + for (var j = i; j < end; ++j) types[j] = replace; + i = end - 1; + } + } + + // W7. Search backwards from each instance of a European number + // until the first strong type (R, L, or sor) is found. If an L is + // found, then change the type of the European number to L. + for (var i = 0, cur = outerType; i < len; ++i) { + var type = types[i]; + if (cur == "L" && type == "1") types[i] = "L"; + else if (isStrong.test(type)) cur = type; + } + + // N1. A sequence of neutrals takes the direction of the + // surrounding strong text if the text on both sides has the same + // direction. European and Arabic numbers act as if they were R in + // terms of their influence on neutrals. Start-of-level-run (sor) + // and end-of-level-run (eor) are used at level run boundaries. + // N2. Any remaining neutrals take the embedding direction. + for (var i = 0; i < len; ++i) { + if (isNeutral.test(types[i])) { + for (var end = i + 1; end < len && isNeutral.test(types[end]); ++end) {} + var before = (i ? types[i-1] : outerType) == "L"; + var after = (end < len - 1 ? types[end] : outerType) == "L"; + var replace = before || after ? "L" : "R"; + for (var j = i; j < end; ++j) types[j] = replace; + i = end - 1; + } + } + + // Here we depart from the documented algorithm, in order to avoid + // building up an actual levels array. Since there are only three + // levels (0, 1, 2) in an implementation that doesn't take + // explicit embedding into account, we can build up the order on + // the fly, without following the level-based algorithm. + var order = [], m; + for (var i = 0; i < len;) { + if (countsAsLeft.test(types[i])) { + var start = i; + for (++i; i < len && countsAsLeft.test(types[i]); ++i) {} + order.push({from: start, to: i, level: 0}); + } else { + var pos = i, at = order.length; + for (++i; i < len && types[i] != "L"; ++i) {} + for (var j = pos; j < i;) { + if (countsAsNum.test(types[j])) { + if (pos < j) order.splice(at, 0, {from: pos, to: j, level: 1}); + var nstart = j; + for (++j; j < i && countsAsNum.test(types[j]); ++j) {} + order.splice(at, 0, {from: nstart, to: j, level: 2}); + pos = j; + } else ++j; + } + if (pos < i) order.splice(at, 0, {from: pos, to: i, level: 1}); + } + } + if (order[0].level == 1 && (m = str.match(/^\s+/))) { + order[0].from = m[0].length; + order.unshift({from: 0, to: m[0].length, level: 0}); + } + if (lst(order).level == 1 && (m = str.match(/\s+$/))) { + lst(order).to -= m[0].length; + order.push({from: len - m[0].length, to: len, level: 0}); + } + if (order[0].level != lst(order).level) + order.push({from: len, to: len, level: order[0].level}); + + return order; + }; + })(); + + // THE END + + CodeMirror.version = "3.02"; + + return CodeMirror; +})(); diff --git a/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/mode/coffeescript/LICENSE b/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/mode/coffeescript/LICENSE new file mode 100755 index 0000000..977e284 --- /dev/null +++ b/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/mode/coffeescript/LICENSE @@ -0,0 +1,22 @@ +The MIT License + +Copyright (c) 2011 Jeff Pickhardt +Modified from the Python CodeMirror mode, Copyright (c) 2010 Timothy Farrell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/mode/coffeescript/coffeescript.js b/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/mode/coffeescript/coffeescript.js new file mode 100755 index 0000000..670e01f --- /dev/null +++ b/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/mode/coffeescript/coffeescript.js @@ -0,0 +1,346 @@ +/** + * Link to the project's GitHub page: + * https://github.com/pickhardt/coffeescript-codemirror-mode + */ +CodeMirror.defineMode('coffeescript', function(conf) { + var ERRORCLASS = 'error'; + + function wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b"); + } + + var singleOperators = new RegExp("^[\\+\\-\\*/%&|\\^~<>!\?]"); + var singleDelimiters = new RegExp('^[\\(\\)\\[\\]\\{\\},:`=;\\.]'); + var doubleOperators = new RegExp("^((\->)|(\=>)|(\\+\\+)|(\\+\\=)|(\\-\\-)|(\\-\\=)|(\\*\\*)|(\\*\\=)|(\\/\\/)|(\\/\\=)|(==)|(!=)|(<=)|(>=)|(<>)|(<<)|(>>)|(//))"); + var doubleDelimiters = new RegExp("^((\\.\\.)|(\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))"); + var tripleDelimiters = new RegExp("^((\\.\\.\\.)|(//=)|(>>=)|(<<=)|(\\*\\*=))"); + var identifiers = new RegExp("^[_A-Za-z$][_A-Za-z$0-9]*"); + var properties = new RegExp("^(@|this\.)[_A-Za-z$][_A-Za-z$0-9]*"); + + var wordOperators = wordRegexp(['and', 'or', 'not', + 'is', 'isnt', 'in', + 'instanceof', 'typeof']); + var indentKeywords = ['for', 'while', 'loop', 'if', 'unless', 'else', + 'switch', 'try', 'catch', 'finally', 'class']; + var commonKeywords = ['break', 'by', 'continue', 'debugger', 'delete', + 'do', 'in', 'of', 'new', 'return', 'then', + 'this', 'throw', 'when', 'until']; + + var keywords = wordRegexp(indentKeywords.concat(commonKeywords)); + + indentKeywords = wordRegexp(indentKeywords); + + + var stringPrefixes = new RegExp("^('{3}|\"{3}|['\"])"); + var regexPrefixes = new RegExp("^(/{3}|/)"); + var commonConstants = ['Infinity', 'NaN', 'undefined', 'null', 'true', 'false', 'on', 'off', 'yes', 'no']; + var constants = wordRegexp(commonConstants); + + // Tokenizers + function tokenBase(stream, state) { + // Handle scope changes + if (stream.sol()) { + var scopeOffset = state.scopes[0].offset; + if (stream.eatSpace()) { + var lineOffset = stream.indentation(); + if (lineOffset > scopeOffset) { + return 'indent'; + } else if (lineOffset < scopeOffset) { + return 'dedent'; + } + return null; + } else { + if (scopeOffset > 0) { + dedent(stream, state); + } + } + } + if (stream.eatSpace()) { + return null; + } + + var ch = stream.peek(); + + // Handle docco title comment (single line) + if (stream.match("####")) { + stream.skipToEnd(); + return 'comment'; + } + + // Handle multi line comments + if (stream.match("###")) { + state.tokenize = longComment; + return state.tokenize(stream, state); + } + + // Single line comment + if (ch === '#') { + stream.skipToEnd(); + return 'comment'; + } + + // Handle number literals + if (stream.match(/^-?[0-9\.]/, false)) { + var floatLiteral = false; + // Floats + if (stream.match(/^-?\d*\.\d+(e[\+\-]?\d+)?/i)) { + floatLiteral = true; + } + if (stream.match(/^-?\d+\.\d*/)) { + floatLiteral = true; + } + if (stream.match(/^-?\.\d+/)) { + floatLiteral = true; + } + + if (floatLiteral) { + // prevent from getting extra . on 1.. + if (stream.peek() == "."){ + stream.backUp(1); + } + return 'number'; + } + // Integers + var intLiteral = false; + // Hex + if (stream.match(/^-?0x[0-9a-f]+/i)) { + intLiteral = true; + } + // Decimal + if (stream.match(/^-?[1-9]\d*(e[\+\-]?\d+)?/)) { + intLiteral = true; + } + // Zero by itself with no other piece of number. + if (stream.match(/^-?0(?![\dx])/i)) { + intLiteral = true; + } + if (intLiteral) { + return 'number'; + } + } + + // Handle strings + if (stream.match(stringPrefixes)) { + state.tokenize = tokenFactory(stream.current(), 'string'); + return state.tokenize(stream, state); + } + // Handle regex literals + if (stream.match(regexPrefixes)) { + if (stream.current() != '/' || stream.match(/^.*\//, false)) { // prevent highlight of division + state.tokenize = tokenFactory(stream.current(), 'string-2'); + return state.tokenize(stream, state); + } else { + stream.backUp(1); + } + } + + // Handle operators and delimiters + if (stream.match(tripleDelimiters) || stream.match(doubleDelimiters)) { + return 'punctuation'; + } + if (stream.match(doubleOperators) + || stream.match(singleOperators) + || stream.match(wordOperators)) { + return 'operator'; + } + if (stream.match(singleDelimiters)) { + return 'punctuation'; + } + + if (stream.match(constants)) { + return 'atom'; + } + + if (stream.match(keywords)) { + return 'keyword'; + } + + if (stream.match(identifiers)) { + return 'variable'; + } + + if (stream.match(properties)) { + return 'property'; + } + + // Handle non-detected items + stream.next(); + return ERRORCLASS; + } + + function tokenFactory(delimiter, outclass) { + var singleline = delimiter.length == 1; + return function tokenString(stream, state) { + while (!stream.eol()) { + stream.eatWhile(/[^'"\/\\]/); + if (stream.eat('\\')) { + stream.next(); + if (singleline && stream.eol()) { + return outclass; + } + } else if (stream.match(delimiter)) { + state.tokenize = tokenBase; + return outclass; + } else { + stream.eat(/['"\/]/); + } + } + if (singleline) { + if (conf.mode.singleLineStringErrors) { + outclass = ERRORCLASS; + } else { + state.tokenize = tokenBase; + } + } + return outclass; + }; + } + + function longComment(stream, state) { + while (!stream.eol()) { + stream.eatWhile(/[^#]/); + if (stream.match("###")) { + state.tokenize = tokenBase; + break; + } + stream.eatWhile("#"); + } + return "comment"; + } + + function indent(stream, state, type) { + type = type || 'coffee'; + var indentUnit = 0; + if (type === 'coffee') { + for (var i = 0; i < state.scopes.length; i++) { + if (state.scopes[i].type === 'coffee') { + indentUnit = state.scopes[i].offset + conf.indentUnit; + break; + } + } + } else { + indentUnit = stream.column() + stream.current().length; + } + state.scopes.unshift({ + offset: indentUnit, + type: type + }); + } + + function dedent(stream, state) { + if (state.scopes.length == 1) return; + if (state.scopes[0].type === 'coffee') { + var _indent = stream.indentation(); + var _indent_index = -1; + for (var i = 0; i < state.scopes.length; ++i) { + if (_indent === state.scopes[i].offset) { + _indent_index = i; + break; + } + } + if (_indent_index === -1) { + return true; + } + while (state.scopes[0].offset !== _indent) { + state.scopes.shift(); + } + return false; + } else { + state.scopes.shift(); + return false; + } + } + + function tokenLexer(stream, state) { + var style = state.tokenize(stream, state); + var current = stream.current(); + + // Handle '.' connected identifiers + if (current === '.') { + style = state.tokenize(stream, state); + current = stream.current(); + if (style === 'variable') { + return 'variable'; + } else { + return ERRORCLASS; + } + } + + // Handle scope changes. + if (current === 'return') { + state.dedent += 1; + } + if (((current === '->' || current === '=>') && + !state.lambda && + state.scopes[0].type == 'coffee' && + stream.peek() === '') + || style === 'indent') { + indent(stream, state); + } + var delimiter_index = '[({'.indexOf(current); + if (delimiter_index !== -1) { + indent(stream, state, '])}'.slice(delimiter_index, delimiter_index+1)); + } + if (indentKeywords.exec(current)){ + indent(stream, state); + } + if (current == 'then'){ + dedent(stream, state); + } + + + if (style === 'dedent') { + if (dedent(stream, state)) { + return ERRORCLASS; + } + } + delimiter_index = '])}'.indexOf(current); + if (delimiter_index !== -1) { + if (dedent(stream, state)) { + return ERRORCLASS; + } + } + if (state.dedent > 0 && stream.eol() && state.scopes[0].type == 'coffee') { + if (state.scopes.length > 1) state.scopes.shift(); + state.dedent -= 1; + } + + return style; + } + + var external = { + startState: function(basecolumn) { + return { + tokenize: tokenBase, + scopes: [{offset:basecolumn || 0, type:'coffee'}], + lastToken: null, + lambda: false, + dedent: 0 + }; + }, + + token: function(stream, state) { + var style = tokenLexer(stream, state); + + state.lastToken = {style:style, content: stream.current()}; + + if (stream.eol() && stream.lambda) { + state.lambda = false; + } + + return style; + }, + + indent: function(state) { + if (state.tokenize != tokenBase) { + return 0; + } + + return state.scopes[0].offset; + } + + }; + return external; +}); + +CodeMirror.defineMIME('text/x-coffeescript', 'coffeescript'); diff --git a/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/mode/coffeescript/index.html b/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/mode/coffeescript/index.html new file mode 100755 index 0000000..ee72b8d --- /dev/null +++ b/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/mode/coffeescript/index.html @@ -0,0 +1,728 @@ + + + + + CodeMirror: CoffeeScript mode + + + + + + + +

      CodeMirror: CoffeeScript mode

      +
      + + +

      MIME types defined: text/x-coffeescript.

      + +

      The CoffeeScript mode was written by Jeff Pickhardt (license).

      + + + diff --git a/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/mode/javascript/index.html b/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/mode/javascript/index.html new file mode 100755 index 0000000..9222ddf --- /dev/null +++ b/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/mode/javascript/index.html @@ -0,0 +1,88 @@ + + + + + CodeMirror: JavaScript mode + + + + + + + + + +

      CodeMirror: JavaScript mode

      + +
      + + + +

      + JavaScript mode supports a two configuration + options: +

        +
      • json which will set the mode to expect JSON data rather than a JavaScript program.
      • +
      • + typescript which will activate additional syntax highlighting and some other things for TypeScript code (demo). +
      • +
      +

      + +

      MIME types defined: text/javascript, application/json, text/typescript, application/typescript.

      + + diff --git a/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/mode/javascript/javascript.js b/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/mode/javascript/javascript.js new file mode 100755 index 0000000..565513f --- /dev/null +++ b/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/mode/javascript/javascript.js @@ -0,0 +1,422 @@ +// TODO actually recognize syntax of TypeScript constructs + +CodeMirror.defineMode("javascript", function(config, parserConfig) { + var indentUnit = config.indentUnit; + var jsonMode = parserConfig.json; + var isTS = parserConfig.typescript; + + // Tokenizer + + var keywords = function(){ + function kw(type) {return {type: type, style: "keyword"};} + var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c"); + var operator = kw("operator"), atom = {type: "atom", style: "atom"}; + + var jsKeywords = { + "if": A, "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B, + "return": C, "break": C, "continue": C, "new": C, "delete": C, "throw": C, + "var": kw("var"), "const": kw("var"), "let": kw("var"), + "function": kw("function"), "catch": kw("catch"), + "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"), + "in": operator, "typeof": operator, "instanceof": operator, + "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom + }; + + // Extend the 'normal' keywords with the TypeScript language extensions + if (isTS) { + var type = {type: "variable", style: "variable-3"}; + var tsKeywords = { + // object-like things + "interface": kw("interface"), + "class": kw("class"), + "extends": kw("extends"), + "constructor": kw("constructor"), + + // scope modifiers + "public": kw("public"), + "private": kw("private"), + "protected": kw("protected"), + "static": kw("static"), + + "super": kw("super"), + + // types + "string": type, "number": type, "bool": type, "any": type + }; + + for (var attr in tsKeywords) { + jsKeywords[attr] = tsKeywords[attr]; + } + } + + return jsKeywords; + }(); + + var isOperatorChar = /[+\-*&%=<>!?|]/; + + function chain(stream, state, f) { + state.tokenize = f; + return f(stream, state); + } + + function nextUntilUnescaped(stream, end) { + var escaped = false, next; + while ((next = stream.next()) != null) { + if (next == end && !escaped) + return false; + escaped = !escaped && next == "\\"; + } + return escaped; + } + + // Used as scratch variables to communicate multiple values without + // consing up tons of objects. + var type, content; + function ret(tp, style, cont) { + type = tp; content = cont; + return style; + } + + function jsTokenBase(stream, state) { + var ch = stream.next(); + if (ch == '"' || ch == "'") + return chain(stream, state, jsTokenString(ch)); + else if (/[\[\]{}\(\),;\:\.]/.test(ch)) + return ret(ch); + else if (ch == "0" && stream.eat(/x/i)) { + stream.eatWhile(/[\da-f]/i); + return ret("number", "number"); + } + else if (/\d/.test(ch) || ch == "-" && stream.eat(/\d/)) { + stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/); + return ret("number", "number"); + } + else if (ch == "/") { + if (stream.eat("*")) { + return chain(stream, state, jsTokenComment); + } + else if (stream.eat("/")) { + stream.skipToEnd(); + return ret("comment", "comment"); + } + else if (state.lastType == "operator" || state.lastType == "keyword c" || + /^[\[{}\(,;:]$/.test(state.lastType)) { + nextUntilUnescaped(stream, "/"); + stream.eatWhile(/[gimy]/); // 'y' is "sticky" option in Mozilla + return ret("regexp", "string-2"); + } + else { + stream.eatWhile(isOperatorChar); + return ret("operator", null, stream.current()); + } + } + else if (ch == "#") { + stream.skipToEnd(); + return ret("error", "error"); + } + else if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return ret("operator", null, stream.current()); + } + else { + stream.eatWhile(/[\w\$_]/); + var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word]; + return (known && state.lastType != ".") ? ret(known.type, known.style, word) : + ret("variable", "variable", word); + } + } + + function jsTokenString(quote) { + return function(stream, state) { + if (!nextUntilUnescaped(stream, quote)) + state.tokenize = jsTokenBase; + return ret("string", "string"); + }; + } + + function jsTokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = jsTokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return ret("comment", "comment"); + } + + // Parser + + var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true}; + + function JSLexical(indented, column, type, align, prev, info) { + this.indented = indented; + this.column = column; + this.type = type; + this.prev = prev; + this.info = info; + if (align != null) this.align = align; + } + + function inScope(state, varname) { + for (var v = state.localVars; v; v = v.next) + if (v.name == varname) return true; + } + + function parseJS(state, style, type, content, stream) { + var cc = state.cc; + // Communicate our context to the combinators. + // (Less wasteful than consing up a hundred closures on every call.) + cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; + + if (!state.lexical.hasOwnProperty("align")) + state.lexical.align = true; + + while(true) { + var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement; + if (combinator(type, content)) { + while(cc.length && cc[cc.length - 1].lex) + cc.pop()(); + if (cx.marked) return cx.marked; + if (type == "variable" && inScope(state, content)) return "variable-2"; + return style; + } + } + } + + // Combinator utils + + var cx = {state: null, column: null, marked: null, cc: null}; + function pass() { + for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]); + } + function cont() { + pass.apply(null, arguments); + return true; + } + function register(varname) { + function inList(list) { + for (var v = list; v; v = v.next) + if (v.name == varname) return true; + return false; + } + var state = cx.state; + if (state.context) { + cx.marked = "def"; + if (inList(state.localVars)) return; + state.localVars = {name: varname, next: state.localVars}; + } else { + if (inList(state.globalVars)) return; + state.globalVars = {name: varname, next: state.globalVars}; + } + } + + // Combinators + + var defaultVars = {name: "this", next: {name: "arguments"}}; + function pushcontext() { + cx.state.context = {prev: cx.state.context, vars: cx.state.localVars}; + cx.state.localVars = defaultVars; + } + function popcontext() { + cx.state.localVars = cx.state.context.vars; + cx.state.context = cx.state.context.prev; + } + function pushlex(type, info) { + var result = function() { + var state = cx.state; + state.lexical = new JSLexical(state.indented, cx.stream.column(), type, null, state.lexical, info); + }; + result.lex = true; + return result; + } + function poplex() { + var state = cx.state; + if (state.lexical.prev) { + if (state.lexical.type == ")") + state.indented = state.lexical.indented; + state.lexical = state.lexical.prev; + } + } + poplex.lex = true; + + function expect(wanted) { + return function expecting(type) { + if (type == wanted) return cont(); + else if (wanted == ";") return pass(); + else return cont(arguments.callee); + }; + } + + function statement(type) { + if (type == "var") return cont(pushlex("vardef"), vardef1, expect(";"), poplex); + if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex); + if (type == "keyword b") return cont(pushlex("form"), statement, poplex); + if (type == "{") return cont(pushlex("}"), block, poplex); + if (type == ";") return cont(); + if (type == "function") return cont(functiondef); + if (type == "for") return cont(pushlex("form"), expect("("), pushlex(")"), forspec1, expect(")"), + poplex, statement, poplex); + if (type == "variable") return cont(pushlex("stat"), maybelabel); + if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"), + block, poplex, poplex); + if (type == "case") return cont(expression, expect(":")); + if (type == "default") return cont(expect(":")); + if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"), + statement, poplex, popcontext); + return pass(pushlex("stat"), expression, expect(";"), poplex); + } + function expression(type) { + if (atomicTypes.hasOwnProperty(type)) return cont(maybeoperator); + if (type == "function") return cont(functiondef); + if (type == "keyword c") return cont(maybeexpression); + if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeoperator); + if (type == "operator") return cont(expression); + if (type == "[") return cont(pushlex("]"), commasep(expression, "]"), poplex, maybeoperator); + if (type == "{") return cont(pushlex("}"), commasep(objprop, "}"), poplex, maybeoperator); + return cont(); + } + function maybeexpression(type) { + if (type.match(/[;\}\)\],]/)) return pass(); + return pass(expression); + } + + function maybeoperator(type, value) { + if (type == "operator" && /\+\+|--/.test(value)) return cont(maybeoperator); + if (type == "operator" && value == "?") return cont(expression, expect(":"), expression); + if (type == ";") return; + if (type == "(") return cont(pushlex(")"), commasep(expression, ")"), poplex, maybeoperator); + if (type == ".") return cont(property, maybeoperator); + if (type == "[") return cont(pushlex("]"), expression, expect("]"), poplex, maybeoperator); + } + function maybelabel(type) { + if (type == ":") return cont(poplex, statement); + return pass(maybeoperator, expect(";"), poplex); + } + function property(type) { + if (type == "variable") {cx.marked = "property"; return cont();} + } + function objprop(type) { + if (type == "variable") cx.marked = "property"; + if (atomicTypes.hasOwnProperty(type)) return cont(expect(":"), expression); + } + function commasep(what, end) { + function proceed(type) { + if (type == ",") return cont(what, proceed); + if (type == end) return cont(); + return cont(expect(end)); + } + return function commaSeparated(type) { + if (type == end) return cont(); + else return pass(what, proceed); + }; + } + function block(type) { + if (type == "}") return cont(); + return pass(statement, block); + } + function maybetype(type) { + if (type == ":") return cont(typedef); + return pass(); + } + function typedef(type) { + if (type == "variable"){cx.marked = "variable-3"; return cont();} + return pass(); + } + function vardef1(type, value) { + if (type == "variable") { + register(value); + return isTS ? cont(maybetype, vardef2) : cont(vardef2); + } + return pass(); + } + function vardef2(type, value) { + if (value == "=") return cont(expression, vardef2); + if (type == ",") return cont(vardef1); + } + function forspec1(type) { + if (type == "var") return cont(vardef1, expect(";"), forspec2); + if (type == ";") return cont(forspec2); + if (type == "variable") return cont(formaybein); + return cont(forspec2); + } + function formaybein(_type, value) { + if (value == "in") return cont(expression); + return cont(maybeoperator, forspec2); + } + function forspec2(type, value) { + if (type == ";") return cont(forspec3); + if (value == "in") return cont(expression); + return cont(expression, expect(";"), forspec3); + } + function forspec3(type) { + if (type != ")") cont(expression); + } + function functiondef(type, value) { + if (type == "variable") {register(value); return cont(functiondef);} + if (type == "(") return cont(pushlex(")"), pushcontext, commasep(funarg, ")"), poplex, statement, popcontext); + } + function funarg(type, value) { + if (type == "variable") {register(value); return isTS ? cont(maybetype) : cont();} + } + + // Interface + + return { + startState: function(basecolumn) { + return { + tokenize: jsTokenBase, + lastType: null, + cc: [], + lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false), + localVars: parserConfig.localVars, + globalVars: parserConfig.globalVars, + context: parserConfig.localVars && {vars: parserConfig.localVars}, + indented: 0 + }; + }, + + token: function(stream, state) { + if (stream.sol()) { + if (!state.lexical.hasOwnProperty("align")) + state.lexical.align = false; + state.indented = stream.indentation(); + } + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + if (type == "comment") return style; + state.lastType = type; + return parseJS(state, style, type, content, stream); + }, + + indent: function(state, textAfter) { + if (state.tokenize == jsTokenComment) return CodeMirror.Pass; + if (state.tokenize != jsTokenBase) return 0; + var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical; + if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev; + var type = lexical.type, closing = firstChar == type; + if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? 4 : 0); + else if (type == "form" && firstChar == "{") return lexical.indented; + else if (type == "form") return lexical.indented + indentUnit; + else if (type == "stat") + return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? indentUnit : 0); + else if (lexical.info == "switch" && !closing) + return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit); + else if (lexical.align) return lexical.column + (closing ? 0 : 1); + else return lexical.indented + (closing ? 0 : indentUnit); + }, + + electricChars: ":{}", + + jsonMode: jsonMode + }; +}); + +CodeMirror.defineMIME("text/javascript", "javascript"); +CodeMirror.defineMIME("text/ecmascript", "javascript"); +CodeMirror.defineMIME("application/javascript", "javascript"); +CodeMirror.defineMIME("application/ecmascript", "javascript"); +CodeMirror.defineMIME("application/json", {name: "javascript", json: true}); +CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true }); +CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true }); diff --git a/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/mode/javascript/typescript.html b/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/mode/javascript/typescript.html new file mode 100755 index 0000000..58315e7 --- /dev/null +++ b/public/bower_components/messenger/docs/welcome/lib/executr/lib/CodeMirror/mode/javascript/typescript.html @@ -0,0 +1,48 @@ + + + + + CodeMirror: TypeScript mode + + + + + + + +

      CodeMirror: TypeScript mode

      + +
      + + + +

      This is a specialization of the JavaScript mode.

      + + diff --git a/public/bower_components/messenger/docs/welcome/lib/executr/lib/coffee-script.js b/public/bower_components/messenger/docs/welcome/lib/executr/lib/coffee-script.js new file mode 100755 index 0000000..66c387f --- /dev/null +++ b/public/bower_components/messenger/docs/welcome/lib/executr/lib/coffee-script.js @@ -0,0 +1,8 @@ +/** + * CoffeeScript Compiler v1.4.0 + * http://coffeescript.org + * + * Copyright 2011, Jeremy Ashkenas + * Released under the MIT License + */ +(function(root){var CoffeeScript=function(){function require(a){return require[a]}return require["./helpers"]=new function(){var a=this;((function(){var b,c,d;a.starts=function(a,b,c){return b===a.substr(c,b.length)},a.ends=function(a,b,c){var d;return d=b.length,b===a.substr(a.length-d-(c||0),d)},a.compact=function(a){var b,c,d,e;e=[];for(c=0,d=a.length;c=0)f+=1;else if(j=g[0],t.call(d,j)>=0)f-=1;a+=1}return a-1},a.prototype.removeLeadingNewlines=function(){var a,b,c,d,e;e=this.tokens;for(a=c=0,d=e.length;c=0)?(d.splice(b,1),0):1})},a.prototype.closeOpenCalls=function(){var a,b;return b=function(a,b){var c;return(c=a[0])===")"||c==="CALL_END"||a[0]==="OUTDENT"&&this.tag(b-1)===")"},a=function(a,b){return this.tokens[a[0]==="OUTDENT"?b-1:b][0]="CALL_END"},this.scanTokens(function(c,d){return c[0]==="CALL_START"&&this.detectEnd(d+1,b,a),1})},a.prototype.closeOpenIndexes=function(){var a,b;return b=function(a,b){var c;return(c=a[0])==="]"||c==="INDEX_END"},a=function(a,b){return a[0]="INDEX_END"},this.scanTokens(function(c,d){return c[0]==="INDEX_START"&&this.detectEnd(d+1,b,a),1})},a.prototype.addImplicitBraces=function(){var a,b,c,f,g,i,j,k;return f=[],g=null,k=null,c=!0,i=0,j=0,b=function(a,b){var d,e,f,g,i,m;return i=this.tokens.slice(b+1,+(b+3)+1||9e9),d=i[0],g=i[1],f=i[2],"HERECOMMENT"===(d!=null?d[0]:void 0)?!1:(e=a[0],t.call(l,e)>=0&&(c=!1),(e==="TERMINATOR"||e==="OUTDENT"||t.call(h,e)>=0&&c&&b-j!==1)&&(!k&&this.tag(b-1)!==","||(g!=null?g[0]:void 0)!==":"&&((d!=null?d[0]:void 0)!=="@"||(f!=null?f[0]:void 0)!==":"))||e===","&&d&&(m=d[0])!=="IDENTIFIER"&&m!=="NUMBER"&&m!=="STRING"&&m!=="@"&&m!=="TERMINATOR"&&m!=="OUTDENT")},a=function(a,b){var c;return c=this.generate("}","}",a[2]),this.tokens.splice(b,0,c)},this.scanTokens(function(h,i,m){var n,o,p,q,r,s,u,v;if(u=q=h[0],t.call(e,u)>=0)return f.push([q==="INDENT"&&this.tag(i-1)==="{"?"{":q,i]),1;if(t.call(d,q)>=0)return g=f.pop(),1;if(q!==":"||(n=this.tag(i-2))!==":"&&((v=f[f.length-1])!=null?v[0]:void 0)==="{")return 1;c=!0,j=i+1,f.push(["{"]),o=n==="@"?i-2:i-1;while(this.tag(o-2)==="HERECOMMENT")o-=2;return p=this.tag(o-1),k=!p||t.call(l,p)>=0,s=new String("{"),s.generated=!0,r=this.generate("{",s,h[2]),m.splice(o,0,r),this.detectEnd(i+2,b,a),2})},a.prototype.addImplicitParentheses=function(){var a,b,c,d,e;return c=e=d=!1,b=function(a,b){var c,g,i,j;g=a[0];if(!e&&a.fromThen)return!0;if(g==="IF"||g==="ELSE"||g==="CATCH"||g==="->"||g==="=>"||g==="CLASS")e=!0;if(g==="IF"||g==="ELSE"||g==="SWITCH"||g==="TRY"||g==="=")d=!0;return g!=="."&&g!=="?."&&g!=="::"||this.tag(b-1)!=="OUTDENT"?!a.generated&&this.tag(b-1)!==","&&(t.call(h,g)>=0||g==="INDENT"&&!d)&&(g!=="INDENT"||(i=this.tag(b-2))!=="CLASS"&&i!=="EXTENDS"&&(j=this.tag(b-1),t.call(f,j)<0)&&(!(c=this.tokens[b+1])||!c.generated||c[0]!=="{")):!0},a=function(a,b){return this.tokens.splice(b,0,this.generate("CALL_END",")",a[2]))},this.scanTokens(function(f,h,k){var m,n,o,p,q,r,s,u;q=f[0];if(q==="CLASS"||q==="IF"||q==="FOR"||q==="WHILE")c=!0;return r=k.slice(h-1,+(h+1)+1||9e9),p=r[0],n=r[1],o=r[2],m=!c&&q==="INDENT"&&o&&o.generated&&o[0]==="{"&&p&&(s=p[0],t.call(i,s)>=0),e=!1,d=!1,t.call(l,q)>=0&&(c=!1),p&&!p.spaced&&q==="?"&&(f.call=!0),f.fromThen?1:m||(p!=null?p.spaced:void 0)&&(p.call||(u=p[0],t.call(i,u)>=0))&&(t.call(g,q)>=0||!f.spaced&&!f.newLine&&t.call(j,q)>=0)?(k.splice(h,0,this.generate("CALL_START","(",f[2])),this.detectEnd(h+1,b,a),p[0]==="?"&&(p[0]="FUNC_EXIST"),2):1})},a.prototype.addImplicitIndentation=function(){var a,b,c,d,e;return e=c=d=null,b=function(a,b){var c;return a[1]!==";"&&(c=a[0],t.call(m,c)>=0)&&(a[0]!=="ELSE"||e==="IF"||e==="THEN")},a=function(a,b){return this.tokens.splice(this.tag(b-1)===","?b-1:b,0,d)},this.scanTokens(function(f,g,h){var i,j,k;return i=f[0],i==="TERMINATOR"&&this.tag(g+1)==="THEN"?(h.splice(g,1),0):i==="ELSE"&&this.tag(g-1)!=="OUTDENT"?(h.splice.apply(h,[g,0].concat(u.call(this.indentation(f)))),2):i!=="CATCH"||(j=this.tag(g+2))!=="OUTDENT"&&j!=="TERMINATOR"&&j!=="FINALLY"?t.call(n,i)>=0&&this.tag(g+1)!=="INDENT"&&(i!=="ELSE"||this.tag(g+1)!=="IF")?(e=i,k=this.indentation(f,!0),c=k[0],d=k[1],e==="THEN"&&(c.fromThen=!0),h.splice(g+1,0,c),this.detectEnd(g+2,b,a),i==="THEN"&&h.splice(g,1),1):1:(h.splice.apply(h,[g+2,0].concat(u.call(this.indentation(f)))),4)})},a.prototype.tagPostfixConditionals=function(){var a,b,c;return c=null,b=function(a,b){var c;return(c=a[0])==="TERMINATOR"||c==="INDENT"},a=function(a,b){if(a[0]!=="INDENT"||a.generated&&!a.fromThen)return c[0]="POST_"+c[0]},this.scanTokens(function(d,e){return d[0]!=="IF"?1:(c=d,this.detectEnd(e+1,b,a),1)})},a.prototype.indentation=function(a,b){var c,d;return b==null&&(b=!1),c=["INDENT",2,a[2]],d=["OUTDENT",2,a[2]],b&&(c.generated=d.generated=!0),[c,d]},a.prototype.generate=function(a,b,c){var d;return d=[a,b,c],d.generated=!0,d},a.prototype.tag=function(a){var b;return(b=this.tokens[a])!=null?b[0]:void 0},a}(),b=[["(",")"],["[","]"],["{","}"],["INDENT","OUTDENT"],["CALL_START","CALL_END"],["PARAM_START","PARAM_END"],["INDEX_START","INDEX_END"]],a.INVERSES=k={},e=[],d=[];for(q=0,r=b.length;q","=>","[","(","{","--","++"],j=["+","-"],f=["->","=>","{","[",","],h=["POST_IF","FOR","WHILE","UNTIL","WHEN","BY","LOOP","TERMINATOR"],n=["ELSE","->","=>","TRY","FINALLY","THEN"],m=["TERMINATOR","CATCH","FINALLY","ELSE","OUTDENT","LEADING_WHEN"],l=["TERMINATOR","INDENT","OUTDENT"]})).call(this)},require["./lexer"]=new function(){var a=this;((function(){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X=[].indexOf||function(a){for(var b=0,c=this.length;b=0||X.call(g,c)>=0)&&(j=c.toUpperCase(),j==="WHEN"&&(l=this.tag(),X.call(v,l)>=0)?j="LEADING_WHEN":j==="FOR"?this.seenFor=!0:j==="UNLESS"?j="IF":X.call(O,j)>=0?j="UNARY":X.call(H,j)>=0&&(j!=="INSTANCEOF"&&this.seenFor?(j="FOR"+j,this.seenFor=!1):(j="RELATION",this.value()==="!"&&(this.tokens.pop(),c="!"+c)))),X.call(t,c)>=0&&(b?(j="IDENTIFIER",c=new String(c),c.reserved=!0):X.call(I,c)>=0&&this.error('reserved word "'+c+'"')),b||(X.call(e,c)>=0&&(c=f[c]),j=function(){switch(c){case"!":return"UNARY";case"==":case"!=":return"COMPARE";case"&&":case"||":return"LOGIC";case"true":case"false":return"BOOL";case"break":case"continue":return"STATEMENT";default:return j}}()),this.token(j,c),a&&this.token(":",":"),d.length)):0},a.prototype.numberToken=function(){var a,b,c,d,e;if(!(c=E.exec(this.chunk)))return 0;d=c[0],/^0[BOX]/.test(d)?this.error("radix prefix '"+d+"' must be lowercase"):/E/.test(d)&&!/^0x/.test(d)?this.error("exponential notation '"+d+"' must be indicated with a lowercase 'e'"):/^0\d*[89]/.test(d)?this.error("decimal literal '"+d+"' must not be prefixed with '0'"):/^0\d+/.test(d)&&this.error("octal literal '"+d+"' must be prefixed with '0o'"),b=d.length;if(e=/^0o([0-7]+)/.exec(d))d="0x"+parseInt(e[1],8).toString(16);if(a=/^0b([01]+)/.exec(d))d="0x"+parseInt(a[1],2).toString(16);return this.token("NUMBER",d),b},a.prototype.stringToken=function(){var a,b,c;switch(this.chunk.charAt(0)){case"'":if(!(a=L.exec(this.chunk)))return 0;this.token("STRING",(c=a[0]).replace(A,"\\\n"));break;case'"':if(!(c=this.balancedString(this.chunk,'"')))return 0;0=0)?0:(c=G.exec(this.chunk))?(g=c,c=g[0],e=g[1],a=g[2],e.slice(0,2)==="/*"&&this.error("regular expressions cannot begin with `*`"),e==="//"&&(e="/(?:)/"),this.token("REGEX",""+e+a),c.length):0)},a.prototype.heregexToken=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n;d=a[0],b=a[1],c=a[2];if(0>b.indexOf("#{"))return e=b.replace(o,"").replace(/\//g,"\\/"),e.match(/^\*/)&&this.error("regular expressions cannot begin with `*`"),this.token("REGEX","/"+(e||"(?:)")+"/"+c),d.length;this.token("IDENTIFIER","RegExp"),this.tokens.push(["CALL_START","("]),g=[],k=this.interpolateString(b,{regex:!0});for(i=0,j=k.length;ithis.indent){if(d)return this.indebt=e-this.indent,this.suppressNewlines(),b.length;a=e-this.indent+this.outdebt,this.token("INDENT",a),this.indents.push(a),this.ends.push("OUTDENT"),this.outdebt=this.indebt=0}else this.indebt=0,this.outdentToken(this.indent-e,d);return this.indent=e,b.length},a.prototype.outdentToken=function(a,b){var c,d;while(a>0)d=this.indents.length-1,this.indents[d]===void 0?a=0:this.indents[d]===this.outdebt?(a-=this.outdebt,this.outdebt=0):this.indents[d]=0)&&this.error('reserved word "'+this.value()+"\" can't be assigned");if((h=b[1])==="||"||h==="&&")return b[0]="COMPOUND_ASSIGN",b[1]+="=",f.length}if(f===";")this.seenFor=!1,e="TERMINATOR";else if(X.call(z,f)>=0)e="MATH";else if(X.call(i,f)>=0)e="COMPARE";else if(X.call(j,f)>=0)e="COMPOUND_ASSIGN";else if(X.call(O,f)>=0)e="UNARY";else if(X.call(K,f)>=0)e="SHIFT";else if(X.call(x,f)>=0||f==="?"&&(b!=null?b.spaced:void 0))e="LOGIC";else if(b&&!b.spaced)if(f==="("&&(k=b[0],X.call(c,k)>=0))b[0]==="?"&&(b[0]="FUNC_EXIST"),e="CALL_START";else if(f==="["&&(l=b[0],X.call(q,l)>=0)){e="INDEX_START";switch(b[0]){case"?":b[0]="INDEX_SOAK"}}switch(f){case"(":case"{":case"[":this.ends.push(r[f]);break;case")":case"}":case"]":this.pair(f)}return this.token(e,f),f.length},a.prototype.sanitizeHeredoc=function(a,b){var c,d,e,f,g;e=b.indent,d=b.herecomment;if(d){l.test(a)&&this.error('block comment cannot contain "*/", starting');if(a.indexOf("\n")<=0)return a}else while(f=m.exec(a)){c=f[1];if(e===null||0<(g=c.length)&&gj;d=1<=j?++i:--i){if(c){--c;continue}switch(e=a.charAt(d)){case"\\":++c;continue;case b:h.pop();if(!h.length)return a.slice(0,+d+1||9e9);b=h[h.length-1];continue}b!=="}"||e!=='"'&&e!=="'"?b==="}"&&e==="/"&&(f=n.exec(a.slice(d))||G.exec(a.slice(d)))?c+=f[0].length-1:b==="}"&&e==="{"?h.push(b="}"):b==='"'&&g==="#"&&e==="{"&&h.push(b="}"):h.push(b=e),g=e}return this.error("missing "+h.pop()+", starting")},a.prototype.interpolateString=function(b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;c==null&&(c={}),e=c.heredoc,m=c.regex,o=[],l=0,f=-1;while(j=b.charAt(f+=1)){if(j==="\\"){f+=1;continue}if(j!=="#"||b.charAt(f+1)!=="{"||!(d=this.balancedString(b.slice(f+1),"}")))continue;l1&&(k.unshift(["(","(",this.line]),k.push([")",")",this.line])),o.push(["TOKENS",k])}f+=d.length,l=f+1}f>l&&l1)&&this.token("(","(");for(f=q=0,r=o.length;q|[-+*\/%<>&|^!?=]=|>>>=?|([-+:])\1|([&|<>])\2=?|\?\.|\.{2,3})/,P=/^[^\n\S]+/,h=/^###([^#][\s\S]*?)(?:###[^\n\S]*|(?:###)?$)|^(?:\s*#(?!##[^#]).*)+/,d=/^[-=]>/,B=/^(?:\n[^\n\S]*)+/,L=/^'[^\\']*(?:\\.[^\\']*)*'/,s=/^`[^\\`]*(?:\\.[^\\`]*)*`/,G=/^(\/(?![\s=])[^[\/\n\\]*(?:(?:\\[\s\S]|\[[^\]\n\\]*(?:\\[\s\S][^\]\n\\]*)*])[^[\/\n\\]*)*\/)([imgy]{0,4})(?!\w)/,n=/^\/{3}([\s\S]+?)\/{3}([imgy]{0,4})(?!\w)/,o=/\s+(?:#.*)?/g,A=/\n/g,m=/\n+([^\n\S]*)/g,l=/\*\//,w=/^\s*(?:,|\??\.(?![.\d])|::)/,N=/\s+$/,j=["-=","+=","/=","*=","%=","||=","&&=","?=","<<=",">>=",">>>=","&=","^=","|="],O=["!","~","NEW","TYPEOF","DELETE","DO"],x=["&&","||","&","|","^"],K=["<<",">>",">>>"],i=["==","!=","<",">","<=",">="],z=["*","/","%"],H=["IN","OF","INSTANCEOF"],b=["TRUE","FALSE"],C=["NUMBER","REGEX","BOOL","NULL","UNDEFINED","++","--","]"],D=C.concat(")","}","THIS","IDENTIFIER","STRING"),c=["IDENTIFIER","STRING","REGEX",")","]","}","?","::","@","THIS","SUPER"],q=c.concat("NUMBER","BOOL","NULL","UNDEFINED"),v=["INDENT","OUTDENT","TERMINATOR"]})).call(this)},require["./parser"]=new function(){var a=this,b=function(){var a={trace:function(){},yy:{},symbols_:{error:2,Root:3,Body:4,Block:5,TERMINATOR:6,Line:7,Expression:8,Statement:9,Return:10,Comment:11,STATEMENT:12,Value:13,Invocation:14,Code:15,Operation:16,Assign:17,If:18,Try:19,While:20,For:21,Switch:22,Class:23,Throw:24,INDENT:25,OUTDENT:26,Identifier:27,IDENTIFIER:28,AlphaNumeric:29,NUMBER:30,STRING:31,Literal:32,JS:33,REGEX:34,DEBUGGER:35,UNDEFINED:36,NULL:37,BOOL:38,Assignable:39,"=":40,AssignObj:41,ObjAssignable:42,":":43,ThisProperty:44,RETURN:45,HERECOMMENT:46,PARAM_START:47,ParamList:48,PARAM_END:49,FuncGlyph:50,"->":51,"=>":52,OptComma:53,",":54,Param:55,ParamVar:56,"...":57,Array:58,Object:59,Splat:60,SimpleAssignable:61,Accessor:62,Parenthetical:63,Range:64,This:65,".":66,"?.":67,"::":68,Index:69,INDEX_START:70,IndexValue:71,INDEX_END:72,INDEX_SOAK:73,Slice:74,"{":75,AssignList:76,"}":77,CLASS:78,EXTENDS:79,OptFuncExist:80,Arguments:81,SUPER:82,FUNC_EXIST:83,CALL_START:84,CALL_END:85,ArgList:86,THIS:87,"@":88,"[":89,"]":90,RangeDots:91,"..":92,Arg:93,SimpleArgs:94,TRY:95,Catch:96,FINALLY:97,CATCH:98,THROW:99,"(":100,")":101,WhileSource:102,WHILE:103,WHEN:104,UNTIL:105,Loop:106,LOOP:107,ForBody:108,FOR:109,ForStart:110,ForSource:111,ForVariables:112,OWN:113,ForValue:114,FORIN:115,FOROF:116,BY:117,SWITCH:118,Whens:119,ELSE:120,When:121,LEADING_WHEN:122,IfBlock:123,IF:124,POST_IF:125,UNARY:126,"-":127,"+":128,"--":129,"++":130,"?":131,MATH:132,SHIFT:133,COMPARE:134,LOGIC:135,RELATION:136,COMPOUND_ASSIGN:137,$accept:0,$end:1},terminals_:{2:"error",6:"TERMINATOR",12:"STATEMENT",25:"INDENT",26:"OUTDENT",28:"IDENTIFIER",30:"NUMBER",31:"STRING",33:"JS",34:"REGEX",35:"DEBUGGER",36:"UNDEFINED",37:"NULL",38:"BOOL",40:"=",43:":",45:"RETURN",46:"HERECOMMENT",47:"PARAM_START",49:"PARAM_END",51:"->",52:"=>",54:",",57:"...",66:".",67:"?.",68:"::",70:"INDEX_START",72:"INDEX_END",73:"INDEX_SOAK",75:"{",77:"}",78:"CLASS",79:"EXTENDS",82:"SUPER",83:"FUNC_EXIST",84:"CALL_START",85:"CALL_END",87:"THIS",88:"@",89:"[",90:"]",92:"..",95:"TRY",97:"FINALLY",98:"CATCH",99:"THROW",100:"(",101:")",103:"WHILE",104:"WHEN",105:"UNTIL",107:"LOOP",109:"FOR",113:"OWN",115:"FORIN",116:"FOROF",117:"BY",118:"SWITCH",120:"ELSE",122:"LEADING_WHEN",124:"IF",125:"POST_IF",126:"UNARY",127:"-",128:"+",129:"--",130:"++",131:"?",132:"MATH",133:"SHIFT",134:"COMPARE",135:"LOGIC",136:"RELATION",137:"COMPOUND_ASSIGN"},productions_:[0,[3,0],[3,1],[3,2],[4,1],[4,3],[4,2],[7,1],[7,1],[9,1],[9,1],[9,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[5,2],[5,3],[27,1],[29,1],[29,1],[32,1],[32,1],[32,1],[32,1],[32,1],[32,1],[32,1],[17,3],[17,4],[17,5],[41,1],[41,3],[41,5],[41,1],[42,1],[42,1],[42,1],[10,2],[10,1],[11,1],[15,5],[15,2],[50,1],[50,1],[53,0],[53,1],[48,0],[48,1],[48,3],[48,4],[48,6],[55,1],[55,2],[55,3],[56,1],[56,1],[56,1],[56,1],[60,2],[61,1],[61,2],[61,2],[61,1],[39,1],[39,1],[39,1],[13,1],[13,1],[13,1],[13,1],[13,1],[62,2],[62,2],[62,2],[62,1],[62,1],[69,3],[69,2],[71,1],[71,1],[59,4],[76,0],[76,1],[76,3],[76,4],[76,6],[23,1],[23,2],[23,3],[23,4],[23,2],[23,3],[23,4],[23,5],[14,3],[14,3],[14,1],[14,2],[80,0],[80,1],[81,2],[81,4],[65,1],[65,1],[44,2],[58,2],[58,4],[91,1],[91,1],[64,5],[74,3],[74,2],[74,2],[74,1],[86,1],[86,3],[86,4],[86,4],[86,6],[93,1],[93,1],[94,1],[94,3],[19,2],[19,3],[19,4],[19,5],[96,3],[24,2],[63,3],[63,5],[102,2],[102,4],[102,2],[102,4],[20,2],[20,2],[20,2],[20,1],[106,2],[106,2],[21,2],[21,2],[21,2],[108,2],[108,2],[110,2],[110,3],[114,1],[114,1],[114,1],[114,1],[112,1],[112,3],[111,2],[111,2],[111,4],[111,4],[111,4],[111,6],[111,6],[22,5],[22,7],[22,4],[22,6],[119,1],[119,2],[121,3],[121,4],[123,3],[123,5],[18,1],[18,3],[18,3],[18,3],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,5],[16,3]],performAction:function(b,c,d,e,f,g,h){var i=g.length-1;switch(f){case 1:return this.$=new e.Block;case 2:return this.$=g[i];case 3:return this.$=g[i-1];case 4:this.$=e.Block.wrap([g[i]]);break;case 5:this.$=g[i-2].push(g[i]);break;case 6:this.$=g[i-1];break;case 7:this.$=g[i];break;case 8:this.$=g[i];break;case 9:this.$=g[i];break;case 10:this.$=g[i];break;case 11:this.$=new e.Literal(g[i]);break;case 12:this.$=g[i];break;case 13:this.$=g[i];break;case 14:this.$=g[i];break;case 15:this.$=g[i];break;case 16:this.$=g[i];break;case 17:this.$=g[i];break;case 18:this.$=g[i];break;case 19:this.$=g[i];break;case 20:this.$=g[i];break;case 21:this.$=g[i];break;case 22:this.$=g[i];break;case 23:this.$=g[i];break;case 24:this.$=new e.Block;break;case 25:this.$=g[i-1];break;case 26:this.$=new e.Literal(g[i]);break;case 27:this.$=new e.Literal(g[i]);break;case 28:this.$=new e.Literal(g[i]);break;case 29:this.$=g[i];break;case 30:this.$=new e.Literal(g[i]);break;case 31:this.$=new e.Literal(g[i]);break;case 32:this.$=new e.Literal(g[i]);break;case 33:this.$=new e.Undefined;break;case 34:this.$=new e.Null;break;case 35:this.$=new e.Bool(g[i]);break;case 36:this.$=new e.Assign(g[i-2],g[i]);break;case 37:this.$=new e.Assign(g[i-3],g[i]);break;case 38:this.$=new e.Assign(g[i-4],g[i-1]);break;case 39:this.$=new e.Value(g[i]);break;case 40:this.$=new e.Assign(new e.Value(g[i-2]),g[i],"object");break;case 41:this.$=new e.Assign(new e.Value(g[i-4]),g[i-1],"object");break;case 42:this.$=g[i];break;case 43:this.$=g[i];break;case 44:this.$=g[i];break;case 45:this.$=g[i];break;case 46:this.$=new e.Return(g[i]);break;case 47:this.$=new e.Return;break;case 48:this.$=new e.Comment(g[i]);break;case 49:this.$=new e.Code(g[i-3],g[i],g[i-1]);break;case 50:this.$=new e.Code([],g[i],g[i-1]);break;case 51:this.$="func";break;case 52:this.$="boundfunc";break;case 53:this.$=g[i];break;case 54:this.$=g[i];break;case 55:this.$=[];break;case 56:this.$=[g[i]];break;case 57:this.$=g[i-2].concat(g[i]);break;case 58:this.$=g[i-3].concat(g[i]);break;case 59:this.$=g[i-5].concat(g[i-2]);break;case 60:this.$=new e.Param(g[i]);break;case 61:this.$=new e.Param(g[i-1],null,!0);break;case 62:this.$=new e.Param(g[i-2],g[i]);break;case 63:this.$=g[i];break;case 64:this.$=g[i];break;case 65:this.$=g[i];break;case 66:this.$=g[i];break;case 67:this.$=new e.Splat(g[i-1]);break;case 68:this.$=new e.Value(g[i]);break;case 69:this.$=g[i-1].add(g[i]);break;case 70:this.$=new e.Value(g[i-1],[].concat(g[i]));break;case 71:this.$=g[i];break;case 72:this.$=g[i];break;case 73:this.$=new e.Value(g[i]);break;case 74:this.$=new e.Value(g[i]);break;case 75:this.$=g[i];break;case 76:this.$=new e.Value(g[i]);break;case 77:this.$=new e.Value(g[i]);break;case 78:this.$=new e.Value(g[i]);break;case 79:this.$=g[i];break;case 80:this.$=new e.Access(g[i]);break;case 81:this.$=new e.Access(g[i],"soak");break;case 82:this.$=[new e.Access(new e.Literal("prototype")),new e.Access(g[i])];break;case 83:this.$=new e.Access(new e.Literal("prototype"));break;case 84:this.$=g[i];break;case 85:this.$=g[i-1];break;case 86:this.$=e.extend(g[i],{soak:!0});break;case 87:this.$=new e.Index(g[i]);break;case 88:this.$=new e.Slice(g[i]);break;case 89:this.$=new e.Obj(g[i-2],g[i-3].generated);break;case 90:this.$=[];break;case 91:this.$=[g[i]];break;case 92:this.$=g[i-2].concat(g[i]);break;case 93:this.$=g[i-3].concat(g[i]);break;case 94:this.$=g[i-5].concat(g[i-2]);break;case 95:this.$=new e.Class;break;case 96:this.$=new e.Class(null,null,g[i]);break;case 97:this.$=new e.Class(null,g[i]);break;case 98:this.$=new e.Class(null,g[i-1],g[i]);break;case 99:this.$=new e.Class(g[i]);break;case 100:this.$=new e.Class(g[i-1],null,g[i]);break;case 101:this.$=new e.Class(g[i-2],g[i]);break;case 102:this.$=new e.Class(g[i-3],g[i-1],g[i]);break;case 103:this.$=new e.Call(g[i-2],g[i],g[i-1]);break;case 104:this.$=new e.Call(g[i-2],g[i],g[i-1]);break;case 105:this.$=new e.Call("super",[new e.Splat(new e.Literal("arguments"))]);break;case 106:this.$=new e.Call("super",g[i]);break;case 107:this.$=!1;break;case 108:this.$=!0;break;case 109:this.$=[];break;case 110:this.$=g[i-2];break;case 111:this.$=new e.Value(new e.Literal("this"));break;case 112:this.$=new e.Value(new e.Literal("this"));break;case 113:this.$=new e.Value(new e.Literal("this"),[new e.Access(g[i])],"this");break;case 114:this.$=new e.Arr([]);break;case 115:this.$=new e.Arr(g[i-2]);break;case 116:this.$="inclusive";break;case 117:this.$="exclusive";break;case 118:this.$=new e.Range(g[i-3],g[i-1],g[i-2]);break;case 119:this.$=new e.Range(g[i-2],g[i],g[i-1]);break;case 120:this.$=new e.Range(g[i-1],null,g[i]);break;case 121:this.$=new e.Range(null,g[i],g[i-1]);break;case 122:this.$=new e.Range(null,null,g[i]);break;case 123:this.$=[g[i]];break;case 124:this.$=g[i-2].concat(g[i]);break;case 125:this.$=g[i-3].concat(g[i]);break;case 126:this.$=g[i-2];break;case 127:this.$=g[i-5].concat(g[i-2]);break;case 128:this.$=g[i];break;case 129:this.$=g[i];break;case 130:this.$=g[i];break;case 131:this.$=[].concat(g[i-2],g[i]);break;case 132:this.$=new e.Try(g[i]);break;case 133:this.$=new e.Try(g[i-1],g[i][0],g[i][1]);break;case 134:this.$=new e.Try(g[i-2],null,null,g[i]);break;case 135:this.$=new e.Try(g[i-3],g[i-2][0],g[i-2][1],g[i]);break;case 136:this.$=[g[i-1],g[i]];break;case 137:this.$=new e.Throw(g[i]);break;case 138:this.$=new e.Parens(g[i-1]);break;case 139:this.$=new e.Parens(g[i-2]);break;case 140:this.$=new e.While(g[i]);break;case 141:this.$=new e.While(g[i-2],{guard:g[i]});break;case 142:this.$=new e.While(g[i],{invert:!0});break;case 143:this.$=new e.While(g[i-2],{invert:!0,guard:g[i]});break;case 144:this.$=g[i-1].addBody(g[i]);break;case 145:this.$=g[i].addBody(e.Block.wrap([g[i-1]]));break;case 146:this.$=g[i].addBody(e.Block.wrap([g[i-1]]));break;case 147:this.$=g[i];break;case 148:this.$=(new e.While(new e.Literal("true"))).addBody(g[i]);break;case 149:this.$=(new e.While(new e.Literal("true"))).addBody(e.Block.wrap([g[i]]));break;case 150:this.$=new e.For(g[i-1],g[i]);break;case 151:this.$=new e.For(g[i-1],g[i]);break;case 152:this.$=new e.For(g[i],g[i-1]);break;case 153:this.$={source:new e.Value(g[i])};break;case 154:this.$=function(){return g[i].own=g[i-1].own,g[i].name=g[i-1][0],g[i].index=g[i-1][1],g[i]}();break;case 155:this.$=g[i];break;case 156:this.$=function(){return g[i].own=!0,g[i]}();break;case 157:this.$=g[i];break;case 158:this.$=g[i];break;case 159:this.$=new e.Value(g[i]);break;case 160:this.$=new e.Value(g[i]);break;case 161:this.$=[g[i]];break;case 162:this.$=[g[i-2],g[i]];break;case 163:this.$={source:g[i]};break;case 164:this.$={source:g[i],object:!0};break;case 165:this.$={source:g[i-2],guard:g[i]};break;case 166:this.$={source:g[i-2],guard:g[i],object:!0};break;case 167:this.$={source:g[i-2],step:g[i]};break;case 168:this.$={source:g[i-4],guard:g[i-2],step:g[i]};break;case 169:this.$={source:g[i-4],step:g[i-2],guard:g[i]};break;case 170:this.$=new e.Switch(g[i-3],g[i-1]);break;case 171:this.$=new e.Switch(g[i-5],g[i-3],g[i-1]);break;case 172:this.$=new e.Switch(null,g[i-1]);break;case 173:this.$=new e.Switch(null,g[i-3],g[i-1]);break;case 174:this.$=g[i];break;case 175:this.$=g[i-1].concat(g[i]);break;case 176:this.$=[[g[i-1],g[i]]];break;case 177:this.$=[[g[i-2],g[i-1]]];break;case 178:this.$=new e.If(g[i-1],g[i],{type:g[i-2]});break;case 179:this.$=g[i-4].addElse(new e.If(g[i-1],g[i],{type:g[i-2]}));break;case 180:this.$=g[i];break;case 181:this.$=g[i-2].addElse(g[i]);break;case 182:this.$=new e.If(g[i],e.Block.wrap([g[i-2]]),{type:g[i-1],statement:!0});break;case 183:this.$=new e.If(g[i],e.Block.wrap([g[i-2]]),{type:g[i-1],statement:!0});break;case 184:this.$=new e.Op(g[i-1],g[i]);break;case 185:this.$=new e.Op("-",g[i]);break;case 186:this.$=new e.Op("+",g[i]);break;case 187:this.$=new e.Op("--",g[i]);break;case 188:this.$=new e.Op("++",g[i]);break;case 189:this.$=new e.Op("--",g[i-1],null,!0);break;case 190:this.$=new e.Op("++",g[i-1],null,!0);break;case 191:this.$=new e.Existence(g[i-1]);break;case 192:this.$=new e.Op("+",g[i-2],g[i]);break;case 193:this.$=new e.Op("-",g[i-2],g[i]);break;case 194:this.$=new e.Op(g[i-1],g[i-2],g[i]);break;case 195:this.$=new e.Op(g[i-1],g[i-2],g[i]);break;case 196:this.$=new e.Op(g[i-1],g[i-2],g[i]);break;case 197:this.$=new e.Op(g[i-1],g[i-2],g[i]);break;case 198:this.$=function(){return g[i-1].charAt(0)==="!"?(new e.Op(g[i-1].slice(1),g[i-2],g[i])).invert():new e.Op(g[i-1],g[i-2],g[i])}();break;case 199:this.$=new e.Assign(g[i-2],g[i],g[i-1]);break;case 200:this.$=new e.Assign(g[i-4],g[i-1],g[i-3]);break;case 201:this.$=new e.Extends(g[i-2],g[i])}},table:[{1:[2,1],3:1,4:2,5:3,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,5],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[3]},{1:[2,2],6:[1,74]},{6:[1,75]},{1:[2,4],6:[2,4],26:[2,4],101:[2,4]},{4:77,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[1,76],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,7],6:[2,7],26:[2,7],101:[2,7],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,8],6:[2,8],26:[2,8],101:[2,8],102:90,103:[1,65],105:[1,66],108:91,109:[1,68],110:69,125:[1,89]},{1:[2,12],6:[2,12],25:[2,12],26:[2,12],49:[2,12],54:[2,12],57:[2,12],62:93,66:[1,95],67:[1,96],68:[1,97],69:98,70:[1,99],72:[2,12],73:[1,100],77:[2,12],80:92,83:[1,94],84:[2,107],85:[2,12],90:[2,12],92:[2,12],101:[2,12],103:[2,12],104:[2,12],105:[2,12],109:[2,12],117:[2,12],125:[2,12],127:[2,12],128:[2,12],131:[2,12],132:[2,12],133:[2,12],134:[2,12],135:[2,12],136:[2,12]},{1:[2,13],6:[2,13],25:[2,13],26:[2,13],49:[2,13],54:[2,13],57:[2,13],62:102,66:[1,95],67:[1,96],68:[1,97],69:98,70:[1,99],72:[2,13],73:[1,100],77:[2,13],80:101,83:[1,94],84:[2,107],85:[2,13],90:[2,13],92:[2,13],101:[2,13],103:[2,13],104:[2,13],105:[2,13],109:[2,13],117:[2,13],125:[2,13],127:[2,13],128:[2,13],131:[2,13],132:[2,13],133:[2,13],134:[2,13],135:[2,13],136:[2,13]},{1:[2,14],6:[2,14],25:[2,14],26:[2,14],49:[2,14],54:[2,14],57:[2,14],72:[2,14],77:[2,14],85:[2,14],90:[2,14],92:[2,14],101:[2,14],103:[2,14],104:[2,14],105:[2,14],109:[2,14],117:[2,14],125:[2,14],127:[2,14],128:[2,14],131:[2,14],132:[2,14],133:[2,14],134:[2,14],135:[2,14],136:[2,14]},{1:[2,15],6:[2,15],25:[2,15],26:[2,15],49:[2,15],54:[2,15],57:[2,15],72:[2,15],77:[2,15],85:[2,15],90:[2,15],92:[2,15],101:[2,15],103:[2,15],104:[2,15],105:[2,15],109:[2,15],117:[2,15],125:[2,15],127:[2,15],128:[2,15],131:[2,15],132:[2,15],133:[2,15],134:[2,15],135:[2,15],136:[2,15]},{1:[2,16],6:[2,16],25:[2,16],26:[2,16],49:[2,16],54:[2,16],57:[2,16],72:[2,16],77:[2,16],85:[2,16],90:[2,16],92:[2,16],101:[2,16],103:[2,16],104:[2,16],105:[2,16],109:[2,16],117:[2,16],125:[2,16],127:[2,16],128:[2,16],131:[2,16],132:[2,16],133:[2,16],134:[2,16],135:[2,16],136:[2,16]},{1:[2,17],6:[2,17],25:[2,17],26:[2,17],49:[2,17],54:[2,17],57:[2,17],72:[2,17],77:[2,17],85:[2,17],90:[2,17],92:[2,17],101:[2,17],103:[2,17],104:[2,17],105:[2,17],109:[2,17],117:[2,17],125:[2,17],127:[2,17],128:[2,17],131:[2,17],132:[2,17],133:[2,17],134:[2,17],135:[2,17],136:[2,17]},{1:[2,18],6:[2,18],25:[2,18],26:[2,18],49:[2,18],54:[2,18],57:[2,18],72:[2,18],77:[2,18],85:[2,18],90:[2,18],92:[2,18],101:[2,18],103:[2,18],104:[2,18],105:[2,18],109:[2,18],117:[2,18],125:[2,18],127:[2,18],128:[2,18],131:[2,18],132:[2,18],133:[2,18],134:[2,18],135:[2,18],136:[2,18]},{1:[2,19],6:[2,19],25:[2,19],26:[2,19],49:[2,19],54:[2,19],57:[2,19],72:[2,19],77:[2,19],85:[2,19],90:[2,19],92:[2,19],101:[2,19],103:[2,19],104:[2,19],105:[2,19],109:[2,19],117:[2,19],125:[2,19],127:[2,19],128:[2,19],131:[2,19],132:[2,19],133:[2,19],134:[2,19],135:[2,19],136:[2,19]},{1:[2,20],6:[2,20],25:[2,20],26:[2,20],49:[2,20],54:[2,20],57:[2,20],72:[2,20],77:[2,20],85:[2,20],90:[2,20],92:[2,20],101:[2,20],103:[2,20],104:[2,20],105:[2,20],109:[2,20],117:[2,20],125:[2,20],127:[2,20],128:[2,20],131:[2,20],132:[2,20],133:[2,20],134:[2,20],135:[2,20],136:[2,20]},{1:[2,21],6:[2,21],25:[2,21],26:[2,21],49:[2,21],54:[2,21],57:[2,21],72:[2,21],77:[2,21],85:[2,21],90:[2,21],92:[2,21],101:[2,21],103:[2,21],104:[2,21],105:[2,21],109:[2,21],117:[2,21],125:[2,21],127:[2,21],128:[2,21],131:[2,21],132:[2,21],133:[2,21],134:[2,21],135:[2,21],136:[2,21]},{1:[2,22],6:[2,22],25:[2,22],26:[2,22],49:[2,22],54:[2,22],57:[2,22],72:[2,22],77:[2,22],85:[2,22],90:[2,22],92:[2,22],101:[2,22],103:[2,22],104:[2,22],105:[2,22],109:[2,22],117:[2,22],125:[2,22],127:[2,22],128:[2,22],131:[2,22],132:[2,22],133:[2,22],134:[2,22],135:[2,22],136:[2,22]},{1:[2,23],6:[2,23],25:[2,23],26:[2,23],49:[2,23],54:[2,23],57:[2,23],72:[2,23],77:[2,23],85:[2,23],90:[2,23],92:[2,23],101:[2,23],103:[2,23],104:[2,23],105:[2,23],109:[2,23],117:[2,23],125:[2,23],127:[2,23],128:[2,23],131:[2,23],132:[2,23],133:[2,23],134:[2,23],135:[2,23],136:[2,23]},{1:[2,9],6:[2,9],26:[2,9],101:[2,9],103:[2,9],105:[2,9],109:[2,9],125:[2,9]},{1:[2,10],6:[2,10],26:[2,10],101:[2,10],103:[2,10],105:[2,10],109:[2,10],125:[2,10]},{1:[2,11],6:[2,11],26:[2,11],101:[2,11],103:[2,11],105:[2,11],109:[2,11],125:[2,11]},{1:[2,75],6:[2,75],25:[2,75],26:[2,75],40:[1,103],49:[2,75],54:[2,75],57:[2,75],66:[2,75],67:[2,75],68:[2,75],70:[2,75],72:[2,75],73:[2,75],77:[2,75],83:[2,75],84:[2,75],85:[2,75],90:[2,75],92:[2,75],101:[2,75],103:[2,75],104:[2,75],105:[2,75],109:[2,75],117:[2,75],125:[2,75],127:[2,75],128:[2,75],131:[2,75],132:[2,75],133:[2,75],134:[2,75],135:[2,75],136:[2,75]},{1:[2,76],6:[2,76],25:[2,76],26:[2,76],49:[2,76],54:[2,76],57:[2,76],66:[2,76],67:[2,76],68:[2,76],70:[2,76],72:[2,76],73:[2,76],77:[2,76],83:[2,76],84:[2,76],85:[2,76],90:[2,76],92:[2,76],101:[2,76],103:[2,76],104:[2,76],105:[2,76],109:[2,76],117:[2,76],125:[2,76],127:[2,76],128:[2,76],131:[2,76],132:[2,76],133:[2,76],134:[2,76],135:[2,76],136:[2,76]},{1:[2,77],6:[2,77],25:[2,77],26:[2,77],49:[2,77],54:[2,77],57:[2,77],66:[2,77],67:[2,77],68:[2,77],70:[2,77],72:[2,77],73:[2,77],77:[2,77],83:[2,77],84:[2,77],85:[2,77],90:[2,77],92:[2,77],101:[2,77],103:[2,77],104:[2,77],105:[2,77],109:[2,77],117:[2,77],125:[2,77],127:[2,77],128:[2,77],131:[2,77],132:[2,77],133:[2,77],134:[2,77],135:[2,77],136:[2,77]},{1:[2,78],6:[2,78],25:[2,78],26:[2,78],49:[2,78],54:[2,78],57:[2,78],66:[2,78],67:[2,78],68:[2,78],70:[2,78],72:[2,78],73:[2,78],77:[2,78],83:[2,78],84:[2,78],85:[2,78],90:[2,78],92:[2,78],101:[2,78],103:[2,78],104:[2,78],105:[2,78],109:[2,78],117:[2,78],125:[2,78],127:[2,78],128:[2,78],131:[2,78],132:[2,78],133:[2,78],134:[2,78],135:[2,78],136:[2,78]},{1:[2,79],6:[2,79],25:[2,79],26:[2,79],49:[2,79],54:[2,79],57:[2,79],66:[2,79],67:[2,79],68:[2,79],70:[2,79],72:[2,79],73:[2,79],77:[2,79],83:[2,79],84:[2,79],85:[2,79],90:[2,79],92:[2,79],101:[2,79],103:[2,79],104:[2,79],105:[2,79],109:[2,79],117:[2,79],125:[2,79],127:[2,79],128:[2,79],131:[2,79],132:[2,79],133:[2,79],134:[2,79],135:[2,79],136:[2,79]},{1:[2,105],6:[2,105],25:[2,105],26:[2,105],49:[2,105],54:[2,105],57:[2,105],66:[2,105],67:[2,105],68:[2,105],70:[2,105],72:[2,105],73:[2,105],77:[2,105],81:104,83:[2,105],84:[1,105],85:[2,105],90:[2,105],92:[2,105],101:[2,105],103:[2,105],104:[2,105],105:[2,105],109:[2,105],117:[2,105],125:[2,105],127:[2,105],128:[2,105],131:[2,105],132:[2,105],133:[2,105],134:[2,105],135:[2,105],136:[2,105]},{6:[2,55],25:[2,55],27:109,28:[1,73],44:110,48:106,49:[2,55],54:[2,55],55:107,56:108,58:111,59:112,75:[1,70],88:[1,113],89:[1,114]},{5:115,25:[1,5]},{8:116,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:118,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:119,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{13:121,14:122,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:123,44:63,58:47,59:48,61:120,63:25,64:26,65:27,75:[1,70],82:[1,28],87:[1,58],88:[1,59],89:[1,57],100:[1,56]},{13:121,14:122,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:123,44:63,58:47,59:48,61:124,63:25,64:26,65:27,75:[1,70],82:[1,28],87:[1,58],88:[1,59],89:[1,57],100:[1,56]},{1:[2,72],6:[2,72],25:[2,72],26:[2,72],40:[2,72],49:[2,72],54:[2,72],57:[2,72],66:[2,72],67:[2,72],68:[2,72],70:[2,72],72:[2,72],73:[2,72],77:[2,72],79:[1,128],83:[2,72],84:[2,72],85:[2,72],90:[2,72],92:[2,72],101:[2,72],103:[2,72],104:[2,72],105:[2,72],109:[2,72],117:[2,72],125:[2,72],127:[2,72],128:[2,72],129:[1,125],130:[1,126],131:[2,72],132:[2,72],133:[2,72],134:[2,72],135:[2,72],136:[2,72],137:[1,127]},{1:[2,180],6:[2,180],25:[2,180],26:[2,180],49:[2,180],54:[2,180],57:[2,180],72:[2,180],77:[2,180],85:[2,180],90:[2,180],92:[2,180],101:[2,180],103:[2,180],104:[2,180],105:[2,180],109:[2,180],117:[2,180],120:[1,129],125:[2,180],127:[2,180],128:[2,180],131:[2,180],132:[2,180],133:[2,180],134:[2,180],135:[2,180],136:[2,180]},{5:130,25:[1,5]},{5:131,25:[1,5]},{1:[2,147],6:[2,147],25:[2,147],26:[2,147],49:[2,147],54:[2,147],57:[2,147],72:[2,147],77:[2,147],85:[2,147],90:[2,147],92:[2,147],101:[2,147],103:[2,147],104:[2,147],105:[2,147],109:[2,147],117:[2,147],125:[2,147],127:[2,147],128:[2,147],131:[2,147],132:[2,147],133:[2,147],134:[2,147],135:[2,147],136:[2,147]},{5:132,25:[1,5]},{8:133,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,134],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,95],5:135,6:[2,95],13:121,14:122,25:[1,5],26:[2,95],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:123,44:63,49:[2,95],54:[2,95],57:[2,95],58:47,59:48,61:137,63:25,64:26,65:27,72:[2,95],75:[1,70],77:[2,95],79:[1,136],82:[1,28],85:[2,95],87:[1,58],88:[1,59],89:[1,57],90:[2,95],92:[2,95],100:[1,56],101:[2,95],103:[2,95],104:[2,95],105:[2,95],109:[2,95],117:[2,95],125:[2,95],127:[2,95],128:[2,95],131:[2,95],132:[2,95],133:[2,95],134:[2,95],135:[2,95],136:[2,95]},{8:138,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,47],6:[2,47],8:139,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[2,47],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],101:[2,47],102:39,103:[2,47],105:[2,47],106:40,107:[1,67],108:41,109:[2,47],110:69,118:[1,42],123:37,124:[1,64],125:[2,47],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,48],6:[2,48],25:[2,48],26:[2,48],54:[2,48],77:[2,48],101:[2,48],103:[2,48],105:[2,48],109:[2,48],125:[2,48]},{1:[2,73],6:[2,73],25:[2,73],26:[2,73],40:[2,73],49:[2,73],54:[2,73],57:[2,73],66:[2,73],67:[2,73],68:[2,73],70:[2,73],72:[2,73],73:[2,73],77:[2,73],83:[2,73],84:[2,73],85:[2,73],90:[2,73],92:[2,73],101:[2,73],103:[2,73],104:[2,73],105:[2,73],109:[2,73],117:[2,73],125:[2,73],127:[2,73],128:[2,73],131:[2,73],132:[2,73],133:[2,73],134:[2,73],135:[2,73],136:[2,73]},{1:[2,74],6:[2,74],25:[2,74],26:[2,74],40:[2,74],49:[2,74],54:[2,74],57:[2,74],66:[2,74],67:[2,74],68:[2,74],70:[2,74],72:[2,74],73:[2,74],77:[2,74],83:[2,74],84:[2,74],85:[2,74],90:[2,74],92:[2,74],101:[2,74],103:[2,74],104:[2,74],105:[2,74],109:[2,74],117:[2,74],125:[2,74],127:[2,74],128:[2,74],131:[2,74],132:[2,74],133:[2,74],134:[2,74],135:[2,74],136:[2,74]},{1:[2,29],6:[2,29],25:[2,29],26:[2,29],49:[2,29],54:[2,29],57:[2,29],66:[2,29],67:[2,29],68:[2,29],70:[2,29],72:[2,29],73:[2,29],77:[2,29],83:[2,29],84:[2,29],85:[2,29],90:[2,29],92:[2,29],101:[2,29],103:[2,29],104:[2,29],105:[2,29],109:[2,29],117:[2,29],125:[2,29],127:[2,29],128:[2,29],131:[2,29],132:[2,29],133:[2,29],134:[2,29],135:[2,29],136:[2,29]},{1:[2,30],6:[2,30],25:[2,30],26:[2,30],49:[2,30],54:[2,30],57:[2,30],66:[2,30],67:[2,30],68:[2,30],70:[2,30],72:[2,30],73:[2,30],77:[2,30],83:[2,30],84:[2,30],85:[2,30],90:[2,30],92:[2,30],101:[2,30],103:[2,30],104:[2,30],105:[2,30],109:[2,30],117:[2,30],125:[2,30],127:[2,30],128:[2,30],131:[2,30],132:[2,30],133:[2,30],134:[2,30],135:[2,30],136:[2,30]},{1:[2,31],6:[2,31],25:[2,31],26:[2,31],49:[2,31],54:[2,31],57:[2,31],66:[2,31],67:[2,31],68:[2,31],70:[2,31],72:[2,31],73:[2,31],77:[2,31],83:[2,31],84:[2,31],85:[2,31],90:[2,31],92:[2,31],101:[2,31],103:[2,31],104:[2,31],105:[2,31],109:[2,31],117:[2,31],125:[2,31],127:[2,31],128:[2,31],131:[2,31],132:[2,31],133:[2,31],134:[2,31],135:[2,31],136:[2,31]},{1:[2,32],6:[2,32],25:[2,32],26:[2,32],49:[2,32],54:[2,32],57:[2,32],66:[2,32],67:[2,32],68:[2,32],70:[2,32],72:[2,32],73:[2,32],77:[2,32],83:[2,32],84:[2,32],85:[2,32],90:[2,32],92:[2,32],101:[2,32],103:[2,32],104:[2,32],105:[2,32],109:[2,32],117:[2,32],125:[2,32],127:[2,32],128:[2,32],131:[2,32],132:[2,32],133:[2,32],134:[2,32],135:[2,32],136:[2,32]},{1:[2,33],6:[2,33],25:[2,33],26:[2,33],49:[2,33],54:[2,33],57:[2,33],66:[2,33],67:[2,33],68:[2,33],70:[2,33],72:[2,33],73:[2,33],77:[2,33],83:[2,33],84:[2,33],85:[2,33],90:[2,33],92:[2,33],101:[2,33],103:[2,33],104:[2,33],105:[2,33],109:[2,33],117:[2,33],125:[2,33],127:[2,33],128:[2,33],131:[2,33],132:[2,33],133:[2,33],134:[2,33],135:[2,33],136:[2,33]},{1:[2,34],6:[2,34],25:[2,34],26:[2,34],49:[2,34],54:[2,34],57:[2,34],66:[2,34],67:[2,34],68:[2,34],70:[2,34],72:[2,34],73:[2,34],77:[2,34],83:[2,34],84:[2,34],85:[2,34],90:[2,34],92:[2,34],101:[2,34],103:[2,34],104:[2,34],105:[2,34],109:[2,34],117:[2,34],125:[2,34],127:[2,34],128:[2,34],131:[2,34],132:[2,34],133:[2,34],134:[2,34],135:[2,34],136:[2,34]},{1:[2,35],6:[2,35],25:[2,35],26:[2,35],49:[2,35],54:[2,35],57:[2,35],66:[2,35],67:[2,35],68:[2,35],70:[2,35],72:[2,35],73:[2,35],77:[2,35],83:[2,35],84:[2,35],85:[2,35],90:[2,35],92:[2,35],101:[2,35],103:[2,35],104:[2,35],105:[2,35],109:[2,35],117:[2,35],125:[2,35],127:[2,35],128:[2,35],131:[2,35],132:[2,35],133:[2,35],134:[2,35],135:[2,35],136:[2,35]},{4:140,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,141],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:142,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,146],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:147,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],86:144,87:[1,58],88:[1,59],89:[1,57],90:[1,143],93:145,95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,111],6:[2,111],25:[2,111],26:[2,111],49:[2,111],54:[2,111],57:[2,111],66:[2,111],67:[2,111],68:[2,111],70:[2,111],72:[2,111],73:[2,111],77:[2,111],83:[2,111],84:[2,111],85:[2,111],90:[2,111],92:[2,111],101:[2,111],103:[2,111],104:[2,111],105:[2,111],109:[2,111],117:[2,111],125:[2,111],127:[2,111],128:[2,111],131:[2,111],132:[2,111],133:[2,111],134:[2,111],135:[2,111],136:[2,111]},{1:[2,112],6:[2,112],25:[2,112],26:[2,112],27:148,28:[1,73],49:[2,112],54:[2,112],57:[2,112],66:[2,112],67:[2,112],68:[2,112],70:[2,112],72:[2,112],73:[2,112],77:[2,112],83:[2,112],84:[2,112],85:[2,112],90:[2,112],92:[2,112],101:[2,112],103:[2,112],104:[2,112],105:[2,112],109:[2,112],117:[2,112],125:[2,112],127:[2,112],128:[2,112],131:[2,112],132:[2,112],133:[2,112],134:[2,112],135:[2,112],136:[2,112]},{25:[2,51]},{25:[2,52]},{1:[2,68],6:[2,68],25:[2,68],26:[2,68],40:[2,68],49:[2,68],54:[2,68],57:[2,68],66:[2,68],67:[2,68],68:[2,68],70:[2,68],72:[2,68],73:[2,68],77:[2,68],79:[2,68],83:[2,68],84:[2,68],85:[2,68],90:[2,68],92:[2,68],101:[2,68],103:[2,68],104:[2,68],105:[2,68],109:[2,68],117:[2,68],125:[2,68],127:[2,68],128:[2,68],129:[2,68],130:[2,68],131:[2,68],132:[2,68],133:[2,68],134:[2,68],135:[2,68],136:[2,68],137:[2,68]},{1:[2,71],6:[2,71],25:[2,71],26:[2,71],40:[2,71],49:[2,71],54:[2,71],57:[2,71],66:[2,71],67:[2,71],68:[2,71],70:[2,71],72:[2,71],73:[2,71],77:[2,71],79:[2,71],83:[2,71],84:[2,71],85:[2,71],90:[2,71],92:[2,71],101:[2,71],103:[2,71],104:[2,71],105:[2,71],109:[2,71],117:[2,71],125:[2,71],127:[2,71],128:[2,71],129:[2,71],130:[2,71],131:[2,71],132:[2,71],133:[2,71],134:[2,71],135:[2,71],136:[2,71],137:[2,71]},{8:149,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:150,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:151,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{5:152,8:153,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,5],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{27:158,28:[1,73],44:159,58:160,59:161,64:154,75:[1,70],88:[1,113],89:[1,57],112:155,113:[1,156],114:157},{111:162,115:[1,163],116:[1,164]},{6:[2,90],11:168,25:[2,90],27:169,28:[1,73],29:170,30:[1,71],31:[1,72],41:166,42:167,44:171,46:[1,46],54:[2,90],76:165,77:[2,90],88:[1,113]},{1:[2,27],6:[2,27],25:[2,27],26:[2,27],43:[2,27],49:[2,27],54:[2,27],57:[2,27],66:[2,27],67:[2,27],68:[2,27],70:[2,27],72:[2,27],73:[2,27],77:[2,27],83:[2,27],84:[2,27],85:[2,27],90:[2,27],92:[2,27],101:[2,27],103:[2,27],104:[2,27],105:[2,27],109:[2,27],117:[2,27],125:[2,27],127:[2,27],128:[2,27],131:[2,27],132:[2,27],133:[2,27],134:[2,27],135:[2,27],136:[2,27]},{1:[2,28],6:[2,28],25:[2,28],26:[2,28],43:[2,28],49:[2,28],54:[2,28],57:[2,28],66:[2,28],67:[2,28],68:[2,28],70:[2,28],72:[2,28],73:[2,28],77:[2,28],83:[2,28],84:[2,28],85:[2,28],90:[2,28],92:[2,28],101:[2,28],103:[2,28],104:[2,28],105:[2,28],109:[2,28],117:[2,28],125:[2,28],127:[2,28],128:[2,28],131:[2,28],132:[2,28],133:[2,28],134:[2,28],135:[2,28],136:[2,28]},{1:[2,26],6:[2,26],25:[2,26],26:[2,26],40:[2,26],43:[2,26],49:[2,26],54:[2,26],57:[2,26],66:[2,26],67:[2,26],68:[2,26],70:[2,26],72:[2,26],73:[2,26],77:[2,26],79:[2,26],83:[2,26],84:[2,26],85:[2,26],90:[2,26],92:[2,26],101:[2,26],103:[2,26],104:[2,26],105:[2,26],109:[2,26],115:[2,26],116:[2,26],117:[2,26],125:[2,26],127:[2,26],128:[2,26],129:[2,26],130:[2,26],131:[2,26],132:[2,26],133:[2,26],134:[2,26],135:[2,26],136:[2,26],137:[2,26]},{1:[2,6],6:[2,6],7:172,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[2,6],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],101:[2,6],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,3]},{1:[2,24],6:[2,24],25:[2,24],26:[2,24],49:[2,24],54:[2,24],57:[2,24],72:[2,24],77:[2,24],85:[2,24],90:[2,24],92:[2,24],97:[2,24],98:[2,24],101:[2,24],103:[2,24],104:[2,24],105:[2,24],109:[2,24],117:[2,24],120:[2,24],122:[2,24],125:[2,24],127:[2,24],128:[2,24],131:[2,24],132:[2,24],133:[2,24],134:[2,24],135:[2,24],136:[2,24]},{6:[1,74],26:[1,173]},{1:[2,191],6:[2,191],25:[2,191],26:[2,191],49:[2,191],54:[2,191],57:[2,191],72:[2,191],77:[2,191],85:[2,191],90:[2,191],92:[2,191],101:[2,191],103:[2,191],104:[2,191],105:[2,191],109:[2,191],117:[2,191],125:[2,191],127:[2,191],128:[2,191],131:[2,191],132:[2,191],133:[2,191],134:[2,191],135:[2,191],136:[2,191]},{8:174,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:175,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:176,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:177,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:178,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:179,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:180,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:181,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,146],6:[2,146],25:[2,146],26:[2,146],49:[2,146],54:[2,146],57:[2,146],72:[2,146],77:[2,146],85:[2,146],90:[2,146],92:[2,146],101:[2,146],103:[2,146],104:[2,146],105:[2,146],109:[2,146],117:[2,146],125:[2,146],127:[2,146],128:[2,146],131:[2,146],132:[2,146],133:[2,146],134:[2,146],135:[2,146],136:[2,146]},{1:[2,151],6:[2,151],25:[2,151],26:[2,151],49:[2,151],54:[2,151],57:[2,151],72:[2,151],77:[2,151],85:[2,151],90:[2,151],92:[2,151],101:[2,151],103:[2,151],104:[2,151],105:[2,151],109:[2,151],117:[2,151],125:[2,151],127:[2,151],128:[2,151],131:[2,151],132:[2,151],133:[2,151],134:[2,151],135:[2,151],136:[2,151]},{8:182,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,145],6:[2,145],25:[2,145],26:[2,145],49:[2,145],54:[2,145],57:[2,145],72:[2,145],77:[2,145],85:[2,145],90:[2,145],92:[2,145],101:[2,145],103:[2,145],104:[2,145],105:[2,145],109:[2,145],117:[2,145],125:[2,145],127:[2,145],128:[2,145],131:[2,145],132:[2,145],133:[2,145],134:[2,145],135:[2,145],136:[2,145]},{1:[2,150],6:[2,150],25:[2,150],26:[2,150],49:[2,150],54:[2,150],57:[2,150],72:[2,150],77:[2,150],85:[2,150],90:[2,150],92:[2,150],101:[2,150],103:[2,150],104:[2,150],105:[2,150],109:[2,150],117:[2,150],125:[2,150],127:[2,150],128:[2,150],131:[2,150],132:[2,150],133:[2,150],134:[2,150],135:[2,150],136:[2,150]},{81:183,84:[1,105]},{1:[2,69],6:[2,69],25:[2,69],26:[2,69],40:[2,69],49:[2,69],54:[2,69],57:[2,69],66:[2,69],67:[2,69],68:[2,69],70:[2,69],72:[2,69],73:[2,69],77:[2,69],79:[2,69],83:[2,69],84:[2,69],85:[2,69],90:[2,69],92:[2,69],101:[2,69],103:[2,69],104:[2,69],105:[2,69],109:[2,69],117:[2,69],125:[2,69],127:[2,69],128:[2,69],129:[2,69],130:[2,69],131:[2,69],132:[2,69],133:[2,69],134:[2,69],135:[2,69],136:[2,69],137:[2,69]},{84:[2,108]},{27:184,28:[1,73]},{27:185,28:[1,73]},{1:[2,83],6:[2,83],25:[2,83],26:[2,83],27:186,28:[1,73],40:[2,83],49:[2,83],54:[2,83],57:[2,83],66:[2,83],67:[2,83],68:[2,83],70:[2,83],72:[2,83],73:[2,83],77:[2,83],79:[2,83],83:[2,83],84:[2,83],85:[2,83],90:[2,83],92:[2,83],101:[2,83],103:[2,83],104:[2,83],105:[2,83],109:[2,83],117:[2,83],125:[2,83],127:[2,83],128:[2,83],129:[2,83],130:[2,83],131:[2,83],132:[2,83],133:[2,83],134:[2,83],135:[2,83],136:[2,83],137:[2,83]},{1:[2,84],6:[2,84],25:[2,84],26:[2,84],40:[2,84],49:[2,84],54:[2,84],57:[2,84],66:[2,84],67:[2,84],68:[2,84],70:[2,84],72:[2,84],73:[2,84],77:[2,84],79:[2,84],83:[2,84],84:[2,84],85:[2,84],90:[2,84],92:[2,84],101:[2,84],103:[2,84],104:[2,84],105:[2,84],109:[2,84],117:[2,84],125:[2,84],127:[2,84],128:[2,84],129:[2,84],130:[2,84],131:[2,84],132:[2,84],133:[2,84],134:[2,84],135:[2,84],136:[2,84],137:[2,84]},{8:188,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],57:[1,192],58:47,59:48,61:36,63:25,64:26,65:27,71:187,74:189,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],91:190,92:[1,191],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{69:193,70:[1,99],73:[1,100]},{81:194,84:[1,105]},{1:[2,70],6:[2,70],25:[2,70],26:[2,70],40:[2,70],49:[2,70],54:[2,70],57:[2,70],66:[2,70],67:[2,70],68:[2,70],70:[2,70],72:[2,70],73:[2,70],77:[2,70],79:[2,70],83:[2,70],84:[2,70],85:[2,70],90:[2,70],92:[2,70],101:[2,70],103:[2,70],104:[2,70],105:[2,70],109:[2,70],117:[2,70],125:[2,70],127:[2,70],128:[2,70],129:[2,70],130:[2,70],131:[2,70],132:[2,70],133:[2,70],134:[2,70],135:[2,70],136:[2,70],137:[2,70]},{6:[1,196],8:195,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,197],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,106],6:[2,106],25:[2,106],26:[2,106],49:[2,106],54:[2,106],57:[2,106],66:[2,106],67:[2,106],68:[2,106],70:[2,106],72:[2,106],73:[2,106],77:[2,106],83:[2,106],84:[2,106],85:[2,106],90:[2,106],92:[2,106],101:[2,106],103:[2,106],104:[2,106],105:[2,106],109:[2,106],117:[2,106],125:[2,106],127:[2,106],128:[2,106],131:[2,106],132:[2,106],133:[2,106],134:[2,106],135:[2,106],136:[2,106]},{8:200,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,146],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:147,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],85:[1,198],86:199,87:[1,58],88:[1,59],89:[1,57],93:145,95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{6:[2,53],25:[2,53],49:[1,201],53:203,54:[1,202]},{6:[2,56],25:[2,56],26:[2,56],49:[2,56],54:[2,56]},{6:[2,60],25:[2,60],26:[2,60],40:[1,205],49:[2,60],54:[2,60],57:[1,204]},{6:[2,63],25:[2,63],26:[2,63],40:[2,63],49:[2,63],54:[2,63],57:[2,63]},{6:[2,64],25:[2,64],26:[2,64],40:[2,64],49:[2,64],54:[2,64],57:[2,64]},{6:[2,65],25:[2,65],26:[2,65],40:[2,65],49:[2,65],54:[2,65],57:[2,65]},{6:[2,66],25:[2,66],26:[2,66],40:[2,66],49:[2,66],54:[2,66],57:[2,66]},{27:148,28:[1,73]},{8:200,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,146],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:147,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],86:144,87:[1,58],88:[1,59],89:[1,57],90:[1,143],93:145,95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,50],6:[2,50],25:[2,50],26:[2,50],49:[2,50],54:[2,50],57:[2,50],72:[2,50],77:[2,50],85:[2,50],90:[2,50],92:[2,50],101:[2,50],103:[2,50],104:[2,50],105:[2,50],109:[2,50],117:[2,50],125:[2,50],127:[2,50],128:[2,50],131:[2,50],132:[2,50],133:[2,50],134:[2,50],135:[2,50],136:[2,50]},{1:[2,184],6:[2,184],25:[2,184],26:[2,184],49:[2,184],54:[2,184],57:[2,184],72:[2,184],77:[2,184],85:[2,184],90:[2,184],92:[2,184],101:[2,184],102:87,103:[2,184],104:[2,184],105:[2,184],108:88,109:[2,184],110:69,117:[2,184],125:[2,184],127:[2,184],128:[2,184],131:[1,78],132:[2,184],133:[2,184],134:[2,184],135:[2,184],136:[2,184]},{102:90,103:[1,65],105:[1,66],108:91,109:[1,68],110:69,125:[1,89]},{1:[2,185],6:[2,185],25:[2,185],26:[2,185],49:[2,185],54:[2,185],57:[2,185],72:[2,185],77:[2,185],85:[2,185],90:[2,185],92:[2,185],101:[2,185],102:87,103:[2,185],104:[2,185],105:[2,185],108:88,109:[2,185],110:69,117:[2,185],125:[2,185],127:[2,185],128:[2,185],131:[1,78],132:[2,185],133:[2,185],134:[2,185],135:[2,185],136:[2,185]},{1:[2,186],6:[2,186],25:[2,186],26:[2,186],49:[2,186],54:[2,186],57:[2,186],72:[2,186],77:[2,186],85:[2,186],90:[2,186],92:[2,186],101:[2,186],102:87,103:[2,186],104:[2,186],105:[2,186],108:88,109:[2,186],110:69,117:[2,186],125:[2,186],127:[2,186],128:[2,186],131:[1,78],132:[2,186],133:[2,186],134:[2,186],135:[2,186],136:[2,186]},{1:[2,187],6:[2,187],25:[2,187],26:[2,187],49:[2,187],54:[2,187],57:[2,187],66:[2,72],67:[2,72],68:[2,72],70:[2,72],72:[2,187],73:[2,72],77:[2,187],83:[2,72],84:[2,72],85:[2,187],90:[2,187],92:[2,187],101:[2,187],103:[2,187],104:[2,187],105:[2,187],109:[2,187],117:[2,187],125:[2,187],127:[2,187],128:[2,187],131:[2,187],132:[2,187],133:[2,187],134:[2,187],135:[2,187],136:[2,187]},{62:93,66:[1,95],67:[1,96],68:[1,97],69:98,70:[1,99],73:[1,100],80:92,83:[1,94],84:[2,107]},{62:102,66:[1,95],67:[1,96],68:[1,97],69:98,70:[1,99],73:[1,100],80:101,83:[1,94],84:[2,107]},{66:[2,75],67:[2,75],68:[2,75],70:[2,75],73:[2,75],83:[2,75],84:[2,75]},{1:[2,188],6:[2,188],25:[2,188],26:[2,188],49:[2,188],54:[2,188],57:[2,188],66:[2,72],67:[2,72],68:[2,72],70:[2,72],72:[2,188],73:[2,72],77:[2,188],83:[2,72],84:[2,72],85:[2,188],90:[2,188],92:[2,188],101:[2,188],103:[2,188],104:[2,188],105:[2,188],109:[2,188],117:[2,188],125:[2,188],127:[2,188],128:[2,188],131:[2,188],132:[2,188],133:[2,188],134:[2,188],135:[2,188],136:[2,188]},{1:[2,189],6:[2,189],25:[2,189],26:[2,189],49:[2,189],54:[2,189],57:[2,189],72:[2,189],77:[2,189],85:[2,189],90:[2,189],92:[2,189],101:[2,189],103:[2,189],104:[2,189],105:[2,189],109:[2,189],117:[2,189],125:[2,189],127:[2,189],128:[2,189],131:[2,189],132:[2,189],133:[2,189],134:[2,189],135:[2,189],136:[2,189]},{1:[2,190],6:[2,190],25:[2,190],26:[2,190],49:[2,190],54:[2,190],57:[2,190],72:[2,190],77:[2,190],85:[2,190],90:[2,190],92:[2,190],101:[2,190],103:[2,190],104:[2,190],105:[2,190],109:[2,190],117:[2,190],125:[2,190],127:[2,190],128:[2,190],131:[2,190],132:[2,190],133:[2,190],134:[2,190],135:[2,190],136:[2,190]},{8:206,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,207],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:208,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{5:209,25:[1,5],124:[1,210]},{1:[2,132],6:[2,132],25:[2,132],26:[2,132],49:[2,132],54:[2,132],57:[2,132],72:[2,132],77:[2,132],85:[2,132],90:[2,132],92:[2,132],96:211,97:[1,212],98:[1,213],101:[2,132],103:[2,132],104:[2,132],105:[2,132],109:[2,132],117:[2,132],125:[2,132],127:[2,132],128:[2,132],131:[2,132],132:[2,132],133:[2,132],134:[2,132],135:[2,132],136:[2,132]},{1:[2,144],6:[2,144],25:[2,144],26:[2,144],49:[2,144],54:[2,144],57:[2,144],72:[2,144],77:[2,144],85:[2,144],90:[2,144],92:[2,144],101:[2,144],103:[2,144],104:[2,144],105:[2,144],109:[2,144],117:[2,144],125:[2,144],127:[2,144],128:[2,144],131:[2,144],132:[2,144],133:[2,144],134:[2,144],135:[2,144],136:[2,144]},{1:[2,152],6:[2,152],25:[2,152],26:[2,152],49:[2,152],54:[2,152],57:[2,152],72:[2,152],77:[2,152],85:[2,152],90:[2,152],92:[2,152],101:[2,152],103:[2,152],104:[2,152],105:[2,152],109:[2,152],117:[2,152],125:[2,152],127:[2,152],128:[2,152],131:[2,152],132:[2,152],133:[2,152],134:[2,152],135:[2,152],136:[2,152]},{25:[1,214],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{119:215,121:216,122:[1,217]},{1:[2,96],6:[2,96],25:[2,96],26:[2,96],49:[2,96],54:[2,96],57:[2,96],72:[2,96],77:[2,96],85:[2,96],90:[2,96],92:[2,96],101:[2,96],103:[2,96],104:[2,96],105:[2,96],109:[2,96],117:[2,96],125:[2,96],127:[2,96],128:[2,96],131:[2,96],132:[2,96],133:[2,96],134:[2,96],135:[2,96],136:[2,96]},{8:218,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,99],5:219,6:[2,99],25:[1,5],26:[2,99],49:[2,99],54:[2,99],57:[2,99],66:[2,72],67:[2,72],68:[2,72],70:[2,72],72:[2,99],73:[2,72],77:[2,99],79:[1,220],83:[2,72],84:[2,72],85:[2,99],90:[2,99],92:[2,99],101:[2,99],103:[2,99],104:[2,99],105:[2,99],109:[2,99],117:[2,99],125:[2,99],127:[2,99],128:[2,99],131:[2,99],132:[2,99],133:[2,99],134:[2,99],135:[2,99],136:[2,99]},{1:[2,137],6:[2,137],25:[2,137],26:[2,137],49:[2,137],54:[2,137],57:[2,137],72:[2,137],77:[2,137],85:[2,137],90:[2,137],92:[2,137],101:[2,137],102:87,103:[2,137],104:[2,137],105:[2,137],108:88,109:[2,137],110:69,117:[2,137],125:[2,137],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,46],6:[2,46],26:[2,46],101:[2,46],102:87,103:[2,46],105:[2,46],108:88,109:[2,46],110:69,125:[2,46],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{6:[1,74],101:[1,221]},{4:222,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{6:[2,128],25:[2,128],54:[2,128],57:[1,224],90:[2,128],91:223,92:[1,191],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,114],6:[2,114],25:[2,114],26:[2,114],40:[2,114],49:[2,114],54:[2,114],57:[2,114],66:[2,114],67:[2,114],68:[2,114],70:[2,114],72:[2,114],73:[2,114],77:[2,114],83:[2,114],84:[2,114],85:[2,114],90:[2,114],92:[2,114],101:[2,114],103:[2,114],104:[2,114],105:[2,114],109:[2,114],115:[2,114],116:[2,114],117:[2,114],125:[2,114],127:[2,114],128:[2,114],131:[2,114],132:[2,114],133:[2,114],134:[2,114],135:[2,114],136:[2,114]},{6:[2,53],25:[2,53],53:225,54:[1,226],90:[2,53]},{6:[2,123],25:[2,123],26:[2,123],54:[2,123],85:[2,123],90:[2,123]},{8:200,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,146],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:147,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],86:227,87:[1,58],88:[1,59],89:[1,57],93:145,95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{6:[2,129],25:[2,129],26:[2,129],54:[2,129],85:[2,129],90:[2,129]},{1:[2,113],6:[2,113],25:[2,113],26:[2,113],40:[2,113],43:[2,113],49:[2,113],54:[2,113],57:[2,113],66:[2,113],67:[2,113],68:[2,113],70:[2,113],72:[2,113],73:[2,113],77:[2,113],79:[2,113],83:[2,113],84:[2,113],85:[2,113],90:[2,113],92:[2,113],101:[2,113],103:[2,113],104:[2,113],105:[2,113],109:[2,113],115:[2,113],116:[2,113],117:[2,113],125:[2,113],127:[2,113],128:[2,113],129:[2,113],130:[2,113],131:[2,113],132:[2,113],133:[2,113],134:[2,113],135:[2,113],136:[2,113],137:[2,113]},{5:228,25:[1,5],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,140],6:[2,140],25:[2,140],26:[2,140],49:[2,140],54:[2,140],57:[2,140],72:[2,140],77:[2,140],85:[2,140],90:[2,140],92:[2,140],101:[2,140],102:87,103:[1,65],104:[1,229],105:[1,66],108:88,109:[1,68],110:69,117:[2,140],125:[2,140],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,142],6:[2,142],25:[2,142],26:[2,142],49:[2,142],54:[2,142],57:[2,142],72:[2,142],77:[2,142],85:[2,142],90:[2,142],92:[2,142],101:[2,142],102:87,103:[1,65],104:[1,230],105:[1,66],108:88,109:[1,68],110:69,117:[2,142],125:[2,142],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,148],6:[2,148],25:[2,148],26:[2,148],49:[2,148],54:[2,148],57:[2,148],72:[2,148],77:[2,148],85:[2,148],90:[2,148],92:[2,148],101:[2,148],103:[2,148],104:[2,148],105:[2,148],109:[2,148],117:[2,148],125:[2,148],127:[2,148],128:[2,148],131:[2,148],132:[2,148],133:[2,148],134:[2,148],135:[2,148],136:[2,148]},{1:[2,149],6:[2,149],25:[2,149],26:[2,149],49:[2,149],54:[2,149],57:[2,149],72:[2,149],77:[2,149],85:[2,149],90:[2,149],92:[2,149],101:[2,149],102:87,103:[1,65],104:[2,149],105:[1,66],108:88,109:[1,68],110:69,117:[2,149],125:[2,149],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,153],6:[2,153],25:[2,153],26:[2,153],49:[2,153],54:[2,153],57:[2,153],72:[2,153],77:[2,153],85:[2,153],90:[2,153],92:[2,153],101:[2,153],103:[2,153],104:[2,153],105:[2,153],109:[2,153],117:[2,153],125:[2,153],127:[2,153],128:[2,153],131:[2,153],132:[2,153],133:[2,153],134:[2,153],135:[2,153],136:[2,153]},{115:[2,155],116:[2,155]},{27:158,28:[1,73],44:159,58:160,59:161,75:[1,70],88:[1,113],89:[1,114],112:231,114:157},{54:[1,232],115:[2,161],116:[2,161]},{54:[2,157],115:[2,157],116:[2,157]},{54:[2,158],115:[2,158],116:[2,158]},{54:[2,159],115:[2,159],116:[2,159]},{54:[2,160],115:[2,160],116:[2,160]},{1:[2,154],6:[2,154],25:[2,154],26:[2,154],49:[2,154],54:[2,154],57:[2,154],72:[2,154],77:[2,154],85:[2,154],90:[2,154],92:[2,154],101:[2,154],103:[2,154],104:[2,154],105:[2,154],109:[2,154],117:[2,154],125:[2,154],127:[2,154],128:[2,154],131:[2,154],132:[2,154],133:[2,154],134:[2,154],135:[2,154],136:[2,154]},{8:233,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:234,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{6:[2,53],25:[2,53],53:235,54:[1,236],77:[2,53]},{6:[2,91],25:[2,91],26:[2,91],54:[2,91],77:[2,91]},{6:[2,39],25:[2,39],26:[2,39],43:[1,237],54:[2,39],77:[2,39]},{6:[2,42],25:[2,42],26:[2,42],54:[2,42],77:[2,42]},{6:[2,43],25:[2,43],26:[2,43],43:[2,43],54:[2,43],77:[2,43]},{6:[2,44],25:[2,44],26:[2,44],43:[2,44],54:[2,44],77:[2,44]},{6:[2,45],25:[2,45],26:[2,45],43:[2,45],54:[2,45],77:[2,45]},{1:[2,5],6:[2,5],26:[2,5],101:[2,5]},{1:[2,25],6:[2,25],25:[2,25],26:[2,25],49:[2,25],54:[2,25],57:[2,25],72:[2,25],77:[2,25],85:[2,25],90:[2,25],92:[2,25],97:[2,25],98:[2,25],101:[2,25],103:[2,25],104:[2,25],105:[2,25],109:[2,25],117:[2,25],120:[2,25],122:[2,25],125:[2,25],127:[2,25],128:[2,25],131:[2,25],132:[2,25],133:[2,25],134:[2,25],135:[2,25],136:[2,25]},{1:[2,192],6:[2,192],25:[2,192],26:[2,192],49:[2,192],54:[2,192],57:[2,192],72:[2,192],77:[2,192],85:[2,192],90:[2,192],92:[2,192],101:[2,192],102:87,103:[2,192],104:[2,192],105:[2,192],108:88,109:[2,192],110:69,117:[2,192],125:[2,192],127:[2,192],128:[2,192],131:[1,78],132:[1,81],133:[2,192],134:[2,192],135:[2,192],136:[2,192]},{1:[2,193],6:[2,193],25:[2,193],26:[2,193],49:[2,193],54:[2,193],57:[2,193],72:[2,193],77:[2,193],85:[2,193],90:[2,193],92:[2,193],101:[2,193],102:87,103:[2,193],104:[2,193],105:[2,193],108:88,109:[2,193],110:69,117:[2,193],125:[2,193],127:[2,193],128:[2,193],131:[1,78],132:[1,81],133:[2,193],134:[2,193],135:[2,193],136:[2,193]},{1:[2,194],6:[2,194],25:[2,194],26:[2,194],49:[2,194],54:[2,194],57:[2,194],72:[2,194],77:[2,194],85:[2,194],90:[2,194],92:[2,194],101:[2,194],102:87,103:[2,194],104:[2,194],105:[2,194],108:88,109:[2,194],110:69,117:[2,194],125:[2,194],127:[2,194],128:[2,194],131:[1,78],132:[2,194],133:[2,194],134:[2,194],135:[2,194],136:[2,194]},{1:[2,195],6:[2,195],25:[2,195],26:[2,195],49:[2,195],54:[2,195],57:[2,195],72:[2,195],77:[2,195],85:[2,195],90:[2,195],92:[2,195],101:[2,195],102:87,103:[2,195],104:[2,195],105:[2,195],108:88,109:[2,195],110:69,117:[2,195],125:[2,195],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[2,195],134:[2,195],135:[2,195],136:[2,195]},{1:[2,196],6:[2,196],25:[2,196],26:[2,196],49:[2,196],54:[2,196],57:[2,196],72:[2,196],77:[2,196],85:[2,196],90:[2,196],92:[2,196],101:[2,196],102:87,103:[2,196],104:[2,196],105:[2,196],108:88,109:[2,196],110:69,117:[2,196],125:[2,196],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[2,196],135:[2,196],136:[1,85]},{1:[2,197],6:[2,197],25:[2,197],26:[2,197],49:[2,197],54:[2,197],57:[2,197],72:[2,197],77:[2,197],85:[2,197],90:[2,197],92:[2,197],101:[2,197],102:87,103:[2,197],104:[2,197],105:[2,197],108:88,109:[2,197],110:69,117:[2,197],125:[2,197],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[2,197],136:[1,85]},{1:[2,198],6:[2,198],25:[2,198],26:[2,198],49:[2,198],54:[2,198],57:[2,198],72:[2,198],77:[2,198],85:[2,198],90:[2,198],92:[2,198],101:[2,198],102:87,103:[2,198],104:[2,198],105:[2,198],108:88,109:[2,198],110:69,117:[2,198],125:[2,198],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[2,198],135:[2,198],136:[2,198]},{1:[2,183],6:[2,183],25:[2,183],26:[2,183],49:[2,183],54:[2,183],57:[2,183],72:[2,183],77:[2,183],85:[2,183],90:[2,183],92:[2,183],101:[2,183],102:87,103:[1,65],104:[2,183],105:[1,66],108:88,109:[1,68],110:69,117:[2,183],125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,182],6:[2,182],25:[2,182],26:[2,182],49:[2,182],54:[2,182],57:[2,182],72:[2,182],77:[2,182],85:[2,182],90:[2,182],92:[2,182],101:[2,182],102:87,103:[1,65],104:[2,182],105:[1,66],108:88,109:[1,68],110:69,117:[2,182],125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,103],6:[2,103],25:[2,103],26:[2,103],49:[2,103],54:[2,103],57:[2,103],66:[2,103],67:[2,103],68:[2,103],70:[2,103],72:[2,103],73:[2,103],77:[2,103],83:[2,103],84:[2,103],85:[2,103],90:[2,103],92:[2,103],101:[2,103],103:[2,103],104:[2,103],105:[2,103],109:[2,103],117:[2,103],125:[2,103],127:[2,103],128:[2,103],131:[2,103],132:[2,103],133:[2,103],134:[2,103],135:[2,103],136:[2,103]},{1:[2,80],6:[2,80],25:[2,80],26:[2,80],40:[2,80],49:[2,80],54:[2,80],57:[2,80],66:[2,80],67:[2,80],68:[2,80],70:[2,80],72:[2,80],73:[2,80],77:[2,80],79:[2,80],83:[2,80],84:[2,80],85:[2,80],90:[2,80],92:[2,80],101:[2,80],103:[2,80],104:[2,80],105:[2,80],109:[2,80],117:[2,80],125:[2,80],127:[2,80],128:[2,80],129:[2,80],130:[2,80],131:[2,80],132:[2,80],133:[2,80],134:[2,80],135:[2,80],136:[2,80],137:[2,80]},{1:[2,81],6:[2,81],25:[2,81],26:[2,81],40:[2,81],49:[2,81],54:[2,81],57:[2,81],66:[2,81],67:[2,81],68:[2,81],70:[2,81],72:[2,81],73:[2,81],77:[2,81],79:[2,81],83:[2,81],84:[2,81],85:[2,81],90:[2,81],92:[2,81],101:[2,81],103:[2,81],104:[2,81],105:[2,81],109:[2,81],117:[2,81],125:[2,81],127:[2,81],128:[2,81],129:[2,81],130:[2,81],131:[2,81],132:[2,81],133:[2,81],134:[2,81],135:[2,81],136:[2,81],137:[2,81]},{1:[2,82],6:[2,82],25:[2,82],26:[2,82],40:[2,82],49:[2,82],54:[2,82],57:[2,82],66:[2,82],67:[2,82],68:[2,82],70:[2,82],72:[2,82],73:[2,82],77:[2,82],79:[2,82],83:[2,82],84:[2,82],85:[2,82],90:[2,82],92:[2,82],101:[2,82],103:[2,82],104:[2,82],105:[2,82],109:[2,82],117:[2,82],125:[2,82],127:[2,82],128:[2,82],129:[2,82],130:[2,82],131:[2,82],132:[2,82],133:[2,82],134:[2,82],135:[2,82],136:[2,82],137:[2,82]},{72:[1,238]},{57:[1,192],72:[2,87],91:239,92:[1,191],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{72:[2,88]},{8:240,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,72:[2,122],75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{12:[2,116],28:[2,116],30:[2,116],31:[2,116],33:[2,116],34:[2,116],35:[2,116],36:[2,116],37:[2,116],38:[2,116],45:[2,116],46:[2,116],47:[2,116],51:[2,116],52:[2,116],72:[2,116],75:[2,116],78:[2,116],82:[2,116],87:[2,116],88:[2,116],89:[2,116],95:[2,116],99:[2,116],100:[2,116],103:[2,116],105:[2,116],107:[2,116],109:[2,116],118:[2,116],124:[2,116],126:[2,116],127:[2,116],128:[2,116],129:[2,116],130:[2,116]},{12:[2,117],28:[2,117],30:[2,117],31:[2,117],33:[2,117],34:[2,117],35:[2,117],36:[2,117],37:[2,117],38:[2,117],45:[2,117],46:[2,117],47:[2,117],51:[2,117],52:[2,117],72:[2,117],75:[2,117],78:[2,117],82:[2,117],87:[2,117],88:[2,117],89:[2,117],95:[2,117],99:[2,117],100:[2,117],103:[2,117],105:[2,117],107:[2,117],109:[2,117],118:[2,117],124:[2,117],126:[2,117],127:[2,117],128:[2,117],129:[2,117],130:[2,117]},{1:[2,86],6:[2,86],25:[2,86],26:[2,86],40:[2,86],49:[2,86],54:[2,86],57:[2,86],66:[2,86],67:[2,86],68:[2,86],70:[2,86],72:[2,86],73:[2,86],77:[2,86],79:[2,86],83:[2,86],84:[2,86],85:[2,86],90:[2,86],92:[2,86],101:[2,86],103:[2,86],104:[2,86],105:[2,86],109:[2,86],117:[2,86],125:[2,86],127:[2,86],128:[2,86],129:[2,86],130:[2,86],131:[2,86],132:[2,86],133:[2,86],134:[2,86],135:[2,86],136:[2,86],137:[2,86]},{1:[2,104],6:[2,104],25:[2,104],26:[2,104],49:[2,104],54:[2,104],57:[2,104],66:[2,104],67:[2,104],68:[2,104],70:[2,104],72:[2,104],73:[2,104],77:[2,104],83:[2,104],84:[2,104],85:[2,104],90:[2,104],92:[2,104],101:[2,104],103:[2,104],104:[2,104],105:[2,104],109:[2,104],117:[2,104],125:[2,104],127:[2,104],128:[2,104],131:[2,104],132:[2,104],133:[2,104],134:[2,104],135:[2,104],136:[2,104]},{1:[2,36],6:[2,36],25:[2,36],26:[2,36],49:[2,36],54:[2,36],57:[2,36],72:[2,36],77:[2,36],85:[2,36],90:[2,36],92:[2,36],101:[2,36],102:87,103:[2,36],104:[2,36],105:[2,36],108:88,109:[2,36],110:69,117:[2,36],125:[2,36],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{8:241,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:242,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,109],6:[2,109],25:[2,109],26:[2,109],49:[2,109],54:[2,109],57:[2,109],66:[2,109],67:[2,109],68:[2,109],70:[2,109],72:[2,109],73:[2,109],77:[2,109],83:[2,109],84:[2,109],85:[2,109],90:[2,109],92:[2,109],101:[2,109],103:[2,109],104:[2,109],105:[2,109],109:[2,109],117:[2,109],125:[2,109],127:[2,109],128:[2,109],131:[2,109],132:[2,109],133:[2,109],134:[2,109],135:[2,109],136:[2,109]},{6:[2,53],25:[2,53],53:243,54:[1,226],85:[2,53]},{6:[2,128],25:[2,128],26:[2,128],54:[2,128],57:[1,244],85:[2,128],90:[2,128],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{50:245,51:[1,60],52:[1,61]},{6:[2,54],25:[2,54],26:[2,54],27:109,28:[1,73],44:110,55:246,56:108,58:111,59:112,75:[1,70],88:[1,113],89:[1,114]},{6:[1,247],25:[1,248]},{6:[2,61],25:[2,61],26:[2,61],49:[2,61],54:[2,61]},{8:249,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,199],6:[2,199],25:[2,199],26:[2,199],49:[2,199],54:[2,199],57:[2,199],72:[2,199],77:[2,199],85:[2,199],90:[2,199],92:[2,199],101:[2,199],102:87,103:[2,199],104:[2,199],105:[2,199],108:88,109:[2,199],110:69,117:[2,199],125:[2,199],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{8:250,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,201],6:[2,201],25:[2,201],26:[2,201],49:[2,201],54:[2,201],57:[2,201],72:[2,201],77:[2,201],85:[2,201],90:[2,201],92:[2,201],101:[2,201],102:87,103:[2,201],104:[2,201],105:[2,201],108:88,109:[2,201],110:69,117:[2,201],125:[2,201],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,181],6:[2,181],25:[2,181],26:[2,181],49:[2,181],54:[2,181],57:[2,181],72:[2,181],77:[2,181],85:[2,181],90:[2,181],92:[2,181],101:[2,181],103:[2,181],104:[2,181],105:[2,181],109:[2,181],117:[2,181],125:[2,181],127:[2,181],128:[2,181],131:[2,181],132:[2,181],133:[2,181],134:[2,181],135:[2,181],136:[2,181]},{8:251,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,133],6:[2,133],25:[2,133],26:[2,133],49:[2,133],54:[2,133],57:[2,133],72:[2,133],77:[2,133],85:[2,133],90:[2,133],92:[2,133],97:[1,252],101:[2,133],103:[2,133],104:[2,133],105:[2,133],109:[2,133],117:[2,133],125:[2,133],127:[2,133],128:[2,133],131:[2,133],132:[2,133],133:[2,133],134:[2,133],135:[2,133],136:[2,133]},{5:253,25:[1,5]},{27:254,28:[1,73]},{119:255,121:216,122:[1,217]},{26:[1,256],120:[1,257],121:258,122:[1,217]},{26:[2,174],120:[2,174],122:[2,174]},{8:260,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],94:259,95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,97],5:261,6:[2,97],25:[1,5],26:[2,97],49:[2,97],54:[2,97],57:[2,97],72:[2,97],77:[2,97],85:[2,97],90:[2,97],92:[2,97],101:[2,97],102:87,103:[1,65],104:[2,97],105:[1,66],108:88,109:[1,68],110:69,117:[2,97],125:[2,97],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,100],6:[2,100],25:[2,100],26:[2,100],49:[2,100],54:[2,100],57:[2,100],72:[2,100],77:[2,100],85:[2,100],90:[2,100],92:[2,100],101:[2,100],103:[2,100],104:[2,100],105:[2,100],109:[2,100],117:[2,100],125:[2,100],127:[2,100],128:[2,100],131:[2,100],132:[2,100],133:[2,100],134:[2,100],135:[2,100],136:[2,100]},{8:262,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,138],6:[2,138],25:[2,138],26:[2,138],49:[2,138],54:[2,138],57:[2,138],66:[2,138],67:[2,138],68:[2,138],70:[2,138],72:[2,138],73:[2,138],77:[2,138],83:[2,138],84:[2,138],85:[2,138],90:[2,138],92:[2,138],101:[2,138],103:[2,138],104:[2,138],105:[2,138],109:[2,138],117:[2,138],125:[2,138],127:[2,138],128:[2,138],131:[2,138],132:[2,138],133:[2,138],134:[2,138],135:[2,138],136:[2,138]},{6:[1,74],26:[1,263]},{8:264,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{6:[2,67],12:[2,117],25:[2,67],28:[2,117],30:[2,117],31:[2,117],33:[2,117],34:[2,117],35:[2,117],36:[2,117],37:[2,117],38:[2,117],45:[2,117],46:[2,117],47:[2,117],51:[2,117],52:[2,117],54:[2,67],75:[2,117],78:[2,117],82:[2,117],87:[2,117],88:[2,117],89:[2,117],90:[2,67],95:[2,117],99:[2,117],100:[2,117],103:[2,117],105:[2,117],107:[2,117],109:[2,117],118:[2,117],124:[2,117],126:[2,117],127:[2,117],128:[2,117],129:[2,117],130:[2,117]},{6:[1,266],25:[1,267],90:[1,265]},{6:[2,54],8:200,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[2,54],26:[2,54],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:147,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],85:[2,54],87:[1,58],88:[1,59],89:[1,57],90:[2,54],93:268,95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{6:[2,53],25:[2,53],26:[2,53],53:269,54:[1,226]},{1:[2,178],6:[2,178],25:[2,178],26:[2,178],49:[2,178],54:[2,178],57:[2,178],72:[2,178],77:[2,178],85:[2,178],90:[2,178],92:[2,178],101:[2,178],103:[2,178],104:[2,178],105:[2,178],109:[2,178],117:[2,178],120:[2,178],125:[2,178],127:[2,178],128:[2,178],131:[2,178],132:[2,178],133:[2,178],134:[2,178],135:[2,178],136:[2,178]},{8:270,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:271,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{115:[2,156],116:[2,156]},{27:158,28:[1,73],44:159,58:160,59:161,75:[1,70],88:[1,113],89:[1,114],114:272},{1:[2,163],6:[2,163],25:[2,163],26:[2,163],49:[2,163],54:[2,163],57:[2,163],72:[2,163],77:[2,163],85:[2,163],90:[2,163],92:[2,163],101:[2,163],102:87,103:[2,163],104:[1,273],105:[2,163],108:88,109:[2,163],110:69,117:[1,274],125:[2,163],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,164],6:[2,164],25:[2,164],26:[2,164],49:[2,164],54:[2,164],57:[2,164],72:[2,164],77:[2,164],85:[2,164],90:[2,164],92:[2,164],101:[2,164],102:87,103:[2,164],104:[1,275],105:[2,164],108:88,109:[2,164],110:69,117:[2,164],125:[2,164],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{6:[1,277],25:[1,278],77:[1,276]},{6:[2,54],11:168,25:[2,54],26:[2,54],27:169,28:[1,73],29:170,30:[1,71],31:[1,72],41:279,42:167,44:171,46:[1,46],77:[2,54],88:[1,113]},{8:280,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,281],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,85],6:[2,85],25:[2,85],26:[2,85],40:[2,85],49:[2,85],54:[2,85],57:[2,85],66:[2,85],67:[2,85],68:[2,85],70:[2,85],72:[2,85],73:[2,85],77:[2,85],79:[2,85],83:[2,85],84:[2,85],85:[2,85],90:[2,85],92:[2,85],101:[2,85],103:[2,85],104:[2,85],105:[2,85],109:[2,85],117:[2,85],125:[2,85],127:[2,85],128:[2,85],129:[2,85],130:[2,85],131:[2,85],132:[2,85],133:[2,85],134:[2,85],135:[2,85],136:[2,85],137:[2,85]},{8:282,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,72:[2,120],75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{72:[2,121],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,37],6:[2,37],25:[2,37],26:[2,37],49:[2,37],54:[2,37],57:[2,37],72:[2,37],77:[2,37],85:[2,37],90:[2,37],92:[2,37],101:[2,37],102:87,103:[2,37],104:[2,37],105:[2,37],108:88,109:[2,37],110:69,117:[2,37],125:[2,37],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{26:[1,283],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{6:[1,266],25:[1,267],85:[1,284]},{6:[2,67],25:[2,67],26:[2,67],54:[2,67],85:[2,67],90:[2,67]},{5:285,25:[1,5]},{6:[2,57],25:[2,57],26:[2,57],49:[2,57],54:[2,57]},{27:109,28:[1,73],44:110,55:286,56:108,58:111,59:112,75:[1,70],88:[1,113],89:[1,114]},{6:[2,55],25:[2,55],26:[2,55],27:109,28:[1,73],44:110,48:287,54:[2,55],55:107,56:108,58:111,59:112,75:[1,70],88:[1,113],89:[1,114]},{6:[2,62],25:[2,62],26:[2,62],49:[2,62],54:[2,62],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{26:[1,288],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{5:289,25:[1,5],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{5:290,25:[1,5]},{1:[2,134],6:[2,134],25:[2,134],26:[2,134],49:[2,134],54:[2,134],57:[2,134],72:[2,134],77:[2,134],85:[2,134],90:[2,134],92:[2,134],101:[2,134],103:[2,134],104:[2,134],105:[2,134],109:[2,134],117:[2,134],125:[2,134],127:[2,134],128:[2,134],131:[2,134],132:[2,134],133:[2,134],134:[2,134],135:[2,134],136:[2,134]},{5:291,25:[1,5]},{26:[1,292],120:[1,293],121:258,122:[1,217]},{1:[2,172],6:[2,172],25:[2,172],26:[2,172],49:[2,172],54:[2,172],57:[2,172],72:[2,172],77:[2,172],85:[2,172],90:[2,172],92:[2,172],101:[2,172],103:[2,172],104:[2,172],105:[2,172],109:[2,172],117:[2,172],125:[2,172],127:[2,172],128:[2,172],131:[2,172],132:[2,172],133:[2,172],134:[2,172],135:[2,172],136:[2,172]},{5:294,25:[1,5]},{26:[2,175],120:[2,175],122:[2,175]},{5:295,25:[1,5],54:[1,296]},{25:[2,130],54:[2,130],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,98],6:[2,98],25:[2,98],26:[2,98],49:[2,98],54:[2,98],57:[2,98],72:[2,98],77:[2,98],85:[2,98],90:[2,98],92:[2,98],101:[2,98],103:[2,98],104:[2,98],105:[2,98],109:[2,98],117:[2,98],125:[2,98],127:[2,98],128:[2,98],131:[2,98],132:[2,98],133:[2,98],134:[2,98],135:[2,98],136:[2,98]},{1:[2,101],5:297,6:[2,101],25:[1,5],26:[2,101],49:[2,101],54:[2,101],57:[2,101],72:[2,101],77:[2,101],85:[2,101],90:[2,101],92:[2,101],101:[2,101],102:87,103:[1,65],104:[2,101],105:[1,66],108:88,109:[1,68],110:69,117:[2,101],125:[2,101],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{101:[1,298]},{90:[1,299],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,115],6:[2,115],25:[2,115],26:[2,115],40:[2,115],49:[2,115],54:[2,115],57:[2,115],66:[2,115],67:[2,115],68:[2,115],70:[2,115],72:[2,115],73:[2,115],77:[2,115],83:[2,115],84:[2,115],85:[2,115],90:[2,115],92:[2,115],101:[2,115],103:[2,115],104:[2,115],105:[2,115],109:[2,115],115:[2,115],116:[2,115],117:[2,115],125:[2,115],127:[2,115],128:[2,115],131:[2,115],132:[2,115],133:[2,115],134:[2,115],135:[2,115],136:[2,115]},{8:200,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:147,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],93:300,95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:200,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,146],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:147,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],86:301,87:[1,58],88:[1,59],89:[1,57],93:145,95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{6:[2,124],25:[2,124],26:[2,124],54:[2,124],85:[2,124],90:[2,124]},{6:[1,266],25:[1,267],26:[1,302]},{1:[2,141],6:[2,141],25:[2,141],26:[2,141],49:[2,141],54:[2,141],57:[2,141],72:[2,141],77:[2,141],85:[2,141],90:[2,141],92:[2,141],101:[2,141],102:87,103:[1,65],104:[2,141],105:[1,66],108:88,109:[1,68],110:69,117:[2,141],125:[2,141],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,143],6:[2,143],25:[2,143],26:[2,143],49:[2,143],54:[2,143],57:[2,143],72:[2,143],77:[2,143],85:[2,143],90:[2,143],92:[2,143],101:[2,143],102:87,103:[1,65],104:[2,143],105:[1,66],108:88,109:[1,68],110:69,117:[2,143],125:[2,143],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{115:[2,162],116:[2,162]},{8:303,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:304,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:305,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,89],6:[2,89],25:[2,89],26:[2,89],40:[2,89],49:[2,89],54:[2,89],57:[2,89],66:[2,89],67:[2,89],68:[2,89],70:[2,89],72:[2,89],73:[2,89],77:[2,89],83:[2,89],84:[2,89],85:[2,89],90:[2,89],92:[2,89],101:[2,89],103:[2,89],104:[2,89],105:[2,89],109:[2,89],115:[2,89],116:[2,89],117:[2,89],125:[2,89],127:[2,89],128:[2,89],131:[2,89],132:[2,89],133:[2,89],134:[2,89],135:[2,89],136:[2,89]},{11:168,27:169,28:[1,73],29:170,30:[1,71],31:[1,72],41:306,42:167,44:171,46:[1,46],88:[1,113]},{6:[2,90],11:168,25:[2,90],26:[2,90],27:169,28:[1,73],29:170,30:[1,71],31:[1,72],41:166,42:167,44:171,46:[1,46],54:[2,90],76:307,88:[1,113]},{6:[2,92],25:[2,92],26:[2,92],54:[2,92],77:[2,92]},{6:[2,40],25:[2,40],26:[2,40],54:[2,40],77:[2,40],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{8:308,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{72:[2,119],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,38],6:[2,38],25:[2,38],26:[2,38],49:[2,38],54:[2,38],57:[2,38],72:[2,38],77:[2,38],85:[2,38],90:[2,38],92:[2,38],101:[2,38],103:[2,38],104:[2,38],105:[2,38],109:[2,38],117:[2,38],125:[2,38],127:[2,38],128:[2,38],131:[2,38],132:[2,38],133:[2,38],134:[2,38],135:[2,38],136:[2,38]},{1:[2,110],6:[2,110],25:[2,110],26:[2,110],49:[2,110],54:[2,110],57:[2,110],66:[2,110],67:[2,110],68:[2,110],70:[2,110],72:[2,110],73:[2,110],77:[2,110],83:[2,110],84:[2,110],85:[2,110],90:[2,110],92:[2,110],101:[2,110],103:[2,110],104:[2,110],105:[2,110],109:[2,110],117:[2,110],125:[2,110],127:[2,110],128:[2,110],131:[2,110],132:[2,110],133:[2,110],134:[2,110],135:[2,110],136:[2,110]},{1:[2,49],6:[2,49],25:[2,49],26:[2,49],49:[2,49],54:[2,49],57:[2,49],72:[2,49],77:[2,49],85:[2,49],90:[2,49],92:[2,49],101:[2,49],103:[2,49],104:[2,49],105:[2,49],109:[2,49],117:[2,49],125:[2,49],127:[2,49],128:[2,49],131:[2,49],132:[2,49],133:[2,49],134:[2,49],135:[2,49],136:[2,49]},{6:[2,58],25:[2,58],26:[2,58],49:[2,58],54:[2,58]},{6:[2,53],25:[2,53],26:[2,53],53:309,54:[1,202]},{1:[2,200],6:[2,200],25:[2,200],26:[2,200],49:[2,200],54:[2,200],57:[2,200],72:[2,200],77:[2,200],85:[2,200],90:[2,200],92:[2,200],101:[2,200],103:[2,200],104:[2,200],105:[2,200],109:[2,200],117:[2,200],125:[2,200],127:[2,200],128:[2,200],131:[2,200],132:[2,200],133:[2,200],134:[2,200],135:[2,200],136:[2,200]},{1:[2,179],6:[2,179],25:[2,179],26:[2,179],49:[2,179],54:[2,179],57:[2,179],72:[2,179],77:[2,179],85:[2,179],90:[2,179],92:[2,179],101:[2,179],103:[2,179],104:[2,179],105:[2,179],109:[2,179],117:[2,179],120:[2,179],125:[2,179],127:[2,179],128:[2,179],131:[2,179],132:[2,179],133:[2,179],134:[2,179],135:[2,179],136:[2,179]},{1:[2,135],6:[2,135],25:[2,135],26:[2,135],49:[2,135],54:[2,135],57:[2,135],72:[2,135],77:[2,135],85:[2,135],90:[2,135],92:[2,135],101:[2,135],103:[2,135],104:[2,135],105:[2,135],109:[2,135],117:[2,135],125:[2,135],127:[2,135],128:[2,135],131:[2,135],132:[2,135],133:[2,135],134:[2,135],135:[2,135],136:[2,135]},{1:[2,136],6:[2,136],25:[2,136],26:[2,136],49:[2,136],54:[2,136],57:[2,136],72:[2,136],77:[2,136],85:[2,136],90:[2,136],92:[2,136],97:[2,136],101:[2,136],103:[2,136],104:[2,136],105:[2,136],109:[2,136],117:[2,136],125:[2,136],127:[2,136],128:[2,136],131:[2,136],132:[2,136],133:[2,136],134:[2,136],135:[2,136],136:[2,136]},{1:[2,170],6:[2,170],25:[2,170],26:[2,170],49:[2,170],54:[2,170],57:[2,170],72:[2,170],77:[2,170],85:[2,170],90:[2,170],92:[2,170],101:[2,170],103:[2,170],104:[2,170],105:[2,170],109:[2,170],117:[2,170],125:[2,170],127:[2,170],128:[2,170],131:[2,170],132:[2,170],133:[2,170],134:[2,170],135:[2,170],136:[2,170]},{5:310,25:[1,5]},{26:[1,311]},{6:[1,312],26:[2,176],120:[2,176],122:[2,176]},{8:313,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,102],6:[2,102],25:[2,102],26:[2,102],49:[2,102],54:[2,102],57:[2,102],72:[2,102],77:[2,102],85:[2,102],90:[2,102],92:[2,102],101:[2,102],103:[2,102],104:[2,102],105:[2,102],109:[2,102],117:[2,102],125:[2,102],127:[2,102],128:[2,102],131:[2,102],132:[2,102],133:[2,102],134:[2,102],135:[2,102],136:[2,102]},{1:[2,139],6:[2,139],25:[2,139],26:[2,139],49:[2,139],54:[2,139],57:[2,139],66:[2,139],67:[2,139],68:[2,139],70:[2,139],72:[2,139],73:[2,139],77:[2,139],83:[2,139],84:[2,139],85:[2,139],90:[2,139],92:[2,139],101:[2,139],103:[2,139],104:[2,139],105:[2,139],109:[2,139],117:[2,139],125:[2,139],127:[2,139],128:[2,139],131:[2,139],132:[2,139],133:[2,139],134:[2,139],135:[2,139],136:[2,139]},{1:[2,118],6:[2,118],25:[2,118],26:[2,118],49:[2,118],54:[2,118],57:[2,118],66:[2,118],67:[2,118],68:[2,118],70:[2,118],72:[2,118],73:[2,118],77:[2,118],83:[2,118],84:[2,118],85:[2,118],90:[2,118],92:[2,118],101:[2,118],103:[2,118],104:[2,118],105:[2,118],109:[2,118],117:[2,118],125:[2,118],127:[2,118],128:[2,118],131:[2,118],132:[2,118],133:[2,118],134:[2,118],135:[2,118],136:[2,118]},{6:[2,125],25:[2,125],26:[2,125],54:[2,125],85:[2,125],90:[2,125]},{6:[2,53],25:[2,53],26:[2,53],53:314,54:[1,226]},{6:[2,126],25:[2,126],26:[2,126],54:[2,126],85:[2,126],90:[2,126]},{1:[2,165],6:[2,165],25:[2,165],26:[2,165],49:[2,165],54:[2,165],57:[2,165],72:[2,165],77:[2,165],85:[2,165],90:[2,165],92:[2,165],101:[2,165],102:87,103:[2,165],104:[2,165],105:[2,165],108:88,109:[2,165],110:69,117:[1,315],125:[2,165],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,167],6:[2,167],25:[2,167],26:[2,167],49:[2,167],54:[2,167],57:[2,167],72:[2,167],77:[2,167],85:[2,167],90:[2,167],92:[2,167],101:[2,167],102:87,103:[2,167],104:[1,316],105:[2,167],108:88,109:[2,167],110:69,117:[2,167],125:[2,167],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,166],6:[2,166],25:[2,166],26:[2,166],49:[2,166],54:[2,166],57:[2,166],72:[2,166],77:[2,166],85:[2,166],90:[2,166],92:[2,166],101:[2,166],102:87,103:[2,166],104:[2,166],105:[2,166],108:88,109:[2,166],110:69,117:[2,166],125:[2,166],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{6:[2,93],25:[2,93],26:[2,93],54:[2,93],77:[2,93]},{6:[2,53],25:[2,53],26:[2,53],53:317,54:[1,236]},{26:[1,318],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{6:[1,247],25:[1,248],26:[1,319]},{26:[1,320]},{1:[2,173],6:[2,173],25:[2,173],26:[2,173],49:[2,173],54:[2,173],57:[2,173],72:[2,173],77:[2,173],85:[2,173],90:[2,173],92:[2,173],101:[2,173],103:[2,173],104:[2,173],105:[2,173],109:[2,173],117:[2,173],125:[2,173],127:[2,173],128:[2,173],131:[2,173],132:[2,173],133:[2,173],134:[2,173],135:[2,173],136:[2,173]},{26:[2,177],120:[2,177],122:[2,177]},{25:[2,131],54:[2,131],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{6:[1,266],25:[1,267],26:[1,321]},{8:322,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:323,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{6:[1,277],25:[1,278],26:[1,324]},{6:[2,41],25:[2,41],26:[2,41],54:[2,41],77:[2,41]},{6:[2,59],25:[2,59],26:[2,59],49:[2,59],54:[2,59]},{1:[2,171],6:[2,171],25:[2,171],26:[2,171],49:[2,171],54:[2,171],57:[2,171],72:[2,171],77:[2,171],85:[2,171],90:[2,171],92:[2,171],101:[2,171],103:[2,171],104:[2,171],105:[2,171],109:[2,171],117:[2,171],125:[2,171],127:[2,171],128:[2,171],131:[2,171],132:[2,171],133:[2,171],134:[2,171],135:[2,171],136:[2,171]},{6:[2,127],25:[2,127],26:[2,127],54:[2,127],85:[2,127],90:[2,127]},{1:[2,168],6:[2,168],25:[2,168],26:[2,168],49:[2,168],54:[2,168],57:[2,168],72:[2,168],77:[2,168],85:[2,168],90:[2,168],92:[2,168],101:[2,168],102:87,103:[2,168],104:[2,168],105:[2,168],108:88,109:[2,168],110:69,117:[2,168],125:[2,168],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,169],6:[2,169],25:[2,169],26:[2,169],49:[2,169],54:[2,169],57:[2,169],72:[2,169],77:[2,169],85:[2,169],90:[2,169],92:[2,169],101:[2,169],102:87,103:[2,169],104:[2,169],105:[2,169],108:88,109:[2,169],110:69,117:[2,169],125:[2,169],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{6:[2,94],25:[2,94],26:[2,94],54:[2,94],77:[2,94]}],defaultActions:{60:[2,51],61:[2,52],75:[2,3],94:[2,108],189:[2,88]},parseError:function(b,c){throw new Error(b)},parse:function(b){function o(a){d.length=d.length-2*a,e.length=e.length-a,f.length=f.length-a}function p(){var a;return a=c.lexer.lex()||1,typeof a!="number"&&(a=c.symbols_[a]||a),a}var c=this,d=[0],e=[null],f=[],g=this.table,h="",i=0,j=0,k=0,l=2,m=1;this.lexer.setInput(b),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,typeof this.lexer.yylloc=="undefined"&&(this.lexer.yylloc={});var n=this.lexer.yylloc;f.push(n),typeof this.yy.parseError=="function"&&(this.parseError=this.yy.parseError);var q,r,s,t,u,v,w={},x,y,z,A;for(;;){s=d[d.length-1],this.defaultActions[s]?t=this.defaultActions[s]:(q==null&&(q=p()),t=g[s]&&g[s][q]);if(typeof t=="undefined"||!t.length||!t[0]){if(!k){A=[];for(x in g[s])this.terminals_[x]&&x>2&&A.push("'"+this.terminals_[x]+"'");var B="";this.lexer.showPosition?B="Parse error on line "+(i+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+A.join(", ")+", got '"+this.terminals_[q]+"'":B="Parse error on line "+(i+1)+": Unexpected "+(q==1?"end of input":"'"+(this.terminals_[q]||q)+"'"),this.parseError(B,{text:this.lexer.match,token:this.terminals_[q]||q,line:this.lexer.yylineno,loc:n,expected:A})}if(k==3){if(q==m)throw new Error(B||"Parsing halted.");j=this.lexer.yyleng,h=this.lexer.yytext,i=this.lexer.yylineno,n=this.lexer.yylloc,q=p()}for(;;){if(l.toString()in g[s])break;if(s==0)throw new Error(B||"Parsing halted.");o(1),s=d[d.length-1]}r=q,q=l,s=d[d.length-1],t=g[s]&&g[s][l],k=3}if(t[0]instanceof Array&&t.length>1)throw new Error("Parse Error: multiple actions possible at state: "+s+", token: "+q);switch(t[0]){case 1:d.push(q),e.push(this.lexer.yytext),f.push(this.lexer.yylloc),d.push(t[1]),q=null,r?(q=r,r=null):(j=this.lexer.yyleng,h=this.lexer.yytext,i=this.lexer.yylineno,n=this.lexer.yylloc,k>0&&k--);break;case 2:y=this.productions_[t[1]][1],w.$=e[e.length-y],w._$={first_line:f[f.length-(y||1)].first_line,last_line:f[f.length-1].last_line,first_column:f[f.length-(y||1)].first_column,last_column:f[f.length-1].last_column},v=this.performAction.call(w,h,j,i,this.yy,t[1],e,f);if(typeof v!="undefined")return v;y&&(d=d.slice(0,-1*y*2),e=e.slice(0,-1*y),f=f.slice(0,-1*y)),d.push(this.productions_[t[1]][0]),e.push(w.$),f.push(w._$),z=g[d[d.length-2]][d[d.length-1]],d.push(z);break;case 3:return!0}}return!0}};return undefined,a}();typeof require!="undefined"&&typeof a!="undefined"&&(a.parser=b,a.parse=function(){return b.parse.apply(b,arguments)},a.main=function(c){if(!c[1])throw new Error("Usage: "+c[0]+" FILE");if(typeof process!="undefined")var d=require("fs").readFileSync(require("path").join(process.cwd(),c[1]),"utf8");else var e=require("file").path(require("file").cwd()),d=e.join(c[1]).read({charset:"utf-8"});return a.parser.parse(d)},typeof module!="undefined"&&require.main===module&&a.main(typeof process!="undefined"?process.argv.slice(1):require("system").args))},require["./scope"]=new function(){var a=this;((function(){var b,c,d,e;e=require("./helpers"),c=e.extend,d=e.last,a.Scope=b=function(){function a(b,c,d){this.parent=b,this.expressions=c,this.method=d,this.variables=[{name:"arguments",type:"arguments"}],this.positions={},this.parent||(a.root=this)}return a.root=null,a.prototype.add=function(a,b,c){return this.shared&&!c?this.parent.add(a,b,c):Object.prototype.hasOwnProperty.call(this.positions,a)?this.variables[this.positions[a]].type=b:this.positions[a]=this.variables.push({name:a,type:b})-1},a.prototype.namedMethod=function(){return this.method.name||!this.parent?this.method:this.parent.namedMethod()},a.prototype.find=function(a){return this.check(a)?!0:(this.add(a,"var"),!1)},a.prototype.parameter=function(a){if(this.shared&&this.parent.check(a,!0))return;return this.add(a,"param")},a.prototype.check=function(a){var b;return!!(this.type(a)||((b=this.parent)!=null?b.check(a):void 0))},a.prototype.temporary=function(a,b){return a.length>1?"_"+a+(b>1?b-1:""):"_"+(b+parseInt(a,36)).toString(36).replace(/\d/g,"a")},a.prototype.type=function(a){var b,c,d,e;e=this.variables;for(c=0,d=e.length;c1&&a.level>=w?"("+c+")":c)},b.prototype.compileRoot=function(a){var b,c,d,e,f,g;return a.indent=a.bare?"":R,a.scope=new N(null,this,null),a.level=z,this.spaced=!0,e="",a.bare||(f=function(){var a,b,e,f;e=this.expressions,f=[];for(d=a=0,b=e.length;a=u?"(void 0)":"void 0"},b}(e),a.Null=function(a){function b(){return b.__super__.constructor.apply(this,arguments)}return bm(b,a),b.prototype.isAssignable=D,b.prototype.isComplex=D,b.prototype.compileNode=function(){return"null"},b}(e),a.Bool=function(a){function b(a){this.val=a}return bm(b,a),b.prototype.isAssignable=D,b.prototype.isComplex=D,b.prototype.compileNode=function(){return this.val},b}(e),a.Return=K=function(a){function b(a){a&&!a.unwrap().isUndefined&&(this.expression=a)}return bm(b,a),b.prototype.children=["expression"],b.prototype.isStatement=Y,b.prototype.makeReturn=S,b.prototype.jumps=S,b.prototype.compile=function(a,c){var d,e;return d=(e=this.expression)!=null?e.makeReturn():void 0,!d||d instanceof b?b.__super__.compile.call(this,a,c):d.compile(a,c)},b.prototype.compileNode=function(a){return this.tab+("return"+[this.expression?" "+this.expression.compile(a,y):void 0]+";")},b}(e),a.Value=W=function(a){function b(a,c,d){return!c&&a instanceof b?a:(this.base=a,this.properties=c||[],d&&(this[d]=!0),this)}return bm(b,a),b.prototype.children=["base","properties"],b.prototype.add=function(a){return this.properties=this.properties.concat(a),this},b.prototype.hasProperties=function(){return!!this.properties.length},b.prototype.isArray=function(){return!this.properties.length&&this.base instanceof c},b.prototype.isComplex=function(){return this.hasProperties()||this.base.isComplex()},b.prototype.isAssignable=function(){return this.hasProperties()||this.base.isAssignable()},b.prototype.isSimpleNumber=function(){return this.base instanceof A&&L.test(this.base.value)},b.prototype.isString=function(){return this.base instanceof A&&q.test(this.base.value)},b.prototype.isAtomic=function(){var a,b,c,d;d=this.properties.concat(this.base);for(b=0,c=d.length;b"+this.equals],i=n[0],e=n[1],c=this.stepNum?+this.stepNum>0?""+i+" "+this.toVar:""+e+" "+this.toVar:h?(o=[+this.fromNum,+this.toNum],d=o[0],l=o[1],o,d<=l?""+i+" "+l:""+e+" "+l):(b=""+this.fromVar+" <= "+this.toVar,""+b+" ? "+i+" "+this.toVar+" : "+e+" "+this.toVar),k=this.stepVar?""+f+" += "+this.stepVar:h?j?d<=l?"++"+f:"--"+f:d<=l?""+f+"++":""+f+"--":j?""+b+" ? ++"+f+" : --"+f:""+b+" ? "+f+"++ : "+f+"--",j&&(m=""+g+" = "+m),j&&(k=""+g+" = "+k),""+m+"; "+c+"; "+k):this.compileArray(a)},b.prototype.compileArray=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p;if(this.fromNum&&this.toNum&&Math.abs(this.fromNum-this.toNum)<=20)return j=function(){p=[];for(var a=n=+this.fromNum,b=+this.toNum;n<=b?a<=b:a>=b;n<=b?a++:a--)p.push(a);return p}.apply(this),this.exclusive&&j.pop(),"["+j.join(", ")+"]";g=this.tab+R,f=a.scope.freeVariable("i"),k=a.scope.freeVariable("results"),i="\n"+g+k+" = [];",this.fromNum&&this.toNum?(a.index=f,c=this.compileNode(a)):(l=""+f+" = "+this.fromC+(this.toC!==this.toVar?", "+this.toC:""),d=""+this.fromVar+" <= "+this.toVar,c="var "+l+"; "+d+" ? "+f+" <"+this.equals+" "+this.toVar+" : "+f+" >"+this.equals+" "+this.toVar+"; "+d+" ? "+f+"++ : "+f+"--"),h="{ "+k+".push("+f+"); }\n"+g+"return "+k+";\n"+a.indent,e=function(a){return a!=null?a.contains(function(a){return a instanceof A&&a.value==="arguments"&&!a.asKey}):void 0};if(e(this.from)||e(this.to))b=", arguments";return"(function() {"+i+"\n"+g+"for ("+c+")"+h+"}).apply(this"+(b!=null?b:"")+")"},b}(e),a.Slice=O=function(a){function b(a){this.range=a,b.__super__.constructor.call(this)}return bm(b,a),b.prototype.children=["range"],b.prototype.compileNode=function(a){var b,c,d,e,f,g;return g=this.range,e=g.to,c=g.from,d=c&&c.compile(a,y)||"0",b=e&&e.compile(a,y),e&&(!!this.range.exclusive||+b!==-1)&&(f=", "+(this.range.exclusive?b:L.test(b)?""+(+b+1):(b=e.compile(a,u),"+"+b+" + 1 || 9e9"))),".slice("+d+(f||"")+")"},b}(e),a.Obj=E=function(a){function b(a,b){this.generated=b!=null?b:!1,this.objects=this.properties=a||[]}return bm(b,a),b.prototype.children=["properties"],b.prototype.compileNode=function(a){var b,c,e,f,g,h,i,j,l,m,n;l=this.properties;if(!l.length)return this.front?"({})":"{}";if(this.generated)for(m=0,n=l.length;m=0?"[\n"+a.indent+b+"\n"+this.tab+"]":"["+b+"]")):"[]"},b.prototype.assigns=function(a){var b,c,d,e;e=this.objects;for(c=0,d=e.length;c=0)throw SyntaxError("variable name may not be "+a);return a&&(a=o.test(a)&&a)},c.prototype.setContext=function(a){return this.body.traverseChildren(!1,function(b){if(b.classBody)return!1;if(b instanceof A&&b.value==="this")return b.value=a;if(b instanceof j){b.klass=a;if(b.bound)return b.context=a}})},c.prototype.addBoundFunctions=function(a){var c,d,e,f,g,h;if(this.boundFuncs.length){g=this.boundFuncs,h=[];for(e=0,f=g.length;e=0);if(e&&this.context!=="object")throw SyntaxError('variable name may not be "'+f+'"')}return bm(c,a),c.prototype.children=["variable","value"],c.prototype.isStatement=function(a){return(a!=null?a.level:void 0)===z&&this.context!=null&&bn.call(this.context,"?")>=0},c.prototype.assigns=function(a){return this[this.context==="object"?"value":"variable"].assigns(a)},c.prototype.unfoldSoak=function(a){return bh(a,this,"variable")},c.prototype.compileNode=function(a){var b,c,d,e,f,g,h,i,k;if(b=this.variable instanceof W){if(this.variable.isArray()||this.variable.isObject())return this.compilePatternMatch(a);if(this.variable.isSplice())return this.compileSplice(a);if((g=this.context)==="||="||g==="&&="||g==="?=")return this.compileConditional(a)}d=this.variable.compile(a,w);if(!this.context){if(!(f=this.variable.unwrapAll()).isAssignable())throw SyntaxError('"'+this.variable.compile(a)+'" cannot be assigned.');if(typeof f.hasProperties=="function"?!f.hasProperties():!void 0)this.param?a.scope.add(d,"var"):a.scope.find(d)}return this.value instanceof j&&(c=B.exec(d))&&(c[1]&&(this.value.klass=c[1]),this.value.name=(h=(i=(k=c[2])!=null?k:c[3])!=null?i:c[4])!=null?h:c[5]),e=this.value.compile(a,w),this.context==="object"?""+d+": "+e:(e=d+(" "+(this.context||"=")+" ")+e,a.level<=w?e:"("+e+")")},c.prototype.compilePatternMatch=function(a){var d,e,f,g,h,i,j,k,l,m,n,p,q,r,s,u,v,y,B,C,D,E,F,G,J,K,L;s=a.level===z,v=this.value,m=this.variable.base.objects;if(!(n=m.length))return f=v.compile(a),a.level>=x?"("+f+")":f;i=this.variable.isObject();if(s&&n===1&&!((l=m[0])instanceof P)){l instanceof c?(D=l,E=D.variable,h=E.base,l=D.value):l.base instanceof H?(F=(new W(l.unwrapAll())).cacheReference(a),l=F[0],h=F[1]):h=i?l["this"]?l.properties[0].name:l:new A(0),d=o.test(h.unwrap().value||0),v=new W(v),v.properties.push(new(d?b:t)(h));if(G=l.unwrap().value,bn.call(I,G)>=0)throw new SyntaxError("assignment to a reserved word: "+l.compile(a)+" = "+v.compile(a));return(new c(l,v,null,{param:this.param})).compile(a,z)}y=v.compile(a,w),e=[],r=!1;if(!o.test(y)||this.variable.assigns(y))e.push(""+(p=a.scope.freeVariable("ref"))+" = "+y),y=p;for(g=B=0,C=m.length;B=0)throw new SyntaxError("assignment to a reserved word: "+l.compile(a)+" = "+u.compile(a));e.push((new c(l,u,null,{param:this.param,subpattern:!0})).compile(a,w))}return!s&&!this.subpattern&&e.push(y),f=e.join(", "),a.level=0&&(a.isExistentialEquals=!0),(new F(this.context.slice(0,-1),b,new c(d,this.value,"="))).compile(a)},c.prototype.compileSplice=function(a){var b,c,d,e,f,g,h,i,j,k,l,m;return k=this.variable.properties.pop().range,d=k.from,h=k.to,c=k.exclusive,g=this.variable.compile(a),l=(d!=null?d.cache(a,x):void 0)||["0","0"],e=l[0],f=l[1],h?(d!=null?d.isSimpleNumber():void 0)&&h.isSimpleNumber()?(h=+h.compile(a)- +f,c||(h+=1)):(h=h.compile(a,u)+" - "+f,c||(h+=" + 1")):h="9e9",m=this.value.cache(a,w),i=m[0],j=m[1],b="[].splice.apply("+g+", ["+e+", "+h+"].concat("+i+")), "+j,a.level>z?"("+b+")":b},c}(e),a.Code=j=function(a){function b(a,b,c){this.params=a||[],this.body=b||new f,this.bound=c==="boundfunc",this.bound&&(this.context="_this")}return bm(b,a),b.prototype.children=["params","body"],b.prototype.isStatement=function(){return!!this.ctor},b.prototype.jumps=D,b.prototype.compileNode=function(a){var b,e,f,g,h,i,j,k,l,m,n,o,p,q,s,t,v,w,x,y,z,B,C,D,E,G,H,I,J,K,L,M,O;a.scope=new N(a.scope,this.body,this),a.scope.shared=$(a,"sharedScope"),a.indent+=R,delete a.bare,delete a.isExistentialEquals,l=[],e=[],H=this.paramNames();for(s=0,x=H.length;s=u?"("+b+")":b},b.prototype.paramNames=function(){var a,b,c,d,e;a=[],e=this.params;for(c=0,d=e.length;c=0)throw SyntaxError('parameter name "'+a+'" is not allowed')}return bm(b,a),b.prototype.children=["name","value"],b.prototype.compile=function(a){return this.name.compile(a,w)},b.prototype.asReference=function(a){var b;return this.reference?this.reference:(b=this.name,b["this"]?(b=b.properties[0].name,b.value.reserved&&(b=new A(a.scope.freeVariable(b.value)))):b.isComplex()&&(b=new A(a.scope.freeVariable("arg"))),b=new W(b),this.splat&&(b=new P(b)),this.reference=b)},b.prototype.isComplex=function(){return this.name.isComplex()},b.prototype.names=function(a){var b,c,e,f,g,h;a==null&&(a=this.name),b=function(a){var b;return b=a.properties[0].name.value,b.reserved?[]:[b]};if(a instanceof A)return[a.value];if(a instanceof W)return b(a);c=[],h=a.objects;for(f=0,g=h.length;f=c.length)return"";if(c.length===1)return g=c[0].compile(a,w),d?g:""+bi("slice")+".call("+g+")";e=c.slice(i);for(h=k=0,l=e.length;k1?b.expressions.unshift(new r((new H(this.guard)).invert(),new A("continue"))):this.guard&&(b=f.wrap([new r(this.guard,b)]))),b="\n"+b.compile(a,z)+"\n"+this.tab),c=e+this.tab+("while ("+this.condition.compile(a,y)+") {"+b+"}"),this.returns&&(c+="\n"+this.tab+"return "+d+";"),c},b}(e),a.Op=F=function(a){function e(a,c,d,e){if(a==="in")return new s(c,d);if(a==="do")return this.generateDo(c);if(a==="new"){if(c instanceof g&&!c["do"]&&!c.isNew)return c.newInstance();if(c instanceof j&&c.bound||c["do"])c=new H(c)}return this.operator=b[a]||a,this.first=c,this.second=d,this.flip=!!e,this}var b,c;return bm(e,a),b={"==":"===","!=":"!==",of:"in"},c={"!==":"===","===":"!=="},e.prototype.children=["first","second"],e.prototype.isSimpleNumber=D,e.prototype.isUnary=function(){return!this.second},e.prototype.isComplex=function(){var a;return!this.isUnary()||(a=this.operator)!=="+"&&a!=="-"||this.first.isComplex()},e.prototype.isChainable=function(){var a;return(a=this.operator)==="<"||a===">"||a===">="||a==="<="||a==="==="||a==="!=="},e.prototype.invert=function(){var a,b,d,f,g;if(this.isChainable()&&this.first.isChainable()){a=!0,b=this;while(b&&b.operator)a&&(a=b.operator in c),b=b.first;if(!a)return(new H(this)).invert();b=this;while(b&&b.operator)b.invert=!b.invert,b.operator=c[b.operator],b=b.first;return this}return(f=c[this.operator])?(this.operator=f,this.first.unwrap()instanceof e&&this.first.invert(),this):this.second?(new H(this)).invert():this.operator==="!"&&(d=this.first.unwrap())instanceof e&&((g=d.operator)==="!"||g==="in"||g==="instanceof")?d:new e("!",this)},e.prototype.unfoldSoak=function(a){var b;return((b=this.operator)==="++"||b==="--"||b==="delete")&&bh(a,this,"first")},e.prototype.generateDo=function(a){var b,c,e,f,h,i,k,l;f=[],c=a instanceof d&&(h=a.value.unwrap())instanceof j?h:a,l=c.params||[];for(i=0,k=l.length;i=0))throw SyntaxError("prefix increment/decrement may not have eval or arguments operand");return this.isUnary()?this.compileUnary(a):c?this.compileChain(a):this.operator==="?"?this.compileExistence(a):(b=this.first.compile(a,x)+" "+this.operator+" "+this.second.compile(a,x),a.level<=x?b:"("+b+")")},e.prototype.compileChain=function(a){var b,c,d,e;return e=this.first.second.cache(a),this.first.second=e[0],d=e[1],c=this.first.compile(a,x),b=""+c+" "+(this.invert?"&&":"||")+" "+d.compile(a)+" "+this.operator+" "+this.second.compile(a,x),"("+b+")"},e.prototype.compileExistence=function(a){var b,c;return this.first.isComplex()?(c=new A(a.scope.freeVariable("ref")),b=new H(new d(c,this.first))):(b=this.first,c=b),(new r(new l(b),c,{type:"if"})).addElse(this.second).compile(a)},e.prototype.compileUnary=function(a){var b,c,d;if(a.level>=u)return(new H(this)).compile(a);c=[b=this.operator],d=b==="+"||b==="-",(b==="new"||b==="typeof"||b==="delete"||d&&this.first instanceof e&&this.first.operator===b)&&c.push(" ");if(d&&this.first instanceof e||b==="new"&&this.first.isStatement(a))this.first=new H(this.first);return c.push(this.first.compile(a,x)),this.flip&&c.reverse(),c.join("")},e.prototype.toString=function(a){return e.__super__.toString.call(this,a,this.constructor.name+" "+this.operator)},e}(e),a.In=s=function(a){function b(a,b){this.object=a,this.array=b}return bm(b,a),b.prototype.children=["object","array"],b.prototype.invert=C,b.prototype.compileNode=function(a){var b,c,d,e,f;if(this.array instanceof W&&this.array.isArray()){f=this.array.base.objects;for(d=0,e=f.length;d= 0"),d===c?b:(b=d+", "+b,a.level=0)throw SyntaxError('catch variable may not be "'+this.error.value+'"');return a.scope.check(this.error.value)||a.scope.add(this.error.value,"param")," catch"+d+"{\n"+this.recovery.compile(a,z)+"\n"+this.tab+"}"}if(!this.ensure&&!this.recovery)return" catch (_error) {}"}.call(this),c=this.ensure?" finally {\n"+this.ensure.compile(a,z)+"\n"+this.tab+"}":"",""+this.tab+"try {\n"+e+"\n"+this.tab+"}"+(b||"")+c},b}(e),a.Throw=T=function(a){function b(a){this.expression=a}return bm(b,a),b.prototype.children=["expression"],b.prototype.isStatement=Y,b.prototype.jumps=D,b.prototype.makeReturn=S,b.prototype.compileNode=function(a){return this.tab+("throw "+this.expression.compile(a)+";")},b}(e),a.Existence=l=function(a){function b(a){this.expression=a}return bm(b,a),b.prototype.children=["expression"],b.prototype.invert=C,b.prototype.compileNode=function(a){var b,c,d,e;return this.expression.front=this.front,d=this.expression.compile(a,x),o.test(d)&&!a.scope.check(d)?(e=this.negated?["===","||"]:["!==","&&"],b=e[0],c=e[1],d="typeof "+d+" "+b+' "undefined" '+c+" "+d+" "+b+" null"):d=""+d+" "+(this.negated?"==":"!=")+" null",a.level<=v?d:"("+d+")"},b}(e),a.Parens=H=function(a){function b(a){this.body=a}return bm(b,a),b.prototype.children=["body"],b.prototype.unwrap=function(){return this.body},b.prototype.isComplex=function(){return this.body.isComplex()},b.prototype.compileNode=function(a){var b,c,d;return d=this.body.unwrap(),d instanceof W&&d.isAtomic()?(d.front=this.front,d.compile(a)):(c=d.compile(a,y),b=a.level1?b.expressions.unshift(new r((new H(this.guard)).invert(),new A("continue"))):this.guard&&(b=f.wrap([new r(this.guard,b)]))),this.pattern&&b.expressions.unshift(new d(this.name,new A(""+F+"["+l+"]"))),c+=this.pluckDirectCall(a,b),s&&(G="\n"+i+s+";"),this.object&&(e=""+l+" in "+F,this.own&&(h="\n"+i+"if (!"+bi("hasProp")+".call("+F+", "+l+")) continue;")),b=b.compile(bd(a,{indent:i}),z),b&&(b="\n"+b+"\n"),""+c+(u||"")+this.tab+"for ("+e+") {"+h+G+b+this.tab+"}"+(v||"")},b.prototype.pluckDirectCall=function(a,b){var c,e,f,h,i,k,l,m,n,o,p,q,r,s,t;e="",o=b.expressions;for(i=m=0,n=o.length;m=v?"("+d+")":d},b.prototype.unfoldSoak=function(){return this.soak&&this},b}(e),i={wrap:function(a,c,d){var e,h,i,k,l;if(a.jumps())return a;i=new j([],f.wrap([a])),e=[];if((k=a.contains(this.literalArgs))||a.contains(this.literalThis))l=new A(k?"apply":"call"),e=[new A("this")],k&&e.push(new A("arguments")),i=new W(i,[new b(l)]);return i.noReturn=d,h=new g(i,e),c?f.wrap([h]):h},literalArgs:function(a){return a instanceof A&&a.value==="arguments"&&!a.asKey},literalThis:function(a){return a instanceof A&&a.value==="this"&&!a.asKey||a instanceof j&&a.bound||a instanceof g&&a.isSuper}},bh=function(a,b,c){var d;if(!(d=b[c].unfoldSoak(a)))return;return b[c]=d.body,d.body=new W(b),d},V={"extends":function(){return"function(child, parent) { for (var key in parent) { if ("+bi("hasProp")+".call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }"},bind:function(){return"function(fn, me){ return function(){ return fn.apply(me, arguments); }; }"},indexOf:function(){return"[].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }"},hasProp:function(){return"{}.hasOwnProperty"},slice:function(){return"[].slice"}},z=1,y=2,w=3,v=4,x=5,u=6,R=" ",p="[$A-Za-z_\\x7f-\\uffff][$\\w\\x7f-\\uffff]*",o=RegExp("^"+p+"$"),L=/^[+-]?\d+$/,B=RegExp("^(?:("+p+")\\.prototype(?:\\.("+p+")|\\[(\"(?:[^\\\\\"\\r\\n]|\\\\.)*\"|'(?:[^\\\\'\\r\\n]|\\\\.)*')\\]|\\[(0x[\\da-fA-F]+|\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\]))|("+p+")$"),q=/^['"]/,bi=function(a){var b;return b="__"+a,N.root.assign(b,V[a]()),b},be=function(a,b){return a=a.replace(/\n/g,"$&"+b),a.replace(/\s+$/,"")}})).call(this)},require["./coffee-script"]=new function(){var a=this;((function(){var b,c,d,e,f,g,h,i,j,k,l={}.hasOwnProperty;e=require("fs"),h=require("path"),k=require("./lexer"),b=k.Lexer,c=k.RESERVED,g=require("./parser").parser,j=require("vm"),i=function(a){return a.charCodeAt(0)===65279?a.substring(1):a},require.extensions&&(require.extensions[".coffee"]=function(a,b){var c;return c=d(i(e.readFileSync(b,"utf8")),{filename:b}),a._compile(c,b)}),a.VERSION="1.4.0",a.RESERVED=c,a.helpers=require("./helpers"),a.compile=d=function(b,c){var d,e,h;c==null&&(c={}),h=a.helpers.merge;try{e=g.parse(f.tokenize(b)).compile(c);if(!c.header)return e}catch(i){throw c.filename&&(i.message="In "+c.filename+", "+i.message),i}return d="Generated by CoffeeScript "+this.VERSION,"// "+d+"\n"+e},a.tokens=function(a,b){return f.tokenize(a,b)},a.nodes=function(a,b){return typeof a=="string"?g.parse(f.tokenize(a,b)):g.parse(a)},a.run=function(a,b){var c;return b==null&&(b={}),c=require.main,c.filename=process.argv[1]=b.filename?e.realpathSync(b.filename):".",c.moduleCache&&(c.moduleCache={}),c.paths=require("module")._nodeModulePaths(h.dirname(e.realpathSync(b.filename))),h.extname(c.filename)!==".coffee"||require.extensions?c._compile(d(a,b),c.filename):c._compile(a,c.filename)},a.eval=function(a,b){var c,e,f,g,i,k,m,n,o,p,q,r,s,t;b==null&&(b={});if(!(a=a.trim()))return;e=j.Script;if(e){if(b.sandbox!=null){if(b.sandbox instanceof e.createContext().constructor)m=b.sandbox;else{m=e.createContext(),r=b.sandbox;for(g in r){if(!l.call(r,g))continue;n=r[g],m[g]=n}}m.global=m.root=m.GLOBAL=m}else m=global;m.__filename=b.filename||"eval",m.__dirname=h.dirname(m.__filename);if(m===global&&!m.module&&!m.require){c=require("module"),m.module=q=new c(b.modulename||"eval"),m.require=t=function(a){return c._load(a,q,!0)},q.filename=m.__filename,s=Object.getOwnPropertyNames(require);for(o=0,p=s.length;o=", ">", +"<<", ">>", ">>>", +"+", "-", +"*", "/", "%", +"!", "~", "UNARY_PLUS", "UNARY_MINUS", +"++", "--", +".", +"[", "]", +"{", "}", +"(", ")", +"SCRIPT", "BLOCK", "LABEL", "FOR_IN", "CALL", "NEW_WITH_ARGS", "INDEX", +"ARRAY_INIT", "OBJECT_INIT", "PROPERTY_INIT", "GETTER", "SETTER", +"GROUP", "LIST", "LET_BLOCK", "ARRAY_COMP", "GENERATOR", "COMP_TAIL", +"IDENTIFIER", "NUMBER", "STRING", "REGEXP", +"break", +"case", "catch", "const", "continue", +"debugger", "default", "delete", "do", +"else", +"false", "finally", "for", "function", +"if", "in", "instanceof", +"let", +"new", "null", +"return", +"switch", +"this", "throw", "true", "try", "typeof", +"var", "void", +"yield", +"while", "with", +]; +var statementStartTokens = [ +"break", +"const", "continue", +"debugger", "do", +"for", +"if", +"return", +"switch", +"throw", "try", +"var", +"yield", +"while", "with", +]; +var opTypeNames = { +'\n': "NEWLINE", +';': "SEMICOLON", +',': "COMMA", +'?': "HOOK", +':': "COLON", +'||': "OR", +'&&': "AND", +'|': "BITWISE_OR", +'^': "BITWISE_XOR", +'&': "BITWISE_AND", +'===': "STRICT_EQ", +'==': "EQ", +'=': "ASSIGN", +'!==': "STRICT_NE", +'!=': "NE", +'<<': "LSH", +'<=': "LE", +'<': "LT", +'>>>': "URSH", +'>>': "RSH", +'>=': "GE", +'>': "GT", +'++': "INCREMENT", +'--': "DECREMENT", +'+': "PLUS", +'-': "MINUS", +'*': "MUL", +'/': "DIV", +'%': "MOD", +'!': "NOT", +'~': "BITWISE_NOT", +'.': "DOT", +'[': "LEFT_BRACKET", +']': "RIGHT_BRACKET", +'{': "LEFT_CURLY", +'}': "RIGHT_CURLY", +'(': "LEFT_PAREN", +')': "RIGHT_PAREN" +}; +var keywords = {__proto__: null}; +var tokenIds = {}; +var consts = "const "; +for (var i = 0, j = tokens.length; i < j; i++) { +if (i > 0) +consts += ", "; +var t = tokens[i]; +var name; +if (/^[a-z]/.test(t)) { +name = t.toUpperCase(); +keywords[t] = i; +} else { +name = (/^\W/.test(t) ? opTypeNames[t] : t); +} +consts += name + " = " + i; +tokenIds[name] = i; +tokens[t] = i; +} +consts += ";"; +var isStatementStartCode = {__proto__: null}; +for (i = 0, j = statementStartTokens.length; i < j; i++) +isStatementStartCode[keywords[statementStartTokens[i]]] = true; +var assignOps = ['|', '^', '&', '<<', '>>', '>>>', '+', '-', '*', '/', '%']; +for (i = 0, j = assignOps.length; i < j; i++) { +t = assignOps[i]; +assignOps[t] = tokens[t]; +} +function defineGetter(obj, prop, fn, dontDelete, dontEnum) { +Object.defineProperty(obj, prop, +{ get: fn, configurable: !dontDelete, enumerable: !dontEnum }); +} +function defineProperty(obj, prop, val, dontDelete, readOnly, dontEnum) { +Object.defineProperty(obj, prop, +{ value: val, writable: !readOnly, configurable: !dontDelete, +enumerable: !dontEnum }); +} +function isNativeCode(fn) { +return ((typeof fn) === "function") && fn.toString().match(/\[native code\]/); +} +function getPropertyDescriptor(obj, name) { +while (obj) { +if (({}).hasOwnProperty.call(obj, name)) +return Object.getOwnPropertyDescriptor(obj, name); +obj = Object.getPrototypeOf(obj); +} +} +function getOwnProperties(obj) { +var map = {}; +for (var name in Object.getOwnPropertyNames(obj)) +map[name] = Object.getOwnPropertyDescriptor(obj, name); +return map; +} +function makePassthruHandler(obj) { +return { +getOwnPropertyDescriptor: function(name) { +var desc = Object.getOwnPropertyDescriptor(obj, name); +desc.configurable = true; +return desc; +}, +getPropertyDescriptor: function(name) { +var desc = getPropertyDescriptor(obj, name); +desc.configurable = true; +return desc; +}, +getOwnPropertyNames: function() { +return Object.getOwnPropertyNames(obj); +}, +defineProperty: function(name, desc) { +Object.defineProperty(obj, name, desc); +}, +"delete": function(name) { return delete obj[name]; }, +fix: function() { +if (Object.isFrozen(obj)) { +return getOwnProperties(obj); +} +return undefined; +}, +has: function(name) { return name in obj; }, +hasOwn: function(name) { return ({}).hasOwnProperty.call(obj, name); }, +get: function(receiver, name) { return obj[name]; }, +set: function(receiver, name, val) { obj[name] = val; return true; }, +enumerate: function() { +var result = []; +for (name in obj) { result.push(name); }; +return result; +}, +keys: function() { return Object.keys(obj); } +}; +} +function noPropFound() { return undefined; } +var hasOwnProperty = ({}).hasOwnProperty; +function StringMap() { +this.table = Object.create(null, {}); +this.size = 0; +} +StringMap.prototype = { +has: function(x) { return hasOwnProperty.call(this.table, x); }, +set: function(x, v) { +if (!hasOwnProperty.call(this.table, x)) +this.size++; +this.table[x] = v; +}, +get: function(x) { return this.table[x]; }, +getDef: function(x, thunk) { +if (!hasOwnProperty.call(this.table, x)) { +this.size++; +this.table[x] = thunk(); +} +return this.table[x]; +}, +forEach: function(f) { +var table = this.table; +for (var key in table) +f.call(this, key, table[key]); +}, +toString: function() { return "[object StringMap]" } +}; +function Stack(elts) { +this.elts = elts || null; +} +Stack.prototype = { +push: function(x) { +return new Stack({ top: x, rest: this.elts }); +}, +top: function() { +if (!this.elts) +throw new Error("empty stack"); +return this.elts.top; +}, +isEmpty: function() { +return this.top === null; +}, +find: function(test) { +for (var elts = this.elts; elts; elts = elts.rest) { +if (test(elts.top)) +return elts.top; +} +return null; +}, +has: function(x) { +return Boolean(this.find(function(elt) { return elt === x })); +}, +forEach: function(f) { +for (var elts = this.elts; elts; elts = elts.rest) { +f(elts.top); +} +} +}; +return { +tokens: tokens, +opTypeNames: opTypeNames, +keywords: keywords, +isStatementStartCode: isStatementStartCode, +tokenIds: tokenIds, +consts: consts, +assignOps: assignOps, +defineGetter: defineGetter, +defineProperty: defineProperty, +isNativeCode: isNativeCode, +makePassthruHandler: makePassthruHandler, +noPropFound: noPropFound, +StringMap: StringMap, +Stack: Stack +}; +}()); +Narcissus.lexer = (function() { +var definitions = Narcissus.definitions; +eval(definitions.consts); +var opTokens = {}; +for (var op in definitions.opTypeNames) { +if (op === '\n' || op === '.') +continue; +var node = opTokens; +for (var i = 0; i < op.length; i++) { +var ch = op[i]; +if (!(ch in node)) +node[ch] = {}; +node = node[ch]; +node.op = op; +} +} +function Tokenizer(s, f, l) { +this.cursor = 0; +this.source = String(s); +this.tokens = []; +this.tokenIndex = 0; +this.lookahead = 0; +this.scanNewlines = false; +this.unexpectedEOF = false; +this.filename = f || ""; +this.lineno = l || 1; +this.comments = []; +} +Tokenizer.prototype = { +get done() { +return this.peek(true) === END; +}, +get token() { +return this.tokens[this.tokenIndex]; +}, +match: function (tt, scanOperand) { +return this.get(scanOperand) === tt || this.unget(); +}, +mustMatch: function (tt) { +if (!this.match(tt)) { +throw this.newSyntaxError("Missing " + +definitions.tokens[tt].toLowerCase()); +} +return this.token; +}, +peek: function (scanOperand) { +var tt, next; +if (this.lookahead) { +next = this.tokens[(this.tokenIndex + this.lookahead) & 3]; +tt = (this.scanNewlines && next.lineno !== this.lineno) +? NEWLINE +: next.type; +} else { +tt = this.get(scanOperand); +this.unget(); +} +return tt; +}, +peekOnSameLine: function (scanOperand) { +this.scanNewlines = true; +var tt = this.peek(scanOperand); +this.scanNewlines = false; +return tt; +}, +skip: function () { +var input = this.source; +var cstart; +var clineno; +var comments = []; +var comment; +var nlcount = 0; +for (;;) { +var ch = input[this.cursor++]; +var next = input[this.cursor]; +if (ch === '\n' && !this.scanNewlines) { +this.lineno++; +nlcount++; +} else if (ch === '/' && next === '*') { +cstart = this.cursor; +clineno = this.lineno; +this.cursor++; +for (;;) { +ch = input[this.cursor++]; +if (ch === undefined) +throw this.newSyntaxError("Unterminated comment"); +if (ch === '*') { +next = input[this.cursor]; +if (next === '/') { +this.cursor++; +comment = { +type: "BLOCK_COMMENT", +nlcount: nlcount, +start:cstart-1, end:this.cursor, lineno:clineno, endlineno: this.lineno, +value: input.substring(cstart+1,this.cursor-2) +} +this.comments.push(comment); +nlcount = 0; +break; +} +} else if (ch === '\n') { +this.lineno++; +} +} +} else if (ch === '/' && next === '/') { +cstart = this.cursor; +this.cursor++; +for (;;) { +ch = input[this.cursor++]; +if (ch === undefined) { +comment = { +type: "LINE_COMMENT", +start: cstart, end:this.cursor, +lineno: this.lineno, nlcount: nlcount, +value: input.substring(cstart+1,this.cursor-1) +}; +this.comments.push(comment); +return; +} +if (ch === '\n') { +comment = { +type: "LINE_COMMENT", +start: cstart, end:this.cursor, +lineno: this.lineno, nlcount: nlcount, +value: input.substring(cstart+1,this.cursor-1) +}; +this.comments.push(comment); +nlcount = 0; +this.lineno++; +break; +} +} +} else if (ch !== ' ' && ch !== '\t') { +this.cursor--; +return; +} +} +}, +lexExponent: function() { +var input = this.source; +var next = input[this.cursor]; +if (next === 'e' || next === 'E') { +this.cursor++; +ch = input[this.cursor++]; +if (ch === '+' || ch === '-') +ch = input[this.cursor++]; +if (ch < '0' || ch > '9') +throw this.newSyntaxError("Missing exponent"); +do { +ch = input[this.cursor++]; +} while (ch >= '0' && ch <= '9'); +this.cursor--; +return true; +} +return false; +}, +lexZeroNumber: function (ch) { +var token = this.token, input = this.source; +token.type = NUMBER; +ch = input[this.cursor++]; +if (ch === '.') { +do { +ch = input[this.cursor++]; +} while (ch >= '0' && ch <= '9'); +this.cursor--; +this.lexExponent(); +token.value = parseFloat(token.start, this.cursor); +} else if (ch === 'x' || ch === 'X') { +do { +ch = input[this.cursor++]; +} while ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || +(ch >= 'A' && ch <= 'F')); +this.cursor--; +token.value = parseInt(input.substring(token.start, this.cursor)); +} else if (ch >= '0' && ch <= '7') { +do { +ch = input[this.cursor++]; +} while (ch >= '0' && ch <= '7'); +this.cursor--; +token.value = parseInt(input.substring(token.start, this.cursor)); +} else { +this.cursor--; +this.lexExponent(); +token.value = 0; +} +}, +lexNumber: function (ch) { +var token = this.token, input = this.source; +token.type = NUMBER; +var floating = false; +do { +ch = input[this.cursor++]; +if (ch === '.' && !floating) { +floating = true; +ch = input[this.cursor++]; +} +} while (ch >= '0' && ch <= '9'); +this.cursor--; +var exponent = this.lexExponent(); +floating = floating || exponent; +var str = input.substring(token.start, this.cursor); +token.value = floating ? parseFloat(str) : parseInt(str); +}, +lexDot: function (ch) { +var token = this.token, input = this.source; +var next = input[this.cursor]; +if (next >= '0' && next <= '9') { +do { +ch = input[this.cursor++]; +} while (ch >= '0' && ch <= '9'); +this.cursor--; +this.lexExponent(); +token.type = NUMBER; +token.value = parseFloat(token.start, this.cursor); +} else { +token.type = DOT; +token.assignOp = null; +token.value = '.'; +} +}, +lexString: function (ch) { +var token = this.token, input = this.source; +token.type = STRING; +var hasEscapes = false; +var delim = ch; +while ((ch = input[this.cursor++]) !== delim) { +if (this.cursor >= input.length) +throw this.newSyntaxError("Unterminated string literal"); +if (ch === '\\') { +hasEscapes = true; +if (++this.cursor == input.length) +throw this.newSyntaxError("Unterminated string literal"); +} +} +token.value = hasEscapes +? eval(input.substring(token.start, this.cursor)) +: input.substring(token.start + 1, this.cursor - 1); +}, +lexRegExp: function (ch) { +var token = this.token, input = this.source; +token.type = REGEXP; +do { +ch = input[this.cursor++]; +if (ch === '\\') { +this.cursor++; +} else if (ch === '[') { +do { +if (ch === undefined) +throw this.newSyntaxError("Unterminated character class"); +if (ch === '\\') +this.cursor++; +ch = input[this.cursor++]; +} while (ch !== ']'); +} else if (ch === undefined) { +throw this.newSyntaxError("Unterminated regex"); +} +} while (ch !== '/'); +do { +ch = input[this.cursor++]; +} while (ch >= 'a' && ch <= 'z'); +this.cursor--; +token.value = eval(input.substring(token.start, this.cursor)); +}, +lexOp: function (ch) { +var token = this.token, input = this.source; +var node = opTokens[ch]; +var next = input[this.cursor]; +if (next in node) { +node = node[next]; +this.cursor++; +next = input[this.cursor]; +if (next in node) { +node = node[next]; +this.cursor++; +next = input[this.cursor]; +} +} +var op = node.op; +if (definitions.assignOps[op] && input[this.cursor] === '=') { +this.cursor++; +token.type = ASSIGN; +token.assignOp = definitions.tokenIds[definitions.opTypeNames[op]]; +op += '='; +} else { +token.type = definitions.tokenIds[definitions.opTypeNames[op]]; +token.assignOp = null; +} +token.value = op; +}, +lexIdent: function (ch) { +var token = this.token, input = this.source; +do { +ch = input[this.cursor++]; +} while ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || +(ch >= '0' && ch <= '9') || ch === '$' || ch === '_'); +this.cursor--; +var id = input.substring(token.start, this.cursor); +token.type = definitions.keywords[id] || IDENTIFIER; +token.value = id; +}, +get: function (scanOperand) { +var token; +while (this.lookahead) { +--this.lookahead; +this.tokenIndex = (this.tokenIndex + 1) & 3; +token = this.tokens[this.tokenIndex]; +if (token.type !== NEWLINE || this.scanNewlines) +return token.type; +} +this.skip(); +this.tokenIndex = (this.tokenIndex + 1) & 3; +token = this.tokens[this.tokenIndex]; +if (!token) +this.tokens[this.tokenIndex] = token = {}; +var input = this.source; +if (this.cursor === input.length) +return token.type = END; +token.start = this.cursor; +token.lineno = this.lineno; +var ch = input[this.cursor++]; +if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch === '$' || ch === '_') { +this.lexIdent(ch); +} else if (scanOperand && ch === '/') { +this.lexRegExp(ch); +} else if (ch in opTokens) { +this.lexOp(ch); +} else if (ch === '.') { +this.lexDot(ch); +} else if (ch >= '1' && ch <= '9') { +this.lexNumber(ch); +} else if (ch === '0') { +this.lexZeroNumber(ch); +} else if (ch === '"' || ch === "'") { +this.lexString(ch); +} else if (this.scanNewlines && ch === '\n') { +token.type = NEWLINE; +token.value = '\n'; +this.lineno++; +} else { +throw this.newSyntaxError("Illegal token"); +} +token.end = this.cursor; +return token.type; +}, +unget: function () { +if (++this.lookahead === 4) throw "PANIC: too much lookahead!"; +this.tokenIndex = (this.tokenIndex - 1) & 3; +}, +newSyntaxError: function (m) { +var e = new SyntaxError(m, this.filename, this.lineno); +e.source = this.source; +e.cursor = this.lookahead +? this.tokens[(this.tokenIndex + this.lookahead) & 3].start +: this.cursor; +return e; +}, +}; +return { Tokenizer: Tokenizer }; +}()); +Narcissus.parser = (function() { +var lexer = Narcissus.lexer; +var definitions = Narcissus.definitions; +const StringMap = definitions.StringMap; +const Stack = definitions.Stack; +eval(definitions.consts); +function pushDestructuringVarDecls(n, s) { +for (var i in n) { +var sub = n[i]; +if (sub.type === IDENTIFIER) { +s.varDecls.push(sub); +} else { +pushDestructuringVarDecls(sub, s); +} +} +} +const NESTING_TOP = 0, NESTING_SHALLOW = 1, NESTING_DEEP = 2; +function StaticContext(parentScript, parentBlock, inFunction, inForLoopInit, nesting) { +this.parentScript = parentScript; +this.parentBlock = parentBlock; +this.inFunction = inFunction; +this.inForLoopInit = inForLoopInit; +this.nesting = nesting; +this.allLabels = new Stack(); +this.currentLabels = new Stack(); +this.labeledTargets = new Stack(); +this.defaultTarget = null; +Narcissus.options.ecma3OnlyMode && (this.ecma3OnlyMode = true); +Narcissus.options.parenFreeMode && (this.parenFreeMode = true); +} +StaticContext.prototype = { +ecma3OnlyMode: false, +parenFreeMode: false, +update: function(ext) { +var desc = {}; +for (var key in ext) { +desc[key] = { +value: ext[key], +writable: true, +enumerable: true, +configurable: true +} +} +return Object.create(this, desc); +}, +pushLabel: function(label) { +return this.update({ currentLabels: this.currentLabels.push(label), +allLabels: this.allLabels.push(label) }); +}, +pushTarget: function(target) { +var isDefaultTarget = target.isLoop || target.type === SWITCH; +if (this.currentLabels.isEmpty()) { +return isDefaultTarget +? this.update({ defaultTarget: target }) +: this; +} +target.labels = new StringMap(); +this.currentLabels.forEach(function(label) { +target.labels.set(label, true); +}); +return this.update({ currentLabels: new Stack(), +labeledTargets: this.labeledTargets.push(target), +defaultTarget: isDefaultTarget +? target +: this.defaultTarget }); +}, +nest: function(atLeast) { +var nesting = Math.max(this.nesting, atLeast); +return (nesting !== this.nesting) +? this.update({ nesting: nesting }) +: this; +} +}; +function Script(t, inFunction) { +var n = new Node(t, scriptInit()); +var x = new StaticContext(n, n, inFunction, false, NESTING_TOP); +Statements(t, x, n); +return n; +} +definitions.defineProperty(Array.prototype, "top", +function() { +return this.length && this[this.length-1]; +}, false, false, true); +function Node(t, init) { +var token = t.token; +if (token) { +this.type = token.type; +this.value = token.value; +this.lineno = token.lineno; +this.start = token.start; +this.end = token.end; +} else { +this.lineno = t.lineno; +} +this.tokenizer = t; +this.children = []; +for (var prop in init) +this[prop] = init[prop]; +} +var Np = Node.prototype = {}; +Np.constructor = Node; +Np.toSource = Object.prototype.toSource; +Np.push = function (kid) { +if (kid !== null) { +if (kid.start < this.start) +this.start = kid.start; +if (this.end < kid.end) +this.end = kid.end; +} +return this.children.push(kid); +} +Node.indentLevel = 0; +function tokenString(tt) { +var t = definitions.tokens[tt]; +return /^\W/.test(t) ? definitions.opTypeNames[t] : t.toUpperCase(); +} +Np.toString = function () { +var a = []; +for (var i in this) { +if (this.hasOwnProperty(i) && i !== 'type' && i !== 'target') +a.push({id: i, value: this[i]}); +} +a.sort(function (a,b) { return (a.id < b.id) ? -1 : 1; }); +const INDENTATION = " "; +var n = ++Node.indentLevel; +var s = "{\n" + INDENTATION.repeat(n) + "type: " + tokenString(this.type); +for (i = 0; i < a.length; i++) +s += ",\n" + INDENTATION.repeat(n) + a[i].id + ": " + a[i].value; +n = --Node.indentLevel; +s += "\n" + INDENTATION.repeat(n) + "}"; +return s; +} +Np.getSource = function () { +return this.tokenizer.source.slice(this.start, this.end); +}; +const LOOP_INIT = { isLoop: true }; +function blockInit() { +return { type: BLOCK, varDecls: [] }; +} +function scriptInit() { +return { type: SCRIPT, +funDecls: [], +varDecls: [], +modDecls: [], +impDecls: [], +expDecls: [], +loadDeps: [], +hasEmptyReturn: false, +hasReturnWithValue: false, +isGenerator: false }; +} +definitions.defineGetter(Np, "filename", +function() { +return this.tokenizer.filename; +}); +definitions.defineGetter(Np, "length", +function() { +throw new Error("Node.prototype.length is gone; " + +"use n.children.length instead"); +}); +definitions.defineProperty(String.prototype, "repeat", +function(n) { +var s = "", t = this + s; +while (--n >= 0) +s += t; +return s; +}, false, false, true); +function MaybeLeftParen(t, x) { +if (x.parenFreeMode) +return t.match(LEFT_PAREN) ? LEFT_PAREN : END; +return t.mustMatch(LEFT_PAREN).type; +} +function MaybeRightParen(t, p) { +if (p === LEFT_PAREN) +t.mustMatch(RIGHT_PAREN); +} +function Statements(t, x, n) { +try { +while (!t.done && t.peek(true) !== RIGHT_CURLY) +{ n.push(Statement(t, x)); } +} catch (e) { +if (t.done) +{ t.unexpectedEOF = true; } +throw(e); +} +} +function Block(t, x) { +t.mustMatch(LEFT_CURLY); +var n = new Node(t, blockInit()); +Statements(t, x.update({ parentBlock: n }).pushTarget(n), n); +t.mustMatch(RIGHT_CURLY); +return n; +} +const DECLARED_FORM = 0, EXPRESSED_FORM = 1, STATEMENT_FORM = 2; +function Statement(t, x) { +var i, label, n, n2, p, c, ss, tt = t.get(true), tt2, x2, x3; +switch (tt) { +case FUNCTION: +return FunctionDefinition(t, x, true, +(x.nesting !== NESTING_TOP) +? STATEMENT_FORM +: DECLARED_FORM); +case LEFT_CURLY: +n = new Node(t, blockInit()); +Statements(t, x.update({ parentBlock: n }).pushTarget(n).nest(NESTING_SHALLOW), n); +t.mustMatch(RIGHT_CURLY); +return n; +case IF: +n = new Node(t); +n.condition = HeadExpression(t, x); +x2 = x.pushTarget(n).nest(NESTING_DEEP); +n.thenPart = Statement(t, x2); +n.elsePart = t.match(ELSE) ? Statement(t, x2) : null; +return n; +case SWITCH: +n = new Node(t, { cases: [], defaultIndex: -1 }); +n.discriminant = HeadExpression(t, x); +x2 = x.pushTarget(n).nest(NESTING_DEEP); +t.mustMatch(LEFT_CURLY); +while ((tt = t.get()) !== RIGHT_CURLY) { +switch (tt) { +case DEFAULT: +if (n.defaultIndex >= 0) +throw t.newSyntaxError("More than one switch default"); +case CASE: +n2 = new Node(t); +if (tt === DEFAULT) +n.defaultIndex = n.cases.length; +else +n2.caseLabel = Expression(t, x2, COLON); +break; +default: +throw t.newSyntaxError("Invalid switch case"); +} +t.mustMatch(COLON); +n2.statements = new Node(t, blockInit()); +while ((tt=t.peek(true)) !== CASE && tt !== DEFAULT && +tt !== RIGHT_CURLY) +n2.statements.push(Statement(t, x2)); +n.cases.push(n2); +} +return n; +case FOR: +n = new Node(t, LOOP_INIT); +if (t.match(IDENTIFIER)) { +if (t.token.value === "each") +n.isEach = true; +else +t.unget(); +} +if (!x.parenFreeMode) +t.mustMatch(LEFT_PAREN); +x2 = x.pushTarget(n).nest(NESTING_DEEP); +x3 = x.update({ inForLoopInit: true }); +if ((tt = t.peek()) !== SEMICOLON) { +if (tt === VAR || tt === CONST) { +t.get(); +n2 = Variables(t, x3); +} else if (tt === LET) { +t.get(); +if (t.peek() === LEFT_PAREN) { +n2 = LetBlock(t, x3, false); +} else { +x3.parentBlock = n; +n.varDecls = []; +n2 = Variables(t, x3); +} +} else { +n2 = Expression(t, x3); +} +} +if (n2 && t.match(IN)) { +n.type = FOR_IN; +n.object = Expression(t, x3); +if (n2.type === VAR || n2.type === LET) { +c = n2.children; +if (c.length !== 1 && n2.destructurings.length !== 1) { +throw new SyntaxError("Invalid for..in left-hand side", +t.filename, n2.lineno); +} +if (n2.destructurings.length > 0) { +n.iterator = n2.destructurings[0]; +} else { +n.iterator = c[0]; +} +n.varDecl = n2; +} else { +if (n2.type === ARRAY_INIT || n2.type === OBJECT_INIT) { +n2.destructuredNames = checkDestructuring(t, x3, n2); +} +n.iterator = n2; +} +} else { +n.setup = n2; +t.mustMatch(SEMICOLON); +if (n.isEach) +throw t.newSyntaxError("Invalid for each..in loop"); +n.condition = (t.peek() === SEMICOLON) +? null +: Expression(t, x3); +t.mustMatch(SEMICOLON); +tt2 = t.peek(); +n.update = (x.parenFreeMode +? tt2 === LEFT_CURLY || definitions.isStatementStartCode[tt2] +: tt2 === RIGHT_PAREN) +? null +: Expression(t, x3); +} +if (!x.parenFreeMode) +t.mustMatch(RIGHT_PAREN); +n.body = Statement(t, x2); +return n; +case WHILE: +n = new Node(t, { isLoop: true }); +n.condition = HeadExpression(t, x); +n.body = Statement(t, x.pushTarget(n).nest(NESTING_DEEP)); +return n; +case DO: +n = new Node(t, { isLoop: true }); +n.body = Statement(t, x.pushTarget(n).nest(NESTING_DEEP)); +t.mustMatch(WHILE); +n.condition = HeadExpression(t, x); +if (!x.ecmaStrictMode) { +t.match(SEMICOLON); +return n; +} +break; +case BREAK: +case CONTINUE: +n = new Node(t); +x2 = x.pushTarget(n); +if (t.peekOnSameLine() === IDENTIFIER) { +t.get(); +n.label = t.token.value; +} +n.target = n.label +? x2.labeledTargets.find(function(target) { return target.labels.has(n.label) }) +: x2.defaultTarget; +if (!n.target) +throw t.newSyntaxError("Invalid " + ((tt === BREAK) ? "break" : "continue")); +if (!n.target.isLoop && tt === CONTINUE) +throw t.newSyntaxError("Invalid continue"); +break; +case TRY: +n = new Node(t, { catchClauses: [] }); +n.tryBlock = Block(t, x); +while (t.match(CATCH)) { +n2 = new Node(t); +p = MaybeLeftParen(t, x); +switch (t.get()) { +case LEFT_BRACKET: +case LEFT_CURLY: +t.unget(); +n2.varName = DestructuringExpression(t, x, true); +break; +case IDENTIFIER: +n2.varName = t.token.value; +break; +default: +throw t.newSyntaxError("missing identifier in catch"); +break; +} +if (t.match(IF)) { +if (x.ecma3OnlyMode) +throw t.newSyntaxError("Illegal catch guard"); +if (n.catchClauses.length && !n.catchClauses.top().guard) +throw t.newSyntaxError("Guarded catch after unguarded"); +n2.guard = Expression(t, x); +} +MaybeRightParen(t, p); +n2.block = Block(t, x); +n.catchClauses.push(n2); +} +if (t.match(FINALLY)) +n.finallyBlock = Block(t, x); +if (!n.catchClauses.length && !n.finallyBlock) +throw t.newSyntaxError("Invalid try statement"); +return n; +case CATCH: +case FINALLY: +throw t.newSyntaxError(definitions.tokens[tt] + " without preceding try"); +case THROW: +n = new Node(t); +n.exception = Expression(t, x); +break; +case RETURN: +n = ReturnOrYield(t, x); +break; +case WITH: +n = new Node(t); +n.object = HeadExpression(t, x); +n.body = Statement(t, x.pushTarget(n).nest(NESTING_DEEP)); +return n; +case VAR: +case CONST: +n = Variables(t, x); +break; +case LET: +if (t.peek() === LEFT_PAREN) +n = LetBlock(t, x, true); +else +n = Variables(t, x); +break; +case DEBUGGER: +n = new Node(t); +break; +case NEWLINE: +case SEMICOLON: +n = new Node(t, { type: SEMICOLON }); +n.expression = null; +return n; +default: +if (tt === IDENTIFIER) { +tt = t.peek(); +if (tt === COLON) { +label = t.token.value; +if (x.allLabels.has(label)) +throw t.newSyntaxError("Duplicate label"); +t.get(); +n = new Node(t, { type: LABEL, label: label }); +n.statement = Statement(t, x.pushLabel(label).nest(NESTING_SHALLOW)); +n.target = (n.statement.type === LABEL) ? n.statement.target : n.statement; +return n; +} +} +n = new Node(t, { type: SEMICOLON }); +t.unget(); +n.expression = Expression(t, x); +n.end = n.expression.end; +break; +} +MagicalSemicolon(t); +return n; +} +function MagicalSemicolon(t) { +var tt; +if (t.lineno === t.token.lineno) { +tt = t.peekOnSameLine(); +if (tt !== END && tt !== NEWLINE && tt !== SEMICOLON && tt !== RIGHT_CURLY) +throw t.newSyntaxError("missing ; before statement"); +} +t.match(SEMICOLON); +} +function ReturnOrYield(t, x) { +var n, b, tt = t.token.type, tt2; +var parentScript = x.parentScript; +if (tt === RETURN) { +if (!x.inFunction) +throw t.newSyntaxError("Return not in function"); +} else { +if (!x.inFunction) +throw t.newSyntaxError("Yield not in function"); +parentScript.isGenerator = true; +} +n = new Node(t, { value: undefined }); +tt2 = t.peek(true); +if (tt2 !== END && tt2 !== NEWLINE && +tt2 !== SEMICOLON && tt2 !== RIGHT_CURLY +&& (tt !== YIELD || +(tt2 !== tt && tt2 !== RIGHT_BRACKET && tt2 !== RIGHT_PAREN && +tt2 !== COLON && tt2 !== COMMA))) { +if (tt === RETURN) { +n.value = Expression(t, x); +parentScript.hasReturnWithValue = true; +} else { +n.value = AssignExpression(t, x); +} +} else if (tt === RETURN) { +parentScript.hasEmptyReturn = true; +} +if (parentScript.hasReturnWithValue && parentScript.isGenerator) +throw t.newSyntaxError("Generator returns a value"); +return n; +} +function FunctionDefinition(t, x, requireName, functionForm) { +var tt; +var f = new Node(t, { params: [] }); +if (f.type !== FUNCTION) +f.type = (f.value === "get") ? GETTER : SETTER; +if (t.match(IDENTIFIER)) +f.name = t.token.value; +else if (requireName) +throw t.newSyntaxError("missing function identifier"); +var x2 = new StaticContext(null, null, true, false, NESTING_TOP); +t.mustMatch(LEFT_PAREN); +if (!t.match(RIGHT_PAREN)) { +do { +switch (t.get()) { +case LEFT_BRACKET: +case LEFT_CURLY: +t.unget(); +f.params.push(DestructuringExpression(t, x2)); +break; +case IDENTIFIER: +f.params.push(t.token.value); +break; +default: +throw t.newSyntaxError("missing formal parameter"); +break; +} +} while (t.match(COMMA)); +t.mustMatch(RIGHT_PAREN); +} +tt = t.get(); +if (tt !== LEFT_CURLY) +t.unget(); +if (tt !== LEFT_CURLY) { +f.body = AssignExpression(t, x2); +if (f.body.isGenerator) +throw t.newSyntaxError("Generator returns a value"); +} else { +f.body = Script(t, true); +} +if (tt === LEFT_CURLY) +t.mustMatch(RIGHT_CURLY); +f.end = t.token.end; +f.functionForm = functionForm; +if (functionForm === DECLARED_FORM) +x.parentScript.funDecls.push(f); +return f; +} +function Variables(t, x, letBlock) { +var n, n2, ss, i, s, tt; +tt = t.token.type; +switch (tt) { +case VAR: +case CONST: +s = x.parentScript; +break; +case LET: +s = x.parentBlock; +break; +case LEFT_PAREN: +tt = LET; +s = letBlock; +break; +} +n = new Node(t, { type: tt, destructurings: [] }); +do { +tt = t.get(); +if (tt === LEFT_BRACKET || tt === LEFT_CURLY) { +t.unget(); +var dexp = DestructuringExpression(t, x, true); +n2 = new Node(t, { type: IDENTIFIER, +name: dexp, +readOnly: n.type === CONST }); +n.push(n2); +pushDestructuringVarDecls(n2.name.destructuredNames, s); +n.destructurings.push({ exp: dexp, decl: n2 }); +if (x.inForLoopInit && t.peek() === IN) { +continue; +} +t.mustMatch(ASSIGN); +if (t.token.assignOp) +throw t.newSyntaxError("Invalid variable initialization"); +n2.initializer = AssignExpression(t, x); +continue; +} +if (tt !== IDENTIFIER) +throw t.newSyntaxError("missing variable name"); +n2 = new Node(t, { type: IDENTIFIER, +name: t.token.value, +readOnly: n.type === CONST }); +n.push(n2); +s.varDecls.push(n2); +if (t.match(ASSIGN)) { +if (t.token.assignOp) +throw t.newSyntaxError("Invalid variable initialization"); +n2.initializer = AssignExpression(t, x); +} +} while (t.match(COMMA)); +return n; +} +function LetBlock(t, x, isStatement) { +var n, n2; +n = new Node(t, { type: LET_BLOCK, varDecls: [] }); +t.mustMatch(LEFT_PAREN); +n.variables = Variables(t, x, n); +t.mustMatch(RIGHT_PAREN); +if (isStatement && t.peek() !== LEFT_CURLY) { +n2 = new Node(t, { type: SEMICOLON, +expression: n }); +isStatement = false; +} +if (isStatement) +n.block = Block(t, x); +else +n.expression = AssignExpression(t, x); +return n; +} +function checkDestructuring(t, x, n, simpleNamesOnly) { +if (n.type === ARRAY_COMP) +throw t.newSyntaxError("Invalid array comprehension left-hand side"); +if (n.type !== ARRAY_INIT && n.type !== OBJECT_INIT) +return; +var lhss = {}; +var nn, n2, idx, sub, cc, c = n.children; +for (var i = 0, j = c.length; i < j; i++) { +if (!(nn = c[i])) +continue; +if (nn.type === PROPERTY_INIT) { +cc = nn.children; +sub = cc[1]; +idx = cc[0].value; +} else if (n.type === OBJECT_INIT) { +sub = nn; +idx = nn.value; +} else { +sub = nn; +idx = i; +} +if (sub.type === ARRAY_INIT || sub.type === OBJECT_INIT) { +lhss[idx] = checkDestructuring(t, x, sub, simpleNamesOnly); +} else { +if (simpleNamesOnly && sub.type !== IDENTIFIER) { +throw t.newSyntaxError("missing name in pattern"); +} +lhss[idx] = sub; +} +} +return lhss; +} +function DestructuringExpression(t, x, simpleNamesOnly) { +var n = PrimaryExpression(t, x); +n.destructuredNames = checkDestructuring(t, x, n, simpleNamesOnly); +return n; +} +function GeneratorExpression(t, x, e) { +return new Node(t, { type: GENERATOR, +expression: e, +tail: ComprehensionTail(t, x) }); +} +function ComprehensionTail(t, x) { +var body, n, n2, n3, p; +body = new Node(t, { type: COMP_TAIL }); +do { +n = new Node(t, { type: FOR_IN, isLoop: true }); +if (t.match(IDENTIFIER)) { +if (t.token.value === "each") +n.isEach = true; +else +t.unget(); +} +p = MaybeLeftParen(t, x); +switch(t.get()) { +case LEFT_BRACKET: +case LEFT_CURLY: +t.unget(); +n.iterator = DestructuringExpression(t, x); +break; +case IDENTIFIER: +n.iterator = n3 = new Node(t, { type: IDENTIFIER }); +n3.name = n3.value; +n.varDecl = n2 = new Node(t, { type: VAR }); +n2.push(n3); +x.parentScript.varDecls.push(n3); +break; +default: +throw t.newSyntaxError("missing identifier"); +} +t.mustMatch(IN); +n.object = Expression(t, x); +MaybeRightParen(t, p); +body.push(n); +} while (t.match(FOR)); +if (t.match(IF)) +body.guard = HeadExpression(t, x); +return body; +} +function HeadExpression(t, x) { +var p = MaybeLeftParen(t, x); +var n = ParenExpression(t, x); +MaybeRightParen(t, p); +if (p === END && !n.parenthesized) { +var tt = t.peek(); +if (tt !== LEFT_CURLY && !definitions.isStatementStartCode[tt]) +throw t.newSyntaxError("Unparenthesized head followed by unbraced body"); +} +return n; +} +function ParenExpression(t, x) { +var n = Expression(t, x.update({ inForLoopInit: x.inForLoopInit && +(t.token.type === LEFT_PAREN) })); +if (t.match(FOR)) { +if (n.type === YIELD && !n.parenthesized) +throw t.newSyntaxError("Yield expression must be parenthesized"); +if (n.type === COMMA && !n.parenthesized) +throw t.newSyntaxError("Generator expression must be parenthesized"); +n = GeneratorExpression(t, x, n); +} +return n; +} +function Expression(t, x) { +var n, n2; +n = AssignExpression(t, x); +if (t.match(COMMA)) { +n2 = new Node(t, { type: COMMA }); +n2.push(n); +n = n2; +do { +n2 = n.children[n.children.length-1]; +if (n2.type === YIELD && !n2.parenthesized) +throw t.newSyntaxError("Yield expression must be parenthesized"); +n.push(AssignExpression(t, x)); +} while (t.match(COMMA)); +} +return n; +} +function AssignExpression(t, x) { +var n, lhs; +if (t.match(YIELD, true)) +return ReturnOrYield(t, x); +n = new Node(t, { type: ASSIGN }); +lhs = ConditionalExpression(t, x); +if (!t.match(ASSIGN)) { +return lhs; +} +switch (lhs.type) { +case OBJECT_INIT: +case ARRAY_INIT: +lhs.destructuredNames = checkDestructuring(t, x, lhs); +case IDENTIFIER: case DOT: case INDEX: case CALL: +break; +default: +throw t.newSyntaxError("Bad left-hand side of assignment"); +break; +} +n.assignOp = t.token.assignOp; +n.push(lhs); +n.push(AssignExpression(t, x)); +return n; +} +function ConditionalExpression(t, x) { +var n, n2; +n = OrExpression(t, x); +if (t.match(HOOK)) { +n2 = n; +n = new Node(t, { type: HOOK }); +n.push(n2); +n.push(AssignExpression(t, x.update({ inForLoopInit: false }))); +if (!t.match(COLON)) +throw t.newSyntaxError("missing : after ?"); +n.push(AssignExpression(t, x)); +} +return n; +} +function OrExpression(t, x) { +var n, n2; +n = AndExpression(t, x); +while (t.match(OR)) { +n2 = new Node(t); +n2.push(n); +n2.push(AndExpression(t, x)); +n = n2; +} +return n; +} +function AndExpression(t, x) { +var n, n2; +n = BitwiseOrExpression(t, x); +while (t.match(AND)) { +n2 = new Node(t); +n2.push(n); +n2.push(BitwiseOrExpression(t, x)); +n = n2; +} +return n; +} +function BitwiseOrExpression(t, x) { +var n, n2; +n = BitwiseXorExpression(t, x); +while (t.match(BITWISE_OR)) { +n2 = new Node(t); +n2.push(n); +n2.push(BitwiseXorExpression(t, x)); +n = n2; +} +return n; +} +function BitwiseXorExpression(t, x) { +var n, n2; +n = BitwiseAndExpression(t, x); +while (t.match(BITWISE_XOR)) { +n2 = new Node(t); +n2.push(n); +n2.push(BitwiseAndExpression(t, x)); +n = n2; +} +return n; +} +function BitwiseAndExpression(t, x) { +var n, n2; +n = EqualityExpression(t, x); +while (t.match(BITWISE_AND)) { +n2 = new Node(t); +n2.push(n); +n2.push(EqualityExpression(t, x)); +n = n2; +} +return n; +} +function EqualityExpression(t, x) { +var n, n2; +n = RelationalExpression(t, x); +while (t.match(EQ) || t.match(NE) || +t.match(STRICT_EQ) || t.match(STRICT_NE)) { +n2 = new Node(t); +n2.push(n); +n2.push(RelationalExpression(t, x)); +n = n2; +} +return n; +} +function RelationalExpression(t, x) { +var n, n2; +var x2 = x.update({ inForLoopInit: false }); +n = ShiftExpression(t, x2); +while ((t.match(LT) || t.match(LE) || t.match(GE) || t.match(GT) || +(!x.inForLoopInit && t.match(IN)) || +t.match(INSTANCEOF))) { +n2 = new Node(t); +n2.push(n); +n2.push(ShiftExpression(t, x2)); +n = n2; +} +return n; +} +function ShiftExpression(t, x) { +var n, n2; +n = AddExpression(t, x); +while (t.match(LSH) || t.match(RSH) || t.match(URSH)) { +n2 = new Node(t); +n2.push(n); +n2.push(AddExpression(t, x)); +n = n2; +} +return n; +} +function AddExpression(t, x) { +var n, n2; +n = MultiplyExpression(t, x); +while (t.match(PLUS) || t.match(MINUS)) { +n2 = new Node(t); +n2.push(n); +n2.push(MultiplyExpression(t, x)); +n = n2; +} +return n; +} +function MultiplyExpression(t, x) { +var n, n2; +n = UnaryExpression(t, x); +while (t.match(MUL) || t.match(DIV) || t.match(MOD)) { +n2 = new Node(t); +n2.push(n); +n2.push(UnaryExpression(t, x)); +n = n2; +} +return n; +} +function UnaryExpression(t, x) { +var n, n2, tt; +switch (tt = t.get(true)) { +case DELETE: case VOID: case TYPEOF: +case NOT: case BITWISE_NOT: case PLUS: case MINUS: +if (tt === PLUS) +n = new Node(t, { type: UNARY_PLUS }); +else if (tt === MINUS) +n = new Node(t, { type: UNARY_MINUS }); +else +n = new Node(t); +n.push(UnaryExpression(t, x)); +break; +case INCREMENT: +case DECREMENT: +n = new Node(t); +n.push(MemberExpression(t, x, true)); +break; +default: +t.unget(); +n = MemberExpression(t, x, true); +if (t.tokens[(t.tokenIndex + t.lookahead - 1) & 3].lineno === +t.lineno) { +if (t.match(INCREMENT) || t.match(DECREMENT)) { +n2 = new Node(t, { postfix: true }); +n2.push(n); +n = n2; +} +} +break; +} +return n; +} +function MemberExpression(t, x, allowCallSyntax) { +var n, n2, name, tt; +if (t.match(NEW)) { +n = new Node(t); +n.push(MemberExpression(t, x, false)); +if (t.match(LEFT_PAREN)) { +n.type = NEW_WITH_ARGS; +n.push(ArgumentList(t, x)); +} +} else { +n = PrimaryExpression(t, x); +} +while ((tt = t.get()) !== END) { +switch (tt) { +case DOT: +n2 = new Node(t); +n2.push(n); +t.mustMatch(IDENTIFIER); +n2.push(new Node(t)); +break; +case LEFT_BRACKET: +n2 = new Node(t, { type: INDEX }); +n2.push(n); +n2.push(Expression(t, x)); +t.mustMatch(RIGHT_BRACKET); +break; +case LEFT_PAREN: +if (allowCallSyntax) { +n2 = new Node(t, { type: CALL }); +n2.push(n); +n2.push(ArgumentList(t, x)); +break; +} +default: +t.unget(); +return n; +} +n = n2; +} +return n; +} +function ArgumentList(t, x) { +var n, n2; +n = new Node(t, { type: LIST }); +if (t.match(RIGHT_PAREN, true)) +return n; +do { +n2 = AssignExpression(t, x); +if (n2.type === YIELD && !n2.parenthesized && t.peek() === COMMA) +throw t.newSyntaxError("Yield expression must be parenthesized"); +if (t.match(FOR)) { +n2 = GeneratorExpression(t, x, n2); +if (n.children.length > 1 || t.peek(true) === COMMA) +throw t.newSyntaxError("Generator expression must be parenthesized"); +} +n.push(n2); +} while (t.match(COMMA)); +t.mustMatch(RIGHT_PAREN); +return n; +} +function PrimaryExpression(t, x) { +var n, n2, tt = t.get(true); +switch (tt) { +case FUNCTION: +n = FunctionDefinition(t, x, false, EXPRESSED_FORM); +break; +case LEFT_BRACKET: +n = new Node(t, { type: ARRAY_INIT }); +while ((tt = t.peek(true)) !== RIGHT_BRACKET) { +if (tt === COMMA) { +t.get(); +n.push(null); +continue; +} +n.push(AssignExpression(t, x)); +if (tt !== COMMA && !t.match(COMMA)) +break; +} +if (n.children.length === 1 && t.match(FOR)) { +n2 = new Node(t, { type: ARRAY_COMP, +expression: n.children[0], +tail: ComprehensionTail(t, x) }); +n = n2; +} +t.mustMatch(RIGHT_BRACKET); +break; +case LEFT_CURLY: +var id, fd; +n = new Node(t, { type: OBJECT_INIT }); +object_init: +if (!t.match(RIGHT_CURLY)) { +do { +tt = t.get(); +if ((t.token.value === "get" || t.token.value === "set") && +t.peek() === IDENTIFIER) { +if (x.ecma3OnlyMode) +throw t.newSyntaxError("Illegal property accessor"); +n.push(FunctionDefinition(t, x, true, EXPRESSED_FORM)); +} else { +switch (tt) { +case IDENTIFIER: case NUMBER: case STRING: +id = new Node(t, { type: IDENTIFIER }); +break; +case RIGHT_CURLY: +if (x.ecma3OnlyMode) +throw t.newSyntaxError("Illegal trailing ,"); +break object_init; +default: +if (t.token.value in definitions.keywords) { +id = new Node(t, { type: IDENTIFIER }); +break; +} +throw t.newSyntaxError("Invalid property name"); +} +if (t.match(COLON)) { +n2 = new Node(t, { type: PROPERTY_INIT }); +n2.push(id); +n2.push(AssignExpression(t, x)); +n.push(n2); +} else { +if (t.peek() !== COMMA && t.peek() !== RIGHT_CURLY) +throw t.newSyntaxError("missing : after property"); +n.push(id); +} +} +} while (t.match(COMMA)); +t.mustMatch(RIGHT_CURLY); +} +break; +case LEFT_PAREN: +n = ParenExpression(t, x); +t.mustMatch(RIGHT_PAREN); +n.parenthesized = true; +break; +case LET: +n = LetBlock(t, x, false); +break; +case NULL: case THIS: case TRUE: case FALSE: +case IDENTIFIER: case NUMBER: case STRING: case REGEXP: +n = new Node(t); +break; +default: +throw t.newSyntaxError("missing operand"); +break; +} +return n; +} +function parse(s, f, l) { +var t = new lexer.Tokenizer(s, f, l); +var n = Script(t, false); +if (!t.done) +throw t.newSyntaxError("Syntax error"); +return n; +} +function parseStdin(s, ln) { +for (;;) { +try { +var t = new lexer.Tokenizer(s, "stdin", ln.value); +var n = Script(t, false); +ln.value = t.lineno; +return n; +} catch (e) { +if (!t.unexpectedEOF) +throw e; +var more = readline(); +if (!more) +throw e; +s += "\n" + more; +} +} +} +return { +parse: parse, +parseStdin: parseStdin, +Node: Node, +DECLARED_FORM: DECLARED_FORM, +EXPRESSED_FORM: EXPRESSED_FORM, +STATEMENT_FORM: STATEMENT_FORM, +Tokenizer: lexer.Tokenizer, +FunctionDefinition: FunctionDefinition +}; +}()); +var exports = { +definitions: Narcissus.definitions, +lexer: Narcissus.lexer, +parser: Narcissus.parser +}; +if (typeof module != 'undefined') { +module.exports = exports; +}; +(function() { +var Node, Typenames, Types, exports, narcissus, parser, tokens, _, +__indexOf = Array.prototype.indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, +__slice = Array.prototype.slice; +narcissus = this.Narcissus || require('./narcissus_packed'); +_ = this._ || require('underscore'); +tokens = narcissus.definitions.tokens; +parser = narcissus.parser; +Node = parser.Node; +Node.prototype.left = function() { +return this.children[0]; +}; +Node.prototype.right = function() { +return this.children[1]; +}; +Node.prototype.last = function() { +return this.children[this.children.length - 1]; +}; +Node.prototype.walk = function(options, fn, parent, list) { +if (parent == null) parent = null; +if (list == null) list = null; +if (parent) fn(parent, this, list); +if (options.last) if (this.last() != null) this.last().walk(options, fn, this); +if (this.thenPart != null) this.thenPart.walk(options, fn, this, 'thenPart'); +if (this.elsePart != null) this.elsePart.walk(options, fn, this, 'elsePart'); +if (this.cases) { +return _.each(this.cases, function(item) { +return item.statements.walk(options, fn, item, 'cases'); +}); +} +}; +Node.prototype.clone = function(hash) { +var i; +for (i in this) { +if (i === 'tokenizer' || i === 'length' || i === 'filename') continue; +if (hash[i] == null) hash[i] = this[i]; +} +return new Node(this.tokenizer, hash); +}; +Node.prototype.toHash = function(done) { +var hash, i, toHash; +if (done == null) done = []; +hash = {}; +toHash = function(what) { +if (!what) return null; +if (what.toHash) { +if (__indexOf.call(done, what) >= 0) { +return "--recursive " + what.id + "--"; +} +what.id = done.push(what); +return what.toHash(done); +} else { +return what; +} +}; +hash.type = this.typeName(); +hash.src = this.src(); +for (i in this) { +if (i === 'filename' || i === 'length' || i === 'type' || i === 'start' || i === 'end' || i === 'tokenizer') { +continue; +} +if (typeof this[i] === 'function') continue; +if (!this[i]) continue; +if (this[i].constructor === Array) { +hash[i] = _.map(this[i], function(item) { +return toHash(item); +}); +} else { +hash[i] = toHash(this[i]); +} +} +return hash; +}; +Node.prototype.inspect = function() { +return JSON.stringify(this.toHash(), null, ' '); +}; +Node.prototype.src = function() { +return this.tokenizer.source.substr(this.start, this.end - this.start); +}; +Node.prototype.typeName = function() { +return Types[this.type]; +}; +Node.prototype.isA = function() { +var what, _ref; +what = 1 <= arguments.length ? __slice.call(arguments, 0) : []; +return _ref = Types[this.type], __indexOf.call(what, _ref) >= 0; +}; +Types = (function() { +var dict, i, last; +dict = {}; +last = 0; +for (i in tokens) { +if (typeof tokens[i] === 'number') { +dict[tokens[i]] = i.toLowerCase(); +last = tokens[i]; +} +} +dict[++last] = 'call_statement'; +dict[++last] = 'existence_check'; +return dict; +})(); +Typenames = (function() { +var dict, i; +dict = {}; +for (i in Types) { +dict[Types[i]] = i; +} +return dict; +})(); +this.NodeExt = exports = { +Types: Types, +Typenames: Typenames, +Node: Node +}; +if (typeof module !== "undefined" && module !== null) module.exports = exports; +}).call(this); +(function() { +var Code, CoffeeScript, blockTrim, coffeescript_reserved, exports, indentLines, isSingleLine, ltrim, p, paren, rtrim, strEscape, strRepeat, trim, truthy, unreserve, unshift, word, +__indexOf = Array.prototype.indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; +CoffeeScript = this.CoffeeScript || require('coffee-script'); +Code = (function() { +function Code() { +this.code = ''; +} +Code.prototype.add = function(str) { +this.code += str.toString(); +return this; +}; +Code.prototype.scope = function(str, level) { +var indent; +if (level == null) level = 1; +indent = strRepeat(" ", level); +this.code = rtrim(this.code) + "\n"; +this.code += indent + rtrim(str).replace(/\n/g, "\n" + indent) + "\n"; +return this; +}; +Code.prototype.toString = function() { +return this.code; +}; +return Code; +})(); +paren = function(string) { +var str; +str = string.toString(); +if (str.substr(0, 1) === '(' && str.substr(-1, 1) === ')') { +return str; +} else { +return "(" + str + ")"; +} +}; +strRepeat = function(str, times) { +var i; +return ((function() { +var _results; +_results = []; +for (i = 0; 0 <= times ? i < times : i > times; 0 <= times ? i++ : i--) { +_results.push(str); +} +return _results; +})()).join(''); +}; +ltrim = function(str) { +return ("" + str).replace(/^\s*/g, ''); +}; +rtrim = function(str) { +return ("" + str).replace(/\s*$/g, ''); +}; +blockTrim = function(str) { +return ("" + str).replace(/^\s*\n|\s*$/g, ''); +}; +trim = function(str) { +return ("" + str).replace(/^\s*|\s*$/g, ''); +}; +isSingleLine = function(str) { +return trim(str).indexOf("\n") === -1; +}; +unshift = function(str) { +var m1, m2; +str = "" + str; +while (true) { +m1 = str.match(/^/gm); +m2 = str.match(/^ /gm); +if (!m1 || !m2 || m1.length !== m2.length) return str; +str = str.replace(/^ /gm, ''); +} +}; +truthy = function(n) { +return n.isA('true') || (n.isA('number') && parseFloat(n.src()) !== 0.0); +}; +strEscape = function(str) { +return JSON.stringify("" + str); +}; +p = function(str) { +if (str.constructor === String) { +console.log(JSON.stringify(str)); +} else { +console.log(str); +} +return ''; +}; +coffeescript_reserved = (function() { +var _i, _len, _ref, _results; +_ref = CoffeeScript.RESERVED; +_results = []; +for (_i = 0, _len = _ref.length; _i < _len; _i++) { +word = _ref[_i]; +if (word !== 'undefined') _results.push(word); +} +return _results; +})(); +unreserve = function(str) { +var _ref; +if (_ref = "" + str, __indexOf.call(coffeescript_reserved, _ref) >= 0) { +return "" + str + "_"; +} else { +return "" + str; +} +}; +indentLines = function(indent, lines) { +return indent + lines.replace(/\n/g, "\n" + indent); +}; +this.Js2coffeeHelpers = exports = { +Code: Code, +p: p, +strEscape: strEscape, +unreserve: unreserve, +unshift: unshift, +isSingleLine: isSingleLine, +trim: trim, +blockTrim: blockTrim, +ltrim: ltrim, +rtrim: rtrim, +strRepeat: strRepeat, +paren: paren, +truthy: truthy, +indentLines: indentLines +}; +if (typeof module !== "undefined" && module !== null) module.exports = exports; +}).call(this); +(function() { +var Builder, Code, Node, Transformer, Typenames, Types, UnsupportedError, blockTrim, buildCoffee, exports, indentLines, isSingleLine, ltrim, p, paren, parser, rtrim, strEscape, strRepeat, trim, truthy, unreserve, unshift, _, _ref, _ref2, +__indexOf = Array.prototype.indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, +__slice = Array.prototype.slice, +__hasProp = Object.prototype.hasOwnProperty; +parser = (this.Narcissus || require('./narcissus_packed')).parser; +_ = this._ || require('underscore'); +_ref = this.NodeExt || require('./node_ext'), Types = _ref.Types, Typenames = _ref.Typenames, Node = _ref.Node; +_ref2 = this.Js2coffeeHelpers || require('./helpers'), Code = _ref2.Code, p = _ref2.p, strEscape = _ref2.strEscape, unreserve = _ref2.unreserve, unshift = _ref2.unshift, isSingleLine = _ref2.isSingleLine, trim = _ref2.trim, blockTrim = _ref2.blockTrim, ltrim = _ref2.ltrim, rtrim = _ref2.rtrim, strRepeat = _ref2.strRepeat, paren = _ref2.paren, truthy = _ref2.truthy, indentLines = _ref2.indentLines; +buildCoffee = function(str, opts) { +var builder, comments, indent, keepLineNumbers, l, line, minline, output, precomments, res, scriptNode, srclines, text, _i, _len, _ref3; +if (opts == null) opts = {}; +str = str.replace(/\r/g, ''); +str += "\n"; +builder = new Builder(opts); +scriptNode = parser.parse(str); +output = trim(builder.build(scriptNode)); +if (opts.no_comments) { +return ((function() { +var _i, _len, _ref3, _results; +_ref3 = output.split('\n'); +_results = []; +for (_i = 0, _len = _ref3.length; _i < _len; _i++) { +line = _ref3[_i]; +_results.push(rtrim(line)); +} +return _results; +})()).join('\n'); +} else { +keepLineNumbers = opts.show_src_lineno; +res = []; +_ref3 = output.split("\n"); +for (_i = 0, _len = _ref3.length; _i < _len; _i++) { +l = _ref3[_i]; +srclines = []; +text = l.replace(/\uFEFE([0-9]+).*?\uFEFE/g, function(m, g) { +srclines.push(parseInt(g)); +return ""; +}); +srclines = _.sortBy(_.uniq(srclines), function(i) { +return i; +}); +text = rtrim(text); +indent = text.match(/^\s*/); +if (srclines.length > 0) { +minline = _.last(srclines); +precomments = builder.commentsNotDoneTo(minline); +if (precomments) res.push(indentLines(indent, precomments)); +} +if (text) { +if (keepLineNumbers) text = text + "#" + srclines.join(",") + "# "; +res.push(rtrim(text + " " + ltrim(builder.lineComments(srclines)))); +} else { +res.push(""); +} +} +comments = builder.commentsNotDoneTo(1e10); +if (comments) res.push(comments); +return res.join("\n"); +} +}; +Builder = (function() { +function Builder(options) { +this.options = options != null ? options : {}; +this.transformer = new Transformer; +} +Builder.prototype.l = function(n) { +if (this.options.no_comments) return ''; +if (n && n.lineno) { +return "\uFEFE" + n.lineno + "\uFEFE"; +} else { +return ""; +} +}; +Builder.prototype.makeComment = function(comment) { +var c, line; +if (comment.type === "BLOCK_COMMENT") { +c = comment.value.split("\n"); +if (c.length > 0 && c[0].length > 0 && c[0][0] === "*") { +c = (function() { +var _i, _len, _results; +_results = []; +for (_i = 0, _len = c.length; _i < _len; _i++) { +line = c[_i]; +_results.push(line.replace(/^[\s\*]*/, '')); +} +return _results; +})(); +c = (function() { +var _i, _len, _results; +_results = []; +for (_i = 0, _len = c.length; _i < _len; _i++) { +line = c[_i]; +_results.push(line.replace(/[\s]*$/, '')); +} +return _results; +})(); +while (c.length > 0 && c[0].length === 0) { +c.shift(); +} +while (c.length > 0 && c[c.length - 1].length === 0) { +c.pop(); +} +c.unshift('###'); +c.push('###'); +} else { +c = (function() { +var _i, _len, _results; +_results = []; +for (_i = 0, _len = c.length; _i < _len; _i++) { +line = c[_i]; +_results.push("#" + line); +} +return _results; +})(); +} +} else { +c = ['#' + comment.value]; +} +if (comment.nlcount > 0) c.unshift(''); +return c.join('\n'); +}; +Builder.prototype.commentsNotDoneTo = function(lineno) { +var c, res; +res = []; +while (true) { +if (this.comments.length === 0) break; +c = this.comments[0]; +if (c.lineno < lineno) { +res.push(this.makeComment(c)); +this.comments.shift(); +continue; +} +break; +} +return res.join("\n"); +}; +Builder.prototype.lineComments = function(linenos) { +var c, selection; +selection = (function() { +var _i, _len, _ref3, _ref4, _results; +_ref3 = this.comments; +_results = []; +for (_i = 0, _len = _ref3.length; _i < _len; _i++) { +c = _ref3[_i]; +if (_ref4 = c.lineno, __indexOf.call(linenos, _ref4) >= 0) { +_results.push(c); +} +} +return _results; +}).call(this); +this.comments = _.difference(this.comments, selection); +return ((function() { +var _i, _len, _results; +_results = []; +for (_i = 0, _len = selection.length; _i < _len; _i++) { +c = selection[_i]; +_results.push(this.makeComment(c)); +} +return _results; +}).call(this)).join("\n"); +}; +Builder.prototype.build = function() { +var args, fn, name, node, out; +args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; +node = args[0]; +if (!(this.comments != null)) { +this.comments = _.sortBy(node.tokenizer.comments, function(n) { +return n.start; +}); +} +this.transform(node); +name = 'other'; +if (node !== void 0 && node.typeName) name = node.typeName(); +fn = this[name] || this.other; +out = fn.apply(this, args); +if (node.parenthesized) { +return paren(out); +} else { +return out; +} +}; +Builder.prototype.transform = function() { +var args; +args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; +return this.transformer.transform.apply(this.transformer, args); +}; +Builder.prototype.body = function(node, opts) { +var str; +if (opts == null) opts = {}; +str = this.build(node, opts); +str = blockTrim(str); +str = unshift(str); +if (str.length > 0) { +return str; +} else { +return ""; +} +}; +Builder.prototype['script'] = function(n, opts) { +var c, +_this = this; +if (opts == null) opts = {}; +c = new Code; +_.each(n.functions, function(item) { +return c.add(_this.build(item)); +}); +_.each(n.nonfunctions, function(item) { +return c.add(_this.build(item)); +}); +return c.toString(); +}; +Builder.prototype['property_identifier'] = function(n) { +var str; +str = n.value.toString(); +if (str.match(/^([_\$a-z][_\$a-z0-9]*)$/i) || str.match(/^[0-9]+$/i)) { +return this.l(n) + str; +} else { +return this.l(n) + strEscape(str); +} +}; +Builder.prototype['identifier'] = function(n) { +if (n.value === 'undefined') { +return this.l(n) + '`undefined`'; +} else if (n.property_accessor) { +return this.l(n) + n.value.toString(); +} else { +return this.l(n) + unreserve(n.value.toString()); +} +}; +Builder.prototype['number'] = function(n) { +return this.l(n) + ("" + (n.src())); +}; +Builder.prototype['id'] = function(n) { +if (n.property_accessor) { +return this.l(n) + n; +} else { +return this.l(n) + unreserve(n); +} +}; +Builder.prototype['id_param'] = function(n) { +var _ref3; +if ((_ref3 = n.toString()) === 'undefined') { +return this.l(n) + ("" + n + "_"); +} else { +return this.l(n) + this.id(n); +} +}; +Builder.prototype['return'] = function(n) { +if (!(n.value != null)) { +return this.l(n) + "return\n"; +} else { +return this.l(n) + ("return " + (this.build(n.value)) + "\n"); +} +}; +Builder.prototype[';'] = function(n) { +var src; +if (n.expression == null) { +return ""; +} else if (n.expression.typeName() === 'object_init') { +src = this.object_init(n.expression); +if (n.parenthesized) { +return src; +} else { +return "" + (unshift(blockTrim(src))) + "\n"; +} +} else { +return this.build(n.expression) + "\n"; +} +}; +Builder.prototype['new'] = function(n) { +return this.l(n) + ("new " + (this.build(n.left()))); +}; +Builder.prototype['new_with_args'] = function(n) { +return this.l(n) + ("new " + (this.build(n.left())) + "(" + (this.build(n.right())) + ")"); +}; +Builder.prototype['unary_plus'] = function(n) { +return "+" + (this.build(n.left())); +}; +Builder.prototype['unary_minus'] = function(n) { +return "-" + (this.build(n.left())); +}; +Builder.prototype['this'] = function(n) { +return this.l(n) + 'this'; +}; +Builder.prototype['null'] = function(n) { +return this.l(n) + 'null'; +}; +Builder.prototype['true'] = function(n) { +return this.l(n) + 'true'; +}; +Builder.prototype['false'] = function(n) { +return this.l(n) + 'false'; +}; +Builder.prototype['void'] = function(n) { +return this.l(n) + 'undefined'; +}; +Builder.prototype['debugger'] = function(n) { +return this.l(n) + "debugger\n"; +}; +Builder.prototype['break'] = function(n) { +return this.l(n) + "break\n"; +}; +Builder.prototype['continue'] = function(n) { +return this.l(n) + "continue\n"; +}; +Builder.prototype['~'] = function(n) { +return "~" + (this.build(n.left())); +}; +Builder.prototype['typeof'] = function(n) { +return this.l(n) + ("typeof " + (this.build(n.left()))); +}; +Builder.prototype['index'] = function(n) { +var right; +right = this.build(n.right()); +if (_.any(n.children, function(child) { +return child.typeName() === 'object_init' && child.children.length > 1; +})) { +right = "{" + right + "}"; +} +return this.l(n) + ("" + (this.build(n.left())) + "[" + right + "]"); +}; +Builder.prototype['throw'] = function(n) { +return this.l(n) + ("throw " + (this.build(n.exception))); +}; +Builder.prototype['!'] = function(n) { +var negations, target; +target = n.left(); +negations = 1; +while ((target.isA('!')) && (target = target.left())) { +++negations; +} +if ((negations & 1) && target.isA('==', '!=', '===', '!==', 'in', 'instanceof')) { +target.negated = !target.negated; +return this.build(target); +} +return this.l(n) + ("" + (negations & 1 ? 'not ' : '!!') + (this.build(target))); +}; +Builder.prototype["in"] = function(n) { +return this.binary_operator(n, 'of'); +}; +Builder.prototype['+'] = function(n) { +return this.binary_operator(n, '+'); +}; +Builder.prototype['-'] = function(n) { +return this.binary_operator(n, '-'); +}; +Builder.prototype['*'] = function(n) { +return this.binary_operator(n, '*'); +}; +Builder.prototype['/'] = function(n) { +return this.binary_operator(n, '/'); +}; +Builder.prototype['%'] = function(n) { +return this.binary_operator(n, '%'); +}; +Builder.prototype['>'] = function(n) { +return this.binary_operator(n, '>'); +}; +Builder.prototype['<'] = function(n) { +return this.binary_operator(n, '<'); +}; +Builder.prototype['&'] = function(n) { +return this.binary_operator(n, '&'); +}; +Builder.prototype['|'] = function(n) { +return this.binary_operator(n, '|'); +}; +Builder.prototype['^'] = function(n) { +return this.binary_operator(n, '^'); +}; +Builder.prototype['&&'] = function(n) { +return this.binary_operator(n, 'and'); +}; +Builder.prototype['||'] = function(n) { +return this.binary_operator(n, 'or'); +}; +Builder.prototype['<<'] = function(n) { +return this.binary_operator(n, '<<'); +}; +Builder.prototype['<='] = function(n) { +return this.binary_operator(n, '<='); +}; +Builder.prototype['>>'] = function(n) { +return this.binary_operator(n, '>>'); +}; +Builder.prototype['>='] = function(n) { +return this.binary_operator(n, '>='); +}; +Builder.prototype['==='] = function(n) { +return this.binary_operator(n, 'is'); +}; +Builder.prototype['!=='] = function(n) { +return this.binary_operator(n, 'isnt'); +}; +Builder.prototype['>>>'] = function(n) { +return this.binary_operator(n, '>>>'); +}; +Builder.prototype["instanceof"] = function(n) { +return this.binary_operator(n, 'instanceof'); +}; +Builder.prototype['=='] = function(n) { +return this.binary_operator(n, 'is'); +}; +Builder.prototype['!='] = function(n) { +return this.binary_operator(n, 'isnt'); +}; +Builder.prototype['binary_operator'] = (function() { +var INVERSIONS, k, v; +INVERSIONS = { +is: 'isnt', +"in": 'not in', +of: 'not of', +"instanceof": 'not instanceof' +}; +for (k in INVERSIONS) { +if (!__hasProp.call(INVERSIONS, k)) continue; +v = INVERSIONS[k]; +INVERSIONS[v] = k; +} +return function(n, sign) { +if (n.negated) sign = INVERSIONS[sign]; +return this.l(n) + ("" + (this.build(n.left())) + " " + sign + " " + (this.build(n.right()))); +}; +})(); +Builder.prototype['--'] = function(n) { +return this.increment_decrement(n, '--'); +}; +Builder.prototype['++'] = function(n) { +return this.increment_decrement(n, '++'); +}; +Builder.prototype['increment_decrement'] = function(n, sign) { +if (n.postfix) { +return this.l(n) + ("" + (this.build(n.left())) + sign); +} else { +return this.l(n) + ("" + sign + (this.build(n.left()))); +} +}; +Builder.prototype['='] = function(n) { +var sign; +sign = n.assignOp != null ? Types[n.assignOp] + '=' : '='; +return this.l(n) + ("" + (this.build(n.left())) + " " + sign + " " + (this.build(n.right()))); +}; +Builder.prototype[','] = function(n) { +var list, +_this = this; +list = _.map(n.children, function(item) { +return _this.l(item) + _this.build(item) + "\n"; +}); +return list.join(''); +}; +Builder.prototype['regexp'] = function(n) { +var begins_with, flag, m, value; +m = n.value.toString().match(/^\/(.*)\/([a-z]?)/); +value = m[1]; +flag = m[2]; +begins_with = value[0]; +if (begins_with === ' ' || begins_with === '=') { +if (flag.length > 0) { +return this.l(n) + ("RegExp(" + (strEscape(value)) + ", \"" + flag + "\")"); +} else { +return this.l(n) + ("RegExp(" + (strEscape(value)) + ")"); +} +} else { +return this.l(n) + ("/" + value + "/" + flag); +} +}; +Builder.prototype['string'] = function(n) { +return this.l(n) + strEscape(n.value); +}; +Builder.prototype['call'] = function(n) { +if (n.right().children.length === 0) { +return ("" + (this.build(n.left())) + "()") + this.l(n); +} else { +return ("" + (this.build(n.left())) + "(" + (this.build(n.right())) + ")") + this.l(n); +} +}; +Builder.prototype['call_statement'] = function(n) { +var left; +left = this.build(n.left()); +if (n.left().isA('function')) left = paren(left); +if (n.right().children.length === 0) { +return ("" + left + "()") + this.l(n); +} else { +return ("" + left + " " + (this.build(n.right()))) + this.l(n); +} +}; +Builder.prototype['list'] = function(n) { +var list, +_this = this; +list = _.map(n.children, function(item) { +if (n.children.length > 1) item.is_list_element = true; +return _this.build(item); +}); +return this.l(n) + list.join(", "); +}; +Builder.prototype['delete'] = function(n) { +var ids, +_this = this; +ids = _.map(n.children, function(el) { +return _this.build(el); +}); +ids = ids.join(', '); +return this.l(n) + ("delete " + ids + "\n"); +}; +Builder.prototype['.'] = function(n) { +var left, right, right_obj; +left = this.build(n.left()); +right_obj = n.right(); +right_obj.property_accessor = true; +right = this.build(right_obj); +if (n.isThis && n.isPrototype) { +return this.l(n) + "@::"; +} else if (n.isThis) { +return this.l(n) + ("@" + right); +} else if (n.isPrototype) { +return this.l(n) + ("" + left + "::"); +} else if (n.left().isPrototype) { +return this.l(n) + ("" + left + right); +} else { +return this.l(n) + ("" + left + "." + right); +} +}; +Builder.prototype['try'] = function(n) { +var c, +_this = this; +c = new Code; +c.add('try'); +c.scope(this.body(n.tryBlock)); +_.each(n.catchClauses, function(clause) { +return c.add(_this.build(clause)); +}); +if (n.finallyBlock != null) { +c.add("finally"); +c.scope(this.body(n.finallyBlock)); +} +return this.l(n) + c; +}; +Builder.prototype['catch'] = function(n) { +var body_, c; +body_ = this.body(n.block); +if (trim(body_).length === 0) return ''; +c = new Code; +if (n.varName != null) { +c.add("catch " + n.varName); +} else { +c.add('catch'); +} +c.scope(this.body(n.block)); +return this.l(n) + c; +}; +Builder.prototype['?'] = function(n) { +return this.l(n) + ("(if " + (this.build(n.left())) + " then " + (this.build(n.children[1])) + " else " + (this.build(n.children[2])) + ")"); +}; +Builder.prototype['for'] = function(n) { +var c; +c = new Code; +if (n.setup != null) c.add("" + (this.build(n.setup)) + "\n"); +if (n.condition != null) { +c.add("while " + (this.build(n.condition)) + "\n"); +} else { +c.add("loop"); +} +c.scope(this.body(n.body)); +if (n.update != null) c.scope(this.body(n.update)); +return this.l(n) + c; +}; +Builder.prototype['for_in'] = function(n) { +var c; +c = new Code; +c.add("for " + (this.build(n.iterator)) + " of " + (this.build(n.object))); +c.scope(this.body(n.body)); +return this.l(n) + c; +}; +Builder.prototype['while'] = function(n) { +var body_, c, keyword, statement; +c = new Code; +keyword = n.positive ? "while" : "until"; +body_ = this.body(n.body); +if (truthy(n.condition)) { +statement = "loop"; +} else { +statement = "" + keyword + " " + (this.build(n.condition)); +} +if (isSingleLine(body_) && statement !== "loop") { +c.add("" + (trim(body_)) + " " + statement + "\n"); +} else { +c.add(statement); +c.scope(body_); +} +return this.l(n) + c; +}; +Builder.prototype['do'] = function(n) { +var c; +c = new Code; +c.add("loop"); +c.scope(this.body(n.body)); +if (n.condition != null) { +c.scope("break unless " + (this.build(n.condition))); +} +return this.l(n) + c; +}; +Builder.prototype['if'] = function(n) { +var body_, c, keyword; +c = new Code; +keyword = n.positive ? "if" : "unless"; +body_ = this.body(n.thenPart); +n.condition.parenthesized = false; +if (n.thenPart.isA('block') && n.thenPart.children.length === 0 && !(n.elsePart != null)) { +console.log(n.thenPart); +c.add("" + (this.build(n.condition)) + "\n"); +} else if (isSingleLine(body_) && !(n.elsePart != null)) { +c.add("" + (trim(body_)) + " " + keyword + " " + (this.build(n.condition)) + "\n"); +} else { +c.add("" + keyword + " " + (this.build(n.condition))); +c.scope(this.body(n.thenPart)); +if (n.elsePart != null) { +if (n.elsePart.typeName() === 'if') { +c.add("else " + (this.build(n.elsePart).toString())); +} else { +c.add(this.l(n.elsePart) + "else\n"); +c.scope(this.body(n.elsePart)); +} +} +} +return this.l(n) + c; +}; +Builder.prototype['switch'] = function(n) { +var c, fall_through, +_this = this; +c = new Code; +c.add("switch " + (this.build(n.discriminant)) + "\n"); +fall_through = false; +_.each(n.cases, function(item) { +var first; +if (item.value === 'default') { +c.scope(_this.l(item) + "else"); +} else { +if (fall_through === true) { +c.add(_this.l(item) + (", " + (_this.build(item.caseLabel)) + "\n")); +} else { +c.add(_this.l(item) + (" when " + (_this.build(item.caseLabel)))); +} +} +if (_this.body(item.statements).length === 0) { +fall_through = true; +} else { +fall_through = false; +c.add("\n"); +c.scope(_this.body(item.statements), 2); +} +return first = false; +}); +return this.l(n) + c; +}; +Builder.prototype['existence_check'] = function(n) { +return this.l(n) + ("" + (this.build(n.left())) + "?"); +}; +Builder.prototype['array_init'] = function(n) { +if (n.children.length === 0) { +return this.l(n) + "[]"; +} else { +return this.l(n) + ("[" + (this.list(n)) + "]"); +} +}; +Builder.prototype['property_init'] = function(n) { +var left, right; +left = n.left(); +right = n.right(); +right.is_property_value = true; +return "" + (this.property_identifier(left)) + ": " + (this.build(right)); +}; +Builder.prototype['object_init'] = function(n, options) { +var c, list, +_this = this; +if (options == null) options = {}; +if (n.children.length === 0) { +return this.l(n) + "{}"; +} else if (n.children.length === 1 && !(n.is_property_value || n.is_list_element)) { +return this.build(n.children[0]); +} else { +list = _.map(n.children, function(item) { +return _this.build(item); +}); +c = new Code(this, n); +c.scope(list.join("\n")); +if (options.brackets != null) c = "{" + c + "}"; +return c; +} +}; +Builder.prototype['function'] = function(n) { +var body, c, params, +_this = this; +c = new Code; +params = _.map(n.params, function(str) { +if (str.constructor === String) { +return _this.id_param(str); +} else { +return _this.build(str); +} +}); +if (n.name) c.add("" + n.name + " = "); +if (n.params.length > 0) { +c.add("(" + (params.join(', ')) + ") ->"); +} else { +c.add("->"); +} +body = this.body(n.body); +if (trim(body).length > 0) { +c.scope(body); +} else { +c.add("\n"); +} +return this.l(n) + c; +}; +Builder.prototype['var'] = function(n) { +var list, +_this = this; +list = _.map(n.children, function(item) { +return "" + (unreserve(item.value)) + " = " + (item.initializer != null ? _this.build(item.initializer) : 'undefined'); +}); +return this.l(n) + _.compact(list).join("\n") + "\n"; +}; +Builder.prototype['other'] = function(n) { +return this.unsupported(n, "" + (n.typeName()) + " is not supported yet"); +}; +Builder.prototype['getter'] = function(n) { +return this.unsupported(n, "getter syntax is not supported; use __defineGetter__"); +}; +Builder.prototype['setter'] = function(n) { +return this.unsupported(n, "setter syntax is not supported; use __defineSetter__"); +}; +Builder.prototype['label'] = function(n) { +return this.unsupported(n, "labels are not supported by CoffeeScript"); +}; +Builder.prototype['const'] = function(n) { +return this.unsupported(n, "consts are not supported by CoffeeScript"); +}; +Builder.prototype['block'] = function() { +var args; +args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; +return this.script.apply(this, args); +}; +Builder.prototype['unsupported'] = function(node, message) { +throw new UnsupportedError("Unsupported: " + message, node); +}; +return Builder; +})(); +Transformer = (function() { +function Transformer() {} +Transformer.prototype.transform = function() { +var args, fn, node, type; +args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; +node = args[0]; +if (node.transformed != null) return; +type = node.typeName(); +fn = this[type]; +if (fn) { +fn.apply(this, args); +return node.transformed = true; +} +}; +Transformer.prototype['script'] = function(n) { +var last, +_this = this; +n.functions = []; +n.nonfunctions = []; +_.each(n.children, function(item) { +if (item.isA('function')) { +return n.functions.push(item); +} else { +return n.nonfunctions.push(item); +} +}); +last = null; +return _.each(n.nonfunctions, function(item) { +var expr; +if (item.expression != null) { +expr = item.expression; +if ((last != null ? last.isA('object_init') : void 0) && expr.isA('object_init')) { +item.parenthesized = true; +} else { +item.parenthesized = false; +} +return last = expr; +} +}); +}; +Transformer.prototype['.'] = function(n) { +n.isThis = n.left().isA('this'); +return n.isPrototype = n.right().isA('identifier') && n.right().value === 'prototype'; +}; +Transformer.prototype[';'] = function(n) { +if (n.expression != null) { +n.expression.parenthesized = false; +if (n.expression.isA('call')) { +n.expression.type = Typenames['call_statement']; +return this.call_statement(n); +} +} +}; +Transformer.prototype['function'] = function(n) { +return n.body.walk({ +last: true +}, function(parent, node, list) { +var lastNode; +if (node.isA('return') && node.value) { +lastNode = list ? parent[list] : parent.children[parent.children.length - 1]; +if (lastNode) { +lastNode.type = Typenames[';']; +return lastNode.expression = lastNode.value; +} +} +}); +}; +Transformer.prototype['switch'] = function(n) { +var _this = this; +return _.each(n.cases, function(item) { +var block, ch, _ref3; +block = item.statements; +ch = block.children; +if ((_ref3 = block.last()) != null ? _ref3.isA('break') : void 0) { +return delete ch[ch.length - 1]; +} +}); +}; +Transformer.prototype['call_statement'] = function(n) { +if (n.children[1]) { +return _.each(n.children[1].children, function(child, i) { +if (child.isA('function') && i !== n.children[1].children.length - 1) { +return child.parenthesized = true; +} +}); +} +}; +Transformer.prototype['return'] = function(n) { +if (n.value && n.value.isA('object_init') && n.value.children.length > 1) { +return n.value.parenthesized = true; +} +}; +Transformer.prototype['block'] = function(n) { +return this.script(n); +}; +Transformer.prototype['if'] = function(n) { +var _ref3; +if (n.thenPart.children.length === 0 && ((_ref3 = n.elsePart) != null ? _ref3.children.length : void 0) > 0) { +n.positive = false; +n.thenPart = n.elsePart; +delete n.elsePart; +} +return this.inversible(n); +}; +Transformer.prototype['while'] = function(n) { +if (n.body.children.length === 0) { +n.body.children.push(n.clone({ +type: Typenames['continue'], +value: 'continue', +children: [] +})); +} +return this.inversible(n); +}; +Transformer.prototype['inversible'] = function(n) { +var positive; +this.transform(n.condition); +positive = n.positive != null ? n.positive : true; +if (n.condition.isA('!=')) { +n.condition.type = Typenames['==']; +return n.positive = !positive; +} else if (n.condition.isA('!')) { +n.condition = n.condition.left(); +return n.positive = !positive; +} else { +return n.positive = positive; +} +}; +Transformer.prototype['=='] = function(n) { +if (n.right().isA('null', 'void')) { +n.type = Typenames['!']; +return n.children = [ +n.clone({ +type: Typenames['existence_check'], +children: [n.left()] +}) +]; +} +}; +Transformer.prototype['!='] = function(n) { +if (n.right().isA('null', 'void')) { +n.type = Typenames['existence_check']; +return n.children = [n.left()]; +} +}; +return Transformer; +})(); +UnsupportedError = (function() { +function UnsupportedError(str, src) { +this.message = str; +this.cursor = src.start; +this.line = src.lineno; +this.source = src.tokenizer.source; +} +UnsupportedError.prototype.toString = function() { +return this.message; +}; +return UnsupportedError; +})(); +this.Js2coffee = exports = { +VERSION: '0.2.0', +build: buildCoffee, +UnsupportedError: UnsupportedError +}; +if (typeof module !== "undefined" && module !== null) module.exports = exports; +}).call(this); \ No newline at end of file diff --git a/public/bower_components/messenger/docs/welcome/lib/executr/lib/underscore.min.js b/public/bower_components/messenger/docs/welcome/lib/executr/lib/underscore.min.js new file mode 100755 index 0000000..459f691 --- /dev/null +++ b/public/bower_components/messenger/docs/welcome/lib/executr/lib/underscore.min.js @@ -0,0 +1,32 @@ +// Underscore.js 1.3.3 +// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc. +// Underscore is freely distributable under the MIT license. +// Portions of Underscore are inspired or borrowed from Prototype, +// Oliver Steele's Functional, and John Resig's Micro-Templating. +// For all details and documentation: +// http://documentcloud.github.com/underscore +(function(){function r(a,c,d){if(a===c)return 0!==a||1/a==1/c;if(null==a||null==c)return a===c;a._chain&&(a=a._wrapped);c._chain&&(c=c._wrapped);if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return!1;switch(e){case "[object String]":return a==""+c;case "[object Number]":return a!=+a?c!=+c:0==a?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source== +c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if("object"!=typeof a||"object"!=typeof c)return!1;for(var f=d.length;f--;)if(d[f]==a)return!0;d.push(a);var f=0,g=!0;if("[object Array]"==e){if(f=a.length,g=f==c.length)for(;f--&&(g=f in a==f in c&&r(a[f],c[f],d)););}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return!1;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&r(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c,h)&&!f--)break; +g=!f}}d.pop();return g}var s=this,I=s._,o={},k=Array.prototype,p=Object.prototype,i=k.slice,J=k.unshift,l=p.toString,K=p.hasOwnProperty,y=k.forEach,z=k.map,A=k.reduce,B=k.reduceRight,C=k.filter,D=k.every,E=k.some,q=k.indexOf,F=k.lastIndexOf,p=Array.isArray,L=Object.keys,t=Function.prototype.bind,b=function(a){return new m(a)};"undefined"!==typeof exports?("undefined"!==typeof module&&module.exports&&(exports=module.exports=b),exports._=b):s._=b;b.VERSION="1.3.3";var j=b.each=b.forEach=function(a, +c,d){if(a!=null)if(y&&a.forEach===y)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e2;a==null&&(a=[]);if(A&& +a.reduce===A){e&&(c=b.bind(c,e));return f?a.reduce(c,d):a.reduce(c)}j(a,function(a,b,i){if(f)d=c.call(e,d,a,b,i);else{d=a;f=true}});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(B&&a.reduceRight===B){e&&(c=b.bind(c,e));return f?a.reduceRight(c,d):a.reduceRight(c)}var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect=function(a, +c,b){var e;G(a,function(a,g,h){if(c.call(b,a,g,h)){e=a;return true}});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(C&&a.filter===C)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(D&&a.every===D)return a.every(c,b);j(a,function(a,g,h){if(!(e=e&&c.call(b, +a,g,h)))return o});return!!e};var G=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(E&&a.some===E)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return o});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;if(q&&a.indexOf===q)return a.indexOf(c)!=-1;return b=G(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck= +function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a)&&a[0]===+a[0])return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a)&&a[0]===+a[0])return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;bd?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]}; +j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a,c,d){d||(d=b.identity);for(var e=0,f=a.length;e>1;d(a[g])=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1),true);return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a= +i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e=0;d--)b=[a[d].apply(this,b)];return b[0]}};b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=L||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&& +c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.pick=function(a){var c={};j(b.flatten(i.call(arguments,1)),function(b){b in a&&(c[b]=a[b])});return c};b.defaults=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return r(a,b,[])};b.isEmpty= +function(a){if(a==null)return true;if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=p||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)};b.isArguments=function(a){return l.call(a)=="[object Arguments]"};b.isArguments(arguments)||(b.isArguments=function(a){return!(!a||!b.has(a,"callee"))});b.isFunction=function(a){return l.call(a)=="[object Function]"}; +b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isFinite=function(a){return b.isNumber(a)&&isFinite(a)};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"};b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a, +b){return K.call(a,b)};b.noConflict=function(){s._=I;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")};b.result=function(a,c){if(a==null)return null;var d=a[c];return b.isFunction(d)?d.call(a):d};b.mixin=function(a){j(b.functions(a),function(c){M(c,b[c]=a[c])})};var N=0;b.uniqueId= +function(a){var b=N++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var u=/.^/,n={"\\":"\\","'":"'",r:"\r",n:"\n",t:"\t",u2028:"\u2028",u2029:"\u2029"},v;for(v in n)n[n[v]]=v;var O=/\\|'|\r|\n|\t|\u2028|\u2029/g,P=/\\(\\|'|r|n|t|u2028|u2029)/g,w=function(a){return a.replace(P,function(a,b){return n[b]})};b.template=function(a,c,d){d=b.defaults(d||{},b.templateSettings);a="__p+='"+a.replace(O,function(a){return"\\"+n[a]}).replace(d.escape|| +u,function(a,b){return"'+\n_.escape("+w(b)+")+\n'"}).replace(d.interpolate||u,function(a,b){return"'+\n("+w(b)+")+\n'"}).replace(d.evaluate||u,function(a,b){return"';\n"+w(b)+"\n;__p+='"})+"';\n";d.variable||(a="with(obj||{}){\n"+a+"}\n");var a="var __p='';var print=function(){__p+=Array.prototype.join.call(arguments, '')};\n"+a+"return __p;\n",e=new Function(d.variable||"obj","_",a);if(c)return e(c,b);c=function(a){return e.call(this,a,b)};c.source="function("+(d.variable||"obj")+"){\n"+a+"}";return c}; +b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var x=function(a,c){return c?b(a).chain():a},M=function(a,c){m.prototype[a]=function(){var a=i.call(arguments);J.call(a,this._wrapped);return x(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return x(d, +this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return x(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain=true;return this};m.prototype.value=function(){return this._wrapped}}).call(this); \ No newline at end of file diff --git a/public/bower_components/messenger/docs/welcome/lib/executr/src/coffee/executr.coffee b/public/bower_components/messenger/docs/welcome/lib/executr/src/coffee/executr.coffee new file mode 100755 index 0000000..dbdbfc5 --- /dev/null +++ b/public/bower_components/messenger/docs/welcome/lib/executr/src/coffee/executr.coffee @@ -0,0 +1,207 @@ +runners = + 'javascript': (opts, code) -> + eval code + +converters = + 'coffeescript:javascript': (opts, code) -> + csOptions = $.extend {}, opts.coffeeOptions, + bare: true + + CoffeeScript.compile code, csOptions + + + 'javascript:coffeescript': (opts, code) -> + if Js2coffee + out = Js2coffee.build code + else + #fallback if you dont include Js2Coffee + console.error "Can't convert javascript to coffeescript" + return code + +normalizeType = (codeType) -> + switch codeType.toLowerCase() + when 'js', 'javascript', 'text/javascript', 'application/javascript' + return 'javascript' + when 'cs', 'coffee', 'coffeescript', 'text/coffeescript', 'application/coffeescript' + return 'coffeescript' + else + console.error "Code type #{ codeType } not understood." + +class Editor + constructor: (args) -> + @el = args.el + @opts = args.opts + @codeCache = {} + + @$el = $ @el + + do @buildEditor + do @addRunButton + do @addListeners + + getValue: -> + @editor.getValue() + + addListeners: -> + @$el.on 'executrSwitchType', (e, type) => + @switchType type + + addRunButton: -> + @$runButton = $('
    • + # + # + # + # + # + # + # + # + # + # + #
      CommandNameParameters
      Mmoveto(x y)+
      Zclosepath(none)
      Llineto(x y)+
      Hhorizontal linetox+
      Vvertical linetoy+
      Ccurveto(x1 y1 x2 y2 x y)+
      Ssmooth curveto(x2 y2 x y)+
      Qquadratic Bézier curveto(x1 y1 x y)+
      Tsmooth quadratic Bézier curveto(x y)+
      Aelliptical arc(rx ry x-axis-rotation large-arc-flag sweep-flag x y)+
      RCatmull-Rom curveto*x1 y1 (x y)+
      + * * “Catmull-Rom curveto” is a not standard SVG command and added in 2.0 to make life easier. + * Note: there is a special case when path consist of just three commands: “M10,10R…z”. In this case path will smoothly connects to its beginning. + > Usage + | var c = paper.path("M10 10L90 90"); + | // draw a diagonal line: + | // move to 10,10, line to 90,90 + * For example of path strings, check out these icons: http://raphaeljs.com/icons/ + \*/ + paperproto.path = function (pathString) { + pathString && !R.is(pathString, string) && !R.is(pathString[0], array) && (pathString += E); + var out = R._engine.path(R.format[apply](R, arguments), this); + this.__set__ && this.__set__.push(out); + return out; + }; + /*\ + * Paper.image + [ method ] + ** + * Embeds an image into the surface. + ** + > Parameters + ** + - src (string) URI of the source image + - x (number) x coordinate position + - y (number) y coordinate position + - width (number) width of the image + - height (number) height of the image + = (object) Raphaël element object with type “image” + ** + > Usage + | var c = paper.image("apple.png", 10, 10, 80, 80); + \*/ + paperproto.image = function (src, x, y, w, h) { + var out = R._engine.image(this, src || "about:blank", x || 0, y || 0, w || 0, h || 0); + this.__set__ && this.__set__.push(out); + return out; + }; + /*\ + * Paper.text + [ method ] + ** + * Draws a text string. If you need line breaks, put “\n” in the string. + ** + > Parameters + ** + - x (number) x coordinate position + - y (number) y coordinate position + - text (string) The text string to draw + = (object) Raphaël element object with type “text” + ** + > Usage + | var t = paper.text(50, 50, "Raphaël\nkicks\nbutt!"); + \*/ + paperproto.text = function (x, y, text) { + var out = R._engine.text(this, x || 0, y || 0, Str(text)); + this.__set__ && this.__set__.push(out); + return out; + }; + /*\ + * Paper.set + [ method ] + ** + * Creates array-like object to keep and operate several elements at once. + * Warning: it doesn’t create any elements for itself in the page, it just groups existing elements. + * Sets act as pseudo elements — all methods available to an element can be used on a set. + = (object) array-like object that represents set of elements + ** + > Usage + | var st = paper.set(); + | st.push( + | paper.circle(10, 10, 5), + | paper.circle(30, 10, 5) + | ); + | st.attr({fill: "red"}); // changes the fill of both circles + \*/ + paperproto.set = function (itemsArray) { + !R.is(itemsArray, "array") && (itemsArray = Array.prototype.splice.call(arguments, 0, arguments.length)); + var out = new Set(itemsArray); + this.__set__ && this.__set__.push(out); + out["paper"] = this; + out["type"] = "set"; + return out; + }; + /*\ + * Paper.setStart + [ method ] + ** + * Creates @Paper.set. All elements that will be created after calling this method and before calling + * @Paper.setFinish will be added to the set. + ** + > Usage + | paper.setStart(); + | paper.circle(10, 10, 5), + | paper.circle(30, 10, 5) + | var st = paper.setFinish(); + | st.attr({fill: "red"}); // changes the fill of both circles + \*/ + paperproto.setStart = function (set) { + this.__set__ = set || this.set(); + }; + /*\ + * Paper.setFinish + [ method ] + ** + * See @Paper.setStart. This method finishes catching and returns resulting set. + ** + = (object) set + \*/ + paperproto.setFinish = function (set) { + var out = this.__set__; + delete this.__set__; + return out; + }; + /*\ + * Paper.getSize + [ method ] + ** + * Obtains current paper actual size. + ** + = (object) + \*/ + paperproto.getSize = function () { + var container = this.canvas.parentNode; + return { + width: container.offsetWidth, + height: container.offsetHeight + }; + }; + /*\ + * Paper.setSize + [ method ] + ** + * If you need to change dimensions of the canvas call this method + ** + > Parameters + ** + - width (number) new width of the canvas + - height (number) new height of the canvas + \*/ + paperproto.setSize = function (width, height) { + return R._engine.setSize.call(this, width, height); + }; + /*\ + * Paper.setViewBox + [ method ] + ** + * Sets the view box of the paper. Practically it gives you ability to zoom and pan whole paper surface by + * specifying new boundaries. + ** + > Parameters + ** + - x (number) new x position, default is `0` + - y (number) new y position, default is `0` + - w (number) new width of the canvas + - h (number) new height of the canvas + - fit (boolean) `true` if you want graphics to fit into new boundary box + \*/ + paperproto.setViewBox = function (x, y, w, h, fit) { + return R._engine.setViewBox.call(this, x, y, w, h, fit); + }; + /*\ + * Paper.top + [ property ] + ** + * Points to the topmost element on the paper + \*/ + /*\ + * Paper.bottom + [ property ] + ** + * Points to the bottom element on the paper + \*/ + paperproto.top = paperproto.bottom = null; + /*\ + * Paper.raphael + [ property ] + ** + * Points to the @Raphael object/function + \*/ + paperproto.raphael = R; + var getOffset = function (elem) { + var box = elem.getBoundingClientRect(), + doc = elem.ownerDocument, + body = doc.body, + docElem = doc.documentElement, + clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0, + top = box.top + (g.win.pageYOffset || docElem.scrollTop || body.scrollTop ) - clientTop, + left = box.left + (g.win.pageXOffset || docElem.scrollLeft || body.scrollLeft) - clientLeft; + return { + y: top, + x: left + }; + }; + /*\ + * Paper.getElementByPoint + [ method ] + ** + * Returns you topmost element under given point. + ** + = (object) Raphaël element object + > Parameters + ** + - x (number) x coordinate from the top left corner of the window + - y (number) y coordinate from the top left corner of the window + > Usage + | paper.getElementByPoint(mouseX, mouseY).attr({stroke: "#f00"}); + \*/ + paperproto.getElementByPoint = function (x, y) { + var paper = this, + svg = paper.canvas, + target = g.doc.elementFromPoint(x, y); + if (g.win.opera && target.tagName == "svg") { + var so = getOffset(svg), + sr = svg.createSVGRect(); + sr.x = x - so.x; + sr.y = y - so.y; + sr.width = sr.height = 1; + var hits = svg.getIntersectionList(sr, null); + if (hits.length) { + target = hits[hits.length - 1]; + } + } + if (!target) { + return null; + } + while (target.parentNode && target != svg.parentNode && !target.raphael) { + target = target.parentNode; + } + target == paper.canvas.parentNode && (target = svg); + target = target && target.raphael ? paper.getById(target.raphaelid) : null; + return target; + }; + + /*\ + * Paper.getElementsByBBox + [ method ] + ** + * Returns set of elements that have an intersecting bounding box + ** + > Parameters + ** + - bbox (object) bbox to check with + = (object) @Set + \*/ + paperproto.getElementsByBBox = function (bbox) { + var set = this.set(); + this.forEach(function (el) { + if (R.isBBoxIntersect(el.getBBox(), bbox)) { + set.push(el); + } + }); + return set; + }; + + /*\ + * Paper.getById + [ method ] + ** + * Returns you element by its internal ID. + ** + > Parameters + ** + - id (number) id + = (object) Raphaël element object + \*/ + paperproto.getById = function (id) { + var bot = this.bottom; + while (bot) { + if (bot.id == id) { + return bot; + } + bot = bot.next; + } + return null; + }; + /*\ + * Paper.forEach + [ method ] + ** + * Executes given function for each element on the paper + * + * If callback function returns `false` it will stop loop running. + ** + > Parameters + ** + - callback (function) function to run + - thisArg (object) context object for the callback + = (object) Paper object + > Usage + | paper.forEach(function (el) { + | el.attr({ stroke: "blue" }); + | }); + \*/ + paperproto.forEach = function (callback, thisArg) { + var bot = this.bottom; + while (bot) { + if (callback.call(thisArg, bot) === false) { + return this; + } + bot = bot.next; + } + return this; + }; + /*\ + * Paper.getElementsByPoint + [ method ] + ** + * Returns set of elements that have common point inside + ** + > Parameters + ** + - x (number) x coordinate of the point + - y (number) y coordinate of the point + = (object) @Set + \*/ + paperproto.getElementsByPoint = function (x, y) { + var set = this.set(); + this.forEach(function (el) { + if (el.isPointInside(x, y)) { + set.push(el); + } + }); + return set; + }; + function x_y() { + return this.x + S + this.y; + } + function x_y_w_h() { + return this.x + S + this.y + S + this.width + " \xd7 " + this.height; + } + /*\ + * Element.isPointInside + [ method ] + ** + * Determine if given point is inside this element’s shape + ** + > Parameters + ** + - x (number) x coordinate of the point + - y (number) y coordinate of the point + = (boolean) `true` if point inside the shape + \*/ + elproto.isPointInside = function (x, y) { + var rp = this.realPath = getPath[this.type](this); + if (this.attr('transform') && this.attr('transform').length) { + rp = R.transformPath(rp, this.attr('transform')); + } + return R.isPointInsidePath(rp, x, y); + }; + /*\ + * Element.getBBox + [ method ] + ** + * Return bounding box for a given element + ** + > Parameters + ** + - isWithoutTransform (boolean) flag, `true` if you want to have bounding box before transformations. Default is `false`. + = (object) Bounding box object: + o { + o x: (number) top left corner x + o y: (number) top left corner y + o x2: (number) bottom right corner x + o y2: (number) bottom right corner y + o width: (number) width + o height: (number) height + o } + \*/ + elproto.getBBox = function (isWithoutTransform) { + if (this.removed) { + return {}; + } + var _ = this._; + if (isWithoutTransform) { + if (_.dirty || !_.bboxwt) { + this.realPath = getPath[this.type](this); + _.bboxwt = pathDimensions(this.realPath); + _.bboxwt.toString = x_y_w_h; + _.dirty = 0; + } + return _.bboxwt; + } + if (_.dirty || _.dirtyT || !_.bbox) { + if (_.dirty || !this.realPath) { + _.bboxwt = 0; + this.realPath = getPath[this.type](this); + } + _.bbox = pathDimensions(mapPath(this.realPath, this.matrix)); + _.bbox.toString = x_y_w_h; + _.dirty = _.dirtyT = 0; + } + return _.bbox; + }; + /*\ + * Element.clone + [ method ] + ** + = (object) clone of a given element + ** + \*/ + elproto.clone = function () { + if (this.removed) { + return null; + } + var out = this.paper[this.type]().attr(this.attr()); + this.__set__ && this.__set__.push(out); + return out; + }; + /*\ + * Element.glow + [ method ] + ** + * Return set of elements that create glow-like effect around given element. See @Paper.set. + * + * Note: Glow is not connected to the element. If you change element attributes it won’t adjust itself. + ** + > Parameters + ** + - glow (object) #optional parameters object with all properties optional: + o { + o width (number) size of the glow, default is `10` + o fill (boolean) will it be filled, default is `false` + o opacity (number) opacity, default is `0.5` + o offsetx (number) horizontal offset, default is `0` + o offsety (number) vertical offset, default is `0` + o color (string) glow colour, default is `black` + o } + = (object) @Paper.set of elements that represents glow + \*/ + elproto.glow = function (glow) { + if (this.type == "text") { + return null; + } + glow = glow || {}; + var s = { + width: (glow.width || 10) + (+this.attr("stroke-width") || 1), + fill: glow.fill || false, + opacity: glow.opacity == null ? .5 : glow.opacity, + offsetx: glow.offsetx || 0, + offsety: glow.offsety || 0, + color: glow.color || "#000" + }, + c = s.width / 2, + r = this.paper, + out = r.set(), + path = this.realPath || getPath[this.type](this); + path = this.matrix ? mapPath(path, this.matrix) : path; + for (var i = 1; i < c + 1; i++) { + out.push(r.path(path).attr({ + stroke: s.color, + fill: s.fill ? s.color : "none", + "stroke-linejoin": "round", + "stroke-linecap": "round", + "stroke-width": +(s.width / c * i).toFixed(3), + opacity: +(s.opacity / c).toFixed(3) + })); + } + return out.insertBefore(this).translate(s.offsetx, s.offsety); + }; + var curveslengths = {}, + getPointAtSegmentLength = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) { + if (length == null) { + return bezlen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y); + } else { + return R.findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, getTatLen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length)); + } + }, + getLengthFactory = function (istotal, subpath) { + return function (path, length, onlystart) { + path = path2curve(path); + var x, y, p, l, sp = "", subpaths = {}, point, + len = 0; + for (var i = 0, ii = path.length; i < ii; i++) { + p = path[i]; + if (p[0] == "M") { + x = +p[1]; + y = +p[2]; + } else { + l = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]); + if (len + l > length) { + if (subpath && !subpaths.start) { + point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len); + sp += ["C" + point.start.x, point.start.y, point.m.x, point.m.y, point.x, point.y]; + if (onlystart) {return sp;} + subpaths.start = sp; + sp = ["M" + point.x, point.y + "C" + point.n.x, point.n.y, point.end.x, point.end.y, p[5], p[6]].join(); + len += l; + x = +p[5]; + y = +p[6]; + continue; + } + if (!istotal && !subpath) { + point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len); + return {x: point.x, y: point.y, alpha: point.alpha}; + } + } + len += l; + x = +p[5]; + y = +p[6]; + } + sp += p.shift() + p; + } + subpaths.end = sp; + point = istotal ? len : subpath ? subpaths : R.findDotsAtSegment(x, y, p[0], p[1], p[2], p[3], p[4], p[5], 1); + point.alpha && (point = {x: point.x, y: point.y, alpha: point.alpha}); + return point; + }; + }; + var getTotalLength = getLengthFactory(1), + getPointAtLength = getLengthFactory(), + getSubpathsAtLength = getLengthFactory(0, 1); + /*\ + * Raphael.getTotalLength + [ method ] + ** + * Returns length of the given path in pixels. + ** + > Parameters + ** + - path (string) SVG path string. + ** + = (number) length. + \*/ + R.getTotalLength = getTotalLength; + /*\ + * Raphael.getPointAtLength + [ method ] + ** + * Return coordinates of the point located at the given length on the given path. + ** + > Parameters + ** + - path (string) SVG path string + - length (number) + ** + = (object) representation of the point: + o { + o x: (number) x coordinate + o y: (number) y coordinate + o alpha: (number) angle of derivative + o } + \*/ + R.getPointAtLength = getPointAtLength; + /*\ + * Raphael.getSubpath + [ method ] + ** + * Return subpath of a given path from given length to given length. + ** + > Parameters + ** + - path (string) SVG path string + - from (number) position of the start of the segment + - to (number) position of the end of the segment + ** + = (string) pathstring for the segment + \*/ + R.getSubpath = function (path, from, to) { + if (this.getTotalLength(path) - to < 1e-6) { + return getSubpathsAtLength(path, from).end; + } + var a = getSubpathsAtLength(path, to, 1); + return from ? getSubpathsAtLength(a, from).end : a; + }; + /*\ + * Element.getTotalLength + [ method ] + ** + * Returns length of the path in pixels. Only works for element of “path” type. + = (number) length. + \*/ + elproto.getTotalLength = function () { + var path = this.getPath(); + if (!path) { + return; + } + + if (this.node.getTotalLength) { + return this.node.getTotalLength(); + } + + return getTotalLength(path); + }; + /*\ + * Element.getPointAtLength + [ method ] + ** + * Return coordinates of the point located at the given length on the given path. Only works for element of “path” type. + ** + > Parameters + ** + - length (number) + ** + = (object) representation of the point: + o { + o x: (number) x coordinate + o y: (number) y coordinate + o alpha: (number) angle of derivative + o } + \*/ + elproto.getPointAtLength = function (length) { + var path = this.getPath(); + if (!path) { + return; + } + + return getPointAtLength(path, length); + }; + /*\ + * Element.getPath + [ method ] + ** + * Returns path of the element. Only works for elements of “path” type and simple elements like circle. + = (object) path + ** + \*/ + elproto.getPath = function () { + var path, + getPath = R._getPath[this.type]; + + if (this.type == "text" || this.type == "set") { + return; + } + + if (getPath) { + path = getPath(this); + } + + return path; + }; + /*\ + * Element.getSubpath + [ method ] + ** + * Return subpath of a given element from given length to given length. Only works for element of “path” type. + ** + > Parameters + ** + - from (number) position of the start of the segment + - to (number) position of the end of the segment + ** + = (string) pathstring for the segment + \*/ + elproto.getSubpath = function (from, to) { + var path = this.getPath(); + if (!path) { + return; + } + + return R.getSubpath(path, from, to); + }; + /*\ + * Raphael.easing_formulas + [ property ] + ** + * Object that contains easing formulas for animation. You could extend it with your own. By default it has following list of easing: + #
        + #
      • “linear”
      • + #
      • “<” or “easeIn” or “ease-in”
      • + #
      • “>” or “easeOut” or “ease-out”
      • + #
      • “<>” or “easeInOut” or “ease-in-out”
      • + #
      • “backIn” or “back-in”
      • + #
      • “backOut” or “back-out”
      • + #
      • “elastic”
      • + #
      • “bounce”
      • + #
      + #

      See also Easing demo.

      + \*/ + var ef = R.easing_formulas = { + linear: function (n) { + return n; + }, + "<": function (n) { + return pow(n, 1.7); + }, + ">": function (n) { + return pow(n, .48); + }, + "<>": function (n) { + var q = .48 - n / 1.04, + Q = math.sqrt(.1734 + q * q), + x = Q - q, + X = pow(abs(x), 1 / 3) * (x < 0 ? -1 : 1), + y = -Q - q, + Y = pow(abs(y), 1 / 3) * (y < 0 ? -1 : 1), + t = X + Y + .5; + return (1 - t) * 3 * t * t + t * t * t; + }, + backIn: function (n) { + var s = 1.70158; + return n * n * ((s + 1) * n - s); + }, + backOut: function (n) { + n = n - 1; + var s = 1.70158; + return n * n * ((s + 1) * n + s) + 1; + }, + elastic: function (n) { + if (n == !!n) { + return n; + } + return pow(2, -10 * n) * math.sin((n - .075) * (2 * PI) / .3) + 1; + }, + bounce: function (n) { + var s = 7.5625, + p = 2.75, + l; + if (n < (1 / p)) { + l = s * n * n; + } else { + if (n < (2 / p)) { + n -= (1.5 / p); + l = s * n * n + .75; + } else { + if (n < (2.5 / p)) { + n -= (2.25 / p); + l = s * n * n + .9375; + } else { + n -= (2.625 / p); + l = s * n * n + .984375; + } + } + } + return l; + } + }; + ef.easeIn = ef["ease-in"] = ef["<"]; + ef.easeOut = ef["ease-out"] = ef[">"]; + ef.easeInOut = ef["ease-in-out"] = ef["<>"]; + ef["back-in"] = ef.backIn; + ef["back-out"] = ef.backOut; + + var animationElements = [], + requestAnimFrame = window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function (callback) { + setTimeout(callback, 16); + }, + animation = function () { + var Now = +new Date, + l = 0; + for (; l < animationElements.length; l++) { + var e = animationElements[l]; + if (e.el.removed || e.paused) { + continue; + } + var time = Now - e.start, + ms = e.ms, + easing = e.easing, + from = e.from, + diff = e.diff, + to = e.to, + t = e.t, + that = e.el, + set = {}, + now, + init = {}, + key; + if (e.initstatus) { + time = (e.initstatus * e.anim.top - e.prev) / (e.percent - e.prev) * ms; + e.status = e.initstatus; + delete e.initstatus; + e.stop && animationElements.splice(l--, 1); + } else { + e.status = (e.prev + (e.percent - e.prev) * (time / ms)) / e.anim.top; + } + if (time < 0) { + continue; + } + if (time < ms) { + var pos = easing(time / ms); + for (var attr in from) if (from[has](attr)) { + switch (availableAnimAttrs[attr]) { + case nu: + now = +from[attr] + pos * ms * diff[attr]; + break; + case "colour": + now = "rgb(" + [ + upto255(round(from[attr].r + pos * ms * diff[attr].r)), + upto255(round(from[attr].g + pos * ms * diff[attr].g)), + upto255(round(from[attr].b + pos * ms * diff[attr].b)) + ].join(",") + ")"; + break; + case "path": + now = []; + for (var i = 0, ii = from[attr].length; i < ii; i++) { + now[i] = [from[attr][i][0]]; + for (var j = 1, jj = from[attr][i].length; j < jj; j++) { + now[i][j] = +from[attr][i][j] + pos * ms * diff[attr][i][j]; + } + now[i] = now[i].join(S); + } + now = now.join(S); + break; + case "transform": + if (diff[attr].real) { + now = []; + for (i = 0, ii = from[attr].length; i < ii; i++) { + now[i] = [from[attr][i][0]]; + for (j = 1, jj = from[attr][i].length; j < jj; j++) { + now[i][j] = from[attr][i][j] + pos * ms * diff[attr][i][j]; + } + } + } else { + var get = function (i) { + return +from[attr][i] + pos * ms * diff[attr][i]; + }; + // now = [["r", get(2), 0, 0], ["t", get(3), get(4)], ["s", get(0), get(1), 0, 0]]; + now = [["m", get(0), get(1), get(2), get(3), get(4), get(5)]]; + } + break; + case "csv": + if (attr == "clip-rect") { + now = []; + i = 4; + while (i--) { + now[i] = +from[attr][i] + pos * ms * diff[attr][i]; + } + } + break; + default: + var from2 = [][concat](from[attr]); + now = []; + i = that.paper.customAttributes[attr].length; + while (i--) { + now[i] = +from2[i] + pos * ms * diff[attr][i]; + } + break; + } + set[attr] = now; + } + that.attr(set); + (function (id, that, anim) { + setTimeout(function () { + eve("raphael.anim.frame." + id, that, anim); + }); + })(that.id, that, e.anim); + } else { + (function(f, el, a) { + setTimeout(function() { + eve("raphael.anim.frame." + el.id, el, a); + eve("raphael.anim.finish." + el.id, el, a); + R.is(f, "function") && f.call(el); + }); + })(e.callback, that, e.anim); + that.attr(to); + animationElements.splice(l--, 1); + if (e.repeat > 1 && !e.next) { + for (key in to) if (to[has](key)) { + init[key] = e.totalOrigin[key]; + } + e.el.attr(init); + runAnimation(e.anim, e.el, e.anim.percents[0], null, e.totalOrigin, e.repeat - 1); + } + if (e.next && !e.stop) { + runAnimation(e.anim, e.el, e.next, null, e.totalOrigin, e.repeat); + } + } + } + animationElements.length && requestAnimFrame(animation); + }, + upto255 = function (color) { + return color > 255 ? 255 : color < 0 ? 0 : color; + }; + /*\ + * Element.animateWith + [ method ] + ** + * Acts similar to @Element.animate, but ensure that given animation runs in sync with another given element. + ** + > Parameters + ** + - el (object) element to sync with + - anim (object) animation to sync with + - params (object) #optional final attributes for the element, see also @Element.attr + - ms (number) #optional number of milliseconds for animation to run + - easing (string) #optional easing type. Accept on of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX, XX, XX, XX)` + - callback (function) #optional callback function. Will be called at the end of animation. + * or + - element (object) element to sync with + - anim (object) animation to sync with + - animation (object) #optional animation object, see @Raphael.animation + ** + = (object) original element + \*/ + elproto.animateWith = function (el, anim, params, ms, easing, callback) { + var element = this; + if (element.removed) { + callback && callback.call(element); + return element; + } + var a = params instanceof Animation ? params : R.animation(params, ms, easing, callback), + x, y; + runAnimation(a, element, a.percents[0], null, element.attr()); + for (var i = 0, ii = animationElements.length; i < ii; i++) { + if (animationElements[i].anim == anim && animationElements[i].el == el) { + animationElements[ii - 1].start = animationElements[i].start; + break; + } + } + return element; + // + // + // var a = params ? R.animation(params, ms, easing, callback) : anim, + // status = element.status(anim); + // return this.animate(a).status(a, status * anim.ms / a.ms); + }; + function CubicBezierAtTime(t, p1x, p1y, p2x, p2y, duration) { + var cx = 3 * p1x, + bx = 3 * (p2x - p1x) - cx, + ax = 1 - cx - bx, + cy = 3 * p1y, + by = 3 * (p2y - p1y) - cy, + ay = 1 - cy - by; + function sampleCurveX(t) { + return ((ax * t + bx) * t + cx) * t; + } + function solve(x, epsilon) { + var t = solveCurveX(x, epsilon); + return ((ay * t + by) * t + cy) * t; + } + function solveCurveX(x, epsilon) { + var t0, t1, t2, x2, d2, i; + for(t2 = x, i = 0; i < 8; i++) { + x2 = sampleCurveX(t2) - x; + if (abs(x2) < epsilon) { + return t2; + } + d2 = (3 * ax * t2 + 2 * bx) * t2 + cx; + if (abs(d2) < 1e-6) { + break; + } + t2 = t2 - x2 / d2; + } + t0 = 0; + t1 = 1; + t2 = x; + if (t2 < t0) { + return t0; + } + if (t2 > t1) { + return t1; + } + while (t0 < t1) { + x2 = sampleCurveX(t2); + if (abs(x2 - x) < epsilon) { + return t2; + } + if (x > x2) { + t0 = t2; + } else { + t1 = t2; + } + t2 = (t1 - t0) / 2 + t0; + } + return t2; + } + return solve(t, 1 / (200 * duration)); + } + elproto.onAnimation = function (f) { + f ? eve.on("raphael.anim.frame." + this.id, f) : eve.unbind("raphael.anim.frame." + this.id); + return this; + }; + function Animation(anim, ms) { + var percents = [], + newAnim = {}; + this.ms = ms; + this.times = 1; + if (anim) { + for (var attr in anim) if (anim[has](attr)) { + newAnim[toFloat(attr)] = anim[attr]; + percents.push(toFloat(attr)); + } + percents.sort(sortByNumber); + } + this.anim = newAnim; + this.top = percents[percents.length - 1]; + this.percents = percents; + } + /*\ + * Animation.delay + [ method ] + ** + * Creates a copy of existing animation object with given delay. + ** + > Parameters + ** + - delay (number) number of ms to pass between animation start and actual animation + ** + = (object) new altered Animation object + | var anim = Raphael.animation({cx: 10, cy: 20}, 2e3); + | circle1.animate(anim); // run the given animation immediately + | circle2.animate(anim.delay(500)); // run the given animation after 500 ms + \*/ + Animation.prototype.delay = function (delay) { + var a = new Animation(this.anim, this.ms); + a.times = this.times; + a.del = +delay || 0; + return a; + }; + /*\ + * Animation.repeat + [ method ] + ** + * Creates a copy of existing animation object with given repetition. + ** + > Parameters + ** + - repeat (number) number iterations of animation. For infinite animation pass `Infinity` + ** + = (object) new altered Animation object + \*/ + Animation.prototype.repeat = function (times) { + var a = new Animation(this.anim, this.ms); + a.del = this.del; + a.times = math.floor(mmax(times, 0)) || 1; + return a; + }; + function runAnimation(anim, element, percent, status, totalOrigin, times) { + percent = toFloat(percent); + var params, + isInAnim, + isInAnimSet, + percents = [], + next, + prev, + timestamp, + ms = anim.ms, + from = {}, + to = {}, + diff = {}; + if (status) { + for (i = 0, ii = animationElements.length; i < ii; i++) { + var e = animationElements[i]; + if (e.el.id == element.id && e.anim == anim) { + if (e.percent != percent) { + animationElements.splice(i, 1); + isInAnimSet = 1; + } else { + isInAnim = e; + } + element.attr(e.totalOrigin); + break; + } + } + } else { + status = +to; // NaN + } + for (var i = 0, ii = anim.percents.length; i < ii; i++) { + if (anim.percents[i] == percent || anim.percents[i] > status * anim.top) { + percent = anim.percents[i]; + prev = anim.percents[i - 1] || 0; + ms = ms / anim.top * (percent - prev); + next = anim.percents[i + 1]; + params = anim.anim[percent]; + break; + } else if (status) { + element.attr(anim.anim[anim.percents[i]]); + } + } + if (!params) { + return; + } + if (!isInAnim) { + for (var attr in params) if (params[has](attr)) { + if (availableAnimAttrs[has](attr) || element.paper.customAttributes[has](attr)) { + from[attr] = element.attr(attr); + (from[attr] == null) && (from[attr] = availableAttrs[attr]); + to[attr] = params[attr]; + switch (availableAnimAttrs[attr]) { + case nu: + diff[attr] = (to[attr] - from[attr]) / ms; + break; + case "colour": + from[attr] = R.getRGB(from[attr]); + var toColour = R.getRGB(to[attr]); + diff[attr] = { + r: (toColour.r - from[attr].r) / ms, + g: (toColour.g - from[attr].g) / ms, + b: (toColour.b - from[attr].b) / ms + }; + break; + case "path": + var pathes = path2curve(from[attr], to[attr]), + toPath = pathes[1]; + from[attr] = pathes[0]; + diff[attr] = []; + for (i = 0, ii = from[attr].length; i < ii; i++) { + diff[attr][i] = [0]; + for (var j = 1, jj = from[attr][i].length; j < jj; j++) { + diff[attr][i][j] = (toPath[i][j] - from[attr][i][j]) / ms; + } + } + break; + case "transform": + var _ = element._, + eq = equaliseTransform(_[attr], to[attr]); + if (eq) { + from[attr] = eq.from; + to[attr] = eq.to; + diff[attr] = []; + diff[attr].real = true; + for (i = 0, ii = from[attr].length; i < ii; i++) { + diff[attr][i] = [from[attr][i][0]]; + for (j = 1, jj = from[attr][i].length; j < jj; j++) { + diff[attr][i][j] = (to[attr][i][j] - from[attr][i][j]) / ms; + } + } + } else { + var m = (element.matrix || new Matrix), + to2 = { + _: {transform: _.transform}, + getBBox: function () { + return element.getBBox(1); + } + }; + from[attr] = [ + m.a, + m.b, + m.c, + m.d, + m.e, + m.f + ]; + extractTransform(to2, to[attr]); + to[attr] = to2._.transform; + diff[attr] = [ + (to2.matrix.a - m.a) / ms, + (to2.matrix.b - m.b) / ms, + (to2.matrix.c - m.c) / ms, + (to2.matrix.d - m.d) / ms, + (to2.matrix.e - m.e) / ms, + (to2.matrix.f - m.f) / ms + ]; + // from[attr] = [_.sx, _.sy, _.deg, _.dx, _.dy]; + // var to2 = {_:{}, getBBox: function () { return element.getBBox(); }}; + // extractTransform(to2, to[attr]); + // diff[attr] = [ + // (to2._.sx - _.sx) / ms, + // (to2._.sy - _.sy) / ms, + // (to2._.deg - _.deg) / ms, + // (to2._.dx - _.dx) / ms, + // (to2._.dy - _.dy) / ms + // ]; + } + break; + case "csv": + var values = Str(params[attr])[split](separator), + from2 = Str(from[attr])[split](separator); + if (attr == "clip-rect") { + from[attr] = from2; + diff[attr] = []; + i = from2.length; + while (i--) { + diff[attr][i] = (values[i] - from[attr][i]) / ms; + } + } + to[attr] = values; + break; + default: + values = [][concat](params[attr]); + from2 = [][concat](from[attr]); + diff[attr] = []; + i = element.paper.customAttributes[attr].length; + while (i--) { + diff[attr][i] = ((values[i] || 0) - (from2[i] || 0)) / ms; + } + break; + } + } + } + var easing = params.easing, + easyeasy = R.easing_formulas[easing]; + if (!easyeasy) { + easyeasy = Str(easing).match(bezierrg); + if (easyeasy && easyeasy.length == 5) { + var curve = easyeasy; + easyeasy = function (t) { + return CubicBezierAtTime(t, +curve[1], +curve[2], +curve[3], +curve[4], ms); + }; + } else { + easyeasy = pipe; + } + } + timestamp = params.start || anim.start || +new Date; + e = { + anim: anim, + percent: percent, + timestamp: timestamp, + start: timestamp + (anim.del || 0), + status: 0, + initstatus: status || 0, + stop: false, + ms: ms, + easing: easyeasy, + from: from, + diff: diff, + to: to, + el: element, + callback: params.callback, + prev: prev, + next: next, + repeat: times || anim.times, + origin: element.attr(), + totalOrigin: totalOrigin + }; + animationElements.push(e); + if (status && !isInAnim && !isInAnimSet) { + e.stop = true; + e.start = new Date - ms * status; + if (animationElements.length == 1) { + return animation(); + } + } + if (isInAnimSet) { + e.start = new Date - e.ms * status; + } + animationElements.length == 1 && requestAnimFrame(animation); + } else { + isInAnim.initstatus = status; + isInAnim.start = new Date - isInAnim.ms * status; + } + eve("raphael.anim.start." + element.id, element, anim); + } + /*\ + * Raphael.animation + [ method ] + ** + * Creates an animation object that can be passed to the @Element.animate or @Element.animateWith methods. + * See also @Animation.delay and @Animation.repeat methods. + ** + > Parameters + ** + - params (object) final attributes for the element, see also @Element.attr + - ms (number) number of milliseconds for animation to run + - easing (string) #optional easing type. Accept one of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX, XX, XX, XX)` + - callback (function) #optional callback function. Will be called at the end of animation. + ** + = (object) @Animation + \*/ + R.animation = function (params, ms, easing, callback) { + if (params instanceof Animation) { + return params; + } + if (R.is(easing, "function") || !easing) { + callback = callback || easing || null; + easing = null; + } + params = Object(params); + ms = +ms || 0; + var p = {}, + json, + attr; + for (attr in params) if (params[has](attr) && toFloat(attr) != attr && toFloat(attr) + "%" != attr) { + json = true; + p[attr] = params[attr]; + } + if (!json) { + // if percent-like syntax is used and end-of-all animation callback used + if(callback){ + // find the last one + var lastKey = 0; + for(var i in params){ + var percent = toInt(i); + if(params[has](i) && percent > lastKey){ + lastKey = percent; + } + } + lastKey += '%'; + // if already defined callback in the last keyframe, skip + !params[lastKey].callback && (params[lastKey].callback = callback); + } + return new Animation(params, ms); + } else { + easing && (p.easing = easing); + callback && (p.callback = callback); + return new Animation({100: p}, ms); + } + }; + /*\ + * Element.animate + [ method ] + ** + * Creates and starts animation for given element. + ** + > Parameters + ** + - params (object) final attributes for the element, see also @Element.attr + - ms (number) number of milliseconds for animation to run + - easing (string) #optional easing type. Accept one of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX, XX, XX, XX)` + - callback (function) #optional callback function. Will be called at the end of animation. + * or + - animation (object) animation object, see @Raphael.animation + ** + = (object) original element + \*/ + elproto.animate = function (params, ms, easing, callback) { + var element = this; + if (element.removed) { + callback && callback.call(element); + return element; + } + var anim = params instanceof Animation ? params : R.animation(params, ms, easing, callback); + runAnimation(anim, element, anim.percents[0], null, element.attr()); + return element; + }; + /*\ + * Element.setTime + [ method ] + ** + * Sets the status of animation of the element in milliseconds. Similar to @Element.status method. + ** + > Parameters + ** + - anim (object) animation object + - value (number) number of milliseconds from the beginning of the animation + ** + = (object) original element if `value` is specified + * Note, that during animation following events are triggered: + * + * On each animation frame event `anim.frame.`, on start `anim.start.` and on end `anim.finish.`. + \*/ + elproto.setTime = function (anim, value) { + if (anim && value != null) { + this.status(anim, mmin(value, anim.ms) / anim.ms); + } + return this; + }; + /*\ + * Element.status + [ method ] + ** + * Gets or sets the status of animation of the element. + ** + > Parameters + ** + - anim (object) #optional animation object + - value (number) #optional 0 – 1. If specified, method works like a setter and sets the status of a given animation to the value. This will cause animation to jump to the given position. + ** + = (number) status + * or + = (array) status if `anim` is not specified. Array of objects in format: + o { + o anim: (object) animation object + o status: (number) status + o } + * or + = (object) original element if `value` is specified + \*/ + elproto.status = function (anim, value) { + var out = [], + i = 0, + len, + e; + if (value != null) { + runAnimation(anim, this, -1, mmin(value, 1)); + return this; + } else { + len = animationElements.length; + for (; i < len; i++) { + e = animationElements[i]; + if (e.el.id == this.id && (!anim || e.anim == anim)) { + if (anim) { + return e.status; + } + out.push({ + anim: e.anim, + status: e.status + }); + } + } + if (anim) { + return 0; + } + return out; + } + }; + /*\ + * Element.pause + [ method ] + ** + * Stops animation of the element with ability to resume it later on. + ** + > Parameters + ** + - anim (object) #optional animation object + ** + = (object) original element + \*/ + elproto.pause = function (anim) { + for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) { + if (eve("raphael.anim.pause." + this.id, this, animationElements[i].anim) !== false) { + animationElements[i].paused = true; + } + } + return this; + }; + /*\ + * Element.resume + [ method ] + ** + * Resumes animation if it was paused with @Element.pause method. + ** + > Parameters + ** + - anim (object) #optional animation object + ** + = (object) original element + \*/ + elproto.resume = function (anim) { + for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) { + var e = animationElements[i]; + if (eve("raphael.anim.resume." + this.id, this, e.anim) !== false) { + delete e.paused; + this.status(e.anim, e.status); + } + } + return this; + }; + /*\ + * Element.stop + [ method ] + ** + * Stops animation of the element. + ** + > Parameters + ** + - anim (object) #optional animation object + ** + = (object) original element + \*/ + elproto.stop = function (anim) { + for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) { + if (eve("raphael.anim.stop." + this.id, this, animationElements[i].anim) !== false) { + animationElements.splice(i--, 1); + } + } + return this; + }; + function stopAnimation(paper) { + for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.paper == paper) { + animationElements.splice(i--, 1); + } + } + eve.on("raphael.remove", stopAnimation); + eve.on("raphael.clear", stopAnimation); + elproto.toString = function () { + return "Rapha\xebl\u2019s object"; + }; + + // Set + var Set = function (items) { + this.items = []; + this.length = 0; + this.type = "set"; + if (items) { + for (var i = 0, ii = items.length; i < ii; i++) { + if (items[i] && (items[i].constructor == elproto.constructor || items[i].constructor == Set)) { + this[this.items.length] = this.items[this.items.length] = items[i]; + this.length++; + } + } + } + }, + setproto = Set.prototype; + /*\ + * Set.push + [ method ] + ** + * Adds each argument to the current set. + = (object) original element + \*/ + setproto.push = function () { + var item, + len; + for (var i = 0, ii = arguments.length; i < ii; i++) { + item = arguments[i]; + if (item && (item.constructor == elproto.constructor || item.constructor == Set)) { + len = this.items.length; + this[len] = this.items[len] = item; + this.length++; + } + } + return this; + }; + /*\ + * Set.pop + [ method ] + ** + * Removes last element and returns it. + = (object) element + \*/ + setproto.pop = function () { + this.length && delete this[this.length--]; + return this.items.pop(); + }; + /*\ + * Set.forEach + [ method ] + ** + * Executes given function for each element in the set. + * + * If function returns `false` it will stop loop running. + ** + > Parameters + ** + - callback (function) function to run + - thisArg (object) context object for the callback + = (object) Set object + \*/ + setproto.forEach = function (callback, thisArg) { + for (var i = 0, ii = this.items.length; i < ii; i++) { + if (callback.call(thisArg, this.items[i], i) === false) { + return this; + } + } + return this; + }; + for (var method in elproto) if (elproto[has](method)) { + setproto[method] = (function (methodname) { + return function () { + var arg = arguments; + return this.forEach(function (el) { + el[methodname][apply](el, arg); + }); + }; + })(method); + } + setproto.attr = function (name, value) { + if (name && R.is(name, array) && R.is(name[0], "object")) { + for (var j = 0, jj = name.length; j < jj; j++) { + this.items[j].attr(name[j]); + } + } else { + for (var i = 0, ii = this.items.length; i < ii; i++) { + this.items[i].attr(name, value); + } + } + return this; + }; + /*\ + * Set.clear + [ method ] + ** + * Removes all elements from the set + \*/ + setproto.clear = function () { + while (this.length) { + this.pop(); + } + }; + /*\ + * Set.splice + [ method ] + ** + * Removes given element from the set + ** + > Parameters + ** + - index (number) position of the deletion + - count (number) number of element to remove + - insertion… (object) #optional elements to insert + = (object) set elements that were deleted + \*/ + setproto.splice = function (index, count, insertion) { + index = index < 0 ? mmax(this.length + index, 0) : index; + count = mmax(0, mmin(this.length - index, count)); + var tail = [], + todel = [], + args = [], + i; + for (i = 2; i < arguments.length; i++) { + args.push(arguments[i]); + } + for (i = 0; i < count; i++) { + todel.push(this[index + i]); + } + for (; i < this.length - index; i++) { + tail.push(this[index + i]); + } + var arglen = args.length; + for (i = 0; i < arglen + tail.length; i++) { + this.items[index + i] = this[index + i] = i < arglen ? args[i] : tail[i - arglen]; + } + i = this.items.length = this.length -= count - arglen; + while (this[i]) { + delete this[i++]; + } + return new Set(todel); + }; + /*\ + * Set.exclude + [ method ] + ** + * Removes given element from the set + ** + > Parameters + ** + - element (object) element to remove + = (boolean) `true` if object was found & removed from the set + \*/ + setproto.exclude = function (el) { + for (var i = 0, ii = this.length; i < ii; i++) if (this[i] == el) { + this.splice(i, 1); + return true; + } + }; + setproto.animate = function (params, ms, easing, callback) { + (R.is(easing, "function") || !easing) && (callback = easing || null); + var len = this.items.length, + i = len, + item, + set = this, + collector; + if (!len) { + return this; + } + callback && (collector = function () { + !--len && callback.call(set); + }); + easing = R.is(easing, string) ? easing : collector; + var anim = R.animation(params, ms, easing, collector); + item = this.items[--i].animate(anim); + while (i--) { + this.items[i] && !this.items[i].removed && this.items[i].animateWith(item, anim, anim); + (this.items[i] && !this.items[i].removed) || len--; + } + return this; + }; + setproto.insertAfter = function (el) { + var i = this.items.length; + while (i--) { + this.items[i].insertAfter(el); + } + return this; + }; + setproto.getBBox = function () { + var x = [], + y = [], + x2 = [], + y2 = []; + for (var i = this.items.length; i--;) if (!this.items[i].removed) { + var box = this.items[i].getBBox(); + x.push(box.x); + y.push(box.y); + x2.push(box.x + box.width); + y2.push(box.y + box.height); + } + x = mmin[apply](0, x); + y = mmin[apply](0, y); + x2 = mmax[apply](0, x2); + y2 = mmax[apply](0, y2); + return { + x: x, + y: y, + x2: x2, + y2: y2, + width: x2 - x, + height: y2 - y + }; + }; + setproto.clone = function (s) { + s = this.paper.set(); + for (var i = 0, ii = this.items.length; i < ii; i++) { + s.push(this.items[i].clone()); + } + return s; + }; + setproto.toString = function () { + return "Rapha\xebl\u2018s set"; + }; + + setproto.glow = function(glowConfig) { + var ret = this.paper.set(); + this.forEach(function(shape, index){ + var g = shape.glow(glowConfig); + if(g != null){ + g.forEach(function(shape2, index2){ + ret.push(shape2); + }); + } + }); + return ret; + }; + + + /*\ + * Set.isPointInside + [ method ] + ** + * Determine if given point is inside this set’s elements + ** + > Parameters + ** + - x (number) x coordinate of the point + - y (number) y coordinate of the point + = (boolean) `true` if point is inside any of the set's elements + \*/ + setproto.isPointInside = function (x, y) { + var isPointInside = false; + this.forEach(function (el) { + if (el.isPointInside(x, y)) { + isPointInside = true; + return false; // stop loop + } + }); + return isPointInside; + }; + + /*\ + * Raphael.registerFont + [ method ] + ** + * Adds given font to the registered set of fonts for Raphaël. Should be used as an internal call from within Cufón’s font file. + * Returns original parameter, so it could be used with chaining. + # More about Cufón and how to convert your font form TTF, OTF, etc to JavaScript file. + ** + > Parameters + ** + - font (object) the font to register + = (object) the font you passed in + > Usage + | Cufon.registerFont(Raphael.registerFont({…})); + \*/ + R.registerFont = function (font) { + if (!font.face) { + return font; + } + this.fonts = this.fonts || {}; + var fontcopy = { + w: font.w, + face: {}, + glyphs: {} + }, + family = font.face["font-family"]; + for (var prop in font.face) if (font.face[has](prop)) { + fontcopy.face[prop] = font.face[prop]; + } + if (this.fonts[family]) { + this.fonts[family].push(fontcopy); + } else { + this.fonts[family] = [fontcopy]; + } + if (!font.svg) { + fontcopy.face["units-per-em"] = toInt(font.face["units-per-em"], 10); + for (var glyph in font.glyphs) if (font.glyphs[has](glyph)) { + var path = font.glyphs[glyph]; + fontcopy.glyphs[glyph] = { + w: path.w, + k: {}, + d: path.d && "M" + path.d.replace(/[mlcxtrv]/g, function (command) { + return {l: "L", c: "C", x: "z", t: "m", r: "l", v: "c"}[command] || "M"; + }) + "z" + }; + if (path.k) { + for (var k in path.k) if (path[has](k)) { + fontcopy.glyphs[glyph].k[k] = path.k[k]; + } + } + } + } + return font; + }; + /*\ + * Paper.getFont + [ method ] + ** + * Finds font object in the registered fonts by given parameters. You could specify only one word from the font name, like “Myriad” for “Myriad Pro”. + ** + > Parameters + ** + - family (string) font family name or any word from it + - weight (string) #optional font weight + - style (string) #optional font style + - stretch (string) #optional font stretch + = (object) the font object + > Usage + | paper.print(100, 100, "Test string", paper.getFont("Times", 800), 30); + \*/ + paperproto.getFont = function (family, weight, style, stretch) { + stretch = stretch || "normal"; + style = style || "normal"; + weight = +weight || {normal: 400, bold: 700, lighter: 300, bolder: 800}[weight] || 400; + if (!R.fonts) { + return; + } + var font = R.fonts[family]; + if (!font) { + var name = new RegExp("(^|\\s)" + family.replace(/[^\w\d\s+!~.:_-]/g, E) + "(\\s|$)", "i"); + for (var fontName in R.fonts) if (R.fonts[has](fontName)) { + if (name.test(fontName)) { + font = R.fonts[fontName]; + break; + } + } + } + var thefont; + if (font) { + for (var i = 0, ii = font.length; i < ii; i++) { + thefont = font[i]; + if (thefont.face["font-weight"] == weight && (thefont.face["font-style"] == style || !thefont.face["font-style"]) && thefont.face["font-stretch"] == stretch) { + break; + } + } + } + return thefont; + }; + /*\ + * Paper.print + [ method ] + ** + * Creates path that represent given text written using given font at given position with given size. + * Result of the method is path element that contains whole text as a separate path. + ** + > Parameters + ** + - x (number) x position of the text + - y (number) y position of the text + - string (string) text to print + - font (object) font object, see @Paper.getFont + - size (number) #optional size of the font, default is `16` + - origin (string) #optional could be `"baseline"` or `"middle"`, default is `"middle"` + - letter_spacing (number) #optional number in range `-1..1`, default is `0` + - line_spacing (number) #optional number in range `1..3`, default is `1` + = (object) resulting path element, which consist of all letters + > Usage + | var txt = r.print(10, 50, "print", r.getFont("Museo"), 30).attr({fill: "#fff"}); + \*/ + paperproto.print = function (x, y, string, font, size, origin, letter_spacing, line_spacing) { + origin = origin || "middle"; // baseline|middle + letter_spacing = mmax(mmin(letter_spacing || 0, 1), -1); + line_spacing = mmax(mmin(line_spacing || 1, 3), 1); + var letters = Str(string)[split](E), + shift = 0, + notfirst = 0, + path = E, + scale; + R.is(font, "string") && (font = this.getFont(font)); + if (font) { + scale = (size || 16) / font.face["units-per-em"]; + var bb = font.face.bbox[split](separator), + top = +bb[0], + lineHeight = bb[3] - bb[1], + shifty = 0, + height = +bb[1] + (origin == "baseline" ? lineHeight + (+font.face.descent) : lineHeight / 2); + for (var i = 0, ii = letters.length; i < ii; i++) { + if (letters[i] == "\n") { + shift = 0; + curr = 0; + notfirst = 0; + shifty += lineHeight * line_spacing; + } else { + var prev = notfirst && font.glyphs[letters[i - 1]] || {}, + curr = font.glyphs[letters[i]]; + shift += notfirst ? (prev.w || font.w) + (prev.k && prev.k[letters[i]] || 0) + (font.w * letter_spacing) : 0; + notfirst = 1; + } + if (curr && curr.d) { + path += R.transformPath(curr.d, ["t", shift * scale, shifty * scale, "s", scale, scale, top, height, "t", (x - top) / scale, (y - height) / scale]); + } + } + } + return this.path(path).attr({ + fill: "#000", + stroke: "none" + }); + }; + + /*\ + * Paper.add + [ method ] + ** + * Imports elements in JSON array in format `{type: type, }` + ** + > Parameters + ** + - json (array) + = (object) resulting set of imported elements + > Usage + | paper.add([ + | { + | type: "circle", + | cx: 10, + | cy: 10, + | r: 5 + | }, + | { + | type: "rect", + | x: 10, + | y: 10, + | width: 10, + | height: 10, + | fill: "#fc0" + | } + | ]); + \*/ + paperproto.add = function (json) { + if (R.is(json, "array")) { + var res = this.set(), + i = 0, + ii = json.length, + j; + for (; i < ii; i++) { + j = json[i] || {}; + elements[has](j.type) && res.push(this[j.type]().attr(j)); + } + } + return res; + }; + + /*\ + * Raphael.format + [ method ] + ** + * Simple format function. Replaces construction of type “`{}`” to the corresponding argument. + ** + > Parameters + ** + - token (string) string to format + - … (string) rest of arguments will be treated as parameters for replacement + = (string) formated string + > Usage + | var x = 10, + | y = 20, + | width = 40, + | height = 50; + | // this will draw a rectangular shape equivalent to "M10,20h40v50h-40z" + | paper.path(Raphael.format("M{0},{1}h{2}v{3}h{4}z", x, y, width, height, -width)); + \*/ + R.format = function (token, params) { + var args = R.is(params, array) ? [0][concat](params) : arguments; + token && R.is(token, string) && args.length - 1 && (token = token.replace(formatrg, function (str, i) { + return args[++i] == null ? E : args[i]; + })); + return token || E; + }; + /*\ + * Raphael.fullfill + [ method ] + ** + * A little bit more advanced format function than @Raphael.format. Replaces construction of type “`{}`” to the corresponding argument. + ** + > Parameters + ** + - token (string) string to format + - json (object) object which properties will be used as a replacement + = (string) formated string + > Usage + | // this will draw a rectangular shape equivalent to "M10,20h40v50h-40z" + | paper.path(Raphael.fullfill("M{x},{y}h{dim.width}v{dim.height}h{dim['negative width']}z", { + | x: 10, + | y: 20, + | dim: { + | width: 40, + | height: 50, + | "negative width": -40 + | } + | })); + \*/ + R.fullfill = (function () { + var tokenRegex = /\{([^\}]+)\}/g, + objNotationRegex = /(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g, // matches .xxxxx or ["xxxxx"] to run over object properties + replacer = function (all, key, obj) { + var res = obj; + key.replace(objNotationRegex, function (all, name, quote, quotedName, isFunc) { + name = name || quotedName; + if (res) { + if (name in res) { + res = res[name]; + } + typeof res == "function" && isFunc && (res = res()); + } + }); + res = (res == null || res == obj ? all : res) + ""; + return res; + }; + return function (str, obj) { + return String(str).replace(tokenRegex, function (all, key) { + return replacer(all, key, obj); + }); + }; + })(); + /*\ + * Raphael.ninja + [ method ] + ** + * If you want to leave no trace of Raphaël (Well, Raphaël creates only one global variable `Raphael`, but anyway.) You can use `ninja` method. + * Beware, that in this case plugins could stop working, because they are depending on global variable existence. + ** + = (object) Raphael object + > Usage + | (function (local_raphael) { + | var paper = local_raphael(10, 10, 320, 200); + | … + | })(Raphael.ninja()); + \*/ + R.ninja = function () { + if (oldRaphael.was) { + g.win.Raphael = oldRaphael.is; + } else { + // IE8 raises an error when deleting window property + window.Raphael = undefined; + try { + delete window.Raphael; + } catch(e) {} + } + return R; + }; + /*\ + * Raphael.st + [ property (object) ] + ** + * You can add your own method to elements and sets. It is wise to add a set method for each element method + * you added, so you will be able to call the same method on sets too. + ** + * See also @Raphael.el. + > Usage + | Raphael.el.red = function () { + | this.attr({fill: "#f00"}); + | }; + | Raphael.st.red = function () { + | this.forEach(function (el) { + | el.red(); + | }); + | }; + | // then use it + | paper.set(paper.circle(100, 100, 20), paper.circle(110, 100, 20)).red(); + \*/ + R.st = setproto; + + eve.on("raphael.DOMload", function () { + loaded = true; + }); + + // Firefox <3.6 fix: http://webreflection.blogspot.com/2009/11/195-chars-to-help-lazy-loading.html + (function (doc, loaded, f) { + if (doc.readyState == null && doc.addEventListener){ + doc.addEventListener(loaded, f = function () { + doc.removeEventListener(loaded, f, false); + doc.readyState = "complete"; + }, false); + doc.readyState = "loading"; + } + function isLoaded() { + (/in/).test(doc.readyState) ? setTimeout(isLoaded, 9) : R.eve("raphael.DOMload"); + } + isLoaded(); + })(document, "DOMContentLoaded"); + + return R; +}); diff --git a/public/bower_components/raphael/dev/raphael.svg.js b/public/bower_components/raphael/dev/raphael.svg.js new file mode 100755 index 0000000..bdc3afc --- /dev/null +++ b/public/bower_components/raphael/dev/raphael.svg.js @@ -0,0 +1,1418 @@ +define(["./raphael.core"], function(R) { + if (R && !R.svg) { + return; + } + + var has = "hasOwnProperty", + Str = String, + toFloat = parseFloat, + toInt = parseInt, + math = Math, + mmax = math.max, + abs = math.abs, + pow = math.pow, + separator = /[, ]+/, + eve = R.eve, + E = "", + S = " "; + var xlink = "http://www.w3.org/1999/xlink", + markers = { + block: "M5,0 0,2.5 5,5z", + classic: "M5,0 0,2.5 5,5 3.5,3 3.5,2z", + diamond: "M2.5,0 5,2.5 2.5,5 0,2.5z", + open: "M6,1 1,3.5 6,6", + oval: "M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z" + }, + markerCounter = {}; + R.toString = function () { + return "Your browser supports SVG.\nYou are running Rapha\xebl " + this.version; + }; + var $ = function (el, attr) { + if (attr) { + if (typeof el == "string") { + el = $(el); + } + for (var key in attr) if (attr[has](key)) { + if (key.substring(0, 6) == "xlink:") { + el.setAttributeNS(xlink, key.substring(6), Str(attr[key])); + } else { + el.setAttribute(key, Str(attr[key])); + } + } + } else { + el = R._g.doc.createElementNS("http://www.w3.org/2000/svg", el); + el.style && (el.style.webkitTapHighlightColor = "rgba(0,0,0,0)"); + } + return el; + }, + addGradientFill = function (element, gradient) { + var type = "linear", + id = element.id + gradient, + fx = .5, fy = .5, + o = element.node, + SVG = element.paper, + s = o.style, + el = R._g.doc.getElementById(id); + if (!el) { + gradient = Str(gradient).replace(R._radial_gradient, function (all, _fx, _fy) { + type = "radial"; + if (_fx && _fy) { + fx = toFloat(_fx); + fy = toFloat(_fy); + var dir = ((fy > .5) * 2 - 1); + pow(fx - .5, 2) + pow(fy - .5, 2) > .25 && + (fy = math.sqrt(.25 - pow(fx - .5, 2)) * dir + .5) && + fy != .5 && + (fy = fy.toFixed(5) - 1e-5 * dir); + } + return E; + }); + gradient = gradient.split(/\s*\-\s*/); + if (type == "linear") { + var angle = gradient.shift(); + angle = -toFloat(angle); + if (isNaN(angle)) { + return null; + } + var vector = [0, 0, math.cos(R.rad(angle)), math.sin(R.rad(angle))], + max = 1 / (mmax(abs(vector[2]), abs(vector[3])) || 1); + vector[2] *= max; + vector[3] *= max; + if (vector[2] < 0) { + vector[0] = -vector[2]; + vector[2] = 0; + } + if (vector[3] < 0) { + vector[1] = -vector[3]; + vector[3] = 0; + } + } + var dots = R._parseDots(gradient); + if (!dots) { + return null; + } + id = id.replace(/[\(\)\s,\xb0#]/g, "_"); + + if (element.gradient && id != element.gradient.id) { + SVG.defs.removeChild(element.gradient); + delete element.gradient; + } + + if (!element.gradient) { + el = $(type + "Gradient", {id: id}); + element.gradient = el; + $(el, type == "radial" ? { + fx: fx, + fy: fy + } : { + x1: vector[0], + y1: vector[1], + x2: vector[2], + y2: vector[3], + gradientTransform: element.matrix.invert() + }); + SVG.defs.appendChild(el); + for (var i = 0, ii = dots.length; i < ii; i++) { + el.appendChild($("stop", { + offset: dots[i].offset ? dots[i].offset : i ? "100%" : "0%", + "stop-color": dots[i].color || "#fff", + "stop-opacity": isFinite(dots[i].opacity) ? dots[i].opacity : 1 + })); + } + } + } + $(o, { + fill: fillurl(id), + opacity: 1, + "fill-opacity": 1 + }); + s.fill = E; + s.opacity = 1; + s.fillOpacity = 1; + return 1; + }, + isIE9or10 = function () { + var mode = document.documentMode; + return mode && (mode === 9 || mode === 10); + }, + fillurl = function (id) { + if (isIE9or10()) { + return "url('#" + id + "')"; + } + var location = document.location; + var locationString = ( + location.protocol + '//' + + location.host + + location.pathname + + location.search + ); + return "url('" + locationString + "#" + id + "')"; + }, + updatePosition = function (o) { + var bbox = o.getBBox(1); + $(o.pattern, {patternTransform: o.matrix.invert() + " translate(" + bbox.x + "," + bbox.y + ")"}); + }, + addArrow = function (o, value, isEnd) { + if (o.type == "path") { + var values = Str(value).toLowerCase().split("-"), + p = o.paper, + se = isEnd ? "end" : "start", + node = o.node, + attrs = o.attrs, + stroke = attrs["stroke-width"], + i = values.length, + type = "classic", + from, + to, + dx, + refX, + attr, + w = 3, + h = 3, + t = 5; + while (i--) { + switch (values[i]) { + case "block": + case "classic": + case "oval": + case "diamond": + case "open": + case "none": + type = values[i]; + break; + case "wide": h = 5; break; + case "narrow": h = 2; break; + case "long": w = 5; break; + case "short": w = 2; break; + } + } + if (type == "open") { + w += 2; + h += 2; + t += 2; + dx = 1; + refX = isEnd ? 4 : 1; + attr = { + fill: "none", + stroke: attrs.stroke + }; + } else { + refX = dx = w / 2; + attr = { + fill: attrs.stroke, + stroke: "none" + }; + } + if (o._.arrows) { + if (isEnd) { + o._.arrows.endPath && markerCounter[o._.arrows.endPath]--; + o._.arrows.endMarker && markerCounter[o._.arrows.endMarker]--; + } else { + o._.arrows.startPath && markerCounter[o._.arrows.startPath]--; + o._.arrows.startMarker && markerCounter[o._.arrows.startMarker]--; + } + } else { + o._.arrows = {}; + } + if (type != "none") { + var pathId = "raphael-marker-" + type, + markerId = "raphael-marker-" + se + type + w + h + "-obj" + o.id; + if (!R._g.doc.getElementById(pathId)) { + p.defs.appendChild($($("path"), { + "stroke-linecap": "round", + d: markers[type], + id: pathId + })); + markerCounter[pathId] = 1; + } else { + markerCounter[pathId]++; + } + var marker = R._g.doc.getElementById(markerId), + use; + if (!marker) { + marker = $($("marker"), { + id: markerId, + markerHeight: h, + markerWidth: w, + orient: "auto", + refX: refX, + refY: h / 2 + }); + use = $($("use"), { + "xlink:href": "#" + pathId, + transform: (isEnd ? "rotate(180 " + w / 2 + " " + h / 2 + ") " : E) + "scale(" + w / t + "," + h / t + ")", + "stroke-width": (1 / ((w / t + h / t) / 2)).toFixed(4) + }); + marker.appendChild(use); + p.defs.appendChild(marker); + markerCounter[markerId] = 1; + } else { + markerCounter[markerId]++; + use = marker.getElementsByTagName("use")[0]; + } + $(use, attr); + var delta = dx * (type != "diamond" && type != "oval"); + if (isEnd) { + from = o._.arrows.startdx * stroke || 0; + to = R.getTotalLength(attrs.path) - delta * stroke; + } else { + from = delta * stroke; + to = R.getTotalLength(attrs.path) - (o._.arrows.enddx * stroke || 0); + } + attr = {}; + attr["marker-" + se] = "url(#" + markerId + ")"; + if (to || from) { + attr.d = R.getSubpath(attrs.path, from, to); + } + $(node, attr); + o._.arrows[se + "Path"] = pathId; + o._.arrows[se + "Marker"] = markerId; + o._.arrows[se + "dx"] = delta; + o._.arrows[se + "Type"] = type; + o._.arrows[se + "String"] = value; + } else { + if (isEnd) { + from = o._.arrows.startdx * stroke || 0; + to = R.getTotalLength(attrs.path) - from; + } else { + from = 0; + to = R.getTotalLength(attrs.path) - (o._.arrows.enddx * stroke || 0); + } + o._.arrows[se + "Path"] && $(node, {d: R.getSubpath(attrs.path, from, to)}); + delete o._.arrows[se + "Path"]; + delete o._.arrows[se + "Marker"]; + delete o._.arrows[se + "dx"]; + delete o._.arrows[se + "Type"]; + delete o._.arrows[se + "String"]; + } + for (attr in markerCounter) if (markerCounter[has](attr) && !markerCounter[attr]) { + var item = R._g.doc.getElementById(attr); + item && item.parentNode.removeChild(item); + } + } + }, + dasharray = { + "-": [3, 1], + ".": [1, 1], + "-.": [3, 1, 1, 1], + "-..": [3, 1, 1, 1, 1, 1], + ". ": [1, 3], + "- ": [4, 3], + "--": [8, 3], + "- .": [4, 3, 1, 3], + "--.": [8, 3, 1, 3], + "--..": [8, 3, 1, 3, 1, 3] + }, + addDashes = function (o, value, params) { + value = dasharray[Str(value).toLowerCase()]; + if (value) { + var width = o.attrs["stroke-width"] || "1", + butt = {round: width, square: width, butt: 0}[o.attrs["stroke-linecap"] || params["stroke-linecap"]] || 0, + dashes = [], + i = value.length; + while (i--) { + dashes[i] = value[i] * width + ((i % 2) ? 1 : -1) * butt; + } + $(o.node, {"stroke-dasharray": dashes.join(",")}); + } + else { + $(o.node, {"stroke-dasharray": "none"}); + } + }, + setFillAndStroke = function (o, params) { + var node = o.node, + attrs = o.attrs, + vis = node.style.visibility; + node.style.visibility = "hidden"; + for (var att in params) { + if (params[has](att)) { + if (!R._availableAttrs[has](att)) { + continue; + } + var value = params[att]; + attrs[att] = value; + switch (att) { + case "blur": + o.blur(value); + break; + case "title": + var title = node.getElementsByTagName("title"); + + // Use the existing . + if (title.length && (title = title[0])) { + title.firstChild.nodeValue = value; + } else { + title = $("title"); + var val = R._g.doc.createTextNode(value); + title.appendChild(val); + node.appendChild(title); + } + break; + case "href": + case "target": + var pn = node.parentNode; + if (pn.tagName.toLowerCase() != "a") { + var hl = $("a"); + pn.insertBefore(hl, node); + hl.appendChild(node); + pn = hl; + } + if (att == "target") { + pn.setAttributeNS(xlink, "show", value == "blank" ? "new" : value); + } else { + pn.setAttributeNS(xlink, att, value); + } + break; + case "cursor": + node.style.cursor = value; + break; + case "transform": + o.transform(value); + break; + case "arrow-start": + addArrow(o, value); + break; + case "arrow-end": + addArrow(o, value, 1); + break; + case "clip-rect": + var rect = Str(value).split(separator); + if (rect.length == 4) { + o.clip && o.clip.parentNode.parentNode.removeChild(o.clip.parentNode); + var el = $("clipPath"), + rc = $("rect"); + el.id = R.createUUID(); + $(rc, { + x: rect[0], + y: rect[1], + width: rect[2], + height: rect[3] + }); + el.appendChild(rc); + o.paper.defs.appendChild(el); + $(node, {"clip-path": "url(#" + el.id + ")"}); + o.clip = rc; + } + if (!value) { + var path = node.getAttribute("clip-path"); + if (path) { + var clip = R._g.doc.getElementById(path.replace(/(^url\(#|\)$)/g, E)); + clip && clip.parentNode.removeChild(clip); + $(node, {"clip-path": E}); + delete o.clip; + } + } + break; + case "path": + if (o.type == "path") { + $(node, {d: value ? attrs.path = R._pathToAbsolute(value) : "M0,0"}); + o._.dirty = 1; + if (o._.arrows) { + "startString" in o._.arrows && addArrow(o, o._.arrows.startString); + "endString" in o._.arrows && addArrow(o, o._.arrows.endString, 1); + } + } + break; + case "width": + node.setAttribute(att, value); + o._.dirty = 1; + if (attrs.fx) { + att = "x"; + value = attrs.x; + } else { + break; + } + case "x": + if (attrs.fx) { + value = -attrs.x - (attrs.width || 0); + } + case "rx": + if (att == "rx" && o.type == "rect") { + break; + } + case "cx": + node.setAttribute(att, value); + o.pattern && updatePosition(o); + o._.dirty = 1; + break; + case "height": + node.setAttribute(att, value); + o._.dirty = 1; + if (attrs.fy) { + att = "y"; + value = attrs.y; + } else { + break; + } + case "y": + if (attrs.fy) { + value = -attrs.y - (attrs.height || 0); + } + case "ry": + if (att == "ry" && o.type == "rect") { + break; + } + case "cy": + node.setAttribute(att, value); + o.pattern && updatePosition(o); + o._.dirty = 1; + break; + case "r": + if (o.type == "rect") { + $(node, {rx: value, ry: value}); + } else { + node.setAttribute(att, value); + } + o._.dirty = 1; + break; + case "src": + if (o.type == "image") { + node.setAttributeNS(xlink, "href", value); + } + break; + case "stroke-width": + if (o._.sx != 1 || o._.sy != 1) { + value /= mmax(abs(o._.sx), abs(o._.sy)) || 1; + } + node.setAttribute(att, value); + if (attrs["stroke-dasharray"]) { + addDashes(o, attrs["stroke-dasharray"], params); + } + if (o._.arrows) { + "startString" in o._.arrows && addArrow(o, o._.arrows.startString); + "endString" in o._.arrows && addArrow(o, o._.arrows.endString, 1); + } + break; + case "stroke-dasharray": + addDashes(o, value, params); + break; + case "fill": + var isURL = Str(value).match(R._ISURL); + if (isURL) { + el = $("pattern"); + var ig = $("image"); + el.id = R.createUUID(); + $(el, {x: 0, y: 0, patternUnits: "userSpaceOnUse", height: 1, width: 1}); + $(ig, {x: 0, y: 0, "xlink:href": isURL[1]}); + el.appendChild(ig); + + (function (el) { + R._preload(isURL[1], function () { + var w = this.offsetWidth, + h = this.offsetHeight; + $(el, {width: w, height: h}); + $(ig, {width: w, height: h}); + }); + })(el); + o.paper.defs.appendChild(el); + $(node, {fill: "url(#" + el.id + ")"}); + o.pattern = el; + o.pattern && updatePosition(o); + break; + } + var clr = R.getRGB(value); + if (!clr.error) { + delete params.gradient; + delete attrs.gradient; + !R.is(attrs.opacity, "undefined") && + R.is(params.opacity, "undefined") && + $(node, {opacity: attrs.opacity}); + !R.is(attrs["fill-opacity"], "undefined") && + R.is(params["fill-opacity"], "undefined") && + $(node, {"fill-opacity": attrs["fill-opacity"]}); + } else if ((o.type == "circle" || o.type == "ellipse" || Str(value).charAt() != "r") && addGradientFill(o, value)) { + if ("opacity" in attrs || "fill-opacity" in attrs) { + var gradient = R._g.doc.getElementById(node.getAttribute("fill").replace(/^url\(#|\)$/g, E)); + if (gradient) { + var stops = gradient.getElementsByTagName("stop"); + $(stops[stops.length - 1], {"stop-opacity": ("opacity" in attrs ? attrs.opacity : 1) * ("fill-opacity" in attrs ? attrs["fill-opacity"] : 1)}); + } + } + attrs.gradient = value; + attrs.fill = "none"; + break; + } + clr[has]("opacity") && $(node, {"fill-opacity": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity}); + case "stroke": + clr = R.getRGB(value); + node.setAttribute(att, clr.hex); + att == "stroke" && clr[has]("opacity") && $(node, {"stroke-opacity": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity}); + if (att == "stroke" && o._.arrows) { + "startString" in o._.arrows && addArrow(o, o._.arrows.startString); + "endString" in o._.arrows && addArrow(o, o._.arrows.endString, 1); + } + break; + case "gradient": + (o.type == "circle" || o.type == "ellipse" || Str(value).charAt() != "r") && addGradientFill(o, value); + break; + case "opacity": + if (attrs.gradient && !attrs[has]("stroke-opacity")) { + $(node, {"stroke-opacity": value > 1 ? value / 100 : value}); + } + // fall + case "fill-opacity": + if (attrs.gradient) { + gradient = R._g.doc.getElementById(node.getAttribute("fill").replace(/^url\(#|\)$/g, E)); + if (gradient) { + stops = gradient.getElementsByTagName("stop"); + $(stops[stops.length - 1], {"stop-opacity": value}); + } + break; + } + default: + att == "font-size" && (value = toInt(value, 10) + "px"); + var cssrule = att.replace(/(\-.)/g, function (w) { + return w.substring(1).toUpperCase(); + }); + node.style[cssrule] = value; + o._.dirty = 1; + node.setAttribute(att, value); + break; + } + } + } + + tuneText(o, params); + node.style.visibility = vis; + }, + leading = 1.2, + tuneText = function (el, params) { + if (el.type != "text" || !(params[has]("text") || params[has]("font") || params[has]("font-size") || params[has]("x") || params[has]("y"))) { + return; + } + var a = el.attrs, + node = el.node, + fontSize = node.firstChild ? toInt(R._g.doc.defaultView.getComputedStyle(node.firstChild, E).getPropertyValue("font-size"), 10) : 10; + + if (params[has]("text")) { + a.text = params.text; + while (node.firstChild) { + node.removeChild(node.firstChild); + } + var texts = Str(params.text).split("\n"), + tspans = [], + tspan; + for (var i = 0, ii = texts.length; i < ii; i++) { + tspan = $("tspan"); + i && $(tspan, {dy: fontSize * leading, x: a.x}); + tspan.appendChild(R._g.doc.createTextNode(texts[i])); + node.appendChild(tspan); + tspans[i] = tspan; + } + } else { + tspans = node.getElementsByTagName("tspan"); + for (i = 0, ii = tspans.length; i < ii; i++) if (i) { + $(tspans[i], {dy: fontSize * leading, x: a.x}); + } else { + $(tspans[0], {dy: 0}); + } + } + $(node, {x: a.x, y: a.y}); + el._.dirty = 1; + var bb = el._getBBox(), + dif = a.y - (bb.y + bb.height / 2); + dif && R.is(dif, "finite") && $(tspans[0], {dy: dif}); + }, + getRealNode = function (node) { + if (node.parentNode && node.parentNode.tagName.toLowerCase() === "a") { + return node.parentNode; + } else { + return node; + } + }, + Element = function (node, svg) { + var X = 0, + Y = 0; + /*\ + * Element.node + [ property (object) ] + ** + * Gives you a reference to the DOM object, so you can assign event handlers or just mess around. + ** + * Note: Don’t mess with it. + > Usage + | // draw a circle at coordinate 10,10 with radius of 10 + | var c = paper.circle(10, 10, 10); + | c.node.onclick = function () { + | c.attr("fill", "red"); + | }; + \*/ + this[0] = this.node = node; + /*\ + * Element.raphael + [ property (object) ] + ** + * Internal reference to @Raphael object. In case it is not available. + > Usage + | Raphael.el.red = function () { + | var hsb = this.paper.raphael.rgb2hsb(this.attr("fill")); + | hsb.h = 1; + | this.attr({fill: this.paper.raphael.hsb2rgb(hsb).hex}); + | } + \*/ + node.raphael = true; + /*\ + * Element.id + [ property (number) ] + ** + * Unique id of the element. Especially useful when you want to listen to events of the element, + * because all events are fired in format `<module>.<action>.<id>`. Also useful for @Paper.getById method. + \*/ + this.id = R._oid++; + node.raphaelid = this.id; + this.matrix = R.matrix(); + this.realPath = null; + /*\ + * Element.paper + [ property (object) ] + ** + * Internal reference to “paper” where object drawn. Mainly for use in plugins and element extensions. + > Usage + | Raphael.el.cross = function () { + | this.attr({fill: "red"}); + | this.paper.path("M10,10L50,50M50,10L10,50") + | .attr({stroke: "red"}); + | } + \*/ + this.paper = svg; + this.attrs = this.attrs || {}; + this._ = { + transform: [], + sx: 1, + sy: 1, + deg: 0, + dx: 0, + dy: 0, + dirty: 1 + }; + !svg.bottom && (svg.bottom = this); + /*\ + * Element.prev + [ property (object) ] + ** + * Reference to the previous element in the hierarchy. + \*/ + this.prev = svg.top; + svg.top && (svg.top.next = this); + svg.top = this; + /*\ + * Element.next + [ property (object) ] + ** + * Reference to the next element in the hierarchy. + \*/ + this.next = null; + }, + elproto = R.el; + + Element.prototype = elproto; + elproto.constructor = Element; + + R._engine.path = function (pathString, SVG) { + var el = $("path"); + SVG.canvas && SVG.canvas.appendChild(el); + var p = new Element(el, SVG); + p.type = "path"; + setFillAndStroke(p, { + fill: "none", + stroke: "#000", + path: pathString + }); + return p; + }; + /*\ + * Element.rotate + [ method ] + ** + * Deprecated! Use @Element.transform instead. + * Adds rotation by given angle around given point to the list of + * transformations of the element. + > Parameters + - deg (number) angle in degrees + - cx (number) #optional x coordinate of the centre of rotation + - cy (number) #optional y coordinate of the centre of rotation + * If cx & cy aren’t specified centre of the shape is used as a point of rotation. + = (object) @Element + \*/ + elproto.rotate = function (deg, cx, cy) { + if (this.removed) { + return this; + } + deg = Str(deg).split(separator); + if (deg.length - 1) { + cx = toFloat(deg[1]); + cy = toFloat(deg[2]); + } + deg = toFloat(deg[0]); + (cy == null) && (cx = cy); + if (cx == null || cy == null) { + var bbox = this.getBBox(1); + cx = bbox.x + bbox.width / 2; + cy = bbox.y + bbox.height / 2; + } + this.transform(this._.transform.concat([["r", deg, cx, cy]])); + return this; + }; + /*\ + * Element.scale + [ method ] + ** + * Deprecated! Use @Element.transform instead. + * Adds scale by given amount relative to given point to the list of + * transformations of the element. + > Parameters + - sx (number) horisontal scale amount + - sy (number) vertical scale amount + - cx (number) #optional x coordinate of the centre of scale + - cy (number) #optional y coordinate of the centre of scale + * If cx & cy aren’t specified centre of the shape is used instead. + = (object) @Element + \*/ + elproto.scale = function (sx, sy, cx, cy) { + if (this.removed) { + return this; + } + sx = Str(sx).split(separator); + if (sx.length - 1) { + sy = toFloat(sx[1]); + cx = toFloat(sx[2]); + cy = toFloat(sx[3]); + } + sx = toFloat(sx[0]); + (sy == null) && (sy = sx); + (cy == null) && (cx = cy); + if (cx == null || cy == null) { + var bbox = this.getBBox(1); + } + cx = cx == null ? bbox.x + bbox.width / 2 : cx; + cy = cy == null ? bbox.y + bbox.height / 2 : cy; + this.transform(this._.transform.concat([["s", sx, sy, cx, cy]])); + return this; + }; + /*\ + * Element.translate + [ method ] + ** + * Deprecated! Use @Element.transform instead. + * Adds translation by given amount to the list of transformations of the element. + > Parameters + - dx (number) horisontal shift + - dy (number) vertical shift + = (object) @Element + \*/ + elproto.translate = function (dx, dy) { + if (this.removed) { + return this; + } + dx = Str(dx).split(separator); + if (dx.length - 1) { + dy = toFloat(dx[1]); + } + dx = toFloat(dx[0]) || 0; + dy = +dy || 0; + this.transform(this._.transform.concat([["t", dx, dy]])); + return this; + }; + /*\ + * Element.transform + [ method ] + ** + * Adds transformation to the element which is separate to other attributes, + * i.e. translation doesn’t change `x` or `y` of the rectange. The format + * of transformation string is similar to the path string syntax: + | "t100,100r30,100,100s2,2,100,100r45s1.5" + * Each letter is a command. There are four commands: `t` is for translate, `r` is for rotate, `s` is for + * scale and `m` is for matrix. + * + * There are also alternative “absolute” translation, rotation and scale: `T`, `R` and `S`. They will not take previous transformation into account. For example, `...T100,0` will always move element 100 px horisontally, while `...t100,0` could move it vertically if there is `r90` before. Just compare results of `r90t100,0` and `r90T100,0`. + * + * So, the example line above could be read like “translate by 100, 100; rotate 30° around 100, 100; scale twice around 100, 100; + * rotate 45° around centre; scale 1.5 times relative to centre”. As you can see rotate and scale commands have origin + * coordinates as optional parameters, the default is the centre point of the element. + * Matrix accepts six parameters. + > Usage + | var el = paper.rect(10, 20, 300, 200); + | // translate 100, 100, rotate 45°, translate -100, 0 + | el.transform("t100,100r45t-100,0"); + | // if you want you can append or prepend transformations + | el.transform("...t50,50"); + | el.transform("s2..."); + | // or even wrap + | el.transform("t50,50...t-50-50"); + | // to reset transformation call method with empty string + | el.transform(""); + | // to get current value call it without parameters + | console.log(el.transform()); + > Parameters + - tstr (string) #optional transformation string + * If tstr isn’t specified + = (string) current transformation string + * else + = (object) @Element + \*/ + elproto.transform = function (tstr) { + var _ = this._; + if (tstr == null) { + return _.transform; + } + R._extractTransform(this, tstr); + + this.clip && $(this.clip, {transform: this.matrix.invert()}); + this.pattern && updatePosition(this); + this.node && $(this.node, {transform: this.matrix}); + + if (_.sx != 1 || _.sy != 1) { + var sw = this.attrs[has]("stroke-width") ? this.attrs["stroke-width"] : 1; + this.attr({"stroke-width": sw}); + } + + //Reduce transform string + _.transform = this.matrix.toTransformString(); + + return this; + }; + /*\ + * Element.hide + [ method ] + ** + * Makes element invisible. See @Element.show. + = (object) @Element + \*/ + elproto.hide = function () { + if(!this.removed) this.node.style.display = "none"; + return this; + }; + /*\ + * Element.show + [ method ] + ** + * Makes element visible. See @Element.hide. + = (object) @Element + \*/ + elproto.show = function () { + if(!this.removed) this.node.style.display = ""; + return this; + }; + /*\ + * Element.remove + [ method ] + ** + * Removes element from the paper. + \*/ + elproto.remove = function () { + var node = getRealNode(this.node); + if (this.removed || !node.parentNode) { + return; + } + var paper = this.paper; + paper.__set__ && paper.__set__.exclude(this); + eve.unbind("raphael.*.*." + this.id); + if (this.gradient) { + paper.defs.removeChild(this.gradient); + } + R._tear(this, paper); + + node.parentNode.removeChild(node); + + // Remove custom data for element + this.removeData(); + + for (var i in this) { + this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null; + } + this.removed = true; + }; + elproto._getBBox = function () { + if (this.node.style.display == "none") { + this.show(); + var hide = true; + } + var canvasHidden = false, + containerStyle; + if (this.paper.canvas.parentElement) { + containerStyle = this.paper.canvas.parentElement.style; + } //IE10+ can't find parentElement + else if (this.paper.canvas.parentNode) { + containerStyle = this.paper.canvas.parentNode.style; + } + + if(containerStyle && containerStyle.display == "none") { + canvasHidden = true; + containerStyle.display = ""; + } + var bbox = {}; + try { + bbox = this.node.getBBox(); + } catch(e) { + // Firefox 3.0.x, 25.0.1 (probably more versions affected) play badly here - possible fix + bbox = { + x: this.node.clientLeft, + y: this.node.clientTop, + width: this.node.clientWidth, + height: this.node.clientHeight + } + } finally { + bbox = bbox || {}; + if(canvasHidden){ + containerStyle.display = "none"; + } + } + hide && this.hide(); + return bbox; + }; + /*\ + * Element.attr + [ method ] + ** + * Sets the attributes of the element. + > Parameters + - attrName (string) attribute’s name + - value (string) value + * or + - params (object) object of name/value pairs + * or + - attrName (string) attribute’s name + * or + - attrNames (array) in this case method returns array of current values for given attribute names + = (object) @Element if attrsName & value or params are passed in. + = (...) value of the attribute if only attrsName is passed in. + = (array) array of values of the attribute if attrsNames is passed in. + = (object) object of attributes if nothing is passed in. + > Possible parameters + # <p>Please refer to the <a href="http://www.w3.org/TR/SVG/" title="The W3C Recommendation for the SVG language describes these properties in detail.">SVG specification</a> for an explanation of these parameters.</p> + o arrow-end (string) arrowhead on the end of the path. The format for string is `<type>[-<width>[-<length>]]`. Possible types: `classic`, `block`, `open`, `oval`, `diamond`, `none`, width: `wide`, `narrow`, `medium`, length: `long`, `short`, `midium`. + o clip-rect (string) comma or space separated values: x, y, width and height + o cursor (string) CSS type of the cursor + o cx (number) the x-axis coordinate of the center of the circle, or ellipse + o cy (number) the y-axis coordinate of the center of the circle, or ellipse + o fill (string) colour, gradient or image + o fill-opacity (number) + o font (string) + o font-family (string) + o font-size (number) font size in pixels + o font-weight (string) + o height (number) + o href (string) URL, if specified element behaves as hyperlink + o opacity (number) + o path (string) SVG path string format + o r (number) radius of the circle, ellipse or rounded corner on the rect + o rx (number) horisontal radius of the ellipse + o ry (number) vertical radius of the ellipse + o src (string) image URL, only works for @Element.image element + o stroke (string) stroke colour + o stroke-dasharray (string) [“”, “none”, “`-`”, “`.`”, “`-.`”, “`-..`”, “`. `”, “`- `”, “`--`”, “`- .`”, “`--.`”, “`--..`”] + o stroke-linecap (string) [“`butt`”, “`square`”, “`round`”] + o stroke-linejoin (string) [“`bevel`”, “`round`”, “`miter`”] + o stroke-miterlimit (number) + o stroke-opacity (number) + o stroke-width (number) stroke width in pixels, default is '1' + o target (string) used with href + o text (string) contents of the text element. Use `\n` for multiline text + o text-anchor (string) [“`start`”, “`middle`”, “`end`”], default is “`middle`” + o title (string) will create tooltip with a given text + o transform (string) see @Element.transform + o width (number) + o x (number) + o y (number) + > Gradients + * Linear gradient format: “`‹angle›-‹colour›[-‹colour›[:‹offset›]]*-‹colour›`”, example: “`90-#fff-#000`” – 90° + * gradient from white to black or “`0-#fff-#f00:20-#000`” – 0° gradient from white via red (at 20%) to black. + * + * radial gradient: “`r[(‹fx›, ‹fy›)]‹colour›[-‹colour›[:‹offset›]]*-‹colour›`”, example: “`r#fff-#000`” – + * gradient from white to black or “`r(0.25, 0.75)#fff-#000`” – gradient from white to black with focus point + * at 0.25, 0.75. Focus point coordinates are in 0..1 range. Radial gradients can only be applied to circles and ellipses. + > Path String + # <p>Please refer to <a href="http://www.w3.org/TR/SVG/paths.html#PathData" title="Details of a path’s data attribute’s format are described in the SVG specification.">SVG documentation regarding path string</a>. Raphaël fully supports it.</p> + > Colour Parsing + # <ul> + # <li>Colour name (“<code>red</code>”, “<code>green</code>”, “<code>cornflowerblue</code>”, etc)</li> + # <li>#••• — shortened HTML colour: (“<code>#000</code>”, “<code>#fc0</code>”, etc)</li> + # <li>#•••••• — full length HTML colour: (“<code>#000000</code>”, “<code>#bd2300</code>”)</li> + # <li>rgb(•••, •••, •••) — red, green and blue channels’ values: (“<code>rgb(200, 100, 0)</code>”)</li> + # <li>rgb(•••%, •••%, •••%) — same as above, but in %: (“<code>rgb(100%, 175%, 0%)</code>”)</li> + # <li>rgba(•••, •••, •••, •••) — red, green and blue channels’ values: (“<code>rgba(200, 100, 0, .5)</code>”)</li> + # <li>rgba(•••%, •••%, •••%, •••%) — same as above, but in %: (“<code>rgba(100%, 175%, 0%, 50%)</code>”)</li> + # <li>hsb(•••, •••, •••) — hue, saturation and brightness values: (“<code>hsb(0.5, 0.25, 1)</code>”)</li> + # <li>hsb(•••%, •••%, •••%) — same as above, but in %</li> + # <li>hsba(•••, •••, •••, •••) — same as above, but with opacity</li> + # <li>hsl(•••, •••, •••) — almost the same as hsb, see <a href="http://en.wikipedia.org/wiki/HSL_and_HSV" title="HSL and HSV - Wikipedia, the free encyclopedia">Wikipedia page</a></li> + # <li>hsl(•••%, •••%, •••%) — same as above, but in %</li> + # <li>hsla(•••, •••, •••, •••) — same as above, but with opacity</li> + # <li>Optionally for hsb and hsl you could specify hue as a degree: “<code>hsl(240deg, 1, .5)</code>” or, if you want to go fancy, “<code>hsl(240°, 1, .5)</code>”</li> + # </ul> + \*/ + elproto.attr = function (name, value) { + if (this.removed) { + return this; + } + if (name == null) { + var res = {}; + for (var a in this.attrs) if (this.attrs[has](a)) { + res[a] = this.attrs[a]; + } + res.gradient && res.fill == "none" && (res.fill = res.gradient) && delete res.gradient; + res.transform = this._.transform; + return res; + } + if (value == null && R.is(name, "string")) { + if (name == "fill" && this.attrs.fill == "none" && this.attrs.gradient) { + return this.attrs.gradient; + } + if (name == "transform") { + return this._.transform; + } + var names = name.split(separator), + out = {}; + for (var i = 0, ii = names.length; i < ii; i++) { + name = names[i]; + if (name in this.attrs) { + out[name] = this.attrs[name]; + } else if (R.is(this.paper.customAttributes[name], "function")) { + out[name] = this.paper.customAttributes[name].def; + } else { + out[name] = R._availableAttrs[name]; + } + } + return ii - 1 ? out : out[names[0]]; + } + if (value == null && R.is(name, "array")) { + out = {}; + for (i = 0, ii = name.length; i < ii; i++) { + out[name[i]] = this.attr(name[i]); + } + return out; + } + if (value != null) { + var params = {}; + params[name] = value; + } else if (name != null && R.is(name, "object")) { + params = name; + } + for (var key in params) { + eve("raphael.attr." + key + "." + this.id, this, params[key]); + } + for (key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], "function")) { + var par = this.paper.customAttributes[key].apply(this, [].concat(params[key])); + this.attrs[key] = params[key]; + for (var subkey in par) if (par[has](subkey)) { + params[subkey] = par[subkey]; + } + } + setFillAndStroke(this, params); + return this; + }; + /*\ + * Element.toFront + [ method ] + ** + * Moves the element so it is the closest to the viewer’s eyes, on top of other elements. + = (object) @Element + \*/ + elproto.toFront = function () { + if (this.removed) { + return this; + } + var node = getRealNode(this.node); + node.parentNode.appendChild(node); + var svg = this.paper; + svg.top != this && R._tofront(this, svg); + return this; + }; + /*\ + * Element.toBack + [ method ] + ** + * Moves the element so it is the furthest from the viewer’s eyes, behind other elements. + = (object) @Element + \*/ + elproto.toBack = function () { + if (this.removed) { + return this; + } + var node = getRealNode(this.node); + var parentNode = node.parentNode; + parentNode.insertBefore(node, parentNode.firstChild); + R._toback(this, this.paper); + var svg = this.paper; + return this; + }; + /*\ + * Element.insertAfter + [ method ] + ** + * Inserts current object after the given one. + = (object) @Element + \*/ + elproto.insertAfter = function (element) { + if (this.removed || !element) { + return this; + } + + var node = getRealNode(this.node); + var afterNode = getRealNode(element.node || element[element.length - 1].node); + if (afterNode.nextSibling) { + afterNode.parentNode.insertBefore(node, afterNode.nextSibling); + } else { + afterNode.parentNode.appendChild(node); + } + R._insertafter(this, element, this.paper); + return this; + }; + /*\ + * Element.insertBefore + [ method ] + ** + * Inserts current object before the given one. + = (object) @Element + \*/ + elproto.insertBefore = function (element) { + if (this.removed || !element) { + return this; + } + + var node = getRealNode(this.node); + var beforeNode = getRealNode(element.node || element[0].node); + beforeNode.parentNode.insertBefore(node, beforeNode); + R._insertbefore(this, element, this.paper); + return this; + }; + elproto.blur = function (size) { + // Experimental. No Safari support. Use it on your own risk. + var t = this; + if (+size !== 0) { + var fltr = $("filter"), + blur = $("feGaussianBlur"); + t.attrs.blur = size; + fltr.id = R.createUUID(); + $(blur, {stdDeviation: +size || 1.5}); + fltr.appendChild(blur); + t.paper.defs.appendChild(fltr); + t._blur = fltr; + $(t.node, {filter: "url(#" + fltr.id + ")"}); + } else { + if (t._blur) { + t._blur.parentNode.removeChild(t._blur); + delete t._blur; + delete t.attrs.blur; + } + t.node.removeAttribute("filter"); + } + return t; + }; + R._engine.circle = function (svg, x, y, r) { + var el = $("circle"); + svg.canvas && svg.canvas.appendChild(el); + var res = new Element(el, svg); + res.attrs = {cx: x, cy: y, r: r, fill: "none", stroke: "#000"}; + res.type = "circle"; + $(el, res.attrs); + return res; + }; + R._engine.rect = function (svg, x, y, w, h, r) { + var el = $("rect"); + svg.canvas && svg.canvas.appendChild(el); + var res = new Element(el, svg); + res.attrs = {x: x, y: y, width: w, height: h, rx: r || 0, ry: r || 0, fill: "none", stroke: "#000"}; + res.type = "rect"; + $(el, res.attrs); + return res; + }; + R._engine.ellipse = function (svg, x, y, rx, ry) { + var el = $("ellipse"); + svg.canvas && svg.canvas.appendChild(el); + var res = new Element(el, svg); + res.attrs = {cx: x, cy: y, rx: rx, ry: ry, fill: "none", stroke: "#000"}; + res.type = "ellipse"; + $(el, res.attrs); + return res; + }; + R._engine.image = function (svg, src, x, y, w, h) { + var el = $("image"); + $(el, {x: x, y: y, width: w, height: h, preserveAspectRatio: "none"}); + el.setAttributeNS(xlink, "href", src); + svg.canvas && svg.canvas.appendChild(el); + var res = new Element(el, svg); + res.attrs = {x: x, y: y, width: w, height: h, src: src}; + res.type = "image"; + return res; + }; + R._engine.text = function (svg, x, y, text) { + var el = $("text"); + svg.canvas && svg.canvas.appendChild(el); + var res = new Element(el, svg); + res.attrs = { + x: x, + y: y, + "text-anchor": "middle", + text: text, + "font-family": R._availableAttrs["font-family"], + "font-size": R._availableAttrs["font-size"], + stroke: "none", + fill: "#000" + }; + res.type = "text"; + setFillAndStroke(res, res.attrs); + return res; + }; + R._engine.setSize = function (width, height) { + this.width = width || this.width; + this.height = height || this.height; + this.canvas.setAttribute("width", this.width); + this.canvas.setAttribute("height", this.height); + if (this._viewBox) { + this.setViewBox.apply(this, this._viewBox); + } + return this; + }; + R._engine.create = function () { + var con = R._getContainer.apply(0, arguments), + container = con && con.container, + x = con.x, + y = con.y, + width = con.width, + height = con.height; + if (!container) { + throw new Error("SVG container not found."); + } + var cnvs = $("svg"), + css = "overflow:hidden;", + isFloating; + x = x || 0; + y = y || 0; + width = width || 512; + height = height || 342; + $(cnvs, { + height: height, + version: 1.1, + width: width, + xmlns: "http://www.w3.org/2000/svg", + "xmlns:xlink": "http://www.w3.org/1999/xlink" + }); + if (container == 1) { + cnvs.style.cssText = css + "position:absolute;left:" + x + "px;top:" + y + "px"; + R._g.doc.body.appendChild(cnvs); + isFloating = 1; + } else { + cnvs.style.cssText = css + "position:relative"; + if (container.firstChild) { + container.insertBefore(cnvs, container.firstChild); + } else { + container.appendChild(cnvs); + } + } + container = new R._Paper; + container.width = width; + container.height = height; + container.canvas = cnvs; + container.clear(); + container._left = container._top = 0; + isFloating && (container.renderfix = function () {}); + container.renderfix(); + return container; + }; + R._engine.setViewBox = function (x, y, w, h, fit) { + eve("raphael.setViewBox", this, this._viewBox, [x, y, w, h, fit]); + var paperSize = this.getSize(), + size = mmax(w / paperSize.width, h / paperSize.height), + top = this.top, + aspectRatio = fit ? "xMidYMid meet" : "xMinYMin", + vb, + sw; + if (x == null) { + if (this._vbSize) { + size = 1; + } + delete this._vbSize; + vb = "0 0 " + this.width + S + this.height; + } else { + this._vbSize = size; + vb = x + S + y + S + w + S + h; + } + $(this.canvas, { + viewBox: vb, + preserveAspectRatio: aspectRatio + }); + while (size && top) { + sw = "stroke-width" in top.attrs ? top.attrs["stroke-width"] : 1; + top.attr({"stroke-width": sw}); + top._.dirty = 1; + top._.dirtyT = 1; + top = top.prev; + } + this._viewBox = [x, y, w, h, !!fit]; + return this; + }; + /*\ + * Paper.renderfix + [ method ] + ** + * Fixes the issue of Firefox and IE9 regarding subpixel rendering. If paper is dependent + * on other elements after reflow it could shift half pixel which cause for lines to lost their crispness. + * This method fixes the issue. + ** + Special thanks to Mariusz Nowak (http://www.medikoo.com/) for this method. + \*/ + R.prototype.renderfix = function () { + var cnvs = this.canvas, + s = cnvs.style, + pos; + try { + pos = cnvs.getScreenCTM() || cnvs.createSVGMatrix(); + } catch (e) { + pos = cnvs.createSVGMatrix(); + } + var left = -pos.e % 1, + top = -pos.f % 1; + if (left || top) { + if (left) { + this._left = (this._left + left) % 1; + s.left = this._left + "px"; + } + if (top) { + this._top = (this._top + top) % 1; + s.top = this._top + "px"; + } + } + }; + /*\ + * Paper.clear + [ method ] + ** + * Clears the paper, i.e. removes all the elements. + \*/ + R.prototype.clear = function () { + R.eve("raphael.clear", this); + var c = this.canvas; + while (c.firstChild) { + c.removeChild(c.firstChild); + } + this.bottom = this.top = null; + (this.desc = $("desc")).appendChild(R._g.doc.createTextNode("Created with Rapha\xebl " + R.version)); + c.appendChild(this.desc); + c.appendChild(this.defs = $("defs")); + }; + /*\ + * Paper.remove + [ method ] + ** + * Removes the paper from the DOM. + \*/ + R.prototype.remove = function () { + eve("raphael.remove", this); + this.canvas.parentNode && this.canvas.parentNode.removeChild(this.canvas); + for (var i in this) { + this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null; + } + }; + var setproto = R.st; + for (var method in elproto) if (elproto[has](method) && !setproto[has](method)) { + setproto[method] = (function (methodname) { + return function () { + var arg = arguments; + return this.forEach(function (el) { + el[methodname].apply(el, arg); + }); + }; + })(method); + } +}); diff --git a/public/bower_components/raphael/dev/raphael.vml.js b/public/bower_components/raphael/dev/raphael.vml.js new file mode 100755 index 0000000..f287632 --- /dev/null +++ b/public/bower_components/raphael/dev/raphael.vml.js @@ -0,0 +1,999 @@ +define(["./raphael.core"], function(R) { + if (R && !R.vml) { + return; + } + + var has = "hasOwnProperty", + Str = String, + toFloat = parseFloat, + math = Math, + round = math.round, + mmax = math.max, + mmin = math.min, + abs = math.abs, + fillString = "fill", + separator = /[, ]+/, + eve = R.eve, + ms = " progid:DXImageTransform.Microsoft", + S = " ", + E = "", + map = {M: "m", L: "l", C: "c", Z: "x", m: "t", l: "r", c: "v", z: "x"}, + bites = /([clmz]),?([^clmz]*)/gi, + blurregexp = / progid:\S+Blur\([^\)]+\)/g, + val = /-?[^,\s-]+/g, + cssDot = "position:absolute;left:0;top:0;width:1px;height:1px;behavior:url(#default#VML)", + zoom = 21600, + pathTypes = {path: 1, rect: 1, image: 1}, + ovalTypes = {circle: 1, ellipse: 1}, + path2vml = function (path) { + var total = /[ahqstv]/ig, + command = R._pathToAbsolute; + Str(path).match(total) && (command = R._path2curve); + total = /[clmz]/g; + if (command == R._pathToAbsolute && !Str(path).match(total)) { + var res = Str(path).replace(bites, function (all, command, args) { + var vals = [], + isMove = command.toLowerCase() == "m", + res = map[command]; + args.replace(val, function (value) { + if (isMove && vals.length == 2) { + res += vals + map[command == "m" ? "l" : "L"]; + vals = []; + } + vals.push(round(value * zoom)); + }); + return res + vals; + }); + return res; + } + var pa = command(path), p, r; + res = []; + for (var i = 0, ii = pa.length; i < ii; i++) { + p = pa[i]; + r = pa[i][0].toLowerCase(); + r == "z" && (r = "x"); + for (var j = 1, jj = p.length; j < jj; j++) { + r += round(p[j] * zoom) + (j != jj - 1 ? "," : E); + } + res.push(r); + } + return res.join(S); + }, + compensation = function (deg, dx, dy) { + var m = R.matrix(); + m.rotate(-deg, .5, .5); + return { + dx: m.x(dx, dy), + dy: m.y(dx, dy) + }; + }, + setCoords = function (p, sx, sy, dx, dy, deg) { + var _ = p._, + m = p.matrix, + fillpos = _.fillpos, + o = p.node, + s = o.style, + y = 1, + flip = "", + dxdy, + kx = zoom / sx, + ky = zoom / sy; + s.visibility = "hidden"; + if (!sx || !sy) { + return; + } + o.coordsize = abs(kx) + S + abs(ky); + s.rotation = deg * (sx * sy < 0 ? -1 : 1); + if (deg) { + var c = compensation(deg, dx, dy); + dx = c.dx; + dy = c.dy; + } + sx < 0 && (flip += "x"); + sy < 0 && (flip += " y") && (y = -1); + s.flip = flip; + o.coordorigin = (dx * -kx) + S + (dy * -ky); + if (fillpos || _.fillsize) { + var fill = o.getElementsByTagName(fillString); + fill = fill && fill[0]; + o.removeChild(fill); + if (fillpos) { + c = compensation(deg, m.x(fillpos[0], fillpos[1]), m.y(fillpos[0], fillpos[1])); + fill.position = c.dx * y + S + c.dy * y; + } + if (_.fillsize) { + fill.size = _.fillsize[0] * abs(sx) + S + _.fillsize[1] * abs(sy); + } + o.appendChild(fill); + } + s.visibility = "visible"; + }; + R.toString = function () { + return "Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\xebl " + this.version; + }; + var addArrow = function (o, value, isEnd) { + var values = Str(value).toLowerCase().split("-"), + se = isEnd ? "end" : "start", + i = values.length, + type = "classic", + w = "medium", + h = "medium"; + while (i--) { + switch (values[i]) { + case "block": + case "classic": + case "oval": + case "diamond": + case "open": + case "none": + type = values[i]; + break; + case "wide": + case "narrow": h = values[i]; break; + case "long": + case "short": w = values[i]; break; + } + } + var stroke = o.node.getElementsByTagName("stroke")[0]; + stroke[se + "arrow"] = type; + stroke[se + "arrowlength"] = w; + stroke[se + "arrowwidth"] = h; + }, + setFillAndStroke = function (o, params) { + // o.paper.canvas.style.display = "none"; + o.attrs = o.attrs || {}; + var node = o.node, + a = o.attrs, + s = node.style, + xy, + newpath = pathTypes[o.type] && (params.x != a.x || params.y != a.y || params.width != a.width || params.height != a.height || params.cx != a.cx || params.cy != a.cy || params.rx != a.rx || params.ry != a.ry || params.r != a.r), + isOval = ovalTypes[o.type] && (a.cx != params.cx || a.cy != params.cy || a.r != params.r || a.rx != params.rx || a.ry != params.ry), + res = o; + + + for (var par in params) if (params[has](par)) { + a[par] = params[par]; + } + if (newpath) { + a.path = R._getPath[o.type](o); + o._.dirty = 1; + } + params.href && (node.href = params.href); + params.title && (node.title = params.title); + params.target && (node.target = params.target); + params.cursor && (s.cursor = params.cursor); + "blur" in params && o.blur(params.blur); + if (params.path && o.type == "path" || newpath) { + node.path = path2vml(~Str(a.path).toLowerCase().indexOf("r") ? R._pathToAbsolute(a.path) : a.path); + o._.dirty = 1; + if (o.type == "image") { + o._.fillpos = [a.x, a.y]; + o._.fillsize = [a.width, a.height]; + setCoords(o, 1, 1, 0, 0, 0); + } + } + "transform" in params && o.transform(params.transform); + if (isOval) { + var cx = +a.cx, + cy = +a.cy, + rx = +a.rx || +a.r || 0, + ry = +a.ry || +a.r || 0; + node.path = R.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x", round((cx - rx) * zoom), round((cy - ry) * zoom), round((cx + rx) * zoom), round((cy + ry) * zoom), round(cx * zoom)); + o._.dirty = 1; + } + if ("clip-rect" in params) { + var rect = Str(params["clip-rect"]).split(separator); + if (rect.length == 4) { + rect[2] = +rect[2] + (+rect[0]); + rect[3] = +rect[3] + (+rect[1]); + var div = node.clipRect || R._g.doc.createElement("div"), + dstyle = div.style; + dstyle.clip = R.format("rect({1}px {2}px {3}px {0}px)", rect); + if (!node.clipRect) { + dstyle.position = "absolute"; + dstyle.top = 0; + dstyle.left = 0; + dstyle.width = o.paper.width + "px"; + dstyle.height = o.paper.height + "px"; + node.parentNode.insertBefore(div, node); + div.appendChild(node); + node.clipRect = div; + } + } + if (!params["clip-rect"]) { + node.clipRect && (node.clipRect.style.clip = "auto"); + } + } + if (o.textpath) { + var textpathStyle = o.textpath.style; + params.font && (textpathStyle.font = params.font); + params["font-family"] && (textpathStyle.fontFamily = '"' + params["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g, E) + '"'); + params["font-size"] && (textpathStyle.fontSize = params["font-size"]); + params["font-weight"] && (textpathStyle.fontWeight = params["font-weight"]); + params["font-style"] && (textpathStyle.fontStyle = params["font-style"]); + } + if ("arrow-start" in params) { + addArrow(res, params["arrow-start"]); + } + if ("arrow-end" in params) { + addArrow(res, params["arrow-end"], 1); + } + if (params.opacity != null || + params.fill != null || + params.src != null || + params.stroke != null || + params["stroke-width"] != null || + params["stroke-opacity"] != null || + params["fill-opacity"] != null || + params["stroke-dasharray"] != null || + params["stroke-miterlimit"] != null || + params["stroke-linejoin"] != null || + params["stroke-linecap"] != null) { + var fill = node.getElementsByTagName(fillString), + newfill = false; + fill = fill && fill[0]; + !fill && (newfill = fill = createNode(fillString)); + if (o.type == "image" && params.src) { + fill.src = params.src; + } + params.fill && (fill.on = true); + if (fill.on == null || params.fill == "none" || params.fill === null) { + fill.on = false; + } + if (fill.on && params.fill) { + var isURL = Str(params.fill).match(R._ISURL); + if (isURL) { + fill.parentNode == node && node.removeChild(fill); + fill.rotate = true; + fill.src = isURL[1]; + fill.type = "tile"; + var bbox = o.getBBox(1); + fill.position = bbox.x + S + bbox.y; + o._.fillpos = [bbox.x, bbox.y]; + + R._preload(isURL[1], function () { + o._.fillsize = [this.offsetWidth, this.offsetHeight]; + }); + } else { + fill.color = R.getRGB(params.fill).hex; + fill.src = E; + fill.type = "solid"; + if (R.getRGB(params.fill).error && (res.type in {circle: 1, ellipse: 1} || Str(params.fill).charAt() != "r") && addGradientFill(res, params.fill, fill)) { + a.fill = "none"; + a.gradient = params.fill; + fill.rotate = false; + } + } + } + if ("fill-opacity" in params || "opacity" in params) { + var opacity = ((+a["fill-opacity"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+R.getRGB(params.fill).o + 1 || 2) - 1); + opacity = mmin(mmax(opacity, 0), 1); + fill.opacity = opacity; + if (fill.src) { + fill.color = "none"; + } + } + node.appendChild(fill); + var stroke = (node.getElementsByTagName("stroke") && node.getElementsByTagName("stroke")[0]), + newstroke = false; + !stroke && (newstroke = stroke = createNode("stroke")); + if ((params.stroke && params.stroke != "none") || + params["stroke-width"] || + params["stroke-opacity"] != null || + params["stroke-dasharray"] || + params["stroke-miterlimit"] || + params["stroke-linejoin"] || + params["stroke-linecap"]) { + stroke.on = true; + } + (params.stroke == "none" || params.stroke === null || stroke.on == null || params.stroke == 0 || params["stroke-width"] == 0) && (stroke.on = false); + var strokeColor = R.getRGB(params.stroke); + stroke.on && params.stroke && (stroke.color = strokeColor.hex); + opacity = ((+a["stroke-opacity"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+strokeColor.o + 1 || 2) - 1); + var width = (toFloat(params["stroke-width"]) || 1) * .75; + opacity = mmin(mmax(opacity, 0), 1); + params["stroke-width"] == null && (width = a["stroke-width"]); + params["stroke-width"] && (stroke.weight = width); + width && width < 1 && (opacity *= width) && (stroke.weight = 1); + stroke.opacity = opacity; + + params["stroke-linejoin"] && (stroke.joinstyle = params["stroke-linejoin"] || "miter"); + stroke.miterlimit = params["stroke-miterlimit"] || 8; + params["stroke-linecap"] && (stroke.endcap = params["stroke-linecap"] == "butt" ? "flat" : params["stroke-linecap"] == "square" ? "square" : "round"); + if ("stroke-dasharray" in params) { + var dasharray = { + "-": "shortdash", + ".": "shortdot", + "-.": "shortdashdot", + "-..": "shortdashdotdot", + ". ": "dot", + "- ": "dash", + "--": "longdash", + "- .": "dashdot", + "--.": "longdashdot", + "--..": "longdashdotdot" + }; + stroke.dashstyle = dasharray[has](params["stroke-dasharray"]) ? dasharray[params["stroke-dasharray"]] : E; + } + newstroke && node.appendChild(stroke); + } + if (res.type == "text") { + res.paper.canvas.style.display = E; + var span = res.paper.span, + m = 100, + fontSize = a.font && a.font.match(/\d+(?:\.\d*)?(?=px)/); + s = span.style; + a.font && (s.font = a.font); + a["font-family"] && (s.fontFamily = a["font-family"]); + a["font-weight"] && (s.fontWeight = a["font-weight"]); + a["font-style"] && (s.fontStyle = a["font-style"]); + fontSize = toFloat(a["font-size"] || fontSize && fontSize[0]) || 10; + s.fontSize = fontSize * m + "px"; + res.textpath.string && (span.innerHTML = Str(res.textpath.string).replace(/</g, "<").replace(/&/g, "&").replace(/\n/g, "<br>")); + var brect = span.getBoundingClientRect(); + res.W = a.w = (brect.right - brect.left) / m; + res.H = a.h = (brect.bottom - brect.top) / m; + // res.paper.canvas.style.display = "none"; + res.X = a.x; + res.Y = a.y + res.H / 2; + + ("x" in params || "y" in params) && (res.path.v = R.format("m{0},{1}l{2},{1}", round(a.x * zoom), round(a.y * zoom), round(a.x * zoom) + 1)); + var dirtyattrs = ["x", "y", "text", "font", "font-family", "font-weight", "font-style", "font-size"]; + for (var d = 0, dd = dirtyattrs.length; d < dd; d++) if (dirtyattrs[d] in params) { + res._.dirty = 1; + break; + } + + // text-anchor emulation + switch (a["text-anchor"]) { + case "start": + res.textpath.style["v-text-align"] = "left"; + res.bbx = res.W / 2; + break; + case "end": + res.textpath.style["v-text-align"] = "right"; + res.bbx = -res.W / 2; + break; + default: + res.textpath.style["v-text-align"] = "center"; + res.bbx = 0; + break; + } + res.textpath.style["v-text-kern"] = true; + } + // res.paper.canvas.style.display = E; + }, + addGradientFill = function (o, gradient, fill) { + o.attrs = o.attrs || {}; + var attrs = o.attrs, + pow = Math.pow, + opacity, + oindex, + type = "linear", + fxfy = ".5 .5"; + o.attrs.gradient = gradient; + gradient = Str(gradient).replace(R._radial_gradient, function (all, fx, fy) { + type = "radial"; + if (fx && fy) { + fx = toFloat(fx); + fy = toFloat(fy); + pow(fx - .5, 2) + pow(fy - .5, 2) > .25 && (fy = math.sqrt(.25 - pow(fx - .5, 2)) * ((fy > .5) * 2 - 1) + .5); + fxfy = fx + S + fy; + } + return E; + }); + gradient = gradient.split(/\s*\-\s*/); + if (type == "linear") { + var angle = gradient.shift(); + angle = -toFloat(angle); + if (isNaN(angle)) { + return null; + } + } + var dots = R._parseDots(gradient); + if (!dots) { + return null; + } + o = o.shape || o.node; + if (dots.length) { + o.removeChild(fill); + fill.on = true; + fill.method = "none"; + fill.color = dots[0].color; + fill.color2 = dots[dots.length - 1].color; + var clrs = []; + for (var i = 0, ii = dots.length; i < ii; i++) { + dots[i].offset && clrs.push(dots[i].offset + S + dots[i].color); + } + fill.colors = clrs.length ? clrs.join() : "0% " + fill.color; + if (type == "radial") { + fill.type = "gradientTitle"; + fill.focus = "100%"; + fill.focussize = "0 0"; + fill.focusposition = fxfy; + fill.angle = 0; + } else { + // fill.rotate= true; + fill.type = "gradient"; + fill.angle = (270 - angle) % 360; + } + o.appendChild(fill); + } + return 1; + }, + Element = function (node, vml) { + this[0] = this.node = node; + node.raphael = true; + this.id = R._oid++; + node.raphaelid = this.id; + this.X = 0; + this.Y = 0; + this.attrs = {}; + this.paper = vml; + this.matrix = R.matrix(); + this._ = { + transform: [], + sx: 1, + sy: 1, + dx: 0, + dy: 0, + deg: 0, + dirty: 1, + dirtyT: 1 + }; + !vml.bottom && (vml.bottom = this); + this.prev = vml.top; + vml.top && (vml.top.next = this); + vml.top = this; + this.next = null; + }; + var elproto = R.el; + + Element.prototype = elproto; + elproto.constructor = Element; + elproto.transform = function (tstr) { + if (tstr == null) { + return this._.transform; + } + var vbs = this.paper._viewBoxShift, + vbt = vbs ? "s" + [vbs.scale, vbs.scale] + "-1-1t" + [vbs.dx, vbs.dy] : E, + oldt; + if (vbs) { + oldt = tstr = Str(tstr).replace(/\.{3}|\u2026/g, this._.transform || E); + } + R._extractTransform(this, vbt + tstr); + var matrix = this.matrix.clone(), + skew = this.skew, + o = this.node, + split, + isGrad = ~Str(this.attrs.fill).indexOf("-"), + isPatt = !Str(this.attrs.fill).indexOf("url("); + matrix.translate(1, 1); + if (isPatt || isGrad || this.type == "image") { + skew.matrix = "1 0 0 1"; + skew.offset = "0 0"; + split = matrix.split(); + if ((isGrad && split.noRotation) || !split.isSimple) { + o.style.filter = matrix.toFilter(); + var bb = this.getBBox(), + bbt = this.getBBox(1), + dx = bb.x - bbt.x, + dy = bb.y - bbt.y; + o.coordorigin = (dx * -zoom) + S + (dy * -zoom); + setCoords(this, 1, 1, dx, dy, 0); + } else { + o.style.filter = E; + setCoords(this, split.scalex, split.scaley, split.dx, split.dy, split.rotate); + } + } else { + o.style.filter = E; + skew.matrix = Str(matrix); + skew.offset = matrix.offset(); + } + if (oldt !== null) { // empty string value is true as well + this._.transform = oldt; + R._extractTransform(this, oldt); + } + return this; + }; + elproto.rotate = function (deg, cx, cy) { + if (this.removed) { + return this; + } + if (deg == null) { + return; + } + deg = Str(deg).split(separator); + if (deg.length - 1) { + cx = toFloat(deg[1]); + cy = toFloat(deg[2]); + } + deg = toFloat(deg[0]); + (cy == null) && (cx = cy); + if (cx == null || cy == null) { + var bbox = this.getBBox(1); + cx = bbox.x + bbox.width / 2; + cy = bbox.y + bbox.height / 2; + } + this._.dirtyT = 1; + this.transform(this._.transform.concat([["r", deg, cx, cy]])); + return this; + }; + elproto.translate = function (dx, dy) { + if (this.removed) { + return this; + } + dx = Str(dx).split(separator); + if (dx.length - 1) { + dy = toFloat(dx[1]); + } + dx = toFloat(dx[0]) || 0; + dy = +dy || 0; + if (this._.bbox) { + this._.bbox.x += dx; + this._.bbox.y += dy; + } + this.transform(this._.transform.concat([["t", dx, dy]])); + return this; + }; + elproto.scale = function (sx, sy, cx, cy) { + if (this.removed) { + return this; + } + sx = Str(sx).split(separator); + if (sx.length - 1) { + sy = toFloat(sx[1]); + cx = toFloat(sx[2]); + cy = toFloat(sx[3]); + isNaN(cx) && (cx = null); + isNaN(cy) && (cy = null); + } + sx = toFloat(sx[0]); + (sy == null) && (sy = sx); + (cy == null) && (cx = cy); + if (cx == null || cy == null) { + var bbox = this.getBBox(1); + } + cx = cx == null ? bbox.x + bbox.width / 2 : cx; + cy = cy == null ? bbox.y + bbox.height / 2 : cy; + + this.transform(this._.transform.concat([["s", sx, sy, cx, cy]])); + this._.dirtyT = 1; + return this; + }; + elproto.hide = function () { + !this.removed && (this.node.style.display = "none"); + return this; + }; + elproto.show = function () { + !this.removed && (this.node.style.display = E); + return this; + }; + // Needed to fix the vml setViewBox issues + elproto.auxGetBBox = R.el.getBBox; + elproto.getBBox = function(){ + var b = this.auxGetBBox(); + if (this.paper && this.paper._viewBoxShift) + { + var c = {}; + var z = 1/this.paper._viewBoxShift.scale; + c.x = b.x - this.paper._viewBoxShift.dx; + c.x *= z; + c.y = b.y - this.paper._viewBoxShift.dy; + c.y *= z; + c.width = b.width * z; + c.height = b.height * z; + c.x2 = c.x + c.width; + c.y2 = c.y + c.height; + return c; + } + return b; + }; + elproto._getBBox = function () { + if (this.removed) { + return {}; + } + return { + x: this.X + (this.bbx || 0) - this.W / 2, + y: this.Y - this.H, + width: this.W, + height: this.H + }; + }; + elproto.remove = function () { + if (this.removed || !this.node.parentNode) { + return; + } + this.paper.__set__ && this.paper.__set__.exclude(this); + R.eve.unbind("raphael.*.*." + this.id); + R._tear(this, this.paper); + this.node.parentNode.removeChild(this.node); + this.shape && this.shape.parentNode.removeChild(this.shape); + for (var i in this) { + this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null; + } + this.removed = true; + }; + elproto.attr = function (name, value) { + if (this.removed) { + return this; + } + if (name == null) { + var res = {}; + for (var a in this.attrs) if (this.attrs[has](a)) { + res[a] = this.attrs[a]; + } + res.gradient && res.fill == "none" && (res.fill = res.gradient) && delete res.gradient; + res.transform = this._.transform; + return res; + } + if (value == null && R.is(name, "string")) { + if (name == fillString && this.attrs.fill == "none" && this.attrs.gradient) { + return this.attrs.gradient; + } + var names = name.split(separator), + out = {}; + for (var i = 0, ii = names.length; i < ii; i++) { + name = names[i]; + if (name in this.attrs) { + out[name] = this.attrs[name]; + } else if (R.is(this.paper.customAttributes[name], "function")) { + out[name] = this.paper.customAttributes[name].def; + } else { + out[name] = R._availableAttrs[name]; + } + } + return ii - 1 ? out : out[names[0]]; + } + if (this.attrs && value == null && R.is(name, "array")) { + out = {}; + for (i = 0, ii = name.length; i < ii; i++) { + out[name[i]] = this.attr(name[i]); + } + return out; + } + var params; + if (value != null) { + params = {}; + params[name] = value; + } + value == null && R.is(name, "object") && (params = name); + for (var key in params) { + eve("raphael.attr." + key + "." + this.id, this, params[key]); + } + if (params) { + for (key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], "function")) { + var par = this.paper.customAttributes[key].apply(this, [].concat(params[key])); + this.attrs[key] = params[key]; + for (var subkey in par) if (par[has](subkey)) { + params[subkey] = par[subkey]; + } + } + // this.paper.canvas.style.display = "none"; + if (params.text && this.type == "text") { + this.textpath.string = params.text; + } + setFillAndStroke(this, params); + // this.paper.canvas.style.display = E; + } + return this; + }; + elproto.toFront = function () { + !this.removed && this.node.parentNode.appendChild(this.node); + this.paper && this.paper.top != this && R._tofront(this, this.paper); + return this; + }; + elproto.toBack = function () { + if (this.removed) { + return this; + } + if (this.node.parentNode.firstChild != this.node) { + this.node.parentNode.insertBefore(this.node, this.node.parentNode.firstChild); + R._toback(this, this.paper); + } + return this; + }; + elproto.insertAfter = function (element) { + if (this.removed) { + return this; + } + if (element.constructor == R.st.constructor) { + element = element[element.length - 1]; + } + if (element.node.nextSibling) { + element.node.parentNode.insertBefore(this.node, element.node.nextSibling); + } else { + element.node.parentNode.appendChild(this.node); + } + R._insertafter(this, element, this.paper); + return this; + }; + elproto.insertBefore = function (element) { + if (this.removed) { + return this; + } + if (element.constructor == R.st.constructor) { + element = element[0]; + } + element.node.parentNode.insertBefore(this.node, element.node); + R._insertbefore(this, element, this.paper); + return this; + }; + elproto.blur = function (size) { + var s = this.node.runtimeStyle, + f = s.filter; + f = f.replace(blurregexp, E); + if (+size !== 0) { + this.attrs.blur = size; + s.filter = f + S + ms + ".Blur(pixelradius=" + (+size || 1.5) + ")"; + s.margin = R.format("-{0}px 0 0 -{0}px", round(+size || 1.5)); + } else { + s.filter = f; + s.margin = 0; + delete this.attrs.blur; + } + return this; + }; + + R._engine.path = function (pathString, vml) { + var el = createNode("shape"); + el.style.cssText = cssDot; + el.coordsize = zoom + S + zoom; + el.coordorigin = vml.coordorigin; + var p = new Element(el, vml), + attr = {fill: "none", stroke: "#000"}; + pathString && (attr.path = pathString); + p.type = "path"; + p.path = []; + p.Path = E; + setFillAndStroke(p, attr); + vml.canvas && vml.canvas.appendChild(el); + var skew = createNode("skew"); + skew.on = true; + el.appendChild(skew); + p.skew = skew; + p.transform(E); + return p; + }; + R._engine.rect = function (vml, x, y, w, h, r) { + var path = R._rectPath(x, y, w, h, r), + res = vml.path(path), + a = res.attrs; + res.X = a.x = x; + res.Y = a.y = y; + res.W = a.width = w; + res.H = a.height = h; + a.r = r; + a.path = path; + res.type = "rect"; + return res; + }; + R._engine.ellipse = function (vml, x, y, rx, ry) { + var res = vml.path(), + a = res.attrs; + res.X = x - rx; + res.Y = y - ry; + res.W = rx * 2; + res.H = ry * 2; + res.type = "ellipse"; + setFillAndStroke(res, { + cx: x, + cy: y, + rx: rx, + ry: ry + }); + return res; + }; + R._engine.circle = function (vml, x, y, r) { + var res = vml.path(), + a = res.attrs; + res.X = x - r; + res.Y = y - r; + res.W = res.H = r * 2; + res.type = "circle"; + setFillAndStroke(res, { + cx: x, + cy: y, + r: r + }); + return res; + }; + R._engine.image = function (vml, src, x, y, w, h) { + var path = R._rectPath(x, y, w, h), + res = vml.path(path).attr({stroke: "none"}), + a = res.attrs, + node = res.node, + fill = node.getElementsByTagName(fillString)[0]; + a.src = src; + res.X = a.x = x; + res.Y = a.y = y; + res.W = a.width = w; + res.H = a.height = h; + a.path = path; + res.type = "image"; + fill.parentNode == node && node.removeChild(fill); + fill.rotate = true; + fill.src = src; + fill.type = "tile"; + res._.fillpos = [x, y]; + res._.fillsize = [w, h]; + node.appendChild(fill); + setCoords(res, 1, 1, 0, 0, 0); + return res; + }; + R._engine.text = function (vml, x, y, text) { + var el = createNode("shape"), + path = createNode("path"), + o = createNode("textpath"); + x = x || 0; + y = y || 0; + text = text || ""; + path.v = R.format("m{0},{1}l{2},{1}", round(x * zoom), round(y * zoom), round(x * zoom) + 1); + path.textpathok = true; + o.string = Str(text); + o.on = true; + el.style.cssText = cssDot; + el.coordsize = zoom + S + zoom; + el.coordorigin = "0 0"; + var p = new Element(el, vml), + attr = { + fill: "#000", + stroke: "none", + font: R._availableAttrs.font, + text: text + }; + p.shape = el; + p.path = path; + p.textpath = o; + p.type = "text"; + p.attrs.text = Str(text); + p.attrs.x = x; + p.attrs.y = y; + p.attrs.w = 1; + p.attrs.h = 1; + setFillAndStroke(p, attr); + el.appendChild(o); + el.appendChild(path); + vml.canvas.appendChild(el); + var skew = createNode("skew"); + skew.on = true; + el.appendChild(skew); + p.skew = skew; + p.transform(E); + return p; + }; + R._engine.setSize = function (width, height) { + var cs = this.canvas.style; + this.width = width; + this.height = height; + width == +width && (width += "px"); + height == +height && (height += "px"); + cs.width = width; + cs.height = height; + cs.clip = "rect(0 " + width + " " + height + " 0)"; + if (this._viewBox) { + R._engine.setViewBox.apply(this, this._viewBox); + } + return this; + }; + R._engine.setViewBox = function (x, y, w, h, fit) { + R.eve("raphael.setViewBox", this, this._viewBox, [x, y, w, h, fit]); + var paperSize = this.getSize(), + width = paperSize.width, + height = paperSize.height, + H, W; + if (fit) { + H = height / h; + W = width / w; + if (w * H < width) { + x -= (width - w * H) / 2 / H; + } + if (h * W < height) { + y -= (height - h * W) / 2 / W; + } + } + this._viewBox = [x, y, w, h, !!fit]; + this._viewBoxShift = { + dx: -x, + dy: -y, + scale: paperSize + }; + this.forEach(function (el) { + el.transform("..."); + }); + return this; + }; + var createNode; + R._engine.initWin = function (win) { + var doc = win.document; + if (doc.styleSheets.length < 31) { + doc.createStyleSheet().addRule(".rvml", "behavior:url(#default#VML)"); + } else { + // no more room, add to the existing one + // http://msdn.microsoft.com/en-us/library/ms531194%28VS.85%29.aspx + doc.styleSheets[0].addRule(".rvml", "behavior:url(#default#VML)"); + } + try { + !doc.namespaces.rvml && doc.namespaces.add("rvml", "urn:schemas-microsoft-com:vml"); + createNode = function (tagName) { + return doc.createElement('<rvml:' + tagName + ' class="rvml">'); + }; + } catch (e) { + createNode = function (tagName) { + return doc.createElement('<' + tagName + ' xmlns="urn:schemas-microsoft.com:vml" class="rvml">'); + }; + } + }; + R._engine.initWin(R._g.win); + R._engine.create = function () { + var con = R._getContainer.apply(0, arguments), + container = con.container, + height = con.height, + s, + width = con.width, + x = con.x, + y = con.y; + if (!container) { + throw new Error("VML container not found."); + } + var res = new R._Paper, + c = res.canvas = R._g.doc.createElement("div"), + cs = c.style; + x = x || 0; + y = y || 0; + width = width || 512; + height = height || 342; + res.width = width; + res.height = height; + width == +width && (width += "px"); + height == +height && (height += "px"); + res.coordsize = zoom * 1e3 + S + zoom * 1e3; + res.coordorigin = "0 0"; + res.span = R._g.doc.createElement("span"); + res.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;"; + c.appendChild(res.span); + cs.cssText = R.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden", width, height); + if (container == 1) { + R._g.doc.body.appendChild(c); + cs.left = x + "px"; + cs.top = y + "px"; + cs.position = "absolute"; + } else { + if (container.firstChild) { + container.insertBefore(c, container.firstChild); + } else { + container.appendChild(c); + } + } + res.renderfix = function () {}; + return res; + }; + R.prototype.clear = function () { + R.eve("raphael.clear", this); + this.canvas.innerHTML = E; + this.span = R._g.doc.createElement("span"); + this.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;"; + this.canvas.appendChild(this.span); + this.bottom = this.top = null; + }; + R.prototype.remove = function () { + R.eve("raphael.remove", this); + this.canvas.parentNode.removeChild(this.canvas); + for (var i in this) { + this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null; + } + return true; + }; + + var setproto = R.st; + for (var method in elproto) if (elproto[has](method) && !setproto[has](method)) { + setproto[method] = (function (methodname) { + return function () { + var arg = arguments; + return this.forEach(function (el) { + el[methodname].apply(el, arg); + }); + }; + })(method); + } +}); diff --git a/public/bower_components/raphael/dev/test/svg/dom.js b/public/bower_components/raphael/dev/test/svg/dom.js new file mode 100755 index 0000000..7b61774 --- /dev/null +++ b/public/bower_components/raphael/dev/test/svg/dom.js @@ -0,0 +1,295 @@ +(function() { + +var paper, + url = 'http://raphaeljs.com'; + +module('DOM', { + setup: function() { + paper = new Raphael(document.getElementById('qunit-fixture'), 1000, 1000); + }, + teardown: function() { + paper.remove(); + } +}); + +var equalNodePosition = function(node, expectedParent, expectedPreviousSibling, expectedNextSibling) { + equal(node.parentNode, expectedParent); + equal(node.previousSibling, expectedPreviousSibling); + equal(node.nextSibling, expectedNextSibling); +}; + +var equalNodePositionWrapped = function(node, anchor, expectedParent, expectedPreviousSibling, expectedNextSibling) { + equal(node.parentNode, anchor); + equalNodePosition(anchor, expectedParent, expectedPreviousSibling, expectedNextSibling); +}; + +// Element#insertBefore +// -------------------- + +test('insertBefore: no element', function() { + var el = paper.rect(); + + el.insertBefore(null); + + equalNodePosition(el.node, paper.canvas, paper.defs, null); +}); + +test('insertBefore: first element', function() { + var x = paper.rect(); + var el = paper.rect(); + + el.insertBefore(x); + + equalNodePosition(el.node, paper.canvas, paper.defs, x.node); +}); + +test('insertBefore: middle element', function() { + var x = paper.rect(); + var y = paper.rect(); + var el = paper.rect(); + + el.insertBefore(y); + + equalNodePosition(el.node, paper.canvas, x.node, y.node); +}); + +test('insertBefore: no element when wrapped in <a>', function() { + var el = paper.rect().attr('href', url), + anchor = el.node.parentNode; + + el.insertBefore(null); + + equalNodePositionWrapped(el.node, anchor, paper.canvas, paper.defs, null); +}); + +test('insertBefore: first element when wrapped in <a>', function() { + var x = paper.rect(); + var el = paper.rect().attr('href', url), + anchor = el.node.parentNode; + + el.insertBefore(x); + + equalNodePositionWrapped(el.node, anchor, paper.canvas, paper.defs, x.node); +}); + +test('insertBefore: first element wrapped in <a> and wrapped in <a>', function() { + var x = paper.rect().attr('href', url), + xAnchor = x.node.parentNode; + var el = paper.rect().attr('href', url), + anchor = el.node.parentNode; + + el.insertBefore(x); + + equalNodePositionWrapped(el.node, anchor, paper.canvas, paper.defs, xAnchor); +}); + +test('insertBefore: middle element when wrapped in <a>', function() { + var x = paper.rect(); + var y = paper.rect(); + var el = paper.rect().attr('href', url), + anchor = el.node.parentNode; + + el.insertBefore(y); + + equalNodePositionWrapped(el.node, anchor, paper.canvas, x.node, y.node); +}); + +test('insertBefore: middle element wrapped in <a> and wrapped in <a>', function() { + var x = paper.rect().attr('href', url), + xAnchor = x.node.parentNode; + var y = paper.rect().attr('href', url), + yAnchor = y.node.parentNode; + var el = paper.rect().attr('href', url), + anchor = el.node.parentNode; + + el.insertBefore(y); + + equalNodePositionWrapped(el.node, anchor, paper.canvas, xAnchor, yAnchor); +}); + +// TODO... +// insertBefore: with set +// insertBefore: with nested set. + +// Element#insertAfter +// ------------------- + +test('insertAfter: no element', function() { + var el = paper.rect(); + + el.insertAfter(null); + + equalNodePosition(el.node, paper.canvas, paper.defs, null); +}); + +test('insertAfter: last element', function() { + var x = paper.rect(); + var el = paper.rect(); + + el.insertAfter(x); + + equalNodePosition(el.node, paper.canvas, x.node, null); +}); + +test('insertAfter: middle element', function() { + var x = paper.rect(); + var y = paper.rect(); + var el = paper.rect(); + + el.insertAfter(x); + + equalNodePosition(el.node, paper.canvas, x.node, y.node); +}); + +test('insertAfter: no element when wrapped in <a>', function() { + var el = paper.rect().attr('href', url), + anchor = el.node.parentNode; + + el.insertAfter(null); + + equalNodePositionWrapped(el.node, anchor, paper.canvas, paper.defs, null); +}); + +test('insertAfter: last element when wrapped in <a>', function() { + var x = paper.rect(); + var el = paper.rect().attr('href', url), + anchor = el.node.parentNode; + + el.insertAfter(x); + + equalNodePositionWrapped(el.node, anchor, paper.canvas, x.node, null); +}); + +test('insertAfter: last element wrapped in <a> and wrapped in <a>', function() { + var x = paper.rect().attr('href', url), + xAnchor = x.node.parentNode; + var el = paper.rect().attr('href', url), + anchor = el.node.parentNode; + + el.insertAfter(x); + + equalNodePositionWrapped(el.node, anchor, paper.canvas, xAnchor, null); +}); + +test('insertAfter: middle element when wrapped in <a>', function() { + var x = paper.rect(); + var y = paper.rect(); + var el = paper.rect().attr('href', url), + anchor = el.node.parentNode; + + el.insertAfter(x); + + equalNodePositionWrapped(el.node, anchor, paper.canvas, x.node, y.node); +}); + +test('insertAfter: middle element wrapped in <a> and wrapped in <a>', function() { + var x = paper.rect().attr('href', url), + xAnchor = x.node.parentNode; + var y = paper.rect().attr('href', url), + yAnchor = y.node.parentNode; + var el = paper.rect().attr('href', url), + anchor = el.node.parentNode; + + el.insertAfter(x); + + equalNodePositionWrapped(el.node, anchor, paper.canvas, xAnchor, yAnchor); +}); + +// TODO... +// insertAfter: with set +// insertAfter: with nested set. + +// Element#remove +// -------------- + +test('remove: after added', function() { + var el = paper.rect(), + node = el.node; + + el.remove(); + + equal(el.node, null); + equal(node.parentNode, null); +}); + +test('remove: when wrapped in <a>', function() { + var el = paper.rect().attr('href', url), + node = el.node, + anchor = node.parentNode; + + el.remove(); + + equal(el.node, null); + equal(node.parentNode, anchor); + equal(anchor.parentNode, null); +}); + +test('remove: when already removed', function() { + var el = paper.rect(), + node = el.node; + + el.remove(); + el.remove(); + + equal(el.node, null); + equal(node.parentNode, null); +}); + +test('remove: when the canvas is removed', function() { + var el = paper.rect(), + node = el.node; + + paper.remove(); + el.remove(); + + equal(el.node, null); + equal(node.parentNode, null); +}); + +// Element#toFront +// -------------- + +test('toFront: normal', function() { + var el = paper.rect(); + var x = paper.rect(); + + el.toFront(); + + equalNodePosition(el.node, paper.canvas, x.node, null); +}); + +test('toFront: when wrapped in <a>', function() { + var el = paper.rect().attr('href', url), + anchor = el.node.parentNode; + var x = paper.rect(); + + el.toFront(); + + equalNodePositionWrapped(el.node, anchor, paper.canvas, x.node, null); +}); + +// Element#toBack +// -------------- + +test('toBack: normal', function() { + var x = paper.rect(); + var el = paper.rect(); + + el.toBack(); + + equalNodePosition(el.node, paper.canvas, null, paper.desc); + equalNodePosition(x.node, paper.canvas, paper.defs, null); +}); + +test('toBack: when wrapped in <a>', function() { + var x = paper.rect(); + var el = paper.rect().attr('href', url), + anchor = el.node.parentNode; + + el.toBack(); + + equalNodePositionWrapped(el.node, anchor, paper.canvas, null, paper.desc); + equalNodePosition(x.node, paper.canvas, paper.defs, null); +}); + +})(); \ No newline at end of file diff --git a/public/bower_components/raphael/dev/test/vml/dom.js b/public/bower_components/raphael/dev/test/vml/dom.js new file mode 100755 index 0000000..ba41ea6 --- /dev/null +++ b/public/bower_components/raphael/dev/test/vml/dom.js @@ -0,0 +1,5 @@ +(function() { + +module('DOM'); + +})(); \ No newline at end of file diff --git a/public/bower_components/raphael/license.txt b/public/bower_components/raphael/license.txt new file mode 100755 index 0000000..479afcb --- /dev/null +++ b/public/bower_components/raphael/license.txt @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2008-2010 Dmitry Baranovskiy + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/public/bower_components/raphael/raphael.js b/public/bower_components/raphael/raphael.js new file mode 100755 index 0000000..9d5128b --- /dev/null +++ b/public/bower_components/raphael/raphael.js @@ -0,0 +1,8293 @@ +// ┌───────────────────────────────────────────────────────────────────────────────────────────────────────┐ \\ +// │ Raphaël 2.2.0 - JavaScript Vector Library │ \\ +// ├───────────────────────────────────────────────────────────────────────────────────────────────────────┤ \\ +// │ Copyright © 2008-2016 Dmitry Baranovskiy (http://raphaeljs.com) │ \\ +// │ Copyright © 2008-2016 Sencha Labs (http://sencha.com) │ \\ +// ├───────────────────────────────────────────────────────────────────────────────────────────────────────┤ \\ +// │ Licensed under the MIT (https://github.com/DmitryBaranovskiy/raphael/blob/master/license.txt) license.│ \\ +// └───────────────────────────────────────────────────────────────────────────────────────────────────────┘ \\ + +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["Raphael"] = factory(); + else + root["Raphael"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; + +/******/ // The require function +/******/ function __webpack_require__(moduleId) { + +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; + +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; + +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); + +/******/ // Flag the module as loaded +/******/ module.loaded = true; + +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } + + +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; + +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; + +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; + +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(1), __webpack_require__(3), __webpack_require__(4)], __WEBPACK_AMD_DEFINE_RESULT__ = function(R) { + + return R; + + }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + +/***/ }, +/* 1 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(2)], __WEBPACK_AMD_DEFINE_RESULT__ = function(eve) { + + /*\ + * Raphael + [ method ] + ** + * Creates a canvas object on which to draw. + * You must do this first, as all future calls to drawing methods + * from this instance will be bound to this canvas. + > Parameters + ** + - container (HTMLElement|string) DOM element or its ID which is going to be a parent for drawing surface + - width (number) + - height (number) + - callback (function) #optional callback function which is going to be executed in the context of newly created paper + * or + - x (number) + - y (number) + - width (number) + - height (number) + - callback (function) #optional callback function which is going to be executed in the context of newly created paper + * or + - all (array) (first 3 or 4 elements in the array are equal to [containerID, width, height] or [x, y, width, height]. The rest are element descriptions in format {type: type, <attributes>}). See @Paper.add. + - callback (function) #optional callback function which is going to be executed in the context of newly created paper + * or + - onReadyCallback (function) function that is going to be called on DOM ready event. You can also subscribe to this event via Eve’s “DOMLoad” event. In this case method returns `undefined`. + = (object) @Paper + > Usage + | // Each of the following examples create a canvas + | // that is 320px wide by 200px high. + | // Canvas is created at the viewport’s 10,50 coordinate. + | var paper = Raphael(10, 50, 320, 200); + | // Canvas is created at the top left corner of the #notepad element + | // (or its top right corner in dir="rtl" elements) + | var paper = Raphael(document.getElementById("notepad"), 320, 200); + | // Same as above + | var paper = Raphael("notepad", 320, 200); + | // Image dump + | var set = Raphael(["notepad", 320, 200, { + | type: "rect", + | x: 10, + | y: 10, + | width: 25, + | height: 25, + | stroke: "#f00" + | }, { + | type: "text", + | x: 30, + | y: 40, + | text: "Dump" + | }]); + \*/ + function R(first) { + if (R.is(first, "function")) { + return loaded ? first() : eve.on("raphael.DOMload", first); + } else if (R.is(first, array)) { + return R._engine.create[apply](R, first.splice(0, 3 + R.is(first[0], nu))).add(first); + } else { + var args = Array.prototype.slice.call(arguments, 0); + if (R.is(args[args.length - 1], "function")) { + var f = args.pop(); + return loaded ? f.call(R._engine.create[apply](R, args)) : eve.on("raphael.DOMload", function () { + f.call(R._engine.create[apply](R, args)); + }); + } else { + return R._engine.create[apply](R, arguments); + } + } + } + R.version = "2.2.0"; + R.eve = eve; + var loaded, + separator = /[, ]+/, + elements = {circle: 1, rect: 1, path: 1, ellipse: 1, text: 1, image: 1}, + formatrg = /\{(\d+)\}/g, + proto = "prototype", + has = "hasOwnProperty", + g = { + doc: document, + win: window + }, + oldRaphael = { + was: Object.prototype[has].call(g.win, "Raphael"), + is: g.win.Raphael + }, + Paper = function () { + /*\ + * Paper.ca + [ property (object) ] + ** + * Shortcut for @Paper.customAttributes + \*/ + /*\ + * Paper.customAttributes + [ property (object) ] + ** + * If you have a set of attributes that you would like to represent + * as a function of some number you can do it easily with custom attributes: + > Usage + | paper.customAttributes.hue = function (num) { + | num = num % 1; + | return {fill: "hsb(" + num + ", 0.75, 1)"}; + | }; + | // Custom attribute “hue” will change fill + | // to be given hue with fixed saturation and brightness. + | // Now you can use it like this: + | var c = paper.circle(10, 10, 10).attr({hue: .45}); + | // or even like this: + | c.animate({hue: 1}, 1e3); + | + | // You could also create custom attribute + | // with multiple parameters: + | paper.customAttributes.hsb = function (h, s, b) { + | return {fill: "hsb(" + [h, s, b].join(",") + ")"}; + | }; + | c.attr({hsb: "0.5 .8 1"}); + | c.animate({hsb: [1, 0, 0.5]}, 1e3); + \*/ + this.ca = this.customAttributes = {}; + }, + paperproto, + appendChild = "appendChild", + apply = "apply", + concat = "concat", + supportsTouch = ('ontouchstart' in g.win) || g.win.DocumentTouch && g.doc instanceof DocumentTouch, //taken from Modernizr touch test + E = "", + S = " ", + Str = String, + split = "split", + events = "click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel"[split](S), + touchMap = { + mousedown: "touchstart", + mousemove: "touchmove", + mouseup: "touchend" + }, + lowerCase = Str.prototype.toLowerCase, + math = Math, + mmax = math.max, + mmin = math.min, + abs = math.abs, + pow = math.pow, + PI = math.PI, + nu = "number", + string = "string", + array = "array", + toString = "toString", + fillString = "fill", + objectToString = Object.prototype.toString, + paper = {}, + push = "push", + ISURL = R._ISURL = /^url\(['"]?(.+?)['"]?\)$/i, + colourRegExp = /^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i, + isnan = {"NaN": 1, "Infinity": 1, "-Infinity": 1}, + bezierrg = /^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/, + round = math.round, + setAttribute = "setAttribute", + toFloat = parseFloat, + toInt = parseInt, + upperCase = Str.prototype.toUpperCase, + availableAttrs = R._availableAttrs = { + "arrow-end": "none", + "arrow-start": "none", + blur: 0, + "clip-rect": "0 0 1e9 1e9", + cursor: "default", + cx: 0, + cy: 0, + fill: "#fff", + "fill-opacity": 1, + font: '10px "Arial"', + "font-family": '"Arial"', + "font-size": "10", + "font-style": "normal", + "font-weight": 400, + gradient: 0, + height: 0, + href: "http://raphaeljs.com/", + "letter-spacing": 0, + opacity: 1, + path: "M0,0", + r: 0, + rx: 0, + ry: 0, + src: "", + stroke: "#000", + "stroke-dasharray": "", + "stroke-linecap": "butt", + "stroke-linejoin": "butt", + "stroke-miterlimit": 0, + "stroke-opacity": 1, + "stroke-width": 1, + target: "_blank", + "text-anchor": "middle", + title: "Raphael", + transform: "", + width: 0, + x: 0, + y: 0, + class: "" + }, + availableAnimAttrs = R._availableAnimAttrs = { + blur: nu, + "clip-rect": "csv", + cx: nu, + cy: nu, + fill: "colour", + "fill-opacity": nu, + "font-size": nu, + height: nu, + opacity: nu, + path: "path", + r: nu, + rx: nu, + ry: nu, + stroke: "colour", + "stroke-opacity": nu, + "stroke-width": nu, + transform: "transform", + width: nu, + x: nu, + y: nu + }, + whitespace = /[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]/g, + commaSpaces = /[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/, + hsrg = {hs: 1, rg: 1}, + p2s = /,?([achlmqrstvxz]),?/gi, + pathCommand = /([achlmrqstvz])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/ig, + tCommand = /([rstm])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/ig, + pathValues = /(-?\d*\.?\d*(?:e[\-+]?\d+)?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/ig, + radial_gradient = R._radial_gradient = /^r(?:\(([^,]+?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*([^\)]+?)\))?/, + eldata = {}, + sortByKey = function (a, b) { + return a.key - b.key; + }, + sortByNumber = function (a, b) { + return toFloat(a) - toFloat(b); + }, + fun = function () {}, + pipe = function (x) { + return x; + }, + rectPath = R._rectPath = function (x, y, w, h, r) { + if (r) { + return [["M", x + r, y], ["l", w - r * 2, 0], ["a", r, r, 0, 0, 1, r, r], ["l", 0, h - r * 2], ["a", r, r, 0, 0, 1, -r, r], ["l", r * 2 - w, 0], ["a", r, r, 0, 0, 1, -r, -r], ["l", 0, r * 2 - h], ["a", r, r, 0, 0, 1, r, -r], ["z"]]; + } + return [["M", x, y], ["l", w, 0], ["l", 0, h], ["l", -w, 0], ["z"]]; + }, + ellipsePath = function (x, y, rx, ry) { + if (ry == null) { + ry = rx; + } + return [["M", x, y], ["m", 0, -ry], ["a", rx, ry, 0, 1, 1, 0, 2 * ry], ["a", rx, ry, 0, 1, 1, 0, -2 * ry], ["z"]]; + }, + getPath = R._getPath = { + path: function (el) { + return el.attr("path"); + }, + circle: function (el) { + var a = el.attrs; + return ellipsePath(a.cx, a.cy, a.r); + }, + ellipse: function (el) { + var a = el.attrs; + return ellipsePath(a.cx, a.cy, a.rx, a.ry); + }, + rect: function (el) { + var a = el.attrs; + return rectPath(a.x, a.y, a.width, a.height, a.r); + }, + image: function (el) { + var a = el.attrs; + return rectPath(a.x, a.y, a.width, a.height); + }, + text: function (el) { + var bbox = el._getBBox(); + return rectPath(bbox.x, bbox.y, bbox.width, bbox.height); + }, + set : function(el) { + var bbox = el._getBBox(); + return rectPath(bbox.x, bbox.y, bbox.width, bbox.height); + } + }, + /*\ + * Raphael.mapPath + [ method ] + ** + * Transform the path string with given matrix. + > Parameters + - path (string) path string + - matrix (object) see @Matrix + = (string) transformed path string + \*/ + mapPath = R.mapPath = function (path, matrix) { + if (!matrix) { + return path; + } + var x, y, i, j, ii, jj, pathi; + path = path2curve(path); + for (i = 0, ii = path.length; i < ii; i++) { + pathi = path[i]; + for (j = 1, jj = pathi.length; j < jj; j += 2) { + x = matrix.x(pathi[j], pathi[j + 1]); + y = matrix.y(pathi[j], pathi[j + 1]); + pathi[j] = x; + pathi[j + 1] = y; + } + } + return path; + }; + + R._g = g; + /*\ + * Raphael.type + [ property (string) ] + ** + * Can be “SVG”, “VML” or empty, depending on browser support. + \*/ + R.type = (g.win.SVGAngle || g.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") ? "SVG" : "VML"); + if (R.type == "VML") { + var d = g.doc.createElement("div"), + b; + d.innerHTML = '<v:shape adj="1"/>'; + b = d.firstChild; + b.style.behavior = "url(#default#VML)"; + if (!(b && typeof b.adj == "object")) { + return (R.type = E); + } + d = null; + } + /*\ + * Raphael.svg + [ property (boolean) ] + ** + * `true` if browser supports SVG. + \*/ + /*\ + * Raphael.vml + [ property (boolean) ] + ** + * `true` if browser supports VML. + \*/ + R.svg = !(R.vml = R.type == "VML"); + R._Paper = Paper; + /*\ + * Raphael.fn + [ property (object) ] + ** + * You can add your own method to the canvas. For example if you want to draw a pie chart, + * you can create your own pie chart function and ship it as a Raphaël plugin. To do this + * you need to extend the `Raphael.fn` object. You should modify the `fn` object before a + * Raphaël instance is created, otherwise it will take no effect. Please note that the + * ability for namespaced plugins was removed in Raphael 2.0. It is up to the plugin to + * ensure any namespacing ensures proper context. + > Usage + | Raphael.fn.arrow = function (x1, y1, x2, y2, size) { + | return this.path( ... ); + | }; + | // or create namespace + | Raphael.fn.mystuff = { + | arrow: function () {…}, + | star: function () {…}, + | // etc… + | }; + | var paper = Raphael(10, 10, 630, 480); + | // then use it + | paper.arrow(10, 10, 30, 30, 5).attr({fill: "#f00"}); + | paper.mystuff.arrow(); + | paper.mystuff.star(); + \*/ + R.fn = paperproto = Paper.prototype = R.prototype; + R._id = 0; + R._oid = 0; + /*\ + * Raphael.is + [ method ] + ** + * Handful of replacements for `typeof` operator. + > Parameters + - o (…) any object or primitive + - type (string) name of the type, i.e. “string”, “function”, “number”, etc. + = (boolean) is given value is of given type + \*/ + R.is = function (o, type) { + type = lowerCase.call(type); + if (type == "finite") { + return !isnan[has](+o); + } + if (type == "array") { + return o instanceof Array; + } + return (type == "null" && o === null) || + (type == typeof o && o !== null) || + (type == "object" && o === Object(o)) || + (type == "array" && Array.isArray && Array.isArray(o)) || + objectToString.call(o).slice(8, -1).toLowerCase() == type; + }; + + function clone(obj) { + if (typeof obj == "function" || Object(obj) !== obj) { + return obj; + } + var res = new obj.constructor; + for (var key in obj) if (obj[has](key)) { + res[key] = clone(obj[key]); + } + return res; + } + + /*\ + * Raphael.angle + [ method ] + ** + * Returns angle between two or three points + > Parameters + - x1 (number) x coord of first point + - y1 (number) y coord of first point + - x2 (number) x coord of second point + - y2 (number) y coord of second point + - x3 (number) #optional x coord of third point + - y3 (number) #optional y coord of third point + = (number) angle in degrees. + \*/ + R.angle = function (x1, y1, x2, y2, x3, y3) { + if (x3 == null) { + var x = x1 - x2, + y = y1 - y2; + if (!x && !y) { + return 0; + } + return (180 + math.atan2(-y, -x) * 180 / PI + 360) % 360; + } else { + return R.angle(x1, y1, x3, y3) - R.angle(x2, y2, x3, y3); + } + }; + /*\ + * Raphael.rad + [ method ] + ** + * Transform angle to radians + > Parameters + - deg (number) angle in degrees + = (number) angle in radians. + \*/ + R.rad = function (deg) { + return deg % 360 * PI / 180; + }; + /*\ + * Raphael.deg + [ method ] + ** + * Transform angle to degrees + > Parameters + - rad (number) angle in radians + = (number) angle in degrees. + \*/ + R.deg = function (rad) { + return Math.round ((rad * 180 / PI% 360)* 1000) / 1000; + }; + /*\ + * Raphael.snapTo + [ method ] + ** + * Snaps given value to given grid. + > Parameters + - values (array|number) given array of values or step of the grid + - value (number) value to adjust + - tolerance (number) #optional tolerance for snapping. Default is `10`. + = (number) adjusted value. + \*/ + R.snapTo = function (values, value, tolerance) { + tolerance = R.is(tolerance, "finite") ? tolerance : 10; + if (R.is(values, array)) { + var i = values.length; + while (i--) if (abs(values[i] - value) <= tolerance) { + return values[i]; + } + } else { + values = +values; + var rem = value % values; + if (rem < tolerance) { + return value - rem; + } + if (rem > values - tolerance) { + return value - rem + values; + } + } + return value; + }; + + /*\ + * Raphael.createUUID + [ method ] + ** + * Returns RFC4122, version 4 ID + \*/ + var createUUID = R.createUUID = (function (uuidRegEx, uuidReplacer) { + return function () { + return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(uuidRegEx, uuidReplacer).toUpperCase(); + }; + })(/[xy]/g, function (c) { + var r = math.random() * 16 | 0, + v = c == "x" ? r : (r & 3 | 8); + return v.toString(16); + }); + + /*\ + * Raphael.setWindow + [ method ] + ** + * Used when you need to draw in `<iframe>`. Switched window to the iframe one. + > Parameters + - newwin (window) new window object + \*/ + R.setWindow = function (newwin) { + eve("raphael.setWindow", R, g.win, newwin); + g.win = newwin; + g.doc = g.win.document; + if (R._engine.initWin) { + R._engine.initWin(g.win); + } + }; + var toHex = function (color) { + if (R.vml) { + // http://dean.edwards.name/weblog/2009/10/convert-any-colour-value-to-hex-in-msie/ + var trim = /^\s+|\s+$/g; + var bod; + try { + var docum = new ActiveXObject("htmlfile"); + docum.write("<body>"); + docum.close(); + bod = docum.body; + } catch(e) { + bod = createPopup().document.body; + } + var range = bod.createTextRange(); + toHex = cacher(function (color) { + try { + bod.style.color = Str(color).replace(trim, E); + var value = range.queryCommandValue("ForeColor"); + value = ((value & 255) << 16) | (value & 65280) | ((value & 16711680) >>> 16); + return "#" + ("000000" + value.toString(16)).slice(-6); + } catch(e) { + return "none"; + } + }); + } else { + var i = g.doc.createElement("i"); + i.title = "Rapha\xebl Colour Picker"; + i.style.display = "none"; + g.doc.body.appendChild(i); + toHex = cacher(function (color) { + i.style.color = color; + return g.doc.defaultView.getComputedStyle(i, E).getPropertyValue("color"); + }); + } + return toHex(color); + }, + hsbtoString = function () { + return "hsb(" + [this.h, this.s, this.b] + ")"; + }, + hsltoString = function () { + return "hsl(" + [this.h, this.s, this.l] + ")"; + }, + rgbtoString = function () { + return this.hex; + }, + prepareRGB = function (r, g, b) { + if (g == null && R.is(r, "object") && "r" in r && "g" in r && "b" in r) { + b = r.b; + g = r.g; + r = r.r; + } + if (g == null && R.is(r, string)) { + var clr = R.getRGB(r); + r = clr.r; + g = clr.g; + b = clr.b; + } + if (r > 1 || g > 1 || b > 1) { + r /= 255; + g /= 255; + b /= 255; + } + + return [r, g, b]; + }, + packageRGB = function (r, g, b, o) { + r *= 255; + g *= 255; + b *= 255; + var rgb = { + r: r, + g: g, + b: b, + hex: R.rgb(r, g, b), + toString: rgbtoString + }; + R.is(o, "finite") && (rgb.opacity = o); + return rgb; + }; + + /*\ + * Raphael.color + [ method ] + ** + * Parses the color string and returns object with all values for the given color. + > Parameters + - clr (string) color string in one of the supported formats (see @Raphael.getRGB) + = (object) Combined RGB & HSB object in format: + o { + o r (number) red, + o g (number) green, + o b (number) blue, + o hex (string) color in HTML/CSS format: #••••••, + o error (boolean) `true` if string can’t be parsed, + o h (number) hue, + o s (number) saturation, + o v (number) value (brightness), + o l (number) lightness + o } + \*/ + R.color = function (clr) { + var rgb; + if (R.is(clr, "object") && "h" in clr && "s" in clr && "b" in clr) { + rgb = R.hsb2rgb(clr); + clr.r = rgb.r; + clr.g = rgb.g; + clr.b = rgb.b; + clr.hex = rgb.hex; + } else if (R.is(clr, "object") && "h" in clr && "s" in clr && "l" in clr) { + rgb = R.hsl2rgb(clr); + clr.r = rgb.r; + clr.g = rgb.g; + clr.b = rgb.b; + clr.hex = rgb.hex; + } else { + if (R.is(clr, "string")) { + clr = R.getRGB(clr); + } + if (R.is(clr, "object") && "r" in clr && "g" in clr && "b" in clr) { + rgb = R.rgb2hsl(clr); + clr.h = rgb.h; + clr.s = rgb.s; + clr.l = rgb.l; + rgb = R.rgb2hsb(clr); + clr.v = rgb.b; + } else { + clr = {hex: "none"}; + clr.r = clr.g = clr.b = clr.h = clr.s = clr.v = clr.l = -1; + } + } + clr.toString = rgbtoString; + return clr; + }; + /*\ + * Raphael.hsb2rgb + [ method ] + ** + * Converts HSB values to RGB object. + > Parameters + - h (number) hue + - s (number) saturation + - v (number) value or brightness + = (object) RGB object in format: + o { + o r (number) red, + o g (number) green, + o b (number) blue, + o hex (string) color in HTML/CSS format: #•••••• + o } + \*/ + R.hsb2rgb = function (h, s, v, o) { + if (this.is(h, "object") && "h" in h && "s" in h && "b" in h) { + v = h.b; + s = h.s; + o = h.o; + h = h.h; + } + h *= 360; + var R, G, B, X, C; + h = (h % 360) / 60; + C = v * s; + X = C * (1 - abs(h % 2 - 1)); + R = G = B = v - C; + + h = ~~h; + R += [C, X, 0, 0, X, C][h]; + G += [X, C, C, X, 0, 0][h]; + B += [0, 0, X, C, C, X][h]; + return packageRGB(R, G, B, o); + }; + /*\ + * Raphael.hsl2rgb + [ method ] + ** + * Converts HSL values to RGB object. + > Parameters + - h (number) hue + - s (number) saturation + - l (number) luminosity + = (object) RGB object in format: + o { + o r (number) red, + o g (number) green, + o b (number) blue, + o hex (string) color in HTML/CSS format: #•••••• + o } + \*/ + R.hsl2rgb = function (h, s, l, o) { + if (this.is(h, "object") && "h" in h && "s" in h && "l" in h) { + l = h.l; + s = h.s; + h = h.h; + } + if (h > 1 || s > 1 || l > 1) { + h /= 360; + s /= 100; + l /= 100; + } + h *= 360; + var R, G, B, X, C; + h = (h % 360) / 60; + C = 2 * s * (l < .5 ? l : 1 - l); + X = C * (1 - abs(h % 2 - 1)); + R = G = B = l - C / 2; + + h = ~~h; + R += [C, X, 0, 0, X, C][h]; + G += [X, C, C, X, 0, 0][h]; + B += [0, 0, X, C, C, X][h]; + return packageRGB(R, G, B, o); + }; + /*\ + * Raphael.rgb2hsb + [ method ] + ** + * Converts RGB values to HSB object. + > Parameters + - r (number) red + - g (number) green + - b (number) blue + = (object) HSB object in format: + o { + o h (number) hue + o s (number) saturation + o b (number) brightness + o } + \*/ + R.rgb2hsb = function (r, g, b) { + b = prepareRGB(r, g, b); + r = b[0]; + g = b[1]; + b = b[2]; + + var H, S, V, C; + V = mmax(r, g, b); + C = V - mmin(r, g, b); + H = (C == 0 ? null : + V == r ? (g - b) / C : + V == g ? (b - r) / C + 2 : + (r - g) / C + 4 + ); + H = ((H + 360) % 6) * 60 / 360; + S = C == 0 ? 0 : C / V; + return {h: H, s: S, b: V, toString: hsbtoString}; + }; + /*\ + * Raphael.rgb2hsl + [ method ] + ** + * Converts RGB values to HSL object. + > Parameters + - r (number) red + - g (number) green + - b (number) blue + = (object) HSL object in format: + o { + o h (number) hue + o s (number) saturation + o l (number) luminosity + o } + \*/ + R.rgb2hsl = function (r, g, b) { + b = prepareRGB(r, g, b); + r = b[0]; + g = b[1]; + b = b[2]; + + var H, S, L, M, m, C; + M = mmax(r, g, b); + m = mmin(r, g, b); + C = M - m; + H = (C == 0 ? null : + M == r ? (g - b) / C : + M == g ? (b - r) / C + 2 : + (r - g) / C + 4); + H = ((H + 360) % 6) * 60 / 360; + L = (M + m) / 2; + S = (C == 0 ? 0 : + L < .5 ? C / (2 * L) : + C / (2 - 2 * L)); + return {h: H, s: S, l: L, toString: hsltoString}; + }; + R._path2string = function () { + return this.join(",").replace(p2s, "$1"); + }; + function repush(array, item) { + for (var i = 0, ii = array.length; i < ii; i++) if (array[i] === item) { + return array.push(array.splice(i, 1)[0]); + } + } + function cacher(f, scope, postprocessor) { + function newf() { + var arg = Array.prototype.slice.call(arguments, 0), + args = arg.join("\u2400"), + cache = newf.cache = newf.cache || {}, + count = newf.count = newf.count || []; + if (cache[has](args)) { + repush(count, args); + return postprocessor ? postprocessor(cache[args]) : cache[args]; + } + count.length >= 1e3 && delete cache[count.shift()]; + count.push(args); + cache[args] = f[apply](scope, arg); + return postprocessor ? postprocessor(cache[args]) : cache[args]; + } + return newf; + } + + var preload = R._preload = function (src, f) { + var img = g.doc.createElement("img"); + img.style.cssText = "position:absolute;left:-9999em;top:-9999em"; + img.onload = function () { + f.call(this); + this.onload = null; + g.doc.body.removeChild(this); + }; + img.onerror = function () { + g.doc.body.removeChild(this); + }; + g.doc.body.appendChild(img); + img.src = src; + }; + + function clrToString() { + return this.hex; + } + + /*\ + * Raphael.getRGB + [ method ] + ** + * Parses colour string as RGB object + > Parameters + - colour (string) colour string in one of formats: + # <ul> + # <li>Colour name (“<code>red</code>”, “<code>green</code>”, “<code>cornflowerblue</code>”, etc)</li> + # <li>#••• — shortened HTML colour: (“<code>#000</code>”, “<code>#fc0</code>”, etc)</li> + # <li>#•••••• — full length HTML colour: (“<code>#000000</code>”, “<code>#bd2300</code>”)</li> + # <li>rgb(•••, •••, •••) — red, green and blue channels’ values: (“<code>rgb(200, 100, 0)</code>”)</li> + # <li>rgb(•••%, •••%, •••%) — same as above, but in %: (“<code>rgb(100%, 175%, 0%)</code>”)</li> + # <li>hsb(•••, •••, •••) — hue, saturation and brightness values: (“<code>hsb(0.5, 0.25, 1)</code>”)</li> + # <li>hsb(•••%, •••%, •••%) — same as above, but in %</li> + # <li>hsl(•••, •••, •••) — same as hsb</li> + # <li>hsl(•••%, •••%, •••%) — same as hsb</li> + # </ul> + = (object) RGB object in format: + o { + o r (number) red, + o g (number) green, + o b (number) blue + o hex (string) color in HTML/CSS format: #••••••, + o error (boolean) true if string can’t be parsed + o } + \*/ + R.getRGB = cacher(function (colour) { + if (!colour || !!((colour = Str(colour)).indexOf("-") + 1)) { + return {r: -1, g: -1, b: -1, hex: "none", error: 1, toString: clrToString}; + } + if (colour == "none") { + return {r: -1, g: -1, b: -1, hex: "none", toString: clrToString}; + } + !(hsrg[has](colour.toLowerCase().substring(0, 2)) || colour.charAt() == "#") && (colour = toHex(colour)); + var res, + red, + green, + blue, + opacity, + t, + values, + rgb = colour.match(colourRegExp); + if (rgb) { + if (rgb[2]) { + blue = toInt(rgb[2].substring(5), 16); + green = toInt(rgb[2].substring(3, 5), 16); + red = toInt(rgb[2].substring(1, 3), 16); + } + if (rgb[3]) { + blue = toInt((t = rgb[3].charAt(3)) + t, 16); + green = toInt((t = rgb[3].charAt(2)) + t, 16); + red = toInt((t = rgb[3].charAt(1)) + t, 16); + } + if (rgb[4]) { + values = rgb[4][split](commaSpaces); + red = toFloat(values[0]); + values[0].slice(-1) == "%" && (red *= 2.55); + green = toFloat(values[1]); + values[1].slice(-1) == "%" && (green *= 2.55); + blue = toFloat(values[2]); + values[2].slice(-1) == "%" && (blue *= 2.55); + rgb[1].toLowerCase().slice(0, 4) == "rgba" && (opacity = toFloat(values[3])); + values[3] && values[3].slice(-1) == "%" && (opacity /= 100); + } + if (rgb[5]) { + values = rgb[5][split](commaSpaces); + red = toFloat(values[0]); + values[0].slice(-1) == "%" && (red *= 2.55); + green = toFloat(values[1]); + values[1].slice(-1) == "%" && (green *= 2.55); + blue = toFloat(values[2]); + values[2].slice(-1) == "%" && (blue *= 2.55); + (values[0].slice(-3) == "deg" || values[0].slice(-1) == "\xb0") && (red /= 360); + rgb[1].toLowerCase().slice(0, 4) == "hsba" && (opacity = toFloat(values[3])); + values[3] && values[3].slice(-1) == "%" && (opacity /= 100); + return R.hsb2rgb(red, green, blue, opacity); + } + if (rgb[6]) { + values = rgb[6][split](commaSpaces); + red = toFloat(values[0]); + values[0].slice(-1) == "%" && (red *= 2.55); + green = toFloat(values[1]); + values[1].slice(-1) == "%" && (green *= 2.55); + blue = toFloat(values[2]); + values[2].slice(-1) == "%" && (blue *= 2.55); + (values[0].slice(-3) == "deg" || values[0].slice(-1) == "\xb0") && (red /= 360); + rgb[1].toLowerCase().slice(0, 4) == "hsla" && (opacity = toFloat(values[3])); + values[3] && values[3].slice(-1) == "%" && (opacity /= 100); + return R.hsl2rgb(red, green, blue, opacity); + } + rgb = {r: red, g: green, b: blue, toString: clrToString}; + rgb.hex = "#" + (16777216 | blue | (green << 8) | (red << 16)).toString(16).slice(1); + R.is(opacity, "finite") && (rgb.opacity = opacity); + return rgb; + } + return {r: -1, g: -1, b: -1, hex: "none", error: 1, toString: clrToString}; + }, R); + /*\ + * Raphael.hsb + [ method ] + ** + * Converts HSB values to hex representation of the colour. + > Parameters + - h (number) hue + - s (number) saturation + - b (number) value or brightness + = (string) hex representation of the colour. + \*/ + R.hsb = cacher(function (h, s, b) { + return R.hsb2rgb(h, s, b).hex; + }); + /*\ + * Raphael.hsl + [ method ] + ** + * Converts HSL values to hex representation of the colour. + > Parameters + - h (number) hue + - s (number) saturation + - l (number) luminosity + = (string) hex representation of the colour. + \*/ + R.hsl = cacher(function (h, s, l) { + return R.hsl2rgb(h, s, l).hex; + }); + /*\ + * Raphael.rgb + [ method ] + ** + * Converts RGB values to hex representation of the colour. + > Parameters + - r (number) red + - g (number) green + - b (number) blue + = (string) hex representation of the colour. + \*/ + R.rgb = cacher(function (r, g, b) { + function round(x) { return (x + 0.5) | 0; } + return "#" + (16777216 | round(b) | (round(g) << 8) | (round(r) << 16)).toString(16).slice(1); + }); + /*\ + * Raphael.getColor + [ method ] + ** + * On each call returns next colour in the spectrum. To reset it back to red call @Raphael.getColor.reset + > Parameters + - value (number) #optional brightness, default is `0.75` + = (string) hex representation of the colour. + \*/ + R.getColor = function (value) { + var start = this.getColor.start = this.getColor.start || {h: 0, s: 1, b: value || .75}, + rgb = this.hsb2rgb(start.h, start.s, start.b); + start.h += .075; + if (start.h > 1) { + start.h = 0; + start.s -= .2; + start.s <= 0 && (this.getColor.start = {h: 0, s: 1, b: start.b}); + } + return rgb.hex; + }; + /*\ + * Raphael.getColor.reset + [ method ] + ** + * Resets spectrum position for @Raphael.getColor back to red. + \*/ + R.getColor.reset = function () { + delete this.start; + }; + + // http://schepers.cc/getting-to-the-point + function catmullRom2bezier(crp, z) { + var d = []; + for (var i = 0, iLen = crp.length; iLen - 2 * !z > i; i += 2) { + var p = [ + {x: +crp[i - 2], y: +crp[i - 1]}, + {x: +crp[i], y: +crp[i + 1]}, + {x: +crp[i + 2], y: +crp[i + 3]}, + {x: +crp[i + 4], y: +crp[i + 5]} + ]; + if (z) { + if (!i) { + p[0] = {x: +crp[iLen - 2], y: +crp[iLen - 1]}; + } else if (iLen - 4 == i) { + p[3] = {x: +crp[0], y: +crp[1]}; + } else if (iLen - 2 == i) { + p[2] = {x: +crp[0], y: +crp[1]}; + p[3] = {x: +crp[2], y: +crp[3]}; + } + } else { + if (iLen - 4 == i) { + p[3] = p[2]; + } else if (!i) { + p[0] = {x: +crp[i], y: +crp[i + 1]}; + } + } + d.push(["C", + (-p[0].x + 6 * p[1].x + p[2].x) / 6, + (-p[0].y + 6 * p[1].y + p[2].y) / 6, + (p[1].x + 6 * p[2].x - p[3].x) / 6, + (p[1].y + 6*p[2].y - p[3].y) / 6, + p[2].x, + p[2].y + ]); + } + + return d; + } + /*\ + * Raphael.parsePathString + [ method ] + ** + * Utility method + ** + * Parses given path string into an array of arrays of path segments. + > Parameters + - pathString (string|array) path string or array of segments (in the last case it will be returned straight away) + = (array) array of segments. + \*/ + R.parsePathString = function (pathString) { + if (!pathString) { + return null; + } + var pth = paths(pathString); + if (pth.arr) { + return pathClone(pth.arr); + } + + var paramCounts = {a: 7, c: 6, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, z: 0}, + data = []; + if (R.is(pathString, array) && R.is(pathString[0], array)) { // rough assumption + data = pathClone(pathString); + } + if (!data.length) { + Str(pathString).replace(pathCommand, function (a, b, c) { + var params = [], + name = b.toLowerCase(); + c.replace(pathValues, function (a, b) { + b && params.push(+b); + }); + if (name == "m" && params.length > 2) { + data.push([b][concat](params.splice(0, 2))); + name = "l"; + b = b == "m" ? "l" : "L"; + } + if (name == "r") { + data.push([b][concat](params)); + } else while (params.length >= paramCounts[name]) { + data.push([b][concat](params.splice(0, paramCounts[name]))); + if (!paramCounts[name]) { + break; + } + } + }); + } + data.toString = R._path2string; + pth.arr = pathClone(data); + return data; + }; + /*\ + * Raphael.parseTransformString + [ method ] + ** + * Utility method + ** + * Parses given path string into an array of transformations. + > Parameters + - TString (string|array) transform string or array of transformations (in the last case it will be returned straight away) + = (array) array of transformations. + \*/ + R.parseTransformString = cacher(function (TString) { + if (!TString) { + return null; + } + var paramCounts = {r: 3, s: 4, t: 2, m: 6}, + data = []; + if (R.is(TString, array) && R.is(TString[0], array)) { // rough assumption + data = pathClone(TString); + } + if (!data.length) { + Str(TString).replace(tCommand, function (a, b, c) { + var params = [], + name = lowerCase.call(b); + c.replace(pathValues, function (a, b) { + b && params.push(+b); + }); + data.push([b][concat](params)); + }); + } + data.toString = R._path2string; + return data; + }); + // PATHS + var paths = function (ps) { + var p = paths.ps = paths.ps || {}; + if (p[ps]) { + p[ps].sleep = 100; + } else { + p[ps] = { + sleep: 100 + }; + } + setTimeout(function () { + for (var key in p) if (p[has](key) && key != ps) { + p[key].sleep--; + !p[key].sleep && delete p[key]; + } + }); + return p[ps]; + }; + /*\ + * Raphael.findDotsAtSegment + [ method ] + ** + * Utility method + ** + * Find dot coordinates on the given cubic bezier curve at the given t. + > Parameters + - p1x (number) x of the first point of the curve + - p1y (number) y of the first point of the curve + - c1x (number) x of the first anchor of the curve + - c1y (number) y of the first anchor of the curve + - c2x (number) x of the second anchor of the curve + - c2y (number) y of the second anchor of the curve + - p2x (number) x of the second point of the curve + - p2y (number) y of the second point of the curve + - t (number) position on the curve (0..1) + = (object) point information in format: + o { + o x: (number) x coordinate of the point + o y: (number) y coordinate of the point + o m: { + o x: (number) x coordinate of the left anchor + o y: (number) y coordinate of the left anchor + o } + o n: { + o x: (number) x coordinate of the right anchor + o y: (number) y coordinate of the right anchor + o } + o start: { + o x: (number) x coordinate of the start of the curve + o y: (number) y coordinate of the start of the curve + o } + o end: { + o x: (number) x coordinate of the end of the curve + o y: (number) y coordinate of the end of the curve + o } + o alpha: (number) angle of the curve derivative at the point + o } + \*/ + R.findDotsAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) { + var t1 = 1 - t, + t13 = pow(t1, 3), + t12 = pow(t1, 2), + t2 = t * t, + t3 = t2 * t, + x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x, + y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y, + mx = p1x + 2 * t * (c1x - p1x) + t2 * (c2x - 2 * c1x + p1x), + my = p1y + 2 * t * (c1y - p1y) + t2 * (c2y - 2 * c1y + p1y), + nx = c1x + 2 * t * (c2x - c1x) + t2 * (p2x - 2 * c2x + c1x), + ny = c1y + 2 * t * (c2y - c1y) + t2 * (p2y - 2 * c2y + c1y), + ax = t1 * p1x + t * c1x, + ay = t1 * p1y + t * c1y, + cx = t1 * c2x + t * p2x, + cy = t1 * c2y + t * p2y, + alpha = (90 - math.atan2(mx - nx, my - ny) * 180 / PI); + (mx > nx || my < ny) && (alpha += 180); + return { + x: x, + y: y, + m: {x: mx, y: my}, + n: {x: nx, y: ny}, + start: {x: ax, y: ay}, + end: {x: cx, y: cy}, + alpha: alpha + }; + }; + /*\ + * Raphael.bezierBBox + [ method ] + ** + * Utility method + ** + * Return bounding box of a given cubic bezier curve + > Parameters + - p1x (number) x of the first point of the curve + - p1y (number) y of the first point of the curve + - c1x (number) x of the first anchor of the curve + - c1y (number) y of the first anchor of the curve + - c2x (number) x of the second anchor of the curve + - c2y (number) y of the second anchor of the curve + - p2x (number) x of the second point of the curve + - p2y (number) y of the second point of the curve + * or + - bez (array) array of six points for bezier curve + = (object) point information in format: + o { + o min: { + o x: (number) x coordinate of the left point + o y: (number) y coordinate of the top point + o } + o max: { + o x: (number) x coordinate of the right point + o y: (number) y coordinate of the bottom point + o } + o } + \*/ + R.bezierBBox = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) { + if (!R.is(p1x, "array")) { + p1x = [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y]; + } + var bbox = curveDim.apply(null, p1x); + return { + x: bbox.min.x, + y: bbox.min.y, + x2: bbox.max.x, + y2: bbox.max.y, + width: bbox.max.x - bbox.min.x, + height: bbox.max.y - bbox.min.y + }; + }; + /*\ + * Raphael.isPointInsideBBox + [ method ] + ** + * Utility method + ** + * Returns `true` if given point is inside bounding boxes. + > Parameters + - bbox (string) bounding box + - x (string) x coordinate of the point + - y (string) y coordinate of the point + = (boolean) `true` if point inside + \*/ + R.isPointInsideBBox = function (bbox, x, y) { + return x >= bbox.x && x <= bbox.x2 && y >= bbox.y && y <= bbox.y2; + }; + /*\ + * Raphael.isBBoxIntersect + [ method ] + ** + * Utility method + ** + * Returns `true` if two bounding boxes intersect + > Parameters + - bbox1 (string) first bounding box + - bbox2 (string) second bounding box + = (boolean) `true` if they intersect + \*/ + R.isBBoxIntersect = function (bbox1, bbox2) { + var i = R.isPointInsideBBox; + return i(bbox2, bbox1.x, bbox1.y) + || i(bbox2, bbox1.x2, bbox1.y) + || i(bbox2, bbox1.x, bbox1.y2) + || i(bbox2, bbox1.x2, bbox1.y2) + || i(bbox1, bbox2.x, bbox2.y) + || i(bbox1, bbox2.x2, bbox2.y) + || i(bbox1, bbox2.x, bbox2.y2) + || i(bbox1, bbox2.x2, bbox2.y2) + || (bbox1.x < bbox2.x2 && bbox1.x > bbox2.x || bbox2.x < bbox1.x2 && bbox2.x > bbox1.x) + && (bbox1.y < bbox2.y2 && bbox1.y > bbox2.y || bbox2.y < bbox1.y2 && bbox2.y > bbox1.y); + }; + function base3(t, p1, p2, p3, p4) { + var t1 = -3 * p1 + 9 * p2 - 9 * p3 + 3 * p4, + t2 = t * t1 + 6 * p1 - 12 * p2 + 6 * p3; + return t * t2 - 3 * p1 + 3 * p2; + } + function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) { + if (z == null) { + z = 1; + } + z = z > 1 ? 1 : z < 0 ? 0 : z; + var z2 = z / 2, + n = 12, + Tvalues = [-0.1252,0.1252,-0.3678,0.3678,-0.5873,0.5873,-0.7699,0.7699,-0.9041,0.9041,-0.9816,0.9816], + Cvalues = [0.2491,0.2491,0.2335,0.2335,0.2032,0.2032,0.1601,0.1601,0.1069,0.1069,0.0472,0.0472], + sum = 0; + for (var i = 0; i < n; i++) { + var ct = z2 * Tvalues[i] + z2, + xbase = base3(ct, x1, x2, x3, x4), + ybase = base3(ct, y1, y2, y3, y4), + comb = xbase * xbase + ybase * ybase; + sum += Cvalues[i] * math.sqrt(comb); + } + return z2 * sum; + } + function getTatLen(x1, y1, x2, y2, x3, y3, x4, y4, ll) { + if (ll < 0 || bezlen(x1, y1, x2, y2, x3, y3, x4, y4) < ll) { + return; + } + var t = 1, + step = t / 2, + t2 = t - step, + l, + e = .01; + l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2); + while (abs(l - ll) > e) { + step /= 2; + t2 += (l < ll ? 1 : -1) * step; + l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2); + } + return t2; + } + function intersect(x1, y1, x2, y2, x3, y3, x4, y4) { + if ( + mmax(x1, x2) < mmin(x3, x4) || + mmin(x1, x2) > mmax(x3, x4) || + mmax(y1, y2) < mmin(y3, y4) || + mmin(y1, y2) > mmax(y3, y4) + ) { + return; + } + var nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4), + ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4), + denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4); + + if (!denominator) { + return; + } + var px = nx / denominator, + py = ny / denominator, + px2 = +px.toFixed(2), + py2 = +py.toFixed(2); + if ( + px2 < +mmin(x1, x2).toFixed(2) || + px2 > +mmax(x1, x2).toFixed(2) || + px2 < +mmin(x3, x4).toFixed(2) || + px2 > +mmax(x3, x4).toFixed(2) || + py2 < +mmin(y1, y2).toFixed(2) || + py2 > +mmax(y1, y2).toFixed(2) || + py2 < +mmin(y3, y4).toFixed(2) || + py2 > +mmax(y3, y4).toFixed(2) + ) { + return; + } + return {x: px, y: py}; + } + function inter(bez1, bez2) { + return interHelper(bez1, bez2); + } + function interCount(bez1, bez2) { + return interHelper(bez1, bez2, 1); + } + function interHelper(bez1, bez2, justCount) { + var bbox1 = R.bezierBBox(bez1), + bbox2 = R.bezierBBox(bez2); + if (!R.isBBoxIntersect(bbox1, bbox2)) { + return justCount ? 0 : []; + } + var l1 = bezlen.apply(0, bez1), + l2 = bezlen.apply(0, bez2), + n1 = mmax(~~(l1 / 5), 1), + n2 = mmax(~~(l2 / 5), 1), + dots1 = [], + dots2 = [], + xy = {}, + res = justCount ? 0 : []; + for (var i = 0; i < n1 + 1; i++) { + var p = R.findDotsAtSegment.apply(R, bez1.concat(i / n1)); + dots1.push({x: p.x, y: p.y, t: i / n1}); + } + for (i = 0; i < n2 + 1; i++) { + p = R.findDotsAtSegment.apply(R, bez2.concat(i / n2)); + dots2.push({x: p.x, y: p.y, t: i / n2}); + } + for (i = 0; i < n1; i++) { + for (var j = 0; j < n2; j++) { + var di = dots1[i], + di1 = dots1[i + 1], + dj = dots2[j], + dj1 = dots2[j + 1], + ci = abs(di1.x - di.x) < .001 ? "y" : "x", + cj = abs(dj1.x - dj.x) < .001 ? "y" : "x", + is = intersect(di.x, di.y, di1.x, di1.y, dj.x, dj.y, dj1.x, dj1.y); + if (is) { + if (xy[is.x.toFixed(4)] == is.y.toFixed(4)) { + continue; + } + xy[is.x.toFixed(4)] = is.y.toFixed(4); + var t1 = di.t + abs((is[ci] - di[ci]) / (di1[ci] - di[ci])) * (di1.t - di.t), + t2 = dj.t + abs((is[cj] - dj[cj]) / (dj1[cj] - dj[cj])) * (dj1.t - dj.t); + if (t1 >= 0 && t1 <= 1.001 && t2 >= 0 && t2 <= 1.001) { + if (justCount) { + res++; + } else { + res.push({ + x: is.x, + y: is.y, + t1: mmin(t1, 1), + t2: mmin(t2, 1) + }); + } + } + } + } + } + return res; + } + /*\ + * Raphael.pathIntersection + [ method ] + ** + * Utility method + ** + * Finds intersections of two paths + > Parameters + - path1 (string) path string + - path2 (string) path string + = (array) dots of intersection + o [ + o { + o x: (number) x coordinate of the point + o y: (number) y coordinate of the point + o t1: (number) t value for segment of path1 + o t2: (number) t value for segment of path2 + o segment1: (number) order number for segment of path1 + o segment2: (number) order number for segment of path2 + o bez1: (array) eight coordinates representing beziér curve for the segment of path1 + o bez2: (array) eight coordinates representing beziér curve for the segment of path2 + o } + o ] + \*/ + R.pathIntersection = function (path1, path2) { + return interPathHelper(path1, path2); + }; + R.pathIntersectionNumber = function (path1, path2) { + return interPathHelper(path1, path2, 1); + }; + function interPathHelper(path1, path2, justCount) { + path1 = R._path2curve(path1); + path2 = R._path2curve(path2); + var x1, y1, x2, y2, x1m, y1m, x2m, y2m, bez1, bez2, + res = justCount ? 0 : []; + for (var i = 0, ii = path1.length; i < ii; i++) { + var pi = path1[i]; + if (pi[0] == "M") { + x1 = x1m = pi[1]; + y1 = y1m = pi[2]; + } else { + if (pi[0] == "C") { + bez1 = [x1, y1].concat(pi.slice(1)); + x1 = bez1[6]; + y1 = bez1[7]; + } else { + bez1 = [x1, y1, x1, y1, x1m, y1m, x1m, y1m]; + x1 = x1m; + y1 = y1m; + } + for (var j = 0, jj = path2.length; j < jj; j++) { + var pj = path2[j]; + if (pj[0] == "M") { + x2 = x2m = pj[1]; + y2 = y2m = pj[2]; + } else { + if (pj[0] == "C") { + bez2 = [x2, y2].concat(pj.slice(1)); + x2 = bez2[6]; + y2 = bez2[7]; + } else { + bez2 = [x2, y2, x2, y2, x2m, y2m, x2m, y2m]; + x2 = x2m; + y2 = y2m; + } + var intr = interHelper(bez1, bez2, justCount); + if (justCount) { + res += intr; + } else { + for (var k = 0, kk = intr.length; k < kk; k++) { + intr[k].segment1 = i; + intr[k].segment2 = j; + intr[k].bez1 = bez1; + intr[k].bez2 = bez2; + } + res = res.concat(intr); + } + } + } + } + } + return res; + } + /*\ + * Raphael.isPointInsidePath + [ method ] + ** + * Utility method + ** + * Returns `true` if given point is inside a given closed path. + > Parameters + - path (string) path string + - x (number) x of the point + - y (number) y of the point + = (boolean) true, if point is inside the path + \*/ + R.isPointInsidePath = function (path, x, y) { + var bbox = R.pathBBox(path); + return R.isPointInsideBBox(bbox, x, y) && + interPathHelper(path, [["M", x, y], ["H", bbox.x2 + 10]], 1) % 2 == 1; + }; + R._removedFactory = function (methodname) { + return function () { + eve("raphael.log", null, "Rapha\xebl: you are calling to method \u201c" + methodname + "\u201d of removed object", methodname); + }; + }; + /*\ + * Raphael.pathBBox + [ method ] + ** + * Utility method + ** + * Return bounding box of a given path + > Parameters + - path (string) path string + = (object) bounding box + o { + o x: (number) x coordinate of the left top point of the box + o y: (number) y coordinate of the left top point of the box + o x2: (number) x coordinate of the right bottom point of the box + o y2: (number) y coordinate of the right bottom point of the box + o width: (number) width of the box + o height: (number) height of the box + o cx: (number) x coordinate of the center of the box + o cy: (number) y coordinate of the center of the box + o } + \*/ + var pathDimensions = R.pathBBox = function (path) { + var pth = paths(path); + if (pth.bbox) { + return clone(pth.bbox); + } + if (!path) { + return {x: 0, y: 0, width: 0, height: 0, x2: 0, y2: 0}; + } + path = path2curve(path); + var x = 0, + y = 0, + X = [], + Y = [], + p; + for (var i = 0, ii = path.length; i < ii; i++) { + p = path[i]; + if (p[0] == "M") { + x = p[1]; + y = p[2]; + X.push(x); + Y.push(y); + } else { + var dim = curveDim(x, y, p[1], p[2], p[3], p[4], p[5], p[6]); + X = X[concat](dim.min.x, dim.max.x); + Y = Y[concat](dim.min.y, dim.max.y); + x = p[5]; + y = p[6]; + } + } + var xmin = mmin[apply](0, X), + ymin = mmin[apply](0, Y), + xmax = mmax[apply](0, X), + ymax = mmax[apply](0, Y), + width = xmax - xmin, + height = ymax - ymin, + bb = { + x: xmin, + y: ymin, + x2: xmax, + y2: ymax, + width: width, + height: height, + cx: xmin + width / 2, + cy: ymin + height / 2 + }; + pth.bbox = clone(bb); + return bb; + }, + pathClone = function (pathArray) { + var res = clone(pathArray); + res.toString = R._path2string; + return res; + }, + pathToRelative = R._pathToRelative = function (pathArray) { + var pth = paths(pathArray); + if (pth.rel) { + return pathClone(pth.rel); + } + if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption + pathArray = R.parsePathString(pathArray); + } + var res = [], + x = 0, + y = 0, + mx = 0, + my = 0, + start = 0; + if (pathArray[0][0] == "M") { + x = pathArray[0][1]; + y = pathArray[0][2]; + mx = x; + my = y; + start++; + res.push(["M", x, y]); + } + for (var i = start, ii = pathArray.length; i < ii; i++) { + var r = res[i] = [], + pa = pathArray[i]; + if (pa[0] != lowerCase.call(pa[0])) { + r[0] = lowerCase.call(pa[0]); + switch (r[0]) { + case "a": + r[1] = pa[1]; + r[2] = pa[2]; + r[3] = pa[3]; + r[4] = pa[4]; + r[5] = pa[5]; + r[6] = +(pa[6] - x).toFixed(3); + r[7] = +(pa[7] - y).toFixed(3); + break; + case "v": + r[1] = +(pa[1] - y).toFixed(3); + break; + case "m": + mx = pa[1]; + my = pa[2]; + default: + for (var j = 1, jj = pa.length; j < jj; j++) { + r[j] = +(pa[j] - ((j % 2) ? x : y)).toFixed(3); + } + } + } else { + r = res[i] = []; + if (pa[0] == "m") { + mx = pa[1] + x; + my = pa[2] + y; + } + for (var k = 0, kk = pa.length; k < kk; k++) { + res[i][k] = pa[k]; + } + } + var len = res[i].length; + switch (res[i][0]) { + case "z": + x = mx; + y = my; + break; + case "h": + x += +res[i][len - 1]; + break; + case "v": + y += +res[i][len - 1]; + break; + default: + x += +res[i][len - 2]; + y += +res[i][len - 1]; + } + } + res.toString = R._path2string; + pth.rel = pathClone(res); + return res; + }, + pathToAbsolute = R._pathToAbsolute = function (pathArray) { + var pth = paths(pathArray); + if (pth.abs) { + return pathClone(pth.abs); + } + if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption + pathArray = R.parsePathString(pathArray); + } + if (!pathArray || !pathArray.length) { + return [["M", 0, 0]]; + } + var res = [], + x = 0, + y = 0, + mx = 0, + my = 0, + start = 0; + if (pathArray[0][0] == "M") { + x = +pathArray[0][1]; + y = +pathArray[0][2]; + mx = x; + my = y; + start++; + res[0] = ["M", x, y]; + } + var crz = pathArray.length == 3 && pathArray[0][0] == "M" && pathArray[1][0].toUpperCase() == "R" && pathArray[2][0].toUpperCase() == "Z"; + for (var r, pa, i = start, ii = pathArray.length; i < ii; i++) { + res.push(r = []); + pa = pathArray[i]; + if (pa[0] != upperCase.call(pa[0])) { + r[0] = upperCase.call(pa[0]); + switch (r[0]) { + case "A": + r[1] = pa[1]; + r[2] = pa[2]; + r[3] = pa[3]; + r[4] = pa[4]; + r[5] = pa[5]; + r[6] = +(pa[6] + x); + r[7] = +(pa[7] + y); + break; + case "V": + r[1] = +pa[1] + y; + break; + case "H": + r[1] = +pa[1] + x; + break; + case "R": + var dots = [x, y][concat](pa.slice(1)); + for (var j = 2, jj = dots.length; j < jj; j++) { + dots[j] = +dots[j] + x; + dots[++j] = +dots[j] + y; + } + res.pop(); + res = res[concat](catmullRom2bezier(dots, crz)); + break; + case "M": + mx = +pa[1] + x; + my = +pa[2] + y; + default: + for (j = 1, jj = pa.length; j < jj; j++) { + r[j] = +pa[j] + ((j % 2) ? x : y); + } + } + } else if (pa[0] == "R") { + dots = [x, y][concat](pa.slice(1)); + res.pop(); + res = res[concat](catmullRom2bezier(dots, crz)); + r = ["R"][concat](pa.slice(-2)); + } else { + for (var k = 0, kk = pa.length; k < kk; k++) { + r[k] = pa[k]; + } + } + switch (r[0]) { + case "Z": + x = mx; + y = my; + break; + case "H": + x = r[1]; + break; + case "V": + y = r[1]; + break; + case "M": + mx = r[r.length - 2]; + my = r[r.length - 1]; + default: + x = r[r.length - 2]; + y = r[r.length - 1]; + } + } + res.toString = R._path2string; + pth.abs = pathClone(res); + return res; + }, + l2c = function (x1, y1, x2, y2) { + return [x1, y1, x2, y2, x2, y2]; + }, + q2c = function (x1, y1, ax, ay, x2, y2) { + var _13 = 1 / 3, + _23 = 2 / 3; + return [ + _13 * x1 + _23 * ax, + _13 * y1 + _23 * ay, + _13 * x2 + _23 * ax, + _13 * y2 + _23 * ay, + x2, + y2 + ]; + }, + a2c = function (x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) { + // for more information of where this math came from visit: + // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes + var _120 = PI * 120 / 180, + rad = PI / 180 * (+angle || 0), + res = [], + xy, + rotate = cacher(function (x, y, rad) { + var X = x * math.cos(rad) - y * math.sin(rad), + Y = x * math.sin(rad) + y * math.cos(rad); + return {x: X, y: Y}; + }); + if (!recursive) { + xy = rotate(x1, y1, -rad); + x1 = xy.x; + y1 = xy.y; + xy = rotate(x2, y2, -rad); + x2 = xy.x; + y2 = xy.y; + var cos = math.cos(PI / 180 * angle), + sin = math.sin(PI / 180 * angle), + x = (x1 - x2) / 2, + y = (y1 - y2) / 2; + var h = (x * x) / (rx * rx) + (y * y) / (ry * ry); + if (h > 1) { + h = math.sqrt(h); + rx = h * rx; + ry = h * ry; + } + var rx2 = rx * rx, + ry2 = ry * ry, + k = (large_arc_flag == sweep_flag ? -1 : 1) * + math.sqrt(abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))), + cx = k * rx * y / ry + (x1 + x2) / 2, + cy = k * -ry * x / rx + (y1 + y2) / 2, + f1 = math.asin(((y1 - cy) / ry).toFixed(9)), + f2 = math.asin(((y2 - cy) / ry).toFixed(9)); + + f1 = x1 < cx ? PI - f1 : f1; + f2 = x2 < cx ? PI - f2 : f2; + f1 < 0 && (f1 = PI * 2 + f1); + f2 < 0 && (f2 = PI * 2 + f2); + if (sweep_flag && f1 > f2) { + f1 = f1 - PI * 2; + } + if (!sweep_flag && f2 > f1) { + f2 = f2 - PI * 2; + } + } else { + f1 = recursive[0]; + f2 = recursive[1]; + cx = recursive[2]; + cy = recursive[3]; + } + var df = f2 - f1; + if (abs(df) > _120) { + var f2old = f2, + x2old = x2, + y2old = y2; + f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1); + x2 = cx + rx * math.cos(f2); + y2 = cy + ry * math.sin(f2); + res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]); + } + df = f2 - f1; + var c1 = math.cos(f1), + s1 = math.sin(f1), + c2 = math.cos(f2), + s2 = math.sin(f2), + t = math.tan(df / 4), + hx = 4 / 3 * rx * t, + hy = 4 / 3 * ry * t, + m1 = [x1, y1], + m2 = [x1 + hx * s1, y1 - hy * c1], + m3 = [x2 + hx * s2, y2 - hy * c2], + m4 = [x2, y2]; + m2[0] = 2 * m1[0] - m2[0]; + m2[1] = 2 * m1[1] - m2[1]; + if (recursive) { + return [m2, m3, m4][concat](res); + } else { + res = [m2, m3, m4][concat](res).join()[split](","); + var newres = []; + for (var i = 0, ii = res.length; i < ii; i++) { + newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x; + } + return newres; + } + }, + findDotAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) { + var t1 = 1 - t; + return { + x: pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x, + y: pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y + }; + }, + curveDim = cacher(function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) { + var a = (c2x - 2 * c1x + p1x) - (p2x - 2 * c2x + c1x), + b = 2 * (c1x - p1x) - 2 * (c2x - c1x), + c = p1x - c1x, + t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a, + t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a, + y = [p1y, p2y], + x = [p1x, p2x], + dot; + abs(t1) > "1e12" && (t1 = .5); + abs(t2) > "1e12" && (t2 = .5); + if (t1 > 0 && t1 < 1) { + dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1); + x.push(dot.x); + y.push(dot.y); + } + if (t2 > 0 && t2 < 1) { + dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2); + x.push(dot.x); + y.push(dot.y); + } + a = (c2y - 2 * c1y + p1y) - (p2y - 2 * c2y + c1y); + b = 2 * (c1y - p1y) - 2 * (c2y - c1y); + c = p1y - c1y; + t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a; + t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a; + abs(t1) > "1e12" && (t1 = .5); + abs(t2) > "1e12" && (t2 = .5); + if (t1 > 0 && t1 < 1) { + dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1); + x.push(dot.x); + y.push(dot.y); + } + if (t2 > 0 && t2 < 1) { + dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2); + x.push(dot.x); + y.push(dot.y); + } + return { + min: {x: mmin[apply](0, x), y: mmin[apply](0, y)}, + max: {x: mmax[apply](0, x), y: mmax[apply](0, y)} + }; + }), + path2curve = R._path2curve = cacher(function (path, path2) { + var pth = !path2 && paths(path); + if (!path2 && pth.curve) { + return pathClone(pth.curve); + } + var p = pathToAbsolute(path), + p2 = path2 && pathToAbsolute(path2), + attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null}, + attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null}, + processPath = function (path, d, pcom) { + var nx, ny, tq = {T:1, Q:1}; + if (!path) { + return ["C", d.x, d.y, d.x, d.y, d.x, d.y]; + } + !(path[0] in tq) && (d.qx = d.qy = null); + switch (path[0]) { + case "M": + d.X = path[1]; + d.Y = path[2]; + break; + case "A": + path = ["C"][concat](a2c[apply](0, [d.x, d.y][concat](path.slice(1)))); + break; + case "S": + if (pcom == "C" || pcom == "S") { // In "S" case we have to take into account, if the previous command is C/S. + nx = d.x * 2 - d.bx; // And reflect the previous + ny = d.y * 2 - d.by; // command's control point relative to the current point. + } + else { // or some else or nothing + nx = d.x; + ny = d.y; + } + path = ["C", nx, ny][concat](path.slice(1)); + break; + case "T": + if (pcom == "Q" || pcom == "T") { // In "T" case we have to take into account, if the previous command is Q/T. + d.qx = d.x * 2 - d.qx; // And make a reflection similar + d.qy = d.y * 2 - d.qy; // to case "S". + } + else { // or something else or nothing + d.qx = d.x; + d.qy = d.y; + } + path = ["C"][concat](q2c(d.x, d.y, d.qx, d.qy, path[1], path[2])); + break; + case "Q": + d.qx = path[1]; + d.qy = path[2]; + path = ["C"][concat](q2c(d.x, d.y, path[1], path[2], path[3], path[4])); + break; + case "L": + path = ["C"][concat](l2c(d.x, d.y, path[1], path[2])); + break; + case "H": + path = ["C"][concat](l2c(d.x, d.y, path[1], d.y)); + break; + case "V": + path = ["C"][concat](l2c(d.x, d.y, d.x, path[1])); + break; + case "Z": + path = ["C"][concat](l2c(d.x, d.y, d.X, d.Y)); + break; + } + return path; + }, + fixArc = function (pp, i) { + if (pp[i].length > 7) { + pp[i].shift(); + var pi = pp[i]; + while (pi.length) { + pcoms1[i]="A"; // if created multiple C:s, their original seg is saved + p2 && (pcoms2[i]="A"); // the same as above + pp.splice(i++, 0, ["C"][concat](pi.splice(0, 6))); + } + pp.splice(i, 1); + ii = mmax(p.length, p2 && p2.length || 0); + } + }, + fixM = function (path1, path2, a1, a2, i) { + if (path1 && path2 && path1[i][0] == "M" && path2[i][0] != "M") { + path2.splice(i, 0, ["M", a2.x, a2.y]); + a1.bx = 0; + a1.by = 0; + a1.x = path1[i][1]; + a1.y = path1[i][2]; + ii = mmax(p.length, p2 && p2.length || 0); + } + }, + pcoms1 = [], // path commands of original path p + pcoms2 = [], // path commands of original path p2 + pfirst = "", // temporary holder for original path command + pcom = ""; // holder for previous path command of original path + for (var i = 0, ii = mmax(p.length, p2 && p2.length || 0); i < ii; i++) { + p[i] && (pfirst = p[i][0]); // save current path command + + if (pfirst != "C") // C is not saved yet, because it may be result of conversion + { + pcoms1[i] = pfirst; // Save current path command + i && ( pcom = pcoms1[i-1]); // Get previous path command pcom + } + p[i] = processPath(p[i], attrs, pcom); // Previous path command is inputted to processPath + + if (pcoms1[i] != "A" && pfirst == "C") pcoms1[i] = "C"; // A is the only command + // which may produce multiple C:s + // so we have to make sure that C is also C in original path + + fixArc(p, i); // fixArc adds also the right amount of A:s to pcoms1 + + if (p2) { // the same procedures is done to p2 + p2[i] && (pfirst = p2[i][0]); + if (pfirst != "C") + { + pcoms2[i] = pfirst; + i && (pcom = pcoms2[i-1]); + } + p2[i] = processPath(p2[i], attrs2, pcom); + + if (pcoms2[i]!="A" && pfirst=="C") pcoms2[i]="C"; + + fixArc(p2, i); + } + fixM(p, p2, attrs, attrs2, i); + fixM(p2, p, attrs2, attrs, i); + var seg = p[i], + seg2 = p2 && p2[i], + seglen = seg.length, + seg2len = p2 && seg2.length; + attrs.x = seg[seglen - 2]; + attrs.y = seg[seglen - 1]; + attrs.bx = toFloat(seg[seglen - 4]) || attrs.x; + attrs.by = toFloat(seg[seglen - 3]) || attrs.y; + attrs2.bx = p2 && (toFloat(seg2[seg2len - 4]) || attrs2.x); + attrs2.by = p2 && (toFloat(seg2[seg2len - 3]) || attrs2.y); + attrs2.x = p2 && seg2[seg2len - 2]; + attrs2.y = p2 && seg2[seg2len - 1]; + } + if (!p2) { + pth.curve = pathClone(p); + } + return p2 ? [p, p2] : p; + }, null, pathClone), + parseDots = R._parseDots = cacher(function (gradient) { + var dots = []; + for (var i = 0, ii = gradient.length; i < ii; i++) { + var dot = {}, + par = gradient[i].match(/^([^:]*):?([\d\.]*)/); + dot.color = R.getRGB(par[1]); + if (dot.color.error) { + return null; + } + dot.opacity = dot.color.opacity; + dot.color = dot.color.hex; + par[2] && (dot.offset = par[2] + "%"); + dots.push(dot); + } + for (i = 1, ii = dots.length - 1; i < ii; i++) { + if (!dots[i].offset) { + var start = toFloat(dots[i - 1].offset || 0), + end = 0; + for (var j = i + 1; j < ii; j++) { + if (dots[j].offset) { + end = dots[j].offset; + break; + } + } + if (!end) { + end = 100; + j = ii; + } + end = toFloat(end); + var d = (end - start) / (j - i + 1); + for (; i < j; i++) { + start += d; + dots[i].offset = start + "%"; + } + } + } + return dots; + }), + tear = R._tear = function (el, paper) { + el == paper.top && (paper.top = el.prev); + el == paper.bottom && (paper.bottom = el.next); + el.next && (el.next.prev = el.prev); + el.prev && (el.prev.next = el.next); + }, + tofront = R._tofront = function (el, paper) { + if (paper.top === el) { + return; + } + tear(el, paper); + el.next = null; + el.prev = paper.top; + paper.top.next = el; + paper.top = el; + }, + toback = R._toback = function (el, paper) { + if (paper.bottom === el) { + return; + } + tear(el, paper); + el.next = paper.bottom; + el.prev = null; + paper.bottom.prev = el; + paper.bottom = el; + }, + insertafter = R._insertafter = function (el, el2, paper) { + tear(el, paper); + el2 == paper.top && (paper.top = el); + el2.next && (el2.next.prev = el); + el.next = el2.next; + el.prev = el2; + el2.next = el; + }, + insertbefore = R._insertbefore = function (el, el2, paper) { + tear(el, paper); + el2 == paper.bottom && (paper.bottom = el); + el2.prev && (el2.prev.next = el); + el.prev = el2.prev; + el2.prev = el; + el.next = el2; + }, + /*\ + * Raphael.toMatrix + [ method ] + ** + * Utility method + ** + * Returns matrix of transformations applied to a given path + > Parameters + - path (string) path string + - transform (string|array) transformation string + = (object) @Matrix + \*/ + toMatrix = R.toMatrix = function (path, transform) { + var bb = pathDimensions(path), + el = { + _: { + transform: E + }, + getBBox: function () { + return bb; + } + }; + extractTransform(el, transform); + return el.matrix; + }, + /*\ + * Raphael.transformPath + [ method ] + ** + * Utility method + ** + * Returns path transformed by a given transformation + > Parameters + - path (string) path string + - transform (string|array) transformation string + = (string) path + \*/ + transformPath = R.transformPath = function (path, transform) { + return mapPath(path, toMatrix(path, transform)); + }, + extractTransform = R._extractTransform = function (el, tstr) { + if (tstr == null) { + return el._.transform; + } + tstr = Str(tstr).replace(/\.{3}|\u2026/g, el._.transform || E); + var tdata = R.parseTransformString(tstr), + deg = 0, + dx = 0, + dy = 0, + sx = 1, + sy = 1, + _ = el._, + m = new Matrix; + _.transform = tdata || []; + if (tdata) { + for (var i = 0, ii = tdata.length; i < ii; i++) { + var t = tdata[i], + tlen = t.length, + command = Str(t[0]).toLowerCase(), + absolute = t[0] != command, + inver = absolute ? m.invert() : 0, + x1, + y1, + x2, + y2, + bb; + if (command == "t" && tlen == 3) { + if (absolute) { + x1 = inver.x(0, 0); + y1 = inver.y(0, 0); + x2 = inver.x(t[1], t[2]); + y2 = inver.y(t[1], t[2]); + m.translate(x2 - x1, y2 - y1); + } else { + m.translate(t[1], t[2]); + } + } else if (command == "r") { + if (tlen == 2) { + bb = bb || el.getBBox(1); + m.rotate(t[1], bb.x + bb.width / 2, bb.y + bb.height / 2); + deg += t[1]; + } else if (tlen == 4) { + if (absolute) { + x2 = inver.x(t[2], t[3]); + y2 = inver.y(t[2], t[3]); + m.rotate(t[1], x2, y2); + } else { + m.rotate(t[1], t[2], t[3]); + } + deg += t[1]; + } + } else if (command == "s") { + if (tlen == 2 || tlen == 3) { + bb = bb || el.getBBox(1); + m.scale(t[1], t[tlen - 1], bb.x + bb.width / 2, bb.y + bb.height / 2); + sx *= t[1]; + sy *= t[tlen - 1]; + } else if (tlen == 5) { + if (absolute) { + x2 = inver.x(t[3], t[4]); + y2 = inver.y(t[3], t[4]); + m.scale(t[1], t[2], x2, y2); + } else { + m.scale(t[1], t[2], t[3], t[4]); + } + sx *= t[1]; + sy *= t[2]; + } + } else if (command == "m" && tlen == 7) { + m.add(t[1], t[2], t[3], t[4], t[5], t[6]); + } + _.dirtyT = 1; + el.matrix = m; + } + } + + /*\ + * Element.matrix + [ property (object) ] + ** + * Keeps @Matrix object, which represents element transformation + \*/ + el.matrix = m; + + _.sx = sx; + _.sy = sy; + _.deg = deg; + _.dx = dx = m.e; + _.dy = dy = m.f; + + if (sx == 1 && sy == 1 && !deg && _.bbox) { + _.bbox.x += +dx; + _.bbox.y += +dy; + } else { + _.dirtyT = 1; + } + }, + getEmpty = function (item) { + var l = item[0]; + switch (l.toLowerCase()) { + case "t": return [l, 0, 0]; + case "m": return [l, 1, 0, 0, 1, 0, 0]; + case "r": if (item.length == 4) { + return [l, 0, item[2], item[3]]; + } else { + return [l, 0]; + } + case "s": if (item.length == 5) { + return [l, 1, 1, item[3], item[4]]; + } else if (item.length == 3) { + return [l, 1, 1]; + } else { + return [l, 1]; + } + } + }, + equaliseTransform = R._equaliseTransform = function (t1, t2) { + t2 = Str(t2).replace(/\.{3}|\u2026/g, t1); + t1 = R.parseTransformString(t1) || []; + t2 = R.parseTransformString(t2) || []; + var maxlength = mmax(t1.length, t2.length), + from = [], + to = [], + i = 0, j, jj, + tt1, tt2; + for (; i < maxlength; i++) { + tt1 = t1[i] || getEmpty(t2[i]); + tt2 = t2[i] || getEmpty(tt1); + if ((tt1[0] != tt2[0]) || + (tt1[0].toLowerCase() == "r" && (tt1[2] != tt2[2] || tt1[3] != tt2[3])) || + (tt1[0].toLowerCase() == "s" && (tt1[3] != tt2[3] || tt1[4] != tt2[4])) + ) { + return; + } + from[i] = []; + to[i] = []; + for (j = 0, jj = mmax(tt1.length, tt2.length); j < jj; j++) { + j in tt1 && (from[i][j] = tt1[j]); + j in tt2 && (to[i][j] = tt2[j]); + } + } + return { + from: from, + to: to + }; + }; + R._getContainer = function (x, y, w, h) { + var container; + container = h == null && !R.is(x, "object") ? g.doc.getElementById(x) : x; + if (container == null) { + return; + } + if (container.tagName) { + if (y == null) { + return { + container: container, + width: container.style.pixelWidth || container.offsetWidth, + height: container.style.pixelHeight || container.offsetHeight + }; + } else { + return { + container: container, + width: y, + height: w + }; + } + } + return { + container: 1, + x: x, + y: y, + width: w, + height: h + }; + }; + /*\ + * Raphael.pathToRelative + [ method ] + ** + * Utility method + ** + * Converts path to relative form + > Parameters + - pathString (string|array) path string or array of segments + = (array) array of segments. + \*/ + R.pathToRelative = pathToRelative; + R._engine = {}; + /*\ + * Raphael.path2curve + [ method ] + ** + * Utility method + ** + * Converts path to a new path where all segments are cubic bezier curves. + > Parameters + - pathString (string|array) path string or array of segments + = (array) array of segments. + \*/ + R.path2curve = path2curve; + /*\ + * Raphael.matrix + [ method ] + ** + * Utility method + ** + * Returns matrix based on given parameters. + > Parameters + - a (number) + - b (number) + - c (number) + - d (number) + - e (number) + - f (number) + = (object) @Matrix + \*/ + R.matrix = function (a, b, c, d, e, f) { + return new Matrix(a, b, c, d, e, f); + }; + function Matrix(a, b, c, d, e, f) { + if (a != null) { + this.a = +a; + this.b = +b; + this.c = +c; + this.d = +d; + this.e = +e; + this.f = +f; + } else { + this.a = 1; + this.b = 0; + this.c = 0; + this.d = 1; + this.e = 0; + this.f = 0; + } + } + (function (matrixproto) { + /*\ + * Matrix.add + [ method ] + ** + * Adds given matrix to existing one. + > Parameters + - a (number) + - b (number) + - c (number) + - d (number) + - e (number) + - f (number) + or + - matrix (object) @Matrix + \*/ + matrixproto.add = function (a, b, c, d, e, f) { + var out = [[], [], []], + m = [[this.a, this.c, this.e], [this.b, this.d, this.f], [0, 0, 1]], + matrix = [[a, c, e], [b, d, f], [0, 0, 1]], + x, y, z, res; + + if (a && a instanceof Matrix) { + matrix = [[a.a, a.c, a.e], [a.b, a.d, a.f], [0, 0, 1]]; + } + + for (x = 0; x < 3; x++) { + for (y = 0; y < 3; y++) { + res = 0; + for (z = 0; z < 3; z++) { + res += m[x][z] * matrix[z][y]; + } + out[x][y] = res; + } + } + this.a = out[0][0]; + this.b = out[1][0]; + this.c = out[0][1]; + this.d = out[1][1]; + this.e = out[0][2]; + this.f = out[1][2]; + }; + /*\ + * Matrix.invert + [ method ] + ** + * Returns inverted version of the matrix + = (object) @Matrix + \*/ + matrixproto.invert = function () { + var me = this, + x = me.a * me.d - me.b * me.c; + return new Matrix(me.d / x, -me.b / x, -me.c / x, me.a / x, (me.c * me.f - me.d * me.e) / x, (me.b * me.e - me.a * me.f) / x); + }; + /*\ + * Matrix.clone + [ method ] + ** + * Returns copy of the matrix + = (object) @Matrix + \*/ + matrixproto.clone = function () { + return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f); + }; + /*\ + * Matrix.translate + [ method ] + ** + * Translate the matrix + > Parameters + - x (number) + - y (number) + \*/ + matrixproto.translate = function (x, y) { + this.add(1, 0, 0, 1, x, y); + }; + /*\ + * Matrix.scale + [ method ] + ** + * Scales the matrix + > Parameters + - x (number) + - y (number) #optional + - cx (number) #optional + - cy (number) #optional + \*/ + matrixproto.scale = function (x, y, cx, cy) { + y == null && (y = x); + (cx || cy) && this.add(1, 0, 0, 1, cx, cy); + this.add(x, 0, 0, y, 0, 0); + (cx || cy) && this.add(1, 0, 0, 1, -cx, -cy); + }; + /*\ + * Matrix.rotate + [ method ] + ** + * Rotates the matrix + > Parameters + - a (number) + - x (number) + - y (number) + \*/ + matrixproto.rotate = function (a, x, y) { + a = R.rad(a); + x = x || 0; + y = y || 0; + var cos = +math.cos(a).toFixed(9), + sin = +math.sin(a).toFixed(9); + this.add(cos, sin, -sin, cos, x, y); + this.add(1, 0, 0, 1, -x, -y); + }; + /*\ + * Matrix.x + [ method ] + ** + * Return x coordinate for given point after transformation described by the matrix. See also @Matrix.y + > Parameters + - x (number) + - y (number) + = (number) x + \*/ + matrixproto.x = function (x, y) { + return x * this.a + y * this.c + this.e; + }; + /*\ + * Matrix.y + [ method ] + ** + * Return y coordinate for given point after transformation described by the matrix. See also @Matrix.x + > Parameters + - x (number) + - y (number) + = (number) y + \*/ + matrixproto.y = function (x, y) { + return x * this.b + y * this.d + this.f; + }; + matrixproto.get = function (i) { + return +this[Str.fromCharCode(97 + i)].toFixed(4); + }; + matrixproto.toString = function () { + return R.svg ? + "matrix(" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)].join() + ")" : + [this.get(0), this.get(2), this.get(1), this.get(3), 0, 0].join(); + }; + matrixproto.toFilter = function () { + return "progid:DXImageTransform.Microsoft.Matrix(M11=" + this.get(0) + + ", M12=" + this.get(2) + ", M21=" + this.get(1) + ", M22=" + this.get(3) + + ", Dx=" + this.get(4) + ", Dy=" + this.get(5) + ", sizingmethod='auto expand')"; + }; + matrixproto.offset = function () { + return [this.e.toFixed(4), this.f.toFixed(4)]; + }; + function norm(a) { + return a[0] * a[0] + a[1] * a[1]; + } + function normalize(a) { + var mag = math.sqrt(norm(a)); + a[0] && (a[0] /= mag); + a[1] && (a[1] /= mag); + } + /*\ + * Matrix.split + [ method ] + ** + * Splits matrix into primitive transformations + = (object) in format: + o dx (number) translation by x + o dy (number) translation by y + o scalex (number) scale by x + o scaley (number) scale by y + o shear (number) shear + o rotate (number) rotation in deg + o isSimple (boolean) could it be represented via simple transformations + \*/ + matrixproto.split = function () { + var out = {}; + // translation + out.dx = this.e; + out.dy = this.f; + + // scale and shear + var row = [[this.a, this.c], [this.b, this.d]]; + out.scalex = math.sqrt(norm(row[0])); + normalize(row[0]); + + out.shear = row[0][0] * row[1][0] + row[0][1] * row[1][1]; + row[1] = [row[1][0] - row[0][0] * out.shear, row[1][1] - row[0][1] * out.shear]; + + out.scaley = math.sqrt(norm(row[1])); + normalize(row[1]); + out.shear /= out.scaley; + + // rotation + var sin = -row[0][1], + cos = row[1][1]; + if (cos < 0) { + out.rotate = R.deg(math.acos(cos)); + if (sin < 0) { + out.rotate = 360 - out.rotate; + } + } else { + out.rotate = R.deg(math.asin(sin)); + } + + out.isSimple = !+out.shear.toFixed(9) && (out.scalex.toFixed(9) == out.scaley.toFixed(9) || !out.rotate); + out.isSuperSimple = !+out.shear.toFixed(9) && out.scalex.toFixed(9) == out.scaley.toFixed(9) && !out.rotate; + out.noRotation = !+out.shear.toFixed(9) && !out.rotate; + return out; + }; + /*\ + * Matrix.toTransformString + [ method ] + ** + * Return transform string that represents given matrix + = (string) transform string + \*/ + matrixproto.toTransformString = function (shorter) { + var s = shorter || this[split](); + if (s.isSimple) { + s.scalex = +s.scalex.toFixed(4); + s.scaley = +s.scaley.toFixed(4); + s.rotate = +s.rotate.toFixed(4); + return (s.dx || s.dy ? "t" + [s.dx, s.dy] : E) + + (s.scalex != 1 || s.scaley != 1 ? "s" + [s.scalex, s.scaley, 0, 0] : E) + + (s.rotate ? "r" + [s.rotate, 0, 0] : E); + } else { + return "m" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)]; + } + }; + })(Matrix.prototype); + + var preventDefault = function () { + this.returnValue = false; + }, + preventTouch = function () { + return this.originalEvent.preventDefault(); + }, + stopPropagation = function () { + this.cancelBubble = true; + }, + stopTouch = function () { + return this.originalEvent.stopPropagation(); + }, + getEventPosition = function (e) { + var scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop, + scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft; + + return { + x: e.clientX + scrollX, + y: e.clientY + scrollY + }; + }, + addEvent = (function () { + if (g.doc.addEventListener) { + return function (obj, type, fn, element) { + var f = function (e) { + var pos = getEventPosition(e); + return fn.call(element, e, pos.x, pos.y); + }; + obj.addEventListener(type, f, false); + + if (supportsTouch && touchMap[type]) { + var _f = function (e) { + var pos = getEventPosition(e), + olde = e; + + for (var i = 0, ii = e.targetTouches && e.targetTouches.length; i < ii; i++) { + if (e.targetTouches[i].target == obj) { + e = e.targetTouches[i]; + e.originalEvent = olde; + e.preventDefault = preventTouch; + e.stopPropagation = stopTouch; + break; + } + } + + return fn.call(element, e, pos.x, pos.y); + }; + obj.addEventListener(touchMap[type], _f, false); + } + + return function () { + obj.removeEventListener(type, f, false); + + if (supportsTouch && touchMap[type]) + obj.removeEventListener(touchMap[type], _f, false); + + return true; + }; + }; + } else if (g.doc.attachEvent) { + return function (obj, type, fn, element) { + var f = function (e) { + e = e || g.win.event; + var scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop, + scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft, + x = e.clientX + scrollX, + y = e.clientY + scrollY; + e.preventDefault = e.preventDefault || preventDefault; + e.stopPropagation = e.stopPropagation || stopPropagation; + return fn.call(element, e, x, y); + }; + obj.attachEvent("on" + type, f); + var detacher = function () { + obj.detachEvent("on" + type, f); + return true; + }; + return detacher; + }; + } + })(), + drag = [], + dragMove = function (e) { + var x = e.clientX, + y = e.clientY, + scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop, + scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft, + dragi, + j = drag.length; + while (j--) { + dragi = drag[j]; + if (supportsTouch && e.touches) { + var i = e.touches.length, + touch; + while (i--) { + touch = e.touches[i]; + if (touch.identifier == dragi.el._drag.id) { + x = touch.clientX; + y = touch.clientY; + (e.originalEvent ? e.originalEvent : e).preventDefault(); + break; + } + } + } else { + e.preventDefault(); + } + var node = dragi.el.node, + o, + next = node.nextSibling, + parent = node.parentNode, + display = node.style.display; + g.win.opera && parent.removeChild(node); + node.style.display = "none"; + o = dragi.el.paper.getElementByPoint(x, y); + node.style.display = display; + g.win.opera && (next ? parent.insertBefore(node, next) : parent.appendChild(node)); + o && eve("raphael.drag.over." + dragi.el.id, dragi.el, o); + x += scrollX; + y += scrollY; + eve("raphael.drag.move." + dragi.el.id, dragi.move_scope || dragi.el, x - dragi.el._drag.x, y - dragi.el._drag.y, x, y, e); + } + }, + dragUp = function (e) { + R.unmousemove(dragMove).unmouseup(dragUp); + var i = drag.length, + dragi; + while (i--) { + dragi = drag[i]; + dragi.el._drag = {}; + eve("raphael.drag.end." + dragi.el.id, dragi.end_scope || dragi.start_scope || dragi.move_scope || dragi.el, e); + } + drag = []; + }, + /*\ + * Raphael.el + [ property (object) ] + ** + * You can add your own method to elements. This is useful when you want to hack default functionality or + * want to wrap some common transformation or attributes in one method. In difference to canvas methods, + * you can redefine element method at any time. Expending element methods wouldn’t affect set. + > Usage + | Raphael.el.red = function () { + | this.attr({fill: "#f00"}); + | }; + | // then use it + | paper.circle(100, 100, 20).red(); + \*/ + elproto = R.el = {}; + /*\ + * Element.click + [ method ] + ** + * Adds event handler for click for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unclick + [ method ] + ** + * Removes event handler for click for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.dblclick + [ method ] + ** + * Adds event handler for double click for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.undblclick + [ method ] + ** + * Removes event handler for double click for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mousedown + [ method ] + ** + * Adds event handler for mousedown for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmousedown + [ method ] + ** + * Removes event handler for mousedown for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mousemove + [ method ] + ** + * Adds event handler for mousemove for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmousemove + [ method ] + ** + * Removes event handler for mousemove for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mouseout + [ method ] + ** + * Adds event handler for mouseout for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmouseout + [ method ] + ** + * Removes event handler for mouseout for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mouseover + [ method ] + ** + * Adds event handler for mouseover for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmouseover + [ method ] + ** + * Removes event handler for mouseover for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mouseup + [ method ] + ** + * Adds event handler for mouseup for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmouseup + [ method ] + ** + * Removes event handler for mouseup for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.touchstart + [ method ] + ** + * Adds event handler for touchstart for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.untouchstart + [ method ] + ** + * Removes event handler for touchstart for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.touchmove + [ method ] + ** + * Adds event handler for touchmove for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.untouchmove + [ method ] + ** + * Removes event handler for touchmove for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.touchend + [ method ] + ** + * Adds event handler for touchend for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.untouchend + [ method ] + ** + * Removes event handler for touchend for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.touchcancel + [ method ] + ** + * Adds event handler for touchcancel for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.untouchcancel + [ method ] + ** + * Removes event handler for touchcancel for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + for (var i = events.length; i--;) { + (function (eventName) { + R[eventName] = elproto[eventName] = function (fn, scope) { + if (R.is(fn, "function")) { + this.events = this.events || []; + this.events.push({name: eventName, f: fn, unbind: addEvent(this.shape || this.node || g.doc, eventName, fn, scope || this)}); + } + return this; + }; + R["un" + eventName] = elproto["un" + eventName] = function (fn) { + var events = this.events || [], + l = events.length; + while (l--){ + if (events[l].name == eventName && (R.is(fn, "undefined") || events[l].f == fn)) { + events[l].unbind(); + events.splice(l, 1); + !events.length && delete this.events; + } + } + return this; + }; + })(events[i]); + } + + /*\ + * Element.data + [ method ] + ** + * Adds or retrieves given value associated with given key. + ** + * See also @Element.removeData + > Parameters + - key (string) key to store data + - value (any) #optional value to store + = (object) @Element + * or, if value is not specified: + = (any) value + * or, if key and value are not specified: + = (object) Key/value pairs for all the data associated with the element. + > Usage + | for (var i = 0, i < 5, i++) { + | paper.circle(10 + 15 * i, 10, 10) + | .attr({fill: "#000"}) + | .data("i", i) + | .click(function () { + | alert(this.data("i")); + | }); + | } + \*/ + elproto.data = function (key, value) { + var data = eldata[this.id] = eldata[this.id] || {}; + if (arguments.length == 0) { + return data; + } + if (arguments.length == 1) { + if (R.is(key, "object")) { + for (var i in key) if (key[has](i)) { + this.data(i, key[i]); + } + return this; + } + eve("raphael.data.get." + this.id, this, data[key], key); + return data[key]; + } + data[key] = value; + eve("raphael.data.set." + this.id, this, value, key); + return this; + }; + /*\ + * Element.removeData + [ method ] + ** + * Removes value associated with an element by given key. + * If key is not provided, removes all the data of the element. + > Parameters + - key (string) #optional key + = (object) @Element + \*/ + elproto.removeData = function (key) { + if (key == null) { + eldata[this.id] = {}; + } else { + eldata[this.id] && delete eldata[this.id][key]; + } + return this; + }; + /*\ + * Element.getData + [ method ] + ** + * Retrieves the element data + = (object) data + \*/ + elproto.getData = function () { + return clone(eldata[this.id] || {}); + }; + /*\ + * Element.hover + [ method ] + ** + * Adds event handlers for hover for the element. + > Parameters + - f_in (function) handler for hover in + - f_out (function) handler for hover out + - icontext (object) #optional context for hover in handler + - ocontext (object) #optional context for hover out handler + = (object) @Element + \*/ + elproto.hover = function (f_in, f_out, scope_in, scope_out) { + return this.mouseover(f_in, scope_in).mouseout(f_out, scope_out || scope_in); + }; + /*\ + * Element.unhover + [ method ] + ** + * Removes event handlers for hover for the element. + > Parameters + - f_in (function) handler for hover in + - f_out (function) handler for hover out + = (object) @Element + \*/ + elproto.unhover = function (f_in, f_out) { + return this.unmouseover(f_in).unmouseout(f_out); + }; + var draggable = []; + /*\ + * Element.drag + [ method ] + ** + * Adds event handlers for drag of the element. + > Parameters + - onmove (function) handler for moving + - onstart (function) handler for drag start + - onend (function) handler for drag end + - mcontext (object) #optional context for moving handler + - scontext (object) #optional context for drag start handler + - econtext (object) #optional context for drag end handler + * Additionally following `drag` events will be triggered: `drag.start.<id>` on start, + * `drag.end.<id>` on end and `drag.move.<id>` on every move. When element will be dragged over another element + * `drag.over.<id>` will be fired as well. + * + * Start event and start handler will be called in specified context or in context of the element with following parameters: + o x (number) x position of the mouse + o y (number) y position of the mouse + o event (object) DOM event object + * Move event and move handler will be called in specified context or in context of the element with following parameters: + o dx (number) shift by x from the start point + o dy (number) shift by y from the start point + o x (number) x position of the mouse + o y (number) y position of the mouse + o event (object) DOM event object + * End event and end handler will be called in specified context or in context of the element with following parameters: + o event (object) DOM event object + = (object) @Element + \*/ + elproto.drag = function (onmove, onstart, onend, move_scope, start_scope, end_scope) { + function start(e) { + (e.originalEvent || e).preventDefault(); + var x = e.clientX, + y = e.clientY, + scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop, + scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft; + this._drag.id = e.identifier; + if (supportsTouch && e.touches) { + var i = e.touches.length, touch; + while (i--) { + touch = e.touches[i]; + this._drag.id = touch.identifier; + if (touch.identifier == this._drag.id) { + x = touch.clientX; + y = touch.clientY; + break; + } + } + } + this._drag.x = x + scrollX; + this._drag.y = y + scrollY; + !drag.length && R.mousemove(dragMove).mouseup(dragUp); + drag.push({el: this, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope}); + onstart && eve.on("raphael.drag.start." + this.id, onstart); + onmove && eve.on("raphael.drag.move." + this.id, onmove); + onend && eve.on("raphael.drag.end." + this.id, onend); + eve("raphael.drag.start." + this.id, start_scope || move_scope || this, e.clientX + scrollX, e.clientY + scrollY, e); + } + this._drag = {}; + draggable.push({el: this, start: start}); + this.mousedown(start); + return this; + }; + /*\ + * Element.onDragOver + [ method ] + ** + * Shortcut for assigning event handler for `drag.over.<id>` event, where id is id of the element (see @Element.id). + > Parameters + - f (function) handler for event, first argument would be the element you are dragging over + \*/ + elproto.onDragOver = function (f) { + f ? eve.on("raphael.drag.over." + this.id, f) : eve.unbind("raphael.drag.over." + this.id); + }; + /*\ + * Element.undrag + [ method ] + ** + * Removes all drag event handlers from given element. + \*/ + elproto.undrag = function () { + var i = draggable.length; + while (i--) if (draggable[i].el == this) { + this.unmousedown(draggable[i].start); + draggable.splice(i, 1); + eve.unbind("raphael.drag.*." + this.id); + } + !draggable.length && R.unmousemove(dragMove).unmouseup(dragUp); + drag = []; + }; + /*\ + * Paper.circle + [ method ] + ** + * Draws a circle. + ** + > Parameters + ** + - x (number) x coordinate of the centre + - y (number) y coordinate of the centre + - r (number) radius + = (object) Raphaël element object with type “circle” + ** + > Usage + | var c = paper.circle(50, 50, 40); + \*/ + paperproto.circle = function (x, y, r) { + var out = R._engine.circle(this, x || 0, y || 0, r || 0); + this.__set__ && this.__set__.push(out); + return out; + }; + /*\ + * Paper.rect + [ method ] + * + * Draws a rectangle. + ** + > Parameters + ** + - x (number) x coordinate of the top left corner + - y (number) y coordinate of the top left corner + - width (number) width + - height (number) height + - r (number) #optional radius for rounded corners, default is 0 + = (object) Raphaël element object with type “rect” + ** + > Usage + | // regular rectangle + | var c = paper.rect(10, 10, 50, 50); + | // rectangle with rounded corners + | var c = paper.rect(40, 40, 50, 50, 10); + \*/ + paperproto.rect = function (x, y, w, h, r) { + var out = R._engine.rect(this, x || 0, y || 0, w || 0, h || 0, r || 0); + this.__set__ && this.__set__.push(out); + return out; + }; + /*\ + * Paper.ellipse + [ method ] + ** + * Draws an ellipse. + ** + > Parameters + ** + - x (number) x coordinate of the centre + - y (number) y coordinate of the centre + - rx (number) horizontal radius + - ry (number) vertical radius + = (object) Raphaël element object with type “ellipse” + ** + > Usage + | var c = paper.ellipse(50, 50, 40, 20); + \*/ + paperproto.ellipse = function (x, y, rx, ry) { + var out = R._engine.ellipse(this, x || 0, y || 0, rx || 0, ry || 0); + this.__set__ && this.__set__.push(out); + return out; + }; + /*\ + * Paper.path + [ method ] + ** + * Creates a path element by given path data string. + > Parameters + - pathString (string) #optional path string in SVG format. + * Path string consists of one-letter commands, followed by comma seprarated arguments in numercal form. Example: + | "M10,20L30,40" + * Here we can see two commands: “M”, with arguments `(10, 20)` and “L” with arguments `(30, 40)`. Upper case letter mean command is absolute, lower case—relative. + * + # <p>Here is short list of commands available, for more details see <a href="http://www.w3.org/TR/SVG/paths.html#PathData" title="Details of a path's data attribute's format are described in the SVG specification.">SVG path string format</a>.</p> + # <table><thead><tr><th>Command</th><th>Name</th><th>Parameters</th></tr></thead><tbody> + # <tr><td>M</td><td>moveto</td><td>(x y)+</td></tr> + # <tr><td>Z</td><td>closepath</td><td>(none)</td></tr> + # <tr><td>L</td><td>lineto</td><td>(x y)+</td></tr> + # <tr><td>H</td><td>horizontal lineto</td><td>x+</td></tr> + # <tr><td>V</td><td>vertical lineto</td><td>y+</td></tr> + # <tr><td>C</td><td>curveto</td><td>(x1 y1 x2 y2 x y)+</td></tr> + # <tr><td>S</td><td>smooth curveto</td><td>(x2 y2 x y)+</td></tr> + # <tr><td>Q</td><td>quadratic Bézier curveto</td><td>(x1 y1 x y)+</td></tr> + # <tr><td>T</td><td>smooth quadratic Bézier curveto</td><td>(x y)+</td></tr> + # <tr><td>A</td><td>elliptical arc</td><td>(rx ry x-axis-rotation large-arc-flag sweep-flag x y)+</td></tr> + # <tr><td>R</td><td><a href="http://en.wikipedia.org/wiki/Catmull–Rom_spline#Catmull.E2.80.93Rom_spline">Catmull-Rom curveto</a>*</td><td>x1 y1 (x y)+</td></tr></tbody></table> + * * “Catmull-Rom curveto” is a not standard SVG command and added in 2.0 to make life easier. + * Note: there is a special case when path consist of just three commands: “M10,10R…z”. In this case path will smoothly connects to its beginning. + > Usage + | var c = paper.path("M10 10L90 90"); + | // draw a diagonal line: + | // move to 10,10, line to 90,90 + * For example of path strings, check out these icons: http://raphaeljs.com/icons/ + \*/ + paperproto.path = function (pathString) { + pathString && !R.is(pathString, string) && !R.is(pathString[0], array) && (pathString += E); + var out = R._engine.path(R.format[apply](R, arguments), this); + this.__set__ && this.__set__.push(out); + return out; + }; + /*\ + * Paper.image + [ method ] + ** + * Embeds an image into the surface. + ** + > Parameters + ** + - src (string) URI of the source image + - x (number) x coordinate position + - y (number) y coordinate position + - width (number) width of the image + - height (number) height of the image + = (object) Raphaël element object with type “image” + ** + > Usage + | var c = paper.image("apple.png", 10, 10, 80, 80); + \*/ + paperproto.image = function (src, x, y, w, h) { + var out = R._engine.image(this, src || "about:blank", x || 0, y || 0, w || 0, h || 0); + this.__set__ && this.__set__.push(out); + return out; + }; + /*\ + * Paper.text + [ method ] + ** + * Draws a text string. If you need line breaks, put “\n” in the string. + ** + > Parameters + ** + - x (number) x coordinate position + - y (number) y coordinate position + - text (string) The text string to draw + = (object) Raphaël element object with type “text” + ** + > Usage + | var t = paper.text(50, 50, "Raphaël\nkicks\nbutt!"); + \*/ + paperproto.text = function (x, y, text) { + var out = R._engine.text(this, x || 0, y || 0, Str(text)); + this.__set__ && this.__set__.push(out); + return out; + }; + /*\ + * Paper.set + [ method ] + ** + * Creates array-like object to keep and operate several elements at once. + * Warning: it doesn’t create any elements for itself in the page, it just groups existing elements. + * Sets act as pseudo elements — all methods available to an element can be used on a set. + = (object) array-like object that represents set of elements + ** + > Usage + | var st = paper.set(); + | st.push( + | paper.circle(10, 10, 5), + | paper.circle(30, 10, 5) + | ); + | st.attr({fill: "red"}); // changes the fill of both circles + \*/ + paperproto.set = function (itemsArray) { + !R.is(itemsArray, "array") && (itemsArray = Array.prototype.splice.call(arguments, 0, arguments.length)); + var out = new Set(itemsArray); + this.__set__ && this.__set__.push(out); + out["paper"] = this; + out["type"] = "set"; + return out; + }; + /*\ + * Paper.setStart + [ method ] + ** + * Creates @Paper.set. All elements that will be created after calling this method and before calling + * @Paper.setFinish will be added to the set. + ** + > Usage + | paper.setStart(); + | paper.circle(10, 10, 5), + | paper.circle(30, 10, 5) + | var st = paper.setFinish(); + | st.attr({fill: "red"}); // changes the fill of both circles + \*/ + paperproto.setStart = function (set) { + this.__set__ = set || this.set(); + }; + /*\ + * Paper.setFinish + [ method ] + ** + * See @Paper.setStart. This method finishes catching and returns resulting set. + ** + = (object) set + \*/ + paperproto.setFinish = function (set) { + var out = this.__set__; + delete this.__set__; + return out; + }; + /*\ + * Paper.getSize + [ method ] + ** + * Obtains current paper actual size. + ** + = (object) + \*/ + paperproto.getSize = function () { + var container = this.canvas.parentNode; + return { + width: container.offsetWidth, + height: container.offsetHeight + }; + }; + /*\ + * Paper.setSize + [ method ] + ** + * If you need to change dimensions of the canvas call this method + ** + > Parameters + ** + - width (number) new width of the canvas + - height (number) new height of the canvas + \*/ + paperproto.setSize = function (width, height) { + return R._engine.setSize.call(this, width, height); + }; + /*\ + * Paper.setViewBox + [ method ] + ** + * Sets the view box of the paper. Practically it gives you ability to zoom and pan whole paper surface by + * specifying new boundaries. + ** + > Parameters + ** + - x (number) new x position, default is `0` + - y (number) new y position, default is `0` + - w (number) new width of the canvas + - h (number) new height of the canvas + - fit (boolean) `true` if you want graphics to fit into new boundary box + \*/ + paperproto.setViewBox = function (x, y, w, h, fit) { + return R._engine.setViewBox.call(this, x, y, w, h, fit); + }; + /*\ + * Paper.top + [ property ] + ** + * Points to the topmost element on the paper + \*/ + /*\ + * Paper.bottom + [ property ] + ** + * Points to the bottom element on the paper + \*/ + paperproto.top = paperproto.bottom = null; + /*\ + * Paper.raphael + [ property ] + ** + * Points to the @Raphael object/function + \*/ + paperproto.raphael = R; + var getOffset = function (elem) { + var box = elem.getBoundingClientRect(), + doc = elem.ownerDocument, + body = doc.body, + docElem = doc.documentElement, + clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0, + top = box.top + (g.win.pageYOffset || docElem.scrollTop || body.scrollTop ) - clientTop, + left = box.left + (g.win.pageXOffset || docElem.scrollLeft || body.scrollLeft) - clientLeft; + return { + y: top, + x: left + }; + }; + /*\ + * Paper.getElementByPoint + [ method ] + ** + * Returns you topmost element under given point. + ** + = (object) Raphaël element object + > Parameters + ** + - x (number) x coordinate from the top left corner of the window + - y (number) y coordinate from the top left corner of the window + > Usage + | paper.getElementByPoint(mouseX, mouseY).attr({stroke: "#f00"}); + \*/ + paperproto.getElementByPoint = function (x, y) { + var paper = this, + svg = paper.canvas, + target = g.doc.elementFromPoint(x, y); + if (g.win.opera && target.tagName == "svg") { + var so = getOffset(svg), + sr = svg.createSVGRect(); + sr.x = x - so.x; + sr.y = y - so.y; + sr.width = sr.height = 1; + var hits = svg.getIntersectionList(sr, null); + if (hits.length) { + target = hits[hits.length - 1]; + } + } + if (!target) { + return null; + } + while (target.parentNode && target != svg.parentNode && !target.raphael) { + target = target.parentNode; + } + target == paper.canvas.parentNode && (target = svg); + target = target && target.raphael ? paper.getById(target.raphaelid) : null; + return target; + }; + + /*\ + * Paper.getElementsByBBox + [ method ] + ** + * Returns set of elements that have an intersecting bounding box + ** + > Parameters + ** + - bbox (object) bbox to check with + = (object) @Set + \*/ + paperproto.getElementsByBBox = function (bbox) { + var set = this.set(); + this.forEach(function (el) { + if (R.isBBoxIntersect(el.getBBox(), bbox)) { + set.push(el); + } + }); + return set; + }; + + /*\ + * Paper.getById + [ method ] + ** + * Returns you element by its internal ID. + ** + > Parameters + ** + - id (number) id + = (object) Raphaël element object + \*/ + paperproto.getById = function (id) { + var bot = this.bottom; + while (bot) { + if (bot.id == id) { + return bot; + } + bot = bot.next; + } + return null; + }; + /*\ + * Paper.forEach + [ method ] + ** + * Executes given function for each element on the paper + * + * If callback function returns `false` it will stop loop running. + ** + > Parameters + ** + - callback (function) function to run + - thisArg (object) context object for the callback + = (object) Paper object + > Usage + | paper.forEach(function (el) { + | el.attr({ stroke: "blue" }); + | }); + \*/ + paperproto.forEach = function (callback, thisArg) { + var bot = this.bottom; + while (bot) { + if (callback.call(thisArg, bot) === false) { + return this; + } + bot = bot.next; + } + return this; + }; + /*\ + * Paper.getElementsByPoint + [ method ] + ** + * Returns set of elements that have common point inside + ** + > Parameters + ** + - x (number) x coordinate of the point + - y (number) y coordinate of the point + = (object) @Set + \*/ + paperproto.getElementsByPoint = function (x, y) { + var set = this.set(); + this.forEach(function (el) { + if (el.isPointInside(x, y)) { + set.push(el); + } + }); + return set; + }; + function x_y() { + return this.x + S + this.y; + } + function x_y_w_h() { + return this.x + S + this.y + S + this.width + " \xd7 " + this.height; + } + /*\ + * Element.isPointInside + [ method ] + ** + * Determine if given point is inside this element’s shape + ** + > Parameters + ** + - x (number) x coordinate of the point + - y (number) y coordinate of the point + = (boolean) `true` if point inside the shape + \*/ + elproto.isPointInside = function (x, y) { + var rp = this.realPath = getPath[this.type](this); + if (this.attr('transform') && this.attr('transform').length) { + rp = R.transformPath(rp, this.attr('transform')); + } + return R.isPointInsidePath(rp, x, y); + }; + /*\ + * Element.getBBox + [ method ] + ** + * Return bounding box for a given element + ** + > Parameters + ** + - isWithoutTransform (boolean) flag, `true` if you want to have bounding box before transformations. Default is `false`. + = (object) Bounding box object: + o { + o x: (number) top left corner x + o y: (number) top left corner y + o x2: (number) bottom right corner x + o y2: (number) bottom right corner y + o width: (number) width + o height: (number) height + o } + \*/ + elproto.getBBox = function (isWithoutTransform) { + if (this.removed) { + return {}; + } + var _ = this._; + if (isWithoutTransform) { + if (_.dirty || !_.bboxwt) { + this.realPath = getPath[this.type](this); + _.bboxwt = pathDimensions(this.realPath); + _.bboxwt.toString = x_y_w_h; + _.dirty = 0; + } + return _.bboxwt; + } + if (_.dirty || _.dirtyT || !_.bbox) { + if (_.dirty || !this.realPath) { + _.bboxwt = 0; + this.realPath = getPath[this.type](this); + } + _.bbox = pathDimensions(mapPath(this.realPath, this.matrix)); + _.bbox.toString = x_y_w_h; + _.dirty = _.dirtyT = 0; + } + return _.bbox; + }; + /*\ + * Element.clone + [ method ] + ** + = (object) clone of a given element + ** + \*/ + elproto.clone = function () { + if (this.removed) { + return null; + } + var out = this.paper[this.type]().attr(this.attr()); + this.__set__ && this.__set__.push(out); + return out; + }; + /*\ + * Element.glow + [ method ] + ** + * Return set of elements that create glow-like effect around given element. See @Paper.set. + * + * Note: Glow is not connected to the element. If you change element attributes it won’t adjust itself. + ** + > Parameters + ** + - glow (object) #optional parameters object with all properties optional: + o { + o width (number) size of the glow, default is `10` + o fill (boolean) will it be filled, default is `false` + o opacity (number) opacity, default is `0.5` + o offsetx (number) horizontal offset, default is `0` + o offsety (number) vertical offset, default is `0` + o color (string) glow colour, default is `black` + o } + = (object) @Paper.set of elements that represents glow + \*/ + elproto.glow = function (glow) { + if (this.type == "text") { + return null; + } + glow = glow || {}; + var s = { + width: (glow.width || 10) + (+this.attr("stroke-width") || 1), + fill: glow.fill || false, + opacity: glow.opacity == null ? .5 : glow.opacity, + offsetx: glow.offsetx || 0, + offsety: glow.offsety || 0, + color: glow.color || "#000" + }, + c = s.width / 2, + r = this.paper, + out = r.set(), + path = this.realPath || getPath[this.type](this); + path = this.matrix ? mapPath(path, this.matrix) : path; + for (var i = 1; i < c + 1; i++) { + out.push(r.path(path).attr({ + stroke: s.color, + fill: s.fill ? s.color : "none", + "stroke-linejoin": "round", + "stroke-linecap": "round", + "stroke-width": +(s.width / c * i).toFixed(3), + opacity: +(s.opacity / c).toFixed(3) + })); + } + return out.insertBefore(this).translate(s.offsetx, s.offsety); + }; + var curveslengths = {}, + getPointAtSegmentLength = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) { + if (length == null) { + return bezlen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y); + } else { + return R.findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, getTatLen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length)); + } + }, + getLengthFactory = function (istotal, subpath) { + return function (path, length, onlystart) { + path = path2curve(path); + var x, y, p, l, sp = "", subpaths = {}, point, + len = 0; + for (var i = 0, ii = path.length; i < ii; i++) { + p = path[i]; + if (p[0] == "M") { + x = +p[1]; + y = +p[2]; + } else { + l = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]); + if (len + l > length) { + if (subpath && !subpaths.start) { + point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len); + sp += ["C" + point.start.x, point.start.y, point.m.x, point.m.y, point.x, point.y]; + if (onlystart) {return sp;} + subpaths.start = sp; + sp = ["M" + point.x, point.y + "C" + point.n.x, point.n.y, point.end.x, point.end.y, p[5], p[6]].join(); + len += l; + x = +p[5]; + y = +p[6]; + continue; + } + if (!istotal && !subpath) { + point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len); + return {x: point.x, y: point.y, alpha: point.alpha}; + } + } + len += l; + x = +p[5]; + y = +p[6]; + } + sp += p.shift() + p; + } + subpaths.end = sp; + point = istotal ? len : subpath ? subpaths : R.findDotsAtSegment(x, y, p[0], p[1], p[2], p[3], p[4], p[5], 1); + point.alpha && (point = {x: point.x, y: point.y, alpha: point.alpha}); + return point; + }; + }; + var getTotalLength = getLengthFactory(1), + getPointAtLength = getLengthFactory(), + getSubpathsAtLength = getLengthFactory(0, 1); + /*\ + * Raphael.getTotalLength + [ method ] + ** + * Returns length of the given path in pixels. + ** + > Parameters + ** + - path (string) SVG path string. + ** + = (number) length. + \*/ + R.getTotalLength = getTotalLength; + /*\ + * Raphael.getPointAtLength + [ method ] + ** + * Return coordinates of the point located at the given length on the given path. + ** + > Parameters + ** + - path (string) SVG path string + - length (number) + ** + = (object) representation of the point: + o { + o x: (number) x coordinate + o y: (number) y coordinate + o alpha: (number) angle of derivative + o } + \*/ + R.getPointAtLength = getPointAtLength; + /*\ + * Raphael.getSubpath + [ method ] + ** + * Return subpath of a given path from given length to given length. + ** + > Parameters + ** + - path (string) SVG path string + - from (number) position of the start of the segment + - to (number) position of the end of the segment + ** + = (string) pathstring for the segment + \*/ + R.getSubpath = function (path, from, to) { + if (this.getTotalLength(path) - to < 1e-6) { + return getSubpathsAtLength(path, from).end; + } + var a = getSubpathsAtLength(path, to, 1); + return from ? getSubpathsAtLength(a, from).end : a; + }; + /*\ + * Element.getTotalLength + [ method ] + ** + * Returns length of the path in pixels. Only works for element of “path” type. + = (number) length. + \*/ + elproto.getTotalLength = function () { + var path = this.getPath(); + if (!path) { + return; + } + + if (this.node.getTotalLength) { + return this.node.getTotalLength(); + } + + return getTotalLength(path); + }; + /*\ + * Element.getPointAtLength + [ method ] + ** + * Return coordinates of the point located at the given length on the given path. Only works for element of “path” type. + ** + > Parameters + ** + - length (number) + ** + = (object) representation of the point: + o { + o x: (number) x coordinate + o y: (number) y coordinate + o alpha: (number) angle of derivative + o } + \*/ + elproto.getPointAtLength = function (length) { + var path = this.getPath(); + if (!path) { + return; + } + + return getPointAtLength(path, length); + }; + /*\ + * Element.getPath + [ method ] + ** + * Returns path of the element. Only works for elements of “path” type and simple elements like circle. + = (object) path + ** + \*/ + elproto.getPath = function () { + var path, + getPath = R._getPath[this.type]; + + if (this.type == "text" || this.type == "set") { + return; + } + + if (getPath) { + path = getPath(this); + } + + return path; + }; + /*\ + * Element.getSubpath + [ method ] + ** + * Return subpath of a given element from given length to given length. Only works for element of “path” type. + ** + > Parameters + ** + - from (number) position of the start of the segment + - to (number) position of the end of the segment + ** + = (string) pathstring for the segment + \*/ + elproto.getSubpath = function (from, to) { + var path = this.getPath(); + if (!path) { + return; + } + + return R.getSubpath(path, from, to); + }; + /*\ + * Raphael.easing_formulas + [ property ] + ** + * Object that contains easing formulas for animation. You could extend it with your own. By default it has following list of easing: + # <ul> + # <li>“linear”</li> + # <li>“<” or “easeIn” or “ease-in”</li> + # <li>“>” or “easeOut” or “ease-out”</li> + # <li>“<>” or “easeInOut” or “ease-in-out”</li> + # <li>“backIn” or “back-in”</li> + # <li>“backOut” or “back-out”</li> + # <li>“elastic”</li> + # <li>“bounce”</li> + # </ul> + # <p>See also <a href="http://raphaeljs.com/easing.html">Easing demo</a>.</p> + \*/ + var ef = R.easing_formulas = { + linear: function (n) { + return n; + }, + "<": function (n) { + return pow(n, 1.7); + }, + ">": function (n) { + return pow(n, .48); + }, + "<>": function (n) { + var q = .48 - n / 1.04, + Q = math.sqrt(.1734 + q * q), + x = Q - q, + X = pow(abs(x), 1 / 3) * (x < 0 ? -1 : 1), + y = -Q - q, + Y = pow(abs(y), 1 / 3) * (y < 0 ? -1 : 1), + t = X + Y + .5; + return (1 - t) * 3 * t * t + t * t * t; + }, + backIn: function (n) { + var s = 1.70158; + return n * n * ((s + 1) * n - s); + }, + backOut: function (n) { + n = n - 1; + var s = 1.70158; + return n * n * ((s + 1) * n + s) + 1; + }, + elastic: function (n) { + if (n == !!n) { + return n; + } + return pow(2, -10 * n) * math.sin((n - .075) * (2 * PI) / .3) + 1; + }, + bounce: function (n) { + var s = 7.5625, + p = 2.75, + l; + if (n < (1 / p)) { + l = s * n * n; + } else { + if (n < (2 / p)) { + n -= (1.5 / p); + l = s * n * n + .75; + } else { + if (n < (2.5 / p)) { + n -= (2.25 / p); + l = s * n * n + .9375; + } else { + n -= (2.625 / p); + l = s * n * n + .984375; + } + } + } + return l; + } + }; + ef.easeIn = ef["ease-in"] = ef["<"]; + ef.easeOut = ef["ease-out"] = ef[">"]; + ef.easeInOut = ef["ease-in-out"] = ef["<>"]; + ef["back-in"] = ef.backIn; + ef["back-out"] = ef.backOut; + + var animationElements = [], + requestAnimFrame = window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function (callback) { + setTimeout(callback, 16); + }, + animation = function () { + var Now = +new Date, + l = 0; + for (; l < animationElements.length; l++) { + var e = animationElements[l]; + if (e.el.removed || e.paused) { + continue; + } + var time = Now - e.start, + ms = e.ms, + easing = e.easing, + from = e.from, + diff = e.diff, + to = e.to, + t = e.t, + that = e.el, + set = {}, + now, + init = {}, + key; + if (e.initstatus) { + time = (e.initstatus * e.anim.top - e.prev) / (e.percent - e.prev) * ms; + e.status = e.initstatus; + delete e.initstatus; + e.stop && animationElements.splice(l--, 1); + } else { + e.status = (e.prev + (e.percent - e.prev) * (time / ms)) / e.anim.top; + } + if (time < 0) { + continue; + } + if (time < ms) { + var pos = easing(time / ms); + for (var attr in from) if (from[has](attr)) { + switch (availableAnimAttrs[attr]) { + case nu: + now = +from[attr] + pos * ms * diff[attr]; + break; + case "colour": + now = "rgb(" + [ + upto255(round(from[attr].r + pos * ms * diff[attr].r)), + upto255(round(from[attr].g + pos * ms * diff[attr].g)), + upto255(round(from[attr].b + pos * ms * diff[attr].b)) + ].join(",") + ")"; + break; + case "path": + now = []; + for (var i = 0, ii = from[attr].length; i < ii; i++) { + now[i] = [from[attr][i][0]]; + for (var j = 1, jj = from[attr][i].length; j < jj; j++) { + now[i][j] = +from[attr][i][j] + pos * ms * diff[attr][i][j]; + } + now[i] = now[i].join(S); + } + now = now.join(S); + break; + case "transform": + if (diff[attr].real) { + now = []; + for (i = 0, ii = from[attr].length; i < ii; i++) { + now[i] = [from[attr][i][0]]; + for (j = 1, jj = from[attr][i].length; j < jj; j++) { + now[i][j] = from[attr][i][j] + pos * ms * diff[attr][i][j]; + } + } + } else { + var get = function (i) { + return +from[attr][i] + pos * ms * diff[attr][i]; + }; + // now = [["r", get(2), 0, 0], ["t", get(3), get(4)], ["s", get(0), get(1), 0, 0]]; + now = [["m", get(0), get(1), get(2), get(3), get(4), get(5)]]; + } + break; + case "csv": + if (attr == "clip-rect") { + now = []; + i = 4; + while (i--) { + now[i] = +from[attr][i] + pos * ms * diff[attr][i]; + } + } + break; + default: + var from2 = [][concat](from[attr]); + now = []; + i = that.paper.customAttributes[attr].length; + while (i--) { + now[i] = +from2[i] + pos * ms * diff[attr][i]; + } + break; + } + set[attr] = now; + } + that.attr(set); + (function (id, that, anim) { + setTimeout(function () { + eve("raphael.anim.frame." + id, that, anim); + }); + })(that.id, that, e.anim); + } else { + (function(f, el, a) { + setTimeout(function() { + eve("raphael.anim.frame." + el.id, el, a); + eve("raphael.anim.finish." + el.id, el, a); + R.is(f, "function") && f.call(el); + }); + })(e.callback, that, e.anim); + that.attr(to); + animationElements.splice(l--, 1); + if (e.repeat > 1 && !e.next) { + for (key in to) if (to[has](key)) { + init[key] = e.totalOrigin[key]; + } + e.el.attr(init); + runAnimation(e.anim, e.el, e.anim.percents[0], null, e.totalOrigin, e.repeat - 1); + } + if (e.next && !e.stop) { + runAnimation(e.anim, e.el, e.next, null, e.totalOrigin, e.repeat); + } + } + } + animationElements.length && requestAnimFrame(animation); + }, + upto255 = function (color) { + return color > 255 ? 255 : color < 0 ? 0 : color; + }; + /*\ + * Element.animateWith + [ method ] + ** + * Acts similar to @Element.animate, but ensure that given animation runs in sync with another given element. + ** + > Parameters + ** + - el (object) element to sync with + - anim (object) animation to sync with + - params (object) #optional final attributes for the element, see also @Element.attr + - ms (number) #optional number of milliseconds for animation to run + - easing (string) #optional easing type. Accept on of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX, XX, XX, XX)` + - callback (function) #optional callback function. Will be called at the end of animation. + * or + - element (object) element to sync with + - anim (object) animation to sync with + - animation (object) #optional animation object, see @Raphael.animation + ** + = (object) original element + \*/ + elproto.animateWith = function (el, anim, params, ms, easing, callback) { + var element = this; + if (element.removed) { + callback && callback.call(element); + return element; + } + var a = params instanceof Animation ? params : R.animation(params, ms, easing, callback), + x, y; + runAnimation(a, element, a.percents[0], null, element.attr()); + for (var i = 0, ii = animationElements.length; i < ii; i++) { + if (animationElements[i].anim == anim && animationElements[i].el == el) { + animationElements[ii - 1].start = animationElements[i].start; + break; + } + } + return element; + // + // + // var a = params ? R.animation(params, ms, easing, callback) : anim, + // status = element.status(anim); + // return this.animate(a).status(a, status * anim.ms / a.ms); + }; + function CubicBezierAtTime(t, p1x, p1y, p2x, p2y, duration) { + var cx = 3 * p1x, + bx = 3 * (p2x - p1x) - cx, + ax = 1 - cx - bx, + cy = 3 * p1y, + by = 3 * (p2y - p1y) - cy, + ay = 1 - cy - by; + function sampleCurveX(t) { + return ((ax * t + bx) * t + cx) * t; + } + function solve(x, epsilon) { + var t = solveCurveX(x, epsilon); + return ((ay * t + by) * t + cy) * t; + } + function solveCurveX(x, epsilon) { + var t0, t1, t2, x2, d2, i; + for(t2 = x, i = 0; i < 8; i++) { + x2 = sampleCurveX(t2) - x; + if (abs(x2) < epsilon) { + return t2; + } + d2 = (3 * ax * t2 + 2 * bx) * t2 + cx; + if (abs(d2) < 1e-6) { + break; + } + t2 = t2 - x2 / d2; + } + t0 = 0; + t1 = 1; + t2 = x; + if (t2 < t0) { + return t0; + } + if (t2 > t1) { + return t1; + } + while (t0 < t1) { + x2 = sampleCurveX(t2); + if (abs(x2 - x) < epsilon) { + return t2; + } + if (x > x2) { + t0 = t2; + } else { + t1 = t2; + } + t2 = (t1 - t0) / 2 + t0; + } + return t2; + } + return solve(t, 1 / (200 * duration)); + } + elproto.onAnimation = function (f) { + f ? eve.on("raphael.anim.frame." + this.id, f) : eve.unbind("raphael.anim.frame." + this.id); + return this; + }; + function Animation(anim, ms) { + var percents = [], + newAnim = {}; + this.ms = ms; + this.times = 1; + if (anim) { + for (var attr in anim) if (anim[has](attr)) { + newAnim[toFloat(attr)] = anim[attr]; + percents.push(toFloat(attr)); + } + percents.sort(sortByNumber); + } + this.anim = newAnim; + this.top = percents[percents.length - 1]; + this.percents = percents; + } + /*\ + * Animation.delay + [ method ] + ** + * Creates a copy of existing animation object with given delay. + ** + > Parameters + ** + - delay (number) number of ms to pass between animation start and actual animation + ** + = (object) new altered Animation object + | var anim = Raphael.animation({cx: 10, cy: 20}, 2e3); + | circle1.animate(anim); // run the given animation immediately + | circle2.animate(anim.delay(500)); // run the given animation after 500 ms + \*/ + Animation.prototype.delay = function (delay) { + var a = new Animation(this.anim, this.ms); + a.times = this.times; + a.del = +delay || 0; + return a; + }; + /*\ + * Animation.repeat + [ method ] + ** + * Creates a copy of existing animation object with given repetition. + ** + > Parameters + ** + - repeat (number) number iterations of animation. For infinite animation pass `Infinity` + ** + = (object) new altered Animation object + \*/ + Animation.prototype.repeat = function (times) { + var a = new Animation(this.anim, this.ms); + a.del = this.del; + a.times = math.floor(mmax(times, 0)) || 1; + return a; + }; + function runAnimation(anim, element, percent, status, totalOrigin, times) { + percent = toFloat(percent); + var params, + isInAnim, + isInAnimSet, + percents = [], + next, + prev, + timestamp, + ms = anim.ms, + from = {}, + to = {}, + diff = {}; + if (status) { + for (i = 0, ii = animationElements.length; i < ii; i++) { + var e = animationElements[i]; + if (e.el.id == element.id && e.anim == anim) { + if (e.percent != percent) { + animationElements.splice(i, 1); + isInAnimSet = 1; + } else { + isInAnim = e; + } + element.attr(e.totalOrigin); + break; + } + } + } else { + status = +to; // NaN + } + for (var i = 0, ii = anim.percents.length; i < ii; i++) { + if (anim.percents[i] == percent || anim.percents[i] > status * anim.top) { + percent = anim.percents[i]; + prev = anim.percents[i - 1] || 0; + ms = ms / anim.top * (percent - prev); + next = anim.percents[i + 1]; + params = anim.anim[percent]; + break; + } else if (status) { + element.attr(anim.anim[anim.percents[i]]); + } + } + if (!params) { + return; + } + if (!isInAnim) { + for (var attr in params) if (params[has](attr)) { + if (availableAnimAttrs[has](attr) || element.paper.customAttributes[has](attr)) { + from[attr] = element.attr(attr); + (from[attr] == null) && (from[attr] = availableAttrs[attr]); + to[attr] = params[attr]; + switch (availableAnimAttrs[attr]) { + case nu: + diff[attr] = (to[attr] - from[attr]) / ms; + break; + case "colour": + from[attr] = R.getRGB(from[attr]); + var toColour = R.getRGB(to[attr]); + diff[attr] = { + r: (toColour.r - from[attr].r) / ms, + g: (toColour.g - from[attr].g) / ms, + b: (toColour.b - from[attr].b) / ms + }; + break; + case "path": + var pathes = path2curve(from[attr], to[attr]), + toPath = pathes[1]; + from[attr] = pathes[0]; + diff[attr] = []; + for (i = 0, ii = from[attr].length; i < ii; i++) { + diff[attr][i] = [0]; + for (var j = 1, jj = from[attr][i].length; j < jj; j++) { + diff[attr][i][j] = (toPath[i][j] - from[attr][i][j]) / ms; + } + } + break; + case "transform": + var _ = element._, + eq = equaliseTransform(_[attr], to[attr]); + if (eq) { + from[attr] = eq.from; + to[attr] = eq.to; + diff[attr] = []; + diff[attr].real = true; + for (i = 0, ii = from[attr].length; i < ii; i++) { + diff[attr][i] = [from[attr][i][0]]; + for (j = 1, jj = from[attr][i].length; j < jj; j++) { + diff[attr][i][j] = (to[attr][i][j] - from[attr][i][j]) / ms; + } + } + } else { + var m = (element.matrix || new Matrix), + to2 = { + _: {transform: _.transform}, + getBBox: function () { + return element.getBBox(1); + } + }; + from[attr] = [ + m.a, + m.b, + m.c, + m.d, + m.e, + m.f + ]; + extractTransform(to2, to[attr]); + to[attr] = to2._.transform; + diff[attr] = [ + (to2.matrix.a - m.a) / ms, + (to2.matrix.b - m.b) / ms, + (to2.matrix.c - m.c) / ms, + (to2.matrix.d - m.d) / ms, + (to2.matrix.e - m.e) / ms, + (to2.matrix.f - m.f) / ms + ]; + // from[attr] = [_.sx, _.sy, _.deg, _.dx, _.dy]; + // var to2 = {_:{}, getBBox: function () { return element.getBBox(); }}; + // extractTransform(to2, to[attr]); + // diff[attr] = [ + // (to2._.sx - _.sx) / ms, + // (to2._.sy - _.sy) / ms, + // (to2._.deg - _.deg) / ms, + // (to2._.dx - _.dx) / ms, + // (to2._.dy - _.dy) / ms + // ]; + } + break; + case "csv": + var values = Str(params[attr])[split](separator), + from2 = Str(from[attr])[split](separator); + if (attr == "clip-rect") { + from[attr] = from2; + diff[attr] = []; + i = from2.length; + while (i--) { + diff[attr][i] = (values[i] - from[attr][i]) / ms; + } + } + to[attr] = values; + break; + default: + values = [][concat](params[attr]); + from2 = [][concat](from[attr]); + diff[attr] = []; + i = element.paper.customAttributes[attr].length; + while (i--) { + diff[attr][i] = ((values[i] || 0) - (from2[i] || 0)) / ms; + } + break; + } + } + } + var easing = params.easing, + easyeasy = R.easing_formulas[easing]; + if (!easyeasy) { + easyeasy = Str(easing).match(bezierrg); + if (easyeasy && easyeasy.length == 5) { + var curve = easyeasy; + easyeasy = function (t) { + return CubicBezierAtTime(t, +curve[1], +curve[2], +curve[3], +curve[4], ms); + }; + } else { + easyeasy = pipe; + } + } + timestamp = params.start || anim.start || +new Date; + e = { + anim: anim, + percent: percent, + timestamp: timestamp, + start: timestamp + (anim.del || 0), + status: 0, + initstatus: status || 0, + stop: false, + ms: ms, + easing: easyeasy, + from: from, + diff: diff, + to: to, + el: element, + callback: params.callback, + prev: prev, + next: next, + repeat: times || anim.times, + origin: element.attr(), + totalOrigin: totalOrigin + }; + animationElements.push(e); + if (status && !isInAnim && !isInAnimSet) { + e.stop = true; + e.start = new Date - ms * status; + if (animationElements.length == 1) { + return animation(); + } + } + if (isInAnimSet) { + e.start = new Date - e.ms * status; + } + animationElements.length == 1 && requestAnimFrame(animation); + } else { + isInAnim.initstatus = status; + isInAnim.start = new Date - isInAnim.ms * status; + } + eve("raphael.anim.start." + element.id, element, anim); + } + /*\ + * Raphael.animation + [ method ] + ** + * Creates an animation object that can be passed to the @Element.animate or @Element.animateWith methods. + * See also @Animation.delay and @Animation.repeat methods. + ** + > Parameters + ** + - params (object) final attributes for the element, see also @Element.attr + - ms (number) number of milliseconds for animation to run + - easing (string) #optional easing type. Accept one of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX, XX, XX, XX)` + - callback (function) #optional callback function. Will be called at the end of animation. + ** + = (object) @Animation + \*/ + R.animation = function (params, ms, easing, callback) { + if (params instanceof Animation) { + return params; + } + if (R.is(easing, "function") || !easing) { + callback = callback || easing || null; + easing = null; + } + params = Object(params); + ms = +ms || 0; + var p = {}, + json, + attr; + for (attr in params) if (params[has](attr) && toFloat(attr) != attr && toFloat(attr) + "%" != attr) { + json = true; + p[attr] = params[attr]; + } + if (!json) { + // if percent-like syntax is used and end-of-all animation callback used + if(callback){ + // find the last one + var lastKey = 0; + for(var i in params){ + var percent = toInt(i); + if(params[has](i) && percent > lastKey){ + lastKey = percent; + } + } + lastKey += '%'; + // if already defined callback in the last keyframe, skip + !params[lastKey].callback && (params[lastKey].callback = callback); + } + return new Animation(params, ms); + } else { + easing && (p.easing = easing); + callback && (p.callback = callback); + return new Animation({100: p}, ms); + } + }; + /*\ + * Element.animate + [ method ] + ** + * Creates and starts animation for given element. + ** + > Parameters + ** + - params (object) final attributes for the element, see also @Element.attr + - ms (number) number of milliseconds for animation to run + - easing (string) #optional easing type. Accept one of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX, XX, XX, XX)` + - callback (function) #optional callback function. Will be called at the end of animation. + * or + - animation (object) animation object, see @Raphael.animation + ** + = (object) original element + \*/ + elproto.animate = function (params, ms, easing, callback) { + var element = this; + if (element.removed) { + callback && callback.call(element); + return element; + } + var anim = params instanceof Animation ? params : R.animation(params, ms, easing, callback); + runAnimation(anim, element, anim.percents[0], null, element.attr()); + return element; + }; + /*\ + * Element.setTime + [ method ] + ** + * Sets the status of animation of the element in milliseconds. Similar to @Element.status method. + ** + > Parameters + ** + - anim (object) animation object + - value (number) number of milliseconds from the beginning of the animation + ** + = (object) original element if `value` is specified + * Note, that during animation following events are triggered: + * + * On each animation frame event `anim.frame.<id>`, on start `anim.start.<id>` and on end `anim.finish.<id>`. + \*/ + elproto.setTime = function (anim, value) { + if (anim && value != null) { + this.status(anim, mmin(value, anim.ms) / anim.ms); + } + return this; + }; + /*\ + * Element.status + [ method ] + ** + * Gets or sets the status of animation of the element. + ** + > Parameters + ** + - anim (object) #optional animation object + - value (number) #optional 0 – 1. If specified, method works like a setter and sets the status of a given animation to the value. This will cause animation to jump to the given position. + ** + = (number) status + * or + = (array) status if `anim` is not specified. Array of objects in format: + o { + o anim: (object) animation object + o status: (number) status + o } + * or + = (object) original element if `value` is specified + \*/ + elproto.status = function (anim, value) { + var out = [], + i = 0, + len, + e; + if (value != null) { + runAnimation(anim, this, -1, mmin(value, 1)); + return this; + } else { + len = animationElements.length; + for (; i < len; i++) { + e = animationElements[i]; + if (e.el.id == this.id && (!anim || e.anim == anim)) { + if (anim) { + return e.status; + } + out.push({ + anim: e.anim, + status: e.status + }); + } + } + if (anim) { + return 0; + } + return out; + } + }; + /*\ + * Element.pause + [ method ] + ** + * Stops animation of the element with ability to resume it later on. + ** + > Parameters + ** + - anim (object) #optional animation object + ** + = (object) original element + \*/ + elproto.pause = function (anim) { + for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) { + if (eve("raphael.anim.pause." + this.id, this, animationElements[i].anim) !== false) { + animationElements[i].paused = true; + } + } + return this; + }; + /*\ + * Element.resume + [ method ] + ** + * Resumes animation if it was paused with @Element.pause method. + ** + > Parameters + ** + - anim (object) #optional animation object + ** + = (object) original element + \*/ + elproto.resume = function (anim) { + for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) { + var e = animationElements[i]; + if (eve("raphael.anim.resume." + this.id, this, e.anim) !== false) { + delete e.paused; + this.status(e.anim, e.status); + } + } + return this; + }; + /*\ + * Element.stop + [ method ] + ** + * Stops animation of the element. + ** + > Parameters + ** + - anim (object) #optional animation object + ** + = (object) original element + \*/ + elproto.stop = function (anim) { + for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) { + if (eve("raphael.anim.stop." + this.id, this, animationElements[i].anim) !== false) { + animationElements.splice(i--, 1); + } + } + return this; + }; + function stopAnimation(paper) { + for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.paper == paper) { + animationElements.splice(i--, 1); + } + } + eve.on("raphael.remove", stopAnimation); + eve.on("raphael.clear", stopAnimation); + elproto.toString = function () { + return "Rapha\xebl\u2019s object"; + }; + + // Set + var Set = function (items) { + this.items = []; + this.length = 0; + this.type = "set"; + if (items) { + for (var i = 0, ii = items.length; i < ii; i++) { + if (items[i] && (items[i].constructor == elproto.constructor || items[i].constructor == Set)) { + this[this.items.length] = this.items[this.items.length] = items[i]; + this.length++; + } + } + } + }, + setproto = Set.prototype; + /*\ + * Set.push + [ method ] + ** + * Adds each argument to the current set. + = (object) original element + \*/ + setproto.push = function () { + var item, + len; + for (var i = 0, ii = arguments.length; i < ii; i++) { + item = arguments[i]; + if (item && (item.constructor == elproto.constructor || item.constructor == Set)) { + len = this.items.length; + this[len] = this.items[len] = item; + this.length++; + } + } + return this; + }; + /*\ + * Set.pop + [ method ] + ** + * Removes last element and returns it. + = (object) element + \*/ + setproto.pop = function () { + this.length && delete this[this.length--]; + return this.items.pop(); + }; + /*\ + * Set.forEach + [ method ] + ** + * Executes given function for each element in the set. + * + * If function returns `false` it will stop loop running. + ** + > Parameters + ** + - callback (function) function to run + - thisArg (object) context object for the callback + = (object) Set object + \*/ + setproto.forEach = function (callback, thisArg) { + for (var i = 0, ii = this.items.length; i < ii; i++) { + if (callback.call(thisArg, this.items[i], i) === false) { + return this; + } + } + return this; + }; + for (var method in elproto) if (elproto[has](method)) { + setproto[method] = (function (methodname) { + return function () { + var arg = arguments; + return this.forEach(function (el) { + el[methodname][apply](el, arg); + }); + }; + })(method); + } + setproto.attr = function (name, value) { + if (name && R.is(name, array) && R.is(name[0], "object")) { + for (var j = 0, jj = name.length; j < jj; j++) { + this.items[j].attr(name[j]); + } + } else { + for (var i = 0, ii = this.items.length; i < ii; i++) { + this.items[i].attr(name, value); + } + } + return this; + }; + /*\ + * Set.clear + [ method ] + ** + * Removes all elements from the set + \*/ + setproto.clear = function () { + while (this.length) { + this.pop(); + } + }; + /*\ + * Set.splice + [ method ] + ** + * Removes given element from the set + ** + > Parameters + ** + - index (number) position of the deletion + - count (number) number of element to remove + - insertion… (object) #optional elements to insert + = (object) set elements that were deleted + \*/ + setproto.splice = function (index, count, insertion) { + index = index < 0 ? mmax(this.length + index, 0) : index; + count = mmax(0, mmin(this.length - index, count)); + var tail = [], + todel = [], + args = [], + i; + for (i = 2; i < arguments.length; i++) { + args.push(arguments[i]); + } + for (i = 0; i < count; i++) { + todel.push(this[index + i]); + } + for (; i < this.length - index; i++) { + tail.push(this[index + i]); + } + var arglen = args.length; + for (i = 0; i < arglen + tail.length; i++) { + this.items[index + i] = this[index + i] = i < arglen ? args[i] : tail[i - arglen]; + } + i = this.items.length = this.length -= count - arglen; + while (this[i]) { + delete this[i++]; + } + return new Set(todel); + }; + /*\ + * Set.exclude + [ method ] + ** + * Removes given element from the set + ** + > Parameters + ** + - element (object) element to remove + = (boolean) `true` if object was found & removed from the set + \*/ + setproto.exclude = function (el) { + for (var i = 0, ii = this.length; i < ii; i++) if (this[i] == el) { + this.splice(i, 1); + return true; + } + }; + setproto.animate = function (params, ms, easing, callback) { + (R.is(easing, "function") || !easing) && (callback = easing || null); + var len = this.items.length, + i = len, + item, + set = this, + collector; + if (!len) { + return this; + } + callback && (collector = function () { + !--len && callback.call(set); + }); + easing = R.is(easing, string) ? easing : collector; + var anim = R.animation(params, ms, easing, collector); + item = this.items[--i].animate(anim); + while (i--) { + this.items[i] && !this.items[i].removed && this.items[i].animateWith(item, anim, anim); + (this.items[i] && !this.items[i].removed) || len--; + } + return this; + }; + setproto.insertAfter = function (el) { + var i = this.items.length; + while (i--) { + this.items[i].insertAfter(el); + } + return this; + }; + setproto.getBBox = function () { + var x = [], + y = [], + x2 = [], + y2 = []; + for (var i = this.items.length; i--;) if (!this.items[i].removed) { + var box = this.items[i].getBBox(); + x.push(box.x); + y.push(box.y); + x2.push(box.x + box.width); + y2.push(box.y + box.height); + } + x = mmin[apply](0, x); + y = mmin[apply](0, y); + x2 = mmax[apply](0, x2); + y2 = mmax[apply](0, y2); + return { + x: x, + y: y, + x2: x2, + y2: y2, + width: x2 - x, + height: y2 - y + }; + }; + setproto.clone = function (s) { + s = this.paper.set(); + for (var i = 0, ii = this.items.length; i < ii; i++) { + s.push(this.items[i].clone()); + } + return s; + }; + setproto.toString = function () { + return "Rapha\xebl\u2018s set"; + }; + + setproto.glow = function(glowConfig) { + var ret = this.paper.set(); + this.forEach(function(shape, index){ + var g = shape.glow(glowConfig); + if(g != null){ + g.forEach(function(shape2, index2){ + ret.push(shape2); + }); + } + }); + return ret; + }; + + + /*\ + * Set.isPointInside + [ method ] + ** + * Determine if given point is inside this set’s elements + ** + > Parameters + ** + - x (number) x coordinate of the point + - y (number) y coordinate of the point + = (boolean) `true` if point is inside any of the set's elements + \*/ + setproto.isPointInside = function (x, y) { + var isPointInside = false; + this.forEach(function (el) { + if (el.isPointInside(x, y)) { + isPointInside = true; + return false; // stop loop + } + }); + return isPointInside; + }; + + /*\ + * Raphael.registerFont + [ method ] + ** + * Adds given font to the registered set of fonts for Raphaël. Should be used as an internal call from within Cufón’s font file. + * Returns original parameter, so it could be used with chaining. + # <a href="http://wiki.github.com/sorccu/cufon/about">More about Cufón and how to convert your font form TTF, OTF, etc to JavaScript file.</a> + ** + > Parameters + ** + - font (object) the font to register + = (object) the font you passed in + > Usage + | Cufon.registerFont(Raphael.registerFont({…})); + \*/ + R.registerFont = function (font) { + if (!font.face) { + return font; + } + this.fonts = this.fonts || {}; + var fontcopy = { + w: font.w, + face: {}, + glyphs: {} + }, + family = font.face["font-family"]; + for (var prop in font.face) if (font.face[has](prop)) { + fontcopy.face[prop] = font.face[prop]; + } + if (this.fonts[family]) { + this.fonts[family].push(fontcopy); + } else { + this.fonts[family] = [fontcopy]; + } + if (!font.svg) { + fontcopy.face["units-per-em"] = toInt(font.face["units-per-em"], 10); + for (var glyph in font.glyphs) if (font.glyphs[has](glyph)) { + var path = font.glyphs[glyph]; + fontcopy.glyphs[glyph] = { + w: path.w, + k: {}, + d: path.d && "M" + path.d.replace(/[mlcxtrv]/g, function (command) { + return {l: "L", c: "C", x: "z", t: "m", r: "l", v: "c"}[command] || "M"; + }) + "z" + }; + if (path.k) { + for (var k in path.k) if (path[has](k)) { + fontcopy.glyphs[glyph].k[k] = path.k[k]; + } + } + } + } + return font; + }; + /*\ + * Paper.getFont + [ method ] + ** + * Finds font object in the registered fonts by given parameters. You could specify only one word from the font name, like “Myriad” for “Myriad Pro”. + ** + > Parameters + ** + - family (string) font family name or any word from it + - weight (string) #optional font weight + - style (string) #optional font style + - stretch (string) #optional font stretch + = (object) the font object + > Usage + | paper.print(100, 100, "Test string", paper.getFont("Times", 800), 30); + \*/ + paperproto.getFont = function (family, weight, style, stretch) { + stretch = stretch || "normal"; + style = style || "normal"; + weight = +weight || {normal: 400, bold: 700, lighter: 300, bolder: 800}[weight] || 400; + if (!R.fonts) { + return; + } + var font = R.fonts[family]; + if (!font) { + var name = new RegExp("(^|\\s)" + family.replace(/[^\w\d\s+!~.:_-]/g, E) + "(\\s|$)", "i"); + for (var fontName in R.fonts) if (R.fonts[has](fontName)) { + if (name.test(fontName)) { + font = R.fonts[fontName]; + break; + } + } + } + var thefont; + if (font) { + for (var i = 0, ii = font.length; i < ii; i++) { + thefont = font[i]; + if (thefont.face["font-weight"] == weight && (thefont.face["font-style"] == style || !thefont.face["font-style"]) && thefont.face["font-stretch"] == stretch) { + break; + } + } + } + return thefont; + }; + /*\ + * Paper.print + [ method ] + ** + * Creates path that represent given text written using given font at given position with given size. + * Result of the method is path element that contains whole text as a separate path. + ** + > Parameters + ** + - x (number) x position of the text + - y (number) y position of the text + - string (string) text to print + - font (object) font object, see @Paper.getFont + - size (number) #optional size of the font, default is `16` + - origin (string) #optional could be `"baseline"` or `"middle"`, default is `"middle"` + - letter_spacing (number) #optional number in range `-1..1`, default is `0` + - line_spacing (number) #optional number in range `1..3`, default is `1` + = (object) resulting path element, which consist of all letters + > Usage + | var txt = r.print(10, 50, "print", r.getFont("Museo"), 30).attr({fill: "#fff"}); + \*/ + paperproto.print = function (x, y, string, font, size, origin, letter_spacing, line_spacing) { + origin = origin || "middle"; // baseline|middle + letter_spacing = mmax(mmin(letter_spacing || 0, 1), -1); + line_spacing = mmax(mmin(line_spacing || 1, 3), 1); + var letters = Str(string)[split](E), + shift = 0, + notfirst = 0, + path = E, + scale; + R.is(font, "string") && (font = this.getFont(font)); + if (font) { + scale = (size || 16) / font.face["units-per-em"]; + var bb = font.face.bbox[split](separator), + top = +bb[0], + lineHeight = bb[3] - bb[1], + shifty = 0, + height = +bb[1] + (origin == "baseline" ? lineHeight + (+font.face.descent) : lineHeight / 2); + for (var i = 0, ii = letters.length; i < ii; i++) { + if (letters[i] == "\n") { + shift = 0; + curr = 0; + notfirst = 0; + shifty += lineHeight * line_spacing; + } else { + var prev = notfirst && font.glyphs[letters[i - 1]] || {}, + curr = font.glyphs[letters[i]]; + shift += notfirst ? (prev.w || font.w) + (prev.k && prev.k[letters[i]] || 0) + (font.w * letter_spacing) : 0; + notfirst = 1; + } + if (curr && curr.d) { + path += R.transformPath(curr.d, ["t", shift * scale, shifty * scale, "s", scale, scale, top, height, "t", (x - top) / scale, (y - height) / scale]); + } + } + } + return this.path(path).attr({ + fill: "#000", + stroke: "none" + }); + }; + + /*\ + * Paper.add + [ method ] + ** + * Imports elements in JSON array in format `{type: type, <attributes>}` + ** + > Parameters + ** + - json (array) + = (object) resulting set of imported elements + > Usage + | paper.add([ + | { + | type: "circle", + | cx: 10, + | cy: 10, + | r: 5 + | }, + | { + | type: "rect", + | x: 10, + | y: 10, + | width: 10, + | height: 10, + | fill: "#fc0" + | } + | ]); + \*/ + paperproto.add = function (json) { + if (R.is(json, "array")) { + var res = this.set(), + i = 0, + ii = json.length, + j; + for (; i < ii; i++) { + j = json[i] || {}; + elements[has](j.type) && res.push(this[j.type]().attr(j)); + } + } + return res; + }; + + /*\ + * Raphael.format + [ method ] + ** + * Simple format function. Replaces construction of type “`{<number>}`” to the corresponding argument. + ** + > Parameters + ** + - token (string) string to format + - … (string) rest of arguments will be treated as parameters for replacement + = (string) formated string + > Usage + | var x = 10, + | y = 20, + | width = 40, + | height = 50; + | // this will draw a rectangular shape equivalent to "M10,20h40v50h-40z" + | paper.path(Raphael.format("M{0},{1}h{2}v{3}h{4}z", x, y, width, height, -width)); + \*/ + R.format = function (token, params) { + var args = R.is(params, array) ? [0][concat](params) : arguments; + token && R.is(token, string) && args.length - 1 && (token = token.replace(formatrg, function (str, i) { + return args[++i] == null ? E : args[i]; + })); + return token || E; + }; + /*\ + * Raphael.fullfill + [ method ] + ** + * A little bit more advanced format function than @Raphael.format. Replaces construction of type “`{<name>}`” to the corresponding argument. + ** + > Parameters + ** + - token (string) string to format + - json (object) object which properties will be used as a replacement + = (string) formated string + > Usage + | // this will draw a rectangular shape equivalent to "M10,20h40v50h-40z" + | paper.path(Raphael.fullfill("M{x},{y}h{dim.width}v{dim.height}h{dim['negative width']}z", { + | x: 10, + | y: 20, + | dim: { + | width: 40, + | height: 50, + | "negative width": -40 + | } + | })); + \*/ + R.fullfill = (function () { + var tokenRegex = /\{([^\}]+)\}/g, + objNotationRegex = /(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g, // matches .xxxxx or ["xxxxx"] to run over object properties + replacer = function (all, key, obj) { + var res = obj; + key.replace(objNotationRegex, function (all, name, quote, quotedName, isFunc) { + name = name || quotedName; + if (res) { + if (name in res) { + res = res[name]; + } + typeof res == "function" && isFunc && (res = res()); + } + }); + res = (res == null || res == obj ? all : res) + ""; + return res; + }; + return function (str, obj) { + return String(str).replace(tokenRegex, function (all, key) { + return replacer(all, key, obj); + }); + }; + })(); + /*\ + * Raphael.ninja + [ method ] + ** + * If you want to leave no trace of Raphaël (Well, Raphaël creates only one global variable `Raphael`, but anyway.) You can use `ninja` method. + * Beware, that in this case plugins could stop working, because they are depending on global variable existence. + ** + = (object) Raphael object + > Usage + | (function (local_raphael) { + | var paper = local_raphael(10, 10, 320, 200); + | … + | })(Raphael.ninja()); + \*/ + R.ninja = function () { + if (oldRaphael.was) { + g.win.Raphael = oldRaphael.is; + } else { + // IE8 raises an error when deleting window property + window.Raphael = undefined; + try { + delete window.Raphael; + } catch(e) {} + } + return R; + }; + /*\ + * Raphael.st + [ property (object) ] + ** + * You can add your own method to elements and sets. It is wise to add a set method for each element method + * you added, so you will be able to call the same method on sets too. + ** + * See also @Raphael.el. + > Usage + | Raphael.el.red = function () { + | this.attr({fill: "#f00"}); + | }; + | Raphael.st.red = function () { + | this.forEach(function (el) { + | el.red(); + | }); + | }; + | // then use it + | paper.set(paper.circle(100, 100, 20), paper.circle(110, 100, 20)).red(); + \*/ + R.st = setproto; + + eve.on("raphael.DOMload", function () { + loaded = true; + }); + + // Firefox <3.6 fix: http://webreflection.blogspot.com/2009/11/195-chars-to-help-lazy-loading.html + (function (doc, loaded, f) { + if (doc.readyState == null && doc.addEventListener){ + doc.addEventListener(loaded, f = function () { + doc.removeEventListener(loaded, f, false); + doc.readyState = "complete"; + }, false); + doc.readyState = "loading"; + } + function isLoaded() { + (/in/).test(doc.readyState) ? setTimeout(isLoaded, 9) : R.eve("raphael.DOMload"); + } + isLoaded(); + })(document, "DOMContentLoaded"); + + return R; + }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + + +/***/ }, +/* 2 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved. + // + // Licensed under the Apache License, Version 2.0 (the "License"); + // you may not use this file except in compliance with the License. + // You may obtain a copy of the License at + // + // http://www.apache.org/licenses/LICENSE-2.0 + // + // Unless required by applicable law or agreed to in writing, software + // distributed under the License is distributed on an "AS IS" BASIS, + // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + // See the License for the specific language governing permissions and + // limitations under the License. + // ┌────────────────────────────────────────────────────────────┐ \\ + // │ Eve 0.4.2 - JavaScript Events Library │ \\ + // ├────────────────────────────────────────────────────────────┤ \\ + // │ Author Dmitry Baranovskiy (http://dmitry.baranovskiy.com/) │ \\ + // └────────────────────────────────────────────────────────────┘ \\ + + (function (glob) { + var version = "0.4.2", + has = "hasOwnProperty", + separator = /[\.\/]/, + wildcard = "*", + fun = function () {}, + numsort = function (a, b) { + return a - b; + }, + current_event, + stop, + events = {n: {}}, + /*\ + * eve + [ method ] + + * Fires event with given `name`, given scope and other parameters. + + > Arguments + + - name (string) name of the *event*, dot (`.`) or slash (`/`) separated + - scope (object) context for the event handlers + - varargs (...) the rest of arguments will be sent to event handlers + + = (object) array of returned values from the listeners + \*/ + eve = function (name, scope) { + name = String(name); + var e = events, + oldstop = stop, + args = Array.prototype.slice.call(arguments, 2), + listeners = eve.listeners(name), + z = 0, + f = false, + l, + indexed = [], + queue = {}, + out = [], + ce = current_event, + errors = []; + current_event = name; + stop = 0; + for (var i = 0, ii = listeners.length; i < ii; i++) if ("zIndex" in listeners[i]) { + indexed.push(listeners[i].zIndex); + if (listeners[i].zIndex < 0) { + queue[listeners[i].zIndex] = listeners[i]; + } + } + indexed.sort(numsort); + while (indexed[z] < 0) { + l = queue[indexed[z++]]; + out.push(l.apply(scope, args)); + if (stop) { + stop = oldstop; + return out; + } + } + for (i = 0; i < ii; i++) { + l = listeners[i]; + if ("zIndex" in l) { + if (l.zIndex == indexed[z]) { + out.push(l.apply(scope, args)); + if (stop) { + break; + } + do { + z++; + l = queue[indexed[z]]; + l && out.push(l.apply(scope, args)); + if (stop) { + break; + } + } while (l) + } else { + queue[l.zIndex] = l; + } + } else { + out.push(l.apply(scope, args)); + if (stop) { + break; + } + } + } + stop = oldstop; + current_event = ce; + return out.length ? out : null; + }; + // Undocumented. Debug only. + eve._events = events; + /*\ + * eve.listeners + [ method ] + + * Internal method which gives you array of all event handlers that will be triggered by the given `name`. + + > Arguments + + - name (string) name of the event, dot (`.`) or slash (`/`) separated + + = (array) array of event handlers + \*/ + eve.listeners = function (name) { + var names = name.split(separator), + e = events, + item, + items, + k, + i, + ii, + j, + jj, + nes, + es = [e], + out = []; + for (i = 0, ii = names.length; i < ii; i++) { + nes = []; + for (j = 0, jj = es.length; j < jj; j++) { + e = es[j].n; + items = [e[names[i]], e[wildcard]]; + k = 2; + while (k--) { + item = items[k]; + if (item) { + nes.push(item); + out = out.concat(item.f || []); + } + } + } + es = nes; + } + return out; + }; + + /*\ + * eve.on + [ method ] + ** + * Binds given event handler with a given name. You can use wildcards “`*`” for the names: + | eve.on("*.under.*", f); + | eve("mouse.under.floor"); // triggers f + * Use @eve to trigger the listener. + ** + > Arguments + ** + - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards + - f (function) event handler function + ** + = (function) returned function accepts a single numeric parameter that represents z-index of the handler. It is an optional feature and only used when you need to ensure that some subset of handlers will be invoked in a given order, despite of the order of assignment. + > Example: + | eve.on("mouse", eatIt)(2); + | eve.on("mouse", scream); + | eve.on("mouse", catchIt)(1); + * This will ensure that `catchIt()` function will be called before `eatIt()`. + * + * If you want to put your handler before non-indexed handlers, specify a negative value. + * Note: I assume most of the time you don’t need to worry about z-index, but it’s nice to have this feature “just in case”. + \*/ + eve.on = function (name, f) { + name = String(name); + if (typeof f != "function") { + return function () {}; + } + var names = name.split(separator), + e = events; + for (var i = 0, ii = names.length; i < ii; i++) { + e = e.n; + e = e.hasOwnProperty(names[i]) && e[names[i]] || (e[names[i]] = {n: {}}); + } + e.f = e.f || []; + for (i = 0, ii = e.f.length; i < ii; i++) if (e.f[i] == f) { + return fun; + } + e.f.push(f); + return function (zIndex) { + if (+zIndex == +zIndex) { + f.zIndex = +zIndex; + } + }; + }; + /*\ + * eve.f + [ method ] + ** + * Returns function that will fire given event with optional arguments. + * Arguments that will be passed to the result function will be also + * concated to the list of final arguments. + | el.onclick = eve.f("click", 1, 2); + | eve.on("click", function (a, b, c) { + | console.log(a, b, c); // 1, 2, [event object] + | }); + > Arguments + - event (string) event name + - varargs (…) and any other arguments + = (function) possible event handler function + \*/ + eve.f = function (event) { + var attrs = [].slice.call(arguments, 1); + return function () { + eve.apply(null, [event, null].concat(attrs).concat([].slice.call(arguments, 0))); + }; + }; + /*\ + * eve.stop + [ method ] + ** + * Is used inside an event handler to stop the event, preventing any subsequent listeners from firing. + \*/ + eve.stop = function () { + stop = 1; + }; + /*\ + * eve.nt + [ method ] + ** + * Could be used inside event handler to figure out actual name of the event. + ** + > Arguments + ** + - subname (string) #optional subname of the event + ** + = (string) name of the event, if `subname` is not specified + * or + = (boolean) `true`, if current event’s name contains `subname` + \*/ + eve.nt = function (subname) { + if (subname) { + return new RegExp("(?:\\.|\\/|^)" + subname + "(?:\\.|\\/|$)").test(current_event); + } + return current_event; + }; + /*\ + * eve.nts + [ method ] + ** + * Could be used inside event handler to figure out actual name of the event. + ** + ** + = (array) names of the event + \*/ + eve.nts = function () { + return current_event.split(separator); + }; + /*\ + * eve.off + [ method ] + ** + * Removes given function from the list of event listeners assigned to given name. + * If no arguments specified all the events will be cleared. + ** + > Arguments + ** + - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards + - f (function) event handler function + \*/ + /*\ + * eve.unbind + [ method ] + ** + * See @eve.off + \*/ + eve.off = eve.unbind = function (name, f) { + if (!name) { + eve._events = events = {n: {}}; + return; + } + var names = name.split(separator), + e, + key, + splice, + i, ii, j, jj, + cur = [events]; + for (i = 0, ii = names.length; i < ii; i++) { + for (j = 0; j < cur.length; j += splice.length - 2) { + splice = [j, 1]; + e = cur[j].n; + if (names[i] != wildcard) { + if (e[names[i]]) { + splice.push(e[names[i]]); + } + } else { + for (key in e) if (e[has](key)) { + splice.push(e[key]); + } + } + cur.splice.apply(cur, splice); + } + } + for (i = 0, ii = cur.length; i < ii; i++) { + e = cur[i]; + while (e.n) { + if (f) { + if (e.f) { + for (j = 0, jj = e.f.length; j < jj; j++) if (e.f[j] == f) { + e.f.splice(j, 1); + break; + } + !e.f.length && delete e.f; + } + for (key in e.n) if (e.n[has](key) && e.n[key].f) { + var funcs = e.n[key].f; + for (j = 0, jj = funcs.length; j < jj; j++) if (funcs[j] == f) { + funcs.splice(j, 1); + break; + } + !funcs.length && delete e.n[key].f; + } + } else { + delete e.f; + for (key in e.n) if (e.n[has](key) && e.n[key].f) { + delete e.n[key].f; + } + } + e = e.n; + } + } + }; + /*\ + * eve.once + [ method ] + ** + * Binds given event handler with a given name to only run once then unbind itself. + | eve.once("login", f); + | eve("login"); // triggers f + | eve("login"); // no listeners + * Use @eve to trigger the listener. + ** + > Arguments + ** + - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards + - f (function) event handler function + ** + = (function) same return function as @eve.on + \*/ + eve.once = function (name, f) { + var f2 = function () { + eve.unbind(name, f2); + return f.apply(this, arguments); + }; + return eve.on(name, f2); + }; + /*\ + * eve.version + [ property (string) ] + ** + * Current version of the library. + \*/ + eve.version = version; + eve.toString = function () { + return "You are running Eve " + version; + }; + (typeof module != "undefined" && module.exports) ? (module.exports = eve) : ( true ? (!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function() { return eve; }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))) : (glob.eve = eve)); + })(this); + + +/***/ }, +/* 3 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(1)], __WEBPACK_AMD_DEFINE_RESULT__ = function(R) { + if (R && !R.svg) { + return; + } + + var has = "hasOwnProperty", + Str = String, + toFloat = parseFloat, + toInt = parseInt, + math = Math, + mmax = math.max, + abs = math.abs, + pow = math.pow, + separator = /[, ]+/, + eve = R.eve, + E = "", + S = " "; + var xlink = "http://www.w3.org/1999/xlink", + markers = { + block: "M5,0 0,2.5 5,5z", + classic: "M5,0 0,2.5 5,5 3.5,3 3.5,2z", + diamond: "M2.5,0 5,2.5 2.5,5 0,2.5z", + open: "M6,1 1,3.5 6,6", + oval: "M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z" + }, + markerCounter = {}; + R.toString = function () { + return "Your browser supports SVG.\nYou are running Rapha\xebl " + this.version; + }; + var $ = function (el, attr) { + if (attr) { + if (typeof el == "string") { + el = $(el); + } + for (var key in attr) if (attr[has](key)) { + if (key.substring(0, 6) == "xlink:") { + el.setAttributeNS(xlink, key.substring(6), Str(attr[key])); + } else { + el.setAttribute(key, Str(attr[key])); + } + } + } else { + el = R._g.doc.createElementNS("http://www.w3.org/2000/svg", el); + el.style && (el.style.webkitTapHighlightColor = "rgba(0,0,0,0)"); + } + return el; + }, + addGradientFill = function (element, gradient) { + var type = "linear", + id = element.id + gradient, + fx = .5, fy = .5, + o = element.node, + SVG = element.paper, + s = o.style, + el = R._g.doc.getElementById(id); + if (!el) { + gradient = Str(gradient).replace(R._radial_gradient, function (all, _fx, _fy) { + type = "radial"; + if (_fx && _fy) { + fx = toFloat(_fx); + fy = toFloat(_fy); + var dir = ((fy > .5) * 2 - 1); + pow(fx - .5, 2) + pow(fy - .5, 2) > .25 && + (fy = math.sqrt(.25 - pow(fx - .5, 2)) * dir + .5) && + fy != .5 && + (fy = fy.toFixed(5) - 1e-5 * dir); + } + return E; + }); + gradient = gradient.split(/\s*\-\s*/); + if (type == "linear") { + var angle = gradient.shift(); + angle = -toFloat(angle); + if (isNaN(angle)) { + return null; + } + var vector = [0, 0, math.cos(R.rad(angle)), math.sin(R.rad(angle))], + max = 1 / (mmax(abs(vector[2]), abs(vector[3])) || 1); + vector[2] *= max; + vector[3] *= max; + if (vector[2] < 0) { + vector[0] = -vector[2]; + vector[2] = 0; + } + if (vector[3] < 0) { + vector[1] = -vector[3]; + vector[3] = 0; + } + } + var dots = R._parseDots(gradient); + if (!dots) { + return null; + } + id = id.replace(/[\(\)\s,\xb0#]/g, "_"); + + if (element.gradient && id != element.gradient.id) { + SVG.defs.removeChild(element.gradient); + delete element.gradient; + } + + if (!element.gradient) { + el = $(type + "Gradient", {id: id}); + element.gradient = el; + $(el, type == "radial" ? { + fx: fx, + fy: fy + } : { + x1: vector[0], + y1: vector[1], + x2: vector[2], + y2: vector[3], + gradientTransform: element.matrix.invert() + }); + SVG.defs.appendChild(el); + for (var i = 0, ii = dots.length; i < ii; i++) { + el.appendChild($("stop", { + offset: dots[i].offset ? dots[i].offset : i ? "100%" : "0%", + "stop-color": dots[i].color || "#fff", + "stop-opacity": isFinite(dots[i].opacity) ? dots[i].opacity : 1 + })); + } + } + } + $(o, { + fill: fillurl(id), + opacity: 1, + "fill-opacity": 1 + }); + s.fill = E; + s.opacity = 1; + s.fillOpacity = 1; + return 1; + }, + isIE9or10 = function () { + var mode = document.documentMode; + return mode && (mode === 9 || mode === 10); + }, + fillurl = function (id) { + if (isIE9or10()) { + return "url('#" + id + "')"; + } + var location = document.location; + var locationString = ( + location.protocol + '//' + + location.host + + location.pathname + + location.search + ); + return "url('" + locationString + "#" + id + "')"; + }, + updatePosition = function (o) { + var bbox = o.getBBox(1); + $(o.pattern, {patternTransform: o.matrix.invert() + " translate(" + bbox.x + "," + bbox.y + ")"}); + }, + addArrow = function (o, value, isEnd) { + if (o.type == "path") { + var values = Str(value).toLowerCase().split("-"), + p = o.paper, + se = isEnd ? "end" : "start", + node = o.node, + attrs = o.attrs, + stroke = attrs["stroke-width"], + i = values.length, + type = "classic", + from, + to, + dx, + refX, + attr, + w = 3, + h = 3, + t = 5; + while (i--) { + switch (values[i]) { + case "block": + case "classic": + case "oval": + case "diamond": + case "open": + case "none": + type = values[i]; + break; + case "wide": h = 5; break; + case "narrow": h = 2; break; + case "long": w = 5; break; + case "short": w = 2; break; + } + } + if (type == "open") { + w += 2; + h += 2; + t += 2; + dx = 1; + refX = isEnd ? 4 : 1; + attr = { + fill: "none", + stroke: attrs.stroke + }; + } else { + refX = dx = w / 2; + attr = { + fill: attrs.stroke, + stroke: "none" + }; + } + if (o._.arrows) { + if (isEnd) { + o._.arrows.endPath && markerCounter[o._.arrows.endPath]--; + o._.arrows.endMarker && markerCounter[o._.arrows.endMarker]--; + } else { + o._.arrows.startPath && markerCounter[o._.arrows.startPath]--; + o._.arrows.startMarker && markerCounter[o._.arrows.startMarker]--; + } + } else { + o._.arrows = {}; + } + if (type != "none") { + var pathId = "raphael-marker-" + type, + markerId = "raphael-marker-" + se + type + w + h + "-obj" + o.id; + if (!R._g.doc.getElementById(pathId)) { + p.defs.appendChild($($("path"), { + "stroke-linecap": "round", + d: markers[type], + id: pathId + })); + markerCounter[pathId] = 1; + } else { + markerCounter[pathId]++; + } + var marker = R._g.doc.getElementById(markerId), + use; + if (!marker) { + marker = $($("marker"), { + id: markerId, + markerHeight: h, + markerWidth: w, + orient: "auto", + refX: refX, + refY: h / 2 + }); + use = $($("use"), { + "xlink:href": "#" + pathId, + transform: (isEnd ? "rotate(180 " + w / 2 + " " + h / 2 + ") " : E) + "scale(" + w / t + "," + h / t + ")", + "stroke-width": (1 / ((w / t + h / t) / 2)).toFixed(4) + }); + marker.appendChild(use); + p.defs.appendChild(marker); + markerCounter[markerId] = 1; + } else { + markerCounter[markerId]++; + use = marker.getElementsByTagName("use")[0]; + } + $(use, attr); + var delta = dx * (type != "diamond" && type != "oval"); + if (isEnd) { + from = o._.arrows.startdx * stroke || 0; + to = R.getTotalLength(attrs.path) - delta * stroke; + } else { + from = delta * stroke; + to = R.getTotalLength(attrs.path) - (o._.arrows.enddx * stroke || 0); + } + attr = {}; + attr["marker-" + se] = "url(#" + markerId + ")"; + if (to || from) { + attr.d = R.getSubpath(attrs.path, from, to); + } + $(node, attr); + o._.arrows[se + "Path"] = pathId; + o._.arrows[se + "Marker"] = markerId; + o._.arrows[se + "dx"] = delta; + o._.arrows[se + "Type"] = type; + o._.arrows[se + "String"] = value; + } else { + if (isEnd) { + from = o._.arrows.startdx * stroke || 0; + to = R.getTotalLength(attrs.path) - from; + } else { + from = 0; + to = R.getTotalLength(attrs.path) - (o._.arrows.enddx * stroke || 0); + } + o._.arrows[se + "Path"] && $(node, {d: R.getSubpath(attrs.path, from, to)}); + delete o._.arrows[se + "Path"]; + delete o._.arrows[se + "Marker"]; + delete o._.arrows[se + "dx"]; + delete o._.arrows[se + "Type"]; + delete o._.arrows[se + "String"]; + } + for (attr in markerCounter) if (markerCounter[has](attr) && !markerCounter[attr]) { + var item = R._g.doc.getElementById(attr); + item && item.parentNode.removeChild(item); + } + } + }, + dasharray = { + "-": [3, 1], + ".": [1, 1], + "-.": [3, 1, 1, 1], + "-..": [3, 1, 1, 1, 1, 1], + ". ": [1, 3], + "- ": [4, 3], + "--": [8, 3], + "- .": [4, 3, 1, 3], + "--.": [8, 3, 1, 3], + "--..": [8, 3, 1, 3, 1, 3] + }, + addDashes = function (o, value, params) { + value = dasharray[Str(value).toLowerCase()]; + if (value) { + var width = o.attrs["stroke-width"] || "1", + butt = {round: width, square: width, butt: 0}[o.attrs["stroke-linecap"] || params["stroke-linecap"]] || 0, + dashes = [], + i = value.length; + while (i--) { + dashes[i] = value[i] * width + ((i % 2) ? 1 : -1) * butt; + } + $(o.node, {"stroke-dasharray": dashes.join(",")}); + } + else { + $(o.node, {"stroke-dasharray": "none"}); + } + }, + setFillAndStroke = function (o, params) { + var node = o.node, + attrs = o.attrs, + vis = node.style.visibility; + node.style.visibility = "hidden"; + for (var att in params) { + if (params[has](att)) { + if (!R._availableAttrs[has](att)) { + continue; + } + var value = params[att]; + attrs[att] = value; + switch (att) { + case "blur": + o.blur(value); + break; + case "title": + var title = node.getElementsByTagName("title"); + + // Use the existing <title>. + if (title.length && (title = title[0])) { + title.firstChild.nodeValue = value; + } else { + title = $("title"); + var val = R._g.doc.createTextNode(value); + title.appendChild(val); + node.appendChild(title); + } + break; + case "href": + case "target": + var pn = node.parentNode; + if (pn.tagName.toLowerCase() != "a") { + var hl = $("a"); + pn.insertBefore(hl, node); + hl.appendChild(node); + pn = hl; + } + if (att == "target") { + pn.setAttributeNS(xlink, "show", value == "blank" ? "new" : value); + } else { + pn.setAttributeNS(xlink, att, value); + } + break; + case "cursor": + node.style.cursor = value; + break; + case "transform": + o.transform(value); + break; + case "arrow-start": + addArrow(o, value); + break; + case "arrow-end": + addArrow(o, value, 1); + break; + case "clip-rect": + var rect = Str(value).split(separator); + if (rect.length == 4) { + o.clip && o.clip.parentNode.parentNode.removeChild(o.clip.parentNode); + var el = $("clipPath"), + rc = $("rect"); + el.id = R.createUUID(); + $(rc, { + x: rect[0], + y: rect[1], + width: rect[2], + height: rect[3] + }); + el.appendChild(rc); + o.paper.defs.appendChild(el); + $(node, {"clip-path": "url(#" + el.id + ")"}); + o.clip = rc; + } + if (!value) { + var path = node.getAttribute("clip-path"); + if (path) { + var clip = R._g.doc.getElementById(path.replace(/(^url\(#|\)$)/g, E)); + clip && clip.parentNode.removeChild(clip); + $(node, {"clip-path": E}); + delete o.clip; + } + } + break; + case "path": + if (o.type == "path") { + $(node, {d: value ? attrs.path = R._pathToAbsolute(value) : "M0,0"}); + o._.dirty = 1; + if (o._.arrows) { + "startString" in o._.arrows && addArrow(o, o._.arrows.startString); + "endString" in o._.arrows && addArrow(o, o._.arrows.endString, 1); + } + } + break; + case "width": + node.setAttribute(att, value); + o._.dirty = 1; + if (attrs.fx) { + att = "x"; + value = attrs.x; + } else { + break; + } + case "x": + if (attrs.fx) { + value = -attrs.x - (attrs.width || 0); + } + case "rx": + if (att == "rx" && o.type == "rect") { + break; + } + case "cx": + node.setAttribute(att, value); + o.pattern && updatePosition(o); + o._.dirty = 1; + break; + case "height": + node.setAttribute(att, value); + o._.dirty = 1; + if (attrs.fy) { + att = "y"; + value = attrs.y; + } else { + break; + } + case "y": + if (attrs.fy) { + value = -attrs.y - (attrs.height || 0); + } + case "ry": + if (att == "ry" && o.type == "rect") { + break; + } + case "cy": + node.setAttribute(att, value); + o.pattern && updatePosition(o); + o._.dirty = 1; + break; + case "r": + if (o.type == "rect") { + $(node, {rx: value, ry: value}); + } else { + node.setAttribute(att, value); + } + o._.dirty = 1; + break; + case "src": + if (o.type == "image") { + node.setAttributeNS(xlink, "href", value); + } + break; + case "stroke-width": + if (o._.sx != 1 || o._.sy != 1) { + value /= mmax(abs(o._.sx), abs(o._.sy)) || 1; + } + node.setAttribute(att, value); + if (attrs["stroke-dasharray"]) { + addDashes(o, attrs["stroke-dasharray"], params); + } + if (o._.arrows) { + "startString" in o._.arrows && addArrow(o, o._.arrows.startString); + "endString" in o._.arrows && addArrow(o, o._.arrows.endString, 1); + } + break; + case "stroke-dasharray": + addDashes(o, value, params); + break; + case "fill": + var isURL = Str(value).match(R._ISURL); + if (isURL) { + el = $("pattern"); + var ig = $("image"); + el.id = R.createUUID(); + $(el, {x: 0, y: 0, patternUnits: "userSpaceOnUse", height: 1, width: 1}); + $(ig, {x: 0, y: 0, "xlink:href": isURL[1]}); + el.appendChild(ig); + + (function (el) { + R._preload(isURL[1], function () { + var w = this.offsetWidth, + h = this.offsetHeight; + $(el, {width: w, height: h}); + $(ig, {width: w, height: h}); + }); + })(el); + o.paper.defs.appendChild(el); + $(node, {fill: "url(#" + el.id + ")"}); + o.pattern = el; + o.pattern && updatePosition(o); + break; + } + var clr = R.getRGB(value); + if (!clr.error) { + delete params.gradient; + delete attrs.gradient; + !R.is(attrs.opacity, "undefined") && + R.is(params.opacity, "undefined") && + $(node, {opacity: attrs.opacity}); + !R.is(attrs["fill-opacity"], "undefined") && + R.is(params["fill-opacity"], "undefined") && + $(node, {"fill-opacity": attrs["fill-opacity"]}); + } else if ((o.type == "circle" || o.type == "ellipse" || Str(value).charAt() != "r") && addGradientFill(o, value)) { + if ("opacity" in attrs || "fill-opacity" in attrs) { + var gradient = R._g.doc.getElementById(node.getAttribute("fill").replace(/^url\(#|\)$/g, E)); + if (gradient) { + var stops = gradient.getElementsByTagName("stop"); + $(stops[stops.length - 1], {"stop-opacity": ("opacity" in attrs ? attrs.opacity : 1) * ("fill-opacity" in attrs ? attrs["fill-opacity"] : 1)}); + } + } + attrs.gradient = value; + attrs.fill = "none"; + break; + } + clr[has]("opacity") && $(node, {"fill-opacity": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity}); + case "stroke": + clr = R.getRGB(value); + node.setAttribute(att, clr.hex); + att == "stroke" && clr[has]("opacity") && $(node, {"stroke-opacity": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity}); + if (att == "stroke" && o._.arrows) { + "startString" in o._.arrows && addArrow(o, o._.arrows.startString); + "endString" in o._.arrows && addArrow(o, o._.arrows.endString, 1); + } + break; + case "gradient": + (o.type == "circle" || o.type == "ellipse" || Str(value).charAt() != "r") && addGradientFill(o, value); + break; + case "opacity": + if (attrs.gradient && !attrs[has]("stroke-opacity")) { + $(node, {"stroke-opacity": value > 1 ? value / 100 : value}); + } + // fall + case "fill-opacity": + if (attrs.gradient) { + gradient = R._g.doc.getElementById(node.getAttribute("fill").replace(/^url\(#|\)$/g, E)); + if (gradient) { + stops = gradient.getElementsByTagName("stop"); + $(stops[stops.length - 1], {"stop-opacity": value}); + } + break; + } + default: + att == "font-size" && (value = toInt(value, 10) + "px"); + var cssrule = att.replace(/(\-.)/g, function (w) { + return w.substring(1).toUpperCase(); + }); + node.style[cssrule] = value; + o._.dirty = 1; + node.setAttribute(att, value); + break; + } + } + } + + tuneText(o, params); + node.style.visibility = vis; + }, + leading = 1.2, + tuneText = function (el, params) { + if (el.type != "text" || !(params[has]("text") || params[has]("font") || params[has]("font-size") || params[has]("x") || params[has]("y"))) { + return; + } + var a = el.attrs, + node = el.node, + fontSize = node.firstChild ? toInt(R._g.doc.defaultView.getComputedStyle(node.firstChild, E).getPropertyValue("font-size"), 10) : 10; + + if (params[has]("text")) { + a.text = params.text; + while (node.firstChild) { + node.removeChild(node.firstChild); + } + var texts = Str(params.text).split("\n"), + tspans = [], + tspan; + for (var i = 0, ii = texts.length; i < ii; i++) { + tspan = $("tspan"); + i && $(tspan, {dy: fontSize * leading, x: a.x}); + tspan.appendChild(R._g.doc.createTextNode(texts[i])); + node.appendChild(tspan); + tspans[i] = tspan; + } + } else { + tspans = node.getElementsByTagName("tspan"); + for (i = 0, ii = tspans.length; i < ii; i++) if (i) { + $(tspans[i], {dy: fontSize * leading, x: a.x}); + } else { + $(tspans[0], {dy: 0}); + } + } + $(node, {x: a.x, y: a.y}); + el._.dirty = 1; + var bb = el._getBBox(), + dif = a.y - (bb.y + bb.height / 2); + dif && R.is(dif, "finite") && $(tspans[0], {dy: dif}); + }, + getRealNode = function (node) { + if (node.parentNode && node.parentNode.tagName.toLowerCase() === "a") { + return node.parentNode; + } else { + return node; + } + }, + Element = function (node, svg) { + var X = 0, + Y = 0; + /*\ + * Element.node + [ property (object) ] + ** + * Gives you a reference to the DOM object, so you can assign event handlers or just mess around. + ** + * Note: Don’t mess with it. + > Usage + | // draw a circle at coordinate 10,10 with radius of 10 + | var c = paper.circle(10, 10, 10); + | c.node.onclick = function () { + | c.attr("fill", "red"); + | }; + \*/ + this[0] = this.node = node; + /*\ + * Element.raphael + [ property (object) ] + ** + * Internal reference to @Raphael object. In case it is not available. + > Usage + | Raphael.el.red = function () { + | var hsb = this.paper.raphael.rgb2hsb(this.attr("fill")); + | hsb.h = 1; + | this.attr({fill: this.paper.raphael.hsb2rgb(hsb).hex}); + | } + \*/ + node.raphael = true; + /*\ + * Element.id + [ property (number) ] + ** + * Unique id of the element. Especially useful when you want to listen to events of the element, + * because all events are fired in format `<module>.<action>.<id>`. Also useful for @Paper.getById method. + \*/ + this.id = R._oid++; + node.raphaelid = this.id; + this.matrix = R.matrix(); + this.realPath = null; + /*\ + * Element.paper + [ property (object) ] + ** + * Internal reference to “paper” where object drawn. Mainly for use in plugins and element extensions. + > Usage + | Raphael.el.cross = function () { + | this.attr({fill: "red"}); + | this.paper.path("M10,10L50,50M50,10L10,50") + | .attr({stroke: "red"}); + | } + \*/ + this.paper = svg; + this.attrs = this.attrs || {}; + this._ = { + transform: [], + sx: 1, + sy: 1, + deg: 0, + dx: 0, + dy: 0, + dirty: 1 + }; + !svg.bottom && (svg.bottom = this); + /*\ + * Element.prev + [ property (object) ] + ** + * Reference to the previous element in the hierarchy. + \*/ + this.prev = svg.top; + svg.top && (svg.top.next = this); + svg.top = this; + /*\ + * Element.next + [ property (object) ] + ** + * Reference to the next element in the hierarchy. + \*/ + this.next = null; + }, + elproto = R.el; + + Element.prototype = elproto; + elproto.constructor = Element; + + R._engine.path = function (pathString, SVG) { + var el = $("path"); + SVG.canvas && SVG.canvas.appendChild(el); + var p = new Element(el, SVG); + p.type = "path"; + setFillAndStroke(p, { + fill: "none", + stroke: "#000", + path: pathString + }); + return p; + }; + /*\ + * Element.rotate + [ method ] + ** + * Deprecated! Use @Element.transform instead. + * Adds rotation by given angle around given point to the list of + * transformations of the element. + > Parameters + - deg (number) angle in degrees + - cx (number) #optional x coordinate of the centre of rotation + - cy (number) #optional y coordinate of the centre of rotation + * If cx & cy aren’t specified centre of the shape is used as a point of rotation. + = (object) @Element + \*/ + elproto.rotate = function (deg, cx, cy) { + if (this.removed) { + return this; + } + deg = Str(deg).split(separator); + if (deg.length - 1) { + cx = toFloat(deg[1]); + cy = toFloat(deg[2]); + } + deg = toFloat(deg[0]); + (cy == null) && (cx = cy); + if (cx == null || cy == null) { + var bbox = this.getBBox(1); + cx = bbox.x + bbox.width / 2; + cy = bbox.y + bbox.height / 2; + } + this.transform(this._.transform.concat([["r", deg, cx, cy]])); + return this; + }; + /*\ + * Element.scale + [ method ] + ** + * Deprecated! Use @Element.transform instead. + * Adds scale by given amount relative to given point to the list of + * transformations of the element. + > Parameters + - sx (number) horisontal scale amount + - sy (number) vertical scale amount + - cx (number) #optional x coordinate of the centre of scale + - cy (number) #optional y coordinate of the centre of scale + * If cx & cy aren’t specified centre of the shape is used instead. + = (object) @Element + \*/ + elproto.scale = function (sx, sy, cx, cy) { + if (this.removed) { + return this; + } + sx = Str(sx).split(separator); + if (sx.length - 1) { + sy = toFloat(sx[1]); + cx = toFloat(sx[2]); + cy = toFloat(sx[3]); + } + sx = toFloat(sx[0]); + (sy == null) && (sy = sx); + (cy == null) && (cx = cy); + if (cx == null || cy == null) { + var bbox = this.getBBox(1); + } + cx = cx == null ? bbox.x + bbox.width / 2 : cx; + cy = cy == null ? bbox.y + bbox.height / 2 : cy; + this.transform(this._.transform.concat([["s", sx, sy, cx, cy]])); + return this; + }; + /*\ + * Element.translate + [ method ] + ** + * Deprecated! Use @Element.transform instead. + * Adds translation by given amount to the list of transformations of the element. + > Parameters + - dx (number) horisontal shift + - dy (number) vertical shift + = (object) @Element + \*/ + elproto.translate = function (dx, dy) { + if (this.removed) { + return this; + } + dx = Str(dx).split(separator); + if (dx.length - 1) { + dy = toFloat(dx[1]); + } + dx = toFloat(dx[0]) || 0; + dy = +dy || 0; + this.transform(this._.transform.concat([["t", dx, dy]])); + return this; + }; + /*\ + * Element.transform + [ method ] + ** + * Adds transformation to the element which is separate to other attributes, + * i.e. translation doesn’t change `x` or `y` of the rectange. The format + * of transformation string is similar to the path string syntax: + | "t100,100r30,100,100s2,2,100,100r45s1.5" + * Each letter is a command. There are four commands: `t` is for translate, `r` is for rotate, `s` is for + * scale and `m` is for matrix. + * + * There are also alternative “absolute” translation, rotation and scale: `T`, `R` and `S`. They will not take previous transformation into account. For example, `...T100,0` will always move element 100 px horisontally, while `...t100,0` could move it vertically if there is `r90` before. Just compare results of `r90t100,0` and `r90T100,0`. + * + * So, the example line above could be read like “translate by 100, 100; rotate 30° around 100, 100; scale twice around 100, 100; + * rotate 45° around centre; scale 1.5 times relative to centre”. As you can see rotate and scale commands have origin + * coordinates as optional parameters, the default is the centre point of the element. + * Matrix accepts six parameters. + > Usage + | var el = paper.rect(10, 20, 300, 200); + | // translate 100, 100, rotate 45°, translate -100, 0 + | el.transform("t100,100r45t-100,0"); + | // if you want you can append or prepend transformations + | el.transform("...t50,50"); + | el.transform("s2..."); + | // or even wrap + | el.transform("t50,50...t-50-50"); + | // to reset transformation call method with empty string + | el.transform(""); + | // to get current value call it without parameters + | console.log(el.transform()); + > Parameters + - tstr (string) #optional transformation string + * If tstr isn’t specified + = (string) current transformation string + * else + = (object) @Element + \*/ + elproto.transform = function (tstr) { + var _ = this._; + if (tstr == null) { + return _.transform; + } + R._extractTransform(this, tstr); + + this.clip && $(this.clip, {transform: this.matrix.invert()}); + this.pattern && updatePosition(this); + this.node && $(this.node, {transform: this.matrix}); + + if (_.sx != 1 || _.sy != 1) { + var sw = this.attrs[has]("stroke-width") ? this.attrs["stroke-width"] : 1; + this.attr({"stroke-width": sw}); + } + + //Reduce transform string + _.transform = this.matrix.toTransformString(); + + return this; + }; + /*\ + * Element.hide + [ method ] + ** + * Makes element invisible. See @Element.show. + = (object) @Element + \*/ + elproto.hide = function () { + if(!this.removed) this.node.style.display = "none"; + return this; + }; + /*\ + * Element.show + [ method ] + ** + * Makes element visible. See @Element.hide. + = (object) @Element + \*/ + elproto.show = function () { + if(!this.removed) this.node.style.display = ""; + return this; + }; + /*\ + * Element.remove + [ method ] + ** + * Removes element from the paper. + \*/ + elproto.remove = function () { + var node = getRealNode(this.node); + if (this.removed || !node.parentNode) { + return; + } + var paper = this.paper; + paper.__set__ && paper.__set__.exclude(this); + eve.unbind("raphael.*.*." + this.id); + if (this.gradient) { + paper.defs.removeChild(this.gradient); + } + R._tear(this, paper); + + node.parentNode.removeChild(node); + + // Remove custom data for element + this.removeData(); + + for (var i in this) { + this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null; + } + this.removed = true; + }; + elproto._getBBox = function () { + if (this.node.style.display == "none") { + this.show(); + var hide = true; + } + var canvasHidden = false, + containerStyle; + if (this.paper.canvas.parentElement) { + containerStyle = this.paper.canvas.parentElement.style; + } //IE10+ can't find parentElement + else if (this.paper.canvas.parentNode) { + containerStyle = this.paper.canvas.parentNode.style; + } + + if(containerStyle && containerStyle.display == "none") { + canvasHidden = true; + containerStyle.display = ""; + } + var bbox = {}; + try { + bbox = this.node.getBBox(); + } catch(e) { + // Firefox 3.0.x, 25.0.1 (probably more versions affected) play badly here - possible fix + bbox = { + x: this.node.clientLeft, + y: this.node.clientTop, + width: this.node.clientWidth, + height: this.node.clientHeight + } + } finally { + bbox = bbox || {}; + if(canvasHidden){ + containerStyle.display = "none"; + } + } + hide && this.hide(); + return bbox; + }; + /*\ + * Element.attr + [ method ] + ** + * Sets the attributes of the element. + > Parameters + - attrName (string) attribute’s name + - value (string) value + * or + - params (object) object of name/value pairs + * or + - attrName (string) attribute’s name + * or + - attrNames (array) in this case method returns array of current values for given attribute names + = (object) @Element if attrsName & value or params are passed in. + = (...) value of the attribute if only attrsName is passed in. + = (array) array of values of the attribute if attrsNames is passed in. + = (object) object of attributes if nothing is passed in. + > Possible parameters + # <p>Please refer to the <a href="http://www.w3.org/TR/SVG/" title="The W3C Recommendation for the SVG language describes these properties in detail.">SVG specification</a> for an explanation of these parameters.</p> + o arrow-end (string) arrowhead on the end of the path. The format for string is `<type>[-<width>[-<length>]]`. Possible types: `classic`, `block`, `open`, `oval`, `diamond`, `none`, width: `wide`, `narrow`, `medium`, length: `long`, `short`, `midium`. + o clip-rect (string) comma or space separated values: x, y, width and height + o cursor (string) CSS type of the cursor + o cx (number) the x-axis coordinate of the center of the circle, or ellipse + o cy (number) the y-axis coordinate of the center of the circle, or ellipse + o fill (string) colour, gradient or image + o fill-opacity (number) + o font (string) + o font-family (string) + o font-size (number) font size in pixels + o font-weight (string) + o height (number) + o href (string) URL, if specified element behaves as hyperlink + o opacity (number) + o path (string) SVG path string format + o r (number) radius of the circle, ellipse or rounded corner on the rect + o rx (number) horisontal radius of the ellipse + o ry (number) vertical radius of the ellipse + o src (string) image URL, only works for @Element.image element + o stroke (string) stroke colour + o stroke-dasharray (string) [“”, “none”, “`-`”, “`.`”, “`-.`”, “`-..`”, “`. `”, “`- `”, “`--`”, “`- .`”, “`--.`”, “`--..`”] + o stroke-linecap (string) [“`butt`”, “`square`”, “`round`”] + o stroke-linejoin (string) [“`bevel`”, “`round`”, “`miter`”] + o stroke-miterlimit (number) + o stroke-opacity (number) + o stroke-width (number) stroke width in pixels, default is '1' + o target (string) used with href + o text (string) contents of the text element. Use `\n` for multiline text + o text-anchor (string) [“`start`”, “`middle`”, “`end`”], default is “`middle`” + o title (string) will create tooltip with a given text + o transform (string) see @Element.transform + o width (number) + o x (number) + o y (number) + > Gradients + * Linear gradient format: “`‹angle›-‹colour›[-‹colour›[:‹offset›]]*-‹colour›`”, example: “`90-#fff-#000`” – 90° + * gradient from white to black or “`0-#fff-#f00:20-#000`” – 0° gradient from white via red (at 20%) to black. + * + * radial gradient: “`r[(‹fx›, ‹fy›)]‹colour›[-‹colour›[:‹offset›]]*-‹colour›`”, example: “`r#fff-#000`” – + * gradient from white to black or “`r(0.25, 0.75)#fff-#000`” – gradient from white to black with focus point + * at 0.25, 0.75. Focus point coordinates are in 0..1 range. Radial gradients can only be applied to circles and ellipses. + > Path String + # <p>Please refer to <a href="http://www.w3.org/TR/SVG/paths.html#PathData" title="Details of a path’s data attribute’s format are described in the SVG specification.">SVG documentation regarding path string</a>. Raphaël fully supports it.</p> + > Colour Parsing + # <ul> + # <li>Colour name (“<code>red</code>”, “<code>green</code>”, “<code>cornflowerblue</code>”, etc)</li> + # <li>#••• — shortened HTML colour: (“<code>#000</code>”, “<code>#fc0</code>”, etc)</li> + # <li>#•••••• — full length HTML colour: (“<code>#000000</code>”, “<code>#bd2300</code>”)</li> + # <li>rgb(•••, •••, •••) — red, green and blue channels’ values: (“<code>rgb(200, 100, 0)</code>”)</li> + # <li>rgb(•••%, •••%, •••%) — same as above, but in %: (“<code>rgb(100%, 175%, 0%)</code>”)</li> + # <li>rgba(•••, •••, •••, •••) — red, green and blue channels’ values: (“<code>rgba(200, 100, 0, .5)</code>”)</li> + # <li>rgba(•••%, •••%, •••%, •••%) — same as above, but in %: (“<code>rgba(100%, 175%, 0%, 50%)</code>”)</li> + # <li>hsb(•••, •••, •••) — hue, saturation and brightness values: (“<code>hsb(0.5, 0.25, 1)</code>”)</li> + # <li>hsb(•••%, •••%, •••%) — same as above, but in %</li> + # <li>hsba(•••, •••, •••, •••) — same as above, but with opacity</li> + # <li>hsl(•••, •••, •••) — almost the same as hsb, see <a href="http://en.wikipedia.org/wiki/HSL_and_HSV" title="HSL and HSV - Wikipedia, the free encyclopedia">Wikipedia page</a></li> + # <li>hsl(•••%, •••%, •••%) — same as above, but in %</li> + # <li>hsla(•••, •••, •••, •••) — same as above, but with opacity</li> + # <li>Optionally for hsb and hsl you could specify hue as a degree: “<code>hsl(240deg, 1, .5)</code>” or, if you want to go fancy, “<code>hsl(240°, 1, .5)</code>”</li> + # </ul> + \*/ + elproto.attr = function (name, value) { + if (this.removed) { + return this; + } + if (name == null) { + var res = {}; + for (var a in this.attrs) if (this.attrs[has](a)) { + res[a] = this.attrs[a]; + } + res.gradient && res.fill == "none" && (res.fill = res.gradient) && delete res.gradient; + res.transform = this._.transform; + return res; + } + if (value == null && R.is(name, "string")) { + if (name == "fill" && this.attrs.fill == "none" && this.attrs.gradient) { + return this.attrs.gradient; + } + if (name == "transform") { + return this._.transform; + } + var names = name.split(separator), + out = {}; + for (var i = 0, ii = names.length; i < ii; i++) { + name = names[i]; + if (name in this.attrs) { + out[name] = this.attrs[name]; + } else if (R.is(this.paper.customAttributes[name], "function")) { + out[name] = this.paper.customAttributes[name].def; + } else { + out[name] = R._availableAttrs[name]; + } + } + return ii - 1 ? out : out[names[0]]; + } + if (value == null && R.is(name, "array")) { + out = {}; + for (i = 0, ii = name.length; i < ii; i++) { + out[name[i]] = this.attr(name[i]); + } + return out; + } + if (value != null) { + var params = {}; + params[name] = value; + } else if (name != null && R.is(name, "object")) { + params = name; + } + for (var key in params) { + eve("raphael.attr." + key + "." + this.id, this, params[key]); + } + for (key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], "function")) { + var par = this.paper.customAttributes[key].apply(this, [].concat(params[key])); + this.attrs[key] = params[key]; + for (var subkey in par) if (par[has](subkey)) { + params[subkey] = par[subkey]; + } + } + setFillAndStroke(this, params); + return this; + }; + /*\ + * Element.toFront + [ method ] + ** + * Moves the element so it is the closest to the viewer’s eyes, on top of other elements. + = (object) @Element + \*/ + elproto.toFront = function () { + if (this.removed) { + return this; + } + var node = getRealNode(this.node); + node.parentNode.appendChild(node); + var svg = this.paper; + svg.top != this && R._tofront(this, svg); + return this; + }; + /*\ + * Element.toBack + [ method ] + ** + * Moves the element so it is the furthest from the viewer’s eyes, behind other elements. + = (object) @Element + \*/ + elproto.toBack = function () { + if (this.removed) { + return this; + } + var node = getRealNode(this.node); + var parentNode = node.parentNode; + parentNode.insertBefore(node, parentNode.firstChild); + R._toback(this, this.paper); + var svg = this.paper; + return this; + }; + /*\ + * Element.insertAfter + [ method ] + ** + * Inserts current object after the given one. + = (object) @Element + \*/ + elproto.insertAfter = function (element) { + if (this.removed || !element) { + return this; + } + + var node = getRealNode(this.node); + var afterNode = getRealNode(element.node || element[element.length - 1].node); + if (afterNode.nextSibling) { + afterNode.parentNode.insertBefore(node, afterNode.nextSibling); + } else { + afterNode.parentNode.appendChild(node); + } + R._insertafter(this, element, this.paper); + return this; + }; + /*\ + * Element.insertBefore + [ method ] + ** + * Inserts current object before the given one. + = (object) @Element + \*/ + elproto.insertBefore = function (element) { + if (this.removed || !element) { + return this; + } + + var node = getRealNode(this.node); + var beforeNode = getRealNode(element.node || element[0].node); + beforeNode.parentNode.insertBefore(node, beforeNode); + R._insertbefore(this, element, this.paper); + return this; + }; + elproto.blur = function (size) { + // Experimental. No Safari support. Use it on your own risk. + var t = this; + if (+size !== 0) { + var fltr = $("filter"), + blur = $("feGaussianBlur"); + t.attrs.blur = size; + fltr.id = R.createUUID(); + $(blur, {stdDeviation: +size || 1.5}); + fltr.appendChild(blur); + t.paper.defs.appendChild(fltr); + t._blur = fltr; + $(t.node, {filter: "url(#" + fltr.id + ")"}); + } else { + if (t._blur) { + t._blur.parentNode.removeChild(t._blur); + delete t._blur; + delete t.attrs.blur; + } + t.node.removeAttribute("filter"); + } + return t; + }; + R._engine.circle = function (svg, x, y, r) { + var el = $("circle"); + svg.canvas && svg.canvas.appendChild(el); + var res = new Element(el, svg); + res.attrs = {cx: x, cy: y, r: r, fill: "none", stroke: "#000"}; + res.type = "circle"; + $(el, res.attrs); + return res; + }; + R._engine.rect = function (svg, x, y, w, h, r) { + var el = $("rect"); + svg.canvas && svg.canvas.appendChild(el); + var res = new Element(el, svg); + res.attrs = {x: x, y: y, width: w, height: h, rx: r || 0, ry: r || 0, fill: "none", stroke: "#000"}; + res.type = "rect"; + $(el, res.attrs); + return res; + }; + R._engine.ellipse = function (svg, x, y, rx, ry) { + var el = $("ellipse"); + svg.canvas && svg.canvas.appendChild(el); + var res = new Element(el, svg); + res.attrs = {cx: x, cy: y, rx: rx, ry: ry, fill: "none", stroke: "#000"}; + res.type = "ellipse"; + $(el, res.attrs); + return res; + }; + R._engine.image = function (svg, src, x, y, w, h) { + var el = $("image"); + $(el, {x: x, y: y, width: w, height: h, preserveAspectRatio: "none"}); + el.setAttributeNS(xlink, "href", src); + svg.canvas && svg.canvas.appendChild(el); + var res = new Element(el, svg); + res.attrs = {x: x, y: y, width: w, height: h, src: src}; + res.type = "image"; + return res; + }; + R._engine.text = function (svg, x, y, text) { + var el = $("text"); + svg.canvas && svg.canvas.appendChild(el); + var res = new Element(el, svg); + res.attrs = { + x: x, + y: y, + "text-anchor": "middle", + text: text, + "font-family": R._availableAttrs["font-family"], + "font-size": R._availableAttrs["font-size"], + stroke: "none", + fill: "#000" + }; + res.type = "text"; + setFillAndStroke(res, res.attrs); + return res; + }; + R._engine.setSize = function (width, height) { + this.width = width || this.width; + this.height = height || this.height; + this.canvas.setAttribute("width", this.width); + this.canvas.setAttribute("height", this.height); + if (this._viewBox) { + this.setViewBox.apply(this, this._viewBox); + } + return this; + }; + R._engine.create = function () { + var con = R._getContainer.apply(0, arguments), + container = con && con.container, + x = con.x, + y = con.y, + width = con.width, + height = con.height; + if (!container) { + throw new Error("SVG container not found."); + } + var cnvs = $("svg"), + css = "overflow:hidden;", + isFloating; + x = x || 0; + y = y || 0; + width = width || 512; + height = height || 342; + $(cnvs, { + height: height, + version: 1.1, + width: width, + xmlns: "http://www.w3.org/2000/svg", + "xmlns:xlink": "http://www.w3.org/1999/xlink" + }); + if (container == 1) { + cnvs.style.cssText = css + "position:absolute;left:" + x + "px;top:" + y + "px"; + R._g.doc.body.appendChild(cnvs); + isFloating = 1; + } else { + cnvs.style.cssText = css + "position:relative"; + if (container.firstChild) { + container.insertBefore(cnvs, container.firstChild); + } else { + container.appendChild(cnvs); + } + } + container = new R._Paper; + container.width = width; + container.height = height; + container.canvas = cnvs; + container.clear(); + container._left = container._top = 0; + isFloating && (container.renderfix = function () {}); + container.renderfix(); + return container; + }; + R._engine.setViewBox = function (x, y, w, h, fit) { + eve("raphael.setViewBox", this, this._viewBox, [x, y, w, h, fit]); + var paperSize = this.getSize(), + size = mmax(w / paperSize.width, h / paperSize.height), + top = this.top, + aspectRatio = fit ? "xMidYMid meet" : "xMinYMin", + vb, + sw; + if (x == null) { + if (this._vbSize) { + size = 1; + } + delete this._vbSize; + vb = "0 0 " + this.width + S + this.height; + } else { + this._vbSize = size; + vb = x + S + y + S + w + S + h; + } + $(this.canvas, { + viewBox: vb, + preserveAspectRatio: aspectRatio + }); + while (size && top) { + sw = "stroke-width" in top.attrs ? top.attrs["stroke-width"] : 1; + top.attr({"stroke-width": sw}); + top._.dirty = 1; + top._.dirtyT = 1; + top = top.prev; + } + this._viewBox = [x, y, w, h, !!fit]; + return this; + }; + /*\ + * Paper.renderfix + [ method ] + ** + * Fixes the issue of Firefox and IE9 regarding subpixel rendering. If paper is dependent + * on other elements after reflow it could shift half pixel which cause for lines to lost their crispness. + * This method fixes the issue. + ** + Special thanks to Mariusz Nowak (http://www.medikoo.com/) for this method. + \*/ + R.prototype.renderfix = function () { + var cnvs = this.canvas, + s = cnvs.style, + pos; + try { + pos = cnvs.getScreenCTM() || cnvs.createSVGMatrix(); + } catch (e) { + pos = cnvs.createSVGMatrix(); + } + var left = -pos.e % 1, + top = -pos.f % 1; + if (left || top) { + if (left) { + this._left = (this._left + left) % 1; + s.left = this._left + "px"; + } + if (top) { + this._top = (this._top + top) % 1; + s.top = this._top + "px"; + } + } + }; + /*\ + * Paper.clear + [ method ] + ** + * Clears the paper, i.e. removes all the elements. + \*/ + R.prototype.clear = function () { + R.eve("raphael.clear", this); + var c = this.canvas; + while (c.firstChild) { + c.removeChild(c.firstChild); + } + this.bottom = this.top = null; + (this.desc = $("desc")).appendChild(R._g.doc.createTextNode("Created with Rapha\xebl " + R.version)); + c.appendChild(this.desc); + c.appendChild(this.defs = $("defs")); + }; + /*\ + * Paper.remove + [ method ] + ** + * Removes the paper from the DOM. + \*/ + R.prototype.remove = function () { + eve("raphael.remove", this); + this.canvas.parentNode && this.canvas.parentNode.removeChild(this.canvas); + for (var i in this) { + this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null; + } + }; + var setproto = R.st; + for (var method in elproto) if (elproto[has](method) && !setproto[has](method)) { + setproto[method] = (function (methodname) { + return function () { + var arg = arguments; + return this.forEach(function (el) { + el[methodname].apply(el, arg); + }); + }; + })(method); + } + }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + + +/***/ }, +/* 4 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(1)], __WEBPACK_AMD_DEFINE_RESULT__ = function(R) { + if (R && !R.vml) { + return; + } + + var has = "hasOwnProperty", + Str = String, + toFloat = parseFloat, + math = Math, + round = math.round, + mmax = math.max, + mmin = math.min, + abs = math.abs, + fillString = "fill", + separator = /[, ]+/, + eve = R.eve, + ms = " progid:DXImageTransform.Microsoft", + S = " ", + E = "", + map = {M: "m", L: "l", C: "c", Z: "x", m: "t", l: "r", c: "v", z: "x"}, + bites = /([clmz]),?([^clmz]*)/gi, + blurregexp = / progid:\S+Blur\([^\)]+\)/g, + val = /-?[^,\s-]+/g, + cssDot = "position:absolute;left:0;top:0;width:1px;height:1px;behavior:url(#default#VML)", + zoom = 21600, + pathTypes = {path: 1, rect: 1, image: 1}, + ovalTypes = {circle: 1, ellipse: 1}, + path2vml = function (path) { + var total = /[ahqstv]/ig, + command = R._pathToAbsolute; + Str(path).match(total) && (command = R._path2curve); + total = /[clmz]/g; + if (command == R._pathToAbsolute && !Str(path).match(total)) { + var res = Str(path).replace(bites, function (all, command, args) { + var vals = [], + isMove = command.toLowerCase() == "m", + res = map[command]; + args.replace(val, function (value) { + if (isMove && vals.length == 2) { + res += vals + map[command == "m" ? "l" : "L"]; + vals = []; + } + vals.push(round(value * zoom)); + }); + return res + vals; + }); + return res; + } + var pa = command(path), p, r; + res = []; + for (var i = 0, ii = pa.length; i < ii; i++) { + p = pa[i]; + r = pa[i][0].toLowerCase(); + r == "z" && (r = "x"); + for (var j = 1, jj = p.length; j < jj; j++) { + r += round(p[j] * zoom) + (j != jj - 1 ? "," : E); + } + res.push(r); + } + return res.join(S); + }, + compensation = function (deg, dx, dy) { + var m = R.matrix(); + m.rotate(-deg, .5, .5); + return { + dx: m.x(dx, dy), + dy: m.y(dx, dy) + }; + }, + setCoords = function (p, sx, sy, dx, dy, deg) { + var _ = p._, + m = p.matrix, + fillpos = _.fillpos, + o = p.node, + s = o.style, + y = 1, + flip = "", + dxdy, + kx = zoom / sx, + ky = zoom / sy; + s.visibility = "hidden"; + if (!sx || !sy) { + return; + } + o.coordsize = abs(kx) + S + abs(ky); + s.rotation = deg * (sx * sy < 0 ? -1 : 1); + if (deg) { + var c = compensation(deg, dx, dy); + dx = c.dx; + dy = c.dy; + } + sx < 0 && (flip += "x"); + sy < 0 && (flip += " y") && (y = -1); + s.flip = flip; + o.coordorigin = (dx * -kx) + S + (dy * -ky); + if (fillpos || _.fillsize) { + var fill = o.getElementsByTagName(fillString); + fill = fill && fill[0]; + o.removeChild(fill); + if (fillpos) { + c = compensation(deg, m.x(fillpos[0], fillpos[1]), m.y(fillpos[0], fillpos[1])); + fill.position = c.dx * y + S + c.dy * y; + } + if (_.fillsize) { + fill.size = _.fillsize[0] * abs(sx) + S + _.fillsize[1] * abs(sy); + } + o.appendChild(fill); + } + s.visibility = "visible"; + }; + R.toString = function () { + return "Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\xebl " + this.version; + }; + var addArrow = function (o, value, isEnd) { + var values = Str(value).toLowerCase().split("-"), + se = isEnd ? "end" : "start", + i = values.length, + type = "classic", + w = "medium", + h = "medium"; + while (i--) { + switch (values[i]) { + case "block": + case "classic": + case "oval": + case "diamond": + case "open": + case "none": + type = values[i]; + break; + case "wide": + case "narrow": h = values[i]; break; + case "long": + case "short": w = values[i]; break; + } + } + var stroke = o.node.getElementsByTagName("stroke")[0]; + stroke[se + "arrow"] = type; + stroke[se + "arrowlength"] = w; + stroke[se + "arrowwidth"] = h; + }, + setFillAndStroke = function (o, params) { + // o.paper.canvas.style.display = "none"; + o.attrs = o.attrs || {}; + var node = o.node, + a = o.attrs, + s = node.style, + xy, + newpath = pathTypes[o.type] && (params.x != a.x || params.y != a.y || params.width != a.width || params.height != a.height || params.cx != a.cx || params.cy != a.cy || params.rx != a.rx || params.ry != a.ry || params.r != a.r), + isOval = ovalTypes[o.type] && (a.cx != params.cx || a.cy != params.cy || a.r != params.r || a.rx != params.rx || a.ry != params.ry), + res = o; + + + for (var par in params) if (params[has](par)) { + a[par] = params[par]; + } + if (newpath) { + a.path = R._getPath[o.type](o); + o._.dirty = 1; + } + params.href && (node.href = params.href); + params.title && (node.title = params.title); + params.target && (node.target = params.target); + params.cursor && (s.cursor = params.cursor); + "blur" in params && o.blur(params.blur); + if (params.path && o.type == "path" || newpath) { + node.path = path2vml(~Str(a.path).toLowerCase().indexOf("r") ? R._pathToAbsolute(a.path) : a.path); + o._.dirty = 1; + if (o.type == "image") { + o._.fillpos = [a.x, a.y]; + o._.fillsize = [a.width, a.height]; + setCoords(o, 1, 1, 0, 0, 0); + } + } + "transform" in params && o.transform(params.transform); + if (isOval) { + var cx = +a.cx, + cy = +a.cy, + rx = +a.rx || +a.r || 0, + ry = +a.ry || +a.r || 0; + node.path = R.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x", round((cx - rx) * zoom), round((cy - ry) * zoom), round((cx + rx) * zoom), round((cy + ry) * zoom), round(cx * zoom)); + o._.dirty = 1; + } + if ("clip-rect" in params) { + var rect = Str(params["clip-rect"]).split(separator); + if (rect.length == 4) { + rect[2] = +rect[2] + (+rect[0]); + rect[3] = +rect[3] + (+rect[1]); + var div = node.clipRect || R._g.doc.createElement("div"), + dstyle = div.style; + dstyle.clip = R.format("rect({1}px {2}px {3}px {0}px)", rect); + if (!node.clipRect) { + dstyle.position = "absolute"; + dstyle.top = 0; + dstyle.left = 0; + dstyle.width = o.paper.width + "px"; + dstyle.height = o.paper.height + "px"; + node.parentNode.insertBefore(div, node); + div.appendChild(node); + node.clipRect = div; + } + } + if (!params["clip-rect"]) { + node.clipRect && (node.clipRect.style.clip = "auto"); + } + } + if (o.textpath) { + var textpathStyle = o.textpath.style; + params.font && (textpathStyle.font = params.font); + params["font-family"] && (textpathStyle.fontFamily = '"' + params["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g, E) + '"'); + params["font-size"] && (textpathStyle.fontSize = params["font-size"]); + params["font-weight"] && (textpathStyle.fontWeight = params["font-weight"]); + params["font-style"] && (textpathStyle.fontStyle = params["font-style"]); + } + if ("arrow-start" in params) { + addArrow(res, params["arrow-start"]); + } + if ("arrow-end" in params) { + addArrow(res, params["arrow-end"], 1); + } + if (params.opacity != null || + params.fill != null || + params.src != null || + params.stroke != null || + params["stroke-width"] != null || + params["stroke-opacity"] != null || + params["fill-opacity"] != null || + params["stroke-dasharray"] != null || + params["stroke-miterlimit"] != null || + params["stroke-linejoin"] != null || + params["stroke-linecap"] != null) { + var fill = node.getElementsByTagName(fillString), + newfill = false; + fill = fill && fill[0]; + !fill && (newfill = fill = createNode(fillString)); + if (o.type == "image" && params.src) { + fill.src = params.src; + } + params.fill && (fill.on = true); + if (fill.on == null || params.fill == "none" || params.fill === null) { + fill.on = false; + } + if (fill.on && params.fill) { + var isURL = Str(params.fill).match(R._ISURL); + if (isURL) { + fill.parentNode == node && node.removeChild(fill); + fill.rotate = true; + fill.src = isURL[1]; + fill.type = "tile"; + var bbox = o.getBBox(1); + fill.position = bbox.x + S + bbox.y; + o._.fillpos = [bbox.x, bbox.y]; + + R._preload(isURL[1], function () { + o._.fillsize = [this.offsetWidth, this.offsetHeight]; + }); + } else { + fill.color = R.getRGB(params.fill).hex; + fill.src = E; + fill.type = "solid"; + if (R.getRGB(params.fill).error && (res.type in {circle: 1, ellipse: 1} || Str(params.fill).charAt() != "r") && addGradientFill(res, params.fill, fill)) { + a.fill = "none"; + a.gradient = params.fill; + fill.rotate = false; + } + } + } + if ("fill-opacity" in params || "opacity" in params) { + var opacity = ((+a["fill-opacity"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+R.getRGB(params.fill).o + 1 || 2) - 1); + opacity = mmin(mmax(opacity, 0), 1); + fill.opacity = opacity; + if (fill.src) { + fill.color = "none"; + } + } + node.appendChild(fill); + var stroke = (node.getElementsByTagName("stroke") && node.getElementsByTagName("stroke")[0]), + newstroke = false; + !stroke && (newstroke = stroke = createNode("stroke")); + if ((params.stroke && params.stroke != "none") || + params["stroke-width"] || + params["stroke-opacity"] != null || + params["stroke-dasharray"] || + params["stroke-miterlimit"] || + params["stroke-linejoin"] || + params["stroke-linecap"]) { + stroke.on = true; + } + (params.stroke == "none" || params.stroke === null || stroke.on == null || params.stroke == 0 || params["stroke-width"] == 0) && (stroke.on = false); + var strokeColor = R.getRGB(params.stroke); + stroke.on && params.stroke && (stroke.color = strokeColor.hex); + opacity = ((+a["stroke-opacity"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+strokeColor.o + 1 || 2) - 1); + var width = (toFloat(params["stroke-width"]) || 1) * .75; + opacity = mmin(mmax(opacity, 0), 1); + params["stroke-width"] == null && (width = a["stroke-width"]); + params["stroke-width"] && (stroke.weight = width); + width && width < 1 && (opacity *= width) && (stroke.weight = 1); + stroke.opacity = opacity; + + params["stroke-linejoin"] && (stroke.joinstyle = params["stroke-linejoin"] || "miter"); + stroke.miterlimit = params["stroke-miterlimit"] || 8; + params["stroke-linecap"] && (stroke.endcap = params["stroke-linecap"] == "butt" ? "flat" : params["stroke-linecap"] == "square" ? "square" : "round"); + if ("stroke-dasharray" in params) { + var dasharray = { + "-": "shortdash", + ".": "shortdot", + "-.": "shortdashdot", + "-..": "shortdashdotdot", + ". ": "dot", + "- ": "dash", + "--": "longdash", + "- .": "dashdot", + "--.": "longdashdot", + "--..": "longdashdotdot" + }; + stroke.dashstyle = dasharray[has](params["stroke-dasharray"]) ? dasharray[params["stroke-dasharray"]] : E; + } + newstroke && node.appendChild(stroke); + } + if (res.type == "text") { + res.paper.canvas.style.display = E; + var span = res.paper.span, + m = 100, + fontSize = a.font && a.font.match(/\d+(?:\.\d*)?(?=px)/); + s = span.style; + a.font && (s.font = a.font); + a["font-family"] && (s.fontFamily = a["font-family"]); + a["font-weight"] && (s.fontWeight = a["font-weight"]); + a["font-style"] && (s.fontStyle = a["font-style"]); + fontSize = toFloat(a["font-size"] || fontSize && fontSize[0]) || 10; + s.fontSize = fontSize * m + "px"; + res.textpath.string && (span.innerHTML = Str(res.textpath.string).replace(/</g, "<").replace(/&/g, "&").replace(/\n/g, "<br>")); + var brect = span.getBoundingClientRect(); + res.W = a.w = (brect.right - brect.left) / m; + res.H = a.h = (brect.bottom - brect.top) / m; + // res.paper.canvas.style.display = "none"; + res.X = a.x; + res.Y = a.y + res.H / 2; + + ("x" in params || "y" in params) && (res.path.v = R.format("m{0},{1}l{2},{1}", round(a.x * zoom), round(a.y * zoom), round(a.x * zoom) + 1)); + var dirtyattrs = ["x", "y", "text", "font", "font-family", "font-weight", "font-style", "font-size"]; + for (var d = 0, dd = dirtyattrs.length; d < dd; d++) if (dirtyattrs[d] in params) { + res._.dirty = 1; + break; + } + + // text-anchor emulation + switch (a["text-anchor"]) { + case "start": + res.textpath.style["v-text-align"] = "left"; + res.bbx = res.W / 2; + break; + case "end": + res.textpath.style["v-text-align"] = "right"; + res.bbx = -res.W / 2; + break; + default: + res.textpath.style["v-text-align"] = "center"; + res.bbx = 0; + break; + } + res.textpath.style["v-text-kern"] = true; + } + // res.paper.canvas.style.display = E; + }, + addGradientFill = function (o, gradient, fill) { + o.attrs = o.attrs || {}; + var attrs = o.attrs, + pow = Math.pow, + opacity, + oindex, + type = "linear", + fxfy = ".5 .5"; + o.attrs.gradient = gradient; + gradient = Str(gradient).replace(R._radial_gradient, function (all, fx, fy) { + type = "radial"; + if (fx && fy) { + fx = toFloat(fx); + fy = toFloat(fy); + pow(fx - .5, 2) + pow(fy - .5, 2) > .25 && (fy = math.sqrt(.25 - pow(fx - .5, 2)) * ((fy > .5) * 2 - 1) + .5); + fxfy = fx + S + fy; + } + return E; + }); + gradient = gradient.split(/\s*\-\s*/); + if (type == "linear") { + var angle = gradient.shift(); + angle = -toFloat(angle); + if (isNaN(angle)) { + return null; + } + } + var dots = R._parseDots(gradient); + if (!dots) { + return null; + } + o = o.shape || o.node; + if (dots.length) { + o.removeChild(fill); + fill.on = true; + fill.method = "none"; + fill.color = dots[0].color; + fill.color2 = dots[dots.length - 1].color; + var clrs = []; + for (var i = 0, ii = dots.length; i < ii; i++) { + dots[i].offset && clrs.push(dots[i].offset + S + dots[i].color); + } + fill.colors = clrs.length ? clrs.join() : "0% " + fill.color; + if (type == "radial") { + fill.type = "gradientTitle"; + fill.focus = "100%"; + fill.focussize = "0 0"; + fill.focusposition = fxfy; + fill.angle = 0; + } else { + // fill.rotate= true; + fill.type = "gradient"; + fill.angle = (270 - angle) % 360; + } + o.appendChild(fill); + } + return 1; + }, + Element = function (node, vml) { + this[0] = this.node = node; + node.raphael = true; + this.id = R._oid++; + node.raphaelid = this.id; + this.X = 0; + this.Y = 0; + this.attrs = {}; + this.paper = vml; + this.matrix = R.matrix(); + this._ = { + transform: [], + sx: 1, + sy: 1, + dx: 0, + dy: 0, + deg: 0, + dirty: 1, + dirtyT: 1 + }; + !vml.bottom && (vml.bottom = this); + this.prev = vml.top; + vml.top && (vml.top.next = this); + vml.top = this; + this.next = null; + }; + var elproto = R.el; + + Element.prototype = elproto; + elproto.constructor = Element; + elproto.transform = function (tstr) { + if (tstr == null) { + return this._.transform; + } + var vbs = this.paper._viewBoxShift, + vbt = vbs ? "s" + [vbs.scale, vbs.scale] + "-1-1t" + [vbs.dx, vbs.dy] : E, + oldt; + if (vbs) { + oldt = tstr = Str(tstr).replace(/\.{3}|\u2026/g, this._.transform || E); + } + R._extractTransform(this, vbt + tstr); + var matrix = this.matrix.clone(), + skew = this.skew, + o = this.node, + split, + isGrad = ~Str(this.attrs.fill).indexOf("-"), + isPatt = !Str(this.attrs.fill).indexOf("url("); + matrix.translate(1, 1); + if (isPatt || isGrad || this.type == "image") { + skew.matrix = "1 0 0 1"; + skew.offset = "0 0"; + split = matrix.split(); + if ((isGrad && split.noRotation) || !split.isSimple) { + o.style.filter = matrix.toFilter(); + var bb = this.getBBox(), + bbt = this.getBBox(1), + dx = bb.x - bbt.x, + dy = bb.y - bbt.y; + o.coordorigin = (dx * -zoom) + S + (dy * -zoom); + setCoords(this, 1, 1, dx, dy, 0); + } else { + o.style.filter = E; + setCoords(this, split.scalex, split.scaley, split.dx, split.dy, split.rotate); + } + } else { + o.style.filter = E; + skew.matrix = Str(matrix); + skew.offset = matrix.offset(); + } + if (oldt !== null) { // empty string value is true as well + this._.transform = oldt; + R._extractTransform(this, oldt); + } + return this; + }; + elproto.rotate = function (deg, cx, cy) { + if (this.removed) { + return this; + } + if (deg == null) { + return; + } + deg = Str(deg).split(separator); + if (deg.length - 1) { + cx = toFloat(deg[1]); + cy = toFloat(deg[2]); + } + deg = toFloat(deg[0]); + (cy == null) && (cx = cy); + if (cx == null || cy == null) { + var bbox = this.getBBox(1); + cx = bbox.x + bbox.width / 2; + cy = bbox.y + bbox.height / 2; + } + this._.dirtyT = 1; + this.transform(this._.transform.concat([["r", deg, cx, cy]])); + return this; + }; + elproto.translate = function (dx, dy) { + if (this.removed) { + return this; + } + dx = Str(dx).split(separator); + if (dx.length - 1) { + dy = toFloat(dx[1]); + } + dx = toFloat(dx[0]) || 0; + dy = +dy || 0; + if (this._.bbox) { + this._.bbox.x += dx; + this._.bbox.y += dy; + } + this.transform(this._.transform.concat([["t", dx, dy]])); + return this; + }; + elproto.scale = function (sx, sy, cx, cy) { + if (this.removed) { + return this; + } + sx = Str(sx).split(separator); + if (sx.length - 1) { + sy = toFloat(sx[1]); + cx = toFloat(sx[2]); + cy = toFloat(sx[3]); + isNaN(cx) && (cx = null); + isNaN(cy) && (cy = null); + } + sx = toFloat(sx[0]); + (sy == null) && (sy = sx); + (cy == null) && (cx = cy); + if (cx == null || cy == null) { + var bbox = this.getBBox(1); + } + cx = cx == null ? bbox.x + bbox.width / 2 : cx; + cy = cy == null ? bbox.y + bbox.height / 2 : cy; + + this.transform(this._.transform.concat([["s", sx, sy, cx, cy]])); + this._.dirtyT = 1; + return this; + }; + elproto.hide = function () { + !this.removed && (this.node.style.display = "none"); + return this; + }; + elproto.show = function () { + !this.removed && (this.node.style.display = E); + return this; + }; + // Needed to fix the vml setViewBox issues + elproto.auxGetBBox = R.el.getBBox; + elproto.getBBox = function(){ + var b = this.auxGetBBox(); + if (this.paper && this.paper._viewBoxShift) + { + var c = {}; + var z = 1/this.paper._viewBoxShift.scale; + c.x = b.x - this.paper._viewBoxShift.dx; + c.x *= z; + c.y = b.y - this.paper._viewBoxShift.dy; + c.y *= z; + c.width = b.width * z; + c.height = b.height * z; + c.x2 = c.x + c.width; + c.y2 = c.y + c.height; + return c; + } + return b; + }; + elproto._getBBox = function () { + if (this.removed) { + return {}; + } + return { + x: this.X + (this.bbx || 0) - this.W / 2, + y: this.Y - this.H, + width: this.W, + height: this.H + }; + }; + elproto.remove = function () { + if (this.removed || !this.node.parentNode) { + return; + } + this.paper.__set__ && this.paper.__set__.exclude(this); + R.eve.unbind("raphael.*.*." + this.id); + R._tear(this, this.paper); + this.node.parentNode.removeChild(this.node); + this.shape && this.shape.parentNode.removeChild(this.shape); + for (var i in this) { + this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null; + } + this.removed = true; + }; + elproto.attr = function (name, value) { + if (this.removed) { + return this; + } + if (name == null) { + var res = {}; + for (var a in this.attrs) if (this.attrs[has](a)) { + res[a] = this.attrs[a]; + } + res.gradient && res.fill == "none" && (res.fill = res.gradient) && delete res.gradient; + res.transform = this._.transform; + return res; + } + if (value == null && R.is(name, "string")) { + if (name == fillString && this.attrs.fill == "none" && this.attrs.gradient) { + return this.attrs.gradient; + } + var names = name.split(separator), + out = {}; + for (var i = 0, ii = names.length; i < ii; i++) { + name = names[i]; + if (name in this.attrs) { + out[name] = this.attrs[name]; + } else if (R.is(this.paper.customAttributes[name], "function")) { + out[name] = this.paper.customAttributes[name].def; + } else { + out[name] = R._availableAttrs[name]; + } + } + return ii - 1 ? out : out[names[0]]; + } + if (this.attrs && value == null && R.is(name, "array")) { + out = {}; + for (i = 0, ii = name.length; i < ii; i++) { + out[name[i]] = this.attr(name[i]); + } + return out; + } + var params; + if (value != null) { + params = {}; + params[name] = value; + } + value == null && R.is(name, "object") && (params = name); + for (var key in params) { + eve("raphael.attr." + key + "." + this.id, this, params[key]); + } + if (params) { + for (key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], "function")) { + var par = this.paper.customAttributes[key].apply(this, [].concat(params[key])); + this.attrs[key] = params[key]; + for (var subkey in par) if (par[has](subkey)) { + params[subkey] = par[subkey]; + } + } + // this.paper.canvas.style.display = "none"; + if (params.text && this.type == "text") { + this.textpath.string = params.text; + } + setFillAndStroke(this, params); + // this.paper.canvas.style.display = E; + } + return this; + }; + elproto.toFront = function () { + !this.removed && this.node.parentNode.appendChild(this.node); + this.paper && this.paper.top != this && R._tofront(this, this.paper); + return this; + }; + elproto.toBack = function () { + if (this.removed) { + return this; + } + if (this.node.parentNode.firstChild != this.node) { + this.node.parentNode.insertBefore(this.node, this.node.parentNode.firstChild); + R._toback(this, this.paper); + } + return this; + }; + elproto.insertAfter = function (element) { + if (this.removed) { + return this; + } + if (element.constructor == R.st.constructor) { + element = element[element.length - 1]; + } + if (element.node.nextSibling) { + element.node.parentNode.insertBefore(this.node, element.node.nextSibling); + } else { + element.node.parentNode.appendChild(this.node); + } + R._insertafter(this, element, this.paper); + return this; + }; + elproto.insertBefore = function (element) { + if (this.removed) { + return this; + } + if (element.constructor == R.st.constructor) { + element = element[0]; + } + element.node.parentNode.insertBefore(this.node, element.node); + R._insertbefore(this, element, this.paper); + return this; + }; + elproto.blur = function (size) { + var s = this.node.runtimeStyle, + f = s.filter; + f = f.replace(blurregexp, E); + if (+size !== 0) { + this.attrs.blur = size; + s.filter = f + S + ms + ".Blur(pixelradius=" + (+size || 1.5) + ")"; + s.margin = R.format("-{0}px 0 0 -{0}px", round(+size || 1.5)); + } else { + s.filter = f; + s.margin = 0; + delete this.attrs.blur; + } + return this; + }; + + R._engine.path = function (pathString, vml) { + var el = createNode("shape"); + el.style.cssText = cssDot; + el.coordsize = zoom + S + zoom; + el.coordorigin = vml.coordorigin; + var p = new Element(el, vml), + attr = {fill: "none", stroke: "#000"}; + pathString && (attr.path = pathString); + p.type = "path"; + p.path = []; + p.Path = E; + setFillAndStroke(p, attr); + vml.canvas && vml.canvas.appendChild(el); + var skew = createNode("skew"); + skew.on = true; + el.appendChild(skew); + p.skew = skew; + p.transform(E); + return p; + }; + R._engine.rect = function (vml, x, y, w, h, r) { + var path = R._rectPath(x, y, w, h, r), + res = vml.path(path), + a = res.attrs; + res.X = a.x = x; + res.Y = a.y = y; + res.W = a.width = w; + res.H = a.height = h; + a.r = r; + a.path = path; + res.type = "rect"; + return res; + }; + R._engine.ellipse = function (vml, x, y, rx, ry) { + var res = vml.path(), + a = res.attrs; + res.X = x - rx; + res.Y = y - ry; + res.W = rx * 2; + res.H = ry * 2; + res.type = "ellipse"; + setFillAndStroke(res, { + cx: x, + cy: y, + rx: rx, + ry: ry + }); + return res; + }; + R._engine.circle = function (vml, x, y, r) { + var res = vml.path(), + a = res.attrs; + res.X = x - r; + res.Y = y - r; + res.W = res.H = r * 2; + res.type = "circle"; + setFillAndStroke(res, { + cx: x, + cy: y, + r: r + }); + return res; + }; + R._engine.image = function (vml, src, x, y, w, h) { + var path = R._rectPath(x, y, w, h), + res = vml.path(path).attr({stroke: "none"}), + a = res.attrs, + node = res.node, + fill = node.getElementsByTagName(fillString)[0]; + a.src = src; + res.X = a.x = x; + res.Y = a.y = y; + res.W = a.width = w; + res.H = a.height = h; + a.path = path; + res.type = "image"; + fill.parentNode == node && node.removeChild(fill); + fill.rotate = true; + fill.src = src; + fill.type = "tile"; + res._.fillpos = [x, y]; + res._.fillsize = [w, h]; + node.appendChild(fill); + setCoords(res, 1, 1, 0, 0, 0); + return res; + }; + R._engine.text = function (vml, x, y, text) { + var el = createNode("shape"), + path = createNode("path"), + o = createNode("textpath"); + x = x || 0; + y = y || 0; + text = text || ""; + path.v = R.format("m{0},{1}l{2},{1}", round(x * zoom), round(y * zoom), round(x * zoom) + 1); + path.textpathok = true; + o.string = Str(text); + o.on = true; + el.style.cssText = cssDot; + el.coordsize = zoom + S + zoom; + el.coordorigin = "0 0"; + var p = new Element(el, vml), + attr = { + fill: "#000", + stroke: "none", + font: R._availableAttrs.font, + text: text + }; + p.shape = el; + p.path = path; + p.textpath = o; + p.type = "text"; + p.attrs.text = Str(text); + p.attrs.x = x; + p.attrs.y = y; + p.attrs.w = 1; + p.attrs.h = 1; + setFillAndStroke(p, attr); + el.appendChild(o); + el.appendChild(path); + vml.canvas.appendChild(el); + var skew = createNode("skew"); + skew.on = true; + el.appendChild(skew); + p.skew = skew; + p.transform(E); + return p; + }; + R._engine.setSize = function (width, height) { + var cs = this.canvas.style; + this.width = width; + this.height = height; + width == +width && (width += "px"); + height == +height && (height += "px"); + cs.width = width; + cs.height = height; + cs.clip = "rect(0 " + width + " " + height + " 0)"; + if (this._viewBox) { + R._engine.setViewBox.apply(this, this._viewBox); + } + return this; + }; + R._engine.setViewBox = function (x, y, w, h, fit) { + R.eve("raphael.setViewBox", this, this._viewBox, [x, y, w, h, fit]); + var paperSize = this.getSize(), + width = paperSize.width, + height = paperSize.height, + H, W; + if (fit) { + H = height / h; + W = width / w; + if (w * H < width) { + x -= (width - w * H) / 2 / H; + } + if (h * W < height) { + y -= (height - h * W) / 2 / W; + } + } + this._viewBox = [x, y, w, h, !!fit]; + this._viewBoxShift = { + dx: -x, + dy: -y, + scale: paperSize + }; + this.forEach(function (el) { + el.transform("..."); + }); + return this; + }; + var createNode; + R._engine.initWin = function (win) { + var doc = win.document; + if (doc.styleSheets.length < 31) { + doc.createStyleSheet().addRule(".rvml", "behavior:url(#default#VML)"); + } else { + // no more room, add to the existing one + // http://msdn.microsoft.com/en-us/library/ms531194%28VS.85%29.aspx + doc.styleSheets[0].addRule(".rvml", "behavior:url(#default#VML)"); + } + try { + !doc.namespaces.rvml && doc.namespaces.add("rvml", "urn:schemas-microsoft-com:vml"); + createNode = function (tagName) { + return doc.createElement('<rvml:' + tagName + ' class="rvml">'); + }; + } catch (e) { + createNode = function (tagName) { + return doc.createElement('<' + tagName + ' xmlns="urn:schemas-microsoft.com:vml" class="rvml">'); + }; + } + }; + R._engine.initWin(R._g.win); + R._engine.create = function () { + var con = R._getContainer.apply(0, arguments), + container = con.container, + height = con.height, + s, + width = con.width, + x = con.x, + y = con.y; + if (!container) { + throw new Error("VML container not found."); + } + var res = new R._Paper, + c = res.canvas = R._g.doc.createElement("div"), + cs = c.style; + x = x || 0; + y = y || 0; + width = width || 512; + height = height || 342; + res.width = width; + res.height = height; + width == +width && (width += "px"); + height == +height && (height += "px"); + res.coordsize = zoom * 1e3 + S + zoom * 1e3; + res.coordorigin = "0 0"; + res.span = R._g.doc.createElement("span"); + res.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;"; + c.appendChild(res.span); + cs.cssText = R.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden", width, height); + if (container == 1) { + R._g.doc.body.appendChild(c); + cs.left = x + "px"; + cs.top = y + "px"; + cs.position = "absolute"; + } else { + if (container.firstChild) { + container.insertBefore(c, container.firstChild); + } else { + container.appendChild(c); + } + } + res.renderfix = function () {}; + return res; + }; + R.prototype.clear = function () { + R.eve("raphael.clear", this); + this.canvas.innerHTML = E; + this.span = R._g.doc.createElement("span"); + this.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;"; + this.canvas.appendChild(this.span); + this.bottom = this.top = null; + }; + R.prototype.remove = function () { + R.eve("raphael.remove", this); + this.canvas.parentNode.removeChild(this.canvas); + for (var i in this) { + this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null; + } + return true; + }; + + var setproto = R.st; + for (var method in elproto) if (elproto[has](method) && !setproto[has](method)) { + setproto[method] = (function (methodname) { + return function () { + var arg = arguments; + return this.forEach(function (el) { + el[methodname].apply(el, arg); + }); + }; + })(method); + } + }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + + +/***/ } +/******/ ]) +}); +; \ No newline at end of file diff --git a/public/bower_components/raphael/raphael.min.js b/public/bower_components/raphael/raphael.min.js new file mode 100755 index 0000000..0867a74 --- /dev/null +++ b/public/bower_components/raphael/raphael.min.js @@ -0,0 +1,3 @@ +!function t(e,r){"object"==typeof exports&&"object"==typeof module?module.exports=r():"function"==typeof define&&define.amd?define([],r):"object"==typeof exports?exports.Raphael=r():e.Raphael=r()}(this,function(){return function(t){function e(i){if(r[i])return r[i].exports;var n=r[i]={exports:{},id:i,loaded:!1};return t[i].call(n.exports,n,n.exports,e),n.loaded=!0,n.exports}var r={};return e.m=t,e.c=r,e.p="",e(0)}([function(t,e,r){var i,n;i=[r(1),r(3),r(4)],n=function(t){return t}.apply(e,i),!(void 0!==n&&(t.exports=n))},function(t,e,r){var i,n;i=[r(2)],n=function(t){function e(r){if(e.is(r,"function"))return w?r():t.on("raphael.DOMload",r);if(e.is(r,Q))return e._engine.create[z](e,r.splice(0,3+e.is(r[0],$))).add(r);var i=Array.prototype.slice.call(arguments,0);if(e.is(i[i.length-1],"function")){var n=i.pop();return w?n.call(e._engine.create[z](e,i)):t.on("raphael.DOMload",function(){n.call(e._engine.create[z](e,i))})}return e._engine.create[z](e,arguments)}function r(t){if("function"==typeof t||Object(t)!==t)return t;var e=new t.constructor;for(var i in t)t[T](i)&&(e[i]=r(t[i]));return e}function i(t,e){for(var r=0,i=t.length;i>r;r++)if(t[r]===e)return t.push(t.splice(r,1)[0])}function n(t,e,r){function n(){var a=Array.prototype.slice.call(arguments,0),s=a.join("␀"),o=n.cache=n.cache||{},l=n.count=n.count||[];return o[T](s)?(i(l,s),r?r(o[s]):o[s]):(l.length>=1e3&&delete o[l.shift()],l.push(s),o[s]=t[z](e,a),r?r(o[s]):o[s])}return n}function a(){return this.hex}function s(t,e){for(var r=[],i=0,n=t.length;n-2*!e>i;i+=2){var a=[{x:+t[i-2],y:+t[i-1]},{x:+t[i],y:+t[i+1]},{x:+t[i+2],y:+t[i+3]},{x:+t[i+4],y:+t[i+5]}];e?i?n-4==i?a[3]={x:+t[0],y:+t[1]}:n-2==i&&(a[2]={x:+t[0],y:+t[1]},a[3]={x:+t[2],y:+t[3]}):a[0]={x:+t[n-2],y:+t[n-1]}:n-4==i?a[3]=a[2]:i||(a[0]={x:+t[i],y:+t[i+1]}),r.push(["C",(-a[0].x+6*a[1].x+a[2].x)/6,(-a[0].y+6*a[1].y+a[2].y)/6,(a[1].x+6*a[2].x-a[3].x)/6,(a[1].y+6*a[2].y-a[3].y)/6,a[2].x,a[2].y])}return r}function o(t,e,r,i,n){var a=-3*e+9*r-9*i+3*n,s=t*a+6*e-12*r+6*i;return t*s-3*e+3*r}function l(t,e,r,i,n,a,s,l,h){null==h&&(h=1),h=h>1?1:0>h?0:h;for(var u=h/2,c=12,f=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],p=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],d=0,g=0;c>g;g++){var x=u*f[g]+u,v=o(x,t,r,n,s),y=o(x,e,i,a,l),m=v*v+y*y;d+=p[g]*Y.sqrt(m)}return u*d}function h(t,e,r,i,n,a,s,o,h){if(!(0>h||l(t,e,r,i,n,a,s,o)<h)){var u=1,c=u/2,f=u-c,p,d=.01;for(p=l(t,e,r,i,n,a,s,o,f);H(p-h)>d;)c/=2,f+=(h>p?1:-1)*c,p=l(t,e,r,i,n,a,s,o,f);return f}}function u(t,e,r,i,n,a,s,o){if(!(W(t,r)<G(n,s)||G(t,r)>W(n,s)||W(e,i)<G(a,o)||G(e,i)>W(a,o))){var l=(t*i-e*r)*(n-s)-(t-r)*(n*o-a*s),h=(t*i-e*r)*(a-o)-(e-i)*(n*o-a*s),u=(t-r)*(a-o)-(e-i)*(n-s);if(u){var c=l/u,f=h/u,p=+c.toFixed(2),d=+f.toFixed(2);if(!(p<+G(t,r).toFixed(2)||p>+W(t,r).toFixed(2)||p<+G(n,s).toFixed(2)||p>+W(n,s).toFixed(2)||d<+G(e,i).toFixed(2)||d>+W(e,i).toFixed(2)||d<+G(a,o).toFixed(2)||d>+W(a,o).toFixed(2)))return{x:c,y:f}}}}function c(t,e){return p(t,e)}function f(t,e){return p(t,e,1)}function p(t,r,i){var n=e.bezierBBox(t),a=e.bezierBBox(r);if(!e.isBBoxIntersect(n,a))return i?0:[];for(var s=l.apply(0,t),o=l.apply(0,r),h=W(~~(s/5),1),c=W(~~(o/5),1),f=[],p=[],d={},g=i?0:[],x=0;h+1>x;x++){var v=e.findDotsAtSegment.apply(e,t.concat(x/h));f.push({x:v.x,y:v.y,t:x/h})}for(x=0;c+1>x;x++)v=e.findDotsAtSegment.apply(e,r.concat(x/c)),p.push({x:v.x,y:v.y,t:x/c});for(x=0;h>x;x++)for(var y=0;c>y;y++){var m=f[x],b=f[x+1],_=p[y],w=p[y+1],k=H(b.x-m.x)<.001?"y":"x",B=H(w.x-_.x)<.001?"y":"x",C=u(m.x,m.y,b.x,b.y,_.x,_.y,w.x,w.y);if(C){if(d[C.x.toFixed(4)]==C.y.toFixed(4))continue;d[C.x.toFixed(4)]=C.y.toFixed(4);var S=m.t+H((C[k]-m[k])/(b[k]-m[k]))*(b.t-m.t),T=_.t+H((C[B]-_[B])/(w[B]-_[B]))*(w.t-_.t);S>=0&&1.001>=S&&T>=0&&1.001>=T&&(i?g++:g.push({x:C.x,y:C.y,t1:G(S,1),t2:G(T,1)}))}}return g}function d(t,r,i){t=e._path2curve(t),r=e._path2curve(r);for(var n,a,s,o,l,h,u,c,f,d,g=i?0:[],x=0,v=t.length;v>x;x++){var y=t[x];if("M"==y[0])n=l=y[1],a=h=y[2];else{"C"==y[0]?(f=[n,a].concat(y.slice(1)),n=f[6],a=f[7]):(f=[n,a,n,a,l,h,l,h],n=l,a=h);for(var m=0,b=r.length;b>m;m++){var _=r[m];if("M"==_[0])s=u=_[1],o=c=_[2];else{"C"==_[0]?(d=[s,o].concat(_.slice(1)),s=d[6],o=d[7]):(d=[s,o,s,o,u,c,u,c],s=u,o=c);var w=p(f,d,i);if(i)g+=w;else{for(var k=0,B=w.length;B>k;k++)w[k].segment1=x,w[k].segment2=m,w[k].bez1=f,w[k].bez2=d;g=g.concat(w)}}}}}return g}function g(t,e,r,i,n,a){null!=t?(this.a=+t,this.b=+e,this.c=+r,this.d=+i,this.e=+n,this.f=+a):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function x(){return this.x+I+this.y}function v(){return this.x+I+this.y+I+this.width+" × "+this.height}function y(t,e,r,i,n,a){function s(t){return((c*t+u)*t+h)*t}function o(t,e){var r=l(t,e);return((d*r+p)*r+f)*r}function l(t,e){var r,i,n,a,o,l;for(n=t,l=0;8>l;l++){if(a=s(n)-t,H(a)<e)return n;if(o=(3*c*n+2*u)*n+h,H(o)<1e-6)break;n-=a/o}if(r=0,i=1,n=t,r>n)return r;if(n>i)return i;for(;i>r;){if(a=s(n),H(a-t)<e)return n;t>a?r=n:i=n,n=(i-r)/2+r}return n}var h=3*e,u=3*(i-e)-h,c=1-h-u,f=3*r,p=3*(n-r)-f,d=1-f-p;return o(t,1/(200*a))}function m(t,e){var r=[],i={};if(this.ms=e,this.times=1,t){for(var n in t)t[T](n)&&(i[ht(n)]=t[n],r.push(ht(n)));r.sort(Bt)}this.anim=i,this.top=r[r.length-1],this.percents=r}function b(r,i,n,a,s,o){n=ht(n);var l,h,u,c=[],f,p,d,x=r.ms,v={},m={},b={};if(a)for(w=0,B=Ee.length;B>w;w++){var _=Ee[w];if(_.el.id==i.id&&_.anim==r){_.percent!=n?(Ee.splice(w,1),u=1):h=_,i.attr(_.totalOrigin);break}}else a=+m;for(var w=0,B=r.percents.length;B>w;w++){if(r.percents[w]==n||r.percents[w]>a*r.top){n=r.percents[w],p=r.percents[w-1]||0,x=x/r.top*(n-p),f=r.percents[w+1],l=r.anim[n];break}a&&i.attr(r.anim[r.percents[w]])}if(l){if(h)h.initstatus=a,h.start=new Date-h.ms*a;else{for(var C in l)if(l[T](C)&&(pt[T](C)||i.paper.customAttributes[T](C)))switch(v[C]=i.attr(C),null==v[C]&&(v[C]=ft[C]),m[C]=l[C],pt[C]){case $:b[C]=(m[C]-v[C])/x;break;case"colour":v[C]=e.getRGB(v[C]);var S=e.getRGB(m[C]);b[C]={r:(S.r-v[C].r)/x,g:(S.g-v[C].g)/x,b:(S.b-v[C].b)/x};break;case"path":var A=Qt(v[C],m[C]),E=A[1];for(v[C]=A[0],b[C]=[],w=0,B=v[C].length;B>w;w++){b[C][w]=[0];for(var N=1,M=v[C][w].length;M>N;N++)b[C][w][N]=(E[w][N]-v[C][w][N])/x}break;case"transform":var L=i._,z=le(L[C],m[C]);if(z)for(v[C]=z.from,m[C]=z.to,b[C]=[],b[C].real=!0,w=0,B=v[C].length;B>w;w++)for(b[C][w]=[v[C][w][0]],N=1,M=v[C][w].length;M>N;N++)b[C][w][N]=(m[C][w][N]-v[C][w][N])/x;else{var F=i.matrix||new g,R={_:{transform:L.transform},getBBox:function(){return i.getBBox(1)}};v[C]=[F.a,F.b,F.c,F.d,F.e,F.f],se(R,m[C]),m[C]=R._.transform,b[C]=[(R.matrix.a-F.a)/x,(R.matrix.b-F.b)/x,(R.matrix.c-F.c)/x,(R.matrix.d-F.d)/x,(R.matrix.e-F.e)/x,(R.matrix.f-F.f)/x]}break;case"csv":var I=j(l[C])[q](k),D=j(v[C])[q](k);if("clip-rect"==C)for(v[C]=D,b[C]=[],w=D.length;w--;)b[C][w]=(I[w]-v[C][w])/x;m[C]=I;break;default:for(I=[][P](l[C]),D=[][P](v[C]),b[C]=[],w=i.paper.customAttributes[C].length;w--;)b[C][w]=((I[w]||0)-(D[w]||0))/x}var V=l.easing,O=e.easing_formulas[V];if(!O)if(O=j(V).match(st),O&&5==O.length){var Y=O;O=function(t){return y(t,+Y[1],+Y[2],+Y[3],+Y[4],x)}}else O=St;if(d=l.start||r.start||+new Date,_={anim:r,percent:n,timestamp:d,start:d+(r.del||0),status:0,initstatus:a||0,stop:!1,ms:x,easing:O,from:v,diff:b,to:m,el:i,callback:l.callback,prev:p,next:f,repeat:o||r.times,origin:i.attr(),totalOrigin:s},Ee.push(_),a&&!h&&!u&&(_.stop=!0,_.start=new Date-x*a,1==Ee.length))return Me();u&&(_.start=new Date-_.ms*a),1==Ee.length&&Ne(Me)}t("raphael.anim.start."+i.id,i,r)}}function _(t){for(var e=0;e<Ee.length;e++)Ee[e].el.paper==t&&Ee.splice(e--,1)}e.version="2.2.0",e.eve=t;var w,k=/[, ]+/,B={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},C=/\{(\d+)\}/g,S="prototype",T="hasOwnProperty",A={doc:document,win:window},E={was:Object.prototype[T].call(A.win,"Raphael"),is:A.win.Raphael},N=function(){this.ca=this.customAttributes={}},M,L="appendChild",z="apply",P="concat",F="ontouchstart"in A.win||A.win.DocumentTouch&&A.doc instanceof DocumentTouch,R="",I=" ",j=String,q="split",D="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel"[q](I),V={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},O=j.prototype.toLowerCase,Y=Math,W=Y.max,G=Y.min,H=Y.abs,X=Y.pow,U=Y.PI,$="number",Z="string",Q="array",J="toString",K="fill",tt=Object.prototype.toString,et={},rt="push",it=e._ISURL=/^url\(['"]?(.+?)['"]?\)$/i,nt=/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,at={NaN:1,Infinity:1,"-Infinity":1},st=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,ot=Y.round,lt="setAttribute",ht=parseFloat,ut=parseInt,ct=j.prototype.toUpperCase,ft=e._availableAttrs={"arrow-end":"none","arrow-start":"none",blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/","letter-spacing":0,opacity:1,path:"M0,0",r:0,rx:0,ry:0,src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",transform:"",width:0,x:0,y:0,"class":""},pt=e._availableAnimAttrs={blur:$,"clip-rect":"csv",cx:$,cy:$,fill:"colour","fill-opacity":$,"font-size":$,height:$,opacity:$,path:"path",r:$,rx:$,ry:$,stroke:"colour","stroke-opacity":$,"stroke-width":$,transform:"transform",width:$,x:$,y:$},dt=/[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]/g,gt=/[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/,xt={hs:1,rg:1},vt=/,?([achlmqrstvxz]),?/gi,yt=/([achlmrqstvz])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/gi,mt=/([rstm])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/gi,bt=/(-?\d*\.?\d*(?:e[\-+]?\d+)?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/gi,_t=e._radial_gradient=/^r(?:\(([^,]+?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*([^\)]+?)\))?/,wt={},kt=function(t,e){return t.key-e.key},Bt=function(t,e){return ht(t)-ht(e)},Ct=function(){},St=function(t){return t},Tt=e._rectPath=function(t,e,r,i,n){return n?[["M",t+n,e],["l",r-2*n,0],["a",n,n,0,0,1,n,n],["l",0,i-2*n],["a",n,n,0,0,1,-n,n],["l",2*n-r,0],["a",n,n,0,0,1,-n,-n],["l",0,2*n-i],["a",n,n,0,0,1,n,-n],["z"]]:[["M",t,e],["l",r,0],["l",0,i],["l",-r,0],["z"]]},At=function(t,e,r,i){return null==i&&(i=r),[["M",t,e],["m",0,-i],["a",r,i,0,1,1,0,2*i],["a",r,i,0,1,1,0,-2*i],["z"]]},Et=e._getPath={path:function(t){return t.attr("path")},circle:function(t){var e=t.attrs;return At(e.cx,e.cy,e.r)},ellipse:function(t){var e=t.attrs;return At(e.cx,e.cy,e.rx,e.ry)},rect:function(t){var e=t.attrs;return Tt(e.x,e.y,e.width,e.height,e.r)},image:function(t){var e=t.attrs;return Tt(e.x,e.y,e.width,e.height)},text:function(t){var e=t._getBBox();return Tt(e.x,e.y,e.width,e.height)},set:function(t){var e=t._getBBox();return Tt(e.x,e.y,e.width,e.height)}},Nt=e.mapPath=function(t,e){if(!e)return t;var r,i,n,a,s,o,l;for(t=Qt(t),n=0,s=t.length;s>n;n++)for(l=t[n],a=1,o=l.length;o>a;a+=2)r=e.x(l[a],l[a+1]),i=e.y(l[a],l[a+1]),l[a]=r,l[a+1]=i;return t};if(e._g=A,e.type=A.win.SVGAngle||A.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML","VML"==e.type){var Mt=A.doc.createElement("div"),Lt;if(Mt.innerHTML='<v:shape adj="1"/>',Lt=Mt.firstChild,Lt.style.behavior="url(#default#VML)",!Lt||"object"!=typeof Lt.adj)return e.type=R;Mt=null}e.svg=!(e.vml="VML"==e.type),e._Paper=N,e.fn=M=N.prototype=e.prototype,e._id=0,e._oid=0,e.is=function(t,e){return e=O.call(e),"finite"==e?!at[T](+t):"array"==e?t instanceof Array:"null"==e&&null===t||e==typeof t&&null!==t||"object"==e&&t===Object(t)||"array"==e&&Array.isArray&&Array.isArray(t)||tt.call(t).slice(8,-1).toLowerCase()==e},e.angle=function(t,r,i,n,a,s){if(null==a){var o=t-i,l=r-n;return o||l?(180+180*Y.atan2(-l,-o)/U+360)%360:0}return e.angle(t,r,a,s)-e.angle(i,n,a,s)},e.rad=function(t){return t%360*U/180},e.deg=function(t){return Math.round(180*t/U%360*1e3)/1e3},e.snapTo=function(t,r,i){if(i=e.is(i,"finite")?i:10,e.is(t,Q)){for(var n=t.length;n--;)if(H(t[n]-r)<=i)return t[n]}else{t=+t;var a=r%t;if(i>a)return r-a;if(a>t-i)return r-a+t}return r};var zt=e.createUUID=function(t,e){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(t,e).toUpperCase()}}(/[xy]/g,function(t){var e=16*Y.random()|0,r="x"==t?e:3&e|8;return r.toString(16)});e.setWindow=function(r){t("raphael.setWindow",e,A.win,r),A.win=r,A.doc=A.win.document,e._engine.initWin&&e._engine.initWin(A.win)};var Pt=function(t){if(e.vml){var r=/^\s+|\s+$/g,i;try{var a=new ActiveXObject("htmlfile");a.write("<body>"),a.close(),i=a.body}catch(s){i=createPopup().document.body}var o=i.createTextRange();Pt=n(function(t){try{i.style.color=j(t).replace(r,R);var e=o.queryCommandValue("ForeColor");return e=(255&e)<<16|65280&e|(16711680&e)>>>16,"#"+("000000"+e.toString(16)).slice(-6)}catch(n){return"none"}})}else{var l=A.doc.createElement("i");l.title="Raphaël Colour Picker",l.style.display="none",A.doc.body.appendChild(l),Pt=n(function(t){return l.style.color=t,A.doc.defaultView.getComputedStyle(l,R).getPropertyValue("color")})}return Pt(t)},Ft=function(){return"hsb("+[this.h,this.s,this.b]+")"},Rt=function(){return"hsl("+[this.h,this.s,this.l]+")"},It=function(){return this.hex},jt=function(t,r,i){if(null==r&&e.is(t,"object")&&"r"in t&&"g"in t&&"b"in t&&(i=t.b,r=t.g,t=t.r),null==r&&e.is(t,Z)){var n=e.getRGB(t);t=n.r,r=n.g,i=n.b}return(t>1||r>1||i>1)&&(t/=255,r/=255,i/=255),[t,r,i]},qt=function(t,r,i,n){t*=255,r*=255,i*=255;var a={r:t,g:r,b:i,hex:e.rgb(t,r,i),toString:It};return e.is(n,"finite")&&(a.opacity=n),a};e.color=function(t){var r;return e.is(t,"object")&&"h"in t&&"s"in t&&"b"in t?(r=e.hsb2rgb(t),t.r=r.r,t.g=r.g,t.b=r.b,t.hex=r.hex):e.is(t,"object")&&"h"in t&&"s"in t&&"l"in t?(r=e.hsl2rgb(t),t.r=r.r,t.g=r.g,t.b=r.b,t.hex=r.hex):(e.is(t,"string")&&(t=e.getRGB(t)),e.is(t,"object")&&"r"in t&&"g"in t&&"b"in t?(r=e.rgb2hsl(t),t.h=r.h,t.s=r.s,t.l=r.l,r=e.rgb2hsb(t),t.v=r.b):(t={hex:"none"},t.r=t.g=t.b=t.h=t.s=t.v=t.l=-1)),t.toString=It,t},e.hsb2rgb=function(t,e,r,i){this.is(t,"object")&&"h"in t&&"s"in t&&"b"in t&&(r=t.b,e=t.s,i=t.o,t=t.h),t*=360;var n,a,s,o,l;return t=t%360/60,l=r*e,o=l*(1-H(t%2-1)),n=a=s=r-l,t=~~t,n+=[l,o,0,0,o,l][t],a+=[o,l,l,o,0,0][t],s+=[0,0,o,l,l,o][t],qt(n,a,s,i)},e.hsl2rgb=function(t,e,r,i){this.is(t,"object")&&"h"in t&&"s"in t&&"l"in t&&(r=t.l,e=t.s,t=t.h),(t>1||e>1||r>1)&&(t/=360,e/=100,r/=100),t*=360;var n,a,s,o,l;return t=t%360/60,l=2*e*(.5>r?r:1-r),o=l*(1-H(t%2-1)),n=a=s=r-l/2,t=~~t,n+=[l,o,0,0,o,l][t],a+=[o,l,l,o,0,0][t],s+=[0,0,o,l,l,o][t],qt(n,a,s,i)},e.rgb2hsb=function(t,e,r){r=jt(t,e,r),t=r[0],e=r[1],r=r[2];var i,n,a,s;return a=W(t,e,r),s=a-G(t,e,r),i=0==s?null:a==t?(e-r)/s:a==e?(r-t)/s+2:(t-e)/s+4,i=(i+360)%6*60/360,n=0==s?0:s/a,{h:i,s:n,b:a,toString:Ft}},e.rgb2hsl=function(t,e,r){r=jt(t,e,r),t=r[0],e=r[1],r=r[2];var i,n,a,s,o,l;return s=W(t,e,r),o=G(t,e,r),l=s-o,i=0==l?null:s==t?(e-r)/l:s==e?(r-t)/l+2:(t-e)/l+4,i=(i+360)%6*60/360,a=(s+o)/2,n=0==l?0:.5>a?l/(2*a):l/(2-2*a),{h:i,s:n,l:a,toString:Rt}},e._path2string=function(){return this.join(",").replace(vt,"$1")};var Dt=e._preload=function(t,e){var r=A.doc.createElement("img");r.style.cssText="position:absolute;left:-9999em;top:-9999em",r.onload=function(){e.call(this),this.onload=null,A.doc.body.removeChild(this)},r.onerror=function(){A.doc.body.removeChild(this)},A.doc.body.appendChild(r),r.src=t};e.getRGB=n(function(t){if(!t||(t=j(t)).indexOf("-")+1)return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:a};if("none"==t)return{r:-1,g:-1,b:-1,hex:"none",toString:a};!(xt[T](t.toLowerCase().substring(0,2))||"#"==t.charAt())&&(t=Pt(t));var r,i,n,s,o,l,h,u=t.match(nt);return u?(u[2]&&(s=ut(u[2].substring(5),16),n=ut(u[2].substring(3,5),16),i=ut(u[2].substring(1,3),16)),u[3]&&(s=ut((l=u[3].charAt(3))+l,16),n=ut((l=u[3].charAt(2))+l,16),i=ut((l=u[3].charAt(1))+l,16)),u[4]&&(h=u[4][q](gt),i=ht(h[0]),"%"==h[0].slice(-1)&&(i*=2.55),n=ht(h[1]),"%"==h[1].slice(-1)&&(n*=2.55),s=ht(h[2]),"%"==h[2].slice(-1)&&(s*=2.55),"rgba"==u[1].toLowerCase().slice(0,4)&&(o=ht(h[3])),h[3]&&"%"==h[3].slice(-1)&&(o/=100)),u[5]?(h=u[5][q](gt),i=ht(h[0]),"%"==h[0].slice(-1)&&(i*=2.55),n=ht(h[1]),"%"==h[1].slice(-1)&&(n*=2.55),s=ht(h[2]),"%"==h[2].slice(-1)&&(s*=2.55),("deg"==h[0].slice(-3)||"°"==h[0].slice(-1))&&(i/=360),"hsba"==u[1].toLowerCase().slice(0,4)&&(o=ht(h[3])),h[3]&&"%"==h[3].slice(-1)&&(o/=100),e.hsb2rgb(i,n,s,o)):u[6]?(h=u[6][q](gt),i=ht(h[0]),"%"==h[0].slice(-1)&&(i*=2.55),n=ht(h[1]),"%"==h[1].slice(-1)&&(n*=2.55),s=ht(h[2]),"%"==h[2].slice(-1)&&(s*=2.55),("deg"==h[0].slice(-3)||"°"==h[0].slice(-1))&&(i/=360),"hsla"==u[1].toLowerCase().slice(0,4)&&(o=ht(h[3])),h[3]&&"%"==h[3].slice(-1)&&(o/=100),e.hsl2rgb(i,n,s,o)):(u={r:i,g:n,b:s,toString:a},u.hex="#"+(16777216|s|n<<8|i<<16).toString(16).slice(1),e.is(o,"finite")&&(u.opacity=o),u)):{r:-1,g:-1,b:-1,hex:"none",error:1,toString:a}},e),e.hsb=n(function(t,r,i){return e.hsb2rgb(t,r,i).hex}),e.hsl=n(function(t,r,i){return e.hsl2rgb(t,r,i).hex}),e.rgb=n(function(t,e,r){function i(t){return t+.5|0}return"#"+(16777216|i(r)|i(e)<<8|i(t)<<16).toString(16).slice(1)}),e.getColor=function(t){var e=this.getColor.start=this.getColor.start||{h:0,s:1,b:t||.75},r=this.hsb2rgb(e.h,e.s,e.b);return e.h+=.075,e.h>1&&(e.h=0,e.s-=.2,e.s<=0&&(this.getColor.start={h:0,s:1,b:e.b})),r.hex},e.getColor.reset=function(){delete this.start},e.parsePathString=function(t){if(!t)return null;var r=Vt(t);if(r.arr)return Yt(r.arr);var i={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},n=[];return e.is(t,Q)&&e.is(t[0],Q)&&(n=Yt(t)),n.length||j(t).replace(yt,function(t,e,r){var a=[],s=e.toLowerCase();if(r.replace(bt,function(t,e){e&&a.push(+e)}),"m"==s&&a.length>2&&(n.push([e][P](a.splice(0,2))),s="l",e="m"==e?"l":"L"),"r"==s)n.push([e][P](a));else for(;a.length>=i[s]&&(n.push([e][P](a.splice(0,i[s]))),i[s]););}),n.toString=e._path2string,r.arr=Yt(n),n},e.parseTransformString=n(function(t){if(!t)return null;var r={r:3,s:4,t:2,m:6},i=[];return e.is(t,Q)&&e.is(t[0],Q)&&(i=Yt(t)),i.length||j(t).replace(mt,function(t,e,r){var n=[],a=O.call(e);r.replace(bt,function(t,e){e&&n.push(+e)}),i.push([e][P](n))}),i.toString=e._path2string,i});var Vt=function(t){var e=Vt.ps=Vt.ps||{};return e[t]?e[t].sleep=100:e[t]={sleep:100},setTimeout(function(){for(var r in e)e[T](r)&&r!=t&&(e[r].sleep--,!e[r].sleep&&delete e[r])}),e[t]};e.findDotsAtSegment=function(t,e,r,i,n,a,s,o,l){var h=1-l,u=X(h,3),c=X(h,2),f=l*l,p=f*l,d=u*t+3*c*l*r+3*h*l*l*n+p*s,g=u*e+3*c*l*i+3*h*l*l*a+p*o,x=t+2*l*(r-t)+f*(n-2*r+t),v=e+2*l*(i-e)+f*(a-2*i+e),y=r+2*l*(n-r)+f*(s-2*n+r),m=i+2*l*(a-i)+f*(o-2*a+i),b=h*t+l*r,_=h*e+l*i,w=h*n+l*s,k=h*a+l*o,B=90-180*Y.atan2(x-y,v-m)/U;return(x>y||m>v)&&(B+=180),{x:d,y:g,m:{x:x,y:v},n:{x:y,y:m},start:{x:b,y:_},end:{x:w,y:k},alpha:B}},e.bezierBBox=function(t,r,i,n,a,s,o,l){e.is(t,"array")||(t=[t,r,i,n,a,s,o,l]);var h=Zt.apply(null,t);return{x:h.min.x,y:h.min.y,x2:h.max.x,y2:h.max.y,width:h.max.x-h.min.x,height:h.max.y-h.min.y}},e.isPointInsideBBox=function(t,e,r){return e>=t.x&&e<=t.x2&&r>=t.y&&r<=t.y2},e.isBBoxIntersect=function(t,r){var i=e.isPointInsideBBox;return i(r,t.x,t.y)||i(r,t.x2,t.y)||i(r,t.x,t.y2)||i(r,t.x2,t.y2)||i(t,r.x,r.y)||i(t,r.x2,r.y)||i(t,r.x,r.y2)||i(t,r.x2,r.y2)||(t.x<r.x2&&t.x>r.x||r.x<t.x2&&r.x>t.x)&&(t.y<r.y2&&t.y>r.y||r.y<t.y2&&r.y>t.y)},e.pathIntersection=function(t,e){return d(t,e)},e.pathIntersectionNumber=function(t,e){return d(t,e,1)},e.isPointInsidePath=function(t,r,i){var n=e.pathBBox(t);return e.isPointInsideBBox(n,r,i)&&d(t,[["M",r,i],["H",n.x2+10]],1)%2==1},e._removedFactory=function(e){return function(){t("raphael.log",null,"Raphaël: you are calling to method “"+e+"” of removed object",e)}};var Ot=e.pathBBox=function(t){var e=Vt(t);if(e.bbox)return r(e.bbox);if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0};t=Qt(t);for(var i=0,n=0,a=[],s=[],o,l=0,h=t.length;h>l;l++)if(o=t[l],"M"==o[0])i=o[1],n=o[2],a.push(i),s.push(n);else{var u=Zt(i,n,o[1],o[2],o[3],o[4],o[5],o[6]);a=a[P](u.min.x,u.max.x),s=s[P](u.min.y,u.max.y),i=o[5],n=o[6]}var c=G[z](0,a),f=G[z](0,s),p=W[z](0,a),d=W[z](0,s),g=p-c,x=d-f,v={x:c,y:f,x2:p,y2:d,width:g,height:x,cx:c+g/2,cy:f+x/2};return e.bbox=r(v),v},Yt=function(t){var i=r(t);return i.toString=e._path2string,i},Wt=e._pathToRelative=function(t){var r=Vt(t);if(r.rel)return Yt(r.rel);e.is(t,Q)&&e.is(t&&t[0],Q)||(t=e.parsePathString(t));var i=[],n=0,a=0,s=0,o=0,l=0;"M"==t[0][0]&&(n=t[0][1],a=t[0][2],s=n,o=a,l++,i.push(["M",n,a]));for(var h=l,u=t.length;u>h;h++){var c=i[h]=[],f=t[h];if(f[0]!=O.call(f[0]))switch(c[0]=O.call(f[0]),c[0]){case"a":c[1]=f[1],c[2]=f[2],c[3]=f[3],c[4]=f[4],c[5]=f[5],c[6]=+(f[6]-n).toFixed(3),c[7]=+(f[7]-a).toFixed(3);break;case"v":c[1]=+(f[1]-a).toFixed(3);break;case"m":s=f[1],o=f[2];default:for(var p=1,d=f.length;d>p;p++)c[p]=+(f[p]-(p%2?n:a)).toFixed(3)}else{c=i[h]=[],"m"==f[0]&&(s=f[1]+n,o=f[2]+a);for(var g=0,x=f.length;x>g;g++)i[h][g]=f[g]}var v=i[h].length;switch(i[h][0]){case"z":n=s,a=o;break;case"h":n+=+i[h][v-1];break;case"v":a+=+i[h][v-1];break;default:n+=+i[h][v-2],a+=+i[h][v-1]}}return i.toString=e._path2string,r.rel=Yt(i),i},Gt=e._pathToAbsolute=function(t){var r=Vt(t);if(r.abs)return Yt(r.abs);if(e.is(t,Q)&&e.is(t&&t[0],Q)||(t=e.parsePathString(t)),!t||!t.length)return[["M",0,0]];var i=[],n=0,a=0,o=0,l=0,h=0;"M"==t[0][0]&&(n=+t[0][1],a=+t[0][2],o=n,l=a,h++,i[0]=["M",n,a]);for(var u=3==t.length&&"M"==t[0][0]&&"R"==t[1][0].toUpperCase()&&"Z"==t[2][0].toUpperCase(),c,f,p=h,d=t.length;d>p;p++){if(i.push(c=[]),f=t[p],f[0]!=ct.call(f[0]))switch(c[0]=ct.call(f[0]),c[0]){case"A":c[1]=f[1],c[2]=f[2],c[3]=f[3],c[4]=f[4],c[5]=f[5],c[6]=+(f[6]+n),c[7]=+(f[7]+a);break;case"V":c[1]=+f[1]+a;break;case"H":c[1]=+f[1]+n;break;case"R":for(var g=[n,a][P](f.slice(1)),x=2,v=g.length;v>x;x++)g[x]=+g[x]+n,g[++x]=+g[x]+a;i.pop(),i=i[P](s(g,u));break;case"M":o=+f[1]+n,l=+f[2]+a;default:for(x=1,v=f.length;v>x;x++)c[x]=+f[x]+(x%2?n:a)}else if("R"==f[0])g=[n,a][P](f.slice(1)),i.pop(),i=i[P](s(g,u)),c=["R"][P](f.slice(-2));else for(var y=0,m=f.length;m>y;y++)c[y]=f[y];switch(c[0]){case"Z":n=o,a=l;break;case"H":n=c[1];break;case"V":a=c[1];break;case"M":o=c[c.length-2],l=c[c.length-1];default:n=c[c.length-2],a=c[c.length-1]}}return i.toString=e._path2string,r.abs=Yt(i),i},Ht=function(t,e,r,i){return[t,e,r,i,r,i]},Xt=function(t,e,r,i,n,a){var s=1/3,o=2/3;return[s*t+o*r,s*e+o*i,s*n+o*r,s*a+o*i,n,a]},Ut=function(t,e,r,i,a,s,o,l,h,u){var c=120*U/180,f=U/180*(+a||0),p=[],d,g=n(function(t,e,r){var i=t*Y.cos(r)-e*Y.sin(r),n=t*Y.sin(r)+e*Y.cos(r);return{x:i,y:n}});if(u)S=u[0],T=u[1],B=u[2],C=u[3];else{d=g(t,e,-f),t=d.x,e=d.y,d=g(l,h,-f),l=d.x,h=d.y;var x=Y.cos(U/180*a),v=Y.sin(U/180*a),y=(t-l)/2,m=(e-h)/2,b=y*y/(r*r)+m*m/(i*i);b>1&&(b=Y.sqrt(b),r=b*r,i=b*i);var _=r*r,w=i*i,k=(s==o?-1:1)*Y.sqrt(H((_*w-_*m*m-w*y*y)/(_*m*m+w*y*y))),B=k*r*m/i+(t+l)/2,C=k*-i*y/r+(e+h)/2,S=Y.asin(((e-C)/i).toFixed(9)),T=Y.asin(((h-C)/i).toFixed(9));S=B>t?U-S:S,T=B>l?U-T:T,0>S&&(S=2*U+S),0>T&&(T=2*U+T),o&&S>T&&(S-=2*U),!o&&T>S&&(T-=2*U)}var A=T-S;if(H(A)>c){var E=T,N=l,M=h;T=S+c*(o&&T>S?1:-1),l=B+r*Y.cos(T),h=C+i*Y.sin(T),p=Ut(l,h,r,i,a,0,o,N,M,[T,E,B,C])}A=T-S;var L=Y.cos(S),z=Y.sin(S),F=Y.cos(T),R=Y.sin(T),I=Y.tan(A/4),j=4/3*r*I,D=4/3*i*I,V=[t,e],O=[t+j*z,e-D*L],W=[l+j*R,h-D*F],G=[l,h];if(O[0]=2*V[0]-O[0],O[1]=2*V[1]-O[1],u)return[O,W,G][P](p);p=[O,W,G][P](p).join()[q](",");for(var X=[],$=0,Z=p.length;Z>$;$++)X[$]=$%2?g(p[$-1],p[$],f).y:g(p[$],p[$+1],f).x;return X},$t=function(t,e,r,i,n,a,s,o,l){var h=1-l;return{x:X(h,3)*t+3*X(h,2)*l*r+3*h*l*l*n+X(l,3)*s,y:X(h,3)*e+3*X(h,2)*l*i+3*h*l*l*a+X(l,3)*o}},Zt=n(function(t,e,r,i,n,a,s,o){var l=n-2*r+t-(s-2*n+r),h=2*(r-t)-2*(n-r),u=t-r,c=(-h+Y.sqrt(h*h-4*l*u))/2/l,f=(-h-Y.sqrt(h*h-4*l*u))/2/l,p=[e,o],d=[t,s],g;return H(c)>"1e12"&&(c=.5),H(f)>"1e12"&&(f=.5),c>0&&1>c&&(g=$t(t,e,r,i,n,a,s,o,c),d.push(g.x),p.push(g.y)),f>0&&1>f&&(g=$t(t,e,r,i,n,a,s,o,f),d.push(g.x),p.push(g.y)),l=a-2*i+e-(o-2*a+i),h=2*(i-e)-2*(a-i),u=e-i,c=(-h+Y.sqrt(h*h-4*l*u))/2/l,f=(-h-Y.sqrt(h*h-4*l*u))/2/l,H(c)>"1e12"&&(c=.5),H(f)>"1e12"&&(f=.5),c>0&&1>c&&(g=$t(t,e,r,i,n,a,s,o,c),d.push(g.x),p.push(g.y)),f>0&&1>f&&(g=$t(t,e,r,i,n,a,s,o,f),d.push(g.x),p.push(g.y)),{min:{x:G[z](0,d),y:G[z](0,p)},max:{x:W[z](0,d),y:W[z](0,p)}}}),Qt=e._path2curve=n(function(t,e){var r=!e&&Vt(t);if(!e&&r.curve)return Yt(r.curve);for(var i=Gt(t),n=e&&Gt(e),a={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},s={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},o=(function(t,e,r){var i,n,a={T:1,Q:1};if(!t)return["C",e.x,e.y,e.x,e.y,e.x,e.y];switch(!(t[0]in a)&&(e.qx=e.qy=null),t[0]){case"M":e.X=t[1],e.Y=t[2];break;case"A":t=["C"][P](Ut[z](0,[e.x,e.y][P](t.slice(1))));break;case"S":"C"==r||"S"==r?(i=2*e.x-e.bx,n=2*e.y-e.by):(i=e.x,n=e.y),t=["C",i,n][P](t.slice(1));break;case"T":"Q"==r||"T"==r?(e.qx=2*e.x-e.qx,e.qy=2*e.y-e.qy):(e.qx=e.x,e.qy=e.y),t=["C"][P](Xt(e.x,e.y,e.qx,e.qy,t[1],t[2]));break;case"Q":e.qx=t[1],e.qy=t[2],t=["C"][P](Xt(e.x,e.y,t[1],t[2],t[3],t[4]));break;case"L":t=["C"][P](Ht(e.x,e.y,t[1],t[2]));break;case"H":t=["C"][P](Ht(e.x,e.y,t[1],e.y));break;case"V":t=["C"][P](Ht(e.x,e.y,e.x,t[1]));break;case"Z":t=["C"][P](Ht(e.x,e.y,e.X,e.Y))}return t}),l=function(t,e){if(t[e].length>7){t[e].shift();for(var r=t[e];r.length;)u[e]="A",n&&(c[e]="A"),t.splice(e++,0,["C"][P](r.splice(0,6)));t.splice(e,1),g=W(i.length,n&&n.length||0)}},h=function(t,e,r,a,s){t&&e&&"M"==t[s][0]&&"M"!=e[s][0]&&(e.splice(s,0,["M",a.x,a.y]),r.bx=0,r.by=0,r.x=t[s][1],r.y=t[s][2],g=W(i.length,n&&n.length||0))},u=[],c=[],f="",p="",d=0,g=W(i.length,n&&n.length||0);g>d;d++){i[d]&&(f=i[d][0]),"C"!=f&&(u[d]=f,d&&(p=u[d-1])),i[d]=o(i[d],a,p),"A"!=u[d]&&"C"==f&&(u[d]="C"),l(i,d),n&&(n[d]&&(f=n[d][0]),"C"!=f&&(c[d]=f,d&&(p=c[d-1])),n[d]=o(n[d],s,p),"A"!=c[d]&&"C"==f&&(c[d]="C"),l(n,d)),h(i,n,a,s,d),h(n,i,s,a,d);var x=i[d],v=n&&n[d],y=x.length,m=n&&v.length;a.x=x[y-2],a.y=x[y-1],a.bx=ht(x[y-4])||a.x,a.by=ht(x[y-3])||a.y,s.bx=n&&(ht(v[m-4])||s.x),s.by=n&&(ht(v[m-3])||s.y),s.x=n&&v[m-2],s.y=n&&v[m-1]}return n||(r.curve=Yt(i)),n?[i,n]:i},null,Yt),Jt=e._parseDots=n(function(t){for(var r=[],i=0,n=t.length;n>i;i++){var a={},s=t[i].match(/^([^:]*):?([\d\.]*)/);if(a.color=e.getRGB(s[1]),a.color.error)return null;a.opacity=a.color.opacity,a.color=a.color.hex,s[2]&&(a.offset=s[2]+"%"),r.push(a)}for(i=1,n=r.length-1;n>i;i++)if(!r[i].offset){for(var o=ht(r[i-1].offset||0),l=0,h=i+1;n>h;h++)if(r[h].offset){l=r[h].offset;break}l||(l=100,h=n),l=ht(l);for(var u=(l-o)/(h-i+1);h>i;i++)o+=u,r[i].offset=o+"%"}return r}),Kt=e._tear=function(t,e){t==e.top&&(e.top=t.prev),t==e.bottom&&(e.bottom=t.next),t.next&&(t.next.prev=t.prev),t.prev&&(t.prev.next=t.next)},te=e._tofront=function(t,e){e.top!==t&&(Kt(t,e),t.next=null,t.prev=e.top,e.top.next=t,e.top=t)},ee=e._toback=function(t,e){e.bottom!==t&&(Kt(t,e),t.next=e.bottom,t.prev=null,e.bottom.prev=t,e.bottom=t)},re=e._insertafter=function(t,e,r){Kt(t,r),e==r.top&&(r.top=t),e.next&&(e.next.prev=t),t.next=e.next,t.prev=e,e.next=t},ie=e._insertbefore=function(t,e,r){Kt(t,r),e==r.bottom&&(r.bottom=t),e.prev&&(e.prev.next=t),t.prev=e.prev,e.prev=t,t.next=e},ne=e.toMatrix=function(t,e){var r=Ot(t),i={_:{transform:R},getBBox:function(){return r}};return se(i,e),i.matrix},ae=e.transformPath=function(t,e){return Nt(t,ne(t,e))},se=e._extractTransform=function(t,r){if(null==r)return t._.transform;r=j(r).replace(/\.{3}|\u2026/g,t._.transform||R);var i=e.parseTransformString(r),n=0,a=0,s=0,o=1,l=1,h=t._,u=new g;if(h.transform=i||[],i)for(var c=0,f=i.length;f>c;c++){var p=i[c],d=p.length,x=j(p[0]).toLowerCase(),v=p[0]!=x,y=v?u.invert():0,m,b,_,w,k;"t"==x&&3==d?v?(m=y.x(0,0),b=y.y(0,0),_=y.x(p[1],p[2]),w=y.y(p[1],p[2]),u.translate(_-m,w-b)):u.translate(p[1],p[2]):"r"==x?2==d?(k=k||t.getBBox(1),u.rotate(p[1],k.x+k.width/2,k.y+k.height/2),n+=p[1]):4==d&&(v?(_=y.x(p[2],p[3]),w=y.y(p[2],p[3]),u.rotate(p[1],_,w)):u.rotate(p[1],p[2],p[3]),n+=p[1]):"s"==x?2==d||3==d?(k=k||t.getBBox(1),u.scale(p[1],p[d-1],k.x+k.width/2,k.y+k.height/2),o*=p[1],l*=p[d-1]):5==d&&(v?(_=y.x(p[3],p[4]),w=y.y(p[3],p[4]),u.scale(p[1],p[2],_,w)):u.scale(p[1],p[2],p[3],p[4]),o*=p[1],l*=p[2]):"m"==x&&7==d&&u.add(p[1],p[2],p[3],p[4],p[5],p[6]),h.dirtyT=1,t.matrix=u}t.matrix=u,h.sx=o,h.sy=l,h.deg=n,h.dx=a=u.e,h.dy=s=u.f,1==o&&1==l&&!n&&h.bbox?(h.bbox.x+=+a,h.bbox.y+=+s):h.dirtyT=1},oe=function(t){var e=t[0];switch(e.toLowerCase()){case"t":return[e,0,0];case"m":return[e,1,0,0,1,0,0];case"r":return 4==t.length?[e,0,t[2],t[3]]:[e,0];case"s":return 5==t.length?[e,1,1,t[3],t[4]]:3==t.length?[e,1,1]:[e,1]}},le=e._equaliseTransform=function(t,r){r=j(r).replace(/\.{3}|\u2026/g,t),t=e.parseTransformString(t)||[],r=e.parseTransformString(r)||[];for(var i=W(t.length,r.length),n=[],a=[],s=0,o,l,h,u;i>s;s++){if(h=t[s]||oe(r[s]),u=r[s]||oe(h),h[0]!=u[0]||"r"==h[0].toLowerCase()&&(h[2]!=u[2]||h[3]!=u[3])||"s"==h[0].toLowerCase()&&(h[3]!=u[3]||h[4]!=u[4]))return;for(n[s]=[],a[s]=[],o=0,l=W(h.length,u.length);l>o;o++)o in h&&(n[s][o]=h[o]),o in u&&(a[s][o]=u[o])}return{from:n,to:a}};e._getContainer=function(t,r,i,n){var a;return a=null!=n||e.is(t,"object")?t:A.doc.getElementById(t),null!=a?a.tagName?null==r?{container:a,width:a.style.pixelWidth||a.offsetWidth,height:a.style.pixelHeight||a.offsetHeight}:{container:a,width:r,height:i}:{container:1,x:t,y:r,width:i,height:n}:void 0},e.pathToRelative=Wt,e._engine={},e.path2curve=Qt,e.matrix=function(t,e,r,i,n,a){return new g(t,e,r,i,n,a)},function(t){function r(t){return t[0]*t[0]+t[1]*t[1]}function i(t){var e=Y.sqrt(r(t));t[0]&&(t[0]/=e),t[1]&&(t[1]/=e)}t.add=function(t,e,r,i,n,a){var s=[[],[],[]],o=[[this.a,this.c,this.e],[this.b,this.d,this.f],[0,0,1]],l=[[t,r,n],[e,i,a],[0,0,1]],h,u,c,f;for(t&&t instanceof g&&(l=[[t.a,t.c,t.e],[t.b,t.d,t.f],[0,0,1]]),h=0;3>h;h++)for(u=0;3>u;u++){for(f=0,c=0;3>c;c++)f+=o[h][c]*l[c][u];s[h][u]=f}this.a=s[0][0],this.b=s[1][0],this.c=s[0][1],this.d=s[1][1],this.e=s[0][2],this.f=s[1][2]},t.invert=function(){var t=this,e=t.a*t.d-t.b*t.c;return new g(t.d/e,-t.b/e,-t.c/e,t.a/e,(t.c*t.f-t.d*t.e)/e,(t.b*t.e-t.a*t.f)/e)},t.clone=function(){return new g(this.a,this.b,this.c,this.d,this.e,this.f)},t.translate=function(t,e){ +this.add(1,0,0,1,t,e)},t.scale=function(t,e,r,i){null==e&&(e=t),(r||i)&&this.add(1,0,0,1,r,i),this.add(t,0,0,e,0,0),(r||i)&&this.add(1,0,0,1,-r,-i)},t.rotate=function(t,r,i){t=e.rad(t),r=r||0,i=i||0;var n=+Y.cos(t).toFixed(9),a=+Y.sin(t).toFixed(9);this.add(n,a,-a,n,r,i),this.add(1,0,0,1,-r,-i)},t.x=function(t,e){return t*this.a+e*this.c+this.e},t.y=function(t,e){return t*this.b+e*this.d+this.f},t.get=function(t){return+this[j.fromCharCode(97+t)].toFixed(4)},t.toString=function(){return e.svg?"matrix("+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+")":[this.get(0),this.get(2),this.get(1),this.get(3),0,0].join()},t.toFilter=function(){return"progid:DXImageTransform.Microsoft.Matrix(M11="+this.get(0)+", M12="+this.get(2)+", M21="+this.get(1)+", M22="+this.get(3)+", Dx="+this.get(4)+", Dy="+this.get(5)+", sizingmethod='auto expand')"},t.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},t.split=function(){var t={};t.dx=this.e,t.dy=this.f;var n=[[this.a,this.c],[this.b,this.d]];t.scalex=Y.sqrt(r(n[0])),i(n[0]),t.shear=n[0][0]*n[1][0]+n[0][1]*n[1][1],n[1]=[n[1][0]-n[0][0]*t.shear,n[1][1]-n[0][1]*t.shear],t.scaley=Y.sqrt(r(n[1])),i(n[1]),t.shear/=t.scaley;var a=-n[0][1],s=n[1][1];return 0>s?(t.rotate=e.deg(Y.acos(s)),0>a&&(t.rotate=360-t.rotate)):t.rotate=e.deg(Y.asin(a)),t.isSimple=!(+t.shear.toFixed(9)||t.scalex.toFixed(9)!=t.scaley.toFixed(9)&&t.rotate),t.isSuperSimple=!+t.shear.toFixed(9)&&t.scalex.toFixed(9)==t.scaley.toFixed(9)&&!t.rotate,t.noRotation=!+t.shear.toFixed(9)&&!t.rotate,t},t.toTransformString=function(t){var e=t||this[q]();return e.isSimple?(e.scalex=+e.scalex.toFixed(4),e.scaley=+e.scaley.toFixed(4),e.rotate=+e.rotate.toFixed(4),(e.dx||e.dy?"t"+[e.dx,e.dy]:R)+(1!=e.scalex||1!=e.scaley?"s"+[e.scalex,e.scaley,0,0]:R)+(e.rotate?"r"+[e.rotate,0,0]:R)):"m"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]}}(g.prototype);for(var he=function(){this.returnValue=!1},ue=function(){return this.originalEvent.preventDefault()},ce=function(){this.cancelBubble=!0},fe=function(){return this.originalEvent.stopPropagation()},pe=function(t){var e=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,r=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft;return{x:t.clientX+r,y:t.clientY+e}},de=function(){return A.doc.addEventListener?function(t,e,r,i){var n=function(t){var e=pe(t);return r.call(i,t,e.x,e.y)};if(t.addEventListener(e,n,!1),F&&V[e]){var a=function(e){for(var n=pe(e),a=e,s=0,o=e.targetTouches&&e.targetTouches.length;o>s;s++)if(e.targetTouches[s].target==t){e=e.targetTouches[s],e.originalEvent=a,e.preventDefault=ue,e.stopPropagation=fe;break}return r.call(i,e,n.x,n.y)};t.addEventListener(V[e],a,!1)}return function(){return t.removeEventListener(e,n,!1),F&&V[e]&&t.removeEventListener(V[e],a,!1),!0}}:A.doc.attachEvent?function(t,e,r,i){var n=function(t){t=t||A.win.event;var e=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,n=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft,a=t.clientX+n,s=t.clientY+e;return t.preventDefault=t.preventDefault||he,t.stopPropagation=t.stopPropagation||ce,r.call(i,t,a,s)};t.attachEvent("on"+e,n);var a=function(){return t.detachEvent("on"+e,n),!0};return a}:void 0}(),ge=[],xe=function(e){for(var r=e.clientX,i=e.clientY,n=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,a=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft,s,o=ge.length;o--;){if(s=ge[o],F&&e.touches){for(var l=e.touches.length,h;l--;)if(h=e.touches[l],h.identifier==s.el._drag.id){r=h.clientX,i=h.clientY,(e.originalEvent?e.originalEvent:e).preventDefault();break}}else e.preventDefault();var u=s.el.node,c,f=u.nextSibling,p=u.parentNode,d=u.style.display;A.win.opera&&p.removeChild(u),u.style.display="none",c=s.el.paper.getElementByPoint(r,i),u.style.display=d,A.win.opera&&(f?p.insertBefore(u,f):p.appendChild(u)),c&&t("raphael.drag.over."+s.el.id,s.el,c),r+=a,i+=n,t("raphael.drag.move."+s.el.id,s.move_scope||s.el,r-s.el._drag.x,i-s.el._drag.y,r,i,e)}},ve=function(r){e.unmousemove(xe).unmouseup(ve);for(var i=ge.length,n;i--;)n=ge[i],n.el._drag={},t("raphael.drag.end."+n.el.id,n.end_scope||n.start_scope||n.move_scope||n.el,r);ge=[]},ye=e.el={},me=D.length;me--;)!function(t){e[t]=ye[t]=function(r,i){return e.is(r,"function")&&(this.events=this.events||[],this.events.push({name:t,f:r,unbind:de(this.shape||this.node||A.doc,t,r,i||this)})),this},e["un"+t]=ye["un"+t]=function(r){for(var i=this.events||[],n=i.length;n--;)i[n].name!=t||!e.is(r,"undefined")&&i[n].f!=r||(i[n].unbind(),i.splice(n,1),!i.length&&delete this.events);return this}}(D[me]);ye.data=function(r,i){var n=wt[this.id]=wt[this.id]||{};if(0==arguments.length)return n;if(1==arguments.length){if(e.is(r,"object")){for(var a in r)r[T](a)&&this.data(a,r[a]);return this}return t("raphael.data.get."+this.id,this,n[r],r),n[r]}return n[r]=i,t("raphael.data.set."+this.id,this,i,r),this},ye.removeData=function(t){return null==t?wt[this.id]={}:wt[this.id]&&delete wt[this.id][t],this},ye.getData=function(){return r(wt[this.id]||{})},ye.hover=function(t,e,r,i){return this.mouseover(t,r).mouseout(e,i||r)},ye.unhover=function(t,e){return this.unmouseover(t).unmouseout(e)};var be=[];ye.drag=function(r,i,n,a,s,o){function l(l){(l.originalEvent||l).preventDefault();var h=l.clientX,u=l.clientY,c=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,f=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft;if(this._drag.id=l.identifier,F&&l.touches)for(var p=l.touches.length,d;p--;)if(d=l.touches[p],this._drag.id=d.identifier,d.identifier==this._drag.id){h=d.clientX,u=d.clientY;break}this._drag.x=h+f,this._drag.y=u+c,!ge.length&&e.mousemove(xe).mouseup(ve),ge.push({el:this,move_scope:a,start_scope:s,end_scope:o}),i&&t.on("raphael.drag.start."+this.id,i),r&&t.on("raphael.drag.move."+this.id,r),n&&t.on("raphael.drag.end."+this.id,n),t("raphael.drag.start."+this.id,s||a||this,l.clientX+f,l.clientY+c,l)}return this._drag={},be.push({el:this,start:l}),this.mousedown(l),this},ye.onDragOver=function(e){e?t.on("raphael.drag.over."+this.id,e):t.unbind("raphael.drag.over."+this.id)},ye.undrag=function(){for(var r=be.length;r--;)be[r].el==this&&(this.unmousedown(be[r].start),be.splice(r,1),t.unbind("raphael.drag.*."+this.id));!be.length&&e.unmousemove(xe).unmouseup(ve),ge=[]},M.circle=function(t,r,i){var n=e._engine.circle(this,t||0,r||0,i||0);return this.__set__&&this.__set__.push(n),n},M.rect=function(t,r,i,n,a){var s=e._engine.rect(this,t||0,r||0,i||0,n||0,a||0);return this.__set__&&this.__set__.push(s),s},M.ellipse=function(t,r,i,n){var a=e._engine.ellipse(this,t||0,r||0,i||0,n||0);return this.__set__&&this.__set__.push(a),a},M.path=function(t){t&&!e.is(t,Z)&&!e.is(t[0],Q)&&(t+=R);var r=e._engine.path(e.format[z](e,arguments),this);return this.__set__&&this.__set__.push(r),r},M.image=function(t,r,i,n,a){var s=e._engine.image(this,t||"about:blank",r||0,i||0,n||0,a||0);return this.__set__&&this.__set__.push(s),s},M.text=function(t,r,i){var n=e._engine.text(this,t||0,r||0,j(i));return this.__set__&&this.__set__.push(n),n},M.set=function(t){!e.is(t,"array")&&(t=Array.prototype.splice.call(arguments,0,arguments.length));var r=new ze(t);return this.__set__&&this.__set__.push(r),r.paper=this,r.type="set",r},M.setStart=function(t){this.__set__=t||this.set()},M.setFinish=function(t){var e=this.__set__;return delete this.__set__,e},M.getSize=function(){var t=this.canvas.parentNode;return{width:t.offsetWidth,height:t.offsetHeight}},M.setSize=function(t,r){return e._engine.setSize.call(this,t,r)},M.setViewBox=function(t,r,i,n,a){return e._engine.setViewBox.call(this,t,r,i,n,a)},M.top=M.bottom=null,M.raphael=e;var _e=function(t){var e=t.getBoundingClientRect(),r=t.ownerDocument,i=r.body,n=r.documentElement,a=n.clientTop||i.clientTop||0,s=n.clientLeft||i.clientLeft||0,o=e.top+(A.win.pageYOffset||n.scrollTop||i.scrollTop)-a,l=e.left+(A.win.pageXOffset||n.scrollLeft||i.scrollLeft)-s;return{y:o,x:l}};M.getElementByPoint=function(t,e){var r=this,i=r.canvas,n=A.doc.elementFromPoint(t,e);if(A.win.opera&&"svg"==n.tagName){var a=_e(i),s=i.createSVGRect();s.x=t-a.x,s.y=e-a.y,s.width=s.height=1;var o=i.getIntersectionList(s,null);o.length&&(n=o[o.length-1])}if(!n)return null;for(;n.parentNode&&n!=i.parentNode&&!n.raphael;)n=n.parentNode;return n==r.canvas.parentNode&&(n=i),n=n&&n.raphael?r.getById(n.raphaelid):null},M.getElementsByBBox=function(t){var r=this.set();return this.forEach(function(i){e.isBBoxIntersect(i.getBBox(),t)&&r.push(i)}),r},M.getById=function(t){for(var e=this.bottom;e;){if(e.id==t)return e;e=e.next}return null},M.forEach=function(t,e){for(var r=this.bottom;r;){if(t.call(e,r)===!1)return this;r=r.next}return this},M.getElementsByPoint=function(t,e){var r=this.set();return this.forEach(function(i){i.isPointInside(t,e)&&r.push(i)}),r},ye.isPointInside=function(t,r){var i=this.realPath=Et[this.type](this);return this.attr("transform")&&this.attr("transform").length&&(i=e.transformPath(i,this.attr("transform"))),e.isPointInsidePath(i,t,r)},ye.getBBox=function(t){if(this.removed)return{};var e=this._;return t?(!e.dirty&&e.bboxwt||(this.realPath=Et[this.type](this),e.bboxwt=Ot(this.realPath),e.bboxwt.toString=v,e.dirty=0),e.bboxwt):((e.dirty||e.dirtyT||!e.bbox)&&(!e.dirty&&this.realPath||(e.bboxwt=0,this.realPath=Et[this.type](this)),e.bbox=Ot(Nt(this.realPath,this.matrix)),e.bbox.toString=v,e.dirty=e.dirtyT=0),e.bbox)},ye.clone=function(){if(this.removed)return null;var t=this.paper[this.type]().attr(this.attr());return this.__set__&&this.__set__.push(t),t},ye.glow=function(t){if("text"==this.type)return null;t=t||{};var e={width:(t.width||10)+(+this.attr("stroke-width")||1),fill:t.fill||!1,opacity:null==t.opacity?.5:t.opacity,offsetx:t.offsetx||0,offsety:t.offsety||0,color:t.color||"#000"},r=e.width/2,i=this.paper,n=i.set(),a=this.realPath||Et[this.type](this);a=this.matrix?Nt(a,this.matrix):a;for(var s=1;r+1>s;s++)n.push(i.path(a).attr({stroke:e.color,fill:e.fill?e.color:"none","stroke-linejoin":"round","stroke-linecap":"round","stroke-width":+(e.width/r*s).toFixed(3),opacity:+(e.opacity/r).toFixed(3)}));return n.insertBefore(this).translate(e.offsetx,e.offsety)};var we={},ke=function(t,r,i,n,a,s,o,u,c){return null==c?l(t,r,i,n,a,s,o,u):e.findDotsAtSegment(t,r,i,n,a,s,o,u,h(t,r,i,n,a,s,o,u,c))},Be=function(t,r){return function(i,n,a){i=Qt(i);for(var s,o,l,h,u="",c={},f,p=0,d=0,g=i.length;g>d;d++){if(l=i[d],"M"==l[0])s=+l[1],o=+l[2];else{if(h=ke(s,o,l[1],l[2],l[3],l[4],l[5],l[6]),p+h>n){if(r&&!c.start){if(f=ke(s,o,l[1],l[2],l[3],l[4],l[5],l[6],n-p),u+=["C"+f.start.x,f.start.y,f.m.x,f.m.y,f.x,f.y],a)return u;c.start=u,u=["M"+f.x,f.y+"C"+f.n.x,f.n.y,f.end.x,f.end.y,l[5],l[6]].join(),p+=h,s=+l[5],o=+l[6];continue}if(!t&&!r)return f=ke(s,o,l[1],l[2],l[3],l[4],l[5],l[6],n-p),{x:f.x,y:f.y,alpha:f.alpha}}p+=h,s=+l[5],o=+l[6]}u+=l.shift()+l}return c.end=u,f=t?p:r?c:e.findDotsAtSegment(s,o,l[0],l[1],l[2],l[3],l[4],l[5],1),f.alpha&&(f={x:f.x,y:f.y,alpha:f.alpha}),f}},Ce=Be(1),Se=Be(),Te=Be(0,1);e.getTotalLength=Ce,e.getPointAtLength=Se,e.getSubpath=function(t,e,r){if(this.getTotalLength(t)-r<1e-6)return Te(t,e).end;var i=Te(t,r,1);return e?Te(i,e).end:i},ye.getTotalLength=function(){var t=this.getPath();if(t)return this.node.getTotalLength?this.node.getTotalLength():Ce(t)},ye.getPointAtLength=function(t){var e=this.getPath();if(e)return Se(e,t)},ye.getPath=function(){var t,r=e._getPath[this.type];if("text"!=this.type&&"set"!=this.type)return r&&(t=r(this)),t},ye.getSubpath=function(t,r){var i=this.getPath();if(i)return e.getSubpath(i,t,r)};var Ae=e.easing_formulas={linear:function(t){return t},"<":function(t){return X(t,1.7)},">":function(t){return X(t,.48)},"<>":function(t){var e=.48-t/1.04,r=Y.sqrt(.1734+e*e),i=r-e,n=X(H(i),1/3)*(0>i?-1:1),a=-r-e,s=X(H(a),1/3)*(0>a?-1:1),o=n+s+.5;return 3*(1-o)*o*o+o*o*o},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){t-=1;var e=1.70158;return t*t*((e+1)*t+e)+1},elastic:function(t){return t==!!t?t:X(2,-10*t)*Y.sin((t-.075)*(2*U)/.3)+1},bounce:function(t){var e=7.5625,r=2.75,i;return 1/r>t?i=e*t*t:2/r>t?(t-=1.5/r,i=e*t*t+.75):2.5/r>t?(t-=2.25/r,i=e*t*t+.9375):(t-=2.625/r,i=e*t*t+.984375),i}};Ae.easeIn=Ae["ease-in"]=Ae["<"],Ae.easeOut=Ae["ease-out"]=Ae[">"],Ae.easeInOut=Ae["ease-in-out"]=Ae["<>"],Ae["back-in"]=Ae.backIn,Ae["back-out"]=Ae.backOut;var Ee=[],Ne=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){setTimeout(t,16)},Me=function(){for(var r=+new Date,i=0;i<Ee.length;i++){var n=Ee[i];if(!n.el.removed&&!n.paused){var a=r-n.start,s=n.ms,o=n.easing,l=n.from,h=n.diff,u=n.to,c=n.t,f=n.el,p={},d,g={},x;if(n.initstatus?(a=(n.initstatus*n.anim.top-n.prev)/(n.percent-n.prev)*s,n.status=n.initstatus,delete n.initstatus,n.stop&&Ee.splice(i--,1)):n.status=(n.prev+(n.percent-n.prev)*(a/s))/n.anim.top,!(0>a))if(s>a){var v=o(a/s);for(var y in l)if(l[T](y)){switch(pt[y]){case $:d=+l[y]+v*s*h[y];break;case"colour":d="rgb("+[Le(ot(l[y].r+v*s*h[y].r)),Le(ot(l[y].g+v*s*h[y].g)),Le(ot(l[y].b+v*s*h[y].b))].join(",")+")";break;case"path":d=[];for(var m=0,_=l[y].length;_>m;m++){d[m]=[l[y][m][0]];for(var w=1,k=l[y][m].length;k>w;w++)d[m][w]=+l[y][m][w]+v*s*h[y][m][w];d[m]=d[m].join(I)}d=d.join(I);break;case"transform":if(h[y].real)for(d=[],m=0,_=l[y].length;_>m;m++)for(d[m]=[l[y][m][0]],w=1,k=l[y][m].length;k>w;w++)d[m][w]=l[y][m][w]+v*s*h[y][m][w];else{var B=function(t){return+l[y][t]+v*s*h[y][t]};d=[["m",B(0),B(1),B(2),B(3),B(4),B(5)]]}break;case"csv":if("clip-rect"==y)for(d=[],m=4;m--;)d[m]=+l[y][m]+v*s*h[y][m];break;default:var C=[][P](l[y]);for(d=[],m=f.paper.customAttributes[y].length;m--;)d[m]=+C[m]+v*s*h[y][m]}p[y]=d}f.attr(p),function(e,r,i){setTimeout(function(){t("raphael.anim.frame."+e,r,i)})}(f.id,f,n.anim)}else{if(function(r,i,n){setTimeout(function(){t("raphael.anim.frame."+i.id,i,n),t("raphael.anim.finish."+i.id,i,n),e.is(r,"function")&&r.call(i)})}(n.callback,f,n.anim),f.attr(u),Ee.splice(i--,1),n.repeat>1&&!n.next){for(x in u)u[T](x)&&(g[x]=n.totalOrigin[x]);n.el.attr(g),b(n.anim,n.el,n.anim.percents[0],null,n.totalOrigin,n.repeat-1)}n.next&&!n.stop&&b(n.anim,n.el,n.next,null,n.totalOrigin,n.repeat)}}}Ee.length&&Ne(Me)},Le=function(t){return t>255?255:0>t?0:t};ye.animateWith=function(t,r,i,n,a,s){var o=this;if(o.removed)return s&&s.call(o),o;var l=i instanceof m?i:e.animation(i,n,a,s),h,u;b(l,o,l.percents[0],null,o.attr());for(var c=0,f=Ee.length;f>c;c++)if(Ee[c].anim==r&&Ee[c].el==t){Ee[f-1].start=Ee[c].start;break}return o},ye.onAnimation=function(e){return e?t.on("raphael.anim.frame."+this.id,e):t.unbind("raphael.anim.frame."+this.id),this},m.prototype.delay=function(t){var e=new m(this.anim,this.ms);return e.times=this.times,e.del=+t||0,e},m.prototype.repeat=function(t){var e=new m(this.anim,this.ms);return e.del=this.del,e.times=Y.floor(W(t,0))||1,e},e.animation=function(t,r,i,n){if(t instanceof m)return t;!e.is(i,"function")&&i||(n=n||i||null,i=null),t=Object(t),r=+r||0;var a={},s,o;for(o in t)t[T](o)&&ht(o)!=o&&ht(o)+"%"!=o&&(s=!0,a[o]=t[o]);if(s)return i&&(a.easing=i),n&&(a.callback=n),new m({100:a},r);if(n){var l=0;for(var h in t){var u=ut(h);t[T](h)&&u>l&&(l=u)}l+="%",!t[l].callback&&(t[l].callback=n)}return new m(t,r)},ye.animate=function(t,r,i,n){var a=this;if(a.removed)return n&&n.call(a),a;var s=t instanceof m?t:e.animation(t,r,i,n);return b(s,a,s.percents[0],null,a.attr()),a},ye.setTime=function(t,e){return t&&null!=e&&this.status(t,G(e,t.ms)/t.ms),this},ye.status=function(t,e){var r=[],i=0,n,a;if(null!=e)return b(t,this,-1,G(e,1)),this;for(n=Ee.length;n>i;i++)if(a=Ee[i],a.el.id==this.id&&(!t||a.anim==t)){if(t)return a.status;r.push({anim:a.anim,status:a.status})}return t?0:r},ye.pause=function(e){for(var r=0;r<Ee.length;r++)Ee[r].el.id!=this.id||e&&Ee[r].anim!=e||t("raphael.anim.pause."+this.id,this,Ee[r].anim)!==!1&&(Ee[r].paused=!0);return this},ye.resume=function(e){for(var r=0;r<Ee.length;r++)if(Ee[r].el.id==this.id&&(!e||Ee[r].anim==e)){var i=Ee[r];t("raphael.anim.resume."+this.id,this,i.anim)!==!1&&(delete i.paused,this.status(i.anim,i.status))}return this},ye.stop=function(e){for(var r=0;r<Ee.length;r++)Ee[r].el.id!=this.id||e&&Ee[r].anim!=e||t("raphael.anim.stop."+this.id,this,Ee[r].anim)!==!1&&Ee.splice(r--,1);return this},t.on("raphael.remove",_),t.on("raphael.clear",_),ye.toString=function(){return"Raphaël’s object"};var ze=function(t){if(this.items=[],this.length=0,this.type="set",t)for(var e=0,r=t.length;r>e;e++)!t[e]||t[e].constructor!=ye.constructor&&t[e].constructor!=ze||(this[this.items.length]=this.items[this.items.length]=t[e],this.length++)},Pe=ze.prototype;Pe.push=function(){for(var t,e,r=0,i=arguments.length;i>r;r++)t=arguments[r],!t||t.constructor!=ye.constructor&&t.constructor!=ze||(e=this.items.length,this[e]=this.items[e]=t,this.length++);return this},Pe.pop=function(){return this.length&&delete this[this.length--],this.items.pop()},Pe.forEach=function(t,e){for(var r=0,i=this.items.length;i>r;r++)if(t.call(e,this.items[r],r)===!1)return this;return this};for(var Fe in ye)ye[T](Fe)&&(Pe[Fe]=function(t){return function(){var e=arguments;return this.forEach(function(r){r[t][z](r,e)})}}(Fe));return Pe.attr=function(t,r){if(t&&e.is(t,Q)&&e.is(t[0],"object"))for(var i=0,n=t.length;n>i;i++)this.items[i].attr(t[i]);else for(var a=0,s=this.items.length;s>a;a++)this.items[a].attr(t,r);return this},Pe.clear=function(){for(;this.length;)this.pop()},Pe.splice=function(t,e,r){t=0>t?W(this.length+t,0):t,e=W(0,G(this.length-t,e));var i=[],n=[],a=[],s;for(s=2;s<arguments.length;s++)a.push(arguments[s]);for(s=0;e>s;s++)n.push(this[t+s]);for(;s<this.length-t;s++)i.push(this[t+s]);var o=a.length;for(s=0;s<o+i.length;s++)this.items[t+s]=this[t+s]=o>s?a[s]:i[s-o];for(s=this.items.length=this.length-=e-o;this[s];)delete this[s++];return new ze(n)},Pe.exclude=function(t){for(var e=0,r=this.length;r>e;e++)if(this[e]==t)return this.splice(e,1),!0},Pe.animate=function(t,r,i,n){(e.is(i,"function")||!i)&&(n=i||null);var a=this.items.length,s=a,o,l=this,h;if(!a)return this;n&&(h=function(){!--a&&n.call(l)}),i=e.is(i,Z)?i:h;var u=e.animation(t,r,i,h);for(o=this.items[--s].animate(u);s--;)this.items[s]&&!this.items[s].removed&&this.items[s].animateWith(o,u,u),this.items[s]&&!this.items[s].removed||a--;return this},Pe.insertAfter=function(t){for(var e=this.items.length;e--;)this.items[e].insertAfter(t);return this},Pe.getBBox=function(){for(var t=[],e=[],r=[],i=[],n=this.items.length;n--;)if(!this.items[n].removed){var a=this.items[n].getBBox();t.push(a.x),e.push(a.y),r.push(a.x+a.width),i.push(a.y+a.height)}return t=G[z](0,t),e=G[z](0,e),r=W[z](0,r),i=W[z](0,i),{x:t,y:e,x2:r,y2:i,width:r-t,height:i-e}},Pe.clone=function(t){t=this.paper.set();for(var e=0,r=this.items.length;r>e;e++)t.push(this.items[e].clone());return t},Pe.toString=function(){return"Raphaël‘s set"},Pe.glow=function(t){var e=this.paper.set();return this.forEach(function(r,i){var n=r.glow(t);null!=n&&n.forEach(function(t,r){e.push(t)})}),e},Pe.isPointInside=function(t,e){var r=!1;return this.forEach(function(i){return i.isPointInside(t,e)?(r=!0,!1):void 0}),r},e.registerFont=function(t){if(!t.face)return t;this.fonts=this.fonts||{};var e={w:t.w,face:{},glyphs:{}},r=t.face["font-family"];for(var i in t.face)t.face[T](i)&&(e.face[i]=t.face[i]);if(this.fonts[r]?this.fonts[r].push(e):this.fonts[r]=[e],!t.svg){e.face["units-per-em"]=ut(t.face["units-per-em"],10);for(var n in t.glyphs)if(t.glyphs[T](n)){var a=t.glyphs[n];if(e.glyphs[n]={w:a.w,k:{},d:a.d&&"M"+a.d.replace(/[mlcxtrv]/g,function(t){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"}[t]||"M"})+"z"},a.k)for(var s in a.k)a[T](s)&&(e.glyphs[n].k[s]=a.k[s])}}return t},M.getFont=function(t,r,i,n){if(n=n||"normal",i=i||"normal",r=+r||{normal:400,bold:700,lighter:300,bolder:800}[r]||400,e.fonts){var a=e.fonts[t];if(!a){var s=new RegExp("(^|\\s)"+t.replace(/[^\w\d\s+!~.:_-]/g,R)+"(\\s|$)","i");for(var o in e.fonts)if(e.fonts[T](o)&&s.test(o)){a=e.fonts[o];break}}var l;if(a)for(var h=0,u=a.length;u>h&&(l=a[h],l.face["font-weight"]!=r||l.face["font-style"]!=i&&l.face["font-style"]||l.face["font-stretch"]!=n);h++);return l}},M.print=function(t,r,i,n,a,s,o,l){s=s||"middle",o=W(G(o||0,1),-1),l=W(G(l||1,3),1);var h=j(i)[q](R),u=0,c=0,f=R,p;if(e.is(n,"string")&&(n=this.getFont(n)),n){p=(a||16)/n.face["units-per-em"];for(var d=n.face.bbox[q](k),g=+d[0],x=d[3]-d[1],v=0,y=+d[1]+("baseline"==s?x+ +n.face.descent:x/2),m=0,b=h.length;b>m;m++){if("\n"==h[m])u=0,w=0,c=0,v+=x*l;else{var _=c&&n.glyphs[h[m-1]]||{},w=n.glyphs[h[m]];u+=c?(_.w||n.w)+(_.k&&_.k[h[m]]||0)+n.w*o:0,c=1}w&&w.d&&(f+=e.transformPath(w.d,["t",u*p,v*p,"s",p,p,g,y,"t",(t-g)/p,(r-y)/p]))}}return this.path(f).attr({fill:"#000",stroke:"none"})},M.add=function(t){if(e.is(t,"array"))for(var r=this.set(),i=0,n=t.length,a;n>i;i++)a=t[i]||{},B[T](a.type)&&r.push(this[a.type]().attr(a));return r},e.format=function(t,r){var i=e.is(r,Q)?[0][P](r):arguments;return t&&e.is(t,Z)&&i.length-1&&(t=t.replace(C,function(t,e){return null==i[++e]?R:i[e]})),t||R},e.fullfill=function(){var t=/\{([^\}]+)\}/g,e=/(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g,r=function(t,r,i){var n=i;return r.replace(e,function(t,e,r,i,a){e=e||i,n&&(e in n&&(n=n[e]),"function"==typeof n&&a&&(n=n()))}),n=(null==n||n==i?t:n)+""};return function(e,i){return String(e).replace(t,function(t,e){return r(t,e,i)})}}(),e.ninja=function(){if(E.was)A.win.Raphael=E.is;else{window.Raphael=void 0;try{delete window.Raphael}catch(t){}}return e},e.st=Pe,t.on("raphael.DOMload",function(){w=!0}),function(t,r,i){function n(){/in/.test(t.readyState)?setTimeout(n,9):e.eve("raphael.DOMload")}null==t.readyState&&t.addEventListener&&(t.addEventListener(r,i=function(){t.removeEventListener(r,i,!1),t.readyState="complete"},!1),t.readyState="loading"),n()}(document,"DOMContentLoaded"),e}.apply(e,i),!(void 0!==n&&(t.exports=n))},function(t,e,r){var i,n;!function(r){var a="0.4.2",s="hasOwnProperty",o=/[\.\/]/,l="*",h=function(){},u=function(t,e){return t-e},c,f,p={n:{}},d=function(t,e){t=String(t);var r=p,i=f,n=Array.prototype.slice.call(arguments,2),a=d.listeners(t),s=0,o=!1,l,h=[],g={},x=[],v=c,y=[];c=t,f=0;for(var m=0,b=a.length;b>m;m++)"zIndex"in a[m]&&(h.push(a[m].zIndex),a[m].zIndex<0&&(g[a[m].zIndex]=a[m]));for(h.sort(u);h[s]<0;)if(l=g[h[s++]],x.push(l.apply(e,n)),f)return f=i,x;for(m=0;b>m;m++)if(l=a[m],"zIndex"in l)if(l.zIndex==h[s]){if(x.push(l.apply(e,n)),f)break;do if(s++,l=g[h[s]],l&&x.push(l.apply(e,n)),f)break;while(l)}else g[l.zIndex]=l;else if(x.push(l.apply(e,n)),f)break;return f=i,c=v,x.length?x:null};d._events=p,d.listeners=function(t){var e=t.split(o),r=p,i,n,a,s,h,u,c,f,d=[r],g=[];for(s=0,h=e.length;h>s;s++){for(f=[],u=0,c=d.length;c>u;u++)for(r=d[u].n,n=[r[e[s]],r[l]],a=2;a--;)i=n[a],i&&(f.push(i),g=g.concat(i.f||[]));d=f}return g},d.on=function(t,e){if(t=String(t),"function"!=typeof e)return function(){};for(var r=t.split(o),i=p,n=0,a=r.length;a>n;n++)i=i.n,i=i.hasOwnProperty(r[n])&&i[r[n]]||(i[r[n]]={n:{}});for(i.f=i.f||[],n=0,a=i.f.length;a>n;n++)if(i.f[n]==e)return h;return i.f.push(e),function(t){+t==+t&&(e.zIndex=+t)}},d.f=function(t){var e=[].slice.call(arguments,1);return function(){d.apply(null,[t,null].concat(e).concat([].slice.call(arguments,0)))}},d.stop=function(){f=1},d.nt=function(t){return t?new RegExp("(?:\\.|\\/|^)"+t+"(?:\\.|\\/|$)").test(c):c},d.nts=function(){return c.split(o)},d.off=d.unbind=function(t,e){if(!t)return void(d._events=p={n:{}});var r=t.split(o),i,n,a,h,u,c,f,g=[p];for(h=0,u=r.length;u>h;h++)for(c=0;c<g.length;c+=a.length-2){if(a=[c,1],i=g[c].n,r[h]!=l)i[r[h]]&&a.push(i[r[h]]);else for(n in i)i[s](n)&&a.push(i[n]);g.splice.apply(g,a)}for(h=0,u=g.length;u>h;h++)for(i=g[h];i.n;){if(e){if(i.f){for(c=0,f=i.f.length;f>c;c++)if(i.f[c]==e){i.f.splice(c,1);break}!i.f.length&&delete i.f}for(n in i.n)if(i.n[s](n)&&i.n[n].f){var x=i.n[n].f;for(c=0,f=x.length;f>c;c++)if(x[c]==e){x.splice(c,1);break}!x.length&&delete i.n[n].f}}else{delete i.f;for(n in i.n)i.n[s](n)&&i.n[n].f&&delete i.n[n].f}i=i.n}},d.once=function(t,e){var r=function(){return d.unbind(t,r),e.apply(this,arguments)};return d.on(t,r)},d.version=a,d.toString=function(){return"You are running Eve "+a},"undefined"!=typeof t&&t.exports?t.exports=d:(i=[],n=function(){return d}.apply(e,i),!(void 0!==n&&(t.exports=n)))}(this)},function(t,e,r){var i,n;i=[r(1)],n=function(t){if(!t||t.svg){var e="hasOwnProperty",r=String,i=parseFloat,n=parseInt,a=Math,s=a.max,o=a.abs,l=a.pow,h=/[, ]+/,u=t.eve,c="",f=" ",p="http://www.w3.org/1999/xlink",d={block:"M5,0 0,2.5 5,5z",classic:"M5,0 0,2.5 5,5 3.5,3 3.5,2z",diamond:"M2.5,0 5,2.5 2.5,5 0,2.5z",open:"M6,1 1,3.5 6,6",oval:"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"},g={};t.toString=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var x=function(i,n){if(n){"string"==typeof i&&(i=x(i));for(var a in n)n[e](a)&&("xlink:"==a.substring(0,6)?i.setAttributeNS(p,a.substring(6),r(n[a])):i.setAttribute(a,r(n[a])))}else i=t._g.doc.createElementNS("http://www.w3.org/2000/svg",i),i.style&&(i.style.webkitTapHighlightColor="rgba(0,0,0,0)");return i},v=function(e,n){var h="linear",u=e.id+n,f=.5,p=.5,d=e.node,g=e.paper,v=d.style,y=t._g.doc.getElementById(u);if(!y){if(n=r(n).replace(t._radial_gradient,function(t,e,r){if(h="radial",e&&r){f=i(e),p=i(r);var n=2*(p>.5)-1;l(f-.5,2)+l(p-.5,2)>.25&&(p=a.sqrt(.25-l(f-.5,2))*n+.5)&&.5!=p&&(p=p.toFixed(5)-1e-5*n)}return c}),n=n.split(/\s*\-\s*/),"linear"==h){var b=n.shift();if(b=-i(b),isNaN(b))return null;var _=[0,0,a.cos(t.rad(b)),a.sin(t.rad(b))],w=1/(s(o(_[2]),o(_[3]))||1);_[2]*=w,_[3]*=w,_[2]<0&&(_[0]=-_[2],_[2]=0),_[3]<0&&(_[1]=-_[3],_[3]=0)}var k=t._parseDots(n);if(!k)return null;if(u=u.replace(/[\(\)\s,\xb0#]/g,"_"),e.gradient&&u!=e.gradient.id&&(g.defs.removeChild(e.gradient),delete e.gradient),!e.gradient){y=x(h+"Gradient",{id:u}),e.gradient=y,x(y,"radial"==h?{fx:f,fy:p}:{x1:_[0],y1:_[1],x2:_[2],y2:_[3],gradientTransform:e.matrix.invert()}),g.defs.appendChild(y);for(var B=0,C=k.length;C>B;B++)y.appendChild(x("stop",{offset:k[B].offset?k[B].offset:B?"100%":"0%","stop-color":k[B].color||"#fff","stop-opacity":isFinite(k[B].opacity)?k[B].opacity:1}))}}return x(d,{fill:m(u),opacity:1,"fill-opacity":1}),v.fill=c,v.opacity=1,v.fillOpacity=1,1},y=function(){var t=document.documentMode;return t&&(9===t||10===t)},m=function(t){if(y())return"url('#"+t+"')";var e=document.location,r=e.protocol+"//"+e.host+e.pathname+e.search;return"url('"+r+"#"+t+"')"},b=function(t){var e=t.getBBox(1);x(t.pattern,{patternTransform:t.matrix.invert()+" translate("+e.x+","+e.y+")"})},_=function(i,n,a){if("path"==i.type){for(var s=r(n).toLowerCase().split("-"),o=i.paper,l=a?"end":"start",h=i.node,u=i.attrs,f=u["stroke-width"],p=s.length,v="classic",y,m,b,_,w,k=3,B=3,C=5;p--;)switch(s[p]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":v=s[p];break;case"wide":B=5;break;case"narrow":B=2;break;case"long":k=5;break;case"short":k=2}if("open"==v?(k+=2,B+=2,C+=2,b=1,_=a?4:1,w={fill:"none",stroke:u.stroke}):(_=b=k/2,w={fill:u.stroke,stroke:"none"}),i._.arrows?a?(i._.arrows.endPath&&g[i._.arrows.endPath]--,i._.arrows.endMarker&&g[i._.arrows.endMarker]--):(i._.arrows.startPath&&g[i._.arrows.startPath]--,i._.arrows.startMarker&&g[i._.arrows.startMarker]--):i._.arrows={},"none"!=v){var S="raphael-marker-"+v,T="raphael-marker-"+l+v+k+B+"-obj"+i.id;t._g.doc.getElementById(S)?g[S]++:(o.defs.appendChild(x(x("path"),{"stroke-linecap":"round",d:d[v],id:S})),g[S]=1);var A=t._g.doc.getElementById(T),E;A?(g[T]++,E=A.getElementsByTagName("use")[0]):(A=x(x("marker"),{id:T,markerHeight:B,markerWidth:k,orient:"auto",refX:_,refY:B/2}),E=x(x("use"),{"xlink:href":"#"+S,transform:(a?"rotate(180 "+k/2+" "+B/2+") ":c)+"scale("+k/C+","+B/C+")","stroke-width":(1/((k/C+B/C)/2)).toFixed(4)}),A.appendChild(E),o.defs.appendChild(A),g[T]=1),x(E,w);var N=b*("diamond"!=v&&"oval"!=v);a?(y=i._.arrows.startdx*f||0,m=t.getTotalLength(u.path)-N*f):(y=N*f,m=t.getTotalLength(u.path)-(i._.arrows.enddx*f||0)),w={},w["marker-"+l]="url(#"+T+")",(m||y)&&(w.d=t.getSubpath(u.path,y,m)),x(h,w),i._.arrows[l+"Path"]=S,i._.arrows[l+"Marker"]=T,i._.arrows[l+"dx"]=N,i._.arrows[l+"Type"]=v,i._.arrows[l+"String"]=n}else a?(y=i._.arrows.startdx*f||0,m=t.getTotalLength(u.path)-y):(y=0,m=t.getTotalLength(u.path)-(i._.arrows.enddx*f||0)),i._.arrows[l+"Path"]&&x(h,{d:t.getSubpath(u.path,y,m)}),delete i._.arrows[l+"Path"],delete i._.arrows[l+"Marker"],delete i._.arrows[l+"dx"],delete i._.arrows[l+"Type"],delete i._.arrows[l+"String"];for(w in g)if(g[e](w)&&!g[w]){var M=t._g.doc.getElementById(w);M&&M.parentNode.removeChild(M)}}},w={"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},k=function(t,e,i){if(e=w[r(e).toLowerCase()]){for(var n=t.attrs["stroke-width"]||"1",a={round:n,square:n,butt:0}[t.attrs["stroke-linecap"]||i["stroke-linecap"]]||0,s=[],o=e.length;o--;)s[o]=e[o]*n+(o%2?1:-1)*a;x(t.node,{"stroke-dasharray":s.join(",")})}else x(t.node,{"stroke-dasharray":"none"})},B=function(i,a){var l=i.node,u=i.attrs,f=l.style.visibility;l.style.visibility="hidden";for(var d in a)if(a[e](d)){if(!t._availableAttrs[e](d))continue;var g=a[d];switch(u[d]=g,d){case"blur":i.blur(g);break;case"title":var y=l.getElementsByTagName("title");if(y.length&&(y=y[0]))y.firstChild.nodeValue=g;else{y=x("title");var m=t._g.doc.createTextNode(g);y.appendChild(m),l.appendChild(y)}break;case"href":case"target":var w=l.parentNode;if("a"!=w.tagName.toLowerCase()){var B=x("a");w.insertBefore(B,l),B.appendChild(l),w=B}"target"==d?w.setAttributeNS(p,"show","blank"==g?"new":g):w.setAttributeNS(p,d,g);break;case"cursor":l.style.cursor=g;break;case"transform":i.transform(g);break;case"arrow-start":_(i,g);break;case"arrow-end":_(i,g,1);break;case"clip-rect":var C=r(g).split(h);if(4==C.length){i.clip&&i.clip.parentNode.parentNode.removeChild(i.clip.parentNode);var T=x("clipPath"),A=x("rect");T.id=t.createUUID(),x(A,{x:C[0],y:C[1],width:C[2],height:C[3]}),T.appendChild(A),i.paper.defs.appendChild(T),x(l,{"clip-path":"url(#"+T.id+")"}),i.clip=A}if(!g){var E=l.getAttribute("clip-path");if(E){var N=t._g.doc.getElementById(E.replace(/(^url\(#|\)$)/g,c));N&&N.parentNode.removeChild(N),x(l,{"clip-path":c}),delete i.clip}}break;case"path":"path"==i.type&&(x(l,{d:g?u.path=t._pathToAbsolute(g):"M0,0"}),i._.dirty=1,i._.arrows&&("startString"in i._.arrows&&_(i,i._.arrows.startString),"endString"in i._.arrows&&_(i,i._.arrows.endString,1)));break;case"width":if(l.setAttribute(d,g),i._.dirty=1,!u.fx)break;d="x",g=u.x;case"x":u.fx&&(g=-u.x-(u.width||0));case"rx":if("rx"==d&&"rect"==i.type)break;case"cx":l.setAttribute(d,g),i.pattern&&b(i),i._.dirty=1;break;case"height":if(l.setAttribute(d,g),i._.dirty=1,!u.fy)break;d="y",g=u.y;case"y":u.fy&&(g=-u.y-(u.height||0));case"ry":if("ry"==d&&"rect"==i.type)break;case"cy":l.setAttribute(d,g),i.pattern&&b(i),i._.dirty=1;break;case"r":"rect"==i.type?x(l,{rx:g,ry:g}):l.setAttribute(d,g),i._.dirty=1;break;case"src":"image"==i.type&&l.setAttributeNS(p,"href",g);break;case"stroke-width":1==i._.sx&&1==i._.sy||(g/=s(o(i._.sx),o(i._.sy))||1),l.setAttribute(d,g),u["stroke-dasharray"]&&k(i,u["stroke-dasharray"],a),i._.arrows&&("startString"in i._.arrows&&_(i,i._.arrows.startString),"endString"in i._.arrows&&_(i,i._.arrows.endString,1));break;case"stroke-dasharray":k(i,g,a);break;case"fill":var M=r(g).match(t._ISURL);if(M){T=x("pattern");var L=x("image");T.id=t.createUUID(),x(T,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1}),x(L,{x:0,y:0,"xlink:href":M[1]}),T.appendChild(L),function(e){t._preload(M[1],function(){var t=this.offsetWidth,r=this.offsetHeight;x(e,{width:t,height:r}),x(L,{width:t,height:r})})}(T),i.paper.defs.appendChild(T),x(l,{fill:"url(#"+T.id+")"}),i.pattern=T,i.pattern&&b(i);break}var z=t.getRGB(g);if(z.error){if(("circle"==i.type||"ellipse"==i.type||"r"!=r(g).charAt())&&v(i,g)){ +if("opacity"in u||"fill-opacity"in u){var P=t._g.doc.getElementById(l.getAttribute("fill").replace(/^url\(#|\)$/g,c));if(P){var F=P.getElementsByTagName("stop");x(F[F.length-1],{"stop-opacity":("opacity"in u?u.opacity:1)*("fill-opacity"in u?u["fill-opacity"]:1)})}}u.gradient=g,u.fill="none";break}}else delete a.gradient,delete u.gradient,!t.is(u.opacity,"undefined")&&t.is(a.opacity,"undefined")&&x(l,{opacity:u.opacity}),!t.is(u["fill-opacity"],"undefined")&&t.is(a["fill-opacity"],"undefined")&&x(l,{"fill-opacity":u["fill-opacity"]});z[e]("opacity")&&x(l,{"fill-opacity":z.opacity>1?z.opacity/100:z.opacity});case"stroke":z=t.getRGB(g),l.setAttribute(d,z.hex),"stroke"==d&&z[e]("opacity")&&x(l,{"stroke-opacity":z.opacity>1?z.opacity/100:z.opacity}),"stroke"==d&&i._.arrows&&("startString"in i._.arrows&&_(i,i._.arrows.startString),"endString"in i._.arrows&&_(i,i._.arrows.endString,1));break;case"gradient":("circle"==i.type||"ellipse"==i.type||"r"!=r(g).charAt())&&v(i,g);break;case"opacity":u.gradient&&!u[e]("stroke-opacity")&&x(l,{"stroke-opacity":g>1?g/100:g});case"fill-opacity":if(u.gradient){P=t._g.doc.getElementById(l.getAttribute("fill").replace(/^url\(#|\)$/g,c)),P&&(F=P.getElementsByTagName("stop"),x(F[F.length-1],{"stop-opacity":g}));break}default:"font-size"==d&&(g=n(g,10)+"px");var R=d.replace(/(\-.)/g,function(t){return t.substring(1).toUpperCase()});l.style[R]=g,i._.dirty=1,l.setAttribute(d,g)}}S(i,a),l.style.visibility=f},C=1.2,S=function(i,a){if("text"==i.type&&(a[e]("text")||a[e]("font")||a[e]("font-size")||a[e]("x")||a[e]("y"))){var s=i.attrs,o=i.node,l=o.firstChild?n(t._g.doc.defaultView.getComputedStyle(o.firstChild,c).getPropertyValue("font-size"),10):10;if(a[e]("text")){for(s.text=a.text;o.firstChild;)o.removeChild(o.firstChild);for(var h=r(a.text).split("\n"),u=[],f,p=0,d=h.length;d>p;p++)f=x("tspan"),p&&x(f,{dy:l*C,x:s.x}),f.appendChild(t._g.doc.createTextNode(h[p])),o.appendChild(f),u[p]=f}else for(u=o.getElementsByTagName("tspan"),p=0,d=u.length;d>p;p++)p?x(u[p],{dy:l*C,x:s.x}):x(u[0],{dy:0});x(o,{x:s.x,y:s.y}),i._.dirty=1;var g=i._getBBox(),v=s.y-(g.y+g.height/2);v&&t.is(v,"finite")&&x(u[0],{dy:v})}},T=function(t){return t.parentNode&&"a"===t.parentNode.tagName.toLowerCase()?t.parentNode:t},A=function(e,r){var i=0,n=0;this[0]=this.node=e,e.raphael=!0,this.id=t._oid++,e.raphaelid=this.id,this.matrix=t.matrix(),this.realPath=null,this.paper=r,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!r.bottom&&(r.bottom=this),this.prev=r.top,r.top&&(r.top.next=this),r.top=this,this.next=null},E=t.el;A.prototype=E,E.constructor=A,t._engine.path=function(t,e){var r=x("path");e.canvas&&e.canvas.appendChild(r);var i=new A(r,e);return i.type="path",B(i,{fill:"none",stroke:"#000",path:t}),i},E.rotate=function(t,e,n){if(this.removed)return this;if(t=r(t).split(h),t.length-1&&(e=i(t[1]),n=i(t[2])),t=i(t[0]),null==n&&(e=n),null==e||null==n){var a=this.getBBox(1);e=a.x+a.width/2,n=a.y+a.height/2}return this.transform(this._.transform.concat([["r",t,e,n]])),this},E.scale=function(t,e,n,a){if(this.removed)return this;if(t=r(t).split(h),t.length-1&&(e=i(t[1]),n=i(t[2]),a=i(t[3])),t=i(t[0]),null==e&&(e=t),null==a&&(n=a),null==n||null==a)var s=this.getBBox(1);return n=null==n?s.x+s.width/2:n,a=null==a?s.y+s.height/2:a,this.transform(this._.transform.concat([["s",t,e,n,a]])),this},E.translate=function(t,e){return this.removed?this:(t=r(t).split(h),t.length-1&&(e=i(t[1])),t=i(t[0])||0,e=+e||0,this.transform(this._.transform.concat([["t",t,e]])),this)},E.transform=function(r){var i=this._;if(null==r)return i.transform;if(t._extractTransform(this,r),this.clip&&x(this.clip,{transform:this.matrix.invert()}),this.pattern&&b(this),this.node&&x(this.node,{transform:this.matrix}),1!=i.sx||1!=i.sy){var n=this.attrs[e]("stroke-width")?this.attrs["stroke-width"]:1;this.attr({"stroke-width":n})}return i.transform=this.matrix.toTransformString(),this},E.hide=function(){return this.removed||(this.node.style.display="none"),this},E.show=function(){return this.removed||(this.node.style.display=""),this},E.remove=function(){var e=T(this.node);if(!this.removed&&e.parentNode){var r=this.paper;r.__set__&&r.__set__.exclude(this),u.unbind("raphael.*.*."+this.id),this.gradient&&r.defs.removeChild(this.gradient),t._tear(this,r),e.parentNode.removeChild(e),this.removeData();for(var i in this)this[i]="function"==typeof this[i]?t._removedFactory(i):null;this.removed=!0}},E._getBBox=function(){if("none"==this.node.style.display){this.show();var t=!0}var e=!1,r;this.paper.canvas.parentElement?r=this.paper.canvas.parentElement.style:this.paper.canvas.parentNode&&(r=this.paper.canvas.parentNode.style),r&&"none"==r.display&&(e=!0,r.display="");var i={};try{i=this.node.getBBox()}catch(n){i={x:this.node.clientLeft,y:this.node.clientTop,width:this.node.clientWidth,height:this.node.clientHeight}}finally{i=i||{},e&&(r.display="none")}return t&&this.hide(),i},E.attr=function(r,i){if(this.removed)return this;if(null==r){var n={};for(var a in this.attrs)this.attrs[e](a)&&(n[a]=this.attrs[a]);return n.gradient&&"none"==n.fill&&(n.fill=n.gradient)&&delete n.gradient,n.transform=this._.transform,n}if(null==i&&t.is(r,"string")){if("fill"==r&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;if("transform"==r)return this._.transform;for(var s=r.split(h),o={},l=0,c=s.length;c>l;l++)r=s[l],r in this.attrs?o[r]=this.attrs[r]:t.is(this.paper.customAttributes[r],"function")?o[r]=this.paper.customAttributes[r].def:o[r]=t._availableAttrs[r];return c-1?o:o[s[0]]}if(null==i&&t.is(r,"array")){for(o={},l=0,c=r.length;c>l;l++)o[r[l]]=this.attr(r[l]);return o}if(null!=i){var f={};f[r]=i}else null!=r&&t.is(r,"object")&&(f=r);for(var p in f)u("raphael.attr."+p+"."+this.id,this,f[p]);for(p in this.paper.customAttributes)if(this.paper.customAttributes[e](p)&&f[e](p)&&t.is(this.paper.customAttributes[p],"function")){var d=this.paper.customAttributes[p].apply(this,[].concat(f[p]));this.attrs[p]=f[p];for(var g in d)d[e](g)&&(f[g]=d[g])}return B(this,f),this},E.toFront=function(){if(this.removed)return this;var e=T(this.node);e.parentNode.appendChild(e);var r=this.paper;return r.top!=this&&t._tofront(this,r),this},E.toBack=function(){if(this.removed)return this;var e=T(this.node),r=e.parentNode;r.insertBefore(e,r.firstChild),t._toback(this,this.paper);var i=this.paper;return this},E.insertAfter=function(e){if(this.removed||!e)return this;var r=T(this.node),i=T(e.node||e[e.length-1].node);return i.nextSibling?i.parentNode.insertBefore(r,i.nextSibling):i.parentNode.appendChild(r),t._insertafter(this,e,this.paper),this},E.insertBefore=function(e){if(this.removed||!e)return this;var r=T(this.node),i=T(e.node||e[0].node);return i.parentNode.insertBefore(r,i),t._insertbefore(this,e,this.paper),this},E.blur=function(e){var r=this;if(0!==+e){var i=x("filter"),n=x("feGaussianBlur");r.attrs.blur=e,i.id=t.createUUID(),x(n,{stdDeviation:+e||1.5}),i.appendChild(n),r.paper.defs.appendChild(i),r._blur=i,x(r.node,{filter:"url(#"+i.id+")"})}else r._blur&&(r._blur.parentNode.removeChild(r._blur),delete r._blur,delete r.attrs.blur),r.node.removeAttribute("filter");return r},t._engine.circle=function(t,e,r,i){var n=x("circle");t.canvas&&t.canvas.appendChild(n);var a=new A(n,t);return a.attrs={cx:e,cy:r,r:i,fill:"none",stroke:"#000"},a.type="circle",x(n,a.attrs),a},t._engine.rect=function(t,e,r,i,n,a){var s=x("rect");t.canvas&&t.canvas.appendChild(s);var o=new A(s,t);return o.attrs={x:e,y:r,width:i,height:n,rx:a||0,ry:a||0,fill:"none",stroke:"#000"},o.type="rect",x(s,o.attrs),o},t._engine.ellipse=function(t,e,r,i,n){var a=x("ellipse");t.canvas&&t.canvas.appendChild(a);var s=new A(a,t);return s.attrs={cx:e,cy:r,rx:i,ry:n,fill:"none",stroke:"#000"},s.type="ellipse",x(a,s.attrs),s},t._engine.image=function(t,e,r,i,n,a){var s=x("image");x(s,{x:r,y:i,width:n,height:a,preserveAspectRatio:"none"}),s.setAttributeNS(p,"href",e),t.canvas&&t.canvas.appendChild(s);var o=new A(s,t);return o.attrs={x:r,y:i,width:n,height:a,src:e},o.type="image",o},t._engine.text=function(e,r,i,n){var a=x("text");e.canvas&&e.canvas.appendChild(a);var s=new A(a,e);return s.attrs={x:r,y:i,"text-anchor":"middle",text:n,"font-family":t._availableAttrs["font-family"],"font-size":t._availableAttrs["font-size"],stroke:"none",fill:"#000"},s.type="text",B(s,s.attrs),s},t._engine.setSize=function(t,e){return this.width=t||this.width,this.height=e||this.height,this.canvas.setAttribute("width",this.width),this.canvas.setAttribute("height",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox),this},t._engine.create=function(){var e=t._getContainer.apply(0,arguments),r=e&&e.container,i=e.x,n=e.y,a=e.width,s=e.height;if(!r)throw new Error("SVG container not found.");var o=x("svg"),l="overflow:hidden;",h;return i=i||0,n=n||0,a=a||512,s=s||342,x(o,{height:s,version:1.1,width:a,xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink"}),1==r?(o.style.cssText=l+"position:absolute;left:"+i+"px;top:"+n+"px",t._g.doc.body.appendChild(o),h=1):(o.style.cssText=l+"position:relative",r.firstChild?r.insertBefore(o,r.firstChild):r.appendChild(o)),r=new t._Paper,r.width=a,r.height=s,r.canvas=o,r.clear(),r._left=r._top=0,h&&(r.renderfix=function(){}),r.renderfix(),r},t._engine.setViewBox=function(t,e,r,i,n){u("raphael.setViewBox",this,this._viewBox,[t,e,r,i,n]);var a=this.getSize(),o=s(r/a.width,i/a.height),l=this.top,h=n?"xMidYMid meet":"xMinYMin",c,p;for(null==t?(this._vbSize&&(o=1),delete this._vbSize,c="0 0 "+this.width+f+this.height):(this._vbSize=o,c=t+f+e+f+r+f+i),x(this.canvas,{viewBox:c,preserveAspectRatio:h});o&&l;)p="stroke-width"in l.attrs?l.attrs["stroke-width"]:1,l.attr({"stroke-width":p}),l._.dirty=1,l._.dirtyT=1,l=l.prev;return this._viewBox=[t,e,r,i,!!n],this},t.prototype.renderfix=function(){var t=this.canvas,e=t.style,r;try{r=t.getScreenCTM()||t.createSVGMatrix()}catch(i){r=t.createSVGMatrix()}var n=-r.e%1,a=-r.f%1;(n||a)&&(n&&(this._left=(this._left+n)%1,e.left=this._left+"px"),a&&(this._top=(this._top+a)%1,e.top=this._top+"px"))},t.prototype.clear=function(){t.eve("raphael.clear",this);for(var e=this.canvas;e.firstChild;)e.removeChild(e.firstChild);this.bottom=this.top=null,(this.desc=x("desc")).appendChild(t._g.doc.createTextNode("Created with Raphaël "+t.version)),e.appendChild(this.desc),e.appendChild(this.defs=x("defs"))},t.prototype.remove=function(){u("raphael.remove",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var e in this)this[e]="function"==typeof this[e]?t._removedFactory(e):null};var N=t.st;for(var M in E)E[e](M)&&!N[e](M)&&(N[M]=function(t){return function(){var e=arguments;return this.forEach(function(r){r[t].apply(r,e)})}}(M))}}.apply(e,i),!(void 0!==n&&(t.exports=n))},function(t,e,r){var i,n;i=[r(1)],n=function(t){if(!t||t.vml){var e="hasOwnProperty",r=String,i=parseFloat,n=Math,a=n.round,s=n.max,o=n.min,l=n.abs,h="fill",u=/[, ]+/,c=t.eve,f=" progid:DXImageTransform.Microsoft",p=" ",d="",g={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},x=/([clmz]),?([^clmz]*)/gi,v=/ progid:\S+Blur\([^\)]+\)/g,y=/-?[^,\s-]+/g,m="position:absolute;left:0;top:0;width:1px;height:1px;behavior:url(#default#VML)",b=21600,_={path:1,rect:1,image:1},w={circle:1,ellipse:1},k=function(e){var i=/[ahqstv]/gi,n=t._pathToAbsolute;if(r(e).match(i)&&(n=t._path2curve),i=/[clmz]/g,n==t._pathToAbsolute&&!r(e).match(i)){var s=r(e).replace(x,function(t,e,r){var i=[],n="m"==e.toLowerCase(),s=g[e];return r.replace(y,function(t){n&&2==i.length&&(s+=i+g["m"==e?"l":"L"],i=[]),i.push(a(t*b))}),s+i});return s}var o=n(e),l,h;s=[];for(var u=0,c=o.length;c>u;u++){l=o[u],h=o[u][0].toLowerCase(),"z"==h&&(h="x");for(var f=1,v=l.length;v>f;f++)h+=a(l[f]*b)+(f!=v-1?",":d);s.push(h)}return s.join(p)},B=function(e,r,i){var n=t.matrix();return n.rotate(-e,.5,.5),{dx:n.x(r,i),dy:n.y(r,i)}},C=function(t,e,r,i,n,a){var s=t._,o=t.matrix,u=s.fillpos,c=t.node,f=c.style,d=1,g="",x,v=b/e,y=b/r;if(f.visibility="hidden",e&&r){if(c.coordsize=l(v)+p+l(y),f.rotation=a*(0>e*r?-1:1),a){var m=B(a,i,n);i=m.dx,n=m.dy}if(0>e&&(g+="x"),0>r&&(g+=" y")&&(d=-1),f.flip=g,c.coordorigin=i*-v+p+n*-y,u||s.fillsize){var _=c.getElementsByTagName(h);_=_&&_[0],c.removeChild(_),u&&(m=B(a,o.x(u[0],u[1]),o.y(u[0],u[1])),_.position=m.dx*d+p+m.dy*d),s.fillsize&&(_.size=s.fillsize[0]*l(e)+p+s.fillsize[1]*l(r)),c.appendChild(_)}f.visibility="visible"}};t.toString=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version};var S=function(t,e,i){for(var n=r(e).toLowerCase().split("-"),a=i?"end":"start",s=n.length,o="classic",l="medium",h="medium";s--;)switch(n[s]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":o=n[s];break;case"wide":case"narrow":h=n[s];break;case"long":case"short":l=n[s]}var u=t.node.getElementsByTagName("stroke")[0];u[a+"arrow"]=o,u[a+"arrowlength"]=l,u[a+"arrowwidth"]=h},T=function(n,l){n.attrs=n.attrs||{};var c=n.node,f=n.attrs,g=c.style,x,v=_[n.type]&&(l.x!=f.x||l.y!=f.y||l.width!=f.width||l.height!=f.height||l.cx!=f.cx||l.cy!=f.cy||l.rx!=f.rx||l.ry!=f.ry||l.r!=f.r),y=w[n.type]&&(f.cx!=l.cx||f.cy!=l.cy||f.r!=l.r||f.rx!=l.rx||f.ry!=l.ry),m=n;for(var B in l)l[e](B)&&(f[B]=l[B]);if(v&&(f.path=t._getPath[n.type](n),n._.dirty=1),l.href&&(c.href=l.href),l.title&&(c.title=l.title),l.target&&(c.target=l.target),l.cursor&&(g.cursor=l.cursor),"blur"in l&&n.blur(l.blur),(l.path&&"path"==n.type||v)&&(c.path=k(~r(f.path).toLowerCase().indexOf("r")?t._pathToAbsolute(f.path):f.path),n._.dirty=1,"image"==n.type&&(n._.fillpos=[f.x,f.y],n._.fillsize=[f.width,f.height],C(n,1,1,0,0,0))),"transform"in l&&n.transform(l.transform),y){var T=+f.cx,E=+f.cy,N=+f.rx||+f.r||0,L=+f.ry||+f.r||0;c.path=t.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x",a((T-N)*b),a((E-L)*b),a((T+N)*b),a((E+L)*b),a(T*b)),n._.dirty=1}if("clip-rect"in l){var z=r(l["clip-rect"]).split(u);if(4==z.length){z[2]=+z[2]+ +z[0],z[3]=+z[3]+ +z[1];var P=c.clipRect||t._g.doc.createElement("div"),F=P.style;F.clip=t.format("rect({1}px {2}px {3}px {0}px)",z),c.clipRect||(F.position="absolute",F.top=0,F.left=0,F.width=n.paper.width+"px",F.height=n.paper.height+"px",c.parentNode.insertBefore(P,c),P.appendChild(c),c.clipRect=P)}l["clip-rect"]||c.clipRect&&(c.clipRect.style.clip="auto")}if(n.textpath){var R=n.textpath.style;l.font&&(R.font=l.font),l["font-family"]&&(R.fontFamily='"'+l["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g,d)+'"'),l["font-size"]&&(R.fontSize=l["font-size"]),l["font-weight"]&&(R.fontWeight=l["font-weight"]),l["font-style"]&&(R.fontStyle=l["font-style"])}if("arrow-start"in l&&S(m,l["arrow-start"]),"arrow-end"in l&&S(m,l["arrow-end"],1),null!=l.opacity||null!=l.fill||null!=l.src||null!=l.stroke||null!=l["stroke-width"]||null!=l["stroke-opacity"]||null!=l["fill-opacity"]||null!=l["stroke-dasharray"]||null!=l["stroke-miterlimit"]||null!=l["stroke-linejoin"]||null!=l["stroke-linecap"]){var I=c.getElementsByTagName(h),j=!1;if(I=I&&I[0],!I&&(j=I=M(h)),"image"==n.type&&l.src&&(I.src=l.src),l.fill&&(I.on=!0),null!=I.on&&"none"!=l.fill&&null!==l.fill||(I.on=!1),I.on&&l.fill){var q=r(l.fill).match(t._ISURL);if(q){I.parentNode==c&&c.removeChild(I),I.rotate=!0,I.src=q[1],I.type="tile";var D=n.getBBox(1);I.position=D.x+p+D.y,n._.fillpos=[D.x,D.y],t._preload(q[1],function(){n._.fillsize=[this.offsetWidth,this.offsetHeight]})}else I.color=t.getRGB(l.fill).hex,I.src=d,I.type="solid",t.getRGB(l.fill).error&&(m.type in{circle:1,ellipse:1}||"r"!=r(l.fill).charAt())&&A(m,l.fill,I)&&(f.fill="none",f.gradient=l.fill,I.rotate=!1)}if("fill-opacity"in l||"opacity"in l){var V=((+f["fill-opacity"]+1||2)-1)*((+f.opacity+1||2)-1)*((+t.getRGB(l.fill).o+1||2)-1);V=o(s(V,0),1),I.opacity=V,I.src&&(I.color="none")}c.appendChild(I);var O=c.getElementsByTagName("stroke")&&c.getElementsByTagName("stroke")[0],Y=!1;!O&&(Y=O=M("stroke")),(l.stroke&&"none"!=l.stroke||l["stroke-width"]||null!=l["stroke-opacity"]||l["stroke-dasharray"]||l["stroke-miterlimit"]||l["stroke-linejoin"]||l["stroke-linecap"])&&(O.on=!0),("none"==l.stroke||null===l.stroke||null==O.on||0==l.stroke||0==l["stroke-width"])&&(O.on=!1);var W=t.getRGB(l.stroke);O.on&&l.stroke&&(O.color=W.hex),V=((+f["stroke-opacity"]+1||2)-1)*((+f.opacity+1||2)-1)*((+W.o+1||2)-1);var G=.75*(i(l["stroke-width"])||1);if(V=o(s(V,0),1),null==l["stroke-width"]&&(G=f["stroke-width"]),l["stroke-width"]&&(O.weight=G),G&&1>G&&(V*=G)&&(O.weight=1),O.opacity=V,l["stroke-linejoin"]&&(O.joinstyle=l["stroke-linejoin"]||"miter"),O.miterlimit=l["stroke-miterlimit"]||8,l["stroke-linecap"]&&(O.endcap="butt"==l["stroke-linecap"]?"flat":"square"==l["stroke-linecap"]?"square":"round"),"stroke-dasharray"in l){var H={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};O.dashstyle=H[e](l["stroke-dasharray"])?H[l["stroke-dasharray"]]:d}Y&&c.appendChild(O)}if("text"==m.type){m.paper.canvas.style.display=d;var X=m.paper.span,U=100,$=f.font&&f.font.match(/\d+(?:\.\d*)?(?=px)/);g=X.style,f.font&&(g.font=f.font),f["font-family"]&&(g.fontFamily=f["font-family"]),f["font-weight"]&&(g.fontWeight=f["font-weight"]),f["font-style"]&&(g.fontStyle=f["font-style"]),$=i(f["font-size"]||$&&$[0])||10,g.fontSize=$*U+"px",m.textpath.string&&(X.innerHTML=r(m.textpath.string).replace(/</g,"<").replace(/&/g,"&").replace(/\n/g,"<br>"));var Z=X.getBoundingClientRect();m.W=f.w=(Z.right-Z.left)/U,m.H=f.h=(Z.bottom-Z.top)/U,m.X=f.x,m.Y=f.y+m.H/2,("x"in l||"y"in l)&&(m.path.v=t.format("m{0},{1}l{2},{1}",a(f.x*b),a(f.y*b),a(f.x*b)+1));for(var Q=["x","y","text","font","font-family","font-weight","font-style","font-size"],J=0,K=Q.length;K>J;J++)if(Q[J]in l){m._.dirty=1;break}switch(f["text-anchor"]){case"start":m.textpath.style["v-text-align"]="left",m.bbx=m.W/2;break;case"end":m.textpath.style["v-text-align"]="right",m.bbx=-m.W/2;break;default:m.textpath.style["v-text-align"]="center",m.bbx=0}m.textpath.style["v-text-kern"]=!0}},A=function(e,a,s){e.attrs=e.attrs||{};var o=e.attrs,l=Math.pow,h,u,c="linear",f=".5 .5";if(e.attrs.gradient=a,a=r(a).replace(t._radial_gradient,function(t,e,r){return c="radial",e&&r&&(e=i(e),r=i(r),l(e-.5,2)+l(r-.5,2)>.25&&(r=n.sqrt(.25-l(e-.5,2))*(2*(r>.5)-1)+.5),f=e+p+r),d}),a=a.split(/\s*\-\s*/),"linear"==c){var g=a.shift();if(g=-i(g),isNaN(g))return null}var x=t._parseDots(a);if(!x)return null;if(e=e.shape||e.node,x.length){e.removeChild(s),s.on=!0,s.method="none",s.color=x[0].color,s.color2=x[x.length-1].color;for(var v=[],y=0,m=x.length;m>y;y++)x[y].offset&&v.push(x[y].offset+p+x[y].color);s.colors=v.length?v.join():"0% "+s.color,"radial"==c?(s.type="gradientTitle",s.focus="100%",s.focussize="0 0",s.focusposition=f,s.angle=0):(s.type="gradient",s.angle=(270-g)%360),e.appendChild(s)}return 1},E=function(e,r){this[0]=this.node=e,e.raphael=!0,this.id=t._oid++,e.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=r,this.matrix=t.matrix(),this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!r.bottom&&(r.bottom=this),this.prev=r.top,r.top&&(r.top.next=this),r.top=this,this.next=null},N=t.el;E.prototype=N,N.constructor=E,N.transform=function(e){if(null==e)return this._.transform;var i=this.paper._viewBoxShift,n=i?"s"+[i.scale,i.scale]+"-1-1t"+[i.dx,i.dy]:d,a;i&&(a=e=r(e).replace(/\.{3}|\u2026/g,this._.transform||d)),t._extractTransform(this,n+e);var s=this.matrix.clone(),o=this.skew,l=this.node,h,u=~r(this.attrs.fill).indexOf("-"),c=!r(this.attrs.fill).indexOf("url(");if(s.translate(1,1),c||u||"image"==this.type)if(o.matrix="1 0 0 1",o.offset="0 0",h=s.split(),u&&h.noRotation||!h.isSimple){l.style.filter=s.toFilter();var f=this.getBBox(),g=this.getBBox(1),x=f.x-g.x,v=f.y-g.y;l.coordorigin=x*-b+p+v*-b,C(this,1,1,x,v,0)}else l.style.filter=d,C(this,h.scalex,h.scaley,h.dx,h.dy,h.rotate);else l.style.filter=d,o.matrix=r(s),o.offset=s.offset();return null!==a&&(this._.transform=a,t._extractTransform(this,a)),this},N.rotate=function(t,e,n){if(this.removed)return this;if(null!=t){if(t=r(t).split(u),t.length-1&&(e=i(t[1]),n=i(t[2])),t=i(t[0]),null==n&&(e=n),null==e||null==n){var a=this.getBBox(1);e=a.x+a.width/2,n=a.y+a.height/2}return this._.dirtyT=1,this.transform(this._.transform.concat([["r",t,e,n]])),this}},N.translate=function(t,e){return this.removed?this:(t=r(t).split(u),t.length-1&&(e=i(t[1])),t=i(t[0])||0,e=+e||0,this._.bbox&&(this._.bbox.x+=t,this._.bbox.y+=e),this.transform(this._.transform.concat([["t",t,e]])),this)},N.scale=function(t,e,n,a){if(this.removed)return this;if(t=r(t).split(u),t.length-1&&(e=i(t[1]),n=i(t[2]),a=i(t[3]),isNaN(n)&&(n=null),isNaN(a)&&(a=null)),t=i(t[0]),null==e&&(e=t),null==a&&(n=a),null==n||null==a)var s=this.getBBox(1);return n=null==n?s.x+s.width/2:n,a=null==a?s.y+s.height/2:a,this.transform(this._.transform.concat([["s",t,e,n,a]])),this._.dirtyT=1,this},N.hide=function(){return!this.removed&&(this.node.style.display="none"),this},N.show=function(){return!this.removed&&(this.node.style.display=d),this},N.auxGetBBox=t.el.getBBox,N.getBBox=function(){var t=this.auxGetBBox();if(this.paper&&this.paper._viewBoxShift){var e={},r=1/this.paper._viewBoxShift.scale;return e.x=t.x-this.paper._viewBoxShift.dx,e.x*=r,e.y=t.y-this.paper._viewBoxShift.dy,e.y*=r,e.width=t.width*r,e.height=t.height*r,e.x2=e.x+e.width,e.y2=e.y+e.height,e}return t},N._getBBox=function(){return this.removed?{}:{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}},N.remove=function(){if(!this.removed&&this.node.parentNode){this.paper.__set__&&this.paper.__set__.exclude(this),t.eve.unbind("raphael.*.*."+this.id),t._tear(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var e in this)this[e]="function"==typeof this[e]?t._removedFactory(e):null;this.removed=!0}},N.attr=function(r,i){if(this.removed)return this;if(null==r){var n={};for(var a in this.attrs)this.attrs[e](a)&&(n[a]=this.attrs[a]);return n.gradient&&"none"==n.fill&&(n.fill=n.gradient)&&delete n.gradient,n.transform=this._.transform,n}if(null==i&&t.is(r,"string")){if(r==h&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;for(var s=r.split(u),o={},l=0,f=s.length;f>l;l++)r=s[l],r in this.attrs?o[r]=this.attrs[r]:t.is(this.paper.customAttributes[r],"function")?o[r]=this.paper.customAttributes[r].def:o[r]=t._availableAttrs[r];return f-1?o:o[s[0]]}if(this.attrs&&null==i&&t.is(r,"array")){for(o={},l=0,f=r.length;f>l;l++)o[r[l]]=this.attr(r[l]);return o}var p;null!=i&&(p={},p[r]=i),null==i&&t.is(r,"object")&&(p=r);for(var d in p)c("raphael.attr."+d+"."+this.id,this,p[d]);if(p){for(d in this.paper.customAttributes)if(this.paper.customAttributes[e](d)&&p[e](d)&&t.is(this.paper.customAttributes[d],"function")){var g=this.paper.customAttributes[d].apply(this,[].concat(p[d]));this.attrs[d]=p[d];for(var x in g)g[e](x)&&(p[x]=g[x])}p.text&&"text"==this.type&&(this.textpath.string=p.text),T(this,p)}return this},N.toFront=function(){return!this.removed&&this.node.parentNode.appendChild(this.node),this.paper&&this.paper.top!=this&&t._tofront(this,this.paper),this},N.toBack=function(){return this.removed?this:(this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),t._toback(this,this.paper)),this)},N.insertAfter=function(e){return this.removed?this:(e.constructor==t.st.constructor&&(e=e[e.length-1]),e.node.nextSibling?e.node.parentNode.insertBefore(this.node,e.node.nextSibling):e.node.parentNode.appendChild(this.node),t._insertafter(this,e,this.paper),this)},N.insertBefore=function(e){return this.removed?this:(e.constructor==t.st.constructor&&(e=e[0]),e.node.parentNode.insertBefore(this.node,e.node),t._insertbefore(this,e,this.paper),this)},N.blur=function(e){var r=this.node.runtimeStyle,i=r.filter;return i=i.replace(v,d),0!==+e?(this.attrs.blur=e,r.filter=i+p+f+".Blur(pixelradius="+(+e||1.5)+")",r.margin=t.format("-{0}px 0 0 -{0}px",a(+e||1.5))):(r.filter=i,r.margin=0,delete this.attrs.blur),this},t._engine.path=function(t,e){var r=M("shape");r.style.cssText=m,r.coordsize=b+p+b,r.coordorigin=e.coordorigin;var i=new E(r,e),n={fill:"none",stroke:"#000"};t&&(n.path=t),i.type="path",i.path=[],i.Path=d,T(i,n),e.canvas&&e.canvas.appendChild(r);var a=M("skew");return a.on=!0,r.appendChild(a),i.skew=a,i.transform(d),i},t._engine.rect=function(e,r,i,n,a,s){var o=t._rectPath(r,i,n,a,s),l=e.path(o),h=l.attrs;return l.X=h.x=r,l.Y=h.y=i,l.W=h.width=n,l.H=h.height=a,h.r=s,h.path=o,l.type="rect",l},t._engine.ellipse=function(t,e,r,i,n){var a=t.path(),s=a.attrs;return a.X=e-i,a.Y=r-n,a.W=2*i,a.H=2*n,a.type="ellipse",T(a,{cx:e,cy:r,rx:i,ry:n}),a},t._engine.circle=function(t,e,r,i){var n=t.path(),a=n.attrs;return n.X=e-i,n.Y=r-i,n.W=n.H=2*i,n.type="circle",T(n,{cx:e,cy:r,r:i}),n},t._engine.image=function(e,r,i,n,a,s){var o=t._rectPath(i,n,a,s),l=e.path(o).attr({stroke:"none"}),u=l.attrs,c=l.node,f=c.getElementsByTagName(h)[0];return u.src=r,l.X=u.x=i,l.Y=u.y=n,l.W=u.width=a,l.H=u.height=s,u.path=o,l.type="image",f.parentNode==c&&c.removeChild(f),f.rotate=!0,f.src=r,f.type="tile",l._.fillpos=[i,n],l._.fillsize=[a,s],c.appendChild(f),C(l,1,1,0,0,0),l},t._engine.text=function(e,i,n,s){var o=M("shape"),l=M("path"),h=M("textpath");i=i||0,n=n||0,s=s||"",l.v=t.format("m{0},{1}l{2},{1}",a(i*b),a(n*b),a(i*b)+1),l.textpathok=!0,h.string=r(s),h.on=!0,o.style.cssText=m,o.coordsize=b+p+b,o.coordorigin="0 0";var u=new E(o,e),c={fill:"#000",stroke:"none",font:t._availableAttrs.font,text:s};u.shape=o,u.path=l,u.textpath=h,u.type="text",u.attrs.text=r(s),u.attrs.x=i,u.attrs.y=n,u.attrs.w=1,u.attrs.h=1,T(u,c),o.appendChild(h),o.appendChild(l),e.canvas.appendChild(o);var f=M("skew");return f.on=!0,o.appendChild(f),u.skew=f,u.transform(d),u},t._engine.setSize=function(e,r){var i=this.canvas.style;return this.width=e,this.height=r,e==+e&&(e+="px"),r==+r&&(r+="px"),i.width=e,i.height=r,i.clip="rect(0 "+e+" "+r+" 0)",this._viewBox&&t._engine.setViewBox.apply(this,this._viewBox),this},t._engine.setViewBox=function(e,r,i,n,a){t.eve("raphael.setViewBox",this,this._viewBox,[e,r,i,n,a]);var s=this.getSize(),o=s.width,l=s.height,h,u;return a&&(h=l/n,u=o/i,o>i*h&&(e-=(o-i*h)/2/h),l>n*u&&(r-=(l-n*u)/2/u)),this._viewBox=[e,r,i,n,!!a],this._viewBoxShift={dx:-e,dy:-r,scale:s},this.forEach(function(t){t.transform("...")}),this};var M;t._engine.initWin=function(t){var e=t.document;e.styleSheets.length<31?e.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)"):e.styleSheets[0].addRule(".rvml","behavior:url(#default#VML)");try{!e.namespaces.rvml&&e.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),M=function(t){return e.createElement("<rvml:"+t+' class="rvml">')}}catch(r){M=function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},t._engine.initWin(t._g.win),t._engine.create=function(){var e=t._getContainer.apply(0,arguments),r=e.container,i=e.height,n,a=e.width,s=e.x,o=e.y;if(!r)throw new Error("VML container not found.");var l=new t._Paper,h=l.canvas=t._g.doc.createElement("div"),u=h.style;return s=s||0,o=o||0,a=a||512,i=i||342,l.width=a,l.height=i,a==+a&&(a+="px"),i==+i&&(i+="px"),l.coordsize=1e3*b+p+1e3*b,l.coordorigin="0 0",l.span=t._g.doc.createElement("span"),l.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",h.appendChild(l.span),u.cssText=t.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",a,i),1==r?(t._g.doc.body.appendChild(h),u.left=s+"px",u.top=o+"px",u.position="absolute"):r.firstChild?r.insertBefore(h,r.firstChild):r.appendChild(h),l.renderfix=function(){},l},t.prototype.clear=function(){t.eve("raphael.clear",this),this.canvas.innerHTML=d,this.span=t._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},t.prototype.remove=function(){t.eve("raphael.remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var e in this)this[e]="function"==typeof this[e]?t._removedFactory(e):null;return!0};var L=t.st;for(var z in N)N[e](z)&&!L[e](z)&&(L[z]=function(t){return function(){var e=arguments;return this.forEach(function(r){r[t].apply(r,e)})}}(z))}}.apply(e,i),!(void 0!==n&&(t.exports=n))}])}); \ No newline at end of file diff --git a/public/bower_components/raphael/raphael.no-deps.js b/public/bower_components/raphael/raphael.no-deps.js new file mode 100755 index 0000000..db45503 --- /dev/null +++ b/public/bower_components/raphael/raphael.no-deps.js @@ -0,0 +1,7922 @@ +// ┌───────────────────────────────────────────────────────────────────────────────────────────────────────┐ \\ +// │ Raphaël 2.2.0 - JavaScript Vector Library │ \\ +// ├───────────────────────────────────────────────────────────────────────────────────────────────────────┤ \\ +// │ Copyright © 2008-2016 Dmitry Baranovskiy (http://raphaeljs.com) │ \\ +// │ Copyright © 2008-2016 Sencha Labs (http://sencha.com) │ \\ +// ├───────────────────────────────────────────────────────────────────────────────────────────────────────┤ \\ +// │ Licensed under the MIT (https://github.com/DmitryBaranovskiy/raphael/blob/master/license.txt) license.│ \\ +// └───────────────────────────────────────────────────────────────────────────────────────────────────────┘ \\ + +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(require("eve")); + else if(typeof define === 'function' && define.amd) + define(["eve"], factory); + else if(typeof exports === 'object') + exports["Raphael"] = factory(require("eve")); + else + root["Raphael"] = factory(root["eve"]); +})(this, function(__WEBPACK_EXTERNAL_MODULE_2__) { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; + +/******/ // The require function +/******/ function __webpack_require__(moduleId) { + +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; + +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; + +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); + +/******/ // Flag the module as loaded +/******/ module.loaded = true; + +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } + + +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; + +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; + +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; + +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(1), __webpack_require__(3), __webpack_require__(4)], __WEBPACK_AMD_DEFINE_RESULT__ = function(R) { + + return R; + + }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + +/***/ }, +/* 1 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(2)], __WEBPACK_AMD_DEFINE_RESULT__ = function(eve) { + + /*\ + * Raphael + [ method ] + ** + * Creates a canvas object on which to draw. + * You must do this first, as all future calls to drawing methods + * from this instance will be bound to this canvas. + > Parameters + ** + - container (HTMLElement|string) DOM element or its ID which is going to be a parent for drawing surface + - width (number) + - height (number) + - callback (function) #optional callback function which is going to be executed in the context of newly created paper + * or + - x (number) + - y (number) + - width (number) + - height (number) + - callback (function) #optional callback function which is going to be executed in the context of newly created paper + * or + - all (array) (first 3 or 4 elements in the array are equal to [containerID, width, height] or [x, y, width, height]. The rest are element descriptions in format {type: type, <attributes>}). See @Paper.add. + - callback (function) #optional callback function which is going to be executed in the context of newly created paper + * or + - onReadyCallback (function) function that is going to be called on DOM ready event. You can also subscribe to this event via Eve’s “DOMLoad” event. In this case method returns `undefined`. + = (object) @Paper + > Usage + | // Each of the following examples create a canvas + | // that is 320px wide by 200px high. + | // Canvas is created at the viewport’s 10,50 coordinate. + | var paper = Raphael(10, 50, 320, 200); + | // Canvas is created at the top left corner of the #notepad element + | // (or its top right corner in dir="rtl" elements) + | var paper = Raphael(document.getElementById("notepad"), 320, 200); + | // Same as above + | var paper = Raphael("notepad", 320, 200); + | // Image dump + | var set = Raphael(["notepad", 320, 200, { + | type: "rect", + | x: 10, + | y: 10, + | width: 25, + | height: 25, + | stroke: "#f00" + | }, { + | type: "text", + | x: 30, + | y: 40, + | text: "Dump" + | }]); + \*/ + function R(first) { + if (R.is(first, "function")) { + return loaded ? first() : eve.on("raphael.DOMload", first); + } else if (R.is(first, array)) { + return R._engine.create[apply](R, first.splice(0, 3 + R.is(first[0], nu))).add(first); + } else { + var args = Array.prototype.slice.call(arguments, 0); + if (R.is(args[args.length - 1], "function")) { + var f = args.pop(); + return loaded ? f.call(R._engine.create[apply](R, args)) : eve.on("raphael.DOMload", function () { + f.call(R._engine.create[apply](R, args)); + }); + } else { + return R._engine.create[apply](R, arguments); + } + } + } + R.version = "2.2.0"; + R.eve = eve; + var loaded, + separator = /[, ]+/, + elements = {circle: 1, rect: 1, path: 1, ellipse: 1, text: 1, image: 1}, + formatrg = /\{(\d+)\}/g, + proto = "prototype", + has = "hasOwnProperty", + g = { + doc: document, + win: window + }, + oldRaphael = { + was: Object.prototype[has].call(g.win, "Raphael"), + is: g.win.Raphael + }, + Paper = function () { + /*\ + * Paper.ca + [ property (object) ] + ** + * Shortcut for @Paper.customAttributes + \*/ + /*\ + * Paper.customAttributes + [ property (object) ] + ** + * If you have a set of attributes that you would like to represent + * as a function of some number you can do it easily with custom attributes: + > Usage + | paper.customAttributes.hue = function (num) { + | num = num % 1; + | return {fill: "hsb(" + num + ", 0.75, 1)"}; + | }; + | // Custom attribute “hue” will change fill + | // to be given hue with fixed saturation and brightness. + | // Now you can use it like this: + | var c = paper.circle(10, 10, 10).attr({hue: .45}); + | // or even like this: + | c.animate({hue: 1}, 1e3); + | + | // You could also create custom attribute + | // with multiple parameters: + | paper.customAttributes.hsb = function (h, s, b) { + | return {fill: "hsb(" + [h, s, b].join(",") + ")"}; + | }; + | c.attr({hsb: "0.5 .8 1"}); + | c.animate({hsb: [1, 0, 0.5]}, 1e3); + \*/ + this.ca = this.customAttributes = {}; + }, + paperproto, + appendChild = "appendChild", + apply = "apply", + concat = "concat", + supportsTouch = ('ontouchstart' in g.win) || g.win.DocumentTouch && g.doc instanceof DocumentTouch, //taken from Modernizr touch test + E = "", + S = " ", + Str = String, + split = "split", + events = "click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel"[split](S), + touchMap = { + mousedown: "touchstart", + mousemove: "touchmove", + mouseup: "touchend" + }, + lowerCase = Str.prototype.toLowerCase, + math = Math, + mmax = math.max, + mmin = math.min, + abs = math.abs, + pow = math.pow, + PI = math.PI, + nu = "number", + string = "string", + array = "array", + toString = "toString", + fillString = "fill", + objectToString = Object.prototype.toString, + paper = {}, + push = "push", + ISURL = R._ISURL = /^url\(['"]?(.+?)['"]?\)$/i, + colourRegExp = /^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i, + isnan = {"NaN": 1, "Infinity": 1, "-Infinity": 1}, + bezierrg = /^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/, + round = math.round, + setAttribute = "setAttribute", + toFloat = parseFloat, + toInt = parseInt, + upperCase = Str.prototype.toUpperCase, + availableAttrs = R._availableAttrs = { + "arrow-end": "none", + "arrow-start": "none", + blur: 0, + "clip-rect": "0 0 1e9 1e9", + cursor: "default", + cx: 0, + cy: 0, + fill: "#fff", + "fill-opacity": 1, + font: '10px "Arial"', + "font-family": '"Arial"', + "font-size": "10", + "font-style": "normal", + "font-weight": 400, + gradient: 0, + height: 0, + href: "http://raphaeljs.com/", + "letter-spacing": 0, + opacity: 1, + path: "M0,0", + r: 0, + rx: 0, + ry: 0, + src: "", + stroke: "#000", + "stroke-dasharray": "", + "stroke-linecap": "butt", + "stroke-linejoin": "butt", + "stroke-miterlimit": 0, + "stroke-opacity": 1, + "stroke-width": 1, + target: "_blank", + "text-anchor": "middle", + title: "Raphael", + transform: "", + width: 0, + x: 0, + y: 0, + class: "" + }, + availableAnimAttrs = R._availableAnimAttrs = { + blur: nu, + "clip-rect": "csv", + cx: nu, + cy: nu, + fill: "colour", + "fill-opacity": nu, + "font-size": nu, + height: nu, + opacity: nu, + path: "path", + r: nu, + rx: nu, + ry: nu, + stroke: "colour", + "stroke-opacity": nu, + "stroke-width": nu, + transform: "transform", + width: nu, + x: nu, + y: nu + }, + whitespace = /[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]/g, + commaSpaces = /[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/, + hsrg = {hs: 1, rg: 1}, + p2s = /,?([achlmqrstvxz]),?/gi, + pathCommand = /([achlmrqstvz])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/ig, + tCommand = /([rstm])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/ig, + pathValues = /(-?\d*\.?\d*(?:e[\-+]?\d+)?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/ig, + radial_gradient = R._radial_gradient = /^r(?:\(([^,]+?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*([^\)]+?)\))?/, + eldata = {}, + sortByKey = function (a, b) { + return a.key - b.key; + }, + sortByNumber = function (a, b) { + return toFloat(a) - toFloat(b); + }, + fun = function () {}, + pipe = function (x) { + return x; + }, + rectPath = R._rectPath = function (x, y, w, h, r) { + if (r) { + return [["M", x + r, y], ["l", w - r * 2, 0], ["a", r, r, 0, 0, 1, r, r], ["l", 0, h - r * 2], ["a", r, r, 0, 0, 1, -r, r], ["l", r * 2 - w, 0], ["a", r, r, 0, 0, 1, -r, -r], ["l", 0, r * 2 - h], ["a", r, r, 0, 0, 1, r, -r], ["z"]]; + } + return [["M", x, y], ["l", w, 0], ["l", 0, h], ["l", -w, 0], ["z"]]; + }, + ellipsePath = function (x, y, rx, ry) { + if (ry == null) { + ry = rx; + } + return [["M", x, y], ["m", 0, -ry], ["a", rx, ry, 0, 1, 1, 0, 2 * ry], ["a", rx, ry, 0, 1, 1, 0, -2 * ry], ["z"]]; + }, + getPath = R._getPath = { + path: function (el) { + return el.attr("path"); + }, + circle: function (el) { + var a = el.attrs; + return ellipsePath(a.cx, a.cy, a.r); + }, + ellipse: function (el) { + var a = el.attrs; + return ellipsePath(a.cx, a.cy, a.rx, a.ry); + }, + rect: function (el) { + var a = el.attrs; + return rectPath(a.x, a.y, a.width, a.height, a.r); + }, + image: function (el) { + var a = el.attrs; + return rectPath(a.x, a.y, a.width, a.height); + }, + text: function (el) { + var bbox = el._getBBox(); + return rectPath(bbox.x, bbox.y, bbox.width, bbox.height); + }, + set : function(el) { + var bbox = el._getBBox(); + return rectPath(bbox.x, bbox.y, bbox.width, bbox.height); + } + }, + /*\ + * Raphael.mapPath + [ method ] + ** + * Transform the path string with given matrix. + > Parameters + - path (string) path string + - matrix (object) see @Matrix + = (string) transformed path string + \*/ + mapPath = R.mapPath = function (path, matrix) { + if (!matrix) { + return path; + } + var x, y, i, j, ii, jj, pathi; + path = path2curve(path); + for (i = 0, ii = path.length; i < ii; i++) { + pathi = path[i]; + for (j = 1, jj = pathi.length; j < jj; j += 2) { + x = matrix.x(pathi[j], pathi[j + 1]); + y = matrix.y(pathi[j], pathi[j + 1]); + pathi[j] = x; + pathi[j + 1] = y; + } + } + return path; + }; + + R._g = g; + /*\ + * Raphael.type + [ property (string) ] + ** + * Can be “SVG”, “VML” or empty, depending on browser support. + \*/ + R.type = (g.win.SVGAngle || g.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") ? "SVG" : "VML"); + if (R.type == "VML") { + var d = g.doc.createElement("div"), + b; + d.innerHTML = '<v:shape adj="1"/>'; + b = d.firstChild; + b.style.behavior = "url(#default#VML)"; + if (!(b && typeof b.adj == "object")) { + return (R.type = E); + } + d = null; + } + /*\ + * Raphael.svg + [ property (boolean) ] + ** + * `true` if browser supports SVG. + \*/ + /*\ + * Raphael.vml + [ property (boolean) ] + ** + * `true` if browser supports VML. + \*/ + R.svg = !(R.vml = R.type == "VML"); + R._Paper = Paper; + /*\ + * Raphael.fn + [ property (object) ] + ** + * You can add your own method to the canvas. For example if you want to draw a pie chart, + * you can create your own pie chart function and ship it as a Raphaël plugin. To do this + * you need to extend the `Raphael.fn` object. You should modify the `fn` object before a + * Raphaël instance is created, otherwise it will take no effect. Please note that the + * ability for namespaced plugins was removed in Raphael 2.0. It is up to the plugin to + * ensure any namespacing ensures proper context. + > Usage + | Raphael.fn.arrow = function (x1, y1, x2, y2, size) { + | return this.path( ... ); + | }; + | // or create namespace + | Raphael.fn.mystuff = { + | arrow: function () {…}, + | star: function () {…}, + | // etc… + | }; + | var paper = Raphael(10, 10, 630, 480); + | // then use it + | paper.arrow(10, 10, 30, 30, 5).attr({fill: "#f00"}); + | paper.mystuff.arrow(); + | paper.mystuff.star(); + \*/ + R.fn = paperproto = Paper.prototype = R.prototype; + R._id = 0; + R._oid = 0; + /*\ + * Raphael.is + [ method ] + ** + * Handful of replacements for `typeof` operator. + > Parameters + - o (…) any object or primitive + - type (string) name of the type, i.e. “string”, “function”, “number”, etc. + = (boolean) is given value is of given type + \*/ + R.is = function (o, type) { + type = lowerCase.call(type); + if (type == "finite") { + return !isnan[has](+o); + } + if (type == "array") { + return o instanceof Array; + } + return (type == "null" && o === null) || + (type == typeof o && o !== null) || + (type == "object" && o === Object(o)) || + (type == "array" && Array.isArray && Array.isArray(o)) || + objectToString.call(o).slice(8, -1).toLowerCase() == type; + }; + + function clone(obj) { + if (typeof obj == "function" || Object(obj) !== obj) { + return obj; + } + var res = new obj.constructor; + for (var key in obj) if (obj[has](key)) { + res[key] = clone(obj[key]); + } + return res; + } + + /*\ + * Raphael.angle + [ method ] + ** + * Returns angle between two or three points + > Parameters + - x1 (number) x coord of first point + - y1 (number) y coord of first point + - x2 (number) x coord of second point + - y2 (number) y coord of second point + - x3 (number) #optional x coord of third point + - y3 (number) #optional y coord of third point + = (number) angle in degrees. + \*/ + R.angle = function (x1, y1, x2, y2, x3, y3) { + if (x3 == null) { + var x = x1 - x2, + y = y1 - y2; + if (!x && !y) { + return 0; + } + return (180 + math.atan2(-y, -x) * 180 / PI + 360) % 360; + } else { + return R.angle(x1, y1, x3, y3) - R.angle(x2, y2, x3, y3); + } + }; + /*\ + * Raphael.rad + [ method ] + ** + * Transform angle to radians + > Parameters + - deg (number) angle in degrees + = (number) angle in radians. + \*/ + R.rad = function (deg) { + return deg % 360 * PI / 180; + }; + /*\ + * Raphael.deg + [ method ] + ** + * Transform angle to degrees + > Parameters + - rad (number) angle in radians + = (number) angle in degrees. + \*/ + R.deg = function (rad) { + return Math.round ((rad * 180 / PI% 360)* 1000) / 1000; + }; + /*\ + * Raphael.snapTo + [ method ] + ** + * Snaps given value to given grid. + > Parameters + - values (array|number) given array of values or step of the grid + - value (number) value to adjust + - tolerance (number) #optional tolerance for snapping. Default is `10`. + = (number) adjusted value. + \*/ + R.snapTo = function (values, value, tolerance) { + tolerance = R.is(tolerance, "finite") ? tolerance : 10; + if (R.is(values, array)) { + var i = values.length; + while (i--) if (abs(values[i] - value) <= tolerance) { + return values[i]; + } + } else { + values = +values; + var rem = value % values; + if (rem < tolerance) { + return value - rem; + } + if (rem > values - tolerance) { + return value - rem + values; + } + } + return value; + }; + + /*\ + * Raphael.createUUID + [ method ] + ** + * Returns RFC4122, version 4 ID + \*/ + var createUUID = R.createUUID = (function (uuidRegEx, uuidReplacer) { + return function () { + return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(uuidRegEx, uuidReplacer).toUpperCase(); + }; + })(/[xy]/g, function (c) { + var r = math.random() * 16 | 0, + v = c == "x" ? r : (r & 3 | 8); + return v.toString(16); + }); + + /*\ + * Raphael.setWindow + [ method ] + ** + * Used when you need to draw in `<iframe>`. Switched window to the iframe one. + > Parameters + - newwin (window) new window object + \*/ + R.setWindow = function (newwin) { + eve("raphael.setWindow", R, g.win, newwin); + g.win = newwin; + g.doc = g.win.document; + if (R._engine.initWin) { + R._engine.initWin(g.win); + } + }; + var toHex = function (color) { + if (R.vml) { + // http://dean.edwards.name/weblog/2009/10/convert-any-colour-value-to-hex-in-msie/ + var trim = /^\s+|\s+$/g; + var bod; + try { + var docum = new ActiveXObject("htmlfile"); + docum.write("<body>"); + docum.close(); + bod = docum.body; + } catch(e) { + bod = createPopup().document.body; + } + var range = bod.createTextRange(); + toHex = cacher(function (color) { + try { + bod.style.color = Str(color).replace(trim, E); + var value = range.queryCommandValue("ForeColor"); + value = ((value & 255) << 16) | (value & 65280) | ((value & 16711680) >>> 16); + return "#" + ("000000" + value.toString(16)).slice(-6); + } catch(e) { + return "none"; + } + }); + } else { + var i = g.doc.createElement("i"); + i.title = "Rapha\xebl Colour Picker"; + i.style.display = "none"; + g.doc.body.appendChild(i); + toHex = cacher(function (color) { + i.style.color = color; + return g.doc.defaultView.getComputedStyle(i, E).getPropertyValue("color"); + }); + } + return toHex(color); + }, + hsbtoString = function () { + return "hsb(" + [this.h, this.s, this.b] + ")"; + }, + hsltoString = function () { + return "hsl(" + [this.h, this.s, this.l] + ")"; + }, + rgbtoString = function () { + return this.hex; + }, + prepareRGB = function (r, g, b) { + if (g == null && R.is(r, "object") && "r" in r && "g" in r && "b" in r) { + b = r.b; + g = r.g; + r = r.r; + } + if (g == null && R.is(r, string)) { + var clr = R.getRGB(r); + r = clr.r; + g = clr.g; + b = clr.b; + } + if (r > 1 || g > 1 || b > 1) { + r /= 255; + g /= 255; + b /= 255; + } + + return [r, g, b]; + }, + packageRGB = function (r, g, b, o) { + r *= 255; + g *= 255; + b *= 255; + var rgb = { + r: r, + g: g, + b: b, + hex: R.rgb(r, g, b), + toString: rgbtoString + }; + R.is(o, "finite") && (rgb.opacity = o); + return rgb; + }; + + /*\ + * Raphael.color + [ method ] + ** + * Parses the color string and returns object with all values for the given color. + > Parameters + - clr (string) color string in one of the supported formats (see @Raphael.getRGB) + = (object) Combined RGB & HSB object in format: + o { + o r (number) red, + o g (number) green, + o b (number) blue, + o hex (string) color in HTML/CSS format: #••••••, + o error (boolean) `true` if string can’t be parsed, + o h (number) hue, + o s (number) saturation, + o v (number) value (brightness), + o l (number) lightness + o } + \*/ + R.color = function (clr) { + var rgb; + if (R.is(clr, "object") && "h" in clr && "s" in clr && "b" in clr) { + rgb = R.hsb2rgb(clr); + clr.r = rgb.r; + clr.g = rgb.g; + clr.b = rgb.b; + clr.hex = rgb.hex; + } else if (R.is(clr, "object") && "h" in clr && "s" in clr && "l" in clr) { + rgb = R.hsl2rgb(clr); + clr.r = rgb.r; + clr.g = rgb.g; + clr.b = rgb.b; + clr.hex = rgb.hex; + } else { + if (R.is(clr, "string")) { + clr = R.getRGB(clr); + } + if (R.is(clr, "object") && "r" in clr && "g" in clr && "b" in clr) { + rgb = R.rgb2hsl(clr); + clr.h = rgb.h; + clr.s = rgb.s; + clr.l = rgb.l; + rgb = R.rgb2hsb(clr); + clr.v = rgb.b; + } else { + clr = {hex: "none"}; + clr.r = clr.g = clr.b = clr.h = clr.s = clr.v = clr.l = -1; + } + } + clr.toString = rgbtoString; + return clr; + }; + /*\ + * Raphael.hsb2rgb + [ method ] + ** + * Converts HSB values to RGB object. + > Parameters + - h (number) hue + - s (number) saturation + - v (number) value or brightness + = (object) RGB object in format: + o { + o r (number) red, + o g (number) green, + o b (number) blue, + o hex (string) color in HTML/CSS format: #•••••• + o } + \*/ + R.hsb2rgb = function (h, s, v, o) { + if (this.is(h, "object") && "h" in h && "s" in h && "b" in h) { + v = h.b; + s = h.s; + o = h.o; + h = h.h; + } + h *= 360; + var R, G, B, X, C; + h = (h % 360) / 60; + C = v * s; + X = C * (1 - abs(h % 2 - 1)); + R = G = B = v - C; + + h = ~~h; + R += [C, X, 0, 0, X, C][h]; + G += [X, C, C, X, 0, 0][h]; + B += [0, 0, X, C, C, X][h]; + return packageRGB(R, G, B, o); + }; + /*\ + * Raphael.hsl2rgb + [ method ] + ** + * Converts HSL values to RGB object. + > Parameters + - h (number) hue + - s (number) saturation + - l (number) luminosity + = (object) RGB object in format: + o { + o r (number) red, + o g (number) green, + o b (number) blue, + o hex (string) color in HTML/CSS format: #•••••• + o } + \*/ + R.hsl2rgb = function (h, s, l, o) { + if (this.is(h, "object") && "h" in h && "s" in h && "l" in h) { + l = h.l; + s = h.s; + h = h.h; + } + if (h > 1 || s > 1 || l > 1) { + h /= 360; + s /= 100; + l /= 100; + } + h *= 360; + var R, G, B, X, C; + h = (h % 360) / 60; + C = 2 * s * (l < .5 ? l : 1 - l); + X = C * (1 - abs(h % 2 - 1)); + R = G = B = l - C / 2; + + h = ~~h; + R += [C, X, 0, 0, X, C][h]; + G += [X, C, C, X, 0, 0][h]; + B += [0, 0, X, C, C, X][h]; + return packageRGB(R, G, B, o); + }; + /*\ + * Raphael.rgb2hsb + [ method ] + ** + * Converts RGB values to HSB object. + > Parameters + - r (number) red + - g (number) green + - b (number) blue + = (object) HSB object in format: + o { + o h (number) hue + o s (number) saturation + o b (number) brightness + o } + \*/ + R.rgb2hsb = function (r, g, b) { + b = prepareRGB(r, g, b); + r = b[0]; + g = b[1]; + b = b[2]; + + var H, S, V, C; + V = mmax(r, g, b); + C = V - mmin(r, g, b); + H = (C == 0 ? null : + V == r ? (g - b) / C : + V == g ? (b - r) / C + 2 : + (r - g) / C + 4 + ); + H = ((H + 360) % 6) * 60 / 360; + S = C == 0 ? 0 : C / V; + return {h: H, s: S, b: V, toString: hsbtoString}; + }; + /*\ + * Raphael.rgb2hsl + [ method ] + ** + * Converts RGB values to HSL object. + > Parameters + - r (number) red + - g (number) green + - b (number) blue + = (object) HSL object in format: + o { + o h (number) hue + o s (number) saturation + o l (number) luminosity + o } + \*/ + R.rgb2hsl = function (r, g, b) { + b = prepareRGB(r, g, b); + r = b[0]; + g = b[1]; + b = b[2]; + + var H, S, L, M, m, C; + M = mmax(r, g, b); + m = mmin(r, g, b); + C = M - m; + H = (C == 0 ? null : + M == r ? (g - b) / C : + M == g ? (b - r) / C + 2 : + (r - g) / C + 4); + H = ((H + 360) % 6) * 60 / 360; + L = (M + m) / 2; + S = (C == 0 ? 0 : + L < .5 ? C / (2 * L) : + C / (2 - 2 * L)); + return {h: H, s: S, l: L, toString: hsltoString}; + }; + R._path2string = function () { + return this.join(",").replace(p2s, "$1"); + }; + function repush(array, item) { + for (var i = 0, ii = array.length; i < ii; i++) if (array[i] === item) { + return array.push(array.splice(i, 1)[0]); + } + } + function cacher(f, scope, postprocessor) { + function newf() { + var arg = Array.prototype.slice.call(arguments, 0), + args = arg.join("\u2400"), + cache = newf.cache = newf.cache || {}, + count = newf.count = newf.count || []; + if (cache[has](args)) { + repush(count, args); + return postprocessor ? postprocessor(cache[args]) : cache[args]; + } + count.length >= 1e3 && delete cache[count.shift()]; + count.push(args); + cache[args] = f[apply](scope, arg); + return postprocessor ? postprocessor(cache[args]) : cache[args]; + } + return newf; + } + + var preload = R._preload = function (src, f) { + var img = g.doc.createElement("img"); + img.style.cssText = "position:absolute;left:-9999em;top:-9999em"; + img.onload = function () { + f.call(this); + this.onload = null; + g.doc.body.removeChild(this); + }; + img.onerror = function () { + g.doc.body.removeChild(this); + }; + g.doc.body.appendChild(img); + img.src = src; + }; + + function clrToString() { + return this.hex; + } + + /*\ + * Raphael.getRGB + [ method ] + ** + * Parses colour string as RGB object + > Parameters + - colour (string) colour string in one of formats: + # <ul> + # <li>Colour name (“<code>red</code>”, “<code>green</code>”, “<code>cornflowerblue</code>”, etc)</li> + # <li>#••• — shortened HTML colour: (“<code>#000</code>”, “<code>#fc0</code>”, etc)</li> + # <li>#•••••• — full length HTML colour: (“<code>#000000</code>”, “<code>#bd2300</code>”)</li> + # <li>rgb(•••, •••, •••) — red, green and blue channels’ values: (“<code>rgb(200, 100, 0)</code>”)</li> + # <li>rgb(•••%, •••%, •••%) — same as above, but in %: (“<code>rgb(100%, 175%, 0%)</code>”)</li> + # <li>hsb(•••, •••, •••) — hue, saturation and brightness values: (“<code>hsb(0.5, 0.25, 1)</code>”)</li> + # <li>hsb(•••%, •••%, •••%) — same as above, but in %</li> + # <li>hsl(•••, •••, •••) — same as hsb</li> + # <li>hsl(•••%, •••%, •••%) — same as hsb</li> + # </ul> + = (object) RGB object in format: + o { + o r (number) red, + o g (number) green, + o b (number) blue + o hex (string) color in HTML/CSS format: #••••••, + o error (boolean) true if string can’t be parsed + o } + \*/ + R.getRGB = cacher(function (colour) { + if (!colour || !!((colour = Str(colour)).indexOf("-") + 1)) { + return {r: -1, g: -1, b: -1, hex: "none", error: 1, toString: clrToString}; + } + if (colour == "none") { + return {r: -1, g: -1, b: -1, hex: "none", toString: clrToString}; + } + !(hsrg[has](colour.toLowerCase().substring(0, 2)) || colour.charAt() == "#") && (colour = toHex(colour)); + var res, + red, + green, + blue, + opacity, + t, + values, + rgb = colour.match(colourRegExp); + if (rgb) { + if (rgb[2]) { + blue = toInt(rgb[2].substring(5), 16); + green = toInt(rgb[2].substring(3, 5), 16); + red = toInt(rgb[2].substring(1, 3), 16); + } + if (rgb[3]) { + blue = toInt((t = rgb[3].charAt(3)) + t, 16); + green = toInt((t = rgb[3].charAt(2)) + t, 16); + red = toInt((t = rgb[3].charAt(1)) + t, 16); + } + if (rgb[4]) { + values = rgb[4][split](commaSpaces); + red = toFloat(values[0]); + values[0].slice(-1) == "%" && (red *= 2.55); + green = toFloat(values[1]); + values[1].slice(-1) == "%" && (green *= 2.55); + blue = toFloat(values[2]); + values[2].slice(-1) == "%" && (blue *= 2.55); + rgb[1].toLowerCase().slice(0, 4) == "rgba" && (opacity = toFloat(values[3])); + values[3] && values[3].slice(-1) == "%" && (opacity /= 100); + } + if (rgb[5]) { + values = rgb[5][split](commaSpaces); + red = toFloat(values[0]); + values[0].slice(-1) == "%" && (red *= 2.55); + green = toFloat(values[1]); + values[1].slice(-1) == "%" && (green *= 2.55); + blue = toFloat(values[2]); + values[2].slice(-1) == "%" && (blue *= 2.55); + (values[0].slice(-3) == "deg" || values[0].slice(-1) == "\xb0") && (red /= 360); + rgb[1].toLowerCase().slice(0, 4) == "hsba" && (opacity = toFloat(values[3])); + values[3] && values[3].slice(-1) == "%" && (opacity /= 100); + return R.hsb2rgb(red, green, blue, opacity); + } + if (rgb[6]) { + values = rgb[6][split](commaSpaces); + red = toFloat(values[0]); + values[0].slice(-1) == "%" && (red *= 2.55); + green = toFloat(values[1]); + values[1].slice(-1) == "%" && (green *= 2.55); + blue = toFloat(values[2]); + values[2].slice(-1) == "%" && (blue *= 2.55); + (values[0].slice(-3) == "deg" || values[0].slice(-1) == "\xb0") && (red /= 360); + rgb[1].toLowerCase().slice(0, 4) == "hsla" && (opacity = toFloat(values[3])); + values[3] && values[3].slice(-1) == "%" && (opacity /= 100); + return R.hsl2rgb(red, green, blue, opacity); + } + rgb = {r: red, g: green, b: blue, toString: clrToString}; + rgb.hex = "#" + (16777216 | blue | (green << 8) | (red << 16)).toString(16).slice(1); + R.is(opacity, "finite") && (rgb.opacity = opacity); + return rgb; + } + return {r: -1, g: -1, b: -1, hex: "none", error: 1, toString: clrToString}; + }, R); + /*\ + * Raphael.hsb + [ method ] + ** + * Converts HSB values to hex representation of the colour. + > Parameters + - h (number) hue + - s (number) saturation + - b (number) value or brightness + = (string) hex representation of the colour. + \*/ + R.hsb = cacher(function (h, s, b) { + return R.hsb2rgb(h, s, b).hex; + }); + /*\ + * Raphael.hsl + [ method ] + ** + * Converts HSL values to hex representation of the colour. + > Parameters + - h (number) hue + - s (number) saturation + - l (number) luminosity + = (string) hex representation of the colour. + \*/ + R.hsl = cacher(function (h, s, l) { + return R.hsl2rgb(h, s, l).hex; + }); + /*\ + * Raphael.rgb + [ method ] + ** + * Converts RGB values to hex representation of the colour. + > Parameters + - r (number) red + - g (number) green + - b (number) blue + = (string) hex representation of the colour. + \*/ + R.rgb = cacher(function (r, g, b) { + function round(x) { return (x + 0.5) | 0; } + return "#" + (16777216 | round(b) | (round(g) << 8) | (round(r) << 16)).toString(16).slice(1); + }); + /*\ + * Raphael.getColor + [ method ] + ** + * On each call returns next colour in the spectrum. To reset it back to red call @Raphael.getColor.reset + > Parameters + - value (number) #optional brightness, default is `0.75` + = (string) hex representation of the colour. + \*/ + R.getColor = function (value) { + var start = this.getColor.start = this.getColor.start || {h: 0, s: 1, b: value || .75}, + rgb = this.hsb2rgb(start.h, start.s, start.b); + start.h += .075; + if (start.h > 1) { + start.h = 0; + start.s -= .2; + start.s <= 0 && (this.getColor.start = {h: 0, s: 1, b: start.b}); + } + return rgb.hex; + }; + /*\ + * Raphael.getColor.reset + [ method ] + ** + * Resets spectrum position for @Raphael.getColor back to red. + \*/ + R.getColor.reset = function () { + delete this.start; + }; + + // http://schepers.cc/getting-to-the-point + function catmullRom2bezier(crp, z) { + var d = []; + for (var i = 0, iLen = crp.length; iLen - 2 * !z > i; i += 2) { + var p = [ + {x: +crp[i - 2], y: +crp[i - 1]}, + {x: +crp[i], y: +crp[i + 1]}, + {x: +crp[i + 2], y: +crp[i + 3]}, + {x: +crp[i + 4], y: +crp[i + 5]} + ]; + if (z) { + if (!i) { + p[0] = {x: +crp[iLen - 2], y: +crp[iLen - 1]}; + } else if (iLen - 4 == i) { + p[3] = {x: +crp[0], y: +crp[1]}; + } else if (iLen - 2 == i) { + p[2] = {x: +crp[0], y: +crp[1]}; + p[3] = {x: +crp[2], y: +crp[3]}; + } + } else { + if (iLen - 4 == i) { + p[3] = p[2]; + } else if (!i) { + p[0] = {x: +crp[i], y: +crp[i + 1]}; + } + } + d.push(["C", + (-p[0].x + 6 * p[1].x + p[2].x) / 6, + (-p[0].y + 6 * p[1].y + p[2].y) / 6, + (p[1].x + 6 * p[2].x - p[3].x) / 6, + (p[1].y + 6*p[2].y - p[3].y) / 6, + p[2].x, + p[2].y + ]); + } + + return d; + } + /*\ + * Raphael.parsePathString + [ method ] + ** + * Utility method + ** + * Parses given path string into an array of arrays of path segments. + > Parameters + - pathString (string|array) path string or array of segments (in the last case it will be returned straight away) + = (array) array of segments. + \*/ + R.parsePathString = function (pathString) { + if (!pathString) { + return null; + } + var pth = paths(pathString); + if (pth.arr) { + return pathClone(pth.arr); + } + + var paramCounts = {a: 7, c: 6, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, z: 0}, + data = []; + if (R.is(pathString, array) && R.is(pathString[0], array)) { // rough assumption + data = pathClone(pathString); + } + if (!data.length) { + Str(pathString).replace(pathCommand, function (a, b, c) { + var params = [], + name = b.toLowerCase(); + c.replace(pathValues, function (a, b) { + b && params.push(+b); + }); + if (name == "m" && params.length > 2) { + data.push([b][concat](params.splice(0, 2))); + name = "l"; + b = b == "m" ? "l" : "L"; + } + if (name == "r") { + data.push([b][concat](params)); + } else while (params.length >= paramCounts[name]) { + data.push([b][concat](params.splice(0, paramCounts[name]))); + if (!paramCounts[name]) { + break; + } + } + }); + } + data.toString = R._path2string; + pth.arr = pathClone(data); + return data; + }; + /*\ + * Raphael.parseTransformString + [ method ] + ** + * Utility method + ** + * Parses given path string into an array of transformations. + > Parameters + - TString (string|array) transform string or array of transformations (in the last case it will be returned straight away) + = (array) array of transformations. + \*/ + R.parseTransformString = cacher(function (TString) { + if (!TString) { + return null; + } + var paramCounts = {r: 3, s: 4, t: 2, m: 6}, + data = []; + if (R.is(TString, array) && R.is(TString[0], array)) { // rough assumption + data = pathClone(TString); + } + if (!data.length) { + Str(TString).replace(tCommand, function (a, b, c) { + var params = [], + name = lowerCase.call(b); + c.replace(pathValues, function (a, b) { + b && params.push(+b); + }); + data.push([b][concat](params)); + }); + } + data.toString = R._path2string; + return data; + }); + // PATHS + var paths = function (ps) { + var p = paths.ps = paths.ps || {}; + if (p[ps]) { + p[ps].sleep = 100; + } else { + p[ps] = { + sleep: 100 + }; + } + setTimeout(function () { + for (var key in p) if (p[has](key) && key != ps) { + p[key].sleep--; + !p[key].sleep && delete p[key]; + } + }); + return p[ps]; + }; + /*\ + * Raphael.findDotsAtSegment + [ method ] + ** + * Utility method + ** + * Find dot coordinates on the given cubic bezier curve at the given t. + > Parameters + - p1x (number) x of the first point of the curve + - p1y (number) y of the first point of the curve + - c1x (number) x of the first anchor of the curve + - c1y (number) y of the first anchor of the curve + - c2x (number) x of the second anchor of the curve + - c2y (number) y of the second anchor of the curve + - p2x (number) x of the second point of the curve + - p2y (number) y of the second point of the curve + - t (number) position on the curve (0..1) + = (object) point information in format: + o { + o x: (number) x coordinate of the point + o y: (number) y coordinate of the point + o m: { + o x: (number) x coordinate of the left anchor + o y: (number) y coordinate of the left anchor + o } + o n: { + o x: (number) x coordinate of the right anchor + o y: (number) y coordinate of the right anchor + o } + o start: { + o x: (number) x coordinate of the start of the curve + o y: (number) y coordinate of the start of the curve + o } + o end: { + o x: (number) x coordinate of the end of the curve + o y: (number) y coordinate of the end of the curve + o } + o alpha: (number) angle of the curve derivative at the point + o } + \*/ + R.findDotsAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) { + var t1 = 1 - t, + t13 = pow(t1, 3), + t12 = pow(t1, 2), + t2 = t * t, + t3 = t2 * t, + x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x, + y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y, + mx = p1x + 2 * t * (c1x - p1x) + t2 * (c2x - 2 * c1x + p1x), + my = p1y + 2 * t * (c1y - p1y) + t2 * (c2y - 2 * c1y + p1y), + nx = c1x + 2 * t * (c2x - c1x) + t2 * (p2x - 2 * c2x + c1x), + ny = c1y + 2 * t * (c2y - c1y) + t2 * (p2y - 2 * c2y + c1y), + ax = t1 * p1x + t * c1x, + ay = t1 * p1y + t * c1y, + cx = t1 * c2x + t * p2x, + cy = t1 * c2y + t * p2y, + alpha = (90 - math.atan2(mx - nx, my - ny) * 180 / PI); + (mx > nx || my < ny) && (alpha += 180); + return { + x: x, + y: y, + m: {x: mx, y: my}, + n: {x: nx, y: ny}, + start: {x: ax, y: ay}, + end: {x: cx, y: cy}, + alpha: alpha + }; + }; + /*\ + * Raphael.bezierBBox + [ method ] + ** + * Utility method + ** + * Return bounding box of a given cubic bezier curve + > Parameters + - p1x (number) x of the first point of the curve + - p1y (number) y of the first point of the curve + - c1x (number) x of the first anchor of the curve + - c1y (number) y of the first anchor of the curve + - c2x (number) x of the second anchor of the curve + - c2y (number) y of the second anchor of the curve + - p2x (number) x of the second point of the curve + - p2y (number) y of the second point of the curve + * or + - bez (array) array of six points for bezier curve + = (object) point information in format: + o { + o min: { + o x: (number) x coordinate of the left point + o y: (number) y coordinate of the top point + o } + o max: { + o x: (number) x coordinate of the right point + o y: (number) y coordinate of the bottom point + o } + o } + \*/ + R.bezierBBox = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) { + if (!R.is(p1x, "array")) { + p1x = [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y]; + } + var bbox = curveDim.apply(null, p1x); + return { + x: bbox.min.x, + y: bbox.min.y, + x2: bbox.max.x, + y2: bbox.max.y, + width: bbox.max.x - bbox.min.x, + height: bbox.max.y - bbox.min.y + }; + }; + /*\ + * Raphael.isPointInsideBBox + [ method ] + ** + * Utility method + ** + * Returns `true` if given point is inside bounding boxes. + > Parameters + - bbox (string) bounding box + - x (string) x coordinate of the point + - y (string) y coordinate of the point + = (boolean) `true` if point inside + \*/ + R.isPointInsideBBox = function (bbox, x, y) { + return x >= bbox.x && x <= bbox.x2 && y >= bbox.y && y <= bbox.y2; + }; + /*\ + * Raphael.isBBoxIntersect + [ method ] + ** + * Utility method + ** + * Returns `true` if two bounding boxes intersect + > Parameters + - bbox1 (string) first bounding box + - bbox2 (string) second bounding box + = (boolean) `true` if they intersect + \*/ + R.isBBoxIntersect = function (bbox1, bbox2) { + var i = R.isPointInsideBBox; + return i(bbox2, bbox1.x, bbox1.y) + || i(bbox2, bbox1.x2, bbox1.y) + || i(bbox2, bbox1.x, bbox1.y2) + || i(bbox2, bbox1.x2, bbox1.y2) + || i(bbox1, bbox2.x, bbox2.y) + || i(bbox1, bbox2.x2, bbox2.y) + || i(bbox1, bbox2.x, bbox2.y2) + || i(bbox1, bbox2.x2, bbox2.y2) + || (bbox1.x < bbox2.x2 && bbox1.x > bbox2.x || bbox2.x < bbox1.x2 && bbox2.x > bbox1.x) + && (bbox1.y < bbox2.y2 && bbox1.y > bbox2.y || bbox2.y < bbox1.y2 && bbox2.y > bbox1.y); + }; + function base3(t, p1, p2, p3, p4) { + var t1 = -3 * p1 + 9 * p2 - 9 * p3 + 3 * p4, + t2 = t * t1 + 6 * p1 - 12 * p2 + 6 * p3; + return t * t2 - 3 * p1 + 3 * p2; + } + function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) { + if (z == null) { + z = 1; + } + z = z > 1 ? 1 : z < 0 ? 0 : z; + var z2 = z / 2, + n = 12, + Tvalues = [-0.1252,0.1252,-0.3678,0.3678,-0.5873,0.5873,-0.7699,0.7699,-0.9041,0.9041,-0.9816,0.9816], + Cvalues = [0.2491,0.2491,0.2335,0.2335,0.2032,0.2032,0.1601,0.1601,0.1069,0.1069,0.0472,0.0472], + sum = 0; + for (var i = 0; i < n; i++) { + var ct = z2 * Tvalues[i] + z2, + xbase = base3(ct, x1, x2, x3, x4), + ybase = base3(ct, y1, y2, y3, y4), + comb = xbase * xbase + ybase * ybase; + sum += Cvalues[i] * math.sqrt(comb); + } + return z2 * sum; + } + function getTatLen(x1, y1, x2, y2, x3, y3, x4, y4, ll) { + if (ll < 0 || bezlen(x1, y1, x2, y2, x3, y3, x4, y4) < ll) { + return; + } + var t = 1, + step = t / 2, + t2 = t - step, + l, + e = .01; + l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2); + while (abs(l - ll) > e) { + step /= 2; + t2 += (l < ll ? 1 : -1) * step; + l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2); + } + return t2; + } + function intersect(x1, y1, x2, y2, x3, y3, x4, y4) { + if ( + mmax(x1, x2) < mmin(x3, x4) || + mmin(x1, x2) > mmax(x3, x4) || + mmax(y1, y2) < mmin(y3, y4) || + mmin(y1, y2) > mmax(y3, y4) + ) { + return; + } + var nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4), + ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4), + denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4); + + if (!denominator) { + return; + } + var px = nx / denominator, + py = ny / denominator, + px2 = +px.toFixed(2), + py2 = +py.toFixed(2); + if ( + px2 < +mmin(x1, x2).toFixed(2) || + px2 > +mmax(x1, x2).toFixed(2) || + px2 < +mmin(x3, x4).toFixed(2) || + px2 > +mmax(x3, x4).toFixed(2) || + py2 < +mmin(y1, y2).toFixed(2) || + py2 > +mmax(y1, y2).toFixed(2) || + py2 < +mmin(y3, y4).toFixed(2) || + py2 > +mmax(y3, y4).toFixed(2) + ) { + return; + } + return {x: px, y: py}; + } + function inter(bez1, bez2) { + return interHelper(bez1, bez2); + } + function interCount(bez1, bez2) { + return interHelper(bez1, bez2, 1); + } + function interHelper(bez1, bez2, justCount) { + var bbox1 = R.bezierBBox(bez1), + bbox2 = R.bezierBBox(bez2); + if (!R.isBBoxIntersect(bbox1, bbox2)) { + return justCount ? 0 : []; + } + var l1 = bezlen.apply(0, bez1), + l2 = bezlen.apply(0, bez2), + n1 = mmax(~~(l1 / 5), 1), + n2 = mmax(~~(l2 / 5), 1), + dots1 = [], + dots2 = [], + xy = {}, + res = justCount ? 0 : []; + for (var i = 0; i < n1 + 1; i++) { + var p = R.findDotsAtSegment.apply(R, bez1.concat(i / n1)); + dots1.push({x: p.x, y: p.y, t: i / n1}); + } + for (i = 0; i < n2 + 1; i++) { + p = R.findDotsAtSegment.apply(R, bez2.concat(i / n2)); + dots2.push({x: p.x, y: p.y, t: i / n2}); + } + for (i = 0; i < n1; i++) { + for (var j = 0; j < n2; j++) { + var di = dots1[i], + di1 = dots1[i + 1], + dj = dots2[j], + dj1 = dots2[j + 1], + ci = abs(di1.x - di.x) < .001 ? "y" : "x", + cj = abs(dj1.x - dj.x) < .001 ? "y" : "x", + is = intersect(di.x, di.y, di1.x, di1.y, dj.x, dj.y, dj1.x, dj1.y); + if (is) { + if (xy[is.x.toFixed(4)] == is.y.toFixed(4)) { + continue; + } + xy[is.x.toFixed(4)] = is.y.toFixed(4); + var t1 = di.t + abs((is[ci] - di[ci]) / (di1[ci] - di[ci])) * (di1.t - di.t), + t2 = dj.t + abs((is[cj] - dj[cj]) / (dj1[cj] - dj[cj])) * (dj1.t - dj.t); + if (t1 >= 0 && t1 <= 1.001 && t2 >= 0 && t2 <= 1.001) { + if (justCount) { + res++; + } else { + res.push({ + x: is.x, + y: is.y, + t1: mmin(t1, 1), + t2: mmin(t2, 1) + }); + } + } + } + } + } + return res; + } + /*\ + * Raphael.pathIntersection + [ method ] + ** + * Utility method + ** + * Finds intersections of two paths + > Parameters + - path1 (string) path string + - path2 (string) path string + = (array) dots of intersection + o [ + o { + o x: (number) x coordinate of the point + o y: (number) y coordinate of the point + o t1: (number) t value for segment of path1 + o t2: (number) t value for segment of path2 + o segment1: (number) order number for segment of path1 + o segment2: (number) order number for segment of path2 + o bez1: (array) eight coordinates representing beziér curve for the segment of path1 + o bez2: (array) eight coordinates representing beziér curve for the segment of path2 + o } + o ] + \*/ + R.pathIntersection = function (path1, path2) { + return interPathHelper(path1, path2); + }; + R.pathIntersectionNumber = function (path1, path2) { + return interPathHelper(path1, path2, 1); + }; + function interPathHelper(path1, path2, justCount) { + path1 = R._path2curve(path1); + path2 = R._path2curve(path2); + var x1, y1, x2, y2, x1m, y1m, x2m, y2m, bez1, bez2, + res = justCount ? 0 : []; + for (var i = 0, ii = path1.length; i < ii; i++) { + var pi = path1[i]; + if (pi[0] == "M") { + x1 = x1m = pi[1]; + y1 = y1m = pi[2]; + } else { + if (pi[0] == "C") { + bez1 = [x1, y1].concat(pi.slice(1)); + x1 = bez1[6]; + y1 = bez1[7]; + } else { + bez1 = [x1, y1, x1, y1, x1m, y1m, x1m, y1m]; + x1 = x1m; + y1 = y1m; + } + for (var j = 0, jj = path2.length; j < jj; j++) { + var pj = path2[j]; + if (pj[0] == "M") { + x2 = x2m = pj[1]; + y2 = y2m = pj[2]; + } else { + if (pj[0] == "C") { + bez2 = [x2, y2].concat(pj.slice(1)); + x2 = bez2[6]; + y2 = bez2[7]; + } else { + bez2 = [x2, y2, x2, y2, x2m, y2m, x2m, y2m]; + x2 = x2m; + y2 = y2m; + } + var intr = interHelper(bez1, bez2, justCount); + if (justCount) { + res += intr; + } else { + for (var k = 0, kk = intr.length; k < kk; k++) { + intr[k].segment1 = i; + intr[k].segment2 = j; + intr[k].bez1 = bez1; + intr[k].bez2 = bez2; + } + res = res.concat(intr); + } + } + } + } + } + return res; + } + /*\ + * Raphael.isPointInsidePath + [ method ] + ** + * Utility method + ** + * Returns `true` if given point is inside a given closed path. + > Parameters + - path (string) path string + - x (number) x of the point + - y (number) y of the point + = (boolean) true, if point is inside the path + \*/ + R.isPointInsidePath = function (path, x, y) { + var bbox = R.pathBBox(path); + return R.isPointInsideBBox(bbox, x, y) && + interPathHelper(path, [["M", x, y], ["H", bbox.x2 + 10]], 1) % 2 == 1; + }; + R._removedFactory = function (methodname) { + return function () { + eve("raphael.log", null, "Rapha\xebl: you are calling to method \u201c" + methodname + "\u201d of removed object", methodname); + }; + }; + /*\ + * Raphael.pathBBox + [ method ] + ** + * Utility method + ** + * Return bounding box of a given path + > Parameters + - path (string) path string + = (object) bounding box + o { + o x: (number) x coordinate of the left top point of the box + o y: (number) y coordinate of the left top point of the box + o x2: (number) x coordinate of the right bottom point of the box + o y2: (number) y coordinate of the right bottom point of the box + o width: (number) width of the box + o height: (number) height of the box + o cx: (number) x coordinate of the center of the box + o cy: (number) y coordinate of the center of the box + o } + \*/ + var pathDimensions = R.pathBBox = function (path) { + var pth = paths(path); + if (pth.bbox) { + return clone(pth.bbox); + } + if (!path) { + return {x: 0, y: 0, width: 0, height: 0, x2: 0, y2: 0}; + } + path = path2curve(path); + var x = 0, + y = 0, + X = [], + Y = [], + p; + for (var i = 0, ii = path.length; i < ii; i++) { + p = path[i]; + if (p[0] == "M") { + x = p[1]; + y = p[2]; + X.push(x); + Y.push(y); + } else { + var dim = curveDim(x, y, p[1], p[2], p[3], p[4], p[5], p[6]); + X = X[concat](dim.min.x, dim.max.x); + Y = Y[concat](dim.min.y, dim.max.y); + x = p[5]; + y = p[6]; + } + } + var xmin = mmin[apply](0, X), + ymin = mmin[apply](0, Y), + xmax = mmax[apply](0, X), + ymax = mmax[apply](0, Y), + width = xmax - xmin, + height = ymax - ymin, + bb = { + x: xmin, + y: ymin, + x2: xmax, + y2: ymax, + width: width, + height: height, + cx: xmin + width / 2, + cy: ymin + height / 2 + }; + pth.bbox = clone(bb); + return bb; + }, + pathClone = function (pathArray) { + var res = clone(pathArray); + res.toString = R._path2string; + return res; + }, + pathToRelative = R._pathToRelative = function (pathArray) { + var pth = paths(pathArray); + if (pth.rel) { + return pathClone(pth.rel); + } + if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption + pathArray = R.parsePathString(pathArray); + } + var res = [], + x = 0, + y = 0, + mx = 0, + my = 0, + start = 0; + if (pathArray[0][0] == "M") { + x = pathArray[0][1]; + y = pathArray[0][2]; + mx = x; + my = y; + start++; + res.push(["M", x, y]); + } + for (var i = start, ii = pathArray.length; i < ii; i++) { + var r = res[i] = [], + pa = pathArray[i]; + if (pa[0] != lowerCase.call(pa[0])) { + r[0] = lowerCase.call(pa[0]); + switch (r[0]) { + case "a": + r[1] = pa[1]; + r[2] = pa[2]; + r[3] = pa[3]; + r[4] = pa[4]; + r[5] = pa[5]; + r[6] = +(pa[6] - x).toFixed(3); + r[7] = +(pa[7] - y).toFixed(3); + break; + case "v": + r[1] = +(pa[1] - y).toFixed(3); + break; + case "m": + mx = pa[1]; + my = pa[2]; + default: + for (var j = 1, jj = pa.length; j < jj; j++) { + r[j] = +(pa[j] - ((j % 2) ? x : y)).toFixed(3); + } + } + } else { + r = res[i] = []; + if (pa[0] == "m") { + mx = pa[1] + x; + my = pa[2] + y; + } + for (var k = 0, kk = pa.length; k < kk; k++) { + res[i][k] = pa[k]; + } + } + var len = res[i].length; + switch (res[i][0]) { + case "z": + x = mx; + y = my; + break; + case "h": + x += +res[i][len - 1]; + break; + case "v": + y += +res[i][len - 1]; + break; + default: + x += +res[i][len - 2]; + y += +res[i][len - 1]; + } + } + res.toString = R._path2string; + pth.rel = pathClone(res); + return res; + }, + pathToAbsolute = R._pathToAbsolute = function (pathArray) { + var pth = paths(pathArray); + if (pth.abs) { + return pathClone(pth.abs); + } + if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption + pathArray = R.parsePathString(pathArray); + } + if (!pathArray || !pathArray.length) { + return [["M", 0, 0]]; + } + var res = [], + x = 0, + y = 0, + mx = 0, + my = 0, + start = 0; + if (pathArray[0][0] == "M") { + x = +pathArray[0][1]; + y = +pathArray[0][2]; + mx = x; + my = y; + start++; + res[0] = ["M", x, y]; + } + var crz = pathArray.length == 3 && pathArray[0][0] == "M" && pathArray[1][0].toUpperCase() == "R" && pathArray[2][0].toUpperCase() == "Z"; + for (var r, pa, i = start, ii = pathArray.length; i < ii; i++) { + res.push(r = []); + pa = pathArray[i]; + if (pa[0] != upperCase.call(pa[0])) { + r[0] = upperCase.call(pa[0]); + switch (r[0]) { + case "A": + r[1] = pa[1]; + r[2] = pa[2]; + r[3] = pa[3]; + r[4] = pa[4]; + r[5] = pa[5]; + r[6] = +(pa[6] + x); + r[7] = +(pa[7] + y); + break; + case "V": + r[1] = +pa[1] + y; + break; + case "H": + r[1] = +pa[1] + x; + break; + case "R": + var dots = [x, y][concat](pa.slice(1)); + for (var j = 2, jj = dots.length; j < jj; j++) { + dots[j] = +dots[j] + x; + dots[++j] = +dots[j] + y; + } + res.pop(); + res = res[concat](catmullRom2bezier(dots, crz)); + break; + case "M": + mx = +pa[1] + x; + my = +pa[2] + y; + default: + for (j = 1, jj = pa.length; j < jj; j++) { + r[j] = +pa[j] + ((j % 2) ? x : y); + } + } + } else if (pa[0] == "R") { + dots = [x, y][concat](pa.slice(1)); + res.pop(); + res = res[concat](catmullRom2bezier(dots, crz)); + r = ["R"][concat](pa.slice(-2)); + } else { + for (var k = 0, kk = pa.length; k < kk; k++) { + r[k] = pa[k]; + } + } + switch (r[0]) { + case "Z": + x = mx; + y = my; + break; + case "H": + x = r[1]; + break; + case "V": + y = r[1]; + break; + case "M": + mx = r[r.length - 2]; + my = r[r.length - 1]; + default: + x = r[r.length - 2]; + y = r[r.length - 1]; + } + } + res.toString = R._path2string; + pth.abs = pathClone(res); + return res; + }, + l2c = function (x1, y1, x2, y2) { + return [x1, y1, x2, y2, x2, y2]; + }, + q2c = function (x1, y1, ax, ay, x2, y2) { + var _13 = 1 / 3, + _23 = 2 / 3; + return [ + _13 * x1 + _23 * ax, + _13 * y1 + _23 * ay, + _13 * x2 + _23 * ax, + _13 * y2 + _23 * ay, + x2, + y2 + ]; + }, + a2c = function (x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) { + // for more information of where this math came from visit: + // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes + var _120 = PI * 120 / 180, + rad = PI / 180 * (+angle || 0), + res = [], + xy, + rotate = cacher(function (x, y, rad) { + var X = x * math.cos(rad) - y * math.sin(rad), + Y = x * math.sin(rad) + y * math.cos(rad); + return {x: X, y: Y}; + }); + if (!recursive) { + xy = rotate(x1, y1, -rad); + x1 = xy.x; + y1 = xy.y; + xy = rotate(x2, y2, -rad); + x2 = xy.x; + y2 = xy.y; + var cos = math.cos(PI / 180 * angle), + sin = math.sin(PI / 180 * angle), + x = (x1 - x2) / 2, + y = (y1 - y2) / 2; + var h = (x * x) / (rx * rx) + (y * y) / (ry * ry); + if (h > 1) { + h = math.sqrt(h); + rx = h * rx; + ry = h * ry; + } + var rx2 = rx * rx, + ry2 = ry * ry, + k = (large_arc_flag == sweep_flag ? -1 : 1) * + math.sqrt(abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))), + cx = k * rx * y / ry + (x1 + x2) / 2, + cy = k * -ry * x / rx + (y1 + y2) / 2, + f1 = math.asin(((y1 - cy) / ry).toFixed(9)), + f2 = math.asin(((y2 - cy) / ry).toFixed(9)); + + f1 = x1 < cx ? PI - f1 : f1; + f2 = x2 < cx ? PI - f2 : f2; + f1 < 0 && (f1 = PI * 2 + f1); + f2 < 0 && (f2 = PI * 2 + f2); + if (sweep_flag && f1 > f2) { + f1 = f1 - PI * 2; + } + if (!sweep_flag && f2 > f1) { + f2 = f2 - PI * 2; + } + } else { + f1 = recursive[0]; + f2 = recursive[1]; + cx = recursive[2]; + cy = recursive[3]; + } + var df = f2 - f1; + if (abs(df) > _120) { + var f2old = f2, + x2old = x2, + y2old = y2; + f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1); + x2 = cx + rx * math.cos(f2); + y2 = cy + ry * math.sin(f2); + res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]); + } + df = f2 - f1; + var c1 = math.cos(f1), + s1 = math.sin(f1), + c2 = math.cos(f2), + s2 = math.sin(f2), + t = math.tan(df / 4), + hx = 4 / 3 * rx * t, + hy = 4 / 3 * ry * t, + m1 = [x1, y1], + m2 = [x1 + hx * s1, y1 - hy * c1], + m3 = [x2 + hx * s2, y2 - hy * c2], + m4 = [x2, y2]; + m2[0] = 2 * m1[0] - m2[0]; + m2[1] = 2 * m1[1] - m2[1]; + if (recursive) { + return [m2, m3, m4][concat](res); + } else { + res = [m2, m3, m4][concat](res).join()[split](","); + var newres = []; + for (var i = 0, ii = res.length; i < ii; i++) { + newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x; + } + return newres; + } + }, + findDotAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) { + var t1 = 1 - t; + return { + x: pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x, + y: pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y + }; + }, + curveDim = cacher(function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) { + var a = (c2x - 2 * c1x + p1x) - (p2x - 2 * c2x + c1x), + b = 2 * (c1x - p1x) - 2 * (c2x - c1x), + c = p1x - c1x, + t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a, + t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a, + y = [p1y, p2y], + x = [p1x, p2x], + dot; + abs(t1) > "1e12" && (t1 = .5); + abs(t2) > "1e12" && (t2 = .5); + if (t1 > 0 && t1 < 1) { + dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1); + x.push(dot.x); + y.push(dot.y); + } + if (t2 > 0 && t2 < 1) { + dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2); + x.push(dot.x); + y.push(dot.y); + } + a = (c2y - 2 * c1y + p1y) - (p2y - 2 * c2y + c1y); + b = 2 * (c1y - p1y) - 2 * (c2y - c1y); + c = p1y - c1y; + t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a; + t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a; + abs(t1) > "1e12" && (t1 = .5); + abs(t2) > "1e12" && (t2 = .5); + if (t1 > 0 && t1 < 1) { + dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1); + x.push(dot.x); + y.push(dot.y); + } + if (t2 > 0 && t2 < 1) { + dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2); + x.push(dot.x); + y.push(dot.y); + } + return { + min: {x: mmin[apply](0, x), y: mmin[apply](0, y)}, + max: {x: mmax[apply](0, x), y: mmax[apply](0, y)} + }; + }), + path2curve = R._path2curve = cacher(function (path, path2) { + var pth = !path2 && paths(path); + if (!path2 && pth.curve) { + return pathClone(pth.curve); + } + var p = pathToAbsolute(path), + p2 = path2 && pathToAbsolute(path2), + attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null}, + attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null}, + processPath = function (path, d, pcom) { + var nx, ny, tq = {T:1, Q:1}; + if (!path) { + return ["C", d.x, d.y, d.x, d.y, d.x, d.y]; + } + !(path[0] in tq) && (d.qx = d.qy = null); + switch (path[0]) { + case "M": + d.X = path[1]; + d.Y = path[2]; + break; + case "A": + path = ["C"][concat](a2c[apply](0, [d.x, d.y][concat](path.slice(1)))); + break; + case "S": + if (pcom == "C" || pcom == "S") { // In "S" case we have to take into account, if the previous command is C/S. + nx = d.x * 2 - d.bx; // And reflect the previous + ny = d.y * 2 - d.by; // command's control point relative to the current point. + } + else { // or some else or nothing + nx = d.x; + ny = d.y; + } + path = ["C", nx, ny][concat](path.slice(1)); + break; + case "T": + if (pcom == "Q" || pcom == "T") { // In "T" case we have to take into account, if the previous command is Q/T. + d.qx = d.x * 2 - d.qx; // And make a reflection similar + d.qy = d.y * 2 - d.qy; // to case "S". + } + else { // or something else or nothing + d.qx = d.x; + d.qy = d.y; + } + path = ["C"][concat](q2c(d.x, d.y, d.qx, d.qy, path[1], path[2])); + break; + case "Q": + d.qx = path[1]; + d.qy = path[2]; + path = ["C"][concat](q2c(d.x, d.y, path[1], path[2], path[3], path[4])); + break; + case "L": + path = ["C"][concat](l2c(d.x, d.y, path[1], path[2])); + break; + case "H": + path = ["C"][concat](l2c(d.x, d.y, path[1], d.y)); + break; + case "V": + path = ["C"][concat](l2c(d.x, d.y, d.x, path[1])); + break; + case "Z": + path = ["C"][concat](l2c(d.x, d.y, d.X, d.Y)); + break; + } + return path; + }, + fixArc = function (pp, i) { + if (pp[i].length > 7) { + pp[i].shift(); + var pi = pp[i]; + while (pi.length) { + pcoms1[i]="A"; // if created multiple C:s, their original seg is saved + p2 && (pcoms2[i]="A"); // the same as above + pp.splice(i++, 0, ["C"][concat](pi.splice(0, 6))); + } + pp.splice(i, 1); + ii = mmax(p.length, p2 && p2.length || 0); + } + }, + fixM = function (path1, path2, a1, a2, i) { + if (path1 && path2 && path1[i][0] == "M" && path2[i][0] != "M") { + path2.splice(i, 0, ["M", a2.x, a2.y]); + a1.bx = 0; + a1.by = 0; + a1.x = path1[i][1]; + a1.y = path1[i][2]; + ii = mmax(p.length, p2 && p2.length || 0); + } + }, + pcoms1 = [], // path commands of original path p + pcoms2 = [], // path commands of original path p2 + pfirst = "", // temporary holder for original path command + pcom = ""; // holder for previous path command of original path + for (var i = 0, ii = mmax(p.length, p2 && p2.length || 0); i < ii; i++) { + p[i] && (pfirst = p[i][0]); // save current path command + + if (pfirst != "C") // C is not saved yet, because it may be result of conversion + { + pcoms1[i] = pfirst; // Save current path command + i && ( pcom = pcoms1[i-1]); // Get previous path command pcom + } + p[i] = processPath(p[i], attrs, pcom); // Previous path command is inputted to processPath + + if (pcoms1[i] != "A" && pfirst == "C") pcoms1[i] = "C"; // A is the only command + // which may produce multiple C:s + // so we have to make sure that C is also C in original path + + fixArc(p, i); // fixArc adds also the right amount of A:s to pcoms1 + + if (p2) { // the same procedures is done to p2 + p2[i] && (pfirst = p2[i][0]); + if (pfirst != "C") + { + pcoms2[i] = pfirst; + i && (pcom = pcoms2[i-1]); + } + p2[i] = processPath(p2[i], attrs2, pcom); + + if (pcoms2[i]!="A" && pfirst=="C") pcoms2[i]="C"; + + fixArc(p2, i); + } + fixM(p, p2, attrs, attrs2, i); + fixM(p2, p, attrs2, attrs, i); + var seg = p[i], + seg2 = p2 && p2[i], + seglen = seg.length, + seg2len = p2 && seg2.length; + attrs.x = seg[seglen - 2]; + attrs.y = seg[seglen - 1]; + attrs.bx = toFloat(seg[seglen - 4]) || attrs.x; + attrs.by = toFloat(seg[seglen - 3]) || attrs.y; + attrs2.bx = p2 && (toFloat(seg2[seg2len - 4]) || attrs2.x); + attrs2.by = p2 && (toFloat(seg2[seg2len - 3]) || attrs2.y); + attrs2.x = p2 && seg2[seg2len - 2]; + attrs2.y = p2 && seg2[seg2len - 1]; + } + if (!p2) { + pth.curve = pathClone(p); + } + return p2 ? [p, p2] : p; + }, null, pathClone), + parseDots = R._parseDots = cacher(function (gradient) { + var dots = []; + for (var i = 0, ii = gradient.length; i < ii; i++) { + var dot = {}, + par = gradient[i].match(/^([^:]*):?([\d\.]*)/); + dot.color = R.getRGB(par[1]); + if (dot.color.error) { + return null; + } + dot.opacity = dot.color.opacity; + dot.color = dot.color.hex; + par[2] && (dot.offset = par[2] + "%"); + dots.push(dot); + } + for (i = 1, ii = dots.length - 1; i < ii; i++) { + if (!dots[i].offset) { + var start = toFloat(dots[i - 1].offset || 0), + end = 0; + for (var j = i + 1; j < ii; j++) { + if (dots[j].offset) { + end = dots[j].offset; + break; + } + } + if (!end) { + end = 100; + j = ii; + } + end = toFloat(end); + var d = (end - start) / (j - i + 1); + for (; i < j; i++) { + start += d; + dots[i].offset = start + "%"; + } + } + } + return dots; + }), + tear = R._tear = function (el, paper) { + el == paper.top && (paper.top = el.prev); + el == paper.bottom && (paper.bottom = el.next); + el.next && (el.next.prev = el.prev); + el.prev && (el.prev.next = el.next); + }, + tofront = R._tofront = function (el, paper) { + if (paper.top === el) { + return; + } + tear(el, paper); + el.next = null; + el.prev = paper.top; + paper.top.next = el; + paper.top = el; + }, + toback = R._toback = function (el, paper) { + if (paper.bottom === el) { + return; + } + tear(el, paper); + el.next = paper.bottom; + el.prev = null; + paper.bottom.prev = el; + paper.bottom = el; + }, + insertafter = R._insertafter = function (el, el2, paper) { + tear(el, paper); + el2 == paper.top && (paper.top = el); + el2.next && (el2.next.prev = el); + el.next = el2.next; + el.prev = el2; + el2.next = el; + }, + insertbefore = R._insertbefore = function (el, el2, paper) { + tear(el, paper); + el2 == paper.bottom && (paper.bottom = el); + el2.prev && (el2.prev.next = el); + el.prev = el2.prev; + el2.prev = el; + el.next = el2; + }, + /*\ + * Raphael.toMatrix + [ method ] + ** + * Utility method + ** + * Returns matrix of transformations applied to a given path + > Parameters + - path (string) path string + - transform (string|array) transformation string + = (object) @Matrix + \*/ + toMatrix = R.toMatrix = function (path, transform) { + var bb = pathDimensions(path), + el = { + _: { + transform: E + }, + getBBox: function () { + return bb; + } + }; + extractTransform(el, transform); + return el.matrix; + }, + /*\ + * Raphael.transformPath + [ method ] + ** + * Utility method + ** + * Returns path transformed by a given transformation + > Parameters + - path (string) path string + - transform (string|array) transformation string + = (string) path + \*/ + transformPath = R.transformPath = function (path, transform) { + return mapPath(path, toMatrix(path, transform)); + }, + extractTransform = R._extractTransform = function (el, tstr) { + if (tstr == null) { + return el._.transform; + } + tstr = Str(tstr).replace(/\.{3}|\u2026/g, el._.transform || E); + var tdata = R.parseTransformString(tstr), + deg = 0, + dx = 0, + dy = 0, + sx = 1, + sy = 1, + _ = el._, + m = new Matrix; + _.transform = tdata || []; + if (tdata) { + for (var i = 0, ii = tdata.length; i < ii; i++) { + var t = tdata[i], + tlen = t.length, + command = Str(t[0]).toLowerCase(), + absolute = t[0] != command, + inver = absolute ? m.invert() : 0, + x1, + y1, + x2, + y2, + bb; + if (command == "t" && tlen == 3) { + if (absolute) { + x1 = inver.x(0, 0); + y1 = inver.y(0, 0); + x2 = inver.x(t[1], t[2]); + y2 = inver.y(t[1], t[2]); + m.translate(x2 - x1, y2 - y1); + } else { + m.translate(t[1], t[2]); + } + } else if (command == "r") { + if (tlen == 2) { + bb = bb || el.getBBox(1); + m.rotate(t[1], bb.x + bb.width / 2, bb.y + bb.height / 2); + deg += t[1]; + } else if (tlen == 4) { + if (absolute) { + x2 = inver.x(t[2], t[3]); + y2 = inver.y(t[2], t[3]); + m.rotate(t[1], x2, y2); + } else { + m.rotate(t[1], t[2], t[3]); + } + deg += t[1]; + } + } else if (command == "s") { + if (tlen == 2 || tlen == 3) { + bb = bb || el.getBBox(1); + m.scale(t[1], t[tlen - 1], bb.x + bb.width / 2, bb.y + bb.height / 2); + sx *= t[1]; + sy *= t[tlen - 1]; + } else if (tlen == 5) { + if (absolute) { + x2 = inver.x(t[3], t[4]); + y2 = inver.y(t[3], t[4]); + m.scale(t[1], t[2], x2, y2); + } else { + m.scale(t[1], t[2], t[3], t[4]); + } + sx *= t[1]; + sy *= t[2]; + } + } else if (command == "m" && tlen == 7) { + m.add(t[1], t[2], t[3], t[4], t[5], t[6]); + } + _.dirtyT = 1; + el.matrix = m; + } + } + + /*\ + * Element.matrix + [ property (object) ] + ** + * Keeps @Matrix object, which represents element transformation + \*/ + el.matrix = m; + + _.sx = sx; + _.sy = sy; + _.deg = deg; + _.dx = dx = m.e; + _.dy = dy = m.f; + + if (sx == 1 && sy == 1 && !deg && _.bbox) { + _.bbox.x += +dx; + _.bbox.y += +dy; + } else { + _.dirtyT = 1; + } + }, + getEmpty = function (item) { + var l = item[0]; + switch (l.toLowerCase()) { + case "t": return [l, 0, 0]; + case "m": return [l, 1, 0, 0, 1, 0, 0]; + case "r": if (item.length == 4) { + return [l, 0, item[2], item[3]]; + } else { + return [l, 0]; + } + case "s": if (item.length == 5) { + return [l, 1, 1, item[3], item[4]]; + } else if (item.length == 3) { + return [l, 1, 1]; + } else { + return [l, 1]; + } + } + }, + equaliseTransform = R._equaliseTransform = function (t1, t2) { + t2 = Str(t2).replace(/\.{3}|\u2026/g, t1); + t1 = R.parseTransformString(t1) || []; + t2 = R.parseTransformString(t2) || []; + var maxlength = mmax(t1.length, t2.length), + from = [], + to = [], + i = 0, j, jj, + tt1, tt2; + for (; i < maxlength; i++) { + tt1 = t1[i] || getEmpty(t2[i]); + tt2 = t2[i] || getEmpty(tt1); + if ((tt1[0] != tt2[0]) || + (tt1[0].toLowerCase() == "r" && (tt1[2] != tt2[2] || tt1[3] != tt2[3])) || + (tt1[0].toLowerCase() == "s" && (tt1[3] != tt2[3] || tt1[4] != tt2[4])) + ) { + return; + } + from[i] = []; + to[i] = []; + for (j = 0, jj = mmax(tt1.length, tt2.length); j < jj; j++) { + j in tt1 && (from[i][j] = tt1[j]); + j in tt2 && (to[i][j] = tt2[j]); + } + } + return { + from: from, + to: to + }; + }; + R._getContainer = function (x, y, w, h) { + var container; + container = h == null && !R.is(x, "object") ? g.doc.getElementById(x) : x; + if (container == null) { + return; + } + if (container.tagName) { + if (y == null) { + return { + container: container, + width: container.style.pixelWidth || container.offsetWidth, + height: container.style.pixelHeight || container.offsetHeight + }; + } else { + return { + container: container, + width: y, + height: w + }; + } + } + return { + container: 1, + x: x, + y: y, + width: w, + height: h + }; + }; + /*\ + * Raphael.pathToRelative + [ method ] + ** + * Utility method + ** + * Converts path to relative form + > Parameters + - pathString (string|array) path string or array of segments + = (array) array of segments. + \*/ + R.pathToRelative = pathToRelative; + R._engine = {}; + /*\ + * Raphael.path2curve + [ method ] + ** + * Utility method + ** + * Converts path to a new path where all segments are cubic bezier curves. + > Parameters + - pathString (string|array) path string or array of segments + = (array) array of segments. + \*/ + R.path2curve = path2curve; + /*\ + * Raphael.matrix + [ method ] + ** + * Utility method + ** + * Returns matrix based on given parameters. + > Parameters + - a (number) + - b (number) + - c (number) + - d (number) + - e (number) + - f (number) + = (object) @Matrix + \*/ + R.matrix = function (a, b, c, d, e, f) { + return new Matrix(a, b, c, d, e, f); + }; + function Matrix(a, b, c, d, e, f) { + if (a != null) { + this.a = +a; + this.b = +b; + this.c = +c; + this.d = +d; + this.e = +e; + this.f = +f; + } else { + this.a = 1; + this.b = 0; + this.c = 0; + this.d = 1; + this.e = 0; + this.f = 0; + } + } + (function (matrixproto) { + /*\ + * Matrix.add + [ method ] + ** + * Adds given matrix to existing one. + > Parameters + - a (number) + - b (number) + - c (number) + - d (number) + - e (number) + - f (number) + or + - matrix (object) @Matrix + \*/ + matrixproto.add = function (a, b, c, d, e, f) { + var out = [[], [], []], + m = [[this.a, this.c, this.e], [this.b, this.d, this.f], [0, 0, 1]], + matrix = [[a, c, e], [b, d, f], [0, 0, 1]], + x, y, z, res; + + if (a && a instanceof Matrix) { + matrix = [[a.a, a.c, a.e], [a.b, a.d, a.f], [0, 0, 1]]; + } + + for (x = 0; x < 3; x++) { + for (y = 0; y < 3; y++) { + res = 0; + for (z = 0; z < 3; z++) { + res += m[x][z] * matrix[z][y]; + } + out[x][y] = res; + } + } + this.a = out[0][0]; + this.b = out[1][0]; + this.c = out[0][1]; + this.d = out[1][1]; + this.e = out[0][2]; + this.f = out[1][2]; + }; + /*\ + * Matrix.invert + [ method ] + ** + * Returns inverted version of the matrix + = (object) @Matrix + \*/ + matrixproto.invert = function () { + var me = this, + x = me.a * me.d - me.b * me.c; + return new Matrix(me.d / x, -me.b / x, -me.c / x, me.a / x, (me.c * me.f - me.d * me.e) / x, (me.b * me.e - me.a * me.f) / x); + }; + /*\ + * Matrix.clone + [ method ] + ** + * Returns copy of the matrix + = (object) @Matrix + \*/ + matrixproto.clone = function () { + return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f); + }; + /*\ + * Matrix.translate + [ method ] + ** + * Translate the matrix + > Parameters + - x (number) + - y (number) + \*/ + matrixproto.translate = function (x, y) { + this.add(1, 0, 0, 1, x, y); + }; + /*\ + * Matrix.scale + [ method ] + ** + * Scales the matrix + > Parameters + - x (number) + - y (number) #optional + - cx (number) #optional + - cy (number) #optional + \*/ + matrixproto.scale = function (x, y, cx, cy) { + y == null && (y = x); + (cx || cy) && this.add(1, 0, 0, 1, cx, cy); + this.add(x, 0, 0, y, 0, 0); + (cx || cy) && this.add(1, 0, 0, 1, -cx, -cy); + }; + /*\ + * Matrix.rotate + [ method ] + ** + * Rotates the matrix + > Parameters + - a (number) + - x (number) + - y (number) + \*/ + matrixproto.rotate = function (a, x, y) { + a = R.rad(a); + x = x || 0; + y = y || 0; + var cos = +math.cos(a).toFixed(9), + sin = +math.sin(a).toFixed(9); + this.add(cos, sin, -sin, cos, x, y); + this.add(1, 0, 0, 1, -x, -y); + }; + /*\ + * Matrix.x + [ method ] + ** + * Return x coordinate for given point after transformation described by the matrix. See also @Matrix.y + > Parameters + - x (number) + - y (number) + = (number) x + \*/ + matrixproto.x = function (x, y) { + return x * this.a + y * this.c + this.e; + }; + /*\ + * Matrix.y + [ method ] + ** + * Return y coordinate for given point after transformation described by the matrix. See also @Matrix.x + > Parameters + - x (number) + - y (number) + = (number) y + \*/ + matrixproto.y = function (x, y) { + return x * this.b + y * this.d + this.f; + }; + matrixproto.get = function (i) { + return +this[Str.fromCharCode(97 + i)].toFixed(4); + }; + matrixproto.toString = function () { + return R.svg ? + "matrix(" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)].join() + ")" : + [this.get(0), this.get(2), this.get(1), this.get(3), 0, 0].join(); + }; + matrixproto.toFilter = function () { + return "progid:DXImageTransform.Microsoft.Matrix(M11=" + this.get(0) + + ", M12=" + this.get(2) + ", M21=" + this.get(1) + ", M22=" + this.get(3) + + ", Dx=" + this.get(4) + ", Dy=" + this.get(5) + ", sizingmethod='auto expand')"; + }; + matrixproto.offset = function () { + return [this.e.toFixed(4), this.f.toFixed(4)]; + }; + function norm(a) { + return a[0] * a[0] + a[1] * a[1]; + } + function normalize(a) { + var mag = math.sqrt(norm(a)); + a[0] && (a[0] /= mag); + a[1] && (a[1] /= mag); + } + /*\ + * Matrix.split + [ method ] + ** + * Splits matrix into primitive transformations + = (object) in format: + o dx (number) translation by x + o dy (number) translation by y + o scalex (number) scale by x + o scaley (number) scale by y + o shear (number) shear + o rotate (number) rotation in deg + o isSimple (boolean) could it be represented via simple transformations + \*/ + matrixproto.split = function () { + var out = {}; + // translation + out.dx = this.e; + out.dy = this.f; + + // scale and shear + var row = [[this.a, this.c], [this.b, this.d]]; + out.scalex = math.sqrt(norm(row[0])); + normalize(row[0]); + + out.shear = row[0][0] * row[1][0] + row[0][1] * row[1][1]; + row[1] = [row[1][0] - row[0][0] * out.shear, row[1][1] - row[0][1] * out.shear]; + + out.scaley = math.sqrt(norm(row[1])); + normalize(row[1]); + out.shear /= out.scaley; + + // rotation + var sin = -row[0][1], + cos = row[1][1]; + if (cos < 0) { + out.rotate = R.deg(math.acos(cos)); + if (sin < 0) { + out.rotate = 360 - out.rotate; + } + } else { + out.rotate = R.deg(math.asin(sin)); + } + + out.isSimple = !+out.shear.toFixed(9) && (out.scalex.toFixed(9) == out.scaley.toFixed(9) || !out.rotate); + out.isSuperSimple = !+out.shear.toFixed(9) && out.scalex.toFixed(9) == out.scaley.toFixed(9) && !out.rotate; + out.noRotation = !+out.shear.toFixed(9) && !out.rotate; + return out; + }; + /*\ + * Matrix.toTransformString + [ method ] + ** + * Return transform string that represents given matrix + = (string) transform string + \*/ + matrixproto.toTransformString = function (shorter) { + var s = shorter || this[split](); + if (s.isSimple) { + s.scalex = +s.scalex.toFixed(4); + s.scaley = +s.scaley.toFixed(4); + s.rotate = +s.rotate.toFixed(4); + return (s.dx || s.dy ? "t" + [s.dx, s.dy] : E) + + (s.scalex != 1 || s.scaley != 1 ? "s" + [s.scalex, s.scaley, 0, 0] : E) + + (s.rotate ? "r" + [s.rotate, 0, 0] : E); + } else { + return "m" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)]; + } + }; + })(Matrix.prototype); + + var preventDefault = function () { + this.returnValue = false; + }, + preventTouch = function () { + return this.originalEvent.preventDefault(); + }, + stopPropagation = function () { + this.cancelBubble = true; + }, + stopTouch = function () { + return this.originalEvent.stopPropagation(); + }, + getEventPosition = function (e) { + var scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop, + scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft; + + return { + x: e.clientX + scrollX, + y: e.clientY + scrollY + }; + }, + addEvent = (function () { + if (g.doc.addEventListener) { + return function (obj, type, fn, element) { + var f = function (e) { + var pos = getEventPosition(e); + return fn.call(element, e, pos.x, pos.y); + }; + obj.addEventListener(type, f, false); + + if (supportsTouch && touchMap[type]) { + var _f = function (e) { + var pos = getEventPosition(e), + olde = e; + + for (var i = 0, ii = e.targetTouches && e.targetTouches.length; i < ii; i++) { + if (e.targetTouches[i].target == obj) { + e = e.targetTouches[i]; + e.originalEvent = olde; + e.preventDefault = preventTouch; + e.stopPropagation = stopTouch; + break; + } + } + + return fn.call(element, e, pos.x, pos.y); + }; + obj.addEventListener(touchMap[type], _f, false); + } + + return function () { + obj.removeEventListener(type, f, false); + + if (supportsTouch && touchMap[type]) + obj.removeEventListener(touchMap[type], _f, false); + + return true; + }; + }; + } else if (g.doc.attachEvent) { + return function (obj, type, fn, element) { + var f = function (e) { + e = e || g.win.event; + var scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop, + scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft, + x = e.clientX + scrollX, + y = e.clientY + scrollY; + e.preventDefault = e.preventDefault || preventDefault; + e.stopPropagation = e.stopPropagation || stopPropagation; + return fn.call(element, e, x, y); + }; + obj.attachEvent("on" + type, f); + var detacher = function () { + obj.detachEvent("on" + type, f); + return true; + }; + return detacher; + }; + } + })(), + drag = [], + dragMove = function (e) { + var x = e.clientX, + y = e.clientY, + scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop, + scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft, + dragi, + j = drag.length; + while (j--) { + dragi = drag[j]; + if (supportsTouch && e.touches) { + var i = e.touches.length, + touch; + while (i--) { + touch = e.touches[i]; + if (touch.identifier == dragi.el._drag.id) { + x = touch.clientX; + y = touch.clientY; + (e.originalEvent ? e.originalEvent : e).preventDefault(); + break; + } + } + } else { + e.preventDefault(); + } + var node = dragi.el.node, + o, + next = node.nextSibling, + parent = node.parentNode, + display = node.style.display; + g.win.opera && parent.removeChild(node); + node.style.display = "none"; + o = dragi.el.paper.getElementByPoint(x, y); + node.style.display = display; + g.win.opera && (next ? parent.insertBefore(node, next) : parent.appendChild(node)); + o && eve("raphael.drag.over." + dragi.el.id, dragi.el, o); + x += scrollX; + y += scrollY; + eve("raphael.drag.move." + dragi.el.id, dragi.move_scope || dragi.el, x - dragi.el._drag.x, y - dragi.el._drag.y, x, y, e); + } + }, + dragUp = function (e) { + R.unmousemove(dragMove).unmouseup(dragUp); + var i = drag.length, + dragi; + while (i--) { + dragi = drag[i]; + dragi.el._drag = {}; + eve("raphael.drag.end." + dragi.el.id, dragi.end_scope || dragi.start_scope || dragi.move_scope || dragi.el, e); + } + drag = []; + }, + /*\ + * Raphael.el + [ property (object) ] + ** + * You can add your own method to elements. This is useful when you want to hack default functionality or + * want to wrap some common transformation or attributes in one method. In difference to canvas methods, + * you can redefine element method at any time. Expending element methods wouldn’t affect set. + > Usage + | Raphael.el.red = function () { + | this.attr({fill: "#f00"}); + | }; + | // then use it + | paper.circle(100, 100, 20).red(); + \*/ + elproto = R.el = {}; + /*\ + * Element.click + [ method ] + ** + * Adds event handler for click for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unclick + [ method ] + ** + * Removes event handler for click for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.dblclick + [ method ] + ** + * Adds event handler for double click for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.undblclick + [ method ] + ** + * Removes event handler for double click for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mousedown + [ method ] + ** + * Adds event handler for mousedown for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmousedown + [ method ] + ** + * Removes event handler for mousedown for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mousemove + [ method ] + ** + * Adds event handler for mousemove for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmousemove + [ method ] + ** + * Removes event handler for mousemove for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mouseout + [ method ] + ** + * Adds event handler for mouseout for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmouseout + [ method ] + ** + * Removes event handler for mouseout for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mouseover + [ method ] + ** + * Adds event handler for mouseover for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmouseover + [ method ] + ** + * Removes event handler for mouseover for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mouseup + [ method ] + ** + * Adds event handler for mouseup for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmouseup + [ method ] + ** + * Removes event handler for mouseup for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.touchstart + [ method ] + ** + * Adds event handler for touchstart for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.untouchstart + [ method ] + ** + * Removes event handler for touchstart for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.touchmove + [ method ] + ** + * Adds event handler for touchmove for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.untouchmove + [ method ] + ** + * Removes event handler for touchmove for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.touchend + [ method ] + ** + * Adds event handler for touchend for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.untouchend + [ method ] + ** + * Removes event handler for touchend for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.touchcancel + [ method ] + ** + * Adds event handler for touchcancel for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.untouchcancel + [ method ] + ** + * Removes event handler for touchcancel for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + for (var i = events.length; i--;) { + (function (eventName) { + R[eventName] = elproto[eventName] = function (fn, scope) { + if (R.is(fn, "function")) { + this.events = this.events || []; + this.events.push({name: eventName, f: fn, unbind: addEvent(this.shape || this.node || g.doc, eventName, fn, scope || this)}); + } + return this; + }; + R["un" + eventName] = elproto["un" + eventName] = function (fn) { + var events = this.events || [], + l = events.length; + while (l--){ + if (events[l].name == eventName && (R.is(fn, "undefined") || events[l].f == fn)) { + events[l].unbind(); + events.splice(l, 1); + !events.length && delete this.events; + } + } + return this; + }; + })(events[i]); + } + + /*\ + * Element.data + [ method ] + ** + * Adds or retrieves given value associated with given key. + ** + * See also @Element.removeData + > Parameters + - key (string) key to store data + - value (any) #optional value to store + = (object) @Element + * or, if value is not specified: + = (any) value + * or, if key and value are not specified: + = (object) Key/value pairs for all the data associated with the element. + > Usage + | for (var i = 0, i < 5, i++) { + | paper.circle(10 + 15 * i, 10, 10) + | .attr({fill: "#000"}) + | .data("i", i) + | .click(function () { + | alert(this.data("i")); + | }); + | } + \*/ + elproto.data = function (key, value) { + var data = eldata[this.id] = eldata[this.id] || {}; + if (arguments.length == 0) { + return data; + } + if (arguments.length == 1) { + if (R.is(key, "object")) { + for (var i in key) if (key[has](i)) { + this.data(i, key[i]); + } + return this; + } + eve("raphael.data.get." + this.id, this, data[key], key); + return data[key]; + } + data[key] = value; + eve("raphael.data.set." + this.id, this, value, key); + return this; + }; + /*\ + * Element.removeData + [ method ] + ** + * Removes value associated with an element by given key. + * If key is not provided, removes all the data of the element. + > Parameters + - key (string) #optional key + = (object) @Element + \*/ + elproto.removeData = function (key) { + if (key == null) { + eldata[this.id] = {}; + } else { + eldata[this.id] && delete eldata[this.id][key]; + } + return this; + }; + /*\ + * Element.getData + [ method ] + ** + * Retrieves the element data + = (object) data + \*/ + elproto.getData = function () { + return clone(eldata[this.id] || {}); + }; + /*\ + * Element.hover + [ method ] + ** + * Adds event handlers for hover for the element. + > Parameters + - f_in (function) handler for hover in + - f_out (function) handler for hover out + - icontext (object) #optional context for hover in handler + - ocontext (object) #optional context for hover out handler + = (object) @Element + \*/ + elproto.hover = function (f_in, f_out, scope_in, scope_out) { + return this.mouseover(f_in, scope_in).mouseout(f_out, scope_out || scope_in); + }; + /*\ + * Element.unhover + [ method ] + ** + * Removes event handlers for hover for the element. + > Parameters + - f_in (function) handler for hover in + - f_out (function) handler for hover out + = (object) @Element + \*/ + elproto.unhover = function (f_in, f_out) { + return this.unmouseover(f_in).unmouseout(f_out); + }; + var draggable = []; + /*\ + * Element.drag + [ method ] + ** + * Adds event handlers for drag of the element. + > Parameters + - onmove (function) handler for moving + - onstart (function) handler for drag start + - onend (function) handler for drag end + - mcontext (object) #optional context for moving handler + - scontext (object) #optional context for drag start handler + - econtext (object) #optional context for drag end handler + * Additionally following `drag` events will be triggered: `drag.start.<id>` on start, + * `drag.end.<id>` on end and `drag.move.<id>` on every move. When element will be dragged over another element + * `drag.over.<id>` will be fired as well. + * + * Start event and start handler will be called in specified context or in context of the element with following parameters: + o x (number) x position of the mouse + o y (number) y position of the mouse + o event (object) DOM event object + * Move event and move handler will be called in specified context or in context of the element with following parameters: + o dx (number) shift by x from the start point + o dy (number) shift by y from the start point + o x (number) x position of the mouse + o y (number) y position of the mouse + o event (object) DOM event object + * End event and end handler will be called in specified context or in context of the element with following parameters: + o event (object) DOM event object + = (object) @Element + \*/ + elproto.drag = function (onmove, onstart, onend, move_scope, start_scope, end_scope) { + function start(e) { + (e.originalEvent || e).preventDefault(); + var x = e.clientX, + y = e.clientY, + scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop, + scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft; + this._drag.id = e.identifier; + if (supportsTouch && e.touches) { + var i = e.touches.length, touch; + while (i--) { + touch = e.touches[i]; + this._drag.id = touch.identifier; + if (touch.identifier == this._drag.id) { + x = touch.clientX; + y = touch.clientY; + break; + } + } + } + this._drag.x = x + scrollX; + this._drag.y = y + scrollY; + !drag.length && R.mousemove(dragMove).mouseup(dragUp); + drag.push({el: this, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope}); + onstart && eve.on("raphael.drag.start." + this.id, onstart); + onmove && eve.on("raphael.drag.move." + this.id, onmove); + onend && eve.on("raphael.drag.end." + this.id, onend); + eve("raphael.drag.start." + this.id, start_scope || move_scope || this, e.clientX + scrollX, e.clientY + scrollY, e); + } + this._drag = {}; + draggable.push({el: this, start: start}); + this.mousedown(start); + return this; + }; + /*\ + * Element.onDragOver + [ method ] + ** + * Shortcut for assigning event handler for `drag.over.<id>` event, where id is id of the element (see @Element.id). + > Parameters + - f (function) handler for event, first argument would be the element you are dragging over + \*/ + elproto.onDragOver = function (f) { + f ? eve.on("raphael.drag.over." + this.id, f) : eve.unbind("raphael.drag.over." + this.id); + }; + /*\ + * Element.undrag + [ method ] + ** + * Removes all drag event handlers from given element. + \*/ + elproto.undrag = function () { + var i = draggable.length; + while (i--) if (draggable[i].el == this) { + this.unmousedown(draggable[i].start); + draggable.splice(i, 1); + eve.unbind("raphael.drag.*." + this.id); + } + !draggable.length && R.unmousemove(dragMove).unmouseup(dragUp); + drag = []; + }; + /*\ + * Paper.circle + [ method ] + ** + * Draws a circle. + ** + > Parameters + ** + - x (number) x coordinate of the centre + - y (number) y coordinate of the centre + - r (number) radius + = (object) Raphaël element object with type “circle” + ** + > Usage + | var c = paper.circle(50, 50, 40); + \*/ + paperproto.circle = function (x, y, r) { + var out = R._engine.circle(this, x || 0, y || 0, r || 0); + this.__set__ && this.__set__.push(out); + return out; + }; + /*\ + * Paper.rect + [ method ] + * + * Draws a rectangle. + ** + > Parameters + ** + - x (number) x coordinate of the top left corner + - y (number) y coordinate of the top left corner + - width (number) width + - height (number) height + - r (number) #optional radius for rounded corners, default is 0 + = (object) Raphaël element object with type “rect” + ** + > Usage + | // regular rectangle + | var c = paper.rect(10, 10, 50, 50); + | // rectangle with rounded corners + | var c = paper.rect(40, 40, 50, 50, 10); + \*/ + paperproto.rect = function (x, y, w, h, r) { + var out = R._engine.rect(this, x || 0, y || 0, w || 0, h || 0, r || 0); + this.__set__ && this.__set__.push(out); + return out; + }; + /*\ + * Paper.ellipse + [ method ] + ** + * Draws an ellipse. + ** + > Parameters + ** + - x (number) x coordinate of the centre + - y (number) y coordinate of the centre + - rx (number) horizontal radius + - ry (number) vertical radius + = (object) Raphaël element object with type “ellipse” + ** + > Usage + | var c = paper.ellipse(50, 50, 40, 20); + \*/ + paperproto.ellipse = function (x, y, rx, ry) { + var out = R._engine.ellipse(this, x || 0, y || 0, rx || 0, ry || 0); + this.__set__ && this.__set__.push(out); + return out; + }; + /*\ + * Paper.path + [ method ] + ** + * Creates a path element by given path data string. + > Parameters + - pathString (string) #optional path string in SVG format. + * Path string consists of one-letter commands, followed by comma seprarated arguments in numercal form. Example: + | "M10,20L30,40" + * Here we can see two commands: “M”, with arguments `(10, 20)` and “L” with arguments `(30, 40)`. Upper case letter mean command is absolute, lower case—relative. + * + # <p>Here is short list of commands available, for more details see <a href="http://www.w3.org/TR/SVG/paths.html#PathData" title="Details of a path's data attribute's format are described in the SVG specification.">SVG path string format</a>.</p> + # <table><thead><tr><th>Command</th><th>Name</th><th>Parameters</th></tr></thead><tbody> + # <tr><td>M</td><td>moveto</td><td>(x y)+</td></tr> + # <tr><td>Z</td><td>closepath</td><td>(none)</td></tr> + # <tr><td>L</td><td>lineto</td><td>(x y)+</td></tr> + # <tr><td>H</td><td>horizontal lineto</td><td>x+</td></tr> + # <tr><td>V</td><td>vertical lineto</td><td>y+</td></tr> + # <tr><td>C</td><td>curveto</td><td>(x1 y1 x2 y2 x y)+</td></tr> + # <tr><td>S</td><td>smooth curveto</td><td>(x2 y2 x y)+</td></tr> + # <tr><td>Q</td><td>quadratic Bézier curveto</td><td>(x1 y1 x y)+</td></tr> + # <tr><td>T</td><td>smooth quadratic Bézier curveto</td><td>(x y)+</td></tr> + # <tr><td>A</td><td>elliptical arc</td><td>(rx ry x-axis-rotation large-arc-flag sweep-flag x y)+</td></tr> + # <tr><td>R</td><td><a href="http://en.wikipedia.org/wiki/Catmull–Rom_spline#Catmull.E2.80.93Rom_spline">Catmull-Rom curveto</a>*</td><td>x1 y1 (x y)+</td></tr></tbody></table> + * * “Catmull-Rom curveto” is a not standard SVG command and added in 2.0 to make life easier. + * Note: there is a special case when path consist of just three commands: “M10,10R…z”. In this case path will smoothly connects to its beginning. + > Usage + | var c = paper.path("M10 10L90 90"); + | // draw a diagonal line: + | // move to 10,10, line to 90,90 + * For example of path strings, check out these icons: http://raphaeljs.com/icons/ + \*/ + paperproto.path = function (pathString) { + pathString && !R.is(pathString, string) && !R.is(pathString[0], array) && (pathString += E); + var out = R._engine.path(R.format[apply](R, arguments), this); + this.__set__ && this.__set__.push(out); + return out; + }; + /*\ + * Paper.image + [ method ] + ** + * Embeds an image into the surface. + ** + > Parameters + ** + - src (string) URI of the source image + - x (number) x coordinate position + - y (number) y coordinate position + - width (number) width of the image + - height (number) height of the image + = (object) Raphaël element object with type “image” + ** + > Usage + | var c = paper.image("apple.png", 10, 10, 80, 80); + \*/ + paperproto.image = function (src, x, y, w, h) { + var out = R._engine.image(this, src || "about:blank", x || 0, y || 0, w || 0, h || 0); + this.__set__ && this.__set__.push(out); + return out; + }; + /*\ + * Paper.text + [ method ] + ** + * Draws a text string. If you need line breaks, put “\n” in the string. + ** + > Parameters + ** + - x (number) x coordinate position + - y (number) y coordinate position + - text (string) The text string to draw + = (object) Raphaël element object with type “text” + ** + > Usage + | var t = paper.text(50, 50, "Raphaël\nkicks\nbutt!"); + \*/ + paperproto.text = function (x, y, text) { + var out = R._engine.text(this, x || 0, y || 0, Str(text)); + this.__set__ && this.__set__.push(out); + return out; + }; + /*\ + * Paper.set + [ method ] + ** + * Creates array-like object to keep and operate several elements at once. + * Warning: it doesn’t create any elements for itself in the page, it just groups existing elements. + * Sets act as pseudo elements — all methods available to an element can be used on a set. + = (object) array-like object that represents set of elements + ** + > Usage + | var st = paper.set(); + | st.push( + | paper.circle(10, 10, 5), + | paper.circle(30, 10, 5) + | ); + | st.attr({fill: "red"}); // changes the fill of both circles + \*/ + paperproto.set = function (itemsArray) { + !R.is(itemsArray, "array") && (itemsArray = Array.prototype.splice.call(arguments, 0, arguments.length)); + var out = new Set(itemsArray); + this.__set__ && this.__set__.push(out); + out["paper"] = this; + out["type"] = "set"; + return out; + }; + /*\ + * Paper.setStart + [ method ] + ** + * Creates @Paper.set. All elements that will be created after calling this method and before calling + * @Paper.setFinish will be added to the set. + ** + > Usage + | paper.setStart(); + | paper.circle(10, 10, 5), + | paper.circle(30, 10, 5) + | var st = paper.setFinish(); + | st.attr({fill: "red"}); // changes the fill of both circles + \*/ + paperproto.setStart = function (set) { + this.__set__ = set || this.set(); + }; + /*\ + * Paper.setFinish + [ method ] + ** + * See @Paper.setStart. This method finishes catching and returns resulting set. + ** + = (object) set + \*/ + paperproto.setFinish = function (set) { + var out = this.__set__; + delete this.__set__; + return out; + }; + /*\ + * Paper.getSize + [ method ] + ** + * Obtains current paper actual size. + ** + = (object) + \*/ + paperproto.getSize = function () { + var container = this.canvas.parentNode; + return { + width: container.offsetWidth, + height: container.offsetHeight + }; + }; + /*\ + * Paper.setSize + [ method ] + ** + * If you need to change dimensions of the canvas call this method + ** + > Parameters + ** + - width (number) new width of the canvas + - height (number) new height of the canvas + \*/ + paperproto.setSize = function (width, height) { + return R._engine.setSize.call(this, width, height); + }; + /*\ + * Paper.setViewBox + [ method ] + ** + * Sets the view box of the paper. Practically it gives you ability to zoom and pan whole paper surface by + * specifying new boundaries. + ** + > Parameters + ** + - x (number) new x position, default is `0` + - y (number) new y position, default is `0` + - w (number) new width of the canvas + - h (number) new height of the canvas + - fit (boolean) `true` if you want graphics to fit into new boundary box + \*/ + paperproto.setViewBox = function (x, y, w, h, fit) { + return R._engine.setViewBox.call(this, x, y, w, h, fit); + }; + /*\ + * Paper.top + [ property ] + ** + * Points to the topmost element on the paper + \*/ + /*\ + * Paper.bottom + [ property ] + ** + * Points to the bottom element on the paper + \*/ + paperproto.top = paperproto.bottom = null; + /*\ + * Paper.raphael + [ property ] + ** + * Points to the @Raphael object/function + \*/ + paperproto.raphael = R; + var getOffset = function (elem) { + var box = elem.getBoundingClientRect(), + doc = elem.ownerDocument, + body = doc.body, + docElem = doc.documentElement, + clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0, + top = box.top + (g.win.pageYOffset || docElem.scrollTop || body.scrollTop ) - clientTop, + left = box.left + (g.win.pageXOffset || docElem.scrollLeft || body.scrollLeft) - clientLeft; + return { + y: top, + x: left + }; + }; + /*\ + * Paper.getElementByPoint + [ method ] + ** + * Returns you topmost element under given point. + ** + = (object) Raphaël element object + > Parameters + ** + - x (number) x coordinate from the top left corner of the window + - y (number) y coordinate from the top left corner of the window + > Usage + | paper.getElementByPoint(mouseX, mouseY).attr({stroke: "#f00"}); + \*/ + paperproto.getElementByPoint = function (x, y) { + var paper = this, + svg = paper.canvas, + target = g.doc.elementFromPoint(x, y); + if (g.win.opera && target.tagName == "svg") { + var so = getOffset(svg), + sr = svg.createSVGRect(); + sr.x = x - so.x; + sr.y = y - so.y; + sr.width = sr.height = 1; + var hits = svg.getIntersectionList(sr, null); + if (hits.length) { + target = hits[hits.length - 1]; + } + } + if (!target) { + return null; + } + while (target.parentNode && target != svg.parentNode && !target.raphael) { + target = target.parentNode; + } + target == paper.canvas.parentNode && (target = svg); + target = target && target.raphael ? paper.getById(target.raphaelid) : null; + return target; + }; + + /*\ + * Paper.getElementsByBBox + [ method ] + ** + * Returns set of elements that have an intersecting bounding box + ** + > Parameters + ** + - bbox (object) bbox to check with + = (object) @Set + \*/ + paperproto.getElementsByBBox = function (bbox) { + var set = this.set(); + this.forEach(function (el) { + if (R.isBBoxIntersect(el.getBBox(), bbox)) { + set.push(el); + } + }); + return set; + }; + + /*\ + * Paper.getById + [ method ] + ** + * Returns you element by its internal ID. + ** + > Parameters + ** + - id (number) id + = (object) Raphaël element object + \*/ + paperproto.getById = function (id) { + var bot = this.bottom; + while (bot) { + if (bot.id == id) { + return bot; + } + bot = bot.next; + } + return null; + }; + /*\ + * Paper.forEach + [ method ] + ** + * Executes given function for each element on the paper + * + * If callback function returns `false` it will stop loop running. + ** + > Parameters + ** + - callback (function) function to run + - thisArg (object) context object for the callback + = (object) Paper object + > Usage + | paper.forEach(function (el) { + | el.attr({ stroke: "blue" }); + | }); + \*/ + paperproto.forEach = function (callback, thisArg) { + var bot = this.bottom; + while (bot) { + if (callback.call(thisArg, bot) === false) { + return this; + } + bot = bot.next; + } + return this; + }; + /*\ + * Paper.getElementsByPoint + [ method ] + ** + * Returns set of elements that have common point inside + ** + > Parameters + ** + - x (number) x coordinate of the point + - y (number) y coordinate of the point + = (object) @Set + \*/ + paperproto.getElementsByPoint = function (x, y) { + var set = this.set(); + this.forEach(function (el) { + if (el.isPointInside(x, y)) { + set.push(el); + } + }); + return set; + }; + function x_y() { + return this.x + S + this.y; + } + function x_y_w_h() { + return this.x + S + this.y + S + this.width + " \xd7 " + this.height; + } + /*\ + * Element.isPointInside + [ method ] + ** + * Determine if given point is inside this element’s shape + ** + > Parameters + ** + - x (number) x coordinate of the point + - y (number) y coordinate of the point + = (boolean) `true` if point inside the shape + \*/ + elproto.isPointInside = function (x, y) { + var rp = this.realPath = getPath[this.type](this); + if (this.attr('transform') && this.attr('transform').length) { + rp = R.transformPath(rp, this.attr('transform')); + } + return R.isPointInsidePath(rp, x, y); + }; + /*\ + * Element.getBBox + [ method ] + ** + * Return bounding box for a given element + ** + > Parameters + ** + - isWithoutTransform (boolean) flag, `true` if you want to have bounding box before transformations. Default is `false`. + = (object) Bounding box object: + o { + o x: (number) top left corner x + o y: (number) top left corner y + o x2: (number) bottom right corner x + o y2: (number) bottom right corner y + o width: (number) width + o height: (number) height + o } + \*/ + elproto.getBBox = function (isWithoutTransform) { + if (this.removed) { + return {}; + } + var _ = this._; + if (isWithoutTransform) { + if (_.dirty || !_.bboxwt) { + this.realPath = getPath[this.type](this); + _.bboxwt = pathDimensions(this.realPath); + _.bboxwt.toString = x_y_w_h; + _.dirty = 0; + } + return _.bboxwt; + } + if (_.dirty || _.dirtyT || !_.bbox) { + if (_.dirty || !this.realPath) { + _.bboxwt = 0; + this.realPath = getPath[this.type](this); + } + _.bbox = pathDimensions(mapPath(this.realPath, this.matrix)); + _.bbox.toString = x_y_w_h; + _.dirty = _.dirtyT = 0; + } + return _.bbox; + }; + /*\ + * Element.clone + [ method ] + ** + = (object) clone of a given element + ** + \*/ + elproto.clone = function () { + if (this.removed) { + return null; + } + var out = this.paper[this.type]().attr(this.attr()); + this.__set__ && this.__set__.push(out); + return out; + }; + /*\ + * Element.glow + [ method ] + ** + * Return set of elements that create glow-like effect around given element. See @Paper.set. + * + * Note: Glow is not connected to the element. If you change element attributes it won’t adjust itself. + ** + > Parameters + ** + - glow (object) #optional parameters object with all properties optional: + o { + o width (number) size of the glow, default is `10` + o fill (boolean) will it be filled, default is `false` + o opacity (number) opacity, default is `0.5` + o offsetx (number) horizontal offset, default is `0` + o offsety (number) vertical offset, default is `0` + o color (string) glow colour, default is `black` + o } + = (object) @Paper.set of elements that represents glow + \*/ + elproto.glow = function (glow) { + if (this.type == "text") { + return null; + } + glow = glow || {}; + var s = { + width: (glow.width || 10) + (+this.attr("stroke-width") || 1), + fill: glow.fill || false, + opacity: glow.opacity == null ? .5 : glow.opacity, + offsetx: glow.offsetx || 0, + offsety: glow.offsety || 0, + color: glow.color || "#000" + }, + c = s.width / 2, + r = this.paper, + out = r.set(), + path = this.realPath || getPath[this.type](this); + path = this.matrix ? mapPath(path, this.matrix) : path; + for (var i = 1; i < c + 1; i++) { + out.push(r.path(path).attr({ + stroke: s.color, + fill: s.fill ? s.color : "none", + "stroke-linejoin": "round", + "stroke-linecap": "round", + "stroke-width": +(s.width / c * i).toFixed(3), + opacity: +(s.opacity / c).toFixed(3) + })); + } + return out.insertBefore(this).translate(s.offsetx, s.offsety); + }; + var curveslengths = {}, + getPointAtSegmentLength = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) { + if (length == null) { + return bezlen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y); + } else { + return R.findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, getTatLen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length)); + } + }, + getLengthFactory = function (istotal, subpath) { + return function (path, length, onlystart) { + path = path2curve(path); + var x, y, p, l, sp = "", subpaths = {}, point, + len = 0; + for (var i = 0, ii = path.length; i < ii; i++) { + p = path[i]; + if (p[0] == "M") { + x = +p[1]; + y = +p[2]; + } else { + l = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]); + if (len + l > length) { + if (subpath && !subpaths.start) { + point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len); + sp += ["C" + point.start.x, point.start.y, point.m.x, point.m.y, point.x, point.y]; + if (onlystart) {return sp;} + subpaths.start = sp; + sp = ["M" + point.x, point.y + "C" + point.n.x, point.n.y, point.end.x, point.end.y, p[5], p[6]].join(); + len += l; + x = +p[5]; + y = +p[6]; + continue; + } + if (!istotal && !subpath) { + point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len); + return {x: point.x, y: point.y, alpha: point.alpha}; + } + } + len += l; + x = +p[5]; + y = +p[6]; + } + sp += p.shift() + p; + } + subpaths.end = sp; + point = istotal ? len : subpath ? subpaths : R.findDotsAtSegment(x, y, p[0], p[1], p[2], p[3], p[4], p[5], 1); + point.alpha && (point = {x: point.x, y: point.y, alpha: point.alpha}); + return point; + }; + }; + var getTotalLength = getLengthFactory(1), + getPointAtLength = getLengthFactory(), + getSubpathsAtLength = getLengthFactory(0, 1); + /*\ + * Raphael.getTotalLength + [ method ] + ** + * Returns length of the given path in pixels. + ** + > Parameters + ** + - path (string) SVG path string. + ** + = (number) length. + \*/ + R.getTotalLength = getTotalLength; + /*\ + * Raphael.getPointAtLength + [ method ] + ** + * Return coordinates of the point located at the given length on the given path. + ** + > Parameters + ** + - path (string) SVG path string + - length (number) + ** + = (object) representation of the point: + o { + o x: (number) x coordinate + o y: (number) y coordinate + o alpha: (number) angle of derivative + o } + \*/ + R.getPointAtLength = getPointAtLength; + /*\ + * Raphael.getSubpath + [ method ] + ** + * Return subpath of a given path from given length to given length. + ** + > Parameters + ** + - path (string) SVG path string + - from (number) position of the start of the segment + - to (number) position of the end of the segment + ** + = (string) pathstring for the segment + \*/ + R.getSubpath = function (path, from, to) { + if (this.getTotalLength(path) - to < 1e-6) { + return getSubpathsAtLength(path, from).end; + } + var a = getSubpathsAtLength(path, to, 1); + return from ? getSubpathsAtLength(a, from).end : a; + }; + /*\ + * Element.getTotalLength + [ method ] + ** + * Returns length of the path in pixels. Only works for element of “path” type. + = (number) length. + \*/ + elproto.getTotalLength = function () { + var path = this.getPath(); + if (!path) { + return; + } + + if (this.node.getTotalLength) { + return this.node.getTotalLength(); + } + + return getTotalLength(path); + }; + /*\ + * Element.getPointAtLength + [ method ] + ** + * Return coordinates of the point located at the given length on the given path. Only works for element of “path” type. + ** + > Parameters + ** + - length (number) + ** + = (object) representation of the point: + o { + o x: (number) x coordinate + o y: (number) y coordinate + o alpha: (number) angle of derivative + o } + \*/ + elproto.getPointAtLength = function (length) { + var path = this.getPath(); + if (!path) { + return; + } + + return getPointAtLength(path, length); + }; + /*\ + * Element.getPath + [ method ] + ** + * Returns path of the element. Only works for elements of “path” type and simple elements like circle. + = (object) path + ** + \*/ + elproto.getPath = function () { + var path, + getPath = R._getPath[this.type]; + + if (this.type == "text" || this.type == "set") { + return; + } + + if (getPath) { + path = getPath(this); + } + + return path; + }; + /*\ + * Element.getSubpath + [ method ] + ** + * Return subpath of a given element from given length to given length. Only works for element of “path” type. + ** + > Parameters + ** + - from (number) position of the start of the segment + - to (number) position of the end of the segment + ** + = (string) pathstring for the segment + \*/ + elproto.getSubpath = function (from, to) { + var path = this.getPath(); + if (!path) { + return; + } + + return R.getSubpath(path, from, to); + }; + /*\ + * Raphael.easing_formulas + [ property ] + ** + * Object that contains easing formulas for animation. You could extend it with your own. By default it has following list of easing: + # <ul> + # <li>“linear”</li> + # <li>“<” or “easeIn” or “ease-in”</li> + # <li>“>” or “easeOut” or “ease-out”</li> + # <li>“<>” or “easeInOut” or “ease-in-out”</li> + # <li>“backIn” or “back-in”</li> + # <li>“backOut” or “back-out”</li> + # <li>“elastic”</li> + # <li>“bounce”</li> + # </ul> + # <p>See also <a href="http://raphaeljs.com/easing.html">Easing demo</a>.</p> + \*/ + var ef = R.easing_formulas = { + linear: function (n) { + return n; + }, + "<": function (n) { + return pow(n, 1.7); + }, + ">": function (n) { + return pow(n, .48); + }, + "<>": function (n) { + var q = .48 - n / 1.04, + Q = math.sqrt(.1734 + q * q), + x = Q - q, + X = pow(abs(x), 1 / 3) * (x < 0 ? -1 : 1), + y = -Q - q, + Y = pow(abs(y), 1 / 3) * (y < 0 ? -1 : 1), + t = X + Y + .5; + return (1 - t) * 3 * t * t + t * t * t; + }, + backIn: function (n) { + var s = 1.70158; + return n * n * ((s + 1) * n - s); + }, + backOut: function (n) { + n = n - 1; + var s = 1.70158; + return n * n * ((s + 1) * n + s) + 1; + }, + elastic: function (n) { + if (n == !!n) { + return n; + } + return pow(2, -10 * n) * math.sin((n - .075) * (2 * PI) / .3) + 1; + }, + bounce: function (n) { + var s = 7.5625, + p = 2.75, + l; + if (n < (1 / p)) { + l = s * n * n; + } else { + if (n < (2 / p)) { + n -= (1.5 / p); + l = s * n * n + .75; + } else { + if (n < (2.5 / p)) { + n -= (2.25 / p); + l = s * n * n + .9375; + } else { + n -= (2.625 / p); + l = s * n * n + .984375; + } + } + } + return l; + } + }; + ef.easeIn = ef["ease-in"] = ef["<"]; + ef.easeOut = ef["ease-out"] = ef[">"]; + ef.easeInOut = ef["ease-in-out"] = ef["<>"]; + ef["back-in"] = ef.backIn; + ef["back-out"] = ef.backOut; + + var animationElements = [], + requestAnimFrame = window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function (callback) { + setTimeout(callback, 16); + }, + animation = function () { + var Now = +new Date, + l = 0; + for (; l < animationElements.length; l++) { + var e = animationElements[l]; + if (e.el.removed || e.paused) { + continue; + } + var time = Now - e.start, + ms = e.ms, + easing = e.easing, + from = e.from, + diff = e.diff, + to = e.to, + t = e.t, + that = e.el, + set = {}, + now, + init = {}, + key; + if (e.initstatus) { + time = (e.initstatus * e.anim.top - e.prev) / (e.percent - e.prev) * ms; + e.status = e.initstatus; + delete e.initstatus; + e.stop && animationElements.splice(l--, 1); + } else { + e.status = (e.prev + (e.percent - e.prev) * (time / ms)) / e.anim.top; + } + if (time < 0) { + continue; + } + if (time < ms) { + var pos = easing(time / ms); + for (var attr in from) if (from[has](attr)) { + switch (availableAnimAttrs[attr]) { + case nu: + now = +from[attr] + pos * ms * diff[attr]; + break; + case "colour": + now = "rgb(" + [ + upto255(round(from[attr].r + pos * ms * diff[attr].r)), + upto255(round(from[attr].g + pos * ms * diff[attr].g)), + upto255(round(from[attr].b + pos * ms * diff[attr].b)) + ].join(",") + ")"; + break; + case "path": + now = []; + for (var i = 0, ii = from[attr].length; i < ii; i++) { + now[i] = [from[attr][i][0]]; + for (var j = 1, jj = from[attr][i].length; j < jj; j++) { + now[i][j] = +from[attr][i][j] + pos * ms * diff[attr][i][j]; + } + now[i] = now[i].join(S); + } + now = now.join(S); + break; + case "transform": + if (diff[attr].real) { + now = []; + for (i = 0, ii = from[attr].length; i < ii; i++) { + now[i] = [from[attr][i][0]]; + for (j = 1, jj = from[attr][i].length; j < jj; j++) { + now[i][j] = from[attr][i][j] + pos * ms * diff[attr][i][j]; + } + } + } else { + var get = function (i) { + return +from[attr][i] + pos * ms * diff[attr][i]; + }; + // now = [["r", get(2), 0, 0], ["t", get(3), get(4)], ["s", get(0), get(1), 0, 0]]; + now = [["m", get(0), get(1), get(2), get(3), get(4), get(5)]]; + } + break; + case "csv": + if (attr == "clip-rect") { + now = []; + i = 4; + while (i--) { + now[i] = +from[attr][i] + pos * ms * diff[attr][i]; + } + } + break; + default: + var from2 = [][concat](from[attr]); + now = []; + i = that.paper.customAttributes[attr].length; + while (i--) { + now[i] = +from2[i] + pos * ms * diff[attr][i]; + } + break; + } + set[attr] = now; + } + that.attr(set); + (function (id, that, anim) { + setTimeout(function () { + eve("raphael.anim.frame." + id, that, anim); + }); + })(that.id, that, e.anim); + } else { + (function(f, el, a) { + setTimeout(function() { + eve("raphael.anim.frame." + el.id, el, a); + eve("raphael.anim.finish." + el.id, el, a); + R.is(f, "function") && f.call(el); + }); + })(e.callback, that, e.anim); + that.attr(to); + animationElements.splice(l--, 1); + if (e.repeat > 1 && !e.next) { + for (key in to) if (to[has](key)) { + init[key] = e.totalOrigin[key]; + } + e.el.attr(init); + runAnimation(e.anim, e.el, e.anim.percents[0], null, e.totalOrigin, e.repeat - 1); + } + if (e.next && !e.stop) { + runAnimation(e.anim, e.el, e.next, null, e.totalOrigin, e.repeat); + } + } + } + animationElements.length && requestAnimFrame(animation); + }, + upto255 = function (color) { + return color > 255 ? 255 : color < 0 ? 0 : color; + }; + /*\ + * Element.animateWith + [ method ] + ** + * Acts similar to @Element.animate, but ensure that given animation runs in sync with another given element. + ** + > Parameters + ** + - el (object) element to sync with + - anim (object) animation to sync with + - params (object) #optional final attributes for the element, see also @Element.attr + - ms (number) #optional number of milliseconds for animation to run + - easing (string) #optional easing type. Accept on of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX, XX, XX, XX)` + - callback (function) #optional callback function. Will be called at the end of animation. + * or + - element (object) element to sync with + - anim (object) animation to sync with + - animation (object) #optional animation object, see @Raphael.animation + ** + = (object) original element + \*/ + elproto.animateWith = function (el, anim, params, ms, easing, callback) { + var element = this; + if (element.removed) { + callback && callback.call(element); + return element; + } + var a = params instanceof Animation ? params : R.animation(params, ms, easing, callback), + x, y; + runAnimation(a, element, a.percents[0], null, element.attr()); + for (var i = 0, ii = animationElements.length; i < ii; i++) { + if (animationElements[i].anim == anim && animationElements[i].el == el) { + animationElements[ii - 1].start = animationElements[i].start; + break; + } + } + return element; + // + // + // var a = params ? R.animation(params, ms, easing, callback) : anim, + // status = element.status(anim); + // return this.animate(a).status(a, status * anim.ms / a.ms); + }; + function CubicBezierAtTime(t, p1x, p1y, p2x, p2y, duration) { + var cx = 3 * p1x, + bx = 3 * (p2x - p1x) - cx, + ax = 1 - cx - bx, + cy = 3 * p1y, + by = 3 * (p2y - p1y) - cy, + ay = 1 - cy - by; + function sampleCurveX(t) { + return ((ax * t + bx) * t + cx) * t; + } + function solve(x, epsilon) { + var t = solveCurveX(x, epsilon); + return ((ay * t + by) * t + cy) * t; + } + function solveCurveX(x, epsilon) { + var t0, t1, t2, x2, d2, i; + for(t2 = x, i = 0; i < 8; i++) { + x2 = sampleCurveX(t2) - x; + if (abs(x2) < epsilon) { + return t2; + } + d2 = (3 * ax * t2 + 2 * bx) * t2 + cx; + if (abs(d2) < 1e-6) { + break; + } + t2 = t2 - x2 / d2; + } + t0 = 0; + t1 = 1; + t2 = x; + if (t2 < t0) { + return t0; + } + if (t2 > t1) { + return t1; + } + while (t0 < t1) { + x2 = sampleCurveX(t2); + if (abs(x2 - x) < epsilon) { + return t2; + } + if (x > x2) { + t0 = t2; + } else { + t1 = t2; + } + t2 = (t1 - t0) / 2 + t0; + } + return t2; + } + return solve(t, 1 / (200 * duration)); + } + elproto.onAnimation = function (f) { + f ? eve.on("raphael.anim.frame." + this.id, f) : eve.unbind("raphael.anim.frame." + this.id); + return this; + }; + function Animation(anim, ms) { + var percents = [], + newAnim = {}; + this.ms = ms; + this.times = 1; + if (anim) { + for (var attr in anim) if (anim[has](attr)) { + newAnim[toFloat(attr)] = anim[attr]; + percents.push(toFloat(attr)); + } + percents.sort(sortByNumber); + } + this.anim = newAnim; + this.top = percents[percents.length - 1]; + this.percents = percents; + } + /*\ + * Animation.delay + [ method ] + ** + * Creates a copy of existing animation object with given delay. + ** + > Parameters + ** + - delay (number) number of ms to pass between animation start and actual animation + ** + = (object) new altered Animation object + | var anim = Raphael.animation({cx: 10, cy: 20}, 2e3); + | circle1.animate(anim); // run the given animation immediately + | circle2.animate(anim.delay(500)); // run the given animation after 500 ms + \*/ + Animation.prototype.delay = function (delay) { + var a = new Animation(this.anim, this.ms); + a.times = this.times; + a.del = +delay || 0; + return a; + }; + /*\ + * Animation.repeat + [ method ] + ** + * Creates a copy of existing animation object with given repetition. + ** + > Parameters + ** + - repeat (number) number iterations of animation. For infinite animation pass `Infinity` + ** + = (object) new altered Animation object + \*/ + Animation.prototype.repeat = function (times) { + var a = new Animation(this.anim, this.ms); + a.del = this.del; + a.times = math.floor(mmax(times, 0)) || 1; + return a; + }; + function runAnimation(anim, element, percent, status, totalOrigin, times) { + percent = toFloat(percent); + var params, + isInAnim, + isInAnimSet, + percents = [], + next, + prev, + timestamp, + ms = anim.ms, + from = {}, + to = {}, + diff = {}; + if (status) { + for (i = 0, ii = animationElements.length; i < ii; i++) { + var e = animationElements[i]; + if (e.el.id == element.id && e.anim == anim) { + if (e.percent != percent) { + animationElements.splice(i, 1); + isInAnimSet = 1; + } else { + isInAnim = e; + } + element.attr(e.totalOrigin); + break; + } + } + } else { + status = +to; // NaN + } + for (var i = 0, ii = anim.percents.length; i < ii; i++) { + if (anim.percents[i] == percent || anim.percents[i] > status * anim.top) { + percent = anim.percents[i]; + prev = anim.percents[i - 1] || 0; + ms = ms / anim.top * (percent - prev); + next = anim.percents[i + 1]; + params = anim.anim[percent]; + break; + } else if (status) { + element.attr(anim.anim[anim.percents[i]]); + } + } + if (!params) { + return; + } + if (!isInAnim) { + for (var attr in params) if (params[has](attr)) { + if (availableAnimAttrs[has](attr) || element.paper.customAttributes[has](attr)) { + from[attr] = element.attr(attr); + (from[attr] == null) && (from[attr] = availableAttrs[attr]); + to[attr] = params[attr]; + switch (availableAnimAttrs[attr]) { + case nu: + diff[attr] = (to[attr] - from[attr]) / ms; + break; + case "colour": + from[attr] = R.getRGB(from[attr]); + var toColour = R.getRGB(to[attr]); + diff[attr] = { + r: (toColour.r - from[attr].r) / ms, + g: (toColour.g - from[attr].g) / ms, + b: (toColour.b - from[attr].b) / ms + }; + break; + case "path": + var pathes = path2curve(from[attr], to[attr]), + toPath = pathes[1]; + from[attr] = pathes[0]; + diff[attr] = []; + for (i = 0, ii = from[attr].length; i < ii; i++) { + diff[attr][i] = [0]; + for (var j = 1, jj = from[attr][i].length; j < jj; j++) { + diff[attr][i][j] = (toPath[i][j] - from[attr][i][j]) / ms; + } + } + break; + case "transform": + var _ = element._, + eq = equaliseTransform(_[attr], to[attr]); + if (eq) { + from[attr] = eq.from; + to[attr] = eq.to; + diff[attr] = []; + diff[attr].real = true; + for (i = 0, ii = from[attr].length; i < ii; i++) { + diff[attr][i] = [from[attr][i][0]]; + for (j = 1, jj = from[attr][i].length; j < jj; j++) { + diff[attr][i][j] = (to[attr][i][j] - from[attr][i][j]) / ms; + } + } + } else { + var m = (element.matrix || new Matrix), + to2 = { + _: {transform: _.transform}, + getBBox: function () { + return element.getBBox(1); + } + }; + from[attr] = [ + m.a, + m.b, + m.c, + m.d, + m.e, + m.f + ]; + extractTransform(to2, to[attr]); + to[attr] = to2._.transform; + diff[attr] = [ + (to2.matrix.a - m.a) / ms, + (to2.matrix.b - m.b) / ms, + (to2.matrix.c - m.c) / ms, + (to2.matrix.d - m.d) / ms, + (to2.matrix.e - m.e) / ms, + (to2.matrix.f - m.f) / ms + ]; + // from[attr] = [_.sx, _.sy, _.deg, _.dx, _.dy]; + // var to2 = {_:{}, getBBox: function () { return element.getBBox(); }}; + // extractTransform(to2, to[attr]); + // diff[attr] = [ + // (to2._.sx - _.sx) / ms, + // (to2._.sy - _.sy) / ms, + // (to2._.deg - _.deg) / ms, + // (to2._.dx - _.dx) / ms, + // (to2._.dy - _.dy) / ms + // ]; + } + break; + case "csv": + var values = Str(params[attr])[split](separator), + from2 = Str(from[attr])[split](separator); + if (attr == "clip-rect") { + from[attr] = from2; + diff[attr] = []; + i = from2.length; + while (i--) { + diff[attr][i] = (values[i] - from[attr][i]) / ms; + } + } + to[attr] = values; + break; + default: + values = [][concat](params[attr]); + from2 = [][concat](from[attr]); + diff[attr] = []; + i = element.paper.customAttributes[attr].length; + while (i--) { + diff[attr][i] = ((values[i] || 0) - (from2[i] || 0)) / ms; + } + break; + } + } + } + var easing = params.easing, + easyeasy = R.easing_formulas[easing]; + if (!easyeasy) { + easyeasy = Str(easing).match(bezierrg); + if (easyeasy && easyeasy.length == 5) { + var curve = easyeasy; + easyeasy = function (t) { + return CubicBezierAtTime(t, +curve[1], +curve[2], +curve[3], +curve[4], ms); + }; + } else { + easyeasy = pipe; + } + } + timestamp = params.start || anim.start || +new Date; + e = { + anim: anim, + percent: percent, + timestamp: timestamp, + start: timestamp + (anim.del || 0), + status: 0, + initstatus: status || 0, + stop: false, + ms: ms, + easing: easyeasy, + from: from, + diff: diff, + to: to, + el: element, + callback: params.callback, + prev: prev, + next: next, + repeat: times || anim.times, + origin: element.attr(), + totalOrigin: totalOrigin + }; + animationElements.push(e); + if (status && !isInAnim && !isInAnimSet) { + e.stop = true; + e.start = new Date - ms * status; + if (animationElements.length == 1) { + return animation(); + } + } + if (isInAnimSet) { + e.start = new Date - e.ms * status; + } + animationElements.length == 1 && requestAnimFrame(animation); + } else { + isInAnim.initstatus = status; + isInAnim.start = new Date - isInAnim.ms * status; + } + eve("raphael.anim.start." + element.id, element, anim); + } + /*\ + * Raphael.animation + [ method ] + ** + * Creates an animation object that can be passed to the @Element.animate or @Element.animateWith methods. + * See also @Animation.delay and @Animation.repeat methods. + ** + > Parameters + ** + - params (object) final attributes for the element, see also @Element.attr + - ms (number) number of milliseconds for animation to run + - easing (string) #optional easing type. Accept one of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX, XX, XX, XX)` + - callback (function) #optional callback function. Will be called at the end of animation. + ** + = (object) @Animation + \*/ + R.animation = function (params, ms, easing, callback) { + if (params instanceof Animation) { + return params; + } + if (R.is(easing, "function") || !easing) { + callback = callback || easing || null; + easing = null; + } + params = Object(params); + ms = +ms || 0; + var p = {}, + json, + attr; + for (attr in params) if (params[has](attr) && toFloat(attr) != attr && toFloat(attr) + "%" != attr) { + json = true; + p[attr] = params[attr]; + } + if (!json) { + // if percent-like syntax is used and end-of-all animation callback used + if(callback){ + // find the last one + var lastKey = 0; + for(var i in params){ + var percent = toInt(i); + if(params[has](i) && percent > lastKey){ + lastKey = percent; + } + } + lastKey += '%'; + // if already defined callback in the last keyframe, skip + !params[lastKey].callback && (params[lastKey].callback = callback); + } + return new Animation(params, ms); + } else { + easing && (p.easing = easing); + callback && (p.callback = callback); + return new Animation({100: p}, ms); + } + }; + /*\ + * Element.animate + [ method ] + ** + * Creates and starts animation for given element. + ** + > Parameters + ** + - params (object) final attributes for the element, see also @Element.attr + - ms (number) number of milliseconds for animation to run + - easing (string) #optional easing type. Accept one of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX, XX, XX, XX)` + - callback (function) #optional callback function. Will be called at the end of animation. + * or + - animation (object) animation object, see @Raphael.animation + ** + = (object) original element + \*/ + elproto.animate = function (params, ms, easing, callback) { + var element = this; + if (element.removed) { + callback && callback.call(element); + return element; + } + var anim = params instanceof Animation ? params : R.animation(params, ms, easing, callback); + runAnimation(anim, element, anim.percents[0], null, element.attr()); + return element; + }; + /*\ + * Element.setTime + [ method ] + ** + * Sets the status of animation of the element in milliseconds. Similar to @Element.status method. + ** + > Parameters + ** + - anim (object) animation object + - value (number) number of milliseconds from the beginning of the animation + ** + = (object) original element if `value` is specified + * Note, that during animation following events are triggered: + * + * On each animation frame event `anim.frame.<id>`, on start `anim.start.<id>` and on end `anim.finish.<id>`. + \*/ + elproto.setTime = function (anim, value) { + if (anim && value != null) { + this.status(anim, mmin(value, anim.ms) / anim.ms); + } + return this; + }; + /*\ + * Element.status + [ method ] + ** + * Gets or sets the status of animation of the element. + ** + > Parameters + ** + - anim (object) #optional animation object + - value (number) #optional 0 – 1. If specified, method works like a setter and sets the status of a given animation to the value. This will cause animation to jump to the given position. + ** + = (number) status + * or + = (array) status if `anim` is not specified. Array of objects in format: + o { + o anim: (object) animation object + o status: (number) status + o } + * or + = (object) original element if `value` is specified + \*/ + elproto.status = function (anim, value) { + var out = [], + i = 0, + len, + e; + if (value != null) { + runAnimation(anim, this, -1, mmin(value, 1)); + return this; + } else { + len = animationElements.length; + for (; i < len; i++) { + e = animationElements[i]; + if (e.el.id == this.id && (!anim || e.anim == anim)) { + if (anim) { + return e.status; + } + out.push({ + anim: e.anim, + status: e.status + }); + } + } + if (anim) { + return 0; + } + return out; + } + }; + /*\ + * Element.pause + [ method ] + ** + * Stops animation of the element with ability to resume it later on. + ** + > Parameters + ** + - anim (object) #optional animation object + ** + = (object) original element + \*/ + elproto.pause = function (anim) { + for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) { + if (eve("raphael.anim.pause." + this.id, this, animationElements[i].anim) !== false) { + animationElements[i].paused = true; + } + } + return this; + }; + /*\ + * Element.resume + [ method ] + ** + * Resumes animation if it was paused with @Element.pause method. + ** + > Parameters + ** + - anim (object) #optional animation object + ** + = (object) original element + \*/ + elproto.resume = function (anim) { + for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) { + var e = animationElements[i]; + if (eve("raphael.anim.resume." + this.id, this, e.anim) !== false) { + delete e.paused; + this.status(e.anim, e.status); + } + } + return this; + }; + /*\ + * Element.stop + [ method ] + ** + * Stops animation of the element. + ** + > Parameters + ** + - anim (object) #optional animation object + ** + = (object) original element + \*/ + elproto.stop = function (anim) { + for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) { + if (eve("raphael.anim.stop." + this.id, this, animationElements[i].anim) !== false) { + animationElements.splice(i--, 1); + } + } + return this; + }; + function stopAnimation(paper) { + for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.paper == paper) { + animationElements.splice(i--, 1); + } + } + eve.on("raphael.remove", stopAnimation); + eve.on("raphael.clear", stopAnimation); + elproto.toString = function () { + return "Rapha\xebl\u2019s object"; + }; + + // Set + var Set = function (items) { + this.items = []; + this.length = 0; + this.type = "set"; + if (items) { + for (var i = 0, ii = items.length; i < ii; i++) { + if (items[i] && (items[i].constructor == elproto.constructor || items[i].constructor == Set)) { + this[this.items.length] = this.items[this.items.length] = items[i]; + this.length++; + } + } + } + }, + setproto = Set.prototype; + /*\ + * Set.push + [ method ] + ** + * Adds each argument to the current set. + = (object) original element + \*/ + setproto.push = function () { + var item, + len; + for (var i = 0, ii = arguments.length; i < ii; i++) { + item = arguments[i]; + if (item && (item.constructor == elproto.constructor || item.constructor == Set)) { + len = this.items.length; + this[len] = this.items[len] = item; + this.length++; + } + } + return this; + }; + /*\ + * Set.pop + [ method ] + ** + * Removes last element and returns it. + = (object) element + \*/ + setproto.pop = function () { + this.length && delete this[this.length--]; + return this.items.pop(); + }; + /*\ + * Set.forEach + [ method ] + ** + * Executes given function for each element in the set. + * + * If function returns `false` it will stop loop running. + ** + > Parameters + ** + - callback (function) function to run + - thisArg (object) context object for the callback + = (object) Set object + \*/ + setproto.forEach = function (callback, thisArg) { + for (var i = 0, ii = this.items.length; i < ii; i++) { + if (callback.call(thisArg, this.items[i], i) === false) { + return this; + } + } + return this; + }; + for (var method in elproto) if (elproto[has](method)) { + setproto[method] = (function (methodname) { + return function () { + var arg = arguments; + return this.forEach(function (el) { + el[methodname][apply](el, arg); + }); + }; + })(method); + } + setproto.attr = function (name, value) { + if (name && R.is(name, array) && R.is(name[0], "object")) { + for (var j = 0, jj = name.length; j < jj; j++) { + this.items[j].attr(name[j]); + } + } else { + for (var i = 0, ii = this.items.length; i < ii; i++) { + this.items[i].attr(name, value); + } + } + return this; + }; + /*\ + * Set.clear + [ method ] + ** + * Removes all elements from the set + \*/ + setproto.clear = function () { + while (this.length) { + this.pop(); + } + }; + /*\ + * Set.splice + [ method ] + ** + * Removes given element from the set + ** + > Parameters + ** + - index (number) position of the deletion + - count (number) number of element to remove + - insertion… (object) #optional elements to insert + = (object) set elements that were deleted + \*/ + setproto.splice = function (index, count, insertion) { + index = index < 0 ? mmax(this.length + index, 0) : index; + count = mmax(0, mmin(this.length - index, count)); + var tail = [], + todel = [], + args = [], + i; + for (i = 2; i < arguments.length; i++) { + args.push(arguments[i]); + } + for (i = 0; i < count; i++) { + todel.push(this[index + i]); + } + for (; i < this.length - index; i++) { + tail.push(this[index + i]); + } + var arglen = args.length; + for (i = 0; i < arglen + tail.length; i++) { + this.items[index + i] = this[index + i] = i < arglen ? args[i] : tail[i - arglen]; + } + i = this.items.length = this.length -= count - arglen; + while (this[i]) { + delete this[i++]; + } + return new Set(todel); + }; + /*\ + * Set.exclude + [ method ] + ** + * Removes given element from the set + ** + > Parameters + ** + - element (object) element to remove + = (boolean) `true` if object was found & removed from the set + \*/ + setproto.exclude = function (el) { + for (var i = 0, ii = this.length; i < ii; i++) if (this[i] == el) { + this.splice(i, 1); + return true; + } + }; + setproto.animate = function (params, ms, easing, callback) { + (R.is(easing, "function") || !easing) && (callback = easing || null); + var len = this.items.length, + i = len, + item, + set = this, + collector; + if (!len) { + return this; + } + callback && (collector = function () { + !--len && callback.call(set); + }); + easing = R.is(easing, string) ? easing : collector; + var anim = R.animation(params, ms, easing, collector); + item = this.items[--i].animate(anim); + while (i--) { + this.items[i] && !this.items[i].removed && this.items[i].animateWith(item, anim, anim); + (this.items[i] && !this.items[i].removed) || len--; + } + return this; + }; + setproto.insertAfter = function (el) { + var i = this.items.length; + while (i--) { + this.items[i].insertAfter(el); + } + return this; + }; + setproto.getBBox = function () { + var x = [], + y = [], + x2 = [], + y2 = []; + for (var i = this.items.length; i--;) if (!this.items[i].removed) { + var box = this.items[i].getBBox(); + x.push(box.x); + y.push(box.y); + x2.push(box.x + box.width); + y2.push(box.y + box.height); + } + x = mmin[apply](0, x); + y = mmin[apply](0, y); + x2 = mmax[apply](0, x2); + y2 = mmax[apply](0, y2); + return { + x: x, + y: y, + x2: x2, + y2: y2, + width: x2 - x, + height: y2 - y + }; + }; + setproto.clone = function (s) { + s = this.paper.set(); + for (var i = 0, ii = this.items.length; i < ii; i++) { + s.push(this.items[i].clone()); + } + return s; + }; + setproto.toString = function () { + return "Rapha\xebl\u2018s set"; + }; + + setproto.glow = function(glowConfig) { + var ret = this.paper.set(); + this.forEach(function(shape, index){ + var g = shape.glow(glowConfig); + if(g != null){ + g.forEach(function(shape2, index2){ + ret.push(shape2); + }); + } + }); + return ret; + }; + + + /*\ + * Set.isPointInside + [ method ] + ** + * Determine if given point is inside this set’s elements + ** + > Parameters + ** + - x (number) x coordinate of the point + - y (number) y coordinate of the point + = (boolean) `true` if point is inside any of the set's elements + \*/ + setproto.isPointInside = function (x, y) { + var isPointInside = false; + this.forEach(function (el) { + if (el.isPointInside(x, y)) { + isPointInside = true; + return false; // stop loop + } + }); + return isPointInside; + }; + + /*\ + * Raphael.registerFont + [ method ] + ** + * Adds given font to the registered set of fonts for Raphaël. Should be used as an internal call from within Cufón’s font file. + * Returns original parameter, so it could be used with chaining. + # <a href="http://wiki.github.com/sorccu/cufon/about">More about Cufón and how to convert your font form TTF, OTF, etc to JavaScript file.</a> + ** + > Parameters + ** + - font (object) the font to register + = (object) the font you passed in + > Usage + | Cufon.registerFont(Raphael.registerFont({…})); + \*/ + R.registerFont = function (font) { + if (!font.face) { + return font; + } + this.fonts = this.fonts || {}; + var fontcopy = { + w: font.w, + face: {}, + glyphs: {} + }, + family = font.face["font-family"]; + for (var prop in font.face) if (font.face[has](prop)) { + fontcopy.face[prop] = font.face[prop]; + } + if (this.fonts[family]) { + this.fonts[family].push(fontcopy); + } else { + this.fonts[family] = [fontcopy]; + } + if (!font.svg) { + fontcopy.face["units-per-em"] = toInt(font.face["units-per-em"], 10); + for (var glyph in font.glyphs) if (font.glyphs[has](glyph)) { + var path = font.glyphs[glyph]; + fontcopy.glyphs[glyph] = { + w: path.w, + k: {}, + d: path.d && "M" + path.d.replace(/[mlcxtrv]/g, function (command) { + return {l: "L", c: "C", x: "z", t: "m", r: "l", v: "c"}[command] || "M"; + }) + "z" + }; + if (path.k) { + for (var k in path.k) if (path[has](k)) { + fontcopy.glyphs[glyph].k[k] = path.k[k]; + } + } + } + } + return font; + }; + /*\ + * Paper.getFont + [ method ] + ** + * Finds font object in the registered fonts by given parameters. You could specify only one word from the font name, like “Myriad” for “Myriad Pro”. + ** + > Parameters + ** + - family (string) font family name or any word from it + - weight (string) #optional font weight + - style (string) #optional font style + - stretch (string) #optional font stretch + = (object) the font object + > Usage + | paper.print(100, 100, "Test string", paper.getFont("Times", 800), 30); + \*/ + paperproto.getFont = function (family, weight, style, stretch) { + stretch = stretch || "normal"; + style = style || "normal"; + weight = +weight || {normal: 400, bold: 700, lighter: 300, bolder: 800}[weight] || 400; + if (!R.fonts) { + return; + } + var font = R.fonts[family]; + if (!font) { + var name = new RegExp("(^|\\s)" + family.replace(/[^\w\d\s+!~.:_-]/g, E) + "(\\s|$)", "i"); + for (var fontName in R.fonts) if (R.fonts[has](fontName)) { + if (name.test(fontName)) { + font = R.fonts[fontName]; + break; + } + } + } + var thefont; + if (font) { + for (var i = 0, ii = font.length; i < ii; i++) { + thefont = font[i]; + if (thefont.face["font-weight"] == weight && (thefont.face["font-style"] == style || !thefont.face["font-style"]) && thefont.face["font-stretch"] == stretch) { + break; + } + } + } + return thefont; + }; + /*\ + * Paper.print + [ method ] + ** + * Creates path that represent given text written using given font at given position with given size. + * Result of the method is path element that contains whole text as a separate path. + ** + > Parameters + ** + - x (number) x position of the text + - y (number) y position of the text + - string (string) text to print + - font (object) font object, see @Paper.getFont + - size (number) #optional size of the font, default is `16` + - origin (string) #optional could be `"baseline"` or `"middle"`, default is `"middle"` + - letter_spacing (number) #optional number in range `-1..1`, default is `0` + - line_spacing (number) #optional number in range `1..3`, default is `1` + = (object) resulting path element, which consist of all letters + > Usage + | var txt = r.print(10, 50, "print", r.getFont("Museo"), 30).attr({fill: "#fff"}); + \*/ + paperproto.print = function (x, y, string, font, size, origin, letter_spacing, line_spacing) { + origin = origin || "middle"; // baseline|middle + letter_spacing = mmax(mmin(letter_spacing || 0, 1), -1); + line_spacing = mmax(mmin(line_spacing || 1, 3), 1); + var letters = Str(string)[split](E), + shift = 0, + notfirst = 0, + path = E, + scale; + R.is(font, "string") && (font = this.getFont(font)); + if (font) { + scale = (size || 16) / font.face["units-per-em"]; + var bb = font.face.bbox[split](separator), + top = +bb[0], + lineHeight = bb[3] - bb[1], + shifty = 0, + height = +bb[1] + (origin == "baseline" ? lineHeight + (+font.face.descent) : lineHeight / 2); + for (var i = 0, ii = letters.length; i < ii; i++) { + if (letters[i] == "\n") { + shift = 0; + curr = 0; + notfirst = 0; + shifty += lineHeight * line_spacing; + } else { + var prev = notfirst && font.glyphs[letters[i - 1]] || {}, + curr = font.glyphs[letters[i]]; + shift += notfirst ? (prev.w || font.w) + (prev.k && prev.k[letters[i]] || 0) + (font.w * letter_spacing) : 0; + notfirst = 1; + } + if (curr && curr.d) { + path += R.transformPath(curr.d, ["t", shift * scale, shifty * scale, "s", scale, scale, top, height, "t", (x - top) / scale, (y - height) / scale]); + } + } + } + return this.path(path).attr({ + fill: "#000", + stroke: "none" + }); + }; + + /*\ + * Paper.add + [ method ] + ** + * Imports elements in JSON array in format `{type: type, <attributes>}` + ** + > Parameters + ** + - json (array) + = (object) resulting set of imported elements + > Usage + | paper.add([ + | { + | type: "circle", + | cx: 10, + | cy: 10, + | r: 5 + | }, + | { + | type: "rect", + | x: 10, + | y: 10, + | width: 10, + | height: 10, + | fill: "#fc0" + | } + | ]); + \*/ + paperproto.add = function (json) { + if (R.is(json, "array")) { + var res = this.set(), + i = 0, + ii = json.length, + j; + for (; i < ii; i++) { + j = json[i] || {}; + elements[has](j.type) && res.push(this[j.type]().attr(j)); + } + } + return res; + }; + + /*\ + * Raphael.format + [ method ] + ** + * Simple format function. Replaces construction of type “`{<number>}`” to the corresponding argument. + ** + > Parameters + ** + - token (string) string to format + - … (string) rest of arguments will be treated as parameters for replacement + = (string) formated string + > Usage + | var x = 10, + | y = 20, + | width = 40, + | height = 50; + | // this will draw a rectangular shape equivalent to "M10,20h40v50h-40z" + | paper.path(Raphael.format("M{0},{1}h{2}v{3}h{4}z", x, y, width, height, -width)); + \*/ + R.format = function (token, params) { + var args = R.is(params, array) ? [0][concat](params) : arguments; + token && R.is(token, string) && args.length - 1 && (token = token.replace(formatrg, function (str, i) { + return args[++i] == null ? E : args[i]; + })); + return token || E; + }; + /*\ + * Raphael.fullfill + [ method ] + ** + * A little bit more advanced format function than @Raphael.format. Replaces construction of type “`{<name>}`” to the corresponding argument. + ** + > Parameters + ** + - token (string) string to format + - json (object) object which properties will be used as a replacement + = (string) formated string + > Usage + | // this will draw a rectangular shape equivalent to "M10,20h40v50h-40z" + | paper.path(Raphael.fullfill("M{x},{y}h{dim.width}v{dim.height}h{dim['negative width']}z", { + | x: 10, + | y: 20, + | dim: { + | width: 40, + | height: 50, + | "negative width": -40 + | } + | })); + \*/ + R.fullfill = (function () { + var tokenRegex = /\{([^\}]+)\}/g, + objNotationRegex = /(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g, // matches .xxxxx or ["xxxxx"] to run over object properties + replacer = function (all, key, obj) { + var res = obj; + key.replace(objNotationRegex, function (all, name, quote, quotedName, isFunc) { + name = name || quotedName; + if (res) { + if (name in res) { + res = res[name]; + } + typeof res == "function" && isFunc && (res = res()); + } + }); + res = (res == null || res == obj ? all : res) + ""; + return res; + }; + return function (str, obj) { + return String(str).replace(tokenRegex, function (all, key) { + return replacer(all, key, obj); + }); + }; + })(); + /*\ + * Raphael.ninja + [ method ] + ** + * If you want to leave no trace of Raphaël (Well, Raphaël creates only one global variable `Raphael`, but anyway.) You can use `ninja` method. + * Beware, that in this case plugins could stop working, because they are depending on global variable existence. + ** + = (object) Raphael object + > Usage + | (function (local_raphael) { + | var paper = local_raphael(10, 10, 320, 200); + | … + | })(Raphael.ninja()); + \*/ + R.ninja = function () { + if (oldRaphael.was) { + g.win.Raphael = oldRaphael.is; + } else { + // IE8 raises an error when deleting window property + window.Raphael = undefined; + try { + delete window.Raphael; + } catch(e) {} + } + return R; + }; + /*\ + * Raphael.st + [ property (object) ] + ** + * You can add your own method to elements and sets. It is wise to add a set method for each element method + * you added, so you will be able to call the same method on sets too. + ** + * See also @Raphael.el. + > Usage + | Raphael.el.red = function () { + | this.attr({fill: "#f00"}); + | }; + | Raphael.st.red = function () { + | this.forEach(function (el) { + | el.red(); + | }); + | }; + | // then use it + | paper.set(paper.circle(100, 100, 20), paper.circle(110, 100, 20)).red(); + \*/ + R.st = setproto; + + eve.on("raphael.DOMload", function () { + loaded = true; + }); + + // Firefox <3.6 fix: http://webreflection.blogspot.com/2009/11/195-chars-to-help-lazy-loading.html + (function (doc, loaded, f) { + if (doc.readyState == null && doc.addEventListener){ + doc.addEventListener(loaded, f = function () { + doc.removeEventListener(loaded, f, false); + doc.readyState = "complete"; + }, false); + doc.readyState = "loading"; + } + function isLoaded() { + (/in/).test(doc.readyState) ? setTimeout(isLoaded, 9) : R.eve("raphael.DOMload"); + } + isLoaded(); + })(document, "DOMContentLoaded"); + + return R; + }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + + +/***/ }, +/* 2 */ +/***/ function(module, exports) { + + module.exports = __WEBPACK_EXTERNAL_MODULE_2__; + +/***/ }, +/* 3 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(1)], __WEBPACK_AMD_DEFINE_RESULT__ = function(R) { + if (R && !R.svg) { + return; + } + + var has = "hasOwnProperty", + Str = String, + toFloat = parseFloat, + toInt = parseInt, + math = Math, + mmax = math.max, + abs = math.abs, + pow = math.pow, + separator = /[, ]+/, + eve = R.eve, + E = "", + S = " "; + var xlink = "http://www.w3.org/1999/xlink", + markers = { + block: "M5,0 0,2.5 5,5z", + classic: "M5,0 0,2.5 5,5 3.5,3 3.5,2z", + diamond: "M2.5,0 5,2.5 2.5,5 0,2.5z", + open: "M6,1 1,3.5 6,6", + oval: "M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z" + }, + markerCounter = {}; + R.toString = function () { + return "Your browser supports SVG.\nYou are running Rapha\xebl " + this.version; + }; + var $ = function (el, attr) { + if (attr) { + if (typeof el == "string") { + el = $(el); + } + for (var key in attr) if (attr[has](key)) { + if (key.substring(0, 6) == "xlink:") { + el.setAttributeNS(xlink, key.substring(6), Str(attr[key])); + } else { + el.setAttribute(key, Str(attr[key])); + } + } + } else { + el = R._g.doc.createElementNS("http://www.w3.org/2000/svg", el); + el.style && (el.style.webkitTapHighlightColor = "rgba(0,0,0,0)"); + } + return el; + }, + addGradientFill = function (element, gradient) { + var type = "linear", + id = element.id + gradient, + fx = .5, fy = .5, + o = element.node, + SVG = element.paper, + s = o.style, + el = R._g.doc.getElementById(id); + if (!el) { + gradient = Str(gradient).replace(R._radial_gradient, function (all, _fx, _fy) { + type = "radial"; + if (_fx && _fy) { + fx = toFloat(_fx); + fy = toFloat(_fy); + var dir = ((fy > .5) * 2 - 1); + pow(fx - .5, 2) + pow(fy - .5, 2) > .25 && + (fy = math.sqrt(.25 - pow(fx - .5, 2)) * dir + .5) && + fy != .5 && + (fy = fy.toFixed(5) - 1e-5 * dir); + } + return E; + }); + gradient = gradient.split(/\s*\-\s*/); + if (type == "linear") { + var angle = gradient.shift(); + angle = -toFloat(angle); + if (isNaN(angle)) { + return null; + } + var vector = [0, 0, math.cos(R.rad(angle)), math.sin(R.rad(angle))], + max = 1 / (mmax(abs(vector[2]), abs(vector[3])) || 1); + vector[2] *= max; + vector[3] *= max; + if (vector[2] < 0) { + vector[0] = -vector[2]; + vector[2] = 0; + } + if (vector[3] < 0) { + vector[1] = -vector[3]; + vector[3] = 0; + } + } + var dots = R._parseDots(gradient); + if (!dots) { + return null; + } + id = id.replace(/[\(\)\s,\xb0#]/g, "_"); + + if (element.gradient && id != element.gradient.id) { + SVG.defs.removeChild(element.gradient); + delete element.gradient; + } + + if (!element.gradient) { + el = $(type + "Gradient", {id: id}); + element.gradient = el; + $(el, type == "radial" ? { + fx: fx, + fy: fy + } : { + x1: vector[0], + y1: vector[1], + x2: vector[2], + y2: vector[3], + gradientTransform: element.matrix.invert() + }); + SVG.defs.appendChild(el); + for (var i = 0, ii = dots.length; i < ii; i++) { + el.appendChild($("stop", { + offset: dots[i].offset ? dots[i].offset : i ? "100%" : "0%", + "stop-color": dots[i].color || "#fff", + "stop-opacity": isFinite(dots[i].opacity) ? dots[i].opacity : 1 + })); + } + } + } + $(o, { + fill: fillurl(id), + opacity: 1, + "fill-opacity": 1 + }); + s.fill = E; + s.opacity = 1; + s.fillOpacity = 1; + return 1; + }, + isIE9or10 = function () { + var mode = document.documentMode; + return mode && (mode === 9 || mode === 10); + }, + fillurl = function (id) { + if (isIE9or10()) { + return "url('#" + id + "')"; + } + var location = document.location; + var locationString = ( + location.protocol + '//' + + location.host + + location.pathname + + location.search + ); + return "url('" + locationString + "#" + id + "')"; + }, + updatePosition = function (o) { + var bbox = o.getBBox(1); + $(o.pattern, {patternTransform: o.matrix.invert() + " translate(" + bbox.x + "," + bbox.y + ")"}); + }, + addArrow = function (o, value, isEnd) { + if (o.type == "path") { + var values = Str(value).toLowerCase().split("-"), + p = o.paper, + se = isEnd ? "end" : "start", + node = o.node, + attrs = o.attrs, + stroke = attrs["stroke-width"], + i = values.length, + type = "classic", + from, + to, + dx, + refX, + attr, + w = 3, + h = 3, + t = 5; + while (i--) { + switch (values[i]) { + case "block": + case "classic": + case "oval": + case "diamond": + case "open": + case "none": + type = values[i]; + break; + case "wide": h = 5; break; + case "narrow": h = 2; break; + case "long": w = 5; break; + case "short": w = 2; break; + } + } + if (type == "open") { + w += 2; + h += 2; + t += 2; + dx = 1; + refX = isEnd ? 4 : 1; + attr = { + fill: "none", + stroke: attrs.stroke + }; + } else { + refX = dx = w / 2; + attr = { + fill: attrs.stroke, + stroke: "none" + }; + } + if (o._.arrows) { + if (isEnd) { + o._.arrows.endPath && markerCounter[o._.arrows.endPath]--; + o._.arrows.endMarker && markerCounter[o._.arrows.endMarker]--; + } else { + o._.arrows.startPath && markerCounter[o._.arrows.startPath]--; + o._.arrows.startMarker && markerCounter[o._.arrows.startMarker]--; + } + } else { + o._.arrows = {}; + } + if (type != "none") { + var pathId = "raphael-marker-" + type, + markerId = "raphael-marker-" + se + type + w + h + "-obj" + o.id; + if (!R._g.doc.getElementById(pathId)) { + p.defs.appendChild($($("path"), { + "stroke-linecap": "round", + d: markers[type], + id: pathId + })); + markerCounter[pathId] = 1; + } else { + markerCounter[pathId]++; + } + var marker = R._g.doc.getElementById(markerId), + use; + if (!marker) { + marker = $($("marker"), { + id: markerId, + markerHeight: h, + markerWidth: w, + orient: "auto", + refX: refX, + refY: h / 2 + }); + use = $($("use"), { + "xlink:href": "#" + pathId, + transform: (isEnd ? "rotate(180 " + w / 2 + " " + h / 2 + ") " : E) + "scale(" + w / t + "," + h / t + ")", + "stroke-width": (1 / ((w / t + h / t) / 2)).toFixed(4) + }); + marker.appendChild(use); + p.defs.appendChild(marker); + markerCounter[markerId] = 1; + } else { + markerCounter[markerId]++; + use = marker.getElementsByTagName("use")[0]; + } + $(use, attr); + var delta = dx * (type != "diamond" && type != "oval"); + if (isEnd) { + from = o._.arrows.startdx * stroke || 0; + to = R.getTotalLength(attrs.path) - delta * stroke; + } else { + from = delta * stroke; + to = R.getTotalLength(attrs.path) - (o._.arrows.enddx * stroke || 0); + } + attr = {}; + attr["marker-" + se] = "url(#" + markerId + ")"; + if (to || from) { + attr.d = R.getSubpath(attrs.path, from, to); + } + $(node, attr); + o._.arrows[se + "Path"] = pathId; + o._.arrows[se + "Marker"] = markerId; + o._.arrows[se + "dx"] = delta; + o._.arrows[se + "Type"] = type; + o._.arrows[se + "String"] = value; + } else { + if (isEnd) { + from = o._.arrows.startdx * stroke || 0; + to = R.getTotalLength(attrs.path) - from; + } else { + from = 0; + to = R.getTotalLength(attrs.path) - (o._.arrows.enddx * stroke || 0); + } + o._.arrows[se + "Path"] && $(node, {d: R.getSubpath(attrs.path, from, to)}); + delete o._.arrows[se + "Path"]; + delete o._.arrows[se + "Marker"]; + delete o._.arrows[se + "dx"]; + delete o._.arrows[se + "Type"]; + delete o._.arrows[se + "String"]; + } + for (attr in markerCounter) if (markerCounter[has](attr) && !markerCounter[attr]) { + var item = R._g.doc.getElementById(attr); + item && item.parentNode.removeChild(item); + } + } + }, + dasharray = { + "-": [3, 1], + ".": [1, 1], + "-.": [3, 1, 1, 1], + "-..": [3, 1, 1, 1, 1, 1], + ". ": [1, 3], + "- ": [4, 3], + "--": [8, 3], + "- .": [4, 3, 1, 3], + "--.": [8, 3, 1, 3], + "--..": [8, 3, 1, 3, 1, 3] + }, + addDashes = function (o, value, params) { + value = dasharray[Str(value).toLowerCase()]; + if (value) { + var width = o.attrs["stroke-width"] || "1", + butt = {round: width, square: width, butt: 0}[o.attrs["stroke-linecap"] || params["stroke-linecap"]] || 0, + dashes = [], + i = value.length; + while (i--) { + dashes[i] = value[i] * width + ((i % 2) ? 1 : -1) * butt; + } + $(o.node, {"stroke-dasharray": dashes.join(",")}); + } + else { + $(o.node, {"stroke-dasharray": "none"}); + } + }, + setFillAndStroke = function (o, params) { + var node = o.node, + attrs = o.attrs, + vis = node.style.visibility; + node.style.visibility = "hidden"; + for (var att in params) { + if (params[has](att)) { + if (!R._availableAttrs[has](att)) { + continue; + } + var value = params[att]; + attrs[att] = value; + switch (att) { + case "blur": + o.blur(value); + break; + case "title": + var title = node.getElementsByTagName("title"); + + // Use the existing <title>. + if (title.length && (title = title[0])) { + title.firstChild.nodeValue = value; + } else { + title = $("title"); + var val = R._g.doc.createTextNode(value); + title.appendChild(val); + node.appendChild(title); + } + break; + case "href": + case "target": + var pn = node.parentNode; + if (pn.tagName.toLowerCase() != "a") { + var hl = $("a"); + pn.insertBefore(hl, node); + hl.appendChild(node); + pn = hl; + } + if (att == "target") { + pn.setAttributeNS(xlink, "show", value == "blank" ? "new" : value); + } else { + pn.setAttributeNS(xlink, att, value); + } + break; + case "cursor": + node.style.cursor = value; + break; + case "transform": + o.transform(value); + break; + case "arrow-start": + addArrow(o, value); + break; + case "arrow-end": + addArrow(o, value, 1); + break; + case "clip-rect": + var rect = Str(value).split(separator); + if (rect.length == 4) { + o.clip && o.clip.parentNode.parentNode.removeChild(o.clip.parentNode); + var el = $("clipPath"), + rc = $("rect"); + el.id = R.createUUID(); + $(rc, { + x: rect[0], + y: rect[1], + width: rect[2], + height: rect[3] + }); + el.appendChild(rc); + o.paper.defs.appendChild(el); + $(node, {"clip-path": "url(#" + el.id + ")"}); + o.clip = rc; + } + if (!value) { + var path = node.getAttribute("clip-path"); + if (path) { + var clip = R._g.doc.getElementById(path.replace(/(^url\(#|\)$)/g, E)); + clip && clip.parentNode.removeChild(clip); + $(node, {"clip-path": E}); + delete o.clip; + } + } + break; + case "path": + if (o.type == "path") { + $(node, {d: value ? attrs.path = R._pathToAbsolute(value) : "M0,0"}); + o._.dirty = 1; + if (o._.arrows) { + "startString" in o._.arrows && addArrow(o, o._.arrows.startString); + "endString" in o._.arrows && addArrow(o, o._.arrows.endString, 1); + } + } + break; + case "width": + node.setAttribute(att, value); + o._.dirty = 1; + if (attrs.fx) { + att = "x"; + value = attrs.x; + } else { + break; + } + case "x": + if (attrs.fx) { + value = -attrs.x - (attrs.width || 0); + } + case "rx": + if (att == "rx" && o.type == "rect") { + break; + } + case "cx": + node.setAttribute(att, value); + o.pattern && updatePosition(o); + o._.dirty = 1; + break; + case "height": + node.setAttribute(att, value); + o._.dirty = 1; + if (attrs.fy) { + att = "y"; + value = attrs.y; + } else { + break; + } + case "y": + if (attrs.fy) { + value = -attrs.y - (attrs.height || 0); + } + case "ry": + if (att == "ry" && o.type == "rect") { + break; + } + case "cy": + node.setAttribute(att, value); + o.pattern && updatePosition(o); + o._.dirty = 1; + break; + case "r": + if (o.type == "rect") { + $(node, {rx: value, ry: value}); + } else { + node.setAttribute(att, value); + } + o._.dirty = 1; + break; + case "src": + if (o.type == "image") { + node.setAttributeNS(xlink, "href", value); + } + break; + case "stroke-width": + if (o._.sx != 1 || o._.sy != 1) { + value /= mmax(abs(o._.sx), abs(o._.sy)) || 1; + } + node.setAttribute(att, value); + if (attrs["stroke-dasharray"]) { + addDashes(o, attrs["stroke-dasharray"], params); + } + if (o._.arrows) { + "startString" in o._.arrows && addArrow(o, o._.arrows.startString); + "endString" in o._.arrows && addArrow(o, o._.arrows.endString, 1); + } + break; + case "stroke-dasharray": + addDashes(o, value, params); + break; + case "fill": + var isURL = Str(value).match(R._ISURL); + if (isURL) { + el = $("pattern"); + var ig = $("image"); + el.id = R.createUUID(); + $(el, {x: 0, y: 0, patternUnits: "userSpaceOnUse", height: 1, width: 1}); + $(ig, {x: 0, y: 0, "xlink:href": isURL[1]}); + el.appendChild(ig); + + (function (el) { + R._preload(isURL[1], function () { + var w = this.offsetWidth, + h = this.offsetHeight; + $(el, {width: w, height: h}); + $(ig, {width: w, height: h}); + }); + })(el); + o.paper.defs.appendChild(el); + $(node, {fill: "url(#" + el.id + ")"}); + o.pattern = el; + o.pattern && updatePosition(o); + break; + } + var clr = R.getRGB(value); + if (!clr.error) { + delete params.gradient; + delete attrs.gradient; + !R.is(attrs.opacity, "undefined") && + R.is(params.opacity, "undefined") && + $(node, {opacity: attrs.opacity}); + !R.is(attrs["fill-opacity"], "undefined") && + R.is(params["fill-opacity"], "undefined") && + $(node, {"fill-opacity": attrs["fill-opacity"]}); + } else if ((o.type == "circle" || o.type == "ellipse" || Str(value).charAt() != "r") && addGradientFill(o, value)) { + if ("opacity" in attrs || "fill-opacity" in attrs) { + var gradient = R._g.doc.getElementById(node.getAttribute("fill").replace(/^url\(#|\)$/g, E)); + if (gradient) { + var stops = gradient.getElementsByTagName("stop"); + $(stops[stops.length - 1], {"stop-opacity": ("opacity" in attrs ? attrs.opacity : 1) * ("fill-opacity" in attrs ? attrs["fill-opacity"] : 1)}); + } + } + attrs.gradient = value; + attrs.fill = "none"; + break; + } + clr[has]("opacity") && $(node, {"fill-opacity": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity}); + case "stroke": + clr = R.getRGB(value); + node.setAttribute(att, clr.hex); + att == "stroke" && clr[has]("opacity") && $(node, {"stroke-opacity": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity}); + if (att == "stroke" && o._.arrows) { + "startString" in o._.arrows && addArrow(o, o._.arrows.startString); + "endString" in o._.arrows && addArrow(o, o._.arrows.endString, 1); + } + break; + case "gradient": + (o.type == "circle" || o.type == "ellipse" || Str(value).charAt() != "r") && addGradientFill(o, value); + break; + case "opacity": + if (attrs.gradient && !attrs[has]("stroke-opacity")) { + $(node, {"stroke-opacity": value > 1 ? value / 100 : value}); + } + // fall + case "fill-opacity": + if (attrs.gradient) { + gradient = R._g.doc.getElementById(node.getAttribute("fill").replace(/^url\(#|\)$/g, E)); + if (gradient) { + stops = gradient.getElementsByTagName("stop"); + $(stops[stops.length - 1], {"stop-opacity": value}); + } + break; + } + default: + att == "font-size" && (value = toInt(value, 10) + "px"); + var cssrule = att.replace(/(\-.)/g, function (w) { + return w.substring(1).toUpperCase(); + }); + node.style[cssrule] = value; + o._.dirty = 1; + node.setAttribute(att, value); + break; + } + } + } + + tuneText(o, params); + node.style.visibility = vis; + }, + leading = 1.2, + tuneText = function (el, params) { + if (el.type != "text" || !(params[has]("text") || params[has]("font") || params[has]("font-size") || params[has]("x") || params[has]("y"))) { + return; + } + var a = el.attrs, + node = el.node, + fontSize = node.firstChild ? toInt(R._g.doc.defaultView.getComputedStyle(node.firstChild, E).getPropertyValue("font-size"), 10) : 10; + + if (params[has]("text")) { + a.text = params.text; + while (node.firstChild) { + node.removeChild(node.firstChild); + } + var texts = Str(params.text).split("\n"), + tspans = [], + tspan; + for (var i = 0, ii = texts.length; i < ii; i++) { + tspan = $("tspan"); + i && $(tspan, {dy: fontSize * leading, x: a.x}); + tspan.appendChild(R._g.doc.createTextNode(texts[i])); + node.appendChild(tspan); + tspans[i] = tspan; + } + } else { + tspans = node.getElementsByTagName("tspan"); + for (i = 0, ii = tspans.length; i < ii; i++) if (i) { + $(tspans[i], {dy: fontSize * leading, x: a.x}); + } else { + $(tspans[0], {dy: 0}); + } + } + $(node, {x: a.x, y: a.y}); + el._.dirty = 1; + var bb = el._getBBox(), + dif = a.y - (bb.y + bb.height / 2); + dif && R.is(dif, "finite") && $(tspans[0], {dy: dif}); + }, + getRealNode = function (node) { + if (node.parentNode && node.parentNode.tagName.toLowerCase() === "a") { + return node.parentNode; + } else { + return node; + } + }, + Element = function (node, svg) { + var X = 0, + Y = 0; + /*\ + * Element.node + [ property (object) ] + ** + * Gives you a reference to the DOM object, so you can assign event handlers or just mess around. + ** + * Note: Don’t mess with it. + > Usage + | // draw a circle at coordinate 10,10 with radius of 10 + | var c = paper.circle(10, 10, 10); + | c.node.onclick = function () { + | c.attr("fill", "red"); + | }; + \*/ + this[0] = this.node = node; + /*\ + * Element.raphael + [ property (object) ] + ** + * Internal reference to @Raphael object. In case it is not available. + > Usage + | Raphael.el.red = function () { + | var hsb = this.paper.raphael.rgb2hsb(this.attr("fill")); + | hsb.h = 1; + | this.attr({fill: this.paper.raphael.hsb2rgb(hsb).hex}); + | } + \*/ + node.raphael = true; + /*\ + * Element.id + [ property (number) ] + ** + * Unique id of the element. Especially useful when you want to listen to events of the element, + * because all events are fired in format `<module>.<action>.<id>`. Also useful for @Paper.getById method. + \*/ + this.id = R._oid++; + node.raphaelid = this.id; + this.matrix = R.matrix(); + this.realPath = null; + /*\ + * Element.paper + [ property (object) ] + ** + * Internal reference to “paper” where object drawn. Mainly for use in plugins and element extensions. + > Usage + | Raphael.el.cross = function () { + | this.attr({fill: "red"}); + | this.paper.path("M10,10L50,50M50,10L10,50") + | .attr({stroke: "red"}); + | } + \*/ + this.paper = svg; + this.attrs = this.attrs || {}; + this._ = { + transform: [], + sx: 1, + sy: 1, + deg: 0, + dx: 0, + dy: 0, + dirty: 1 + }; + !svg.bottom && (svg.bottom = this); + /*\ + * Element.prev + [ property (object) ] + ** + * Reference to the previous element in the hierarchy. + \*/ + this.prev = svg.top; + svg.top && (svg.top.next = this); + svg.top = this; + /*\ + * Element.next + [ property (object) ] + ** + * Reference to the next element in the hierarchy. + \*/ + this.next = null; + }, + elproto = R.el; + + Element.prototype = elproto; + elproto.constructor = Element; + + R._engine.path = function (pathString, SVG) { + var el = $("path"); + SVG.canvas && SVG.canvas.appendChild(el); + var p = new Element(el, SVG); + p.type = "path"; + setFillAndStroke(p, { + fill: "none", + stroke: "#000", + path: pathString + }); + return p; + }; + /*\ + * Element.rotate + [ method ] + ** + * Deprecated! Use @Element.transform instead. + * Adds rotation by given angle around given point to the list of + * transformations of the element. + > Parameters + - deg (number) angle in degrees + - cx (number) #optional x coordinate of the centre of rotation + - cy (number) #optional y coordinate of the centre of rotation + * If cx & cy aren’t specified centre of the shape is used as a point of rotation. + = (object) @Element + \*/ + elproto.rotate = function (deg, cx, cy) { + if (this.removed) { + return this; + } + deg = Str(deg).split(separator); + if (deg.length - 1) { + cx = toFloat(deg[1]); + cy = toFloat(deg[2]); + } + deg = toFloat(deg[0]); + (cy == null) && (cx = cy); + if (cx == null || cy == null) { + var bbox = this.getBBox(1); + cx = bbox.x + bbox.width / 2; + cy = bbox.y + bbox.height / 2; + } + this.transform(this._.transform.concat([["r", deg, cx, cy]])); + return this; + }; + /*\ + * Element.scale + [ method ] + ** + * Deprecated! Use @Element.transform instead. + * Adds scale by given amount relative to given point to the list of + * transformations of the element. + > Parameters + - sx (number) horisontal scale amount + - sy (number) vertical scale amount + - cx (number) #optional x coordinate of the centre of scale + - cy (number) #optional y coordinate of the centre of scale + * If cx & cy aren’t specified centre of the shape is used instead. + = (object) @Element + \*/ + elproto.scale = function (sx, sy, cx, cy) { + if (this.removed) { + return this; + } + sx = Str(sx).split(separator); + if (sx.length - 1) { + sy = toFloat(sx[1]); + cx = toFloat(sx[2]); + cy = toFloat(sx[3]); + } + sx = toFloat(sx[0]); + (sy == null) && (sy = sx); + (cy == null) && (cx = cy); + if (cx == null || cy == null) { + var bbox = this.getBBox(1); + } + cx = cx == null ? bbox.x + bbox.width / 2 : cx; + cy = cy == null ? bbox.y + bbox.height / 2 : cy; + this.transform(this._.transform.concat([["s", sx, sy, cx, cy]])); + return this; + }; + /*\ + * Element.translate + [ method ] + ** + * Deprecated! Use @Element.transform instead. + * Adds translation by given amount to the list of transformations of the element. + > Parameters + - dx (number) horisontal shift + - dy (number) vertical shift + = (object) @Element + \*/ + elproto.translate = function (dx, dy) { + if (this.removed) { + return this; + } + dx = Str(dx).split(separator); + if (dx.length - 1) { + dy = toFloat(dx[1]); + } + dx = toFloat(dx[0]) || 0; + dy = +dy || 0; + this.transform(this._.transform.concat([["t", dx, dy]])); + return this; + }; + /*\ + * Element.transform + [ method ] + ** + * Adds transformation to the element which is separate to other attributes, + * i.e. translation doesn’t change `x` or `y` of the rectange. The format + * of transformation string is similar to the path string syntax: + | "t100,100r30,100,100s2,2,100,100r45s1.5" + * Each letter is a command. There are four commands: `t` is for translate, `r` is for rotate, `s` is for + * scale and `m` is for matrix. + * + * There are also alternative “absolute” translation, rotation and scale: `T`, `R` and `S`. They will not take previous transformation into account. For example, `...T100,0` will always move element 100 px horisontally, while `...t100,0` could move it vertically if there is `r90` before. Just compare results of `r90t100,0` and `r90T100,0`. + * + * So, the example line above could be read like “translate by 100, 100; rotate 30° around 100, 100; scale twice around 100, 100; + * rotate 45° around centre; scale 1.5 times relative to centre”. As you can see rotate and scale commands have origin + * coordinates as optional parameters, the default is the centre point of the element. + * Matrix accepts six parameters. + > Usage + | var el = paper.rect(10, 20, 300, 200); + | // translate 100, 100, rotate 45°, translate -100, 0 + | el.transform("t100,100r45t-100,0"); + | // if you want you can append or prepend transformations + | el.transform("...t50,50"); + | el.transform("s2..."); + | // or even wrap + | el.transform("t50,50...t-50-50"); + | // to reset transformation call method with empty string + | el.transform(""); + | // to get current value call it without parameters + | console.log(el.transform()); + > Parameters + - tstr (string) #optional transformation string + * If tstr isn’t specified + = (string) current transformation string + * else + = (object) @Element + \*/ + elproto.transform = function (tstr) { + var _ = this._; + if (tstr == null) { + return _.transform; + } + R._extractTransform(this, tstr); + + this.clip && $(this.clip, {transform: this.matrix.invert()}); + this.pattern && updatePosition(this); + this.node && $(this.node, {transform: this.matrix}); + + if (_.sx != 1 || _.sy != 1) { + var sw = this.attrs[has]("stroke-width") ? this.attrs["stroke-width"] : 1; + this.attr({"stroke-width": sw}); + } + + //Reduce transform string + _.transform = this.matrix.toTransformString(); + + return this; + }; + /*\ + * Element.hide + [ method ] + ** + * Makes element invisible. See @Element.show. + = (object) @Element + \*/ + elproto.hide = function () { + if(!this.removed) this.node.style.display = "none"; + return this; + }; + /*\ + * Element.show + [ method ] + ** + * Makes element visible. See @Element.hide. + = (object) @Element + \*/ + elproto.show = function () { + if(!this.removed) this.node.style.display = ""; + return this; + }; + /*\ + * Element.remove + [ method ] + ** + * Removes element from the paper. + \*/ + elproto.remove = function () { + var node = getRealNode(this.node); + if (this.removed || !node.parentNode) { + return; + } + var paper = this.paper; + paper.__set__ && paper.__set__.exclude(this); + eve.unbind("raphael.*.*." + this.id); + if (this.gradient) { + paper.defs.removeChild(this.gradient); + } + R._tear(this, paper); + + node.parentNode.removeChild(node); + + // Remove custom data for element + this.removeData(); + + for (var i in this) { + this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null; + } + this.removed = true; + }; + elproto._getBBox = function () { + if (this.node.style.display == "none") { + this.show(); + var hide = true; + } + var canvasHidden = false, + containerStyle; + if (this.paper.canvas.parentElement) { + containerStyle = this.paper.canvas.parentElement.style; + } //IE10+ can't find parentElement + else if (this.paper.canvas.parentNode) { + containerStyle = this.paper.canvas.parentNode.style; + } + + if(containerStyle && containerStyle.display == "none") { + canvasHidden = true; + containerStyle.display = ""; + } + var bbox = {}; + try { + bbox = this.node.getBBox(); + } catch(e) { + // Firefox 3.0.x, 25.0.1 (probably more versions affected) play badly here - possible fix + bbox = { + x: this.node.clientLeft, + y: this.node.clientTop, + width: this.node.clientWidth, + height: this.node.clientHeight + } + } finally { + bbox = bbox || {}; + if(canvasHidden){ + containerStyle.display = "none"; + } + } + hide && this.hide(); + return bbox; + }; + /*\ + * Element.attr + [ method ] + ** + * Sets the attributes of the element. + > Parameters + - attrName (string) attribute’s name + - value (string) value + * or + - params (object) object of name/value pairs + * or + - attrName (string) attribute’s name + * or + - attrNames (array) in this case method returns array of current values for given attribute names + = (object) @Element if attrsName & value or params are passed in. + = (...) value of the attribute if only attrsName is passed in. + = (array) array of values of the attribute if attrsNames is passed in. + = (object) object of attributes if nothing is passed in. + > Possible parameters + # <p>Please refer to the <a href="http://www.w3.org/TR/SVG/" title="The W3C Recommendation for the SVG language describes these properties in detail.">SVG specification</a> for an explanation of these parameters.</p> + o arrow-end (string) arrowhead on the end of the path. The format for string is `<type>[-<width>[-<length>]]`. Possible types: `classic`, `block`, `open`, `oval`, `diamond`, `none`, width: `wide`, `narrow`, `medium`, length: `long`, `short`, `midium`. + o clip-rect (string) comma or space separated values: x, y, width and height + o cursor (string) CSS type of the cursor + o cx (number) the x-axis coordinate of the center of the circle, or ellipse + o cy (number) the y-axis coordinate of the center of the circle, or ellipse + o fill (string) colour, gradient or image + o fill-opacity (number) + o font (string) + o font-family (string) + o font-size (number) font size in pixels + o font-weight (string) + o height (number) + o href (string) URL, if specified element behaves as hyperlink + o opacity (number) + o path (string) SVG path string format + o r (number) radius of the circle, ellipse or rounded corner on the rect + o rx (number) horisontal radius of the ellipse + o ry (number) vertical radius of the ellipse + o src (string) image URL, only works for @Element.image element + o stroke (string) stroke colour + o stroke-dasharray (string) [“”, “none”, “`-`”, “`.`”, “`-.`”, “`-..`”, “`. `”, “`- `”, “`--`”, “`- .`”, “`--.`”, “`--..`”] + o stroke-linecap (string) [“`butt`”, “`square`”, “`round`”] + o stroke-linejoin (string) [“`bevel`”, “`round`”, “`miter`”] + o stroke-miterlimit (number) + o stroke-opacity (number) + o stroke-width (number) stroke width in pixels, default is '1' + o target (string) used with href + o text (string) contents of the text element. Use `\n` for multiline text + o text-anchor (string) [“`start`”, “`middle`”, “`end`”], default is “`middle`” + o title (string) will create tooltip with a given text + o transform (string) see @Element.transform + o width (number) + o x (number) + o y (number) + > Gradients + * Linear gradient format: “`‹angle›-‹colour›[-‹colour›[:‹offset›]]*-‹colour›`”, example: “`90-#fff-#000`” – 90° + * gradient from white to black or “`0-#fff-#f00:20-#000`” – 0° gradient from white via red (at 20%) to black. + * + * radial gradient: “`r[(‹fx›, ‹fy›)]‹colour›[-‹colour›[:‹offset›]]*-‹colour›`”, example: “`r#fff-#000`” – + * gradient from white to black or “`r(0.25, 0.75)#fff-#000`” – gradient from white to black with focus point + * at 0.25, 0.75. Focus point coordinates are in 0..1 range. Radial gradients can only be applied to circles and ellipses. + > Path String + # <p>Please refer to <a href="http://www.w3.org/TR/SVG/paths.html#PathData" title="Details of a path’s data attribute’s format are described in the SVG specification.">SVG documentation regarding path string</a>. Raphaël fully supports it.</p> + > Colour Parsing + # <ul> + # <li>Colour name (“<code>red</code>”, “<code>green</code>”, “<code>cornflowerblue</code>”, etc)</li> + # <li>#••• — shortened HTML colour: (“<code>#000</code>”, “<code>#fc0</code>”, etc)</li> + # <li>#•••••• — full length HTML colour: (“<code>#000000</code>”, “<code>#bd2300</code>”)</li> + # <li>rgb(•••, •••, •••) — red, green and blue channels’ values: (“<code>rgb(200, 100, 0)</code>”)</li> + # <li>rgb(•••%, •••%, •••%) — same as above, but in %: (“<code>rgb(100%, 175%, 0%)</code>”)</li> + # <li>rgba(•••, •••, •••, •••) — red, green and blue channels’ values: (“<code>rgba(200, 100, 0, .5)</code>”)</li> + # <li>rgba(•••%, •••%, •••%, •••%) — same as above, but in %: (“<code>rgba(100%, 175%, 0%, 50%)</code>”)</li> + # <li>hsb(•••, •••, •••) — hue, saturation and brightness values: (“<code>hsb(0.5, 0.25, 1)</code>”)</li> + # <li>hsb(•••%, •••%, •••%) — same as above, but in %</li> + # <li>hsba(•••, •••, •••, •••) — same as above, but with opacity</li> + # <li>hsl(•••, •••, •••) — almost the same as hsb, see <a href="http://en.wikipedia.org/wiki/HSL_and_HSV" title="HSL and HSV - Wikipedia, the free encyclopedia">Wikipedia page</a></li> + # <li>hsl(•••%, •••%, •••%) — same as above, but in %</li> + # <li>hsla(•••, •••, •••, •••) — same as above, but with opacity</li> + # <li>Optionally for hsb and hsl you could specify hue as a degree: “<code>hsl(240deg, 1, .5)</code>” or, if you want to go fancy, “<code>hsl(240°, 1, .5)</code>”</li> + # </ul> + \*/ + elproto.attr = function (name, value) { + if (this.removed) { + return this; + } + if (name == null) { + var res = {}; + for (var a in this.attrs) if (this.attrs[has](a)) { + res[a] = this.attrs[a]; + } + res.gradient && res.fill == "none" && (res.fill = res.gradient) && delete res.gradient; + res.transform = this._.transform; + return res; + } + if (value == null && R.is(name, "string")) { + if (name == "fill" && this.attrs.fill == "none" && this.attrs.gradient) { + return this.attrs.gradient; + } + if (name == "transform") { + return this._.transform; + } + var names = name.split(separator), + out = {}; + for (var i = 0, ii = names.length; i < ii; i++) { + name = names[i]; + if (name in this.attrs) { + out[name] = this.attrs[name]; + } else if (R.is(this.paper.customAttributes[name], "function")) { + out[name] = this.paper.customAttributes[name].def; + } else { + out[name] = R._availableAttrs[name]; + } + } + return ii - 1 ? out : out[names[0]]; + } + if (value == null && R.is(name, "array")) { + out = {}; + for (i = 0, ii = name.length; i < ii; i++) { + out[name[i]] = this.attr(name[i]); + } + return out; + } + if (value != null) { + var params = {}; + params[name] = value; + } else if (name != null && R.is(name, "object")) { + params = name; + } + for (var key in params) { + eve("raphael.attr." + key + "." + this.id, this, params[key]); + } + for (key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], "function")) { + var par = this.paper.customAttributes[key].apply(this, [].concat(params[key])); + this.attrs[key] = params[key]; + for (var subkey in par) if (par[has](subkey)) { + params[subkey] = par[subkey]; + } + } + setFillAndStroke(this, params); + return this; + }; + /*\ + * Element.toFront + [ method ] + ** + * Moves the element so it is the closest to the viewer’s eyes, on top of other elements. + = (object) @Element + \*/ + elproto.toFront = function () { + if (this.removed) { + return this; + } + var node = getRealNode(this.node); + node.parentNode.appendChild(node); + var svg = this.paper; + svg.top != this && R._tofront(this, svg); + return this; + }; + /*\ + * Element.toBack + [ method ] + ** + * Moves the element so it is the furthest from the viewer’s eyes, behind other elements. + = (object) @Element + \*/ + elproto.toBack = function () { + if (this.removed) { + return this; + } + var node = getRealNode(this.node); + var parentNode = node.parentNode; + parentNode.insertBefore(node, parentNode.firstChild); + R._toback(this, this.paper); + var svg = this.paper; + return this; + }; + /*\ + * Element.insertAfter + [ method ] + ** + * Inserts current object after the given one. + = (object) @Element + \*/ + elproto.insertAfter = function (element) { + if (this.removed || !element) { + return this; + } + + var node = getRealNode(this.node); + var afterNode = getRealNode(element.node || element[element.length - 1].node); + if (afterNode.nextSibling) { + afterNode.parentNode.insertBefore(node, afterNode.nextSibling); + } else { + afterNode.parentNode.appendChild(node); + } + R._insertafter(this, element, this.paper); + return this; + }; + /*\ + * Element.insertBefore + [ method ] + ** + * Inserts current object before the given one. + = (object) @Element + \*/ + elproto.insertBefore = function (element) { + if (this.removed || !element) { + return this; + } + + var node = getRealNode(this.node); + var beforeNode = getRealNode(element.node || element[0].node); + beforeNode.parentNode.insertBefore(node, beforeNode); + R._insertbefore(this, element, this.paper); + return this; + }; + elproto.blur = function (size) { + // Experimental. No Safari support. Use it on your own risk. + var t = this; + if (+size !== 0) { + var fltr = $("filter"), + blur = $("feGaussianBlur"); + t.attrs.blur = size; + fltr.id = R.createUUID(); + $(blur, {stdDeviation: +size || 1.5}); + fltr.appendChild(blur); + t.paper.defs.appendChild(fltr); + t._blur = fltr; + $(t.node, {filter: "url(#" + fltr.id + ")"}); + } else { + if (t._blur) { + t._blur.parentNode.removeChild(t._blur); + delete t._blur; + delete t.attrs.blur; + } + t.node.removeAttribute("filter"); + } + return t; + }; + R._engine.circle = function (svg, x, y, r) { + var el = $("circle"); + svg.canvas && svg.canvas.appendChild(el); + var res = new Element(el, svg); + res.attrs = {cx: x, cy: y, r: r, fill: "none", stroke: "#000"}; + res.type = "circle"; + $(el, res.attrs); + return res; + }; + R._engine.rect = function (svg, x, y, w, h, r) { + var el = $("rect"); + svg.canvas && svg.canvas.appendChild(el); + var res = new Element(el, svg); + res.attrs = {x: x, y: y, width: w, height: h, rx: r || 0, ry: r || 0, fill: "none", stroke: "#000"}; + res.type = "rect"; + $(el, res.attrs); + return res; + }; + R._engine.ellipse = function (svg, x, y, rx, ry) { + var el = $("ellipse"); + svg.canvas && svg.canvas.appendChild(el); + var res = new Element(el, svg); + res.attrs = {cx: x, cy: y, rx: rx, ry: ry, fill: "none", stroke: "#000"}; + res.type = "ellipse"; + $(el, res.attrs); + return res; + }; + R._engine.image = function (svg, src, x, y, w, h) { + var el = $("image"); + $(el, {x: x, y: y, width: w, height: h, preserveAspectRatio: "none"}); + el.setAttributeNS(xlink, "href", src); + svg.canvas && svg.canvas.appendChild(el); + var res = new Element(el, svg); + res.attrs = {x: x, y: y, width: w, height: h, src: src}; + res.type = "image"; + return res; + }; + R._engine.text = function (svg, x, y, text) { + var el = $("text"); + svg.canvas && svg.canvas.appendChild(el); + var res = new Element(el, svg); + res.attrs = { + x: x, + y: y, + "text-anchor": "middle", + text: text, + "font-family": R._availableAttrs["font-family"], + "font-size": R._availableAttrs["font-size"], + stroke: "none", + fill: "#000" + }; + res.type = "text"; + setFillAndStroke(res, res.attrs); + return res; + }; + R._engine.setSize = function (width, height) { + this.width = width || this.width; + this.height = height || this.height; + this.canvas.setAttribute("width", this.width); + this.canvas.setAttribute("height", this.height); + if (this._viewBox) { + this.setViewBox.apply(this, this._viewBox); + } + return this; + }; + R._engine.create = function () { + var con = R._getContainer.apply(0, arguments), + container = con && con.container, + x = con.x, + y = con.y, + width = con.width, + height = con.height; + if (!container) { + throw new Error("SVG container not found."); + } + var cnvs = $("svg"), + css = "overflow:hidden;", + isFloating; + x = x || 0; + y = y || 0; + width = width || 512; + height = height || 342; + $(cnvs, { + height: height, + version: 1.1, + width: width, + xmlns: "http://www.w3.org/2000/svg", + "xmlns:xlink": "http://www.w3.org/1999/xlink" + }); + if (container == 1) { + cnvs.style.cssText = css + "position:absolute;left:" + x + "px;top:" + y + "px"; + R._g.doc.body.appendChild(cnvs); + isFloating = 1; + } else { + cnvs.style.cssText = css + "position:relative"; + if (container.firstChild) { + container.insertBefore(cnvs, container.firstChild); + } else { + container.appendChild(cnvs); + } + } + container = new R._Paper; + container.width = width; + container.height = height; + container.canvas = cnvs; + container.clear(); + container._left = container._top = 0; + isFloating && (container.renderfix = function () {}); + container.renderfix(); + return container; + }; + R._engine.setViewBox = function (x, y, w, h, fit) { + eve("raphael.setViewBox", this, this._viewBox, [x, y, w, h, fit]); + var paperSize = this.getSize(), + size = mmax(w / paperSize.width, h / paperSize.height), + top = this.top, + aspectRatio = fit ? "xMidYMid meet" : "xMinYMin", + vb, + sw; + if (x == null) { + if (this._vbSize) { + size = 1; + } + delete this._vbSize; + vb = "0 0 " + this.width + S + this.height; + } else { + this._vbSize = size; + vb = x + S + y + S + w + S + h; + } + $(this.canvas, { + viewBox: vb, + preserveAspectRatio: aspectRatio + }); + while (size && top) { + sw = "stroke-width" in top.attrs ? top.attrs["stroke-width"] : 1; + top.attr({"stroke-width": sw}); + top._.dirty = 1; + top._.dirtyT = 1; + top = top.prev; + } + this._viewBox = [x, y, w, h, !!fit]; + return this; + }; + /*\ + * Paper.renderfix + [ method ] + ** + * Fixes the issue of Firefox and IE9 regarding subpixel rendering. If paper is dependent + * on other elements after reflow it could shift half pixel which cause for lines to lost their crispness. + * This method fixes the issue. + ** + Special thanks to Mariusz Nowak (http://www.medikoo.com/) for this method. + \*/ + R.prototype.renderfix = function () { + var cnvs = this.canvas, + s = cnvs.style, + pos; + try { + pos = cnvs.getScreenCTM() || cnvs.createSVGMatrix(); + } catch (e) { + pos = cnvs.createSVGMatrix(); + } + var left = -pos.e % 1, + top = -pos.f % 1; + if (left || top) { + if (left) { + this._left = (this._left + left) % 1; + s.left = this._left + "px"; + } + if (top) { + this._top = (this._top + top) % 1; + s.top = this._top + "px"; + } + } + }; + /*\ + * Paper.clear + [ method ] + ** + * Clears the paper, i.e. removes all the elements. + \*/ + R.prototype.clear = function () { + R.eve("raphael.clear", this); + var c = this.canvas; + while (c.firstChild) { + c.removeChild(c.firstChild); + } + this.bottom = this.top = null; + (this.desc = $("desc")).appendChild(R._g.doc.createTextNode("Created with Rapha\xebl " + R.version)); + c.appendChild(this.desc); + c.appendChild(this.defs = $("defs")); + }; + /*\ + * Paper.remove + [ method ] + ** + * Removes the paper from the DOM. + \*/ + R.prototype.remove = function () { + eve("raphael.remove", this); + this.canvas.parentNode && this.canvas.parentNode.removeChild(this.canvas); + for (var i in this) { + this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null; + } + }; + var setproto = R.st; + for (var method in elproto) if (elproto[has](method) && !setproto[has](method)) { + setproto[method] = (function (methodname) { + return function () { + var arg = arguments; + return this.forEach(function (el) { + el[methodname].apply(el, arg); + }); + }; + })(method); + } + }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + + +/***/ }, +/* 4 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(1)], __WEBPACK_AMD_DEFINE_RESULT__ = function(R) { + if (R && !R.vml) { + return; + } + + var has = "hasOwnProperty", + Str = String, + toFloat = parseFloat, + math = Math, + round = math.round, + mmax = math.max, + mmin = math.min, + abs = math.abs, + fillString = "fill", + separator = /[, ]+/, + eve = R.eve, + ms = " progid:DXImageTransform.Microsoft", + S = " ", + E = "", + map = {M: "m", L: "l", C: "c", Z: "x", m: "t", l: "r", c: "v", z: "x"}, + bites = /([clmz]),?([^clmz]*)/gi, + blurregexp = / progid:\S+Blur\([^\)]+\)/g, + val = /-?[^,\s-]+/g, + cssDot = "position:absolute;left:0;top:0;width:1px;height:1px;behavior:url(#default#VML)", + zoom = 21600, + pathTypes = {path: 1, rect: 1, image: 1}, + ovalTypes = {circle: 1, ellipse: 1}, + path2vml = function (path) { + var total = /[ahqstv]/ig, + command = R._pathToAbsolute; + Str(path).match(total) && (command = R._path2curve); + total = /[clmz]/g; + if (command == R._pathToAbsolute && !Str(path).match(total)) { + var res = Str(path).replace(bites, function (all, command, args) { + var vals = [], + isMove = command.toLowerCase() == "m", + res = map[command]; + args.replace(val, function (value) { + if (isMove && vals.length == 2) { + res += vals + map[command == "m" ? "l" : "L"]; + vals = []; + } + vals.push(round(value * zoom)); + }); + return res + vals; + }); + return res; + } + var pa = command(path), p, r; + res = []; + for (var i = 0, ii = pa.length; i < ii; i++) { + p = pa[i]; + r = pa[i][0].toLowerCase(); + r == "z" && (r = "x"); + for (var j = 1, jj = p.length; j < jj; j++) { + r += round(p[j] * zoom) + (j != jj - 1 ? "," : E); + } + res.push(r); + } + return res.join(S); + }, + compensation = function (deg, dx, dy) { + var m = R.matrix(); + m.rotate(-deg, .5, .5); + return { + dx: m.x(dx, dy), + dy: m.y(dx, dy) + }; + }, + setCoords = function (p, sx, sy, dx, dy, deg) { + var _ = p._, + m = p.matrix, + fillpos = _.fillpos, + o = p.node, + s = o.style, + y = 1, + flip = "", + dxdy, + kx = zoom / sx, + ky = zoom / sy; + s.visibility = "hidden"; + if (!sx || !sy) { + return; + } + o.coordsize = abs(kx) + S + abs(ky); + s.rotation = deg * (sx * sy < 0 ? -1 : 1); + if (deg) { + var c = compensation(deg, dx, dy); + dx = c.dx; + dy = c.dy; + } + sx < 0 && (flip += "x"); + sy < 0 && (flip += " y") && (y = -1); + s.flip = flip; + o.coordorigin = (dx * -kx) + S + (dy * -ky); + if (fillpos || _.fillsize) { + var fill = o.getElementsByTagName(fillString); + fill = fill && fill[0]; + o.removeChild(fill); + if (fillpos) { + c = compensation(deg, m.x(fillpos[0], fillpos[1]), m.y(fillpos[0], fillpos[1])); + fill.position = c.dx * y + S + c.dy * y; + } + if (_.fillsize) { + fill.size = _.fillsize[0] * abs(sx) + S + _.fillsize[1] * abs(sy); + } + o.appendChild(fill); + } + s.visibility = "visible"; + }; + R.toString = function () { + return "Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\xebl " + this.version; + }; + var addArrow = function (o, value, isEnd) { + var values = Str(value).toLowerCase().split("-"), + se = isEnd ? "end" : "start", + i = values.length, + type = "classic", + w = "medium", + h = "medium"; + while (i--) { + switch (values[i]) { + case "block": + case "classic": + case "oval": + case "diamond": + case "open": + case "none": + type = values[i]; + break; + case "wide": + case "narrow": h = values[i]; break; + case "long": + case "short": w = values[i]; break; + } + } + var stroke = o.node.getElementsByTagName("stroke")[0]; + stroke[se + "arrow"] = type; + stroke[se + "arrowlength"] = w; + stroke[se + "arrowwidth"] = h; + }, + setFillAndStroke = function (o, params) { + // o.paper.canvas.style.display = "none"; + o.attrs = o.attrs || {}; + var node = o.node, + a = o.attrs, + s = node.style, + xy, + newpath = pathTypes[o.type] && (params.x != a.x || params.y != a.y || params.width != a.width || params.height != a.height || params.cx != a.cx || params.cy != a.cy || params.rx != a.rx || params.ry != a.ry || params.r != a.r), + isOval = ovalTypes[o.type] && (a.cx != params.cx || a.cy != params.cy || a.r != params.r || a.rx != params.rx || a.ry != params.ry), + res = o; + + + for (var par in params) if (params[has](par)) { + a[par] = params[par]; + } + if (newpath) { + a.path = R._getPath[o.type](o); + o._.dirty = 1; + } + params.href && (node.href = params.href); + params.title && (node.title = params.title); + params.target && (node.target = params.target); + params.cursor && (s.cursor = params.cursor); + "blur" in params && o.blur(params.blur); + if (params.path && o.type == "path" || newpath) { + node.path = path2vml(~Str(a.path).toLowerCase().indexOf("r") ? R._pathToAbsolute(a.path) : a.path); + o._.dirty = 1; + if (o.type == "image") { + o._.fillpos = [a.x, a.y]; + o._.fillsize = [a.width, a.height]; + setCoords(o, 1, 1, 0, 0, 0); + } + } + "transform" in params && o.transform(params.transform); + if (isOval) { + var cx = +a.cx, + cy = +a.cy, + rx = +a.rx || +a.r || 0, + ry = +a.ry || +a.r || 0; + node.path = R.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x", round((cx - rx) * zoom), round((cy - ry) * zoom), round((cx + rx) * zoom), round((cy + ry) * zoom), round(cx * zoom)); + o._.dirty = 1; + } + if ("clip-rect" in params) { + var rect = Str(params["clip-rect"]).split(separator); + if (rect.length == 4) { + rect[2] = +rect[2] + (+rect[0]); + rect[3] = +rect[3] + (+rect[1]); + var div = node.clipRect || R._g.doc.createElement("div"), + dstyle = div.style; + dstyle.clip = R.format("rect({1}px {2}px {3}px {0}px)", rect); + if (!node.clipRect) { + dstyle.position = "absolute"; + dstyle.top = 0; + dstyle.left = 0; + dstyle.width = o.paper.width + "px"; + dstyle.height = o.paper.height + "px"; + node.parentNode.insertBefore(div, node); + div.appendChild(node); + node.clipRect = div; + } + } + if (!params["clip-rect"]) { + node.clipRect && (node.clipRect.style.clip = "auto"); + } + } + if (o.textpath) { + var textpathStyle = o.textpath.style; + params.font && (textpathStyle.font = params.font); + params["font-family"] && (textpathStyle.fontFamily = '"' + params["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g, E) + '"'); + params["font-size"] && (textpathStyle.fontSize = params["font-size"]); + params["font-weight"] && (textpathStyle.fontWeight = params["font-weight"]); + params["font-style"] && (textpathStyle.fontStyle = params["font-style"]); + } + if ("arrow-start" in params) { + addArrow(res, params["arrow-start"]); + } + if ("arrow-end" in params) { + addArrow(res, params["arrow-end"], 1); + } + if (params.opacity != null || + params.fill != null || + params.src != null || + params.stroke != null || + params["stroke-width"] != null || + params["stroke-opacity"] != null || + params["fill-opacity"] != null || + params["stroke-dasharray"] != null || + params["stroke-miterlimit"] != null || + params["stroke-linejoin"] != null || + params["stroke-linecap"] != null) { + var fill = node.getElementsByTagName(fillString), + newfill = false; + fill = fill && fill[0]; + !fill && (newfill = fill = createNode(fillString)); + if (o.type == "image" && params.src) { + fill.src = params.src; + } + params.fill && (fill.on = true); + if (fill.on == null || params.fill == "none" || params.fill === null) { + fill.on = false; + } + if (fill.on && params.fill) { + var isURL = Str(params.fill).match(R._ISURL); + if (isURL) { + fill.parentNode == node && node.removeChild(fill); + fill.rotate = true; + fill.src = isURL[1]; + fill.type = "tile"; + var bbox = o.getBBox(1); + fill.position = bbox.x + S + bbox.y; + o._.fillpos = [bbox.x, bbox.y]; + + R._preload(isURL[1], function () { + o._.fillsize = [this.offsetWidth, this.offsetHeight]; + }); + } else { + fill.color = R.getRGB(params.fill).hex; + fill.src = E; + fill.type = "solid"; + if (R.getRGB(params.fill).error && (res.type in {circle: 1, ellipse: 1} || Str(params.fill).charAt() != "r") && addGradientFill(res, params.fill, fill)) { + a.fill = "none"; + a.gradient = params.fill; + fill.rotate = false; + } + } + } + if ("fill-opacity" in params || "opacity" in params) { + var opacity = ((+a["fill-opacity"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+R.getRGB(params.fill).o + 1 || 2) - 1); + opacity = mmin(mmax(opacity, 0), 1); + fill.opacity = opacity; + if (fill.src) { + fill.color = "none"; + } + } + node.appendChild(fill); + var stroke = (node.getElementsByTagName("stroke") && node.getElementsByTagName("stroke")[0]), + newstroke = false; + !stroke && (newstroke = stroke = createNode("stroke")); + if ((params.stroke && params.stroke != "none") || + params["stroke-width"] || + params["stroke-opacity"] != null || + params["stroke-dasharray"] || + params["stroke-miterlimit"] || + params["stroke-linejoin"] || + params["stroke-linecap"]) { + stroke.on = true; + } + (params.stroke == "none" || params.stroke === null || stroke.on == null || params.stroke == 0 || params["stroke-width"] == 0) && (stroke.on = false); + var strokeColor = R.getRGB(params.stroke); + stroke.on && params.stroke && (stroke.color = strokeColor.hex); + opacity = ((+a["stroke-opacity"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+strokeColor.o + 1 || 2) - 1); + var width = (toFloat(params["stroke-width"]) || 1) * .75; + opacity = mmin(mmax(opacity, 0), 1); + params["stroke-width"] == null && (width = a["stroke-width"]); + params["stroke-width"] && (stroke.weight = width); + width && width < 1 && (opacity *= width) && (stroke.weight = 1); + stroke.opacity = opacity; + + params["stroke-linejoin"] && (stroke.joinstyle = params["stroke-linejoin"] || "miter"); + stroke.miterlimit = params["stroke-miterlimit"] || 8; + params["stroke-linecap"] && (stroke.endcap = params["stroke-linecap"] == "butt" ? "flat" : params["stroke-linecap"] == "square" ? "square" : "round"); + if ("stroke-dasharray" in params) { + var dasharray = { + "-": "shortdash", + ".": "shortdot", + "-.": "shortdashdot", + "-..": "shortdashdotdot", + ". ": "dot", + "- ": "dash", + "--": "longdash", + "- .": "dashdot", + "--.": "longdashdot", + "--..": "longdashdotdot" + }; + stroke.dashstyle = dasharray[has](params["stroke-dasharray"]) ? dasharray[params["stroke-dasharray"]] : E; + } + newstroke && node.appendChild(stroke); + } + if (res.type == "text") { + res.paper.canvas.style.display = E; + var span = res.paper.span, + m = 100, + fontSize = a.font && a.font.match(/\d+(?:\.\d*)?(?=px)/); + s = span.style; + a.font && (s.font = a.font); + a["font-family"] && (s.fontFamily = a["font-family"]); + a["font-weight"] && (s.fontWeight = a["font-weight"]); + a["font-style"] && (s.fontStyle = a["font-style"]); + fontSize = toFloat(a["font-size"] || fontSize && fontSize[0]) || 10; + s.fontSize = fontSize * m + "px"; + res.textpath.string && (span.innerHTML = Str(res.textpath.string).replace(/</g, "<").replace(/&/g, "&").replace(/\n/g, "<br>")); + var brect = span.getBoundingClientRect(); + res.W = a.w = (brect.right - brect.left) / m; + res.H = a.h = (brect.bottom - brect.top) / m; + // res.paper.canvas.style.display = "none"; + res.X = a.x; + res.Y = a.y + res.H / 2; + + ("x" in params || "y" in params) && (res.path.v = R.format("m{0},{1}l{2},{1}", round(a.x * zoom), round(a.y * zoom), round(a.x * zoom) + 1)); + var dirtyattrs = ["x", "y", "text", "font", "font-family", "font-weight", "font-style", "font-size"]; + for (var d = 0, dd = dirtyattrs.length; d < dd; d++) if (dirtyattrs[d] in params) { + res._.dirty = 1; + break; + } + + // text-anchor emulation + switch (a["text-anchor"]) { + case "start": + res.textpath.style["v-text-align"] = "left"; + res.bbx = res.W / 2; + break; + case "end": + res.textpath.style["v-text-align"] = "right"; + res.bbx = -res.W / 2; + break; + default: + res.textpath.style["v-text-align"] = "center"; + res.bbx = 0; + break; + } + res.textpath.style["v-text-kern"] = true; + } + // res.paper.canvas.style.display = E; + }, + addGradientFill = function (o, gradient, fill) { + o.attrs = o.attrs || {}; + var attrs = o.attrs, + pow = Math.pow, + opacity, + oindex, + type = "linear", + fxfy = ".5 .5"; + o.attrs.gradient = gradient; + gradient = Str(gradient).replace(R._radial_gradient, function (all, fx, fy) { + type = "radial"; + if (fx && fy) { + fx = toFloat(fx); + fy = toFloat(fy); + pow(fx - .5, 2) + pow(fy - .5, 2) > .25 && (fy = math.sqrt(.25 - pow(fx - .5, 2)) * ((fy > .5) * 2 - 1) + .5); + fxfy = fx + S + fy; + } + return E; + }); + gradient = gradient.split(/\s*\-\s*/); + if (type == "linear") { + var angle = gradient.shift(); + angle = -toFloat(angle); + if (isNaN(angle)) { + return null; + } + } + var dots = R._parseDots(gradient); + if (!dots) { + return null; + } + o = o.shape || o.node; + if (dots.length) { + o.removeChild(fill); + fill.on = true; + fill.method = "none"; + fill.color = dots[0].color; + fill.color2 = dots[dots.length - 1].color; + var clrs = []; + for (var i = 0, ii = dots.length; i < ii; i++) { + dots[i].offset && clrs.push(dots[i].offset + S + dots[i].color); + } + fill.colors = clrs.length ? clrs.join() : "0% " + fill.color; + if (type == "radial") { + fill.type = "gradientTitle"; + fill.focus = "100%"; + fill.focussize = "0 0"; + fill.focusposition = fxfy; + fill.angle = 0; + } else { + // fill.rotate= true; + fill.type = "gradient"; + fill.angle = (270 - angle) % 360; + } + o.appendChild(fill); + } + return 1; + }, + Element = function (node, vml) { + this[0] = this.node = node; + node.raphael = true; + this.id = R._oid++; + node.raphaelid = this.id; + this.X = 0; + this.Y = 0; + this.attrs = {}; + this.paper = vml; + this.matrix = R.matrix(); + this._ = { + transform: [], + sx: 1, + sy: 1, + dx: 0, + dy: 0, + deg: 0, + dirty: 1, + dirtyT: 1 + }; + !vml.bottom && (vml.bottom = this); + this.prev = vml.top; + vml.top && (vml.top.next = this); + vml.top = this; + this.next = null; + }; + var elproto = R.el; + + Element.prototype = elproto; + elproto.constructor = Element; + elproto.transform = function (tstr) { + if (tstr == null) { + return this._.transform; + } + var vbs = this.paper._viewBoxShift, + vbt = vbs ? "s" + [vbs.scale, vbs.scale] + "-1-1t" + [vbs.dx, vbs.dy] : E, + oldt; + if (vbs) { + oldt = tstr = Str(tstr).replace(/\.{3}|\u2026/g, this._.transform || E); + } + R._extractTransform(this, vbt + tstr); + var matrix = this.matrix.clone(), + skew = this.skew, + o = this.node, + split, + isGrad = ~Str(this.attrs.fill).indexOf("-"), + isPatt = !Str(this.attrs.fill).indexOf("url("); + matrix.translate(1, 1); + if (isPatt || isGrad || this.type == "image") { + skew.matrix = "1 0 0 1"; + skew.offset = "0 0"; + split = matrix.split(); + if ((isGrad && split.noRotation) || !split.isSimple) { + o.style.filter = matrix.toFilter(); + var bb = this.getBBox(), + bbt = this.getBBox(1), + dx = bb.x - bbt.x, + dy = bb.y - bbt.y; + o.coordorigin = (dx * -zoom) + S + (dy * -zoom); + setCoords(this, 1, 1, dx, dy, 0); + } else { + o.style.filter = E; + setCoords(this, split.scalex, split.scaley, split.dx, split.dy, split.rotate); + } + } else { + o.style.filter = E; + skew.matrix = Str(matrix); + skew.offset = matrix.offset(); + } + if (oldt !== null) { // empty string value is true as well + this._.transform = oldt; + R._extractTransform(this, oldt); + } + return this; + }; + elproto.rotate = function (deg, cx, cy) { + if (this.removed) { + return this; + } + if (deg == null) { + return; + } + deg = Str(deg).split(separator); + if (deg.length - 1) { + cx = toFloat(deg[1]); + cy = toFloat(deg[2]); + } + deg = toFloat(deg[0]); + (cy == null) && (cx = cy); + if (cx == null || cy == null) { + var bbox = this.getBBox(1); + cx = bbox.x + bbox.width / 2; + cy = bbox.y + bbox.height / 2; + } + this._.dirtyT = 1; + this.transform(this._.transform.concat([["r", deg, cx, cy]])); + return this; + }; + elproto.translate = function (dx, dy) { + if (this.removed) { + return this; + } + dx = Str(dx).split(separator); + if (dx.length - 1) { + dy = toFloat(dx[1]); + } + dx = toFloat(dx[0]) || 0; + dy = +dy || 0; + if (this._.bbox) { + this._.bbox.x += dx; + this._.bbox.y += dy; + } + this.transform(this._.transform.concat([["t", dx, dy]])); + return this; + }; + elproto.scale = function (sx, sy, cx, cy) { + if (this.removed) { + return this; + } + sx = Str(sx).split(separator); + if (sx.length - 1) { + sy = toFloat(sx[1]); + cx = toFloat(sx[2]); + cy = toFloat(sx[3]); + isNaN(cx) && (cx = null); + isNaN(cy) && (cy = null); + } + sx = toFloat(sx[0]); + (sy == null) && (sy = sx); + (cy == null) && (cx = cy); + if (cx == null || cy == null) { + var bbox = this.getBBox(1); + } + cx = cx == null ? bbox.x + bbox.width / 2 : cx; + cy = cy == null ? bbox.y + bbox.height / 2 : cy; + + this.transform(this._.transform.concat([["s", sx, sy, cx, cy]])); + this._.dirtyT = 1; + return this; + }; + elproto.hide = function () { + !this.removed && (this.node.style.display = "none"); + return this; + }; + elproto.show = function () { + !this.removed && (this.node.style.display = E); + return this; + }; + // Needed to fix the vml setViewBox issues + elproto.auxGetBBox = R.el.getBBox; + elproto.getBBox = function(){ + var b = this.auxGetBBox(); + if (this.paper && this.paper._viewBoxShift) + { + var c = {}; + var z = 1/this.paper._viewBoxShift.scale; + c.x = b.x - this.paper._viewBoxShift.dx; + c.x *= z; + c.y = b.y - this.paper._viewBoxShift.dy; + c.y *= z; + c.width = b.width * z; + c.height = b.height * z; + c.x2 = c.x + c.width; + c.y2 = c.y + c.height; + return c; + } + return b; + }; + elproto._getBBox = function () { + if (this.removed) { + return {}; + } + return { + x: this.X + (this.bbx || 0) - this.W / 2, + y: this.Y - this.H, + width: this.W, + height: this.H + }; + }; + elproto.remove = function () { + if (this.removed || !this.node.parentNode) { + return; + } + this.paper.__set__ && this.paper.__set__.exclude(this); + R.eve.unbind("raphael.*.*." + this.id); + R._tear(this, this.paper); + this.node.parentNode.removeChild(this.node); + this.shape && this.shape.parentNode.removeChild(this.shape); + for (var i in this) { + this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null; + } + this.removed = true; + }; + elproto.attr = function (name, value) { + if (this.removed) { + return this; + } + if (name == null) { + var res = {}; + for (var a in this.attrs) if (this.attrs[has](a)) { + res[a] = this.attrs[a]; + } + res.gradient && res.fill == "none" && (res.fill = res.gradient) && delete res.gradient; + res.transform = this._.transform; + return res; + } + if (value == null && R.is(name, "string")) { + if (name == fillString && this.attrs.fill == "none" && this.attrs.gradient) { + return this.attrs.gradient; + } + var names = name.split(separator), + out = {}; + for (var i = 0, ii = names.length; i < ii; i++) { + name = names[i]; + if (name in this.attrs) { + out[name] = this.attrs[name]; + } else if (R.is(this.paper.customAttributes[name], "function")) { + out[name] = this.paper.customAttributes[name].def; + } else { + out[name] = R._availableAttrs[name]; + } + } + return ii - 1 ? out : out[names[0]]; + } + if (this.attrs && value == null && R.is(name, "array")) { + out = {}; + for (i = 0, ii = name.length; i < ii; i++) { + out[name[i]] = this.attr(name[i]); + } + return out; + } + var params; + if (value != null) { + params = {}; + params[name] = value; + } + value == null && R.is(name, "object") && (params = name); + for (var key in params) { + eve("raphael.attr." + key + "." + this.id, this, params[key]); + } + if (params) { + for (key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], "function")) { + var par = this.paper.customAttributes[key].apply(this, [].concat(params[key])); + this.attrs[key] = params[key]; + for (var subkey in par) if (par[has](subkey)) { + params[subkey] = par[subkey]; + } + } + // this.paper.canvas.style.display = "none"; + if (params.text && this.type == "text") { + this.textpath.string = params.text; + } + setFillAndStroke(this, params); + // this.paper.canvas.style.display = E; + } + return this; + }; + elproto.toFront = function () { + !this.removed && this.node.parentNode.appendChild(this.node); + this.paper && this.paper.top != this && R._tofront(this, this.paper); + return this; + }; + elproto.toBack = function () { + if (this.removed) { + return this; + } + if (this.node.parentNode.firstChild != this.node) { + this.node.parentNode.insertBefore(this.node, this.node.parentNode.firstChild); + R._toback(this, this.paper); + } + return this; + }; + elproto.insertAfter = function (element) { + if (this.removed) { + return this; + } + if (element.constructor == R.st.constructor) { + element = element[element.length - 1]; + } + if (element.node.nextSibling) { + element.node.parentNode.insertBefore(this.node, element.node.nextSibling); + } else { + element.node.parentNode.appendChild(this.node); + } + R._insertafter(this, element, this.paper); + return this; + }; + elproto.insertBefore = function (element) { + if (this.removed) { + return this; + } + if (element.constructor == R.st.constructor) { + element = element[0]; + } + element.node.parentNode.insertBefore(this.node, element.node); + R._insertbefore(this, element, this.paper); + return this; + }; + elproto.blur = function (size) { + var s = this.node.runtimeStyle, + f = s.filter; + f = f.replace(blurregexp, E); + if (+size !== 0) { + this.attrs.blur = size; + s.filter = f + S + ms + ".Blur(pixelradius=" + (+size || 1.5) + ")"; + s.margin = R.format("-{0}px 0 0 -{0}px", round(+size || 1.5)); + } else { + s.filter = f; + s.margin = 0; + delete this.attrs.blur; + } + return this; + }; + + R._engine.path = function (pathString, vml) { + var el = createNode("shape"); + el.style.cssText = cssDot; + el.coordsize = zoom + S + zoom; + el.coordorigin = vml.coordorigin; + var p = new Element(el, vml), + attr = {fill: "none", stroke: "#000"}; + pathString && (attr.path = pathString); + p.type = "path"; + p.path = []; + p.Path = E; + setFillAndStroke(p, attr); + vml.canvas && vml.canvas.appendChild(el); + var skew = createNode("skew"); + skew.on = true; + el.appendChild(skew); + p.skew = skew; + p.transform(E); + return p; + }; + R._engine.rect = function (vml, x, y, w, h, r) { + var path = R._rectPath(x, y, w, h, r), + res = vml.path(path), + a = res.attrs; + res.X = a.x = x; + res.Y = a.y = y; + res.W = a.width = w; + res.H = a.height = h; + a.r = r; + a.path = path; + res.type = "rect"; + return res; + }; + R._engine.ellipse = function (vml, x, y, rx, ry) { + var res = vml.path(), + a = res.attrs; + res.X = x - rx; + res.Y = y - ry; + res.W = rx * 2; + res.H = ry * 2; + res.type = "ellipse"; + setFillAndStroke(res, { + cx: x, + cy: y, + rx: rx, + ry: ry + }); + return res; + }; + R._engine.circle = function (vml, x, y, r) { + var res = vml.path(), + a = res.attrs; + res.X = x - r; + res.Y = y - r; + res.W = res.H = r * 2; + res.type = "circle"; + setFillAndStroke(res, { + cx: x, + cy: y, + r: r + }); + return res; + }; + R._engine.image = function (vml, src, x, y, w, h) { + var path = R._rectPath(x, y, w, h), + res = vml.path(path).attr({stroke: "none"}), + a = res.attrs, + node = res.node, + fill = node.getElementsByTagName(fillString)[0]; + a.src = src; + res.X = a.x = x; + res.Y = a.y = y; + res.W = a.width = w; + res.H = a.height = h; + a.path = path; + res.type = "image"; + fill.parentNode == node && node.removeChild(fill); + fill.rotate = true; + fill.src = src; + fill.type = "tile"; + res._.fillpos = [x, y]; + res._.fillsize = [w, h]; + node.appendChild(fill); + setCoords(res, 1, 1, 0, 0, 0); + return res; + }; + R._engine.text = function (vml, x, y, text) { + var el = createNode("shape"), + path = createNode("path"), + o = createNode("textpath"); + x = x || 0; + y = y || 0; + text = text || ""; + path.v = R.format("m{0},{1}l{2},{1}", round(x * zoom), round(y * zoom), round(x * zoom) + 1); + path.textpathok = true; + o.string = Str(text); + o.on = true; + el.style.cssText = cssDot; + el.coordsize = zoom + S + zoom; + el.coordorigin = "0 0"; + var p = new Element(el, vml), + attr = { + fill: "#000", + stroke: "none", + font: R._availableAttrs.font, + text: text + }; + p.shape = el; + p.path = path; + p.textpath = o; + p.type = "text"; + p.attrs.text = Str(text); + p.attrs.x = x; + p.attrs.y = y; + p.attrs.w = 1; + p.attrs.h = 1; + setFillAndStroke(p, attr); + el.appendChild(o); + el.appendChild(path); + vml.canvas.appendChild(el); + var skew = createNode("skew"); + skew.on = true; + el.appendChild(skew); + p.skew = skew; + p.transform(E); + return p; + }; + R._engine.setSize = function (width, height) { + var cs = this.canvas.style; + this.width = width; + this.height = height; + width == +width && (width += "px"); + height == +height && (height += "px"); + cs.width = width; + cs.height = height; + cs.clip = "rect(0 " + width + " " + height + " 0)"; + if (this._viewBox) { + R._engine.setViewBox.apply(this, this._viewBox); + } + return this; + }; + R._engine.setViewBox = function (x, y, w, h, fit) { + R.eve("raphael.setViewBox", this, this._viewBox, [x, y, w, h, fit]); + var paperSize = this.getSize(), + width = paperSize.width, + height = paperSize.height, + H, W; + if (fit) { + H = height / h; + W = width / w; + if (w * H < width) { + x -= (width - w * H) / 2 / H; + } + if (h * W < height) { + y -= (height - h * W) / 2 / W; + } + } + this._viewBox = [x, y, w, h, !!fit]; + this._viewBoxShift = { + dx: -x, + dy: -y, + scale: paperSize + }; + this.forEach(function (el) { + el.transform("..."); + }); + return this; + }; + var createNode; + R._engine.initWin = function (win) { + var doc = win.document; + if (doc.styleSheets.length < 31) { + doc.createStyleSheet().addRule(".rvml", "behavior:url(#default#VML)"); + } else { + // no more room, add to the existing one + // http://msdn.microsoft.com/en-us/library/ms531194%28VS.85%29.aspx + doc.styleSheets[0].addRule(".rvml", "behavior:url(#default#VML)"); + } + try { + !doc.namespaces.rvml && doc.namespaces.add("rvml", "urn:schemas-microsoft-com:vml"); + createNode = function (tagName) { + return doc.createElement('<rvml:' + tagName + ' class="rvml">'); + }; + } catch (e) { + createNode = function (tagName) { + return doc.createElement('<' + tagName + ' xmlns="urn:schemas-microsoft.com:vml" class="rvml">'); + }; + } + }; + R._engine.initWin(R._g.win); + R._engine.create = function () { + var con = R._getContainer.apply(0, arguments), + container = con.container, + height = con.height, + s, + width = con.width, + x = con.x, + y = con.y; + if (!container) { + throw new Error("VML container not found."); + } + var res = new R._Paper, + c = res.canvas = R._g.doc.createElement("div"), + cs = c.style; + x = x || 0; + y = y || 0; + width = width || 512; + height = height || 342; + res.width = width; + res.height = height; + width == +width && (width += "px"); + height == +height && (height += "px"); + res.coordsize = zoom * 1e3 + S + zoom * 1e3; + res.coordorigin = "0 0"; + res.span = R._g.doc.createElement("span"); + res.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;"; + c.appendChild(res.span); + cs.cssText = R.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden", width, height); + if (container == 1) { + R._g.doc.body.appendChild(c); + cs.left = x + "px"; + cs.top = y + "px"; + cs.position = "absolute"; + } else { + if (container.firstChild) { + container.insertBefore(c, container.firstChild); + } else { + container.appendChild(c); + } + } + res.renderfix = function () {}; + return res; + }; + R.prototype.clear = function () { + R.eve("raphael.clear", this); + this.canvas.innerHTML = E; + this.span = R._g.doc.createElement("span"); + this.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;"; + this.canvas.appendChild(this.span); + this.bottom = this.top = null; + }; + R.prototype.remove = function () { + R.eve("raphael.remove", this); + this.canvas.parentNode.removeChild(this.canvas); + for (var i in this) { + this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null; + } + return true; + }; + + var setproto = R.st; + for (var method in elproto) if (elproto[has](method) && !setproto[has](method)) { + setproto[method] = (function (methodname) { + return function () { + var arg = arguments; + return this.forEach(function (el) { + el[methodname].apply(el, arg); + }); + }; + })(method); + } + }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + + +/***/ } +/******/ ]) +}); +; \ No newline at end of file diff --git a/public/bower_components/raphael/raphael.no-deps.min.js b/public/bower_components/raphael/raphael.no-deps.min.js new file mode 100755 index 0000000..f58968e --- /dev/null +++ b/public/bower_components/raphael/raphael.no-deps.min.js @@ -0,0 +1,3 @@ +!function t(e,r){"object"==typeof exports&&"object"==typeof module?module.exports=r(require("eve")):"function"==typeof define&&define.amd?define(["eve"],r):"object"==typeof exports?exports.Raphael=r(require("eve")):e.Raphael=r(e.eve)}(this,function(t){return function(t){function e(i){if(r[i])return r[i].exports;var n=r[i]={exports:{},id:i,loaded:!1};return t[i].call(n.exports,n,n.exports,e),n.loaded=!0,n.exports}var r={};return e.m=t,e.c=r,e.p="",e(0)}([function(t,e,r){var i,n;i=[r(1),r(3),r(4)],n=function(t){return t}.apply(e,i),!(void 0!==n&&(t.exports=n))},function(t,e,r){var i,n;i=[r(2)],n=function(t){function e(r){if(e.is(r,"function"))return w?r():t.on("raphael.DOMload",r);if(e.is(r,Q))return e._engine.create[F](e,r.splice(0,3+e.is(r[0],$))).add(r);var i=Array.prototype.slice.call(arguments,0);if(e.is(i[i.length-1],"function")){var n=i.pop();return w?n.call(e._engine.create[F](e,i)):t.on("raphael.DOMload",function(){n.call(e._engine.create[F](e,i))})}return e._engine.create[F](e,arguments)}function r(t){if("function"==typeof t||Object(t)!==t)return t;var e=new t.constructor;for(var i in t)t[T](i)&&(e[i]=r(t[i]));return e}function i(t,e){for(var r=0,i=t.length;i>r;r++)if(t[r]===e)return t.push(t.splice(r,1)[0])}function n(t,e,r){function n(){var a=Array.prototype.slice.call(arguments,0),s=a.join("␀"),o=n.cache=n.cache||{},l=n.count=n.count||[];return o[T](s)?(i(l,s),r?r(o[s]):o[s]):(l.length>=1e3&&delete o[l.shift()],l.push(s),o[s]=t[F](e,a),r?r(o[s]):o[s])}return n}function a(){return this.hex}function s(t,e){for(var r=[],i=0,n=t.length;n-2*!e>i;i+=2){var a=[{x:+t[i-2],y:+t[i-1]},{x:+t[i],y:+t[i+1]},{x:+t[i+2],y:+t[i+3]},{x:+t[i+4],y:+t[i+5]}];e?i?n-4==i?a[3]={x:+t[0],y:+t[1]}:n-2==i&&(a[2]={x:+t[0],y:+t[1]},a[3]={x:+t[2],y:+t[3]}):a[0]={x:+t[n-2],y:+t[n-1]}:n-4==i?a[3]=a[2]:i||(a[0]={x:+t[i],y:+t[i+1]}),r.push(["C",(-a[0].x+6*a[1].x+a[2].x)/6,(-a[0].y+6*a[1].y+a[2].y)/6,(a[1].x+6*a[2].x-a[3].x)/6,(a[1].y+6*a[2].y-a[3].y)/6,a[2].x,a[2].y])}return r}function o(t,e,r,i,n){var a=-3*e+9*r-9*i+3*n,s=t*a+6*e-12*r+6*i;return t*s-3*e+3*r}function l(t,e,r,i,n,a,s,l,h){null==h&&(h=1),h=h>1?1:0>h?0:h;for(var u=h/2,c=12,f=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],p=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],d=0,g=0;c>g;g++){var x=u*f[g]+u,v=o(x,t,r,n,s),y=o(x,e,i,a,l),m=v*v+y*y;d+=p[g]*W.sqrt(m)}return u*d}function h(t,e,r,i,n,a,s,o,h){if(!(0>h||l(t,e,r,i,n,a,s,o)<h)){var u=1,c=u/2,f=u-c,p,d=.01;for(p=l(t,e,r,i,n,a,s,o,f);H(p-h)>d;)c/=2,f+=(h>p?1:-1)*c,p=l(t,e,r,i,n,a,s,o,f);return f}}function u(t,e,r,i,n,a,s,o){if(!(Y(t,r)<G(n,s)||G(t,r)>Y(n,s)||Y(e,i)<G(a,o)||G(e,i)>Y(a,o))){var l=(t*i-e*r)*(n-s)-(t-r)*(n*o-a*s),h=(t*i-e*r)*(a-o)-(e-i)*(n*o-a*s),u=(t-r)*(a-o)-(e-i)*(n-s);if(u){var c=l/u,f=h/u,p=+c.toFixed(2),d=+f.toFixed(2);if(!(p<+G(t,r).toFixed(2)||p>+Y(t,r).toFixed(2)||p<+G(n,s).toFixed(2)||p>+Y(n,s).toFixed(2)||d<+G(e,i).toFixed(2)||d>+Y(e,i).toFixed(2)||d<+G(a,o).toFixed(2)||d>+Y(a,o).toFixed(2)))return{x:c,y:f}}}}function c(t,e){return p(t,e)}function f(t,e){return p(t,e,1)}function p(t,r,i){var n=e.bezierBBox(t),a=e.bezierBBox(r);if(!e.isBBoxIntersect(n,a))return i?0:[];for(var s=l.apply(0,t),o=l.apply(0,r),h=Y(~~(s/5),1),c=Y(~~(o/5),1),f=[],p=[],d={},g=i?0:[],x=0;h+1>x;x++){var v=e.findDotsAtSegment.apply(e,t.concat(x/h));f.push({x:v.x,y:v.y,t:x/h})}for(x=0;c+1>x;x++)v=e.findDotsAtSegment.apply(e,r.concat(x/c)),p.push({x:v.x,y:v.y,t:x/c});for(x=0;h>x;x++)for(var y=0;c>y;y++){var m=f[x],b=f[x+1],_=p[y],w=p[y+1],k=H(b.x-m.x)<.001?"y":"x",B=H(w.x-_.x)<.001?"y":"x",C=u(m.x,m.y,b.x,b.y,_.x,_.y,w.x,w.y);if(C){if(d[C.x.toFixed(4)]==C.y.toFixed(4))continue;d[C.x.toFixed(4)]=C.y.toFixed(4);var S=m.t+H((C[k]-m[k])/(b[k]-m[k]))*(b.t-m.t),T=_.t+H((C[B]-_[B])/(w[B]-_[B]))*(w.t-_.t);S>=0&&1.001>=S&&T>=0&&1.001>=T&&(i?g++:g.push({x:C.x,y:C.y,t1:G(S,1),t2:G(T,1)}))}}return g}function d(t,r,i){t=e._path2curve(t),r=e._path2curve(r);for(var n,a,s,o,l,h,u,c,f,d,g=i?0:[],x=0,v=t.length;v>x;x++){var y=t[x];if("M"==y[0])n=l=y[1],a=h=y[2];else{"C"==y[0]?(f=[n,a].concat(y.slice(1)),n=f[6],a=f[7]):(f=[n,a,n,a,l,h,l,h],n=l,a=h);for(var m=0,b=r.length;b>m;m++){var _=r[m];if("M"==_[0])s=u=_[1],o=c=_[2];else{"C"==_[0]?(d=[s,o].concat(_.slice(1)),s=d[6],o=d[7]):(d=[s,o,s,o,u,c,u,c],s=u,o=c);var w=p(f,d,i);if(i)g+=w;else{for(var k=0,B=w.length;B>k;k++)w[k].segment1=x,w[k].segment2=m,w[k].bez1=f,w[k].bez2=d;g=g.concat(w)}}}}}return g}function g(t,e,r,i,n,a){null!=t?(this.a=+t,this.b=+e,this.c=+r,this.d=+i,this.e=+n,this.f=+a):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function x(){return this.x+j+this.y}function v(){return this.x+j+this.y+j+this.width+" × "+this.height}function y(t,e,r,i,n,a){function s(t){return((c*t+u)*t+h)*t}function o(t,e){var r=l(t,e);return((d*r+p)*r+f)*r}function l(t,e){var r,i,n,a,o,l;for(n=t,l=0;8>l;l++){if(a=s(n)-t,H(a)<e)return n;if(o=(3*c*n+2*u)*n+h,H(o)<1e-6)break;n-=a/o}if(r=0,i=1,n=t,r>n)return r;if(n>i)return i;for(;i>r;){if(a=s(n),H(a-t)<e)return n;t>a?r=n:i=n,n=(i-r)/2+r}return n}var h=3*e,u=3*(i-e)-h,c=1-h-u,f=3*r,p=3*(n-r)-f,d=1-f-p;return o(t,1/(200*a))}function m(t,e){var r=[],i={};if(this.ms=e,this.times=1,t){for(var n in t)t[T](n)&&(i[ht(n)]=t[n],r.push(ht(n)));r.sort(Bt)}this.anim=i,this.top=r[r.length-1],this.percents=r}function b(r,i,n,a,s,o){n=ht(n);var l,h,u,c=[],f,p,d,x=r.ms,v={},m={},b={};if(a)for(w=0,B=Ne.length;B>w;w++){var _=Ne[w];if(_.el.id==i.id&&_.anim==r){_.percent!=n?(Ne.splice(w,1),u=1):h=_,i.attr(_.totalOrigin);break}}else a=+m;for(var w=0,B=r.percents.length;B>w;w++){if(r.percents[w]==n||r.percents[w]>a*r.top){n=r.percents[w],p=r.percents[w-1]||0,x=x/r.top*(n-p),f=r.percents[w+1],l=r.anim[n];break}a&&i.attr(r.anim[r.percents[w]])}if(l){if(h)h.initstatus=a,h.start=new Date-h.ms*a;else{for(var C in l)if(l[T](C)&&(pt[T](C)||i.paper.customAttributes[T](C)))switch(v[C]=i.attr(C),null==v[C]&&(v[C]=ft[C]),m[C]=l[C],pt[C]){case $:b[C]=(m[C]-v[C])/x;break;case"colour":v[C]=e.getRGB(v[C]);var S=e.getRGB(m[C]);b[C]={r:(S.r-v[C].r)/x,g:(S.g-v[C].g)/x,b:(S.b-v[C].b)/x};break;case"path":var A=Qt(v[C],m[C]),N=A[1];for(v[C]=A[0],b[C]=[],w=0,B=v[C].length;B>w;w++){b[C][w]=[0];for(var E=1,M=v[C][w].length;M>E;E++)b[C][w][E]=(N[w][E]-v[C][w][E])/x}break;case"transform":var L=i._,F=le(L[C],m[C]);if(F)for(v[C]=F.from,m[C]=F.to,b[C]=[],b[C].real=!0,w=0,B=v[C].length;B>w;w++)for(b[C][w]=[v[C][w][0]],E=1,M=v[C][w].length;M>E;E++)b[C][w][E]=(m[C][w][E]-v[C][w][E])/x;else{var z=i.matrix||new g,R={_:{transform:L.transform},getBBox:function(){return i.getBBox(1)}};v[C]=[z.a,z.b,z.c,z.d,z.e,z.f],se(R,m[C]),m[C]=R._.transform,b[C]=[(R.matrix.a-z.a)/x,(R.matrix.b-z.b)/x,(R.matrix.c-z.c)/x,(R.matrix.d-z.d)/x,(R.matrix.e-z.e)/x,(R.matrix.f-z.f)/x]}break;case"csv":var j=q(l[C])[I](k),D=q(v[C])[I](k);if("clip-rect"==C)for(v[C]=D,b[C]=[],w=D.length;w--;)b[C][w]=(j[w]-v[C][w])/x;m[C]=j;break;default:for(j=[][P](l[C]),D=[][P](v[C]),b[C]=[],w=i.paper.customAttributes[C].length;w--;)b[C][w]=((j[w]||0)-(D[w]||0))/x}var V=l.easing,O=e.easing_formulas[V];if(!O)if(O=q(V).match(st),O&&5==O.length){var W=O;O=function(t){return y(t,+W[1],+W[2],+W[3],+W[4],x)}}else O=St;if(d=l.start||r.start||+new Date,_={anim:r,percent:n,timestamp:d,start:d+(r.del||0),status:0,initstatus:a||0,stop:!1,ms:x,easing:O,from:v,diff:b,to:m,el:i,callback:l.callback,prev:p,next:f,repeat:o||r.times,origin:i.attr(),totalOrigin:s},Ne.push(_),a&&!h&&!u&&(_.stop=!0,_.start=new Date-x*a,1==Ne.length))return Me();u&&(_.start=new Date-_.ms*a),1==Ne.length&&Ee(Me)}t("raphael.anim.start."+i.id,i,r)}}function _(t){for(var e=0;e<Ne.length;e++)Ne[e].el.paper==t&&Ne.splice(e--,1)}e.version="2.2.0",e.eve=t;var w,k=/[, ]+/,B={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},C=/\{(\d+)\}/g,S="prototype",T="hasOwnProperty",A={doc:document,win:window},N={was:Object.prototype[T].call(A.win,"Raphael"),is:A.win.Raphael},E=function(){this.ca=this.customAttributes={}},M,L="appendChild",F="apply",P="concat",z="ontouchstart"in A.win||A.win.DocumentTouch&&A.doc instanceof DocumentTouch,R="",j=" ",q=String,I="split",D="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel"[I](j),V={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},O=q.prototype.toLowerCase,W=Math,Y=W.max,G=W.min,H=W.abs,X=W.pow,U=W.PI,$="number",Z="string",Q="array",J="toString",K="fill",tt=Object.prototype.toString,et={},rt="push",it=e._ISURL=/^url\(['"]?(.+?)['"]?\)$/i,nt=/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,at={NaN:1,Infinity:1,"-Infinity":1},st=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,ot=W.round,lt="setAttribute",ht=parseFloat,ut=parseInt,ct=q.prototype.toUpperCase,ft=e._availableAttrs={"arrow-end":"none","arrow-start":"none",blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/","letter-spacing":0,opacity:1,path:"M0,0",r:0,rx:0,ry:0,src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",transform:"",width:0,x:0,y:0,"class":""},pt=e._availableAnimAttrs={blur:$,"clip-rect":"csv",cx:$,cy:$,fill:"colour","fill-opacity":$,"font-size":$,height:$,opacity:$,path:"path",r:$,rx:$,ry:$,stroke:"colour","stroke-opacity":$,"stroke-width":$,transform:"transform",width:$,x:$,y:$},dt=/[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]/g,gt=/[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/,xt={hs:1,rg:1},vt=/,?([achlmqrstvxz]),?/gi,yt=/([achlmrqstvz])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/gi,mt=/([rstm])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/gi,bt=/(-?\d*\.?\d*(?:e[\-+]?\d+)?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/gi,_t=e._radial_gradient=/^r(?:\(([^,]+?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*([^\)]+?)\))?/,wt={},kt=function(t,e){return t.key-e.key},Bt=function(t,e){return ht(t)-ht(e)},Ct=function(){},St=function(t){return t},Tt=e._rectPath=function(t,e,r,i,n){return n?[["M",t+n,e],["l",r-2*n,0],["a",n,n,0,0,1,n,n],["l",0,i-2*n],["a",n,n,0,0,1,-n,n],["l",2*n-r,0],["a",n,n,0,0,1,-n,-n],["l",0,2*n-i],["a",n,n,0,0,1,n,-n],["z"]]:[["M",t,e],["l",r,0],["l",0,i],["l",-r,0],["z"]]},At=function(t,e,r,i){return null==i&&(i=r),[["M",t,e],["m",0,-i],["a",r,i,0,1,1,0,2*i],["a",r,i,0,1,1,0,-2*i],["z"]]},Nt=e._getPath={path:function(t){return t.attr("path")},circle:function(t){var e=t.attrs;return At(e.cx,e.cy,e.r)},ellipse:function(t){var e=t.attrs;return At(e.cx,e.cy,e.rx,e.ry)},rect:function(t){var e=t.attrs;return Tt(e.x,e.y,e.width,e.height,e.r)},image:function(t){var e=t.attrs;return Tt(e.x,e.y,e.width,e.height)},text:function(t){var e=t._getBBox();return Tt(e.x,e.y,e.width,e.height)},set:function(t){var e=t._getBBox();return Tt(e.x,e.y,e.width,e.height)}},Et=e.mapPath=function(t,e){if(!e)return t;var r,i,n,a,s,o,l;for(t=Qt(t),n=0,s=t.length;s>n;n++)for(l=t[n],a=1,o=l.length;o>a;a+=2)r=e.x(l[a],l[a+1]),i=e.y(l[a],l[a+1]),l[a]=r,l[a+1]=i;return t};if(e._g=A,e.type=A.win.SVGAngle||A.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML","VML"==e.type){var Mt=A.doc.createElement("div"),Lt;if(Mt.innerHTML='<v:shape adj="1"/>',Lt=Mt.firstChild,Lt.style.behavior="url(#default#VML)",!Lt||"object"!=typeof Lt.adj)return e.type=R;Mt=null}e.svg=!(e.vml="VML"==e.type),e._Paper=E,e.fn=M=E.prototype=e.prototype,e._id=0,e._oid=0,e.is=function(t,e){return e=O.call(e),"finite"==e?!at[T](+t):"array"==e?t instanceof Array:"null"==e&&null===t||e==typeof t&&null!==t||"object"==e&&t===Object(t)||"array"==e&&Array.isArray&&Array.isArray(t)||tt.call(t).slice(8,-1).toLowerCase()==e},e.angle=function(t,r,i,n,a,s){if(null==a){var o=t-i,l=r-n;return o||l?(180+180*W.atan2(-l,-o)/U+360)%360:0}return e.angle(t,r,a,s)-e.angle(i,n,a,s)},e.rad=function(t){return t%360*U/180},e.deg=function(t){return Math.round(180*t/U%360*1e3)/1e3},e.snapTo=function(t,r,i){if(i=e.is(i,"finite")?i:10,e.is(t,Q)){for(var n=t.length;n--;)if(H(t[n]-r)<=i)return t[n]}else{t=+t;var a=r%t;if(i>a)return r-a;if(a>t-i)return r-a+t}return r};var Ft=e.createUUID=function(t,e){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(t,e).toUpperCase()}}(/[xy]/g,function(t){var e=16*W.random()|0,r="x"==t?e:3&e|8;return r.toString(16)});e.setWindow=function(r){t("raphael.setWindow",e,A.win,r),A.win=r,A.doc=A.win.document,e._engine.initWin&&e._engine.initWin(A.win)};var Pt=function(t){if(e.vml){var r=/^\s+|\s+$/g,i;try{var a=new ActiveXObject("htmlfile");a.write("<body>"),a.close(),i=a.body}catch(s){i=createPopup().document.body}var o=i.createTextRange();Pt=n(function(t){try{i.style.color=q(t).replace(r,R);var e=o.queryCommandValue("ForeColor");return e=(255&e)<<16|65280&e|(16711680&e)>>>16,"#"+("000000"+e.toString(16)).slice(-6)}catch(n){return"none"}})}else{var l=A.doc.createElement("i");l.title="Raphaël Colour Picker",l.style.display="none",A.doc.body.appendChild(l),Pt=n(function(t){return l.style.color=t,A.doc.defaultView.getComputedStyle(l,R).getPropertyValue("color")})}return Pt(t)},zt=function(){return"hsb("+[this.h,this.s,this.b]+")"},Rt=function(){return"hsl("+[this.h,this.s,this.l]+")"},jt=function(){return this.hex},qt=function(t,r,i){if(null==r&&e.is(t,"object")&&"r"in t&&"g"in t&&"b"in t&&(i=t.b,r=t.g,t=t.r),null==r&&e.is(t,Z)){var n=e.getRGB(t);t=n.r,r=n.g,i=n.b}return(t>1||r>1||i>1)&&(t/=255,r/=255,i/=255),[t,r,i]},It=function(t,r,i,n){t*=255,r*=255,i*=255;var a={r:t,g:r,b:i,hex:e.rgb(t,r,i),toString:jt};return e.is(n,"finite")&&(a.opacity=n),a};e.color=function(t){var r;return e.is(t,"object")&&"h"in t&&"s"in t&&"b"in t?(r=e.hsb2rgb(t),t.r=r.r,t.g=r.g,t.b=r.b,t.hex=r.hex):e.is(t,"object")&&"h"in t&&"s"in t&&"l"in t?(r=e.hsl2rgb(t),t.r=r.r,t.g=r.g,t.b=r.b,t.hex=r.hex):(e.is(t,"string")&&(t=e.getRGB(t)),e.is(t,"object")&&"r"in t&&"g"in t&&"b"in t?(r=e.rgb2hsl(t),t.h=r.h,t.s=r.s,t.l=r.l,r=e.rgb2hsb(t),t.v=r.b):(t={hex:"none"},t.r=t.g=t.b=t.h=t.s=t.v=t.l=-1)),t.toString=jt,t},e.hsb2rgb=function(t,e,r,i){this.is(t,"object")&&"h"in t&&"s"in t&&"b"in t&&(r=t.b,e=t.s,i=t.o,t=t.h),t*=360;var n,a,s,o,l;return t=t%360/60,l=r*e,o=l*(1-H(t%2-1)),n=a=s=r-l,t=~~t,n+=[l,o,0,0,o,l][t],a+=[o,l,l,o,0,0][t],s+=[0,0,o,l,l,o][t],It(n,a,s,i)},e.hsl2rgb=function(t,e,r,i){this.is(t,"object")&&"h"in t&&"s"in t&&"l"in t&&(r=t.l,e=t.s,t=t.h),(t>1||e>1||r>1)&&(t/=360,e/=100,r/=100),t*=360;var n,a,s,o,l;return t=t%360/60,l=2*e*(.5>r?r:1-r),o=l*(1-H(t%2-1)),n=a=s=r-l/2,t=~~t,n+=[l,o,0,0,o,l][t],a+=[o,l,l,o,0,0][t],s+=[0,0,o,l,l,o][t],It(n,a,s,i)},e.rgb2hsb=function(t,e,r){r=qt(t,e,r),t=r[0],e=r[1],r=r[2];var i,n,a,s;return a=Y(t,e,r),s=a-G(t,e,r),i=0==s?null:a==t?(e-r)/s:a==e?(r-t)/s+2:(t-e)/s+4,i=(i+360)%6*60/360,n=0==s?0:s/a,{h:i,s:n,b:a,toString:zt}},e.rgb2hsl=function(t,e,r){r=qt(t,e,r),t=r[0],e=r[1],r=r[2];var i,n,a,s,o,l;return s=Y(t,e,r),o=G(t,e,r),l=s-o,i=0==l?null:s==t?(e-r)/l:s==e?(r-t)/l+2:(t-e)/l+4,i=(i+360)%6*60/360,a=(s+o)/2,n=0==l?0:.5>a?l/(2*a):l/(2-2*a),{h:i,s:n,l:a,toString:Rt}},e._path2string=function(){return this.join(",").replace(vt,"$1")};var Dt=e._preload=function(t,e){var r=A.doc.createElement("img");r.style.cssText="position:absolute;left:-9999em;top:-9999em",r.onload=function(){e.call(this),this.onload=null,A.doc.body.removeChild(this)},r.onerror=function(){A.doc.body.removeChild(this)},A.doc.body.appendChild(r),r.src=t};e.getRGB=n(function(t){if(!t||(t=q(t)).indexOf("-")+1)return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:a};if("none"==t)return{r:-1,g:-1,b:-1,hex:"none",toString:a};!(xt[T](t.toLowerCase().substring(0,2))||"#"==t.charAt())&&(t=Pt(t));var r,i,n,s,o,l,h,u=t.match(nt);return u?(u[2]&&(s=ut(u[2].substring(5),16),n=ut(u[2].substring(3,5),16),i=ut(u[2].substring(1,3),16)),u[3]&&(s=ut((l=u[3].charAt(3))+l,16),n=ut((l=u[3].charAt(2))+l,16),i=ut((l=u[3].charAt(1))+l,16)),u[4]&&(h=u[4][I](gt),i=ht(h[0]),"%"==h[0].slice(-1)&&(i*=2.55),n=ht(h[1]),"%"==h[1].slice(-1)&&(n*=2.55),s=ht(h[2]),"%"==h[2].slice(-1)&&(s*=2.55),"rgba"==u[1].toLowerCase().slice(0,4)&&(o=ht(h[3])),h[3]&&"%"==h[3].slice(-1)&&(o/=100)),u[5]?(h=u[5][I](gt),i=ht(h[0]),"%"==h[0].slice(-1)&&(i*=2.55),n=ht(h[1]),"%"==h[1].slice(-1)&&(n*=2.55),s=ht(h[2]),"%"==h[2].slice(-1)&&(s*=2.55),("deg"==h[0].slice(-3)||"°"==h[0].slice(-1))&&(i/=360),"hsba"==u[1].toLowerCase().slice(0,4)&&(o=ht(h[3])),h[3]&&"%"==h[3].slice(-1)&&(o/=100),e.hsb2rgb(i,n,s,o)):u[6]?(h=u[6][I](gt),i=ht(h[0]),"%"==h[0].slice(-1)&&(i*=2.55),n=ht(h[1]),"%"==h[1].slice(-1)&&(n*=2.55),s=ht(h[2]),"%"==h[2].slice(-1)&&(s*=2.55),("deg"==h[0].slice(-3)||"°"==h[0].slice(-1))&&(i/=360),"hsla"==u[1].toLowerCase().slice(0,4)&&(o=ht(h[3])),h[3]&&"%"==h[3].slice(-1)&&(o/=100),e.hsl2rgb(i,n,s,o)):(u={r:i,g:n,b:s,toString:a},u.hex="#"+(16777216|s|n<<8|i<<16).toString(16).slice(1),e.is(o,"finite")&&(u.opacity=o),u)):{r:-1,g:-1,b:-1,hex:"none",error:1,toString:a}},e),e.hsb=n(function(t,r,i){return e.hsb2rgb(t,r,i).hex}),e.hsl=n(function(t,r,i){return e.hsl2rgb(t,r,i).hex}),e.rgb=n(function(t,e,r){function i(t){return t+.5|0}return"#"+(16777216|i(r)|i(e)<<8|i(t)<<16).toString(16).slice(1)}),e.getColor=function(t){var e=this.getColor.start=this.getColor.start||{h:0,s:1,b:t||.75},r=this.hsb2rgb(e.h,e.s,e.b);return e.h+=.075,e.h>1&&(e.h=0,e.s-=.2,e.s<=0&&(this.getColor.start={h:0,s:1,b:e.b})),r.hex},e.getColor.reset=function(){delete this.start},e.parsePathString=function(t){if(!t)return null;var r=Vt(t);if(r.arr)return Wt(r.arr);var i={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},n=[];return e.is(t,Q)&&e.is(t[0],Q)&&(n=Wt(t)),n.length||q(t).replace(yt,function(t,e,r){var a=[],s=e.toLowerCase();if(r.replace(bt,function(t,e){e&&a.push(+e)}),"m"==s&&a.length>2&&(n.push([e][P](a.splice(0,2))),s="l",e="m"==e?"l":"L"),"r"==s)n.push([e][P](a));else for(;a.length>=i[s]&&(n.push([e][P](a.splice(0,i[s]))),i[s]););}),n.toString=e._path2string,r.arr=Wt(n),n},e.parseTransformString=n(function(t){if(!t)return null;var r={r:3,s:4,t:2,m:6},i=[];return e.is(t,Q)&&e.is(t[0],Q)&&(i=Wt(t)),i.length||q(t).replace(mt,function(t,e,r){var n=[],a=O.call(e);r.replace(bt,function(t,e){e&&n.push(+e)}),i.push([e][P](n))}),i.toString=e._path2string,i});var Vt=function(t){var e=Vt.ps=Vt.ps||{};return e[t]?e[t].sleep=100:e[t]={sleep:100},setTimeout(function(){for(var r in e)e[T](r)&&r!=t&&(e[r].sleep--,!e[r].sleep&&delete e[r])}),e[t]};e.findDotsAtSegment=function(t,e,r,i,n,a,s,o,l){var h=1-l,u=X(h,3),c=X(h,2),f=l*l,p=f*l,d=u*t+3*c*l*r+3*h*l*l*n+p*s,g=u*e+3*c*l*i+3*h*l*l*a+p*o,x=t+2*l*(r-t)+f*(n-2*r+t),v=e+2*l*(i-e)+f*(a-2*i+e),y=r+2*l*(n-r)+f*(s-2*n+r),m=i+2*l*(a-i)+f*(o-2*a+i),b=h*t+l*r,_=h*e+l*i,w=h*n+l*s,k=h*a+l*o,B=90-180*W.atan2(x-y,v-m)/U;return(x>y||m>v)&&(B+=180),{x:d,y:g,m:{x:x,y:v},n:{x:y,y:m},start:{x:b,y:_},end:{x:w,y:k},alpha:B}},e.bezierBBox=function(t,r,i,n,a,s,o,l){e.is(t,"array")||(t=[t,r,i,n,a,s,o,l]);var h=Zt.apply(null,t);return{x:h.min.x,y:h.min.y,x2:h.max.x,y2:h.max.y,width:h.max.x-h.min.x,height:h.max.y-h.min.y}},e.isPointInsideBBox=function(t,e,r){return e>=t.x&&e<=t.x2&&r>=t.y&&r<=t.y2},e.isBBoxIntersect=function(t,r){var i=e.isPointInsideBBox;return i(r,t.x,t.y)||i(r,t.x2,t.y)||i(r,t.x,t.y2)||i(r,t.x2,t.y2)||i(t,r.x,r.y)||i(t,r.x2,r.y)||i(t,r.x,r.y2)||i(t,r.x2,r.y2)||(t.x<r.x2&&t.x>r.x||r.x<t.x2&&r.x>t.x)&&(t.y<r.y2&&t.y>r.y||r.y<t.y2&&r.y>t.y)},e.pathIntersection=function(t,e){return d(t,e)},e.pathIntersectionNumber=function(t,e){return d(t,e,1)},e.isPointInsidePath=function(t,r,i){var n=e.pathBBox(t);return e.isPointInsideBBox(n,r,i)&&d(t,[["M",r,i],["H",n.x2+10]],1)%2==1},e._removedFactory=function(e){return function(){t("raphael.log",null,"Raphaël: you are calling to method “"+e+"” of removed object",e)}};var Ot=e.pathBBox=function(t){var e=Vt(t);if(e.bbox)return r(e.bbox);if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0};t=Qt(t);for(var i=0,n=0,a=[],s=[],o,l=0,h=t.length;h>l;l++)if(o=t[l],"M"==o[0])i=o[1],n=o[2],a.push(i),s.push(n);else{var u=Zt(i,n,o[1],o[2],o[3],o[4],o[5],o[6]);a=a[P](u.min.x,u.max.x),s=s[P](u.min.y,u.max.y),i=o[5],n=o[6]}var c=G[F](0,a),f=G[F](0,s),p=Y[F](0,a),d=Y[F](0,s),g=p-c,x=d-f,v={x:c,y:f,x2:p,y2:d,width:g,height:x,cx:c+g/2,cy:f+x/2};return e.bbox=r(v),v},Wt=function(t){var i=r(t);return i.toString=e._path2string,i},Yt=e._pathToRelative=function(t){var r=Vt(t);if(r.rel)return Wt(r.rel);e.is(t,Q)&&e.is(t&&t[0],Q)||(t=e.parsePathString(t));var i=[],n=0,a=0,s=0,o=0,l=0;"M"==t[0][0]&&(n=t[0][1],a=t[0][2],s=n,o=a,l++,i.push(["M",n,a]));for(var h=l,u=t.length;u>h;h++){var c=i[h]=[],f=t[h];if(f[0]!=O.call(f[0]))switch(c[0]=O.call(f[0]),c[0]){case"a":c[1]=f[1],c[2]=f[2],c[3]=f[3],c[4]=f[4],c[5]=f[5],c[6]=+(f[6]-n).toFixed(3),c[7]=+(f[7]-a).toFixed(3);break;case"v":c[1]=+(f[1]-a).toFixed(3);break;case"m":s=f[1],o=f[2];default:for(var p=1,d=f.length;d>p;p++)c[p]=+(f[p]-(p%2?n:a)).toFixed(3)}else{c=i[h]=[],"m"==f[0]&&(s=f[1]+n,o=f[2]+a);for(var g=0,x=f.length;x>g;g++)i[h][g]=f[g]}var v=i[h].length;switch(i[h][0]){case"z":n=s,a=o;break;case"h":n+=+i[h][v-1];break;case"v":a+=+i[h][v-1];break;default:n+=+i[h][v-2],a+=+i[h][v-1]}}return i.toString=e._path2string,r.rel=Wt(i),i},Gt=e._pathToAbsolute=function(t){var r=Vt(t);if(r.abs)return Wt(r.abs);if(e.is(t,Q)&&e.is(t&&t[0],Q)||(t=e.parsePathString(t)),!t||!t.length)return[["M",0,0]];var i=[],n=0,a=0,o=0,l=0,h=0;"M"==t[0][0]&&(n=+t[0][1],a=+t[0][2],o=n,l=a,h++,i[0]=["M",n,a]);for(var u=3==t.length&&"M"==t[0][0]&&"R"==t[1][0].toUpperCase()&&"Z"==t[2][0].toUpperCase(),c,f,p=h,d=t.length;d>p;p++){if(i.push(c=[]),f=t[p],f[0]!=ct.call(f[0]))switch(c[0]=ct.call(f[0]),c[0]){case"A":c[1]=f[1],c[2]=f[2],c[3]=f[3],c[4]=f[4],c[5]=f[5],c[6]=+(f[6]+n),c[7]=+(f[7]+a);break;case"V":c[1]=+f[1]+a;break;case"H":c[1]=+f[1]+n;break;case"R":for(var g=[n,a][P](f.slice(1)),x=2,v=g.length;v>x;x++)g[x]=+g[x]+n,g[++x]=+g[x]+a;i.pop(),i=i[P](s(g,u));break;case"M":o=+f[1]+n,l=+f[2]+a;default:for(x=1,v=f.length;v>x;x++)c[x]=+f[x]+(x%2?n:a)}else if("R"==f[0])g=[n,a][P](f.slice(1)),i.pop(),i=i[P](s(g,u)),c=["R"][P](f.slice(-2));else for(var y=0,m=f.length;m>y;y++)c[y]=f[y];switch(c[0]){case"Z":n=o,a=l;break;case"H":n=c[1];break;case"V":a=c[1];break;case"M":o=c[c.length-2],l=c[c.length-1];default:n=c[c.length-2],a=c[c.length-1]}}return i.toString=e._path2string,r.abs=Wt(i),i},Ht=function(t,e,r,i){return[t,e,r,i,r,i]},Xt=function(t,e,r,i,n,a){var s=1/3,o=2/3;return[s*t+o*r,s*e+o*i,s*n+o*r,s*a+o*i,n,a]},Ut=function(t,e,r,i,a,s,o,l,h,u){var c=120*U/180,f=U/180*(+a||0),p=[],d,g=n(function(t,e,r){var i=t*W.cos(r)-e*W.sin(r),n=t*W.sin(r)+e*W.cos(r);return{x:i,y:n}});if(u)S=u[0],T=u[1],B=u[2],C=u[3];else{d=g(t,e,-f),t=d.x,e=d.y,d=g(l,h,-f),l=d.x,h=d.y;var x=W.cos(U/180*a),v=W.sin(U/180*a),y=(t-l)/2,m=(e-h)/2,b=y*y/(r*r)+m*m/(i*i);b>1&&(b=W.sqrt(b),r=b*r,i=b*i);var _=r*r,w=i*i,k=(s==o?-1:1)*W.sqrt(H((_*w-_*m*m-w*y*y)/(_*m*m+w*y*y))),B=k*r*m/i+(t+l)/2,C=k*-i*y/r+(e+h)/2,S=W.asin(((e-C)/i).toFixed(9)),T=W.asin(((h-C)/i).toFixed(9));S=B>t?U-S:S,T=B>l?U-T:T,0>S&&(S=2*U+S),0>T&&(T=2*U+T),o&&S>T&&(S-=2*U),!o&&T>S&&(T-=2*U)}var A=T-S;if(H(A)>c){var N=T,E=l,M=h;T=S+c*(o&&T>S?1:-1),l=B+r*W.cos(T),h=C+i*W.sin(T),p=Ut(l,h,r,i,a,0,o,E,M,[T,N,B,C])}A=T-S;var L=W.cos(S),F=W.sin(S),z=W.cos(T),R=W.sin(T),j=W.tan(A/4),q=4/3*r*j,D=4/3*i*j,V=[t,e],O=[t+q*F,e-D*L],Y=[l+q*R,h-D*z],G=[l,h];if(O[0]=2*V[0]-O[0],O[1]=2*V[1]-O[1],u)return[O,Y,G][P](p);p=[O,Y,G][P](p).join()[I](",");for(var X=[],$=0,Z=p.length;Z>$;$++)X[$]=$%2?g(p[$-1],p[$],f).y:g(p[$],p[$+1],f).x;return X},$t=function(t,e,r,i,n,a,s,o,l){var h=1-l;return{x:X(h,3)*t+3*X(h,2)*l*r+3*h*l*l*n+X(l,3)*s,y:X(h,3)*e+3*X(h,2)*l*i+3*h*l*l*a+X(l,3)*o}},Zt=n(function(t,e,r,i,n,a,s,o){var l=n-2*r+t-(s-2*n+r),h=2*(r-t)-2*(n-r),u=t-r,c=(-h+W.sqrt(h*h-4*l*u))/2/l,f=(-h-W.sqrt(h*h-4*l*u))/2/l,p=[e,o],d=[t,s],g;return H(c)>"1e12"&&(c=.5),H(f)>"1e12"&&(f=.5),c>0&&1>c&&(g=$t(t,e,r,i,n,a,s,o,c),d.push(g.x),p.push(g.y)),f>0&&1>f&&(g=$t(t,e,r,i,n,a,s,o,f),d.push(g.x),p.push(g.y)),l=a-2*i+e-(o-2*a+i),h=2*(i-e)-2*(a-i),u=e-i,c=(-h+W.sqrt(h*h-4*l*u))/2/l,f=(-h-W.sqrt(h*h-4*l*u))/2/l,H(c)>"1e12"&&(c=.5),H(f)>"1e12"&&(f=.5),c>0&&1>c&&(g=$t(t,e,r,i,n,a,s,o,c),d.push(g.x),p.push(g.y)),f>0&&1>f&&(g=$t(t,e,r,i,n,a,s,o,f),d.push(g.x),p.push(g.y)),{min:{x:G[F](0,d),y:G[F](0,p)},max:{x:Y[F](0,d),y:Y[F](0,p)}}}),Qt=e._path2curve=n(function(t,e){var r=!e&&Vt(t);if(!e&&r.curve)return Wt(r.curve);for(var i=Gt(t),n=e&&Gt(e),a={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},s={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},o=(function(t,e,r){var i,n,a={T:1,Q:1};if(!t)return["C",e.x,e.y,e.x,e.y,e.x,e.y];switch(!(t[0]in a)&&(e.qx=e.qy=null),t[0]){case"M":e.X=t[1],e.Y=t[2];break;case"A":t=["C"][P](Ut[F](0,[e.x,e.y][P](t.slice(1))));break;case"S":"C"==r||"S"==r?(i=2*e.x-e.bx,n=2*e.y-e.by):(i=e.x,n=e.y),t=["C",i,n][P](t.slice(1));break;case"T":"Q"==r||"T"==r?(e.qx=2*e.x-e.qx,e.qy=2*e.y-e.qy):(e.qx=e.x,e.qy=e.y),t=["C"][P](Xt(e.x,e.y,e.qx,e.qy,t[1],t[2]));break;case"Q":e.qx=t[1],e.qy=t[2],t=["C"][P](Xt(e.x,e.y,t[1],t[2],t[3],t[4]));break;case"L":t=["C"][P](Ht(e.x,e.y,t[1],t[2]));break;case"H":t=["C"][P](Ht(e.x,e.y,t[1],e.y));break;case"V":t=["C"][P](Ht(e.x,e.y,e.x,t[1]));break;case"Z":t=["C"][P](Ht(e.x,e.y,e.X,e.Y))}return t}),l=function(t,e){if(t[e].length>7){t[e].shift();for(var r=t[e];r.length;)u[e]="A",n&&(c[e]="A"),t.splice(e++,0,["C"][P](r.splice(0,6)));t.splice(e,1),g=Y(i.length,n&&n.length||0)}},h=function(t,e,r,a,s){t&&e&&"M"==t[s][0]&&"M"!=e[s][0]&&(e.splice(s,0,["M",a.x,a.y]),r.bx=0,r.by=0,r.x=t[s][1],r.y=t[s][2],g=Y(i.length,n&&n.length||0))},u=[],c=[],f="",p="",d=0,g=Y(i.length,n&&n.length||0);g>d;d++){i[d]&&(f=i[d][0]),"C"!=f&&(u[d]=f,d&&(p=u[d-1])),i[d]=o(i[d],a,p),"A"!=u[d]&&"C"==f&&(u[d]="C"),l(i,d),n&&(n[d]&&(f=n[d][0]),"C"!=f&&(c[d]=f,d&&(p=c[d-1])),n[d]=o(n[d],s,p),"A"!=c[d]&&"C"==f&&(c[d]="C"),l(n,d)),h(i,n,a,s,d),h(n,i,s,a,d);var x=i[d],v=n&&n[d],y=x.length,m=n&&v.length;a.x=x[y-2],a.y=x[y-1],a.bx=ht(x[y-4])||a.x,a.by=ht(x[y-3])||a.y,s.bx=n&&(ht(v[m-4])||s.x),s.by=n&&(ht(v[m-3])||s.y),s.x=n&&v[m-2],s.y=n&&v[m-1]}return n||(r.curve=Wt(i)),n?[i,n]:i},null,Wt),Jt=e._parseDots=n(function(t){for(var r=[],i=0,n=t.length;n>i;i++){var a={},s=t[i].match(/^([^:]*):?([\d\.]*)/);if(a.color=e.getRGB(s[1]),a.color.error)return null;a.opacity=a.color.opacity,a.color=a.color.hex,s[2]&&(a.offset=s[2]+"%"),r.push(a)}for(i=1,n=r.length-1;n>i;i++)if(!r[i].offset){for(var o=ht(r[i-1].offset||0),l=0,h=i+1;n>h;h++)if(r[h].offset){l=r[h].offset;break}l||(l=100,h=n),l=ht(l);for(var u=(l-o)/(h-i+1);h>i;i++)o+=u,r[i].offset=o+"%"}return r}),Kt=e._tear=function(t,e){t==e.top&&(e.top=t.prev),t==e.bottom&&(e.bottom=t.next),t.next&&(t.next.prev=t.prev),t.prev&&(t.prev.next=t.next)},te=e._tofront=function(t,e){e.top!==t&&(Kt(t,e),t.next=null,t.prev=e.top,e.top.next=t,e.top=t)},ee=e._toback=function(t,e){e.bottom!==t&&(Kt(t,e),t.next=e.bottom,t.prev=null,e.bottom.prev=t,e.bottom=t)},re=e._insertafter=function(t,e,r){Kt(t,r),e==r.top&&(r.top=t),e.next&&(e.next.prev=t),t.next=e.next,t.prev=e,e.next=t},ie=e._insertbefore=function(t,e,r){Kt(t,r),e==r.bottom&&(r.bottom=t),e.prev&&(e.prev.next=t),t.prev=e.prev,e.prev=t,t.next=e},ne=e.toMatrix=function(t,e){var r=Ot(t),i={_:{transform:R},getBBox:function(){return r}};return se(i,e),i.matrix},ae=e.transformPath=function(t,e){return Et(t,ne(t,e))},se=e._extractTransform=function(t,r){if(null==r)return t._.transform;r=q(r).replace(/\.{3}|\u2026/g,t._.transform||R);var i=e.parseTransformString(r),n=0,a=0,s=0,o=1,l=1,h=t._,u=new g;if(h.transform=i||[],i)for(var c=0,f=i.length;f>c;c++){var p=i[c],d=p.length,x=q(p[0]).toLowerCase(),v=p[0]!=x,y=v?u.invert():0,m,b,_,w,k;"t"==x&&3==d?v?(m=y.x(0,0),b=y.y(0,0),_=y.x(p[1],p[2]),w=y.y(p[1],p[2]),u.translate(_-m,w-b)):u.translate(p[1],p[2]):"r"==x?2==d?(k=k||t.getBBox(1),u.rotate(p[1],k.x+k.width/2,k.y+k.height/2),n+=p[1]):4==d&&(v?(_=y.x(p[2],p[3]),w=y.y(p[2],p[3]),u.rotate(p[1],_,w)):u.rotate(p[1],p[2],p[3]),n+=p[1]):"s"==x?2==d||3==d?(k=k||t.getBBox(1),u.scale(p[1],p[d-1],k.x+k.width/2,k.y+k.height/2),o*=p[1],l*=p[d-1]):5==d&&(v?(_=y.x(p[3],p[4]),w=y.y(p[3],p[4]),u.scale(p[1],p[2],_,w)):u.scale(p[1],p[2],p[3],p[4]),o*=p[1],l*=p[2]):"m"==x&&7==d&&u.add(p[1],p[2],p[3],p[4],p[5],p[6]),h.dirtyT=1,t.matrix=u}t.matrix=u,h.sx=o,h.sy=l,h.deg=n,h.dx=a=u.e,h.dy=s=u.f,1==o&&1==l&&!n&&h.bbox?(h.bbox.x+=+a,h.bbox.y+=+s):h.dirtyT=1},oe=function(t){var e=t[0];switch(e.toLowerCase()){case"t":return[e,0,0];case"m":return[e,1,0,0,1,0,0];case"r":return 4==t.length?[e,0,t[2],t[3]]:[e,0];case"s":return 5==t.length?[e,1,1,t[3],t[4]]:3==t.length?[e,1,1]:[e,1]}},le=e._equaliseTransform=function(t,r){r=q(r).replace(/\.{3}|\u2026/g,t),t=e.parseTransformString(t)||[],r=e.parseTransformString(r)||[];for(var i=Y(t.length,r.length),n=[],a=[],s=0,o,l,h,u;i>s;s++){if(h=t[s]||oe(r[s]),u=r[s]||oe(h),h[0]!=u[0]||"r"==h[0].toLowerCase()&&(h[2]!=u[2]||h[3]!=u[3])||"s"==h[0].toLowerCase()&&(h[3]!=u[3]||h[4]!=u[4]))return;for(n[s]=[],a[s]=[],o=0,l=Y(h.length,u.length);l>o;o++)o in h&&(n[s][o]=h[o]),o in u&&(a[s][o]=u[o])}return{from:n,to:a}};e._getContainer=function(t,r,i,n){var a;return a=null!=n||e.is(t,"object")?t:A.doc.getElementById(t),null!=a?a.tagName?null==r?{container:a,width:a.style.pixelWidth||a.offsetWidth,height:a.style.pixelHeight||a.offsetHeight}:{container:a,width:r,height:i}:{container:1,x:t,y:r,width:i,height:n}:void 0},e.pathToRelative=Yt,e._engine={},e.path2curve=Qt,e.matrix=function(t,e,r,i,n,a){return new g(t,e,r,i,n,a)},function(t){function r(t){return t[0]*t[0]+t[1]*t[1]}function i(t){var e=W.sqrt(r(t));t[0]&&(t[0]/=e),t[1]&&(t[1]/=e)}t.add=function(t,e,r,i,n,a){var s=[[],[],[]],o=[[this.a,this.c,this.e],[this.b,this.d,this.f],[0,0,1]],l=[[t,r,n],[e,i,a],[0,0,1]],h,u,c,f;for(t&&t instanceof g&&(l=[[t.a,t.c,t.e],[t.b,t.d,t.f],[0,0,1]]),h=0;3>h;h++)for(u=0;3>u;u++){for(f=0,c=0;3>c;c++)f+=o[h][c]*l[c][u];s[h][u]=f}this.a=s[0][0],this.b=s[1][0],this.c=s[0][1],this.d=s[1][1],this.e=s[0][2],this.f=s[1][2]},t.invert=function(){var t=this,e=t.a*t.d-t.b*t.c;return new g(t.d/e,-t.b/e,-t.c/e,t.a/e,(t.c*t.f-t.d*t.e)/e,(t.b*t.e-t.a*t.f)/e)},t.clone=function(){return new g(this.a,this.b,this.c,this.d,this.e,this.f); +},t.translate=function(t,e){this.add(1,0,0,1,t,e)},t.scale=function(t,e,r,i){null==e&&(e=t),(r||i)&&this.add(1,0,0,1,r,i),this.add(t,0,0,e,0,0),(r||i)&&this.add(1,0,0,1,-r,-i)},t.rotate=function(t,r,i){t=e.rad(t),r=r||0,i=i||0;var n=+W.cos(t).toFixed(9),a=+W.sin(t).toFixed(9);this.add(n,a,-a,n,r,i),this.add(1,0,0,1,-r,-i)},t.x=function(t,e){return t*this.a+e*this.c+this.e},t.y=function(t,e){return t*this.b+e*this.d+this.f},t.get=function(t){return+this[q.fromCharCode(97+t)].toFixed(4)},t.toString=function(){return e.svg?"matrix("+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+")":[this.get(0),this.get(2),this.get(1),this.get(3),0,0].join()},t.toFilter=function(){return"progid:DXImageTransform.Microsoft.Matrix(M11="+this.get(0)+", M12="+this.get(2)+", M21="+this.get(1)+", M22="+this.get(3)+", Dx="+this.get(4)+", Dy="+this.get(5)+", sizingmethod='auto expand')"},t.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},t.split=function(){var t={};t.dx=this.e,t.dy=this.f;var n=[[this.a,this.c],[this.b,this.d]];t.scalex=W.sqrt(r(n[0])),i(n[0]),t.shear=n[0][0]*n[1][0]+n[0][1]*n[1][1],n[1]=[n[1][0]-n[0][0]*t.shear,n[1][1]-n[0][1]*t.shear],t.scaley=W.sqrt(r(n[1])),i(n[1]),t.shear/=t.scaley;var a=-n[0][1],s=n[1][1];return 0>s?(t.rotate=e.deg(W.acos(s)),0>a&&(t.rotate=360-t.rotate)):t.rotate=e.deg(W.asin(a)),t.isSimple=!(+t.shear.toFixed(9)||t.scalex.toFixed(9)!=t.scaley.toFixed(9)&&t.rotate),t.isSuperSimple=!+t.shear.toFixed(9)&&t.scalex.toFixed(9)==t.scaley.toFixed(9)&&!t.rotate,t.noRotation=!+t.shear.toFixed(9)&&!t.rotate,t},t.toTransformString=function(t){var e=t||this[I]();return e.isSimple?(e.scalex=+e.scalex.toFixed(4),e.scaley=+e.scaley.toFixed(4),e.rotate=+e.rotate.toFixed(4),(e.dx||e.dy?"t"+[e.dx,e.dy]:R)+(1!=e.scalex||1!=e.scaley?"s"+[e.scalex,e.scaley,0,0]:R)+(e.rotate?"r"+[e.rotate,0,0]:R)):"m"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]}}(g.prototype);for(var he=function(){this.returnValue=!1},ue=function(){return this.originalEvent.preventDefault()},ce=function(){this.cancelBubble=!0},fe=function(){return this.originalEvent.stopPropagation()},pe=function(t){var e=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,r=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft;return{x:t.clientX+r,y:t.clientY+e}},de=function(){return A.doc.addEventListener?function(t,e,r,i){var n=function(t){var e=pe(t);return r.call(i,t,e.x,e.y)};if(t.addEventListener(e,n,!1),z&&V[e]){var a=function(e){for(var n=pe(e),a=e,s=0,o=e.targetTouches&&e.targetTouches.length;o>s;s++)if(e.targetTouches[s].target==t){e=e.targetTouches[s],e.originalEvent=a,e.preventDefault=ue,e.stopPropagation=fe;break}return r.call(i,e,n.x,n.y)};t.addEventListener(V[e],a,!1)}return function(){return t.removeEventListener(e,n,!1),z&&V[e]&&t.removeEventListener(V[e],a,!1),!0}}:A.doc.attachEvent?function(t,e,r,i){var n=function(t){t=t||A.win.event;var e=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,n=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft,a=t.clientX+n,s=t.clientY+e;return t.preventDefault=t.preventDefault||he,t.stopPropagation=t.stopPropagation||ce,r.call(i,t,a,s)};t.attachEvent("on"+e,n);var a=function(){return t.detachEvent("on"+e,n),!0};return a}:void 0}(),ge=[],xe=function(e){for(var r=e.clientX,i=e.clientY,n=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,a=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft,s,o=ge.length;o--;){if(s=ge[o],z&&e.touches){for(var l=e.touches.length,h;l--;)if(h=e.touches[l],h.identifier==s.el._drag.id){r=h.clientX,i=h.clientY,(e.originalEvent?e.originalEvent:e).preventDefault();break}}else e.preventDefault();var u=s.el.node,c,f=u.nextSibling,p=u.parentNode,d=u.style.display;A.win.opera&&p.removeChild(u),u.style.display="none",c=s.el.paper.getElementByPoint(r,i),u.style.display=d,A.win.opera&&(f?p.insertBefore(u,f):p.appendChild(u)),c&&t("raphael.drag.over."+s.el.id,s.el,c),r+=a,i+=n,t("raphael.drag.move."+s.el.id,s.move_scope||s.el,r-s.el._drag.x,i-s.el._drag.y,r,i,e)}},ve=function(r){e.unmousemove(xe).unmouseup(ve);for(var i=ge.length,n;i--;)n=ge[i],n.el._drag={},t("raphael.drag.end."+n.el.id,n.end_scope||n.start_scope||n.move_scope||n.el,r);ge=[]},ye=e.el={},me=D.length;me--;)!function(t){e[t]=ye[t]=function(r,i){return e.is(r,"function")&&(this.events=this.events||[],this.events.push({name:t,f:r,unbind:de(this.shape||this.node||A.doc,t,r,i||this)})),this},e["un"+t]=ye["un"+t]=function(r){for(var i=this.events||[],n=i.length;n--;)i[n].name!=t||!e.is(r,"undefined")&&i[n].f!=r||(i[n].unbind(),i.splice(n,1),!i.length&&delete this.events);return this}}(D[me]);ye.data=function(r,i){var n=wt[this.id]=wt[this.id]||{};if(0==arguments.length)return n;if(1==arguments.length){if(e.is(r,"object")){for(var a in r)r[T](a)&&this.data(a,r[a]);return this}return t("raphael.data.get."+this.id,this,n[r],r),n[r]}return n[r]=i,t("raphael.data.set."+this.id,this,i,r),this},ye.removeData=function(t){return null==t?wt[this.id]={}:wt[this.id]&&delete wt[this.id][t],this},ye.getData=function(){return r(wt[this.id]||{})},ye.hover=function(t,e,r,i){return this.mouseover(t,r).mouseout(e,i||r)},ye.unhover=function(t,e){return this.unmouseover(t).unmouseout(e)};var be=[];ye.drag=function(r,i,n,a,s,o){function l(l){(l.originalEvent||l).preventDefault();var h=l.clientX,u=l.clientY,c=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,f=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft;if(this._drag.id=l.identifier,z&&l.touches)for(var p=l.touches.length,d;p--;)if(d=l.touches[p],this._drag.id=d.identifier,d.identifier==this._drag.id){h=d.clientX,u=d.clientY;break}this._drag.x=h+f,this._drag.y=u+c,!ge.length&&e.mousemove(xe).mouseup(ve),ge.push({el:this,move_scope:a,start_scope:s,end_scope:o}),i&&t.on("raphael.drag.start."+this.id,i),r&&t.on("raphael.drag.move."+this.id,r),n&&t.on("raphael.drag.end."+this.id,n),t("raphael.drag.start."+this.id,s||a||this,l.clientX+f,l.clientY+c,l)}return this._drag={},be.push({el:this,start:l}),this.mousedown(l),this},ye.onDragOver=function(e){e?t.on("raphael.drag.over."+this.id,e):t.unbind("raphael.drag.over."+this.id)},ye.undrag=function(){for(var r=be.length;r--;)be[r].el==this&&(this.unmousedown(be[r].start),be.splice(r,1),t.unbind("raphael.drag.*."+this.id));!be.length&&e.unmousemove(xe).unmouseup(ve),ge=[]},M.circle=function(t,r,i){var n=e._engine.circle(this,t||0,r||0,i||0);return this.__set__&&this.__set__.push(n),n},M.rect=function(t,r,i,n,a){var s=e._engine.rect(this,t||0,r||0,i||0,n||0,a||0);return this.__set__&&this.__set__.push(s),s},M.ellipse=function(t,r,i,n){var a=e._engine.ellipse(this,t||0,r||0,i||0,n||0);return this.__set__&&this.__set__.push(a),a},M.path=function(t){t&&!e.is(t,Z)&&!e.is(t[0],Q)&&(t+=R);var r=e._engine.path(e.format[F](e,arguments),this);return this.__set__&&this.__set__.push(r),r},M.image=function(t,r,i,n,a){var s=e._engine.image(this,t||"about:blank",r||0,i||0,n||0,a||0);return this.__set__&&this.__set__.push(s),s},M.text=function(t,r,i){var n=e._engine.text(this,t||0,r||0,q(i));return this.__set__&&this.__set__.push(n),n},M.set=function(t){!e.is(t,"array")&&(t=Array.prototype.splice.call(arguments,0,arguments.length));var r=new Fe(t);return this.__set__&&this.__set__.push(r),r.paper=this,r.type="set",r},M.setStart=function(t){this.__set__=t||this.set()},M.setFinish=function(t){var e=this.__set__;return delete this.__set__,e},M.getSize=function(){var t=this.canvas.parentNode;return{width:t.offsetWidth,height:t.offsetHeight}},M.setSize=function(t,r){return e._engine.setSize.call(this,t,r)},M.setViewBox=function(t,r,i,n,a){return e._engine.setViewBox.call(this,t,r,i,n,a)},M.top=M.bottom=null,M.raphael=e;var _e=function(t){var e=t.getBoundingClientRect(),r=t.ownerDocument,i=r.body,n=r.documentElement,a=n.clientTop||i.clientTop||0,s=n.clientLeft||i.clientLeft||0,o=e.top+(A.win.pageYOffset||n.scrollTop||i.scrollTop)-a,l=e.left+(A.win.pageXOffset||n.scrollLeft||i.scrollLeft)-s;return{y:o,x:l}};M.getElementByPoint=function(t,e){var r=this,i=r.canvas,n=A.doc.elementFromPoint(t,e);if(A.win.opera&&"svg"==n.tagName){var a=_e(i),s=i.createSVGRect();s.x=t-a.x,s.y=e-a.y,s.width=s.height=1;var o=i.getIntersectionList(s,null);o.length&&(n=o[o.length-1])}if(!n)return null;for(;n.parentNode&&n!=i.parentNode&&!n.raphael;)n=n.parentNode;return n==r.canvas.parentNode&&(n=i),n=n&&n.raphael?r.getById(n.raphaelid):null},M.getElementsByBBox=function(t){var r=this.set();return this.forEach(function(i){e.isBBoxIntersect(i.getBBox(),t)&&r.push(i)}),r},M.getById=function(t){for(var e=this.bottom;e;){if(e.id==t)return e;e=e.next}return null},M.forEach=function(t,e){for(var r=this.bottom;r;){if(t.call(e,r)===!1)return this;r=r.next}return this},M.getElementsByPoint=function(t,e){var r=this.set();return this.forEach(function(i){i.isPointInside(t,e)&&r.push(i)}),r},ye.isPointInside=function(t,r){var i=this.realPath=Nt[this.type](this);return this.attr("transform")&&this.attr("transform").length&&(i=e.transformPath(i,this.attr("transform"))),e.isPointInsidePath(i,t,r)},ye.getBBox=function(t){if(this.removed)return{};var e=this._;return t?(!e.dirty&&e.bboxwt||(this.realPath=Nt[this.type](this),e.bboxwt=Ot(this.realPath),e.bboxwt.toString=v,e.dirty=0),e.bboxwt):((e.dirty||e.dirtyT||!e.bbox)&&(!e.dirty&&this.realPath||(e.bboxwt=0,this.realPath=Nt[this.type](this)),e.bbox=Ot(Et(this.realPath,this.matrix)),e.bbox.toString=v,e.dirty=e.dirtyT=0),e.bbox)},ye.clone=function(){if(this.removed)return null;var t=this.paper[this.type]().attr(this.attr());return this.__set__&&this.__set__.push(t),t},ye.glow=function(t){if("text"==this.type)return null;t=t||{};var e={width:(t.width||10)+(+this.attr("stroke-width")||1),fill:t.fill||!1,opacity:null==t.opacity?.5:t.opacity,offsetx:t.offsetx||0,offsety:t.offsety||0,color:t.color||"#000"},r=e.width/2,i=this.paper,n=i.set(),a=this.realPath||Nt[this.type](this);a=this.matrix?Et(a,this.matrix):a;for(var s=1;r+1>s;s++)n.push(i.path(a).attr({stroke:e.color,fill:e.fill?e.color:"none","stroke-linejoin":"round","stroke-linecap":"round","stroke-width":+(e.width/r*s).toFixed(3),opacity:+(e.opacity/r).toFixed(3)}));return n.insertBefore(this).translate(e.offsetx,e.offsety)};var we={},ke=function(t,r,i,n,a,s,o,u,c){return null==c?l(t,r,i,n,a,s,o,u):e.findDotsAtSegment(t,r,i,n,a,s,o,u,h(t,r,i,n,a,s,o,u,c))},Be=function(t,r){return function(i,n,a){i=Qt(i);for(var s,o,l,h,u="",c={},f,p=0,d=0,g=i.length;g>d;d++){if(l=i[d],"M"==l[0])s=+l[1],o=+l[2];else{if(h=ke(s,o,l[1],l[2],l[3],l[4],l[5],l[6]),p+h>n){if(r&&!c.start){if(f=ke(s,o,l[1],l[2],l[3],l[4],l[5],l[6],n-p),u+=["C"+f.start.x,f.start.y,f.m.x,f.m.y,f.x,f.y],a)return u;c.start=u,u=["M"+f.x,f.y+"C"+f.n.x,f.n.y,f.end.x,f.end.y,l[5],l[6]].join(),p+=h,s=+l[5],o=+l[6];continue}if(!t&&!r)return f=ke(s,o,l[1],l[2],l[3],l[4],l[5],l[6],n-p),{x:f.x,y:f.y,alpha:f.alpha}}p+=h,s=+l[5],o=+l[6]}u+=l.shift()+l}return c.end=u,f=t?p:r?c:e.findDotsAtSegment(s,o,l[0],l[1],l[2],l[3],l[4],l[5],1),f.alpha&&(f={x:f.x,y:f.y,alpha:f.alpha}),f}},Ce=Be(1),Se=Be(),Te=Be(0,1);e.getTotalLength=Ce,e.getPointAtLength=Se,e.getSubpath=function(t,e,r){if(this.getTotalLength(t)-r<1e-6)return Te(t,e).end;var i=Te(t,r,1);return e?Te(i,e).end:i},ye.getTotalLength=function(){var t=this.getPath();if(t)return this.node.getTotalLength?this.node.getTotalLength():Ce(t)},ye.getPointAtLength=function(t){var e=this.getPath();if(e)return Se(e,t)},ye.getPath=function(){var t,r=e._getPath[this.type];if("text"!=this.type&&"set"!=this.type)return r&&(t=r(this)),t},ye.getSubpath=function(t,r){var i=this.getPath();if(i)return e.getSubpath(i,t,r)};var Ae=e.easing_formulas={linear:function(t){return t},"<":function(t){return X(t,1.7)},">":function(t){return X(t,.48)},"<>":function(t){var e=.48-t/1.04,r=W.sqrt(.1734+e*e),i=r-e,n=X(H(i),1/3)*(0>i?-1:1),a=-r-e,s=X(H(a),1/3)*(0>a?-1:1),o=n+s+.5;return 3*(1-o)*o*o+o*o*o},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){t-=1;var e=1.70158;return t*t*((e+1)*t+e)+1},elastic:function(t){return t==!!t?t:X(2,-10*t)*W.sin((t-.075)*(2*U)/.3)+1},bounce:function(t){var e=7.5625,r=2.75,i;return 1/r>t?i=e*t*t:2/r>t?(t-=1.5/r,i=e*t*t+.75):2.5/r>t?(t-=2.25/r,i=e*t*t+.9375):(t-=2.625/r,i=e*t*t+.984375),i}};Ae.easeIn=Ae["ease-in"]=Ae["<"],Ae.easeOut=Ae["ease-out"]=Ae[">"],Ae.easeInOut=Ae["ease-in-out"]=Ae["<>"],Ae["back-in"]=Ae.backIn,Ae["back-out"]=Ae.backOut;var Ne=[],Ee=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){setTimeout(t,16)},Me=function(){for(var r=+new Date,i=0;i<Ne.length;i++){var n=Ne[i];if(!n.el.removed&&!n.paused){var a=r-n.start,s=n.ms,o=n.easing,l=n.from,h=n.diff,u=n.to,c=n.t,f=n.el,p={},d,g={},x;if(n.initstatus?(a=(n.initstatus*n.anim.top-n.prev)/(n.percent-n.prev)*s,n.status=n.initstatus,delete n.initstatus,n.stop&&Ne.splice(i--,1)):n.status=(n.prev+(n.percent-n.prev)*(a/s))/n.anim.top,!(0>a))if(s>a){var v=o(a/s);for(var y in l)if(l[T](y)){switch(pt[y]){case $:d=+l[y]+v*s*h[y];break;case"colour":d="rgb("+[Le(ot(l[y].r+v*s*h[y].r)),Le(ot(l[y].g+v*s*h[y].g)),Le(ot(l[y].b+v*s*h[y].b))].join(",")+")";break;case"path":d=[];for(var m=0,_=l[y].length;_>m;m++){d[m]=[l[y][m][0]];for(var w=1,k=l[y][m].length;k>w;w++)d[m][w]=+l[y][m][w]+v*s*h[y][m][w];d[m]=d[m].join(j)}d=d.join(j);break;case"transform":if(h[y].real)for(d=[],m=0,_=l[y].length;_>m;m++)for(d[m]=[l[y][m][0]],w=1,k=l[y][m].length;k>w;w++)d[m][w]=l[y][m][w]+v*s*h[y][m][w];else{var B=function(t){return+l[y][t]+v*s*h[y][t]};d=[["m",B(0),B(1),B(2),B(3),B(4),B(5)]]}break;case"csv":if("clip-rect"==y)for(d=[],m=4;m--;)d[m]=+l[y][m]+v*s*h[y][m];break;default:var C=[][P](l[y]);for(d=[],m=f.paper.customAttributes[y].length;m--;)d[m]=+C[m]+v*s*h[y][m]}p[y]=d}f.attr(p),function(e,r,i){setTimeout(function(){t("raphael.anim.frame."+e,r,i)})}(f.id,f,n.anim)}else{if(function(r,i,n){setTimeout(function(){t("raphael.anim.frame."+i.id,i,n),t("raphael.anim.finish."+i.id,i,n),e.is(r,"function")&&r.call(i)})}(n.callback,f,n.anim),f.attr(u),Ne.splice(i--,1),n.repeat>1&&!n.next){for(x in u)u[T](x)&&(g[x]=n.totalOrigin[x]);n.el.attr(g),b(n.anim,n.el,n.anim.percents[0],null,n.totalOrigin,n.repeat-1)}n.next&&!n.stop&&b(n.anim,n.el,n.next,null,n.totalOrigin,n.repeat)}}}Ne.length&&Ee(Me)},Le=function(t){return t>255?255:0>t?0:t};ye.animateWith=function(t,r,i,n,a,s){var o=this;if(o.removed)return s&&s.call(o),o;var l=i instanceof m?i:e.animation(i,n,a,s),h,u;b(l,o,l.percents[0],null,o.attr());for(var c=0,f=Ne.length;f>c;c++)if(Ne[c].anim==r&&Ne[c].el==t){Ne[f-1].start=Ne[c].start;break}return o},ye.onAnimation=function(e){return e?t.on("raphael.anim.frame."+this.id,e):t.unbind("raphael.anim.frame."+this.id),this},m.prototype.delay=function(t){var e=new m(this.anim,this.ms);return e.times=this.times,e.del=+t||0,e},m.prototype.repeat=function(t){var e=new m(this.anim,this.ms);return e.del=this.del,e.times=W.floor(Y(t,0))||1,e},e.animation=function(t,r,i,n){if(t instanceof m)return t;!e.is(i,"function")&&i||(n=n||i||null,i=null),t=Object(t),r=+r||0;var a={},s,o;for(o in t)t[T](o)&&ht(o)!=o&&ht(o)+"%"!=o&&(s=!0,a[o]=t[o]);if(s)return i&&(a.easing=i),n&&(a.callback=n),new m({100:a},r);if(n){var l=0;for(var h in t){var u=ut(h);t[T](h)&&u>l&&(l=u)}l+="%",!t[l].callback&&(t[l].callback=n)}return new m(t,r)},ye.animate=function(t,r,i,n){var a=this;if(a.removed)return n&&n.call(a),a;var s=t instanceof m?t:e.animation(t,r,i,n);return b(s,a,s.percents[0],null,a.attr()),a},ye.setTime=function(t,e){return t&&null!=e&&this.status(t,G(e,t.ms)/t.ms),this},ye.status=function(t,e){var r=[],i=0,n,a;if(null!=e)return b(t,this,-1,G(e,1)),this;for(n=Ne.length;n>i;i++)if(a=Ne[i],a.el.id==this.id&&(!t||a.anim==t)){if(t)return a.status;r.push({anim:a.anim,status:a.status})}return t?0:r},ye.pause=function(e){for(var r=0;r<Ne.length;r++)Ne[r].el.id!=this.id||e&&Ne[r].anim!=e||t("raphael.anim.pause."+this.id,this,Ne[r].anim)!==!1&&(Ne[r].paused=!0);return this},ye.resume=function(e){for(var r=0;r<Ne.length;r++)if(Ne[r].el.id==this.id&&(!e||Ne[r].anim==e)){var i=Ne[r];t("raphael.anim.resume."+this.id,this,i.anim)!==!1&&(delete i.paused,this.status(i.anim,i.status))}return this},ye.stop=function(e){for(var r=0;r<Ne.length;r++)Ne[r].el.id!=this.id||e&&Ne[r].anim!=e||t("raphael.anim.stop."+this.id,this,Ne[r].anim)!==!1&&Ne.splice(r--,1);return this},t.on("raphael.remove",_),t.on("raphael.clear",_),ye.toString=function(){return"Raphaël’s object"};var Fe=function(t){if(this.items=[],this.length=0,this.type="set",t)for(var e=0,r=t.length;r>e;e++)!t[e]||t[e].constructor!=ye.constructor&&t[e].constructor!=Fe||(this[this.items.length]=this.items[this.items.length]=t[e],this.length++)},Pe=Fe.prototype;Pe.push=function(){for(var t,e,r=0,i=arguments.length;i>r;r++)t=arguments[r],!t||t.constructor!=ye.constructor&&t.constructor!=Fe||(e=this.items.length,this[e]=this.items[e]=t,this.length++);return this},Pe.pop=function(){return this.length&&delete this[this.length--],this.items.pop()},Pe.forEach=function(t,e){for(var r=0,i=this.items.length;i>r;r++)if(t.call(e,this.items[r],r)===!1)return this;return this};for(var ze in ye)ye[T](ze)&&(Pe[ze]=function(t){return function(){var e=arguments;return this.forEach(function(r){r[t][F](r,e)})}}(ze));return Pe.attr=function(t,r){if(t&&e.is(t,Q)&&e.is(t[0],"object"))for(var i=0,n=t.length;n>i;i++)this.items[i].attr(t[i]);else for(var a=0,s=this.items.length;s>a;a++)this.items[a].attr(t,r);return this},Pe.clear=function(){for(;this.length;)this.pop()},Pe.splice=function(t,e,r){t=0>t?Y(this.length+t,0):t,e=Y(0,G(this.length-t,e));var i=[],n=[],a=[],s;for(s=2;s<arguments.length;s++)a.push(arguments[s]);for(s=0;e>s;s++)n.push(this[t+s]);for(;s<this.length-t;s++)i.push(this[t+s]);var o=a.length;for(s=0;s<o+i.length;s++)this.items[t+s]=this[t+s]=o>s?a[s]:i[s-o];for(s=this.items.length=this.length-=e-o;this[s];)delete this[s++];return new Fe(n)},Pe.exclude=function(t){for(var e=0,r=this.length;r>e;e++)if(this[e]==t)return this.splice(e,1),!0},Pe.animate=function(t,r,i,n){(e.is(i,"function")||!i)&&(n=i||null);var a=this.items.length,s=a,o,l=this,h;if(!a)return this;n&&(h=function(){!--a&&n.call(l)}),i=e.is(i,Z)?i:h;var u=e.animation(t,r,i,h);for(o=this.items[--s].animate(u);s--;)this.items[s]&&!this.items[s].removed&&this.items[s].animateWith(o,u,u),this.items[s]&&!this.items[s].removed||a--;return this},Pe.insertAfter=function(t){for(var e=this.items.length;e--;)this.items[e].insertAfter(t);return this},Pe.getBBox=function(){for(var t=[],e=[],r=[],i=[],n=this.items.length;n--;)if(!this.items[n].removed){var a=this.items[n].getBBox();t.push(a.x),e.push(a.y),r.push(a.x+a.width),i.push(a.y+a.height)}return t=G[F](0,t),e=G[F](0,e),r=Y[F](0,r),i=Y[F](0,i),{x:t,y:e,x2:r,y2:i,width:r-t,height:i-e}},Pe.clone=function(t){t=this.paper.set();for(var e=0,r=this.items.length;r>e;e++)t.push(this.items[e].clone());return t},Pe.toString=function(){return"Raphaël‘s set"},Pe.glow=function(t){var e=this.paper.set();return this.forEach(function(r,i){var n=r.glow(t);null!=n&&n.forEach(function(t,r){e.push(t)})}),e},Pe.isPointInside=function(t,e){var r=!1;return this.forEach(function(i){return i.isPointInside(t,e)?(r=!0,!1):void 0}),r},e.registerFont=function(t){if(!t.face)return t;this.fonts=this.fonts||{};var e={w:t.w,face:{},glyphs:{}},r=t.face["font-family"];for(var i in t.face)t.face[T](i)&&(e.face[i]=t.face[i]);if(this.fonts[r]?this.fonts[r].push(e):this.fonts[r]=[e],!t.svg){e.face["units-per-em"]=ut(t.face["units-per-em"],10);for(var n in t.glyphs)if(t.glyphs[T](n)){var a=t.glyphs[n];if(e.glyphs[n]={w:a.w,k:{},d:a.d&&"M"+a.d.replace(/[mlcxtrv]/g,function(t){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"}[t]||"M"})+"z"},a.k)for(var s in a.k)a[T](s)&&(e.glyphs[n].k[s]=a.k[s])}}return t},M.getFont=function(t,r,i,n){if(n=n||"normal",i=i||"normal",r=+r||{normal:400,bold:700,lighter:300,bolder:800}[r]||400,e.fonts){var a=e.fonts[t];if(!a){var s=new RegExp("(^|\\s)"+t.replace(/[^\w\d\s+!~.:_-]/g,R)+"(\\s|$)","i");for(var o in e.fonts)if(e.fonts[T](o)&&s.test(o)){a=e.fonts[o];break}}var l;if(a)for(var h=0,u=a.length;u>h&&(l=a[h],l.face["font-weight"]!=r||l.face["font-style"]!=i&&l.face["font-style"]||l.face["font-stretch"]!=n);h++);return l}},M.print=function(t,r,i,n,a,s,o,l){s=s||"middle",o=Y(G(o||0,1),-1),l=Y(G(l||1,3),1);var h=q(i)[I](R),u=0,c=0,f=R,p;if(e.is(n,"string")&&(n=this.getFont(n)),n){p=(a||16)/n.face["units-per-em"];for(var d=n.face.bbox[I](k),g=+d[0],x=d[3]-d[1],v=0,y=+d[1]+("baseline"==s?x+ +n.face.descent:x/2),m=0,b=h.length;b>m;m++){if("\n"==h[m])u=0,w=0,c=0,v+=x*l;else{var _=c&&n.glyphs[h[m-1]]||{},w=n.glyphs[h[m]];u+=c?(_.w||n.w)+(_.k&&_.k[h[m]]||0)+n.w*o:0,c=1}w&&w.d&&(f+=e.transformPath(w.d,["t",u*p,v*p,"s",p,p,g,y,"t",(t-g)/p,(r-y)/p]))}}return this.path(f).attr({fill:"#000",stroke:"none"})},M.add=function(t){if(e.is(t,"array"))for(var r=this.set(),i=0,n=t.length,a;n>i;i++)a=t[i]||{},B[T](a.type)&&r.push(this[a.type]().attr(a));return r},e.format=function(t,r){var i=e.is(r,Q)?[0][P](r):arguments;return t&&e.is(t,Z)&&i.length-1&&(t=t.replace(C,function(t,e){return null==i[++e]?R:i[e]})),t||R},e.fullfill=function(){var t=/\{([^\}]+)\}/g,e=/(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g,r=function(t,r,i){var n=i;return r.replace(e,function(t,e,r,i,a){e=e||i,n&&(e in n&&(n=n[e]),"function"==typeof n&&a&&(n=n()))}),n=(null==n||n==i?t:n)+""};return function(e,i){return String(e).replace(t,function(t,e){return r(t,e,i)})}}(),e.ninja=function(){if(N.was)A.win.Raphael=N.is;else{window.Raphael=void 0;try{delete window.Raphael}catch(t){}}return e},e.st=Pe,t.on("raphael.DOMload",function(){w=!0}),function(t,r,i){function n(){/in/.test(t.readyState)?setTimeout(n,9):e.eve("raphael.DOMload")}null==t.readyState&&t.addEventListener&&(t.addEventListener(r,i=function(){t.removeEventListener(r,i,!1),t.readyState="complete"},!1),t.readyState="loading"),n()}(document,"DOMContentLoaded"),e}.apply(e,i),!(void 0!==n&&(t.exports=n))},function(e,r){e.exports=t},function(t,e,r){var i,n;i=[r(1)],n=function(t){if(!t||t.svg){var e="hasOwnProperty",r=String,i=parseFloat,n=parseInt,a=Math,s=a.max,o=a.abs,l=a.pow,h=/[, ]+/,u=t.eve,c="",f=" ",p="http://www.w3.org/1999/xlink",d={block:"M5,0 0,2.5 5,5z",classic:"M5,0 0,2.5 5,5 3.5,3 3.5,2z",diamond:"M2.5,0 5,2.5 2.5,5 0,2.5z",open:"M6,1 1,3.5 6,6",oval:"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"},g={};t.toString=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var x=function(i,n){if(n){"string"==typeof i&&(i=x(i));for(var a in n)n[e](a)&&("xlink:"==a.substring(0,6)?i.setAttributeNS(p,a.substring(6),r(n[a])):i.setAttribute(a,r(n[a])))}else i=t._g.doc.createElementNS("http://www.w3.org/2000/svg",i),i.style&&(i.style.webkitTapHighlightColor="rgba(0,0,0,0)");return i},v=function(e,n){var h="linear",u=e.id+n,f=.5,p=.5,d=e.node,g=e.paper,v=d.style,y=t._g.doc.getElementById(u);if(!y){if(n=r(n).replace(t._radial_gradient,function(t,e,r){if(h="radial",e&&r){f=i(e),p=i(r);var n=2*(p>.5)-1;l(f-.5,2)+l(p-.5,2)>.25&&(p=a.sqrt(.25-l(f-.5,2))*n+.5)&&.5!=p&&(p=p.toFixed(5)-1e-5*n)}return c}),n=n.split(/\s*\-\s*/),"linear"==h){var b=n.shift();if(b=-i(b),isNaN(b))return null;var _=[0,0,a.cos(t.rad(b)),a.sin(t.rad(b))],w=1/(s(o(_[2]),o(_[3]))||1);_[2]*=w,_[3]*=w,_[2]<0&&(_[0]=-_[2],_[2]=0),_[3]<0&&(_[1]=-_[3],_[3]=0)}var k=t._parseDots(n);if(!k)return null;if(u=u.replace(/[\(\)\s,\xb0#]/g,"_"),e.gradient&&u!=e.gradient.id&&(g.defs.removeChild(e.gradient),delete e.gradient),!e.gradient){y=x(h+"Gradient",{id:u}),e.gradient=y,x(y,"radial"==h?{fx:f,fy:p}:{x1:_[0],y1:_[1],x2:_[2],y2:_[3],gradientTransform:e.matrix.invert()}),g.defs.appendChild(y);for(var B=0,C=k.length;C>B;B++)y.appendChild(x("stop",{offset:k[B].offset?k[B].offset:B?"100%":"0%","stop-color":k[B].color||"#fff","stop-opacity":isFinite(k[B].opacity)?k[B].opacity:1}))}}return x(d,{fill:m(u),opacity:1,"fill-opacity":1}),v.fill=c,v.opacity=1,v.fillOpacity=1,1},y=function(){var t=document.documentMode;return t&&(9===t||10===t)},m=function(t){if(y())return"url('#"+t+"')";var e=document.location,r=e.protocol+"//"+e.host+e.pathname+e.search;return"url('"+r+"#"+t+"')"},b=function(t){var e=t.getBBox(1);x(t.pattern,{patternTransform:t.matrix.invert()+" translate("+e.x+","+e.y+")"})},_=function(i,n,a){if("path"==i.type){for(var s=r(n).toLowerCase().split("-"),o=i.paper,l=a?"end":"start",h=i.node,u=i.attrs,f=u["stroke-width"],p=s.length,v="classic",y,m,b,_,w,k=3,B=3,C=5;p--;)switch(s[p]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":v=s[p];break;case"wide":B=5;break;case"narrow":B=2;break;case"long":k=5;break;case"short":k=2}if("open"==v?(k+=2,B+=2,C+=2,b=1,_=a?4:1,w={fill:"none",stroke:u.stroke}):(_=b=k/2,w={fill:u.stroke,stroke:"none"}),i._.arrows?a?(i._.arrows.endPath&&g[i._.arrows.endPath]--,i._.arrows.endMarker&&g[i._.arrows.endMarker]--):(i._.arrows.startPath&&g[i._.arrows.startPath]--,i._.arrows.startMarker&&g[i._.arrows.startMarker]--):i._.arrows={},"none"!=v){var S="raphael-marker-"+v,T="raphael-marker-"+l+v+k+B+"-obj"+i.id;t._g.doc.getElementById(S)?g[S]++:(o.defs.appendChild(x(x("path"),{"stroke-linecap":"round",d:d[v],id:S})),g[S]=1);var A=t._g.doc.getElementById(T),N;A?(g[T]++,N=A.getElementsByTagName("use")[0]):(A=x(x("marker"),{id:T,markerHeight:B,markerWidth:k,orient:"auto",refX:_,refY:B/2}),N=x(x("use"),{"xlink:href":"#"+S,transform:(a?"rotate(180 "+k/2+" "+B/2+") ":c)+"scale("+k/C+","+B/C+")","stroke-width":(1/((k/C+B/C)/2)).toFixed(4)}),A.appendChild(N),o.defs.appendChild(A),g[T]=1),x(N,w);var E=b*("diamond"!=v&&"oval"!=v);a?(y=i._.arrows.startdx*f||0,m=t.getTotalLength(u.path)-E*f):(y=E*f,m=t.getTotalLength(u.path)-(i._.arrows.enddx*f||0)),w={},w["marker-"+l]="url(#"+T+")",(m||y)&&(w.d=t.getSubpath(u.path,y,m)),x(h,w),i._.arrows[l+"Path"]=S,i._.arrows[l+"Marker"]=T,i._.arrows[l+"dx"]=E,i._.arrows[l+"Type"]=v,i._.arrows[l+"String"]=n}else a?(y=i._.arrows.startdx*f||0,m=t.getTotalLength(u.path)-y):(y=0,m=t.getTotalLength(u.path)-(i._.arrows.enddx*f||0)),i._.arrows[l+"Path"]&&x(h,{d:t.getSubpath(u.path,y,m)}),delete i._.arrows[l+"Path"],delete i._.arrows[l+"Marker"],delete i._.arrows[l+"dx"],delete i._.arrows[l+"Type"],delete i._.arrows[l+"String"];for(w in g)if(g[e](w)&&!g[w]){var M=t._g.doc.getElementById(w);M&&M.parentNode.removeChild(M)}}},w={"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},k=function(t,e,i){if(e=w[r(e).toLowerCase()]){for(var n=t.attrs["stroke-width"]||"1",a={round:n,square:n,butt:0}[t.attrs["stroke-linecap"]||i["stroke-linecap"]]||0,s=[],o=e.length;o--;)s[o]=e[o]*n+(o%2?1:-1)*a;x(t.node,{"stroke-dasharray":s.join(",")})}else x(t.node,{"stroke-dasharray":"none"})},B=function(i,a){var l=i.node,u=i.attrs,f=l.style.visibility;l.style.visibility="hidden";for(var d in a)if(a[e](d)){if(!t._availableAttrs[e](d))continue;var g=a[d];switch(u[d]=g,d){case"blur":i.blur(g);break;case"title":var y=l.getElementsByTagName("title");if(y.length&&(y=y[0]))y.firstChild.nodeValue=g;else{y=x("title");var m=t._g.doc.createTextNode(g);y.appendChild(m),l.appendChild(y)}break;case"href":case"target":var w=l.parentNode;if("a"!=w.tagName.toLowerCase()){var B=x("a");w.insertBefore(B,l),B.appendChild(l),w=B}"target"==d?w.setAttributeNS(p,"show","blank"==g?"new":g):w.setAttributeNS(p,d,g);break;case"cursor":l.style.cursor=g;break;case"transform":i.transform(g);break;case"arrow-start":_(i,g);break;case"arrow-end":_(i,g,1);break;case"clip-rect":var C=r(g).split(h);if(4==C.length){i.clip&&i.clip.parentNode.parentNode.removeChild(i.clip.parentNode);var T=x("clipPath"),A=x("rect");T.id=t.createUUID(),x(A,{x:C[0],y:C[1],width:C[2],height:C[3]}),T.appendChild(A),i.paper.defs.appendChild(T),x(l,{"clip-path":"url(#"+T.id+")"}),i.clip=A}if(!g){var N=l.getAttribute("clip-path");if(N){var E=t._g.doc.getElementById(N.replace(/(^url\(#|\)$)/g,c));E&&E.parentNode.removeChild(E),x(l,{"clip-path":c}),delete i.clip}}break;case"path":"path"==i.type&&(x(l,{d:g?u.path=t._pathToAbsolute(g):"M0,0"}),i._.dirty=1,i._.arrows&&("startString"in i._.arrows&&_(i,i._.arrows.startString),"endString"in i._.arrows&&_(i,i._.arrows.endString,1)));break;case"width":if(l.setAttribute(d,g),i._.dirty=1,!u.fx)break;d="x",g=u.x;case"x":u.fx&&(g=-u.x-(u.width||0));case"rx":if("rx"==d&&"rect"==i.type)break;case"cx":l.setAttribute(d,g),i.pattern&&b(i),i._.dirty=1;break;case"height":if(l.setAttribute(d,g),i._.dirty=1,!u.fy)break;d="y",g=u.y;case"y":u.fy&&(g=-u.y-(u.height||0));case"ry":if("ry"==d&&"rect"==i.type)break;case"cy":l.setAttribute(d,g),i.pattern&&b(i),i._.dirty=1;break;case"r":"rect"==i.type?x(l,{rx:g,ry:g}):l.setAttribute(d,g),i._.dirty=1;break;case"src":"image"==i.type&&l.setAttributeNS(p,"href",g);break;case"stroke-width":1==i._.sx&&1==i._.sy||(g/=s(o(i._.sx),o(i._.sy))||1),l.setAttribute(d,g),u["stroke-dasharray"]&&k(i,u["stroke-dasharray"],a),i._.arrows&&("startString"in i._.arrows&&_(i,i._.arrows.startString),"endString"in i._.arrows&&_(i,i._.arrows.endString,1));break;case"stroke-dasharray":k(i,g,a);break;case"fill":var M=r(g).match(t._ISURL);if(M){T=x("pattern");var L=x("image");T.id=t.createUUID(),x(T,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1}),x(L,{x:0,y:0,"xlink:href":M[1]}),T.appendChild(L),function(e){t._preload(M[1],function(){var t=this.offsetWidth,r=this.offsetHeight;x(e,{width:t,height:r}),x(L,{width:t,height:r})})}(T),i.paper.defs.appendChild(T),x(l,{fill:"url(#"+T.id+")"}),i.pattern=T,i.pattern&&b(i);break}var F=t.getRGB(g);if(F.error){if(("circle"==i.type||"ellipse"==i.type||"r"!=r(g).charAt())&&v(i,g)){if("opacity"in u||"fill-opacity"in u){var P=t._g.doc.getElementById(l.getAttribute("fill").replace(/^url\(#|\)$/g,c));if(P){var z=P.getElementsByTagName("stop");x(z[z.length-1],{"stop-opacity":("opacity"in u?u.opacity:1)*("fill-opacity"in u?u["fill-opacity"]:1)})}}u.gradient=g,u.fill="none";break}}else delete a.gradient,delete u.gradient,!t.is(u.opacity,"undefined")&&t.is(a.opacity,"undefined")&&x(l,{opacity:u.opacity}),!t.is(u["fill-opacity"],"undefined")&&t.is(a["fill-opacity"],"undefined")&&x(l,{"fill-opacity":u["fill-opacity"]});F[e]("opacity")&&x(l,{"fill-opacity":F.opacity>1?F.opacity/100:F.opacity});case"stroke":F=t.getRGB(g),l.setAttribute(d,F.hex),"stroke"==d&&F[e]("opacity")&&x(l,{"stroke-opacity":F.opacity>1?F.opacity/100:F.opacity}),"stroke"==d&&i._.arrows&&("startString"in i._.arrows&&_(i,i._.arrows.startString),"endString"in i._.arrows&&_(i,i._.arrows.endString,1));break;case"gradient":("circle"==i.type||"ellipse"==i.type||"r"!=r(g).charAt())&&v(i,g);break;case"opacity":u.gradient&&!u[e]("stroke-opacity")&&x(l,{"stroke-opacity":g>1?g/100:g});case"fill-opacity":if(u.gradient){P=t._g.doc.getElementById(l.getAttribute("fill").replace(/^url\(#|\)$/g,c)),P&&(z=P.getElementsByTagName("stop"),x(z[z.length-1],{"stop-opacity":g}));break}default:"font-size"==d&&(g=n(g,10)+"px");var R=d.replace(/(\-.)/g,function(t){return t.substring(1).toUpperCase()});l.style[R]=g,i._.dirty=1,l.setAttribute(d,g)}}S(i,a),l.style.visibility=f},C=1.2,S=function(i,a){if("text"==i.type&&(a[e]("text")||a[e]("font")||a[e]("font-size")||a[e]("x")||a[e]("y"))){var s=i.attrs,o=i.node,l=o.firstChild?n(t._g.doc.defaultView.getComputedStyle(o.firstChild,c).getPropertyValue("font-size"),10):10;if(a[e]("text")){for(s.text=a.text;o.firstChild;)o.removeChild(o.firstChild);for(var h=r(a.text).split("\n"),u=[],f,p=0,d=h.length;d>p;p++)f=x("tspan"),p&&x(f,{dy:l*C,x:s.x}),f.appendChild(t._g.doc.createTextNode(h[p])),o.appendChild(f),u[p]=f}else for(u=o.getElementsByTagName("tspan"),p=0,d=u.length;d>p;p++)p?x(u[p],{dy:l*C,x:s.x}):x(u[0],{dy:0});x(o,{x:s.x,y:s.y}),i._.dirty=1;var g=i._getBBox(),v=s.y-(g.y+g.height/2);v&&t.is(v,"finite")&&x(u[0],{dy:v})}},T=function(t){return t.parentNode&&"a"===t.parentNode.tagName.toLowerCase()?t.parentNode:t},A=function(e,r){var i=0,n=0;this[0]=this.node=e,e.raphael=!0,this.id=t._oid++,e.raphaelid=this.id,this.matrix=t.matrix(),this.realPath=null, +this.paper=r,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!r.bottom&&(r.bottom=this),this.prev=r.top,r.top&&(r.top.next=this),r.top=this,this.next=null},N=t.el;A.prototype=N,N.constructor=A,t._engine.path=function(t,e){var r=x("path");e.canvas&&e.canvas.appendChild(r);var i=new A(r,e);return i.type="path",B(i,{fill:"none",stroke:"#000",path:t}),i},N.rotate=function(t,e,n){if(this.removed)return this;if(t=r(t).split(h),t.length-1&&(e=i(t[1]),n=i(t[2])),t=i(t[0]),null==n&&(e=n),null==e||null==n){var a=this.getBBox(1);e=a.x+a.width/2,n=a.y+a.height/2}return this.transform(this._.transform.concat([["r",t,e,n]])),this},N.scale=function(t,e,n,a){if(this.removed)return this;if(t=r(t).split(h),t.length-1&&(e=i(t[1]),n=i(t[2]),a=i(t[3])),t=i(t[0]),null==e&&(e=t),null==a&&(n=a),null==n||null==a)var s=this.getBBox(1);return n=null==n?s.x+s.width/2:n,a=null==a?s.y+s.height/2:a,this.transform(this._.transform.concat([["s",t,e,n,a]])),this},N.translate=function(t,e){return this.removed?this:(t=r(t).split(h),t.length-1&&(e=i(t[1])),t=i(t[0])||0,e=+e||0,this.transform(this._.transform.concat([["t",t,e]])),this)},N.transform=function(r){var i=this._;if(null==r)return i.transform;if(t._extractTransform(this,r),this.clip&&x(this.clip,{transform:this.matrix.invert()}),this.pattern&&b(this),this.node&&x(this.node,{transform:this.matrix}),1!=i.sx||1!=i.sy){var n=this.attrs[e]("stroke-width")?this.attrs["stroke-width"]:1;this.attr({"stroke-width":n})}return i.transform=this.matrix.toTransformString(),this},N.hide=function(){return this.removed||(this.node.style.display="none"),this},N.show=function(){return this.removed||(this.node.style.display=""),this},N.remove=function(){var e=T(this.node);if(!this.removed&&e.parentNode){var r=this.paper;r.__set__&&r.__set__.exclude(this),u.unbind("raphael.*.*."+this.id),this.gradient&&r.defs.removeChild(this.gradient),t._tear(this,r),e.parentNode.removeChild(e),this.removeData();for(var i in this)this[i]="function"==typeof this[i]?t._removedFactory(i):null;this.removed=!0}},N._getBBox=function(){if("none"==this.node.style.display){this.show();var t=!0}var e=!1,r;this.paper.canvas.parentElement?r=this.paper.canvas.parentElement.style:this.paper.canvas.parentNode&&(r=this.paper.canvas.parentNode.style),r&&"none"==r.display&&(e=!0,r.display="");var i={};try{i=this.node.getBBox()}catch(n){i={x:this.node.clientLeft,y:this.node.clientTop,width:this.node.clientWidth,height:this.node.clientHeight}}finally{i=i||{},e&&(r.display="none")}return t&&this.hide(),i},N.attr=function(r,i){if(this.removed)return this;if(null==r){var n={};for(var a in this.attrs)this.attrs[e](a)&&(n[a]=this.attrs[a]);return n.gradient&&"none"==n.fill&&(n.fill=n.gradient)&&delete n.gradient,n.transform=this._.transform,n}if(null==i&&t.is(r,"string")){if("fill"==r&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;if("transform"==r)return this._.transform;for(var s=r.split(h),o={},l=0,c=s.length;c>l;l++)r=s[l],r in this.attrs?o[r]=this.attrs[r]:t.is(this.paper.customAttributes[r],"function")?o[r]=this.paper.customAttributes[r].def:o[r]=t._availableAttrs[r];return c-1?o:o[s[0]]}if(null==i&&t.is(r,"array")){for(o={},l=0,c=r.length;c>l;l++)o[r[l]]=this.attr(r[l]);return o}if(null!=i){var f={};f[r]=i}else null!=r&&t.is(r,"object")&&(f=r);for(var p in f)u("raphael.attr."+p+"."+this.id,this,f[p]);for(p in this.paper.customAttributes)if(this.paper.customAttributes[e](p)&&f[e](p)&&t.is(this.paper.customAttributes[p],"function")){var d=this.paper.customAttributes[p].apply(this,[].concat(f[p]));this.attrs[p]=f[p];for(var g in d)d[e](g)&&(f[g]=d[g])}return B(this,f),this},N.toFront=function(){if(this.removed)return this;var e=T(this.node);e.parentNode.appendChild(e);var r=this.paper;return r.top!=this&&t._tofront(this,r),this},N.toBack=function(){if(this.removed)return this;var e=T(this.node),r=e.parentNode;r.insertBefore(e,r.firstChild),t._toback(this,this.paper);var i=this.paper;return this},N.insertAfter=function(e){if(this.removed||!e)return this;var r=T(this.node),i=T(e.node||e[e.length-1].node);return i.nextSibling?i.parentNode.insertBefore(r,i.nextSibling):i.parentNode.appendChild(r),t._insertafter(this,e,this.paper),this},N.insertBefore=function(e){if(this.removed||!e)return this;var r=T(this.node),i=T(e.node||e[0].node);return i.parentNode.insertBefore(r,i),t._insertbefore(this,e,this.paper),this},N.blur=function(e){var r=this;if(0!==+e){var i=x("filter"),n=x("feGaussianBlur");r.attrs.blur=e,i.id=t.createUUID(),x(n,{stdDeviation:+e||1.5}),i.appendChild(n),r.paper.defs.appendChild(i),r._blur=i,x(r.node,{filter:"url(#"+i.id+")"})}else r._blur&&(r._blur.parentNode.removeChild(r._blur),delete r._blur,delete r.attrs.blur),r.node.removeAttribute("filter");return r},t._engine.circle=function(t,e,r,i){var n=x("circle");t.canvas&&t.canvas.appendChild(n);var a=new A(n,t);return a.attrs={cx:e,cy:r,r:i,fill:"none",stroke:"#000"},a.type="circle",x(n,a.attrs),a},t._engine.rect=function(t,e,r,i,n,a){var s=x("rect");t.canvas&&t.canvas.appendChild(s);var o=new A(s,t);return o.attrs={x:e,y:r,width:i,height:n,rx:a||0,ry:a||0,fill:"none",stroke:"#000"},o.type="rect",x(s,o.attrs),o},t._engine.ellipse=function(t,e,r,i,n){var a=x("ellipse");t.canvas&&t.canvas.appendChild(a);var s=new A(a,t);return s.attrs={cx:e,cy:r,rx:i,ry:n,fill:"none",stroke:"#000"},s.type="ellipse",x(a,s.attrs),s},t._engine.image=function(t,e,r,i,n,a){var s=x("image");x(s,{x:r,y:i,width:n,height:a,preserveAspectRatio:"none"}),s.setAttributeNS(p,"href",e),t.canvas&&t.canvas.appendChild(s);var o=new A(s,t);return o.attrs={x:r,y:i,width:n,height:a,src:e},o.type="image",o},t._engine.text=function(e,r,i,n){var a=x("text");e.canvas&&e.canvas.appendChild(a);var s=new A(a,e);return s.attrs={x:r,y:i,"text-anchor":"middle",text:n,"font-family":t._availableAttrs["font-family"],"font-size":t._availableAttrs["font-size"],stroke:"none",fill:"#000"},s.type="text",B(s,s.attrs),s},t._engine.setSize=function(t,e){return this.width=t||this.width,this.height=e||this.height,this.canvas.setAttribute("width",this.width),this.canvas.setAttribute("height",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox),this},t._engine.create=function(){var e=t._getContainer.apply(0,arguments),r=e&&e.container,i=e.x,n=e.y,a=e.width,s=e.height;if(!r)throw new Error("SVG container not found.");var o=x("svg"),l="overflow:hidden;",h;return i=i||0,n=n||0,a=a||512,s=s||342,x(o,{height:s,version:1.1,width:a,xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink"}),1==r?(o.style.cssText=l+"position:absolute;left:"+i+"px;top:"+n+"px",t._g.doc.body.appendChild(o),h=1):(o.style.cssText=l+"position:relative",r.firstChild?r.insertBefore(o,r.firstChild):r.appendChild(o)),r=new t._Paper,r.width=a,r.height=s,r.canvas=o,r.clear(),r._left=r._top=0,h&&(r.renderfix=function(){}),r.renderfix(),r},t._engine.setViewBox=function(t,e,r,i,n){u("raphael.setViewBox",this,this._viewBox,[t,e,r,i,n]);var a=this.getSize(),o=s(r/a.width,i/a.height),l=this.top,h=n?"xMidYMid meet":"xMinYMin",c,p;for(null==t?(this._vbSize&&(o=1),delete this._vbSize,c="0 0 "+this.width+f+this.height):(this._vbSize=o,c=t+f+e+f+r+f+i),x(this.canvas,{viewBox:c,preserveAspectRatio:h});o&&l;)p="stroke-width"in l.attrs?l.attrs["stroke-width"]:1,l.attr({"stroke-width":p}),l._.dirty=1,l._.dirtyT=1,l=l.prev;return this._viewBox=[t,e,r,i,!!n],this},t.prototype.renderfix=function(){var t=this.canvas,e=t.style,r;try{r=t.getScreenCTM()||t.createSVGMatrix()}catch(i){r=t.createSVGMatrix()}var n=-r.e%1,a=-r.f%1;(n||a)&&(n&&(this._left=(this._left+n)%1,e.left=this._left+"px"),a&&(this._top=(this._top+a)%1,e.top=this._top+"px"))},t.prototype.clear=function(){t.eve("raphael.clear",this);for(var e=this.canvas;e.firstChild;)e.removeChild(e.firstChild);this.bottom=this.top=null,(this.desc=x("desc")).appendChild(t._g.doc.createTextNode("Created with Raphaël "+t.version)),e.appendChild(this.desc),e.appendChild(this.defs=x("defs"))},t.prototype.remove=function(){u("raphael.remove",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var e in this)this[e]="function"==typeof this[e]?t._removedFactory(e):null};var E=t.st;for(var M in N)N[e](M)&&!E[e](M)&&(E[M]=function(t){return function(){var e=arguments;return this.forEach(function(r){r[t].apply(r,e)})}}(M))}}.apply(e,i),!(void 0!==n&&(t.exports=n))},function(t,e,r){var i,n;i=[r(1)],n=function(t){if(!t||t.vml){var e="hasOwnProperty",r=String,i=parseFloat,n=Math,a=n.round,s=n.max,o=n.min,l=n.abs,h="fill",u=/[, ]+/,c=t.eve,f=" progid:DXImageTransform.Microsoft",p=" ",d="",g={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},x=/([clmz]),?([^clmz]*)/gi,v=/ progid:\S+Blur\([^\)]+\)/g,y=/-?[^,\s-]+/g,m="position:absolute;left:0;top:0;width:1px;height:1px;behavior:url(#default#VML)",b=21600,_={path:1,rect:1,image:1},w={circle:1,ellipse:1},k=function(e){var i=/[ahqstv]/gi,n=t._pathToAbsolute;if(r(e).match(i)&&(n=t._path2curve),i=/[clmz]/g,n==t._pathToAbsolute&&!r(e).match(i)){var s=r(e).replace(x,function(t,e,r){var i=[],n="m"==e.toLowerCase(),s=g[e];return r.replace(y,function(t){n&&2==i.length&&(s+=i+g["m"==e?"l":"L"],i=[]),i.push(a(t*b))}),s+i});return s}var o=n(e),l,h;s=[];for(var u=0,c=o.length;c>u;u++){l=o[u],h=o[u][0].toLowerCase(),"z"==h&&(h="x");for(var f=1,v=l.length;v>f;f++)h+=a(l[f]*b)+(f!=v-1?",":d);s.push(h)}return s.join(p)},B=function(e,r,i){var n=t.matrix();return n.rotate(-e,.5,.5),{dx:n.x(r,i),dy:n.y(r,i)}},C=function(t,e,r,i,n,a){var s=t._,o=t.matrix,u=s.fillpos,c=t.node,f=c.style,d=1,g="",x,v=b/e,y=b/r;if(f.visibility="hidden",e&&r){if(c.coordsize=l(v)+p+l(y),f.rotation=a*(0>e*r?-1:1),a){var m=B(a,i,n);i=m.dx,n=m.dy}if(0>e&&(g+="x"),0>r&&(g+=" y")&&(d=-1),f.flip=g,c.coordorigin=i*-v+p+n*-y,u||s.fillsize){var _=c.getElementsByTagName(h);_=_&&_[0],c.removeChild(_),u&&(m=B(a,o.x(u[0],u[1]),o.y(u[0],u[1])),_.position=m.dx*d+p+m.dy*d),s.fillsize&&(_.size=s.fillsize[0]*l(e)+p+s.fillsize[1]*l(r)),c.appendChild(_)}f.visibility="visible"}};t.toString=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version};var S=function(t,e,i){for(var n=r(e).toLowerCase().split("-"),a=i?"end":"start",s=n.length,o="classic",l="medium",h="medium";s--;)switch(n[s]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":o=n[s];break;case"wide":case"narrow":h=n[s];break;case"long":case"short":l=n[s]}var u=t.node.getElementsByTagName("stroke")[0];u[a+"arrow"]=o,u[a+"arrowlength"]=l,u[a+"arrowwidth"]=h},T=function(n,l){n.attrs=n.attrs||{};var c=n.node,f=n.attrs,g=c.style,x,v=_[n.type]&&(l.x!=f.x||l.y!=f.y||l.width!=f.width||l.height!=f.height||l.cx!=f.cx||l.cy!=f.cy||l.rx!=f.rx||l.ry!=f.ry||l.r!=f.r),y=w[n.type]&&(f.cx!=l.cx||f.cy!=l.cy||f.r!=l.r||f.rx!=l.rx||f.ry!=l.ry),m=n;for(var B in l)l[e](B)&&(f[B]=l[B]);if(v&&(f.path=t._getPath[n.type](n),n._.dirty=1),l.href&&(c.href=l.href),l.title&&(c.title=l.title),l.target&&(c.target=l.target),l.cursor&&(g.cursor=l.cursor),"blur"in l&&n.blur(l.blur),(l.path&&"path"==n.type||v)&&(c.path=k(~r(f.path).toLowerCase().indexOf("r")?t._pathToAbsolute(f.path):f.path),n._.dirty=1,"image"==n.type&&(n._.fillpos=[f.x,f.y],n._.fillsize=[f.width,f.height],C(n,1,1,0,0,0))),"transform"in l&&n.transform(l.transform),y){var T=+f.cx,N=+f.cy,E=+f.rx||+f.r||0,L=+f.ry||+f.r||0;c.path=t.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x",a((T-E)*b),a((N-L)*b),a((T+E)*b),a((N+L)*b),a(T*b)),n._.dirty=1}if("clip-rect"in l){var F=r(l["clip-rect"]).split(u);if(4==F.length){F[2]=+F[2]+ +F[0],F[3]=+F[3]+ +F[1];var P=c.clipRect||t._g.doc.createElement("div"),z=P.style;z.clip=t.format("rect({1}px {2}px {3}px {0}px)",F),c.clipRect||(z.position="absolute",z.top=0,z.left=0,z.width=n.paper.width+"px",z.height=n.paper.height+"px",c.parentNode.insertBefore(P,c),P.appendChild(c),c.clipRect=P)}l["clip-rect"]||c.clipRect&&(c.clipRect.style.clip="auto")}if(n.textpath){var R=n.textpath.style;l.font&&(R.font=l.font),l["font-family"]&&(R.fontFamily='"'+l["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g,d)+'"'),l["font-size"]&&(R.fontSize=l["font-size"]),l["font-weight"]&&(R.fontWeight=l["font-weight"]),l["font-style"]&&(R.fontStyle=l["font-style"])}if("arrow-start"in l&&S(m,l["arrow-start"]),"arrow-end"in l&&S(m,l["arrow-end"],1),null!=l.opacity||null!=l.fill||null!=l.src||null!=l.stroke||null!=l["stroke-width"]||null!=l["stroke-opacity"]||null!=l["fill-opacity"]||null!=l["stroke-dasharray"]||null!=l["stroke-miterlimit"]||null!=l["stroke-linejoin"]||null!=l["stroke-linecap"]){var j=c.getElementsByTagName(h),q=!1;if(j=j&&j[0],!j&&(q=j=M(h)),"image"==n.type&&l.src&&(j.src=l.src),l.fill&&(j.on=!0),null!=j.on&&"none"!=l.fill&&null!==l.fill||(j.on=!1),j.on&&l.fill){var I=r(l.fill).match(t._ISURL);if(I){j.parentNode==c&&c.removeChild(j),j.rotate=!0,j.src=I[1],j.type="tile";var D=n.getBBox(1);j.position=D.x+p+D.y,n._.fillpos=[D.x,D.y],t._preload(I[1],function(){n._.fillsize=[this.offsetWidth,this.offsetHeight]})}else j.color=t.getRGB(l.fill).hex,j.src=d,j.type="solid",t.getRGB(l.fill).error&&(m.type in{circle:1,ellipse:1}||"r"!=r(l.fill).charAt())&&A(m,l.fill,j)&&(f.fill="none",f.gradient=l.fill,j.rotate=!1)}if("fill-opacity"in l||"opacity"in l){var V=((+f["fill-opacity"]+1||2)-1)*((+f.opacity+1||2)-1)*((+t.getRGB(l.fill).o+1||2)-1);V=o(s(V,0),1),j.opacity=V,j.src&&(j.color="none")}c.appendChild(j);var O=c.getElementsByTagName("stroke")&&c.getElementsByTagName("stroke")[0],W=!1;!O&&(W=O=M("stroke")),(l.stroke&&"none"!=l.stroke||l["stroke-width"]||null!=l["stroke-opacity"]||l["stroke-dasharray"]||l["stroke-miterlimit"]||l["stroke-linejoin"]||l["stroke-linecap"])&&(O.on=!0),("none"==l.stroke||null===l.stroke||null==O.on||0==l.stroke||0==l["stroke-width"])&&(O.on=!1);var Y=t.getRGB(l.stroke);O.on&&l.stroke&&(O.color=Y.hex),V=((+f["stroke-opacity"]+1||2)-1)*((+f.opacity+1||2)-1)*((+Y.o+1||2)-1);var G=.75*(i(l["stroke-width"])||1);if(V=o(s(V,0),1),null==l["stroke-width"]&&(G=f["stroke-width"]),l["stroke-width"]&&(O.weight=G),G&&1>G&&(V*=G)&&(O.weight=1),O.opacity=V,l["stroke-linejoin"]&&(O.joinstyle=l["stroke-linejoin"]||"miter"),O.miterlimit=l["stroke-miterlimit"]||8,l["stroke-linecap"]&&(O.endcap="butt"==l["stroke-linecap"]?"flat":"square"==l["stroke-linecap"]?"square":"round"),"stroke-dasharray"in l){var H={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};O.dashstyle=H[e](l["stroke-dasharray"])?H[l["stroke-dasharray"]]:d}W&&c.appendChild(O)}if("text"==m.type){m.paper.canvas.style.display=d;var X=m.paper.span,U=100,$=f.font&&f.font.match(/\d+(?:\.\d*)?(?=px)/);g=X.style,f.font&&(g.font=f.font),f["font-family"]&&(g.fontFamily=f["font-family"]),f["font-weight"]&&(g.fontWeight=f["font-weight"]),f["font-style"]&&(g.fontStyle=f["font-style"]),$=i(f["font-size"]||$&&$[0])||10,g.fontSize=$*U+"px",m.textpath.string&&(X.innerHTML=r(m.textpath.string).replace(/</g,"<").replace(/&/g,"&").replace(/\n/g,"<br>"));var Z=X.getBoundingClientRect();m.W=f.w=(Z.right-Z.left)/U,m.H=f.h=(Z.bottom-Z.top)/U,m.X=f.x,m.Y=f.y+m.H/2,("x"in l||"y"in l)&&(m.path.v=t.format("m{0},{1}l{2},{1}",a(f.x*b),a(f.y*b),a(f.x*b)+1));for(var Q=["x","y","text","font","font-family","font-weight","font-style","font-size"],J=0,K=Q.length;K>J;J++)if(Q[J]in l){m._.dirty=1;break}switch(f["text-anchor"]){case"start":m.textpath.style["v-text-align"]="left",m.bbx=m.W/2;break;case"end":m.textpath.style["v-text-align"]="right",m.bbx=-m.W/2;break;default:m.textpath.style["v-text-align"]="center",m.bbx=0}m.textpath.style["v-text-kern"]=!0}},A=function(e,a,s){e.attrs=e.attrs||{};var o=e.attrs,l=Math.pow,h,u,c="linear",f=".5 .5";if(e.attrs.gradient=a,a=r(a).replace(t._radial_gradient,function(t,e,r){return c="radial",e&&r&&(e=i(e),r=i(r),l(e-.5,2)+l(r-.5,2)>.25&&(r=n.sqrt(.25-l(e-.5,2))*(2*(r>.5)-1)+.5),f=e+p+r),d}),a=a.split(/\s*\-\s*/),"linear"==c){var g=a.shift();if(g=-i(g),isNaN(g))return null}var x=t._parseDots(a);if(!x)return null;if(e=e.shape||e.node,x.length){e.removeChild(s),s.on=!0,s.method="none",s.color=x[0].color,s.color2=x[x.length-1].color;for(var v=[],y=0,m=x.length;m>y;y++)x[y].offset&&v.push(x[y].offset+p+x[y].color);s.colors=v.length?v.join():"0% "+s.color,"radial"==c?(s.type="gradientTitle",s.focus="100%",s.focussize="0 0",s.focusposition=f,s.angle=0):(s.type="gradient",s.angle=(270-g)%360),e.appendChild(s)}return 1},N=function(e,r){this[0]=this.node=e,e.raphael=!0,this.id=t._oid++,e.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=r,this.matrix=t.matrix(),this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!r.bottom&&(r.bottom=this),this.prev=r.top,r.top&&(r.top.next=this),r.top=this,this.next=null},E=t.el;N.prototype=E,E.constructor=N,E.transform=function(e){if(null==e)return this._.transform;var i=this.paper._viewBoxShift,n=i?"s"+[i.scale,i.scale]+"-1-1t"+[i.dx,i.dy]:d,a;i&&(a=e=r(e).replace(/\.{3}|\u2026/g,this._.transform||d)),t._extractTransform(this,n+e);var s=this.matrix.clone(),o=this.skew,l=this.node,h,u=~r(this.attrs.fill).indexOf("-"),c=!r(this.attrs.fill).indexOf("url(");if(s.translate(1,1),c||u||"image"==this.type)if(o.matrix="1 0 0 1",o.offset="0 0",h=s.split(),u&&h.noRotation||!h.isSimple){l.style.filter=s.toFilter();var f=this.getBBox(),g=this.getBBox(1),x=f.x-g.x,v=f.y-g.y;l.coordorigin=x*-b+p+v*-b,C(this,1,1,x,v,0)}else l.style.filter=d,C(this,h.scalex,h.scaley,h.dx,h.dy,h.rotate);else l.style.filter=d,o.matrix=r(s),o.offset=s.offset();return null!==a&&(this._.transform=a,t._extractTransform(this,a)),this},E.rotate=function(t,e,n){if(this.removed)return this;if(null!=t){if(t=r(t).split(u),t.length-1&&(e=i(t[1]),n=i(t[2])),t=i(t[0]),null==n&&(e=n),null==e||null==n){var a=this.getBBox(1);e=a.x+a.width/2,n=a.y+a.height/2}return this._.dirtyT=1,this.transform(this._.transform.concat([["r",t,e,n]])),this}},E.translate=function(t,e){return this.removed?this:(t=r(t).split(u),t.length-1&&(e=i(t[1])),t=i(t[0])||0,e=+e||0,this._.bbox&&(this._.bbox.x+=t,this._.bbox.y+=e),this.transform(this._.transform.concat([["t",t,e]])),this)},E.scale=function(t,e,n,a){if(this.removed)return this;if(t=r(t).split(u),t.length-1&&(e=i(t[1]),n=i(t[2]),a=i(t[3]),isNaN(n)&&(n=null),isNaN(a)&&(a=null)),t=i(t[0]),null==e&&(e=t),null==a&&(n=a),null==n||null==a)var s=this.getBBox(1);return n=null==n?s.x+s.width/2:n,a=null==a?s.y+s.height/2:a,this.transform(this._.transform.concat([["s",t,e,n,a]])),this._.dirtyT=1,this},E.hide=function(){return!this.removed&&(this.node.style.display="none"),this},E.show=function(){return!this.removed&&(this.node.style.display=d),this},E.auxGetBBox=t.el.getBBox,E.getBBox=function(){var t=this.auxGetBBox();if(this.paper&&this.paper._viewBoxShift){var e={},r=1/this.paper._viewBoxShift.scale;return e.x=t.x-this.paper._viewBoxShift.dx,e.x*=r,e.y=t.y-this.paper._viewBoxShift.dy,e.y*=r,e.width=t.width*r,e.height=t.height*r,e.x2=e.x+e.width,e.y2=e.y+e.height,e}return t},E._getBBox=function(){return this.removed?{}:{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}},E.remove=function(){if(!this.removed&&this.node.parentNode){this.paper.__set__&&this.paper.__set__.exclude(this),t.eve.unbind("raphael.*.*."+this.id),t._tear(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var e in this)this[e]="function"==typeof this[e]?t._removedFactory(e):null;this.removed=!0}},E.attr=function(r,i){if(this.removed)return this;if(null==r){var n={};for(var a in this.attrs)this.attrs[e](a)&&(n[a]=this.attrs[a]);return n.gradient&&"none"==n.fill&&(n.fill=n.gradient)&&delete n.gradient,n.transform=this._.transform,n}if(null==i&&t.is(r,"string")){if(r==h&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;for(var s=r.split(u),o={},l=0,f=s.length;f>l;l++)r=s[l],r in this.attrs?o[r]=this.attrs[r]:t.is(this.paper.customAttributes[r],"function")?o[r]=this.paper.customAttributes[r].def:o[r]=t._availableAttrs[r];return f-1?o:o[s[0]]}if(this.attrs&&null==i&&t.is(r,"array")){for(o={},l=0,f=r.length;f>l;l++)o[r[l]]=this.attr(r[l]);return o}var p;null!=i&&(p={},p[r]=i),null==i&&t.is(r,"object")&&(p=r);for(var d in p)c("raphael.attr."+d+"."+this.id,this,p[d]);if(p){for(d in this.paper.customAttributes)if(this.paper.customAttributes[e](d)&&p[e](d)&&t.is(this.paper.customAttributes[d],"function")){var g=this.paper.customAttributes[d].apply(this,[].concat(p[d]));this.attrs[d]=p[d];for(var x in g)g[e](x)&&(p[x]=g[x])}p.text&&"text"==this.type&&(this.textpath.string=p.text),T(this,p)}return this},E.toFront=function(){return!this.removed&&this.node.parentNode.appendChild(this.node),this.paper&&this.paper.top!=this&&t._tofront(this,this.paper),this},E.toBack=function(){return this.removed?this:(this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),t._toback(this,this.paper)),this)},E.insertAfter=function(e){return this.removed?this:(e.constructor==t.st.constructor&&(e=e[e.length-1]),e.node.nextSibling?e.node.parentNode.insertBefore(this.node,e.node.nextSibling):e.node.parentNode.appendChild(this.node),t._insertafter(this,e,this.paper),this)},E.insertBefore=function(e){return this.removed?this:(e.constructor==t.st.constructor&&(e=e[0]),e.node.parentNode.insertBefore(this.node,e.node),t._insertbefore(this,e,this.paper),this)},E.blur=function(e){var r=this.node.runtimeStyle,i=r.filter;return i=i.replace(v,d),0!==+e?(this.attrs.blur=e,r.filter=i+p+f+".Blur(pixelradius="+(+e||1.5)+")",r.margin=t.format("-{0}px 0 0 -{0}px",a(+e||1.5))):(r.filter=i,r.margin=0,delete this.attrs.blur),this},t._engine.path=function(t,e){var r=M("shape");r.style.cssText=m,r.coordsize=b+p+b,r.coordorigin=e.coordorigin;var i=new N(r,e),n={fill:"none",stroke:"#000"};t&&(n.path=t),i.type="path",i.path=[],i.Path=d,T(i,n),e.canvas&&e.canvas.appendChild(r);var a=M("skew");return a.on=!0,r.appendChild(a),i.skew=a,i.transform(d),i},t._engine.rect=function(e,r,i,n,a,s){var o=t._rectPath(r,i,n,a,s),l=e.path(o),h=l.attrs;return l.X=h.x=r,l.Y=h.y=i,l.W=h.width=n,l.H=h.height=a,h.r=s,h.path=o,l.type="rect",l},t._engine.ellipse=function(t,e,r,i,n){var a=t.path(),s=a.attrs;return a.X=e-i,a.Y=r-n,a.W=2*i,a.H=2*n,a.type="ellipse",T(a,{cx:e,cy:r,rx:i,ry:n}),a},t._engine.circle=function(t,e,r,i){var n=t.path(),a=n.attrs;return n.X=e-i,n.Y=r-i,n.W=n.H=2*i,n.type="circle",T(n,{cx:e,cy:r,r:i}),n},t._engine.image=function(e,r,i,n,a,s){var o=t._rectPath(i,n,a,s),l=e.path(o).attr({stroke:"none"}),u=l.attrs,c=l.node,f=c.getElementsByTagName(h)[0];return u.src=r,l.X=u.x=i,l.Y=u.y=n,l.W=u.width=a,l.H=u.height=s,u.path=o,l.type="image",f.parentNode==c&&c.removeChild(f),f.rotate=!0,f.src=r,f.type="tile",l._.fillpos=[i,n],l._.fillsize=[a,s],c.appendChild(f),C(l,1,1,0,0,0),l},t._engine.text=function(e,i,n,s){var o=M("shape"),l=M("path"),h=M("textpath");i=i||0,n=n||0,s=s||"",l.v=t.format("m{0},{1}l{2},{1}",a(i*b),a(n*b),a(i*b)+1),l.textpathok=!0,h.string=r(s),h.on=!0,o.style.cssText=m,o.coordsize=b+p+b,o.coordorigin="0 0";var u=new N(o,e),c={fill:"#000",stroke:"none",font:t._availableAttrs.font,text:s};u.shape=o,u.path=l,u.textpath=h,u.type="text",u.attrs.text=r(s),u.attrs.x=i,u.attrs.y=n,u.attrs.w=1,u.attrs.h=1,T(u,c),o.appendChild(h),o.appendChild(l),e.canvas.appendChild(o);var f=M("skew");return f.on=!0,o.appendChild(f),u.skew=f,u.transform(d),u},t._engine.setSize=function(e,r){var i=this.canvas.style;return this.width=e,this.height=r,e==+e&&(e+="px"),r==+r&&(r+="px"),i.width=e,i.height=r,i.clip="rect(0 "+e+" "+r+" 0)",this._viewBox&&t._engine.setViewBox.apply(this,this._viewBox),this},t._engine.setViewBox=function(e,r,i,n,a){t.eve("raphael.setViewBox",this,this._viewBox,[e,r,i,n,a]);var s=this.getSize(),o=s.width,l=s.height,h,u;return a&&(h=l/n,u=o/i,o>i*h&&(e-=(o-i*h)/2/h),l>n*u&&(r-=(l-n*u)/2/u)),this._viewBox=[e,r,i,n,!!a],this._viewBoxShift={dx:-e,dy:-r,scale:s},this.forEach(function(t){t.transform("...")}),this};var M;t._engine.initWin=function(t){var e=t.document;e.styleSheets.length<31?e.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)"):e.styleSheets[0].addRule(".rvml","behavior:url(#default#VML)");try{!e.namespaces.rvml&&e.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),M=function(t){return e.createElement("<rvml:"+t+' class="rvml">')}}catch(r){M=function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},t._engine.initWin(t._g.win),t._engine.create=function(){var e=t._getContainer.apply(0,arguments),r=e.container,i=e.height,n,a=e.width,s=e.x,o=e.y;if(!r)throw new Error("VML container not found.");var l=new t._Paper,h=l.canvas=t._g.doc.createElement("div"),u=h.style;return s=s||0,o=o||0,a=a||512,i=i||342,l.width=a,l.height=i,a==+a&&(a+="px"),i==+i&&(i+="px"),l.coordsize=1e3*b+p+1e3*b,l.coordorigin="0 0",l.span=t._g.doc.createElement("span"),l.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",h.appendChild(l.span),u.cssText=t.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",a,i),1==r?(t._g.doc.body.appendChild(h),u.left=s+"px",u.top=o+"px",u.position="absolute"):r.firstChild?r.insertBefore(h,r.firstChild):r.appendChild(h),l.renderfix=function(){},l},t.prototype.clear=function(){t.eve("raphael.clear",this),this.canvas.innerHTML=d,this.span=t._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},t.prototype.remove=function(){t.eve("raphael.remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var e in this)this[e]="function"==typeof this[e]?t._removedFactory(e):null;return!0};var L=t.st;for(var F in E)E[e](F)&&!L[e](F)&&(L[F]=function(t){return function(){var e=arguments;return this.forEach(function(r){r[t].apply(r,e)})}}(F))}}.apply(e,i),!(void 0!==n&&(t.exports=n))}])}); \ No newline at end of file diff --git a/public/bower_components/raphael/webpack.config.js b/public/bower_components/raphael/webpack.config.js new file mode 100755 index 0000000..394e0b2 --- /dev/null +++ b/public/bower_components/raphael/webpack.config.js @@ -0,0 +1,61 @@ +"use strict"; + +const webpack = require("webpack"); +const fs = require("fs"); + +const args = process.argv; + +let plugins = [ + new webpack.BannerPlugin(fs.readFileSync('./dev/banner.txt', 'utf8'), { raw: true, entryOnly: true }) +]; +let externals = []; +let filename = "raphael"; + + +if(args.indexOf('--no-deps') !== -1){ + console.log('Building version without deps'); + externals.push("eve"); + filename += ".no-deps" +} + +if(args.indexOf('--min') !== -1){ + console.log('Building minified version'); + plugins.push( + new webpack.optimize.UglifyJsPlugin({ + compress:{ + dead_code: false, + unused: false + } + }) + ); + filename += ".min" +} + +module.exports = { + entry: './dev/raphael.amd.js', + output: { + filename: filename + ".js", + libraryTarget: "umd", + library: "Raphael" + }, + + externals: externals, + + plugins: plugins, + + loaders: [ + { + test: /\.js$/, + loader: "eslint-loader", + include: "./dev/" + } + ], + + eslint: { + configFile: './.eslintrc' + }, + + resolve: { + modulesDirectories: ["bower_components"] + } +}; \ No newline at end of file diff --git a/public/bower_components/respond/.bower.json b/public/bower_components/respond/.bower.json new file mode 100755 index 0000000..e57c894 --- /dev/null +++ b/public/bower_components/respond/.bower.json @@ -0,0 +1,20 @@ +{ + "name": "respond", + "version": "1.4.2", + "main": "dest/respond.src.js", + "description": "Fast and lightweight polyfill for min/max-width CSS3 Media Queries (for IE 6-8, and more)", + "ignore": [ + "**/.*", + "test" + ], + "homepage": "https://github.com/scottjehl/Respond", + "_release": "1.4.2", + "_resolution": { + "type": "version", + "tag": "1.4.2", + "commit": "3eda118b4440825df56e3c12d054f9d316a5987a" + }, + "_source": "https://github.com/scottjehl/Respond.git", + "_target": ">=1.4.2", + "_originalSource": "respond" +} \ No newline at end of file diff --git a/public/bower_components/respond/Gruntfile.js b/public/bower_components/respond/Gruntfile.js new file mode 100755 index 0000000..70d4f18 --- /dev/null +++ b/public/bower_components/respond/Gruntfile.js @@ -0,0 +1,90 @@ +module.exports = function(grunt) { + "use strict"; + + // Project configuration. + grunt.initConfig({ + pkg: grunt.file.readJSON('package.json'), + banner: + '/*! Respond.js v<%= pkg.version %>: <%= pkg.description %>' + + ' * Copyright <%= grunt.template.today("yyyy") %> <%= pkg.author.name %>\n' + + ' * Licensed under <%= _.pluck(pkg.licenses, "url").join(", ") %>\n' + + ' * <%= pkg.website %>' + + ' */\n\n', + uglify: { + nonMinMatchMedia: { + options: { + mangle: false, + compress: false, + preserveComments: 'some', + beautify: { + beautify: true, + indent_level: 2 + } + }, + files: { + 'dest/respond.src.js': ['src/matchmedia.polyfill.js', 'src/respond.js'] + } + }, + minMatchMedia: { + options: { + banner: '<%= banner %>' + }, + files: { + 'dest/respond.min.js': ['src/matchmedia.polyfill.js', 'src/respond.js'] + } + }, + nonMinMatchMediaListener: { + options: { + mangle: false, + compress: false, + preserveComments: 'some', + beautify: { + beautify: true, + indent_level: 2 + } + }, + files: { + 'dest/respond.matchmedia.addListener.src.js': ['src/matchmedia.polyfill.js', 'src/matchmedia.addListener.js', 'src/respond.js'] + } + }, + minMatchMediaListener: { + options: { + banner: '<%= banner %>' + }, + files: { + 'dest/respond.matchmedia.addListener.min.js': ['src/matchmedia.polyfill.js', 'src/matchmedia.addListener.js', 'src/respond.js'] + } + } + }, + jshint: { + files: ['src/respond.js', 'src/matchmedia.polyfill.js'], + options: { + curly: true, + eqeqeq: true, + immed: true, + latedef: false, + newcap: true, + noarg: true, + sub: true, + undef: true, + boss: true, + eqnull: true, + smarttabs: true, + node: true, + es5: true, + strict: false + }, + globals: { + Image: true, + window: true + } + } + }); + + grunt.loadNpmTasks( 'grunt-contrib-jshint' ); + grunt.loadNpmTasks( 'grunt-contrib-uglify' ); + + // Default task. + grunt.registerTask('default', ['jshint', 'uglify']); + +}; diff --git a/public/bower_components/respond/LICENSE-MIT b/public/bower_components/respond/LICENSE-MIT new file mode 100755 index 0000000..c7cf40d --- /dev/null +++ b/public/bower_components/respond/LICENSE-MIT @@ -0,0 +1,22 @@ +Copyright (c) 2012 Scott Jehl + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/public/bower_components/respond/README.md b/public/bower_components/respond/README.md new file mode 100755 index 0000000..2cdc7c2 --- /dev/null +++ b/public/bower_components/respond/README.md @@ -0,0 +1,114 @@ +# Respond.js +### A fast & lightweight polyfill for min/max-width CSS3 Media Queries (for IE 6-8, and more) + + - Copyright 2011: Scott Jehl, scottjehl.com + + - Licensed under the MIT license. + +The goal of this script is to provide a fast and lightweight (3kb minified / 1kb gzipped) script to enable [responsive web designs](http://www.alistapart.com/articles/responsive-web-design/) in browsers that don't support CSS3 Media Queries - in particular, Internet Explorer 8 and under. It's written in such a way that it will probably patch support for other non-supporting browsers as well (more information on that soon). + +If you're unfamiliar with the concepts surrounding Responsive Web Design, you can read up [here](http://www.alistapart.com/articles/responsive-web-design/) and also [here](http://filamentgroup.com/examples/responsive-images/) + +[Demo page](https://rawgithub.com/scottjehl/Respond/master/test/test.html) (the colors change to show media queries working) + + +Usage Instructions +====== + +1. Craft your CSS with min/max-width media queries to adapt your layout from mobile (first) all the way up to desktop + + +<pre> + @media screen and (min-width: 480px){ + ...styles for 480px and up go here + } +</pre> + +2. Reference the respond.min.js script (1kb min/gzipped) after all of your CSS (the earlier it runs, the greater chance IE users will not see a flash of un-media'd content) + +3. Crack open Internet Explorer and pump fists in delight + + +CDN/X-Domain Setup +====== + +Respond.js works by requesting a pristine copy of your CSS via AJAX, so if you host your stylesheets on a CDN (or a subdomain), you'll need to upload a proxy page to enable cross-domain communication. + +See `cross-domain/example.html` for a demo: + +- Upload `cross-domain/respond-proxy.html` to your external domain +- Upload `cross-domain/respond.proxy.gif` to your origin domain +- Reference the file(s) via `<link />` element(s): + +<pre> + <!-- Respond.js proxy on external server --> + <link href="http://externalcdn.com/respond-proxy.html" id="respond-proxy" rel="respond-proxy" /> + + <!-- Respond.js redirect location on local server --> + <link href="/path/to/respond.proxy.gif" id="respond-redirect" rel="respond-redirect" /> + + <!-- Respond.js proxy script on local server --> + <script src="/path/to/respond.proxy.js"></script> +</pre> + +If you are having problems with the cross-domain setup, make sure respond-proxy.html does not have a query string appended to it. + +Note: HUGE thanks to @doctyper for the contributions in the cross-domain proxy! + + +Support & Caveats +====== + +Some notes to keep in mind: + +- This script's focus is purposely very narrow: only min-width and max-width media queries and all media types (screen, print, etc) are translated to non-supporting browsers. I wanted to keep things simple for filesize, maintenance, and performance, so I've intentionally limited support to queries that are essential to building a (mobile-first) responsive design. In the future, I may rework things a bit to include a hook for patching-in additional media query features - stay tuned! + +- Browsers that natively support CSS3 Media Queries are opted-out of running this script as quickly as possible. In testing for support, all other browsers are subjected to a quick test to determine whether they support media queries or not before proceeding to run the script. This test is now included separately at the top, and uses the window.matchMedia polyfill found here: https://github.com/paulirish/matchMedia.js . If you are already including this polyfill via Modernizr or otherwise, feel free to remove that part. + +- This script relies on no other scripts or frameworks (aside from the included matchMedia polyfill), and is optimized for mobile delivery (~1kb total filesize min/gzip) + +- As you might guess, this implementation is quite dumb in regards to CSS parsing rules. This is a good thing, because that allows it to run really fast, but its looseness may also cause unexpected behavior. For example: if you enclose a whole media query in a comment intending to disable its rules, you'll probably find that those rules will end up enabled in non-media-query-supporting browsers. + +- Respond.js doesn't parse CSS referenced via @import, nor does it work with media queries within style elements, as those styles can't be re-requested for parsing. + +- Due to security restrictions, some browsers may not allow this script to work on file:// urls (because it uses xmlHttpRequest). Run it on a web server. + +- If the request for the CSS file that includes MQ-specific styling is + behind a redirect, Respond.js will fail silently. CSS files should +respond with a 200 status. + +- Currently, media attributes on link elements are supported, but only if the linked stylesheet contains no media queries. If it does contain queries, the media attribute will be ignored and the internal queries will be parsed normally. In other words, @media statements in the CSS take priority. + +- Reportedly, if CSS files are encoded in UTF-8 with Byte-Order-Mark (BOM), they will not work with Respond.js in IE7 or IE8. Noted in issue #97 + +- WARNING: Including @font-face rules inside a media query will cause IE7 and IE8 to hang during load. To work around this, place @font-face rules in the wide open, as a sibling to other media queries. + +- If you have more than 32 stylesheets referenced, IE will throw an error, `Invalid procedure call or argument`. Concatenate your CSS and the issue should go away. + +- Sass/SCSS source maps are not supported; `@media -sass-debug-info` will break respond.js. Noted in issue [#148](https://github.com/scottjehl/Respond/issues/148) + +- Internet Explorer 9 supports css3 media queries, but not within frames when the CSS containing the media query is in an external file (this appears to be a bug in IE9 — see http://stackoverflow.com/questions/10316247/media-queries-fail-inside-ie9-iframe). See this commit for a fix if you're having this problem. https://github.com/NewSignature/Respond/commit/1c86c66075f0a2099451eb426702fc3540d2e603 + +- Nested Media Queries are not supported + + +How's it work? +====== +Basically, the script loops through the CSS referenced in the page and runs a regular expression or two on their contents to find media queries and their associated blocks of CSS. In Internet Explorer, the content of the stylesheet is impossible to retrieve in its pre-parsed state (which in IE 8-, means its media queries are removed from the text), so Respond.js re-requests the CSS files using Ajax and parses the text response from there. Be sure to configure your CSS files' caching properly so that this re-request doesn't actually go to the server, hitting your browser cache instead. + +From there, each media query block is appended to the head in order via style elements, and those style elements are enabled and disabled (read: appended and removed from the DOM) depending on how their min/max width compares with the browser width. The media attribute on the style elements will match that of the query in the CSS, so it could be "screen", "projector", or whatever you want. Any relative paths contained in the CSS will be prefixed by their stylesheet's href, so image paths will direct to their proper destination + +API Options? +====== +Sure, a couple: + +- respond.update() : rerun the parser (helpful if you added a stylesheet to the page and it needs to be translated) +- respond.mediaQueriesSupported: set to true if the browser natively supports media queries. +- respond.getEmValue() : returns the pixel value of one em + + +Alternatives to this script +====== +This isn't the only CSS3 Media Query polyfill script out there; but it damn well may be the fastest. + +If you're looking for more robust CSS3 Media Query support, you might check out http://code.google.com/p/css3-mediaqueries-js/. In testing, I've found that script to be noticeably slow when rendering complex responsive designs (both in filesize and performance), but it really does support a lot more media query features than this script. Big hat tip to the authors! :) diff --git a/public/bower_components/respond/bower.json b/public/bower_components/respond/bower.json new file mode 100755 index 0000000..b98e964 --- /dev/null +++ b/public/bower_components/respond/bower.json @@ -0,0 +1,10 @@ +{ + "name": "respond", + "version": "1.4.2", + "main": "dest/respond.src.js", + "description": "Fast and lightweight polyfill for min/max-width CSS3 Media Queries (for IE 6-8, and more)", + "ignore": [ + "**/.*", + "test" + ] +} diff --git a/public/bower_components/respond/cross-domain/example.html b/public/bower_components/respond/cross-domain/example.html new file mode 100755 index 0000000..700224e --- /dev/null +++ b/public/bower_components/respond/cross-domain/example.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8" /> + <title>Respond JS Test Page + + + + + + + + + + +

      This is a visual test file for cross-domain proxy.

      + +

      The media queries in the included CSS file simply change the body's background color depending on the browser width. If you see any colors aside from black, then the media queries are working in your browser. You can resize your browser window to see it change on the fly.

      + + +

      Media-attributes are working too! This should be visible above 600px.

      + + + diff --git a/public/bower_components/respond/cross-domain/respond-proxy.html b/public/bower_components/respond/cross-domain/respond-proxy.html new file mode 100755 index 0000000..f828a0a --- /dev/null +++ b/public/bower_components/respond/cross-domain/respond-proxy.html @@ -0,0 +1,96 @@ + + + + + + Respond JS Proxy + + + + + \ No newline at end of file diff --git a/public/bower_components/respond/cross-domain/respond.proxy.gif b/public/bower_components/respond/cross-domain/respond.proxy.gif new file mode 100755 index 0000000..ced1c05 Binary files /dev/null and b/public/bower_components/respond/cross-domain/respond.proxy.gif differ diff --git a/public/bower_components/respond/cross-domain/respond.proxy.js b/public/bower_components/respond/cross-domain/respond.proxy.js new file mode 100755 index 0000000..e9422cb --- /dev/null +++ b/public/bower_components/respond/cross-domain/respond.proxy.js @@ -0,0 +1,127 @@ +/*! Respond.js: min/max-width media query polyfill. Remote proxy (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs */ +(function(win, doc, undefined){ + var docElem = doc.documentElement, + proxyURL = doc.getElementById("respond-proxy").href, + redirectURL = (doc.getElementById("respond-redirect") || location).href, + baseElem = doc.getElementsByTagName("base")[0], + urls = [], + refNode; + + function encode(url){ + return win.encodeURIComponent(url); + } + + function fakejax( url, callback ){ + + var iframe, + AXO; + + // All hail Google http://j.mp/iKMI19 + // Behold, an iframe proxy without annoying clicky noises. + if ( "ActiveXObject" in win ) { + AXO = new ActiveXObject( "htmlfile" ); + AXO.open(); + AXO.write( '' ); + AXO.close(); + iframe = AXO.getElementById( "x" ); + } else { + iframe = doc.createElement( "iframe" ); + iframe.style.cssText = "position:absolute;top:-99em"; + docElem.insertBefore(iframe, docElem.firstElementChild || docElem.firstChild ); + } + + iframe.src = checkBaseURL(proxyURL) + "?url=" + encode(redirectURL) + "&css=" + encode(checkBaseURL(url)); + + function checkFrameName() { + var cssText; + + try { + cssText = iframe.contentWindow.name; + } + catch (e) { } + + if (cssText) { + // We've got what we need. Stop the iframe from loading further content. + iframe.src = "about:blank"; + iframe.parentNode.removeChild(iframe); + iframe = null; + + + // Per http://j.mp/kn9EPh, not taking any chances. Flushing the ActiveXObject + if (AXO) { + AXO = null; + + if (win.CollectGarbage) { + win.CollectGarbage(); + } + } + + callback(cssText); + } + else{ + win.setTimeout(checkFrameName, 100); + } + } + + win.setTimeout(checkFrameName, 500); + } + + function checkBaseURL(href) { + if (baseElem && href.indexOf(baseElem.href) === -1) { + bref = (/\/$/).test(baseElem.href) ? baseElem.href : (baseElem.href + "/"); + href = bref + href; + } + + return href; + } + + function checkRedirectURL() { + // IE6 & IE7 don't build out absolute urls in attributes. + // So respond.proxy.gif remains relative instead of http://example.com/respond.proxy.gif. + // This trickery resolves that issue. + if (~ !redirectURL.indexOf(location.host)) { + + var fakeLink = doc.createElement("div"); + + fakeLink.innerHTML = ''; + docElem.insertBefore(fakeLink, docElem.firstElementChild || docElem.firstChild ); + + // Grab the parsed URL from that dummy object + redirectURL = fakeLink.firstChild.href; + + // Clean up + fakeLink.parentNode.removeChild(fakeLink); + fakeLink = null; + } + } + + function buildUrls(){ + var links = doc.getElementsByTagName( "link" ); + + for( var i = 0, linkl = links.length; i < linkl; i++ ){ + + var thislink = links[i], + href = links[i].href, + extreg = (/^([a-zA-Z:]*\/\/(www\.)?)/).test( href ), + ext = (baseElem && !extreg) || extreg; + + //make sure it's an external stylesheet + if( thislink.rel.indexOf( "stylesheet" ) >= 0 && ext ){ + (function( link ){ + fakejax( href, function( css ){ + link.styleSheet.rawCssText = css; + respond.update(); + } ); + })( thislink ); + } + } + + + } + + if( !respond.mediaQueriesSupported ){ + checkRedirectURL(); + buildUrls(); + } + +})( window, document ); diff --git a/public/bower_components/respond/dest/respond.matchmedia.addListener.min.js b/public/bower_components/respond/dest/respond.matchmedia.addListener.min.js new file mode 100755 index 0000000..50ac74c --- /dev/null +++ b/public/bower_components/respond/dest/respond.matchmedia.addListener.min.js @@ -0,0 +1,5 @@ +/*! Respond.js v1.4.2: min/max-width media query polyfill * Copyright 2013 Scott Jehl + * Licensed under https://github.com/scottjehl/Respond/blob/master/LICENSE-MIT + * */ + +!function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='­',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";if(a.matchMedia&&a.matchMedia("all").addListener)return!1;var b=a.matchMedia,c=b("only all").matches,d=!1,e=0,f=[],g=function(){a.clearTimeout(e),e=a.setTimeout(function(){for(var c=0,d=f.length;d>c;c++){var e=f[c].mql,g=f[c].listeners||[],h=b(e.media).matches;if(h!==e.matches){e.matches=h;for(var i=0,j=g.length;j>i;i++)g[i].call(a,e)}}},30)};a.matchMedia=function(e){var h=b(e),i=[],j=0;return h.addListener=function(b){c&&(d||(d=!0,a.addEventListener("resize",g,!0)),0===j&&(j=f.push({mql:h,listeners:i})),i.push(b))},h.removeListener=function(a){for(var b=0,c=i.length;c>b;b++)i[b]===a&&i.splice(b,1)},h}}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;b #mq-test-1 { width: 42px; }'; + docElem.insertBefore(fakeBody, refNode); + bool = div.offsetWidth === 42; + docElem.removeChild(fakeBody); + return { + matches: bool, + media: q + }; + }; + }(w.document); +})(this); + +/*! matchMedia() polyfill addListener/removeListener extension. Author & copyright (c) 2012: Scott Jehl. Dual MIT/BSD license */ +(function(w) { + "use strict"; + if (w.matchMedia && w.matchMedia("all").addListener) { + return false; + } + var localMatchMedia = w.matchMedia, hasMediaQueries = localMatchMedia("only all").matches, isListening = false, timeoutID = 0, queries = [], handleChange = function(evt) { + w.clearTimeout(timeoutID); + timeoutID = w.setTimeout(function() { + for (var i = 0, il = queries.length; i < il; i++) { + var mql = queries[i].mql, listeners = queries[i].listeners || [], matches = localMatchMedia(mql.media).matches; + if (matches !== mql.matches) { + mql.matches = matches; + for (var j = 0, jl = listeners.length; j < jl; j++) { + listeners[j].call(w, mql); + } + } + } + }, 30); + }; + w.matchMedia = function(media) { + var mql = localMatchMedia(media), listeners = [], index = 0; + mql.addListener = function(listener) { + if (!hasMediaQueries) { + return; + } + if (!isListening) { + isListening = true; + w.addEventListener("resize", handleChange, true); + } + if (index === 0) { + index = queries.push({ + mql: mql, + listeners: listeners + }); + } + listeners.push(listener); + }; + mql.removeListener = function(listener) { + for (var i = 0, il = listeners.length; i < il; i++) { + if (listeners[i] === listener) { + listeners.splice(i, 1); + } + } + }; + return mql; + }; +})(this); + +/*! Respond.js v1.4.0: min/max-width media query polyfill. (c) Scott Jehl. MIT Lic. j.mp/respondjs */ +(function(w) { + "use strict"; + var respond = {}; + w.respond = respond; + respond.update = function() {}; + var requestQueue = [], xmlHttp = function() { + var xmlhttpmethod = false; + try { + xmlhttpmethod = new w.XMLHttpRequest(); + } catch (e) { + xmlhttpmethod = new w.ActiveXObject("Microsoft.XMLHTTP"); + } + return function() { + return xmlhttpmethod; + }; + }(), ajax = function(url, callback) { + var req = xmlHttp(); + if (!req) { + return; + } + req.open("GET", url, true); + req.onreadystatechange = function() { + if (req.readyState !== 4 || req.status !== 200 && req.status !== 304) { + return; + } + callback(req.responseText); + }; + if (req.readyState === 4) { + return; + } + req.send(null); + }; + respond.ajax = ajax; + respond.queue = requestQueue; + respond.regex = { + media: /@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi, + keyframes: /@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi, + urls: /(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g, + findStyles: /@media *([^\{]+)\{([\S\s]+?)$/, + only: /(only\s+)?([a-zA-Z]+)\s?/, + minw: /\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/, + maxw: /\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/ + }; + respond.mediaQueriesSupported = w.matchMedia && w.matchMedia("only all") !== null && w.matchMedia("only all").matches; + if (respond.mediaQueriesSupported) { + return; + } + var doc = w.document, docElem = doc.documentElement, mediastyles = [], rules = [], appendedEls = [], parsedSheets = {}, resizeThrottle = 30, head = doc.getElementsByTagName("head")[0] || docElem, base = doc.getElementsByTagName("base")[0], links = head.getElementsByTagName("link"), lastCall, resizeDefer, eminpx, getEmValue = function() { + var ret, div = doc.createElement("div"), body = doc.body, originalHTMLFontSize = docElem.style.fontSize, originalBodyFontSize = body && body.style.fontSize, fakeUsed = false; + div.style.cssText = "position:absolute;font-size:1em;width:1em"; + if (!body) { + body = fakeUsed = doc.createElement("body"); + body.style.background = "none"; + } + docElem.style.fontSize = "100%"; + body.style.fontSize = "100%"; + body.appendChild(div); + if (fakeUsed) { + docElem.insertBefore(body, docElem.firstChild); + } + ret = div.offsetWidth; + if (fakeUsed) { + docElem.removeChild(body); + } else { + body.removeChild(div); + } + docElem.style.fontSize = originalHTMLFontSize; + if (originalBodyFontSize) { + body.style.fontSize = originalBodyFontSize; + } + ret = eminpx = parseFloat(ret); + return ret; + }, applyMedia = function(fromResize) { + var name = "clientWidth", docElemProp = docElem[name], currWidth = doc.compatMode === "CSS1Compat" && docElemProp || doc.body[name] || docElemProp, styleBlocks = {}, lastLink = links[links.length - 1], now = new Date().getTime(); + if (fromResize && lastCall && now - lastCall < resizeThrottle) { + w.clearTimeout(resizeDefer); + resizeDefer = w.setTimeout(applyMedia, resizeThrottle); + return; + } else { + lastCall = now; + } + for (var i in mediastyles) { + if (mediastyles.hasOwnProperty(i)) { + var thisstyle = mediastyles[i], min = thisstyle.minw, max = thisstyle.maxw, minnull = min === null, maxnull = max === null, em = "em"; + if (!!min) { + min = parseFloat(min) * (min.indexOf(em) > -1 ? eminpx || getEmValue() : 1); + } + if (!!max) { + max = parseFloat(max) * (max.indexOf(em) > -1 ? eminpx || getEmValue() : 1); + } + if (!thisstyle.hasquery || (!minnull || !maxnull) && (minnull || currWidth >= min) && (maxnull || currWidth <= max)) { + if (!styleBlocks[thisstyle.media]) { + styleBlocks[thisstyle.media] = []; + } + styleBlocks[thisstyle.media].push(rules[thisstyle.rules]); + } + } + } + for (var j in appendedEls) { + if (appendedEls.hasOwnProperty(j)) { + if (appendedEls[j] && appendedEls[j].parentNode === head) { + head.removeChild(appendedEls[j]); + } + } + } + appendedEls.length = 0; + for (var k in styleBlocks) { + if (styleBlocks.hasOwnProperty(k)) { + var ss = doc.createElement("style"), css = styleBlocks[k].join("\n"); + ss.type = "text/css"; + ss.media = k; + head.insertBefore(ss, lastLink.nextSibling); + if (ss.styleSheet) { + ss.styleSheet.cssText = css; + } else { + ss.appendChild(doc.createTextNode(css)); + } + appendedEls.push(ss); + } + } + }, translate = function(styles, href, media) { + var qs = styles.replace(respond.regex.keyframes, "").match(respond.regex.media), ql = qs && qs.length || 0; + href = href.substring(0, href.lastIndexOf("/")); + var repUrls = function(css) { + return css.replace(respond.regex.urls, "$1" + href + "$2$3"); + }, useMedia = !ql && media; + if (href.length) { + href += "/"; + } + if (useMedia) { + ql = 1; + } + for (var i = 0; i < ql; i++) { + var fullq, thisq, eachq, eql; + if (useMedia) { + fullq = media; + rules.push(repUrls(styles)); + } else { + fullq = qs[i].match(respond.regex.findStyles) && RegExp.$1; + rules.push(RegExp.$2 && repUrls(RegExp.$2)); + } + eachq = fullq.split(","); + eql = eachq.length; + for (var j = 0; j < eql; j++) { + thisq = eachq[j]; + mediastyles.push({ + media: thisq.split("(")[0].match(respond.regex.only) && RegExp.$2 || "all", + rules: rules.length - 1, + hasquery: thisq.indexOf("(") > -1, + minw: thisq.match(respond.regex.minw) && parseFloat(RegExp.$1) + (RegExp.$2 || ""), + maxw: thisq.match(respond.regex.maxw) && parseFloat(RegExp.$1) + (RegExp.$2 || "") + }); + } + } + applyMedia(); + }, makeRequests = function() { + if (requestQueue.length) { + var thisRequest = requestQueue.shift(); + ajax(thisRequest.href, function(styles) { + translate(styles, thisRequest.href, thisRequest.media); + parsedSheets[thisRequest.href] = true; + w.setTimeout(function() { + makeRequests(); + }, 0); + }); + } + }, ripCSS = function() { + for (var i = 0; i < links.length; i++) { + var sheet = links[i], href = sheet.href, media = sheet.media, isCSS = sheet.rel && sheet.rel.toLowerCase() === "stylesheet"; + if (!!href && isCSS && !parsedSheets[href]) { + if (sheet.styleSheet && sheet.styleSheet.rawCssText) { + translate(sheet.styleSheet.rawCssText, href, media); + parsedSheets[href] = true; + } else { + if (!/^([a-zA-Z:]*\/\/)/.test(href) && !base || href.replace(RegExp.$1, "").split("/")[0] === w.location.host) { + if (href.substring(0, 2) === "//") { + href = w.location.protocol + href; + } + requestQueue.push({ + href: href, + media: media + }); + } + } + } + } + makeRequests(); + }; + ripCSS(); + respond.update = ripCSS; + respond.getEmValue = getEmValue; + function callMedia() { + applyMedia(true); + } + if (w.addEventListener) { + w.addEventListener("resize", callMedia, false); + } else if (w.attachEvent) { + w.attachEvent("onresize", callMedia); + } +})(this); \ No newline at end of file diff --git a/public/bower_components/respond/dest/respond.min.js b/public/bower_components/respond/dest/respond.min.js new file mode 100755 index 0000000..80a7b69 --- /dev/null +++ b/public/bower_components/respond/dest/respond.min.js @@ -0,0 +1,5 @@ +/*! Respond.js v1.4.2: min/max-width media query polyfill * Copyright 2013 Scott Jehl + * Licensed under https://github.com/scottjehl/Respond/blob/master/LICENSE-MIT + * */ + +!function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='­',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;b #mq-test-1 { width: 42px; }'; + docElem.insertBefore(fakeBody, refNode); + bool = div.offsetWidth === 42; + docElem.removeChild(fakeBody); + return { + matches: bool, + media: q + }; + }; + }(w.document); +})(this); + +/*! Respond.js v1.4.0: min/max-width media query polyfill. (c) Scott Jehl. MIT Lic. j.mp/respondjs */ +(function(w) { + "use strict"; + var respond = {}; + w.respond = respond; + respond.update = function() {}; + var requestQueue = [], xmlHttp = function() { + var xmlhttpmethod = false; + try { + xmlhttpmethod = new w.XMLHttpRequest(); + } catch (e) { + xmlhttpmethod = new w.ActiveXObject("Microsoft.XMLHTTP"); + } + return function() { + return xmlhttpmethod; + }; + }(), ajax = function(url, callback) { + var req = xmlHttp(); + if (!req) { + return; + } + req.open("GET", url, true); + req.onreadystatechange = function() { + if (req.readyState !== 4 || req.status !== 200 && req.status !== 304) { + return; + } + callback(req.responseText); + }; + if (req.readyState === 4) { + return; + } + req.send(null); + }; + respond.ajax = ajax; + respond.queue = requestQueue; + respond.regex = { + media: /@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi, + keyframes: /@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi, + urls: /(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g, + findStyles: /@media *([^\{]+)\{([\S\s]+?)$/, + only: /(only\s+)?([a-zA-Z]+)\s?/, + minw: /\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/, + maxw: /\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/ + }; + respond.mediaQueriesSupported = w.matchMedia && w.matchMedia("only all") !== null && w.matchMedia("only all").matches; + if (respond.mediaQueriesSupported) { + return; + } + var doc = w.document, docElem = doc.documentElement, mediastyles = [], rules = [], appendedEls = [], parsedSheets = {}, resizeThrottle = 30, head = doc.getElementsByTagName("head")[0] || docElem, base = doc.getElementsByTagName("base")[0], links = head.getElementsByTagName("link"), lastCall, resizeDefer, eminpx, getEmValue = function() { + var ret, div = doc.createElement("div"), body = doc.body, originalHTMLFontSize = docElem.style.fontSize, originalBodyFontSize = body && body.style.fontSize, fakeUsed = false; + div.style.cssText = "position:absolute;font-size:1em;width:1em"; + if (!body) { + body = fakeUsed = doc.createElement("body"); + body.style.background = "none"; + } + docElem.style.fontSize = "100%"; + body.style.fontSize = "100%"; + body.appendChild(div); + if (fakeUsed) { + docElem.insertBefore(body, docElem.firstChild); + } + ret = div.offsetWidth; + if (fakeUsed) { + docElem.removeChild(body); + } else { + body.removeChild(div); + } + docElem.style.fontSize = originalHTMLFontSize; + if (originalBodyFontSize) { + body.style.fontSize = originalBodyFontSize; + } + ret = eminpx = parseFloat(ret); + return ret; + }, applyMedia = function(fromResize) { + var name = "clientWidth", docElemProp = docElem[name], currWidth = doc.compatMode === "CSS1Compat" && docElemProp || doc.body[name] || docElemProp, styleBlocks = {}, lastLink = links[links.length - 1], now = new Date().getTime(); + if (fromResize && lastCall && now - lastCall < resizeThrottle) { + w.clearTimeout(resizeDefer); + resizeDefer = w.setTimeout(applyMedia, resizeThrottle); + return; + } else { + lastCall = now; + } + for (var i in mediastyles) { + if (mediastyles.hasOwnProperty(i)) { + var thisstyle = mediastyles[i], min = thisstyle.minw, max = thisstyle.maxw, minnull = min === null, maxnull = max === null, em = "em"; + if (!!min) { + min = parseFloat(min) * (min.indexOf(em) > -1 ? eminpx || getEmValue() : 1); + } + if (!!max) { + max = parseFloat(max) * (max.indexOf(em) > -1 ? eminpx || getEmValue() : 1); + } + if (!thisstyle.hasquery || (!minnull || !maxnull) && (minnull || currWidth >= min) && (maxnull || currWidth <= max)) { + if (!styleBlocks[thisstyle.media]) { + styleBlocks[thisstyle.media] = []; + } + styleBlocks[thisstyle.media].push(rules[thisstyle.rules]); + } + } + } + for (var j in appendedEls) { + if (appendedEls.hasOwnProperty(j)) { + if (appendedEls[j] && appendedEls[j].parentNode === head) { + head.removeChild(appendedEls[j]); + } + } + } + appendedEls.length = 0; + for (var k in styleBlocks) { + if (styleBlocks.hasOwnProperty(k)) { + var ss = doc.createElement("style"), css = styleBlocks[k].join("\n"); + ss.type = "text/css"; + ss.media = k; + head.insertBefore(ss, lastLink.nextSibling); + if (ss.styleSheet) { + ss.styleSheet.cssText = css; + } else { + ss.appendChild(doc.createTextNode(css)); + } + appendedEls.push(ss); + } + } + }, translate = function(styles, href, media) { + var qs = styles.replace(respond.regex.keyframes, "").match(respond.regex.media), ql = qs && qs.length || 0; + href = href.substring(0, href.lastIndexOf("/")); + var repUrls = function(css) { + return css.replace(respond.regex.urls, "$1" + href + "$2$3"); + }, useMedia = !ql && media; + if (href.length) { + href += "/"; + } + if (useMedia) { + ql = 1; + } + for (var i = 0; i < ql; i++) { + var fullq, thisq, eachq, eql; + if (useMedia) { + fullq = media; + rules.push(repUrls(styles)); + } else { + fullq = qs[i].match(respond.regex.findStyles) && RegExp.$1; + rules.push(RegExp.$2 && repUrls(RegExp.$2)); + } + eachq = fullq.split(","); + eql = eachq.length; + for (var j = 0; j < eql; j++) { + thisq = eachq[j]; + mediastyles.push({ + media: thisq.split("(")[0].match(respond.regex.only) && RegExp.$2 || "all", + rules: rules.length - 1, + hasquery: thisq.indexOf("(") > -1, + minw: thisq.match(respond.regex.minw) && parseFloat(RegExp.$1) + (RegExp.$2 || ""), + maxw: thisq.match(respond.regex.maxw) && parseFloat(RegExp.$1) + (RegExp.$2 || "") + }); + } + } + applyMedia(); + }, makeRequests = function() { + if (requestQueue.length) { + var thisRequest = requestQueue.shift(); + ajax(thisRequest.href, function(styles) { + translate(styles, thisRequest.href, thisRequest.media); + parsedSheets[thisRequest.href] = true; + w.setTimeout(function() { + makeRequests(); + }, 0); + }); + } + }, ripCSS = function() { + for (var i = 0; i < links.length; i++) { + var sheet = links[i], href = sheet.href, media = sheet.media, isCSS = sheet.rel && sheet.rel.toLowerCase() === "stylesheet"; + if (!!href && isCSS && !parsedSheets[href]) { + if (sheet.styleSheet && sheet.styleSheet.rawCssText) { + translate(sheet.styleSheet.rawCssText, href, media); + parsedSheets[href] = true; + } else { + if (!/^([a-zA-Z:]*\/\/)/.test(href) && !base || href.replace(RegExp.$1, "").split("/")[0] === w.location.host) { + if (href.substring(0, 2) === "//") { + href = w.location.protocol + href; + } + requestQueue.push({ + href: href, + media: media + }); + } + } + } + } + makeRequests(); + }; + ripCSS(); + respond.update = ripCSS; + respond.getEmValue = getEmValue; + function callMedia() { + applyMedia(true); + } + if (w.addEventListener) { + w.addEventListener("resize", callMedia, false); + } else if (w.attachEvent) { + w.attachEvent("onresize", callMedia); + } +})(this); \ No newline at end of file diff --git a/public/bower_components/respond/package.json b/public/bower_components/respond/package.json new file mode 100755 index 0000000..42864b0 --- /dev/null +++ b/public/bower_components/respond/package.json @@ -0,0 +1,32 @@ +{ + "name": "Respond.js", + "description": "min/max-width media query polyfill", + "version": "1.4.2", + "homepage": "https://github.com/scottjehl/Respond", + "author": { + "name": "Scott Jehl", + "email": "scott@filamentgroup.com", + "url": "http://filamentgroup.com" + }, + "repository": { + "type": "git", + "url": "https://github.com/scottjehl/Respond.git" + }, + "bugs": { + "url": "https://github.com/scottjehl/Respond/issues" + }, + "licenses": [ + { + "type": "MIT", + "url": "https://github.com/scottjehl/Respond/blob/master/LICENSE-MIT" + } + ], + "devDependencies": { + "grunt-cli":"~0.1", + "grunt": "~0.4.0", + "grunt-contrib-jshint": "~0.2.0", + "grunt-contrib-qunit": "~0.3.0", + "grunt-contrib-uglify": "0.2.7" + } + +} diff --git a/public/bower_components/respond/src/matchmedia.addListener.js b/public/bower_components/respond/src/matchmedia.addListener.js new file mode 100755 index 0000000..8290915 --- /dev/null +++ b/public/bower_components/respond/src/matchmedia.addListener.js @@ -0,0 +1,76 @@ +/*! matchMedia() polyfill addListener/removeListener extension. Author & copyright (c) 2012: Scott Jehl. Dual MIT/BSD license */ +(function( w ){ + "use strict"; + // Bail out for browsers that have addListener support + if (w.matchMedia && w.matchMedia('all').addListener) { + return false; + } + + var localMatchMedia = w.matchMedia, + hasMediaQueries = localMatchMedia('only all').matches, + isListening = false, + timeoutID = 0, // setTimeout for debouncing 'handleChange' + queries = [], // Contains each 'mql' and associated 'listeners' if 'addListener' is used + handleChange = function(evt) { + // Debounce + w.clearTimeout(timeoutID); + + timeoutID = w.setTimeout(function() { + for (var i = 0, il = queries.length; i < il; i++) { + var mql = queries[i].mql, + listeners = queries[i].listeners || [], + matches = localMatchMedia(mql.media).matches; + + // Update mql.matches value and call listeners + // Fire listeners only if transitioning to or from matched state + if (matches !== mql.matches) { + mql.matches = matches; + + for (var j = 0, jl = listeners.length; j < jl; j++) { + listeners[j].call(w, mql); + } + } + } + }, 30); + }; + + w.matchMedia = function(media) { + var mql = localMatchMedia(media), + listeners = [], + index = 0; + + mql.addListener = function(listener) { + // Changes would not occur to css media type so return now (Affects IE <= 8) + if (!hasMediaQueries) { + return; + } + + // Set up 'resize' listener for browsers that support CSS3 media queries (Not for IE <= 8) + // There should only ever be 1 resize listener running for performance + if (!isListening) { + isListening = true; + w.addEventListener('resize', handleChange, true); + } + + // Push object only if it has not been pushed already + if (index === 0) { + index = queries.push({ + mql : mql, + listeners : listeners + }); + } + + listeners.push(listener); + }; + + mql.removeListener = function(listener) { + for (var i = 0, il = listeners.length; i < il; i++){ + if (listeners[i] === listener){ + listeners.splice(i, 1); + } + } + }; + + return mql; + }; +}( this )); diff --git a/public/bower_components/respond/src/matchmedia.polyfill.js b/public/bower_components/respond/src/matchmedia.polyfill.js new file mode 100755 index 0000000..12d2b95 --- /dev/null +++ b/public/bower_components/respond/src/matchmedia.polyfill.js @@ -0,0 +1,36 @@ +/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */ +/*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */ + +(function(w){ + "use strict"; + w.matchMedia = w.matchMedia || (function( doc, undefined ) { + + var bool, + docElem = doc.documentElement, + refNode = docElem.firstElementChild || docElem.firstChild, + // fakeBody required for + fakeBody = doc.createElement( "body" ), + div = doc.createElement( "div" ); + + div.id = "mq-test-1"; + div.style.cssText = "position:absolute;top:-100em"; + fakeBody.style.background = "none"; + fakeBody.appendChild(div); + + return function(q){ + + div.innerHTML = "­"; + + docElem.insertBefore( fakeBody, refNode ); + bool = div.offsetWidth === 42; + docElem.removeChild( fakeBody ); + + return { + matches: bool, + media: q + }; + + }; + + }( w.document )); +}( this )); diff --git a/public/bower_components/respond/src/respond.js b/public/bower_components/respond/src/respond.js new file mode 100755 index 0000000..7b77134 --- /dev/null +++ b/public/bower_components/respond/src/respond.js @@ -0,0 +1,341 @@ +/*! Respond.js v1.4.0: min/max-width media query polyfill. (c) Scott Jehl. MIT Lic. j.mp/respondjs */ +(function( w ){ + + "use strict"; + + //exposed namespace + var respond = {}; + w.respond = respond; + + //define update even in native-mq-supporting browsers, to avoid errors + respond.update = function(){}; + + //define ajax obj + var requestQueue = [], + xmlHttp = (function() { + var xmlhttpmethod = false; + try { + xmlhttpmethod = new w.XMLHttpRequest(); + } + catch( e ){ + xmlhttpmethod = new w.ActiveXObject( "Microsoft.XMLHTTP" ); + } + return function(){ + return xmlhttpmethod; + }; + })(), + + //tweaked Ajax functions from Quirksmode + ajax = function( url, callback ) { + var req = xmlHttp(); + if (!req){ + return; + } + req.open( "GET", url, true ); + req.onreadystatechange = function () { + if ( req.readyState !== 4 || req.status !== 200 && req.status !== 304 ){ + return; + } + callback( req.responseText ); + }; + if ( req.readyState === 4 ){ + return; + } + req.send( null ); + }; + + //expose for testing + respond.ajax = ajax; + respond.queue = requestQueue; + + // expose for testing + respond.regex = { + media: /@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi, + keyframes: /@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi, + urls: /(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g, + findStyles: /@media *([^\{]+)\{([\S\s]+?)$/, + only: /(only\s+)?([a-zA-Z]+)\s?/, + minw: /\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/, + maxw: /\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/ + }; + + //expose media query support flag for external use + respond.mediaQueriesSupported = w.matchMedia && w.matchMedia( "only all" ) !== null && w.matchMedia( "only all" ).matches; + + //if media queries are supported, exit here + if( respond.mediaQueriesSupported ){ + return; + } + + //define vars + var doc = w.document, + docElem = doc.documentElement, + mediastyles = [], + rules = [], + appendedEls = [], + parsedSheets = {}, + resizeThrottle = 30, + head = doc.getElementsByTagName( "head" )[0] || docElem, + base = doc.getElementsByTagName( "base" )[0], + links = head.getElementsByTagName( "link" ), + + lastCall, + resizeDefer, + + //cached container for 1em value, populated the first time it's needed + eminpx, + + // returns the value of 1em in pixels + getEmValue = function() { + var ret, + div = doc.createElement('div'), + body = doc.body, + originalHTMLFontSize = docElem.style.fontSize, + originalBodyFontSize = body && body.style.fontSize, + fakeUsed = false; + + div.style.cssText = "position:absolute;font-size:1em;width:1em"; + + if( !body ){ + body = fakeUsed = doc.createElement( "body" ); + body.style.background = "none"; + } + + // 1em in a media query is the value of the default font size of the browser + // reset docElem and body to ensure the correct value is returned + docElem.style.fontSize = "100%"; + body.style.fontSize = "100%"; + + body.appendChild( div ); + + if( fakeUsed ){ + docElem.insertBefore( body, docElem.firstChild ); + } + + ret = div.offsetWidth; + + if( fakeUsed ){ + docElem.removeChild( body ); + } + else { + body.removeChild( div ); + } + + // restore the original values + docElem.style.fontSize = originalHTMLFontSize; + if( originalBodyFontSize ) { + body.style.fontSize = originalBodyFontSize; + } + + + //also update eminpx before returning + ret = eminpx = parseFloat(ret); + + return ret; + }, + + //enable/disable styles + applyMedia = function( fromResize ){ + var name = "clientWidth", + docElemProp = docElem[ name ], + currWidth = doc.compatMode === "CSS1Compat" && docElemProp || doc.body[ name ] || docElemProp, + styleBlocks = {}, + lastLink = links[ links.length-1 ], + now = (new Date()).getTime(); + + //throttle resize calls + if( fromResize && lastCall && now - lastCall < resizeThrottle ){ + w.clearTimeout( resizeDefer ); + resizeDefer = w.setTimeout( applyMedia, resizeThrottle ); + return; + } + else { + lastCall = now; + } + + for( var i in mediastyles ){ + if( mediastyles.hasOwnProperty( i ) ){ + var thisstyle = mediastyles[ i ], + min = thisstyle.minw, + max = thisstyle.maxw, + minnull = min === null, + maxnull = max === null, + em = "em"; + + if( !!min ){ + min = parseFloat( min ) * ( min.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 ); + } + if( !!max ){ + max = parseFloat( max ) * ( max.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 ); + } + + // if there's no media query at all (the () part), or min or max is not null, and if either is present, they're true + if( !thisstyle.hasquery || ( !minnull || !maxnull ) && ( minnull || currWidth >= min ) && ( maxnull || currWidth <= max ) ){ + if( !styleBlocks[ thisstyle.media ] ){ + styleBlocks[ thisstyle.media ] = []; + } + styleBlocks[ thisstyle.media ].push( rules[ thisstyle.rules ] ); + } + } + } + + //remove any existing respond style element(s) + for( var j in appendedEls ){ + if( appendedEls.hasOwnProperty( j ) ){ + if( appendedEls[ j ] && appendedEls[ j ].parentNode === head ){ + head.removeChild( appendedEls[ j ] ); + } + } + } + appendedEls.length = 0; + + //inject active styles, grouped by media type + for( var k in styleBlocks ){ + if( styleBlocks.hasOwnProperty( k ) ){ + var ss = doc.createElement( "style" ), + css = styleBlocks[ k ].join( "\n" ); + + ss.type = "text/css"; + ss.media = k; + + //originally, ss was appended to a documentFragment and sheets were appended in bulk. + //this caused crashes in IE in a number of circumstances, such as when the HTML element had a bg image set, so appending beforehand seems best. Thanks to @dvelyk for the initial research on this one! + head.insertBefore( ss, lastLink.nextSibling ); + + if ( ss.styleSheet ){ + ss.styleSheet.cssText = css; + } + else { + ss.appendChild( doc.createTextNode( css ) ); + } + + //push to appendedEls to track for later removal + appendedEls.push( ss ); + } + } + }, + //find media blocks in css text, convert to style blocks + translate = function( styles, href, media ){ + var qs = styles.replace( respond.regex.keyframes, '' ).match( respond.regex.media ), + ql = qs && qs.length || 0; + + //try to get CSS path + href = href.substring( 0, href.lastIndexOf( "/" ) ); + + var repUrls = function( css ){ + return css.replace( respond.regex.urls, "$1" + href + "$2$3" ); + }, + useMedia = !ql && media; + + //if path exists, tack on trailing slash + if( href.length ){ href += "/"; } + + //if no internal queries exist, but media attr does, use that + //note: this currently lacks support for situations where a media attr is specified on a link AND + //its associated stylesheet has internal CSS media queries. + //In those cases, the media attribute will currently be ignored. + if( useMedia ){ + ql = 1; + } + + for( var i = 0; i < ql; i++ ){ + var fullq, thisq, eachq, eql; + + //media attr + if( useMedia ){ + fullq = media; + rules.push( repUrls( styles ) ); + } + //parse for styles + else{ + fullq = qs[ i ].match( respond.regex.findStyles ) && RegExp.$1; + rules.push( RegExp.$2 && repUrls( RegExp.$2 ) ); + } + + eachq = fullq.split( "," ); + eql = eachq.length; + + for( var j = 0; j < eql; j++ ){ + thisq = eachq[ j ]; + mediastyles.push( { + media : thisq.split( "(" )[ 0 ].match( respond.regex.only ) && RegExp.$2 || "all", + rules : rules.length - 1, + hasquery : thisq.indexOf("(") > -1, + minw : thisq.match( respond.regex.minw ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" ), + maxw : thisq.match( respond.regex.maxw ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" ) + } ); + } + } + + applyMedia(); + }, + + //recurse through request queue, get css text + makeRequests = function(){ + if( requestQueue.length ){ + var thisRequest = requestQueue.shift(); + + ajax( thisRequest.href, function( styles ){ + translate( styles, thisRequest.href, thisRequest.media ); + parsedSheets[ thisRequest.href ] = true; + + // by wrapping recursive function call in setTimeout + // we prevent "Stack overflow" error in IE7 + w.setTimeout(function(){ makeRequests(); },0); + } ); + } + }, + + //loop stylesheets, send text content to translate + ripCSS = function(){ + + for( var i = 0; i < links.length; i++ ){ + var sheet = links[ i ], + href = sheet.href, + media = sheet.media, + isCSS = sheet.rel && sheet.rel.toLowerCase() === "stylesheet"; + + //only links plz and prevent re-parsing + if( !!href && isCSS && !parsedSheets[ href ] ){ + // selectivizr exposes css through the rawCssText expando + if (sheet.styleSheet && sheet.styleSheet.rawCssText) { + translate( sheet.styleSheet.rawCssText, href, media ); + parsedSheets[ href ] = true; + } else { + if( (!/^([a-zA-Z:]*\/\/)/.test( href ) && !base) || + href.replace( RegExp.$1, "" ).split( "/" )[0] === w.location.host ){ + // IE7 doesn't handle urls that start with '//' for ajax request + // manually add in the protocol + if ( href.substring(0,2) === "//" ) { href = w.location.protocol + href; } + requestQueue.push( { + href: href, + media: media + } ); + } + } + } + } + makeRequests(); + }; + + //translate CSS + ripCSS(); + + //expose update for re-running respond later on + respond.update = ripCSS; + + //expose getEmValue + respond.getEmValue = getEmValue; + + //adjust on resize + function callMedia(){ + applyMedia( true ); + } + + if( w.addEventListener ){ + w.addEventListener( "resize", callMedia, false ); + } + else if( w.attachEvent ){ + w.attachEvent( "onresize", callMedia ); + } +})(this); diff --git a/public/bower_components/seiyria-bootstrap-slider/.bower.json b/public/bower_components/seiyria-bootstrap-slider/.bower.json new file mode 100755 index 0000000..a738507 --- /dev/null +++ b/public/bower_components/seiyria-bootstrap-slider/.bower.json @@ -0,0 +1,36 @@ +{ + "name": "seiyria-bootstrap-slider", + "version": "9.1.1", + "homepage": "https://github.com/seiyria/bootstrap-slider", + "authors": [ + "Kyle Kemp ", + "Rohit Kalkur " + ], + "description": "a slider element for bootstrap 2/3", + "main": [ + "dist/bootstrap-slider.js", + "dist/css/bootstrap-slider.css" + ], + "keywords": [ + "slider", + "bootstrap2", + "bootstrap3", + "bootstrap" + ], + "license": "MIT", + "ignore": [ + "**/.*", + "node_modules", + "bower_components" + ], + "_release": "9.1.1", + "_resolution": { + "type": "version", + "tag": "v9.1.1", + "commit": "5b9cbda2ffee23365cdf72c49e54db751bc9c6cc" + }, + "_source": "https://github.com/seiyria/bootstrap-slider.git", + "_target": "^9.1.1", + "_originalSource": "seiyria-bootstrap-slider", + "_direct": true +} \ No newline at end of file diff --git a/public/bower_components/seiyria-bootstrap-slider/CHANGELOG.md b/public/bower_components/seiyria-bootstrap-slider/CHANGELOG.md new file mode 100755 index 0000000..9fda4dc --- /dev/null +++ b/public/bower_components/seiyria-bootstrap-slider/CHANGELOG.md @@ -0,0 +1,101 @@ +9.1.1 / 2016-07-15 +================== +* **Bug Fix:** Adds `.npmignore` file to repository. [Resolves this issue](https://github.com/seiyria/bootstrap-slider/issues/601) + +9.1.0 / 2016-07-14 +================== +* **New Feature:** Always binding to the `$.fn.bootstrapSlider` namespace and printing a console warning when the `$.fn.slider` namespace is already bound. Idea came from discussion [in this issue](https://github.com/seiyria/bootstrap-slider/issues/575) + +9.0.0 / 2016-07-13 +================== +* **New Feature:** Wraps all of the ticks within a single container element with the class `.slider-tick-container` as opposed to being within the `.slider-track` element. This enables individual ticks to be more easily targeted with CSS selectors such as `nth-of-type(n)`. Idea came from discussion [in this issue](https://github.com/seiyria/bootstrap-slider/issues/500) + +8.0.0 / 2016-07-13 +================== +* **Revert:** Reverting bug fix made in `7.0.4 - 7.0.5` because it breaks UMD module definition and r.js build tool [as reported in this issue](https://github.com/seiyria/bootstrap-slider/issues/589#issuecomment-232429818). Updated README to address how to stub out optional JQuery dependency for Webpack builds. + +7.1.0 - 7.1.1 / 2016-05-26 +================== +* **New Feature:** Allow LESS/SASS variables to be overridden, but fall back to defaults if needed. [See here for further details](https://github.com/seiyria/bootstrap-slider/pull/579). Thanks to [Jonathan Rehm + (jkrehm)](https://github.com/jkrehm) + +7.0.4 - 7.0.5 / 2016-05-26 +================== +* **Bug Fix:** Changes webpack AMD build error on define() for optional jQuery dependency to be a warning, which allows webpack builds to be completed. [See here for further details](https://github.com/seiyria/bootstrap-slider/issues/578). Thanks to [Tomi Saarinen (TomiS)](https://github.com/TomiS) + +7.0.2 / 2016-04-05 +================== +* **Bug Fix:** Fixes overlap issue with range slider. [See here for further details](https://github.com/seiyria/bootstrap-slider/issues/435). Thanks to [Jerry (jerrylow)](https://github.com/jerrylow) + +7.0.0 / 2016-04-05 +================== +* **Breaking Change:** Restructured and refactored SASS source files to eliminate compass dependency and be more organized. Thanks to [Jacob van Mourik + (jcbvm)](https://github.com/jcbvm) + +6.1.7 / 2016-04-03 +================== +* **Bug Fix:** Fixes issue where slider accidently scrolls when user taps on mobile device. Thanks to [Jerry (jerrylow)](https://github.com/jerrylow) + +6.1.5 / 2016-03-12 +================== +* **Bug Fix:** Call resize() before layout() within relayout() method, which enables intially hidden sliders to be revealed and behave appropriately. Thanks to [Peter (MaZderMind)](https://github.com/MaZderMind) + +6.1.3 / 2016-03-07 +================== +* **Bug Fix:** Fixed horizontal centering issue with labels. Thanks to [Josh Guffey](https://github.com/jguffey) + +6.1.0 / 2016-02-28 +================== +* **New Feature:** Auto-registering/intializing slider via `data-provide="slider"` attribute. Thanks to [MaZderMind](https://github.com/MaZderMind) +* Adding Github Templates for Issues, Pull Requeusts, and Contributions + +6.0.16 / 2016-02-04 +================== +* **Bug Fix:** Attempted Bug fix from 6.0.11 was refined to ensure so side effects. + +6.0.15 / 2016-02-04 +================== +* **Bug Fix:** _setText() defaults to `.textContent` vs `.innerHTML`. Thanks to [gio-js](https://github.com/gio-js) + +6.0.13 / 2016-01-31 +================== +* Reverted Bug fix from prior release + +6.0.11 / 2016-01-31 +================== +* **Bug fix:** Slider was not scrolling properly when nested inside of scrollable container. Thanks to [serbiant](https://github.com/serbiant) + + +6.0.9 / 2016-01-26 +================== +* **Bug fix:** Race condition in `setValue()` where slider value was being set after `change` and `slide` events were being triggered. Thanks to [glaszig](https://github.com/glaszig) + +6.0.7 / 2016-01-22 +================== +* **Bug fix:** When `tooltip_position` option is set to `"bottom"` on a slider with multiple split handles, position both tooltips below the slider. Thanks to [Martin Hesslund](https://github.com/kesse) + +6.0.5 / 2016-01-20 +================== +* bower.json: changing "main" to reference /dist/bootstrap-slider.js + +6.0.2 / 2015-12-31 +================== +* package.json: changing "main" to point at proper file path + +6.0.0 / 2015-12-30 +================== +* Moving all source code to `/src` directory +* Transpiling JS with [Babel](https://babeljs.io/) +* Adding `Other Guidelines` section to CONTRIBUTING.MD +* Updating README with Grunt CLI tasks +* Update postpublish script to reference transpiled code +* Freezing dependency versions (this allows us to ensure the module and grunt tasks always have consistent/repeatable behavior) +* Adding an `.nvmrc` file for Node 5.x.x. This version of node comes with NPM 3.x.x, which creates a flat dependency tree for `node_modules`, which basically eliminates the need for bower as our client-side deps management solution + +5.3.6 / 2015-12-27 +================== +* Restoring bootstrap depedency to bower.json file (Fixes issue with `grunt prod` task) + +5.3.4 / 2015-12-27 +================== +* **Bug fix:** Ticks now reposition themselves during window resize - Thanks to [Zachary Siswick](https://github.com/zsiswick) diff --git a/public/bower_components/seiyria-bootstrap-slider/Gruntfile.js b/public/bower_components/seiyria-bootstrap-slider/Gruntfile.js new file mode 100755 index 0000000..0aee376 --- /dev/null +++ b/public/bower_components/seiyria-bootstrap-slider/Gruntfile.js @@ -0,0 +1,297 @@ +/*global module:false*/ +module.exports = function(grunt) { + + var packageJSON = grunt.file.readJSON('package.json'); + var bumpFiles = ["package.json", "bower.json", "composer.json"]; + var commitFiles = bumpFiles.concat(["./dist/*"]); + + // Project configuration. + grunt.initConfig({ + // Metadata + pkg: packageJSON, + // Task configuration. + header: { + dist: { + options: { + text: "/*! =======================================================\n VERSION <%= pkg.version %> \n========================================================= */" + }, + files: { + '<%= pkg.gruntConfig.dist.js %>': '<%= pkg.gruntConfig.temp.js %>', + '<%= pkg.gruntConfig.dist.jsMin %>': '<%= pkg.gruntConfig.temp.jsMin %>', + '<%= pkg.gruntConfig.dist.css %>': '<%= pkg.gruntConfig.temp.css %>', + '<%= pkg.gruntConfig.dist.cssMin %>': '<%= pkg.gruntConfig.temp.cssMin %>' + } + } + }, + uglify: { + options: { + preserveComments: 'some' + }, + dist: { + src: '<%= pkg.gruntConfig.temp.js %>', + dest: '<%= pkg.gruntConfig.temp.jsMin %>' + } + }, + babel: { + options: { + presets: ['es2015'] + }, + dist: { + src: '<%= pkg.gruntConfig.js.slider %>', + dest: '<%= pkg.gruntConfig.temp.js %>' + } + }, + jshint: { + ignore_warning: { + options: { + '-W099': true + }, + src: '<%= pkg.gruntConfig.js.slider %>' + }, + options: { + esnext: true, + curly: true, + eqeqeq: true, + immed: true, + latedef: false, + newcap: true, + noarg: true, + sub: true, + undef: true, + unused: true, + boss: true, + eqnull: true, + browser: true, + globals: { + $ : true, + Modernizr : true, + console: true, + define: true, + module: true, + require: true + }, + "-W099": true + }, + gruntfile: { + src: 'Gruntfile.js' + }, + js: { + src: '<%= pkg.gruntConfig.js.slider %>' + }, + spec : { + src: '<%= pkg.gruntConfig.spec %>', + options : { + globals : { + document: true, + console: false, + Slider: false, + $: false, + jQuery: false, + _: false, + _V_: false, + afterEach: false, + beforeEach: false, + confirm: false, + context: false, + describe: false, + expect: false, + it: false, + jasmine: false, + JSHINT: false, + mostRecentAjaxRequest: false, + qq: false, + runs: false, + spyOn: false, + spyOnEvent: false, + waitsFor: false, + xdescribe: false + } + } + } + }, + jasmine : { + src : '<%= pkg.gruntConfig.temp.js %>', + options : { + specs : '<%= pkg.gruntConfig.spec %>', + vendor : ['<%= pkg.gruntConfig.js.jquery %>', '<%= pkg.gruntConfig.js.bindPolyfill %>'], + styles : ['<%= pkg.gruntConfig.css.bootstrap %>', '<%= pkg.gruntConfig.temp.css %>'], + template : '<%= pkg.gruntConfig.tpl.SpecRunner %>' + } + }, + template : { + 'generate-index-page' : { + options : { + data : { + js : { + modernizr : '<%= pkg.gruntConfig.js.modernizr %>', + jquery : '<%= pkg.gruntConfig.js.jquery %>', + slider : '<%= pkg.gruntConfig.temp.js %>' + }, + css : { + bootstrap : '<%= pkg.gruntConfig.css.bootstrap %>', + slider : '<%= pkg.gruntConfig.temp.css %>' + } + } + }, + files : { + 'index.html' : ['<%= pkg.gruntConfig.tpl.index %>'] + } + }, + 'generate-gh-pages' : { + options : { + data : { + js : { + modernizr : '<%= pkg.gruntConfig.js.modernizr %>', + jquery : '<%= pkg.gruntConfig.js.jquery %>', + slider : 'js/bootstrap-slider.js' + }, + css : { + bootstrap : '<%= pkg.gruntConfig.css.bootstrap %>', + slider : 'css/bootstrap-slider.css' + } + } + }, + files : { + 'index.html' : ['<%= pkg.gruntConfig.tpl.index %>'] + } + } + }, + watch: { + options: { + livereload: true + }, + js: { + files: '<%= pkg.gruntConfig.js.slider %>', + tasks: ['jshint:js', 'babel', 'jasmine'] + }, + gruntfile: { + files: '<%= jshint.gruntfile %>', + tasks: ['jshint:gruntfile'] + }, + spec: { + files: '<%= pkg.gruntConfig.spec %>', + tasks: ['jshint:spec', 'jasmine:src'] + }, + css: { + files: [ + '<%= pkg.gruntConfig.less.slider %>', + '<%= pkg.gruntConfig.less.rules %>', + '<%= pkg.gruntConfig.less.variables %>' + ], + tasks: ['less:development'] + }, + index: { + files: '<%= pkg.gruntConfig.tpl.index %>', + tasks: ['template:generate-index-page'] + } + }, + connect: { + server: { + options: { + port: "<%= pkg.gruntConfig.devPort %>" + } + } + }, + open : { + development : { + path: 'http://localhost:<%= connect.server.options.port %>' + } + }, + less: { + options: { + paths: ["bower_components/bootstrap/less"] + }, + development: { + files: { + '<%= pkg.gruntConfig.temp.css %>': '<%= pkg.gruntConfig.less.slider %>' + } + }, + production: { + files: { + '<%= pkg.gruntConfig.temp.css %>': '<%= pkg.gruntConfig.less.slider %>', + } + }, + "production-min": { + options: { + yuicompress: true + }, + files: { + '<%= pkg.gruntConfig.temp.cssMin %>': '<%= pkg.gruntConfig.less.slider %>' + } + } + }, + clean: { + dist: ["dist"], + temp: ["temp"] + }, + bump: { + options: { + files: bumpFiles, + updateConfigs: [], + commit: true, + commitMessage: 'Release v%VERSION%', + commitFiles: commitFiles, + createTag: true, + tagName: 'v%VERSION%', + tagMessage: 'Version %VERSION%', + push: false, + pushTo: 'origin' + } + } + }); + + // These plugins provide necessary tasks. + grunt.loadNpmTasks('grunt-contrib-uglify'); + grunt.loadNpmTasks('grunt-contrib-jshint'); + grunt.loadNpmTasks('grunt-contrib-jasmine'); + grunt.loadNpmTasks('grunt-contrib-watch'); + grunt.loadNpmTasks('grunt-contrib-connect'); + grunt.loadNpmTasks('grunt-contrib-clean'); + grunt.loadNpmTasks('grunt-contrib-less'); + grunt.loadNpmTasks('grunt-open'); + grunt.loadNpmTasks('grunt-template'); + grunt.loadNpmTasks('grunt-header'); + grunt.loadNpmTasks('grunt-bump'); + grunt.loadNpmTasks('grunt-babel'); + + // Create custom tasks + grunt.registerTask('append-header', ['header', 'clean:temp']); + grunt.registerTask('test', [ + 'jshint', + 'babel', + 'less:development', + 'jasmine', + 'clean:temp' + ]); + grunt.registerTask('build', [ + 'less:development', + 'test', + 'template:generate-index-page' + ]); + grunt.registerTask('build-gh-pages', [ + 'less:development', + 'babel', + 'template:generate-gh-pages' + ]); + grunt.registerTask('dist', [ + 'clean:dist', + 'less:production', + 'less:production-min', + 'babel', + 'uglify', + 'append-header' + ]); + grunt.registerTask('development', [ + 'less:development', + 'babel', + 'template:generate-index-page', + 'connect', + 'open:development', + 'watch' + ]); + grunt.registerTask('production', ['test', 'dist']); + grunt.registerTask('dev', 'development'); + grunt.registerTask('prod', 'production'); + grunt.registerTask('default', ['build']); + +}; // End of module diff --git a/public/bower_components/seiyria-bootstrap-slider/LICENSE.md b/public/bower_components/seiyria-bootstrap-slider/LICENSE.md new file mode 100755 index 0000000..c680511 --- /dev/null +++ b/public/bower_components/seiyria-bootstrap-slider/LICENSE.md @@ -0,0 +1,24 @@ +---------------------------------------------------------------------- +bootstrap-slider is released under the MIT License +Copyright (c) 2015-2016 Kyle Kemp, Rohit Kalkur, and contributors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/public/bower_components/seiyria-bootstrap-slider/README.md b/public/bower_components/seiyria-bootstrap-slider/README.md new file mode 100755 index 0000000..b60743d --- /dev/null +++ b/public/bower_components/seiyria-bootstrap-slider/README.md @@ -0,0 +1,295 @@ +bootstrap-slider [![Build Status](https://travis-ci.org/seiyria/bootstrap-slider.png?branch=master)](https://travis-ci.org/seiyria/bootstrap-slider) +================ +Originally began as a loose "fork" of bootstrap-slider found on http://www.eyecon.ro/ by Stefan Petre. + +Over time, this project has diverged sigfinicantly from Stefan Petre's version and is now almost completly different. + +__Please ensure that you are using this library instead of the Petre version before creating issues in the repository Issue tracker!!__ + +Installation +============ +Want to use bower? `bower install seiyria-bootstrap-slider` + +Want to use npm? `npm install bootstrap-slider` + +Want to get it from a CDN? https://cdnjs.com/libraries/bootstrap-slider + +Basic Setup +============ +Load the plugin CSS and JavaScript into your web page, and everything should work! + +Remember to load the plugin code after loading the Bootstrap CSS and JQuery. + +__JQuery is optional and the plugin can operate with or without it.__ + +Look below to see an example of how to interact with the non-JQuery interface. + +Supported Browsers +======== +__We only support modern browsers!!! Basically, anything below IE9 is not compatible with this plugin!__ + +Examples +======== +You can see all of our API examples [here](http://seiyria.github.io/bootstrap-slider/). + +Using bootstrap-slider (with JQuery) +====================== + +### Using `.slider` namespace +Create an input element and call .slider() on it: + +```js +// Instantiate a slider +var mySlider = $("input.slider").slider(); + +// Call a method on the slider +var value = mySlider.slider('getValue'); + +// For non-getter methods, you can chain together commands + mySlider + .slider('setValue', 5) + .slider('setValue', 7); +``` + +### Using `.bootstrapSlider` namespace +Create an input element and call .bootstrapSlider() on it: + +```js +// Instantiate a slider +var mySlider = $("input.slider").bootstrapSlider(); + +// Call a method on the slider +var value = mySlider.bootstrapSlider('getValue'); + +// For non-getter methods, you can chain together commands + mySlider + .bootstrapSlider('setValue', 5) + .bootstrapSlider('setValue', 7); +``` + +Using bootstrap-slider (via `data-provide`-API) +====================== + +Create an input element with the `data-provide="slider"` attribute automatically +turns it into a slider. Options can be supplied via `data-slider-` attributes. + +```html + +``` + +What if there is already a _slider_ plugin bound to the JQuery namespace? +====================== + +If there is already a JQuery plugin named _slider_ bound to the JQuery namespace, then this plugin will emit a console warning telling you this namespace has already been taken and will encourage you to use the alternate namespace _bootstrapSlider_ instead. + +```js +// Instantiate a slider +var mySlider = $("input.slider").bootstrapSlider(); + +// Call a method on the slider +var value = mySlider.bootstrapSlider('getValue'); + +// For non-getter methods, you can chain together commands + mySlider + .bootstrapSlider('setValue', 5) + .bootstrapSlider('setValue', 7); +``` + +Using bootstrap-slider (without JQuery) +====================== + +Create an input element in the DOM, and then create an instance of Slider, passing it a selector string referencing the input element. + +```js +// Instantiate a slider +var mySlider = new Slider("input.slider", { + // initial options object +}); + +// Call a method on the slider +var value = mySlider.getValue(); + +// For non-getter methods, you can chain together commands +mySlider + .setValue(5) + .setValue(7); +``` + +Using as CommonJS module +======= +bootstrap-slider can be loaded as a CommonJS module via [Browserify](https://github.com/substack/node-browserify), [Webpack](https://github.com/webpack/webpack), or some other build tool. + +```js +var Slider = require("bootstrap-slider"); + +var mySlider = new Slider(); +``` + +How do I exclude the optional JQuery dependency from my build? +======= +### Browserify +__Note that the JQuery dependency is considered to be optional.__ For example, to exclude JQuery from being part of your Browserify build, you would call something like the following (assuming `main.js` is requiring bootstrap-slider as a dependency): + +```BASH +browserify -u jquery main.js > bundle.js +``` +### Webpack +To exclude JQuery from your Webpack build, you will have to go into the Webpack config file for your specific project and add something like the following to your `resolve.alias` section: + +```js +resolve: { + alias: { + "jquery": path.join(__dirname, "./jquery-stub.js"); + } +} +``` + +Then in your project, you will have to create a stub module for jquery that exports a `null` value. Whenever `require("jquery")` is mentioned in your project, it will load this stubbed module. + +```js +// Path: ./jquery-stub.js +module.exports = null; +``` + +### Other +Please see the documentation for the specific module loader you are using to find out how to exclude dependencies. + +Options +======= +Options can be passed either as a data (data-slider-foo) attribute, or as part of an object in the slider call. The only exception here is the formatter argument - that can not be passed as a data- attribute. + + +| Name | Type | Default | Description | +| ---- |:----:|:-------:|:----------- | +| id | string | '' | set the id of the slider element when it's created | +| min | float | 0 | minimum possible value | +| max | float | 10 | maximum possible value | +| step | float | 1 | increment step | +| precision | float | number of digits after the decimal of _step_ value | The number of digits shown after the decimal. Defaults to the number of digits after the decimal of _step_ value. | +| orientation | string | 'horizontal' | set the orientation. Accepts 'vertical' or 'horizontal' | +| value | float,array | 5 | initial value. Use array to have a range slider. | +| range | bool | false | make range slider. Optional if initial value is an array. If initial value is scalar, max will be used for second value. | +| selection | string | 'before' | selection placement. Accepts: 'before', 'after' or 'none'. In case of a range slider, the selection will be placed between the handles | +| tooltip | string | 'show' | whether to show the tooltip on drag, hide the tooltip, or always show the tooltip. Accepts: 'show', 'hide', or 'always' | +| tooltip_split | bool | false | if false show one tootip if true show two tooltips one for each handler | +| tooltip_position | string | null | Position of tooltip, relative to slider. Accepts 'top'/'bottom' for horizontal sliders and 'left'/'right' for vertically orientated sliders. Default positions are 'top' for horizontal and 'right' for vertical slider. | +| handle | string | 'round' | handle shape. Accepts: 'round', 'square', 'triangle' or 'custom' | +| reversed | bool | false | whether or not the slider should be reversed | +| enabled | bool | true | whether or not the slider is initially enabled | +| formatter | function | returns the plain value | formatter callback. Return the value wanted to be displayed in the tooltip | +| natural_arrow_keys | bool | false | The natural order is used for the arrow keys. Arrow up select the upper slider value for vertical sliders, arrow right the righter slider value for a horizontal slider - no matter if the slider was reversed or not. By default the arrow keys are oriented by arrow up/right to the higher slider value, arrow down/left to the lower slider value. | +| ticks | array | [ ] | Used to define the values of ticks. Tick marks are indicators to denote special values in the range. This option overwrites min and max options. | +| ticks_positions | array | [ ] | Defines the positions of the tick values in percentages. The first value should always be 0, the last value should always be 100 percent. | +| ticks_labels | array | [ ] | Defines the labels below the tick marks. Accepts HTML input. | +| ticks_snap_bounds | float | 0 | Used to define the snap bounds of a tick. Snaps to the tick if value is within these bounds. | +| scale | string | 'linear' | Set to 'logarithmic' to use a logarithmic scale. | +| focus | bool | false | Focus the appropriate slider handle after a value change. | +| labelledby | string,array | null | ARIA labels for the slider handle's, Use array for multiple values in a range slider. | + +Functions +========= +__NOTE:__ Optional parameters are italicized. + +| Function | Parameters | Description | +| -------- | ----------- | ----------- | +| getValue | --- | Get the current value from the slider | +| setValue | newValue, _triggerSlideEvent_, _triggerChangeEvent_ | Set a new value for the slider. If optional triggerSlideEvent parameter is _true_, 'slide' events will be triggered. If optional triggerChangeEvent parameter is _true_, 'change' events will be triggered. This function takes `newValue` as either a `Number` or `Array`.| +| getElement | --- | Get the div slider element | +| destroy | --- | Properly clean up and remove the slider instance | +| disable | ---| Disables the slider and prevents the user from changing the value | +| enable | --- | Enables the slider | +| toggle | --- | Toggles the slider between enabled and disabled | +| isEnabled | --- |Returns true if enabled, false if disabled | +| setAttribute | attribute, value | Updates the slider's [attributes](#options) | +| getAttribute | attribute | Get the slider's [attributes](#options) | +| refresh | --- | Refreshes the current slider | +| on | eventType, callback | When the slider event _eventType_ is triggered, the callback function will be invoked | +| off | eventType, callback | Removes the callback function from the slider event _eventType_ | +| relayout | --- | Renders the tooltip again, after initialization. Useful in situations when the slider and tooltip are initially hidden. | + +Events +====== +| Event | Description | Value | +| ----- | ----------- | ----- | +| slide | This event fires when the slider is dragged | The new slider value | +| slideStart | This event fires when dragging starts | The new slider value | +| slideStop | This event fires when the dragging stops or has been clicked on | The new slider value | +| change | This event fires when the slider value has changed | An object with 2 properties: "oldValue" and "newValue" | +| slideEnabled | This event fires when the slider is enabled | N/A | +| slideDisabled | This event fires when the slider is disabled | N/A | + + +How Do I Run This Locally? +====== +- Clone the repository +- Run `nvm use` in your Terminal to switch to the proper Node/NPM version +- Once you are on specified Node version, run `npm install` +- Install the Grunt CLI: `npm install grunt-cli -g` +- Type `grunt dev` to launch browser window with Examples page + +Grunt Tasks +====== +This plugin uses Grunt as its command-line task runner. + +To install the Grunt CLI, type `npm install grunt-cli -g`. + +To execute any of the commands, type `grunt ` in your terminal instance. + +The following is a list of the commonly-used command line tasks: + +* `grunt development`: Generates the `index.html`, compiles the LESS/JS to the `/temp` directory, and launches the index.html in your system's default browser. As changes are made to source code, the + browser window will auto-refresh. +* `grunt production`: Generates the `/dist` directory with minified and unminified assetts. +* `grunt dev`: Alias for `grunt development` +* `grunt prod`: Alias for `grunt production` +* `grunt build`: Transpiles JavaScript source via Babel and compiles LESS source to CSS to `temp` directory. +* `grunt lint`: Runs JSLint on the JavaScript source code. +* `grunt test`: Runs unit tests contained in `/test` directory via Jasmine. + + +Version Bumping and Publishing (Maintainers Only) +======= +To do the following release tasks: +* bump the version +* publish a new version to NPM +* update the `gh-pages` branch +* push a new `dist` bundle to the `master` branch on the remote `origin` +* push new tags to the remote `origin` + +Type the following command: + +`npm run release ` + +If you do not specify a version bump type, the script will automatically defer to a patch bump. + + +Other Platforms & Libraries +=========================== +- [Ruby on Rails](https://github.com/YourCursus/bootstrap-slider-rails) +- [knockout.js](https://github.com/cosminstefanxp/bootstrap-slider-knockout-binding) ([@cosminstefanxp](https://github.com/cosminstefanxp), [#81](https://github.com/seiyria/bootstrap-slider/issues/81)) +- [AngularJS](https://github.com/seiyria/angular-bootstrap-slider) +- [EmberJS](https://github.com/lifegadget/ui-slider) ([@ksnyde](https://github.com/ksnyde)) +- [ReactJS](https://github.com/brownieboy/react.bootstrap.slidertest) +- [NuGet](https://www.nuget.org/packages/bootstrap-slider/) ([@ChrisMissal](https://github.com/ChrisMissal)) +- [MeteorJS](https://github.com/kidovate/meteor-bootstrap-slider) +- [Maven](http://mvnrepository.com/artifact/org.webjars.bower/seiyria-bootstrap-slider) + +Maintainers +============ +- Kyle Kemp + * Twitter: [@seiyria](https://twitter.com/seiyria) + * Github: [seiyria](https://github.com/seiyria) +- Rohit Kalkur + * Twitter: [@Rovolutionary](https://twitter.com/Rovolutionary) + * Github: [rovolution](https://github.com/rovolution) diff --git a/public/bower_components/seiyria-bootstrap-slider/bower.json b/public/bower_components/seiyria-bootstrap-slider/bower.json new file mode 100755 index 0000000..a4b6896 --- /dev/null +++ b/public/bower_components/seiyria-bootstrap-slider/bower.json @@ -0,0 +1,26 @@ +{ + "name": "seiyria-bootstrap-slider", + "version": "9.1.1", + "homepage": "https://github.com/seiyria/bootstrap-slider", + "authors": [ + "Kyle Kemp ", + "Rohit Kalkur " + ], + "description": "a slider element for bootstrap 2/3", + "main": [ + "dist/bootstrap-slider.js", + "dist/css/bootstrap-slider.css" + ], + "keywords": [ + "slider", + "bootstrap2", + "bootstrap3", + "bootstrap" + ], + "license": "MIT", + "ignore": [ + "**/.*", + "node_modules", + "bower_components" + ] +} diff --git a/public/bower_components/seiyria-bootstrap-slider/composer.json b/public/bower_components/seiyria-bootstrap-slider/composer.json new file mode 100755 index 0000000..aa7bc07 --- /dev/null +++ b/public/bower_components/seiyria-bootstrap-slider/composer.json @@ -0,0 +1,30 @@ +{ + "name": "seiyria/bootstrap-slider", + "type": "library", + "version": "9.1.1", + "description": "A less buggy fork of the original bootstrap slider found on http://www.eyecon.ro/ by Stefan Petre. It was forked so we could update the slider since the original wasn't under version control.", + "keywords": ["slider", "css", "bootstrap", "javascript"], + "homepage": "https://github.com/seiyria/bootstrap-slider", + "require": {}, + "license": "Apache 2.0", + "authors": [ + { + "name": "Kyle Kemp", + "email": "kyle@seiyria.com", + "homepage": "http://seiyria.com", + "role": "Developer" + }, + { + "name": "Rohit Kalkur", + "email": "rohit.kalkur@gmail.com", + "homepage": "http://www.rovolutionary.com", + "role": "Developer" + }, + { + "name": "Lucas Zardo", + "email": "lucas@deliverymuch.com.br", + "homepage": "https://deliverymuch.com.br", + "role": "Packagist Editor" + } + ] +} \ No newline at end of file diff --git a/public/bower_components/seiyria-bootstrap-slider/dependencies/css/bootstrap.min.css b/public/bower_components/seiyria-bootstrap-slider/dependencies/css/bootstrap.min.css new file mode 100755 index 0000000..a9f35ce --- /dev/null +++ b/public/bower_components/seiyria-bootstrap-slider/dependencies/css/bootstrap.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.2.0 (http://getbootstrap.com) + * Copyright 2011-2014 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,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:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}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{padding:0;border: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-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!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^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.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:"\2a"}.glyphicon-plus:before{content:"\2b"}.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"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;width:100% \9;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;width:100% \9;max-width:100%;height:auto;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}.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}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,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.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,.h4,h5,.h5,h6,.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%}cite{font-style:normal}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:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.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 p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small: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 footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}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%;-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}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}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}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{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}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;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,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.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:#777;opacity:1}.form-control:-ms-input-placeholder{color:#777}.form-control::-webkit-input-placeholder{color:#777}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px;line-height:1.42857143 \0}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;min-height:20px;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-top:4px \9;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio].disabled,input[type=checkbox].disabled,fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top: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,.form-horizontal .form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg,.form-horizontal .form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:25px;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{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 .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{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 .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{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.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 .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{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{top:0;right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{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{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{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:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{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:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{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:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{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=submit].btn-block,input[type=reset].btn-block,input[type=button].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:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;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:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{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 solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@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>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.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-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>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-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-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-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=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{position:absolute;z-index:-1;filter:alpha(opacity=0);opacity:0}.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-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.33;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}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height: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}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding: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=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-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:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-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:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{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:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.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:hover,.nav-tabs>li.active>a:focus{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:hover,.nav-tabs.nav-justified>.active>a:focus{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:hover,.nav-tabs.nav-justified>.active>a:focus{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:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.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:hover,.nav-tabs-justified>.active>a:focus{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:hover,.nav-tabs-justified>.active>a:focus{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;-webkit-overflow-scrolling:touch;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)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@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-top:8px;margin-right:15px;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>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;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)}@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 .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@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-form.navbar-right:last-child{margin-right:-15px}}.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{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}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{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:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{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-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{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:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#777}.navbar-inverse .navbar-nav>li>a{color:#777}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{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-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{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:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#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:#428bca;text-decoration:none;background-color:#fff;border:1px solid #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>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{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}.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}.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:hover,.pager li>a:focus{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:hover,.pager .disabled>a:focus,.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:hover,a.label:focus{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]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{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:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding: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{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .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:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.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:#428bca;-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-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar[aria-valuenow="1"],.progress-bar[aria-valuenow="2"]{min-width:30px}.progress-bar[aria-valuenow="0"]{min-width:30px;color:#777;background-color:transparent;background-image:none;-webkit-box-shadow:none;box-shadow:none}.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,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.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>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{color:#777;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{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>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{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.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{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{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>.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:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#428bca}.panel-primary>.panel-heading .badge{color:#428bca;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#428bca}.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 iframe,.embed-responsive embed,.embed-responsive object{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.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:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.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-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate3d(0,-25%,0);-o-transform:translate3d(0,-25%,0);transform:translate3d(0,-25%,0)}.modal.in .modal-dialog{-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.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{min-height:16.43px;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-size:12px;line-height:1.4;visibility:visible;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-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;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;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;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-title{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{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}.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>img,.carousel-inner>.item>a>img{line-height:1}.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);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:hover,.carousel-control:focus{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;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-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{display:table;content:" "}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer: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;visibility:hidden!important}.affix{position:fixed;-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/public/bower_components/seiyria-bootstrap-slider/dependencies/js/jquery.min.js b/public/bower_components/seiyria-bootstrap-slider/dependencies/js/jquery.min.js new file mode 100755 index 0000000..c4643af --- /dev/null +++ b/public/bower_components/seiyria-bootstrap-slider/dependencies/js/jquery.min.js @@ -0,0 +1,5 @@ +/*! jQuery v2.1.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.1",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),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("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="
      ",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+Math.random()}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b) +},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,bb=/<([\w:]+)/,cb=/<|&#?\w+;/,db=/<(?:script|style|link)/i,eb=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/^$|\/(?:java|ecma)script/i,gb=/^true\/(.*)/,hb=/^\s*\s*$/g,ib={option:[1,""],thead:[1,"","
      "],col:[2,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],_default:[0,"",""]};ib.optgroup=ib.option,ib.tbody=ib.tfoot=ib.colgroup=ib.caption=ib.thead,ib.th=ib.td;function jb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=ob(h),f=ob(a),d=0,e=f.length;e>d;d++)pb(f[d],g[d]);if(b)if(c)for(f=f||ob(a),g=g||ob(h),d=0,e=f.length;e>d;d++)nb(f[d],g[d]);else nb(a,h);return g=ob(h,"script"),g.length>0&&mb(g,!i&&ob(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(cb.test(e)){f=f||k.appendChild(b.createElement("div")),g=(bb.exec(e)||["",""])[1].toLowerCase(),h=ib[g]||ib._default,f.innerHTML=h[1]+e.replace(ab,"<$1>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=ob(k.appendChild(e),"script"),i&&mb(f),c)){j=0;while(e=f[j++])fb.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(ob(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&mb(ob(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(ob(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!db.test(a)&&!ib[(bb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ab,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ob(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(ob(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&eb.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(ob(c,"script"),kb),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,ob(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,lb),j=0;g>j;j++)h=f[j],fb.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(hb,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qb,rb={};function sb(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function tb(a){var b=l,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(qb||n("";n+="
      ";VMM.attachElement("#"+e.uid,n)},createAPIMap:function(e){function d(e){if(e in VMM.ExternalAPI.googlemaps.map_providers){t=VMM.ExternalAPI.googlemaps.map_attribution[VMM.ExternalAPI.googlemaps.map_providers[e].attribution];return VMM.ExternalAPI.googlemaps.map_providers[e]}if(VMM.ExternalAPI.googlemaps.defaultType(e)){trace("GOOGLE MAP DEFAULT TYPE");return google.maps.MapTypeId[e.toUpperCase()]}trace("Not a maptype: "+e)}function g(){var t=new google.maps.Geocoder,n=VMM.Util.getUrlVars(e.id).q,i;if(n.match("loc:")){var s=n.split(":")[1].split("+");u=new google.maps.LatLng(parseFloat(s[0]),parseFloat(s[1]));l=!0}t.geocode({address:n},function(e,t){if(t==google.maps.GeocoderStatus.OK){i=new google.maps.Marker({map:r,position:e[0].geometry.location});typeof e[0].geometry.viewport!="undefined"?r.fitBounds(e[0].geometry.viewport):typeof e[0].geometry.bounds!="undefined"?r.fitBounds(e[0].geometry.bounds):r.setCenter(e[0].geometry.location);l&&r.panTo(u);c&&r.setZoom(f)}else{trace("Geocode for "+n+" was not successful for the following reason: "+t);trace("TRYING PLACES SEARCH");l&&r.panTo(u);c&&r.setZoom(f);y()}})}function y(){function h(t,i){if(i==google.maps.places.PlacesServiceStatus.OK){for(var s=0;s=1){r.panTo(t[0].geometry.location);c&&r.setZoom(f)}}else{trace("Place search for "+n.query+" was not successful for the following reason: "+i);trace("YOU MAY NEED A GOOGLE MAPS API KEY IN ORDER TO USE THIS FEATURE OF TIMELINEJS");trace("FIND OUT HOW TO GET YOUR KEY HERE: https://developers.google.com/places/documentation/#Authentication");if(l){r.panTo(u);c&&r.setZoom(f)}else{trace("USING SIMPLE IFRAME MAP EMBED");e.id[0].match("https")&&(e.id=e.url[0].replace("https","http"));VMM.ExternalAPI.googlemaps.createiFrameMap(e)}}}function p(e){var t,n;n=e.geometry.location;t=new google.maps.Marker({map:r,position:e.geometry.location});google.maps.event.addListener(t,"click",function(){i.setContent(e.name);i.open(r,this)})}var t,n,i,s,o,a;place_search=new google.maps.places.PlacesService(r);i=new google.maps.InfoWindow;n={query:"",types:["country","neighborhood","political","locality","geocode"]};type.of(VMM.Util.getUrlVars(e.id)["q"])=="string"&&(n.query=VMM.Util.getUrlVars(e.id).q);if(l){n.location=u;n.radius="15000"}else{o=new google.maps.LatLng(-89.999999,-179.999999);a=new google.maps.LatLng(89.999999,179.999999);s=new google.maps.LatLngBounds(o,a)}place_search.textSearch(n,h)}function b(){var t,n,i=!1;trace("LOADING PLACES API FOR GOOGLE MAPS");if(VMM.ExternalAPI.keys.google!=""){t=VMM.ExternalAPI.keys.google;i=!0}else{trace("YOU NEED A GOOGLE MAPS API KEY IN ORDER TO USE THIS FEATURE OF TIMELINEJS");trace("FIND OUT HOW TO GET YOUR KEY HERE: https://developers.google.com/places/documentation/#Authentication")}n="https://maps.googleapis.com/maps/api/place/textsearch/json?key="+t+"&sensor=false&language="+e.lang+"&";type.of(VMM.Util.getUrlVars(e.id)["q"])=="string"&&(n+="query="+VMM.Util.getUrlVars(e.id).q);l&&(n+="&location="+u);if(i)VMM.getJSON(n,function(t){trace("PLACES JSON");var n="",i="",s="",o="";trace(t);if(t.status=="OVER_QUERY_LIMIT"){trace("OVER_QUERY_LIMIT");if(l){r.panTo(u);c&&r.setZoom(f)}else{trace("DOING TRADITIONAL MAP IFRAME EMBED UNTIL QUERY LIMIT RESTORED");h=!0;VMM.ExternalAPI.googlemaps.createiFrameMap(e)}}else{if(t.results.length>=1){s=new google.maps.LatLng(parseFloat(t.results[0].geometry.viewport.northeast.lat),parseFloat(t.results[0].geometry.viewport.northeast.lng));o=new google.maps.LatLng(parseFloat(t.results[0].geometry.viewport.southwest.lat),parseFloat(t.results[0].geometry.viewport.southwest.lng));i=new google.maps.LatLngBounds(o,s);r.fitBounds(i)}else trace("NO RESULTS");l&&r.panTo(u);c&&r.setZoom(f)}}).error(function(e,t,n){trace("PLACES JSON ERROR");trace("PLACES JSON ERROR: "+t+" "+e.responseText)}).success(function(e){trace("PLACES JSON SUCCESS")});else if(l){r.panTo(u);c&&r.setZoom(f)}else{trace("DOING TRADITIONAL MAP IFRAME EMBED BECAUSE NO GOOGLE MAP API KEY WAS PROVIDED");VMM.ExternalAPI.googlemaps.createiFrameMap(e)}}function w(){var t,n,i,s;t=e.id+"&output=kml";t=t.replace("&output=embed","");n=new google.maps.KmlLayer(t,{preserveViewport:!0});i=new google.maps.InfoWindow;n.setMap(r);google.maps.event.addListenerOnce(n,"defaultviewport_changed",function(){l?r.panTo(u):r.fitBounds(n.getDefaultViewport());c&&r.setZoom(f)});google.maps.event.addListener(n,"click",function(e){function t(e){i.setContent(e);i.open(r)}s=e.featureData.description;t(s)})}var t="",n,r,i,s=e.uid.toString()+"_gmap",o="",u=new google.maps.LatLng(41.875696,-87.624207),a,f=11,l=!1,c=!1,h=!1,p;google.maps.VeriteMapType=function(e){if(VMM.ExternalAPI.googlemaps.defaultType(e))return google.maps.MapTypeId[e.toUpperCase()];var t=d(e);return google.maps.ImageMapType.call(this,{getTileUrl:function(e,n){var r=(n+e.x+e.y)%VMM.ExternalAPI.googlemaps.map_subdomains.length,i=t.url.replace("{S}",VMM.ExternalAPI.googlemaps.map_subdomains[r]).replace("{Z}",n).replace("{X}",e.x).replace("{Y}",e.y).replace("{z}",n).replace("{x}",e.x).replace("{y}",e.y);return i},tileSize:new google.maps.Size(256,256),name:e,minZoom:t.minZoom,maxZoom:t.maxZoom})};google.maps.VeriteMapType.prototype=new google.maps.ImageMapType("_");VMM.ExternalAPI.googlemaps.maptype!=""?VMM.ExternalAPI.googlemaps.defaultType(VMM.ExternalAPI.googlemaps.maptype)?n=google.maps.MapTypeId[VMM.ExternalAPI.googlemaps.maptype.toUpperCase()]:n=VMM.ExternalAPI.googlemaps.maptype:n=google.maps.MapTypeId.TERRAIN;var v=new RegExp(/@([0-9\.\-]+),([0-9\.\-]+),(\d+)z/);if(e.id.match(v)){var m=e.id.match(v);lat=parseFloat(m[1]);lng=parseFloat(m[2]);u=new google.maps.LatLng(lat,lng);f=parseFloat(m[3]);l=c=!0}else{if(type.of(VMM.Util.getUrlVars(e.id)["ll"])=="string"){l=!0;a=VMM.Util.getUrlVars(e.id).ll.split(",");u=new google.maps.LatLng(parseFloat(a[0]),parseFloat(a[1]))}else if(type.of(VMM.Util.getUrlVars(e.id)["sll"])=="string"){a=VMM.Util.getUrlVars(e.id).sll.split(",");u=new google.maps.LatLng(parseFloat(a[0]),parseFloat(a[1]))}if(type.of(VMM.Util.getUrlVars(e.id)["z"])=="string"){c=!0;f=parseFloat(VMM.Util.getUrlVars(e.id).z)}}i={zoom:f,draggable:!1,disableDefaultUI:!0,mapTypeControl:!1,zoomControl:!0,zoomControlOptions:{style:google.maps.ZoomControlStyle.SMALL,position:google.maps.ControlPosition.TOP_RIGHT},center:u,mapTypeId:n,mapTypeControlOptions:{mapTypeIds:[n]}};VMM.attachElement("#"+e.uid,"
      ");r=new google.maps.Map(document.getElementById(s),i);if(!VMM.ExternalAPI.googlemaps.defaultType(VMM.ExternalAPI.googlemaps.maptype)){r.mapTypes.set(n,new google.maps.VeriteMapType(n));o="
      "+t+"
      ";VMM.appendElement("#"+s,o)}type.of(VMM.Util.getUrlVars(e.id)["msid"])=="string"?w():type.of(VMM.Util.getUrlVars(e.id)["q"])=="string"&&g()},pushQue:function(){for(var e=0;eStamen Design, under CC BY 3.0. Data by OpenStreetMap, under CC BY SA.",apple:"Map data © 2012 Apple, Imagery © 2012 Apple",osm:"© OpenStreetMap contributors"},map_providers:{toner:{url:"//{S}tile.stamen.com/toner/{Z}/{X}/{Y}.png",minZoom:0,maxZoom:20,attribution:"stamen"},"toner-lines":{url:"//{S}tile.stamen.com/toner-lines/{Z}/{X}/{Y}.png",minZoom:0,maxZoom:20,attribution:"stamen"},"toner-labels":{url:"//{S}tile.stamen.com/toner-labels/{Z}/{X}/{Y}.png",minZoom:0,maxZoom:20,attribution:"stamen"},sterrain:{url:"//{S}tile.stamen.com/terrain/{Z}/{X}/{Y}.jpg",minZoom:4,maxZoom:20,attribution:"stamen"},apple:{url:"//gsp2.apple.com/tile?api=1&style=slideshow&layers=default&lang=en_US&z={z}&x={x}&y={y}&v=9",minZoom:4,maxZoom:14,attribution:"apple"},watercolor:{url:"//{S}tile.stamen.com/watercolor/{Z}/{X}/{Y}.jpg",minZoom:3,maxZoom:16,attribution:"stamen"},osm:{url:"//tile.openstreetmap.org/{z}/{x}/{y}.png",minZoom:3,maxZoom:18,attribution:"osm"}}},googleplus:{get:function(e){var t,n={user:e.user,activity:e.id,id:e.uid};VMM.master_config.googleplus.que.push(n);VMM.master_config.googleplus.active=!0},create:function(e,t){var n="",r="",i="",s="",o="",u,a;googleplus_timeout=setTimeout(VMM.ExternalAPI.googleplus.errorTimeOut,VMM.master_config.timers.api,e),callback_timeout=setTimeout(t,VMM.master_config.timers.api,e);VMM.master_config.Timeline.api_keys.google!=""?r=VMM.master_config.Timeline.api_keys.google:r=Aes.Ctr.decrypt(VMM.master_config.api_keys_master.google,VMM.master_config.vp,256);u="https://www.googleapis.com/plus/v1/people/"+e.user+"/activities/public?alt=json&maxResults=100&fields=items(id,url)&key="+r;n="GOOGLE PLUS API CALL";VMM.getJSON(u,function(t){for(var u=0;u";s+=t.object.content}else s+=t.object.content;if(typeof t.object.attachments!="undefined"){for(var r=0;r"+""+o;else if(t.object.attachments[r].objectType=="video"){o=""+o;o+=""}else if(t.object.attachments[r].objectType=="article"){o+=""}trace(t.object.attachments[r])}o="
      "+o+"
      "}n="
      "+s+o+"
      ";n+="";VMM.attachElement("#googleplus_"+e.activity,n)});break}}}).error(function(t,n,r){var i=VMM.parseJSON(t.responseText);trace(i.error.message);VMM.attachElement("#googleplus_"+e.activity,VMM.MediaElement.loadingmessage("

      ERROR LOADING GOOGLE+

      "+i.error.message+"

      "))}).success(function(e){clearTimeout(googleplus_timeout);clearTimeout(callback_timeout);t()})},pushQue:function(){if(VMM.master_config.googleplus.que.length>0){VMM.ExternalAPI.googleplus.create(VMM.master_config.googleplus.que[0],VMM.ExternalAPI.googleplus.pushQue);VMM.Util.removeRange(VMM.master_config.googleplus.que,0)}},errorTimeOut:function(e){trace("GOOGLE+ JSON ERROR TIMEOUT "+e.activity);VMM.attachElement("#googleplus_"+e.activity,VMM.MediaElement.loadingmessage("

      Still waiting on GOOGLE+

      "+e.activity+"

      "))}},googledocs:{get:function(e){VMM.master_config.googledocs.que.push(e);VMM.master_config.googledocs.active=!0},create:function(e){var t="";e.id.match(/docs.google.com/i)?t="":t="";VMM.attachElement("#"+e.uid,t)},pushQue:function(){for(var e=0;e")}).error(function(e,t,n){trace("FLICKR error");trace("FLICKR ERROR: "+t+" "+e.responseText)}).success(function(e){clearTimeout(r);t()})},pushQue:function(){if(VMM.master_config.flickr.que.length>0){VMM.ExternalAPI.flickr.create(VMM.master_config.flickr.que[0],VMM.ExternalAPI.flickr.pushQue);VMM.Util.removeRange(VMM.master_config.flickr.que,0)}},sizes:function(e){var t="";e<=75?t="Thumbnail":e<=180?t="Small":e<=240?t="Small 320":e<=375?t="Medium":e<=480?t="Medium 640":e<=600?t="Large":t="Large";return t},getFlickrIdFromUrl:function(e){var t=e.indexOf("flickr.com/photos/");if(t==-1)return null;var n=t+"flickr.com/photos/".length,r=e.substr(n);if(r.indexOf("/")==-1)return null;r.indexOf("/")==0&&(r=r.substr(1));return r.split("/")[1]}},instagram:{get:function(e,t){return t?"//instagr.am/p/"+e.id+"/media/?size=t":"//instagr.am/p/"+e.id+"/media/?size="+VMM.ExternalAPI.instagram.sizes(VMM.master_config.sizes.api.height)},sizes:function(e){var t="";e<=150?t="t":e<=306?t="m":t="l";return t},isInstagramUrl:function(e){return e.match("instagr.am/p/")||e.match("instagram.com/p/")},getInstagramIdFromUrl:function(e){try{return e.split("/p/")[1].split("/")[0]}catch(t){trace("Invalid Instagram url: "+e);return null}}},soundcloud:{get:function(e){VMM.master_config.soundcloud.que.push(e);VMM.master_config.soundcloud.active=!0},create:function(e,t){var n="//soundcloud.com/oembed?url="+e.id+"&maxheight=168&format=js&callback=?";VMM.getJSON(n,function(n){VMM.attachElement("#"+e.uid,n.html);t()})},pushQue:function(){if(VMM.master_config.soundcloud.que.length>0){VMM.ExternalAPI.soundcloud.create(VMM.master_config.soundcloud.que[0],VMM.ExternalAPI.soundcloud.pushQue);VMM.Util.removeRange(VMM.master_config.soundcloud.que,0)}}},wikipedia:{get:function(e){VMM.master_config.wikipedia.que.push(e);VMM.master_config.wikipedia.active=!0},create:function(e,t){var n="//"+e.lang+".wikipedia.org/w/api.php?action=query&prop=extracts&redirects=&titles="+e.id+"&exintro=1&format=json&callback=?";callback_timeout=setTimeout(t,VMM.master_config.timers.api,e);if(VMM.Browser.browser=="Explorer"&&parseInt(VMM.Browser.version,10)>=7&&window.XDomainRequest){var r="

      "+e.url+"

      ";r+=""+VMM.master_config.language.messages.wikipedia+"";r+="

      Wikipedia entry unable to load using Internet Explorer 8 or below.

      ";VMM.attachElement("#"+e.uid,r)}VMM.getJSON(n,function(t){if(t.query){var n,r,i="",s="",o=1,u=[];n=VMM.Util.getObjectAttributeByIndex(t.query.pages,0).extract;r=VMM.Util.getObjectAttributeByIndex(t.query.pages,0).title;n.match("

      ")?u=n.split("

      "):u.push(n);for(var a=0;a"+u[a+1]);i="

      "+r+"

      ";i+=""+VMM.master_config.language.messages.wikipedia+"";i+=VMM.Util.linkify_wikipedia(s);n.match("REDIRECT")||VMM.attachElement("#"+e.uid,i)}}).error(function(n,r,i){trace("WIKIPEDIA error");trace("WIKIPEDIA ERROR: "+r+" "+n.responseText);trace(i);VMM.attachElement("#"+e.uid,VMM.MediaElement.loadingmessage("

      Wikipedia is not responding

      "));clearTimeout(callback_timeout);if(VMM.master_config.wikipedia.tries<4){trace("WIKIPEDIA ATTEMPT "+VMM.master_config.wikipedia.tries);trace(e);VMM.master_config.wikipedia.tries++;VMM.ExternalAPI.wikipedia.create(e,t)}else t()}).success(function(e){VMM.master_config.wikipedia.tries=0;clearTimeout(callback_timeout);t()})},pushQue:function(){if(VMM.master_config.wikipedia.que.length>0){trace("WIKIPEDIA PUSH QUE "+VMM.master_config.wikipedia.que.length);VMM.ExternalAPI.wikipedia.create(VMM.master_config.wikipedia.que[0],VMM.ExternalAPI.wikipedia.pushQue);VMM.Util.removeRange(VMM.master_config.wikipedia.que,0)}}},youtube:{get:function(e){var t="//gdata.youtube.com/feeds/api/videos/"+e.id+"?v=2&alt=jsonc&callback=?";VMM.master_config.youtube.que.push(e);VMM.master_config.youtube.active||VMM.master_config.youtube.api_loaded||LoadLib.js("//www.youtube.com/player_api",function(){trace("YouTube API Library Loaded")});VMM.getJSON(t,function(t){VMM.ExternalAPI.youtube.createThumb(t,e)})},create:function(e){if(typeof e.start!="undefined"){var t=e.start.toString(),n=0,r=0;if(t.match("m")){n=parseInt(t.split("m")[0],10);r=parseInt(t.split("m")[1].split("s")[0],10);e.start=n*60+r}else e.start=0}else e.start=0;var i={active:!1,player:{},name:e.uid,playing:!1,hd:!1};typeof e.hd!="undefined"&&(i.hd=!0);i.player[e.id]=new YT.Player(e.uid,{height:"390",width:"640",playerVars:{enablejsapi:1,color:"white",showinfo:0,theme:"light",start:e.start,rel:0},videoId:e.id,events:{onReady:VMM.ExternalAPI.youtube.onPlayerReady,onStateChange:VMM.ExternalAPI.youtube.onStateChange}});VMM.master_config.youtube.array.push(i)},createThumb:function(e,t){trace("CREATE THUMB");trace(e);trace(t);if(typeof e.data!="undefined"){var n="#"+t.uid+"_thumb";VMM.attachElement(n,"")}},pushQue:function(){for(var e=0;e")},createThumb:function(e,t){trace("VIMEO CREATE THUMB");var n="#"+t.uid+"_thumb";VMM.attachElement(n,"")},pushQue:function(){if(VMM.master_config.vimeo.que.length>0){VMM.ExternalAPI.vimeo.create(VMM.master_config.vimeo.que[0],VMM.ExternalAPI.vimeo.pushQue);VMM.Util.removeRange(VMM.master_config.vimeo.que,0)}}},vine:{get:function(e){VMM.master_config.vine.que.push(e);VMM.master_config.vine.active=!0},create:function(e,t){trace("VINE CREATE");var n="https://vine.co/v/"+e.id+"/embed/simple";VMM.attachElement("#"+e.uid,"")},pushQue:function(){if(VMM.master_config.vine.que.length>0){VMM.ExternalAPI.vine.create(VMM.master_config.vine.que[0],VMM.ExternalAPI.vine.pushQue);VMM.Util.removeRange(VMM.master_config.vine.que,0)}}},webthumb:{get:function(e,t){VMM.master_config.webthumb.que.push(e);VMM.master_config.webthumb.active=!0},sizes:function(e){var t="";e<=150?t="t":e<=306?t="m":t="l";return t},create:function(e){trace("WEB THUMB CREATE");var t="//api.pagepeeker.com/v2/thumbs.php?";url=e.id.replace("http://","");VMM.attachElement("#"+e.uid,"");VMM.attachElement("#"+e.uid+"_thumb","")},pushQue:function(){for(var e=0;e

      "+e+"

      "},thumbnail:function(e,t,n,r){var i=16,s=24,o="";t!=null&&t!=""&&(i=t);n!=null&&n!=""&&(s=n);r!=null&&r!=""&&(o=r);if(e.thumbnail!=null&&e.thumbnail!=""){trace("CUSTOM THUMB");a="
      ";return a}if(e.media!=null&&e.media!=""){var u=!0,a="",f=VMM.MediaType(e.media);if(f.type=="image"){a="
      ";return a}if(f.type=="flickr"){a="
      ";return a}if(f.type=="instagram"){a="
      ";return a}if(f.type=="youtube"){a="
      ";return a}if(f.type=="googledoc"){a="
      ";return a}if(f.type=="vimeo"){a="
      ";return a}if(f.type=="vine"){a="
      ";return a}if(f.type=="dailymotion"){a="
      ";return a}if(f.type=="twitter"){a="
      ";return a}if(f.type=="twitter-ready"){a="
      ";return a}if(f.type=="soundcloud"){a="
      ";return a}if(f.type=="google-map"){a="
      ";return a}if(f.type=="googleplus"){a="
      ";return a}if(f.type=="wikipedia"){a="
      ";return a}if(f.type=="storify"){a="
      ";return a}if(f.type=="quote"){a="
      ";return a}if(f.type=="iframe"){a="
      ";return a}if(f.type=="unknown"){f.id.match("blockquote")?a="
      ":a="
      ";return a}if(f.type=="website"){a="
      ";return a}a="
      ";return a}},create:function(e,t){var n=!1,r=VMM.MediaElement.loadingmessage(VMM.master_config.language.messages.loading+"...");if(e.media!=null&&e.media!=""){var i="",s="",o="",u="",a=!1,f;f=VMM.MediaType(e.media);f.uid=t;n=!0;e.credit!=null&&e.credit!=""&&(o="
      "+VMM.Util.linkify_with_twitter(e.credit,"_blank")+"
      ");e.caption!=null&&e.caption!=""&&(s="
      "+VMM.Util.linkify_with_twitter(e.caption,"_blank")+"
      ");if(f.type=="image"){f.id.match("https://")&&(f.id=f.id.replace("https://","http://"));i="
      "}else if(f.type=="flickr"){i="
      ";VMM.ExternalAPI.flickr.get(f)}else if(f.type=="instagram")i="
      ";else if(f.type=="googledoc"){i="
      "+r+"
      ";VMM.ExternalAPI.googledocs.get(f)}else if(f.type=="youtube"){i="
      "+r+"
      ";VMM.ExternalAPI.youtube.get(f)}else if(f.type=="vimeo"){i="
      "+r+"
      ";VMM.ExternalAPI.vimeo.get(f)}else if(f.type=="dailymotion")i="
      ";else if(f.type=="vine"){i="
      "+r+"
      ";VMM.ExternalAPI.vine.get(f)}else if(f.type=="twitter"){i="";a=!0;VMM.ExternalAPI.twitter.get(f)}else if(f.type=="twitter-ready"){a=!0;i=f.id}else if(f.type=="soundcloud"){i="
      "+r+"
      ";VMM.ExternalAPI.soundcloud.get(f)}else if(f.type=="google-map"){i="
      "+r+"
      ";VMM.ExternalAPI.googlemaps.get(f)}else if(f.type=="googleplus"){u="googleplus_"+f.id;i="
      "+r+"
      ";a=!0;VMM.ExternalAPI.googleplus.get(f)}else if(f.type=="wikipedia"){i="
      "+r+"
      ";a=!0;VMM.ExternalAPI.wikipedia.get(f)}else if(f.type=="storify"){a=!0;i="
      "+f.id+"
      "}else if(f.type=="iframe"){a=!0;i="
      "}else if(f.type=="quote"){a=!0;i="
      "+f.id+"
      "}else if(f.type=="unknown"){trace("NO KNOWN MEDIA TYPE FOUND TRYING TO JUST PLACE THE HTML");a=!0;i="
      "+VMM.Util.properQuotes(f.id)+"
      "}else if(f.type=="website"){i="
      "+r+"
      ";VMM.ExternalAPI.webthumb.get(f)}else{trace("NO KNOWN MEDIA TYPE FOUND");trace(f.type)}i="
      "+i+o+s+"
      ";return a?"
      "+i+"
      ":"
      "+i+"
      "}}}.init());typeof VMM!="undefined"&&typeof VMM.MediaType=="undefined"&&(VMM.MediaType=function(e){var t=e.replace(/^\s\s*/,"").replace(/\s\s*$/,""),n=!1,r={type:"unknown",id:"",start:0,hd:!1,link:"",lang:VMM.Language.lang,uniqueid:VMM.Util.unique_ID(6)};if(t.match("div class='twitter'")){r.type="twitter-ready";r.id=t;n=!0}else if(t.match("10){trace("SCROLLING Y");trace(Math.abs(e.pagey.start)-Math.abs(e.pagey.end))}if(Math.abs(r-e.left.start)>10){VMM.Lib.css(t,"left",r);n.preventDefault();n.stopPropagation()}}function d(t,n){var r={left:e.left.end,left_adjust:0,change:{x:0},time:((new Date).getTime()-e.time.start)*10,time_adjust:((new Date).getTime()-e.time.start)*10},o=3e3;e.touch&&(o=6e3);r.change.x=o*(Math.abs(e.pagex.end)-Math.abs(e.pagex.start));r.left_adjust=Math.round(r.change.x/r.time);r.left=Math.min(r.left+r.left_adjust);if(e.constraint)if(r.left>e.constraint.left){r.left=e.constraint.left;r.time>5e3&&(r.time=5e3)}else if(r.left5e3&&(r.time=5e3)}VMM.fireEvent(i,"DRAGUPDATE",[r]);s||r.time>0&&(e.touch?VMM.Lib.animate(t,r.time,"easeOutCirc",{left:r.left}):VMM.Lib.animate(t,r.time,e.ease,{left:r.left}))}function v(e){return parseInt(VMM.Lib.css(e,"left").substring(0,VMM.Lib.css(e,"left").length-2),10)}var e={element:"",element_move:"",constraint:"",sliding:!1,pagex:{start:0,end:0},pagey:{start:0,end:0},left:{start:0,end:0},time:{start:0,end:0},touch:!1,ease:"easeOutExpo"},t={down:"mousedown",up:"mouseup",leave:"mouseleave",move:"mousemove"},n={down:"mousedown",up:"mouseup",leave:"mouseleave",move:"mousemove"},r={down:"touchstart",up:"touchend",leave:"mouseleave",move:"touchmove"},i=this,s=!1;this.createPanel=function(i,u,a,f,l){e.element=i;e.element_move=u;l!=null&&l!=""&&(s=l);a!=null&&a!=""?e.constraint=a:e.constraint=!1;f?e.touch=f:e.touch=!1;trace("TOUCH"+e.touch);e.touch?t=r:t=n;o(e.element,e.element_move)};this.updateConstraint=function(t){trace("updateConstraint");e.constraint=t};this.cancelSlide=function(n){VMM.unbindEvent(e.element,l,t.move);return!0}});typeof VMM!="undefined"&&typeof VMM.Slider=="undefined"&&(VMM.Slider=function(e,t){function S(){trace("onConfigSet")}function x(e,t){var r=!0,i=!1;e!=null&&(r=e);t!=null&&(i=t);m=n.slider.width;n.slider.nav.height=VMM.Lib.height(E.prevBtnContainer);VMM.Browser.device=="mobile"||m<=640?n.slider.content.padding=10:n.slider.content.padding=n.slider.content.padding_default;n.slider.content.width=m-n.slider.content.padding*2;VMM.Lib.width(u,h.length*n.slider.content.width);i&&VMM.Lib.css(o,"left",h[v].leftpos());B();j();VMM.Lib.css(E.nextBtn,"left",m-n.slider.nav.width);VMM.Lib.height(E.prevBtn,n.slider.height);VMM.Lib.height(E.nextBtn,n.slider.height);VMM.Lib.css(E.nextBtnContainer,"top",n.slider.height/2-n.slider.nav.height/2+10);VMM.Lib.css(E.prevBtnContainer,"top",n.slider.height/2-n.slider.nav.height/2+10);VMM.Lib.height(s,n.slider.height);VMM.Lib.width(s,m);r&&I(v,"linear",1);v==0&&VMM.Lib.visible(E.prevBtn,!1)}function T(e,t){trace("DRAG FINISH");trace(t.left_adjust);trace(n.slider.width/2);if(t.left_adjust<0)if(Math.abs(t.left_adjust)>n.slider.width/2)if(v==h.length-1)q();else{I(v+1,"easeOutExpo");O()}else q();else if(Math.abs(t.left_adjust)>n.slider.width/2)if(v==0)q();else{I(v-1,"easeOutExpo");O()}else q()}function N(e){if(v==h.length-1)q();else{I(v+1);O()}}function C(e){if(v==0)q();else{I(v-1);O()}}function k(e){switch(e.keyCode){case 39:N(e);break;case 37:C(e)}}function L(e,t){if(p.length==0)for(var r=0;rs+n.slider_width/3?C():VMM.Lib.animate(o,n.duration,n.ease,{left:s})}else VMM.Lib.animate(o,n.duration,n.ease,{left:s});typeof t.top=="number"&&VMM.Lib.animate(o,n.duration,n.ease,{top:-t.top})}function A(e){z()}function O(){n.current_slide=v;VMM.fireEvent(w,"UPDATE")}function M(e){c=e}function _(e){var t=0;VMM.attachElement(u,"");h=[];for(t=0;th.length-1)){h[v+e].show();h[v+e].enqueue=!1}if(!(v-e<0)){h[v-e].show();h[v-e].enqueue=!1}}if(h.length>50)for(e=0;en.slider.height+20?h[e].css("display","block"):h[e].css("display","table")}}function j(){var e=0,t=0;for(t=0;t=h.length&&(l=!0);t!=null&&t!=""&&(a=t);r!=null&&r!=""&&(f=r);if(VMM.Browser.device=="mobile"){VMM.Lib.visible(E.prevBtn,!1);VMM.Lib.visible(E.nextBtn,!1)}else{if(p)VMM.Lib.visible(E.prevBtn,!1);else{VMM.Lib.visible(E.prevBtn,!0);d=VMM.Util.unlinkify(c[v-1].title);if(n.type=="timeline")if(typeof c[v-1].date=="undefined"){VMM.attachElement(E.prevDate,d);VMM.attachElement(E.prevTitle,"")}else{VMM.attachElement(E.prevDate,VMM.Date.prettyDate(c[v-1].startdate,!1,c[v-1].precisiondate));VMM.attachElement(E.prevTitle,d)}else VMM.attachElement(E.prevTitle,d)}if(l)VMM.Lib.visible(E.nextBtn,!1);else{VMM.Lib.visible(E.nextBtn,!0);d=VMM.Util.unlinkify(c[v+1].title);if(n.type=="timeline")if(typeof c[v+1].date=="undefined"){VMM.attachElement(E.nextDate,d);VMM.attachElement(E.nextTitle,"")}else{VMM.attachElement(E.nextDate,VMM.Date.prettyDate(c[v+1].startdate,!1,c[v+1].precisiondate));VMM.attachElement(E.nextTitle,d)}else VMM.attachElement(E.nextTitle,d)}}if(s)VMM.Lib.css(o,"left",-(m-n.slider.content.padding));else{VMM.Lib.stop(o);VMM.Lib.animate(o,f,a,{left:-(m-n.slider.content.padding)})}u&&VMM.fireEvent(w,"LOADED");if(h[v].height()>n.slider_height)VMM.Lib.css(".slider","overflow-y","scroll");else{VMM.Lib.css(w,"overflow-y","hidden");var g=0;try{g=VMM.Lib.prop(w,"scrollHeight");VMM.Lib.animate(w,f,a,{scrollTop:g-VMM.Lib.height(w)})}catch(y){g=VMM.Lib.height(w)}}D();VMM.fireEvent(i,"MESSAGE","TEST")}function q(){VMM.Lib.stop(o);VMM.Lib.animate(o,n.duration,"easeOutExpo",{left:-h[v].leftpos()+n.slider.content.padding})}function R(e,t,n){trace("showMessege "+t);VMM.attachElement(f,"

      "+t+"

      ")}function U(){VMM.Lib.animate(f,n.duration,n.ease,{opacity:0},z)}function z(){VMM.Lib.detach(f)}function W(){var e="
       
      ";E.nextBtn=VMM.appendAndGetElement(i,"
      ","nav-next");E.prevBtn=VMM.appendAndGetElement(i,"
      ","nav-previous");E.nextBtnContainer=VMM.appendAndGetElement(E.nextBtn,"
      ","nav-container",e);E.prevBtnContainer=VMM.appendAndGetElement(E.prevBtn,"
      ","nav-container",e);if(n.type=="timeline"){E.nextDate=VMM.appendAndGetElement(E.nextBtnContainer,"
      ","date","");E.prevDate=VMM.appendAndGetElement(E.prevBtnContainer,"
      ","date","")}E.nextTitle=VMM.appendAndGetElement(E.nextBtnContainer,"
      ","title","");E.prevTitle=VMM.appendAndGetElement(E.prevBtnContainer,"
      ","title","");VMM.bindEvent(".nav-next",N);VMM.bindEvent(".nav-previous",C);VMM.bindEvent(window,k,"keydown")}function X(){var e=3e3;VMM.attachElement(w,"");i=VMM.getElement(w);s=VMM.appendAndGetElement(i,"
      ","slider-container-mask");o=VMM.appendAndGetElement(s,"
      ","slider-container");u=VMM.appendAndGetElement(o,"
      ","slider-item-container");W();_(c);if(VMM.Browser.device=="tablet"||VMM.Browser.device=="mobile"){n.duration=500;e=1e3;a=new VMM.DragSlider;a.createPanel(i,o,"",n.touch,!0);VMM.bindEvent(a,T,"DRAGUPDATE");f=VMM.appendAndGetElement(s,"
      ","vco-feedback","");R(null,"Swipe to Navigate");VMM.Lib.height(f,n.slider.height);VMM.bindEvent(f,A);VMM.bindEvent(f,A,"touchend")}x(!1,!0);VMM.Lib.visible(E.prevBtn,!1);I(n.current_slide,"easeOutExpo",e,!0,!0);b=!0}var n,r,i,s,o,u,a,f,l={},c=[],h=[],p=[],d="",v=0,m=960,g={move:!1,x:10,y:0,off:0,dampen:48},y="",b=!1,w=e,E={nextBtn:"",prevBtn:"",nextDate:"",prevDate:"",nextTitle:"",prevTitle:""};typeof t!="undefined"?n=t:n={preload:4,current_slide:0,interval:10,something:0,width:720,height:400,ease:"easeInOutExpo",duration:1e3,timeline:!1,spacing:15,slider:{width:720,height:400,content:{width:720,height:400,padding:120,padding_default:120},nav:{width:100,height:200}}};this.ver="0.6";n.slider.width=n.width;n.slider.height=n.height;this.init=function(e){h=[];p=[];typeof e!="undefined"?this.setData(e):trace("WAITING ON DATA")};this.width=function(e){if(e==null||e=="")return n.slider.width;n.slider.width=e;x()};this.height=function(e){if(e==null||e=="")return n.slider.height;n.slider.height=e;x()};this.setData=function(e){if(typeof e!="undefined"){c=e;X()}else trace("NO DATA")};this.getData=function(){return c};this.setConfig=function(e){typeof e!="undefined"?n=e:trace("NO CONFIG DATA")};this.getConfig=function(){return n};this.setSize=function(e,t){e!=null&&(n.slider.width=e);t!=null&&(n.slider.height=t);b&&x()};this.active=function(){return b};this.getCurrentNumber=function(){return v};this.setSlide=function(e){I(e)}});typeof VMM.Slider!="undefined"&&(VMM.Slider.Slide=function(e,t){var n,r,i,s,o,u,a=e,f={},o="",l="",c=!1,h=!1,p=!1,d=!0,v=!1,m="slide_",g=0,y={pushque:"",render:"",relayout:"",remove:"",skinny:!1},b={pushque:500,render:100,relayout:100,remove:3e4};m+=a.uniqueid;this.enqueue=d;this.id=m;o=VMM.appendAndGetElement(t,"
      ","slider-item");if(typeof a.classname!="undefined"){trace("HAS CLASSNAME");VMM.Lib.addClass(o,a.classname)}else{trace("NO CLASSNAME");trace(a)}u={slide:"",text:"",media:"",media_element:"",layout:"content-container layout",has:{headline:!1,text:!1,media:!1}};this.show=function(e){d=!1;y.skinny=e;v=!1;clearTimeout(y.remove);if(!c)if(h){clearTimeout(y.relayout);y.relayout=setTimeout(S,b.relayout)}else w(e)};this.hide=function(){if(c&&!v){v=!0;clearTimeout(y.remove);y.remove=setTimeout(E,b.remove)}};this.clearTimers=function(){clearTimeout(y.relayout);clearTimeout(y.pushque);clearTimeout(y.render)};this.layout=function(e){c&&h&&x(e)};this.elem=function(){return o};this.position=function(){return VMM.Lib.position(o)};this.leftpos=function(e){if(typeof e=="undefined")return VMM.Lib.position(o).left;VMM.Lib.css(o,"left",e)};this.animate=function(e,t,n){VMM.Lib.animate(o,e,t,n)};this.css=function(e,t){VMM.Lib.css(o,e,t)};this.opacity=function(e){VMM.Lib.css(o,"opacity",e)};this.width=function(){return VMM.Lib.width(o)};this.height=function(){return VMM.Lib.height(o)};this.content_height=function(){var e=VMM.Lib.find(o,".content")[0];return e!="undefined"&&e!=null?VMM.Lib.height(e):0};var w=function(e){trace("RENDER "+m);c=!0;h=!0;y.skinny=e;T();clearTimeout(y.pushque);clearTimeout(y.render);y.pushque=setTimeout(VMM.ExternalAPI.pushQues,b.pushque)},E=function(){trace("REMOVE SLIDE TIMER FINISHED");c=!1;VMM.Lib.detach(r);VMM.Lib.detach(n)},S=function(){c=!0;x(y.skinny,!0)},x=function(e,t){if(u.has.text){if(e){if(!p||t){VMM.Lib.removeClass(i,"pad-left");VMM.Lib.detach(r);VMM.Lib.detach(n);VMM.Lib.append(i,r);VMM.Lib.append(i,n);p=!0}}else if(p||t){VMM.Lib.addClass(i,"pad-left");VMM.Lib.detach(r);VMM.Lib.detach(n);VMM.Lib.append(i,n);VMM.Lib.append(i,r);p=!1}}else if(t){if(u.has.headline){VMM.Lib.detach(r);VMM.Lib.append(i,r)}VMM.Lib.detach(n);VMM.Lib.append(i,n)}},T=function(){trace("BUILDSLIDE");s=VMM.appendAndGetElement(o,"
      ","content");i=VMM.appendAndGetElement(s,"
      ");if(a.startdate!=null&&a.startdate!=""&&type.of(a.startdate)=="date"&&a.type!="start"){var e=VMM.Date.prettyDate(a.startdate,!1,a.precisiondate),t=VMM.Date.prettyDate(a.enddate,!1,a.precisiondate),f="";a.tag!=null&&a.tag!=""&&(f=VMM.createElement("span",a.tag,"slide-tag"));e!=t?u.text+=VMM.createElement("h2",e+" — "+t+f,"date"):u.text+=VMM.createElement("h2",e+f,"date")}if(a.headline!=null&&a.headline!=""){u.has.headline=!0;a.type=="start"?u.text+=VMM.createElement("h2",VMM.Util.linkify_with_twitter(a.headline,"_blank"),"start"):u.text+=VMM.createElement("h3",VMM.Util.linkify_with_twitter(a.headline,"_blank"))}if(a.text!=null&&a.text!=""){u.has.text=!0;u.text+=VMM.createElement("p",VMM.Util.linkify_with_twitter(a.text,"_blank"))}if(u.has.text||u.has.headline){u.text=VMM.createElement("div",u.text,"container");r=VMM.appendAndGetElement(i,"
      ","text",VMM.TextElement.create(u.text))}a.needs_slug;if(a.asset!=null&&a.asset!=""&&a.asset.media!=null&&a.asset.media!=""){u.has.media=!0;n=VMM.appendAndGetElement(i,"
      ","media",VMM.MediaElement.create(a.asset,a.uniqueid))}u.has.text&&(u.layout+="-text");u.has.media&&(u.layout+="-media");if(u.has.text)if(y.skinny){VMM.Lib.addClass(i,u.layout);p=!0}else{VMM.Lib.addClass(i,u.layout);VMM.Lib.addClass(i,"pad-left");VMM.Lib.detach(r);VMM.Lib.append(i,r)}else VMM.Lib.addClass(i,u.layout)}});var Aes={};Aes.cipher=function(e,t){var n=4,r=t.length/n-1,i=[[],[],[],[]];for(var s=0;s<4*n;s++)i[s%4][Math.floor(s/4)]=e[s];i=Aes.addRoundKey(i,t,0,n);for(var o=1;o6&&o%n==4&&(s=Aes.subWord(s));for(var a=0;a<4;a++)i[o][a]=i[o-n][a]^s[a]}return i};Aes.subBytes=function(e,t){for(var n=0;n<4;n++)for(var r=0;r>>o*8&255;for(var o=0;o<2;o++)a[o+2]=h>>>o*8&255;for(var o=0;o<4;o++)a[o+4]=c>>>o*8&255;var p="";for(var o=0;o<8;o++)p+=String.fromCharCode(a[o]);var d=Aes.keyExpansion(u),v=Math.ceil(e.length/r),m=new Array(v);for(var g=0;g>>y*8&255;for(var y=0;y<4;y++)a[15-y-4]=g/4294967296>>>y*8;var b=Aes.cipher(a,d),w=g>>d*8&255;for(var d=0;d<4;d++)a[15-d-4]=(h+1)/4294967296-1>>>d*8&255;var v=Aes.cipher(a,f),m=new Array(e[h].length);for(var o=0;o0)while(h++<3){c+="=";p+="\0"}for(h=0;h>18&63;u=s>>12&63;a=s>>6&63;f=s&63;l[h/3]=v.charAt(o)+v.charAt(u)+v.charAt(a)+v.charAt(f)}d=l.join("");d=d.slice(0,d.length-c.length)+c;return d};Base64.decode=function(e,t){t=typeof t=="undefined"?!1:t;var n,r,i,s,o,u,a,f,l=[],c,h,p=Base64.code;h=t?e.decodeUTF8():e;for(var d=0;d>>16&255;r=f>>>8&255;i=f&255;l[d/4]=String.fromCharCode(n,r,i);a==64&&(l[d/4]=String.fromCharCode(n,r));u==64&&(l[d/4]=String.fromCharCode(n))}c=l.join("");return t?c.decodeUTF8():c};var Utf8={};Utf8.encode=function(e){var t=e.replace(/[\u0080-\u07ff]/g,function(e){var t=e.charCodeAt(0);return String.fromCharCode(192|t>>6,128|t&63)});t=t.replace(/[\u0800-\uffff]/g,function(e){var t=e.charCodeAt(0);return String.fromCharCode(224|t>>12,128|t>>6&63,128|t&63)});return t};Utf8.decode=function(e){var t=e.replace(/[\u00e0-\u00ef][\u0080-\u00bf][\u0080-\u00bf]/g,function(e){var t=(e.charCodeAt(0)&15)<<12|(e.charCodeAt(1)&63)<<6|e.charCodeAt(2)&63;return String.fromCharCode(t)});t=t.replace(/[\u00c0-\u00df][\u0080-\u00bf]/g,function(e){var t=(e.charCodeAt(0)&31)<<6|e.charCodeAt(1)&63;return String.fromCharCode(t)});return t};!function(e){"use strict";var t=function(e,t){this.init("tooltip",e,t)};t.prototype={constructor:t,init:function(t,n,r){var i,s;this.type=t;this.$element=e(n);this.options=this.getOptions(r);this.enabled=!0;if(this.options.trigger!="manual"){i=this.options.trigger=="hover"?"mouseenter":"focus";s=this.options.trigger=="hover"?"mouseleave":"blur";this.$element.on(i,this.options.selector,e.proxy(this.enter,this));this.$element.on(s,this.options.selector,e.proxy(this.leave,this))}this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(t){t=e.extend({},e.fn[this.type].defaults,t,this.$element.data());t.delay&&typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay});return t},enter:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);if(!n.options.delay||!n.options.delay.show)n.show();else{n.hoverState="in";setTimeout(function(){n.hoverState=="in"&&n.show()},n.options.delay.show)}},leave:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);if(!n.options.delay||!n.options.delay.hide)n.hide();else{n.hoverState="out";setTimeout(function(){n.hoverState=="out"&&n.hide()},n.options.delay.hide)}},show:function(){var e,t,n,r,i,s,o;if( +this.hasContent()&&this.enabled){e=this.tip();this.setContent();this.options.animation&&e.addClass("fade");s=typeof this.options.placement=="function"?this.options.placement.call(this,e[0],this.$element[0]):this.options.placement;t=/in/.test(s);e.remove().css({top:0,left:0,display:"block"}).appendTo(t?this.$element:document.body);n=this.getPosition(t);r=e[0].offsetWidth;i=e[0].offsetHeight;switch(t?s.split(" ")[1]:s){case"bottom":o={top:n.top+n.height,left:n.left+n.width/2-r/2};break;case"top":o={top:n.top-i,left:n.left+n.width/2-r/2};break;case"left":o={top:n.top+n.height/2-i/2,left:n.left-r};break;case"right":o={top:n.top+n.height/2-i/2,left:n.left+n.width}}e.css(o).addClass(s).addClass("in")}},setContent:function(){var e=this.tip();e.find(".timeline-tooltip-inner").html(this.getTitle());e.removeClass("fade in top bottom left right")},hide:function(){function r(){var t=setTimeout(function(){n.off(e.support.transition.end).remove()},500);n.one(e.support.transition.end,function(){clearTimeout(t);n.remove()})}var t=this,n=this.tip();n.removeClass("in");e.support.transition&&this.$tip.hasClass("fade")?r():n.remove()},fixTitle:function(){var e=this.$element;(e.attr("title")||typeof e.attr("data-original-title")!="string")&&e.attr("data-original-title",e.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(t){return e.extend({},t?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var e,t=this.$element,n=this.options;e=t.attr("data-original-title")||(typeof n.title=="function"?n.title.call(t[0]):n.title);e=e.toString().replace(/(^\s*|\s*$)/,"");return e},tip:function(){return this.$tip=this.$tip||e(this.options.template)},validate:function(){if(!this.$element[0].parentNode){this.hide();this.$element=null;this.options=null}},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(){this[this.tip().hasClass("in")?"hide":"show"]()}};e.fn.tooltip=function(n){return this.each(function(){var r=e(this),i=r.data("tooltip"),s=typeof n=="object"&&n;i||r.data("tooltip",i=new t(this,s));typeof n=="string"&&i[n]()})};e.fn.tooltip.Constructor=t;e.fn.tooltip.defaults={animation:!0,delay:0,selector:!1,placement:"top",trigger:"hover",title:"",template:'
      '}}(window.jQuery);typeof VMM!="undefined"&&typeof VMM.StoryJS=="undefined"&&(VMM.StoryJS=function(){this.init=function(e){}});if(typeof VMM!="undefined"&&typeof VMM.Timeline=="undefined"){VMM.Timeline=function(e,t,n){function S(e){typeof embed_config=="object"&&(timeline_config=embed_config);if(typeof timeline_config=="object"){trace("HAS TIMELINE CONFIG");m=VMM.Util.mergeConfig(m,timeline_config)}else typeof e=="object"&&(m=VMM.Util.mergeConfig(m,e));if(VMM.Browser.device=="mobile"||VMM.Browser.device=="tablet")m.touch=!0;m.nav.width=m.width;m.nav.height=200;m.feature.width=m.width;m.feature.height=m.height-m.nav.height;m.nav.zoom.adjust=parseInt(m.start_zoom_adjust,10);VMM.Timeline.Config=m;VMM.master_config.Timeline=VMM.Timeline.Config;this.events=m.events;m.gmap_key!=""&&(m.api_keys.google=m.gmap_key);trace("VERSION "+m.version);c=m.version}function x(){r=VMM.getElement(h);VMM.Lib.addClass(r,"vco-timeline");VMM.Lib.addClass(r,"vco-storyjs");i=VMM.appendAndGetElement(r,"
      ","vco-container vco-main");s=VMM.appendAndGetElement(i,"
      ","vco-feature");u=VMM.appendAndGetElement(s,"
      ","vco-slider");a=VMM.appendAndGetElement(i,"
      ","vco-navigation");o=VMM.appendAndGetElement(r,"
      ","vco-feedback","");typeof m.language.right_to_left!="undefined"&&VMM.Lib.addClass(r,"vco-right-to-left");f=new VMM.Slider(u,m);l=new VMM.Timeline.TimeNav(a);g?VMM.Lib.width(r,m.width):m.width=VMM.Lib.width(r);y?VMM.Lib.height(r,m.height):m.height=VMM.Lib.height(r);m.touch?VMM.Lib.addClass(r,"vco-touch"):VMM.Lib.addClass(r,"vco-notouch")}function T(e,t){trace("onDataReady");d=t.timeline;type.of(d.era)!="array"&&(d.era=[]);W()}function N(){U()}function C(){z();f.setSize(m.feature.width,m.feature.height);l.setSize(m.width,m.height);j()&&H()}function k(e){m.loaded.slider=!0;L()}function L(e){m.loaded.percentloaded=m.loaded.percentloaded+25;m.loaded.slider&&m.loaded.timenav&&q()}function A(e){m.loaded.timenav=!0;L()}function O(e){w=!0;m.current_slide=f.getCurrentNumber();D(m.current_slide);l.setMarker(m.current_slide,m.ease,m.duration)}function M(e){w=!0;m.current_slide=l.getCurrentNumber();D(m.current_slide);f.setSlide(m.current_slide)}function _(e){if(e<=v.length-1&&e>=0){m.current_slide=e;f.setSlide(m.current_slide);l.setMarker(m.current_slide,m.ease,m.duration)}}function D(e){m.hash_bookmark&&(window.location.hash="#"+e.toString())}function P(){}function H(){var e="",t=B(window.orientation);VMM.Browser.device=="mobile"?t=="portrait"?e="width=device-width; initial-scale=0.5, maximum-scale=0.5":t=="landscape"?e="width=device-width; initial-scale=0.5, maximum-scale=0.5":e="width=device-width, initial-scale=1, maximum-scale=1.0":VMM.Browser.device=="tablet";document.getElementById("viewport")}function B(e){var t="";e==0||e==180?t="portrait":e==90||e==-90?t="landscape":t="normal";return t}function j(){var e=B(window.orientation);if(e==m.orientation)return!1;m.orientation=e;return!0}function F(e){VMM.getJSON(e,function(e){d=VMM.Timeline.DataObj.getData(e);VMM.fireEvent(global,m.events.data_ready)})}function I(e,t,n){trace("showMessege "+t);n?VMM.attachElement(o,t):VMM.attachElement(o,VMM.MediaElement.loadingmessage(t))}function q(){VMM.Lib.animate(o,m.duration,m.ease*4,{opacity:0},R)}function R(){VMM.Lib.detach(o)}function U(){parseInt(m.start_at_slide)>0&&m.current_slide==0&&(m.current_slide=parseInt(m.start_at_slide));m.start_at_end&&m.current_slide==0&&(m.current_slide=v.length-1);if(b){b=!0;VMM.fireEvent(global,m.events.messege,"Internet Explorer "+VMM.Browser.version+" is not supported by TimelineJS. Please update your browser to version 8 or higher. If you are using a recent version of Internet Explorer you may need to disable compatibility mode in your browser.")}else{R();C();VMM.bindEvent(u,k,"LOADED");VMM.bindEvent(a,A,"LOADED");VMM.bindEvent(u,O,"UPDATE");VMM.bindEvent(a,M,"UPDATE");f.init(v);l.init(v,d.era);VMM.bindEvent(global,C,m.events.resize)}}function z(){trace("UPDATE SIZE");m.width=VMM.Lib.width(r);m.height=VMM.Lib.height(r);m.nav.width=m.width;m.feature.width=m.width;m.feature.height=m.height-m.nav.height-3;VMM.Browser.device=="mobile";m.width<641?VMM.Lib.addClass(r,"vco-skinny"):VMM.Lib.removeClass(r,"vco-skinny")}function W(){v=[];VMM.fireEvent(global,m.events.messege,"Building Dates");z();for(var e=0;eb.nav.multiplier.min){b.nav.multiplier.current<=1?b.nav.multiplier.current=b.nav.multiplier.current-.25:b.nav.multiplier.current>5?b.nav.multiplier.current>16?b.nav.multiplier.current=Math.round(b.nav.multiplier.current-10):b.nav.multiplier.current=Math.round(b.nav.multiplier.current-4):b.nav.multiplier.current=Math.round(b.nav.multiplier.current-1);b.nav.multiplier.current<=0&&(b.nav.multiplier.current=b.nav.multiplier.min);K()}}function V(){y.cancelSlide();if(b.nav.multiplier.current4?b.nav.multiplier.current>16?b.nav.multiplier.current=Math.round(b.nav.multiplier.current+10):b.nav.multiplier.current=Math.round(b.nav.multiplier.current+4):b.nav.multiplier.current=Math.round(b.nav.multiplier.current+1);b.nav.multiplier.current>=b.nav.multiplier.max&&(b.nav.multiplier.current=b.nav.multiplier.max);K()}}function $(e){y.cancelSlide();Y(0);W()}function J(e){var t=0,n=0;e||(e=window.event);e.originalEvent&&(e=e.originalEvent);if(typeof e.wheelDeltaX!="undefined"){t=e.wheelDeltaY/6;Math.abs(e.wheelDeltaX)>Math.abs(e.wheelDeltaY)?t=e.wheelDeltaX/6:t=0}if(t){e.preventDefault&&e.preventDefault();e.returnValue=!1}n=VMM.Lib.position(r).left+t;n>b.nav.constraint.left?n=b.width/2:n1&&(b.nav.multiplier.current=b.nav.multiplier.current-1)}function rt(){var e=it(T[0].startdate),t=it(T[T.length-1].enddate);R.eon.type="eon";R.eon.first=e.eons;R.eon.base=Math.floor(e.eons);R.eon.last=t.eons;R.eon.number=S.eons;R.eon.multiplier=B.eons;R.eon.minor=B.eons;R.era.type="era";R.era.first=e.eras;R.era.base=Math.floor(e.eras);R.era.last=t.eras;R.era.number=S.eras;R.era.multiplier=B.eras;R.era.minor=B.eras;R.epoch.type="epoch";R.epoch.first=e.epochs;R.epoch.base=Math.floor(e.epochs);R.epoch.last=t.epochs;R.epoch.number=S.epochs;R.epoch.multiplier=B.epochs;R.epoch.minor=B.epochs;R.age.type="age";R.age.first=e.ages;R.age.base=Math.floor(e.ages);R.age.last=t.ages;R.age.number=S.ages;R.age.multiplier=B.ages;R.age.minor=B.ages;R.millenium.type="millenium";R.millenium.first=e.milleniums;R.millenium.base=Math.floor(e.milleniums);R.millenium.last=t.milleniums;R.millenium.number=S.milleniums;R.millenium.multiplier=B.millenium;R.millenium.minor=B.millenium;R.century.type="century";R.century.first=e.centuries;R.century.base=Math.floor(e.centuries);R.century.last=t.centuries;R.century.number=S.centuries;R.century.multiplier=B.century;R.century.minor=B.century;R.decade.type="decade";R.decade.first=e.decades;R.decade.base=Math.floor(e.decades);R.decade.last=t.decades;R.decade.number=S.decades;R.decade.multiplier=B.decade;R.decade.minor=B.decade;R.year.type="year";R.year.first=e.years;R.year.base=Math.floor(e.years);R.year.last=t.years;R.year.number=S.years;R.year.multiplier=1;R.year.minor=B.month;R.month.type="month";R.month.first=e.months;R.month.base=Math.floor(e.months);R.month.last=t.months;R.month.number=S.months;R.month.multiplier=1;R.month.minor=Math.round(B.week);R.week.type="week";R.week.first=e.weeks;R.week.base=Math.floor(e.weeks);R.week.last=t.weeks;R.week.number=S.weeks;R.week.multiplier=1;R.week.minor=7;R.day.type="day";R.day.first=e.days;R.day.base=Math.floor(e.days);R.day.last=t.days;R.day.number=S.days;R.day.multiplier=1;R.day.minor=24;R.hour.type="hour";R.hour.first=e.hours;R.hour.base=Math.floor(e.hours);R.hour.last=t.hours;R.hour.number=S.hours;R.hour.multiplier=1;R.hour.minor=60;R.minute.type="minute";R.minute.first=e.minutes;R.minute.base=Math.floor(e.minutes);R.minute.last=t.minutes;R.minute.number=S.minutes;R.minute.multiplier=1;R.minute.minor=60;R.second.type="decade";R.second.first=e.seconds;R.second.base=Math.floor(e.seconds);R.second.last=t.seconds;R.second.number=S.seconds;R.second.multiplier=1;R.second.minor=10}function it(e,t){var n={};n.days=e/j.day;n.weeks=n.days/j.week;n.months=n.days/j.month;n.years=n.months/j.year;n.hours=n.days*j.hour;n.minutes=n.days*j.minute;n.seconds=n.days*j.second;n.decades=n.years/j.decade;n.centuries=n.years/j.century;n.milleniums=n.years/j.millenium;n.ages=n.years/j.age;n.epochs=n.years/j.epoch;n.eras=n.years/j.era;n.eons=n.years/j.eon;return n}function st(e,t,n){var r,i,s=e.type,o={start:"",end:"",type:s};r=it(t);o.start=t.months;s=="eon"?o.start=r.eons:s=="era"?o.start=r.eras:s=="epoch"?o.start=r.epochs:s=="age"?o.start=r.ages:s=="millenium"?o.start=t.milleniums:s=="century"?o.start=r.centuries:s=="decade"?o.start=r.decades:s=="year"?o.start=r.years:s=="month"?o.start=r.months:s=="week"?o.start=r.weeks:s=="day"?o.start=r.days:s=="hour"?o.start=r.hours:s=="minute"&&(o.start=r.minutes);if(type.of(n)=="date"){i=it(n);o.end=n.months;s=="eon"?o.end=i.eons:s=="era"?o.end=i.eras:s=="epoch"?o.end=i.epochs:s=="age"?o.end=i.ages:s=="millenium"?o.end=n.milleniums:s=="century"?o.end=i.centuries:s=="decade"?o.end=i.decades:s=="year"?o.end=i.years:s=="month"?o.end=i.months:s=="week"?o.end=i.weeks:s=="day"?o.end=i.days:s=="hour"?o.end=i.hours:s=="minute"&&(o.end=i.minutes)}else o.end=o.start;return o}function ot(e,t){return{begin:(t.start-F.base)*(b.nav.interval_width/b.nav.multiplier.current),end:(t.end-F.base)*(b.nav.interval_width/b.nav.multiplier.current)}}function ut(e){var t=2,n=0,i=-2,s=0,o=0,u=150,a=6,f=0,l=b.width,c=[],h=6,p={left:H.visible.left-l,right:H.visible.right+l},d=0,v=0;b.nav.minor_width=b.width;VMM.Lib.removeClass(".flag","row1");VMM.Lib.removeClass(".flag","row2");VMM.Lib.removeClass(".flag","row3");for(d=0;d=p.left&&Math.abs(y.begin)<=p.right&&(E=!0);if(e){VMM.Lib.stop(g.marker);VMM.Lib.animate(g.marker,b.duration/2,b.ease,{left:y.begin})}else{VMM.Lib.stop(g.marker);VMM.Lib.css(g.marker,"left",y.begin)}d==O&&(f=y.begin);if(m>5){VMM.Lib.css(g.lineevent,"height",a);VMM.Lib.css(g.lineevent,"top",u);e?VMM.Lib.animate(g.lineevent,b.duration/2,b.ease,{width:m}):VMM.Lib.css(g.lineevent,"width",m)}if(A.length>0){for(v=0;vh&&VMM.Util.removeRange(c,0);if(e){VMM.Lib.stop(g.flag);VMM.Lib.animate(g.flag,b.duration,b.ease,{top:w})}else{VMM.Lib.stop(g.flag);VMM.Lib.css(g.flag,"top",w)}b.start_page&&C[d].type=="start"&&VMM.Lib.visible(g.marker,!1);y>b.nav.minor_width&&(b.nav.minor_width=y);y100){not_too_many=!1;trace("TOO MANY "+t.length)}for(i=0;i=a.left&&Math.abs(p)<=a.right&&(g=!0);b.nav.multiplier.current>16&&r?m=!1:p-s<65&&(p-s<35?i%4==0?p==0&&(m=!1):m=!1:VMM.Util.isEven(i)||(m=!1));if(m){if(t[i].is_detached){VMM.Lib.append(e,f);t[i].is_detached=!1}}else{t[i].is_detached=!0;VMM.Lib.detach(f)}if(c)if(!m){v.opacity="0";n&¬_too_many&&(v.animate=!0);t[i].interval_visible=!1}else{v.opacity="100";n&&g&&(v.animate=!0)}else{v.opacity="100";if(m){n&¬_too_many?v.animate=!0:n&&g&&(v.animate=!0);t[i].interval_visible=!0}else n&¬_too_many&&(v.animate=!0)}s=p;p>b.nav.minor_width&&(b.nav.minor_width=p);p",e.classname),date:new Date(T[0].startdate.getFullYear(),0,1,0,0,0),visible:!1,date_string:"",type:e.interval_type,relative_pos:0,is_detached:!1,animation:{animate:!1,pos:"",opacity:"100"}};if(e.type=="eon"){i&&(a=Math.floor(T[0].startdate.getFullYear()/5e8)*5e8);v.date.setFullYear(a+r*5e8);p=!0}else if(e.type=="era"){i&&(a=Math.floor(T[0].startdate.getFullYear()/1e8)*1e8);v.date.setFullYear(a+r*1e8);p=!0}else if(e.type=="epoch"){i&&(a=Math.floor(T[0].startdate.getFullYear()/1e7)*1e7);v.date.setFullYear(a+r*1e7);p=!0}else if(e.type=="age"){i&&(a=Math.floor(T[0].startdate.getFullYear()/1e6)*1e6);v.date.setFullYear(a+r*1e6);p=!0}else if(e.type=="millenium"){i&&(a=Math.floor(T[0].startdate.getFullYear()/1e3)*1e3);v.date.setFullYear(a+r*1e3);p=!0}else if(e.type=="century"){i&&(a=Math.floor(T[0].startdate.getFullYear()/100)*100);v.date.setFullYear(a+r*100);p=!0}else if(e.type=="decade"){i&&(a=Math.floor(T[0].startdate.getFullYear()/10)*10);v.date.setFullYear(a+r*10);p=!0}else if(e.type=="year"){i&&(a=T[0].startdate.getFullYear());v.date.setFullYear(a+r);p=!0}else if(e.type=="month"){i&&(a=T[0].startdate.getMonth());v.date.setMonth(a+r)}else if(e.type=="week"){i&&(a=T[0].startdate.getMonth());v.date.setMonth(T[0].startdate.getMonth());v.date.setDate(a+r*7)}else if(e.type=="day"){i&&(a=T[0].startdate.getDate());v.date.setMonth(T[0].startdate.getMonth());v.date.setDate(a+r)}else if(e.type=="hour"){i&&(a=T[0].startdate.getHours());v.date.setMonth(T[0].startdate.getMonth());v.date.setDate(T[0].startdate.getDate());v.date.setHours(a+r)}else if(e.type=="minute"){i&&(a=T[0].startdate.getMinutes());v.date.setMonth(T[0].startdate.getMonth());v.date.setDate(T[0].startdate.getDate());v.date.setHours(T[0].startdate.getHours());v.date.setMinutes(a+r)}else if(e.type=="second"){i&&(a=T[0].startdate.getSeconds());v.date.setMonth(T[0].startdate.getMonth());v.date.setDate(T[0].startdate.getDate());v.date.setHours(T[0].startdate.getHours());v.date.setMinutes(T[0].startdate.getMinutes());v.date.setSeconds(a+r)}else if(e.type=="millisecond"){i&&(a=T[0].startdate.getMilliseconds());v.date.setMonth(T[0].startdate.getMonth());v.date.setDate(T[0].startdate.getDate());v.date.setHours(T[0].startdate.getHours());v.date.setMinutes(T[0].startdate.getMinutes());v.date.setSeconds(T[0].startdate.getSeconds());v.date.setMilliseconds(a+r)}if(VMM.Browser.browser=="Firefox")if(v.date.getFullYear()=="1970"&&v.date.getTimezoneOffset()!=u){trace("FIREFOX 1970 TIMEZONE OFFSET "+v.date.getTimezoneOffset()+" SHOULD BE "+u);trace(e.type+" "+e.date);c.offset=v.date.getTimezoneOffset()/60;c.flag=!0;v.date.setHours(v.date.getHours()+c.offset)}else if(c.flag){c.flag=!1;v.date.setHours(v.date.getHours()+c.offset);p&&(c.flag=!0)}p?v.date.getFullYear()<0?v.date_string=Math.abs(v.date.getFullYear()).toString()+" B.C.":v.date_string=v.date.getFullYear():v.date_string=VMM.Date.prettyDate(v.date,!0);r+=1;i=!1;v.relative_pos=st(F,v.date);s=v.relative_pos.begin;v.relative_pos.begin>o&&(o=v.relative_pos.begin);VMM.appendElement(v.element,v.date_string);VMM.Lib.css(v.element,"text-indent",-(VMM.Lib.width(v.element)/2));VMM.Lib.css(v.element,"opacity","0");t.push(v)}VMM.Lib.width(d,o);ft(n,t)}function ct(){var e=0,t=0;VMM.attachElement(x,"");r=VMM.appendAndGetElement(x,"
      ","timenav");s=VMM.appendAndGetElement(r,"
      ","content");o=VMM.appendAndGetElement(r,"
      ","time");u=VMM.appendAndGetElement(o,"
      ","time-interval-minor");d=VMM.appendAndGetElement(u,"
      ","minor");f=VMM.appendAndGetElement(o,"
      ","time-interval-major");a=VMM.appendAndGetElement(o,"
      ","time-interval");l=VMM.appendAndGetElement(x,"
      ","timenav-background");h=VMM.appendAndGetElement(l,"
      ","timenav-line");p=VMM.appendAndGetElement(l,"
      ","timenav-indicator");c=VMM.appendAndGetElement(l,"
      ","timenav-interval-background","
      ");v=VMM.appendAndGetElement(x,"
      ","vco-toolbar");ht();pt();dt();nt();ut(!1);at();ft(a,k,!1,!0);ft(f,L);if(b.start_page){$backhome=VMM.appendAndGetElement(v,"
      ","back-home","
      ");VMM.bindEvent(".back-home",$,"click");VMM.Lib.attribute($backhome,"title",VMM.master_config.language.messages.return_to_title);VMM.Lib.attribute($backhome,"rel","timeline-tooltip")}y=new VMM.DragSlider;y.createPanel(x,r,b.nav.constraint,b.touch);if(b.touch&&b.start_page){VMM.Lib.addClass(v,"touch");VMM.Lib.css(v,"top",55);VMM.Lib.css(v,"left",10)}else{b.start_page&&VMM.Lib.css(v,"top",27);m=VMM.appendAndGetElement(v,"
      ","zoom-in","
      ");g=VMM.appendAndGetElement(v,"
      ","zoom-out","
      ");VMM.bindEvent(m,X,"click");VMM.bindEvent(g,V,"click");VMM.Lib.attribute(m,"title",VMM.master_config.language.messages.expand_timeline);VMM.Lib.attribute(m,"rel","timeline-tooltip");VMM.Lib.attribute(g,"title",VMM.master_config.language.messages.contract_timeline);VMM.Lib.attribute(g,"rel","timeline-tooltip");v.tooltip({selector:"div[rel=timeline-tooltip]",placement:"right"});VMM.bindEvent(x,J,"DOMMouseScroll");VMM.bindEvent(x,J,"mousewheel")}if(b.nav.zoom.adjust!=0)if(b.nav.zoom.adjust<0)for(e=0;eT.length/b.nav.density){F=R.century;I=R.millenium;q=R.decade}else if(S.decades>T.length/b.nav.density){F=R.decade;I=R.century;q=R.year}else if(S.years>T.length/b.nav.density){F=R.year;I=R.decade;q=R.month}else if(S.months>T.length/b.nav.density){F=R.month;I=R.year;q=R.day}else if(S.days>T.length/b.nav.density){F=R.day;I=R.month;q=R.hour}else if(S.hours>T.length/b.nav.density){F=R.hour;I=R.day;q=R.minute}else if(S.minutes>T.length/b.nav.density){F=R.minute;I=R.hour;q=R.second}else if(S.seconds>T.length/b.nav.density){F=R.second;I=R.minute;q=R.second}else{trace("NO IDEA WHAT THE TYPE SHOULD BE");F=R.day;I=R.month;q=R.hour}trace("INTERVAL TYPE: "+F.type);trace("INTERVAL MAJOR TYPE: "+I.type);lt(F,k,a);lt(I,L,f);for(e=0;e","marker");a=VMM.appendAndGetElement(u,"
      ","flag");f=VMM.appendAndGetElement(a,"
      ","flag-content");c=VMM.appendAndGetElement(u,"
      ","dot");h=VMM.appendAndGetElement(u,"
      ","line");p=VMM.appendAndGetElement(h,"
      ","event-line");_marker_relative_pos=st(F,T[r].startdate,T[r].enddate);_marker_thumb="";T[r].asset!=null&&T[r].asset!=""?VMM.appendElement(f,VMM.MediaElement.thumbnail(T[r].asset,24,24,T[r].uniqueid)):VMM.appendElement(f,"
      ");if(T[r].title==""||T[r].title==" "){trace("TITLE NOTHING");if(typeof T[r].slug!="undefined"&&T[r].slug!=""){trace("SLUG");v=VMM.Util.untagify(T[r].slug);m=!0}else{var g=VMM.MediaType(T[r].asset.media);if(g.type=="quote"||g.type=="unknown"){v=VMM.Util.untagify(g.id);m=!0}else m=!1}}else if(T[r].title!=""||T[r].title!=" "){trace(T[r].title);v=VMM.Util.untagify(T[r].title);m=!0}else trace("TITLE SLUG NOT FOUND "+T[r].slug);if(m)VMM.appendElement(f,"

      "+v+"

      ");else{VMM.appendElement(f,"

      "+v+"

      ");VMM.appendElement(f,"

      "+v+"

      ")}VMM.Lib.attr(u,"id",("marker_"+T[r].uniqueid).toString());VMM.bindEvent(a,Q,"",{number:r});VMM.bindEvent(a,G,"mouseenter mouseleave",{number:r,elem:a});d={marker:u,flag:a,lineevent:p,type:"marker",full:!0,relative_pos:_marker_relative_pos,tag:T[r].tag,pos_left:0};if(T[r].type=="start"){trace("BUILD MARKER HAS START PAGE");b.start_page=!0;d.type="start"}T[r].type=="storify"&&(d.type="storify");T[r].tag&&A.push(T[r].tag);C.push(d)}A=VMM.Util.deDupeArray(A);A.length>3?b.nav.rows.current=b.nav.rows.half:b.nav.rows.current=b.nav.rows.full;for(i=0;i","timenav-tag");VMM.Lib.addClass(y,"timenav-tag-row-"+(i+1));A.length>3?VMM.Lib.addClass(y,"timenav-tag-size-half"):VMM.Lib.addClass(y,"timenav-tag-size-full");VMM.appendElement(y,"

      "+A[i]+"

      ")}if(A.length>3)for(o=0;o","era"),text_content:VMM.appendAndGetElement(a,"
      ","era"),startdate:VMM.Date.parse(_[n].startDate),enddate:VMM.Date.parse(_[n].endDate),title:_[n].headline,uniqueid:VMM.Util.unique_ID(6),tag:"",relative_pos:""},i=VMM.Date.prettyDate(r.startdate),o=VMM.Date.prettyDate(r.enddate),u="
       
      ";typeof _[n].tag!="undefined"&&(r.tag=_[n].tag);r.relative_pos=st(F,r.startdate,r.enddate);VMM.Lib.attr(r.content,"id",r.uniqueid);VMM.Lib.attr(r.text_content,"id",r.uniqueid+"_text");VMM.Lib.addClass(r.content,"era"+(t+1));VMM.Lib.addClass(r.text_content,"era"+(t+1));t-1?t=e+"&callback=onJSONP_Data":t=e+"?callback=onJSONP_Data";VMM.getJSON(t,VMM.Timeline.DataObj.parseJSON)}else if(type.of(e)=="html"){trace("DATA SOURCE: HTML");VMM.Timeline.DataObj.parseHTML(e)}else trace("DATA SOURCE: UNKNOWN")},onJSONPLoaded:function(){trace("JSONP IS LOADED");VMM.fireEvent(global,VMM.Timeline.Config.events.data_ready,storyjs_jsonp_data)},parseHTML:function(e){trace("parseHTML");trace("WARNING: THIS IS STILL ALPHA AND WILL NOT WORK WITH ID's other than #timeline");var t=VMM.Timeline.DataObj.data_template_obj;if(VMM.Lib.find("#timeline section","time")[0]){t.timeline.startDate=VMM.Lib.html(VMM.Lib.find("#timeline section","time")[0]);t.timeline.headline=VMM.Lib.html(VMM.Lib.find("#timeline section","h2"));t.timeline.text=VMM.Lib.html(VMM.Lib.find("#timeline section","article"));var n=!1;if(VMM.Lib.find("#timeline section","figure img").length!=0){n=!0;t.timeline.asset.media=VMM.Lib.attr(VMM.Lib.find("#timeline section","figure img"),"src")}else if(VMM.Lib.find("#timeline section","figure a").length!=0){n=!0;t.timeline.asset.media=VMM.Lib.attr(VMM.Lib.find("#timeline section","figure a"),"href")}if(n){VMM.Lib.find("#timeline section","cite").length!=0&&(t.timeline.asset.credit=VMM.Lib.html(VMM.Lib.find("#timeline section","cite")));VMM.Lib.find(this,"figcaption").length!=0&&(t.timeline.asset.caption=VMM.Lib.html(VMM.Lib.find("#timeline section","figcaption")))}}VMM.Lib.each("#timeline li",function(e,n){var r=!1,i={type:"default",startDate:"",headline:"",text:"",asset:{media:"",credit:"",caption:""},tags:"Optional"};if(VMM.Lib.find(this,"time")!=0){r=!0;i.startDate=VMM.Lib.html(VMM.Lib.find(this,"time")[0]);VMM.Lib.find(this,"time")[1]&&(i.endDate=VMM.Lib.html(VMM.Lib.find(this,"time")[1]));i.headline=VMM.Lib.html(VMM.Lib.find(this,"h3"));i.text=VMM.Lib.html(VMM.Lib.find(this,"article"));var s=!1;if(VMM.Lib.find(this,"figure img").length!=0){s=!0;i.asset.media=VMM.Lib.attr(VMM.Lib.find(this,"figure img"),"src")}else if(VMM.Lib.find(this,"figure a").length!=0){s=!0;i.asset.media=VMM.Lib.attr(VMM.Lib.find(this,"figure a"),"href")}if(s){VMM.Lib.find(this,"cite").length!=0&&(i.asset.credit=VMM.Lib.html(VMM.Lib.find(this,"cite")));VMM.Lib.find(this,"figcaption").length!=0&&(i.asset.caption=VMM.Lib.html(VMM.Lib.find(this,"figcaption")))}trace(i);t.timeline.date.push(i)}});VMM.fireEvent(global,VMM.Timeline.Config.events.data_ready,t)},parseJSON:function(e){trace("parseJSON");if(e.timeline.type=="default"){trace("DATA SOURCE: JSON STANDARD TIMELINE");VMM.fireEvent(global,VMM.Timeline.Config.events.data_ready,e)}else if(e.timeline.type=="twitter"){trace("DATA SOURCE: JSON TWEETS");VMM.Timeline.DataObj.model_Tweets.buildData(e)}else{trace("DATA SOURCE: UNKNOWN JSON");trace(type.of(e.timeline))}},model:{googlespreadsheet:{extractSpreadsheetKey:function(e){var t=VMM.Util.getUrlVars(e).key;if(!t&&e.match("docs.google.com/spreadsheets/d/")){var n=e.indexOf("docs.google.com/spreadsheets/d/")+"docs.google.com/spreadsheets/d/".length,r=e.substr(n);t=r.split("/")[0]}t||(t=e);return t},getData:function(e){function u(){t=VMM.getJSON(i,function(e){clearTimeout(s);VMM.Timeline.DataObj.model.googlespreadsheet.buildData(e)}).error(function(e,t,n){if(e.status==400){VMM.fireEvent(global,VMM.Timeline.Config.events.messege,"Error reading Google spreadsheet. Check the URL and make sure it's published to the web.");clearTimeout(s);return}trace("Google Docs ERROR");trace("Google Docs ERROR: "+t+" "+e.responseText)}).success(function(e){clearTimeout(s)})}var t,n,r,i,s,o=0;n=VMM.Timeline.DataObj.model.googlespreadsheet.extractSpreadsheetKey(e);r=VMM.Util.getUrlVars(e).worksheet;typeof r=="undefined"&&(r="od6");i="https://spreadsheets.google.com/feeds/list/"+n+"/"+r+"/public/values?alt=json";s=setTimeout(function(){trace("Google Docs timeout "+i);trace(i);if(o<3){VMM.fireEvent(global,VMM.Timeline.Config.events.messege,"Still waiting on Google Docs, trying again "+o);o++;t.abort();u()}else VMM.fireEvent(global,VMM.Timeline.Config.events.messege,"Google Docs is not responding")},16e3);u()},buildData:function(e){function r(e){return typeof e!="undefined"?e.$t:""}var t=VMM.Timeline.DataObj.data_template_obj,n=!1;VMM.fireEvent(global,VMM.Timeline.Config.events.messege,"Parsing Google Doc Data");if(typeof e.feed.entry=="undefined")VMM.fireEvent(global,VMM.Timeline.Config.events.messege,"Error parsing spreadsheet. Make sure you have no blank rows and that the headers have not been changed.");else{n=!0;for(var i=0;is&&(s=parseInt(f.gs$cell.row))}for(var o=0;o0;if(n){VMM.fireEvent(global,VMM.Timeline.Config.events.messege,"Finished Parsing Data");VMM.fireEvent(global,VMM.Timeline.Config.events.data_ready,t)}else VMM.fireEvent(global,VMM.Timeline.Config.events.messege,"Unable to load Google Doc data source. Make sure you have no blank rows and that the headers have not been changed.")}},storify:{getData:function(e){var t,n,r;VMM.fireEvent(global,VMM.Timeline.Config.events.messege,"Loading Storify...");t=e.split("storify.com/")[1];n="//api.storify.com/v1/stories/"+t+"?per_page=300&callback=?";r=setTimeout(function(){trace("STORIFY timeout");VMM.fireEvent(global,VMM.Timeline.Config.events.messege,"Storify is not responding")},6e3);VMM.getJSON(n,VMM.Timeline.DataObj.model.storify.buildData).error(function(e,t,n){trace("STORIFY error");trace("STORIFY ERROR: "+t+" "+e.responseText)}).success(function(e){clearTimeout(r)})},buildData:function(e){VMM.fireEvent(global,VMM.Timeline.Config.events.messege,"Parsing Data");var t=VMM.Timeline.DataObj.data_template_obj;t.timeline.startDate=new Date(e.content.date.created);t.timeline.headline=e.content.title;trace(e);var n="",r=e.content.author.username,i="";if(typeof e.content.author.name!="undefined"){r=e.content.author.name;i=e.content.author.username+" "}typeof e.content.description!="undefined"&&e.content.description!=null&&(n+=e.content.description);n+="";t.timeline.text=n;t.timeline.asset.media=e.content.thumbnail;t.timeline.type="storify";for(var s=0;s"+o.attribution.name+"";f.asset.credit+=" on "+o.source.name+""}else if(o.source.name=="instagram"){f.asset.media=o.permalink;f.asset.credit=""+o.attribution.name+"";f.asset.credit+=" on "+o.source.name+""}else{f.asset.credit=""+o.attribution.name+"";typeof o.source.href!="undefined"&&(f.asset.credit+=" on "+o.source.name+"");f.asset.media=o.data.image.src}else{f.asset.credit=""+o.attribution.name+"";f.asset.media=o.data.image.src}f.slug=o.attribution.name;if(typeof o.data.image.caption!="undefined"&&o.data.image.caption!="undefined"){f.asset.caption=o.data.image.caption;f.slug=o.data.image.caption}}else if(o.type=="quote"){if(o.permalink.match("twitter")){f.asset.media=o.permalink;f.slug=VMM.Util.untagify(o.data.quote.text)}else if(o.permalink.match("storify")){u=!0;f.asset.media="
      "+o.data.quote.text.replace(/<\s*\/?\s*b\s*.*?>/g,"")+"
      "}}else if(o.type=="link"){f.headline=o.data.link.title;f.text=o.data.link.description;o.data.link.thumbnail!="undefined"&&o.data.link.thumbnail!=""?f.asset.media=o.data.link.thumbnail:f.asset.media=o.permalink;f.asset.caption=""+o.data.link.title+"";f.slug=o.data.link.title}else if(o.type=="text"){if(o.permalink.match("storify")){u=!0;var l=e.content.author.username,c="";if(typeof o.attribution.name!="undefined"){r=o.attribution.name;i=o.attribution.username+" "}var h="
      ";h+="

      "+o.data.text.replace(/<\s*\/?\s*b\s*.*?>/g,"")+"

      ";h+="
      ";f.text=h;if(s+1>=e.content.elements.length)f.startDate=e.content.elements[s-1].posted_at;else if(e.content.elements[s+1].type=="text"&&e.content.elements[s+1].permalink.match("storify"))if(s+2>=e.content.elements.length)f.startDate=e.content.elements[s-1].posted_at;else if(e.content.elements[s+2].type=="text"&&e.content.elements[s+2].permalink.match("storify"))if(s+3>=e.content.elements.length)f.startDate=e.content.elements[s-1].posted_at;else if(e.content.elements[s+3].type=="text"&&e.content.elements[s+3].permalink.match("storify"))f.startDate=e.content.elements[s-1].posted_at;else{trace("LEVEL 3");f.startDate=e.content.elements[s+3].posted_at}else{trace("LEVEL 2");f.startDate=e.content.elements[s+2].posted_at}else{trace("LEVEL 1");f.startDate=e.content.elements[s+1].posted_at}f.endDate=f.startDate}}else if(o.type=="video"){f.headline=o.data.video.title;f.asset.caption=o.data.video.description;f.asset.caption=o.source.username;f.asset.media=o.data.video.src}else{trace("NO MATCH ");trace(o)}u&&(f.slug=VMM.Util.untagify(o.data.text));t.timeline.date.push(f)}VMM.fireEvent(global,VMM.Timeline.Config.events.data_ready,t)}},tweets:{type:"twitter",buildData:function(e){VMM.bindEvent(global,VMM.Timeline.DataObj.model.tweets.onTwitterDataReady,"TWEETSLOADED");VMM.ExternalAPI.twitter.getTweets(e.timeline.tweets)},getData:function(e){VMM.bindEvent(global,VMM.Timeline.DataObj.model.tweets.onTwitterDataReady,"TWEETSLOADED");VMM.ExternalAPI.twitter.getTweetSearch(e)},onTwitterDataReady:function(e,t){var n=VMM.Timeline.DataObj.data_template_obj;for(var r=0;r"+"@"+t.tweetdata[r].raw.from_user+")":i.headline=t.tweetdata[r].raw.user.name+" ("+"@"+t.tweetdata[r].raw.user.screen_name+")";i.asset.media=t.tweetdata[r].content;n.timeline.date.push(i)}VMM.fireEvent(global,VMM.Timeline.Config.events.data_ready,n)}}},data_template_obj:{timeline:{headline:"",description:"",asset:{media:"",credit:"",caption:""},date:[],era:[]}},date_obj:{startDate:"2012,2,2,11,30",headline:"",text:"",asset:{media:"http://youtu.be/vjVfu8-Wp6s",credit:"",caption:""},tags:"Optional"}});VMM.debug=!1; + + +/* CREATE StoryJS Embed +================================================== */ +function createStoryJS(c, src) { + /* VARS + ================================================== */ + var storyjs_embedjs, t, te, x, + js_version = "2.24", + jquery_version_required = "1.7.1", + jquery_version = "", + ready = { + timeout: "", + checks: 0, + finished: false, + js: false, + css: false, + jquery: false, + has_jquery: false, + language: false, + font: { + css: false, + js: false + } + }, + storyjs_e_config = { + version: js_version, + debug: false, + type: 'timeline', + id: 'storyjs', + embed_id: 'timeline-embed', + embed: true, + width: '100%', + height: '100%', + source: 'https://docs.google.com/spreadsheet/pub?key=0Agl_Dv6iEbDadFYzRjJPUGktY0NkWXFUWkVIZDNGRHc&output=html', + lang: 'en', + font: 'Lato, sans-serif', + js: '', + api_keys: { + google: "", + flickr: "", + twitter: "" + }, + gmap_key: "" + }; + + /* BUILD CONFIG + ================================================== */ + if (typeof c == 'object') { + for (x in c) { + if (Object.prototype.hasOwnProperty.call(c, x)) { + storyjs_e_config[x] = c[x]; + } + } + } + + if (typeof src != 'undefined') { + storyjs_e_config.source = src; + } + + /* PREPARE + ================================================== */ + createEmbedDiv(); + + /* On Loaded + ================================================== */ + + onloaded_css(); + onloaded_font_css(); + onloaded_font_js(); + onloaded_js(); + onloaded_check(); + + function onloaded_js() { + ready.js = true; + ready.language = true; + onloaded_check(); + } + function onloaded_css() { + ready.css = true; + onloaded_check(); + } + function onloaded_font_css() { + ready.font.css = true; + onloaded_check(); + } + function onloaded_font_js() { + ready.font.js = true; + onloaded_check(); + } + function onloaded_check() { + if (ready.checks > 40) { + return; + alert("Error Loading Files"); + } else { + ready.checks++; + if (ready.js && ready.css && ready.font.css && ready.font.js && ready.language) { + if (!ready.finished) { + ready.finished = true; + buildEmbed(); + } + } else { + ready.timeout = setTimeout('onloaded_check_again();', 250); + } + } + }; + this.onloaded_check_again = function() { + onloaded_check(); + }; + + /* Build Timeline + ================================================== */ + function createEmbedDiv() { + var embed_classname = "storyjs-embed"; + + t = document.createElement('div'); + + if (storyjs_e_config.embed_id != "") { + te = document.getElementById(storyjs_e_config.embed_id); + } else { + te = document.getElementById("timeline-embed"); + } + + te.appendChild(t); + t.setAttribute("id", storyjs_e_config.id); + + if (storyjs_e_config.width.toString().match("%") ) { + te.style.width = storyjs_e_config.width.split("%")[0] + "%"; + } else { + storyjs_e_config.width = storyjs_e_config.width - 2; + te.style.width = (storyjs_e_config.width) + 'px'; + } + + if (storyjs_e_config.height.toString().match("%")) { + te.style.height = storyjs_e_config.height; + embed_classname += " full-embed"; + te.style.height = storyjs_e_config.height.split("%")[0] + "%"; + + } else if (storyjs_e_config.width.toString().match("%")) { + embed_classname += " full-embed"; + storyjs_e_config.height = storyjs_e_config.height - 16; + te.style.height = (storyjs_e_config.height) + 'px'; + }else { + embed_classname += " sized-embed"; + storyjs_e_config.height = storyjs_e_config.height - 16; + te.style.height = (storyjs_e_config.height) + 'px'; + } + + te.setAttribute("class", embed_classname); + te.setAttribute("className", embed_classname); + t.style.position = 'relative'; + } + + function buildEmbed() { + VMM.debug = storyjs_e_config.debug; + storyjs_embedjs = new VMM.Timeline(storyjs_e_config.id); + storyjs_embedjs.init(storyjs_e_config); + } + +} diff --git a/public/locales/ar/strings.l20n b/public/locales/ar/strings.l20n new file mode 100755 index 0000000..80028f6 --- /dev/null +++ b/public/locales/ar/strings.l20n @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + diff --git a/public/locales/ch/strings.l20n b/public/locales/ch/strings.l20n new file mode 100755 index 0000000..ecef9c9 --- /dev/null +++ b/public/locales/ch/strings.l20n @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + diff --git a/public/locales/en-US/strings.l20n b/public/locales/en-US/strings.l20n new file mode 100755 index 0000000..17c6e5d --- /dev/null +++ b/public/locales/en-US/strings.l20n @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + diff --git a/public/locales/fr/strings.l20n b/public/locales/fr/strings.l20n new file mode 100755 index 0000000..5d0d2c1 --- /dev/null +++ b/public/locales/fr/strings.l20n @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + diff --git a/public/locales/ge/strings.l20n b/public/locales/ge/strings.l20n new file mode 100755 index 0000000..a4f7b68 --- /dev/null +++ b/public/locales/ge/strings.l20n @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + diff --git a/public/locales/it/strings.l20n b/public/locales/it/strings.l20n new file mode 100755 index 0000000..495bec2 --- /dev/null +++ b/public/locales/it/strings.l20n @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + diff --git a/public/vendors/loader.css b/public/vendors/loader.css new file mode 100644 index 0000000..0515d51 --- /dev/null +++ b/public/vendors/loader.css @@ -0,0 +1 @@ +.z-depth-1{box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12)}.z-depth-1-half{box-shadow:0 5px 11px 0 rgba(0,0,0,0.18),0 4px 15px 0 rgba(0,0,0,0.15)}.z-depth-2{box-shadow:0 8px 17px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)}.z-depth-3{box-shadow:0 12px 15px 0 rgba(0,0,0,0.24),0 17px 50px 0 rgba(0,0,0,0.19)}.z-depth-4{box-shadow:0 16px 28px 0 rgba(0,0,0,0.22),0 25px 55px 0 rgba(0,0,0,0.21)}.z-depth-5{box-shadow:0 27px 24px 0 rgba(0,0,0,0.2),0 40px 77px 0 rgba(0,0,0,0.22)}#loader-container{background:#EDF0F1 url("../assets/images//audio.svg") no-repeat center center;position:fixed;overflow:hidden;top:0;right:0;left:0;bottom:0;z-index:99999} diff --git a/public/vendors/material-design-icons/iconfont/MaterialIcons-Regular.eot b/public/vendors/material-design-icons/iconfont/MaterialIcons-Regular.eot new file mode 100755 index 0000000..70508eb Binary files /dev/null and b/public/vendors/material-design-icons/iconfont/MaterialIcons-Regular.eot differ diff --git a/public/vendors/material-design-icons/iconfont/MaterialIcons-Regular.ijmap b/public/vendors/material-design-icons/iconfont/MaterialIcons-Regular.ijmap new file mode 100755 index 0000000..d9f1d25 --- /dev/null +++ b/public/vendors/material-design-icons/iconfont/MaterialIcons-Regular.ijmap @@ -0,0 +1 @@ +{"icons":{"e84d":{"name":"3d Rotation"},"eb3b":{"name":"Ac Unit"},"e190":{"name":"Access Alarm"},"e191":{"name":"Access Alarms"},"e192":{"name":"Access Time"},"e84e":{"name":"Accessibility"},"e914":{"name":"Accessible"},"e84f":{"name":"Account Balance"},"e850":{"name":"Account Balance Wallet"},"e851":{"name":"Account Box"},"e853":{"name":"Account Circle"},"e60e":{"name":"Adb"},"e145":{"name":"Add"},"e439":{"name":"Add A Photo"},"e193":{"name":"Add Alarm"},"e003":{"name":"Add Alert"},"e146":{"name":"Add Box"},"e147":{"name":"Add Circle"},"e148":{"name":"Add Circle Outline"},"e567":{"name":"Add Location"},"e854":{"name":"Add Shopping Cart"},"e39d":{"name":"Add To Photos"},"e05c":{"name":"Add To Queue"},"e39e":{"name":"Adjust"},"e630":{"name":"Airline Seat Flat"},"e631":{"name":"Airline Seat Flat Angled"},"e632":{"name":"Airline Seat Individual Suite"},"e633":{"name":"Airline Seat Legroom Extra"},"e634":{"name":"Airline Seat Legroom Normal"},"e635":{"name":"Airline Seat Legroom Reduced"},"e636":{"name":"Airline Seat Recline Extra"},"e637":{"name":"Airline Seat Recline Normal"},"e195":{"name":"Airplanemode Active"},"e194":{"name":"Airplanemode Inactive"},"e055":{"name":"Airplay"},"eb3c":{"name":"Airport Shuttle"},"e855":{"name":"Alarm"},"e856":{"name":"Alarm Add"},"e857":{"name":"Alarm Off"},"e858":{"name":"Alarm On"},"e019":{"name":"Album"},"eb3d":{"name":"All Inclusive"},"e90b":{"name":"All Out"},"e859":{"name":"Android"},"e85a":{"name":"Announcement"},"e5c3":{"name":"Apps"},"e149":{"name":"Archive"},"e5c4":{"name":"Arrow Back"},"e5db":{"name":"Arrow Downward"},"e5c5":{"name":"Arrow Drop Down"},"e5c6":{"name":"Arrow Drop Down Circle"},"e5c7":{"name":"Arrow Drop Up"},"e5c8":{"name":"Arrow Forward"},"e5d8":{"name":"Arrow Upward"},"e060":{"name":"Art Track"},"e85b":{"name":"Aspect Ratio"},"e85c":{"name":"Assessment"},"e85d":{"name":"Assignment"},"e85e":{"name":"Assignment Ind"},"e85f":{"name":"Assignment Late"},"e860":{"name":"Assignment Return"},"e861":{"name":"Assignment Returned"},"e862":{"name":"Assignment Turned In"},"e39f":{"name":"Assistant"},"e3a0":{"name":"Assistant Photo"},"e226":{"name":"Attach File"},"e227":{"name":"Attach Money"},"e2bc":{"name":"Attachment"},"e3a1":{"name":"Audiotrack"},"e863":{"name":"Autorenew"},"e01b":{"name":"Av Timer"},"e14a":{"name":"Backspace"},"e864":{"name":"Backup"},"e19c":{"name":"Battery Alert"},"e1a3":{"name":"Battery Charging Full"},"e1a4":{"name":"Battery Full"},"e1a5":{"name":"Battery Std"},"e1a6":{"name":"Battery Unknown"},"eb3e":{"name":"Beach Access"},"e52d":{"name":"Beenhere"},"e14b":{"name":"Block"},"e1a7":{"name":"Bluetooth"},"e60f":{"name":"Bluetooth Audio"},"e1a8":{"name":"Bluetooth Connected"},"e1a9":{"name":"Bluetooth Disabled"},"e1aa":{"name":"Bluetooth Searching"},"e3a2":{"name":"Blur Circular"},"e3a3":{"name":"Blur Linear"},"e3a4":{"name":"Blur Off"},"e3a5":{"name":"Blur On"},"e865":{"name":"Book"},"e866":{"name":"Bookmark"},"e867":{"name":"Bookmark Border"},"e228":{"name":"Border All"},"e229":{"name":"Border Bottom"},"e22a":{"name":"Border Clear"},"e22b":{"name":"Border Color"},"e22c":{"name":"Border Horizontal"},"e22d":{"name":"Border Inner"},"e22e":{"name":"Border Left"},"e22f":{"name":"Border Outer"},"e230":{"name":"Border Right"},"e231":{"name":"Border Style"},"e232":{"name":"Border Top"},"e233":{"name":"Border Vertical"},"e06b":{"name":"Branding Watermark"},"e3a6":{"name":"Brightness 1"},"e3a7":{"name":"Brightness 2"},"e3a8":{"name":"Brightness 3"},"e3a9":{"name":"Brightness 4"},"e3aa":{"name":"Brightness 5"},"e3ab":{"name":"Brightness 6"},"e3ac":{"name":"Brightness 7"},"e1ab":{"name":"Brightness Auto"},"e1ac":{"name":"Brightness High"},"e1ad":{"name":"Brightness Low"},"e1ae":{"name":"Brightness Medium"},"e3ad":{"name":"Broken Image"},"e3ae":{"name":"Brush"},"e6dd":{"name":"Bubble Chart"},"e868":{"name":"Bug Report"},"e869":{"name":"Build"},"e43c":{"name":"Burst Mode"},"e0af":{"name":"Business"},"eb3f":{"name":"Business Center"},"e86a":{"name":"Cached"},"e7e9":{"name":"Cake"},"e0b0":{"name":"Call"},"e0b1":{"name":"Call End"},"e0b2":{"name":"Call Made"},"e0b3":{"name":"Call Merge"},"e0b4":{"name":"Call Missed"},"e0e4":{"name":"Call Missed Outgoing"},"e0b5":{"name":"Call Received"},"e0b6":{"name":"Call Split"},"e06c":{"name":"Call To Action"},"e3af":{"name":"Camera"},"e3b0":{"name":"Camera Alt"},"e8fc":{"name":"Camera Enhance"},"e3b1":{"name":"Camera Front"},"e3b2":{"name":"Camera Rear"},"e3b3":{"name":"Camera Roll"},"e5c9":{"name":"Cancel"},"e8f6":{"name":"Card Giftcard"},"e8f7":{"name":"Card Membership"},"e8f8":{"name":"Card Travel"},"eb40":{"name":"Casino"},"e307":{"name":"Cast"},"e308":{"name":"Cast Connected"},"e3b4":{"name":"Center Focus Strong"},"e3b5":{"name":"Center Focus Weak"},"e86b":{"name":"Change History"},"e0b7":{"name":"Chat"},"e0ca":{"name":"Chat Bubble"},"e0cb":{"name":"Chat Bubble Outline"},"e5ca":{"name":"Check"},"e834":{"name":"Check Box"},"e835":{"name":"Check Box Outline Blank"},"e86c":{"name":"Check Circle"},"e5cb":{"name":"Chevron Left"},"e5cc":{"name":"Chevron Right"},"eb41":{"name":"Child Care"},"eb42":{"name":"Child Friendly"},"e86d":{"name":"Chrome Reader Mode"},"e86e":{"name":"Class"},"e14c":{"name":"Clear"},"e0b8":{"name":"Clear All"},"e5cd":{"name":"Close"},"e01c":{"name":"Closed Caption"},"e2bd":{"name":"Cloud"},"e2be":{"name":"Cloud Circle"},"e2bf":{"name":"Cloud Done"},"e2c0":{"name":"Cloud Download"},"e2c1":{"name":"Cloud Off"},"e2c2":{"name":"Cloud Queue"},"e2c3":{"name":"Cloud Upload"},"e86f":{"name":"Code"},"e3b6":{"name":"Collections"},"e431":{"name":"Collections Bookmark"},"e3b7":{"name":"Color Lens"},"e3b8":{"name":"Colorize"},"e0b9":{"name":"Comment"},"e3b9":{"name":"Compare"},"e915":{"name":"Compare Arrows"},"e30a":{"name":"Computer"},"e638":{"name":"Confirmation Number"},"e0d0":{"name":"Contact Mail"},"e0cf":{"name":"Contact Phone"},"e0ba":{"name":"Contacts"},"e14d":{"name":"Content Copy"},"e14e":{"name":"Content Cut"},"e14f":{"name":"Content Paste"},"e3ba":{"name":"Control Point"},"e3bb":{"name":"Control Point Duplicate"},"e90c":{"name":"Copyright"},"e150":{"name":"Create"},"e2cc":{"name":"Create New Folder"},"e870":{"name":"Credit Card"},"e3be":{"name":"Crop"},"e3bc":{"name":"Crop 16 9"},"e3bd":{"name":"Crop 3 2"},"e3bf":{"name":"Crop 5 4"},"e3c0":{"name":"Crop 7 5"},"e3c1":{"name":"Crop Din"},"e3c2":{"name":"Crop Free"},"e3c3":{"name":"Crop Landscape"},"e3c4":{"name":"Crop Original"},"e3c5":{"name":"Crop Portrait"},"e437":{"name":"Crop Rotate"},"e3c6":{"name":"Crop Square"},"e871":{"name":"Dashboard"},"e1af":{"name":"Data Usage"},"e916":{"name":"Date Range"},"e3c7":{"name":"Dehaze"},"e872":{"name":"Delete"},"e92b":{"name":"Delete Forever"},"e16c":{"name":"Delete Sweep"},"e873":{"name":"Description"},"e30b":{"name":"Desktop Mac"},"e30c":{"name":"Desktop Windows"},"e3c8":{"name":"Details"},"e30d":{"name":"Developer Board"},"e1b0":{"name":"Developer Mode"},"e335":{"name":"Device Hub"},"e1b1":{"name":"Devices"},"e337":{"name":"Devices Other"},"e0bb":{"name":"Dialer Sip"},"e0bc":{"name":"Dialpad"},"e52e":{"name":"Directions"},"e52f":{"name":"Directions Bike"},"e532":{"name":"Directions Boat"},"e530":{"name":"Directions Bus"},"e531":{"name":"Directions Car"},"e534":{"name":"Directions Railway"},"e566":{"name":"Directions Run"},"e533":{"name":"Directions Subway"},"e535":{"name":"Directions Transit"},"e536":{"name":"Directions Walk"},"e610":{"name":"Disc Full"},"e875":{"name":"Dns"},"e612":{"name":"Do Not Disturb"},"e611":{"name":"Do Not Disturb Alt"},"e643":{"name":"Do Not Disturb Off"},"e644":{"name":"Do Not Disturb On"},"e30e":{"name":"Dock"},"e7ee":{"name":"Domain"},"e876":{"name":"Done"},"e877":{"name":"Done All"},"e917":{"name":"Donut Large"},"e918":{"name":"Donut Small"},"e151":{"name":"Drafts"},"e25d":{"name":"Drag Handle"},"e613":{"name":"Drive Eta"},"e1b2":{"name":"Dvr"},"e3c9":{"name":"Edit"},"e568":{"name":"Edit Location"},"e8fb":{"name":"Eject"},"e0be":{"name":"Email"},"e63f":{"name":"Enhanced Encryption"},"e01d":{"name":"Equalizer"},"e000":{"name":"Error"},"e001":{"name":"Error Outline"},"e926":{"name":"Euro Symbol"},"e56d":{"name":"Ev Station"},"e878":{"name":"Event"},"e614":{"name":"Event Available"},"e615":{"name":"Event Busy"},"e616":{"name":"Event Note"},"e903":{"name":"Event Seat"},"e879":{"name":"Exit To App"},"e5ce":{"name":"Expand Less"},"e5cf":{"name":"Expand More"},"e01e":{"name":"Explicit"},"e87a":{"name":"Explore"},"e3ca":{"name":"Exposure"},"e3cb":{"name":"Exposure Neg 1"},"e3cc":{"name":"Exposure Neg 2"},"e3cd":{"name":"Exposure Plus 1"},"e3ce":{"name":"Exposure Plus 2"},"e3cf":{"name":"Exposure Zero"},"e87b":{"name":"Extension"},"e87c":{"name":"Face"},"e01f":{"name":"Fast Forward"},"e020":{"name":"Fast Rewind"},"e87d":{"name":"Favorite"},"e87e":{"name":"Favorite Border"},"e06d":{"name":"Featured Play List"},"e06e":{"name":"Featured Video"},"e87f":{"name":"Feedback"},"e05d":{"name":"Fiber Dvr"},"e061":{"name":"Fiber Manual Record"},"e05e":{"name":"Fiber New"},"e06a":{"name":"Fiber Pin"},"e062":{"name":"Fiber Smart Record"},"e2c4":{"name":"File Download"},"e2c6":{"name":"File Upload"},"e3d3":{"name":"Filter"},"e3d0":{"name":"Filter 1"},"e3d1":{"name":"Filter 2"},"e3d2":{"name":"Filter 3"},"e3d4":{"name":"Filter 4"},"e3d5":{"name":"Filter 5"},"e3d6":{"name":"Filter 6"},"e3d7":{"name":"Filter 7"},"e3d8":{"name":"Filter 8"},"e3d9":{"name":"Filter 9"},"e3da":{"name":"Filter 9 Plus"},"e3db":{"name":"Filter B And W"},"e3dc":{"name":"Filter Center Focus"},"e3dd":{"name":"Filter Drama"},"e3de":{"name":"Filter Frames"},"e3df":{"name":"Filter Hdr"},"e152":{"name":"Filter List"},"e3e0":{"name":"Filter None"},"e3e2":{"name":"Filter Tilt Shift"},"e3e3":{"name":"Filter Vintage"},"e880":{"name":"Find In Page"},"e881":{"name":"Find Replace"},"e90d":{"name":"Fingerprint"},"e5dc":{"name":"First Page"},"eb43":{"name":"Fitness Center"},"e153":{"name":"Flag"},"e3e4":{"name":"Flare"},"e3e5":{"name":"Flash Auto"},"e3e6":{"name":"Flash Off"},"e3e7":{"name":"Flash On"},"e539":{"name":"Flight"},"e904":{"name":"Flight Land"},"e905":{"name":"Flight Takeoff"},"e3e8":{"name":"Flip"},"e882":{"name":"Flip To Back"},"e883":{"name":"Flip To Front"},"e2c7":{"name":"Folder"},"e2c8":{"name":"Folder Open"},"e2c9":{"name":"Folder Shared"},"e617":{"name":"Folder Special"},"e167":{"name":"Font Download"},"e234":{"name":"Format Align Center"},"e235":{"name":"Format Align Justify"},"e236":{"name":"Format Align Left"},"e237":{"name":"Format Align Right"},"e238":{"name":"Format Bold"},"e239":{"name":"Format Clear"},"e23a":{"name":"Format Color Fill"},"e23b":{"name":"Format Color Reset"},"e23c":{"name":"Format Color Text"},"e23d":{"name":"Format Indent Decrease"},"e23e":{"name":"Format Indent Increase"},"e23f":{"name":"Format Italic"},"e240":{"name":"Format Line Spacing"},"e241":{"name":"Format List Bulleted"},"e242":{"name":"Format List Numbered"},"e243":{"name":"Format Paint"},"e244":{"name":"Format Quote"},"e25e":{"name":"Format Shapes"},"e245":{"name":"Format Size"},"e246":{"name":"Format Strikethrough"},"e247":{"name":"Format Textdirection L To R"},"e248":{"name":"Format Textdirection R To L"},"e249":{"name":"Format Underlined"},"e0bf":{"name":"Forum"},"e154":{"name":"Forward"},"e056":{"name":"Forward 10"},"e057":{"name":"Forward 30"},"e058":{"name":"Forward 5"},"eb44":{"name":"Free Breakfast"},"e5d0":{"name":"Fullscreen"},"e5d1":{"name":"Fullscreen Exit"},"e24a":{"name":"Functions"},"e927":{"name":"G Translate"},"e30f":{"name":"Gamepad"},"e021":{"name":"Games"},"e90e":{"name":"Gavel"},"e155":{"name":"Gesture"},"e884":{"name":"Get App"},"e908":{"name":"Gif"},"eb45":{"name":"Golf Course"},"e1b3":{"name":"Gps Fixed"},"e1b4":{"name":"Gps Not Fixed"},"e1b5":{"name":"Gps Off"},"e885":{"name":"Grade"},"e3e9":{"name":"Gradient"},"e3ea":{"name":"Grain"},"e1b8":{"name":"Graphic Eq"},"e3eb":{"name":"Grid Off"},"e3ec":{"name":"Grid On"},"e7ef":{"name":"Group"},"e7f0":{"name":"Group Add"},"e886":{"name":"Group Work"},"e052":{"name":"Hd"},"e3ed":{"name":"Hdr Off"},"e3ee":{"name":"Hdr On"},"e3f1":{"name":"Hdr Strong"},"e3f2":{"name":"Hdr Weak"},"e310":{"name":"Headset"},"e311":{"name":"Headset Mic"},"e3f3":{"name":"Healing"},"e023":{"name":"Hearing"},"e887":{"name":"Help"},"e8fd":{"name":"Help Outline"},"e024":{"name":"High Quality"},"e25f":{"name":"Highlight"},"e888":{"name":"Highlight Off"},"e889":{"name":"History"},"e88a":{"name":"Home"},"eb46":{"name":"Hot Tub"},"e53a":{"name":"Hotel"},"e88b":{"name":"Hourglass Empty"},"e88c":{"name":"Hourglass Full"},"e902":{"name":"Http"},"e88d":{"name":"Https"},"e3f4":{"name":"Image"},"e3f5":{"name":"Image Aspect Ratio"},"e0e0":{"name":"Import Contacts"},"e0c3":{"name":"Import Export"},"e912":{"name":"Important Devices"},"e156":{"name":"Inbox"},"e909":{"name":"Indeterminate Check Box"},"e88e":{"name":"Info"},"e88f":{"name":"Info Outline"},"e890":{"name":"Input"},"e24b":{"name":"Insert Chart"},"e24c":{"name":"Insert Comment"},"e24d":{"name":"Insert Drive File"},"e24e":{"name":"Insert Emoticon"},"e24f":{"name":"Insert Invitation"},"e250":{"name":"Insert Link"},"e251":{"name":"Insert Photo"},"e891":{"name":"Invert Colors"},"e0c4":{"name":"Invert Colors Off"},"e3f6":{"name":"Iso"},"e312":{"name":"Keyboard"},"e313":{"name":"Keyboard Arrow Down"},"e314":{"name":"Keyboard Arrow Left"},"e315":{"name":"Keyboard Arrow Right"},"e316":{"name":"Keyboard Arrow Up"},"e317":{"name":"Keyboard Backspace"},"e318":{"name":"Keyboard Capslock"},"e31a":{"name":"Keyboard Hide"},"e31b":{"name":"Keyboard Return"},"e31c":{"name":"Keyboard Tab"},"e31d":{"name":"Keyboard Voice"},"eb47":{"name":"Kitchen"},"e892":{"name":"Label"},"e893":{"name":"Label Outline"},"e3f7":{"name":"Landscape"},"e894":{"name":"Language"},"e31e":{"name":"Laptop"},"e31f":{"name":"Laptop Chromebook"},"e320":{"name":"Laptop Mac"},"e321":{"name":"Laptop Windows"},"e5dd":{"name":"Last Page"},"e895":{"name":"Launch"},"e53b":{"name":"Layers"},"e53c":{"name":"Layers Clear"},"e3f8":{"name":"Leak Add"},"e3f9":{"name":"Leak Remove"},"e3fa":{"name":"Lens"},"e02e":{"name":"Library Add"},"e02f":{"name":"Library Books"},"e030":{"name":"Library Music"},"e90f":{"name":"Lightbulb Outline"},"e919":{"name":"Line Style"},"e91a":{"name":"Line Weight"},"e260":{"name":"Linear Scale"},"e157":{"name":"Link"},"e438":{"name":"Linked Camera"},"e896":{"name":"List"},"e0c6":{"name":"Live Help"},"e639":{"name":"Live Tv"},"e53f":{"name":"Local Activity"},"e53d":{"name":"Local Airport"},"e53e":{"name":"Local Atm"},"e540":{"name":"Local Bar"},"e541":{"name":"Local Cafe"},"e542":{"name":"Local Car Wash"},"e543":{"name":"Local Convenience Store"},"e556":{"name":"Local Dining"},"e544":{"name":"Local Drink"},"e545":{"name":"Local Florist"},"e546":{"name":"Local Gas Station"},"e547":{"name":"Local Grocery Store"},"e548":{"name":"Local Hospital"},"e549":{"name":"Local Hotel"},"e54a":{"name":"Local Laundry Service"},"e54b":{"name":"Local Library"},"e54c":{"name":"Local Mall"},"e54d":{"name":"Local Movies"},"e54e":{"name":"Local Offer"},"e54f":{"name":"Local Parking"},"e550":{"name":"Local Pharmacy"},"e551":{"name":"Local Phone"},"e552":{"name":"Local Pizza"},"e553":{"name":"Local Play"},"e554":{"name":"Local Post Office"},"e555":{"name":"Local Printshop"},"e557":{"name":"Local See"},"e558":{"name":"Local Shipping"},"e559":{"name":"Local Taxi"},"e7f1":{"name":"Location City"},"e1b6":{"name":"Location Disabled"},"e0c7":{"name":"Location Off"},"e0c8":{"name":"Location On"},"e1b7":{"name":"Location Searching"},"e897":{"name":"Lock"},"e898":{"name":"Lock Open"},"e899":{"name":"Lock Outline"},"e3fc":{"name":"Looks"},"e3fb":{"name":"Looks 3"},"e3fd":{"name":"Looks 4"},"e3fe":{"name":"Looks 5"},"e3ff":{"name":"Looks 6"},"e400":{"name":"Looks One"},"e401":{"name":"Looks Two"},"e028":{"name":"Loop"},"e402":{"name":"Loupe"},"e16d":{"name":"Low Priority"},"e89a":{"name":"Loyalty"},"e158":{"name":"Mail"},"e0e1":{"name":"Mail Outline"},"e55b":{"name":"Map"},"e159":{"name":"Markunread"},"e89b":{"name":"Markunread Mailbox"},"e322":{"name":"Memory"},"e5d2":{"name":"Menu"},"e252":{"name":"Merge Type"},"e0c9":{"name":"Message"},"e029":{"name":"Mic"},"e02a":{"name":"Mic None"},"e02b":{"name":"Mic Off"},"e618":{"name":"Mms"},"e253":{"name":"Mode Comment"},"e254":{"name":"Mode Edit"},"e263":{"name":"Monetization On"},"e25c":{"name":"Money Off"},"e403":{"name":"Monochrome Photos"},"e7f2":{"name":"Mood"},"e7f3":{"name":"Mood Bad"},"e619":{"name":"More"},"e5d3":{"name":"More Horiz"},"e5d4":{"name":"More Vert"},"e91b":{"name":"Motorcycle"},"e323":{"name":"Mouse"},"e168":{"name":"Move To Inbox"},"e02c":{"name":"Movie"},"e404":{"name":"Movie Creation"},"e43a":{"name":"Movie Filter"},"e6df":{"name":"Multiline Chart"},"e405":{"name":"Music Note"},"e063":{"name":"Music Video"},"e55c":{"name":"My Location"},"e406":{"name":"Nature"},"e407":{"name":"Nature People"},"e408":{"name":"Navigate Before"},"e409":{"name":"Navigate Next"},"e55d":{"name":"Navigation"},"e569":{"name":"Near Me"},"e1b9":{"name":"Network Cell"},"e640":{"name":"Network Check"},"e61a":{"name":"Network Locked"},"e1ba":{"name":"Network Wifi"},"e031":{"name":"New Releases"},"e16a":{"name":"Next Week"},"e1bb":{"name":"Nfc"},"e641":{"name":"No Encryption"},"e0cc":{"name":"No Sim"},"e033":{"name":"Not Interested"},"e06f":{"name":"Note"},"e89c":{"name":"Note Add"},"e7f4":{"name":"Notifications"},"e7f7":{"name":"Notifications Active"},"e7f5":{"name":"Notifications None"},"e7f6":{"name":"Notifications Off"},"e7f8":{"name":"Notifications Paused"},"e90a":{"name":"Offline Pin"},"e63a":{"name":"Ondemand Video"},"e91c":{"name":"Opacity"},"e89d":{"name":"Open In Browser"},"e89e":{"name":"Open In New"},"e89f":{"name":"Open With"},"e7f9":{"name":"Pages"},"e8a0":{"name":"Pageview"},"e40a":{"name":"Palette"},"e925":{"name":"Pan Tool"},"e40b":{"name":"Panorama"},"e40c":{"name":"Panorama Fish Eye"},"e40d":{"name":"Panorama Horizontal"},"e40e":{"name":"Panorama Vertical"},"e40f":{"name":"Panorama Wide Angle"},"e7fa":{"name":"Party Mode"},"e034":{"name":"Pause"},"e035":{"name":"Pause Circle Filled"},"e036":{"name":"Pause Circle Outline"},"e8a1":{"name":"Payment"},"e7fb":{"name":"People"},"e7fc":{"name":"People Outline"},"e8a2":{"name":"Perm Camera Mic"},"e8a3":{"name":"Perm Contact Calendar"},"e8a4":{"name":"Perm Data Setting"},"e8a5":{"name":"Perm Device Information"},"e8a6":{"name":"Perm Identity"},"e8a7":{"name":"Perm Media"},"e8a8":{"name":"Perm Phone Msg"},"e8a9":{"name":"Perm Scan Wifi"},"e7fd":{"name":"Person"},"e7fe":{"name":"Person Add"},"e7ff":{"name":"Person Outline"},"e55a":{"name":"Person Pin"},"e56a":{"name":"Person Pin Circle"},"e63b":{"name":"Personal Video"},"e91d":{"name":"Pets"},"e0cd":{"name":"Phone"},"e324":{"name":"Phone Android"},"e61b":{"name":"Phone Bluetooth Speaker"},"e61c":{"name":"Phone Forwarded"},"e61d":{"name":"Phone In Talk"},"e325":{"name":"Phone Iphone"},"e61e":{"name":"Phone Locked"},"e61f":{"name":"Phone Missed"},"e620":{"name":"Phone Paused"},"e326":{"name":"Phonelink"},"e0db":{"name":"Phonelink Erase"},"e0dc":{"name":"Phonelink Lock"},"e327":{"name":"Phonelink Off"},"e0dd":{"name":"Phonelink Ring"},"e0de":{"name":"Phonelink Setup"},"e410":{"name":"Photo"},"e411":{"name":"Photo Album"},"e412":{"name":"Photo Camera"},"e43b":{"name":"Photo Filter"},"e413":{"name":"Photo Library"},"e432":{"name":"Photo Size Select Actual"},"e433":{"name":"Photo Size Select Large"},"e434":{"name":"Photo Size Select Small"},"e415":{"name":"Picture As Pdf"},"e8aa":{"name":"Picture In Picture"},"e911":{"name":"Picture In Picture Alt"},"e6c4":{"name":"Pie Chart"},"e6c5":{"name":"Pie Chart Outlined"},"e55e":{"name":"Pin Drop"},"e55f":{"name":"Place"},"e037":{"name":"Play Arrow"},"e038":{"name":"Play Circle Filled"},"e039":{"name":"Play Circle Outline"},"e906":{"name":"Play For Work"},"e03b":{"name":"Playlist Add"},"e065":{"name":"Playlist Add Check"},"e05f":{"name":"Playlist Play"},"e800":{"name":"Plus One"},"e801":{"name":"Poll"},"e8ab":{"name":"Polymer"},"eb48":{"name":"Pool"},"e0ce":{"name":"Portable Wifi Off"},"e416":{"name":"Portrait"},"e63c":{"name":"Power"},"e336":{"name":"Power Input"},"e8ac":{"name":"Power Settings New"},"e91e":{"name":"Pregnant Woman"},"e0df":{"name":"Present To All"},"e8ad":{"name":"Print"},"e645":{"name":"Priority High"},"e80b":{"name":"Public"},"e255":{"name":"Publish"},"e8ae":{"name":"Query Builder"},"e8af":{"name":"Question Answer"},"e03c":{"name":"Queue"},"e03d":{"name":"Queue Music"},"e066":{"name":"Queue Play Next"},"e03e":{"name":"Radio"},"e837":{"name":"Radio Button Checked"},"e836":{"name":"Radio Button Unchecked"},"e560":{"name":"Rate Review"},"e8b0":{"name":"Receipt"},"e03f":{"name":"Recent Actors"},"e91f":{"name":"Record Voice Over"},"e8b1":{"name":"Redeem"},"e15a":{"name":"Redo"},"e5d5":{"name":"Refresh"},"e15b":{"name":"Remove"},"e15c":{"name":"Remove Circle"},"e15d":{"name":"Remove Circle Outline"},"e067":{"name":"Remove From Queue"},"e417":{"name":"Remove Red Eye"},"e928":{"name":"Remove Shopping Cart"},"e8fe":{"name":"Reorder"},"e040":{"name":"Repeat"},"e041":{"name":"Repeat One"},"e042":{"name":"Replay"},"e059":{"name":"Replay 10"},"e05a":{"name":"Replay 30"},"e05b":{"name":"Replay 5"},"e15e":{"name":"Reply"},"e15f":{"name":"Reply All"},"e160":{"name":"Report"},"e8b2":{"name":"Report Problem"},"e56c":{"name":"Restaurant"},"e561":{"name":"Restaurant Menu"},"e8b3":{"name":"Restore"},"e929":{"name":"Restore Page"},"e0d1":{"name":"Ring Volume"},"e8b4":{"name":"Room"},"eb49":{"name":"Room Service"},"e418":{"name":"Rotate 90 Degrees Ccw"},"e419":{"name":"Rotate Left"},"e41a":{"name":"Rotate Right"},"e920":{"name":"Rounded Corner"},"e328":{"name":"Router"},"e921":{"name":"Rowing"},"e0e5":{"name":"Rss Feed"},"e642":{"name":"Rv Hookup"},"e562":{"name":"Satellite"},"e161":{"name":"Save"},"e329":{"name":"Scanner"},"e8b5":{"name":"Schedule"},"e80c":{"name":"School"},"e1be":{"name":"Screen Lock Landscape"},"e1bf":{"name":"Screen Lock Portrait"},"e1c0":{"name":"Screen Lock Rotation"},"e1c1":{"name":"Screen Rotation"},"e0e2":{"name":"Screen Share"},"e623":{"name":"Sd Card"},"e1c2":{"name":"Sd Storage"},"e8b6":{"name":"Search"},"e32a":{"name":"Security"},"e162":{"name":"Select All"},"e163":{"name":"Send"},"e811":{"name":"Sentiment Dissatisfied"},"e812":{"name":"Sentiment Neutral"},"e813":{"name":"Sentiment Satisfied"},"e814":{"name":"Sentiment Very Dissatisfied"},"e815":{"name":"Sentiment Very Satisfied"},"e8b8":{"name":"Settings"},"e8b9":{"name":"Settings Applications"},"e8ba":{"name":"Settings Backup Restore"},"e8bb":{"name":"Settings Bluetooth"},"e8bd":{"name":"Settings Brightness"},"e8bc":{"name":"Settings Cell"},"e8be":{"name":"Settings Ethernet"},"e8bf":{"name":"Settings Input Antenna"},"e8c0":{"name":"Settings Input Component"},"e8c1":{"name":"Settings Input Composite"},"e8c2":{"name":"Settings Input Hdmi"},"e8c3":{"name":"Settings Input Svideo"},"e8c4":{"name":"Settings Overscan"},"e8c5":{"name":"Settings Phone"},"e8c6":{"name":"Settings Power"},"e8c7":{"name":"Settings Remote"},"e1c3":{"name":"Settings System Daydream"},"e8c8":{"name":"Settings Voice"},"e80d":{"name":"Share"},"e8c9":{"name":"Shop"},"e8ca":{"name":"Shop Two"},"e8cb":{"name":"Shopping Basket"},"e8cc":{"name":"Shopping Cart"},"e261":{"name":"Short Text"},"e6e1":{"name":"Show Chart"},"e043":{"name":"Shuffle"},"e1c8":{"name":"Signal Cellular 4 Bar"},"e1cd":{"name":"Signal Cellular Connected No Internet 4 Bar"},"e1ce":{"name":"Signal Cellular No Sim"},"e1cf":{"name":"Signal Cellular Null"},"e1d0":{"name":"Signal Cellular Off"},"e1d8":{"name":"Signal Wifi 4 Bar"},"e1d9":{"name":"Signal Wifi 4 Bar Lock"},"e1da":{"name":"Signal Wifi Off"},"e32b":{"name":"Sim Card"},"e624":{"name":"Sim Card Alert"},"e044":{"name":"Skip Next"},"e045":{"name":"Skip Previous"},"e41b":{"name":"Slideshow"},"e068":{"name":"Slow Motion Video"},"e32c":{"name":"Smartphone"},"eb4a":{"name":"Smoke Free"},"eb4b":{"name":"Smoking Rooms"},"e625":{"name":"Sms"},"e626":{"name":"Sms Failed"},"e046":{"name":"Snooze"},"e164":{"name":"Sort"},"e053":{"name":"Sort By Alpha"},"eb4c":{"name":"Spa"},"e256":{"name":"Space Bar"},"e32d":{"name":"Speaker"},"e32e":{"name":"Speaker Group"},"e8cd":{"name":"Speaker Notes"},"e92a":{"name":"Speaker Notes Off"},"e0d2":{"name":"Speaker Phone"},"e8ce":{"name":"Spellcheck"},"e838":{"name":"Star"},"e83a":{"name":"Star Border"},"e839":{"name":"Star Half"},"e8d0":{"name":"Stars"},"e0d3":{"name":"Stay Current Landscape"},"e0d4":{"name":"Stay Current Portrait"},"e0d5":{"name":"Stay Primary Landscape"},"e0d6":{"name":"Stay Primary Portrait"},"e047":{"name":"Stop"},"e0e3":{"name":"Stop Screen Share"},"e1db":{"name":"Storage"},"e8d1":{"name":"Store"},"e563":{"name":"Store Mall Directory"},"e41c":{"name":"Straighten"},"e56e":{"name":"Streetview"},"e257":{"name":"Strikethrough S"},"e41d":{"name":"Style"},"e5d9":{"name":"Subdirectory Arrow Left"},"e5da":{"name":"Subdirectory Arrow Right"},"e8d2":{"name":"Subject"},"e064":{"name":"Subscriptions"},"e048":{"name":"Subtitles"},"e56f":{"name":"Subway"},"e8d3":{"name":"Supervisor Account"},"e049":{"name":"Surround Sound"},"e0d7":{"name":"Swap Calls"},"e8d4":{"name":"Swap Horiz"},"e8d5":{"name":"Swap Vert"},"e8d6":{"name":"Swap Vertical Circle"},"e41e":{"name":"Switch Camera"},"e41f":{"name":"Switch Video"},"e627":{"name":"Sync"},"e628":{"name":"Sync Disabled"},"e629":{"name":"Sync Problem"},"e62a":{"name":"System Update"},"e8d7":{"name":"System Update Alt"},"e8d8":{"name":"Tab"},"e8d9":{"name":"Tab Unselected"},"e32f":{"name":"Tablet"},"e330":{"name":"Tablet Android"},"e331":{"name":"Tablet Mac"},"e420":{"name":"Tag Faces"},"e62b":{"name":"Tap And Play"},"e564":{"name":"Terrain"},"e262":{"name":"Text Fields"},"e165":{"name":"Text Format"},"e0d8":{"name":"Textsms"},"e421":{"name":"Texture"},"e8da":{"name":"Theaters"},"e8db":{"name":"Thumb Down"},"e8dc":{"name":"Thumb Up"},"e8dd":{"name":"Thumbs Up Down"},"e62c":{"name":"Time To Leave"},"e422":{"name":"Timelapse"},"e922":{"name":"Timeline"},"e425":{"name":"Timer"},"e423":{"name":"Timer 10"},"e424":{"name":"Timer 3"},"e426":{"name":"Timer Off"},"e264":{"name":"Title"},"e8de":{"name":"Toc"},"e8df":{"name":"Today"},"e8e0":{"name":"Toll"},"e427":{"name":"Tonality"},"e913":{"name":"Touch App"},"e332":{"name":"Toys"},"e8e1":{"name":"Track Changes"},"e565":{"name":"Traffic"},"e570":{"name":"Train"},"e571":{"name":"Tram"},"e572":{"name":"Transfer Within A Station"},"e428":{"name":"Transform"},"e8e2":{"name":"Translate"},"e8e3":{"name":"Trending Down"},"e8e4":{"name":"Trending Flat"},"e8e5":{"name":"Trending Up"},"e429":{"name":"Tune"},"e8e6":{"name":"Turned In"},"e8e7":{"name":"Turned In Not"},"e333":{"name":"Tv"},"e169":{"name":"Unarchive"},"e166":{"name":"Undo"},"e5d6":{"name":"Unfold Less"},"e5d7":{"name":"Unfold More"},"e923":{"name":"Update"},"e1e0":{"name":"Usb"},"e8e8":{"name":"Verified User"},"e258":{"name":"Vertical Align Bottom"},"e259":{"name":"Vertical Align Center"},"e25a":{"name":"Vertical Align Top"},"e62d":{"name":"Vibration"},"e070":{"name":"Video Call"},"e071":{"name":"Video Label"},"e04a":{"name":"Video Library"},"e04b":{"name":"Videocam"},"e04c":{"name":"Videocam Off"},"e338":{"name":"Videogame Asset"},"e8e9":{"name":"View Agenda"},"e8ea":{"name":"View Array"},"e8eb":{"name":"View Carousel"},"e8ec":{"name":"View Column"},"e42a":{"name":"View Comfy"},"e42b":{"name":"View Compact"},"e8ed":{"name":"View Day"},"e8ee":{"name":"View Headline"},"e8ef":{"name":"View List"},"e8f0":{"name":"View Module"},"e8f1":{"name":"View Quilt"},"e8f2":{"name":"View Stream"},"e8f3":{"name":"View Week"},"e435":{"name":"Vignette"},"e8f4":{"name":"Visibility"},"e8f5":{"name":"Visibility Off"},"e62e":{"name":"Voice Chat"},"e0d9":{"name":"Voicemail"},"e04d":{"name":"Volume Down"},"e04e":{"name":"Volume Mute"},"e04f":{"name":"Volume Off"},"e050":{"name":"Volume Up"},"e0da":{"name":"Vpn Key"},"e62f":{"name":"Vpn Lock"},"e1bc":{"name":"Wallpaper"},"e002":{"name":"Warning"},"e334":{"name":"Watch"},"e924":{"name":"Watch Later"},"e42c":{"name":"Wb Auto"},"e42d":{"name":"Wb Cloudy"},"e42e":{"name":"Wb Incandescent"},"e436":{"name":"Wb Iridescent"},"e430":{"name":"Wb Sunny"},"e63d":{"name":"Wc"},"e051":{"name":"Web"},"e069":{"name":"Web Asset"},"e16b":{"name":"Weekend"},"e80e":{"name":"Whatshot"},"e1bd":{"name":"Widgets"},"e63e":{"name":"Wifi"},"e1e1":{"name":"Wifi Lock"},"e1e2":{"name":"Wifi Tethering"},"e8f9":{"name":"Work"},"e25b":{"name":"Wrap Text"},"e8fa":{"name":"Youtube Searched For"},"e8ff":{"name":"Zoom In"},"e900":{"name":"Zoom Out"},"e56b":{"name":"Zoom Out Map"}}} \ No newline at end of file diff --git a/public/vendors/material-design-icons/iconfont/MaterialIcons-Regular.svg b/public/vendors/material-design-icons/iconfont/MaterialIcons-Regular.svg new file mode 100755 index 0000000..a449327 --- /dev/null +++ b/public/vendors/material-design-icons/iconfont/MaterialIcons-Regular.svg @@ -0,0 +1,2373 @@ + + + + + +Created by FontForge 20151118 at Mon Feb 8 11:58:02 2016 + By shyndman +Copyright 2015 Google, Inc. All Rights Reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/vendors/material-design-icons/iconfont/MaterialIcons-Regular.ttf b/public/vendors/material-design-icons/iconfont/MaterialIcons-Regular.ttf new file mode 100755 index 0000000..7015564 Binary files /dev/null and b/public/vendors/material-design-icons/iconfont/MaterialIcons-Regular.ttf differ diff --git a/public/vendors/material-design-icons/iconfont/MaterialIcons-Regular.woff b/public/vendors/material-design-icons/iconfont/MaterialIcons-Regular.woff new file mode 100755 index 0000000..b648a3e Binary files /dev/null and b/public/vendors/material-design-icons/iconfont/MaterialIcons-Regular.woff differ diff --git a/public/vendors/material-design-icons/iconfont/MaterialIcons-Regular.woff2 b/public/vendors/material-design-icons/iconfont/MaterialIcons-Regular.woff2 new file mode 100755 index 0000000..9fa2112 Binary files /dev/null and b/public/vendors/material-design-icons/iconfont/MaterialIcons-Regular.woff2 differ diff --git a/public/vendors/material-design-icons/iconfont/README.md b/public/vendors/material-design-icons/iconfont/README.md new file mode 100755 index 0000000..5bda80e --- /dev/null +++ b/public/vendors/material-design-icons/iconfont/README.md @@ -0,0 +1,11 @@ +version 3.0.1 + +The recommended way to use the Material Icons font is by linking to the web font hosted on Google Fonts: + +```html + +``` + +Read more in our full usage guide: +http://google.github.io/material-design-icons/#icon-font-for-the-web diff --git a/public/vendors/material-design-icons/iconfont/codepoints b/public/vendors/material-design-icons/iconfont/codepoints new file mode 100755 index 0000000..3c8b075 --- /dev/null +++ b/public/vendors/material-design-icons/iconfont/codepoints @@ -0,0 +1,932 @@ +3d_rotation e84d +ac_unit eb3b +access_alarm e190 +access_alarms e191 +access_time e192 +accessibility e84e +accessible e914 +account_balance e84f +account_balance_wallet e850 +account_box e851 +account_circle e853 +adb e60e +add e145 +add_a_photo e439 +add_alarm e193 +add_alert e003 +add_box e146 +add_circle e147 +add_circle_outline e148 +add_location e567 +add_shopping_cart e854 +add_to_photos e39d +add_to_queue e05c +adjust e39e +airline_seat_flat e630 +airline_seat_flat_angled e631 +airline_seat_individual_suite e632 +airline_seat_legroom_extra e633 +airline_seat_legroom_normal e634 +airline_seat_legroom_reduced e635 +airline_seat_recline_extra e636 +airline_seat_recline_normal e637 +airplanemode_active e195 +airplanemode_inactive e194 +airplay e055 +airport_shuttle eb3c +alarm e855 +alarm_add e856 +alarm_off e857 +alarm_on e858 +album e019 +all_inclusive eb3d +all_out e90b +android e859 +announcement e85a +apps e5c3 +archive e149 +arrow_back e5c4 +arrow_downward e5db +arrow_drop_down e5c5 +arrow_drop_down_circle e5c6 +arrow_drop_up e5c7 +arrow_forward e5c8 +arrow_upward e5d8 +art_track e060 +aspect_ratio e85b +assessment e85c +assignment e85d +assignment_ind e85e +assignment_late e85f +assignment_return e860 +assignment_returned e861 +assignment_turned_in e862 +assistant e39f +assistant_photo e3a0 +attach_file e226 +attach_money e227 +attachment e2bc +audiotrack e3a1 +autorenew e863 +av_timer e01b +backspace e14a +backup e864 +battery_alert e19c +battery_charging_full e1a3 +battery_full e1a4 +battery_std e1a5 +battery_unknown e1a6 +beach_access eb3e +beenhere e52d +block e14b +bluetooth e1a7 +bluetooth_audio e60f +bluetooth_connected e1a8 +bluetooth_disabled e1a9 +bluetooth_searching e1aa +blur_circular e3a2 +blur_linear e3a3 +blur_off e3a4 +blur_on e3a5 +book e865 +bookmark e866 +bookmark_border e867 +border_all e228 +border_bottom e229 +border_clear e22a +border_color e22b +border_horizontal e22c +border_inner e22d +border_left e22e +border_outer e22f +border_right e230 +border_style e231 +border_top e232 +border_vertical e233 +branding_watermark e06b +brightness_1 e3a6 +brightness_2 e3a7 +brightness_3 e3a8 +brightness_4 e3a9 +brightness_5 e3aa +brightness_6 e3ab +brightness_7 e3ac +brightness_auto e1ab +brightness_high e1ac +brightness_low e1ad +brightness_medium e1ae +broken_image e3ad +brush e3ae +bubble_chart e6dd +bug_report e868 +build e869 +burst_mode e43c +business e0af +business_center eb3f +cached e86a +cake e7e9 +call e0b0 +call_end e0b1 +call_made e0b2 +call_merge e0b3 +call_missed e0b4 +call_missed_outgoing e0e4 +call_received e0b5 +call_split e0b6 +call_to_action e06c +camera e3af +camera_alt e3b0 +camera_enhance e8fc +camera_front e3b1 +camera_rear e3b2 +camera_roll e3b3 +cancel e5c9 +card_giftcard e8f6 +card_membership e8f7 +card_travel e8f8 +casino eb40 +cast e307 +cast_connected e308 +center_focus_strong e3b4 +center_focus_weak e3b5 +change_history e86b +chat e0b7 +chat_bubble e0ca +chat_bubble_outline e0cb +check e5ca +check_box e834 +check_box_outline_blank e835 +check_circle e86c +chevron_left e5cb +chevron_right e5cc +child_care eb41 +child_friendly eb42 +chrome_reader_mode e86d +class e86e +clear e14c +clear_all e0b8 +close e5cd +closed_caption e01c +cloud e2bd +cloud_circle e2be +cloud_done e2bf +cloud_download e2c0 +cloud_off e2c1 +cloud_queue e2c2 +cloud_upload e2c3 +code e86f +collections e3b6 +collections_bookmark e431 +color_lens e3b7 +colorize e3b8 +comment e0b9 +compare e3b9 +compare_arrows e915 +computer e30a +confirmation_number e638 +contact_mail e0d0 +contact_phone e0cf +contacts e0ba +content_copy e14d +content_cut e14e +content_paste e14f +control_point e3ba +control_point_duplicate e3bb +copyright e90c +create e150 +create_new_folder e2cc +credit_card e870 +crop e3be +crop_16_9 e3bc +crop_3_2 e3bd +crop_5_4 e3bf +crop_7_5 e3c0 +crop_din e3c1 +crop_free e3c2 +crop_landscape e3c3 +crop_original e3c4 +crop_portrait e3c5 +crop_rotate e437 +crop_square e3c6 +dashboard e871 +data_usage e1af +date_range e916 +dehaze e3c7 +delete e872 +delete_forever e92b +delete_sweep e16c +description e873 +desktop_mac e30b +desktop_windows e30c +details e3c8 +developer_board e30d +developer_mode e1b0 +device_hub e335 +devices e1b1 +devices_other e337 +dialer_sip e0bb +dialpad e0bc +directions e52e +directions_bike e52f +directions_boat e532 +directions_bus e530 +directions_car e531 +directions_railway e534 +directions_run e566 +directions_subway e533 +directions_transit e535 +directions_walk e536 +disc_full e610 +dns e875 +do_not_disturb e612 +do_not_disturb_alt e611 +do_not_disturb_off e643 +do_not_disturb_on e644 +dock e30e +domain e7ee +done e876 +done_all e877 +donut_large e917 +donut_small e918 +drafts e151 +drag_handle e25d +drive_eta e613 +dvr e1b2 +edit e3c9 +edit_location e568 +eject e8fb +email e0be +enhanced_encryption e63f +equalizer e01d +error e000 +error_outline e001 +euro_symbol e926 +ev_station e56d +event e878 +event_available e614 +event_busy e615 +event_note e616 +event_seat e903 +exit_to_app e879 +expand_less e5ce +expand_more e5cf +explicit e01e +explore e87a +exposure e3ca +exposure_neg_1 e3cb +exposure_neg_2 e3cc +exposure_plus_1 e3cd +exposure_plus_2 e3ce +exposure_zero e3cf +extension e87b +face e87c +fast_forward e01f +fast_rewind e020 +favorite e87d +favorite_border e87e +featured_play_list e06d +featured_video e06e +feedback e87f +fiber_dvr e05d +fiber_manual_record e061 +fiber_new e05e +fiber_pin e06a +fiber_smart_record e062 +file_download e2c4 +file_upload e2c6 +filter e3d3 +filter_1 e3d0 +filter_2 e3d1 +filter_3 e3d2 +filter_4 e3d4 +filter_5 e3d5 +filter_6 e3d6 +filter_7 e3d7 +filter_8 e3d8 +filter_9 e3d9 +filter_9_plus e3da +filter_b_and_w e3db +filter_center_focus e3dc +filter_drama e3dd +filter_frames e3de +filter_hdr e3df +filter_list e152 +filter_none e3e0 +filter_tilt_shift e3e2 +filter_vintage e3e3 +find_in_page e880 +find_replace e881 +fingerprint e90d +first_page e5dc +fitness_center eb43 +flag e153 +flare e3e4 +flash_auto e3e5 +flash_off e3e6 +flash_on e3e7 +flight e539 +flight_land e904 +flight_takeoff e905 +flip e3e8 +flip_to_back e882 +flip_to_front e883 +folder e2c7 +folder_open e2c8 +folder_shared e2c9 +folder_special e617 +font_download e167 +format_align_center e234 +format_align_justify e235 +format_align_left e236 +format_align_right e237 +format_bold e238 +format_clear e239 +format_color_fill e23a +format_color_reset e23b +format_color_text e23c +format_indent_decrease e23d +format_indent_increase e23e +format_italic e23f +format_line_spacing e240 +format_list_bulleted e241 +format_list_numbered e242 +format_paint e243 +format_quote e244 +format_shapes e25e +format_size e245 +format_strikethrough e246 +format_textdirection_l_to_r e247 +format_textdirection_r_to_l e248 +format_underlined e249 +forum e0bf +forward e154 +forward_10 e056 +forward_30 e057 +forward_5 e058 +free_breakfast eb44 +fullscreen e5d0 +fullscreen_exit e5d1 +functions e24a +g_translate e927 +gamepad e30f +games e021 +gavel e90e +gesture e155 +get_app e884 +gif e908 +golf_course eb45 +gps_fixed e1b3 +gps_not_fixed e1b4 +gps_off e1b5 +grade e885 +gradient e3e9 +grain e3ea +graphic_eq e1b8 +grid_off e3eb +grid_on e3ec +group e7ef +group_add e7f0 +group_work e886 +hd e052 +hdr_off e3ed +hdr_on e3ee +hdr_strong e3f1 +hdr_weak e3f2 +headset e310 +headset_mic e311 +healing e3f3 +hearing e023 +help e887 +help_outline e8fd +high_quality e024 +highlight e25f +highlight_off e888 +history e889 +home e88a +hot_tub eb46 +hotel e53a +hourglass_empty e88b +hourglass_full e88c +http e902 +https e88d +image e3f4 +image_aspect_ratio e3f5 +import_contacts e0e0 +import_export e0c3 +important_devices e912 +inbox e156 +indeterminate_check_box e909 +info e88e +info_outline e88f +input e890 +insert_chart e24b +insert_comment e24c +insert_drive_file e24d +insert_emoticon e24e +insert_invitation e24f +insert_link e250 +insert_photo e251 +invert_colors e891 +invert_colors_off e0c4 +iso e3f6 +keyboard e312 +keyboard_arrow_down e313 +keyboard_arrow_left e314 +keyboard_arrow_right e315 +keyboard_arrow_up e316 +keyboard_backspace e317 +keyboard_capslock e318 +keyboard_hide e31a +keyboard_return e31b +keyboard_tab e31c +keyboard_voice e31d +kitchen eb47 +label e892 +label_outline e893 +landscape e3f7 +language e894 +laptop e31e +laptop_chromebook e31f +laptop_mac e320 +laptop_windows e321 +last_page e5dd +launch e895 +layers e53b +layers_clear e53c +leak_add e3f8 +leak_remove e3f9 +lens e3fa +library_add e02e +library_books e02f +library_music e030 +lightbulb_outline e90f +line_style e919 +line_weight e91a +linear_scale e260 +link e157 +linked_camera e438 +list e896 +live_help e0c6 +live_tv e639 +local_activity e53f +local_airport e53d +local_atm e53e +local_bar e540 +local_cafe e541 +local_car_wash e542 +local_convenience_store e543 +local_dining e556 +local_drink e544 +local_florist e545 +local_gas_station e546 +local_grocery_store e547 +local_hospital e548 +local_hotel e549 +local_laundry_service e54a +local_library e54b +local_mall e54c +local_movies e54d +local_offer e54e +local_parking e54f +local_pharmacy e550 +local_phone e551 +local_pizza e552 +local_play e553 +local_post_office e554 +local_printshop e555 +local_see e557 +local_shipping e558 +local_taxi e559 +location_city e7f1 +location_disabled e1b6 +location_off e0c7 +location_on e0c8 +location_searching e1b7 +lock e897 +lock_open e898 +lock_outline e899 +looks e3fc +looks_3 e3fb +looks_4 e3fd +looks_5 e3fe +looks_6 e3ff +looks_one e400 +looks_two e401 +loop e028 +loupe e402 +low_priority e16d +loyalty e89a +mail e158 +mail_outline e0e1 +map e55b +markunread e159 +markunread_mailbox e89b +memory e322 +menu e5d2 +merge_type e252 +message e0c9 +mic e029 +mic_none e02a +mic_off e02b +mms e618 +mode_comment e253 +mode_edit e254 +monetization_on e263 +money_off e25c +monochrome_photos e403 +mood e7f2 +mood_bad e7f3 +more e619 +more_horiz e5d3 +more_vert e5d4 +motorcycle e91b +mouse e323 +move_to_inbox e168 +movie e02c +movie_creation e404 +movie_filter e43a +multiline_chart e6df +music_note e405 +music_video e063 +my_location e55c +nature e406 +nature_people e407 +navigate_before e408 +navigate_next e409 +navigation e55d +near_me e569 +network_cell e1b9 +network_check e640 +network_locked e61a +network_wifi e1ba +new_releases e031 +next_week e16a +nfc e1bb +no_encryption e641 +no_sim e0cc +not_interested e033 +note e06f +note_add e89c +notifications e7f4 +notifications_active e7f7 +notifications_none e7f5 +notifications_off e7f6 +notifications_paused e7f8 +offline_pin e90a +ondemand_video e63a +opacity e91c +open_in_browser e89d +open_in_new e89e +open_with e89f +pages e7f9 +pageview e8a0 +palette e40a +pan_tool e925 +panorama e40b +panorama_fish_eye e40c +panorama_horizontal e40d +panorama_vertical e40e +panorama_wide_angle e40f +party_mode e7fa +pause e034 +pause_circle_filled e035 +pause_circle_outline e036 +payment e8a1 +people e7fb +people_outline e7fc +perm_camera_mic e8a2 +perm_contact_calendar e8a3 +perm_data_setting e8a4 +perm_device_information e8a5 +perm_identity e8a6 +perm_media e8a7 +perm_phone_msg e8a8 +perm_scan_wifi e8a9 +person e7fd +person_add e7fe +person_outline e7ff +person_pin e55a +person_pin_circle e56a +personal_video e63b +pets e91d +phone e0cd +phone_android e324 +phone_bluetooth_speaker e61b +phone_forwarded e61c +phone_in_talk e61d +phone_iphone e325 +phone_locked e61e +phone_missed e61f +phone_paused e620 +phonelink e326 +phonelink_erase e0db +phonelink_lock e0dc +phonelink_off e327 +phonelink_ring e0dd +phonelink_setup e0de +photo e410 +photo_album e411 +photo_camera e412 +photo_filter e43b +photo_library e413 +photo_size_select_actual e432 +photo_size_select_large e433 +photo_size_select_small e434 +picture_as_pdf e415 +picture_in_picture e8aa +picture_in_picture_alt e911 +pie_chart e6c4 +pie_chart_outlined e6c5 +pin_drop e55e +place e55f +play_arrow e037 +play_circle_filled e038 +play_circle_outline e039 +play_for_work e906 +playlist_add e03b +playlist_add_check e065 +playlist_play e05f +plus_one e800 +poll e801 +polymer e8ab +pool eb48 +portable_wifi_off e0ce +portrait e416 +power e63c +power_input e336 +power_settings_new e8ac +pregnant_woman e91e +present_to_all e0df +print e8ad +priority_high e645 +public e80b +publish e255 +query_builder e8ae +question_answer e8af +queue e03c +queue_music e03d +queue_play_next e066 +radio e03e +radio_button_checked e837 +radio_button_unchecked e836 +rate_review e560 +receipt e8b0 +recent_actors e03f +record_voice_over e91f +redeem e8b1 +redo e15a +refresh e5d5 +remove e15b +remove_circle e15c +remove_circle_outline e15d +remove_from_queue e067 +remove_red_eye e417 +remove_shopping_cart e928 +reorder e8fe +repeat e040 +repeat_one e041 +replay e042 +replay_10 e059 +replay_30 e05a +replay_5 e05b +reply e15e +reply_all e15f +report e160 +report_problem e8b2 +restaurant e56c +restaurant_menu e561 +restore e8b3 +restore_page e929 +ring_volume e0d1 +room e8b4 +room_service eb49 +rotate_90_degrees_ccw e418 +rotate_left e419 +rotate_right e41a +rounded_corner e920 +router e328 +rowing e921 +rss_feed e0e5 +rv_hookup e642 +satellite e562 +save e161 +scanner e329 +schedule e8b5 +school e80c +screen_lock_landscape e1be +screen_lock_portrait e1bf +screen_lock_rotation e1c0 +screen_rotation e1c1 +screen_share e0e2 +sd_card e623 +sd_storage e1c2 +search e8b6 +security e32a +select_all e162 +send e163 +sentiment_dissatisfied e811 +sentiment_neutral e812 +sentiment_satisfied e813 +sentiment_very_dissatisfied e814 +sentiment_very_satisfied e815 +settings e8b8 +settings_applications e8b9 +settings_backup_restore e8ba +settings_bluetooth e8bb +settings_brightness e8bd +settings_cell e8bc +settings_ethernet e8be +settings_input_antenna e8bf +settings_input_component e8c0 +settings_input_composite e8c1 +settings_input_hdmi e8c2 +settings_input_svideo e8c3 +settings_overscan e8c4 +settings_phone e8c5 +settings_power e8c6 +settings_remote e8c7 +settings_system_daydream e1c3 +settings_voice e8c8 +share e80d +shop e8c9 +shop_two e8ca +shopping_basket e8cb +shopping_cart e8cc +short_text e261 +show_chart e6e1 +shuffle e043 +signal_cellular_4_bar e1c8 +signal_cellular_connected_no_internet_4_bar e1cd +signal_cellular_no_sim e1ce +signal_cellular_null e1cf +signal_cellular_off e1d0 +signal_wifi_4_bar e1d8 +signal_wifi_4_bar_lock e1d9 +signal_wifi_off e1da +sim_card e32b +sim_card_alert e624 +skip_next e044 +skip_previous e045 +slideshow e41b +slow_motion_video e068 +smartphone e32c +smoke_free eb4a +smoking_rooms eb4b +sms e625 +sms_failed e626 +snooze e046 +sort e164 +sort_by_alpha e053 +spa eb4c +space_bar e256 +speaker e32d +speaker_group e32e +speaker_notes e8cd +speaker_notes_off e92a +speaker_phone e0d2 +spellcheck e8ce +star e838 +star_border e83a +star_half e839 +stars e8d0 +stay_current_landscape e0d3 +stay_current_portrait e0d4 +stay_primary_landscape e0d5 +stay_primary_portrait e0d6 +stop e047 +stop_screen_share e0e3 +storage e1db +store e8d1 +store_mall_directory e563 +straighten e41c +streetview e56e +strikethrough_s e257 +style e41d +subdirectory_arrow_left e5d9 +subdirectory_arrow_right e5da +subject e8d2 +subscriptions e064 +subtitles e048 +subway e56f +supervisor_account e8d3 +surround_sound e049 +swap_calls e0d7 +swap_horiz e8d4 +swap_vert e8d5 +swap_vertical_circle e8d6 +switch_camera e41e +switch_video e41f +sync e627 +sync_disabled e628 +sync_problem e629 +system_update e62a +system_update_alt e8d7 +tab e8d8 +tab_unselected e8d9 +tablet e32f +tablet_android e330 +tablet_mac e331 +tag_faces e420 +tap_and_play e62b +terrain e564 +text_fields e262 +text_format e165 +textsms e0d8 +texture e421 +theaters e8da +thumb_down e8db +thumb_up e8dc +thumbs_up_down e8dd +time_to_leave e62c +timelapse e422 +timeline e922 +timer e425 +timer_10 e423 +timer_3 e424 +timer_off e426 +title e264 +toc e8de +today e8df +toll e8e0 +tonality e427 +touch_app e913 +toys e332 +track_changes e8e1 +traffic e565 +train e570 +tram e571 +transfer_within_a_station e572 +transform e428 +translate e8e2 +trending_down e8e3 +trending_flat e8e4 +trending_up e8e5 +tune e429 +turned_in e8e6 +turned_in_not e8e7 +tv e333 +unarchive e169 +undo e166 +unfold_less e5d6 +unfold_more e5d7 +update e923 +usb e1e0 +verified_user e8e8 +vertical_align_bottom e258 +vertical_align_center e259 +vertical_align_top e25a +vibration e62d +video_call e070 +video_label e071 +video_library e04a +videocam e04b +videocam_off e04c +videogame_asset e338 +view_agenda e8e9 +view_array e8ea +view_carousel e8eb +view_column e8ec +view_comfy e42a +view_compact e42b +view_day e8ed +view_headline e8ee +view_list e8ef +view_module e8f0 +view_quilt e8f1 +view_stream e8f2 +view_week e8f3 +vignette e435 +visibility e8f4 +visibility_off e8f5 +voice_chat e62e +voicemail e0d9 +volume_down e04d +volume_mute e04e +volume_off e04f +volume_up e050 +vpn_key e0da +vpn_lock e62f +wallpaper e1bc +warning e002 +watch e334 +watch_later e924 +wb_auto e42c +wb_cloudy e42d +wb_incandescent e42e +wb_iridescent e436 +wb_sunny e430 +wc e63d +web e051 +web_asset e069 +weekend e16b +whatshot e80e +widgets e1bd +wifi e63e +wifi_lock e1e1 +wifi_tethering e1e2 +work e8f9 +wrap_text e25b +youtube_searched_for e8fa +zoom_in e8ff +zoom_out e900 +zoom_out_map e56b diff --git a/public/vendors/material-design-icons/iconfont/material-icons.css b/public/vendors/material-design-icons/iconfont/material-icons.css new file mode 100755 index 0000000..2270c09 --- /dev/null +++ b/public/vendors/material-design-icons/iconfont/material-icons.css @@ -0,0 +1,36 @@ +@font-face { + font-family: 'Material Icons'; + font-style: normal; + font-weight: 400; + src: url(MaterialIcons-Regular.eot); /* For IE6-8 */ + src: local('Material Icons'), + local('MaterialIcons-Regular'), + url(MaterialIcons-Regular.woff2) format('woff2'), + url(MaterialIcons-Regular.woff) format('woff'), + url(MaterialIcons-Regular.ttf) format('truetype'); +} + +.material-icons { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; /* Preferred icon size */ + display: inline-block; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + + /* Support for IE. */ + font-feature-settings: 'liga'; +} diff --git a/public/vendors/webfontloader/webfontloader.js b/public/vendors/webfontloader/webfontloader.js new file mode 100644 index 0000000..2ae6330 --- /dev/null +++ b/public/vendors/webfontloader/webfontloader.js @@ -0,0 +1,136 @@ +/* Web Font Loader v1.6.27 - (c) Adobe Systems, Google. License: Apache 2.0 */(function () { + function aa(a, b, c) { return a.call.apply(a.bind, arguments); } function ba(a, b, c) { if (!a) throw Error(); if (arguments.length > 2) { const d = Array.prototype.slice.call(arguments, 2); return function () { const c = Array.prototype.slice.call(arguments); Array.prototype.unshift.apply(c, d); return a.apply(b, c); }; } return function () { return a.apply(b, arguments); }; } function p(a, b, c) { p = Function.prototype.bind && Function.prototype.bind.toString().indexOf('native code') != -1 ? aa : ba; return p(...arguments); } const q = Date.now || function () { return +new Date(); }; function ca(a, b) { this.a = a; this.m = b || a; this.c = this.m.document; } const da = !!window.FontFace; function t(a, b, c, d) { b = a.c.createElement(b); if (c) for (const e in c)c.hasOwnProperty(e) && (e == 'style' ? b.style.cssText = c[e] : b.setAttribute(e, c[e])); d && b.appendChild(a.c.createTextNode(d)); return b; } function u(a, b, c) { a = a.c.getElementsByTagName(b)[0]; a || (a = document.documentElement); a.insertBefore(c, a.lastChild); } function v(a) { a.parentNode && a.parentNode.removeChild(a); } + function w(a, b, c) { b = b || []; c = c || []; for (var d = a.className.split(/\s+/), e = 0; e < b.length; e += 1) { for (var f = !1, g = 0; g < d.length; g += 1) if (b[e] === d[g]) { f = !0; break; }f || d.push(b[e]); }b = []; for (e = 0; e < d.length; e += 1) { f = !1; for (g = 0; g < c.length; g += 1) if (d[e] === c[g]) { f = !0; break; }f || b.push(d[e]); }a.className = b.join(' ').replace(/\s+/g, ' ').replace(/^\s+|\s+$/, ''); } function y(a, b) { for (let c = a.className.split(/\s+/), d = 0, e = c.length; d < e; d++) if (c[d] == b) return !0; return !1; } + function z(a) { if (typeof a.f === 'string') return a.f; let b = a.m.location.protocol; b == 'about:' && (b = a.a.location.protocol); return b == 'https:' ? 'https:' : 'http:'; } function ea(a) { return a.m.location.hostname || a.a.location.hostname; } + function A(a, b, c) { + function d() { k && e && f && (k(g), k = null); }b = t(a, 'link', {rel: 'stylesheet', href: b, media: 'all'}); var e = !1, + f = !0, + g = null, + k = c || null; da ? (b.onload = function () { e = !0; d(); }, b.onerror = function () { e = !0; g = Error('Stylesheet failed to load'); d(); }) : setTimeout(() => { e = !0; d(); }, 0); u(a, 'head', b); + } + function B(a, b, c, d) { + const e = a.c.getElementsByTagName('head')[0]; if (e) { + let f = t(a, 'script', {src: b}), + g = !1; f.onload = f.onreadystatechange = function () { g || this.readyState && this.readyState != 'loaded' && this.readyState != 'complete' || (g = !0, c && c(null), f.onload = f.onreadystatechange = null, f.parentNode.tagName == 'HEAD' && e.removeChild(f)); }; e.appendChild(f); setTimeout(() => { g || (g = !0, c && c(Error('Script load timeout'))); }, d || 5E3); return f; + } return null; + } function C() { this.a = 0; this.c = null; } function D(a) { a.a++; return function () { a.a--; E(a); }; } function F(a, b) { a.c = b; E(a); } function E(a) { a.a == 0 && a.c && (a.c(), a.c = null); } function G(a) { this.a = a || '-'; }G.prototype.c = function (a) { for (var b = [], c = 0; c < arguments.length; c++)b.push(arguments[c].replace(/[\W_]+/g, '').toLowerCase()); return b.join(this.a); }; function H(a, b) { this.c = a; this.f = 4; this.a = 'n'; const c = (b || 'n4').match(/^([nio])([1-9])$/i); c && (this.a = c[1], this.f = parseInt(c[2], 10)); } function fa(a) { return `${I(a)} ${a.f}00 300px ${J(a.c)}`; } function J(a) { const b = []; a = a.split(/,\s*/); for (let c = 0; c < a.length; c++) { const d = a[c].replace(/['"]/g, ''); d.indexOf(' ') != -1 || /^\d/.test(d) ? b.push(`'${d}'`) : b.push(d); } return b.join(','); } function K(a) { return a.a + a.f; } function I(a) { let b = 'normal'; a.a === 'o' ? b = 'oblique' : a.a === 'i' && (b = 'italic'); return b; } + function ga(a) { + let b = 4, + c = 'n', + d = null; a && ((d = a.match(/(normal|oblique|italic)/i)) && d[1] && (c = d[1].substr(0, 1).toLowerCase()), (d = a.match(/([1-9]00|normal|bold)/i)) && d[1] && (/bold/i.test(d[1]) ? b = 7 : /[1-9]00/.test(d[1]) && (b = parseInt(d[1].substr(0, 1), 10)))); return c + b; + } function ha(a, b) { this.c = a; this.f = a.m.document.documentElement; this.h = b; this.a = new G('-'); this.j = !1 !== b.events; this.g = !1 !== b.classes; } function ia(a) { a.g && w(a.f, [a.a.c('wf', 'loading')]); L(a, 'loading'); } function M(a) { + if (a.g) { + let b = y(a.f, a.a.c('wf', 'active')), + c = [], + d = [a.a.c('wf', 'loading')]; b || c.push(a.a.c('wf', 'inactive')); w(a.f, c, d); + }L(a, 'inactive'); + } function L(a, b, c) { if (a.j && a.h[b]) if (c)a.h[b](c.c, K(c)); else a.h[b](); } function ja() { this.c = {}; } function ka(a, b, c) { + let d = [], + e; for (e in b) if (b.hasOwnProperty(e)) { const f = a.c[e]; f && d.push(f(b[e], c)); } return d; + } function N(a, b) { this.c = a; this.f = b; this.a = t(this.c, 'span', {'aria-hidden': 'true'}, this.f); } function O(a) { u(a.c, 'body', a.a); } function P(a) { return `display:block;position:absolute;top:-9999px;left:-9999px;font-size:300px;width:auto;height:auto;line-height:normal;margin:0;padding:0;font-variant:normal;white-space:nowrap;font-family:${J(a.c)};` + `font-style:${I(a)};font-weight:${a.f}00;`; } function Q(a, b, c, d, e, f) { this.g = a; this.j = b; this.a = d; this.c = c; this.f = e || 3E3; this.h = f || void 0; }Q.prototype.start = function () { + let a = this.c.m.document, + b = this, + c = q(), + d = new Promise((d, e) => { function k() { q() - c >= b.f ? e() : a.fonts.load(fa(b.a), b.h).then((a) => { a.length >= 1 ? d() : setTimeout(k, 25); }, () => { e(); }); }k(); }), + e = new Promise((a, d) => { setTimeout(d, b.f); }); Promise.race([e, d]).then(() => { b.g(b.a); }, () => { b.j(b.a); }); + }; function R(a, b, c, d, e, f, g) { + this.v = a; this.B = b; this.c = c; this.a = d; this.s = g || 'BESbswy'; this.f = {}; this.w = e || 3E3; this.u = f || null; this.o = this.j = this.h = this.g = null; this.g = new N(this.c, this.s); this.h = new N(this.c, this.s); this.j = new N(this.c, this.s); this.o = new N(this.c, this.s); a = new H(`${this.a.c},serif`, K(this.a)); a = P(a); this.g.a.style.cssText = a; a = new H(`${this.a.c},sans-serif`, K(this.a)); a = P(a); this.h.a.style.cssText = a; a = new H('serif', K(this.a)); a = P(a); this.j.a.style.cssText = a; a = new H('sans-serif', K(this.a)); a = +P(a); this.o.a.style.cssText = a; O(this.g); O(this.h); O(this.j); O(this.o); + } let S = {D: 'serif', C: 'sans-serif'}, + T = null; function U() { if (T === null) { const a = /AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent); T = !!a && (parseInt(a[1], 10) < 536 || parseInt(a[1], 10) === 536 && parseInt(a[2], 10) <= 11); } return T; }R.prototype.start = function () { this.f.serif = this.j.a.offsetWidth; this.f['sans-serif'] = this.o.a.offsetWidth; this.A = q(); la(this); }; + function ma(a, b, c) { for (const d in S) if (S.hasOwnProperty(d) && b === a.f[S[d]] && c === a.f[S[d]]) return !0; return !1; } function la(a) { + let b = a.g.a.offsetWidth, + c = a.h.a.offsetWidth, + d; (d = b === a.f.serif && c === a.f['sans-serif']) || (d = U() && ma(a, b, c)); d ? q() - a.A >= a.w ? U() && ma(a, b, c) && (a.u === null || a.u.hasOwnProperty(a.a.c)) ? V(a, a.v) : V(a, a.B) : na(a) : V(a, a.v); + } function na(a) { setTimeout(p(function () { la(this); }, a), 50); } function V(a, b) { setTimeout(p(function () { v(this.g.a); v(this.h.a); v(this.j.a); v(this.o.a); b(this.a); }, a), 0); } function W(a, b, c) { this.c = a; this.a = b; this.f = 0; this.o = this.j = !1; this.s = c; } let X = null; W.prototype.g = function (a) { const b = this.a; b.g && w(b.f, [b.a.c('wf', a.c, K(a).toString(), 'active')], [b.a.c('wf', a.c, K(a).toString(), 'loading'), b.a.c('wf', a.c, K(a).toString(), 'inactive')]); L(b, 'fontactive', a); this.o = !0; oa(this); }; + W.prototype.h = function (a) { + const b = this.a; if (b.g) { + let c = y(b.f, b.a.c('wf', a.c, K(a).toString(), 'active')), + d = [], + e = [b.a.c('wf', a.c, K(a).toString(), 'loading')]; c || d.push(b.a.c('wf', a.c, K(a).toString(), 'inactive')); w(b.f, d, e); + }L(b, 'fontinactive', a); oa(this); + }; function oa(a) { --a.f == 0 && a.j && (a.o ? (a = a.a, a.g && w(a.f, [a.a.c('wf', 'active')], [a.a.c('wf', 'loading'), a.a.c('wf', 'inactive')]), L(a, 'active')) : M(a.a)); } function pa(a) { this.j = a; this.a = new ja(); this.h = 0; this.f = this.g = !0; }pa.prototype.load = function (a) { this.c = new ca(this.j, a.context || this.j); this.g = !1 !== a.events; this.f = !1 !== a.classes; qa(this, new ha(this.c, a), a); }; + function ra(a, b, c, d, e) { + const f = --a.h == 0; (a.f || a.g) && setTimeout(() => { + let a = e || null, + k = d || null || {}; if (c.length === 0 && f)M(b.a); else { + b.f += c.length; f && (b.j = f); let h, + m = []; for (h = 0; h < c.length; h++) { + var l = c[h], + n = k[l.c], + r = b.a, + x = l; r.g && w(r.f, [r.a.c('wf', x.c, K(x).toString(), 'loading')]); L(r, 'fontloading', x); r = null; if (X === null) { + if (window.FontFace) { + var x = /Gecko.*Firefox\/(\d+)/.exec(window.navigator.userAgent), + ya = /OS X.*Version\/10\..*Safari/.exec(window.navigator.userAgent) && /Apple/.exec(window.navigator.vendor); + X = x ? parseInt(x[1], 10) > 42 : ya ? !1 : !0; + } else X = !1; + } X ? r = new Q(p(b.g, b), p(b.h, b), b.c, l, b.s, n) : r = new R(p(b.g, b), p(b.h, b), b.c, l, b.s, a, n); m.push(r); + } for (h = 0; h < m.length; h++)m[h].start(); + } + }, 0); + } function qa(a, b, c) { + var d = [], + e = c.timeout; ia(b); var d = ka(a.a, c, a.c), + f = new W(a.c, b, e); a.h = d.length; b = 0; for (c = d.length; b < c; b++)d[b].load((b, d, c) => { ra(a, f, b, d, c); }); + } function sa(a, b) { this.c = a; this.a = b; } function ta(a, b, c) { const d = z(a.c); a = (a.a.api || 'fast.fonts.net/jsapi').replace(/^.*http(s?):(\/\/)?/, ''); return `${d}//${a}/${b}.js${c ? `?v=${c}` : ''}`; } + sa.prototype.load = function (a) { + function b() { + if (f[`__mti_fntLst${d}`]) { + let c = f[`__mti_fntLst${d}`](), + e = [], + h; if (c) for (let m = 0; m < c.length; m++) { const l = c[m].fontfamily; void 0 != c[m].fontStyle && void 0 != c[m].fontWeight ? (h = c[m].fontStyle + c[m].fontWeight, e.push(new H(l, h))) : e.push(new H(l)); }a(e); + } else setTimeout(() => { b(); }, 50); + } var c = this, + d = c.a.projectId, + e = c.a.version; if (d) { + var f = c.c.m; B(this.c, ta(c, d, e), (e) => { e ? a([]) : (f[`__MonotypeConfiguration__${d}`] = function () { return c.a; }, b()); }).id = `__MonotypeAPIScript__${ +d}`; + } else a([]); + }; function ua(a, b) { this.c = a; this.a = b; }ua.prototype.load = function (a) { + let b, + c, + d = this.a.urls || [], + e = this.a.families || [], + f = this.a.testStrings || {}, + g = new C(); b = 0; for (c = d.length; b < c; b++)A(this.c, d[b], D(g)); const k = []; b = 0; for (c = e.length; b < c; b++) if (d = e[b].split(':'), d[1]) for (let h = d[1].split(','), m = 0; m < h.length; m += 1)k.push(new H(d[0], h[m])); else k.push(new H(d[0])); F(g, () => { a(k, f); }); + }; function va(a, b, c) { a ? this.c = a : this.c = b + wa; this.a = []; this.f = []; this.g = c || ''; } var wa = '//fonts.googleapis.com/css'; function xa(a, b) { for (let c = b.length, d = 0; d < c; d++) { const e = b[d].split(':'); e.length == 3 && a.f.push(e.pop()); let f = ''; e.length == 2 && e[1] != '' && (f = ':'); a.a.push(e.join(f)); } } + function za(a) { if (a.a.length == 0) throw Error('No fonts to load!'); if (a.c.indexOf('kit=') != -1) return a.c; for (var b = a.a.length, c = [], d = 0; d < b; d++)c.push(a.a[d].replace(/ /g, '+')); b = `${a.c}?family=${c.join('%7C')}`; a.f.length > 0 && (b += `&subset=${a.f.join(',')}`); a.g.length > 0 && (b += `&text=${encodeURIComponent(a.g)}`); return b; } function Aa(a) { this.f = a; this.a = []; this.c = {}; } + let Ba = {latin: 'BESbswy', 'latin-ext': '\u00e7\u00f6\u00fc\u011f\u015f', cyrillic: '\u0439\u044f\u0416', greek: '\u03b1\u03b2\u03a3', khmer: '\u1780\u1781\u1782', Hanuman: '\u1780\u1781\u1782'}, + Ca = {thin: '1', extralight: '2', 'extra-light': '2', ultralight: '2', 'ultra-light': '2', light: '3', regular: '4', book: '4', medium: '5', 'semi-bold': '6', semibold: '6', 'demi-bold': '6', demibold: '6', bold: '7', 'extra-bold': '8', extrabold: '8', 'ultra-bold': '8', ultrabold: '8', black: '9', heavy: '9', l: '3', r: '4', b: '7'}, + Da = {i: 'i', italic: 'i', n: 'n', normal: 'n'}, + Ea = /^(thin|(?:(?:extra|ultra)-?)?light|regular|book|medium|(?:(?:semi|demi|extra|ultra)-?)?bold|black|heavy|l|r|b|[1-9]00)?(n|i|normal|italic)?$/; + function Fa(a) { + for (let b = a.f.length, c = 0; c < b; c++) { + let d = a.f[c].split(':'), + e = d[0].replace(/\+/g, ' '), + f = ['n4']; if (d.length >= 2) { + var g; var k = d[1]; g = []; if (k) { + for (var k = k.split(','), h = k.length, m = 0; m < h; m++) { + var l; l = k[m]; if (l.match(/^[\w-]+$/)) { + var n = Ea.exec(l.toLowerCase()); if (n == null)l = ''; else { + l = n[2]; l = l == null || l == '' ? 'n' : Da[l]; n = n[1]; if (n == null || n == '')n = '4'; else { + var r = Ca[n], + n = r || isNaN(n) ? '4' : n.substr(0, 1); + } l = [l, n].join(''); + } + } else l = ''; l && g.push(l); + } + }g.length > 0 && (f = g); d.length == 3 && (d = d[2], g = [], d = d ? d.split(',') : +g, d.length > 0 && (d = Ba[d[0]]) && (a.c[e] = d)); + }a.c[e] || (d = Ba[e]) && (a.c[e] = d); for (d = 0; d < f.length; d += 1)a.a.push(new H(e, f[d])); + } + } function Ga(a, b) { this.c = a; this.a = b; } const Ha = {Arimo: !0, Cousine: !0, Tinos: !0}; Ga.prototype.load = function (a) { + let b = new C(), + c = this.c, + d = new va(this.a.api, z(c), this.a.text), + e = this.a.families; xa(d, e); const f = new Aa(e); Fa(f); A(c, za(d), D(b)); F(b, () => { a(f.a, f.c, Ha); }); + }; function Ia(a, b) { this.c = a; this.a = b; }Ia.prototype.load = function (a) { + let b = this.a.id, + c = this.c.m; b ? B(this.c, `${this.a.api || 'https://use.typekit.net'}/${b}.js`, (b) => { if (b)a([]); else if (c.Typekit && c.Typekit.config && c.Typekit.config.fn) { b = c.Typekit.config.fn; for (var e = [], f = 0; f < b.length; f += 2) for (let g = b[f], k = b[f + 1], h = 0; h < k.length; h++)e.push(new H(g, k[h])); try { c.Typekit.load({events: !1, classes: !1, async: !0}); } catch (m) {}a(e); } }, 2E3) : a([]); + }; function Ja(a, b) { this.c = a; this.f = b; this.a = []; }Ja.prototype.load = function (a) { + let b = this.f.id, + c = this.c.m, + d = this; b ? (c.__webfontfontdeckmodule__ || (c.__webfontfontdeckmodule__ = {}), c.__webfontfontdeckmodule__[b] = function (b, c) { for (let g = 0, k = c.fonts.length; g < k; ++g) { const h = c.fonts[g]; d.a.push(new H(h.name, ga(`font-weight:${h.weight};font-style:${h.style}`))); }a(d.a); }, B(this.c, `${z(this.c) + (this.f.api || '//f.fontdeck.com/s/css/js/') + ea(this.c)}/${b}.js`, (b) => { b && a([]); })) : a([]); + }; const Y = new pa(window); Y.a.c.custom = function (a, b) { return new ua(b, a); }; Y.a.c.fontdeck = function (a, b) { return new Ja(b, a); }; Y.a.c.monotype = function (a, b) { return new sa(b, a); }; Y.a.c.typekit = function (a, b) { return new Ia(b, a); }; Y.a.c.google = function (a, b) { return new Ga(b, a); }; const Z = {load: p(Y.load, Y)}; typeof define === 'function' && define.amd ? define(() => Z) : typeof module !== 'undefined' && module.exports ? module.exports = Z : (window.WebFont = Z, window.WebFontConfig && Y.load(window.WebFontConfig)); +}()); diff --git a/sass/_colors.scss b/sass/_colors.scss new file mode 100755 index 0000000..730f6eb --- /dev/null +++ b/sass/_colors.scss @@ -0,0 +1,76 @@ +@include generateColors("primary", $brand-primary, white); +@include generateColors("success", $brand-success, white); +@include generateColors("info", $brand-info, white); +@include generateColors("warning", $brand-warning, white); +@include generateColors("danger", $brand-danger, white); +@include generateColors("white", #ffffff, white); +@include generateColors("black", #000000, white); + +@include generateColors("deepred", #D71F4B, white); +@include generateColors("red", #EA7882, white); +@include generateColors("lightred", #F09FA6, white); +@include generateColors("brightblue", #003BFF, white); +@include generateColors("darkblue", #4A90E2, white); +@include generateColors("blue", #79B0EC, white); +@include generateColors("lightblue50", #D2E0EB, white); +@include generateColors("lightblue", #A0C7F2, white); +@include generateColors("hoverblue", #E5EFFB, white); +@include generateColors("purple", #B4A1DD, white); +@include generateColors("lightpurple50", #C1B2E3, white); +@include generateColors("lightpurple", #D3C9EB, white); +@include generateColors("darkbrown", #AB4F45, white); +@include generateColors("brown", #A8553A, white); +@include generateColors("brown75", #C36849, white); +@include generateColors("brown60", #C67055, white); +@include generateColors("brown50", #D67F6B, white); +@include generateColors("brownishgreen", #948266, white); +@include generateColors("orange", #FFC497, white); +@include generateColors("paleorange", #EA8564, white); +@include generateColors("pinkishred", #EF6B5D, white); +@include generateColors("orange75", #EE682F, white); +@include generateColors("orange65", #FA824F, white); +@include generateColors("orange45", #FFC9A0, white); +@include generateColors("darkorange", #EBA068, white); +@include generateColors("lightorange", #FFD3B1, white); +@include generateColors("darkgreen", #306C67, white); +@include generateColors("darkgreen85", #36845E, white); +@include generateColors("darkgreen75", #518F41, white); +@include generateColors("darkgreen65", #66A655, white); +@include generateColors("darkgreen55", #68BD80, white); +@include generateColors("darkgreen50", #55A69F, white); +@include generateColors("darkgreen45", #2EB398, white); +@include generateColors("darkgreen40", #44C1AC, white); +@include generateColors("green", #55C9A6, white); +@include generateColors("lightgreen", #7CD5BA, white); +@include generateColors("hovergreen", #E5F7F1, white); +@include generateColors("brightyellow", #FCB621, white); +@include generateColors("brightyellow75", #F3C557, white); +@include generateColors("brightyellow65", #EDBC6C, white); +@include generateColors("yellow", #FADD7F, white); +@include generateColors("paleyellow", #DEBC85, white); +@include generateColors("lightyellow", #FBE499, white); +@include generateColors("hoveryellow", #FFF1E7, white); +@include generateColors("pink", #E299B7, white); +@include generateColors("lightpink", #ECBCD0, white); +@include generateColors("paleblue", #A5C7EC, white); +@include generateColors("palegreen", #A0DFCC, white); +@include generateColors("palepink", #E394B3, white); +@include generateColors("brownishgray", #64584C, white); +@include generateColors("brownishgray75", #776B5F, white); +@include generateColors("gray", #EAEDF1, white); +@include generateColors("darkgray", #999895, white); +@include generateColors("darkgray75", #B8B6B0, white); +@include generateColors("darkgray50", #B8C3C8, white); +@include generateColors("darkgray40", #CDCCC8, white); +@include generateColors("darkgray25", #DCDBD8, white); +@include generateColors("lightgray", #EEEDEB, white); +@include generateColors("lightgray50", #F1F0EE, white); +@include generateColors("black75", #3F3F3B, white); +@include generateColors("black50", #3B4648, white); +@include generateColors("davygray", #555555, white); +@include generateColors("darkgrayishblue75", #43525A, white); +@include generateColors("darkgrayishblue", #4C5D67, white); +@include generateColors("desaturateddarkblue", #515E78, white); +@include generateColors("desaturateddarkblue75", #3B465C, white); +@include generateColors("darkcyan", #68A0A5, white); +@include generateColors("grayishcyan", #92BDC1, white); diff --git a/sass/_theme.scss b/sass/_theme.scss new file mode 100755 index 0000000..a94e51d --- /dev/null +++ b/sass/_theme.scss @@ -0,0 +1,4 @@ +/* ADD/REMOVE/CHANGE THEMES HERE */ + +// Giving the default theme a name +@include theme-maker("default", ()); diff --git a/sass/_variables.scss b/sass/_variables.scss new file mode 100755 index 0000000..863221b --- /dev/null +++ b/sass/_variables.scss @@ -0,0 +1,78 @@ +$img-path: '/public/imgs/common'; +$font-path: '/public/fonts'; +$bootstrap-sass-asset-helper: true; +$icon-font-path: '/fonts/glyphicon/'; // only for glyphicon +$grid-gutter-width: 50px; + +$font-size-base: 14px; +$line-height-base: 1.785714289; // 25/14 +$line-height-computed: floor(($font-size-base * $line-height-base)); // ~25px + +$padding-base-vertical: 6px; +$input-height-base: ($line-height-computed + ($padding-base-vertical * 2) + 1); + +$nav-link-padding: 4px ($line-height-computed); +$panel-heading-padding: ($line-height-computed / 2) ($line-height-computed); +$panel-body-padding: $line-height-computed; + +$navbar-height: 75px; +$sidebar-controls-visibility: visible; + +$font-family-sans-serif: Lato, sans-serif; +$headings-font-family: Lato, sans-serif; + +$screen-sm-min: 990px; +$screen-md-min: 1152px; +$screen-lg-min: 1366px; + +$screen-xs-max: ($screen-sm-min - 1); +$screen-sm-max: ($screen-md-min - 1); +$screen-md-max: ($screen-lg-min - 1); + +$primary-color: #89949B; +$brand-primary: #428bca; +$brand-success: #5cb85c; +$brand-info: #5bc0de; +$brand-warning: #f0ad4e; +$brand-danger: #d9534f; + +$zindex-tooltip: 999999999999999999999999999; + +$container-sm: 990px; +$container-md: 990px; +$container-lg: 990px; + +$btn-height: 30px; +$btn-border-radius-base: 20px; +$btn-padding-base-vertical: 2px; +$btn-padding-base-horizontal: 15px; +$btn-padding-large-base-vertical: 10px; +$btn-padding-large-base-horizontal: 25px; + +$btn-font-size: 12px; +$btn-font-weight: bold; +$btn-font-size-small: 10px; +$btn-font-size-xsmall: 8px; + +$btn-link-color: #89949B; +$btn-default-color: #B4B7B9; +$btn-primary-color: $brand-primary; +$btn-success-color: $brand-success; +$btn-info-color: $brand-info; +$btn-warning-color: $brand-warning; +$btn-danger-color: $brand-danger; + +$dropdown-link-color: rgb(137, 148, 155); +$dropdown-link-hover-bg: rgba(180, 183, 185, 0.05); + +$link-color: #2EB398; +$link-hover-color: #2e6b5e; +$link-hover-decoration: none; + +$nav-link-color: #aaa; +$nav-disabled-link-color: #777777; +$nav-link-hover-bg: #f5f5f5; +$nav-tabs-link-hover-border-color: #f5f5f5; + +$navbar-default-bg: #fff; +$breadcrumb-bg: #fff; diff --git a/sass/fonts/Simple-Line-Icons/Simple-Line-Icons.css b/sass/fonts/Simple-Line-Icons/Simple-Line-Icons.css new file mode 100755 index 0000000..e318138 --- /dev/null +++ b/sass/fonts/Simple-Line-Icons/Simple-Line-Icons.css @@ -0,0 +1,506 @@ +@font-face { + font-family: 'Simple-Line-Icons'; + src: url('#{$font-path}/Simple-Line-Icons/Simple-Line-Icons.woff2') format('woff2'), + url('#{$font-path}/Simple-Line-Icons/Simple-Line-Icons.woff') format('woff'); + font-weight: normal; + font-style: normal; +} + +[class^="icon-simple-line-icons-"]:before, +[class*=" icon-simple-line-icons-"]:before { + font-family: 'Simple-Line-Icons'; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; +} + +.icon-simple-line-icons-user-female:before { + content: "\e000"; +} +.icon-simple-line-icons-user-follow:before { + content: "\e002"; +} +.icon-simple-line-icons-user-following:before { + content: "\e003"; +} +.icon-simple-line-icons-user-unfollow:before { + content: "\e004"; +} +.icon-simple-line-icons-trophy:before { + content: "\e006"; +} +.icon-simple-line-icons-screen-smartphone:before { + content: "\e010"; +} +.icon-simple-line-icons-screen-desktop:before { + content: "\e011"; +} +.icon-simple-line-icons-plane:before { + content: "\e012"; +} +.icon-simple-line-icons-notebook:before { + content: "\e013"; +} +.icon-simple-line-icons-moustache:before { + content: "\e014"; +} +.icon-simple-line-icons-mouse:before { + content: "\e015"; +} +.icon-simple-line-icons-magnet:before { + content: "\e016"; +} +.icon-simple-line-icons-energy:before { + content: "\e020"; +} +.icon-simple-line-icons-emoticon-smile:before { + content: "\e021"; +} +.icon-simple-line-icons-disc:before { + content: "\e022"; +} +.icon-simple-line-icons-cursor-move:before { + content: "\e023"; +} +.icon-simple-line-icons-crop:before { + content: "\e024"; +} +.icon-simple-line-icons-credit-card:before { + content: "\e025"; +} +.icon-simple-line-icons-chemistry:before { + content: "\e026"; +} +.icon-simple-line-icons-user:before { + content: "\e005"; +} +.icon-simple-line-icons-speedometer:before { + content: "\e007"; +} +.icon-simple-line-icons-social-youtube:before { + content: "\e008"; +} +.icon-simple-line-icons-social-twitter:before { + content: "\e009"; +} +.icon-simple-line-icons-social-tumblr:before { + content: "\e00a"; +} +.icon-simple-line-icons-social-facebook:before { + content: "\e00b"; +} +.icon-simple-line-icons-social-dropbox:before { + content: "\e00c"; +} +.icon-simple-line-icons-social-dribbble:before { + content: "\e00d"; +} +.icon-simple-line-icons-shield:before { + content: "\e00e"; +} +.icon-simple-line-icons-screen-tablet:before { + content: "\e00f"; +} +.icon-simple-line-icons-magic-wand:before { + content: "\e017"; +} +.icon-simple-line-icons-hourglass:before { + content: "\e018"; +} +.icon-simple-line-icons-graduation:before { + content: "\e019"; +} +.icon-simple-line-icons-ghost:before { + content: "\e01a"; +} +.icon-simple-line-icons-game-controller:before { + content: "\e01b"; +} +.icon-simple-line-icons-fire:before { + content: "\e01c"; +} +.icon-simple-line-icons-eyeglasses:before { + content: "\e01d"; +} +.icon-simple-line-icons-envelope-open:before { + content: "\e01e"; +} +.icon-simple-line-icons-envelope-letter:before { + content: "\e01f"; +} +.icon-simple-line-icons-bell:before { + content: "\e027"; +} +.icon-simple-line-icons-badge:before { + content: "\e028"; +} +.icon-simple-line-icons-anchor:before { + content: "\e029"; +} +.icon-simple-line-icons-wallet:before { + content: "\e02a"; +} +.icon-simple-line-icons-vector:before { + content: "\e02b"; +} +.icon-simple-line-icons-speech:before { + content: "\e02c"; +} +.icon-simple-line-icons-puzzle:before { + content: "\e02d"; +} +.icon-simple-line-icons-printer:before { + content: "\e02e"; +} +.icon-simple-line-icons-present:before { + content: "\e02f"; +} +.icon-simple-line-icons-playlist:before { + content: "\e030"; +} +.icon-simple-line-icons-pin:before { + content: "\e031"; +} +.icon-simple-line-icons-picture:before { + content: "\e032"; +} +.icon-simple-line-icons-map:before { + content: "\e033"; +} +.icon-simple-line-icons-layers:before { + content: "\e034"; +} +.icon-simple-line-icons-handbag:before { + content: "\e035"; +} +.icon-simple-line-icons-globe-alt:before { + content: "\e036"; +} +.icon-simple-line-icons-globe:before { + content: "\e037"; +} +.icon-simple-line-icons-frame:before { + content: "\e038"; +} +.icon-simple-line-icons-folder-alt:before { + content: "\e039"; +} +.icon-simple-line-icons-film:before { + content: "\e03a"; +} +.icon-simple-line-icons-feed:before { + content: "\e03b"; +} +.icon-simple-line-icons-earphones-alt:before { + content: "\e03c"; +} +.icon-simple-line-icons-earphones:before { + content: "\e03d"; +} +.icon-simple-line-icons-drop:before { + content: "\e03e"; +} +.icon-simple-line-icons-drawer:before { + content: "\e03f"; +} +.icon-simple-line-icons-docs:before { + content: "\e040"; +} +.icon-simple-line-icons-directions:before { + content: "\e041"; +} +.icon-simple-line-icons-direction:before { + content: "\e042"; +} +.icon-simple-line-icons-diamond:before { + content: "\e043"; +} +.icon-simple-line-icons-cup:before { + content: "\e044"; +} +.icon-simple-line-icons-compass:before { + content: "\e045"; +} +.icon-simple-line-icons-call-out:before { + content: "\e046"; +} +.icon-simple-line-icons-call-in:before { + content: "\e047"; +} +.icon-simple-line-icons-call-end:before { + content: "\e048"; +} +.icon-simple-line-icons-calculator:before { + content: "\e049"; +} +.icon-simple-line-icons-bubbles:before { + content: "\e04a"; +} +.icon-simple-line-icons-briefcase:before { + content: "\e04b"; +} +.icon-simple-line-icons-book-open:before { + content: "\e04c"; +} +.icon-simple-line-icons-basket-loaded:before { + content: "\e04d"; +} +.icon-simple-line-icons-basket:before { + content: "\e04e"; +} +.icon-simple-line-icons-bag:before { + content: "\e04f"; +} +.icon-simple-line-icons-action-undo:before { + content: "\e050"; +} +.icon-simple-line-icons-action-redo:before { + content: "\e051"; +} +.icon-simple-line-icons-wrench:before { + content: "\e052"; +} +.icon-simple-line-icons-umbrella:before { + content: "\e053"; +} +.icon-simple-line-icons-trash:before { + content: "\e054"; +} +.icon-simple-line-icons-tag:before { + content: "\e055"; +} +.icon-simple-line-icons-support:before { + content: "\e056"; +} +.icon-simple-line-icons-size-fullscreen:before { + content: "\e057"; +} +.icon-simple-line-icons-size-actual:before { + content: "\e058"; +} +.icon-simple-line-icons-shuffle:before { + content: "\e059"; +} +.icon-simple-line-icons-share-alt:before { + content: "\e05a"; +} +.icon-simple-line-icons-share:before { + content: "\e05b"; +} +.icon-simple-line-icons-rocket:before { + content: "\e05c"; +} +.icon-simple-line-icons-question:before { + content: "\e05d"; +} +.icon-simple-line-icons-pie-chart:before { + content: "\e05e"; +} +.icon-simple-line-icons-pencil:before { + content: "\e05f"; +} +.icon-simple-line-icons-note:before { + content: "\e060"; +} +.icon-simple-line-icons-music-tone-alt:before { + content: "\e061"; +} +.icon-simple-line-icons-music-tone:before { + content: "\e062"; +} +.icon-simple-line-icons-microphone:before { + content: "\e063"; +} +.icon-simple-line-icons-loop:before { + content: "\e064"; +} +.icon-simple-line-icons-logout:before { + content: "\e065"; +} +.icon-simple-line-icons-login:before { + content: "\e066"; +} +.icon-simple-line-icons-list:before { + content: "\e067"; +} +.icon-simple-line-icons-like:before { + content: "\e068"; +} +.icon-simple-line-icons-home:before { + content: "\e069"; +} +.icon-simple-line-icons-grid:before { + content: "\e06a"; +} +.icon-simple-line-icons-graph:before { + content: "\e06b"; +} +.icon-simple-line-icons-equalizer:before { + content: "\e06c"; +} +.icon-simple-line-icons-dislike:before { + content: "\e06d"; +} +.icon-simple-line-icons-cursor:before { + content: "\e06e"; +} +.icon-simple-line-icons-control-start:before { + content: "\e06f"; +} +.icon-simple-line-icons-control-rewind:before { + content: "\e070"; +} +.icon-simple-line-icons-control-play:before { + content: "\e071"; +} +.icon-simple-line-icons-control-pause:before { + content: "\e072"; +} +.icon-simple-line-icons-control-forward:before { + content: "\e073"; +} +.icon-simple-line-icons-control-end:before { + content: "\e074"; +} +.icon-simple-line-icons-calendar:before { + content: "\e075"; +} +.icon-simple-line-icons-bulb:before { + content: "\e076"; +} +.icon-simple-line-icons-bar-chart:before { + content: "\e077"; +} +.icon-simple-line-icons-arrow-up:before { + content: "\e078"; +} +.icon-simple-line-icons-arrow-right:before { + content: "\e079"; +} +.icon-simple-line-icons-arrow-left:before { + content: "\e07a"; +} +.icon-simple-line-icons-arrow-down:before { + content: "\e07b"; +} +.icon-simple-line-icons-ban:before { + content: "\e07c"; +} +.icon-simple-line-icons-bubble:before { + content: "\e07d"; +} +.icon-simple-line-icons-camcorder:before { + content: "\e07e"; +} +.icon-simple-line-icons-camera:before { + content: "\e07f"; +} +.icon-simple-line-icons-check:before { + content: "\e080"; +} +.icon-simple-line-icons-clock:before { + content: "\e081"; +} +.icon-simple-line-icons-close:before { + content: "\e082"; +} +.icon-simple-line-icons-cloud-download:before { + content: "\e083"; +} +.icon-simple-line-icons-cloud-upload:before { + content: "\e084"; +} +.icon-simple-line-icons-doc:before { + content: "\e085"; +} +.icon-simple-line-icons-envelope:before { + content: "\e086"; +} +.icon-simple-line-icons-eye:before { + content: "\e087"; +} +.icon-simple-line-icons-flag:before { + content: "\e088"; +} +.icon-simple-line-icons-folder:before { + content: "\e089"; +} +.icon-simple-line-icons-heart:before { + content: "\e08a"; +} +.icon-simple-line-icons-info:before { + content: "\e08b"; +} +.icon-simple-line-icons-key:before { + content: "\e08c"; +} +.icon-simple-line-icons-link:before { + content: "\e08d"; +} +.icon-simple-line-icons-lock:before { + content: "\e08e"; +} +.icon-simple-line-icons-lock-open:before { + content: "\e08f"; +} +.icon-simple-line-icons-magnifier:before { + content: "\e090"; +} +.icon-simple-line-icons-magnifier-add:before { + content: "\e091"; +} +.icon-simple-line-icons-magnifier-remove:before { + content: "\e092"; +} +.icon-simple-line-icons-paper-clip:before { + content: "\e093"; +} +.icon-simple-line-icons-paper-plane:before { + content: "\e094"; +} +.icon-simple-line-icons-plus:before { + content: "\e095"; +} +.icon-simple-line-icons-pointer:before { + content: "\e096"; +} +.icon-simple-line-icons-power:before { + content: "\e097"; +} +.icon-simple-line-icons-refresh:before { + content: "\e098"; +} +.icon-simple-line-icons-reload:before { + content: "\e099"; +} +.icon-simple-line-icons-settings:before { + content: "\e09a"; +} +.icon-simple-line-icons-star:before { + content: "\e09b"; +} +.icon-simple-line-icons-symbol-female:before { + content: "\e09c"; +} +.icon-simple-line-icons-symbol-male:before { + content: "\e09d"; +} +.icon-simple-line-icons-target:before { + content: "\e09e"; +} +.icon-simple-line-icons-volume-1:before { + content: "\e09f"; +} +.icon-simple-line-icons-volume-2:before { + content: "\e0a0"; +} +.icon-simple-line-icons-volume-off:before { + content: "\e0a1"; +} +.icon-simple-line-icons-users:before { + content: "\e001"; +} diff --git a/sass/fonts/Stroke-Gap-Icons/Stroke-Gap-Icons.css b/sass/fonts/Stroke-Gap-Icons/Stroke-Gap-Icons.css new file mode 100755 index 0000000..3b0e9b8 --- /dev/null +++ b/sass/fonts/Stroke-Gap-Icons/Stroke-Gap-Icons.css @@ -0,0 +1,621 @@ +@font-face { + font-family: 'Stroke-Gap-Icons'; + src: url('#{$font-path}/Stroke-Gap-Icons/Stroke-Gap-Icons.woff2') format('woff2'), + url('#{$font-path}/Stroke-Gap-Icons/Stroke-Gap-Icons.woff') format('woff'); + font-weight: normal; + font-style: normal; +} + +[class^="icon-stroke-gap-icons-"]:before, +[class*=" icon-stroke-gap-icons-"]:before { + font-family: 'Stroke-Gap-Icons'; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-stroke-gap-icons-WorldWide:before { + content: "\e600"; +} +.icon-stroke-gap-icons-WorldGlobe:before { + content: "\e601"; +} +.icon-stroke-gap-icons-Underpants:before { + content: "\e602"; +} +.icon-stroke-gap-icons-Tshirt:before { + content: "\e603"; +} +.icon-stroke-gap-icons-Trousers:before { + content: "\e604"; +} +.icon-stroke-gap-icons-Tie:before { + content: "\e605"; +} +.icon-stroke-gap-icons-TennisBall:before { + content: "\e606"; +} +.icon-stroke-gap-icons-Telesocpe:before { + content: "\e607"; +} +.icon-stroke-gap-icons-Stop:before { + content: "\e608"; +} +.icon-stroke-gap-icons-Starship:before { + content: "\e609"; +} +.icon-stroke-gap-icons-Starship2:before { + content: "\e60a"; +} +.icon-stroke-gap-icons-Speaker:before { + content: "\e60b"; +} +.icon-stroke-gap-icons-Speaker2:before { + content: "\e60c"; +} +.icon-stroke-gap-icons-Soccer:before { + content: "\e60d"; +} +.icon-stroke-gap-icons-Snikers:before { + content: "\e60e"; +} +.icon-stroke-gap-icons-Scisors:before { + content: "\e60f"; +} +.icon-stroke-gap-icons-Puzzle:before { + content: "\e610"; +} +.icon-stroke-gap-icons-Printer:before { + content: "\e611"; +} +.icon-stroke-gap-icons-Pool:before { + content: "\e612"; +} +.icon-stroke-gap-icons-Podium:before { + content: "\e613"; +} +.icon-stroke-gap-icons-Play:before { + content: "\e614"; +} +.icon-stroke-gap-icons-Planet:before { + content: "\e615"; +} +.icon-stroke-gap-icons-Pause:before { + content: "\e616"; +} +.icon-stroke-gap-icons-Next:before { + content: "\e617"; +} +.icon-stroke-gap-icons-MusicNote2:before { + content: "\e618"; +} +.icon-stroke-gap-icons-MusicNote:before { + content: "\e619"; +} +.icon-stroke-gap-icons-MusicMixer:before { + content: "\e61a"; +} +.icon-stroke-gap-icons-Microphone:before { + content: "\e61b"; +} +.icon-stroke-gap-icons-Medal:before { + content: "\e61c"; +} +.icon-stroke-gap-icons-ManFigure:before { + content: "\e61d"; +} +.icon-stroke-gap-icons-Magnet:before { + content: "\e61e"; +} +.icon-stroke-gap-icons-Like:before { + content: "\e61f"; +} +.icon-stroke-gap-icons-Hanger:before { + content: "\e620"; +} +.icon-stroke-gap-icons-Handicap:before { + content: "\e621"; +} +.icon-stroke-gap-icons-Forward:before { + content: "\e622"; +} +.icon-stroke-gap-icons-Footbal:before { + content: "\e623"; +} +.icon-stroke-gap-icons-Flag:before { + content: "\e624"; +} +.icon-stroke-gap-icons-FemaleFigure:before { + content: "\e625"; +} +.icon-stroke-gap-icons-Dislike:before { + content: "\e626"; +} +.icon-stroke-gap-icons-DiamondRing:before { + content: "\e627"; +} +.icon-stroke-gap-icons-Cup:before { + content: "\e628"; +} +.icon-stroke-gap-icons-Crown:before { + content: "\e629"; +} +.icon-stroke-gap-icons-Column:before { + content: "\e62a"; +} +.icon-stroke-gap-icons-Click:before { + content: "\e62b"; +} +.icon-stroke-gap-icons-Cassette:before { + content: "\e62c"; +} +.icon-stroke-gap-icons-Bomb:before { + content: "\e62d"; +} +.icon-stroke-gap-icons-BatteryLow:before { + content: "\e62e"; +} +.icon-stroke-gap-icons-BatteryFull:before { + content: "\e62f"; +} +.icon-stroke-gap-icons-Bascketball:before { + content: "\e630"; +} +.icon-stroke-gap-icons-Astronaut:before { + content: "\e631"; +} +.icon-stroke-gap-icons-WineGlass:before { + content: "\e632"; +} +.icon-stroke-gap-icons-Water:before { + content: "\e633"; +} +.icon-stroke-gap-icons-Wallet:before { + content: "\e634"; +} +.icon-stroke-gap-icons-Umbrella:before { + content: "\e635"; +} +.icon-stroke-gap-icons-TV:before { + content: "\e636"; +} +.icon-stroke-gap-icons-TeaMug:before { + content: "\e637"; +} +.icon-stroke-gap-icons-Tablet:before { + content: "\e638"; +} +.icon-stroke-gap-icons-Soda:before { + content: "\e639"; +} +.icon-stroke-gap-icons-SodaCan:before { + content: "\e63a"; +} +.icon-stroke-gap-icons-SimCard:before { + content: "\e63b"; +} +.icon-stroke-gap-icons-Signal:before { + content: "\e63c"; +} +.icon-stroke-gap-icons-Shaker:before { + content: "\e63d"; +} +.icon-stroke-gap-icons-Radio:before { + content: "\e63e"; +} +.icon-stroke-gap-icons-Pizza:before { + content: "\e63f"; +} +.icon-stroke-gap-icons-Phone:before { + content: "\e640"; +} +.icon-stroke-gap-icons-Notebook:before { + content: "\e641"; +} +.icon-stroke-gap-icons-Mug:before { + content: "\e642"; +} +.icon-stroke-gap-icons-Mastercard:before { + content: "\e643"; +} +.icon-stroke-gap-icons-Ipod:before { + content: "\e644"; +} +.icon-stroke-gap-icons-Info:before { + content: "\e645"; +} +.icon-stroke-gap-icons-Icecream2:before { + content: "\e646"; +} +.icon-stroke-gap-icons-Icecream1:before { + content: "\e647"; +} +.icon-stroke-gap-icons-Hourglass:before { + content: "\e648"; +} +.icon-stroke-gap-icons-Help:before { + content: "\e649"; +} +.icon-stroke-gap-icons-Goto:before { + content: "\e64a"; +} +.icon-stroke-gap-icons-Glasses:before { + content: "\e64b"; +} +.icon-stroke-gap-icons-Gameboy:before { + content: "\e64c"; +} +.icon-stroke-gap-icons-ForkandKnife:before { + content: "\e64d"; +} +.icon-stroke-gap-icons-Export:before { + content: "\e64e"; +} +.icon-stroke-gap-icons-Exit:before { + content: "\e64f"; +} +.icon-stroke-gap-icons-Espresso:before { + content: "\e650"; +} +.icon-stroke-gap-icons-Drop:before { + content: "\e651"; +} +.icon-stroke-gap-icons-Download:before { + content: "\e652"; +} +.icon-stroke-gap-icons-Dollars:before { + content: "\e653"; +} +.icon-stroke-gap-icons-Dollar:before { + content: "\e654"; +} +.icon-stroke-gap-icons-DesktopMonitor:before { + content: "\e655"; +} +.icon-stroke-gap-icons-Corkscrew:before { + content: "\e656"; +} +.icon-stroke-gap-icons-CoffeeToGo:before { + content: "\e657"; +} +.icon-stroke-gap-icons-Chart:before { + content: "\e658"; +} +.icon-stroke-gap-icons-ChartUp:before { + content: "\e659"; +} +.icon-stroke-gap-icons-ChartDown:before { + content: "\e65a"; +} +.icon-stroke-gap-icons-Calculator:before { + content: "\e65b"; +} +.icon-stroke-gap-icons-Bread:before { + content: "\e65c"; +} +.icon-stroke-gap-icons-Bourbon:before { + content: "\e65d"; +} +.icon-stroke-gap-icons-BottleofWIne:before { + content: "\e65e"; +} +.icon-stroke-gap-icons-Bag:before { + content: "\e65f"; +} +.icon-stroke-gap-icons-Arrow:before { + content: "\e660"; +} +.icon-stroke-gap-icons-Antenna2:before { + content: "\e661"; +} +.icon-stroke-gap-icons-Antenna1:before { + content: "\e662"; +} +.icon-stroke-gap-icons-Anchor:before { + content: "\e663"; +} +.icon-stroke-gap-icons-Wheelbarrow:before { + content: "\e664"; +} +.icon-stroke-gap-icons-Webcam:before { + content: "\e665"; +} +.icon-stroke-gap-icons-Unlinked:before { + content: "\e666"; +} +.icon-stroke-gap-icons-Truck:before { + content: "\e667"; +} +.icon-stroke-gap-icons-Timer:before { + content: "\e668"; +} +.icon-stroke-gap-icons-Time:before { + content: "\e669"; +} +.icon-stroke-gap-icons-StorageBox:before { + content: "\e66a"; +} +.icon-stroke-gap-icons-Star:before { + content: "\e66b"; +} +.icon-stroke-gap-icons-ShoppingCart:before { + content: "\e66c"; +} +.icon-stroke-gap-icons-Shield:before { + content: "\e66d"; +} +.icon-stroke-gap-icons-Seringe:before { + content: "\e66e"; +} +.icon-stroke-gap-icons-Pulse:before { + content: "\e66f"; +} +.icon-stroke-gap-icons-Plaster:before { + content: "\e670"; +} +.icon-stroke-gap-icons-Plaine:before { + content: "\e671"; +} +.icon-stroke-gap-icons-Pill:before { + content: "\e672"; +} +.icon-stroke-gap-icons-PicnicBasket:before { + content: "\e673"; +} +.icon-stroke-gap-icons-Phone2:before { + content: "\e674"; +} +.icon-stroke-gap-icons-Pencil:before { + content: "\e675"; +} +.icon-stroke-gap-icons-Pen:before { + content: "\e676"; +} +.icon-stroke-gap-icons-PaperClip:before { + content: "\e677"; +} +.icon-stroke-gap-icons-On-Off:before { + content: "\e678"; +} +.icon-stroke-gap-icons-Mouse:before { + content: "\e679"; +} +.icon-stroke-gap-icons-Megaphone:before { + content: "\e67a"; +} +.icon-stroke-gap-icons-Linked:before { + content: "\e67b"; +} +.icon-stroke-gap-icons-Keyboard:before { + content: "\e67c"; +} +.icon-stroke-gap-icons-House:before { + content: "\e67d"; +} +.icon-stroke-gap-icons-Heart:before { + content: "\e67e"; +} +.icon-stroke-gap-icons-Headset:before { + content: "\e67f"; +} +.icon-stroke-gap-icons-FullShoppingCart:before { + content: "\e680"; +} +.icon-stroke-gap-icons-FullScreen:before { + content: "\e681"; +} +.icon-stroke-gap-icons-Folder:before { + content: "\e682"; +} +.icon-stroke-gap-icons-Floppy:before { + content: "\e683"; +} +.icon-stroke-gap-icons-Files:before { + content: "\e684"; +} +.icon-stroke-gap-icons-File:before { + content: "\e685"; +} +.icon-stroke-gap-icons-FileBox:before { + content: "\e686"; +} +.icon-stroke-gap-icons-ExitFullScreen:before { + content: "\e687"; +} +.icon-stroke-gap-icons-EmptyBox:before { + content: "\e688"; +} +.icon-stroke-gap-icons-Delete:before { + content: "\e689"; +} +.icon-stroke-gap-icons-Controller:before { + content: "\e68a"; +} +.icon-stroke-gap-icons-Compass:before { + content: "\e68b"; +} +.icon-stroke-gap-icons-CompassTool:before { + content: "\e68c"; +} +.icon-stroke-gap-icons-ClipboardText:before { + content: "\e68d"; +} +.icon-stroke-gap-icons-ClipboardChart:before { + content: "\e68e"; +} +.icon-stroke-gap-icons-ChemicalGlass:before { + content: "\e68f"; +} +.icon-stroke-gap-icons-CD:before { + content: "\e690"; +} +.icon-stroke-gap-icons-Carioca:before { + content: "\e691"; +} +.icon-stroke-gap-icons-Car:before { + content: "\e692"; +} +.icon-stroke-gap-icons-Book:before { + content: "\e693"; +} +.icon-stroke-gap-icons-BigTruck:before { + content: "\e694"; +} +.icon-stroke-gap-icons-Bicycle:before { + content: "\e695"; +} +.icon-stroke-gap-icons-Wrench:before { + content: "\e696"; +} +.icon-stroke-gap-icons-Web:before { + content: "\e697"; +} +.icon-stroke-gap-icons-Watch:before { + content: "\e698"; +} +.icon-stroke-gap-icons-Volume:before { + content: "\e699"; +} +.icon-stroke-gap-icons-Video:before { + content: "\e69a"; +} +.icon-stroke-gap-icons-Users:before { + content: "\e69b"; +} +.icon-stroke-gap-icons-User:before { + content: "\e69c"; +} +.icon-stroke-gap-icons-UploadCLoud:before { + content: "\e69d"; +} +.icon-stroke-gap-icons-Typing:before { + content: "\e69e"; +} +.icon-stroke-gap-icons-Tools:before { + content: "\e69f"; +} +.icon-stroke-gap-icons-Tag:before { + content: "\e6a0"; +} +.icon-stroke-gap-icons-Speedometter:before { + content: "\e6a1"; +} +.icon-stroke-gap-icons-Share:before { + content: "\e6a2"; +} +.icon-stroke-gap-icons-Settings:before { + content: "\e6a3"; +} +.icon-stroke-gap-icons-Search:before { + content: "\e6a4"; +} +.icon-stroke-gap-icons-Screwdriver:before { + content: "\e6a5"; +} +.icon-stroke-gap-icons-Rolodex:before { + content: "\e6a6"; +} +.icon-stroke-gap-icons-Ringer:before { + content: "\e6a7"; +} +.icon-stroke-gap-icons-Resume:before { + content: "\e6a8"; +} +.icon-stroke-gap-icons-Restart:before { + content: "\e6a9"; +} +.icon-stroke-gap-icons-PowerOff:before { + content: "\e6aa"; +} +.icon-stroke-gap-icons-Pointer:before { + content: "\e6ab"; +} +.icon-stroke-gap-icons-Picture:before { + content: "\e6ac"; +} +.icon-stroke-gap-icons-OpenedLock:before { + content: "\e6ad"; +} +.icon-stroke-gap-icons-Notes:before { + content: "\e6ae"; +} +.icon-stroke-gap-icons-Mute:before { + content: "\e6af"; +} +.icon-stroke-gap-icons-Movie:before { + content: "\e6b0"; +} +.icon-stroke-gap-icons-Microphone2:before { + content: "\e6b1"; +} +.icon-stroke-gap-icons-Message:before { + content: "\e6b2"; +} +.icon-stroke-gap-icons-MessageRight:before { + content: "\e6b3"; +} +.icon-stroke-gap-icons-MessageLeft:before { + content: "\e6b4"; +} +.icon-stroke-gap-icons-Menu:before { + content: "\e6b5"; +} +.icon-stroke-gap-icons-Media:before { + content: "\e6b6"; +} +.icon-stroke-gap-icons-Mail:before { + content: "\e6b7"; +} +.icon-stroke-gap-icons-List:before { + content: "\e6b8"; +} +.icon-stroke-gap-icons-Layers:before { + content: "\e6b9"; +} +.icon-stroke-gap-icons-Key:before { + content: "\e6ba"; +} +.icon-stroke-gap-icons-Imbox:before { + content: "\e6bb"; +} +.icon-stroke-gap-icons-Eye:before { + content: "\e6bc"; +} +.icon-stroke-gap-icons-Edit:before { + content: "\e6bd"; +} +.icon-stroke-gap-icons-DSLRCamera:before { + content: "\e6be"; +} +.icon-stroke-gap-icons-DownloadCloud:before { + content: "\e6bf"; +} +.icon-stroke-gap-icons-CompactCamera:before { + content: "\e6c0"; +} +.icon-stroke-gap-icons-Cloud:before { + content: "\e6c1"; +} +.icon-stroke-gap-icons-ClosedLock:before { + content: "\e6c2"; +} +.icon-stroke-gap-icons-Chart2:before { + content: "\e6c3"; +} +.icon-stroke-gap-icons-Bulb:before { + content: "\e6c4"; +} +.icon-stroke-gap-icons-Briefcase:before { + content: "\e6c5"; +} +.icon-stroke-gap-icons-Blog:before { + content: "\e6c6"; +} +.icon-stroke-gap-icons-Agenda:before { + content: "\e6c7"; +} diff --git a/sass/fonts/climacons/climacons.css b/sass/fonts/climacons/climacons.css new file mode 100755 index 0000000..4347614 --- /dev/null +++ b/sass/fonts/climacons/climacons.css @@ -0,0 +1,294 @@ +@font-face { + font-family: 'Climacons-Font'; + src: url('#{$font-path}/climacons/Climacons-Font.woff2') format('woff2'), + url('#{$font-path}/climacons/Climacons-Font.woff') format('woff'); + font-weight: normal; + font-style: normal; +} + +.climacon:before { + font-family: 'Climacons-Font'; + speak: none; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; +} +.climacon.cloud:before { + content: "\e000"; +} +.climacon.cloud.sun:before { + content: "\e001"; +} +.climacon.cloud.moon:before { + content: "\e002"; +} +.climacon.rain:before, +.climacon.rain.cloud:before { + content: "\e003"; +} +.climacon.rain.sun:before, +.climacon.rain.cloud.sun:before { + content: "\e004"; +} +.climacon.rain.moon:before, +.climacon.rain.cloud.moon:before { + content: "\e005"; +} +.climacon.showers:before, +.climacon.showers.cloud:before { + content: "\e006"; +} +.climacon.showers.sun:before, +.climacon.showers.cloud.sun:before { + content: "\e007"; +} +.climacon.showers.moon:before, +.climacon.showers.cloud.moon:before { + content: "\e008"; +} +.climacon.downpour:before, +.climacon.downpour.cloud:before { + content: "\e009"; +} +.climacon.downpour.sun:before, +.climacon.downpour.cloud.sun:before { + content: "\e00a"; +} +.climacon.downpour.moon:before, +.climacon.downpour.cloud.moon:before { + content: "\e00b"; +} +.climacon.drizzle:before, +.climacon.drizzle.cloud:before { + content: "\e00c"; +} +.climacon.drizzle.sun:before, +.climacon.drizzle.cloud.sun:before { + content: "\e00d"; +} +.climacon.drizzle.moon:before, +.climacon.drizzle.cloud.moon:before { + content: "\e00e"; +} +.climacon.sleet:before, +.climacon.sleet.cloud:before { + content: "\e00f"; +} +.climacon.sleet.sun:before, +.climacon.sleet.cloud.sun:before { + content: "\e010"; +} +.climacon.sleet.moon:before, +.climacon.sleet.cloud.moon:before { + content: "\e011"; +} +.climacon.hail:before, +.climacon.hail.cloud:before { + content: "\e012"; +} +.climacon.hail.sun:before, +.climacon.hail.cloud.sun:before { + content: "\e013"; +} +.climacon.hail.moon:before, +.climacon.hail.cloud.moon:before { + content: "\e014"; +} +.climacon.flurries:before, +.climacon.flurries.cloud:before { + content: "\e015"; +} +.climacon.flurries.sun:before, +.climacon.flurries.cloud.sun:before { + content: "\e016"; +} +.climacon.flurries.moon:before, +.climacon.flurries.cloud.moon:before { + content: "\e017"; +} +.climacon.snow:before, +.climacon.snow.cloud:before { + content: "\e018"; +} +.climacon.snow.sun:before, +.climacon.snow.cloud.sun:before { + content: "\e019"; +} +.climacon.snow.moon:before, +.climacon.snow.cloud.moon:before { + content: "\e01a"; +} +.climacon.fog:before, +.climacon.fog.cloud:before { + content: "\e01b"; +} +.climacon.fog.sun:before, +.climacon.fog.cloud.sun:before { + content: "\e01c"; +} +.climacon.fog.moon:before, +.climacon.fog.cloud.moon:before { + content: "\e01d"; +} +.climacon.haze:before { + content: "\e01e"; +} +.climacon.haze.sun:before { + content: "\e01f"; +} +.climacon.haze.moon:before { + content: "\e020"; +} +.climacon.wind:before { + content: "\e021"; +} +.climacon.wind.cloud:before { + content: "\e022"; +} +.climacon.wind.sun:before, +.climacon.wind.cloud.sun:before { + content: "\e023"; +} +.climacon.wind.moon:before, +.climacon.wind.cloud.moon:before { + content: "\e024"; +} +.climacon.lightning:before, +.climacon.lightning.cloud:before { + content: "\e025"; +} +.climacon.lightning.sun:before, +.climacon.lightning.cloud.sun:before { + content: "\e026"; +} +.climacon.lightning.moon:before, +.climacon.lightning.cloud.moon:before { + content: "\e027"; +} +.climacon.sun:before { + content: "\e028"; +} +.climacon.sun.set:before, +.climacon.sunset:before { + content: "\e029"; +} +.climacon.sun.rise:before, +.climacon.sunrise:before { + content: "\e02a"; +} +.climacon.sun.low:before, +.climacon.sun-low:before, +.climacon.low-sun:before { + content: "\e02b"; +} +.climacon.sun.lower:before, +.climacon.sun-lower:before, +.climacon.lower-sun:before { + content: "\e02c"; +} +.climacon.moon:before { + content: "\e02d"; +} +.climacon.moon.new:before { + content: "\e02e"; +} +.climacon.moon.waxing.crescent:before, +.climacon.moon.first-crescent:before { + content: "\e02f"; +} +.climacon.moon.waxing.quarter:before, +.climacon.moon.first-quarter:before, +.climacon.moon.waxing.half:before, +.climacon.moon.first-half:before{ + content: "\e030"; +} +.climacon.moon.waxing.gibbous:before, +.climacon.moon.first-gibbous:before, +.climacon.moon.waxing.three-quarter:before, +.climacon.moon.first-three-quarter:before { + content: "\e031"; +} +.climacon.moon.full:before { + content: "\e032"; +} +.climacon.moon.waning.gibbous:before, +.climacon.moon.last-gibbous:before, +.climacon.moon.waning.three-quarter:before, +.climacon.moon.last-three-quarter:before { + content: "\e033"; +} +.climacon.moon.waning.quarter:before, +.climacon.moon.last-quarter:before, +.climacon.moon.waning.half:before, +.climacon.moon.last-half:before { + content: "\e034"; +} +.climacon.moon.waning.crescent:before, +.climacon.moon.last-crescent:before { + content: "\e035"; +} +.climacon.snowflake:before { + content: "\e036"; +} +.climacon.tornado:before { + content: "\e037"; +} +.climacon.thermometer.empty:before, +.climacon.thermometer:before { + content: "\e038"; +} +.climacon.thermometer.low:before { + content: "\e039"; +} +.climacon.thermometer.medium-low:before { + content: "\e03a"; +} +.climacon.thermometer.medium-high:before { + content: "\e03b"; +} +.climacon.thermometer.high:before { + content: "\e03c"; +} +.climacon.thermometer.full:before { + content: "\e03d"; +} +.climacon.celcius:before { + content: "\e03e"; +} +.climacon.farenheit:before { + content: "\e03f"; +} +.climacon.compass:before { + content: "\e040"; +} +.climacon.compass.north:before { + content: "\e041"; +} +.climacon.compass.east:before { + content: "\e042"; +} +.climacon.compass.south:before { + content: "\e043"; +} +.climacon.compass.west:before { + content: "\e044"; +} +.climacon.umbrella:before { + content: "\e045"; +} +.climacon.sunglasses:before { + content: "\e046"; +} +.climacon.cloud.cycle:before, +.climacon.cloud.refresh:before { + content: "\e047"; +} +.climacon.cloud.down:before, +.climacon.cloud.download:before { + content: "\e048"; +} +.climacon.cloud.up:before, +.climacon.cloud.upload:before { + content: "\e049"; +} diff --git a/sass/fonts/devicon/devicon.css b/sass/fonts/devicon/devicon.css new file mode 100755 index 0000000..43a3a59 --- /dev/null +++ b/sass/fonts/devicon/devicon.css @@ -0,0 +1,416 @@ +@font-face { + font-family: 'devicon'; + src: url('#{$font-path}/devicon/devicon.woff2') format('woff2'), + url('#{$font-path}/devicon/devicon.woff') format('woff'); + font-weight: normal; + font-style: normal; +} + +[class^="devicon-"], [class*=" devicon-"] { + font-family: 'devicon'; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* PostgreSQL */ +.devicon-postgresql-plain:before { + content: "\e648"; +} +.devicon-postgresql-plain-wordmark:before { + content: "\e649"; +} +.devicon-postgresql-plain.colored, .devicon-postgresql-plain-wordmark.colored { + color: #336791; +} +/* NodeJS */ +.devicon-nodejs-plain:before { + content: "\e64a"; +} +.devicon-nodejs-plain-wordmark:before { + content: "\e64b"; +} +.devicon-nodejs-plain.colored, .devicon-nodejs-plain-wordmark.colored { + color: #83CD29; +} +/* MongoDB */ +.devicon-mongodb-plain:before { + content: "\e64c"; +} +.devicon-mongodb-plain-wordmark:before { + content: "\e64d"; +} +.devicon-mongodb-plain.colored, .devicon-mongodb-plain-wordmark.colored { + color: #4FAA41; +} +/* Kraken JS */ +.devicon-krakenjs-plain:before { + content: "\e64e"; +} +.devicon-krakenjs-plain-wordmark:before { + content: "\e64f"; +} +.devicon-krakenjs-plain.colored, .devicon-krakenjs-plain-wordmark.colored { + color: #0081C2; +} +/* Travis */ +.devicon-travis-plain-wordmark:before { + content: "\e641"; +} +.devicon-travis-plain:before { + content: "\e642"; +} +.devicon-travis-plain-wordmark.colored, .devicon-travis-plain.colored { + color: #BB2031; +} +/* Linux */ +.devicon-linux-plain:before { + content: "\e647"; +} +.devicon-linux-plain.colored { + color: #000000; +} +/* Ubuntu */ +.devicon-ubuntu-plain-wordmark:before { + content: "\e645"; +} +.devicon-ubuntu-plain:before { + content: "\e646"; +} +.devicon-ubuntu-plain-wordmark.colored, .devicon-ubuntu-plain.colored { + color: #DD4814; +} +/* Debian */ +.devicon-debian-plain-wordmark:before { + content: "\e643"; +} +.devicon-debian-plain:before { + content: "\e644"; +} +.devicon-debian-plain-wordmark.colored, .devicon-debian-plain.colored { + color: #A80030; +} +/* Firefox */ +.devicon-firefox-plain-wordmark:before { + content: "\e63f"; +} +.devicon-firefox-plain:before { + content: "\e640"; +} +.devicon-firefox-plain-wordmark.colored, .devicon-firefox-plain.colored { + color: #DD732A; +} +/* Chrome */ +.devicon-chrome-plain-wordmark:before { + content: "\e63d"; +} +.devicon-chrome-plain:before { + content: "\e63e"; +} +.devicon-chrome-plain-wordmark.colored, .devicon-chrome-plain.colored { + color: #ce4e4e; +} +/* Backbone */ +.devicon-backbone-line-wordmark:before { + content: "\e639"; +} +.devicon-backbone-line:before { + content: "\e63a"; +} +.devicon-backbone-plain-wordmark:before { + content: "\e63b"; +} +.devicon-backbone-plain:before { + content: "\e63c"; +} +.devicon-backbone-line-wordmark.colored, .devicon-backbone-line.colored, .devicon-backbone-plain-wordmark.colored, .devicon-backbone-plain.colored { + color: #002a41; +} +/* Ruby on rails */ +.devicon-rails-plain-wordmark:before { + content: "\e637"; +} +.devicon-rails-plain:before { + content: "\e638"; +} +.devicon-rails-plain-wordmark.colored, .devicon-rails-plain.colored { + color: #a62c46; +} +/* Ruby */ +.devicon-ruby-plain-wordmark:before { + content: "\e635"; +} +.devicon-ruby-plain:before { + content: "\e636"; +} +.devicon-ruby-plain-wordmark.colored, .devicon-ruby-plain.colored { + color: #d91404; +} +/* .NET */ +.devicon-dot-net-plain-wordmark:before { + content: "\e633"; +} +.devicon-dot-net-plain:before { + content: "\e634"; +} +.devicon-dot-net-plain-wordmark.colored, .devicon-dot-net-plain.colored { + color: #1384c8; +} +/* Gulp */ +.devicon-gulp-plain:before { + content: "\e632"; +} +.devicon-gulp-plain.colored { + color: #eb4a4b; +} +/* Zend */ +.devicon-zend-plain-wordmark:before { + content: "\e600"; +} +.devicon-zend-plain:before { + content: "\e601"; +} +.devicon-zend-plain-wordmark.colored, .devicon-zend-plain.colored { + color: #68b604; +} +/* Yii */ +.devicon-yii-plain-wordmark:before { + content: "\e602"; +} +.devicon-yii-plain:before { + content: "\e603"; +} +.devicon-yii-plain-wordmark.colored, .devicon-yii-plain.colored { + color: #0073bb; +} +/* Wordpress */ +.devicon-wordpress-plain-wordmark:before { + content: "\e604"; +} +.devicon-wordpress-plain:before { + content: "\e605"; +} +.devicon-wordpress-plain-wordmark.colored, .devicon-wordpress-plain.colored { + color: #494949; +} +/* Sass */ +.devicon-sass-plain:before { + content: "\e606"; +} +.devicon-sass-plain.colored { + color: #cc6699; +} +/* Python */ +.devicon-python-plain-wordmark:before { + content: "\e607"; +} +.devicon-python-plain:before { + content: "\e608"; +} +.devicon-python-plain-wordmark.colored, .devicon-python-plain.colored { + color: #ffd845; +} +/* PHP */ +.devicon-php-plain:before { + content: "\e609"; +} +.devicon-php-plain.colored { + color: #6181b6; +} +/* Photoshop */ +.devicon-photoshop-line:before { + content: "\e60a"; +} +.devicon-photoshop-plain:before { + content: "\e60b"; +} +.devicon-photoshop-line.colored, .devicon-photoshop-plain.colored { + color: #80b5e2; +} +/* MySQL */ +.devicon-mysql-line:before { + content: "\e60d"; +} +.devicon-mysql-line-wordmark:before { + content: "\e60c"; +} +.devicon-mysql-line.colored, .devicon-mysql-line-wordmark.colored { + color: #00618a; +} +/* Less */ +.devicon-less-plain:before { + content: "\e60e"; +} +.devicon-less-plain.colored { + color: #2a4d80; +} +/* Laravel */ +.devicon-laravel-plain-wordmark:before { + content: "\e60f"; +} +.devicon-laravel-plain:before { + content: "\e610"; +} +.devicon-laravel-plain-wordmark.colored, .devicon-laravel-plain.colored { + color: #fd4f31; +} +/* JQuery */ +.devicon-jquery-plain-wordmark:before { + content: "\e611"; +} +.devicon-jquery-plain:before { + content: "\e612"; +} +.devicon-jquery-plain-wordmark.colored, .devicon-jquery-plain.colored { + color: #0769ad; +} +/* Javascript */ +.devicon-javascript-plain:before { + content: "\e613"; +} +.devicon-javascript-plain.colored { + color: #f0db4f; +} +/* Java */ +.devicon-java-line-wordmark:before { + content: "\e614"; +} +.devicon-java-line:before { + content: "\e615"; +} +.devicon-java-line-wordmark.colored, .devicon-java-line.colored { + color: #ea2d2e; +} +/* Illustrator */ +.devicon-illustrator-line:before { + content: "\e616"; +} +.devicon-illustrator-plain:before { + content: "\e617"; +} +.devicon-illustrator-line.colored, .devicon-illustrator-plain.colored { + color: #faa625; +} +/* HTML5 */ +.devicon-html5-plain-wordmark:before { + content: "\e618"; +} +.devicon-html5-plain:before { + content: "\e619"; +} +.devicon-html5-plain-wordmark.colored, .devicon-html5-plain.colored { + color: #e54d26; +} +/* Grunt */ +.devicon-grunt-line-wordmark:before { + content: "\e61a"; +} +.devicon-grunt-line:before { + content: "\e61b"; +} +.devicon-grunt-plain-wordmark:before { + content: "\e61c"; +} +.devicon-grunt-plain:before { + content: "\e61d"; +} +.devicon-grunt-line-wordmark.colored, .devicon-grunt-line.colored, .devicon-grunt-plain-wordmark.colored, .devicon-grunt-plain.colored { + color: #fcaa1a; +} +/* Git */ +.devicon-git-plain-wordmark:before { + content: "\e61e"; +} +.devicon-git-plain:before { + content: "\e61f"; +} +.devicon-git-plain-wordmark.colored, .devicon-git-plain.colored { + color: #f34f29; +} +/* Foundation */ +.devicon-foundation-plain-wordmark:before { + content: "\e620"; +} +.devicon-foundation-plain:before { + content: "\e621"; +} +.devicon-foundation-plain-wordmark.colored, .devicon-foundation-plain.colored { + color: #008cba; +} +/* Devicon */ +.devicon-devicon-line:before { + content: "\e622"; +} +.devicon-devicon-plain:before { + content: "\e623"; +} +.devicon-devicon-line.colored, .devicon-devicon-plain.colored { + color: #60BE86; +} +/* CSS3 */ +.devicon-css3-plain-wordmark:before { + content: "\e624"; +} +.devicon-css3-plain:before { + content: "\e625"; +} +.devicon-css3-plain-wordmark.colored, .devicon-css3-plain.colored { + color: #3d8fc6; +} +/* Codeigniter */ +.devicon-codeigniter-plain-wordmark:before { + content: "\e626"; +} +.devicon-codeigniter-plain:before { + content: "\e627"; +} +.devicon-codeigniter-plain-wordmark.colored, .devicon-codeigniter-plain.colored { + color: #ee4323; +} +/* Bower */ +.devicon-bower-line-wordmark:before { + content: "\e628"; +} +.devicon-bower-line:before { + content: "\e629"; +} +.devicon-bower-plain-wordmark:before { + content: "\e62a"; +} +.devicon-bower-plain:before { + content: "\e62b"; +} +.devicon-bower-line-wordmark.colored, .devicon-bower-line.colored, .devicon-bower-plain-wordmark.colored, .devicon-bower-plain.colored { + color: #ef5734; +} +/* Bootstrap */ +.devicon-bootstrap-line-wordmark:before { + content: "\e62c"; +} +.devicon-bootstrap-line:before { + content: "\e62d"; +} +.devicon-bootstrap-plain-wordmark:before { + content: "\e62e"; +} +.devicon-bootstrap-plain:before { + content: "\e62f"; +} +.devicon-bootstrap-line-wordmark.colored, .devicon-bootstrap-line.colored, .devicon-bootstrap-plain-wordmark.colored, .devicon-bootstrap-plain.colored { + color: #59407f; +} +/* AngularJS */ +.devicon-angularjs-plain-wordmark:before { + content: "\e630"; +} +.devicon-angularjs-plain:before { + content: "\e631"; +} +.devicon-angularjs-plain-wordmark.colored, .devicon-angularjs-plain.colored { + color: #c4473a; +} diff --git a/sass/fonts/dripicons/dripicons.css b/sass/fonts/dripicons/dripicons.css new file mode 100755 index 0000000..3572963 --- /dev/null +++ b/sass/fonts/dripicons/dripicons.css @@ -0,0 +1,404 @@ +@font-face { + font-family: 'dripicons'; + src: url('#{$font-path}/dripicons/dripicons.woff2') format('woff2'), + url('#{$font-path}/dripicons/dripicons.woff') format('woff'); + font-weight: normal; + font-style: normal; +} + +[class^="icon-dripicons-"]:before, +[class*=" icon-dripicons-"]:before { + font-family: "dripicons"; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none !important; + speak: none; + display: inline-block; + text-decoration: none; + width: 1em; + line-height: 1em; + -webkit-font-smoothing: antialiased; +} + + +.icon-dripicons-align-center:before { + content: "\e000"; +} + +.icon-dripicons-align-justify:before { + content: "\e001"; +} + +.icon-dripicons-align-left:before { + content: "\e002"; +} + +.icon-dripicons-align-right:before { + content: "\e003"; +} + +.icon-dripicons-arrow-down:before { + content: "\e004"; +} + +.icon-dripicons-arrow-left:before { + content: "\e005"; +} + +.icon-dripicons-arrow-thin-down:before { + content: "\e006"; +} + +.icon-dripicons-arrow-right:before { + content: "\e007"; +} + +.icon-dripicons-arrow-thin-left:before { + content: "\e008"; +} + +.icon-dripicons-arrow-thin-up:before { + content: "\e009"; +} + +.icon-dripicons-arrow-up:before { + content: "\e010"; +} + +.icon-dripicons-attachment:before { + content: "\e011"; +} + +.icon-dripicons-arrow-thin-right:before { + content: "\e012"; +} + +.icon-dripicons-code:before { + content: "\e013"; +} + +.icon-dripicons-cloud:before { + content: "\e014"; +} + +.icon-dripicons-chevron-right:before { + content: "\e015"; +} + +.icon-dripicons-chevron-up:before { + content: "\e016"; +} + +.icon-dripicons-chevron-down:before { + content: "\e017"; +} + +.icon-dripicons-chevron-left:before { + content: "\e018"; +} + +.icon-dripicons-camera:before { + content: "\e019"; +} + +.icon-dripicons-checkmark:before { + content: "\e020"; +} + +.icon-dripicons-calendar:before { + content: "\e021"; +} + +.icon-dripicons-clockwise:before { + content: "\e022"; +} + +.icon-dripicons-conversation:before { + content: "\e023"; +} + +.icon-dripicons-direction:before { + content: "\e024"; +} + +.icon-dripicons-cross:before { + content: "\e025"; +} + +.icon-dripicons-graph-line:before { + content: "\e026"; +} + +.icon-dripicons-gear:before { + content: "\e027"; +} + +.icon-dripicons-graph-bar:before { + content: "\e028"; +} + +.icon-dripicons-export:before { + content: "\e029"; +} + +.icon-dripicons-feed:before { + content: "\e030"; +} + +.icon-dripicons-folder:before { + content: "\e031"; +} + +.icon-dripicons-forward:before { + content: "\e032"; +} + +.icon-dripicons-folder-open:before { + content: "\e033"; +} + +.icon-dripicons-download:before { + content: "\e034"; +} + +.icon-dripicons-document-new:before { + content: "\e035"; +} + +.icon-dripicons-document-edit:before { + content: "\e036"; +} + +.icon-dripicons-document:before { + content: "\e037"; +} + +.icon-dripicons-gaming:before { + content: "\e038"; +} + +.icon-dripicons-graph-pie:before { + content: "\e039"; +} + +.icon-dripicons-heart:before { + content: "\e040"; +} + +.icon-dripicons-headset:before { + content: "\e041"; +} + +.icon-dripicons-help:before { + content: "\e042"; +} + +.icon-dripicons-information:before { + content: "\e043"; +} + +.icon-dripicons-loading:before { + content: "\e044"; +} + +.icon-dripicons-lock:before { + content: "\e045"; +} + +.icon-dripicons-location:before { + content: "\e046"; +} + +.icon-dripicons-lock-open:before { + content: "\e047"; +} + +.icon-dripicons-mail:before { + content: "\e048"; +} + +.icon-dripicons-map:before { + content: "\e049"; +} + +.icon-dripicons-media-loop:before { + content: "\e050"; +} + +.icon-dripicons-mobile-portrait:before { + content: "\e051"; +} + +.icon-dripicons-mobile-landscape:before { + content: "\e052"; +} + +.icon-dripicons-microphone:before { + content: "\e053"; +} + +.icon-dripicons-minus:before { + content: "\e054"; +} + +.icon-dripicons-message:before { + content: "\e055"; +} + +.icon-dripicons-menu:before { + content: "\e056"; +} + +.icon-dripicons-media-stop:before { + content: "\e057"; +} + +.icon-dripicons-media-shuffle:before { + content: "\e058"; +} + +.icon-dripicons-media-previous:before { + content: "\e059"; +} + +.icon-dripicons-media-play:before { + content: "\e060"; +} + +.icon-dripicons-media-next:before { + content: "\e061"; +} + +.icon-dripicons-media-pause:before { + content: "\e062"; +} + +.icon-dripicons-monitor:before { + content: "\e063"; +} + +.icon-dripicons-move:before { + content: "\e064"; +} + +.icon-dripicons-plus:before { + content: "\e065"; +} + +.icon-dripicons-phone:before { + content: "\e066"; +} + +.icon-dripicons-preview:before { + content: "\e067"; +} + +.icon-dripicons-print:before { + content: "\e068"; +} + +.icon-dripicons-media-record:before { + content: "\e069"; +} + +.icon-dripicons-music:before { + content: "\e070"; +} + +.icon-dripicons-home:before { + content: "\e071"; +} + +.icon-dripicons-question:before { + content: "\e072"; +} + +.icon-dripicons-reply:before { + content: "\e073"; +} + +.icon-dripicons-reply-all:before { + content: "\e074"; +} + +.icon-dripicons-return:before { + content: "\e075"; +} + +.icon-dripicons-retweet:before { + content: "\e076"; +} + +.icon-dripicons-search:before { + content: "\e077"; +} + +.icon-dripicons-view-thumb:before { + content: "\e078"; +} + +.icon-dripicons-view-list-large:before { + content: "\e079"; +} + +.icon-dripicons-view-list:before { + content: "\e080"; +} + +.icon-dripicons-upload:before { + content: "\e081"; +} + +.icon-dripicons-user-group:before { + content: "\e082"; +} + +.icon-dripicons-trash:before { + content: "\e083"; +} + +.icon-dripicons-user:before { + content: "\e084"; +} + +.icon-dripicons-thumbs-up:before { + content: "\e085"; +} + +.icon-dripicons-thumbs-down:before { + content: "\e086"; +} + +.icon-dripicons-tablet-portrait:before { + content: "\e087"; +} + +.icon-dripicons-tablet-landscape:before { + content: "\e088"; +} + +.icon-dripicons-tag:before { + content: "\e089"; +} + +.icon-dripicons-star:before { + content: "\e090"; +} + +.icon-dripicons-volume-full:before { + content: "\e091"; +} + +.icon-dripicons-volume-off:before { + content: "\e092"; +} + +.icon-dripicons-warning:before { + content: "\e093"; +} + +.icon-dripicons-window:before { + content: "\e094"; +} + diff --git a/sass/fonts/feather/feather.css b/sass/fonts/feather/feather.css new file mode 100755 index 0000000..d8d263e --- /dev/null +++ b/sass/fonts/feather/feather.css @@ -0,0 +1,540 @@ +@font-face { + font-family: 'feather'; + src: url('#{$font-path}/feather/feather.woff2') format('woff2'), + url('#{$font-path}/feather/feather.woff') format('woff'); + font-weight: normal; + font-style: normal; +} + +[class^="icon-feather-"], +[class*=" icon-feather-"] { + display: inline-block; + font-family: "feather"; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-feather-eye:before { + content: "\e000"; +} + +.icon-feather-paper-clip:before { + content: "\e001"; +} + +.icon-feather-mail:before { + content: "\e002"; +} + +.icon-feather-toggle:before { + content: "\e003"; +} + +.icon-feather-layout:before { + content: "\e004"; +} + +.icon-feather-link:before { + content: "\e005"; +} + +.icon-feather-bell:before { + content: "\e006"; +} + +.icon-feather-lock:before { + content: "\e007"; +} + +.icon-feather-unlock:before { + content: "\e008"; +} + +.icon-feather-ribbon:before { + content: "\e009"; +} + +.icon-feather-image:before { + content: "\e010"; +} + +.icon-feather-signal:before { + content: "\e011"; +} + +.icon-feather-target:before { + content: "\e012"; +} + +.icon-feather-clipboard:before { + content: "\e013"; +} + +.icon-feather-clock:before { + content: "\e014"; +} + +.icon-feather-watch:before { + content: "\e015"; +} + +.icon-feather-air-play:before { + content: "\e016"; +} + +.icon-feather-camera:before { + content: "\e017"; +} + +.icon-feather-video:before { + content: "\e018"; +} + +.icon-feather-disc:before { + content: "\e019"; +} + +.icon-feather-printer:before { + content: "\e020"; +} + +.icon-feather-monitor:before { + content: "\e021"; +} + +.icon-feather-server:before { + content: "\e022"; +} + +.icon-feather-cog:before { + content: "\e023"; +} + +.icon-feather-heart:before { + content: "\e024"; +} + +.icon-feather-paragraph:before { + content: "\e025"; +} + +.icon-feather-align-justify:before { + content: "\e026"; +} + +.icon-feather-align-left:before { + content: "\e027"; +} + +.icon-feather-align-center:before { + content: "\e028"; +} + +.icon-feather-align-right:before { + content: "\e029"; +} + +.icon-feather-book:before { + content: "\e030"; +} + +.icon-feather-layers:before { + content: "\e031"; +} + +.icon-feather-stack:before { + content: "\e032"; +} + +.icon-feather-stack-2:before { + content: "\e033"; +} + +.icon-feather-paper:before { + content: "\e034"; +} + +.icon-feather-paper-stack:before { + content: "\e035"; +} + +.icon-feather-search:before { + content: "\e036"; +} + +.icon-feather-zoom-in:before { + content: "\e037"; +} + +.icon-feather-zoom-out:before { + content: "\e038"; +} + +.icon-feather-reply:before { + content: "\e039"; +} + +.icon-feather-circle-plus:before { + content: "\e040"; +} + +.icon-feather-circle-minus:before { + content: "\e041"; +} + +.icon-feather-circle-check:before { + content: "\e042"; +} + +.icon-feather-circle-cross:before { + content: "\e043"; +} + +.icon-feather-square-plus:before { + content: "\e044"; +} + +.icon-feather-square-minus:before { + content: "\e045"; +} + +.icon-feather-square-check:before { + content: "\e046"; +} + +.icon-feather-square-cross:before { + content: "\e047"; +} + +.icon-feather-microphone:before { + content: "\e048"; +} + +.icon-feather-record:before { + content: "\e049"; +} + +.icon-feather-skip-back:before { + content: "\e050"; +} + +.icon-feather-rewind:before { + content: "\e051"; +} + +.icon-feather-play:before { + content: "\e052"; +} + +.icon-feather-pause:before { + content: "\e053"; +} + +.icon-feather-stop:before { + content: "\e054"; +} + +.icon-feather-fast-forward:before { + content: "\e055"; +} + +.icon-feather-skip-forward:before { + content: "\e056"; +} + +.icon-feather-shuffle:before { + content: "\e057"; +} + +.icon-feather-repeat:before { + content: "\e058"; +} + +.icon-feather-folder:before { + content: "\e059"; +} + +.icon-feather-umbrella:before { + content: "\e060"; +} + +.icon-feather-moon:before { + content: "\e061"; +} + +.icon-feather-thermometer:before { + content: "\e062"; +} + +.icon-feather-drop:before { + content: "\e063"; +} + +.icon-feather-sun:before { + content: "\e064"; +} + +.icon-feather-cloud:before { + content: "\e065"; +} + +.icon-feather-cloud-upload:before { + content: "\e066"; +} + +.icon-feather-cloud-download:before { + content: "\e067"; +} + +.icon-feather-upload:before { + content: "\e068"; +} + +.icon-feather-download:before { + content: "\e069"; +} + +.icon-feather-location:before { + content: "\e070"; +} + +.icon-feather-location-2:before { + content: "\e071"; +} + +.icon-feather-map:before { + content: "\e072"; +} + +.icon-feather-battery:before { + content: "\e073"; +} + +.icon-feather-head:before { + content: "\e074"; +} + +.icon-feather-briefcase:before { + content: "\e075"; +} + +.icon-feather-speech-bubble:before { + content: "\e076"; +} + +.icon-feather-anchor:before { + content: "\e077"; +} + +.icon-feather-globe:before { + content: "\e078"; +} + +.icon-feather-box:before { + content: "\e079"; +} + +.icon-feather-reload:before { + content: "\e080"; +} + +.icon-feather-share:before { + content: "\e081"; +} + +.icon-feather-marquee:before { + content: "\e082"; +} + +.icon-feather-marquee-plus:before { + content: "\e083"; +} + +.icon-feather-marquee-minus:before { + content: "\e084"; +} + +.icon-feather-tag:before { + content: "\e085"; +} + +.icon-feather-power:before { + content: "\e086"; +} + +.icon-feather-command:before { + content: "\e087"; +} + +.icon-feather-alt:before { + content: "\e088"; +} + +.icon-feather-esc:before { + content: "\e089"; +} + +.icon-feather-bar-graph:before { + content: "\e090"; +} + +.icon-feather-bar-graph-2:before { + content: "\e091"; +} + +.icon-feather-pie-graph:before { + content: "\e092"; +} + +.icon-feather-star:before { + content: "\e093"; +} + +.icon-feather-arrow-left:before { + content: "\e094"; +} + +.icon-feather-arrow-right:before { + content: "\e095"; +} + +.icon-feather-arrow-up:before { + content: "\e096"; +} + +.icon-feather-arrow-down:before { + content: "\e097"; +} + +.icon-feather-volume:before { + content: "\e098"; +} + +.icon-feather-mute:before { + content: "\e099"; +} + +.icon-feather-content-right:before { + content: "\e100"; +} + +.icon-feather-content-left:before { + content: "\e101"; +} + +.icon-feather-grid:before { + content: "\e102"; +} + +.icon-feather-grid-2:before { + content: "\e103"; +} + +.icon-feather-columns:before { + content: "\e104"; +} + +.icon-feather-loader:before { + content: "\e105"; +} + +.icon-feather-bag:before { + content: "\e106"; +} + +.icon-feather-ban:before { + content: "\e107"; +} + +.icon-feather-flag:before { + content: "\e108"; +} + +.icon-feather-trash:before { + content: "\e109"; +} + +.icon-feather-expand:before { + content: "\e110"; +} + +.icon-feather-contract:before { + content: "\e111"; +} + +.icon-feather-maximize:before { + content: "\e112"; +} + +.icon-feather-minimize:before { + content: "\e113"; +} + +.icon-feather-plus:before { + content: "\e114"; +} + +.icon-feather-minus:before { + content: "\e115"; +} + +.icon-feather-check:before { + content: "\e116"; +} + +.icon-feather-cross:before { + content: "\e117"; +} + +.icon-feather-move:before { + content: "\e118"; +} + +.icon-feather-delete:before { + content: "\e119"; +} + +.icon-feather-menu:before { + content: "\e120"; +} + +.icon-feather-archive:before { + content: "\e121"; +} + +.icon-feather-inbox:before { + content: "\e122"; +} + +.icon-feather-outbox:before { + content: "\e123"; +} + +.icon-feather-file:before { + content: "\e124"; +} + +.icon-feather-file-add:before { + content: "\e125"; +} + +.icon-feather-file-subtract:before { + content: "\e126"; +} + +.icon-feather-help:before { + content: "\e127"; +} + +.icon-feather-open:before { + content: "\e128"; +} + +.icon-feather-ellipsis:before { + content: "\e129"; +} diff --git a/sass/fonts/flatline/flatline.css b/sass/fonts/flatline/flatline.css new file mode 100755 index 0000000..abd02fe --- /dev/null +++ b/sass/fonts/flatline/flatline.css @@ -0,0 +1,170 @@ +@font-face { + font-family: 'flatline'; + src: url('#{$font-path}/flatline/flatline.woff2') format('woff2'), + url('#{$font-path}/flatline/flatline.woff') format('woff'); + font-weight: normal; + font-style: normal; +} + +[class^="icon-flatline-"], [class*=" icon-flatline-"] { + font-family: 'flatline'; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-flatline-download-alt:before { + content: "\e631"; +} +.icon-flatline-tags:before { + content: "\e600"; +} +.icon-flatline-tag:before { + content: "\e601"; +} +.icon-flatline-book:before { + content: "\e602"; +} +.icon-flatline-volume-up:before { + content: "\e603"; +} +.icon-flatline-volume-off:before { + content: "\e604"; +} +.icon-flatline-volume-down:before { + content: "\e605"; +} +.icon-flatline-qrcode:before { + content: "\e606"; +} +.icon-flatline-lock:before { + content: "\e607"; +} +.icon-flatline-list-alt:before { + content: "\e608"; +} +.icon-flatline-headphones:before { + content: "\e609"; +} +.icon-flatline-flag:before { + content: "\e60a"; +} +.icon-flatline-barcode:before { + content: "\e60b"; +} +.icon-flatline-repeat:before { + content: "\e60c"; +} +.icon-flatline-refresh:before { + content: "\e60d"; +} +.icon-flatline-play-circle:before { + content: "\e60e"; +} +.icon-flatline-inbox:before { + content: "\e60f"; +} +.icon-flatline-zoom-out:before { + content: "\e610"; +} +.icon-flatline-zoom-in:before { + content: "\e611"; +} +.icon-flatline-user:before { + content: "\e612"; +} +.icon-flatline-upload:before { + content: "\e613"; +} +.icon-flatline-trash:before { + content: "\e614"; +} +.icon-flatline-time:before { + content: "\e615"; +} +.icon-flatline-th:before { + content: "\e616"; +} +.icon-flatline-th-list:before { + content: "\e617"; +} +.icon-flatline-th-large:before { + content: "\e618"; +} +.icon-flatline-star:before { + content: "\e619"; +} +.icon-flatline-star-empty:before { + content: "\e61a"; +} +.icon-flatline-signal:before { + content: "\e61b"; +} +.icon-flatline-search:before { + content: "\e61c"; +} +.icon-flatline-road:before { + content: "\e61d"; +} +.icon-flatline-remove:before { + content: "\e61e"; +} +.icon-flatline-plus:before { + content: "\e61f"; +} +.icon-flatline-pencil:before { + content: "\e620"; +} +.icon-flatline-ok:before { + content: "\e621"; +} +.icon-flatline-off:before { + content: "\e622"; +} +.icon-flatline-music:before { + content: "\e623"; +} +.icon-flatline-minus:before { + content: "\e624"; +} +.icon-flatline-home:before { + content: "\e625"; +} +.icon-flatline-heart:before { + content: "\e626"; +} +.icon-flatline-heart-empty:before { + content: "\e627"; +} +.icon-flatline-glass:before { + content: "\e628"; +} +.icon-flatline-film:before { + content: "\e629"; +} +.icon-flatline-file:before { + content: "\e62a"; +} +.icon-flatline-euro:before { + content: "\e62b"; +} +.icon-flatline-envelope:before { + content: "\e62c"; +} +.icon-flatline-download:before { + content: "\e62d"; +} +.icon-flatline-cog:before { + content: "\e62e"; +} +.icon-flatline-cloud:before { + content: "\e62f"; +} +.icon-flatline-asterisk:before { + content: "\e630"; +} diff --git a/sass/fonts/fontello/fontello.css b/sass/fonts/fontello/fontello.css new file mode 100755 index 0000000..3d9d385 --- /dev/null +++ b/sass/fonts/fontello/fontello.css @@ -0,0 +1,2071 @@ +@font-face { + font-family: 'fontello'; + src: url('#{$font-path}/fontello/fontello-webfont.woff2') format('woff2'), + url('#{$font-path}/fontello/fontello-webfont.woff') format('woff'); + font-weight: normal; + font-style: normal; +} + +[class^="icon-fontello-"]:before, [class*=" icon-fontello-"]:before { + font-family: "fontello"; + font-style: normal; + font-weight: normal; + speak: none; + line-height: 1; + display: inline-block; + text-decoration: inherit; + text-align: center; + font-variant: normal; + text-transform: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-fontello-emo-happy:before { content: '\e804'; } +.icon-fontello-odnoklassniki-rect-1:before { content: '\efff'; } +.icon-fontello-emo-wink2:before { content: '\e806'; } +.icon-fontello-emo-unhappy:before { content: '\e807'; } +.icon-fontello-emo-sleep:before { content: '\e808'; } +.icon-fontello-emo-thumbsup:before { content: '\e809'; } +.icon-fontello-emo-devil:before { content: '\e80a'; } +.icon-fontello-emo-surprised:before { content: '\e80b'; } +.icon-fontello-emo-tongue:before { content: '\e80c'; } +.icon-fontello-emo-coffee:before { content: '\e80d'; } +.icon-fontello-emo-sunglasses:before { content: '\e80e'; } +.icon-fontello-emo-displeased:before { content: '\e80f'; } +.icon-fontello-emo-beer:before { content: '\e810'; } +.icon-fontello-emo-grin:before { content: '\e811'; } +.icon-fontello-emo-angry:before { content: '\e812'; } +.icon-fontello-emo-saint:before { content: '\e813'; } +.icon-fontello-emo-cry:before { content: '\e800'; } +.icon-fontello-emo-shoot:before { content: '\e801'; } +.icon-fontello-emo-squint:before { content: '\e802'; } +.icon-fontello-emo-laugh:before { content: '\e803'; } +.icon-fontello-spin1:before { content: '\e814'; } +.icon-fontello-spin2:before { content: '\e815'; } +.icon-fontello-spin3:before { content: '\e816'; } +.icon-fontello-spin4:before { content: '\e817'; } +.icon-fontello-spin5:before { content: '\e818'; } +.icon-fontello-spin6:before { content: '\e819'; } +.icon-fontello-firefox:before { content: '\e81a'; } +.icon-fontello-chrome:before { content: '\e81b'; } +.icon-fontello-opera:before { content: '\e81c'; } +.icon-fontello-ie:before { content: '\e81d'; } +.icon-fontello-crown:before { content: '\e81e'; } +.icon-fontello-crown-plus:before { content: '\e81f'; } +.icon-fontello-crown-minus:before { content: '\e820'; } +.icon-fontello-marquee:before { content: '\e821'; } +.icon-fontello-glass:before { content: '\e822'; } +.icon-fontello-music-1:before { content: '\e823'; } +.icon-fontello-search-1:before { content: '\e824'; } +.icon-fontello-mail-1:before { content: '\e825'; } +.icon-fontello-mail-alt:before { content: '\e826'; } +.icon-fontello-heart-1:before { content: '\e827'; } +.icon-fontello-heart-empty-1:before { content: '\e828'; } +.icon-fontello-star-1:before { content: '\e829'; } +.icon-fontello-star-empty-1:before { content: '\e82a'; } +.icon-fontello-star-half:before { content: '\e82b'; } +.icon-fontello-star-half-alt:before { content: '\e82c'; } +.icon-fontello-user-1:before { content: '\e82d'; } +.icon-fontello-users-1:before { content: '\e82e'; } +.icon-fontello-male:before { content: '\e82f'; } +.icon-fontello-female:before { content: '\e830'; } +.icon-fontello-video-1:before { content: '\e831'; } +.icon-fontello-videocam:before { content: '\e832'; } +.icon-fontello-picture-1:before { content: '\e833'; } +.icon-fontello-camera-1:before { content: '\e834'; } +.icon-fontello-camera-alt:before { content: '\e835'; } +.icon-fontello-th-large:before { content: '\e836'; } +.icon-fontello-th:before { content: '\e837'; } +.icon-fontello-th-list:before { content: '\e838'; } +.icon-fontello-ok:before { content: '\e839'; } +.icon-fontello-ok-circle:before { content: '\e83a'; } +.icon-fontello-ok-circle2:before { content: '\e83b'; } +.icon-fontello-ok-squared:before { content: '\e83c'; } +.icon-fontello-cancel-1:before { content: '\e83d'; } +.icon-fontello-cancel-circle:before { content: '\e83e'; } +.icon-fontello-cancel-circle2:before { content: '\e83f'; } +.icon-fontello-plus-1:before { content: '\e840'; } +.icon-fontello-plus-circle:before { content: '\e841'; } +.icon-fontello-plus-squared-1:before { content: '\e842'; } +.icon-fontello-plus-squared-alt:before { content: '\e843'; } +.icon-fontello-minus-1:before { content: '\e844'; } +.icon-fontello-minus-circle:before { content: '\e845'; } +.icon-fontello-minus-squared:before { content: '\e846'; } +.icon-fontello-minus-squared-alt:before { content: '\e847'; } +.icon-fontello-help:before { content: '\e848'; } +.icon-fontello-help-circle:before { content: '\e849'; } +.icon-fontello-info-circle:before { content: '\e84a'; } +.icon-fontello-info:before { content: '\e84b'; } +.icon-fontello-home-1:before { content: '\e84c'; } +.icon-fontello-link-1:before { content: '\e84d'; } +.icon-fontello-unlink:before { content: '\e84e'; } +.icon-fontello-link-ext:before { content: '\e84f'; } +.icon-fontello-link-ext-alt:before { content: '\e850'; } +.icon-fontello-attach-1:before { content: '\e851'; } +.icon-fontello-lock-1:before { content: '\e852'; } +.icon-fontello-lock-open-1:before { content: '\e853'; } +.icon-fontello-lock-open-alt:before { content: '\e854'; } +.icon-fontello-pin:before { content: '\e855'; } +.icon-fontello-eye-1:before { content: '\e856'; } +.icon-fontello-eye-off:before { content: '\e857'; } +.icon-fontello-tag-1:before { content: '\e858'; } +.icon-fontello-tags:before { content: '\e859'; } +.icon-fontello-bookmark-1:before { content: '\e85a'; } +.icon-fontello-bookmark-empty:before { content: '\e85b'; } +.icon-fontello-flag-1:before { content: '\e85c'; } +.icon-fontello-flag-empty:before { content: '\e85d'; } +.icon-fontello-flag-checkered:before { content: '\e85e'; } +.icon-fontello-thumbs-up-1:before { content: '\e85f'; } +.icon-fontello-thumbs-down-1:before { content: '\e860'; } +.icon-fontello-thumbs-up-alt:before { content: '\e861'; } +.icon-fontello-thumbs-down-alt:before { content: '\e862'; } +.icon-fontello-download-1:before { content: '\e863'; } +.icon-fontello-upload-1:before { content: '\e864'; } +.icon-fontello-download-cloud:before { content: '\e865'; } +.icon-fontello-upload-cloud-1:before { content: '\e866'; } +.icon-fontello-reply-1:before { content: '\e867'; } +.icon-fontello-reply-all:before { content: '\e868'; } +.icon-fontello-forward-1:before { content: '\e869'; } +.icon-fontello-quote-left:before { content: '\e86a'; } +.icon-fontello-quote-right:before { content: '\e86b'; } +.icon-fontello-code:before { content: '\e86c'; } +.icon-fontello-export-1:before { content: '\e86d'; } +.icon-fontello-export-alt:before { content: '\e86e'; } +.icon-fontello-pencil-1:before { content: '\e86f'; } +.icon-fontello-pencil-squared:before { content: '\e870'; } +.icon-fontello-edit:before { content: '\e871'; } +.icon-fontello-print-1:before { content: '\e872'; } +.icon-fontello-retweet-1:before { content: '\e873'; } +.icon-fontello-keyboard:before { content: '\e874'; } +.icon-fontello-gamepad:before { content: '\e875'; } +.icon-fontello-comment-1:before { content: '\e876'; } +.icon-fontello-chat-1:before { content: '\e877'; } +.icon-fontello-comment-empty:before { content: '\e878'; } +.icon-fontello-chat-empty:before { content: '\e879'; } +.icon-fontello-bell-1:before { content: '\e87a'; } +.icon-fontello-bell-alt:before { content: '\e87b'; } +.icon-fontello-attention-alt:before { content: '\e87c'; /*@noflip*/padding-left: 5px; /*@noflip*/padding-right: 1px; top: 1px; position: relative; } +.icon-fontello-attention-1:before { content: '\e87d'; } +.icon-fontello-attention-circle:before { content: '\e87e'; } +.icon-fontello-location-1:before { content: '\e87f'; } +.icon-fontello-direction:before { content: '\e880'; } +.icon-fontello-compass:before { content: '\e881'; } +.icon-fontello-trash-1:before { content: '\e882'; } +.icon-fontello-doc-1:before { content: '\e883'; } +.icon-fontello-docs-1:before { content: '\e884'; } +.icon-fontello-doc-text:before { content: '\e885'; } +.icon-fontello-doc-inv:before { content: '\e886'; } +.icon-fontello-doc-text-inv:before { content: '\e887'; } +.icon-fontello-folder-1:before { content: '\e888'; } +.icon-fontello-folder-open:before { content: '\e889'; } +.icon-fontello-folder-empty:before { content: '\e88a'; } +.icon-fontello-folder-open-empty:before { content: '\e88b'; } +.icon-fontello-box:before { content: '\e88c'; } +.icon-fontello-rss-1:before { content: '\e88d'; } +.icon-fontello-rss-squared:before { content: '\e88e'; } +.icon-fontello-phone-1:before { content: '\e88f'; } +.icon-fontello-phone-squared:before { content: '\e890'; } +.icon-fontello-menu-1:before { content: '\e891'; } +.icon-fontello-cog-1:before { content: '\e892'; } +.icon-fontello-cog-alt:before { content: '\e893'; } +.icon-fontello-wrench:before { content: '\e894'; } +.icon-fontello-basket-1:before { content: '\e895'; } +.icon-fontello-calendar-1:before { content: '\e896'; } +.icon-fontello-calendar-empty:before { content: '\e897'; } +.icon-fontello-login-1:before { content: '\e898'; } +.icon-fontello-logout-1:before { content: '\e899'; } +.icon-fontello-mic:before { content: '\e89a'; } +.icon-fontello-mute:before { content: '\e89b'; } +.icon-fontello-volume-off:before { content: '\e89c'; } +.icon-fontello-volume-down:before { content: '\e89d'; } +.icon-fontello-volume-up:before { content: '\e89e'; } +.icon-fontello-headphones:before { content: '\e89f'; } +.icon-fontello-clock-1:before { content: '\e8a0'; } +.icon-fontello-lightbulb:before { content: '\e8a1'; } +.icon-fontello-block-1:before { content: '\e8a2'; } +.icon-fontello-resize-full-1:before { content: '\e8a3'; } +.icon-fontello-resize-full-alt:before { content: '\e8a4'; } +.icon-fontello-resize-small-1:before { content: '\e8a5'; } +.icon-fontello-resize-vertical:before { content: '\e8a6'; } +.icon-fontello-resize-horizontal:before { content: '\e8a7'; } +.icon-fontello-move:before { content: '\e8a8'; } +.icon-fontello-zoom-in:before { content: '\e8a9'; } +.icon-fontello-zoom-out:before { content: '\e8aa'; } +.icon-fontello-down-circle2:before { content: '\e8ab'; } +.icon-fontello-up-circle2:before { content: '\e8ac'; } +.icon-fontello-left-circled2:before { content: '\e8ad'; } +.icon-fontello-right-circled2:before { content: '\e8ae'; } +.icon-fontello-down-dir-1:before { content: '\e8af'; } +.icon-fontello-up-dir-1:before { content: '\e8b0'; } +.icon-fontello-left-dir-1:before { content: '\e8b1'; } +.icon-fontello-right-dir-1:before { content: '\e8b2'; } +.icon-fontello-down-open-1:before { content: '\e8b3'; } +.icon-fontello-left-open-1:before { content: '\e8b4'; } +.icon-fontello-right-open-1:before { content: '\e8b5'; } +.icon-fontello-up-open-1:before { content: '\e8b6'; } +.icon-fontello-angle-left:before { content: '\e8b7'; } +.icon-fontello-angle-right:before { content: '\e8b8'; } +.icon-fontello-angle-up:before { content: '\e8b9'; } +.icon-fontello-angle-down:before { content: '\e8ba'; } +.icon-fontello-angle-circled-left:before { content: '\e8bb'; } +.icon-fontello-angle-circled-right:before { content: '\e8bc'; } +.icon-fontello-angle-circled-up:before { content: '\e8bd'; } +.icon-fontello-angle-circled-down:before { content: '\e8be'; } +.icon-fontello-angle-double-left:before { content: '\e8bf'; } +.icon-fontello-angle-double-right:before { content: '\e8c0'; } +.icon-fontello-angle-double-up:before { content: '\e8c1'; } +.icon-fontello-angle-double-down:before { content: '\e8c2'; } +.icon-fontello-down:before { content: '\e8c3'; } +.icon-fontello-right:before { content: '\e8c4'; } +.icon-fontello-left:before { content: '\e8c5'; } +.icon-fontello-up:before { content: '\e8c6'; } +.icon-fontello-down-1:before { content: '\e8c7'; } +.icon-fontello-left-1:before { content: '\e8c8'; } +.icon-fontello-emo-wink:before { content: '\e805'; } +.icon-fontello-up-1:before { content: '\e8ca'; } +.icon-fontello-right-hand:before { content: '\e8cb'; } +.icon-fontello-left-hand:before { content: '\e8cc'; } +.icon-fontello-up-hand:before { content: '\e8cd'; } +.icon-fontello-down-hand:before { content: '\e8ce'; } +.icon-fontello-left-circled-1:before { content: '\e8cf'; } +.icon-fontello-right-circled-1:before { content: '\e8d0'; } +.icon-fontello-up-circled-1:before { content: '\e8d1'; } +.icon-fontello-down-circled-1:before { content: '\e8d2'; } +.icon-fontello-cw-1:before { content: '\e8d3'; } +.icon-fontello-ccw-1:before { content: '\e8d4'; } +.icon-fontello-arrows-cw:before { content: '\e8d5'; } +.icon-fontello-level-up:before { content: '\e8d6'; } +.icon-fontello-level-down:before { content: '\e8d7'; } +.icon-fontello-shuffle-1:before { content: '\e8d8'; } +.icon-fontello-exchange:before { content: '\e8d9'; } +.icon-fontello-collapse:before { content: '\e8da'; } +.icon-fontello-collapse-top:before { content: '\e8db'; } +.icon-fontello-expand:before { content: '\e8dc'; } +.icon-fontello-collapse-left:before { content: '\e8dd'; } +.icon-fontello-play-1:before { content: '\e8de'; } +.icon-fontello-play-circled:before { content: '\e8df'; } +.icon-fontello-play-circle2:before { content: '\e8e0'; } +.icon-fontello-stop-1:before { content: '\e8e1'; } +.icon-fontello-pause-1:before { content: '\e8e2'; } +.icon-fontello-to-end-1:before { content: '\e8e3'; } +.icon-fontello-to-end-alt:before { content: '\e8e4'; } +.icon-fontello-to-start-1:before { content: '\e8e5'; } +.icon-fontello-to-start-alt:before { content: '\e8e6'; } +.icon-fontello-fast-fw:before { content: '\e8e7'; } +.icon-fontello-fast-bw:before { content: '\e8e8'; } +.icon-fontello-eject:before { content: '\e8e9'; } +.icon-fontello-target-1:before { content: '\e8ea'; } +.icon-fontello-signal-1:before { content: '\e8eb'; } +.icon-fontello-award:before { content: '\e8ec'; } +.icon-fontello-desktop:before { content: '\e8ed'; } +.icon-fontello-laptop:before { content: '\e8ee'; } +.icon-fontello-tablet:before { content: '\e8ef'; } +.icon-fontello-mobile-1:before { content: '\e8f0'; } +.icon-fontello-inbox-1:before { content: '\e8f1'; } +.icon-fontello-globe-1:before { content: '\e8f2'; } +.icon-fontello-sun:before { content: '\e8f3'; } +.icon-fontello-cloud-1:before { content: '\e8f4'; } +.icon-fontello-flash-1:before { content: '\e8f5'; } +.icon-fontello-moon:before { content: '\e8f6'; } +.icon-fontello-umbrella:before { content: '\e8f7'; } +.icon-fontello-flight-1:before { content: '\e8f8'; } +.icon-fontello-fighter-jet:before { content: '\e8f9'; } +.icon-fontello-leaf-1:before { content: '\e8fa'; } +.icon-fontello-font:before { content: '\e8fb'; } +.icon-fontello-bold:before { content: '\e8fc'; } +.icon-fontello-italic:before { content: '\e8fd'; } +.icon-fontello-text-height:before { content: '\e8fe'; } +.icon-fontello-text-width:before { content: '\e8ff'; } +.icon-fontello-align-left:before { content: '\e900'; } +.icon-fontello-align-center:before { content: '\e901'; } +.icon-fontello-align-right:before { content: '\e902'; } +.icon-fontello-align-justify:before { content: '\e903'; } +.icon-fontello-list-1:before { content: '\e904'; } +.icon-fontello-indent-left:before { content: '\e905'; } +.icon-fontello-indent-right:before { content: '\e906'; } +.icon-fontello-list-bullet:before { content: '\e907'; } +.icon-fontello-list-numbered:before { content: '\e908'; } +.icon-fontello-strike:before { content: '\e909'; } +.icon-fontello-underline:before { content: '\e90a'; } +.icon-fontello-superscript:before { content: '\e90b'; } +.icon-fontello-subscript:before { content: '\e90c'; } +.icon-fontello-table:before { content: '\e90d'; } +.icon-fontello-columns:before { content: '\e90e'; } +.icon-fontello-crop:before { content: '\e90f'; } +.icon-fontello-scissors:before { content: '\e910'; } +.icon-fontello-paste:before { content: '\e911'; } +.icon-fontello-briefcase-1:before { content: '\e912'; } +.icon-fontello-suitcase-1:before { content: '\e913'; } +.icon-fontello-ellipsis:before { content: '\e914'; } +.icon-fontello-ellipsis-vert:before { content: '\e915'; } +.icon-fontello-off:before { content: '\e916'; } +.icon-fontello-road:before { content: '\e917'; } +.icon-fontello-list-alt:before { content: '\e918'; } +.icon-fontello-qrcode:before { content: '\e919'; } +.icon-fontello-barcode:before { content: '\e91a'; } +.icon-fontello-book-1:before { content: '\e91b'; } +.icon-fontello-ajust:before { content: '\e91c'; } +.icon-fontello-tint:before { content: '\e91d'; } +.icon-fontello-check-1:before { content: '\e91e'; } +.icon-fontello-check-empty:before { content: '\e91f'; } +.icon-fontello-circle:before { content: '\e920'; } +.icon-fontello-circle-empty:before { content: '\e921'; } +.icon-fontello-dot-circled:before { content: '\e922'; } +.icon-fontello-asterisk:before { content: '\e923'; } +.icon-fontello-gift:before { content: '\e924'; } +.icon-fontello-fire:before { content: '\e925'; } +.icon-fontello-magnet-1:before { content: '\e926'; } +.icon-fontello-chart-bar-1:before { content: '\e927'; } +.icon-fontello-ticket:before { content: '\e928'; } +.icon-fontello-credit-card-1:before { content: '\e929'; } +.icon-fontello-floppy-1:before { content: '\e92a'; } +.icon-fontello-megaphone-1:before { content: '\e92b'; } +.icon-fontello-hdd:before { content: '\e92c'; } +.icon-fontello-key-1:before { content: '\e92d'; } +.icon-fontello-fork:before { content: '\e92e'; } +.icon-fontello-rocket:before { content: '\e92f'; } +.icon-fontello-bug:before { content: '\e930'; } +.icon-fontello-certificate:before { content: '\e931'; } +.icon-fontello-tasks:before { content: '\e932'; } +.icon-fontello-filter:before { content: '\e933'; } +.icon-fontello-beaker:before { content: '\e934'; } +.icon-fontello-magic:before { content: '\e935'; } +.icon-fontello-truck:before { content: '\e936'; } +.icon-fontello-money:before { content: '\e937'; } +.icon-fontello-euro:before { content: '\e938'; } +.icon-fontello-pound:before { content: '\e939'; } +.icon-fontello-dollar:before { content: '\e93a'; } +.icon-fontello-rupee:before { content: '\e93b'; } +.icon-fontello-yen:before { content: '\e93c'; } +.icon-fontello-renminbi:before { content: '\e93d'; } +.icon-fontello-try:before { content: '\e93e'; } +.icon-fontello-won:before { content: '\e93f'; } +.icon-fontello-bitcoin:before { content: '\e940'; } +.icon-fontello-sort:before { content: '\e941'; } +.icon-fontello-sort-down:before { content: '\e942'; } +.icon-fontello-sort-up:before { content: '\e943'; } +.icon-fontello-sort-alt-up:before { content: '\e944'; } +.icon-fontello-sort-alt-down:before { content: '\e945'; } +.icon-fontello-sort-name-up:before { content: '\e946'; } +.icon-fontello-sort-name-down:before { content: '\e947'; } +.icon-fontello-sort-number-up:before { content: '\e948'; } +.icon-fontello-sort-number-down:before { content: '\e949'; } +.icon-fontello-hammer:before { content: '\e94a'; } +.icon-fontello-gauge-1:before { content: '\e94b'; } +.icon-fontello-sitemap:before { content: '\e94c'; } +.icon-fontello-spinner:before { content: '\e94d'; } +.icon-fontello-coffee:before { content: '\e94e'; } +.icon-fontello-food:before { content: '\e94f'; } +.icon-fontello-beer:before { content: '\e950'; } +.icon-fontello-user-md:before { content: '\e951'; } +.icon-fontello-stethoscope:before { content: '\e952'; } +.icon-fontello-ambulance:before { content: '\e953'; } +.icon-fontello-medkit:before { content: '\e954'; } +.icon-fontello-h-sigh:before { content: '\e955'; } +.icon-fontello-hospital:before { content: '\e956'; } +.icon-fontello-building:before { content: '\e957'; } +.icon-fontello-smile:before { content: '\e958'; } +.icon-fontello-frown:before { content: '\e959'; } +.icon-fontello-meh:before { content: '\e95a'; } +.icon-fontello-anchor:before { content: '\e95b'; } +.icon-fontello-terminal:before { content: '\e95c'; } +.icon-fontello-eraser:before { content: '\e95d'; } +.icon-fontello-puzzle:before { content: '\e95e'; } +.icon-fontello-shield:before { content: '\e95f'; } +.icon-fontello-extinguisher:before { content: '\e960'; } +.icon-fontello-bullseye:before { content: '\e961'; } +.icon-fontello-wheelchair:before { content: '\e962'; } +.icon-fontello-adn:before { content: '\e963'; } +.icon-fontello-android:before { content: '\e964'; } +.icon-fontello-apple:before { content: '\e965'; } +.icon-fontello-bitbucket:before { content: '\e966'; } +.icon-fontello-bitbucket-squared:before { content: '\e967'; } +.icon-fontello-css3:before { content: '\e968'; } +.icon-fontello-dribbble:before { content: '\e969'; } +.icon-fontello-dropbox:before { content: '\e96a'; } +.icon-fontello-facebook:before { content: '\e96b'; } +.icon-fontello-facebook-squared:before { content: '\e96c'; } +.icon-fontello-flickr:before { content: '\e96d'; } +.icon-fontello-foursquare:before { content: '\e96e'; } +.icon-fontello-github:before { content: '\e96f'; } +.icon-fontello-github-squared:before { content: '\e970'; } +.icon-fontello-github-circled-1:before { content: '\e971'; } +.icon-fontello-gittip:before { content: '\e972'; } +.icon-fontello-gplus-squared:before { content: '\e973'; } +.icon-fontello-gplus:before { content: '\e974'; } +.icon-fontello-html5:before { content: '\e975'; } +.icon-fontello-instagramm:before { content: '\e976'; } +.icon-fontello-linkedin-squared:before { content: '\e977'; } +.icon-fontello-linux:before { content: '\e978'; } +.icon-fontello-linkedin:before { content: '\e979'; } +.icon-fontello-maxcdn:before { content: '\e97a'; } +.icon-fontello-pagelines:before { content: '\e97b'; } +.icon-fontello-pinterest-circled:before { content: '\e97c'; } +.icon-fontello-pinterest-squared:before { content: '\e97d'; } +.icon-fontello-renren:before { content: '\e97e'; } +.icon-fontello-skype:before { content: '\e97f'; } +.icon-fontello-stackexchange:before { content: '\e980'; } +.icon-fontello-stackoverflow:before { content: '\e981'; } +.icon-fontello-trello:before { content: '\e982'; } +.icon-fontello-tumblr:before { content: '\e983'; } +.icon-fontello-tumblr-squared:before { content: '\e984'; } +.icon-fontello-twitter-squared:before { content: '\e985'; } +.icon-fontello-twitter:before { content: '\e986'; } +.icon-fontello-vimeo-squared:before { content: '\e987'; } +.icon-fontello-vkontakte:before { content: '\e988'; } +.icon-fontello-weibo:before { content: '\e989'; } +.icon-fontello-windows:before { content: '\e98a'; } +.icon-fontello-xing:before { content: '\e98b'; } +.icon-fontello-xing-squared:before { content: '\e98c'; } +.icon-fontello-youtube:before { content: '\e98d'; } +.icon-fontello-youtube-squared:before { content: '\e98e'; } +.icon-fontello-youtube-play:before { content: '\e98f'; } +.icon-fontello-blank:before { content: '\e990'; } +.icon-fontello-lemon:before { content: '\e991'; } +.icon-fontello-note:before { content: '\e992'; } +.icon-fontello-note-beamed:before { content: '\e993'; } +.icon-fontello-music:before { content: '\e994'; } +.icon-fontello-search:before { content: '\e995'; } +.icon-fontello-flashlight:before { content: '\e996'; } +.icon-fontello-mail:before { content: '\e997'; } +.icon-fontello-heart:before { content: '\e998'; } +.icon-fontello-heart-empty:before { content: '\e999'; } +.icon-fontello-star:before { content: '\e99a'; } +.icon-fontello-star-empty:before { content: '\e99b'; } +.icon-fontello-user:before { content: '\e99c'; } +.icon-fontello-users:before { content: '\e99d'; } +.icon-fontello-user-add:before { content: '\e99e'; } +.icon-fontello-video:before { content: '\e99f'; } +.icon-fontello-picture:before { content: '\e9a0'; } +.icon-fontello-camera:before { content: '\e9a1'; } +.icon-fontello-layout:before { content: '\e9a2'; } +.icon-fontello-menu:before { content: '\e9a3'; } +.icon-fontello-check:before { content: '\e9a4'; } +.icon-fontello-cancel:before { content: '\e9a5'; } +.icon-fontello-cancel-circled:before { content: '\e9a6'; } +.icon-fontello-cancel-squared:before { content: '\e9a7'; } +.icon-fontello-plus:before { content: '\e9a8'; } +.icon-fontello-plus-circled:before { content: '\e9a9'; } +.icon-fontello-plus-squared:before { content: '\e9aa'; } +.icon-fontello-minus:before { content: '\e9ab'; } +.icon-fontello-minus-circled:before { content: '\e9ac'; } +.icon-fontello-minus-squared-1:before { content: '\e9ad'; } +.icon-fontello-help-1:before { content: '\e9ae'; } +.icon-fontello-help-circled:before { content: '\e9af'; } +.icon-fontello-info-1:before { content: '\e9b0'; } +.icon-fontello-info-circled:before { content: '\e9b1'; } +.icon-fontello-back:before { content: '\e9b2'; } +.icon-fontello-home:before { content: '\e9b3'; } +.icon-fontello-link:before { content: '\e9b4'; } +.icon-fontello-attach:before { content: '\e9b5'; } +.icon-fontello-lock:before { content: '\e9b6'; } +.icon-fontello-lock-open:before { content: '\e9b7'; } +.icon-fontello-eye:before { content: '\e9b8'; } +.icon-fontello-tag:before { content: '\e9b9'; } +.icon-fontello-bookmark:before { content: '\e9ba'; } +.icon-fontello-bookmarks:before { content: '\e9bb'; } +.icon-fontello-flag:before { content: '\e9bc'; } +.icon-fontello-thumbs-up:before { content: '\e9bd'; } +.icon-fontello-thumbs-down:before { content: '\e9be'; } +.icon-fontello-download:before { content: '\e9bf'; } +.icon-fontello-upload:before { content: '\e9c0'; } +.icon-fontello-upload-cloud:before { content: '\e9c1'; } +.icon-fontello-reply:before { content: '\e9c2'; } +.icon-fontello-reply-all-1:before { content: '\e9c3'; } +.icon-fontello-forward:before { content: '\e9c4'; } +.icon-fontello-quote:before { content: '\e9c5'; } +.icon-fontello-code-1:before { content: '\e9c6'; } +.icon-fontello-export:before { content: '\e9c7'; } +.icon-fontello-pencil:before { content: '\e9c8'; } +.icon-fontello-feather:before { content: '\e9c9'; } +.icon-fontello-print:before { content: '\e9ca'; } +.icon-fontello-retweet:before { content: '\e9cb'; } +.icon-fontello-keyboard-1:before { content: '\e9cc'; } +.icon-fontello-comment:before { content: '\e9cd'; } +.icon-fontello-chat:before { content: '\e9ce'; } +.icon-fontello-bell:before { content: '\e9cf'; } +.icon-fontello-attention:before { content: '\e9d0'; } +.icon-fontello-alert:before { content: '\e9d1'; } +.icon-fontello-vcard:before { content: '\e9d2'; } +.icon-fontello-address:before { content: '\e9d3'; } +.icon-fontello-location:before { content: '\e9d4'; } +.icon-fontello-map:before { content: '\e9d5'; } +.icon-fontello-direction-1:before { content: '\e9d6'; } +.icon-fontello-compass-1:before { content: '\e9d7'; } +.icon-fontello-cup:before { content: '\e9d8'; } +.icon-fontello-trash:before { content: '\e9d9'; } +.icon-fontello-doc:before { content: '\e9da'; } +.icon-fontello-docs:before { content: '\e9db'; } +.icon-fontello-doc-landscape:before { content: '\e9dc'; } +.icon-fontello-doc-text-1:before { content: '\e9dd'; } +.icon-fontello-doc-text-inv-1:before { content: '\e9de'; } +.icon-fontello-newspaper:before { content: '\e9df'; } +.icon-fontello-book-open:before { content: '\e9e0'; } +.icon-fontello-book:before { content: '\e9e1'; } +.icon-fontello-folder:before { content: '\e9e2'; } +.icon-fontello-archive:before { content: '\e9e3'; } +.icon-fontello-box-1:before { content: '\e9e4'; } +.icon-fontello-rss:before { content: '\e9e5'; } +.icon-fontello-phone:before { content: '\e9e6'; } +.icon-fontello-cog:before { content: '\e9e7'; } +.icon-fontello-tools:before { content: '\e9e8'; } +.icon-fontello-share:before { content: '\e9e9'; } +.icon-fontello-shareable:before { content: '\e9ea'; } +.icon-fontello-basket:before { content: '\e9eb'; } +.icon-fontello-bag:before { content: '\e9ec'; } +.icon-fontello-calendar:before { content: '\e9ed'; } +.icon-fontello-login:before { content: '\e9ee'; } +.icon-fontello-logout:before { content: '\e9ef'; } +.icon-fontello-mic-1:before { content: '\e9f0'; } +.icon-fontello-mute-1:before { content: '\e9f1'; } +.icon-fontello-sound:before { content: '\e9f2'; } +.icon-fontello-volume:before { content: '\e9f3'; } +.icon-fontello-clock:before { content: '\e9f4'; } +.icon-fontello-hourglass:before { content: '\e9f5'; } +.icon-fontello-lamp:before { content: '\e9f6'; } +.icon-fontello-light-down:before { content: '\e9f7'; } +.icon-fontello-light-up:before { content: '\e9f8'; } +.icon-fontello-adjust:before { content: '\e9f9'; } +.icon-fontello-block:before { content: '\e9fa'; } +.icon-fontello-resize-full:before { content: '\e9fb'; } +.icon-fontello-resize-small:before { content: '\e9fc'; } +.icon-fontello-popup:before { content: '\e9fd'; } +.icon-fontello-publish:before { content: '\e9fe'; } +.icon-fontello-window:before { content: '\e9ff'; } +.icon-fontello-arrow-combo:before { content: '\ea00'; } +.icon-fontello-down-circled:before { content: '\ea01'; } +.icon-fontello-left-circled:before { content: '\ea02'; } +.icon-fontello-right-circled:before { content: '\ea03'; } +.icon-fontello-up-circled:before { content: '\ea04'; } +.icon-fontello-down-open:before { content: '\ea05'; } +.icon-fontello-left-open:before { content: '\ea06'; } +.icon-fontello-right-open:before { content: '\ea07'; } +.icon-fontello-up-open:before { content: '\ea08'; } +.icon-fontello-down-open-mini:before { content: '\ea09'; } +.icon-fontello-left-open-mini:before { content: '\ea0a'; } +.icon-fontello-right-open-mini:before { content: '\ea0b'; } +.icon-fontello-up-open-mini:before { content: '\ea0c'; } +.icon-fontello-down-open-big:before { content: '\ea0d'; } +.icon-fontello-left-open-big:before { content: '\ea0e'; } +.icon-fontello-right-open-big:before { content: '\ea0f'; } +.icon-fontello-up-open-big:before { content: '\ea10'; } +.icon-fontello-down-2:before { content: '\ea11'; } +.icon-fontello-left-2:before { content: '\ea12'; } +.icon-fontello-right-2:before { content: '\ea13'; } +.icon-fontello-up-2:before { content: '\ea14'; } +.icon-fontello-down-dir:before { content: '\ea15'; } +.icon-fontello-left-dir:before { content: '\ea16'; } +.icon-fontello-right-dir:before { content: '\ea17'; } +.icon-fontello-up-dir:before { content: '\ea18'; } +.icon-fontello-down-bold:before { content: '\ea19'; } +.icon-fontello-left-bold:before { content: '\ea1a'; } +.icon-fontello-right-bold:before { content: '\ea1b'; } +.icon-fontello-up-bold:before { content: '\ea1c'; } +.icon-fontello-down-thin:before { content: '\ea1d'; } +.icon-fontello-left-thin:before { content: '\ea1e'; } +.icon-fontello-right-thin:before { content: '\ea1f'; } +.icon-fontello-up-thin:before { content: '\ea20'; } +.icon-fontello-ccw:before { content: '\ea21'; } +.icon-fontello-cw:before { content: '\ea22'; } +.icon-fontello-arrows-ccw:before { content: '\ea23'; } +.icon-fontello-level-down-1:before { content: '\ea24'; } +.icon-fontello-level-up-1:before { content: '\ea25'; } +.icon-fontello-shuffle:before { content: '\ea26'; } +.icon-fontello-loop:before { content: '\ea27'; } +.icon-fontello-switch:before { content: '\ea28'; } +.icon-fontello-play:before { content: '\ea29'; } +.icon-fontello-stop:before { content: '\ea2a'; } +.icon-fontello-pause:before { content: '\ea2b'; } +.icon-fontello-record:before { content: '\ea2c'; } +.icon-fontello-to-end:before { content: '\ea2d'; } +.icon-fontello-to-start:before { content: '\ea2e'; } +.icon-fontello-fast-forward:before { content: '\ea2f'; } +.icon-fontello-fast-backward:before { content: '\ea30'; } +.icon-fontello-progress-0:before { content: '\ea31'; } +.icon-fontello-progress-1:before { content: '\ea32'; } +.icon-fontello-progress-2:before { content: '\ea33'; } +.icon-fontello-progress-3:before { content: '\ea34'; } +.icon-fontello-target:before { content: '\ea35'; } +.icon-fontello-palette:before { content: '\ea36'; } +.icon-fontello-list:before { content: '\ea37'; } +.icon-fontello-list-add:before { content: '\ea38'; } +.icon-fontello-signal:before { content: '\ea39'; } +.icon-fontello-trophy:before { content: '\ea3a'; } +.icon-fontello-battery:before { content: '\ea3b'; } +.icon-fontello-back-in-time:before { content: '\ea3c'; } +.icon-fontello-monitor:before { content: '\ea3d'; } +.icon-fontello-mobile:before { content: '\ea3e'; } +.icon-fontello-network:before { content: '\ea3f'; } +.icon-fontello-cd:before { content: '\ea40'; } +.icon-fontello-inbox:before { content: '\ea41'; } +.icon-fontello-install:before { content: '\ea42'; } +.icon-fontello-globe:before { content: '\ea43'; } +.icon-fontello-cloud:before { content: '\ea44'; } +.icon-fontello-cloud-thunder:before { content: '\ea45'; } +.icon-fontello-flash:before { content: '\ea46'; } +.icon-fontello-moon-1:before { content: '\ea47'; } +.icon-fontello-flight:before { content: '\ea48'; } +.icon-fontello-paper-plane:before { content: '\ea49'; } +.icon-fontello-leaf:before { content: '\ea4a'; } +.icon-fontello-lifebuoy:before { content: '\ea4b'; } +.icon-fontello-mouse:before { content: '\ea4c'; } +.icon-fontello-briefcase:before { content: '\ea4d'; } +.icon-fontello-suitcase:before { content: '\ea4e'; } +.icon-fontello-dot:before { content: '\ea4f'; } +.icon-fontello-dot-2:before { content: '\ea50'; } +.icon-fontello-dot-3:before { content: '\ea51'; } +.icon-fontello-brush:before { content: '\ea52'; } +.icon-fontello-magnet:before { content: '\ea53'; } +.icon-fontello-infinity:before { content: '\ea54'; } +.icon-fontello-erase:before { content: '\ea55'; } +.icon-fontello-chart-pie:before { content: '\ea56'; } +.icon-fontello-chart-line:before { content: '\ea57'; } +.icon-fontello-chart-bar:before { content: '\ea58'; } +.icon-fontello-chart-area:before { content: '\ea59'; } +.icon-fontello-tape:before { content: '\ea5a'; } +.icon-fontello-graduation-cap:before { content: '\ea5b'; } +.icon-fontello-language:before { content: '\ea5c'; } +.icon-fontello-ticket-1:before { content: '\ea5d'; } +.icon-fontello-water:before { content: '\ea5e'; } +.icon-fontello-droplet:before { content: '\ea5f'; } +.icon-fontello-air:before { content: '\ea60'; } +.icon-fontello-credit-card:before { content: '\ea61'; } +.icon-fontello-floppy:before { content: '\ea62'; } +.icon-fontello-clipboard:before { content: '\ea63'; } +.icon-fontello-megaphone:before { content: '\ea64'; } +.icon-fontello-database:before { content: '\ea65'; } +.icon-fontello-drive:before { content: '\ea66'; } +.icon-fontello-bucket:before { content: '\ea67'; } +.icon-fontello-thermometer:before { content: '\ea68'; } +.icon-fontello-key:before { content: '\ea69'; } +.icon-fontello-flow-cascade:before { content: '\ea6a'; } +.icon-fontello-flow-branch:before { content: '\ea6b'; } +.icon-fontello-flow-tree:before { content: '\ea6c'; } +.icon-fontello-flow-line:before { content: '\ea6d'; } +.icon-fontello-flow-parallel:before { content: '\ea6e'; } +.icon-fontello-rocket-1:before { content: '\ea6f'; } +.icon-fontello-gauge:before { content: '\ea70'; } +.icon-fontello-traffic-cone:before { content: '\ea71'; } +.icon-fontello-cc:before { content: '\ea72'; } +.icon-fontello-cc-by:before { content: '\ea73'; } +.icon-fontello-cc-nc:before { content: '\ea74'; } +.icon-fontello-cc-nc-eu:before { content: '\ea75'; } +.icon-fontello-cc-nc-jp:before { content: '\ea76'; } +.icon-fontello-cc-sa:before { content: '\ea77'; } +.icon-fontello-cc-nd:before { content: '\ea78'; } +.icon-fontello-cc-pd:before { content: '\ea79'; } +.icon-fontello-cc-zero:before { content: '\ea7a'; } +.icon-fontello-cc-share:before { content: '\ea7b'; } +.icon-fontello-cc-remix:before { content: '\ea7c'; } +.icon-fontello-github-1:before { content: '\ea7d'; } +.icon-fontello-github-circled:before { content: '\ea7e'; } +.icon-fontello-flickr-1:before { content: '\ea7f'; } +.icon-fontello-flickr-circled:before { content: '\ea80'; } +.icon-fontello-vimeo:before { content: '\ea81'; } +.icon-fontello-vimeo-circled:before { content: '\ea82'; } +.icon-fontello-twitter-1:before { content: '\ea83'; } +.icon-fontello-twitter-circled:before { content: '\ea84'; } +.icon-fontello-facebook-1:before { content: '\ea85'; } +.icon-fontello-facebook-circled:before { content: '\ea86'; } +.icon-fontello-facebook-squared-1:before { content: '\ea87'; } +.icon-fontello-gplus-1:before { content: '\ea88'; } +.icon-fontello-gplus-circled:before { content: '\ea89'; } +.icon-fontello-pinterest:before { content: '\ea8a'; } +.icon-fontello-pinterest-circled-1:before { content: '\ea8b'; } +.icon-fontello-tumblr-1:before { content: '\ea8c'; } +.icon-fontello-tumblr-circled:before { content: '\ea8d'; } +.icon-fontello-linkedin-1:before { content: '\ea8e'; } +.icon-fontello-linkedin-circled:before { content: '\ea8f'; } +.icon-fontello-dribbble-1:before { content: '\ea90'; } +.icon-fontello-dribbble-circled:before { content: '\ea91'; } +.icon-fontello-stumbleupon:before { content: '\ea92'; } +.icon-fontello-stumbleupon-circled:before { content: '\ea93'; } +.icon-fontello-lastfm:before { content: '\ea94'; } +.icon-fontello-lastfm-circled:before { content: '\ea95'; } +.icon-fontello-rdio:before { content: '\ea96'; } +.icon-fontello-rdio-circled:before { content: '\ea97'; } +.icon-fontello-spotify:before { content: '\ea98'; } +.icon-fontello-spotify-circled:before { content: '\ea99'; } +.icon-fontello-qq:before { content: '\ea9a'; } +.icon-fontello-instagram:before { content: '\ea9b'; } +.icon-fontello-dropbox-1:before { content: '\ea9c'; } +.icon-fontello-evernote:before { content: '\ea9d'; } +.icon-fontello-flattr:before { content: '\ea9e'; } +.icon-fontello-skype-1:before { content: '\ea9f'; } +.icon-fontello-skype-circled:before { content: '\eaa0'; } +.icon-fontello-renren-1:before { content: '\eaa1'; } +.icon-fontello-sina-weibo:before { content: '\eaa2'; } +.icon-fontello-paypal:before { content: '\eaa3'; } +.icon-fontello-picasa:before { content: '\eaa4'; } +.icon-fontello-soundcloud:before { content: '\eaa5'; } +.icon-fontello-mixi:before { content: '\eaa6'; } +.icon-fontello-behance:before { content: '\eaa7'; } +.icon-fontello-google-circles:before { content: '\eaa8'; } +.icon-fontello-vkontakte-1:before { content: '\eaa9'; } +.icon-fontello-smashing:before { content: '\eaaa'; } +.icon-fontello-sweden:before { content: '\eaab'; } +.icon-fontello-db-shape:before { content: '\eaac'; } +.icon-fontello-logo-db:before { content: '\eaad'; } +.icon-fontello-music-outline:before { content: '\eaae'; } +.icon-fontello-music-2:before { content: '\eaaf'; } +.icon-fontello-search-outline:before { content: '\eab0'; } +.icon-fontello-search-2:before { content: '\eab1'; } +.icon-fontello-mail-2:before { content: '\eab2'; } +.icon-fontello-heart-2:before { content: '\eab3'; } +.icon-fontello-heart-filled:before { content: '\eab4'; } +.icon-fontello-star-2:before { content: '\eab5'; } +.icon-fontello-star-filled:before { content: '\eab6'; } +.icon-fontello-user-outline:before { content: '\eab7'; } +.icon-fontello-user-2:before { content: '\eab8'; } +.icon-fontello-users-outline:before { content: '\eab9'; } +.icon-fontello-users-2:before { content: '\eaba'; } +.icon-fontello-user-add-outline:before { content: '\eabb'; } +.icon-fontello-user-add-1:before { content: '\eabc'; } +.icon-fontello-user-delete-outline:before { content: '\eabd'; } +.icon-fontello-user-delete:before { content: '\eabe'; } +.icon-fontello-video-2:before { content: '\eabf'; } +.icon-fontello-videocam-outline:before { content: '\eac0'; } +.icon-fontello-videocam-1:before { content: '\eac1'; } +.icon-fontello-picture-outline:before { content: '\eac2'; } +.icon-fontello-picture-2:before { content: '\eac3'; } +.icon-fontello-camera-outline:before { content: '\eac4'; } +.icon-fontello-camera-2:before { content: '\eac5'; } +.icon-fontello-th-outline:before { content: '\eac6'; } +.icon-fontello-th-1:before { content: '\eac7'; } +.icon-fontello-th-large-outline:before { content: '\eac8'; } +.icon-fontello-th-large-1:before { content: '\eac9'; } +.icon-fontello-th-list-outline:before { content: '\eaca'; } +.icon-fontello-th-list-1:before { content: '\eacb'; } +.icon-fontello-ok-outline:before { content: '\eacc'; } +.icon-fontello-ok-1:before { content: '\eacd'; } +.icon-fontello-cancel-outline:before { content: '\eace'; } +.icon-fontello-cancel-2:before { content: '\eacf'; } +.icon-fontello-cancel-alt:before { content: '\ead0'; } +.icon-fontello-cancel-alt-filled:before { content: '\ead1'; } +.icon-fontello-cancel-circled-outline:before { content: '\ead2'; } +.icon-fontello-cancel-circled-1:before { content: '\ead3'; } +.icon-fontello-plus-outline:before { content: '\ead4'; } +.icon-fontello-plus-2:before { content: '\ead5'; } +.icon-fontello-minus-outline:before { content: '\ead6'; } +.icon-fontello-minus-2:before { content: '\ead7'; } +.icon-fontello-divide-outline:before { content: '\ead8'; } +.icon-fontello-divide:before { content: '\ead9'; } +.icon-fontello-eq-outline:before { content: '\eada'; } +.icon-fontello-eq:before { content: '\eadb'; } +.icon-fontello-info-outline:before { content: '\eadc'; } +.icon-fontello-info-2:before { content: '\eadd'; } +.icon-fontello-home-outline:before { content: '\eade'; } +.icon-fontello-home-2:before { content: '\eadf'; } +.icon-fontello-link-outline:before { content: '\eae0'; } +.icon-fontello-link-2:before { content: '\eae1'; } +.icon-fontello-attach-outline:before { content: '\eae2'; } +.icon-fontello-attach-2:before { content: '\eae3'; } +.icon-fontello-lock-2:before { content: '\eae4'; } +.icon-fontello-lock-filled:before { content: '\eae5'; } +.icon-fontello-lock-open-2:before { content: '\eae6'; } +.icon-fontello-lock-open-filled:before { content: '\eae7'; } +.icon-fontello-pin-outline:before { content: '\eae8'; } +.icon-fontello-pin-1:before { content: '\eae9'; } +.icon-fontello-eye-outline:before { content: '\eaea'; } +.icon-fontello-eye-2:before { content: '\eaeb'; } +.icon-fontello-tag-2:before { content: '\eaec'; } +.icon-fontello-tags-1:before { content: '\eaed'; } +.icon-fontello-bookmark-2:before { content: '\eaee'; } +.icon-fontello-flag-2:before { content: '\eaef'; } +.icon-fontello-flag-filled:before { content: '\eaf0'; } +.icon-fontello-thumbs-up-2:before { content: '\eaf1'; } +.icon-fontello-thumbs-down-2:before { content: '\eaf2'; } +.icon-fontello-download-outline:before { content: '\eaf3'; } +.icon-fontello-download-2:before { content: '\eaf4'; } +.icon-fontello-upload-outline:before { content: '\eaf5'; } +.icon-fontello-upload-2:before { content: '\eaf6'; } +.icon-fontello-upload-cloud-outline:before { content: '\eaf7'; } +.icon-fontello-upload-cloud-2:before { content: '\eaf8'; } +.icon-fontello-reply-outline:before { content: '\eaf9'; } +.icon-fontello-reply-2:before { content: '\eafa'; } +.icon-fontello-forward-outline:before { content: '\eafb'; } +.icon-fontello-forward-2:before { content: '\eafc'; } +.icon-fontello-code-outline:before { content: '\eafd'; } +.icon-fontello-code-2:before { content: '\eafe'; } +.icon-fontello-export-outline:before { content: '\eaff'; } +.icon-fontello-export-2:before { content: '\eb00'; } +.icon-fontello-pencil-2:before { content: '\eb01'; } +.icon-fontello-pen:before { content: '\eb02'; } +.icon-fontello-feather-1:before { content: '\eb03'; } +.icon-fontello-edit-1:before { content: '\eb04'; position: relative; top: -1px; /*@noflip*/left: 2px; } +.icon-fontello-print-2:before { content: '\eb05'; } +.icon-fontello-comment-2:before { content: '\eb06'; } +.icon-fontello-chat-2:before { content: '\eb07'; } +.icon-fontello-chat-alt:before { content: '\eb08'; } +.icon-fontello-bell-2:before { content: '\eb09'; } +.icon-fontello-attention-2:before { content: '\eb0a'; } +.icon-fontello-attention-filled:before { content: '\eb0b'; } +.icon-fontello-warning-empty:before { content: '\eb0c'; } +.icon-fontello-warning:before { content: '\eb0d'; } +.icon-fontello-contacts:before { content: '\eb0e'; } +.icon-fontello-vcard-1:before { content: '\eb0f'; } +.icon-fontello-address-1:before { content: '\eb10'; } +.icon-fontello-location-outline:before { content: '\eb11'; } +.icon-fontello-location-2:before { content: '\eb12'; } +.icon-fontello-map-1:before { content: '\eb13'; } +.icon-fontello-direction-outline:before { content: '\eb14'; } +.icon-fontello-direction-2:before { content: '\eb15'; } +.icon-fontello-compass-2:before { content: '\eb16'; } +.icon-fontello-trash-2:before { content: '\eb17'; } +.icon-fontello-doc-2:before { content: '\eb18'; } +.icon-fontello-doc-text-2:before { content: '\eb19'; } +.icon-fontello-doc-add:before { content: '\eb1a'; } +.icon-fontello-doc-remove:before { content: '\eb1b'; } +.icon-fontello-news:before { content: '\eb1c'; } +.icon-fontello-folder-2:before { content: '\eb1d'; } +.icon-fontello-folder-add:before { content: '\eb1e'; } +.icon-fontello-folder-delete:before { content: '\eb1f'; } +.icon-fontello-archive-1:before { content: '\eb20'; } +.icon-fontello-box-2:before { content: '\eb21'; } +.icon-fontello-rss-outline:before { content: '\eb22'; } +.icon-fontello-rss-2:before { content: '\eb23'; } +.icon-fontello-phone-outline:before { content: '\eb24'; } +.icon-fontello-phone-2:before { content: '\eb25'; } +.icon-fontello-menu-outline:before { content: '\eb26'; } +.icon-fontello-menu-2:before { content: '\eb27'; } +.icon-fontello-cog-outline:before { content: '\eb28'; } +.icon-fontello-cog-2:before { content: '\eb29'; } +.icon-fontello-wrench-outline:before { content: '\eb2a'; } +.icon-fontello-wrench-1:before { content: '\eb2b'; } +.icon-fontello-basket-2:before { content: '\eb2c'; } +.icon-fontello-calendar-outlilne:before { content: '\eb2d'; } +.icon-fontello-calendar-2:before { content: '\eb2e'; } +.icon-fontello-mic-outline:before { content: '\eb2f'; } +.icon-fontello-mic-2:before { content: '\eb30'; } +.icon-fontello-volume-off-1:before { content: '\eb31'; } +.icon-fontello-volume-low:before { content: '\eb32'; } +.icon-fontello-volume-middle:before { content: '\eb33'; } +.icon-fontello-volume-high:before { content: '\eb34'; } +.icon-fontello-headphones-1:before { content: '\eb35'; } +.icon-fontello-clock-2:before { content: '\eb36'; } +.icon-fontello-wristwatch:before { content: '\eb37'; } +.icon-fontello-stopwatch:before { content: '\eb38'; } +.icon-fontello-lightbulb-1:before { content: '\eb39'; } +.icon-fontello-block-outline:before { content: '\eb3a'; } +.icon-fontello-block-2:before { content: '\eb3b'; } +.icon-fontello-resize-full-outline:before { content: '\eb3c'; } +.icon-fontello-resize-full-2:before { content: '\eb3d'; } +.icon-fontello-resize-normal-outline:before { content: '\eb3e'; } +.icon-fontello-resize-normal:before { content: '\eb3f'; } +.icon-fontello-move-outline:before { content: '\eb40'; } +.icon-fontello-move-1:before { content: '\eb41'; } +.icon-fontello-popup-1:before { content: '\eb42'; } +.icon-fontello-zoom-in-outline:before { content: '\eb43'; } +.icon-fontello-zoom-in-1:before { content: '\eb44'; } +.icon-fontello-zoom-out-outline:before { content: '\eb45'; } +.icon-fontello-zoom-out-1:before { content: '\eb46'; } +.icon-fontello-popup-2:before { content: '\eb47'; } +.icon-fontello-left-open-outline:before { content: '\eb48'; } +.icon-fontello-left-open-2:before { content: '\eb49'; } +.icon-fontello-right-open-outline:before { content: '\eb4a'; } +.icon-fontello-right-open-2:before { content: '\eb4b'; } +.icon-fontello-down-3:before { content: '\eb4c'; } +.icon-fontello-left-3:before { content: '\eb4d'; } +.icon-fontello-right-3:before { content: '\eb4e'; } +.icon-fontello-up-3:before { content: '\eb4f'; } +.icon-fontello-down-outline:before { content: '\eb50'; } +.icon-fontello-left-outline:before { content: '\eb51'; } +.icon-fontello-right-outline:before { content: '\eb52'; } +.icon-fontello-up-outline:before { content: '\eb53'; } +.icon-fontello-down-small:before { content: '\eb54'; } +.icon-fontello-left-small:before { content: '\eb55'; } +.icon-fontello-right-small:before { content: '\eb56'; } +.icon-fontello-up-small:before { content: '\eb57'; } +.icon-fontello-cw-outline:before { content: '\eb58'; } +.icon-fontello-cw-2:before { content: '\eb59'; } +.icon-fontello-arrows-cw-outline:before { content: '\eb5a'; } +.icon-fontello-arrows-cw-1:before { content: '\eb5b'; } +.icon-fontello-loop-outline:before { content: '\eb5c'; } +.icon-fontello-loop-1:before { content: '\eb5d'; } +.icon-fontello-loop-alt-outline:before { content: '\eb5e'; } +.icon-fontello-loop-alt:before { content: '\eb5f'; } +.icon-fontello-shuffle-2:before { content: '\eb60'; } +.icon-fontello-play-outline:before { content: '\eb61'; } +.icon-fontello-play-2:before { content: '\eb62'; } +.icon-fontello-stop-outline:before { content: '\eb63'; } +.icon-fontello-stop-2:before { content: '\eb64'; } +.icon-fontello-pause-outline:before { content: '\eb65'; } +.icon-fontello-pause-2:before { content: '\eb66'; } +.icon-fontello-fast-fw-outline:before { content: '\eb67'; } +.icon-fontello-fast-fw-1:before { content: '\eb68'; } +.icon-fontello-rewind-outline:before { content: '\eb69'; } +.icon-fontello-rewind:before { content: '\eb6a'; } +.icon-fontello-record-outline:before { content: '\eb6b'; } +.icon-fontello-record-1:before { content: '\eb6c'; } +.icon-fontello-eject-outline:before { content: '\eb6d'; } +.icon-fontello-eject-1:before { content: '\eb6e'; } +.icon-fontello-eject-alt-outline:before { content: '\eb6f'; } +.icon-fontello-eject-alt:before { content: '\eb70'; } +.icon-fontello-bat1:before { content: '\eb71'; } +.icon-fontello-bat2:before { content: '\eb72'; } +.icon-fontello-bat3:before { content: '\eb73'; } +.icon-fontello-bat4:before { content: '\eb74'; } +.icon-fontello-bat-charge:before { content: '\eb75'; } +.icon-fontello-plug:before { content: '\eb76'; } +.icon-fontello-target-outline:before { content: '\eb77'; } +.icon-fontello-target-2:before { content: '\eb78'; } +.icon-fontello-wifi-outline:before { content: '\eb79'; } +.icon-fontello-wifi:before { content: '\eb7a'; } +.icon-fontello-desktop-1:before { content: '\eb7b'; } +.icon-fontello-laptop-1:before { content: '\eb7c'; } +.icon-fontello-tablet-1:before { content: '\eb7d'; } +.icon-fontello-mobile-2:before { content: '\eb7e'; } +.icon-fontello-contrast:before { content: '\eb7f'; } +.icon-fontello-globe-outline:before { content: '\eb80'; } +.icon-fontello-globe-2:before { content: '\eb81'; } +.icon-fontello-globe-alt-outline:before { content: '\eb82'; } +.icon-fontello-globe-alt:before { content: '\eb83'; } +.icon-fontello-sun-1:before { content: '\eb84'; } +.icon-fontello-sun-filled:before { content: '\eb85'; } +.icon-fontello-cloud-2:before { content: '\eb86'; } +.icon-fontello-flash-outline:before { content: '\eb87'; } +.icon-fontello-flash-2:before { content: '\eb88'; } +.icon-fontello-moon-2:before { content: '\eb89'; } +.icon-fontello-waves-outline:before { content: '\eb8a'; } +.icon-fontello-waves:before { content: '\eb8b'; } +.icon-fontello-rain:before { content: '\eb8c'; } +.icon-fontello-cloud-sun:before { content: '\eb8d'; } +.icon-fontello-drizzle:before { content: '\eb8e'; } +.icon-fontello-snow:before { content: '\eb8f'; } +.icon-fontello-cloud-flash:before { content: '\eb90'; } +.icon-fontello-cloud-wind:before { content: '\eb91'; } +.icon-fontello-wind:before { content: '\eb92'; } +.icon-fontello-plane-outline:before { content: '\eb93'; } +.icon-fontello-plane:before { content: '\eb94'; } +.icon-fontello-leaf-2:before { content: '\eb95'; } +.icon-fontello-lifebuoy-1:before { content: '\eb96'; } +.icon-fontello-briefcase-2:before { content: '\eb97'; } +.icon-fontello-brush-1:before { content: '\eb98'; } +.icon-fontello-pipette:before { content: '\eb99'; } +.icon-fontello-power-outline:before { content: '\eb9a'; } +.icon-fontello-power:before { content: '\eb9b'; } +.icon-fontello-check-outline:before { content: '\eb9c'; } +.icon-fontello-check-2:before { content: '\eb9d'; } +.icon-fontello-gift-1:before { content: '\eb9e'; } +.icon-fontello-temperatire:before { content: '\eb9f'; } +.icon-fontello-chart-outline:before { content: '\eba0'; } +.icon-fontello-chart:before { content: '\eba1'; } +.icon-fontello-chart-alt-outline:before { content: '\eba2'; } +.icon-fontello-chart-alt:before { content: '\eba3'; } +.icon-fontello-chart-bar-outline:before { content: '\eba4'; } +.icon-fontello-chart-bar-2:before { content: '\eba5'; } +.icon-fontello-chart-pie-outline:before { content: '\eba6'; } +.icon-fontello-chart-pie-1:before { content: '\eba7'; } +.icon-fontello-ticket-2:before { content: '\eba8'; } +.icon-fontello-credit-card-2:before { content: '\eba9'; } +.icon-fontello-clipboard-1:before { content: '\ebaa'; } +.icon-fontello-database-1:before { content: '\ebab'; } +.icon-fontello-key-outline:before { content: '\ebac'; } +.icon-fontello-key-2:before { content: '\ebad'; } +.icon-fontello-flow-split:before { content: '\ebae'; } +.icon-fontello-flow-merge:before { content: '\ebaf'; } +.icon-fontello-flow-parallel-1:before { content: '\ebb0'; } +.icon-fontello-flow-cross:before { content: '\ebb1'; } +.icon-fontello-certificate-outline:before { content: '\ebb2'; } +.icon-fontello-certificate-1:before { content: '\ebb3'; } +.icon-fontello-scissors-outline:before { content: '\ebb4'; } +.icon-fontello-scissors-1:before { content: '\ebb5'; } +.icon-fontello-flask:before { content: '\ebb6'; } +.icon-fontello-wine:before { content: '\ebb7'; } +.icon-fontello-coffee-1:before { content: '\ebb8'; } +.icon-fontello-beer-1:before { content: '\ebb9'; } +.icon-fontello-anchor-outline:before { content: '\ebba'; } +.icon-fontello-anchor-1:before { content: '\ebbb'; } +.icon-fontello-puzzle-outline:before { content: '\ebbc'; } +.icon-fontello-puzzle-1:before { content: '\ebbd'; } +.icon-fontello-tree:before { content: '\ebbe'; } +.icon-fontello-calculator:before { content: '\ebbf'; } +.icon-fontello-infinity-outline:before { content: '\ebc0'; } +.icon-fontello-infinity-1:before { content: '\ebc1'; } +.icon-fontello-pi-outline:before { content: '\ebc2'; } +.icon-fontello-pi:before { content: '\ebc3'; } +.icon-fontello-at:before { content: '\ebc4'; } +.icon-fontello-at-circled:before { content: '\ebc5'; } +.icon-fontello-looped-square-outline:before { content: '\ebc6'; } +.icon-fontello-looped-square-interest:before { content: '\ebc7'; } +.icon-fontello-sort-alphabet-outline:before { content: '\ebc8'; } +.icon-fontello-sort-alphabet:before { content: '\ebc9'; } +.icon-fontello-sort-numeric-outline:before { content: '\ebca'; } +.icon-fontello-sort-numeric:before { content: '\ebcb'; } +.icon-fontello-dribbble-circled-1:before { content: '\ebcc'; } +.icon-fontello-dribbble-2:before { content: '\ebcd'; } +.icon-fontello-facebook-circled-1:before { content: '\ebce'; } +.icon-fontello-facebook-2:before { content: '\ebcf'; } +.icon-fontello-flickr-circled-1:before { content: '\ebd0'; } +.icon-fontello-flickr-2:before { content: '\ebd1'; } +.icon-fontello-github-circled-2:before { content: '\ebd2'; } +.icon-fontello-github-2:before { content: '\ebd3'; } +.icon-fontello-lastfm-circled-1:before { content: '\ebd4'; } +.icon-fontello-lastfm-1:before { content: '\ebd5'; } +.icon-fontello-linkedin-circled-1:before { content: '\ebd6'; } +.icon-fontello-linkedin-2:before { content: '\ebd7'; } +.icon-fontello-pinterest-circled-2:before { content: '\ebd8'; } +.icon-fontello-pinterest-1:before { content: '\ebd9'; } +.icon-fontello-skype-outline:before { content: '\ebda'; } +.icon-fontello-skype-2:before { content: '\ebdb'; } +.icon-fontello-tumbler-circled:before { content: '\ebdc'; } +.icon-fontello-tumbler:before { content: '\ebdd'; } +.icon-fontello-twitter-circled-1:before { content: '\ebde'; } +.icon-fontello-twitter-2:before { content: '\ebdf'; } +.icon-fontello-vimeo-circled-1:before { content: '\ebe0'; } +.icon-fontello-vimeo-1:before { content: '\ebe1'; } +.icon-fontello-search-3:before { content: '\ebe2'; } +.icon-fontello-mail-3:before { content: '\ebe3'; } +.icon-fontello-heart-3:before { content: '\ebe4'; } +.icon-fontello-heart-empty-2:before { content: '\ebe5'; } +.icon-fontello-star-3:before { content: '\ebe6'; } +.icon-fontello-user-3:before { content: '\ebe7'; } +.icon-fontello-video-3:before { content: '\ebe8'; } +.icon-fontello-picture-3:before { content: '\ebe9'; } +.icon-fontello-camera-3:before { content: '\ebea'; } +.icon-fontello-ok-2:before { content: '\ebeb'; } +.icon-fontello-ok-circle-1:before { content: '\ebec'; } +.icon-fontello-cancel-3:before { content: '\ebed'; } +.icon-fontello-cancel-circle-1:before { content: '\ebee'; } +.icon-fontello-plus-3:before { content: '\ebef'; } +.icon-fontello-plus-circle-1:before { content: '\ebf0'; } +.icon-fontello-minus-3:before { content: '\ebf1'; } +.icon-fontello-minus-circle-1:before { content: '\ebf2'; } +.icon-fontello-help-2:before { content: '\ebf3'; } +.icon-fontello-info-3:before { content: '\ebf4'; } +.icon-fontello-home-3:before { content: '\ebf5'; } +.icon-fontello-link-3:before { content: '\ebf6'; } +.icon-fontello-attach-3:before { content: '\ebf7'; } +.icon-fontello-lock-3:before { content: '\ebf8'; } +.icon-fontello-lock-empty:before { content: '\ebf9'; } +.icon-fontello-lock-open-3:before { content: '\ebfa'; } +.icon-fontello-lock-open-empty:before { content: '\ebfb'; } +.icon-fontello-pin-2:before { content: '\ebfc'; } +.icon-fontello-eye-3:before { content: '\ebfd'; } +.icon-fontello-tag-3:before { content: '\ebfe'; } +.icon-fontello-tag-empty:before { content: '\ebff'; } +.icon-fontello-download-3:before { content: '\ec00'; } +.icon-fontello-upload-3:before { content: '\ec01'; } +.icon-fontello-download-cloud-1:before { content: '\ec02'; } +.icon-fontello-upload-cloud-3:before { content: '\ec03'; } +.icon-fontello-quote-left-1:before { content: '\ec04'; } +.icon-fontello-quote-right-1:before { content: '\ec05'; } +.icon-fontello-quote-left-alt:before { content: '\ec06'; } +.icon-fontello-quote-right-alt:before { content: '\ec07'; } +.icon-fontello-pencil-3:before { content: '\ec08'; } +.icon-fontello-pencil-neg:before { content: '\ec09'; } +.icon-fontello-pencil-alt:before { content: '\ec0a'; } +.icon-fontello-undo:before { content: '\ec0b'; } +.icon-fontello-comment-3:before { content: '\ec0c'; } +.icon-fontello-comment-inv:before { content: '\ec0d'; } +.icon-fontello-comment-alt:before { content: '\ec0e'; } +.icon-fontello-comment-inv-alt:before { content: '\ec0f'; } +.icon-fontello-comment-alt2:before { content: '\ec10'; } +.icon-fontello-comment-inv-alt2:before { content: '\ec11'; } +.icon-fontello-chat-3:before { content: '\ec12'; } +.icon-fontello-chat-inv:before { content: '\ec13'; } +.icon-fontello-location-3:before { content: '\ec14'; } +.icon-fontello-location-inv:before { content: '\ec15'; } +.icon-fontello-location-alt:before { content: '\ec16'; } +.icon-fontello-compass-3:before { content: '\ec17'; } +.icon-fontello-trash-3:before { content: '\ec18'; } +.icon-fontello-trash-empty:before { content: '\ec19'; } +.icon-fontello-doc-3:before { content: '\ec1a'; } +.icon-fontello-doc-inv-1:before { content: '\ec1b'; } +.icon-fontello-doc-alt:before { content: '\ec1c'; } +.icon-fontello-doc-inv-alt:before { content: '\ec1d'; } +.icon-fontello-article:before { content: '\ec1e'; } +.icon-fontello-article-alt:before { content: '\ec1f'; } +.icon-fontello-book-open-1:before { content: '\ec20'; } +.icon-fontello-folder-3:before { content: '\ec21'; } +.icon-fontello-folder-empty-1:before { content: '\ec22'; } +.icon-fontello-box-3:before { content: '\ec23'; } +.icon-fontello-rss-3:before { content: '\ec24'; } +.icon-fontello-rss-alt:before { content: '\ec25'; } +.icon-fontello-cog-3:before { content: '\ec26'; } +.icon-fontello-wrench-2:before { content: '\ec27'; } +.icon-fontello-share-1:before { content: '\ec28'; } +.icon-fontello-calendar-3:before { content: '\ec29'; } +.icon-fontello-calendar-inv:before { content: '\ec2a'; } +.icon-fontello-calendar-alt:before { content: '\ec2b'; } +.icon-fontello-mic-3:before { content: '\ec2c'; } +.icon-fontello-volume-off-2:before { content: '\ec2d'; } +.icon-fontello-volume-up-1:before { content: '\ec2e'; } +.icon-fontello-headphones-2:before { content: '\ec2f'; } +.icon-fontello-clock-3:before { content: '\ec30'; } +.icon-fontello-lamp-1:before { content: '\ec31'; } +.icon-fontello-block-3:before { content: '\ec32'; } +.icon-fontello-resize-full-3:before { content: '\ec33'; } +.icon-fontello-resize-full-alt-1:before { content: '\ec34'; } +.icon-fontello-resize-small-2:before { content: '\ec35'; } +.icon-fontello-resize-small-alt:before { content: '\ec36'; } +.icon-fontello-resize-vertical-1:before { content: '\ec37'; } +.icon-fontello-resize-horizontal-1:before { content: '\ec38'; } +.icon-fontello-move-2:before { content: '\ec39'; } +.icon-fontello-popup-3:before { content: '\ec3a'; } +.icon-fontello-down-4:before { content: '\ec3b'; } +.icon-fontello-left-4:before { content: '\ec3c'; } +.icon-fontello-right-4:before { content: '\ec3d'; } +.icon-fontello-up-4:before { content: '\ec3e'; } +.icon-fontello-down-circle:before { content: '\ec3f'; } +.icon-fontello-left-circle:before { content: '\ec40'; } +.icon-fontello-right-circle:before { content: '\ec41'; } +.icon-fontello-up-circle:before { content: '\ec42'; } +.icon-fontello-cw-3:before { content: '\ec43'; } +.icon-fontello-loop-2:before { content: '\ec44'; } +.icon-fontello-loop-alt-1:before { content: '\ec45'; } +.icon-fontello-exchange-1:before { content: '\ec46'; } +.icon-fontello-split:before { content: '\ec47'; } +.icon-fontello-arrow-curved:before { content: '\ec48'; } +.icon-fontello-play-3:before { content: '\ec49'; } +.icon-fontello-play-circle2-1:before { content: '\ec4a'; } +.icon-fontello-stop-3:before { content: '\ec4b'; } +.icon-fontello-pause-3:before { content: '\ec4c'; } +.icon-fontello-to-start-2:before { content: '\ec4d'; } +.icon-fontello-to-end-2:before { content: '\ec4e'; } +.icon-fontello-eject-2:before { content: '\ec4f'; } +.icon-fontello-target-3:before { content: '\ec50'; } +.icon-fontello-signal-2:before { content: '\ec51'; } +.icon-fontello-award-1:before { content: '\ec52'; } +.icon-fontello-award-empty:before { content: '\ec53'; } +.icon-fontello-list-2:before { content: '\ec54'; } +.icon-fontello-list-nested:before { content: '\ec55'; } +.icon-fontello-bat-empty:before { content: '\ec56'; } +.icon-fontello-bat-half:before { content: '\ec57'; } +.icon-fontello-bat-full:before { content: '\ec58'; } +.icon-fontello-bat-charge-1:before { content: '\ec59'; } +.icon-fontello-mobile-3:before { content: '\ec5a'; } +.icon-fontello-cd-1:before { content: '\ec5b'; } +.icon-fontello-equalizer:before { content: '\ec5c'; } +.icon-fontello-cursor:before { content: '\ec5d'; } +.icon-fontello-aperture:before { content: '\ec5e'; } +.icon-fontello-aperture-alt:before { content: '\ec5f'; } +.icon-fontello-steering-wheel:before { content: '\ec60'; } +.icon-fontello-book-2:before { content: '\ec61'; } +.icon-fontello-book-alt:before { content: '\ec62'; } +.icon-fontello-brush-2:before { content: '\ec63'; } +.icon-fontello-brush-alt:before { content: '\ec64'; } +.icon-fontello-eyedropper:before { content: '\ec65'; } +.icon-fontello-layers:before { content: '\ec66'; } +.icon-fontello-layers-alt:before { content: '\ec67'; } +.icon-fontello-sun-2:before { content: '\ec68'; } +.icon-fontello-sun-inv:before { content: '\ec69'; } +.icon-fontello-cloud-3:before { content: '\ec6a'; } +.icon-fontello-rain-1:before { content: '\ec6b'; } +.icon-fontello-flash-3:before { content: '\ec6c'; } +.icon-fontello-moon-3:before { content: '\ec6d'; } +.icon-fontello-moon-inv:before { content: '\ec6e'; } +.icon-fontello-umbrella-1:before { content: '\ec6f'; } +.icon-fontello-chart-bar-3:before { content: '\ec70'; } +.icon-fontello-chart-pie-2:before { content: '\ec71'; } +.icon-fontello-chart-pie-alt:before { content: '\ec72'; } +.icon-fontello-key-3:before { content: '\ec73'; } +.icon-fontello-key-inv:before { content: '\ec74'; } +.icon-fontello-hash:before { content: '\ec75'; } +.icon-fontello-at-1:before { content: '\ec76'; } +.icon-fontello-pilcrow:before { content: '\ec77'; } +.icon-fontello-dial:before { content: '\ec78'; } +.icon-fontello-search-4:before { content: '\ec79'; } +.icon-fontello-mail-4:before { content: '\ec7a'; } +.icon-fontello-heart-4:before { content: '\ec7b'; } +.icon-fontello-star-4:before { content: '\ec7c'; } +.icon-fontello-user-4:before { content: '\ec7d'; } +.icon-fontello-user-woman:before { content: '\ec7e'; } +.icon-fontello-user-pair:before { content: '\ec7f'; } +.icon-fontello-video-alt:before { content: '\ec80'; } +.icon-fontello-videocam-2:before { content: '\ec81'; } +.icon-fontello-videocam-alt:before { content: '\ec82'; } +.icon-fontello-camera-4:before { content: '\ec83'; } +.icon-fontello-th-2:before { content: '\ec84'; } +.icon-fontello-th-list-2:before { content: '\ec85'; } +.icon-fontello-ok-3:before { content: '\ec86'; } +.icon-fontello-cancel-4:before { content: '\ec87'; } +.icon-fontello-cancel-circle-2:before { content: '\ec88'; } +.icon-fontello-plus-4:before { content: '\ec89'; } +.icon-fontello-home-4:before { content: '\ec8a'; } +.icon-fontello-lock-4:before { content: '\ec8b'; } +.icon-fontello-lock-open-4:before { content: '\ec8c'; } +.icon-fontello-eye-4:before { content: '\ec8d'; } +.icon-fontello-tag-4:before { content: '\ec8e'; } +.icon-fontello-thumbs-up-3:before { content: '\ec8f'; } +.icon-fontello-thumbs-down-3:before { content: '\ec90'; } +.icon-fontello-download-4:before { content: '\ec91'; } +.icon-fontello-export-3:before { content: '\ec92'; } +.icon-fontello-pencil-4:before { content: '\ec93'; } +.icon-fontello-pencil-alt-1:before { content: '\ec94'; } +.icon-fontello-edit-2:before { content: '\ec95'; } +.icon-fontello-chat-4:before { content: '\ec96'; } +.icon-fontello-print-3:before { content: '\ec97'; } +.icon-fontello-bell-3:before { content: '\ec98'; } +.icon-fontello-attention-3:before { content: '\ec99'; } +.icon-fontello-info-4:before { content: '\ec9a'; } +.icon-fontello-question:before { content: '\ec9b'; } +.icon-fontello-location-4:before { content: '\ec9c'; } +.icon-fontello-trash-4:before { content: '\ec9d'; } +.icon-fontello-doc-4:before { content: '\ec9e'; } +.icon-fontello-article-1:before { content: '\ec9f'; } +.icon-fontello-article-alt-1:before { content: '\eca0'; } +.icon-fontello-rss-4:before { content: '\eca1'; } +.icon-fontello-wrench-3:before { content: '\eca2'; } +.icon-fontello-basket-3:before { content: '\eca3'; } +.icon-fontello-basket-alt:before { content: '\eca4'; } +.icon-fontello-calendar-4:before { content: '\eca5'; } +.icon-fontello-calendar-alt-1:before { content: '\eca6'; } +.icon-fontello-volume-off-3:before { content: '\eca7'; } +.icon-fontello-volume-down-1:before { content: '\eca8'; } +.icon-fontello-volume-up-2:before { content: '\eca9'; } +.icon-fontello-bullhorn:before { content: '\ecaa'; } +.icon-fontello-clock-4:before { content: '\ecab'; } +.icon-fontello-clock-alt:before { content: '\ecac'; } +.icon-fontello-stop-4:before { content: '\ecad'; } +.icon-fontello-resize-full-4:before { content: '\ecae'; } +.icon-fontello-resize-small-3:before { content: '\ecaf'; } +.icon-fontello-zoom-in-2:before { content: '\ecb0'; } +.icon-fontello-zoom-out-2:before { content: '\ecb1'; } +.icon-fontello-popup-4:before { content: '\ecb2'; } +.icon-fontello-down-dir-2:before { content: '\ecb3'; } +.icon-fontello-left-dir-2:before { content: '\ecb4'; } +.icon-fontello-right-dir-2:before { content: '\ecb5'; } +.icon-fontello-up-dir-2:before { content: '\ecb6'; } +.icon-fontello-down-5:before { content: '\ecb7'; } +.icon-fontello-up-5:before { content: '\ecb8'; } +.icon-fontello-cw-4:before { content: '\ecb9'; } +.icon-fontello-signal-3:before { content: '\ecba'; } +.icon-fontello-award-2:before { content: '\ecbb'; } +.icon-fontello-mobile-4:before { content: '\ecbc'; } +.icon-fontello-mobile-alt:before { content: '\ecbd'; } +.icon-fontello-tablet-2:before { content: '\ecbe'; } +.icon-fontello-ipod:before { content: '\ecbf'; } +.icon-fontello-cd-2:before { content: '\ecc0'; } +.icon-fontello-grid:before { content: '\ecc1'; } +.icon-fontello-book-3:before { content: '\ecc2'; } +.icon-fontello-easel:before { content: '\ecc3'; } +.icon-fontello-globe-3:before { content: '\ecc4'; } +.icon-fontello-chart-1:before { content: '\ecc5'; } +.icon-fontello-chart-bar-4:before { content: '\ecc6'; } +.icon-fontello-chart-pie-3:before { content: '\ecc7'; } +.icon-fontello-dollar-1:before { content: '\ecc8'; } +.icon-fontello-at-2:before { content: '\ecc9'; } +.icon-fontello-colon:before { content: '\ecca'; } +.icon-fontello-semicolon:before { content: '\eccb'; } +.icon-fontello-squares:before { content: '\eccc'; } +.icon-fontello-money-1:before { content: '\eccd'; } +.icon-fontello-facebook-3:before { content: '\ecce'; } +.icon-fontello-facebook-rect:before { content: '\eccf'; } +.icon-fontello-twitter-3:before { content: '\ecd0'; } +.icon-fontello-twitter-bird:before { content: '\ecd1'; } +.icon-fontello-twitter-rect:before { content: '\ecd2'; } +.icon-fontello-youtube-1:before { content: '\ecd3'; } +.icon-fontello-windy-rain-inv:before { content: '\ecd4'; } +.icon-fontello-snow-inv:before { content: '\ecd5'; } +.icon-fontello-snow-heavy-inv:before { content: '\ecd6'; } +.icon-fontello-hail-inv:before { content: '\ecd7'; } +.icon-fontello-clouds-inv:before { content: '\ecd8'; } +.icon-fontello-clouds-flash-inv:before { content: '\ecd9'; } +.icon-fontello-temperature:before { content: '\ecda'; } +.icon-fontello-compass-4:before { content: '\ecdb'; } +.icon-fontello-na:before { content: '\ecdc'; } +.icon-fontello-celcius:before { content: '\ecdd'; } +.icon-fontello-fahrenheit:before { content: '\ecde'; } +.icon-fontello-clouds-flash-alt:before { content: '\ecdf'; } +.icon-fontello-sun-inv-1:before { content: '\ece0'; } +.icon-fontello-moon-inv-1:before { content: '\ece1'; } +.icon-fontello-cloud-sun-inv:before { content: '\ece2'; } +.icon-fontello-cloud-moon-inv:before { content: '\ece3'; } +.icon-fontello-cloud-inv:before { content: '\ece4'; } +.icon-fontello-cloud-flash-inv:before { content: '\ece5'; } +.icon-fontello-drizzle-inv:before { content: '\ece6'; } +.icon-fontello-rain-inv:before { content: '\ece7'; } +.icon-fontello-windy-inv:before { content: '\ece8'; } +.icon-fontello-sunrise:before { content: '\ece9'; } +.icon-fontello-sun-3:before { content: '\ecea'; } +.icon-fontello-moon-4:before { content: '\eceb'; } +.icon-fontello-eclipse:before { content: '\ecec'; } +.icon-fontello-mist:before { content: '\eced'; } +.icon-fontello-wind-1:before { content: '\ecee'; } +.icon-fontello-snowflake:before { content: '\ecef'; } +.icon-fontello-cloud-sun-1:before { content: '\ecf0'; } +.icon-fontello-cloud-moon:before { content: '\ecf1'; } +.icon-fontello-fog-sun:before { content: '\ecf2'; } +.icon-fontello-fog-moon:before { content: '\ecf3'; } +.icon-fontello-fog-cloud:before { content: '\ecf4'; } +.icon-fontello-fog:before { content: '\ecf5'; } +.icon-fontello-cloud-4:before { content: '\ecf6'; } +.icon-fontello-cloud-flash-1:before { content: '\ecf7'; } +.icon-fontello-cloud-flash-alt:before { content: '\ecf8'; } +.icon-fontello-drizzle-1:before { content: '\ecf9'; } +.icon-fontello-rain-2:before { content: '\ecfa'; } +.icon-fontello-windy:before { content: '\ecfb'; } +.icon-fontello-windy-rain:before { content: '\ecfc'; } +.icon-fontello-snow-1:before { content: '\ecfd'; } +.icon-fontello-snow-alt:before { content: '\ecfe'; } +.icon-fontello-snow-heavy:before { content: '\ecff'; } +.icon-fontello-hail:before { content: '\ed00'; } +.icon-fontello-clouds:before { content: '\ed01'; } +.icon-fontello-clouds-flash:before { content: '\ed02'; } +.icon-fontello-search-5:before { content: '\ed03'; } +.icon-fontello-mail-5:before { content: '\ed04'; } +.icon-fontello-heart-5:before { content: '\ed05'; } +.icon-fontello-heart-broken:before { content: '\ed06'; } +.icon-fontello-star-5:before { content: '\ed07'; } +.icon-fontello-star-empty-2:before { content: '\ed08'; } +.icon-fontello-star-half-1:before { content: '\ed09'; } +.icon-fontello-star-half_empty:before { content: '\ed0a'; } +.icon-fontello-user-5:before { content: '\ed0b'; } +.icon-fontello-user-male:before { content: '\ed0c'; } +.icon-fontello-user-female:before { content: '\ed0d'; } +.icon-fontello-users-3:before { content: '\ed0e'; } +.icon-fontello-movie:before { content: '\ed0f'; } +.icon-fontello-videocam-3:before { content: '\ed10'; } +.icon-fontello-isight:before { content: '\ed11'; } +.icon-fontello-camera-5:before { content: '\ed12'; } +.icon-fontello-menu-3:before { content: '\ed13'; } +.icon-fontello-th-thumb:before { content: '\ed14'; } +.icon-fontello-th-thumb-empty:before { content: '\ed15'; } +.icon-fontello-th-list-3:before { content: '\ed16'; } +.icon-fontello-ok-4:before { content: '\ed17'; } +.icon-fontello-ok-circled:before { content: '\ed18'; } +.icon-fontello-cancel-5:before { content: '\ed19'; } +.icon-fontello-cancel-circled-2:before { content: '\ed1a'; } +.icon-fontello-plus-5:before { content: '\ed1b'; } +.icon-fontello-help-circled-1:before { content: '\ed1c'; } +.icon-fontello-help-circled-alt:before { content: '\ed1d'; } +.icon-fontello-info-circled-1:before { content: '\ed1e'; } +.icon-fontello-info-circled-alt:before { content: '\ed1f'; } +.icon-fontello-home-5:before { content: '\ed20'; } +.icon-fontello-link-4:before { content: '\ed21'; } +.icon-fontello-attach-4:before { content: '\ed22'; } +.icon-fontello-lock-5:before { content: '\ed23'; } +.icon-fontello-lock-alt:before { content: '\ed24'; } +.icon-fontello-lock-open-5:before { content: '\ed25'; } +.icon-fontello-lock-open-alt-1:before { content: '\ed26'; } +.icon-fontello-eye-5:before { content: '\ed27'; } +.icon-fontello-download-5:before { content: '\ed28'; } +.icon-fontello-upload-4:before { content: '\ed29'; } +.icon-fontello-download-cloud-2:before { content: '\ed2a'; } +.icon-fontello-upload-cloud-4:before { content: '\ed2b'; } +.icon-fontello-reply-3:before { content: '\ed2c'; } +.icon-fontello-pencil-5:before { content: '\ed2d'; } +.icon-fontello-export-4:before { content: '\ed2e'; } +.icon-fontello-print-4:before { content: '\ed2f'; } +.icon-fontello-retweet-2:before { content: '\ed30'; } +.icon-fontello-comment-4:before { content: '\ed31'; } +.icon-fontello-chat-5:before { content: '\ed32'; } +.icon-fontello-bell-4:before { content: '\ed33'; } +.icon-fontello-attention-4:before { content: '\ed34'; } +.icon-fontello-attention-alt-1:before { content: '\ed35'; } +.icon-fontello-location-5:before { content: '\ed36'; } +.icon-fontello-trash-5:before { content: '\ed37'; } +.icon-fontello-doc-5:before { content: '\ed38'; } +.icon-fontello-newspaper-1:before { content: '\ed39'; } +.icon-fontello-folder-4:before { content: '\ed3a'; } +.icon-fontello-folder-open-1:before { content: '\ed3b'; } +.icon-fontello-folder-empty-2:before { content: '\ed3c'; } +.icon-fontello-folder-open-empty-1:before { content: '\ed3d'; } +.icon-fontello-cog-4:before { content: '\ed3e'; } +.icon-fontello-calendar-5:before { content: '\ed3f'; } +.icon-fontello-login-2:before { content: '\ed40'; } +.icon-fontello-logout-2:before { content: '\ed41'; } +.icon-fontello-mic-4:before { content: '\ed42'; } +.icon-fontello-mic-off:before { content: '\ed43'; } +.icon-fontello-clock-5:before { content: '\ed44'; } +.icon-fontello-stopwatch-1:before { content: '\ed45'; } +.icon-fontello-hourglass-1:before { content: '\ed46'; } +.icon-fontello-zoom-in-3:before { content: '\ed47'; } +.icon-fontello-zoom-out-3:before { content: '\ed48'; } +.icon-fontello-down-open-2:before { content: '\ed49'; } +.icon-fontello-left-open-3:before { content: '\ed4a'; } +.icon-fontello-right-open-3:before { content: '\ed4b'; } +.icon-fontello-up-open-2:before { content: '\ed4c'; } +.icon-fontello-down-6:before { content: '\ed4d'; } +.icon-fontello-left-5:before { content: '\ed4e'; } +.icon-fontello-right-5:before { content: '\ed4f'; } +.icon-fontello-up-6:before { content: '\ed50'; } +.icon-fontello-down-bold-1:before { content: '\ed51'; } +.icon-fontello-left-bold-1:before { content: '\ed52'; } +.icon-fontello-right-bold-1:before { content: '\ed53'; } +.icon-fontello-up-bold-1:before { content: '\ed54'; } +.icon-fontello-down-fat:before { content: '\ed55'; } +.icon-fontello-left-fat:before { content: '\ed56'; } +.icon-fontello-right-fat:before { content: '\ed57'; } +.icon-fontello-up-fat:before { content: '\ed58'; } +.icon-fontello-ccw-2:before { content: '\ed59'; } +.icon-fontello-shuffle-3:before { content: '\ed5a'; } +.icon-fontello-play-4:before { content: '\ed5b'; } +.icon-fontello-pause-4:before { content: '\ed5c'; } +.icon-fontello-stop-5:before { content: '\ed5d'; } +.icon-fontello-to-end-3:before { content: '\ed5e'; } +.icon-fontello-to-start-3:before { content: '\ed5f'; } +.icon-fontello-fast-forward-1:before { content: '\ed60'; } +.icon-fontello-fast-backward-1:before { content: '\ed61'; } +.icon-fontello-trophy-1:before { content: '\ed62'; } +.icon-fontello-monitor-1:before { content: '\ed63'; } +.icon-fontello-tablet-3:before { content: '\ed64'; } +.icon-fontello-mobile-5:before { content: '\ed65'; } +.icon-fontello-data-science:before { content: '\ed66'; } +.icon-fontello-data-science-inv:before { content: '\ed67'; } +.icon-fontello-inbox-2:before { content: '\ed68'; } +.icon-fontello-globe-4:before { content: '\ed69'; } +.icon-fontello-globe-inv:before { content: '\ed6a'; } +.icon-fontello-flash-4:before { content: '\ed6b'; } +.icon-fontello-cloud-5:before { content: '\ed6c'; } +.icon-fontello-coverflow:before { content: '\ed6d'; } +.icon-fontello-coverflow-empty:before { content: '\ed6e'; } +.icon-fontello-math:before { content: '\ed6f'; } +.icon-fontello-math-circled:before { content: '\ed70'; } +.icon-fontello-math-circled-empty:before { content: '\ed71'; } +.icon-fontello-paper-plane-1:before { content: '\ed72'; } +.icon-fontello-paper-plane-alt:before { content: '\ed73'; } +.icon-fontello-paper-plane-alt2:before { content: '\ed74'; } +.icon-fontello-fontsize:before { content: '\ed75'; } +.icon-fontello-color-adjust:before { content: '\ed76'; } +.icon-fontello-fire-1:before { content: '\ed77'; } +.icon-fontello-chart-bar-5:before { content: '\ed78'; } +.icon-fontello-hdd-1:before { content: '\ed79'; } +.icon-fontello-connected-object:before { content: '\ed7a'; } +.icon-fontello-ruler:before { content: '\ed7b'; } +.icon-fontello-vector:before { content: '\ed7c'; } +.icon-fontello-vector-pencil:before { content: '\ed7d'; } +.icon-fontello-at-3:before { content: '\ed7e'; } +.icon-fontello-hash-1:before { content: '\ed7f'; } +.icon-fontello-female-1:before { content: '\ed80'; } +.icon-fontello-male-1:before { content: '\ed81'; } +.icon-fontello-spread:before { content: '\ed82'; } +.icon-fontello-king:before { content: '\ed83'; } +.icon-fontello-anchor-2:before { content: '\ed84'; } +.icon-fontello-joystick:before { content: '\ed85'; } +.icon-fontello-spinner1:before { content: '\ed86'; } +.icon-fontello-spinner2:before { content: '\ed87'; } +.icon-fontello-github-3:before { content: '\ed88'; } +.icon-fontello-github-circled-3:before { content: '\ed89'; } +.icon-fontello-github-circled-alt:before { content: '\ed8a'; } +.icon-fontello-github-circled-alt2:before { content: '\ed8b'; } +.icon-fontello-twitter-4:before { content: '\ed8c'; } +.icon-fontello-twitter-circled-2:before { content: '\ed8d'; } +.icon-fontello-facebook-4:before { content: '\ed8e'; } +.icon-fontello-facebook-circled-2:before { content: '\ed8f'; } +.icon-fontello-gplus-2:before { content: '\ed90'; } +.icon-fontello-gplus-circled-1:before { content: '\ed91'; } +.icon-fontello-linkedin-3:before { content: '\ed92'; } +.icon-fontello-linkedin-circled-2:before { content: '\ed93'; } +.icon-fontello-dribbble-3:before { content: '\ed94'; } +.icon-fontello-dribbble-circled-2:before { content: '\ed95'; } +.icon-fontello-instagram-1:before { content: '\ed96'; } +.icon-fontello-instagram-circled:before { content: '\ed97'; } +.icon-fontello-soundcloud-1:before { content: '\ed98'; } +.icon-fontello-soundcloud-circled:before { content: '\ed99'; } +.icon-fontello-mfg-logo:before { content: '\ed9a'; } +.icon-fontello-mfg-logo-circled:before { content: '\ed9b'; } +.icon-fontello-aboveground-rail:before { content: '\ed9c'; } +.icon-fontello-airfield:before { content: '\ed9d'; } +.icon-fontello-airport:before { content: '\ed9e'; } +.icon-fontello-art-gallery:before { content: '\ed9f'; } +.icon-fontello-bar:before { content: '\eda0'; } +.icon-fontello-baseball:before { content: '\eda1'; } +.icon-fontello-basketball:before { content: '\eda2'; } +.icon-fontello-beer-2:before { content: '\eda3'; } +.icon-fontello-belowground-rail:before { content: '\eda4'; } +.icon-fontello-bicycle:before { content: '\eda5'; } +.icon-fontello-bus:before { content: '\eda6'; } +.icon-fontello-cafe:before { content: '\eda7'; } +.icon-fontello-campsite:before { content: '\eda8'; } +.icon-fontello-cemetery:before { content: '\eda9'; } +.icon-fontello-cinema:before { content: '\edaa'; } +.icon-fontello-college:before { content: '\edab'; } +.icon-fontello-commerical-building:before { content: '\edac'; } +.icon-fontello-credit-card-3:before { content: '\edad'; } +.icon-fontello-cricket:before { content: '\edae'; } +.icon-fontello-embassy:before { content: '\edaf'; } +.icon-fontello-fast-food:before { content: '\edb0'; } +.icon-fontello-ferry:before { content: '\edb1'; } +.icon-fontello-fire-station:before { content: '\edb2'; } +.icon-fontello-football:before { content: '\edb3'; } +.icon-fontello-fuel:before { content: '\edb4'; } +.icon-fontello-garden:before { content: '\edb5'; } +.icon-fontello-giraffe:before { content: '\edb6'; } +.icon-fontello-golf:before { content: '\edb7'; } +.icon-fontello-grocery-store:before { content: '\edb8'; } +.icon-fontello-harbor:before { content: '\edb9'; } +.icon-fontello-heliport:before { content: '\edba'; } +.icon-fontello-hospital-1:before { content: '\edbb'; } +.icon-fontello-industrial-building:before { content: '\edbc'; } +.icon-fontello-library:before { content: '\edbd'; } +.icon-fontello-lodging:before { content: '\edbe'; } +.icon-fontello-london-underground:before { content: '\edbf'; } +.icon-fontello-minefield:before { content: '\edc0'; } +.icon-fontello-monument:before { content: '\edc1'; } +.icon-fontello-museum:before { content: '\edc2'; } +.icon-fontello-pharmacy:before { content: '\edc3'; } +.icon-fontello-pitch:before { content: '\edc4'; } +.icon-fontello-police:before { content: '\edc5'; } +.icon-fontello-post:before { content: '\edc6'; } +.icon-fontello-prison:before { content: '\edc7'; } +.icon-fontello-rail:before { content: '\edc8'; } +.icon-fontello-religious-christian:before { content: '\edc9'; } +.icon-fontello-religious-islam:before { content: '\edca'; } +.icon-fontello-religious-jewish:before { content: '\edcb'; } +.icon-fontello-restaurant:before { content: '\edcc'; } +.icon-fontello-roadblock:before { content: '\edcd'; } +.icon-fontello-school:before { content: '\edce'; } +.icon-fontello-shop:before { content: '\edcf'; } +.icon-fontello-skiing:before { content: '\edd0'; } +.icon-fontello-soccer:before { content: '\edd1'; } +.icon-fontello-swimming:before { content: '\edd2'; } +.icon-fontello-tennis:before { content: '\edd3'; } +.icon-fontello-theatre:before { content: '\edd4'; } +.icon-fontello-toilet:before { content: '\edd5'; } +.icon-fontello-town-hall:before { content: '\edd6'; } +.icon-fontello-trash-6:before { content: '\edd7'; } +.icon-fontello-tree-1:before { content: '\edd8'; } +.icon-fontello-tree-2:before { content: '\edd9'; } +.icon-fontello-warehouse:before { content: '\edda'; } +.icon-fontello-duckduckgo:before { content: '\eddb'; } +.icon-fontello-aim:before { content: '\eddc'; } +.icon-fontello-delicious:before { content: '\eddd'; } +.icon-fontello-paypal-1:before { content: '\edde'; } +.icon-fontello-flattr-1:before { content: '\eddf'; } +.icon-fontello-android-1:before { content: '\ede0'; } +.icon-fontello-eventful:before { content: '\ede1'; } +.icon-fontello-smashmag:before { content: '\ede2'; } +.icon-fontello-gplus-3:before { content: '\ede3'; } +.icon-fontello-wikipedia:before { content: '\ede4'; } +.icon-fontello-lanyrd:before { content: '\ede5'; } +.icon-fontello-calendar-6:before { content: '\ede6'; } +.icon-fontello-stumbleupon-1:before { content: '\ede7'; } +.icon-fontello-fivehundredpx:before { content: '\ede8'; } +.icon-fontello-pinterest-2:before { content: '\ede9'; } +.icon-fontello-bitcoin-1:before { content: '\edea'; } +.icon-fontello-w3c:before { content: '\edeb'; } +.icon-fontello-foursquare-1:before { content: '\edec'; } +.icon-fontello-html5-1:before { content: '\eded'; } +.icon-fontello-ie-1:before { content: '\edee'; } +.icon-fontello-call:before { content: '\edef'; } +.icon-fontello-grooveshark:before { content: '\edf0'; } +.icon-fontello-ninetyninedesigns:before { content: '\edf1'; } +.icon-fontello-forrst:before { content: '\edf2'; } +.icon-fontello-digg:before { content: '\edf3'; } +.icon-fontello-spotify-1:before { content: '\edf4'; } +.icon-fontello-reddit:before { content: '\edf5'; } +.icon-fontello-guest:before { content: '\edf6'; } +.icon-fontello-gowalla:before { content: '\edf7'; } +.icon-fontello-appstore:before { content: '\edf8'; } +.icon-fontello-blogger:before { content: '\edf9'; } +.icon-fontello-cc-1:before { content: '\edfa'; } +.icon-fontello-dribbble-4:before { content: '\edfb'; } +.icon-fontello-evernote-1:before { content: '\edfc'; } +.icon-fontello-flickr-3:before { content: '\edfd'; } +.icon-fontello-google:before { content: '\edfe'; } +.icon-fontello-viadeo:before { content: '\edff'; } +.icon-fontello-instapaper:before { content: '\ee00'; } +.icon-fontello-weibo-1:before { content: '\ee01'; } +.icon-fontello-klout:before { content: '\ee02'; } +.icon-fontello-linkedin-4:before { content: '\ee03'; } +.icon-fontello-meetup:before { content: '\ee04'; } +.icon-fontello-vk:before { content: '\ee05'; } +.icon-fontello-plancast:before { content: '\ee06'; } +.icon-fontello-disqus:before { content: '\ee07'; } +.icon-fontello-rss-5:before { content: '\ee08'; } +.icon-fontello-skype-3:before { content: '\ee09'; } +.icon-fontello-twitter-5:before { content: '\ee0a'; } +.icon-fontello-youtube-2:before { content: '\ee0b'; } +.icon-fontello-vimeo-2:before { content: '\ee0c'; } +.icon-fontello-windows-1:before { content: '\ee0d'; } +.icon-fontello-xing-1:before { content: '\ee0e'; } +.icon-fontello-yahoo:before { content: '\ee0f'; } +.icon-fontello-chrome-1:before { content: '\ee10'; } +.icon-fontello-email:before { content: '\ee11'; } +.icon-fontello-macstore:before { content: '\ee12'; } +.icon-fontello-myspace:before { content: '\ee13'; } +.icon-fontello-podcast:before { content: '\ee14'; } +.icon-fontello-amazon:before { content: '\ee15'; } +.icon-fontello-steam:before { content: '\ee16'; } +.icon-fontello-cloudapp:before { content: '\ee17'; } +.icon-fontello-dropbox-2:before { content: '\ee18'; } +.icon-fontello-ebay:before { content: '\ee19'; } +.icon-fontello-facebook-5:before { content: '\ee1a'; } +.icon-fontello-github-4:before { content: '\ee1b'; } +.icon-fontello-github-circled-4:before { content: '\ee1c'; } +.icon-fontello-googleplay:before { content: '\ee1d'; } +.icon-fontello-itunes:before { content: '\ee1e'; } +.icon-fontello-plurk:before { content: '\ee1f'; } +.icon-fontello-songkick:before { content: '\ee20'; } +.icon-fontello-lastfm-2:before { content: '\ee21'; } +.icon-fontello-gmail:before { content: '\ee22'; } +.icon-fontello-pinboard:before { content: '\ee23'; } +.icon-fontello-openid:before { content: '\ee24'; } +.icon-fontello-quora:before { content: '\ee25'; } +.icon-fontello-soundcloud-2:before { content: '\ee26'; } +.icon-fontello-tumblr-2:before { content: '\ee27'; } +.icon-fontello-eventasaurus:before { content: '\ee28'; } +.icon-fontello-wordpress:before { content: '\ee29'; } +.icon-fontello-yelp:before { content: '\ee2a'; } +.icon-fontello-intensedebate:before { content: '\ee2b'; } +.icon-fontello-eventbrite:before { content: '\ee2c'; } +.icon-fontello-scribd:before { content: '\ee2d'; } +.icon-fontello-posterous:before { content: '\ee2e'; } +.icon-fontello-stripe:before { content: '\ee2f'; } +.icon-fontello-opentable:before { content: '\ee30'; } +.icon-fontello-cart:before { content: '\ee31'; } +.icon-fontello-print-5:before { content: '\ee32'; } +.icon-fontello-angellist:before { content: '\ee33'; } +.icon-fontello-instagram-2:before { content: '\ee34'; } +.icon-fontello-dwolla:before { content: '\ee35'; } +.icon-fontello-appnet:before { content: '\ee36'; } +.icon-fontello-statusnet:before { content: '\ee37'; } +.icon-fontello-acrobat:before { content: '\ee38'; } +.icon-fontello-drupal:before { content: '\ee39'; } +.icon-fontello-buffer:before { content: '\ee3a'; } +.icon-fontello-pocket:before { content: '\ee3b'; } +.icon-fontello-bitbucket-1:before { content: '\ee3c'; } +.icon-fontello-lego:before { content: '\ee3d'; } +.icon-fontello-login-3:before { content: '\ee3e'; } +.icon-fontello-stackoverflow-1:before { content: '\ee3f'; } +.icon-fontello-hackernews:before { content: '\ee40'; } +.icon-fontello-lkdto:before { content: '\ee41'; } +.icon-fontello-facebook-6:before { content: '\ee42'; } +.icon-fontello-facebook-rect-1:before { content: '\ee43'; } +.icon-fontello-twitter-6:before { content: '\ee44'; } +.icon-fontello-twitter-bird-1:before { content: '\ee45'; } +.icon-fontello-vimeo-3:before { content: '\ee46'; } +.icon-fontello-vimeo-rect:before { content: '\ee47'; } +.icon-fontello-tumblr-3:before { content: '\ee48'; } +.icon-fontello-tumblr-rect:before { content: '\ee49'; } +.icon-fontello-googleplus-rect:before { content: '\ee4a'; } +.icon-fontello-github-text:before { content: '\ee4b'; } +.icon-fontello-github-5:before { content: '\ee4c'; } +.icon-fontello-skype-4:before { content: '\ee4d'; } +.icon-fontello-icq:before { content: '\ee4e'; } +.icon-fontello-yandex:before { content: '\ee4f'; } +.icon-fontello-yandex-rect:before { content: '\ee50'; } +.icon-fontello-vkontakte-rect:before { content: '\ee51'; } +.icon-fontello-odnoklassniki:before { content: '\ee52'; } +.icon-fontello-odnoklassniki-rect:before { content: '\ee53'; } +.icon-fontello-friendfeed:before { content: '\ee54'; } +.icon-fontello-friendfeed-rect:before { content: '\ee55'; } +.icon-fontello-blogger-1:before { content: '\ee56'; } +.icon-fontello-blogger-rect:before { content: '\ee57'; } +.icon-fontello-deviantart:before { content: '\ee58'; } +.icon-fontello-jabber:before { content: '\ee59'; } +.icon-fontello-lastfm-3:before { content: '\ee5a'; } +.icon-fontello-lastfm-rect:before { content: '\ee5b'; } +.icon-fontello-linkedin-5:before { content: '\ee5c'; } +.icon-fontello-linkedin-rect:before { content: '\ee5d'; } +.icon-fontello-picasa-1:before { content: '\ee5e'; } +.icon-fontello-wordpress-1:before { content: '\ee5f'; } +.icon-fontello-instagram-3:before { content: '\ee60'; } +.icon-fontello-instagram-filled:before { content: '\ee61'; } +.icon-fontello-diigo:before { content: '\ee62'; } +.icon-fontello-box-4:before { content: '\ee63'; } +.icon-fontello-box-rect:before { content: '\ee64'; } +.icon-fontello-tudou:before { content: '\ee65'; } +.icon-fontello-youku:before { content: '\ee66'; } +.icon-fontello-win8:before { content: '\ee67'; } +.icon-fontello-amex:before { content: '\ee68'; } +.icon-fontello-discover:before { content: '\ee69'; } +.icon-fontello-visa:before { content: '\ee6a'; } +.icon-fontello-mastercard:before { content: '\ee6b'; } +.icon-fontello-glass-1:before { content: '\ee6c'; } +.icon-fontello-music-3:before { content: '\ee6d'; } +.icon-fontello-search-6:before { content: '\ee6e'; } +.icon-fontello-search-circled:before { content: '\ee6f'; } +.icon-fontello-mail-6:before { content: '\ee70'; } +.icon-fontello-mail-circled:before { content: '\ee71'; } +.icon-fontello-heart-6:before { content: '\ee72'; } +.icon-fontello-heart-circled:before { content: '\ee73'; } +.icon-fontello-heart-empty-3:before { content: '\ee74'; } +.icon-fontello-star-6:before { content: '\ee75'; } +.icon-fontello-star-circled:before { content: '\ee76'; } +.icon-fontello-star-empty-3:before { content: '\ee77'; } +.icon-fontello-user-6:before { content: '\ee78'; } +.icon-fontello-group:before { content: '\ee79'; } +.icon-fontello-group-circled:before { content: '\ee7a'; } +.icon-fontello-torso:before { content: '\ee7b'; } +.icon-fontello-video-4:before { content: '\ee7c'; } +.icon-fontello-video-circled:before { content: '\ee7d'; } +.icon-fontello-video-alt-1:before { content: '\ee7e'; } +.icon-fontello-videocam-4:before { content: '\ee7f'; } +.icon-fontello-video-chat:before { content: '\ee80'; } +.icon-fontello-picture-4:before { content: '\ee81'; } +.icon-fontello-camera-6:before { content: '\ee82'; } +.icon-fontello-photo:before { content: '\ee83'; } +.icon-fontello-photo-circled:before { content: '\ee84'; } +.icon-fontello-th-large-2:before { content: '\ee85'; } +.icon-fontello-th-3:before { content: '\ee86'; } +.icon-fontello-th-list-4:before { content: '\ee87'; } +.icon-fontello-view-mode:before { content: '\ee88'; } +.icon-fontello-ok-5:before { content: '\ee89'; } +.icon-fontello-ok-circled-1:before { content: '\ee8a'; } +.icon-fontello-ok-circled2:before { content: '\ee8b'; } +.icon-fontello-cancel-6:before { content: '\ee8c'; } +.icon-fontello-cancel-circled-3:before { content: '\ee8d'; } +.icon-fontello-cancel-circled2:before { content: '\ee8e'; } +.icon-fontello-plus-6:before { content: '\ee8f'; } +.icon-fontello-plus-circled-1:before { content: '\ee90'; } +.icon-fontello-minus-4:before { content: '\ee91'; } +.icon-fontello-minus-circled-1:before { content: '\ee92'; } +.icon-fontello-help-3:before { content: '\ee93'; } +.icon-fontello-help-circled-2:before { content: '\ee94'; } +.icon-fontello-info-circled-2:before { content: '\ee95'; } +.icon-fontello-home-6:before { content: '\ee96'; } +.icon-fontello-home-circled:before { content: '\ee97'; } +.icon-fontello-website:before { content: '\ee98'; } +.icon-fontello-website-circled:before { content: '\ee99'; } +.icon-fontello-attach-5:before { content: '\ee9a'; } +.icon-fontello-attach-circled:before { content: '\ee9b'; } +.icon-fontello-lock-6:before { content: '\ee9c'; } +.icon-fontello-lock-circled:before { content: '\ee9d'; } +.icon-fontello-lock-open-6:before { content: '\ee9e'; } +.icon-fontello-lock-open-alt-2:before { content: '\ee9f'; } +.icon-fontello-eye-6:before { content: '\eea0'; } +.icon-fontello-eye-off-1:before { content: '\eea1'; } +.icon-fontello-tag-5:before { content: '\eea2'; } +.icon-fontello-tags-2:before { content: '\eea3'; } +.icon-fontello-bookmark-3:before { content: '\eea4'; } +.icon-fontello-bookmark-empty-1:before { content: '\eea5'; } +.icon-fontello-flag-3:before { content: '\eea6'; } +.icon-fontello-flag-circled:before { content: '\eea7'; } +.icon-fontello-thumbs-up-4:before { content: '\eea8'; } +.icon-fontello-thumbs-down-4:before { content: '\eea9'; } +.icon-fontello-download-6:before { content: '\eeaa'; } +.icon-fontello-download-alt:before { content: '\eeab'; } +.icon-fontello-upload-5:before { content: '\eeac'; } +.icon-fontello-share-2:before { content: '\eead'; } +.icon-fontello-quote-1:before { content: '\eeae'; } +.icon-fontello-quote-circled:before { content: '\eeaf'; } +.icon-fontello-export-5:before { content: '\eeb0'; } +.icon-fontello-pencil-6:before { content: '\eeb1'; } +.icon-fontello-pencil-circled:before { content: '\eeb2'; } +.icon-fontello-edit-3:before { content: '\eeb3'; } +.icon-fontello-edit-circled:before { content: '\eeb4'; } +.icon-fontello-edit-alt:before { content: '\eeb5'; } +.icon-fontello-print-6:before { content: '\eeb6'; } +.icon-fontello-retweet-3:before { content: '\eeb7'; } +.icon-fontello-comment-5:before { content: '\eeb8'; } +.icon-fontello-comment-alt-1:before { content: '\eeb9'; } +.icon-fontello-bell-5:before { content: '\eeba'; } +.icon-fontello-warning-1:before { content: '\eebb'; } +.icon-fontello-exclamation:before { content: '\eebc'; } +.icon-fontello-error:before { content: '\eebd'; } +.icon-fontello-error-alt:before { content: '\eebe'; } +.icon-fontello-location-6:before { content: '\eebf'; } +.icon-fontello-location-circled:before { content: '\eec0'; } +.icon-fontello-compass-5:before { content: '\eec1'; } +.icon-fontello-compass-circled:before { content: '\eec2'; } +.icon-fontello-trash-7:before { content: '\eec3'; } +.icon-fontello-trash-circled:before { content: '\eec4'; } +.icon-fontello-doc-6:before { content: '\eec5'; } +.icon-fontello-doc-circled:before { content: '\eec6'; } +.icon-fontello-doc-new:before { content: '\eec7'; } +.icon-fontello-doc-new-circled:before { content: '\eec8'; } +.icon-fontello-folder-5:before { content: '\eec9'; } +.icon-fontello-folder-circled:before { content: '\eeca'; } +.icon-fontello-folder-close:before { content: '\eecb'; } +.icon-fontello-folder-open-2:before { content: '\eecc'; } +.icon-fontello-rss-6:before { content: '\eecd'; } +.icon-fontello-phone-3:before { content: '\eece'; } +.icon-fontello-phone-circled:before { content: '\eecf'; } +.icon-fontello-cog-5:before { content: '\eed0'; } +.icon-fontello-cog-circled:before { content: '\eed1'; } +.icon-fontello-cogs:before { content: '\eed2'; } +.icon-fontello-wrench-4:before { content: '\eed3'; } +.icon-fontello-wrench-circled:before { content: '\eed4'; } +.icon-fontello-basket-4:before { content: '\eed5'; } +.icon-fontello-basket-circled:before { content: '\eed6'; } +.icon-fontello-calendar-7:before { content: '\eed7'; } +.icon-fontello-calendar-circled:before { content: '\eed8'; } +.icon-fontello-mic-5:before { content: '\eed9'; } +.icon-fontello-mic-circled:before { content: '\eeda'; } +.icon-fontello-volume-off-4:before { content: '\eedb'; } +.icon-fontello-volume-down-2:before { content: '\eedc'; } +.icon-fontello-volume-1:before { content: '\eedd'; } +.icon-fontello-volume-up-3:before { content: '\eede'; } +.icon-fontello-headphones-3:before { content: '\eedf'; } +.icon-fontello-clock-6:before { content: '\eee0'; } +.icon-fontello-clock-circled:before { content: '\eee1'; } +.icon-fontello-lightbulb-2:before { content: '\eee2'; } +.icon-fontello-lightbulb-alt:before { content: '\eee3'; } +.icon-fontello-block-4:before { content: '\eee4'; } +.icon-fontello-resize-full-5:before { content: '\eee5'; } +.icon-fontello-resize-full-alt-2:before { content: '\eee6'; } +.icon-fontello-resize-small-4:before { content: '\eee7'; } +.icon-fontello-resize-vertical-2:before { content: '\eee8'; } +.icon-fontello-resize-horizontal-2:before { content: '\eee9'; } +.icon-fontello-move-3:before { content: '\eeea'; } +.icon-fontello-zoom-in-4:before { content: '\eeeb'; } +.icon-fontello-zoom-out-4:before { content: '\eeec'; } +.icon-fontello-down-open-3:before { content: '\eeed'; } +.icon-fontello-left-open-4:before { content: '\eeee'; } +.icon-fontello-right-open-4:before { content: '\eeef'; } +.icon-fontello-up-open-3:before { content: '\eef0'; } +.icon-fontello-down-7:before { content: '\eef1'; } +.icon-fontello-left-6:before { content: '\eef2'; } +.icon-fontello-right-6:before { content: '\eef3'; } +.icon-fontello-up-7:before { content: '\eef4'; } +.icon-fontello-down-circled-2:before { content: '\eef5'; } +.icon-fontello-left-circled-2:before { content: '\eef6'; } +.icon-fontello-right-circled-2:before { content: '\eef7'; } +.icon-fontello-up-circled-2:before { content: '\eef8'; } +.icon-fontello-down-hand-1:before { content: '\eef9'; } +.icon-fontello-left-hand-1:before { content: '\eefa'; } +.icon-fontello-right-hand-1:before { content: '\eefb'; } +.icon-fontello-up-hand-1:before { content: '\eefc'; } +.icon-fontello-cw-5:before { content: '\eefd'; } +.icon-fontello-cw-circled:before { content: '\eefe'; } +.icon-fontello-arrows-cw-2:before { content: '\eeff'; } +.icon-fontello-shuffle-4:before { content: '\ef00'; } +.icon-fontello-play-5:before { content: '\ef01'; } +.icon-fontello-play-circled-1:before { content: '\ef02'; } +.icon-fontello-play-circled2:before { content: '\ef03'; } +.icon-fontello-stop-6:before { content: '\ef04'; } +.icon-fontello-stop-circled:before { content: '\ef05'; } +.icon-fontello-pause-5:before { content: '\ef06'; } +.icon-fontello-pause-circled:before { content: '\ef07'; } +.icon-fontello-record-2:before { content: '\ef08'; } +.icon-fontello-eject-3:before { content: '\ef09'; } +.icon-fontello-backward:before { content: '\ef0a'; } +.icon-fontello-backward-circled:before { content: '\ef0b'; } +.icon-fontello-fast-backward-2:before { content: '\ef0c'; } +.icon-fontello-fast-forward-2:before { content: '\ef0d'; } +.icon-fontello-forward-3:before { content: '\ef0e'; } +.icon-fontello-forward-circled:before { content: '\ef0f'; } +.icon-fontello-step-backward:before { content: '\ef10'; } +.icon-fontello-step-forward:before { content: '\ef11'; } +.icon-fontello-target-4:before { content: '\ef12'; } +.icon-fontello-signal-4:before { content: '\ef13'; } +.icon-fontello-desktop-2:before { content: '\ef14'; } +.icon-fontello-desktop-circled:before { content: '\ef15'; } +.icon-fontello-laptop-2:before { content: '\ef16'; } +.icon-fontello-laptop-circled:before { content: '\ef17'; } +.icon-fontello-network-1:before { content: '\ef18'; } +.icon-fontello-inbox-3:before { content: '\ef19'; } +.icon-fontello-inbox-circled:before { content: '\ef1a'; } +.icon-fontello-inbox-alt:before { content: '\ef1b'; } +.icon-fontello-globe-5:before { content: '\ef1c'; } +.icon-fontello-globe-alt-1:before { content: '\ef1d'; } +.icon-fontello-cloud-6:before { content: '\ef1e'; } +.icon-fontello-cloud-circled:before { content: '\ef1f'; } +.icon-fontello-flight-2:before { content: '\ef20'; } +.icon-fontello-leaf-3:before { content: '\ef21'; } +.icon-fontello-font-1:before { content: '\ef22'; } +.icon-fontello-fontsize-1:before { content: '\ef23'; } +.icon-fontello-bold-1:before { content: '\ef24'; } +.icon-fontello-italic-1:before { content: '\ef25'; } +.icon-fontello-text-height-1:before { content: '\ef26'; } +.icon-fontello-text-width-1:before { content: '\ef27'; } +.icon-fontello-align-left-1:before { content: '\ef28'; } +.icon-fontello-align-center-1:before { content: '\ef29'; } +.icon-fontello-align-right-1:before { content: '\ef2a'; } +.icon-fontello-align-justify-1:before { content: '\ef2b'; } +.icon-fontello-list-3:before { content: '\ef2c'; } +.icon-fontello-indent-left-1:before { content: '\ef2d'; } +.icon-fontello-indent-right-1:before { content: '\ef2e'; } +.icon-fontello-briefcase-3:before { content: '\ef2f'; } +.icon-fontello-off-1:before { content: '\ef30'; } +.icon-fontello-road-1:before { content: '\ef31'; } +.icon-fontello-qrcode-1:before { content: '\ef32'; } +.icon-fontello-barcode-1:before { content: '\ef33'; } +.icon-fontello-braille:before { content: '\ef34'; } +.icon-fontello-book-4:before { content: '\ef35'; } +.icon-fontello-adjust-1:before { content: '\ef36'; } +.icon-fontello-tint-1:before { content: '\ef37'; } +.icon-fontello-check-3:before { content: '\ef38'; } +.icon-fontello-check-empty-1:before { content: '\ef39'; } +.icon-fontello-asterisk-1:before { content: '\ef3a'; } +.icon-fontello-gift-2:before { content: '\ef3b'; } +.icon-fontello-fire-2:before { content: '\ef3c'; } +.icon-fontello-magnet-2:before { content: '\ef3d'; } +.icon-fontello-chart-2:before { content: '\ef3e'; } +.icon-fontello-chart-circled:before { content: '\ef3f'; } +.icon-fontello-credit-card-4:before { content: '\ef40'; } +.icon-fontello-megaphone-2:before { content: '\ef41'; } +.icon-fontello-clipboard-2:before { content: '\ef42'; } +.icon-fontello-hdd-2:before { content: '\ef43'; } +.icon-fontello-key-4:before { content: '\ef44'; } +.icon-fontello-certificate-2:before { content: '\ef45'; } +.icon-fontello-tasks-1:before { content: '\ef46'; } +.icon-fontello-filter-1:before { content: '\ef47'; } +.icon-fontello-gauge-2:before { content: '\ef48'; } +.icon-fontello-smiley:before { content: '\ef49'; } +.icon-fontello-smiley-circled:before { content: '\ef4a'; } +.icon-fontello-address-book:before { content: '\ef4b'; } +.icon-fontello-address-book-alt:before { content: '\ef4c'; } +.icon-fontello-asl:before { content: '\ef4d'; } +.icon-fontello-glasses:before { content: '\ef4e'; } +.icon-fontello-hearing-impaired:before { content: '\ef4f'; } +.icon-fontello-iphone-home:before { content: '\ef50'; } +.icon-fontello-person:before { content: '\ef51'; } +.icon-fontello-adult:before { content: '\ef52'; } +.icon-fontello-child:before { content: '\ef53'; } +.icon-fontello-blind:before { content: '\ef54'; } +.icon-fontello-guidedog:before { content: '\ef55'; } +.icon-fontello-accessibility:before { content: '\ef56'; } +.icon-fontello-universal-access:before { content: '\ef57'; } +.icon-fontello-male-2:before { content: '\ef58'; } +.icon-fontello-female-2:before { content: '\ef59'; } +.icon-fontello-behance-1:before { content: '\ef5a'; } +.icon-fontello-blogger-2:before { content: '\ef5b'; } +.icon-fontello-cc-2:before { content: '\ef5c'; } +.icon-fontello-css:before { content: '\ef5d'; } +.icon-fontello-delicious-1:before { content: '\ef5e'; } +.icon-fontello-deviantart-1:before { content: '\ef5f'; } +.icon-fontello-digg-1:before { content: '\ef60'; } +.icon-fontello-dribbble-5:before { content: '\ef61'; } +.icon-fontello-facebook-7:before { content: '\ef62'; } +.icon-fontello-flickr-4:before { content: '\ef63'; } +.icon-fontello-foursquare-2:before { content: '\ef64'; } +.icon-fontello-friendfeed-1:before { content: '\ef65'; } +.icon-fontello-friendfeed-rect-1:before { content: '\ef66'; } +.icon-fontello-github-6:before { content: '\ef67'; } +.icon-fontello-github-text-1:before { content: '\ef68'; } +.icon-fontello-googleplus:before { content: '\ef69'; } +.icon-fontello-instagram-4:before { content: '\ef6a'; } +.icon-fontello-linkedin-6:before { content: '\ef6b'; } +.icon-fontello-path:before { content: '\ef6c'; } +.icon-fontello-picasa-2:before { content: '\ef6d'; } +.icon-fontello-pinterest-3:before { content: '\ef6e'; } +.icon-fontello-reddit-1:before { content: '\ef6f'; } +.icon-fontello-skype-5:before { content: '\ef70'; } +.icon-fontello-slideshare:before { content: '\ef71'; } +.icon-fontello-stackoverflow-2:before { content: '\ef72'; } +.icon-fontello-stumbleupon-2:before { content: '\ef73'; } +.icon-fontello-twitter-7:before { content: '\ef74'; } +.icon-fontello-tumblr-4:before { content: '\ef75'; } +.icon-fontello-vimeo-4:before { content: '\ef76'; } +.icon-fontello-vkontakte-2:before { content: '\ef77'; } +.icon-fontello-w3c-1:before { content: '\ef78'; } +.icon-fontello-wordpress-2:before { content: '\ef79'; } +.icon-fontello-youtube-3:before { content: '\ef7a'; } +.icon-fontello-music-4:before { content: '\ef7b'; } +.icon-fontello-search-7:before { content: '\ef7c'; } +.icon-fontello-mail-7:before { content: '\ef7d'; } +.icon-fontello-heart-7:before { content: '\ef7e'; } +.icon-fontello-star-7:before { content: '\ef7f'; } +.icon-fontello-user-7:before { content: '\ef80'; } +.icon-fontello-videocam-5:before { content: '\ef81'; } +.icon-fontello-camera-7:before { content: '\ef82'; } +.icon-fontello-photo-1:before { content: '\ef83'; } +.icon-fontello-attach-6:before { content: '\ef84'; } +.icon-fontello-lock-7:before { content: '\ef85'; } +.icon-fontello-eye-7:before { content: '\ef86'; } +.icon-fontello-tag-6:before { content: '\ef87'; } +.icon-fontello-thumbs-up-5:before { content: '\ef88'; } +.icon-fontello-pencil-7:before { content: '\ef89'; } +.icon-fontello-comment-6:before { content: '\ef8a'; } +.icon-fontello-location-7:before { content: '\ef8b'; } +.icon-fontello-cup-1:before { content: '\ef8c'; } +.icon-fontello-trash-8:before { content: '\ef8d'; } +.icon-fontello-doc-7:before { content: '\ef8e'; } +.icon-fontello-note-1:before { content: '\ef8f'; } +.icon-fontello-cog-6:before { content: '\ef90'; } +.icon-fontello-params:before { content: '\ef91'; } +.icon-fontello-calendar-8:before { content: '\ef92'; } +.icon-fontello-sound-1:before { content: '\ef93'; } +.icon-fontello-clock-7:before { content: '\ef94'; } +.icon-fontello-lightbulb-3:before { content: '\ef95'; } +.icon-fontello-tv:before { content: '\ef96'; } +.icon-fontello-desktop-3:before { content: '\ef97'; } +.icon-fontello-mobile-6:before { content: '\ef98'; } +.icon-fontello-cd-3:before { content: '\ef99'; } +.icon-fontello-inbox-4:before { content: '\ef9a'; } +.icon-fontello-globe-6:before { content: '\ef9b'; } +.icon-fontello-cloud-7:before { content: '\ef9c'; } +.icon-fontello-paper-plane-2:before { content: '\ef9d'; } +.icon-fontello-fire-3:before { content: '\ef9e'; } +.icon-fontello-graduation-cap-1:before { content: '\ef9f'; } +.icon-fontello-megaphone-3:before { content: '\efa0'; } +.icon-fontello-database-2:before { content: '\efa1'; } +.icon-fontello-key-5:before { content: '\efa2'; } +.icon-fontello-beaker-1:before { content: '\efa3'; } +.icon-fontello-truck-1:before { content: '\efa4'; } +.icon-fontello-money-2:before { content: '\efa5'; } +.icon-fontello-food-1:before { content: '\efa6'; } +.icon-fontello-shop-1:before { content: '\efa7'; } +.icon-fontello-diamond:before { content: '\efa8'; } +.icon-fontello-t-shirt:before { content: '\efa9'; } +.icon-fontello-wallet:before { content: '\efaa'; } +.icon-fontello-search-8:before { content: '\efab'; } +.icon-fontello-mail-8:before { content: '\efac'; } +.icon-fontello-heart-8:before { content: '\efad'; } +.icon-fontello-heart-empty-4:before { content: '\efae'; } +.icon-fontello-star-8:before { content: '\efaf'; } +.icon-fontello-user-8:before { content: '\efb0'; } +.icon-fontello-video-5:before { content: '\efb1'; } +.icon-fontello-picture-5:before { content: '\efb2'; } +.icon-fontello-th-large-3:before { content: '\efb3'; } +.icon-fontello-th-4:before { content: '\efb4'; } +.icon-fontello-th-list-5:before { content: '\efb5'; } +.icon-fontello-ok-6:before { content: '\efb6'; } +.icon-fontello-ok-circle-2:before { content: '\efb7'; } +.icon-fontello-cancel-7:before { content: '\efb8'; } +.icon-fontello-cancel-circle-3:before { content: '\efb9'; } +.icon-fontello-plus-circle-2:before { content: '\efba'; } +.icon-fontello-minus-circle-2:before { content: '\efbb'; } +.icon-fontello-link-5:before { content: '\efbc'; } +.icon-fontello-attach-7:before { content: '\efbd'; } +.icon-fontello-lock-8:before { content: '\efbe'; } +.icon-fontello-lock-open-7:before { content: '\efbf'; } +.icon-fontello-tag-7:before { content: '\efc0'; } +.icon-fontello-reply-4:before { content: '\efc1'; } +.icon-fontello-reply-all-2:before { content: '\efc2'; } +.icon-fontello-forward-4:before { content: '\efc3'; } +.icon-fontello-code-3:before { content: '\efc4'; } +.icon-fontello-retweet-4:before { content: '\efc5'; } +.icon-fontello-comment-7:before { content: '\efc6'; } +.icon-fontello-comment-alt-2:before { content: '\efc7'; } +.icon-fontello-chat-6:before { content: '\efc8'; } +.icon-fontello-attention-5:before { content: '\efc9'; } +.icon-fontello-location-8:before { content: '\efca'; } +.icon-fontello-doc-8:before { content: '\efcb'; } +.icon-fontello-docs-landscape:before { content: '\efcc'; } +.icon-fontello-folder-6:before { content: '\efcd'; } +.icon-fontello-archive-2:before { content: '\efce'; } +.icon-fontello-rss-7:before { content: '\efcf'; } +.icon-fontello-rss-alt-1:before { content: '\efd0'; } +.icon-fontello-cog-7:before { content: '\efd1'; } +.icon-fontello-logout-3:before { content: '\efd2'; } +.icon-fontello-clock-8:before { content: '\efd3'; } +.icon-fontello-block-5:before { content: '\efd4'; } +.icon-fontello-resize-full-6:before { content: '\efd5'; } +.icon-fontello-resize-full-circle:before { content: '\efd6'; } +.icon-fontello-popup-5:before { content: '\efd7'; } +.icon-fontello-left-open-5:before { content: '\efd8'; } +.icon-fontello-right-open-5:before { content: '\efd9'; } +.icon-fontello-down-circle-1:before { content: '\efda'; } +.icon-fontello-left-circle-1:before { content: '\efdb'; } +.icon-fontello-right-circle-1:before { content: '\efdc'; } +.icon-fontello-up-circle-1:before { content: '\efdd'; } +.icon-fontello-down-dir-3:before { content: '\efde'; } +.icon-fontello-right-dir-3:before { content: '\efdf'; } +.icon-fontello-down-micro:before { content: '\efe0'; } +.icon-fontello-up-micro:before { content: '\efe1'; } +.icon-fontello-cw-circle:before { content: '\efe2'; } +.icon-fontello-arrows-cw-3:before { content: '\efe3'; } +.icon-fontello-updown-circle:before { content: '\efe4'; } +.icon-fontello-target-5:before { content: '\efe5'; } +.icon-fontello-signal-5:before { content: '\efe6'; } +.icon-fontello-progress-4:before { content: '\efe7'; } +.icon-fontello-progress-5:before { content: '\efe8'; } +.icon-fontello-progress-6:before { content: '\efe9'; } +.icon-fontello-progress-7:before { content: '\efea'; } +.icon-fontello-progress-8:before { content: '\efeb'; } +.icon-fontello-progress-9:before { content: '\efec'; } +.icon-fontello-progress-10:before { content: '\efed'; } +.icon-fontello-progress-11:before { content: '\efee'; } +.icon-fontello-font-2:before { content: '\efef'; } +.icon-fontello-list-4:before { content: '\eff0'; } +.icon-fontello-list-numbered-1:before { content: '\eff1'; } +.icon-fontello-indent-left-2:before { content: '\eff2'; } +.icon-fontello-indent-right-2:before { content: '\eff3'; } +.icon-fontello-cloud-8:before { content: '\eff4'; } +.icon-fontello-terminal-1:before { content: '\eff5'; } +.icon-fontello-facebook-rect-2:before { content: '\eff6'; } +.icon-fontello-twitter-bird-2:before { content: '\eff7'; } +.icon-fontello-vimeo-rect-1:before { content: '\eff8'; } +.icon-fontello-tumblr-rect-1:before { content: '\eff9'; } +.icon-fontello-googleplus-rect-1:before { content: '\effa'; } +.icon-fontello-linkedin-rect-1:before { content: '\effb'; } +.icon-fontello-skype-6:before { content: '\effc'; } +.icon-fontello-vkontakte-rect-1:before { content: '\effd'; } +.icon-fontello-youtube-4:before { content: '\effe'; } +.icon-fontello-right-1:before { content: '\e8c9'; } diff --git a/sass/fonts/glyphicons/glyphicons.css b/sass/fonts/glyphicons/glyphicons.css new file mode 100755 index 0000000..e6aa9d0 --- /dev/null +++ b/sass/fonts/glyphicons/glyphicons.css @@ -0,0 +1,1068 @@ +@font-face { + font-family: 'Glyphicons Halflings'; + src: url("#{$font-path}/glyphicons/glyphicons-webfont.woff2") format("woff2"), url("#{$font-path}/glyphicons/glyphicons-webfont.woff") format("woff"); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.glyphicon-asterisk:before { + content: "\002a"; +} + +.glyphicon-plus:before { + content: "\002b"; +} + +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} + +.glyphicon-minus:before { + content: "\2212"; +} + +.glyphicon-cloud:before { + content: "\2601"; +} + +.glyphicon-envelope:before { + content: "\2709"; +} + +.glyphicon-pencil:before { + content: "\270f"; +} + +.glyphicon-glass:before { + content: "\e001"; +} + +.glyphicon-music:before { + content: "\e002"; +} + +.glyphicon-search:before { + content: "\e003"; +} + +.glyphicon-heart:before { + content: "\e005"; +} + +.glyphicon-star:before { + content: "\e006"; +} + +.glyphicon-star-empty:before { + content: "\e007"; +} + +.glyphicon-user:before { + content: "\e008"; +} + +.glyphicon-film:before { + content: "\e009"; +} + +.glyphicon-th-large:before { + content: "\e010"; +} + +.glyphicon-th:before { + content: "\e011"; +} + +.glyphicon-th-list:before { + content: "\e012"; +} + +.glyphicon-ok:before { + content: "\e013"; +} + +.glyphicon-remove:before { + content: "\e014"; +} + +.glyphicon-zoom-in:before { + content: "\e015"; +} + +.glyphicon-zoom-out:before { + content: "\e016"; +} + +.glyphicon-off:before { + content: "\e017"; +} + +.glyphicon-signal:before { + content: "\e018"; +} + +.glyphicon-cog:before { + content: "\e019"; +} + +.glyphicon-trash:before { + content: "\e020"; +} + +.glyphicon-home:before { + content: "\e021"; +} + +.glyphicon-file:before { + content: "\e022"; +} + +.glyphicon-time:before { + content: "\e023"; +} + +.glyphicon-road:before { + content: "\e024"; +} + +.glyphicon-download-alt:before { + content: "\e025"; +} + +.glyphicon-download:before { + content: "\e026"; +} + +.glyphicon-upload:before { + content: "\e027"; +} + +.glyphicon-inbox:before { + content: "\e028"; +} + +.glyphicon-play-circle:before { + content: "\e029"; +} + +.glyphicon-repeat:before { + content: "\e030"; +} + +.glyphicon-refresh:before { + content: "\e031"; +} + +.glyphicon-list-alt:before { + content: "\e032"; +} + +.glyphicon-lock:before { + content: "\e033"; +} + +.glyphicon-flag:before { + content: "\e034"; +} + +.glyphicon-headphones:before { + content: "\e035"; +} + +.glyphicon-volume-off:before { + content: "\e036"; +} + +.glyphicon-volume-down:before { + content: "\e037"; +} + +.glyphicon-volume-up:before { + content: "\e038"; +} + +.glyphicon-qrcode:before { + content: "\e039"; +} + +.glyphicon-barcode:before { + content: "\e040"; +} + +.glyphicon-tag:before { + content: "\e041"; +} + +.glyphicon-tags:before { + content: "\e042"; +} + +.glyphicon-book:before { + content: "\e043"; +} + +.glyphicon-bookmark:before { + content: "\e044"; +} + +.glyphicon-print:before { + content: "\e045"; +} + +.glyphicon-camera:before { + content: "\e046"; +} + +.glyphicon-font:before { + content: "\e047"; +} + +.glyphicon-bold:before { + content: "\e048"; +} + +.glyphicon-italic:before { + content: "\e049"; +} + +.glyphicon-text-height:before { + content: "\e050"; +} + +.glyphicon-text-width:before { + content: "\e051"; +} + +.glyphicon-align-left:before { + content: "\e052"; +} + +.glyphicon-align-center:before { + content: "\e053"; +} + +.glyphicon-align-right:before { + content: "\e054"; +} + +.glyphicon-align-justify:before { + content: "\e055"; +} + +.glyphicon-list:before { + content: "\e056"; +} + +.glyphicon-indent-left:before { + content: "\e057"; +} + +.glyphicon-indent-right:before { + content: "\e058"; +} + +.glyphicon-facetime-video:before { + content: "\e059"; +} + +.glyphicon-picture:before { + content: "\e060"; +} + +.glyphicon-map-marker:before { + content: "\e062"; +} + +.glyphicon-adjust:before { + content: "\e063"; +} + +.glyphicon-tint:before { + content: "\e064"; +} + +.glyphicon-edit:before { + content: "\e065"; +} + +.glyphicon-share:before { + content: "\e066"; +} + +.glyphicon-check:before { + content: "\e067"; +} + +.glyphicon-move:before { + content: "\e068"; +} + +.glyphicon-step-backward:before { + content: "\e069"; +} + +.glyphicon-fast-backward:before { + content: "\e070"; +} + +.glyphicon-backward:before { + content: "\e071"; +} + +.glyphicon-play:before { + content: "\e072"; +} + +.glyphicon-pause:before { + content: "\e073"; +} + +.glyphicon-stop:before { + content: "\e074"; +} + +.glyphicon-forward:before { + content: "\e075"; +} + +.glyphicon-fast-forward:before { + content: "\e076"; +} + +.glyphicon-step-forward:before { + content: "\e077"; +} + +.glyphicon-eject:before { + content: "\e078"; +} + +.glyphicon-chevron-left:before { + content: "\e079"; +} + +.glyphicon-chevron-right:before { + content: "\e080"; +} + +.glyphicon-plus-sign:before { + content: "\e081"; +} + +.glyphicon-minus-sign:before { + content: "\e082"; +} + +.glyphicon-remove-sign:before { + content: "\e083"; +} + +.glyphicon-ok-sign:before { + content: "\e084"; +} + +.glyphicon-question-sign:before { + content: "\e085"; +} + +.glyphicon-info-sign:before { + content: "\e086"; +} + +.glyphicon-screenshot:before { + content: "\e087"; +} + +.glyphicon-remove-circle:before { + content: "\e088"; +} + +.glyphicon-ok-circle:before { + content: "\e089"; +} + +.glyphicon-ban-circle:before { + content: "\e090"; +} + +.glyphicon-arrow-left:before { + content: "\e091"; +} + +.glyphicon-arrow-right:before { + content: "\e092"; +} + +.glyphicon-arrow-up:before { + content: "\e093"; +} + +.glyphicon-arrow-down:before { + content: "\e094"; +} + +.glyphicon-share-alt:before { + content: "\e095"; +} + +.glyphicon-resize-full:before { + content: "\e096"; +} + +.glyphicon-resize-small:before { + content: "\e097"; +} + +.glyphicon-exclamation-sign:before { + content: "\e101"; +} + +.glyphicon-gift:before { + content: "\e102"; +} + +.glyphicon-leaf:before { + content: "\e103"; +} + +.glyphicon-fire:before { + content: "\e104"; +} + +.glyphicon-eye-open:before { + content: "\e105"; +} + +.glyphicon-eye-close:before { + content: "\e106"; +} + +.glyphicon-warning-sign:before { + content: "\e107"; +} + +.glyphicon-plane:before { + content: "\e108"; +} + +.glyphicon-calendar:before { + content: "\e109"; +} + +.glyphicon-random:before { + content: "\e110"; +} + +.glyphicon-comment:before { + content: "\e111"; +} + +.glyphicon-magnet:before { + content: "\e112"; +} + +.glyphicon-chevron-up:before { + content: "\e113"; +} + +.glyphicon-chevron-down:before { + content: "\e114"; +} + +.glyphicon-retweet:before { + content: "\e115"; +} + +.glyphicon-shopping-cart:before { + content: "\e116"; +} + +.glyphicon-folder-close:before { + content: "\e117"; +} + +.glyphicon-folder-open:before { + content: "\e118"; +} + +.glyphicon-resize-vertical:before { + content: "\e119"; +} + +.glyphicon-resize-horizontal:before { + content: "\e120"; +} + +.glyphicon-hdd:before { + content: "\e121"; +} + +.glyphicon-bullhorn:before { + content: "\e122"; +} + +.glyphicon-bell:before { + content: "\e123"; +} + +.glyphicon-certificate:before { + content: "\e124"; +} + +.glyphicon-thumbs-up:before { + content: "\e125"; +} + +.glyphicon-thumbs-down:before { + content: "\e126"; +} + +.glyphicon-hand-right:before { + content: "\e127"; +} + +.glyphicon-hand-left:before { + content: "\e128"; +} + +.glyphicon-hand-up:before { + content: "\e129"; +} + +.glyphicon-hand-down:before { + content: "\e130"; +} + +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} + +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} + +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} + +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} + +.glyphicon-globe:before { + content: "\e135"; +} + +.glyphicon-wrench:before { + content: "\e136"; +} + +.glyphicon-tasks:before { + content: "\e137"; +} + +.glyphicon-filter:before { + content: "\e138"; +} + +.glyphicon-briefcase:before { + content: "\e139"; +} + +.glyphicon-fullscreen:before { + content: "\e140"; +} + +.glyphicon-dashboard:before { + content: "\e141"; +} + +.glyphicon-paperclip:before { + content: "\e142"; +} + +.glyphicon-heart-empty:before { + content: "\e143"; +} + +.glyphicon-link:before { + content: "\e144"; +} + +.glyphicon-phone:before { + content: "\e145"; +} + +.glyphicon-pushpin:before { + content: "\e146"; +} + +.glyphicon-usd:before { + content: "\e148"; +} + +.glyphicon-gbp:before { + content: "\e149"; +} + +.glyphicon-sort:before { + content: "\e150"; +} + +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} + +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} + +.glyphicon-sort-by-order:before { + content: "\e153"; +} + +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} + +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} + +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} + +.glyphicon-unchecked:before { + content: "\e157"; +} + +.glyphicon-expand:before { + content: "\e158"; +} + +.glyphicon-collapse-down:before { + content: "\e159"; +} + +.glyphicon-collapse-up:before { + content: "\e160"; +} + +.glyphicon-log-in:before { + content: "\e161"; +} + +.glyphicon-flash:before { + content: "\e162"; +} + +.glyphicon-log-out:before { + content: "\e163"; +} + +.glyphicon-new-window:before { + content: "\e164"; +} + +.glyphicon-record:before { + content: "\e165"; +} + +.glyphicon-save:before { + content: "\e166"; +} + +.glyphicon-open:before { + content: "\e167"; +} + +.glyphicon-saved:before { + content: "\e168"; +} + +.glyphicon-import:before { + content: "\e169"; +} + +.glyphicon-export:before { + content: "\e170"; +} + +.glyphicon-send:before { + content: "\e171"; +} + +.glyphicon-floppy-disk:before { + content: "\e172"; +} + +.glyphicon-floppy-saved:before { + content: "\e173"; +} + +.glyphicon-floppy-remove:before { + content: "\e174"; +} + +.glyphicon-floppy-save:before { + content: "\e175"; +} + +.glyphicon-floppy-open:before { + content: "\e176"; +} + +.glyphicon-credit-card:before { + content: "\e177"; +} + +.glyphicon-transfer:before { + content: "\e178"; +} + +.glyphicon-cutlery:before { + content: "\e179"; +} + +.glyphicon-header:before { + content: "\e180"; +} + +.glyphicon-compressed:before { + content: "\e181"; +} + +.glyphicon-earphone:before { + content: "\e182"; +} + +.glyphicon-phone-alt:before { + content: "\e183"; +} + +.glyphicon-tower:before { + content: "\e184"; +} + +.glyphicon-stats:before { + content: "\e185"; +} + +.glyphicon-sd-video:before { + content: "\e186"; +} + +.glyphicon-hd-video:before { + content: "\e187"; +} + +.glyphicon-subtitles:before { + content: "\e188"; +} + +.glyphicon-sound-stereo:before { + content: "\e189"; +} + +.glyphicon-sound-dolby:before { + content: "\e190"; +} + +.glyphicon-sound-5-1:before { + content: "\e191"; +} + +.glyphicon-sound-6-1:before { + content: "\e192"; +} + +.glyphicon-sound-7-1:before { + content: "\e193"; +} + +.glyphicon-copyright-mark:before { + content: "\e194"; +} + +.glyphicon-registration-mark:before { + content: "\e195"; +} + +.glyphicon-cloud-download:before { + content: "\e197"; +} + +.glyphicon-cloud-upload:before { + content: "\e198"; +} + +.glyphicon-tree-conifer:before { + content: "\e199"; +} + +.glyphicon-tree-deciduous:before { + content: "\e200"; +} + +.glyphicon-cd:before { + content: "\e201"; +} + +.glyphicon-save-file:before { + content: "\e202"; +} + +.glyphicon-open-file:before { + content: "\e203"; +} + +.glyphicon-level-up:before { + content: "\e204"; +} + +.glyphicon-copy:before { + content: "\e205"; +} + +.glyphicon-paste:before { + content: "\e206"; +} + +/** + * .glyphicon-door { &:before { content: "\1f6aa"; } } + * .glyphicon-key { &:before { content: "\1f511"; } } + */ +.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"; +} diff --git a/sass/fonts/ikons/ikons.css b/sass/fonts/ikons/ikons.css new file mode 100755 index 0000000..2134884 --- /dev/null +++ b/sass/fonts/ikons/ikons.css @@ -0,0 +1,921 @@ +@font-face { + font-family: 'ikons'; + src: url('#{$font-path}/ikons/ikons.woff2') format('woff2'), + url('#{$font-path}/ikons/ikons.woff') format('woff'); + font-weight: normal; + font-style: normal; +} + +[class^="icon-ikons-"]:before, +[class*=" icon-ikons-"]:before { + font-family: "ikons" !important; + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-ikons-alarm:before { + content: "a"; +} +.icon-ikons-alt:before { + content: "b"; +} +.icon-ikons-android:before { + content: "c"; +} +.icon-ikons-apple:before { + content: "d"; +} +.icon-ikons-appstore:before { + content: "e"; +} +.icon-ikons-arrow-1:before { + content: "f"; +} +.icon-ikons-arrow-2:before { + content: "g"; +} +.icon-ikons-arrow-down:before { + content: "h"; +} +.icon-ikons-arrow-left:before { + content: "i"; +} +.icon-ikons-arrow-right:before { + content: "j"; +} +.icon-ikons-arrow-up:before { + content: "k"; +} +.icon-ikons-arrows:before { + content: "l"; +} +.icon-ikons-arrows-horizontal:before { + content: "m"; +} +.icon-ikons-arrows-horizontal-2:before { + content: "n"; +} +.icon-ikons-arrows-vertical:before { + content: "o"; +} +.icon-ikons-arrows-vertical-2:before { + content: "p"; +} +.icon-ikons-bar-chart-1:before { + content: "q"; +} +.icon-ikons-bar-chart-2:before { + content: "r"; +} +.icon-ikons-bar-chart-3:before { + content: "s"; +} +.icon-ikons-bar-graph:before { + content: "t"; +} +.icon-ikons-basket:before { + content: "u"; +} +.icon-ikons-basket-add:before { + content: "v"; +} +.icon-ikons-basket-delete:before { + content: "w"; +} +.icon-ikons-basket-ok:before { + content: "x"; +} +.icon-ikons-basket-remove:before { + content: "y"; +} +.icon-ikons-battery-1-3:before { + content: "z"; +} +.icon-ikons-battery-2-3:before { + content: "A"; +} +.icon-ikons-battery-empty:before { + content: "B"; +} +.icon-ikons-battery-full:before { + content: "C"; +} +.icon-ikons-behance:before { + content: "D"; +} +.icon-ikons-bell:before { + content: "E"; +} +.icon-ikons-bin:before { + content: "F"; +} +.icon-ikons-block:before { + content: "G"; +} +.icon-ikons-bluetooth:before { + content: "H"; +} +.icon-ikons-book:before { + content: "I"; +} +.icon-ikons-book-1:before { + content: "J"; +} +.icon-ikons-book-2:before { + content: "K"; +} +.icon-ikons-bookmark:before { + content: "L"; +} +.icon-ikons-brightness-high:before { + content: "M"; +} +.icon-ikons-brightness-low:before { + content: "N"; +} +.icon-ikons-browser:before { + content: "O"; +} +.icon-ikons-browser-add:before { + content: "P"; +} +.icon-ikons-browser-delete:before { + content: "Q"; +} +.icon-ikons-browser-layout-1:before { + content: "R"; +} +.icon-ikons-browser-layout-2:before { + content: "S"; +} +.icon-ikons-browser-layout-3:before { + content: "T"; +} +.icon-ikons-browser-ok:before { + content: "U"; +} +.icon-ikons-browser-remove:before { + content: "V"; +} +.icon-ikons-bullseye:before { + content: "W"; +} +.icon-ikons-calendar:before { + content: "X"; +} +.icon-ikons-calendar-add:before { + content: "Y"; +} +.icon-ikons-calendar-ok:before { + content: "Z"; +} +.icon-ikons-camera:before { + content: "0"; +} +.icon-ikons-cassette:before { + content: "1"; +} +.icon-ikons-chart:before { + content: "2"; +} +.icon-ikons-chart-1-2:before { + content: "3"; +} +.icon-ikons-chart-1-4:before { + content: "4"; +} +.icon-ikons-chart-1-8:before { + content: "5"; +} +.icon-ikons-chart-3-4:before { + content: "6"; +} +.icon-ikons-chart-3-8:before { + content: "7"; +} +.icon-ikons-chart-5-8:before { + content: "8"; +} +.icon-ikons-chart-7-8:before { + content: "9"; +} +.icon-ikons-circle:before { + content: "!"; +} +.icon-ikons-circle-delete:before { + content: "\""; +} +.icon-ikons-circle-down:before { + content: "#"; +} +.icon-ikons-circle-fast-forward:before { + content: "$"; +} +.icon-ikons-circle-left:before { + content: "%"; +} +.icon-ikons-circle-minus:before { + content: "&"; +} +.icon-ikons-circle-ok:before { + content: "'"; +} +.icon-ikons-circle-pause:before { + content: "("; +} +.icon-ikons-circle-play:before { + content: ")"; +} +.icon-ikons-circle-plus:before { + content: "*"; +} +.icon-ikons-circle-rewind:before { + content: "+"; +} +.icon-ikons-circle-right:before { + content: ","; +} +.icon-ikons-circle-skip-next:before { + content: "-"; +} +.icon-ikons-circle-skip-previous:before { + content: "."; +} +.icon-ikons-circle-stop:before { + content: "/"; +} +.icon-ikons-circle-up:before { + content: ":"; +} +.icon-ikons-clip:before { + content: ";"; +} +.icon-ikons-close:before { + content: "<"; +} +.icon-ikons-cloud:before { + content: "="; +} +.icon-ikons-cloud-download:before { + content: ">"; +} +.icon-ikons-cloud-fail:before { + content: "?"; +} +.icon-ikons-cloud-ok:before { + content: "@"; +} +.icon-ikons-cloud-upload:before { + content: "["; +} +.icon-ikons-code:before { + content: "]"; +} +.icon-ikons-cog:before { + content: "^"; +} +.icon-ikons-columns:before { + content: "_"; +} +.icon-ikons-command:before { + content: "`"; +} +.icon-ikons-compass:before { + content: "{"; +} +.icon-ikons-computer-add:before { + content: "|"; +} +.icon-ikons-computer-delete:before { + content: "}"; +} +.icon-ikons-computer-download:before { + content: "~"; +} +.icon-ikons-computer-ok:before { + content: "\\"; +} +.icon-ikons-computer-remove:before { + content: "\e000"; +} +.icon-ikons-computer-upload:before { + content: "\e001"; +} +.icon-ikons-copy-1:before { + content: "\e002"; +} +.icon-ikons-copy-2:before { + content: "\e003"; +} +.icon-ikons-credit-card:before { + content: "\e004"; +} +.icon-ikons-crop:before { + content: "\e005"; +} +.icon-ikons-diskette:before { + content: "\e006"; +} +.icon-ikons-document:before { + content: "\e007"; +} +.icon-ikons-document-add:before { + content: "\e008"; +} +.icon-ikons-document-delete:before { + content: "\e009"; +} +.icon-ikons-document-download:before { + content: "\e00a"; +} +.icon-ikons-document-ok:before { + content: "\e00b"; +} +.icon-ikons-document-remove:before { + content: "\e00c"; +} +.icon-ikons-document-upload:before { + content: "\e00d"; +} +.icon-ikons-documents:before { + content: "\e00e"; +} +.icon-ikons-download:before { + content: "\e00f"; +} +.icon-ikons-dribbble:before { + content: "\e010"; +} +.icon-ikons-drop:before { + content: "\e011"; +} +.icon-ikons-dropbox:before { + content: "\e012"; +} +.icon-ikons-eject:before { + content: "\e013"; +} +.icon-ikons-equalizer:before { + content: "\e014"; +} +.icon-ikons-facebook-1:before { + content: "\e015"; +} +.icon-ikons-facebook-2:before { + content: "\e016"; +} +.icon-ikons-fast-forward:before { + content: "\e017"; +} +.icon-ikons-first-aid:before { + content: "\e018"; +} +.icon-ikons-folder:before { + content: "\e019"; +} +.icon-ikons-folder-add:before { + content: "\e01a"; +} +.icon-ikons-folder-delete:before { + content: "\e01b"; +} +.icon-ikons-folder-ok:before { + content: "\e01c"; +} +.icon-ikons-folder-remove:before { + content: "\e01d"; +} +.icon-ikons-followers:before { + content: "\e01e"; +} +.icon-ikons-following:before { + content: "\e01f"; +} +.icon-ikons-font-size-down:before { + content: "\e020"; +} +.icon-ikons-font-size-up:before { + content: "\e021"; +} +.icon-ikons-forrst:before { + content: "\e022"; +} +.icon-ikons-foursquare:before { + content: "\e023"; +} +.icon-ikons-frame:before { + content: "\e024"; +} +.icon-ikons-globe:before { + content: "\e025"; +} +.icon-ikons-google-plus:before { + content: "\e026"; +} +.icon-ikons-graph-fall:before { + content: "\e027"; +} +.icon-ikons-graph-rise:before { + content: "\e028"; +} +.icon-ikons-grid-1:before { + content: "\e029"; +} +.icon-ikons-grid-2:before { + content: "\e02a"; +} +.icon-ikons-hashtag:before { + content: "\e02b"; +} +.icon-ikons-heart:before { + content: "\e02c"; +} +.icon-ikons-home:before { + content: "\e02d"; +} +.icon-ikons-imac:before { + content: "\e02e"; +} +.icon-ikons-image:before { + content: "\e02f"; +} +.icon-ikons-inbox:before { + content: "\e030"; +} +.icon-ikons-inbox-in:before { + content: "\e031"; +} +.icon-ikons-inbox-out:before { + content: "\e032"; +} +.icon-ikons-instagram:before { + content: "\e033"; +} +.icon-ikons-ipad:before { + content: "\e034"; +} +.icon-ikons-iphone:before { + content: "\e035"; +} +.icon-ikons-layers:before { + content: "\e036"; +} +.icon-ikons-line-graph:before { + content: "\e037"; +} +.icon-ikons-line-graph-square:before { + content: "\e038"; +} +.icon-ikons-link:before { + content: "\e039"; +} +.icon-ikons-linkedin:before { + content: "\e03a"; +} +.icon-ikons-list:before { + content: "\e03b"; +} +.icon-ikons-list-2:before { + content: "\e03c"; +} +.icon-ikons-loading:before { + content: "\e03d"; +} +.icon-ikons-location:before { + content: "\e03e"; +} +.icon-ikons-lock:before { + content: "\e03f"; +} +.icon-ikons-login:before { + content: "\e040"; +} +.icon-ikons-logout:before { + content: "\e041"; +} +.icon-ikons-macbook:before { + content: "\e042"; +} +.icon-ikons-magnifying-glass:before { + content: "\e043"; +} +.icon-ikons-magnifying-glass-add:before { + content: "\e044"; +} +.icon-ikons-magnifying-glass-remove:before { + content: "\e045"; +} +.icon-ikons-mail:before { + content: "\e046"; +} +.icon-ikons-mail-incoming:before { + content: "\e047"; +} +.icon-ikons-mail-outgoing:before { + content: "\e048"; +} +.icon-ikons-map:before { + content: "\e049"; +} +.icon-ikons-map-add:before { + content: "\e04a"; +} +.icon-ikons-map-delete:before { + content: "\e04b"; +} +.icon-ikons-map-ok:before { + content: "\e04c"; +} +.icon-ikons-map-remove:before { + content: "\e04d"; +} +.icon-ikons-microphone:before { + content: "\e04e"; +} +.icon-ikons-microphone-off:before { + content: "\e04f"; +} +.icon-ikons-microsoft:before { + content: "\e050"; +} +.icon-ikons-minus:before { + content: "\e051"; +} +.icon-ikons-more:before { + content: "\e052"; +} +.icon-ikons-more-2:before { + content: "\e053"; +} +.icon-ikons-moustache:before { + content: "\e054"; +} +.icon-ikons-music:before { + content: "\e055"; +} +.icon-ikons-notepad:before { + content: "\e056"; +} +.icon-ikons-notepad-add:before { + content: "\e057"; +} +.icon-ikons-notepad-delete:before { + content: "\e058"; +} +.icon-ikons-notepad-ok:before { + content: "\e059"; +} +.icon-ikons-notepad-remove:before { + content: "\e05a"; +} +.icon-ikons-pause:before { + content: "\e05b"; +} +.icon-ikons-paypal:before { + content: "\e05c"; +} +.icon-ikons-pen-1:before { + content: "\e05d"; +} +.icon-ikons-pen-2:before { + content: "\e05e"; +} +.icon-ikons-pen-3:before { + content: "\e05f"; +} +.icon-ikons-picture:before { + content: "\e060"; +} +.icon-ikons-pie-chart:before { + content: "\e061"; +} +.icon-ikons-pill:before { + content: "\e062"; +} +.icon-ikons-pin-1:before { + content: "\e063"; +} +.icon-ikons-pin-2:before { + content: "\e064"; +} +.icon-ikons-pin-zoom-in:before { + content: "\e065"; +} +.icon-ikons-pin-zoom-out:before { + content: "\e066"; +} +.icon-ikons-pinterest-1:before { + content: "\e067"; +} +.icon-ikons-pinterest-2:before { + content: "\e068"; +} +.icon-ikons-play:before { + content: "\e069"; +} +.icon-ikons-plug:before { + content: "\e06a"; +} +.icon-ikons-plus:before { + content: "\e06b"; +} +.icon-ikons-polaroid:before { + content: "\e06c"; +} +.icon-ikons-polaroids:before { + content: "\e06d"; +} +.icon-ikons-power:before { + content: "\e06e"; +} +.icon-ikons-presentation:before { + content: "\e06f"; +} +.icon-ikons-printer:before { + content: "\e070"; +} +.icon-ikons-progress:before { + content: "\e071"; +} +.icon-ikons-record:before { + content: "\e072"; +} +.icon-ikons-repeat:before { + content: "\e073"; +} +.icon-ikons-repeat-1:before { + content: "\e074"; +} +.icon-ikons-repeat-2:before { + content: "\e075"; +} +.icon-ikons-resize-1:before { + content: "\e076"; +} +.icon-ikons-resize-2:before { + content: "\e077"; +} +.icon-ikons-resize-3:before { + content: "\e078"; +} +.icon-ikons-resize-4:before { + content: "\e079"; +} +.icon-ikons-resize-5:before { + content: "\e07a"; +} +.icon-ikons-resize-6:before { + content: "\e07b"; +} +.icon-ikons-rewind:before { + content: "\e07c"; +} +.icon-ikons-rss:before { + content: "\e07d"; +} +.icon-ikons-screen-expand-1:before { + content: "\e07e"; +} +.icon-ikons-screen-expand-2:before { + content: "\e07f"; +} +.icon-ikons-screen-expand-3:before { + content: "\e080"; +} +.icon-ikons-share:before { + content: "\e081"; +} +.icon-ikons-share-2:before { + content: "\e082"; +} +.icon-ikons-shop:before { + content: "\e083"; +} +.icon-ikons-shopping-bag:before { + content: "\e084"; +} +.icon-ikons-shopping-cart:before { + content: "\e085"; +} +.icon-ikons-shopping-cart-add:before { + content: "\e086"; +} +.icon-ikons-shopping-cart-delete:before { + content: "\e087"; +} +.icon-ikons-shopping-cart-ok:before { + content: "\e088"; +} +.icon-ikons-shopping-cart-remove:before { + content: "\e089"; +} +.icon-ikons-shuffle:before { + content: "\e08a"; +} +.icon-ikons-skip-next:before { + content: "\e08b"; +} +.icon-ikons-skip-previous:before { + content: "\e08c"; +} +.icon-ikons-skype:before { + content: "\e08d"; +} +.icon-ikons-slideshow:before { + content: "\e08e"; +} +.icon-ikons-speech-1:before { + content: "\e08f"; +} +.icon-ikons-speech-2:before { + content: "\e090"; +} +.icon-ikons-speech-3:before { + content: "\e091"; +} +.icon-ikons-speech-4:before { + content: "\e092"; +} +.icon-ikons-speech-bubble-1:before { + content: "\e093"; +} +.icon-ikons-speech-bubble-2:before { + content: "\e094"; +} +.icon-ikons-speech-bubbles:before { + content: "\e095"; +} +.icon-ikons-spotify:before { + content: "\e096"; +} +.icon-ikons-square:before { + content: "\e097"; +} +.icon-ikons-square-add:before { + content: "\e098"; +} +.icon-ikons-square-dashed:before { + content: "\e099"; +} +.icon-ikons-square-delete:before { + content: "\e09a"; +} +.icon-ikons-square-down:before { + content: "\e09b"; +} +.icon-ikons-square-left:before { + content: "\e09c"; +} +.icon-ikons-square-ok:before { + content: "\e09d"; +} +.icon-ikons-square-remove:before { + content: "\e09e"; +} +.icon-ikons-square-right:before { + content: "\e09f"; +} +.icon-ikons-square-up:before { + content: "\e0a0"; +} +.icon-ikons-star:before { + content: "\e0a1"; +} +.icon-ikons-stop:before { + content: "\e0a2"; +} +.icon-ikons-suitcase:before { + content: "\e0a3"; +} +.icon-ikons-tag:before { + content: "\e0a4"; +} +.icon-ikons-tags:before { + content: "\e0a5"; +} +.icon-ikons-target:before { + content: "\e0a6"; +} +.icon-ikons-terminal:before { + content: "\e0a7"; +} +.icon-ikons-text-center:before { + content: "\e0a8"; +} +.icon-ikons-text-justify:before { + content: "\e0a9"; +} +.icon-ikons-text-left:before { + content: "\e0aa"; +} +.icon-ikons-text-right:before { + content: "\e0ab"; +} +.icon-ikons-tick:before { + content: "\e0ac"; +} +.icon-ikons-time:before { + content: "\e0ad"; +} +.icon-ikons-timer:before { + content: "\e0ae"; +} +.icon-ikons-tumblr:before { + content: "\e0af"; +} +.icon-ikons-twitter:before { + content: "\e0b0"; +} +.icon-ikons-unlock:before { + content: "\e0b1"; +} +.icon-ikons-upload:before { + content: "\e0b2"; +} +.icon-ikons-user:before { + content: "\e0b3"; +} +.icon-ikons-user-add:before { + content: "\e0b4"; +} +.icon-ikons-user-circle:before { + content: "\e0b5"; +} +.icon-ikons-user-delete:before { + content: "\e0b6"; +} +.icon-ikons-user-ok:before { + content: "\e0b7"; +} +.icon-ikons-user-remove:before { + content: "\e0b8"; +} +.icon-ikons-user-square:before { + content: "\e0b9"; +} +.icon-ikons-users:before { + content: "\e0ba"; +} +.icon-ikons-view:before { + content: "\e0bb"; +} +.icon-ikons-view-off:before { + content: "\e0bc"; +} +.icon-ikons-vimeo:before { + content: "\e0bd"; +} +.icon-ikons-voicemail:before { + content: "\e0be"; +} +.icon-ikons-volume-1:before { + content: "\e0bf"; +} +.icon-ikons-volume-2:before { + content: "\e0c0"; +} +.icon-ikons-volume-3:before { + content: "\e0c1"; +} +.icon-ikons-volume-down:before { + content: "\e0c2"; +} +.icon-ikons-volume-mute:before { + content: "\e0c3"; +} +.icon-ikons-volume-off:before { + content: "\e0c4"; +} +.icon-ikons-volume-up:before { + content: "\e0c5"; +} +.icon-ikons-warning:before { + content: "\e0c6"; +} +.icon-ikons-wifi-1:before { + content: "\e0c7"; +} +.icon-ikons-wifi-2:before { + content: "\e0c8"; +} +.icon-ikons-wifi-3:before { + content: "\e0c9"; +} +.icon-ikons-windows:before { + content: "\e0ca"; +} +.icon-ikons-youtube:before { + content: "\e0cb"; +} +.icon-ikons-zoom-in:before { + content: "\e0cc"; +} +.icon-ikons-zoom-out:before { + content: "\e0cd"; +} diff --git a/sass/fonts/lato/lato.css b/sass/fonts/lato/lato.css new file mode 100755 index 0000000..434b7c8 --- /dev/null +++ b/sass/fonts/lato/lato.css @@ -0,0 +1,39 @@ +@font-face { + font-family: 'Lato'; + src: url('#{$font-path}/lato/lato-bold-webfont.woff2') format('woff2'), + url('#{$font-path}/lato/lato-bold-webfont.woff') format('woff'); + font-weight: bold; + font-style: normal; +} + +@font-face { + font-family: 'Lato'; + src: url('#{$font-path}/lato/lato-bolditalic-webfont.woff2') format('woff2'), + url('#{$font-path}/lato/lato-bolditalic-webfont.woff') format('woff'); + font-weight: bold; + font-style: italic; +} + +@font-face { + font-family: 'Lato'; + src: url('#{$font-path}/lato/lato-italic-webfont.woff2') format('woff2'), + url('#{$font-path}/lato/lato-italic-webfont.woff') format('woff'); + font-weight: normal; + font-style: italic; +} + +@font-face { + font-family: 'Lato'; + src: url('#{$font-path}/lato/lato-light-webfont.woff2') format('woff2'), + url('#{$font-path}/lato/lato-light-webfont.woff') format('woff'); + font-weight: 300; + font-style: normal; +} + +@font-face { + font-family: 'Lato'; + src: url('#{$font-path}/lato/lato-regular-webfont.woff2') format('woff2'), + url('#{$font-path}/lato/lato-regular-webfont.woff') format('woff'); + font-weight: normal; + font-style: normal; +} diff --git a/sass/fonts/mfizz/mfizz.css b/sass/fonts/mfizz/mfizz.css new file mode 100755 index 0000000..7f8e2e0 --- /dev/null +++ b/sass/fonts/mfizz/mfizz.css @@ -0,0 +1,131 @@ +/* + * Font Mfizz v1.2 + * Copyright 2013 Mfizz Inc, Joe Lauer + * MIT License + * + * Project: http://mfizz.com/oss/font-mfizz + * + * The font designed for technology and software geeks representing programming + * languages, operating systems, software engineering, and technology. + * + * Mfizz Inc + * Web: http://mfizz.com/ + * Twitter: http://twitter.com/mfizz_inc + * + * Joe Lauer + * Web: http://lauer.bz/ + * Twitter: http://twitter.com/jjlauer + */ + +@font-face { + font-family: 'mfizz'; + src: url('#{$font-path}/mfizz/mfizz.woff2') format('woff2'), + url('#{$font-path}/mfizz/mfizz.woff') format('woff'); + font-weight: normal; + font-style: normal; +} + +[class^="icon-mfizz-"]:before, +[class*=" icon-mfizz-"]:before { + font-family: "mfizz" !important; + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-mfizz-microscope:before { content: "\f100"; } +.icon-mfizz-cplusplus:before { content: "\f101"; } +.icon-mfizz-wireless:before { content: "\f102"; } +.icon-mfizz-fire-alt:before { content: "\f103"; } +.icon-mfizz-mobile-device:before { content: "\f104"; } +.icon-mfizz-objc:before { content: "\f105"; } +.icon-mfizz-redhat:before { content: "\f106"; } +.icon-mfizz-freebsd:before { content: "\f107"; } +.icon-mfizz-heroku:before { content: "\f108"; } +.icon-mfizz-python:before { content: "\f109"; } +.icon-mfizz-java:before { content: "\f10a"; } +.icon-mfizz-satellite:before { content: "\f10b"; } +.icon-mfizz-debian:before { content: "\f10c"; } +.icon-mfizz-grails:before { content: "\f10d"; } +.icon-mfizz-c:before { content: "\f10e"; } +.icon-mfizz-postgres:before { content: "\f10f"; } +.icon-mfizz-database-alt2:before { content: "\f110"; } +.icon-mfizz-raspberrypi:before { content: "\f111"; } +.icon-mfizz-nginx:before { content: "\f112"; } +.icon-mfizz-ruby-on-rails:before { content: "\f113"; } +.icon-mfizz-redis:before { content: "\f114"; } +.icon-mfizz-scala:before { content: "\f115"; } +.icon-mfizz-gnome:before { content: "\f116"; } +.icon-mfizz-perl:before { content: "\f117"; } +.icon-mfizz-mysql:before { content: "\f118"; } +.icon-mfizz-fedora:before { content: "\f119"; } +.icon-mfizz-ghost:before { content: "\f11a"; } +.icon-mfizz-google:before { content: "\f11b"; } +.icon-mfizz-netbsd:before { content: "\f11c"; } +.icon-mfizz-aws:before { content: "\f11d"; } +.icon-mfizz-bomb:before { content: "\f11e"; } +.icon-mfizz-looking:before { content: "\f11f"; } +.icon-mfizz-ruby:before { content: "\f120"; } +.icon-mfizz-mysql-alt:before { content: "\f121"; } +.icon-mfizz-playframework-alt:before { content: "\f122"; } +.icon-mfizz-osx:before { content: "\f123"; } +.icon-mfizz-database:before { content: "\f124"; } +.icon-mfizz-database-alt:before { content: "\f125"; } +.icon-mfizz-shell:before { content: "\f126"; } +.icon-mfizz-script:before { content: "\f127"; } +.icon-mfizz-antenna:before { content: "\f128"; } +.icon-mfizz-coffee-bean:before { content: "\f129"; } +.icon-mfizz-scala-alt:before { content: "\f12a"; } +.icon-mfizz-platter:before { content: "\f12b"; } +.icon-mfizz-java-duke:before { content: "\f12c"; } +.icon-mfizz-iphone:before { content: "\f12d"; } +.icon-mfizz-script-alt:before { content: "\f12e"; } +.icon-mfizz-google-alt:before { content: "\f12f"; } +.icon-mfizz-haskell:before { content: "\f130"; } +.icon-mfizz-mariadb:before { content: "\f131"; } +.icon-mfizz-phone-retro:before { content: "\f132"; } +.icon-mfizz-phone-alt:before { content: "\f133"; } +.icon-mfizz-csharp:before { content: "\f134"; } +.icon-mfizz-php:before { content: "\f135"; } +.icon-mfizz-postgres-alt:before { content: "\f136"; } +.icon-mfizz-html:before { content: "\f137"; } +.icon-mfizz-mfizz:before { content: "\f138"; } +.icon-mfizz-apache:before { content: "\f139"; } +.icon-mfizz-hadoop:before { content: "\f13a"; } +.icon-mfizz-ruby-on-rails-alt:before { content: "\f13b"; } +.icon-mfizz-mobile-phone-broadcast:before { content: "\f13c"; } +.icon-mfizz-css:before { content: "\f13d"; } +.icon-mfizz-playframework:before { content: "\f13e"; } +.icon-mfizz-clojure:before { content: "\f13f"; } +.icon-mfizz-mobile-phone-alt:before { content: "\f140"; } +.icon-mfizz-suse:before { content: "\f141"; } +.icon-mfizz-java-bold:before { content: "\f142"; } +.icon-mfizz-nginx-alt:before { content: "\f143"; } +.icon-mfizz-nginx-alt2:before { content: "\f144"; } +.icon-mfizz-linux-mint:before { content: "\f145"; } +.icon-mfizz-dreamhost:before { content: "\f146"; } +.icon-mfizz-blackberry:before { content: "\f147"; } +.icon-mfizz-javascript:before { content: "\f148"; } +.icon-mfizz-ubuntu:before { content: "\f149"; } +.icon-mfizz-php-alt:before { content: "\f14a"; } +.icon-mfizz-centos:before { content: "\f14b"; } +.icon-mfizz-nodejs:before { content: "\f14c"; } +.icon-mfizz-splatter:before { content: "\f14d"; } +.icon-mfizz-3dprint:before { content: "\f14e"; } +.icon-mfizz-line-graph:before { content: "\f14f"; } +.icon-mfizz-cassandra:before { content: "\f150"; } +.icon-mfizz-solaris:before { content: "\f151"; } +.icon-mfizz-jetty:before { content: "\f152"; } +.icon-mfizz-tomcat:before { content: "\f153"; } +.icon-mfizz-oracle:before { content: "\f154"; } +.icon-mfizz-oracle-alt:before { content: "\f155"; } +.icon-mfizz-mssql:before { content: "\f156"; } +.icon-mfizz-google-developers:before { content: "\f157"; } +.icon-mfizz-google-code:before { content: "\f158"; } +.icon-mfizz-kde:before { content: "\f159"; } +.icon-mfizz-grails-alt:before { content: "\f15a"; } diff --git a/sass/fonts/nargela/nargela.css b/sass/fonts/nargela/nargela.css new file mode 100755 index 0000000..c8244d9 --- /dev/null +++ b/sass/fonts/nargela/nargela.css @@ -0,0 +1,263 @@ +@font-face { + font-family: 'icon-nargela'; + src: url('#{$font-path}/nargela/nargela.woff2') format('woff2'), + url('#{$font-path}/nargela/nargela.woff') format('woff'); + font-weight: normal; + font-style: normal; +} + +[class^="icon-nargela-"]:before, +[class*=" icon-nargela-"]:before { + font-family: "icon-nargela" !important; + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + line-height: 1; + display: inline-block; + transform: scale(1.2); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-nargela-align-left:before { + content: "a"; +} +.icon-nargela-align-middle:before { + content: "b"; +} +.icon-nargela-align-right:before { + content: "c"; +} +.icon-nargela-arrow:before { + content: "d"; +} +.icon-nargela-battery:before { + content: "e"; +} +.icon-nargela-bell:before { + content: "f"; +} +.icon-nargela-blank:before { + content: "g"; +} +.icon-nargela-bluetooth:before { + content: "h"; +} +.icon-nargela-browser:before { + content: "i"; +} +.icon-nargela-camera:before { + content: "j"; +} +.icon-nargela-cart:before { + content: "k"; +} +.icon-nargela-chat:before { + content: "l"; +} +.icon-nargela-check-mark:before { + content: "m"; +} +.icon-nargela-clock:before { + content: "n"; +} +.icon-nargela-close:before { + content: "o"; +} +.icon-nargela-cocktail:before { + content: "p"; +} +.icon-nargela-compass:before { + content: "q"; +} +.icon-nargela-connection:before { + content: "r"; +} +.icon-nargela-cursor:before { + content: "s"; +} +.icon-nargela-display:before { + content: "t"; +} +.icon-nargela-download:before { + content: "u"; +} +.icon-nargela-drop:before { + content: "v"; +} +.icon-nargela-empty-blank:before { + content: "w"; +} +.icon-nargela-flag:before { + content: "x"; +} +.icon-nargela-forward:before { + content: "y"; +} +.icon-nargela-forward-2:before { + content: "z"; +} +.icon-nargela-gift:before { + content: "A"; +} +.icon-nargela-graphic:before { + content: "B"; +} +.icon-nargela-grid:before { + content: "C"; +} +.icon-nargela-hamburger-menu:before { + content: "D"; +} +.icon-nargela-headphones:before { + content: "E"; +} +.icon-nargela-heart:before { + content: "F"; +} +.icon-nargela-home:before { + content: "G"; +} +.icon-nargela-hyperlink:before { + content: "H"; +} +.icon-nargela-justify-all:before { + content: "I"; +} +.icon-nargela-key:before { + content: "J"; +} +.icon-nargela-label:before { + content: "K"; +} +.icon-nargela-launch:before { + content: "L"; +} +.icon-nargela-lock-closed:before { + content: "M"; +} +.icon-nargela-lock-open:before { + content: "N"; +} +.icon-nargela-magnet:before { + content: "O"; +} +.icon-nargela-magnifying-glass:before { + content: "P"; +} +.icon-nargela-magnifying-glass-2:before { + content: "Q"; +} +.icon-nargela-magnifying-glass-minus:before { + content: "R"; +} +.icon-nargela-magnifying-glass-plus:before { + content: "S"; +} +.icon-nargela-mail:before { + content: "T"; +} +.icon-nargela-map:before { + content: "U"; +} +.icon-nargela-map-pin:before { + content: "V"; +} +.icon-nargela-maximize:before { + content: "W"; +} +.icon-nargela-microphone:before { + content: "X"; +} +.icon-nargela-minimize:before { + content: "Y"; +} +.icon-nargela-minus:before { + content: "Z"; +} +.icon-nargela-mouse:before { + content: "0"; +} +.icon-nargela-music:before { + content: "1"; +} +.icon-nargela-navigation:before { + content: "2"; +} +.icon-nargela-notifications:before { + content: "3"; +} +.icon-nargela-pause:before { + content: "4"; +} +.icon-nargela-pencil:before { + content: "5"; +} +.icon-nargela-play:before { + content: "6"; +} +.icon-nargela-plus:before { + content: "7"; +} +.icon-nargela-power:before { + content: "8"; +} +.icon-nargela-print:before { + content: "9"; +} +.icon-nargela-repeat:before { + content: "!"; +} +.icon-nargela-rule:before { + content: "\""; +} +.icon-nargela-selection:before { + content: "#"; +} +.icon-nargela-settings:before { + content: "$"; +} +.icon-nargela-share:before { + content: "%"; +} +.icon-nargela-shuffle:before { + content: "&"; +} +.icon-nargela-sound-minus:before { + content: "'"; +} +.icon-nargela-sound-plus:before { + content: "("; +} +.icon-nargela-speaker:before { + content: ")"; +} +.icon-nargela-star:before { + content: "*"; +} +.icon-nargela-statistics:before { + content: "+"; +} +.icon-nargela-stop:before { + content: ","; +} +.icon-nargela-sun:before { + content: "-"; +} +.icon-nargela-trash-bin:before { + content: "."; +} +.icon-nargela-umbrella:before { + content: "/"; +} +.icon-nargela-upload:before { + content: ":"; +} +.icon-nargela-video-camera:before { + content: ";"; +} +.icon-nargela-wifi:before { + content: "<"; +} diff --git a/sass/fonts/outlined/outlined.css b/sass/fonts/outlined/outlined.css new file mode 100755 index 0000000..54dc261 --- /dev/null +++ b/sass/fonts/outlined/outlined.css @@ -0,0 +1,471 @@ +@font-face { + font-family: 'outlined-iconset'; + src: url('#{$font-path}/outlined/outlined.woff2') format('woff2'), + url('#{$font-path}/outlined/outlined.woff') format('woff'); + font-weight: normal; + font-style: normal; +} + +[class^="icon-outlined-"]:before, +[class*=" icon-outlined-"]:before { + font-family: "outlined-iconset" !important; + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-outlined-boat:before { + content: "\e000"; +} +.icon-outlined-booknote:before { + content: "\e001"; +} +.icon-outlined-booknote-add:before { + content: "\e002"; +} +.icon-outlined-booknote-remove:before { + content: "\e003"; +} +.icon-outlined-camera-1:before { + content: "\e004"; +} +.icon-outlined-camera-2:before { + content: "\e005"; +} +.icon-outlined-cloud-check:before { + content: "\e006"; +} +.icon-outlined-cloud-delete:before { + content: "\e007"; +} +.icon-outlined-cloud-download:before { + content: "\e008"; +} +.icon-outlined-cloud-upload:before { + content: "\e009"; +} +.icon-outlined-cloudy:before { + content: "\e00a"; +} +.icon-outlined-cocktail:before { + content: "\e00b"; +} +.icon-outlined-coffee:before { + content: "\e00c"; +} +.icon-outlined-compass:before { + content: "\e00d"; +} +.icon-outlined-compress:before { + content: "\e00e"; +} +.icon-outlined-cutlery:before { + content: "\e00f"; +} +.icon-outlined-delete:before { + content: "\e010"; +} +.icon-outlined-delete-folder:before { + content: "\e011"; +} +.icon-outlined-dialogue-add:before { + content: "\e012"; +} +.icon-outlined-dialogue-delete:before { + content: "\e013"; +} +.icon-outlined-dialogue-happy:before { + content: "\e014"; +} +.icon-outlined-dialogue-sad:before { + content: "\e015"; +} +.icon-outlined-dialogue-text:before { + content: "\e016"; +} +.icon-outlined-dialogue-think:before { + content: "\e017"; +} +.icon-outlined-diamond:before { + content: "\e018"; +} +.icon-outlined-dish-fork:before { + content: "\e019"; +} +.icon-outlined-dish-spoon:before { + content: "\e01a"; +} +.icon-outlined-download:before { + content: "\e01b"; +} +.icon-outlined-download-folder:before { + content: "\e01c"; +} +.icon-outlined-expand:before { + content: "\e01d"; +} +.icon-outlined-eye:before { + content: "\e01e"; +} +.icon-outlined-fast-food:before { + content: "\e01f"; +} +.icon-outlined-flag:before { + content: "\e020"; +} +.icon-outlined-folder:before { + content: "\e021"; +} +.icon-outlined-geolocalizator:before { + content: "\e022"; +} +.icon-outlined-globe:before { + content: "\e023"; +} +.icon-outlined-graph:before { + content: "\e024"; +} +.icon-outlined-graph-descending:before { + content: "\e025"; +} +.icon-outlined-graph-rising:before { + content: "\e026"; +} +.icon-outlined-hammer:before { + content: "\e027"; +} +.icon-outlined-happy-drop:before { + content: "\e028"; +} +.icon-outlined-headphones:before { + content: "\e029"; +} +.icon-outlined-heart:before { + content: "\e02a"; +} +.icon-outlined-heart-broken:before { + content: "\e02b"; +} +.icon-outlined-home:before { + content: "\e02c"; +} +.icon-outlined-hourglass:before { + content: "\e02d"; +} +.icon-outlined-image:before { + content: "\e02e"; +} +.icon-outlined-key:before { + content: "\e02f"; +} +.icon-outlined-life-buoy:before { + content: "\e030"; +} +.icon-outlined-list:before { + content: "\e031"; +} +.icon-outlined-lock-closed:before { + content: "\e032"; +} +.icon-outlined-lock-open:before { + content: "\e033"; +} +.icon-outlined-loudspeaker:before { + content: "\e034"; +} +.icon-outlined-magnifier:before { + content: "\e035"; +} +.icon-outlined-magnifier-minus:before { + content: "\e036"; +} +.icon-outlined-magnifier-plus:before { + content: "\e037"; +} +.icon-outlined-mail:before { + content: "\e038"; +} +.icon-outlined-mail-open:before { + content: "\e039"; +} +.icon-outlined-map:before { + content: "\e03a"; +} +.icon-outlined-medical-case:before { + content: "\e03b"; +} +.icon-outlined-microphone-1:before { + content: "\e03c"; +} +.icon-outlined-microphone-2:before { + content: "\e03d"; +} +.icon-outlined-minus:before { + content: "\e03e"; +} +.icon-outlined-multiple-image:before { + content: "\e03f"; +} +.icon-outlined-music-back:before { + content: "\e040"; +} +.icon-outlined-music-backtoend:before { + content: "\e041"; +} +.icon-outlined-music-eject:before { + content: "\e042"; +} +.icon-outlined-music-forward:before { + content: "\e043"; +} +.icon-outlined-music-forwardtoend:before { + content: "\e044"; +} +.icon-outlined-music-pause:before { + content: "\e045"; +} +.icon-outlined-music-play:before { + content: "\e046"; +} +.icon-outlined-music-random:before { + content: "\e047"; +} +.icon-outlined-music-repeat:before { + content: "\e048"; +} +.icon-outlined-music-stop:before { + content: "\e049"; +} +.icon-outlined-musical-note:before { + content: "\e04a"; +} +.icon-outlined-musical-note-2:before { + content: "\e04b"; +} +.icon-outlined-old-video-cam:before { + content: "\e04c"; +} +.icon-outlined-paper-pen:before { + content: "\e04d"; +} +.icon-outlined-paper-pencil:before { + content: "\e04e"; +} +.icon-outlined-paper-sheet:before { + content: "\e04f"; +} +.icon-outlined-pen-pencil-ruler:before { + content: "\e050"; +} +.icon-outlined-pencil:before { + content: "\e051"; +} +.icon-outlined-pencil-ruler:before { + content: "\e052"; +} +.icon-outlined-plus:before { + content: "\e053"; +} +.icon-outlined-portable-pc:before { + content: "\e054"; +} +.icon-outlined-pricetag:before { + content: "\e055"; +} +.icon-outlined-printer:before { + content: "\e056"; +} +.icon-outlined-profile:before { + content: "\e057"; +} +.icon-outlined-profile-add:before { + content: "\e058"; +} +.icon-outlined-profile-remove:before { + content: "\e059"; +} +.icon-outlined-rainy:before { + content: "\e05a"; +} +.icon-outlined-rotate:before { + content: "\e05b"; +} +.icon-outlined-setting-1:before { + content: "\e05c"; +} +.icon-outlined-setting-2:before { + content: "\e05d"; +} +.icon-outlined-share:before { + content: "\e05e"; +} +.icon-outlined-shield-down:before { + content: "\e05f"; +} +.icon-outlined-shield-left:before { + content: "\e060"; +} +.icon-outlined-shield-right:before { + content: "\e061"; +} +.icon-outlined-shield-up:before { + content: "\e062"; +} +.icon-outlined-shopping-cart:before { + content: "\e063"; +} +.icon-outlined-shopping-cart-content:before { + content: "\e064"; +} +.icon-outlined-sinth:before { + content: "\e065"; +} +.icon-outlined-smartphone:before { + content: "\e066"; +} +.icon-outlined-spread:before { + content: "\e067"; +} +.icon-outlined-squares:before { + content: "\e068"; +} +.icon-outlined-stormy:before { + content: "\e069"; +} +.icon-outlined-sunny:before { + content: "\e06a"; +} +.icon-outlined-tablet:before { + content: "\e06b"; +} +.icon-outlined-three-stripes-horiz:before { + content: "\e06c"; +} +.icon-outlined-three-stripes-vert:before { + content: "\e06d"; +} +.icon-outlined-ticket:before { + content: "\e06e"; +} +.icon-outlined-todolist:before { + content: "\e06f"; +} +.icon-outlined-todolist-add:before { + content: "\e070"; +} +.icon-outlined-todolist-check:before { + content: "\e071"; +} +.icon-outlined-trash-bin:before { + content: "\e072"; +} +.icon-outlined-tshirt:before { + content: "\e073"; +} +.icon-outlined-tv-monitor:before { + content: "\e074"; +} +.icon-outlined-umbrella:before { + content: "\e075"; +} +.icon-outlined-upload:before { + content: "\e076"; +} +.icon-outlined-upload-folder:before { + content: "\e077"; +} +.icon-outlined-variable:before { + content: "\e078"; +} +.icon-outlined-video-cam:before { + content: "\e079"; +} +.icon-outlined-volume-higher:before { + content: "\e07a"; +} +.icon-outlined-volume-lower:before { + content: "\e07b"; +} +.icon-outlined-volume-off:before { + content: "\e07c"; +} +.icon-outlined-watch:before { + content: "\e07d"; +} +.icon-outlined-waterfall:before { + content: "\e07e"; +} +.icon-outlined-website-1:before { + content: "\e07f"; +} +.icon-outlined-website-2:before { + content: "\e080"; +} +.icon-outlined-wine:before { + content: "\e081"; +} +.icon-outlined-calendar:before { + content: "\e082"; +} +.icon-outlined-alarm-clock:before { + content: "\e083"; +} +.icon-outlined-add-folder:before { + content: "\e084"; +} +.icon-outlined-accelerator:before { + content: "\e085"; +} +.icon-outlined-agenda:before { + content: "\e086"; +} +.icon-outlined-arrow-left:before { + content: "\e087"; +} +.icon-outlined-arrow-down:before { + content: "\e088"; +} +.icon-outlined-battery-1:before { + content: "\e089"; +} +.icon-outlined-case:before { + content: "\e08a"; +} +.icon-outlined-arrow-up:before { + content: "\e08b"; +} +.icon-outlined-arrow-right:before { + content: "\e08c"; +} +.icon-outlined-case-2:before { + content: "\e08d"; +} +.icon-outlined-cd:before { + content: "\e08e"; +} +.icon-outlined-battery-2:before { + content: "\e08f"; +} +.icon-outlined-battery-3:before { + content: "\e090"; +} +.icon-outlined-check:before { + content: "\e091"; +} +.icon-outlined-battery-4:before { + content: "\e092"; +} +.icon-outlined-chronometer:before { + content: "\e093"; +} +.icon-outlined-clock:before { + content: "\e094"; +} +.icon-outlined-blackboard-graph:before { + content: "\e095"; +} diff --git a/sass/fonts/pixelvicon/pixelvicon.css b/sass/fonts/pixelvicon/pixelvicon.css new file mode 100755 index 0000000..d632b22 --- /dev/null +++ b/sass/fonts/pixelvicon/pixelvicon.css @@ -0,0 +1,259 @@ +@font-face { + font-family: 'pixelvicon'; + src: url('#{$font-path}/pixelvicon/pixelvicon.woff2') format('woff2'), + url('#{$font-path}/pixelvicon/pixelvicon.woff') format('woff'); + font-weight: normal; + font-style: normal; +} + +[class^="icon-pixelvicon-"]:before, [class*=" icon-pixelvicon-"]:before { + font-family: "pixelvicon" !important; + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.icon-pixelvicon-browser-1:before { + content: "a"; +} +.icon-pixelvicon-browser-2:before { + content: "b"; +} +.icon-pixelvicon-browser-3:before { + content: "c"; +} +.icon-pixelvicon-browser-4:before { + content: "d"; +} +.icon-pixelvicon-browser-5:before { + content: "e"; +} +.icon-pixelvicon-browser-6:before { + content: "f"; +} +.icon-pixelvicon-imac:before { + content: "g"; +} +.icon-pixelvicon-laptop:before { + content: "h"; +} +.icon-pixelvicon-monitor:before { + content: "i"; +} +.icon-pixelvicon-pc-case:before { + content: "j"; +} +.icon-pixelvicon-tablet-1:before { + content: "k"; +} +.icon-pixelvicon-tablet-2:before { + content: "l"; +} +.icon-pixelvicon-tablet-3:before { + content: "m"; +} +.icon-pixelvicon-tablet-4:before { + content: "n"; +} +.icon-pixelvicon-smart-phone-1:before { + content: "o"; +} +.icon-pixelvicon-smart-phone-2:before { + content: "p"; +} +.icon-pixelvicon-smart-phone-3:before { + content: "q"; +} +.icon-pixelvicon-smart-phone-4:before { + content: "r"; +} +.icon-pixelvicon-printer:before { + content: "s"; +} +.icon-pixelvicon-calculator:before { + content: "t"; +} +.icon-pixelvicon-keyboard:before { + content: "u"; +} +.icon-pixelvicon-mouse:before { + content: "v"; +} +.icon-pixelvicon-video-game-controller:before { + content: "w"; +} +.icon-pixelvicon-floppy-disk:before { + content: "x"; +} +.icon-pixelvicon-coffee:before { + content: "y"; +} +.icon-pixelvicon-mug:before { + content: "z"; +} +.icon-pixelvicon-briefcase-1:before { + content: "A"; +} +.icon-pixelvicon-briefcase-2:before { + content: "B"; +} +.icon-pixelvicon-briefcase-3:before { + content: "C"; +} +.icon-pixelvicon-first-aid:before { + content: "D"; +} +.icon-pixelvicon-shopping-bag:before { + content: "E"; +} +.icon-pixelvicon-gift:before { + content: "F"; +} +.icon-pixelvicon-notepad-1:before { + content: "G"; +} +.icon-pixelvicon-notepad-2:before { + content: "H"; +} +.icon-pixelvicon-list-1:before { + content: "I"; +} +.icon-pixelvicon-list-2:before { + content: "J"; +} +.icon-pixelvicon-list-3:before { + content: "K"; +} +.icon-pixelvicon-book:before { + content: "L"; +} +.icon-pixelvicon-calendar-1:before { + content: "M"; +} +.icon-pixelvicon-calendar-2:before { + content: "N"; +} +.icon-pixelvicon-notebook:before { + content: "O"; +} +.icon-pixelvicon-ruler:before { + content: "P"; +} +.icon-pixelvicon-pen-1:before { + content: "Q"; +} +.icon-pixelvicon-pen-2:before { + content: "R"; +} +.icon-pixelvicon-document-1:before { + content: "S"; +} +.icon-pixelvicon-document-2:before { + content: "T"; +} +.icon-pixelvicon-document-3:before { + content: "U"; +} +.icon-pixelvicon-film:before { + content: "V"; +} +.icon-pixelvicon-photo-gallery:before { + content: "W"; +} +.icon-pixelvicon-clock:before { + content: "X"; +} +.icon-pixelvicon-cupboard:before { + content: "Y"; +} +.icon-pixelvicon-drawer:before { + content: "Z"; +} +.icon-pixelvicon-dresser:before { + content: "0"; +} +.icon-pixelvicon-chair:before { + content: "1"; +} +.icon-pixelvicon-sofa:before { + content: "2"; +} +.icon-pixelvicon-desk:before { + content: "3"; +} +.icon-pixelvicon-table:before { + content: "4"; +} +.icon-pixelvicon-door:before { + content: "5"; +} +.icon-pixelvicon-window:before { + content: "6"; +} +.icon-pixelvicon-brick-wall:before { + content: "7"; +} +.icon-pixelvicon-trash-1:before { + content: "8"; +} +.icon-pixelvicon-trash-2:before { + content: "9"; +} +.icon-pixelvicon-lock:before { + content: "!"; +} +.icon-pixelvicon-unlock:before { + content: "\""; +} +.icon-pixelvicon-plus:before { + content: "#"; +} +.icon-pixelvicon-minus:before { + content: "$"; +} +.icon-pixelvicon-battery-1:before { + content: "%"; +} +.icon-pixelvicon-battery-2:before { + content: "&"; +} +.icon-pixelvicon-battery-3:before { + content: "'"; +} +.icon-pixelvicon-battery-4:before { + content: "("; +} +.icon-pixelvicon-transform:before { + content: ")"; +} +.icon-pixelvicon-resize:before { + content: "*"; +} +.icon-pixelvicon-grid:before { + content: "+"; +} +.icon-pixelvicon-menu:before { + content: ","; +} +.icon-pixelvicon-fullscreen:before { + content: "-"; +} +.icon-pixelvicon-outline:before { + content: "."; +} +.icon-pixelvicon-align-left:before { + content: "/"; +} +.icon-pixelvicon-align-center:before { + content: ":"; +} +.icon-pixelvicon-align-right:before { + content: ";"; +} +.icon-pixelvicon-align-justify:before { + content: "<"; +} diff --git a/sass/main.rtl.scss b/sass/main.rtl.scss new file mode 100755 index 0000000..bdb4ce0 --- /dev/null +++ b/sass/main.rtl.scss @@ -0,0 +1 @@ +@import "main"; diff --git a/sass/main.scss b/sass/main.scss new file mode 100755 index 0000000..fbf56e2 --- /dev/null +++ b/sass/main.scss @@ -0,0 +1,28 @@ +@import "/dist/css/main-blessed4"; +@import "/dist/css/main-blessed3"; +@import "/dist/css/main-blessed2"; +@import "/dist/css/main-blessed1"; +@import "variables"; +@import "@sketchpixy/rubix/sass/rubix"; +@import "@sketchpixy/rubix/sass/vendor"; +@import "colors"; +@import "theme"; + +@import "fonts/lato/lato"; +@import "fonts/fontello/fontello"; +@import "fonts/climacons/climacons"; +@import "fonts/devicon/devicon"; +@import "fonts/dripicons/dripicons"; +@import "fonts/feather/feather"; +@import "fonts/flatline/flatline"; +@import "fonts/mfizz/mfizz"; +@import "fonts/nargela/nargela"; +@import "fonts/glyphicons/glyphicons"; +@import "fonts/ikons/ikons"; +@import "fonts/outlined/outlined"; +@import "fonts/pixelvicon/pixelvicon"; +@import "fonts/Simple-Line-Icons/Simple-Line-Icons"; +@import "fonts/Stroke-Gap-Icons/Stroke-Gap-Icons"; + +/* Page styles */ +@import "pages/home"; diff --git a/sass/pages/_home.scss b/sass/pages/_home.scss new file mode 100755 index 0000000..f8e6f9e --- /dev/null +++ b/sass/pages/_home.scss @@ -0,0 +1,32 @@ +.todo-item { + border-bottom: 1px solid #eee; + + button { + display: none; + margin-top: 8px; + } + + &:hover { + background: rgb(254, 254, 244); + + button { + display: inline-block; + } + } +} + + +@media (max-width: $screen-xs-max) { + .todo-item { + .text-right { + display: none; + } + } + .todo-item:hover { + .text-right { + display: block; + text-align: center; + margin-bottom: 12.5px; + } + } +} diff --git a/src/actions/index.js b/src/actions/index.js new file mode 100644 index 0000000..d543ade --- /dev/null +++ b/src/actions/index.js @@ -0,0 +1,23 @@ +import * as types from '../constants/ActionTypes'; + +export function toggleBoxedLayout(isLayoutBoxed) { + return { type: types.TOGGLE_BOXED_LAYOUT, isLayoutBoxed }; +} +export function toggleCollapsedNav(isNavCollapsed) { + return { type: types.TOGGLE_COLLAPSED_NAV, isNavCollapsed }; +} +export function toggleNavBehind(isNavBehind) { + return { type: types.TOGGLE_NAV_BEHIND, isNavBehind }; +} +export function toggleFixedHeader(isFixedHeader) { + return { type: types.TOGGLE_FIXED_HEADER, isFixedHeader }; +} +export function changeSidebarWidth(sidebarWidth) { + return { type: types.CHANGE_SIDEBAR_WIDTH, sidebarWidth }; +} +export function changeColorOption(colorOption) { + return { type: types.CHANGE_COLOR_OPTION, colorOption }; +} +export function changeTheme(themeOption) { + return { type: types.CHANGE_THEME, theme: themeOption }; +} diff --git a/src/assets/images/5_min.gif b/src/assets/images/5_min.gif new file mode 100644 index 0000000..cc14adb Binary files /dev/null and b/src/assets/images/5_min.gif differ diff --git a/src/assets/images/5_min.png b/src/assets/images/5_min.png new file mode 100644 index 0000000..e071cc4 Binary files /dev/null and b/src/assets/images/5_min.png differ diff --git a/src/assets/images/audio.svg b/src/assets/images/audio.svg new file mode 100644 index 0000000..35914cf --- /dev/null +++ b/src/assets/images/audio.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/background/1.png b/src/assets/images/background/1.png new file mode 100644 index 0000000..f8647b5 Binary files /dev/null and b/src/assets/images/background/1.png differ diff --git a/src/assets/images/background/2.png b/src/assets/images/background/2.png new file mode 100644 index 0000000..77bdc31 Binary files /dev/null and b/src/assets/images/background/2.png differ diff --git a/src/assets/images/bg-pattern/bg-pattern1.png b/src/assets/images/bg-pattern/bg-pattern1.png new file mode 100755 index 0000000..bbace1a Binary files /dev/null and b/src/assets/images/bg-pattern/bg-pattern1.png differ diff --git a/src/assets/images/bg-pattern/bg-pattern10.png b/src/assets/images/bg-pattern/bg-pattern10.png new file mode 100755 index 0000000..49f6253 Binary files /dev/null and b/src/assets/images/bg-pattern/bg-pattern10.png differ diff --git a/src/assets/images/bg-pattern/bg-pattern11.png b/src/assets/images/bg-pattern/bg-pattern11.png new file mode 100755 index 0000000..6fe2b28 Binary files /dev/null and b/src/assets/images/bg-pattern/bg-pattern11.png differ diff --git a/src/assets/images/bg-pattern/bg-pattern12.png b/src/assets/images/bg-pattern/bg-pattern12.png new file mode 100755 index 0000000..e07bd3b Binary files /dev/null and b/src/assets/images/bg-pattern/bg-pattern12.png differ diff --git a/src/assets/images/bg-pattern/bg-pattern2.png b/src/assets/images/bg-pattern/bg-pattern2.png new file mode 100755 index 0000000..fd2f959 Binary files /dev/null and b/src/assets/images/bg-pattern/bg-pattern2.png differ diff --git a/src/assets/images/bg-pattern/bg-pattern3.png b/src/assets/images/bg-pattern/bg-pattern3.png new file mode 100755 index 0000000..6b678c8 Binary files /dev/null and b/src/assets/images/bg-pattern/bg-pattern3.png differ diff --git a/src/assets/images/bg-pattern/bg-pattern4.png b/src/assets/images/bg-pattern/bg-pattern4.png new file mode 100755 index 0000000..a18b5e3 Binary files /dev/null and b/src/assets/images/bg-pattern/bg-pattern4.png differ diff --git a/src/assets/images/bg-pattern/bg-pattern5.png b/src/assets/images/bg-pattern/bg-pattern5.png new file mode 100755 index 0000000..657eaf8 Binary files /dev/null and b/src/assets/images/bg-pattern/bg-pattern5.png differ diff --git a/src/assets/images/bg-pattern/bg-pattern6.png b/src/assets/images/bg-pattern/bg-pattern6.png new file mode 100755 index 0000000..47c549d Binary files /dev/null and b/src/assets/images/bg-pattern/bg-pattern6.png differ diff --git a/src/assets/images/bg-pattern/bg-pattern7.png b/src/assets/images/bg-pattern/bg-pattern7.png new file mode 100755 index 0000000..369ef17 Binary files /dev/null and b/src/assets/images/bg-pattern/bg-pattern7.png differ diff --git a/src/assets/images/bg-pattern/bg-pattern8.png b/src/assets/images/bg-pattern/bg-pattern8.png new file mode 100755 index 0000000..829e168 Binary files /dev/null and b/src/assets/images/bg-pattern/bg-pattern8.png differ diff --git a/src/assets/images/bg-pattern/bg-pattern9.png b/src/assets/images/bg-pattern/bg-pattern9.png new file mode 100755 index 0000000..408ba8b Binary files /dev/null and b/src/assets/images/bg-pattern/bg-pattern9.png differ diff --git a/src/assets/images/bg-pattern/logo_x_pattern.png b/src/assets/images/bg-pattern/logo_x_pattern.png new file mode 100644 index 0000000..fd419b0 Binary files /dev/null and b/src/assets/images/bg-pattern/logo_x_pattern.png differ diff --git a/src/assets/images/g1.jpg b/src/assets/images/g1.jpg new file mode 100644 index 0000000..50bd5b3 Binary files /dev/null and b/src/assets/images/g1.jpg differ diff --git a/src/assets/images/home.png b/src/assets/images/home.png new file mode 100644 index 0000000..e11da58 Binary files /dev/null and b/src/assets/images/home.png differ diff --git a/src/assets/images/ic_account_circle_white_48dp_1x.png b/src/assets/images/ic_account_circle_white_48dp_1x.png new file mode 100644 index 0000000..246e0c8 Binary files /dev/null and b/src/assets/images/ic_account_circle_white_48dp_1x.png differ diff --git a/src/assets/images/prius.jpg b/src/assets/images/prius.jpg new file mode 100644 index 0000000..92752aa Binary files /dev/null and b/src/assets/images/prius.jpg differ diff --git a/src/assets/images/prius1.png b/src/assets/images/prius1.png new file mode 100644 index 0000000..5ec4d5b Binary files /dev/null and b/src/assets/images/prius1.png differ diff --git a/src/assets/images/prius2.png b/src/assets/images/prius2.png new file mode 100644 index 0000000..423c701 Binary files /dev/null and b/src/assets/images/prius2.png differ diff --git a/src/assets/images/provider_pin.png b/src/assets/images/provider_pin.png new file mode 100644 index 0000000..b072f21 Binary files /dev/null and b/src/assets/images/provider_pin.png differ diff --git a/src/assets/react.svg b/src/assets/react.svg new file mode 100644 index 0000000..b384dd0 --- /dev/null +++ b/src/assets/react.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/client.js b/src/client.js new file mode 100644 index 0000000..a71a334 --- /dev/null +++ b/src/client.js @@ -0,0 +1,88 @@ +/* globals window, document */ +/* eslint react/jsx-filename-extension: "off" */ +import React from 'react'; +import { render } from 'react-dom'; +import { createStore, applyMiddleware } from 'redux'; +import { Provider } from 'react-redux'; +import { Router, hashHistory, browserHistory } from 'react-router'; +import { syncHistoryWithStore, routerMiddleware } from 'react-router-redux'; +import reducers from './reducers'; +import Instance from './components/Connection'; + +const middleware = routerMiddleware(hashHistory); +const store = createStore( + reducers, + applyMiddleware(middleware), +); + +window.localStorage.setItem('App', '8a266a40-ed2e-4be2-bdfc-459a507bf02e'); + +// instance.post('/v1/authenticate/portal', { +// email: 'carlos@brighterdevelopment.com', +// pass: 'VGVzdDIwMTc=', +// }).then(function (res) { localStorage.setItem('Token', res.data.token) }); +const history = syncHistoryWithStore(hashHistory, store); + +const isFunction = (functionToCheck) => { + const getType = {}; + return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]'; +}; + +const requireAuth = (nextState, replace, next) => { + if (nextState.location.pathname === '/login' || nextState.location.pathname === '/sign-up' || (nextState.location.pathname.indexOf('/ride') > -1 && nextState.params.ride_uuid !== undefined && nextState.params.user_uuid !== undefined) + || (!isFunction(replace) && (replace.location.pathname === '/login' || replace.location.pathname === '/sign-up' || (replace.location.pathname.indexOf('/ride') > -1 && replace.params.ride_uuid !== undefined && replace.params.user_uuid !== undefined)))) { + next(); + } + + const token = Instance.getCookie('token'); + if (!token || token === null || token === undefined || token === '') { + if (isFunction(replace)) { + replace('/login'); + } else { + browserHistory.transitionTo('/login'); + } + } + next(); +}; + +function scrollToTop() { + window.scrollTo(0, 0); +} + +const rootRoute = { + childRoutes: [{ + path: '/', + onChange: requireAuth, + onEnter: requireAuth, + component: require('./containers/App'), + indexRoute: { onEnter: (nextState, replace) => replace('/app/table/rides') }, + childRoutes: [ + require('./routes/app'), + require('./routes/404'), + require('./routes/500'), + require('./routes/confirmEmail'), + require('./routes/forgotPassword'), + require('./routes/lockScreen'), + require('./routes/login'), + require('./routes/signUp'), + require('./routes/fullscreen'), + require('./routes/ride'), + require('./routes/ready'), + { + path: '*', + indexRoute: { onEnter: (nextState, replace) => replace('/404') }, + }, + ], + }], +}; + +render( + + + , + document.getElementById('app-container'), +); diff --git a/src/components/Connection/index.js b/src/components/Connection/index.js new file mode 100644 index 0000000..bb5e14f --- /dev/null +++ b/src/components/Connection/index.js @@ -0,0 +1,86 @@ +/* global document, window */ + +const axios = require('axios'); + +const Instance = () => { + const apiUrl = process.env.NODE_ENV === 'production' + ? 'https://portal-api.bcbsinstitute.com' + : 'https://portal-api.dev.bcbsinstitute.com'; + window.localStorage.setItem('App', '8a266a40-ed2e-4be2-bdfc-459a507bf02e'); + + let instance = axios.create({ + baseURL: apiUrl, + timeout: 60000, + headers: { App: window.localStorage.getItem('App') }, + }); + + const setCookie = (cname, cvalue, date) => { + const d = new Date(date * 1000); + const expires = `expires=${d.toUTCString()}`; + document.cookie = `${cname}=${cvalue};${expires};path=/`; + }; + + const getCookie = (cname) => { + const name = `${cname}=`; + const decodedCookie = decodeURIComponent(document.cookie); + const ca = decodedCookie.split(';'); + for (let i = 0; i < ca.length; i += 1) { + let c = ca[i]; + while (c.charAt(0) === ' ') { + c = c.substring(1); + } + + if (c.indexOf(name) === 0) { + return c.substring(name.length, c.length); + } + } + + return ''; + }; + + const setToken = (token) => { + if (token && token !== null) { + instance = axios.create({ + baseURL: apiUrl, + timeout: 60000, + headers: { App: window.localStorage.getItem('App'), Token: `Bearer ${token}` }, + }); + } else { + instance = axios.create({ + baseURL: apiUrl, + timeout: 60000, + headers: { App: window.localStorage.getItem('App') }, + }); + } + + return instance; + }; + + const getConnection = () => { + const token = getCookie('token'); + return setToken(token); + }; + + const getRawConn = () => { + const token = getCookie('token'); + if (token && token !== null && token !== '') { + return instance; + } + window.location.href = '/#/login'; + return null; + }; + + + const token = getCookie('token'); + instance = setToken(token); + + return { + getCookie, + setCookie, + getConnection, + setToken, + getRawConn, + }; +}; + +export default Instance(); diff --git a/src/components/Footer/index.js b/src/components/Footer/index.js new file mode 100644 index 0000000..1e38a1e --- /dev/null +++ b/src/components/Footer/index.js @@ -0,0 +1,22 @@ +import React from 'react'; +import APPCONFIG from 'constants/Config'; +import { Link } from 'react-router'; + +class Footer extends React.Component { + render() { + return ( +
      +
      + + Copyright©{APPCONFIG.year} {APPCONFIG.brand} + + + + +
      +
      + ); + } +} + +module.exports = Footer; diff --git a/src/components/Header/NavLeftList.js b/src/components/Header/NavLeftList.js new file mode 100644 index 0000000..5b7b3ea --- /dev/null +++ b/src/components/Header/NavLeftList.js @@ -0,0 +1,33 @@ +import React from 'react'; +import IconMenu from 'material-ui/IconMenu'; +import MenuItem from 'material-ui/MenuItem'; +import IconButton from 'material-ui/IconButton/IconButton'; +import { hashHistory } from 'react-router'; +import Divider from 'material-ui/Divider'; +import Badge from 'material-ui/Badge'; +import NotificationsIcon from 'material-ui/svg-icons/social/notifications'; + + +const HeaderIconButtonStyle = { + width: '60px', + height: '60px' +}; + +const listItemStyle = { + paddingLeft: '40px' // 36 + 16, algin with sub list +}; + +class NavLeftList extends React.Component { + + handleChange = (event, value) => { + hashHistory.push(value); + } + + render() { + return ( +
      + ); + } +} + +module.exports = NavLeftList; diff --git a/src/components/Header/NavRightList.js b/src/components/Header/NavRightList.js new file mode 100644 index 0000000..7979607 --- /dev/null +++ b/src/components/Header/NavRightList.js @@ -0,0 +1,80 @@ +import React from 'react'; +import IconMenu from 'material-ui/IconMenu'; +import MenuItem from 'material-ui/MenuItem'; +import IconButton from 'material-ui/IconButton/IconButton'; +import { hashHistory } from 'react-router'; + +const ImgIconButtonStyle = { + width: '60px', + height: '60px' +}; + +const listItemStyle = { + paddingLeft: '50px' // 36 + 16, algin with sub list +}; + +class NavRightList extends React.Component { + constructor(props) { + super(props); + this.props = props; + this.state = { + name: '', + useruuid: '' + } + + this.handleChange = this.handleChange.bind(this); + } + + handleChange = (event, value) => { + hashHistory.push(value); + } + componentDidMount() { + const user = JSON.parse(localStorage.getItem('loggedUser')); + if (user) { + this.setState(Object.assign(this.state, user)); + } + } + + render() { + return ( +
        +
      • + + } + onChange={this.handleChange} + anchorOrigin={{ horizontal: 'right', vertical: 'bottom' }} + targetOrigin={{ horizontal: 'right', vertical: 'top' }} + menuStyle={{ minWidth: '150px' }} + > + this.handleChange(e, `/app/authorizedusers/${this.state.useruuid}`)} + primaryText="Profile" + style={{ fontSize: '14px', lineHeight: '48px' }} + innerDivStyle={listItemStyle} + leftIcon={account_circle} + /> + this.handleChange(e, `/app/form/steppers/${this.state.useruuid}`)} + primaryText="Book Ride" + innerDivStyle={listItemStyle} + style={{ fontSize: '14px', lineHeight: '48px' }} + leftIcon={mode_edit} + /> + this.handleChange(e, `/login`)} + primaryText="Log Out" + innerDivStyle={listItemStyle} + style={{ fontSize: '14px', lineHeight: '48px' }} + leftIcon={forward} + /> + +
      • +
      • {this.state.name}
      • +
      + ); + } +} + +module.exports = NavRightList; diff --git a/src/components/Header/index.js b/src/components/Header/index.js new file mode 100644 index 0000000..680d003 --- /dev/null +++ b/src/components/Header/index.js @@ -0,0 +1,70 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import classnames from 'classnames'; +import { Link } from 'react-router'; +import APPCONFIG from 'constants/Config'; +import NavLeftList from './NavLeftList'; +import NavRightList from './NavRightList'; + + +class Header extends React.Component { + componentDidMount() { + const sidebarToggler = this.sidebarBtn; + const $sidebarToggler = $(sidebarToggler); + const $body = $('#body'); + + $sidebarToggler.on('click', (e) => { + // _sidebar.scss, _page-container.scss + $body.toggleClass('sidebar-mobile-open'); + }); + } + + render() { + const { isFixedHeader, colorOption } = this.props; + + return ( +
      +
      = 0, + 'bg-color-dark': colorOption === '31', + 'bg-color-primary': ['22', '32'].indexOf(colorOption) >= 0, + 'bg-color-success': ['23', '33'].indexOf(colorOption) >= 0, + 'bg-color-info': ['24', '34'].indexOf(colorOption) >= 0, + 'bg-color-warning': ['25', '35'].indexOf(colorOption) >= 0, + 'bg-color-danger': ['26', '36'].indexOf(colorOption) >= 0 + })} + > + + +
      +

      {APPCONFIG.brand}

      +
      + +
      + +
      + +
      + +
      +
      +
      + ); + } +} + + +const mapStateToProps = state => ({ + colorOption: state.settings.colorOption, + isFixedHeader: state.settings.isFixedHeader +}); + +module.exports = connect( + mapStateToProps +)(Header); + diff --git a/src/components/Notifications/index.js b/src/components/Notifications/index.js new file mode 100644 index 0000000..f6c8fa6 --- /dev/null +++ b/src/components/Notifications/index.js @@ -0,0 +1,245 @@ +import 'jquery-slimscroll/jquery.slimscroll.min'; +import React from 'react'; +import APPCONFIG from 'constants/Config'; +import Badge from 'material-ui/Badge'; +import NotificationsIcon from 'material-ui/svg-icons/social/notifications'; +import { Card, CardActions, CardHeader, CardText } from 'material-ui/Card'; +import FlatButton from 'material-ui/FlatButton'; +import { List, ListItem } from 'material-ui/List'; +import Divider from 'material-ui/Divider'; +import Subheader from 'material-ui/Subheader'; +import MapsDirectionsCar from 'material-ui/svg-icons/maps/directions-car'; +import ContactList from '../../routes/app/components/ContactList'; +import Avatar from 'material-ui/Avatar'; +import { grey400, darkBlack, lightBlack } from 'material-ui/styles/colors'; +import IconButton from 'material-ui/IconButton'; +import MoreVertIcon from 'material-ui/svg-icons/navigation/more-vert'; +import IconMenu from 'material-ui/IconMenu'; +import MenuItem from 'material-ui/MenuItem'; +import NavigationChevronRight from 'material-ui/svg-icons/navigation/more-vert'; + +// SocialNotificationsActive + +class Notifications extends React.Component { + constructor(props) { + super(props); + + const socketURL = process.env.NODE_ENV === 'production' + ? 'wss://portal-api.bcbsinstitute.com/v1/notification/ws?id=' + : 'wss://portal-api.dev.bcbsinstitute.com/v1/notification/ws?id=' + + this.props = props; + this.state = { + user: { + useruuid: '', + name: '' + }, + socket_url: socketURL, + notifications: {}, + totalNotifications: 0, + notificationList: [], + }; + this.socket = null; + + this.socketMessageListener = this.socketMessageListener.bind(this); + this.socketOpenListener = this.socketOpenListener.bind(this); + this.socketCloseListener = this.socketCloseListener.bind(this); + this.socketCloseListener = this.socketCloseListener.bind(this); + } + + componentDidMount() { + this.setState(Object.assign(this.state, { user: this.props.user, notifications: [], totalNotifications: 0 })); + if (this.state.user.useruuid && this.state.user.useruuid != '') { + this.setState(Object.assign(this.state, { socket_url: this.state.socket_url + this.state.user.useruuid })); + this.socket = new WebSocket(this.state.socket_url); + + this.socketMessageListener = this.socketMessageListener.bind(this); + this.socketOpenListener = this.socketOpenListener.bind(this); + this.socketCloseListener = this.socketCloseListener.bind(this); + + this.socket.addEventListener('open', this.socketOpenListener); + this.socket.addEventListener('message', this.socketMessageListener); + this.socket.addEventListener('close', this.socketCloseListener); + } + // } + // const quickviewInner = this.quickview; + // $(quickviewInner).slimscroll({ + // height: '100%' + // }); + } + + componentWillReceiveProps(nextProps) { + if (nextProps.user.useruuid !== this.state.user.useruuid) { + if (this.socket) { + this.socket.close(); + } + this.setState(Object.assign(this.state, { user: nextProps.user, notifications: [], totalNotifications: 0 })); + if (this.state.user.useruuid && this.state.user.useruuid != '') { + this.setState(Object.assign(this.state, { socket_url: this.state.socket_url + this.state.user.useruuid })); + this.socket = new WebSocket(this.state.socket_url); + + this.socketMessageListener = this.socketMessageListener.bind(this); + this.socketOpenListener = this.socketOpenListener.bind(this); + this.socketCloseListener = this.socketCloseListener.bind(this); + + this.socket.addEventListener('open', this.socketOpenListener); + this.socket.addEventListener('message', this.socketMessageListener); + this.socket.addEventListener('close', this.socketCloseListener); + } + } + } + + disableNotification(n) { + n.content.type = "disable-notification"; + this.socket.send(JSON.stringify(n)); + this.setState(Object.assign(this.state, { totalNotifications: this.state.totalNotifications-- })); + } + + socketMessageListener(event) { + let n = JSON.parse(event.data); + let notifications = this.state.notifications; + if (notifications[n.nid] === null || notifications[n.nid] === undefined) { + notifications[n.nid] = n; + let notificationList = [] + Object.keys(notifications).map((k) => { + const n = notifications[k]; + switch (n.content.type) { + case 'ride': + const ride = n.content.payload; + const driverPhoneNumber = (ride.driver && ride.driver.phone_number) ? ride.driver.phone_number : ''; + + const rideContactList = { + driverMobile: driverPhoneNumber, + memberMobile: ride.user.phonenumber, + memberEmail: ride.user.email, + schedulerEmail: ride.created_user.email, + schedulerMobile: ride.created_user.phonenumber, + rideID: ride.ride_uuid, + }; + + + + const iconButtonElement = ( + + + + {/* */} + + ); + + const rightIconMenu = ( + + Member + Visits + Ride + Ride Details + + + ); + + notificationList.push( +
      + directions_car} + rightIconButton={rightIconMenu} + primaryText={n.content.subject} + secondaryText={ +

      + {ride.user.name}
      + {n.content.body} +

      + } + secondaryTextLines={2} + /> + +
      + ); + break; + case 'message': + return + notificationList.push( + + } + /> + + {n.content.body} + + + + + ) + break; + } + }) + this.setState(Object.assign(this.state, { notifications: notifications, totalNotifications: this.state.totalNotifications + 1, notificationList: notificationList })); + + if (this.props.onNotificationUpdate) { + this.props.onNotificationUpdate(n, this.state.totalNotifications); + } + + this.forceUpdate(); + } + } + + socketOpenListener(event) { + console.log('Connected for the ID: ' + this.state.user.useruuid); + } + + socketCloseListener(event) { + if (this.socket) { + console.error('Disconnected.'); + } + this.socket = new WebSocket(this.state.socket_url); + + this.socketMessageListener = this.socketMessageListener.bind(this); + this.socketOpenListener = this.socketOpenListener.bind(this); + this.socketCloseListener = this.socketCloseListener.bind(this); + + this.socket.addEventListener('open', this.socketOpenListener); + this.socket.addEventListener('message', this.socketMessageListener); + this.socket.addEventListener('close', this.socketCloseListener); + } + + toggleCustomizer = () => { + const $body = $('#body'); + $body.toggleClass('quickview-open-customizer'); + } + + closeCustomizer = () => { + const $body = $('#body'); + $body.removeClass('quickview-open-customizer'); + } + + render() { + return ( +
      + + + + + + + Today + {this.state.notificationList} + +
      + ); + } +} + +module.exports = Notifications; diff --git a/src/components/ReactECharts/index.js b/src/components/ReactECharts/index.js new file mode 100644 index 0000000..439011e --- /dev/null +++ b/src/components/ReactECharts/index.js @@ -0,0 +1,106 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import echarts from 'echarts'; +import 'echarts/theme/macarons'; + +import elementResizeEvent from 'element-resize-event'; + +class ReactEcharts extends React.Component { + propTypes: { + option: PropTypes.object.isRequired, + notMerge: PropTypes.bool, + lazyUpdate: PropTypes.bool, + style: PropTypes.object, + className: PropTypes.string, + theme: PropTypes.string, + onChartReady: PropTypes.func, + showLoading: PropTypes.bool, + loadingOption: PropTypes.object, + onEvents: PropTypes.object + } + + // first add + componentDidMount() { + const echartObj = this.renderEchartDom(); + const onEvents = this.props.onEvents || {}; + let reizeEvent; + + this.bindEvents(echartObj, onEvents); + // on chart ready + if (typeof this.props.onChartReady === 'function') this.props.onChartReady(echartObj); + + function resize() { + clearTimeout(reizeEvent); + reizeEvent = setTimeout(() => { echartObj.resize(); }, 200); + } + + // on resize + elementResizeEvent(this.echartsDom, () => { + resize(); + }); + } + + // update + componentDidUpdate() { + this.renderEchartDom(); + this.bindEvents(this.getEchartsInstance(), this.props.onEvents || []); + } + + // remove + componentWillUnmount() { + echarts.dispose(this.echartsDom); + } + + // bind the events + bindEvents(instance, events) { + const loop = function loop(eventName) { + // ignore the event config which not satisfy + if (typeof eventName === 'string' && typeof events[eventName] === 'function') { + // binding event + instance.off(eventName); + instance.on(eventName, (param) => { + events[eventName](param, instance); + }); + } + }; + + for (const eventName in events) { + loop(eventName); + } + + } + + // render the dom + renderEchartDom() { + // init the echart object + const echartObj = this.getEchartsInstance(); + // set the echart option + echartObj.setOption(this.props.option, this.props.notMerge || false, this.props.lazyUpdate || false); + // set loading mask + if (this.props.showLoading) echartObj.showLoading(this.props.loadingOption || null); + else echartObj.hideLoading(); + + return echartObj; + } + + getEchartsInstance() { + // return the echart object + const theme = this.props.theme ? this.props.theme : 'macarons'; + return echarts.getInstanceByDom(this.echartsDom) || echarts.init(this.echartsDom, theme); + } + + render() { + const style = this.props.style || { + height: '350px' + }; + // for render + return ( +
      { this.echartsDom = c; }} + className={this.props.className} + style={style} /> + ); + } +} + +module.exports = ReactEcharts; diff --git a/src/components/Shared/Notification.js b/src/components/Shared/Notification.js new file mode 100644 index 0000000..507a69a --- /dev/null +++ b/src/components/Shared/Notification.js @@ -0,0 +1,297 @@ +import React, { Component } from 'react' +import Message from 'material-ui/svg-icons/communication/message'; +import ReactMaterialUiNotifications from 'react-materialui-notifications'; +import moment from 'moment'; +import { deepOrange500 } from 'material-ui/styles/colors'; +import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; +import getMuiTheme from 'material-ui/styles/getMuiTheme'; +import lightTheme from '../../containers/themes/lightTheme'; +import darkTheme from '../../containers/themes/darkTheme'; +import grayTheme from '../../containers/themes/grayTheme'; + +import PropTypes from 'prop-types'; +import FontIcon from 'material-ui/FontIcon'; +import { indigo500 } from 'material-ui/styles/colors'; +import Paper from 'material-ui/Paper'; +import MapsDirectionsCar from 'material-ui/svg-icons/maps/directions-car'; + +import ContactList from '../../routes/app/components/ContactList'; + +const nearbyIcon = perm phone msg; + +const paperStyle = { + height: 240, + width: 270, + margin: 10, + textAlign: 'center', + display: 'inline-block', + position: 'relative' +}; + +const styles = { + appbar: { + textAlign: 'left' + }, + buttonContainer: { + display: 'flex', + justifyContent: 'space-around' + }, + footer: { + marginTop: 15, + width: 'calc(100% - 30px)', + fontSize: 16, + padding: 15, + backgroundColor: '#fff' + }, + logo: { + width: 48 + }, + paper: { + width: '100%', + textAlign: 'left', + marginBottom: 15, + padding: 15, + fontSize: 18 + }, + rightIcon: { + width: 36, + height: 36, + fill: '#fff' + }, + table: { + marginTop: 15 + }, + headerStyle: { + tableLayout: 'auto' + }, + table1Col1: { + width: 137 + }, + table1Col2: { + width: 72 + }, + table1Col3: { + width: 128 + }, + table1Col2C: { + width: 72, + }, + table2Col3: { + width: 36 + } +}; + +export default class Notification extends React.Component { + constructor(props) { + super(props); + + const socketURL = process.env.NODE_ENV === 'production' + ? 'wss://portal-api.bcbsinstitute.com/v1/notification/ws?id=' + : 'wss://portal-api.dev.bcbsinstitute.com/v1/notification/ws?id=' + + this.props = props; + this.state = { + user: { + useruuid: '', + name: '' + }, + socket_url: socketURL, + notifications: {}, + totalNotifications: 0 + }; + this.socket = null; + + this.socketMessageListener = this.socketMessageListener.bind(this); + this.socketOpenListener = this.socketOpenListener.bind(this); + this.socketCloseListener = this.socketCloseListener.bind(this); + this.socketCloseListener = this.socketCloseListener.bind(this); + } + + componentDidMount() { + this.setState(Object.assign(this.state, { user: this.props.user, notifications: [], totalNotifications: 0 })); + if (this.state.user.useruuid && this.state.user.useruuid != '') { + this.setState(Object.assign(this.state, { socket_url: this.state.socket_url + this.state.user.useruuid })); + this.socket = new WebSocket(this.state.socket_url); + + this.socketMessageListener = this.socketMessageListener.bind(this); + this.socketOpenListener = this.socketOpenListener.bind(this); + this.socketCloseListener = this.socketCloseListener.bind(this); + + this.socket.addEventListener('open', this.socketOpenListener); + this.socket.addEventListener('message', this.socketMessageListener); + this.socket.addEventListener('close', this.socketCloseListener); + } + } + + componentWillReceiveProps(nextProps) { + if (nextProps.user.useruuid !== this.state.user.useruuid) { + if (this.socket) { + this.socket.close(); + } + this.setState(Object.assign(this.state, { user: nextProps.user, notifications: [], totalNotifications: 0 })); + if (this.state.user.useruuid && this.state.user.useruuid != '') { + this.setState(Object.assign(this.state, { socket_url: this.state.socket_url + this.state.user.useruuid })); + this.socket = new WebSocket(this.state.socket_url); + + this.socketMessageListener = this.socketMessageListener.bind(this); + this.socketOpenListener = this.socketOpenListener.bind(this); + this.socketCloseListener = this.socketCloseListener.bind(this); + + this.socket.addEventListener('open', this.socketOpenListener); + this.socket.addEventListener('message', this.socketMessageListener); + this.socket.addEventListener('close', this.socketCloseListener); + } + } + } + + disableNotification(n) { + n.content.type = "disable-notification"; + this.socket.send(JSON.stringify(n)); + this.setState(Object.assign(this.state, { totalNotifications: this.state.totalNotifications-- })); + } + + + socketMessageListener(event) { + let n = JSON.parse(event.data); + + let notifications = this.state.notifications; + if (notifications[n.nid] === null || notifications[n.nid] === undefined) { + switch (n.content.type) { + case 'ride': + const ride = n.content.payload; + const driverPhoneNumber = (ride.driver && ride.driver.phone_number) ? ride.driver.phone_number : ''; + + const rideContactList = { + driverMobile: driverPhoneNumber, + memberMobile: ride.user.phonenumber, + memberEmail: ride.user.email, + schedulerEmail: ride.created_user.email, + schedulerMobile: ride.created_user.phonenumber, + rideID: ride.ride_uuid, + } + + ReactMaterialUiNotifications.showNotification({ + title: n.content.subject, + additionalText: n.content.payload.user.name, + priority: true, + icon: , + // icon: , + iconBadgeColor: indigo500, + personalized: true, + timestamp: moment(n.date).format('ddd, MMMM DD, hh:mm A'), + onClick: () => { this.disableNotification(n); }, + overflowContent: +
      +
      +
      + {n.content.body} +

      + Member | + Visits | + Ride | + Ride Details | + + +

      + +
      +
      +
      +
      +
      , + }); + if (this.props.onRideUpdate) { + this.props.onRideUpdate(n.content.payload); + } + break; + case 'message': + ReactMaterialUiNotifications.showNotification({ + title: `Message Received`, + additionalText: n.content.payload.user.name, + priority: true, + icon: , + iconBadgeColor: deepOrange500, + personalized: true, + avatar: '/assets/images/ic_account_circle_white_48dp_1x.png', + timestamp: moment(n.date).format('ddd, MMMM DD, hh:mm A'), + onClick: () => { this.disableNotification(n); }, + overflowContent: +
      +
      + {n.content.body} +
      +
      + +
      + +
      + }); + break; + } + notifications[n.nid] = n; + this.setState(Object.assign(this.state, { notifications: notifications, totalNotifications: this.state.totalNotifications++ })); + + if (this.props.onNotificationUpdate) { + this.props.onNotificationUpdate(n, this.state.totalNotifications); + } + + this.forceUpdate(); + } + } + + socketOpenListener(event) { + console.log('Connected for the ID: ' + this.state.user.useruuid); + } + + socketCloseListener(event) { + if (this.socket) { + console.error('Disconnected.'); + } + this.socket = new WebSocket(this.state.socket_url); + + this.socketMessageListener = this.socketMessageListener.bind(this); + this.socketOpenListener = this.socketOpenListener.bind(this); + this.socketCloseListener = this.socketCloseListener.bind(this); + + this.socket.addEventListener('open', this.socketOpenListener); + this.socket.addEventListener('message', this.socketMessageListener); + this.socket.addEventListener('close', this.socketCloseListener); + } + + render() { + const { layoutBoxed, navCollapsed, navBehind, fixedHeader, sidebarWidth, theme } = this.props; + let materialUITheme; + switch (theme) { + case 'gray': + materialUITheme = grayTheme; + break; + case 'dark': + materialUITheme = darkTheme; + break; + default: + materialUITheme = lightTheme; + } + + return ( + + + + ); + } +} + +Notification.propTypes = { + user: PropTypes.object.isRequired, + onRideUpdate: PropTypes.func, + onNotificationUpdate: PropTypes.func, +} diff --git a/src/components/Shared/index.js b/src/components/Shared/index.js new file mode 100644 index 0000000..e69de29 diff --git a/src/components/Sidenav/SidenavContent.js b/src/components/Sidenav/SidenavContent.js new file mode 100644 index 0000000..eec00f4 --- /dev/null +++ b/src/components/Sidenav/SidenavContent.js @@ -0,0 +1,155 @@ +import React from 'react'; +import { Link, hashHistory } from 'react-router'; +import FlatButton from 'material-ui/FlatButton'; +import 'jquery-slimscroll/jquery.slimscroll.min'; + +import { + loggedUser, + planScheduler, + providerScheduler, +} from 'utils/authorization'; + +class SidebarContent extends React.Component { + state = { + user: { + user_uuid: '', + }, + } + + componentDidMount() { + const nav = this.nav; + const $nav = $(nav); + + // scroll + $nav.slimscroll({ + height: '100%' + }); + + // Append icon to submenu + // Append to child `div` + $nav.find('.prepend-icon').children('div').prepend('keyboard_arrow_right'); + + // AccordionNav + const slideTime = 250; + const $lists = $nav.find('ul').parent('li'); + $lists.append('arrow_drop_down'); + const $As = $lists.children('a'); + + // Disable A link that has ul + $As.on('click', event => event.preventDefault()); + + // Accordion nav + $nav.on('click', (e) => { + const target = e.target; + const $parentLi = $(target).closest('li'); // closest, insead of parent, so it still works when click on i icons + if (!$parentLi.length) return; // return if doesn't click on li + const $subUl = $parentLi.children('ul'); + + // let depth = $subUl.parents().length; // but some li has no sub ul, so... + const depth = $parentLi.parents().length + 1; + + // filter out all elements (except target) at current depth or greater + const allAtDepth = $nav.find('ul').filter(function () { + if ($(this).parents().length >= depth && this !== $subUl.get(0)) { + return true; + } + return false; + }); + + allAtDepth.slideUp(slideTime).closest('li').removeClass('open'); + + // Toggle target + if ($parentLi.has('ul').length) { + $parentLi.toggleClass('open'); + } + + $subUl.stop().slideToggle(slideTime); + }); + + + // HighlightActiveItems + const $links = $nav.find('a'); + const currentLocation = hashHistory.getCurrentLocation(); + function highlightActive(pathname) { + const path = `#${pathname}`; + + $links.each((i, link) => { + const $link = $(link); + const $li = $link.parent('li'); + const href = $link.attr('href'); + // console.log(href); + + if ($li.hasClass('active')) { + $li.removeClass('active'); + } + if (path.indexOf(href) === 0) { + $li.addClass('active'); + } + }); + } + highlightActive(currentLocation.pathname); + hashHistory.listen((location) => { + highlightActive(location.pathname); + }); + + const user = JSON.parse(localStorage.getItem('loggedUser')); + if (user) { + this.setState(Object.assign(this.state, { user: user })); + } + } + render() { + + return ( +
        { this.nav = c; }}> +
      • + directions_carRides +
          +
        • Book Rides
        • +
        • Manage Rides
        • +
        +
      • +
      • + people_outlineMembers +
          +
        • Verify Eligibility
        • +
        • Manage Members
        • +
        +
      • + +
      • + scheduleVisits +
      • + {/*
      • + mail_outlineMessage Center +
      • */} + +
      • + settingsManage +
          + {!loggedUser.anyOf(planScheduler, providerScheduler) && +
        • + peopleAuthorized Users +
        • + } +
        • + assignmentOrganizations +
        • +
        • + local_hospitalParticipating Providers +
        • +
        • + account_circleProfile +
        • + {/*
        • + equalizerReports +
        • */} +
        +
      • + +
      • +
      + ); + } +} + +module.exports = SidebarContent; diff --git a/src/components/Sidenav/index.js b/src/components/Sidenav/index.js new file mode 100644 index 0000000..34a8f81 --- /dev/null +++ b/src/components/Sidenav/index.js @@ -0,0 +1,107 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import classnames from 'classnames'; +import { Link, hashHistory } from 'react-router'; +import APPCONFIG from 'constants/Config'; +import { + toggleCollapsedNav +} from '../../actions'; +import SidenavContent from './SidenavContent'; + +class Sidebar extends React.Component { + + componentDidMount() { + // AutoCloseMobileNav + const $body = $('#body'); + + if (APPCONFIG.AutoCloseMobileNav) { + hashHistory.listen((location) => { + setTimeout(() => { + $body.removeClass('sidebar-mobile-open'); + }, 0); + }); + } + } + + onToggleCollapsedNav = (e) => { + const val = !this.props.navCollapsed; + const { handleToggleCollapsedNav } = this.props; + handleToggleCollapsedNav(val); + } + + render() { + const { navCollapsed, colorOption } = this.props; + let toggleIcon = null; + if (navCollapsed) { + toggleIcon = radio_button_unchecked; + } else { + toggleIcon = radio_button_checked; + } + + return ( + + ); + } +} + +const mapStateToProps = state => ({ + navCollapsed: state.settings.navCollapsed, + colorOption: state.settings.colorOption +}); + +const mapDispatchToProps = dispatch => ({ + handleToggleCollapsedNav: (isNavCollapsed) => { + dispatch(toggleCollapsedNav(isNavCollapsed)); + }, +}); + +module.exports = connect( + mapStateToProps, + mapDispatchToProps +)(Sidebar); + diff --git a/src/constants/ActionTypes.js b/src/constants/ActionTypes.js new file mode 100644 index 0000000..6e0bda8 --- /dev/null +++ b/src/constants/ActionTypes.js @@ -0,0 +1,7 @@ +export const TOGGLE_BOXED_LAYOUT = 'TOGGLE_BOXED_LAYOUT'; +export const TOGGLE_COLLAPSED_NAV = 'TOGGLE_COLLAPSED_NAV'; +export const TOGGLE_NAV_BEHIND = 'TOGGLE_NAV_BEHIND'; +export const TOGGLE_FIXED_HEADER = 'TOGGLE_FIXED_HEADER'; +export const CHANGE_SIDEBAR_WIDTH = 'CHANGE_SIDEBAR_WIDTH'; +export const CHANGE_COLOR_OPTION = 'CHANGE_COLOR_OPTION'; +export const CHANGE_THEME = 'CHANGE_THEME'; diff --git a/src/constants/ChartConfig.js b/src/constants/ChartConfig.js new file mode 100644 index 0000000..0b2852f --- /dev/null +++ b/src/constants/ChartConfig.js @@ -0,0 +1,16 @@ +const CHARTCONFIG = { + color: { + primary: 'rgba(33,150,243,.85)', // #0099CC + success: 'rgba(102,187,106,.85)', // #66BB6A + info: 'rgba(0,188,212,.85)', // #00BCD4 + infoAlt: 'rgba(126,87,194,.85)', // #7E57C2 + warning: 'rgba(255,202,40,.85)', // #FFCA28 + danger: 'rgba(233,75,59,.85)', // #E94B3B + gray: 'rgba(221,221,221,.3)', + text: '#898989', // for dark theme as well + splitLine: 'rgba(0,0,0,.05)', + splitArea: ['rgba(250,250,250,0.035)', 'rgba(200,200,200,0.1)'], + } +}; + +module.exports = CHARTCONFIG; diff --git a/src/constants/Config.js b/src/constants/Config.js new file mode 100644 index 0000000..66abd7a --- /dev/null +++ b/src/constants/Config.js @@ -0,0 +1,31 @@ +const date = new Date(); +const year = date.getFullYear(); + +const APPCONFIG = { + brand: 'CHM Hub®', + user: 'Michael', + year, + productLink: 'portal.bdctest.com', + AutoCloseMobileNav: true, // true, false. Automatically close sidenav on route change (Mobile only) + color: { + primary: '#00BCD4', + success: '#8BC34A', + info: '#66BB6A', + infoAlt: '#7E57C2', + warning: '#FFCA28', + danger: '#F44336', + text: '#3D4051', + gray: '#EDF0F1' + }, + settings: { + layoutBoxed: false, // true, false + navCollapsed: false, // true, false + navBehind: false, // true, false + fixedHeader: true, // true, false + sidebarWidth: 'middle', // small, middle, large + colorOption: '32', // String: 11,12,13,14,15,16; 21,22,23,24,25,26; 31,32,33,34,35,36 + theme: 'light', // light, gray, dark + } +}; + +module.exports = APPCONFIG; diff --git a/src/containers/App.js b/src/containers/App.js new file mode 100644 index 0000000..3f2c8c2 --- /dev/null +++ b/src/containers/App.js @@ -0,0 +1,76 @@ +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import classnames from 'classnames'; +import injectTapEventPlugin from 'react-tap-event-plugin'; +import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; +import getMuiTheme from 'material-ui/styles/getMuiTheme'; + +// = styles = +// 3rd +import 'styles/bootstrap.scss'; +// custom +import 'styles/layout.scss'; +import 'styles/theme.scss'; +import 'styles/ui.scss'; +import 'styles/app.scss'; + +import lightTheme from './themes/lightTheme'; +import darkTheme from './themes/darkTheme'; +import grayTheme from './themes/grayTheme'; + + +injectTapEventPlugin(); // Needed for onTouchTap for Material UI + + +class App extends Component { + componentDidMount() {} + + render() { + const { layoutBoxed, navCollapsed, navBehind, fixedHeader, sidebarWidth, theme } = this.props; + let materialUITheme; + switch (theme) { + case 'gray': + materialUITheme = grayTheme; + break; + case 'dark': + materialUITheme = darkTheme; + break; + default: + materialUITheme = lightTheme; + } + + return ( + +
      +
      +
      + {this.props.children} +
      +
      +
      + ); + } +} + +const mapStateToProps = (state, ownProps) => ({ + layoutBoxed: state.settings.layoutBoxed, + navCollapsed: state.settings.navCollapsed, + navBehind: state.settings.navBehind, + fixedHeader: state.settings.fixedHeader, + sidebarWidth: state.settings.sidebarWidth, + theme: state.settings.theme, +}); + +module.exports = connect( + mapStateToProps +)(App); diff --git a/src/containers/themes/darkTheme.js b/src/containers/themes/darkTheme.js new file mode 100644 index 0000000..081d30f --- /dev/null +++ b/src/containers/themes/darkTheme.js @@ -0,0 +1,33 @@ +import { + cyan700, + grey600, + green600, green400, green200, + fullWhite, +} from 'material-ui/styles/colors'; +import {fade} from 'material-ui/utils/colorManipulator'; +import spacing from 'material-ui/styles/spacing'; + +// $dark: #333C44 !default; // darken Blue 100 > #343E46 +// $theme_dark_text_color: rgba(255,255,255,.7); + +export default { + spacing, + fontFamily: 'Roboto, sans-serif', + borderRadius: 2, + palette: { + primary1Color: cyan700, + primary2Color: cyan700, + primary3Color: grey600, + accent1Color: green600, + accent2Color: green400, + accent3Color: green200, + textColor: 'rgba(255,255,255,.7)', + secondaryTextColor: fade(fullWhite, 0.54), + alternateTextColor: '#333C44', + canvasColor: '#333C44', + borderColor: fade(fullWhite, 0.15), + disabledColor: fade(fullWhite, 0.3), + pickerHeaderColor: fade(fullWhite, 0.12), + clockCircleColor: fade(fullWhite, 0.12), + }, +}; diff --git a/src/containers/themes/grayTheme.js b/src/containers/themes/grayTheme.js new file mode 100644 index 0000000..a8b428e --- /dev/null +++ b/src/containers/themes/grayTheme.js @@ -0,0 +1,33 @@ +import { + cyan700, + grey600, + green600, green200, green400, + fullWhite, +} from 'material-ui/styles/colors'; +import {fade} from 'material-ui/utils/colorManipulator'; +import spacing from 'material-ui/styles/spacing'; + +// $theme_gray_sidebar_bg_color: grayscale($theme_dark_sidebar_bg_color); // or 3c3c3c +// $theme_dark_text_color: rgba(255,255,255,.7); + +export default { + spacing, + fontFamily: 'Roboto, sans-serif', + borderRadius: 2, + palette: { + primary1Color: cyan700, + primary2Color: cyan700, + primary3Color: grey600, + accent1Color: green600, + accent2Color: green400, + accent3Color: green200, + textColor: 'rgba(255,255,255,.7)', + secondaryTextColor: fade(fullWhite, 0.54), + alternateTextColor: '#3c3c3c', + canvasColor: '#3c3c3c', + borderColor: fade(fullWhite, 0.15), + disabledColor: fade(fullWhite, 0.3), + pickerHeaderColor: fade(fullWhite, 0.12), + clockCircleColor: fade(fullWhite, 0.12), + }, +}; diff --git a/src/containers/themes/lightTheme.js b/src/containers/themes/lightTheme.js new file mode 100644 index 0000000..76e52b0 --- /dev/null +++ b/src/containers/themes/lightTheme.js @@ -0,0 +1,36 @@ +import { + cyan500, cyan700, + green400, + grey100, grey300, grey400, grey500, + white, darkBlack, fullBlack, +} from 'material-ui/styles/colors'; +import {fade} from 'material-ui/utils/colorManipulator'; +import spacing from 'material-ui/styles/spacing'; + +/** + * Light Theme is the default theme used in material-ui. It is guaranteed to + * have all theme variables needed for every component. Variables not defined + * in a custom theme will default to these values. + */ +export default { + spacing, + fontFamily: 'Roboto, sans-serif', + borderRadius: 2, + palette: { + primary1Color: cyan500, + primary2Color: cyan700, + primary3Color: grey400, + accent1Color: green400, + accent2Color: grey100, + accent3Color: grey500, + textColor: darkBlack, + secondaryTextColor: fade(darkBlack, 0.54), + alternateTextColor: white, + canvasColor: white, + borderColor: grey300, + disabledColor: fade(darkBlack, 0.3), + pickerHeaderColor: cyan500, + clockCircleColor: fade(darkBlack, 0.07), + shadowColor: fullBlack, + }, +}; diff --git a/src/reducers/index.js b/src/reducers/index.js new file mode 100644 index 0000000..a135246 --- /dev/null +++ b/src/reducers/index.js @@ -0,0 +1,10 @@ +import { combineReducers } from 'redux'; +import { routerReducer } from 'react-router-redux'; +import settings from './settings'; + +const reducers = { + routing: routerReducer, + settings +}; + +module.exports = combineReducers(reducers); diff --git a/src/reducers/settings.js b/src/reducers/settings.js new file mode 100644 index 0000000..9d00cc2 --- /dev/null +++ b/src/reducers/settings.js @@ -0,0 +1,57 @@ +import APPCONFIG from 'constants/Config'; +import { + TOGGLE_BOXED_LAYOUT, + TOGGLE_COLLAPSED_NAV, + TOGGLE_NAV_BEHIND, + TOGGLE_FIXED_HEADER, + CHANGE_SIDEBAR_WIDTH, + CHANGE_COLOR_OPTION, + CHANGE_THEME +} from '../constants/ActionTypes'; + +const initialSettings = APPCONFIG.settings; + +const settings = (state = initialSettings, action) => { + // console.log(action) + switch (action.type) { + case TOGGLE_BOXED_LAYOUT: + return { + ...state, + layoutBoxed: action.isLayoutBoxed + }; + case TOGGLE_COLLAPSED_NAV: + return { + ...state, + navCollapsed: action.isNavCollapsed + }; + case TOGGLE_NAV_BEHIND: + return { + ...state, + navBehind: action.isNavBehind + }; + case TOGGLE_FIXED_HEADER: + return { + ...state, + fixedHeader: action.isFixedHeader + }; + case CHANGE_SIDEBAR_WIDTH: + return { + ...state, + sidebarWidth: action.sidebarWidth + }; + case CHANGE_COLOR_OPTION: + return { + ...state, + colorOption: action.colorOption + }; + case CHANGE_THEME: + return { + ...state, + theme: action.theme + }; + default: + return state; + } +}; + +module.exports = settings; diff --git a/src/routes/404/components/404.js b/src/routes/404/components/404.js new file mode 100644 index 0000000..584b633 --- /dev/null +++ b/src/routes/404/components/404.js @@ -0,0 +1,29 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; + +const Error404 = () => ( +
      +
      +

      404

      +

      Sorry, page not found

      +
      + + +
      +); + +const Page = () => ( +
      + +
      + +
      +
      +
      +); + +module.exports = Page; diff --git a/src/routes/404/index.js b/src/routes/404/index.js new file mode 100644 index 0000000..e9d92cb --- /dev/null +++ b/src/routes/404/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: '404', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/404')); + }); + } +}; diff --git a/src/routes/500/components/500.js b/src/routes/500/components/500.js new file mode 100644 index 0000000..048ac96 --- /dev/null +++ b/src/routes/500/components/500.js @@ -0,0 +1,29 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; + +const Error500 = () => ( +
      +
      +

      500

      +

      Sorry, server goes wrong

      +
      + + +
      +); + +const Page = () => ( +
      + +
      + +
      +
      +
      +); + +module.exports = Page; diff --git a/src/routes/500/index.js b/src/routes/500/index.js new file mode 100644 index 0000000..6d43873 --- /dev/null +++ b/src/routes/500/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: '500', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/500')); + }); + } +}; diff --git a/src/routes/app/components/ContactList.js b/src/routes/app/components/ContactList.js new file mode 100644 index 0000000..3efd016 --- /dev/null +++ b/src/routes/app/components/ContactList.js @@ -0,0 +1,245 @@ +import React, { Component } from 'react'; +import ReactDOM from 'react-dom'; +import PropTypes from 'prop-types'; +import Link from 'react-router'; +import ActionHome from 'material-ui/svg-icons/action/home'; +import ActionWork from 'material-ui/svg-icons/action/work'; +import MapsMyLocation from 'material-ui/svg-icons/maps/my-location'; +import MapsAddLocation from 'material-ui/svg-icons/maps/add-location'; +import MapsNearMe from 'material-ui/svg-icons/maps/near-me'; +import MapsLocalHospital from 'material-ui/svg-icons/maps/local-hospital'; +import MapsLocalPharmacy from 'material-ui/svg-icons/maps/local-pharmacy'; +import AutoComplete from 'material-ui/AutoComplete'; +import { fullWhite } from 'material-ui/styles/colors'; +import Dialog from 'material-ui/Dialog'; +import { List, ListItem, makeSelectable } from 'material-ui/List'; +import TextField from 'material-ui/TextField'; +import Divider from 'material-ui/Divider'; +import ArrowDropRight from 'material-ui/svg-icons/navigation-arrow-drop-right'; +import RaisedButton from 'material-ui/RaisedButton'; +// import FlatButton from 'material-ui/FlatButton'; +import IconButton from 'material-ui/IconButton'; +import Popover from 'material-ui/Popover'; +import CommunicationChatBubble from 'material-ui/svg-icons/communication/chat-bubble'; +import { indigo500 } from 'material-ui/styles/colors'; +import CommunicationEmail from 'material-ui/svg-icons/communication/email'; +import CommunicationTextsms from 'material-ui/svg-icons/communication/textsms'; +import CommunicationCall from 'material-ui/svg-icons/communication/call'; +import Close from 'material-ui/svg-icons/navigation/close'; +import $ from 'jquery'; +import Instance from '../../../components/Connection'; + +export default class ContactList extends React.Component { + constructor(props) { + super(props); + this.props = props; + this.state = { + open: false, + data: { + driverMobile: "", + memberMobile: "", + memberEmail: "", + schedulerEmail: "", + schedulerMobile: "", + rideID: "", + }, + anchorEl: null, + formMode: 'hide', + formDisplay: 'none', + message: '', + }; + this.handleMobileCall = this.handleMobileCall.bind(this); + this.handleMailTo = this.handleMailTo.bind(this); + this.handleSMS = this.handleSMS.bind(this); + this.handleCancelMessage = this.handleCancelMessage.bind(this); + + this.handleClick = this.handleClick.bind(this); + this.handleRequestClose = this.handleRequestClose.bind(this); + this.handleMessage = this.handleMessage.bind(this); + this.handleMessageField = this.handleMessageField.bind(this); + this.handleSend = this.handleSend.bind(this); + } + + + componentDidMount = () => { + const self = this; + if (this.props.data && this.props.data !== null) { + this.setState(Object.assign(this.state, { data: this.props.data })); + } + } + + componentWillReceiveProps = (nextProps) => { + const self = this; + if (nextProps.data && nextProps.data !== null) { + this.setState(Object.assign(this.state, { data: nextProps.data })); + } + } + + handleDriverMessage = (message) => { + const rideID = this.state.data.rideID; + let url = '/v1/nemt/rides/' + rideID + '/message/driver'; + url = encodeURI(url); + Instance.getRawConn().post(url, { message: message }).then(function (res) { + alert('Message Send'); + }).catch(function (err) { + console.error(err); + }); + } + + handleMessage = (message) => { + const rideID = this.state.data.rideID; + let url = '/v1/nemt/rides/' + rideID + '/message'; + url = encodeURI(url); + return Instance.getRawConn().post(url, { message: message }); + } + + handleCancelMessage = () => { + event.preventDefault(); + this.setState(Object.assign(this.state, { formDisplay: 'none', open: false })); + console.log("handleCancelMessage") + }; + + handleMailTo = (event, to, from, subject) => { + event.preventDefault(); + this.setState(Object.assign(this.state, { formMode: subject, formDisplay: 'block' })); + console.log("handleMailTo" + to + from + subject) + }; + + handleMobileCall = (event, to, from, subject) => { + event.preventDefault(); + this.setState(Object.assign(this.state, { formMode: subject, formDisplay: 'none' })); + // window.open("tel:" + this.state.memberMobile ); + window.open("tel:" + to); + + console.log("handleMobileCall" + "to " + to + "from " + from) + }; + + handleSMS = (event, toMobilePhone, fromMobilePhone, subject) => { + event.preventDefault(); + this.setState(Object.assign(this.state, { formMode: subject, formDisplay: 'block', message: '' })); + } + + handleSend = (event, toMobilePhone, fromMobilePhone, subject) => { + event.preventDefault(); + const self = this; + self.handleMessage(self.state.message).then(res => { + alert('Message Sent'); + self.setState(Object.assign(self.state, { formMode: '', formDisplay: 'none', message: '' })); + }).catch(console.error); + }; + + handleClick = (event) => { + event.preventDefault(); + this.setState(Object.assign(this.state, { open: true, anchorEl: event.currentTarget })); + }; + + handleRequestClose = () => { + this.setState(Object.assign(this.state, { formDisplay: 'none' })); + this.setState(Object.assign(this.state, { open: false })); + }; + + handleMessageField = (e) => { + this.setState(Object.assign(this.state, { message: e.target.value })); + } + + render() { + return ( +
      + + Contact + + + +
      + +
      + +
      +
      +
      + + +
      + +
      + + +
      + +
      +
      +

      By clicking Send, you agree to terms and privacy policy

      +
      +
      +
      +
      + +
      + + this.handleMobileCall(e, this.state.data.driverMobile, this.state.data.schedulerMobile, "Call to Driver from Scheduler")} />} + insetChildren={true} + rightIcon={ this.handleSMS(e, this.state.data.driverMobile, this.state.data.schedulerMobile, "SMS to Driver from Scheduler")} />} + primaryText={this.state.data.driverMobile} + secondaryText="Driver" + /> + this.handleMobileCall(e, this.state.data.memberMobile, this.state.data.schedulerMobile, "Call to Member from Scheduler")} />} + insetChildren={true} + rightIcon={ this.handleSMS(e, this.state.data.memberMobile, this.state.data.schedulerMobile, "SMS to Member from Scheduler")} />} + primaryText={this.state.data.memberMobile} + secondaryText="Member" + /> + this.handleMailTo(e, this.state.data.memberEmail, 'no-reply@hcmhub.com', 'Email to Member from Scheduler')} />} + primaryText={this.state.data.memberEmail} + secondaryText="Member" + /> + +
      + +
      +
      + +
      + ); + } +} + +ContactList.PropTypes = { + data: PropTypes.object.isRequired, +} \ No newline at end of file diff --git a/src/routes/app/components/ContactOption.js b/src/routes/app/components/ContactOption.js new file mode 100644 index 0000000..64cf41a --- /dev/null +++ b/src/routes/app/components/ContactOption.js @@ -0,0 +1,105 @@ +import React from 'react'; +import Delete from 'material-ui/svg-icons/action/delete'; +import Create from 'material-ui/svg-icons/content/create'; +import Call from 'material-ui/svg-icons/communication/call'; +import TextSms from 'material-ui/svg-icons/communication/textsms'; +import Mail from 'material-ui/svg-icons/content/mail'; +import IconButton from 'material-ui/IconButton'; +import PropTypes from 'prop-types'; + +const ContactOption = (props) => { + const buttonStyle = { + marginTop: -10 + }; + + const divStyle = { + inlineSize: "max-content" + }; + + const handleRemoveContact = (c) => { + if (props.onContactDeleted) { + props.onContactDeleted(c); + } else { + console.log('onContactDelete is undefined'); + console.log(c); + } + }; + + const handleUpdateContact = (c) => { + if (props.onContactUpdated) { + props.onContactUpdated(c); + } else { + console.log('onContactUpdate is undefined'); + console.log(c); + } + }; + + const handleCustomAction = (c) => { + console.log('This is a custom action: ', c); + + if (props.onCustomAction) { + props.onCustomAction(c); + } else { + console.log('onCustomAction is undefined'); + console.log(c); + } + } + + let deleteButton = null + if (props.showDelete) { + deleteButton = ( handleRemoveContact(props.contact)} style={buttonStyle}>); + } + + let updateButton = null; + if (props.showEdit) { + updateButton = ( handleUpdateContact(props.contact)} style={buttonStyle}>); + } + + const actionButton = []; + if (props.showAction && props.contact.type.key) { + switch (props.contact.type.key) { + case "phone": + case "landline": + actionButton.push( handleCustomAction(props.contact)} style={buttonStyle}>); + break; + case "mobile": + case "sms": + actionButton.push( handleCustomAction(props.contact)} style={buttonStyle}>); + actionButton.push( handleCustomAction(props.contact)} style={buttonStyle}>); + break; + case "email": + actionButton.push( handleCustomAction(props.contact)} style={buttonStyle}>); + break; + } + } + + return ( +
      + {deleteButton} + {updateButton} + {actionButton} +
      + ); +}; + +ContactOption.propTypes = { + contact: PropTypes.object.isRequired, + showEdit: PropTypes.bool, + showDelete: PropTypes.bool, + showAction: PropTypes.bool, + showName: PropTypes.bool, + showDescription: PropTypes.bool, + onContactDeleted: PropTypes.func, + onContactUpdated: PropTypes.func, + onCustomAction: PropTypes.func, +}; + +ContactOption.defaultProps = { + showEdit: true, + showDelete: true, + showName: true, + showDescription: true, + showAction: true, +}; + +module.exports = ContactOption; diff --git a/src/routes/app/components/Geolocation.js b/src/routes/app/components/Geolocation.js new file mode 100644 index 0000000..e1355f3 --- /dev/null +++ b/src/routes/app/components/Geolocation.js @@ -0,0 +1,65 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +const GeolocationService = function () { + let watcherID; + let initTime; + + const init = () => { + if (navigator.geolocation) { + stop(); + initTime = new Date(); + watcherID = navigator.geolocation.watchPosition(geoLocationSuccess, geoLocationError, geoLocationOption()); + // console.log(`Start finding location: Watcher ID (${watcherID})`); + } + }; + + const geoLocationSuccess = (position) => { + const seconds = (new Date().getTime() - initTime.getTime()) / 1000; + + // console.log(`Current Position (took ${seconds}s): `); + localStorage.setItem('currentLocation', JSON.stringify({ lat: position.coords.latitude, long: position.coords.longitude })); + + initTime = new Date(); + }; + + const geoLocationError = (error) => { + console.error('Error to get position: ', error); + // init(); + }; + + const geoLocationOption = () => { + return { + enableHighAccuracy: true, + }; + }; + + const getCoordinates = () => { + const currentLocation = localStorage.getItem('currentLocation'); + if (currentLocation) { + let geo = JSON.parse(currentLocation); + if (!geo.lat || !geo.long) { + return { lat: 41.819078, long: -87.623129 }; + } else { + return geo; + } + } else { + return { lat: 41.819078, long: -87.623129 }; + }; + }; + + const stop = () => { + if (watcherID) { + navigator.geolocation.clearWatch(watcherID); + } + }; + + init(); + + return { + Stop: stop, + GetCoordinates: getCoordinates, + }; +}(); + +module.exports = GeolocationService; diff --git a/src/routes/app/components/MainApp.js b/src/routes/app/components/MainApp.js new file mode 100644 index 0000000..6b79472 --- /dev/null +++ b/src/routes/app/components/MainApp.js @@ -0,0 +1,63 @@ +import React from 'react'; +import Header from 'components/Header'; +import Sidenav from 'components/Sidenav'; +import Footer from 'components/Footer'; +import Notifications from 'components/Notifications'; +import Notification from 'components/Shared/Notification'; +import GeolocationService from './Geolocation'; + +class MainApp extends React.Component { + constructor(props) { + super(props); + this.props = props; + this.state = { + user: { + useruuid: '', + name: '' + } + } + + this.handleRide = this.handleRide.bind(this); + } + + componentDidMount() { + const user = JSON.parse(localStorage.getItem('loggedUser')); + if (user) { + this.setState(Object.assign(this.state, { user: user })); + } + } + + handleRide(ride) { + if (this.props.onRideUpdate) { + this.props.onRideUpdate(ride); + } + } + + render() { + const { children, location } = this.props; + + return ( +
      + + +
      +
      + +
      +
      +
      + {children} +
      +
      + +
      +
      +
      + + {/* */} +
      + ); + } +} + +module.exports = MainApp; diff --git a/src/routes/app/components/NEMTLocation.js b/src/routes/app/components/NEMTLocation.js new file mode 100644 index 0000000..0b6e7dc --- /dev/null +++ b/src/routes/app/components/NEMTLocation.js @@ -0,0 +1,1196 @@ +import React, { Component } from 'react'; +import ReactDOM from 'react-dom'; +import PropTypes from 'prop-types'; +import Link from 'react-router'; +import ActionHome from 'material-ui/svg-icons/action/home'; +import ActionWork from 'material-ui/svg-icons/action/work'; +import MapsMyLocation from 'material-ui/svg-icons/maps/my-location'; +import MapsAddLocation from 'material-ui/svg-icons/maps/add-location'; +import MapsNearMe from 'material-ui/svg-icons/maps/near-me'; +import MapsLocalHospital from 'material-ui/svg-icons/maps/local-hospital'; +import MapsLocalPharmacy from 'material-ui/svg-icons/maps/local-pharmacy'; +import AutoComplete from 'material-ui/AutoComplete'; +import { fullWhite } from 'material-ui/styles/colors'; +import Dialog from 'material-ui/Dialog'; +import { List, ListItem, makeSelectable } from 'material-ui/List'; +import TextField from 'material-ui/TextField'; +import Divider from 'material-ui/Divider'; +import ArrowDropRight from 'material-ui/svg-icons/navigation-arrow-drop-right'; +import RaisedButton from 'material-ui/RaisedButton'; +import FlatButton from 'material-ui/FlatButton'; +import $ from 'jquery'; +import GeolocationService from './Geolocation'; +import Instance from '../../../components/Connection'; + +let SelectableList = makeSelectable(List); + +function wrapState(ComposedComponent) { + return class SelectableList extends Component { + static propTypes = { + children: PropTypes.node.isRequired, + defaultValue: PropTypes.number.isRequired, + }; + + componentWillMount() { + this.setState({ + selectedIndex: this.props.defaultValue, + }); + } + + handleRequestChange = (event, index) => { + this.setState({ + selectedIndex: index, + }); + }; + + render() { + return ( + + {this.props.children} + + ); + } + }; +} + +SelectableList = wrapState(SelectableList); + +const customContentStyle = { + width: '100%', + maxWidth: '600px', +}; + +const buttonStyle = { + +}; + +const buttonStyleWhite = { + textAlign: 'left', + textTransform: 'none !important', + padding: '0px 0px 0px 0px', + marginTop: 0, + boxShadow: 'none', + color: 'rgba(0, 0, 0, 0.3)', + display: 'inline' +}; + + +const datasourceConfig = { text: 'providerText', value: 'muk_id' } +const service = new google.maps.places.AutocompleteService(); +const placeService = new google.maps.places.PlacesService(document.createElement('div')); +const autoComplete = new google.maps.places.AutocompleteService(); + +export class NEMTLocation extends React.Component { + constructor(props) { + super(props); + this.props = props; + this.state = { + data: { + "id": "", + "origin": { + "name": "", + "lat": 0, + "lng": 0, + "address": "" + }, + "destination": { + "name": "", + "lat": 0, + "lng": 0, + "address": "" + } + }, + open: false, + nearbyPlaces: [], + textSize: '16', + icon: '', + type: '', + buttonValue: '', + locationType: '', + geolocation: { + lat: 0, + long: 0 + }, + providers: [], + currentSelection: { + id: 0, + name: "", + address: "", + lat: "", + lng: "", + type: "", + saved: false, + }, + inputValue: "", + addLocation: false, + searchAddresses: [], + addLocationText: '', + addLocationTextValue: '', + addLocationType: 'custom', + addLocationSelected: {}, + addLocationCustomLabel: '', + addLocationID: '', + user: { + useruuid: '', + addresses: [] + }, + currentLocation: null, + currentLocationBaseName: 'Current Location', + address: { + id: '', + name: '', + address: '', + } + } + + this.addCustomLabel = this.addCustomLabel.bind(this); + this.geoSuccess = this.geoSuccess.bind(this); + this.handleAddAddress = this.handleAddAddress.bind(this); + this.handleAutocomplete = this.handleAutocomplete.bind(this); + this.handleBack = this.handleBack.bind(this); + this.handleCancel = this.handleCancel.bind(this); + this.handleClose = this.handleClose.bind(this); + this.handleOpen = this.handleOpen.bind(this); + this.handlePlaceChanged = this.handlePlaceChanged.bind(this); + this.handleSave = this.handleSave.bind(this); + this.handleSaveAddress = this.handleSaveAddress.bind(this); + this.locateNearby = this.locateNearby.bind(this); + this.noPosition = this.noPosition.bind(this); + this.updateTextSearch = this.updateTextSearch.bind(this); + this.handleCurrentLocation = this.handleCurrentLocation.bind(this); + this.updateLocation = this.updateLocation.bind(this); + this.handleGetClosestPlace = this.handleGetClosestPlace.bind(this); + + // this.updateLocation().then(console.log); + + + this.updateLocation(); + } + + static propTypes = { + data: React.PropTypes.object.isRequired, + title: React.PropTypes.string, + value: React.PropTypes.string, + buttonvalue: React.PropTypes.string, + onPlaceChanged: React.PropTypes.function, + icon: React.PropTypes.string, + textSize: React.PropTypes.integer, + type: React.PropTypes.string, + locationType: React.PropTypes.string, + address: React.PropTypes.object + } + + geoSuccess = (position) => { + + const geo = GeolocationService.GetCoordinates(); + // self.updateLocation().then(p => { + let lat = geo.lat; + let long = geo.long; + + this.locateNearby(lat, long) + } + + locateNearby = (lat, long) => { + if (lat === 0 || long === 0) { + lat = 41.886406; + long = -87.624225; + } + if (this.state.locationType === 'provider') { + Instance.getRawConn().get(`/v1/nemt/provider/participating?sort=distance&lat=${lat}&long=${long}`).then(res => { + let nearByPlaces = []; + let providers = res.data.map(p => { + const streetNumber = p.address.street_address_1.split(' ')[0] + let clickResult = { + id: p.muk_id, + address: `${p.address.street_address_1}, ${p.address.city}, ${p.address.state} (${p.address.zipcode})`, + lat: p.address.lat, + lng: p.address.long, + name: p.name, + type: "provider", + raw: p, + street_number: streetNumber, + street: p.address.street_address_1.replace(streetNumber, '').trim(), + city: p.address.city, + state: p.address.state, + zipcode: p.address.zipcode.substring(0, 5), + country: p.address.country, + saved: false, + } + clickResult.address = `${clickResult.street_number} ${clickResult.street}, ${clickResult.city}` + + var listItem = (} onClick={(event) => this.handlePlaceChanged(clickResult)} />) + nearByPlaces.push(listItem); + p.providerText = `${p.name} - ${p.address.street_address_1}, ${p.address.city}, ${p.address.state} (${p.address.zipcode}) (${p.address.phone_number})` + return p; + }); + + this.setState(Object.assign(this.state, { nearbyPlaces: nearByPlaces, providers: providers })); + }); + } else { + var pyrmont = new google.maps.LatLng(lat, long); + var request = { + location: pyrmont, + radius: '500' + }; + placeService.nearbySearch(request, this.callbackGeoSuccess); + } + } + + setFullAddress = (name) => { + name.raw.address_components.forEach(a => { + a.types.forEach(c => { + switch (c) { + case "street_number": + name.street_number = a.short_name; + break; + case "route": + name.street = a.short_name; + break; + case "locality": + name.city = a.short_name; + break; + case "administrative_area_level_1": + name.state = a.short_name; + break; + case "country": + name.country = a.short_name; + break; + case "postal_code": + name.zipcode = a.short_name; + break; + } + }, this) + }, this); + name.address = `${name.street_number} ${name.street}, ${name.city}` + + return name + } + + handlePlaceChanged = (name) => { + var self = this; + const getFullObject = () => { + return new Promise((resolve, reject) => { + if (name.type !== 'google' && name.type !== 'provider') { + resolve(name); + } + + if (self.state.locationType === 'provider') { + resolve(name); + } else { + if (name.raw && name.raw.address_components) { + name = self.setFullAddress(name); + resolve(name) + } else { + placeService.getDetails(name, (result, status) => { + if (status == google.maps.places.PlacesServiceStatus.OK) { + name.raw = result + name = self.setFullAddress(name); + resolve(name); + } else { + reject(result); + } + }); + } + } + }); + } + + getFullObject().then(name => { + self.setState(Object.assign(self.state, { currentSelection: name })); + + if (self.props.onPlaceChanged) { + self.props.onPlaceChanged(name); + } + + self.locateNearby(name.lat, name.lng); + + let buttonText = name.name; + if (buttonText.length > self.state.textSize) { + buttonText = buttonText.substring(0, self.state.textSize); + buttonText += '...'; + } + self.setState(Object.assign(self.state, { buttonValue: buttonText, inputValue: name.address })); + }).catch(console.error); + } + + callbackGeoSuccess = (results, status) => { + if (status == google.maps.places.PlacesServiceStatus.OK) { + var nearByPlaces = []; + for (var i = 0; i < 5; i++) { + var place = results[i]; + if (place) { + let clickResult = { + id: place.id, + placeId: place.place_id, + address: place.formatted_address ? place.formatted_address : (place.vicinity ? place.vicinity : place.name), + lat: place.geometry.location.lat(), + lng: place.geometry.location.lng(), + name: place.name, + type: "google", + raw: place, + saved: false, + } + var listItem = (} onClick={(event) => this.handlePlaceChanged(clickResult)} />) + nearByPlaces.push(listItem); + } + } + this.setState(Object.assign(this.state, { nearbyPlaces: nearByPlaces })); + } + } + + componentDidMount = () => { + const self = this; + var objConf = { + data: this.props.data, + open: false, + buttonValue: this.props.buttonvalue, + icon: this.props.icon, + textSize: this.props.textSize, + type: this.props.type, + locationType: this.props.locationType, + addLocation: false, + currentLocation: (} onTouchTap={this.handleGetClosestPlace} />), + address: this.props.address + } + + if (this.props.locationType == 'provider') { + objConf.currentLocationBaseName = "Nearest Provider" + objConf.currentLocation = (} onTouchTap={this.handleGetClosestPlace} />) + } + + if (!objConf.buttonValue || objConf.buttonValue === null) objConf.buttonValue = ''; + + if (objConf.textSize <= '0') { + objConf.textSize = '20'; + } + + if (objConf.address && objConf.address.id !== '' && objConf.address.name !== '') { + objConf.currentSelection = objConf.address + objConf.buttonValue = objConf.address.name + objConf.inputValue = objConf.address.name + } + + if (!objConf.buttonValue) { + objConf.buttonValue = this.props.buttonvalue; + } + + if (objConf.buttonValue && objConf.buttonValue.length > objConf.textSize) { + objConf.buttonValue = objConf.buttonValue.substring(0, objConf.textSize); + objConf.buttonValue += '...'; + } + + // if (self.state.user.useruuid === '') { + // if (objConf.data.user && objConf.data.user !== null && objConf.data.user.useruuid !== '') { + // let url = `/v1/nemt/users/member/` + objConf.data.user.useruuid + // instance.get(url).then(res => { + // let user = res.data; + // self.setState(Object.assign(self.state, { user: user })); + // }).catch(console.error); + // } + // } + + this.setState(Object.assign(this.state, objConf)); + + if (this.state.type === "flat") { + let dt = $(ReactDOM.findDOMNode(this)).find('#' + this.state.data.id); + } + } + + componentWillReceiveProps = (nextProps) => { + const self = this; + var objConf = { + data: nextProps.data, + buttonValue: nextProps.buttonvalue, + icon: nextProps.icon, + textSize: nextProps.textSize, + type: nextProps.type, + locationType: nextProps.locationType, + addLocation: false, + currentLocation: (} onTouchTap={this.handleGetClosestPlace} />), + address: nextProps.address + } + + if (!objConf.buttonValue || objConf.buttonValue === null) objConf.buttonValue = ''; + + if (objConf.textSize <= 0) { + objConf.textSize = 20; + } + + if (objConf.address && objConf.address.id !== '' && objConf.address.name !== '') { + objConf.currentSelection = objConf.address + objConf.buttonValue = objConf.address.name + objConf.inputValue = objConf.address.name + } + + if (!objConf.buttonValue) { + objConf.buttonValue = nextProps.buttonvalue; + } + + if (objConf.buttonValue && objConf.buttonValue.length > objConf.textSize) { + objConf.buttonValue = objConf.buttonValue.substring(0, objConf.textSize); + objConf.buttonValue += '...'; + } + + // if (self.state.user.useruuid === '' || self.state.user.useruuid !== objConf.data.user.useruuid) { + // if (objConf.data.user && objConf.data.user !== null && objConf.data.user.useruuid !== '') { + // let url = `/v1/nemt/users/member/` + objConf.data.user.useruuid + // instance.get(url).then(res => { + // let user = res.data; + // self.setState(Object.assign(self.state, { user: user })); + // }).catch(console.error); + // } + // } + + this.setState(Object.assign(this.state, objConf)); + + let $this = $(ReactDOM.findDOMNode(this)); + const state = this + + if (this.state.type === "flat") { + let dt = $(ReactDOM.findDOMNode(this)).find('#' + this.state.data.id); + } + } + + handleOpen = (e) => { + if (!this.state.address || !this.state.address.id) { + this.handleCurrentLocation(e); + } + + this.setState(Object.assign(this.state, { open: true })); + if (this.state.user.useruuid === '' || this.state.user.useruuid !== this.props.data.user.useruuid) { + if (this.props.data.user && this.props.data.user !== null && this.props.data.user.useruuid !== '') { + let url = `/v1/nemt/users/member/` + this.props.data.user.useruuid + Instance.getRawConn().get(url).then(res => { + let user = res.data; + this.setState(Object.assign(this.state, { user: user })); + }).catch(console.error); + } + } + }; + + handleCancel = () => { + this.setState(Object.assign(this.state, { open: false })); + }; + + handleClose = () => { + if (this.props.onPlaceChanged) { + this.props.onPlaceChanged(this.state.currentSelection); + } + + let buttonText = this.state.currentSelection.name; + if (buttonText.length > this.state.textSize) { + buttonText = buttonText.substring(0, this.state.textSize); + buttonText += '...'; + } + + this.setState(Object.assign(this.state, { open: false, buttonValue: buttonText })); + }; + + noPosition = () => { + this.locateNearby(41.886406, -87.624225); + } + + updateTextSearch(searchText, dtSource, params) { + let self = this; + self.setState(Object.assign(self.state, { inputValue: searchText })); + if (searchText.length >= 3) { + let lat = self.state.geolocation.lat; + let long = self.state.geolocation.long; + if (lat === 0 || long === 0) { + lat = 41.886406; + long = -87.624225; + } + + if (self.state.locationType === 'provider') { + //let url = `/v1/nemt/provider?lat=${lat}&long=${long}&limit=20&name=${searchText}&sortby=distance` + let url = `/v1/nemt/provider/participating?lat=${lat}&long=${long}&query=${searchText}&sortby=distance` + Instance.getRawConn().get(encodeURI(url)).then(res => { + if (res.data.length > 0) { + let places = res.data.map(p => { + p.providerText = `${p.name} - ${p.address.street_address_1}, ${p.address.city}, ${p.address.state} (${p.address.zipcode}) (${p.address.phone_number})` + p.saved = false + return p; + }) + self.setState(Object.assign(self.state, { providers: places })); + dtSource = self.state.providers; + } + }); + } else { + var location = new google.maps.LatLng(lat, long); + var request = { + location: location, + radius: '500', + input: searchText, + componentRestrictions: { country: 'us' }, + }; + const callback = (results, status) => { + if (status == google.maps.places.PlacesServiceStatus.OK) { + var googlePlaces = results.map(place => { + place.providerText = place.description; + place.muk_id = place.id; + place.saved = false; + return place; + }); + self.setState(Object.assign(self.state, { providers: googlePlaces })); + } + } + + service.getPlacePredictions(request, callback); + } + } + } + + addCustomLabel(e) { + this.setState(Object.assign(this.state, { addLocationCustomLabel: e.target.value })); + } + + searchAddress(e) { + let providerSearch = e.target.value; + this.setState(Object.assign(this.state, { addLocationTextValue: providerSearch })); + if (providerSearch.length >= 3) { + + const geo = GeolocationService.GetCoordinates(); + let lat = geo.lat; + let long = geo.long; + if (lat === 0 || long === 0) { + lat = 41.886406; + long = -87.624225; + } + if (this.state.locationType === 'provider') { + let url = `/v1/nemt/provider/participating?lat=${lat}&long=${long}&query=${providerSearch}&sortby=distance` + Instance.getRawConn().get(encodeURI(url)).then(res => { + let places = res.data.map(p => { + const streetNumber = p.address.street_address_1.split(' ')[0] + p.providerText = `${p.name} - ${p.address.street_address_1}, ${p.address.city}, ${p.address.state} (${p.address.zipcode}) (${p.address.phone_number})` + let clickResult = { + id: p.muk_id, + address: `${p.address.street_address_1}, ${p.address.city}, ${p.address.state} (${p.address.zipcode})`, + lat: p.address.lat, + lng: p.address.long, + name: p.name, + type: "provider", + raw: p, + street_number: streetNumber, + street: p.address.street_address_1.replace(streetNumber, '').trim(), + city: p.address.city, + state: p.address.state, + zipcode: p.address.zipcode.substring(0, 5), + country: p.address.country, + saved: false, + } + clickResult.address = `${clickResult.street_number} ${clickResult.street}, ${clickResult.city}` + + var listItem = (} onClick={(event) => this.handleSaveAddress(clickResult, this)} />) + return listItem; + }); + + this.setState(Object.assign(this.state, { searchAddresses: places })); + }); + } else { + var location = new google.maps.LatLng(lat, long); + + let autoComplenteRequest = { + location: location, + input: providerSearch, + radius: '500', + types: ['address', 'geocode'], + componentRestrictions: { country: 'us' } + }; + + autoComplete.getQueryPredictions(autoComplenteRequest, (results, status) => { + if (status == google.maps.places.PlacesServiceStatus.OK) { + var googlePlaces = results.map(place => { + place.text = place.structured_formatting.main_text; + let clickResult = { + id: place.id, + address: place.description, + placeId: place.place_id, + name: place.structured_formatting.main_text, + type: "google", + raw: place, + street_number: '', + street: '', + city: '', + state: '', + zipcode: '', + country: '', + saved: false, + } + + if (place.address_components) { + place.address_components.forEach(a => { + a.types.forEach(c => { + switch (c) { + case "street_number": + clickResult.street_number = a.short_name; + break; + case "route": + clickResult.street = a.short_name; + break; + case "locality": + clickResult.city = a.short_name; + break; + case "administrative_area_level_1": + clickResult.state = a.short_name; + break; + case "country": + clickResult.country = a.short_name; + break; + case "postal_code": + clickResult.zipcode = a.short_name; + break; + } + }, this) + }, this); + } + //clickResult.address = `${clickResult.street_number} ${clickResult.street}, ${clickResult.city}, ${clickResult.state} ${clickResult.zipcode}` + + var listItem = (} onClick={(event) => this.handleSaveAddress(clickResult, this)} />) + return listItem + }); + this.setState(Object.assign(this.state, { searchAddresses: googlePlaces })); + } + }); + } + } + } + + handleSaveAddress = (address, state) => { + if (this.state.locationType === 'provider') { + state.setState(Object.assign(state.state, { addLocationSelected: address, addLocationTextValue: address.name, addLocationID: address.id })); + } else { + placeService.getDetails(address, (result, status) => { + if (status == google.maps.places.PlacesServiceStatus.OK) { + let clickResult = { + id: result.place_id, + placeId: result.place_id, + address: result.formatted_address ? result.formatted_address : result.vicinity, + lat: result.geometry.location.lat(), + lng: result.geometry.location.lng(), + name: result.name, + type: "google", + raw: result, + street_number: '', + street: '', + city: '', + state: '', + zipcode: '', + country: '', + saved: false, + } + + result.address_components.forEach(a => { + a.types.forEach(c => { + switch (c) { + case "street_number": + clickResult.street_number = a.short_name; + break; + case "route": + clickResult.street = a.short_name; + break; + case "locality": + clickResult.city = a.short_name; + break; + case "administrative_area_level_1": + clickResult.state = a.short_name; + break; + case "country": + clickResult.country = a.short_name; + break; + case "postal_code": + clickResult.zipcode = a.short_name; + break; + } + }, this) + }, this); + clickResult.address = `${clickResult.street_number} ${clickResult.street}, ${clickResult.city}` + + state.setState(Object.assign(state.state, { addLocationSelected: clickResult, addLocationTextValue: clickResult.name, addLocationID: clickResult.id })); + } + }); + } + } + + handleAutocomplete = (provider) => { + const sendInfo = (clickResult) => { + this.setState(Object.assign(this.state, { currentSelection: clickResult })); + this.locateNearby(clickResult.lat, clickResult.lng); + + if (this.props.onPlaceChanged) { + this.props.onPlaceChanged(clickResult); + } + //state.handleClose(); + + let buttonText = clickResult.name; + if (buttonText.length > this.state.textSize) { + buttonText = buttonText.substring(0, this.state.textSize); + buttonText += '...'; + } + this.setState(Object.assign(this.state, { buttonValue: buttonText, inputValue: clickResult.name })); + } + + if (this.state.locationType === "provider") { + const streetNumber = provider.address.street_address_1.split(' ')[0] + let clickResult = { + id: provider.muk_id, + address: `${provider.address.street_address_1}, ${provider.address.city}, ${provider.address.state} (${provider.address.zipcode})`, + lat: provider.address.lat, + lng: provider.address.long, + name: provider.name, + type: "provider", + raw: provider, + street_number: streetNumber, + street: provider.address.street_address_1.replace(streetNumber, '').trim(), + city: provider.address.city, + state: provider.address.state, + zipcode: provider.address.zipcode.substring(0, 5), + country: provider.address.country, + saved: false, + } + clickResult.address = `${clickResult.street_number} ${clickResult.street}, ${clickResult.city}` + + sendInfo(clickResult); + } else { + placeService.getDetails(provider, (result, status) => { + if (status == google.maps.places.PlacesServiceStatus.OK) { + let clickResult = { + id: result.place_id, + placeId: result.place_id, + address: result.formatted_address ? result.formatted_address : result.vicinity, + lat: result.geometry.location.lat(), + lng: result.geometry.location.lng(), + name: result.name, + type: "google", + raw: result, + street_number: '', + street: '', + city: '', + state: '', + zipcode: '', + country: '', + saved: false, + } + + result.address_components.forEach(a => { + a.types.forEach(c => { + switch (c) { + case "street_number": + clickResult.street_number = a.short_name; + break; + case "route": + clickResult.street = a.short_name; + break; + case "locality": + clickResult.city = a.short_name; + break; + case "administrative_area_level_1": + clickResult.state = a.short_name; + break; + case "country": + clickResult.country = a.short_name; + break; + case "postal_code": + clickResult.zipcode = a.short_name; + break; + } + }, this) + }, this); + clickResult.address = `${clickResult.street_number} ${clickResult.street}, ${clickResult.city}` + sendInfo(clickResult); + } + }); + } + + } + + filterResults(searchText, key) { + if (searchText && key) { + return (key.toLowerCase().indexOf(searchText.toLowerCase()) !== -1) + } else return false; + } + + updateLocation() { + return new Promise((resolve, reject) => { + try { + const geo = GeolocationService.GetCoordinates(); + const position = { + coords: { + latitude: geo.lat, + longitude: geo.long, + }, + } + + this.geoSuccess(position); + resolve(position); + } catch (err) { + reject(err); + } + }); + } + + handleGetClosestPlace(e) { + const self = this; + self.updateLocation().then(p => { + self.handleCurrentLocation(e); + }).catch(console.error); + } + + handleCurrentLocation(e) { + const self = this; + const geo = GeolocationService.GetCoordinates(); + // self.updateLocation().then(p => { + let lat = geo.lat; + let long = geo.long; + if (lat === 0 || long === 0) { + lat = 41.886406; + long = -87.624225; + } + + if (self.state.locationType === 'provider') { + Instance.getRawConn().get(`/v1/nemt/provider/participating?sort=distance&lat=${lat}&long=${long}`).then(res => { + let listItem = (} onClick={self.handleCurrentLocation} />) + if (res.data.length > 0) { + const result = res.data[0]; + const streetNumber = result.address.street_address_1.split(' ')[0] + let clickResult = { + id: result.muk_id, + address: `${result.address.street_address_1}, ${result.address.city}, ${result.address.state} (${result.address.zipcode})`, + lat: result.address.lat, + lng: result.address.long, + name: result.name, + type: "provider", + raw: result, + street_number: streetNumber, + street: result.address.street_address_1.replace(streetNumber, '').trim(), + city: result.address.city, + state: result.address.state, + zipcode: result.address.zipcode.substring(0, 5), + country: result.address.country, + saved: false, + } + clickResult.address = `${clickResult.street_number} ${clickResult.street}, ${clickResult.city}` + self.handlePlaceChanged(clickResult) + //listItem = (} onClick={(event) => self.handlePlaceChanged(clickResult)} />) + } + //self.setState(Object.assign(self.state, { currentLocation: listItem })); + }).catch(console.error); + } else { + var location = new google.maps.LatLng(lat, long); + var geocoder = new google.maps.Geocoder; + var request = { + location: location, + }; + + const callback = (results, status) => { + if (status == google.maps.places.PlacesServiceStatus.OK) { + let listItem = (} onClick={self.handleCurrentLocation} />) + if (results.length > 0) { + const result = results[0]; + let clickResult = { + placeId: result.place_id, + id: result.id, + address: result.formatted_address ? result.formatted_address : result.vicinity, + lat: result.geometry.location.lat(), + lng: result.geometry.location.lng(), + name: result.formatted_address ? result.formatted_address : result.vicinity, + type: "google", + raw: result, + street_number: '', + street: '', + city: '', + state: '', + zipcode: '', + country: '', + saved: false, + } + + result.address_components.forEach(a => { + a.types.forEach(c => { + switch (c) { + case "street_number": + clickResult.street_number = a.short_name; + break; + case "route": + clickResult.street = a.short_name; + break; + case "locality": + clickResult.city = a.short_name; + break; + case "administrative_area_level_1": + clickResult.state = a.short_name; + break; + case "country": + clickResult.country = a.short_name; + break; + case "postal_code": + clickResult.zipcode = a.short_name; + break; + } + }, this) + }, this); + clickResult.address = `${clickResult.street_number} ${clickResult.street}, ${clickResult.city}` + self.handlePlaceChanged(clickResult); + //listItem = (} onClick={(event) => self.handlePlaceChanged(clickResult)} />) + } + //self.setState(Object.assign(self.state, { currentLocation: listItem })); + } + } + + geocoder.geocode(request, callback); + } + // }).catch(console.error); + } + + handleAddAddress = (e, name) => { + e.preventDefault(); + let text = ''; + switch (name) { + case 'pcp': + text = "Enter Member's PCP"; + break; + case 'custom': + text = 'Enter Custom Location'; + break; + case 'home': + text = "Enter Member's Home Address"; + break; + case 'work': + text = "Enter Member's Work Address"; + break; + default: + text = 'Enter Custom Address type for Member'; + break; + } + this.setState(Object.assign(this.state, { + addLocation: true, + addLocationText: text, + searchAddresses: [], + addLocationType: name, + addLocationSelected: {}, + addLocationTextValue: '', + addLocationID: '', + })); + } + + handleBack = () => { + this.setState(Object.assign(this.state, { addLocation: false, addLocationSelected: {} })); + } + + handleSave = () => { + let self = this; + let address = this.state.addLocationSelected; + address.address_type = this.state.addLocationType; + address.user = this.state.data.user; + address.address = `${address.street_number} ${address.street}, ${address.city}` + + if (this.state.addLocationCustomLabel !== '' && this.state.addLocationCustomLabel !== null && this.state.addLocationCustomLabel !== undefined) { + address.name = this.state.addLocationCustomLabel; + } + + if (address.user && address.user !== null) { + let url = `/v1/nemt/users/member/${address.user.useruuid}/address` + Instance.getRawConn().post(url, address).then(res => { + this.setState(Object.assign(this.state, { addLocation: false, addLocationSelected: {}, user: res.data.user, addLocationCustomLabel: '' })); + }).catch(console.error); + } + } + + render() { + const state = this; + let actions = [ + , + , + ]; + + + let button = ( + ); + + if (this.state.type === 'secondary') { + button = ( + ); + } else if (this.state.type === 'primary') { + button = ( + ); + } else if (this.state.type === 'flat') { + button = ( + + this.handleOpen(e)} id={this.state.data.id} + /> + + // this.handleOpen(e)} id={this.state.data.id} className={`linkButton ${this.state.data.id}`} >{this.state.buttonValue} + ) + } + let customListStyle = { + overflowScrolling: 'touch', + WebkitOverflowScrolling: 'touch', + } + + let homeAddress = (} leftIcon={} onClick={(e) => this.handleAddAddress(e, 'home')} />) + let workAddress = (} leftIcon={} onClick={(e) => this.handleAddAddress(e, 'work')} />) + let customPlaceAddresses = []; + let pcpAddress = (} leftIcon={} onClick={(e) => this.handleAddAddress(e, 'pcp')} />); + let customAddresses = []; + + if (this.state.user && this.state.user !== null && this.state.user.addresses && this.state.user.addresses !== null) { + this.state.user.addresses.forEach(a => { + let clickResult = { + id: a.address_uuid, + address: a.address, + lat: a.lat, + lng: a.lng, + name: a.name, + type: a.address_type, + saved: true, + } + + switch (a.address_type) { + case 'home': + clickResult.name = a.address_type_name; + homeAddress = (} onClick={(event) => this.handlePlaceChanged(clickResult)} />); + break; + case 'work': + clickResult.name = a.address_type_name; + workAddress = (} onClick={(event) => this.handlePlaceChanged(clickResult)} />); + break; + case 'customplace': + customPlaceAddresses.push(} onClick={(event) => this.handlePlaceChanged(clickResult)} />); + break; + case 'pcp': + clickResult.name = a.address_type_name; + pcpAddress = (} onClick={(event) => this.handlePlaceChanged(clickResult)} />); + break; + default: + customAddresses.push(} onClick={(event) => this.handlePlaceChanged(clickResult)} />); + break; + } + }, this); + } + + let locationType = ( + + {homeAddress} + {workAddress} + {customPlaceAddresses} + } leftIcon={} onClick={(e) => this.handleAddAddress(e, 'customplace')} /> + ); + + let autosuggest; + let addAddress = ( this.searchAddress(e)} fullWidth={true} floatingLabelText={this.state.addLocationText} value={this.state.addLocationTextValue} />) + let customLabel; + if (this.state.addLocation && (this.state.addLocationType === 'custom' || this.state.addLocationType === 'customplace')) { + customLabel = ( this.addCustomLabel(e)} fullWidth={true} floatingLabelText={"Choose a short name for this address"} value={this.state.addLocationCustomLabel} />); + } + + if (this.state.locationType === 'provider') { + locationType = ( + + {pcpAddress} + {customAddresses} + } leftIcon={} onClick={(e) => this.handleAddAddress(e, 'custom')} /> + ) + autosuggest = () + } else { + autosuggest = () + } + + let listItem = ( +
      + {autosuggest} + + {this.state.currentLocation} + + + + + + {locationType} + + + {this.state.nearbyPlaces} + +
      + ) + if (this.state.addLocation) { + listItem = ( +
      + {addAddress} + {customLabel} + + {this.state.searchAddresses} + +
      ) + + actions = [ + , + , + ]; + } + + return ( +
      + {button} + + {listItem} + +
      + ); + } +} \ No newline at end of file diff --git a/src/routes/app/components/RoadtripLink.js b/src/routes/app/components/RoadtripLink.js new file mode 100644 index 0000000..81b94e8 --- /dev/null +++ b/src/routes/app/components/RoadtripLink.js @@ -0,0 +1,70 @@ +import React from 'react'; +import Delete from 'material-ui/svg-icons/action/delete'; +import Create from 'material-ui/svg-icons/content/create'; +import Call from 'material-ui/svg-icons/communication/call'; +import TextSms from 'material-ui/svg-icons/communication/textsms'; +import Mail from 'material-ui/svg-icons/content/mail'; +import IconButton from 'material-ui/IconButton'; +import PropTypes from 'prop-types'; +import Instance from '../../../components/Connection'; + +const RoadTripLink = (props) => { + const onClick = (e, r) => { + let url = `/v1/nemt/rides/${r.ride_uuid}`; + if (props.isOpened) { + url = `/v1/ext/${r.ride_uuid}/${r.user.useruuid}`; + } + + Instance.getRawConn().get(url).then(res => { + if (props.onRideClick) { + props.onRideClick(res.data); + } else { + console.log(res.data); + } + }).catch(console.error); + + return false; + } + + let rideList = []; + if (props.rides) { + console.log(props.rides) + rideList = props.rides.map((r, i) => { + let separator = '|'; + if (props.rides.length === 1 || props.rides.length === i + 1) { + separator = ''; + } + if (props.isLink == true) { + return ( onClick(e, r)}>{r.trip_type.value} {separator}) + } else { + return ( {r.trip_type.value} {separator}) + } + }); + } + + return ( +
      + {rideList} +
      + ) +} + +RoadTripLink.propTypes = { + visit: PropTypes.object.isRequired, + rides: PropTypes.array.isRequired, + currentRide: PropTypes.object, + isOpened: PropTypes.bool, + isLink: PropTypes.bool, + onRideClick: PropTypes.func, +}; + +RoadTripLink.defaultProps = { + visit: {}, + rides: [], + currentRide: {}, + isOpened: false, + isLink: false, + onRideClick: (ride) => { console.log(ride); }, +}; + +module.exports = RoadTripLink; \ No newline at end of file diff --git a/src/routes/app/index.js b/src/routes/app/index.js new file mode 100644 index 0000000..9946455 --- /dev/null +++ b/src/routes/app/index.js @@ -0,0 +1,25 @@ +module.exports = { + path: 'app', + getChildRoutes(partialNextState, cb) { + require.ensure([], (require) => { + cb(null, [ + require('./routes/charts'), + require('./routes/dashboard'), + // require('./routes/ecommerce'), + require('./routes/forms'), + require('./routes/pageLayouts'), + require('./routes/pages'), + require('./routes/tables'), + require('./routes/ui'), + require('./routes/member'), + require('./routes/organization'), + require('./routes/users'), + ]); + }); + }, + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/MainApp')); + }); + } +}; diff --git a/src/routes/app/routes/charts/index.js b/src/routes/app/routes/charts/index.js new file mode 100644 index 0000000..083a20a --- /dev/null +++ b/src/routes/app/routes/charts/index.js @@ -0,0 +1,16 @@ +module.exports = { + path: 'chart', + getChildRoutes(partialNextState, cb) { + require.ensure([], (require) => { + cb(null, [ + require('./routes/bar'), + require('./routes/funnel'), + require('./routes/line'), + require('./routes/more'), + require('./routes/pie'), + require('./routes/radar'), + require('./routes/scatter'), + ]); + }); + } +}; diff --git a/src/routes/app/routes/charts/routes/bar/components/Bar.js b/src/routes/app/routes/charts/routes/bar/components/Bar.js new file mode 100644 index 0000000..5f8473b --- /dev/null +++ b/src/routes/app/routes/charts/routes/bar/components/Bar.js @@ -0,0 +1,546 @@ +import React from 'react'; +import ReactEcharts from 'components/ReactECharts'; +import CHARTCONFIG from 'constants/ChartConfig'; + +const bar1 = {}; +const bar2 = {}; +const bar3 = {}; +const bar4 = {}; +const bar5 = {}; + +bar1.options = { + tooltip: { + trigger: 'axis' + }, + legend: { + data: ['Evaporation', 'Precipitation'], + textStyle: { + color: CHARTCONFIG.color.text + } + }, + toolbox: { + show: true, + feature: { + saveAsImage: {show: true, title: 'save'} + } + }, + calculable: true, + xAxis: [ + { + type: 'category', + data: ['Jan.', 'Feb.', 'Mar.', 'Apr.', 'May', 'Jun.', 'Jul.', 'Aug.', 'Sep.', 'Oct.', 'Nov.', 'Dec.'], + axisLabel: { + textStyle: { + color: CHARTCONFIG.color.text + } + }, + splitLine: { + lineStyle: { + color: CHARTCONFIG.color.splitLine + } + } + } + ], + yAxis: [ + { + type: 'value', + axisLabel: { + textStyle: { + color: CHARTCONFIG.color.text + } + }, + splitLine: { + lineStyle: { + color: CHARTCONFIG.color.splitLine + } + }, + splitArea: { + show: true, + areaStyle: { + color: CHARTCONFIG.color.splitArea + } + } + } + ], + series: [ + { + name: 'Evaporation', + type: 'bar', + data: [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3], + markPoint: { + data: [ + {type: 'max', name: 'Max'}, + {type: 'min', name: 'Min'} + ] + }, + markLine: { + data: [ + {type: 'average', name: 'Average'} + ] + } + }, + { + name: 'Precipitation', + type: 'bar', + data: [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3], + markPoint: { + data: [ + {name: 'Highest', value: 182.2, xAxis: 7, yAxis: 183, symbolSize: 18}, + {name: 'Lowest', value: 2.3, xAxis: 11, yAxis: 3} + ] + }, + markLine: { + data: [ + {type: 'average', name: 'Average'} + ] + } + } + ] +}; +bar2.options = { + tooltip: { + trigger: 'axis', + axisPointer: { + type: 'shadow' + } + }, + legend: { + data: ['Direct', 'Email', 'Affiliate', 'Video Ads', 'Search', 'Baidu', 'Google', 'Bing', 'Others'], + textStyle: { + color: CHARTCONFIG.color.text + } + }, + calculable: true, + xAxis: [ + { + type: 'category', + data: ['Mon.', 'Tue.', 'Wed.', 'Thu.', 'Fri.', 'Sat.', 'Sun.'], + axisLabel: { + textStyle: { + color: CHARTCONFIG.color.text + } + }, + splitLine: { + lineStyle: { + color: CHARTCONFIG.color.splitLine + } + } + } + ], + yAxis: [ + { + type: 'value', + axisLabel: { + textStyle: { + color: CHARTCONFIG.color.text + } + }, + splitLine: { + lineStyle: { + color: CHARTCONFIG.color.splitLine + } + }, + splitArea: { + show: true, + areaStyle: { + color: CHARTCONFIG.color.splitArea + } + } + } + ], + series: [ + { + name: 'Direct', + type: 'bar', + data: [320, 332, 301, 334, 390, 330, 320] + }, + { + name: 'Email', + type: 'bar', + stack: 'Ads', + data: [120, 132, 101, 134, 90, 230, 210] + }, + { + name: 'Affiliate', + type: 'bar', + stack: 'Ads', + data: [220, 182, 191, 234, 290, 330, 310] + }, + { + name: 'Video Ads', + type: 'bar', + stack: 'Ads', + data: [150, 232, 201, 154, 190, 330, 410] + }, + { + name: 'Search', + type: 'bar', + data: [862, 1018, 964, 1026, 1679, 1600, 1570], + markLine: { + itemStyle: { + normal: { + lineStyle: { + type: 'dashed' + } + } + }, + data: [ + [{type: 'min'}, {type: 'max'}] + ] + } + }, + { + name: 'Baidu', + type: 'bar', + barWidth: 5, + stack: 'Search', + data: [620, 732, 701, 734, 1090, 1130, 1120] + }, + { + name: 'Google', + type: 'bar', + stack: 'Search', + data: [120, 132, 101, 134, 290, 230, 220] + }, + { + name: 'Bing', + type: 'bar', + stack: 'Search', + data: [60, 72, 71, 74, 190, 130, 110] + }, + { + name: 'Others', + type: 'bar', + stack: 'Search', + data: [62, 82, 91, 84, 109, 110, 120] + } + ] +}; +bar3.options = { + title: { + text: 'World Population', + subtext: 'From the Internet' + }, + tooltip: { + trigger: 'axis' + }, + legend: { + data: ['2011', '2012'], + textStyle: { + color: CHARTCONFIG.color.text + } + }, + toolbox: { + show: true, + feature: { + saveAsImage: {show: true, title: 'save'} + } + }, + calculable: true, + xAxis: [ + { + type: 'value', + boundaryGap: [0, 0.01], + axisLabel: { + textStyle: { + color: CHARTCONFIG.color.text + } + }, + splitLine: { + lineStyle: { + color: CHARTCONFIG.color.splitLine + } + } + } + ], + yAxis: [ + { + type: 'category', + data: ['Brazil', 'Indonesia', 'USA', 'India', 'China', 'World Population (10k)'], + axisLabel: { + textStyle: { + color: CHARTCONFIG.color.text + } + }, + splitLine: { + lineStyle: { + color: CHARTCONFIG.color.splitLine + } + }, + splitArea: { + show: true, + areaStyle: { + color: CHARTCONFIG.color.splitArea + } + } + } + ], + series: [ + { + name: '2011', + type: 'bar', + data: [18203, 23489, 29034, 104970, 131744, 630230] + }, + { + name: '2012', + type: 'bar', + data: [19325, 23438, 31000, 121594, 134141, 681807] + } + ] +}; +bar4.options = { + tooltip: { + trigger: 'axis', + axisPointer: { + type: 'shadow' + } + }, + legend: { + data: ['Direct', 'Email', 'Affiliate', 'Video Ads', 'Search'], + textStyle: { + color: CHARTCONFIG.color.text + } + }, + toolbox: { + show: true, + feature: { + saveAsImage: {show: true, title: 'save'} + } + }, + calculable: true, + xAxis: [ + { + type: 'value', + axisLabel: { + textStyle: { + color: CHARTCONFIG.color.text + } + }, + splitLine: { + lineStyle: { + color: CHARTCONFIG.color.splitLine + } + } + } + ], + yAxis: [ + { + type: 'category', + data: ['Mon.', 'Tue.', 'Wed.', 'Thu.', 'Fri.', 'Sat.', 'Sun.'], + axisLabel: { + textStyle: { + color: CHARTCONFIG.color.text + } + }, + splitLine: { + lineStyle: { + color: CHARTCONFIG.color.splitLine + } + }, + splitArea: { + show: true, + areaStyle: { + color: CHARTCONFIG.color.splitArea + } + } + } + ], + series: [ + { + name: 'Direct', + type: 'bar', + stack: 'Sum', + itemStyle: { normal: {label: {show: true, position: 'insideRight'}}}, + data: [320, 302, 301, 334, 390, 330, 320] + }, + { + name: 'Email', + type: 'bar', + stack: 'Sum', + itemStyle: { normal: {label: {show: true, position: 'insideRight'}}}, + data: [120, 132, 101, 134, 90, 230, 210] + }, + { + name: 'Affiliate', + type: 'bar', + stack: 'Sum', + itemStyle: { normal: {label: {show: true, position: 'insideRight'}}}, + data: [220, 182, 191, 234, 290, 330, 310] + }, + { + name: 'Video Ads', + type: 'bar', + stack: 'Sum', + itemStyle: { normal: {label: {show: true, position: 'insideRight'}}}, + data: [150, 212, 201, 154, 190, 330, 410] + }, + { + name: 'Search', + type: 'bar', + stack: 'Sum', + itemStyle: { normal: {label: {show: true, position: 'insideRight'}}}, + data: [820, 832, 901, 934, 1290, 1330, 1320] + } + ] +}; +bar5.options = { + tooltip: { + trigger: 'axis', + axisPointer: { + type: 'shadow' + } + }, + legend: { + data: ['Savings', 'Cost', 'Income'], + textStyle: { + color: CHARTCONFIG.color.text + } + }, + toolbox: { + show: true, + feature: { + saveAsImage: {show: true, title: 'save'} + } + }, + calculable: true, + xAxis: [ + { + type: 'value', + axisLabel: { + textStyle: { + color: CHARTCONFIG.color.text + } + }, + splitLine: { + lineStyle: { + color: CHARTCONFIG.color.splitLine + } + } + } + ], + yAxis: [ + { + type: 'category', + axisTick: {show: false}, + data: ['Mon.', 'Tue.', 'Wed.', 'Thu.', 'Fri.', 'Sat.', 'Sun.'], + axisLabel: { + textStyle: { + color: CHARTCONFIG.color.text + } + }, + splitLine: { + lineStyle: { + color: CHARTCONFIG.color.splitLine + } + }, + splitArea: { + show: true, + areaStyle: { + color: CHARTCONFIG.color.splitArea + } + } + } + ], + series: [ + { + name: 'Savings', + type: 'bar', + itemStyle: { normal: {label: {show: true, position: 'inside'}}}, + data: [200, 170, 240, 244, 200, 220, 210] + }, + { + name: 'Income', + type: 'bar', + stack: 'Sum', + barWidth: 5, + itemStyle: {normal: { + label: {show: true} + }}, + data: [320, 302, 341, 374, 390, 450, 420] + }, + { + name: 'Cost', + type: 'bar', + stack: 'Sum', + itemStyle: {normal: { + label: {show: true, position: 'left'} + }}, + data: [-120, -132, -101, -134, -190, -230, -210] + } + ] +}; + +const Section1 = () => ( +
      +
      + +
      +
      Basic Column
      +
      + +
      +
      + +
      +
      + +
      +
      Stacked Column
      +
      + +
      +
      + +
      +
      +); + +const Section2 = () => ( +
      +
      + +
      +
      Basic Bar
      +
      + +
      +
      + +
      +
      + +
      +
      Stacked Bar
      +
      + +
      +
      + +
      +
      +); + +const Section3 = () => ( +
      +
      + +
      +
      Tornado
      +
      + +
      +
      + +
      +
      +); + +const Bar = () => ( +
      + + + +
      +); + +module.exports = Bar; diff --git a/src/routes/app/routes/charts/routes/bar/index.js b/src/routes/app/routes/charts/routes/bar/index.js new file mode 100644 index 0000000..b42bbdd --- /dev/null +++ b/src/routes/app/routes/charts/routes/bar/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'bar', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Bar')); + }); + } +}; diff --git a/src/routes/app/routes/charts/routes/funnel/components/Funnel.js b/src/routes/app/routes/charts/routes/funnel/components/Funnel.js new file mode 100644 index 0000000..630e7f3 --- /dev/null +++ b/src/routes/app/routes/charts/routes/funnel/components/Funnel.js @@ -0,0 +1,261 @@ +import React from 'react'; +import ReactEcharts from 'components/ReactECharts'; +import CHARTCONFIG from 'constants/ChartConfig'; + +const funnel1 = {}; +const funnel2 = {}; +const funnel3 = {}; + + +funnel1.options = { + tooltip: { + trigger: 'item', + formatter: '{a}
      {b} : {c}%' + }, + toolbox: { + show: true, + feature: { + saveAsImage: {show: true, title: 'save'} + } + }, + legend: { + data: ['Dispaly', 'Click', 'Visit', 'Question', 'Order'], + textStyle: { + color: CHARTCONFIG.color.text + } + }, + calculable: true, + series: [ + { + name: 'Funnel', + type: 'funnel', + x: '10%', + y: 60, + // x2: 80, + y2: 60, + width: '80%', + // height: {totalHeight} - y - y2, + min: 0, + max: 100, + minSize: '0%', + maxSize: '100%', + sort: 'descending', // 'ascending', 'descending' + gap: 10, + itemStyle: { + normal: { + borderColor: '#fff', + borderWidth: 1, + label: { + show: true, + position: 'inside' + }, + labelLine: { + show: false, + length: 10, + lineStyle: { + width: 1, + type: 'solid' + } + } + }, + emphasis: { + label: { + show: true, + formatter: '{b}:{c}%' + }, + labelLine: { + show: true + } + } + }, + data: [ + {value: 60, name: 'Visit'}, + {value: 40, name: 'Question'}, + {value: 20, name: 'Order'}, + {value: 80, name: 'Click'}, + {value: 100, name: 'Dispaly'} + ] + } + ] +}; +funnel2.options = { + tooltip: { + trigger: 'item', + formatter: '{a}
      {b} : {c}%' + }, + toolbox: { + feature: { + saveAsImage: {show: true, title: 'save'} + } + }, + legend: { + data: ['Display', 'Click', 'Visit', 'Question', 'Order'], + textStyle: { + color: CHARTCONFIG.color.text + } + }, + series: [ + { + name: 'Forecast', + type: 'funnel', + left: '10%', + width: '80%', + label: { + normal: { + formatter: '{b} Forecast' + }, + emphasis: { + position: 'inside', + formatter: '{b} Forecast: {c}%' + } + }, + labelLine: { + normal: { + show: false + } + }, + itemStyle: { + normal: { + opacity: 0.7 + } + }, + data: [ + {value: 60, name: 'Visit'}, + {value: 40, name: 'Question'}, + {value: 20, name: 'Order'}, + {value: 80, name: 'Click'}, + {value: 100, name: 'Display'} + ] + }, + { + name: 'Reality', + type: 'funnel', + left: '10%', + width: '80%', + maxSize: '80%', + label: { + normal: { + position: 'inside', + formatter: '{c}%', + textStyle: { + color: '#fff' + } + }, + emphasis: { + position: 'inside', + formatter: '{b} Reality: {c}%' + } + }, + itemStyle: { + normal: { + opacity: 0.5, + borderColor: '#fff', + borderWidth: 2 + } + }, + data: [ + {value: 30, name: 'Visit'}, + {value: 10, name: 'Ask'}, + {value: 5, name: 'Order'}, + {value: 50, name: 'Click'}, + {value: 80, name: 'Display'} + ] + } + ] +}; +funnel3.options = { + title: { + text: 'Funnel', + subtext: 'Fake Data' + }, + tooltip: { + trigger: 'item', + formatter: '{a}
      {b} : {c}%' + }, + toolbox: { + show: true, + feature: { + saveAsImage: {show: true, title: 'save'} + } + }, + legend: { + data: ['Dispaly', 'Click', 'Visit', 'Question', 'Order'], + textStyle: { + color: CHARTCONFIG.color.text + } + }, + calculable: true, + series: [ + { + name: 'Funnel', + type: 'funnel', + width: '40%', + data: [ + {value: 60, name: 'Visit'}, + {value: 40, name: 'Question'}, + {value: 20, name: 'Order'}, + {value: 80, name: 'Click'}, + {value: 100, name: 'Dispaly'} + ] + }, + { + name: 'Pyramid', + type: 'funnel', + x: '50%', + sort: 'ascending', + itemStyle: { + normal: { + label: { + position: 'left' + } + } + }, + data: [ + {value: 60, name: 'Visit'}, + {value: 40, name: 'Question'}, + {value: 20, name: 'Order'}, + {value: 80, name: 'Click'}, + {value: 100, name: 'Dispaly'} + ] + } + ] +}; + +const Funnel = () => ( +
      + +
      +
      + +
      +
      Basic Funnel
      +
      + +
      +
      + +
      +
      + +
      +
      Multiple Funnel
      +
      + +
      +
      + +
      +
      + + +
      +
      Funnels
      +
      + +
      +
      + +
      +); + +module.exports = Funnel; diff --git a/src/routes/app/routes/charts/routes/funnel/index.js b/src/routes/app/routes/charts/routes/funnel/index.js new file mode 100644 index 0000000..fb4d00b --- /dev/null +++ b/src/routes/app/routes/charts/routes/funnel/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'funnel', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Funnel')); + }); + } +}; diff --git a/src/routes/app/routes/charts/routes/line/components/Line.js b/src/routes/app/routes/charts/routes/line/components/Line.js new file mode 100644 index 0000000..020f7d8 --- /dev/null +++ b/src/routes/app/routes/charts/routes/line/components/Line.js @@ -0,0 +1,419 @@ +import React from 'react'; +import ReactEcharts from 'components/ReactECharts'; +import CHARTCONFIG from 'constants/ChartConfig'; + +const line1 = {}; +const line2 = {}; +const line3 = {}; +const line4 = {}; + +line1.options = { + tooltip: { + trigger: 'axis' + }, + legend: { + data: ['Highest temperature', 'Lowest temperature'], + textStyle: { + color: CHARTCONFIG.color.text + } + }, + toolbox: { + show: true, + feature: { + saveAsImage: {show: true, title: 'save'} + } + }, + calculable: true, + xAxis: [ + { + type: 'category', + boundaryGap: false, + data: ['Mon.', 'Tue.', 'Wed.', 'Thu.', 'Fri.', 'Sat.', 'Sun.'], + axisLabel: { + formatter: '{value} °C', + textStyle: { + color: CHARTCONFIG.color.text + } + }, + splitLine: { + lineStyle: { + color: CHARTCONFIG.color.splitLine + } + } + } + ], + yAxis: [ + { + type: 'value', + axisLabel: { + formatter: '{value} °C', + textStyle: { + color: CHARTCONFIG.color.text + } + }, + splitLine: { + lineStyle: { + color: CHARTCONFIG.color.splitLine + } + }, + splitArea: { + show: true, + areaStyle: { + color: CHARTCONFIG.color.splitArea + } + } + } + ], + series: [ + { + name: 'Highest temperature', + type: 'line', + data: [11, 11, 15, 13, 12, 13, 10], + markPoint: { + data: [ + {type: 'max', name: 'Max'}, + {type: 'min', name: 'Min'} + ] + }, + markLine: { + data: [ + {type: 'average', name: 'Average'} + ] + } + }, + { + name: 'Lowest temperature', + type: 'line', + data: [1, -2, 2, 5, 3, 2, 0], + markPoint: { + data: [ + {name: 'Lowest temperature', value: -2, xAxis: 1, yAxis: -1.5} + ] + }, + markLine: { + data: [ + {type: 'average', name: 'Average'} + ] + } + } + ] +}; +line2.options = { + tooltip: { + trigger: 'axis' + }, + legend: { + data: ['Email', 'Affiliate', 'Video Ads', 'Direct', 'Search'], + textStyle: { + color: CHARTCONFIG.color.text + } + }, + toolbox: { + show: true, + feature: { + saveAsImage: {show: true, title: 'save'} + } + }, + calculable: true, + xAxis: [ + { + type: 'category', + boundaryGap: false, + data: ['Mon.', 'Tue.', 'Wed.', 'Thu.', 'Fri.', 'Sat.', 'Sun.'], + axisLabel: { + textStyle: { + color: CHARTCONFIG.color.text + } + }, + splitLine: { + lineStyle: { + color: CHARTCONFIG.color.splitLine + } + } + } + ], + yAxis: [ + { + type: 'value', + axisLabel: { + textStyle: { + color: CHARTCONFIG.color.text + } + }, + splitLine: { + lineStyle: { + color: CHARTCONFIG.color.splitLine + } + }, + splitArea: { + show: true, + areaStyle: { + color: CHARTCONFIG.color.splitArea + } + } + } + ], + series: [ + { + name: 'Email', + type: 'line', + stack: 'Sum', + data: [120, 132, 101, 134, 90, 230, 210] + }, + { + name: 'Affiliate', + type: 'line', + stack: 'Sum', + data: [220, 182, 191, 234, 290, 330, 310] + }, + { + name: 'Video Ads', + type: 'line', + stack: 'Sum', + data: [150, 232, 201, 154, 190, 330, 410] + }, + { + name: 'Direct', + type: 'line', + stack: 'Sum', + data: [320, 332, 301, 334, 390, 330, 320] + }, + { + name: 'Search', + type: 'line', + stack: 'Sum', + data: [820, 932, 901, 934, 1290, 1330, 1320] + } + ] +}; +line3.options = { + title: { + text: 'Miles', + }, + tooltip: { + trigger: 'axis' + }, + legend: { + data: ['Intention', 'Pre-order', 'Deal closed'], + textStyle: { + color: CHARTCONFIG.color.text + } + }, + toolbox: { + show: true, + feature: { + saveAsImage: {show: true, title: 'save'} + } + }, + calculable: true, + xAxis: [ + { + type: 'category', + boundaryGap: false, + data: ['Mon.', 'Tue.', 'Wed.', 'Thu.', 'Fri.', 'Sat.', 'Sun.'], + axisLabel: { + textStyle: { + color: CHARTCONFIG.color.text + } + }, + splitLine: { + lineStyle: { + color: CHARTCONFIG.color.splitLine + } + } + } + ], + yAxis: [ + { + type: 'value', + axisLabel: { + textStyle: { + color: CHARTCONFIG.color.text + } + }, + splitLine: { + lineStyle: { + color: CHARTCONFIG.color.splitLine + } + }, + splitArea: { + show: true, + areaStyle: { + color: CHARTCONFIG.color.splitArea + } + } + } + ], + series: [ + { + name: 'Deal closed', + type: 'line', + smooth: true, + itemStyle: {normal: {areaStyle: {type: 'default'}}}, + data: [10, 12, 21, 54, 260, 830, 710] + }, + { + name: 'Pre-order', + type: 'line', + smooth: true, + itemStyle: {normal: {areaStyle: {type: 'default'}}}, + data: [30, 182, 434, 791, 390, 30, 10] + }, + { + name: 'Intention', + type: 'line', + smooth: true, + itemStyle: {normal: {areaStyle: {type: 'default'}}}, + data: [1320, 1132, 601, 234, 120, 90, 20] + } + ] +}; +line4.options = { + tooltip: { + trigger: 'axis' + }, + legend: { + data: ['Email', 'Affiliate', 'Video Ads', 'Direct', 'Search'], + textStyle: { + color: CHARTCONFIG.color.text + } + }, + toolbox: { + show: true, + feature: { + saveAsImage: {show: true, title: 'save'} + } + }, + calculable: true, + xAxis: [ + { + type: 'category', + boundaryGap: false, + data: ['Mon.', 'Tue.', 'Wed.', 'Thu.', 'Fri.', 'Sat.', 'Sun.'], + axisLabel: { + textStyle: { + color: CHARTCONFIG.color.text + } + }, + splitLine: { + lineStyle: { + color: CHARTCONFIG.color.splitLine + } + } + } + ], + yAxis: [ + { + type: 'value', + axisLabel: { + textStyle: { + color: CHARTCONFIG.color.text + } + }, + splitLine: { + lineStyle: { + color: CHARTCONFIG.color.splitLine + } + }, + splitArea: { + show: true, + areaStyle: { + color: CHARTCONFIG.color.splitArea + } + } + } + ], + series: [ + { + name: 'Email', + type: 'line', + stack: 'Sum', + itemStyle: {normal: {areaStyle: {type: 'default'}}}, + data: [120, 132, 101, 134, 90, 230, 210] + }, + { + name: 'Affiliate', + type: 'line', + stack: 'Sum', + itemStyle: {normal: {areaStyle: {type: 'default'}}}, + data: [220, 182, 191, 234, 290, 330, 310] + }, + { + name: 'Video Ads', + type: 'line', + stack: 'Sum', + itemStyle: {normal: {areaStyle: {type: 'default'}}}, + data: [150, 232, 201, 154, 190, 330, 410] + }, + { + name: 'Direct', + type: 'line', + stack: 'Sum', + itemStyle: {normal: {areaStyle: {type: 'default'}}}, + data: [320, 332, 301, 334, 390, 330, 320] + }, + { + name: 'Search', + type: 'line', + stack: 'Sum', + itemStyle: {normal: {areaStyle: {type: 'default'}}}, + data: [820, 932, 901, 934, 1290, 1330, 1320] + } + ] +}; + + +const Line = () => ( +
      + +
      +
      + +
      +
      Base Line
      +
      + +
      +
      + +
      +
      + +
      +
      Stacked Line
      +
      + +
      +
      + +
      +
      + + +
      +
      + +
      +
      Base Area
      +
      + +
      +
      + +
      +
      + +
      +
      Stacked Area
      +
      + +
      +
      + +
      +
      + +
      +); + +module.exports = Line; diff --git a/src/routes/app/routes/charts/routes/line/index.js b/src/routes/app/routes/charts/routes/line/index.js new file mode 100644 index 0000000..7136b09 --- /dev/null +++ b/src/routes/app/routes/charts/routes/line/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'line', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Line')); + }); + } +}; diff --git a/src/routes/app/routes/charts/routes/more/components/More.js b/src/routes/app/routes/charts/routes/more/components/More.js new file mode 100644 index 0000000..5885c5a --- /dev/null +++ b/src/routes/app/routes/charts/routes/more/components/More.js @@ -0,0 +1,189 @@ +import React from 'react'; +import ReactEcharts from 'components/ReactECharts'; +import CHARTCONFIG from 'constants/ChartConfig'; + +const gauge1 = {}; +const pie5 = {}; + +const heatmapHours = [ + '12a', '1a', '2a', '3a', '4a', '5a', '6a', + '7a', '8a', '9a', '10a', '11a', + '12p', '1p', '2p', '3p', '4p', '5p', + '6p', '7p', '8p', '9p', '10p', '11p']; +const heatmapDays = ['Saturday', 'Friday', 'Thursday', + 'Wednesday', 'Tuesday', 'Monday', 'Sunday']; + +const heatmapDataSource = [[0, 0, 5], [0, 1, 1], [0, 2, 0], [0, 3, 0], [0, 4, 0], [0, 5, 0], [0, 6, 0], [0, 7, 0], [0, 8, 0], [0, 9, 0], [0, 10, 0], [0, 11, 2], [0, 12, 4], [0, 13, 1], [0, 14, 1], [0, 15, 3], [0, 16, 4], [0, 17, 6], [0, 18, 4], [0, 19, 4], [0, 20, 3], [0, 21, 3], [0, 22, 2], [0, 23, 5], [1, 0, 7], [1, 1, 0], [1, 2, 0], [1, 3, 0], [1, 4, 0], [1, 5, 0], [1, 6, 0], [1, 7, 0], [1, 8, 0], [1, 9, 0], [1, 10, 5], [1, 11, 2], [1, 12, 2], [1, 13, 6], [1, 14, 9], [1, 15, 11], [1, 16, 6], [1, 17, 7], [1, 18, 8], [1, 19, 12], [1, 20, 5], [1, 21, 5], [1, 22, 7], [1, 23, 2], [2, 0, 1], [2, 1, 1], [2, 2, 0], [2, 3, 0], [2, 4, 0], [2, 5, 0], [2, 6, 0], [2, 7, 0], [2, 8, 0], [2, 9, 0], [2, 10, 3], [2, 11, 2], [2, 12, 1], [2, 13, 9], [2, 14, 8], [2, 15, 10], [2, 16, 6], [2, 17, 5], [2, 18, 5], [2, 19, 5], [2, 20, 7], [2, 21, 4], [2, 22, 2], [2, 23, 4], [3, 0, 7], [3, 1, 3], [3, 2, 0], [3, 3, 0], [3, 4, 0], [3, 5, 0], [3, 6, 0], [3, 7, 0], [3, 8, 1], [3, 9, 0], [3, 10, 5], [3, 11, 4], [3, 12, 7], [3, 13, 14], [3, 14, 13], [3, 15, 12], [3, 16, 9], [3, 17, 5], [3, 18, 5], [3, 19, 10], [3, 20, 6], [3, 21, 4], [3, 22, 4], [3, 23, 1], [4, 0, 1], [4, 1, 3], [4, 2, 0], [4, 3, 0], [4, 4, 0], [4, 5, 1], [4, 6, 0], [4, 7, 0], [4, 8, 0], [4, 9, 2], [4, 10, 4], [4, 11, 4], [4, 12, 2], [4, 13, 4], [4, 14, 4], [4, 15, 14], [4, 16, 12], [4, 17, 1], [4, 18, 8], [4, 19, 5], [4, 20, 3], [4, 21, 7], [4, 22, 3], [4, 23, 0], [5, 0, 2], [5, 1, 1], [5, 2, 0], [5, 3, 3], [5, 4, 0], [5, 5, 0], [5, 6, 0], [5, 7, 0], [5, 8, 2], [5, 9, 0], [5, 10, 4], [5, 11, 1], [5, 12, 5], [5, 13, 10], [5, 14, 5], [5, 15, 7], [5, 16, 11], [5, 17, 6], [5, 18, 0], [5, 19, 5], [5, 20, 3], [5, 21, 4], [5, 22, 2], [5, 23, 0], [6, 0, 1], [6, 1, 0], [6, 2, 0], [6, 3, 0], [6, 4, 0], [6, 5, 0], [6, 6, 0], [6, 7, 0], [6, 8, 0], [6, 9, 0], [6, 10, 1], [6, 11, 0], [6, 12, 2], [6, 13, 1], [6, 14, 3], [6, 15, 4], [6, 16, 0], [6, 17, 0], [6, 18, 0], [6, 19, 0], [6, 20, 1], [6, 21, 2], [6, 22, 2], [6, 23, 6]]; + +const heatmapData = heatmapDataSource.map(item => [item[1], item[0], item[2] || '-']); +const heatmap1 = {}; + + +gauge1.options = { + tooltip: { + formatter: '{a}
      {b} : {c}%' + }, + toolbox: { + show: true, + feature: { + saveAsImage: {show: true, title: 'save'} + } + }, + series: [ + { + name: 'Business metric', + type: 'gauge', + detail: {formatter: '{value}%'}, + data: [{value: 50, name: 'Completion'}], + title: { + textStyle: { + color: CHARTCONFIG.color.text + } + } + } + ] +}; + +pie5.options = { + tooltip: { + trigger: 'item', + formatter: '{a}
      {b}: {c} ({d}%)' + }, + legend: { + show: false, + orient: 'vertical', + x: 'left', + data: ['Direct', 'Ads', 'Search', 'Email Marketing', 'Affiliates', 'Video Ads', 'Google', 'Bing', 'Others'], + textStyle: { + color: CHARTCONFIG.color.text + } + }, + series: [ + { + name: 'Traffic Source', + type: 'pie', + selectedMode: 'single', + radius: [0, '30%'], + + label: { + normal: { + position: 'inner' + } + }, + labelLine: { + normal: { + show: false + } + }, + data: [ + {value: 355, name: 'Direct', selected: true}, + {value: 679, name: 'Ads'}, + {value: 1401, name: 'Search'} + ] + }, + { + name: 'Traffic Source', + type: 'pie', + radius: ['40%', '55%'], + data: [ + {value: 355, name: 'Direct'}, + {value: 310, name: 'Email Marketing'}, + {value: 234, name: 'Affiliates'}, + {value: 135, name: 'Video Ads'}, + {value: 1048, name: 'Google'}, + {value: 251, name: 'Bing'}, + {value: 102, name: 'Others'} + ] + } + ] +}; + + +heatmap1.options = { + tooltip: { + position: 'top' + }, + animation: false, + grid: { + height: '50%', + y: '10%' + }, + xAxis: { + type: 'category', + data: heatmapHours, + splitArea: { + show: true + } + }, + yAxis: { + type: 'category', + data: heatmapDays, + splitArea: { + show: true + } + }, + visualMap: { + min: 0, + max: 10, + calculable: true, + orient: 'horizontal', + left: 'center', + bottom: '15%' + }, + series: [{ + name: 'Punch Card', + type: 'heatmap', + data: heatmapData, + label: { + normal: { + show: true + } + }, + itemStyle: { + emphasis: { + shadowBlur: 10, + shadowColor: 'rgba(0, 0, 0, 0.5)' + } + } + }] +}; + + +const More = () => ( +
      + +
      +
      + +
      +
      Gauge
      +
      + +
      +
      + +
      +
      + +
      +
      Pie
      +
      + +
      +
      + +
      +
      + + +
      +
      Heatmap
      +
      + +
      +
      + +
      +); + +module.exports = More; diff --git a/src/routes/app/routes/charts/routes/more/index.js b/src/routes/app/routes/charts/routes/more/index.js new file mode 100644 index 0000000..7a2a0e1 --- /dev/null +++ b/src/routes/app/routes/charts/routes/more/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'more', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/More')); + }); + } +}; diff --git a/src/routes/app/routes/charts/routes/pie/components/Pie.js b/src/routes/app/routes/charts/routes/pie/components/Pie.js new file mode 100644 index 0000000..8cad0e5 --- /dev/null +++ b/src/routes/app/routes/charts/routes/pie/components/Pie.js @@ -0,0 +1,232 @@ +import React from 'react'; +import ReactEcharts from 'components/ReactECharts'; +import CHARTCONFIG from 'constants/ChartConfig'; + +const pie1 = {}; +const pie2 = {}; +const pie4 = {}; + +pie1.options = { + title: { + text: 'Traffic Source', + x: 'center' + }, + tooltip: { + trigger: 'item', + formatter: '{a}
      {b} : {c} ({d}%)' + }, + legend: { + orient: 'vertical', + x: 'left', + data: ['Direct', 'Email', 'Affiliate', 'Video Ads', 'Search'], + textStyle: { + color: CHARTCONFIG.color.text + } + }, + toolbox: { + show: true, + feature: { + saveAsImage: {show: true, title: 'save'} + } + }, + calculable: true, + series: [ + { + name: 'Vist source', + type: 'pie', + radius: '55%', + center: ['50%', '60%'], + data: [ + {value: 335, name: 'Direct'}, + {value: 310, name: 'Email'}, + {value: 234, name: 'Affiliate'}, + {value: 135, name: 'Video Ads'}, + {value: 1548, name: 'Search'} + ] + } + ] +}; +pie2.options = { + tooltip: { + trigger: 'item', + formatter: '{a}
      {b} : {c} ({d}%)' + }, + legend: { + orient: 'vertical', + x: 'left', + data: ['Direct', 'Email', 'Affiliate', 'Video Ads', 'Search'], + textStyle: { + color: CHARTCONFIG.color.text + } + }, + toolbox: { + show: true, + feature: { + saveAsImage: {show: true, title: 'save'} + } + }, + calculable: true, + series: [ + { + name: 'Traffic source', + type: 'pie', + radius: ['50%', '70%'], + itemStyle: { + normal: { + label: { + show: false + }, + labelLine: { + show: false + } + }, + emphasis: { + label: { + show: true, + position: 'center', + textStyle: { + fontSize: '30', + fontWeight: 'bold' + } + } + } + }, + data: [ + {value: 335, name: 'Direct'}, + {value: 310, name: 'Email'}, + {value: 234, name: 'Affiliate'}, + {value: 135, name: 'Video Ads'}, + {value: 1548, name: 'Search'} + ] + } + ] +}; +pie4.options = { + title: { + text: 'Nightingale rose diagram', + x: 'center' + }, + tooltip: { + trigger: 'item', + formatter: '{a}
      {b} : {c} ({d}%)' + }, + legend: { + x: 'center', + y: 'bottom', + data: ['rose1', 'rose2', 'rose3', 'rose4', 'rose5', 'rose6', 'rose7', 'rose8'], + textStyle: { + color: CHARTCONFIG.color.text + } + }, + toolbox: { + show: true, + feature: { + saveAsImage: {show: true, title: 'save'} + } + }, + calculable: true, + series: [ + { + name: 'Radius model', + type: 'pie', + radius: [20, 110], + center: ['25%', 200], + roseType: 'radius', + width: '40%', // for funnel + max: 40, // for funnel + itemStyle: { + normal: { + label: { + show: false + }, + labelLine: { + show: false + } + }, + emphasis: { + label: { + show: true + }, + labelLine: { + show: true + } + } + }, + data: [ + {value: 10, name: 'rose1'}, + {value: 5, name: 'rose2'}, + {value: 15, name: 'rose3'}, + {value: 25, name: 'rose4'}, + {value: 20, name: 'rose5'}, + {value: 35, name: 'rose6'}, + {value: 30, name: 'rose7'}, + {value: 40, name: 'rose8'} + ] + }, + { + name: 'Area model', + type: 'pie', + radius: [30, 110], + center: ['75%', 200], + roseType: 'area', + x: '50%', // for funnel + max: 40, // for funnel + sort: 'ascending', // for funnel + data: [ + {value: 10, name: 'rose1'}, + {value: 5, name: 'rose2'}, + {value: 15, name: 'rose3'}, + {value: 25, name: 'rose4'}, + {value: 20, name: 'rose5'}, + {value: 35, name: 'rose6'}, + {value: 30, name: 'rose7'}, + {value: 40, name: 'rose8'} + ] + } + ] + +}; + +const Pie = () => ( +
      + +
      +
      + +
      +
      Basic Pie
      +
      + +
      +
      + +
      +
      + +
      +
      Doughnut
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      Nightingale's Rose Diagram
      +
      + +
      +
      + +
      +
      + +
      +); + +module.exports = Pie; diff --git a/src/routes/app/routes/charts/routes/pie/index.js b/src/routes/app/routes/charts/routes/pie/index.js new file mode 100644 index 0000000..d75376c --- /dev/null +++ b/src/routes/app/routes/charts/routes/pie/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'pie', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Pie')); + }); + } +}; diff --git a/src/routes/app/routes/charts/routes/radar/components/Radar.js b/src/routes/app/routes/charts/routes/radar/components/Radar.js new file mode 100644 index 0000000..ad6d011 --- /dev/null +++ b/src/routes/app/routes/charts/routes/radar/components/Radar.js @@ -0,0 +1,333 @@ +import React from 'react'; +import ReactEcharts from 'components/ReactECharts'; +import CHARTCONFIG from 'constants/ChartConfig'; + +const radar1 = {}; +const radar2 = {}; +const radar3 = {}; + +radar1.options = { + title: { + text: 'Budget vs spending' + }, + tooltip: {}, + legend: { + orient: 'vertical', + x: 'right', + y: 'bottom', + data: ['Allocated Budget', 'Actual Spending'], + textStyle: { + color: CHARTCONFIG.color.text + } + }, + toolbox: { + show: true, + feature: { + saveAsImage: {show: true, title: 'save'} + } + }, + radar: [ + { + axisLine: { + show: true, + lineStyle: { + // for both indicator and axisLine, bad, better seperate them + color: '#b1b1b1' + } + }, + splitLine: { + lineStyle: { + color: 'rgba(0,0,0,.1)' + } + }, + splitArea: { + show: true, + areaStyle: { + color: CHARTCONFIG.color.splitArea + } + }, + indicator: [ + { name: 'Miles', max: 6000}, + { name: 'Administration', max: 16000}, + { name: 'Information Techology', max: 30000}, + { name: 'Customer Support', max: 38000}, + { name: 'Development', max: 52000}, + { name: 'Marketing', max: 25000} + ] + } + ], + calculable: true, + series: [ + { + name: 'Budget vs spending', + type: 'radar', + data: [ + { + value: [4300, 10000, 28000, 35000, 50000, 19000], + name: 'Allocated Budget' + }, + { + value: [5000, 14000, 28000, 31000, 42000, 21000], + name: 'Actual Spending' + } + ] + } + ] +}; +radar2.options = { + tooltip: {}, + legend: { + x: 'center', + data: ['Ronaldo', 'Andriy Shevchenko'], + textStyle: { + color: CHARTCONFIG.color.text + } + }, + toolbox: { + show: true, + feature: { + saveAsImage: {show: true, title: 'save'} + } + }, + calculable: true, + radar: [ + { + axisLine: { + show: true, + lineStyle: { + // for both indicator and axisLine, bad, better seperate them + color: '#b1b1b1' + } + }, + splitLine: { + lineStyle: { + color: 'rgba(0,0,0,.1)' + } + }, + splitArea: { + show: true, + areaStyle: { + color: CHARTCONFIG.color.splitArea + } + }, + indicator: [ + {name: 'Attack', max: 100}, + {name: 'Guard', max: 100}, + {name: 'Physical', max: 100}, + {name: 'Speed', max: 100}, + {name: 'Strength', max: 100}, + {name: 'Skill', max: 100} + ], + radius: 130 + } + ], + series: [ + { + name: 'Full of live data', + type: 'radar', + itemStyle: { + normal: { + areaStyle: { + type: 'default' + } + } + }, + data: [ + { + value: [97, 42, 88, 94, 90, 86], + name: 'Andriy Shevchenko' + }, + { + value: [97, 32, 74, 95, 88, 92], + name: 'Ronaldo' + } + ] + } + ] +}; +radar3.options = { + // title: { + // text: 'Mutiple Radar' + // }, + tooltip: { + trigger: 'axis' + }, + legend: { + x: 'center', + data: ['Software', 'Galaxy Phone', 'iPhone', 'Precipitation', 'Evaporation'], + textStyle: { + color: CHARTCONFIG.color.text + } + }, + radar: [ + { + axisLine: { + show: true, + lineStyle: { + // for both indicator and axisLine, bad, better seperate them + color: '#b1b1b1' + } + }, + splitLine: { + lineStyle: { + color: 'rgba(0,0,0,.1)' + } + }, + splitArea: { + show: true, + areaStyle: { + color: CHARTCONFIG.color.splitArea + } + }, + indicator: [ + {text: 'Brand', max: 100}, + {text: 'Content', max: 100}, + {text: 'Usability', max: 100}, + {text: 'Features', max: 100} + ], + center: ['25%', '40%'], + radius: 80 + }, + { + axisLine: { + show: true, + lineStyle: { + // for both indicator and axisLine, bad, better seperate them + color: '#b1b1b1' + } + }, + splitLine: { + lineStyle: { + color: 'rgba(0,0,0,.1)' + } + }, + splitArea: { + show: true, + areaStyle: { + color: CHARTCONFIG.color.splitArea + } + }, + indicator: [ + {text: 'Look', max: 100}, + {text: 'Camera', max: 100}, + {text: 'System', max: 100}, + {text: 'Performance', max: 100}, + {text: 'Display', max: 100} + ], + radius: 80, + center: ['50%', '60%'], + }, + { + axisLine: { + show: true, + lineStyle: { + // for both indicator and axisLine, bad, better seperate them + color: '#b1b1b1' + } + }, + splitLine: { + lineStyle: { + color: 'rgba(0,0,0,.1)' + } + }, + splitArea: { + show: true, + areaStyle: { + color: CHARTCONFIG.color.splitArea + } + }, + indicator: (function () { + const res = []; + for (let i = 1; i <= 12; i++) { + res.push({text: `Mon. ${i}`, max: 100}); + } + return res; + }()), + center: ['75%', '40%'], + radius: 80 + } + ], + series: [ + { + type: 'radar', + tooltip: { + trigger: 'item' + }, + itemStyle: {normal: {areaStyle: {type: 'default'}}}, + data: [ + { + value: [60, 73, 85, 40], + name: 'Software' + } + ] + }, + { + type: 'radar', + radarIndex: 1, + data: [ + { + value: [85, 90, 90, 95, 95], + name: 'Galaxy Phone' + }, + { + value: [95, 80, 95, 90, 93], + name: 'iPhone' + } + ] + }, + { + type: 'radar', + radarIndex: 2, + itemStyle: {normal: {areaStyle: {type: 'default'}}}, + data: [ + { + name: 'Precipitation', + value: [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 75.6, 82.2, 48.7, 18.8, 6.0, 2.3], + }, + { + name: 'Evaporation', + value: [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 35.6, 62.2, 32.6, 20.0, 6.4, 3.3] + } + ] + } + ] +}; + +const Radar = () => ( +
      + +
      +
      + +
      +
      Basic Radar
      +
      + +
      +
      + +
      +
      + +
      +
      Basic Filled Radar
      +
      + +
      +
      + +
      +
      + + +
      +
      Basic Gauge
      +
      + +
      +
      + +
      +); + +module.exports = Radar; diff --git a/src/routes/app/routes/charts/routes/radar/index.js b/src/routes/app/routes/charts/routes/radar/index.js new file mode 100644 index 0000000..1a4c375 --- /dev/null +++ b/src/routes/app/routes/charts/routes/radar/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'radar', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Radar')); + }); + } +}; diff --git a/src/routes/app/routes/charts/routes/scatter/components/Scatter.js b/src/routes/app/routes/charts/routes/scatter/components/Scatter.js new file mode 100644 index 0000000..2080266 --- /dev/null +++ b/src/routes/app/routes/charts/routes/scatter/components/Scatter.js @@ -0,0 +1,366 @@ +import React from 'react'; +import ReactEcharts from 'components/ReactECharts'; +import CHARTCONFIG from 'constants/ChartConfig'; + +const scatter1 = {}; +const scatter2 = {}; + +scatter1.options = { + title: { + text: 'Height and weight distribution', + subtext: 'Data: Heinz 2003' + }, + tooltip: { + trigger: 'axis', + showDelay: 0, + formatter(params) { + if (params.value.length > 1) { + return `${params.seriesName} :
      ${ + params.value[0]}cm ${ + params.value[1]}kg `; + } + + return `${params.seriesName} :
      ${ + params.name} : ${ + params.value}kg `; + + }, + axisPointer: { + show: true, + type: 'cross', + lineStyle: { + type: 'dashed', + width: 1 + } + } + }, + legend: { + data: ['Femail', 'Male'], + textStyle: { + color: CHARTCONFIG.color.text + } + }, + toolbox: { + show: true, + feature: { + saveAsImage: {show: true, title: 'save'} + } + }, + xAxis: [ + { + type: 'value', + scale: true, + axisLabel: { + formatter: '{value} cm', + textStyle: { + color: CHARTCONFIG.color.text + } + }, + splitLine: { + lineStyle: { + color: CHARTCONFIG.color.splitLine + } + }, + splitArea: { + show: false + } + } + ], + yAxis: [ + { + type: 'value', + scale: true, + axisLabel: { + formatter: '{value} kg', + textStyle: { + color: CHARTCONFIG.color.text + } + }, + splitLine: { + lineStyle: { + color: CHARTCONFIG.color.splitLine + } + }, + splitArea: { + show: true, + areaStyle: { + color: CHARTCONFIG.color.splitArea + } + } + } + ], + series: [ + { + name: 'Femail', + type: 'scatter', + data: [ + [161.2, 51.6], [167.5, 59.0], [159.5, 49.2], [157.0, 63.0], [155.8, 53.6], + [170.0, 59.0], [159.1, 47.6], [166.0, 69.8], [176.2, 66.8], [160.2, 75.2], + [172.5, 55.2], [170.9, 54.2], [172.9, 62.5], [153.4, 42.0], [160.0, 50.0], + [147.2, 49.8], [168.2, 49.2], [175.0, 73.2], [157.0, 47.8], [167.6, 68.8], + [159.5, 50.6], [175.0, 82.5], [166.8, 57.2], [176.5, 87.8], [170.2, 72.8], + [174.0, 54.5], [173.0, 59.8], [179.9, 67.3], [170.5, 67.8], [160.0, 47.0], + [154.4, 46.2], [162.0, 55.0], [176.5, 83.0], [160.0, 54.4], [152.0, 45.8], + [162.1, 53.6], [170.0, 73.2], [160.2, 52.1], [161.3, 67.9], [166.4, 56.6], + [168.9, 62.3], [163.8, 58.5], [167.6, 54.5], [160.0, 50.2], [161.3, 60.3], + [167.6, 58.3], [165.1, 56.2], [160.0, 50.2], [170.0, 72.9], [157.5, 59.8], + [167.6, 61.0], [160.7, 69.1], [163.2, 55.9], [152.4, 46.5], [157.5, 54.3], + [168.3, 54.8], [180.3, 60.7], [165.5, 60.0], [165.0, 62.0], [164.5, 60.3], + [156.0, 52.7], [160.0, 74.3], [163.0, 62.0], [165.7, 73.1], [161.0, 80.0], + [162.0, 54.7], [166.0, 53.2], [174.0, 75.7], [172.7, 61.1], [167.6, 55.7], + [151.1, 48.7], [164.5, 52.3], [163.5, 50.0], [152.0, 59.3], [169.0, 62.5], + [164.0, 55.7], [161.2, 54.8], [155.0, 45.9], [170.0, 70.6], [176.2, 67.2], + [170.0, 69.4], [162.5, 58.2], [170.3, 64.8], [164.1, 71.6], [169.5, 52.8], + [163.2, 59.8], [154.5, 49.0], [159.8, 50.0], [173.2, 69.2], [170.0, 55.9], + [161.4, 63.4], [169.0, 58.2], [166.2, 58.6], [159.4, 45.7], [162.5, 52.2], + [159.0, 48.6], [162.8, 57.8], [159.0, 55.6], [179.8, 66.8], [162.9, 59.4], + [161.0, 53.6], [151.1, 73.2], [168.2, 53.4], [168.9, 69.0], [173.2, 58.4], + [171.8, 56.2], [178.0, 70.6], [164.3, 59.8], [163.0, 72.0], [168.5, 65.2], + [166.8, 56.6], [172.7, 105.2], [163.5, 51.8], [169.4, 63.4], [167.8, 59.0], + [159.5, 47.6], [167.6, 63.0], [161.2, 55.2], [160.0, 45.0], [163.2, 54.0], + [162.2, 50.2], [161.3, 60.2], [149.5, 44.8], [157.5, 58.8], [163.2, 56.4], + [172.7, 62.0], [155.0, 49.2], [156.5, 67.2], [164.0, 53.8], [160.9, 54.4], + [162.8, 58.0], [167.0, 59.8], [160.0, 54.8], [160.0, 43.2], [168.9, 60.5], + [158.2, 46.4], [156.0, 64.4], [160.0, 48.8], [167.1, 62.2], [158.0, 55.5], + [167.6, 57.8], [156.0, 54.6], [162.1, 59.2], [173.4, 52.7], [159.8, 53.2], + [170.5, 64.5], [159.2, 51.8], [157.5, 56.0], [161.3, 63.6], [162.6, 63.2], + [160.0, 59.5], [168.9, 56.8], [165.1, 64.1], [162.6, 50.0], [165.1, 72.3], + [166.4, 55.0], [160.0, 55.9], [152.4, 60.4], [170.2, 69.1], [162.6, 84.5], + [170.2, 55.9], [158.8, 55.5], [172.7, 69.5], [167.6, 76.4], [162.6, 61.4], + [167.6, 65.9], [156.2, 58.6], [175.2, 66.8], [172.1, 56.6], [162.6, 58.6], + [160.0, 55.9], [165.1, 59.1], [182.9, 81.8], [166.4, 70.7], [165.1, 56.8], + [177.8, 60.0], [165.1, 58.2], [175.3, 72.7], [154.9, 54.1], [158.8, 49.1], + [172.7, 75.9], [168.9, 55.0], [161.3, 57.3], [167.6, 55.0], [165.1, 65.5], + [175.3, 65.5], [157.5, 48.6], [163.8, 58.6], [167.6, 63.6], [165.1, 55.2], + [165.1, 62.7], [168.9, 56.6], [162.6, 53.9], [164.5, 63.2], [176.5, 73.6], + [168.9, 62.0], [175.3, 63.6], [159.4, 53.2], [160.0, 53.4], [170.2, 55.0], + [162.6, 70.5], [167.6, 54.5], [162.6, 54.5], [160.7, 55.9], [160.0, 59.0], + [157.5, 63.6], [162.6, 54.5], [152.4, 47.3], [170.2, 67.7], [165.1, 80.9], + [172.7, 70.5], [165.1, 60.9], [170.2, 63.6], [170.2, 54.5], [170.2, 59.1], + [161.3, 70.5], [167.6, 52.7], [167.6, 62.7], [165.1, 86.3], [162.6, 66.4], + [152.4, 67.3], [168.9, 63.0], [170.2, 73.6], [175.2, 62.3], [175.2, 57.7], + [160.0, 55.4], [165.1, 104.1], [174.0, 55.5], [170.2, 77.3], [160.0, 80.5], + [167.6, 64.5], [167.6, 72.3], [167.6, 61.4], [154.9, 58.2], [162.6, 81.8], + [175.3, 63.6], [171.4, 53.4], [157.5, 54.5], [165.1, 53.6], [160.0, 60.0], + [174.0, 73.6], [162.6, 61.4], [174.0, 55.5], [162.6, 63.6], [161.3, 60.9], + [156.2, 60.0], [149.9, 46.8], [169.5, 57.3], [160.0, 64.1], [175.3, 63.6], + [169.5, 67.3], [160.0, 75.5], [172.7, 68.2], [162.6, 61.4], [157.5, 76.8], + [176.5, 71.8], [164.4, 55.5], [160.7, 48.6], [174.0, 66.4], [163.8, 67.3] + ], + markPoint: { + data: [ + {type: 'max', name: 'Max'}, + {type: 'min', name: 'Min'} + ] + }, + markLine: { + data: [ + {type: 'average', name: 'Average'} + ] + } + }, + { + name: 'Male', + type: 'scatter', + data: [ + [174.0, 65.6], [175.3, 71.8], [193.5, 80.7], [186.5, 72.6], [187.2, 78.8], + [181.5, 74.8], [184.0, 86.4], [184.5, 78.4], [175.0, 62.0], [184.0, 81.6], + [180.0, 76.6], [177.8, 83.6], [192.0, 90.0], [176.0, 74.6], [174.0, 71.0], + [184.0, 79.6], [192.7, 93.8], [171.5, 70.0], [173.0, 72.4], [176.0, 85.9], + [176.0, 78.8], [180.5, 77.8], [172.7, 66.2], [176.0, 86.4], [173.5, 81.8], + [178.0, 89.6], [180.3, 82.8], [180.3, 76.4], [164.5, 63.2], [173.0, 60.9], + [183.5, 74.8], [175.5, 70.0], [188.0, 72.4], [189.2, 84.1], [172.8, 69.1], + [170.0, 59.5], [182.0, 67.2], [170.0, 61.3], [177.8, 68.6], [184.2, 80.1], + [186.7, 87.8], [171.4, 84.7], [172.7, 73.4], [175.3, 72.1], [180.3, 82.6], + [182.9, 88.7], [188.0, 84.1], [177.2, 94.1], [172.1, 74.9], [167.0, 59.1], + [169.5, 75.6], [174.0, 86.2], [172.7, 75.3], [182.2, 87.1], [164.1, 55.2], + [163.0, 57.0], [171.5, 61.4], [184.2, 76.8], [174.0, 86.8], [174.0, 72.2], + [177.0, 71.6], [186.0, 84.8], [167.0, 68.2], [171.8, 66.1], [182.0, 72.0], + [167.0, 64.6], [177.8, 74.8], [164.5, 70.0], [192.0, 101.6], [175.5, 63.2], + [171.2, 79.1], [181.6, 78.9], [167.4, 67.7], [181.1, 66.0], [177.0, 68.2], + [174.5, 63.9], [177.5, 72.0], [170.5, 56.8], [182.4, 74.5], [197.1, 90.9], + [180.1, 93.0], [175.5, 80.9], [180.6, 72.7], [184.4, 68.0], [175.5, 70.9], + [180.6, 72.5], [177.0, 72.5], [177.1, 83.4], [181.6, 75.5], [176.5, 73.0], + [175.0, 70.2], [174.0, 73.4], [165.1, 70.5], [177.0, 68.9], [192.0, 102.3], + [176.5, 68.4], [169.4, 65.9], [182.1, 75.7], [179.8, 84.5], [175.3, 87.7], + [184.9, 86.4], [177.3, 73.2], [167.4, 53.9], [178.1, 72.0], [168.9, 55.5], + [157.2, 58.4], [180.3, 83.2], [170.2, 72.7], [177.8, 64.1], [172.7, 72.3], + [165.1, 65.0], [186.7, 86.4], [165.1, 65.0], [174.0, 88.6], [175.3, 84.1], + [185.4, 66.8], [177.8, 75.5], [180.3, 93.2], [180.3, 82.7], [177.8, 58.0], + [177.8, 79.5], [177.8, 78.6], [177.8, 71.8], [177.8, 116.4], [163.8, 72.2], + [188.0, 83.6], [198.1, 85.5], [175.3, 90.9], [166.4, 85.9], [190.5, 89.1], + [166.4, 75.0], [177.8, 77.7], [179.7, 86.4], [172.7, 90.9], [190.5, 73.6], + [185.4, 76.4], [168.9, 69.1], [167.6, 84.5], [175.3, 64.5], [170.2, 69.1], + [190.5, 108.6], [177.8, 86.4], [190.5, 80.9], [177.8, 87.7], [184.2, 94.5], + [176.5, 80.2], [177.8, 72.0], [180.3, 71.4], [171.4, 72.7], [172.7, 84.1], + [172.7, 76.8], [177.8, 63.6], [177.8, 80.9], [182.9, 80.9], [170.2, 85.5], + [167.6, 68.6], [175.3, 67.7], [165.1, 66.4], [185.4, 102.3], [181.6, 70.5], + [172.7, 95.9], [190.5, 84.1], [179.1, 87.3], [175.3, 71.8], [170.2, 65.9], + [193.0, 95.9], [171.4, 91.4], [177.8, 81.8], [177.8, 96.8], [167.6, 69.1], + [167.6, 82.7], [180.3, 75.5], [182.9, 79.5], [176.5, 73.6], [186.7, 91.8], + [188.0, 84.1], [188.0, 85.9], [177.8, 81.8], [174.0, 82.5], [177.8, 80.5], + [171.4, 70.0], [185.4, 81.8], [185.4, 84.1], [188.0, 90.5], [188.0, 91.4], + [182.9, 89.1], [176.5, 85.0], [175.3, 69.1], [175.3, 73.6], [188.0, 80.5], + [188.0, 82.7], [175.3, 86.4], [170.5, 67.7], [179.1, 92.7], [177.8, 93.6], + [175.3, 70.9], [182.9, 75.0], [170.8, 93.2], [188.0, 93.2], [180.3, 77.7], + [177.8, 61.4], [185.4, 94.1], [168.9, 75.0], [185.4, 83.6], [180.3, 85.5], + [174.0, 73.9], [167.6, 66.8], [182.9, 87.3], [160.0, 72.3], [180.3, 88.6], + [167.6, 75.5], [186.7, 101.4], [175.3, 91.1], [175.3, 67.3], [175.9, 77.7], + [175.3, 81.8], [179.1, 75.5], [181.6, 84.5], [177.8, 76.6], [182.9, 85.0], + [177.8, 102.5], [184.2, 77.3], [179.1, 71.8], [176.5, 87.9], [188.0, 94.3], + [174.0, 70.9], [167.6, 64.5], [170.2, 77.3], [167.6, 72.3], [188.0, 87.3], + [174.0, 80.0], [176.5, 82.3], [180.3, 73.6], [167.6, 74.1], [188.0, 85.9], + [180.3, 73.2], [167.6, 76.3], [183.0, 65.9], [183.0, 90.9], [179.1, 89.1], + [170.2, 62.3], [177.8, 82.7], [179.1, 79.1], [190.5, 98.2], [177.8, 84.1], + [180.3, 83.2], [180.3, 83.2] + ], + markPoint: { + data: [ + {type: 'max', name: 'Max'}, + {type: 'min', name: 'Min'} + ] + }, + markLine: { + data: [ + {type: 'average', name: 'Average'} + ] + } + } + ] +}; +function random() { + const r = Math.round(Math.random() * 100); + return (r * (r % 2 === 0 ? 1 : -1)); +} +function randomDataArray() { + const d = []; + let len = 100; + while (len--) { + d.push([ + random(), + random(), + Math.abs(random()), + ]); + } + return d; +} +scatter2.options = { + tooltip: { + trigger: 'axis', + showDelay: 0, + axisPointer: { + show: true, + type: 'cross', + lineStyle: { + type: 'dashed', + width: 1 + } + } + }, + legend: { + data: ['scatter1', 'scatter2'], + textStyle: { + color: CHARTCONFIG.color.text + } + }, + toolbox: { + show: true, + feature: { + saveAsImage: {show: true, title: 'save'} + } + }, + xAxis: [ + { + type: 'value', + splitNumber: 4, + scale: true, + axisLabel: { + textStyle: { + color: CHARTCONFIG.color.text + } + }, + splitLine: { + lineStyle: { + color: CHARTCONFIG.color.splitLine + } + }, + splitArea: { + show: false + } + } + ], + yAxis: [ + { + type: 'value', + splitNumber: 4, + scale: true, + axisLabel: { + textStyle: { + color: CHARTCONFIG.color.text + } + }, + splitLine: { + lineStyle: { + color: CHARTCONFIG.color.splitLine + } + }, + splitArea: { + show: true, + areaStyle: { + color: CHARTCONFIG.color.splitArea + } + } + } + ], + series: [ + { + name: 'scatter1', + type: 'scatter', + symbolSize(value) { + return Math.round(value[2] / 5); + }, + data: randomDataArray() + }, + { + name: 'scatter2', + type: 'scatter', + symbolSize(value) { + return Math.round(value[2] / 5); + }, + data: randomDataArray() + } + ] +}; + +const Scatter = () => ( +
      + +
      +
      + +
      +
      Basic Scatter
      +
      + +
      +
      + +
      +
      +
      +
      + +
      +
      Basic Bubble
      +
      + +
      +
      + +
      +
      + +
      +); + +module.exports = Scatter; diff --git a/src/routes/app/routes/charts/routes/scatter/index.js b/src/routes/app/routes/charts/routes/scatter/index.js new file mode 100644 index 0000000..b2187d5 --- /dev/null +++ b/src/routes/app/routes/charts/routes/scatter/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'Scatter', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Scatter')); + }); + } +}; diff --git a/src/routes/app/routes/dashboard/components/AquisitionChart.js b/src/routes/app/routes/dashboard/components/AquisitionChart.js new file mode 100644 index 0000000..ce5483f --- /dev/null +++ b/src/routes/app/routes/dashboard/components/AquisitionChart.js @@ -0,0 +1,71 @@ +import React from 'react'; +import ReactEcharts from 'components/ReactECharts'; + +const data = [{ + value: 350, + name: 'Display', +}, { + value: 560, + name: 'Social' +}, { + value: 980, + name: 'Direct' +}, { + value: 760, + name: 'Search' +}, { + value: 320, + name: 'Referrals' +}]; + +const pie = {}; +pie.options = { + tooltip: { + show: true, + trigger: 'item', + formatter: '{b}: {c} ({d}%)' + }, + legend: { + show: false, + orient: 'vertical', + x: 'right', + data: ['Display', 'Social', 'Direct', 'Search', 'Referrals'], + }, + series: [{ + type: 'pie', + selectedMode: 'single', + radius: ['40%', '52%'], + color: [ + '#EFE04C', + '#69D361', + '#47DAB5', + '#4AC3D6', + '#5EA1DA', + ], + label: { + normal: { + position: 'outside', + formatter: '{b}', + textStyle: { + fontSize: 12 + } + } + }, + labelLine: { + normal: { + show: true + } + }, + data, + markPint: { + symbol: 'diamond', + data: [{symbol: 'diamond', }] + } + }] +}; + +const Chart = () => ( + +); + +module.exports = Chart; diff --git a/src/routes/app/routes/dashboard/components/BenchmarkChart.js b/src/routes/app/routes/dashboard/components/BenchmarkChart.js new file mode 100644 index 0000000..6a0628e --- /dev/null +++ b/src/routes/app/routes/dashboard/components/BenchmarkChart.js @@ -0,0 +1,83 @@ +import React from 'react'; +import ReactEcharts from 'components/ReactECharts'; +import CHARTCONFIG from 'constants/ChartConfig'; + +const radar = {}; +radar.options = { + legend: { + orient: 'vertical', + x: 'right', + y: 'bottom', + data: ['Plan Average', 'Independence Blue Cross & Blue Shield'], + textStyle: { + color: CHARTCONFIG.color.text + } + }, + toolbox: { + show: false, + }, + radar: [ + { + axisLine: { + show: true, + lineStyle: { + // for both indicator and axisLine, bad, better seperate them + color: '#b1b1b1' + } + }, + splitLine: { + lineStyle: { + color: 'rgba(0,0,0,.1)' + } + }, + splitArea: { + show: true, + areaStyle: { + color: CHARTCONFIG.color.splitArea + } + }, + indicator: [ + { name: 'Miles', max: 6000}, + { name: 'Administration', max: 16000}, + { name: 'Info Tech', max: 30000}, + { name: 'Customer Support', max: 38000}, + { name: 'Development', max: 52000}, + { name: 'Marketing', max: 25000} + ] + } + ], + calculable: true, + series: [ + { + name: 'Budget vs spending', + type: 'radar', + data: [ + { + value: [5000, 14000, 28000, 31000, 42000, 21000], + name: 'Plan Average', + itemStyle: { + normal: { + color: CHARTCONFIG.color.success + } + } + }, + { + value: [4300, 10000, 28000, 35000, 50000, 19000], + name: 'Independence Blue Cross & Blue Shield', + itemStyle: { + normal: { + color: CHARTCONFIG.color.info + } + } + } + ] + } + ] +}; + + +const Chart = () => ( + +); + +module.exports = Chart; diff --git a/src/routes/app/routes/dashboard/components/Dashboard.js b/src/routes/app/routes/dashboard/components/Dashboard.js new file mode 100644 index 0000000..37ad9a8 --- /dev/null +++ b/src/routes/app/routes/dashboard/components/Dashboard.js @@ -0,0 +1,84 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; +import KPIsChart from './KPIsChart'; +import AquisitionChart from './AquisitionChart'; +import StatBoxes from './StatBoxes'; +import EngagementStats from './EngagementStats'; +import BenchmarkChart from './BenchmarkChart'; + +const Main = () => ( +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +); + +const Engagement = () => ( +
      +
      +
      +
      +
      +
      Engagement
      +
      +
      +
      + 2.6M + Visits +
      +
      + 4.5M + Users +
      +
      + 08:03 + RIDE DURATION +
      +
      + 5.25 + MILES PER RIDE +
      +
      + + +
      +
      +
      +
      +
      +
      Benchmark
      +
      + +
      +
      +
      +
      +
      +
      +); + +const Dashboard = () => ( +
      + + +
      +
      +
      + + +
      +); + +module.exports = Dashboard; diff --git a/src/routes/app/routes/dashboard/components/EngagementStats.js b/src/routes/app/routes/dashboard/components/EngagementStats.js new file mode 100644 index 0000000..0771ed3 --- /dev/null +++ b/src/routes/app/routes/dashboard/components/EngagementStats.js @@ -0,0 +1,133 @@ +import React from 'react'; +import ReactEcharts from 'components/ReactECharts'; +import CHARTCONFIG from 'constants/ChartConfig'; + +// Engagment pie charts +const labelTop = { + normal: { + show: true, + position: 'center', + formatter: '{b}', + textStyle: { + color: 'rgba(0,0,0,.54)', + baseline: 'bottom', + fontSize: 14 + } + } +}; +// const labelTop = { +// normal : { +// color: CHARTCONFIG.color.info, +// label : { +// show : true, +// position : 'center', +// formatter : '{b}', +// textStyle: { +// color: CHARTCONFIG.color.text, +// baseline : 'bottom', +// fontSize: 14 +// } +// }, +// labelLine : { +// show : false +// } +// } +// }; +const labelFromatter = { + normal: { + label: { + formatter(params) { + return `${100 - params.value}%`; + }, + textStyle: { + color: 'rgba(0,0,0,.54)', + baseline: 'bottom', + fontSize: 12 + } + } + }, +}; +const labelBottom = { + normal: { + color: 'rgba(0,0,0,.1)', + label: { + show: true, + position: 'center' + }, + labelLine: { + show: false + } + } +}; +const radius = [65, 70]; +const pie = {}; + +const pie1 = {}; +const pie2 = {}; +const pie3 = {}; +const pie4 = {}; + +pie1.options = { + series: [{ + type: 'pie', + radius, + itemStyle: labelFromatter, + data: [ + {name: 'To Provider', value: 36, label: labelTop, labelLine: {normal: {show: false}}, itemStyle: {normal: {color: CHARTCONFIG.color.success}}}, + {name: 'other', value: 64, itemStyle: labelBottom} + ] + }] +}; + +pie2.options = { + series: [{ + type: 'pie', + radius, + itemStyle: labelFromatter, + data: [ + {name: 'From Provider', value: 45, label: labelTop, itemStyle: {normal: {color: CHARTCONFIG.color.info}}}, + {name: 'other', value: 55, itemStyle: labelBottom} + ] + }] +}; +pie3.options = { + series: [{ + type: 'pie', + radius, + itemStyle: labelFromatter, + data: [ + {name: 'Round Trip', value: 25, label: labelTop, itemStyle: {normal: {color: CHARTCONFIG.color.success}}}, + {name: 'other', value: 75, itemStyle: labelBottom} + ] + }] +}; +pie4.options = { + series: [{ + type: 'pie', + radius, + itemStyle: labelFromatter, + data: [ + {name: 'Referral', value: 75, label: labelTop, itemStyle: {normal: {color: CHARTCONFIG.color.info}}}, + {name: 'other', value: 25, itemStyle: labelBottom} + ] + }] +}; + +const Stats = () => ( +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      +); + +module.exports = Stats; diff --git a/src/routes/app/routes/dashboard/components/KPIsChart.js b/src/routes/app/routes/dashboard/components/KPIsChart.js new file mode 100644 index 0000000..d583238 --- /dev/null +++ b/src/routes/app/routes/dashboard/components/KPIsChart.js @@ -0,0 +1,108 @@ +import React from 'react'; +import ReactEcharts from 'components/ReactECharts'; +import CHARTCONFIG from 'constants/ChartConfig'; + +const area = {}; +area.options = { + tooltip: { + trigger: 'axis' + }, + legend: { + data: ['Rides', 'ER Visits'], + textStyle: { + color: CHARTCONFIG.color.text + } + }, + toolbox: { + show: false + }, + calculable: true, + xAxis: [ + { + type: 'category', + data: ['Jan.', 'Feb.', 'Mar.', 'Apr.', 'May.', 'Jun.', 'Jul.', 'Aug.'], + axisLabel: { + textStyle: { + color: CHARTCONFIG.color.text + } + }, + splitLine: { + lineStyle: { + color: CHARTCONFIG.color.splitLine + } + } + } + ], + yAxis: [ + { + max: 100, + axisLabel: { + textStyle: { + color: CHARTCONFIG.color.text + } + }, + splitLine: { + lineStyle: { + color: CHARTCONFIG.color.splitLine + } + }, + splitArea: { + show: true, + areaStyle: { + color: CHARTCONFIG.color.splitArea + } + } + } + ], + series: [ + { + name: 'Rides', + type: 'bar', + data: [17, 11, 22, 35, 76, 40, 28, 25], + itemStyle: { + normal: { + color: CHARTCONFIG.color.info + } + }, + lineStyle: { + normal: { + color: CHARTCONFIG.color.info + } + }, + areaStyle: { + normal: { + color: CHARTCONFIG.color.info + } + }, + symbol: 'diamond' + }, + { + name: 'ER Visits', + type: 'bar', + barCategoryGap: '35%', + data: [15, 13, 20, 40, 81, 37, 26, 26], + itemStyle: { + normal: { + color: CHARTCONFIG.color.success + } + }, + lineStyle: { + normal: { + color: CHARTCONFIG.color.success + } + }, + areaStyle: { + normal: { + color: CHARTCONFIG.color.success + } + }, + symbol: 'diamond' + } + ] +}; + +const Chart = () => ( + +); + +module.exports = Chart; diff --git a/src/routes/app/routes/dashboard/components/StatBoxes.js b/src/routes/app/routes/dashboard/components/StatBoxes.js new file mode 100644 index 0000000..89adc73 --- /dev/null +++ b/src/routes/app/routes/dashboard/components/StatBoxes.js @@ -0,0 +1,62 @@ +import React from 'react'; +import ReactEcharts from 'components/ReactECharts'; +import CHARTCONFIG from 'constants/ChartConfig'; + +const Statboxes = () => ( +
      +
      +
      +
      + 35% +
      +
      + Growth +
      +
      + airplanemode_active +
      +
      +
      +
      +
      +
      + 42% +
      +
      + New Users +
      +
      + supervisor_account +
      +
      +
      +
      +
      +
      + 37k +
      +
      + Savings +
      +
      + attach_money +
      +
      +
      +
      +
      +
      + 25k +
      +
      + Miles +
      +
      + card_travel +
      +
      +
      +
      +); + +module.exports = Statboxes; diff --git a/src/routes/app/routes/dashboard/index.js b/src/routes/app/routes/dashboard/index.js new file mode 100644 index 0000000..0bdb954 --- /dev/null +++ b/src/routes/app/routes/dashboard/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'dashboard', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Dashboard')); + }); + } +}; diff --git a/src/routes/app/routes/forms/index.js b/src/routes/app/routes/forms/index.js new file mode 100644 index 0000000..43ffb14 --- /dev/null +++ b/src/routes/app/routes/forms/index.js @@ -0,0 +1,12 @@ +module.exports = { + path: 'form', + getChildRoutes(partialNextState, cb) { + require.ensure([], (require) => { + cb(null, [ + require('./routes/components'), + require('./routes/layouts'), + require('./routes/steppers'), + ]); + }); + } +}; diff --git a/src/routes/app/routes/forms/routes/components/components/AutoComplete.js b/src/routes/app/routes/forms/routes/components/components/AutoComplete.js new file mode 100644 index 0000000..8a80d2b --- /dev/null +++ b/src/routes/app/routes/forms/routes/components/components/AutoComplete.js @@ -0,0 +1,234 @@ +import React, {Component} from 'react'; +import AutoComplete from 'material-ui/AutoComplete'; +import MenuItem from 'material-ui/MenuItem'; + +// +class AutoCompleteExampleSimple extends Component { + state = { + dataSource: [], + }; + + handleUpdateInput = (value) => { + this.setState({ + dataSource: [ + value, + value + value, + value + value + value, + ], + }); + }; + + render() { + return ( +
      +
      +
      Simple examples
      +
      + + +
      +
      +
      + ); + } +} + + +// +const dataSource1 = [ + { + text: 'text-value1', + value: ( + + ), + }, + { + text: 'text-value2', + value: ( + + ), + }, +]; + +const dataSource2 = ['12345', '23456', '34567']; + +const dataSource3 = [ + {textKey: 'Some Text', valueKey: 'someFirstValue'}, + {textKey: 'Some Text', valueKey: 'someSecondValue'}, +]; +const dataSourceConfig = { + text: 'textKey', + value: 'valueKey', +}; + +const AutoCompleteExampleDataSource = () => ( +
      +
      +
      Data sources
      +
      +
      +
      + +
      +
      +
      +); + + +// +const colors = [ + 'Red', + 'Orange', + 'Yellow', + 'Green', + 'Blue', + 'Purple', + 'Black', + 'White', +]; + +const fruit = [ + 'Apple', 'Apricot', 'Avocado', + 'Banana', 'Bilberry', 'Blackberry', 'Blackcurrant', 'Blueberry', + 'Boysenberry', 'Blood Orange', + 'Cantaloupe', 'Currant', 'Cherry', 'Cherimoya', 'Cloudberry', + 'Coconut', 'Cranberry', 'Clementine', + 'Damson', 'Date', 'Dragonfruit', 'Durian', + 'Elderberry', + 'Feijoa', 'Fig', + 'Goji berry', 'Gooseberry', 'Grape', 'Grapefruit', 'Guava', + 'Honeydew', 'Huckleberry', + 'Jabouticaba', 'Jackfruit', 'Jambul', 'Jujube', 'Juniper berry', + 'Kiwi fruit', 'Kumquat', + 'Lemon', 'Lime', 'Loquat', 'Lychee', + 'Nectarine', + 'Mango', 'Marion berry', 'Melon', 'Miracle fruit', 'Mulberry', 'Mandarine', + 'Olive', 'Orange', + 'Papaya', 'Passionfruit', 'Peach', 'Pear', 'Persimmon', 'Physalis', 'Plum', 'Pineapple', + 'Pumpkin', 'Pomegranate', 'Pomelo', 'Purple Mangosteen', + 'Quince', + 'Raspberry', 'Raisin', 'Rambutan', 'Redcurrant', + 'Salal berry', 'Satsuma', 'Star fruit', 'Strawberry', 'Squash', 'Salmonberry', + 'Tamarillo', 'Tamarind', 'Tomato', 'Tangerine', + 'Ugli fruit', + 'Watermelon', +]; + +const AutoCompleteExampleFilters = () => ( +
      +
      +
      Filters
      +
      + +
      + +
      +
      +
      +); + + +class AutoCompleteExampleControlled extends Component { + state = { + searchText: '', + }; + + handleUpdateInput = (searchText) => { + this.setState({ + searchText, + }); + }; + + handleNewRequest = () => { + this.setState({ + searchText: '', + }); + }; + + render() { + return ( +
      +
      +
      Controlled examples
      +
      + (key.indexOf(searchText) !== -1)} + openOnFocus + /> +
      +
      +
      + ); + } +} + + +const AutoCompleteSection = () => ( +
      +

      Material Auto Complete

      + +
      +
      +
      +
      + + +
      + +
      +
      + + +
      +
      +
      +
      +
      +); + +module.exports = AutoCompleteSection; diff --git a/src/routes/app/routes/forms/routes/components/components/Checkbox.js b/src/routes/app/routes/forms/routes/components/components/Checkbox.js new file mode 100644 index 0000000..7849438 --- /dev/null +++ b/src/routes/app/routes/forms/routes/components/components/Checkbox.js @@ -0,0 +1,99 @@ +import React from 'react'; +import Checkbox from 'material-ui/Checkbox'; +import ActionFavorite from 'material-ui/svg-icons/action/favorite'; +import ActionFavoriteBorder from 'material-ui/svg-icons/action/favorite-border'; +import Visibility from 'material-ui/svg-icons/action/visibility'; +import VisibilityOff from 'material-ui/svg-icons/action/visibility-off'; + +const styles = { + checkbox: { + maxWidth: 250, + marginBottom: 16 + } +}; + +const CheckboxExampleSimple = () => ( +
      +
      + + } + uncheckedIcon={} + label="Custom icon" + style={styles.checkbox} + /> + } + uncheckedIcon={} + label="Custom icon of different shapes" + style={styles.checkbox} + /> + + +
      +
      + + } + uncheckedIcon={} + label="Custom icon" + labelPosition="left" + style={styles.checkbox} + /> + } + uncheckedIcon={} + label="Custom icon of different shapes" + labelPosition="left" + style={styles.checkbox} + /> + + +
      +
      +); + +const CheckboxSection = () => ( +
      +

      Material Checkbox

      + +
      +
      +
      + + + +
      +
      +
      +
      +); + +module.exports = CheckboxSection; diff --git a/src/routes/app/routes/forms/routes/components/components/Chip.js b/src/routes/app/routes/forms/routes/components/components/Chip.js new file mode 100644 index 0000000..cbd8d77 --- /dev/null +++ b/src/routes/app/routes/forms/routes/components/components/Chip.js @@ -0,0 +1,127 @@ +import React from 'react'; +import Avatar from 'material-ui/Avatar'; +import Chip from 'material-ui/Chip'; +import FontIcon from 'material-ui/FontIcon'; +import SvgIconFace from 'material-ui/svg-icons/action/face'; +import {blue300, indigo900} from 'material-ui/styles/colors'; + +const styles = { + chip: { + margin: 4, + }, + wrapper: { + display: 'flex', + flexWrap: 'wrap', + }, +}; + +function handleRequestDelete() { + console.log('You clicked the delete button.'); +} + +function handleTouchTap() { + console.log('You clicked the Chip.'); +} + +/** + * Examples of Chips, using an image [Avatar](/#/components/font-icon), [Font Icon](/#/components/font-icon) Avatar, + * [SVG Icon](/#/components/svg-icon) Avatar, "Letter" (string) Avatar, and with custom colors. + * + * Chips with the `onRequestDelete` property defined will display a delete icon. + */ +export default class ChipExampleSimple extends React.Component { + + render() { + return ( +
      +
      + + Text Chip + + + + Deletable Text Chip + + + + + Image Avatar Chip + + + + + Deletable Avatar Chip + +
      + +
      + +
      + + perm_identity} /> + FontIcon Avatar Chip + + + + } /> + SvgIcon Avatar Chip + + + + A + Text Avatar Chip + + + + + MB + + Colored Chip + +
      + +
      +

      Chips with the onRequestDelete property defined will display a delete icon.

      +
      +
      + ); + } +} + +const ChipSection = () => ( +
      +

      Material Chips

      +
      +
      + +
      +
      +
      +); + +module.exports = ChipSection; diff --git a/src/routes/app/routes/forms/routes/components/components/Components.js b/src/routes/app/routes/forms/routes/components/components/Components.js new file mode 100644 index 0000000..f3525e2 --- /dev/null +++ b/src/routes/app/routes/forms/routes/components/components/Components.js @@ -0,0 +1,35 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; +import AutoComplete from './AutoComplete'; +import Checkbox from './Checkbox'; +import Chip from './Chip'; +import DatePicker from './DatePicker'; +import Dialog from './Dialog'; +import RadioButton from './RadioButton'; +import SelectField from './SelectField'; +import Slider from './Slider'; +import TextField from './TextField'; +import TimePicker from './TimePicker'; +import Toggle from './Toggle'; + +const Elements = () => ( +
      + + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      +); + +module.exports = Elements; diff --git a/src/routes/app/routes/forms/routes/components/components/DatePicker.js b/src/routes/app/routes/forms/routes/components/components/DatePicker.js new file mode 100644 index 0000000..006dc33 --- /dev/null +++ b/src/routes/app/routes/forms/routes/components/components/DatePicker.js @@ -0,0 +1,151 @@ +import React from 'react'; +import DatePicker from 'material-ui/DatePicker'; +import TextField from 'material-ui/TextField'; +import Toggle from 'material-ui/Toggle'; +// +const DatePickerExampleSimple = () => ( +
      +
      +
      Simple examples
      +
      + + + +
      +
      +
      +); + +// +const DatePickerExampleInline = () => ( +
      +
      +
      Inline examples
      +
      + + +
      +
      +
      +); + +// +const optionsStyle = { + maxWidth: 300 +}; + +class DatePickerExampleToggle extends React.Component { + + constructor(props) { + super(props); + + const minDate = new Date(); + const maxDate = new Date(); + minDate.setFullYear(minDate.getFullYear() - 1); + minDate.setHours(0, 0, 0, 0); + maxDate.setFullYear(maxDate.getFullYear() + 1); + maxDate.setHours(0, 0, 0, 0); + + this.state = { + minDate, + maxDate, + autoOk: false, + disableYearSelection: false, + }; + } + + handleChangeMinDate = (event, date) => { + this.setState({ + minDate: date, + }); + }; + + handleChangeMaxDate = (event, date) => { + this.setState({ + maxDate: date, + }); + }; + + handleToggle = (event, toggled) => { + this.setState({ + [event.target.name]: toggled, + }); + }; + + render() { + return ( +
      +
      Ranged example
      +
      +
      +
      + +
      +
      +
      + + +
      + +
      + +
      +
      +
      +
      +
      + ); + } +} + +const DatePickerSection = () => ( +
      +

      Material Date Picker

      + +
      +
      +
      +
      + + +
      + +
      + +
      +
      +
      +
      +); + +module.exports = DatePickerSection; diff --git a/src/routes/app/routes/forms/routes/components/components/Dialog.js b/src/routes/app/routes/forms/routes/components/components/Dialog.js new file mode 100644 index 0000000..190cbe9 --- /dev/null +++ b/src/routes/app/routes/forms/routes/components/components/Dialog.js @@ -0,0 +1,369 @@ +import React from 'react'; +import Dialog from 'material-ui/Dialog'; +import FlatButton from 'material-ui/FlatButton'; +import RaisedButton from 'material-ui/RaisedButton'; +import {RadioButton, RadioButtonGroup} from 'material-ui/RadioButton'; +import DatePicker from 'material-ui/DatePicker'; + +// +class DialogExampleSimple extends React.Component { + state = { + open: false, + }; + + handleOpen = () => { + this.setState({open: true}); + }; + + handleClose = () => { + this.setState({open: false}); + }; + + render() { + const actions = [ + , + , + ]; + + return ( +
      +
      +
      Simple dialog
      +
      + + + The actions in this window were passed in as an array of React objects. + +
      +
      +
      + ); + } +} + + +// +class DialogExampleModal extends React.Component { + state = { + open: false, + }; + + handleOpen = () => { + this.setState({open: true}); + }; + + handleClose = () => { + this.setState({open: false}); + }; + + render() { + const actions = [ + , + , + ]; + + return ( +
      +
      +
      Modal dialog
      +
      + + + Only actions can close this dialog. + +
      +
      +
      + ); + } +} + + +// +const customContentStyle = { + width: '100%', + maxWidth: 'none', +}; + +class DialogExampleCustomWidth extends React.Component { + state = { + open: false, + }; + + handleOpen = () => { + this.setState({open: true}); + }; + + handleClose = () => { + this.setState({open: false}); + }; + + render() { + const actions = [ + , + , + ]; + + return ( +
      +
      +
      Styled dialog
      +
      + + + This dialog spans the entire width of the screen. + +
      +
      +
      + ); + } +} + + +// +class DialogExampleDialogDatePicker extends React.Component { + state = { + open: false, + }; + + handleOpen = () => { + this.setState({open: true}); + }; + + handleClose = () => { + this.setState({open: false}); + }; + + render() { + const actions = [ + , + ]; + + return ( +
      +
      +
      Nested dialogs
      +
      + + + Open a Date Picker dialog from within a dialog. + + +
      +
      +
      + ); + } +} + + +// +const styles = { + radioButton: { + marginTop: 16, + }, +}; + +class DialogExampleScrollable extends React.Component { + state = { + open: false, + }; + + handleOpen = () => { + this.setState({open: true}); + }; + + handleClose = () => { + this.setState({open: false}); + }; + + render() { + const actions = [ + , + , + ]; + + const radios = []; + for (let i = 0; i < 30; i++) { + radios.push( + + ); + } + + return ( +
      +
      +
      Scrollable dialog
      +
      + + + + {radios} + + +
      +
      +
      + ); + } +} + + +// +class DialogExampleAlert extends React.Component { + state = { + open: false, + }; + + handleOpen = () => { + this.setState({open: true}); + }; + + handleClose = () => { + this.setState({open: false}); + }; + + render() { + const actions = [ + , + , + ]; + + return ( +
      +
      +
      Alert dialog
      +
      + + + Discard draft? + +
      +
      +
      + ); + } +} + + +const DialogSection = () => ( +
      +

      Material Dialog

      + +
      +
      +
      + +
      + + +
      + +
      +
      + + +
      + +
      +
      + + +
      + +
      +
      +
      +
      +); + +module.exports = DialogSection; diff --git a/src/routes/app/routes/forms/routes/components/components/RadioButton.js b/src/routes/app/routes/forms/routes/components/components/RadioButton.js new file mode 100644 index 0000000..4b458f9 --- /dev/null +++ b/src/routes/app/routes/forms/routes/components/components/RadioButton.js @@ -0,0 +1,104 @@ +import React from 'react'; +import {RadioButton, RadioButtonGroup} from 'material-ui/RadioButton'; +import ActionFavorite from 'material-ui/svg-icons/action/favorite'; +import ActionFavoriteBorder from 'material-ui/svg-icons/action/favorite-border'; + +const styles = { + block: { + maxWidth: 250, + }, + radioButton: { + marginBottom: 16, + }, +}; + +const RadioButtonExampleSimple = () => ( +
      +
      + + + + } + uncheckedIcon={} + style={styles.radioButton} + /> + + + + + +
      +
      + + + + } + uncheckedIcon={} + style={styles.radioButton} + /> + + + + + +
      +
      +); + +const RadioButtonSection = () => ( +
      +

      Material Radio Button

      + +
      +
      +
      + +
      +
      +
      +
      +); + +module.exports = RadioButtonSection; diff --git a/src/routes/app/routes/forms/routes/components/components/SelectField.js b/src/routes/app/routes/forms/routes/components/components/SelectField.js new file mode 100644 index 0000000..c167383 --- /dev/null +++ b/src/routes/app/routes/forms/routes/components/components/SelectField.js @@ -0,0 +1,155 @@ +import React from 'react'; +import SelectField from 'material-ui/SelectField'; +import MenuItem from 'material-ui/MenuItem'; + +class SelectFieldExampleSimple extends React.Component { + state = { + value: 1, + }; + + handleChange = (event, index, value) => this.setState({value}); + + render() { + return ( +
      +
      +
      Simple examples
      +
      + + + + + + + +
      + + + + +
      +
      +
      + ); + } +} + +class SelectFieldExampleNullable extends React.Component { + state = { + value: null, + }; + + handleChange = (event, index, value) => this.setState({value}); + + render() { + return ( +
      +
      +
      Nullable select
      +
      + + + + + +
      +
      +
      + ); + } +} + +// +const longItems = []; +for (let i = 0; i < 100; i++) { + longItems.push(); +} +class DropDownMenuLongMenuExample extends React.Component { + + constructor(props) { + super(props); + this.state = {value: 10}; + } + + handleChange = (event, index, value) => this.setState({value}); + + render() { + return ( +
      +
      +
      Long examples
      +
      + + {longItems} + +
      +
      +
      + ); + } +} + +// +class SelectFieldExampleCustomLabel extends React.Component { + state = { + value: 1, + }; + + handleChange = (event, index, value) => this.setState({value}); + + render() { + return ( +
      +
      +
      Label examples
      +
      + + + + + + +
      +
      +
      + ); + } +} + + +const SelectFieldSection = () => ( +
      +

      Material Select Field

      + +
      +
      +
      + +
      + + +
      +
      + + +
      + +
      +
      +
      +
      +); + +module.exports = SelectFieldSection; diff --git a/src/routes/app/routes/forms/routes/components/components/Slider.js b/src/routes/app/routes/forms/routes/components/components/Slider.js new file mode 100644 index 0000000..3ed74e9 --- /dev/null +++ b/src/routes/app/routes/forms/routes/components/components/Slider.js @@ -0,0 +1,120 @@ +import React from 'react'; +import Slider from 'material-ui/Slider'; +// +const SliderExampleSimple = () => ( +
      +
      Simple examples
      +
      + + + +
      +
      +); + +// +const SliderExampleDisabled = () => ( +
      +
      Disabled examples
      +
      + + + +
      +
      +); + +// +const SliderExampleStep = () => ( +
      +
      Stepped examples
      +
      + + +
      +
      +); + +class SliderExampleControlled extends React.Component { + state = { + secondSlider: 50, + }; + + handleSecondSlider = (event, value) => { + this.setState({secondSlider: value}); + }; + + render() { + return ( +
      +
      Controlled examples
      +
      + +
      +

      + {'The value of this slider is: '} + {this.state.secondSlider} + {' from a range of 0 to 100 inclusive'} +

      +
      +
      +
      + ); + } +} + +const styles = { + root: { + display: 'flex', + height: 124, + flexDirection: 'row', + justifyContent: 'space-around', + }, +}; + +const SliderExampleAxis = () => ( +
      +
      Alternative Axis Examples
      +
      +
      + + + +
      +
      +
      +); + + +const SliderSection = () => ( +
      +

      Material Slider

      +
      +
      + +
      +
      + +
      +
      +
      +
      + +
      +
      + +
      +
      + + +
      +); + +module.exports = SliderSection; diff --git a/src/routes/app/routes/forms/routes/components/components/TextField.js b/src/routes/app/routes/forms/routes/components/components/TextField.js new file mode 100644 index 0000000..b1e0063 --- /dev/null +++ b/src/routes/app/routes/forms/routes/components/components/TextField.js @@ -0,0 +1,117 @@ +import React from 'react'; +import TextField from 'material-ui/TextField'; + +const style = { + width: '100%' +}; + +// +const TextFieldExampleSimple = () => ( +
      +
      +
      Simple examples
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      +
      +
      +); + + +// +const TextFieldExampleDisabled = () => ( +
      +
      +
      Disabled examples
      +
      +
      +
      +
      +
      + +
      +
      +
      +); + + +const TextFieldSection = () => ( +
      +

      Material Text Field

      + +
      +
      +
      + +
      + + +
      + +
      +
      +
      +
      +); + +module.exports = TextFieldSection; diff --git a/src/routes/app/routes/forms/routes/components/components/TimePicker.js b/src/routes/app/routes/forms/routes/components/components/TimePicker.js new file mode 100644 index 0000000..194f38e --- /dev/null +++ b/src/routes/app/routes/forms/routes/components/components/TimePicker.js @@ -0,0 +1,89 @@ +import React from 'react'; +import TimePicker from 'material-ui/TimePicker'; + +const SimpleExamples = () => ( +
      +
      Simple examples
      +
      + + + + +
      +
      +); + +class ControlledExamples extends React.Component { + constructor(props) { + super(props); + this.state = {value24: null, value12: null}; + } + + handleChangeTimePicker24 = (event, date) => { + this.setState({value24: date}); + }; + + handleChangeTimePicker12 = (event, date) => { + this.setState({value12: date}); + }; + + render() { + return ( +
      +
      Controlled examples
      +
      + + +
      +
      + ); + } +} + + +const TimePickerSection = () => ( +
      +

      Material Time Picker

      + +
      +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      +
      +); + +module.exports = TimePickerSection; diff --git a/src/routes/app/routes/forms/routes/components/components/Toggle.js b/src/routes/app/routes/forms/routes/components/components/Toggle.js new file mode 100644 index 0000000..f83f7ab --- /dev/null +++ b/src/routes/app/routes/forms/routes/components/components/Toggle.js @@ -0,0 +1,80 @@ +import React from 'react'; +import Toggle from 'material-ui/Toggle'; + +const styles = { + toggle: { + maxWidth: 250, + marginBottom: 16 + }, +}; + +const ToggleExampleSimple = () => ( +
      +
      + + + + +
      +
      + + + + +
      +
      +); + +const ToggleSection = () => ( +
      +

      Material Toggle

      + +
      +
      +
      + + + +
      +
      +
      +
      +); + +module.exports = ToggleSection; diff --git a/src/routes/app/routes/forms/routes/components/index.js b/src/routes/app/routes/forms/routes/components/index.js new file mode 100644 index 0000000..82c333f --- /dev/null +++ b/src/routes/app/routes/forms/routes/components/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'components', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Components')); + }); + } +}; diff --git a/src/routes/app/routes/forms/routes/layouts/components/Layouts.js b/src/routes/app/routes/forms/routes/layouts/components/Layouts.js new file mode 100644 index 0000000..592933c --- /dev/null +++ b/src/routes/app/routes/forms/routes/layouts/components/Layouts.js @@ -0,0 +1,250 @@ +import React from 'react'; +import RaisedButton from 'material-ui/RaisedButton'; +import QueueAnim from 'rc-queue-anim'; + +const BasicForm = () => ( +
      +

      Basic Form

      +
      +
      + +
      +
      + + +
      +
      + + +
      +
      + +
      + +
      + + +
      +
      +
      +); + +const HorizontalForm = () => ( +
      +

      Horizontal Form

      +
      +
      + +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      + +
      +
      +
      + +
      +
      +
      +); + +const InlineForm = () => ( +
      +

      Inline Form

      +
      +
      + +
      + + + + +
      +
      @
      + +
      + +
      + +
      + + + +
      +
      +
      +); + +const ColumnSizing = () => ( +
      +

      ColumnSizing

      +
      +
      + +
      +
      +
      + +
      +
      + +
      +
      + +
      + +
      +
      + +
      +
      + +
      +
      + +
      + +
      +
      + +
      +
      + +
      +
      + +
      + +
      +
      + +
      +
      + +
      +
      + +
      + +
      +
      + +
      +
      + +
      +
      + +
      + +
      +
      + +
      +
      + +
      +
      + +
      + +
      +
      + +
      +
      + +
      +
      + +
      + +
      +
      + +
      +
      + +
      +
      + +
      + +
      +
      + +
      +
      + +
      +
      + +
      + +
      +
      + +
      +
      + +
      +
      + +
      + +
      +
      + +
      +
      + +
      +
      + +
      + +
      + +
      +
      +
      +); + + +const Page = () => ( +
      + +
      +
      +
      +
      +
      +
      +); + +module.exports = Page; diff --git a/src/routes/app/routes/forms/routes/layouts/index.js b/src/routes/app/routes/forms/routes/layouts/index.js new file mode 100644 index 0000000..9b6b0eb --- /dev/null +++ b/src/routes/app/routes/forms/routes/layouts/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'layouts', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Layouts')); + }); + } +}; diff --git a/src/routes/app/routes/forms/routes/steppers/components/Steppers.js b/src/routes/app/routes/forms/routes/steppers/components/Steppers.js new file mode 100644 index 0000000..802cf71 --- /dev/null +++ b/src/routes/app/routes/forms/routes/steppers/components/Steppers.js @@ -0,0 +1,14 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; +import VerticalNonLinear from './VerticalNonLinear'; +const Stepper = (props) => { + return ( +
      + +
      +
      +
      + ); +}; + +module.exports = Stepper; diff --git a/src/routes/app/routes/forms/routes/steppers/components/VerticalNonLinear.js b/src/routes/app/routes/forms/routes/steppers/components/VerticalNonLinear.js new file mode 100644 index 0000000..a3f4894 --- /dev/null +++ b/src/routes/app/routes/forms/routes/steppers/components/VerticalNonLinear.js @@ -0,0 +1,993 @@ +import React, { Component } from 'react'; +import { + Step, + Stepper, + StepButton, + StepContent, +} from 'material-ui/Stepper'; +import RaisedButton from 'material-ui/RaisedButton'; +import FlatButton from 'material-ui/FlatButton'; +import QueueAnim from 'rc-queue-anim'; +import { RadioButton, RadioButtonGroup } from 'material-ui/RadioButton'; +import ActionFavorite from 'material-ui/svg-icons/action/favorite'; +import ActionFavoriteBorder from 'material-ui/svg-icons/action/favorite-border'; +import AutoComplete from 'material-ui/AutoComplete'; +import SelectField from 'material-ui/SelectField'; +import MenuItem from 'material-ui/MenuItem'; +import { Tabs, Tab } from 'material-ui/Tabs'; +// import Slider from 'material-ui/Slider'; +import TimePicker from 'material-ui/TimePicker'; +import DatePicker from 'material-ui/DatePicker'; +import TextField from 'material-ui/TextField'; +// import Toggle from 'material-ui/Toggle'; +import Snackbar from 'material-ui/Snackbar'; +import { NEMTLocation } from '../../../../../components/NEMTLocation'; +import { request } from 'https'; +import Divider from 'material-ui/Divider'; +import Paper from 'material-ui/Paper'; +import Dialog from 'material-ui/Dialog'; +import Close from 'material-ui/svg-icons/navigation/close' +import CommunicationCall from 'material-ui/svg-icons/communication/call' +import Message from 'material-ui/svg-icons/communication/message' +import Instance from '../../../../../../../components/Connection'; +import Checkbox from 'material-ui/Checkbox'; +import Popover from 'material-ui/Popover'; + +let DateTimeFormat; + + +DateTimeFormat = global.Intl.DateTimeFormat; + +export class DialogExampleSimple extends React.Component { + state = { + open: true, + }; + + handleOpen = () => { + this.setState({ open: true }); + }; + + handleClose = () => { + this.setState({ open: false }); + }; + + render() { + const actions = [ + , + , + ]; + + return ( +
      + + The actions in this window were passed in as an array of React objects. + +
      + ); + } +} +/** + * Dialogs can be nested. This example opens a Date Picker from within a Dialog. + */ +export class DialogExampleDialogDatePicker extends React.Component { + state = { + open: false, + additionalPassenger: + { + passengerType: '', + seatType: '', + } + }; + + handleOpen = () => { + this.setState({ open: true }); + }; + + + handlePassengerTypeChange = (e, i, v, state) => { + this.setState({ additionalPassenger: { passengerType: v } }); + }; + + handleSeatTypeChange = (e, i, v, state) => { + this.setState({ additionalPassenger: { seatType: v } }); + }; + + handleClose = () => { + this.setState({ open: false }); + }; + + render() { + const actions = [ + , + , + ]; + + return ( +
      + + + this.handlePassengerTypeChange(e, i, v, this)} + autoWidth={true} + > + + + + + this.handleSeatTypeChange(e, i, v, this)} + autoWidth={true} + > + + + + + + +
      + ); + } +} +const names = [ + 'Service Animal', + 'Cane / Quad Cane', + 'Electric Wheelchair', + 'Oxygen Tank', + 'Sign Language', + 'White Cane', + 'Leg Braces', + 'Crutches', + 'Manual Wheelchair', + 'Prothesis', + 'Walker', +]; + +/** + * `SelectField` can handle multiple selections. It is enabled with the `multiple` property. + */ +export class SelectFieldExampleMultiSelect extends Component { + state = { + values: [], + }; + + handleChange = (event, index, values) => this.setState({ values }); + + menuItems(values) { + return names.map((name) => ( + -1} + value={name} + primaryText={name} + autoWidth={false} + style={{ width: 215 }} + /> + )); + } + + render() { + const { values } = this.state; + return ( + + {this.menuItems(values)} + + ); + } +} + +const axios = require('axios'); + +const selectStyles = { + customWidth: { + width: 35, + }, +}; + + + + +var tripType = 'To Visit'; +var pickupTimeReturnDisplayMode = "none"; +/** + * `SelectField` is implemented as a controlled component, + * with the current selection set through the `value` property. + * The `SelectField` can be disabled with the `disabled` property. + */ +export class SelectFieldExampleSimple extends Component { + constructor(props) { + super(props); + this.props = props; + this.state = { + value: 'to_visit', + pickupTimeReturnDisplayMode: 'none', + pickupTimeHide: false, + }; + } + + componentDidMount() { + this.setState(Object.assign(this.state, { value: this.props.value })); + } + + handleChange(event, index, value, state) { + let self = state + tripType = value; + switch (tripType) { + + case 'from_visit': + pickupTimeReturnDisplayMode = "none" + self.setState(Object.assign(self.state, { pickupTimeReturnDisplayMode: 'none', value: 'from_visit', pickupTimeHide: false })); + break; + + case 'from_visit_call': + pickupTimeReturnDisplayMode = "none" + self.setState(Object.assign(self.state, { pickupTimeReturnDisplayMode: 'none', value: 'from_visit_call', pickupTimeHide: true })); + break; + + + case 'to_visit': + pickupTimeReturnDisplayMode = "none" + self.setState(Object.assign(self.state, { pickupTimeReturnDisplayMode: 'none', value: 'to_visit', pickupTimeHide: false })); + break; + + + case 'roundtrip': + pickupTimeReturnDisplayMode = "block" + self.setState(Object.assign(self.state, { pickupTimeReturnDisplayMode: 'block', value: 'roundtrip', pickupTimeHide: false })); + break; + + case 'roundtrip_call': + pickupTimeReturnDisplayMode = "none"; + self.setState(Object.assign(self.state, { pickupTimeReturnDisplayMode: 'none', value: 'roundtrip_call', pickupTimeHide: false })); + break; + + default: + self.setState(Object.assign(self.state, { pickupTimeReturnDisplayMode: 'block', value: 'roundtrip', pickupTimeHide: false })); + break; + } + + if (this.props.handleChange) { + this.props.handleChange(event, index, { pickupTimeReturnDisplayMode: self.state.pickupTimeReturnDisplayMode, selectField: this.state.value, pickupTimeHide: this.state.pickupTimeHide }); + } + } + + render() { + return ( +
      + this.handleChange(e, i, v, this)} + autoWidth={false} + style={{ width: 230 }} + > + + + + + + +
      + ); + } +} + + +function disableWeekends(date) { + return date.getDay() === 0 || date.getDay() === 6; +} + + +const styles = { + padding: '12px 18px', + marginBottom: 12, + fontWeight: 400, + maxWidth: 250, + radioButton: { + marginTop: 6 + }, + checkbox: { + marginTop: 16, fontWeight: 100, fontSize: 10 + }, +}; + + + +// const styles = { +// block: { +// maxWidth: 250, +// }, +// checkbox: { +// marginBottom: 16,fontWeight:'regular' +// }, +// }; + +function handleActive(tab) { + console.log(`A tab with this route property ${tab.props.route} was activated.`); +} + + +const + dataConfig = { text: 'text', value: 'value' }; + + +/** + * A basic vertical non-linear implementation + */ +class VerticalNonLinear extends React.Component { + constructor(props) { + super(props); + + this.state = { + stepIndex: 0, + rideTypeValue: 0, + providerID: 0, + providerName: '', + visitDate: new Date(), + visitTime: new Date(), + pickupLocation: null, + pickupTime: new Date(), + pickupTimeReturn: new Date(), + pickupTimeReturnDisplayMode: 'none', + open: false, + message: 'Booking Ride', + origin: {}, + destination: {}, + buttonPickupText: 'Member Address', + buttodDropOffText: 'Choose Drop-Off location', + buttonProviderText: 'Choose Provider', + user: null, + showUserSelection: true, + userSelectionText: '', + users: [], + visit_external_id: "", + notes: "", + pickupTimeReturnDisplayMode: "none", + eta: { + distance_miles: 0, + duration_seconds: 0, + formatted_time: 0, + showed: false, + }, + trip_type: { + key: "to_visit", + value: "" + }, + return_time: new Date(), + pickupTimeHide: false, + }; + } + + componentDidMount() { + const loggedUser = JSON.parse(localStorage.getItem("loggedUser")); + let state = this; + + let user = { + useruuid: this.props.params.uuid + } + + if (user.useruuid !== loggedUser.useruuid) { + Instance.getRawConn().get(`/v1/nemt/users/member/${user.useruuid}`) + .then(function (res) { + state.setState(Object.assign(state.state, { user: res.data, showUserSelection: true, userSelectionText: `${res.data.member} - ${res.data.name}` })); + }) + .catch(err => { + if (err.response.status !== 422) { + console.error(err); + } + }); + } + + Instance.getRawConn().get(`/v1/nemt/users/member`) + .then(function (res) { + let users = res.data.map(u => { return Object.assign(u, { userdata: `${u.member} - ${u.name}` }) }); + state.setState(Object.assign(state.state, { users: users, showUserSelection: true, stepIndex: 0 })); + }) + .catch(err => { + if (err.response.status !== 422) { + console.error(err); + } + }); + + let visitTime = new Date(new Date().getTime() + (1 * 60 * 60 * 1000)); + let visitDate = visitTime; + let pickupTime = new Date(visitTime.getTime() - (0.5 * 60 * 60 * 1000)); + let pickupTimeReturn = new Date(visitTime.getTime() - (0.5 * 60 * 60 * 1000)); + + this.setState(Object.assign(this.state, { + visitDate: visitDate, + visitTime: visitTime, + pickupTime: pickupTime, + pickupTimeReturn: pickupTimeReturn, + })); + } + //for snackbar + handleTouchTap() { + this.setState(Object.assign(this.state, { + open: true, + })); + }; + + handleRequestClose(state) { + let self = state; + self.setState(Object.assign(self.state, { + open: false, + })); + }; + + handleNext(state) { + let self = state; + const { stepIndex } = self.state; + if (stepIndex < 4) { + self.setState(Object.assign(self.state, { stepIndex: stepIndex + 1 })); + if (stepIndex === 3) { + self.handleTouchTap(); + var requestRide = { + user_uuid: state.state.user.useruuid, + ride_type: "lyft", + origin: state.state.origin, + destination: state.state.destination, + external_note: state.state.notes, + visit_date: state.state.visitDate, + visit_time: state.state.visitTime, + pickup_time: state.state.pickupTime, + visit_external_id: state.state.visit_external_id, + distance: 0, + duration: 0, + eta: 0, + trip_type: state.state.trip_type, + return_time: state.state.return_time, + }; + + if (self.state.eta.distance_miles) requestRide.distance = self.state.eta.distance_miles; + if (self.state.eta.duration_seconds) requestRide.duration = self.state.eta.duration_seconds; + + requestRide.origin.name = self.state.pickupLocation + requestRide.destination.name = self.state.providerName + + if (self.diffMinutes(state.state.pickupTime, new Date()) > 10) { + requestRide.scheduled_pickup_range = { + range_ms: null, + timestamp_ms: new Date(self.state.pickupTime).getTime() + } + } + + Instance.getRawConn().post('/v1/nemt/rides', requestRide).then(function (res) { + self.handleRequestClose(self); + window.location.href = '/#/app/page/map/' + res.data.ride_uuid; + }).catch(console.error); + } + } + }; + + diffMinutes(dt2, dt1) { + var diff = (dt2.getTime() - dt1.getTime()) / 1000; + diff /= 60; + return Math.abs(Math.round(diff)); + } + + handlePrev(state) { + let self = state; + const { stepIndex } = self.state; + if (stepIndex > 0) { + self.setState(Object.assign(self.state, { stepIndex: stepIndex - 1 })); + } + }; + + handleChange(value, state) { + let self = state + self.setState(Object.assign(self.state, { + rideTypeValue: parseInt(value.target.defaultValue) + })); + }; + + handleProvider(value, state) { + let self = state; + console.log(value); + self.setState(Object.assign(self.state, { + providerID: value.value, + providerName: value.text + })); + }; + + handleDate(event, date, state) { + let self = state + let visitTime = new Date(date.getTime() + (1 * 60 * 60 * 1000)); + let visitDate = date; + let pickupTime = new Date(visitTime.getTime() - (0.5 * 60 * 60 * 1000)); + let pickupTimeReturn = new Date(visitTime.getTime() - (0.5 * 60 * 60 * 1000)); + + self.setState(Object.assign(self.state, { + visitDate: visitDate, + visitTime: visitTime, + pickupTime: pickupTime, + pickupTimeReturn: pickupTimeReturn, + })); + } + + handleTime(value, date, state) { + let self = state; + self.setState(Object.assign(self.state, { + visitDate: date, + visitTime: date, + pickupTime: new Date(date.getTime() - (0.5 * 60 * 60 * 1000)), + pickupTimeReturn: new Date(date.getTime() - (0.5 * 60 * 60 * 1000)), + })); + } + + handlePickupTime(value, date, state) { + let self = state; + console.log('Pickup Time', date); + self.setState(Object.assign(self.state, { + pickupTime: date, + pickupTimeReturn: date + })); + } + + handlePickupTimeReturn(value, date, state) { + let self = state; + self.setState(Object.assign(self.state, { + return_time: date, + pickupTimeReturn: date, + pickupTimeReturnDisplayMode: 'block' + })); + } + + handlePickup(value) { + console.log(value); + this.setState(Object.assign(this.state, { + pickupLocation: value.text + })); + }; + + handleExternalID(e, value, state) { + let self = state; + self.setState(Object.assign(self.state, { + visit_external_id: value + })); + } + + handleNotes(e, value, state) { + let self = state + self.setState(Object.assign(self.state, { + notes: value + })); + } + + handleChangeVisitType(event, index, value, state) { + let self = state; + + let trip_type = { + key: value.selectField, + } + + // console.log(event, index, value, state); + // console.log(trip_type); + + + self.setState(Object.assign(self.state, { pickupTimeReturnDisplayMode: value.pickupTimeReturnDisplayMode, trip_type: trip_type, pickupTimeHide: value.pickupTimeHide })); + } + + renderStepActions(step, state) { + let self = state; + return ( +
      + {step !== 2 && ( + self.handleNext(self)} + style={{ marginRight: 12 }} + /> + )} + {step === 2 && ( + self.handleNext(self)} + style={{ marginRight: 12 }} + href="" + /> + )} + {step > 0 && ( + self.handlePrev(self)} + /> + )} +
      + ); + } + + // checkValue = (value) => { + // return value === this.state.rideTypeValue; + // } + updateCheck() { + this.setState((oldState) => { + return { + checked: !oldState.checked, + }; + }); + } + + getLocation() { + var defaultPlace = { + coords: { + latitude: 41.851382, + longitude: -87.675980 + } + } + if (navigator.geolocation) { + // this.setPosition(defaultPlace); + navigator.geolocation.getCurrentPosition(this.setPosition); + } else { + this.setPosition(defaultPlace); + } + } + + setPosition(position) { + localStorage.setItem('position', JSON.stringify({ latitude: position.coords.latitude, longitude: position.coords.longitude })); + } + + handleProviderChanged(res, state) { + let self = state; + let destination = { + id: res.id, + name: res.name, + lat: res.lat, + lng: res.lng, + address: res.address + } + const name = res.name; + + if (self.state.origin && self.state.origin.lat && self.state.origin.lng) { + let url = self.state.origin.lat + '/' + self.state.origin.lng + '/' + destination.lat + '/' + destination.lng + Instance.getRawConn().get('/v1/nemt/rides/eta/' + url).then(function (res) { + let obj = { + distance_miles: res.data.cost_estimates[0].estimated_distance_miles, + duration_seconds: res.data.cost_estimates[0].estimated_duration_seconds, + formatted_time: self.formatTime(res.data.cost_estimates[0].estimated_duration_seconds), + showed: true, + } + + localStorage.setItem('eta', JSON.stringify(obj)); + console.log('ETA Info', obj); + if (!self.state.eta.showed) { + + self.setState(Object.assign(self.state, { + message: ('BOOKING...Estimated Distance: ' + obj.distance_miles + ' miles\nEstimated Time: ' + obj.formatted_time), + open: true, + })); + + } + + self.setState(Object.assign(self.state, { + eta: obj, + buttonProviderText: name, + providerName: name, + destination: destination + })); + }); + } else { + self.setState(Object.assign(self.state, { + buttonProviderText: name, + providerName: name, + destination: destination + })); + } + } + + formatTime(sec_num) { + var hours = Math.floor(sec_num / 3600); + var minutes = Math.floor((sec_num - (hours * 3600)) / 60); + var seconds = sec_num - (hours * 3600) - (minutes * 60); + + if (hours < 10) { hours = "0" + hours; } + if (minutes < 10) { minutes = "0" + minutes; } + if (seconds < 10) { seconds = "0" + seconds; } + return hours + ':' + minutes + ':' + seconds; + } + + handlePickupChanged = (res, state) => { + let origin = { + id: res.id, + name: res.name, + lat: res.lat, + lng: res.lng, + address: res.address + } + + const name = res.name; + + if (state.state.destination && state.state.destination.lat && state.state.destination.lng) { + let url = origin.lat + '/' + origin.lng + '/' + state.state.destination.lat + '/' + state.state.destination.lng + Instance.getRawConn().get('/v1/nemt/rides/eta/' + url).then(function (res) { + let obj = { + distance_miles: res.data.cost_estimates[0].estimated_distance_miles, + duration_seconds: res.data.cost_estimates[0].estimated_duration_seconds, + formatted_time: state.formatTime(res.data.cost_estimates[0].estimated_duration_seconds), + showed: true, + } + + localStorage.setItem('eta', JSON.stringify(obj)); + if (!state.state.eta.showed) { + + state.setState(Object.assign(state.state, { + message: ('BOOKING...Estimated Distance: ' + obj.distance_miles + ' miles\nEstimated Time: ' + obj.formatted_time), + open: true, + })); + + } + + state.setState(Object.assign(state.state, { + eta: obj, + buttonPickupText: name, + pickupLocation: name, + origin: origin, + })); + }); + } else { + state.setState(Object.assign(state.state, { + buttonPickupText: name, + pickupLocation: name, + origin: origin + })); + } + + } + + render() { + // const { stepIndex } = this.state; + this.getLocation(); + + const state = this; + let userSelection; + + let pickupTimeSelector; + if (this.state.pickupTimeReturnDisplayMode !== 'none') { + pickupTimeSelector = ( + this.handlePickupTimeReturn(e, d, this)} + minutesStep={5} + />) + } + + let pickupTime = ( this.handlePickupTime(e, d, this)} + minutesStep={5} + />); + if (this.state.pickupTimeHide) pickupTime = null; + + if (this.state.showUserSelection && this.state.users.length > 0) { + const handleAutocomplete = (u) => { + state.setState(Object.assign(state.state, { user: u, userSelectionText: u.userdata })); + } + const datasourceConfig = { text: 'userdata', value: 'useruuid' } + userSelection = ( +
      + (key.toLowerCase().indexOf(searchText.toLowerCase()) !== -1)} maxSearchResults={5} onNewRequest={handleAutocomplete} searchText={this.state.userSelectionText} /> +
      + ); + } else if (this.state.showUserSelection && this.state.users.length === 0) { + userSelection = (
      + Loading... +
      ); + } else { + userSelection = (
      + {this.state.user.member} - {this.state.user.name} +
      ); + } + + return ( +
      +

      Book Ride

      +
      +
      + +
      + + + this.setState({ stepIndex: 0 })}> + Member + + +
      + Verify Eligibility +
      + OR + + {userSelection} +
      + + this.handlePickupChanged(provider, this)} fontSize={12} loadSuggestion={true} address={this.state.origin} /> + + + + +
      + + {this.renderStepActions(0, this)} + + + + + this.setState({ stepIndex: 1 })}> + Provider + + +
      + this.handleProviderChanged(provider, this)} fontSize={12} locationType="provider" loadSuggestion={true} address={this.state.destination} /> + {/*
      */} + + {this.renderStepActions(1, this)} + + + + + + this.setState({ stepIndex: 2 })}> + Visit Details + + +
      +
      + this.handleDate(e, d, this)} shouldDisableDate={disableWeekends} value={this.state.visitDate} /> + this.handleTime(e, d, this)} + minutesStep={5} + /> +
      +
      +
      + this.handleExternalID(e, v, this)} value={this.state.visit_external_id} /> +
      + + + + {/* */} + {this.renderStepActions(1, this)} + + + + + this.setState({ stepIndex: 3 })}> + Trip Details + + + {/* */} +
      + + this.handleChangeVisitType(e, i, v, this)} value={this.state.trip_type.key} /> + {pickupTime} + {pickupTimeSelector} + + + this.handleNotes(e, v, this)} + value={this.state.notes} multiLine={true} + maxlength={250} + rows={1} + /> + + + {/* */} + + + + {/*
      */} + {this.renderStepActions(2, this)} +
      +
      + +
      + +
      +
      +
      +

      Complete steps 1 - 4 to schedule your ride!

      +
      +
      +
      +
      +
      + this.handleRequestClose(this)} + /> + +
      +
      + ); + } +} + +export default VerticalNonLinear; diff --git a/src/routes/app/routes/forms/routes/steppers/index.js b/src/routes/app/routes/forms/routes/steppers/index.js new file mode 100644 index 0000000..2f061fa --- /dev/null +++ b/src/routes/app/routes/forms/routes/steppers/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'steppers/:uuid', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Steppers')); + }); + } +}; diff --git a/src/routes/app/routes/member/components/member.js b/src/routes/app/routes/member/components/member.js new file mode 100644 index 0000000..520dd4a --- /dev/null +++ b/src/routes/app/routes/member/components/member.js @@ -0,0 +1,865 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import QueueAnim from 'rc-queue-anim'; +import Instance from '../../../../../components/Connection'; +import $ from 'jquery'; +import dt from 'datatables.net'; +import responsive from 'datatables.net-responsive'; +import { + Row, + Col, + Grid, + Table, +} from '@sketchpixy/rubix'; +import moment from 'moment'; +import ContentAdd from 'material-ui/svg-icons/content/add'; +import { Card, CardActions, CardHeader, CardMedia, CardTitle, CardText } from 'material-ui/Card'; +import FlatButton from 'material-ui/FlatButton'; +import RaisedButton from 'material-ui/RaisedButton'; +import GoogleAddressComponent from '../../organization/components/GoogleAddressComponent'; +import Delete from 'material-ui/svg-icons/action/delete'; +import IconButton from 'material-ui/IconButton'; + + +dt.responsive = responsive; +$.dataTable = dt; + +const formatTime = function (sec_num) { + var hours = Math.floor(sec_num / 3600); + var minutes = Math.floor((sec_num - (hours * 3600)) / 60); + var seconds = sec_num - (hours * 3600) - (minutes * 60); + + if (hours < 10) { hours = "0" + hours; } + if (minutes < 10) { minutes = "0" + minutes; } + if (seconds < 10) { seconds = "0" + seconds; } + return hours + ':' + minutes + ':' + seconds; +} + +const formatPhoneNumber = function (s) { + var s2 = ("" + s).replace(/\D/g, ''); + var m = s2.match(/^(\d{3})(\d{3})(\d{4})$/); + return (!m) ? null : "(" + m[1] + ") " + m[2] + "-" + m[3]; +} + + +const Address = (props) => { + let list = []; + let buttonStyle = { + marginTop: -10 + } + + if (props.addresses && props.addresses !== null && props.addresses.length > 0) { + const handleRemoveAddress = (a) => { + if (props.onAddressRemoved) { + props.onAddressRemoved(a); + } + } + + list = props.addresses.map((c, i) => { + let name = c.name; + switch (c.address_type) { + case "home": + case "work": + name = c.address_type_name; + } + if (i === 0) { + return (
      +
      + Name + {name} +
      +
      + Address + {c.address} +
      +
      + Actions + handleRemoveAddress(c)} style={buttonStyle}> +
      +
      ); + } else { + return (
      +
      + {name} +
      +
      + {c.address} +
      +
      + handleRemoveAddress(c)} style={buttonStyle}> +
      +
      ); + } + }); + } + + return ( +
      +
      +
      +
      +
      +
      + Addresses +
      +
      + +
      +
      + {list} +
      +
      +
      +
      + ) +}; + +const Main = (props) => { + return ( +
      +
      +
      +
      +
      +
      +
      +
      + +
      +
      + ) +}; + +class DatatableComponent extends React.Component { + constructor(props) { + super(props); + this.props = props; + this.state = { + items: [], + data: [], + dataTable: null, + rides: [], + } + + this.getDatatable = this.getDatatable.bind(this); + } + + + componentWillReceiveProps(nextProps) { + const rides = nextProps.rides; + const state = this; + if (state.state.rides.length === 0) { + + let list = rides.map(v => { + var data = { + id: v.ride_uuid, + user_id: v.user.useruuid, + memberName: v.user.name, + time: '', + pickup: '', + destination: '', + status: v.status.value, + eta: 0, + duration: 0, + mileage: '0 miles', + vehicle: v.vehicle.color + ' ' + v.vehicle.make + ' ' + v.vehicle.model, + plate: v.vehicle.license_plate, + mobile: v.driver.phone_number, + lyftID: v.internal_id, + rideID: v.ride_uuid + }; + + if (!data.mobile) data.mobile = ''; + + if (v.visit_date) data.time = new Date(v.visit_time); + + if (v.route.origin.name && v.route.origin.name !== '') data.pickup = v.route.origin.name; + else data.pickup = v.route.origin.address; + + if (v.route.destination.name && v.route.destination.name !== '') data.destination = v.route.destination.name; + else data.destination = v.route.destination.address; + + if (v.route.distance) data.mileage = v.route.distance + ' miles'; + if (v.route.duration) data.duration = formatTime(v.route.duration); + if (v.route.eta) data.eta = formatTime(v.route.eta); + + return data; + }) + + $.fn.dataTable.moment = function (format, locale) { + var types = $.fn.dataTable.ext.type; + + // Add type detection + types.detect.unshift(function (d) { + return moment(d, format, locale, true).isValid() ? + 'moment-' + format : + null; + }); + + // Add sorting method - use an integer for the sorting + types.order['moment-' + format + '-pre'] = function (d) { + return moment(d, format, locale, true).unix(); + }; + }; + + $.fn.dataTable.moment('MM/DD/YYYY h:mm a'); + + state.setState(Object.assign(state.state, { rides: list })); + if (state.state.rides.length > 0) { + this.getDatatable(); + $(ReactDOM.findDOMNode(state.example)) + .addClass('nowrap') + .dataTable({ + responsive: true, + data: state.state.rides, + columns: [ + { + data: "time", + fnCreatedCell: function (nTd, sData, oData, iRow, iCol) { + $(nTd).html("" + moment(oData.time).format('MM/DD/YYYY h:mm a') + ""); + } + }, + { data: "status" }, + { + data: "pickup", + fnCreatedCell: function (nTd, sData, oData, iRow, iCol) { + $(nTd).html("" + oData.pickup + ""); + } + }, + { + data: "destination", + fnCreatedCell: function (nTd, sData, oData, iRow, iCol) { + $(nTd).html("" + oData.destination + ""); + }, + render: function (data, type, row) { + return "" + row.destination + ""; + } + }, + + { data: "eta" }, + { data: "duration" }, + { data: "mileage" }, + { data: "vehicle" }, + { data: "plate" }, + { data: "mobile" }, + { + data: "lyftID", + fnCreatedCell: function (nTd, sData, oData, iRow, iCol) { + $(nTd).html("" + oData.lyftID + ""); + }, + render: function (data, type, row) { + return "" + row.lyftID + ""; + } + }, + { + data: "rideID", + fnCreatedCell: function (nTd, sData, oData, iRow, iCol) { + $(nTd).html("" + oData.rideID + ""); + }, + render: function (data, type, row) { + return "" + row.rideID + ""; + } + } + ], + dom: 'Bfrtip', + buttons: [ + 'copy', 'pdf' + ], + // columns: TABLE_COLUMNS_SORT_STYLE, + responsive: true, + "bStateSave": true, + details: { + type: 'inline' + }, + columnDefs: [ + { targets: [-1, -3], orderable: true, className: 'dt-body-right mdl-data-table__cell--non-numeric' } + ], + order: [[0, 'desc']] + }); + + this.decorateButtons(); + this.decorateSelect(); + this.decorateSearchBar(); + this.decorateColumns(); + } + } + } + + componentDidMount() { + const rides = this.props.rides; + const state = this; + + if (rides.length > 0) { + this.getDatatable(); + let list = rides.map(v => { + var data = { + id: v.ride_uuid, + user_id: v.user.useruuid, + memberName: v.passenger.first_name + ' ' + v.passenger.last_name, + time: '', + pickup: '', + destination: '', + status: v.status.value, + eta: 0, + duration: 0, + mileage: '0 miles', + vehicle: v.vehicle.color + ' ' + v.vehicle.make + ' ' + v.vehicle.model, + plate: v.vehicle.license_plate, + mobile: v.driver.phone_number, + lyftID: v.internal_id, + rideID: v.ride_uuid + }; + + if (!data.mobile) data.mobile = ''; + + if (v.visit_date) data.time = new Date(v.visit_time); + + if (v.route.origin.name && v.route.origin.name !== '') data.pickup = v.route.origin.name; + else data.pickup = v.route.origin.address; + + if (v.route.destination.name && v.route.destination.name !== '') data.destination = v.route.destination.name; + else data.destination = v.route.destination.address; + + if (v.route.distance) data.mileage = v.route.distance + ' miles'; + if (v.route.duration) data.duration = formatTime(v.route.duration); + if (v.route.eta) data.eta = formatTime(v.route.eta); + + return data; + }) + + $.fn.dataTable.moment = function (format, locale) { + var types = $.fn.dataTable.ext.type; + + // Add type detection + types.detect.unshift(function (d) { + return moment(d, format, locale, true).isValid() ? + 'moment-' + format : + null; + }); + + // Add sorting method - use an integer for the sorting + types.order['moment-' + format + '-pre'] = function (d) { + return moment(d, format, locale, true).unix(); + }; + }; + + $.fn.dataTable.moment('MM/DD/YYYY h:mm a'); + + state.setState(Object.assign(state.state, { rides: list })); + + $(ReactDOM.findDOMNode(state.example)) + .addClass('nowrap') + .dataTable({ + responsive: true, + data: state.state.rides, + columns: [ + { + data: "time", + fnCreatedCell: function (nTd, sData, oData, iRow, iCol) { + $(nTd).html("" + moment(oData.time).format('MM/DD/YYYY h:mm a') + ""); + } + }, + { data: "status" }, + { + data: "pickup", + fnCreatedCell: function (nTd, sData, oData, iRow, iCol) { + $(nTd).html("" + oData.pickup + ""); + } + }, + { + data: "destination", + fnCreatedCell: function (nTd, sData, oData, iRow, iCol) { + $(nTd).html("" + oData.destination + ""); + }, + render: function (data, type, row) { + return "" + row.destination + ""; + } + }, + + { data: "eta" }, + { data: "duration" }, + { data: "mileage" }, + { data: "vehicle" }, + { data: "plate" }, + { data: "mobile" }, + { + data: "lyftID", + fnCreatedCell: function (nTd, sData, oData, iRow, iCol) { + $(nTd).html("" + oData.lyftID + ""); + }, + render: function (data, type, row) { + return "" + row.lyftID + ""; + } + }, + { + data: "rideID", + fnCreatedCell: function (nTd, sData, oData, iRow, iCol) { + $(nTd).html("" + oData.rideID + ""); + }, + render: function (data, type, row) { + return "" + row.rideID + ""; + } + } + ], + dom: 'Bfrtip', + buttons: [ + 'copy', 'pdf' + ], + // columns: TABLE_COLUMNS_SORT_STYLE, + responsive: true, + "bStateSave": true, + details: { + type: 'inline' + }, + columnDefs: [ + { targets: [-1, -3], orderable: true, className: 'dt-body-right mdl-data-table__cell--non-numeric' } + ], + order: [[0, 'desc']] + }); + + this.decorateButtons(); + this.decorateSelect(); + this.decorateSearchBar(); + this.decorateColumns(); + } + } + + getDatatable() { + let dataTable = ( + this.example = c} className='display' cellSpacing='0' width='100%'> + + + + + + + + + + + + + + + + +
      Pickp TimeStatusOriginDestinationETADurationMileageVehiclePlateDriver PhoneLyft IDRide ID
      ) + this.setState(Object.assign(this.state, { dataTable: null })); + this.setState(Object.assign(this.state, { dataTable: dataTable })); + } + + decorateColumns() { + let cols = $('td'); + let colStyle = { + 'font-family': 'Roboto, sans-serif', + 'font-size': '13px', + 'font-weight': '300', + 'text-align': 'left', + }; + cols.css(colStyle); + cols.removeClass('sorting_1'); + + let headers = $('th'); + let headerStyle = { + 'color': 'rgb(158, 158, 158)', + 'text-align': 'left', + 'font-weight': '600', + 'font-size': '12px' + }; + headers.css(headerStyle); + + let oddRows = $('.odd'); + let evenRows = $('.even'); + + let oddStyle = { + 'background': 'rgba(127, 221, 233, 0.4)', + 'text-shadow': 'none', + 'border-bottom': '1px solid rgb(224, 224, 224)', + 'color': 'rgba(0, 0, 0, 0.87)', + 'height': '45px' + }; + oddRows.css(oddStyle); + + let evenStyle = oddStyle; + evenStyle['background'] = '#fff'; + + evenRows.css(evenStyle); + } + + decorateSelect() { + let instance = this; + let selectElement = $('select[class]'); + selectElement.addClass('mdl'); + + selectElement.click(function () { + instance.decorateButtons(); + }); + + let selectLabel = $('#DataTables_Table_0_length > label'); + let style = { + 'color': 'rgb(158, 158, 158)', + 'text-align': 'left', + 'font-weight': '500', + 'font-size': '11px' + }; + selectLabel.css(style); + } + + decorateSearchBar() { + let instance = this; + + let searchbar = $('input[type="search"]'); + searchbar.bind('input', function () { + instance.decorateButtons(); + instance.decorateColumns(); + }); + + searchbar.addClass('mdl-textfield__input'); + searchbar.attr('placeholder', ''); + + let searchLabel = $('#DataTables_Table_0_filter > label'); + searchLabel.css({ 'color': '#fff' }); + searchbar.css({ 'color': 'rgb(158, 158, 158)' }) + + let searchFilter = $('#DataTables_Table_0_filter'); + searchFilter.append(''); + } + + decorateButtons() { + let instance = this; + let paginateButtons = $('a.paginate_button'); + paginateButtons.addClass('mdl-button'); + + let selectedButton = $('a.paginate_button.current'); + selectedButton.addClass('mdl-button mdl-button--raised mdl-button--colored'); + + let style = { + 'background': 'rgb(0, 188, 212)', + 'font-weight': '400', + }; + selectedButton.css(style); + + paginateButtons.click(function () { + instance.decorateButtons(); + instance.decorateColumns(); + }); + + let sortingButtons = $('th.sorting, th.sorting_asc, th.sorting_desc'); + sortingButtons.click(function () { + instance.decorateButtons(); + instance.decorateColumns(); + }); + + let entriesLabel = $('#DataTables_Table_0_info'); + entriesLabel.css({ + 'color': 'rgb(158, 158, 158)', + 'text-align': 'left', + 'font-weight': '400', + 'font-size': '12px' + }); + } + + render() { + return ( +
      +
      +
      + +
      +

      Rides for this Member

      + this.example = c} className='display' cellSpacing='0' width='100%'> + + + + + + + + + + + + + + + + +
      Pickp TimeStatusOriginDestinationETADurationMileageVehiclePlateDriver PhoneLyft IDRide ID
      +
      +
      +
      +
      + ); + } +} + +const Rides = (props) => { + let rides = []; + let list = []; + + if (props.user.rides && props.user.rides !== null && props.user.rides.length > 0) { + rides = props.user.rides; + rides.forEach(c => { + let visit_time = "" + if (c.visit_time) visit_time = moment(new Date(c.visit_time)).format('MM/DD/YYYY h:mm a'); + list.push( +
      +
      +
      + + +
      + Destination:
      {c.route.destination.name}
      +
      +
      + Date:
      {visit_time}
      +
      +
      + Status:
      {c.status.value}
      +
      +
      +
      +
      ); + }, this); + } + + return ( +
      +
      +
      +
      +
      +
      +
      +
      + Rides +
      +
      + {list} +
      +
      +
      +
      +
      +
      + ) +}; + +const ContactInfo = (props) => { + let contact = []; + let list = []; + if (props.user.contacts && props.user.contacts !== null && props.user.contacts.length > 0) { + contact = props.user.contacts; + contact.forEach(c => { + let contact = c.contact + if (c.type.key === 'phone') { + contact = contact.replace('+1', ''); + contact = formatPhoneNumber(contact); + } + + list.push(
      +
      + {c.type.value}: +
      +
      + {contact} +
      +
      ); + }, this); + } + + return ( +
      +
      +
      +
      +
      +
      +
      +
      + Contact Info +
      +
      + {list} +
      +
      +
      +
      +
      +
      + ) +}; + +const Header = (props) => { + let gender = "Other"; + if (props.user.gender === "M") gender = "Male"; + if (props.user.gender === "F") gender = "Female"; + + let birthdate = ""; + if (props.user.birthdate) birthdate = moment(new Date(props.user.birthdate)).format('MM/DD/YYYY'); + + let phonenumber = ""; + if (props.user.phonenumber && props.user.phonenumber !== null && props.user.phonenumber !== "") { + phonenumber = props.user.phonenumber + phonenumber = phonenumber.replace('+1', ''); + phonenumber = formatPhoneNumber(phonenumber); + } + + return ( +
      +
      + } /> +

      Member Details

      + +
      +
      + +
      +
      + Full Name + {props.user.name} +
      +
      + Subscriber ID + {props.user.member} +
      +
      + Gender + {gender} +
      + +
      + Birth Date + {birthdate} +
      + +
      + Mobile + {phonenumber} +
      +
      + Email + {props.user.email} +
      +
      +
      +
      + +
      +
      + ) +}; + +class Member extends React.Component { + constructor(props) { + super(props); + this.props = props; + + this.getMember = this.getMember.bind(this); + this.handleAddressAdded = this.handleAddressAdded.bind(this); + this.handleAddressRemoved = this.handleAddressRemoved.bind(this); + } + + state = { + user: { + "useruuid": "", + "name": "", + "gender": "", + "member": "", + "birthdate": "", + "email": "", + "phonenumber": "", + "profile": "", + "contacts": [], + "rides": [], + "addresses": [], + } + } + + componentDidMount() { + const useruuid = this.props.params.user_uuid; + this.getMember(useruuid); + } + + getMember(useruuid) { + Instance.getRawConn().get(`/v1/nemt/users/member/${useruuid}`) + .then(res => { + if (res.data.rides && res.data.rides.length > 0) { + res.data.rides = res.data.rides.map(ride => { + if (!ride.driver.first_name) { + ride.driver = { + image_url: '', + rating: '', + first_name: '', + phone_number: '' + } + } + + if (!ride.vehicle.plate) { + ride.vehicle = { + color: '', + image_url: '', + license_plate: '', + license_plate_state: '', + make: '', + model: '', + year: 0 + } + } + + return ride; + }) + } else { + res.data.rides = []; + } + this.setState(Object.assign(this.state, { user: res.data })); + }) + .catch(console.error); + } + + handleAddressAdded(address) { + const user_uuid = this.props.params.user_uuid; + const self = this; + + const addressObj = { + "id": address.id, + "name": address.name, + "address": address.address, + "address_type": address.address_type, + "lat": address.lat, + "lng": address.lng, + "type": address.type, + "address": address.text, + } + + Instance.getRawConn().post(`/v1/nemt/users/member/${user_uuid}/address`, addressObj) + .then(res => { + this.getMember(user_uuid); + }) + .catch(console.error); + } + + handleAddressRemoved(address) { + const user_uuid = this.props.params.user_uuid; + const self = this; + + Instance.getRawConn().put(`/v1/nemt/users/member/${user_uuid}/address/${address.address_uuid}`).then(res => { + this.getMember(user_uuid); + }).catch(console.error); + } + + render() { + return ( +
      + +
      + +
      ) + } +} +module.exports = Member; diff --git a/src/routes/app/routes/member/index.js b/src/routes/app/routes/member/index.js new file mode 100644 index 0000000..ac976a7 --- /dev/null +++ b/src/routes/app/routes/member/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'member/:user_uuid', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/member')); + }); + } +}; diff --git a/src/routes/app/routes/membercard/components/member.js b/src/routes/app/routes/membercard/components/member.js new file mode 100644 index 0000000..b363085 --- /dev/null +++ b/src/routes/app/routes/membercard/components/member.js @@ -0,0 +1,234 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; +import Instance from './connection'; +const dateformat = require('dateformat'); + +const formatPhoneNumber = function (s) { + var s2 = ("" + s).replace(/\D/g, ''); + var m = s2.match(/^(\d{3})(\d{3})(\d{4})$/); + return (!m) ? null : "(" + m[1] + ") " + m[2] + "-" + m[3]; +} + +const Main = (props) => { + return ( +
      +
      +
      +
      +
      + +
      +
      + +
      +
      + ) +}; + + +const Rides = (props) => { + let rides = []; + let list = []; + + if (props.user.rides && props.user.rides !== null && props.user.rides.length > 0) { + rides = props.user.rides; + rides.forEach(c => { + let visit_time = "" + if (c.visit_time) visit_time = dateformat(new Date(c.visit_time), "mm/dd/yyyy h:MM TT"); + list.push( +
      +
      +
      + + +
      + Destination:
      {c.route.destination.name}
      +
      +
      + Date:
      {visit_time}
      +
      +
      + Status:
      {c.status.value}
      +
      +
      +
      +
      ); + }, this); + } + + return ( +
      +
      +
      +
      +
      +
      +
      +
      + Rides +
      +
      + {list} +
      +
      +
      +
      +
      +
      + ) +}; + +const ContactInfo = (props) => { + let contact = []; + let list = []; + if (props.user.contacts && props.user.contacts !== null && props.user.contacts.length > 0) { + contact = props.user.contacts; + contact.forEach(c => { + let contact = c.contact + if (c.type.key === 'phone') { + contact = contact.replace('+1', ''); + contact = formatPhoneNumber(contact); + } + + list.push(
      +
      + {c.type.value}: +
      +
      + {contact} +
      +
      ); + }, this); + } + + return ( +
      +
      +
      +
      +
      +
      +
      +
      + Contact Info +
      +
      + {list} +
      +
      +
      +
      +
      +
      + ) +}; + +const Header = (props) => { + let gender = "Other"; + if (props.user.gender === "M") gender = "Male"; + if (props.user.gender === "F") gender = "Female"; + + let birthdate = ""; + if (props.user.birthdate) birthdate = dateformat(new Date(props.user.birthdate), "mm/dd/yyyy"); + + let phonenumber = ""; + if (props.user.phonenumber && props.user.phonenumber !== null && props.user.phonenumber !== "") { + phonenumber = props.user.phonenumber + phonenumber = phonenumber.replace('+1', ''); + phonenumber = formatPhoneNumber(phonenumber); + } + + return ( +
      +
      +
      +
      +
      +
      +
      +
      + Member + {props.user.member} +
      +
      + Name + {props.user.name} +
      +
      + Gender + {gender} +
      +
      +
      +
      + Birth Date + {birthdate} +
      +
      + Email + {props.user.email} +
      +
      + Phone Number + {phonenumber} +
      +
      +
      +
      +
      +
      +
      +
      + ) +}; + +class Member extends React.Component { + constructor(props) { + super(props); + this.props = props; + } + + state = { + user: { + "useruuid": "", + "name": "", + "gender": "", + "member": "", + "birthdate": "", + "email": "", + "phonenumber": "", + "profile": "", + "contacts": [], + "rides": [], + } + } + + componentDidMount() { + const useruuid = this.props.params.user_uuid; + Instance.get(`/v1/nemt/users/member/${useruuid}`) + .then(res => { + this.setState(Object.assign(this.state, { user: res.data })); + }) + .catch(err => { + if (err.response.status === 422) { + location.href = '/#/app/table/members'; + } else { + console.error(err); + } + }); + } + + render() { + return ( +
      + +
      + +
      ) + } +} +module.exports = Member; diff --git a/src/routes/app/routes/membercard/index.js b/src/routes/app/routes/membercard/index.js new file mode 100644 index 0000000..a728db7 --- /dev/null +++ b/src/routes/app/routes/membercard/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'membercard/:user_uuid', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/member')); + }); + } +}; diff --git a/src/routes/app/routes/organization/components/ContactComponent.js b/src/routes/app/routes/organization/components/ContactComponent.js new file mode 100644 index 0000000..e71af20 --- /dev/null +++ b/src/routes/app/routes/organization/components/ContactComponent.js @@ -0,0 +1,202 @@ +import React from 'react'; +import Dialog from 'material-ui/Dialog'; +import TextField from 'material-ui/TextField'; +import RaisedButton from 'material-ui/RaisedButton'; +import FlatButton from 'material-ui/FlatButton'; +import SelectField from 'material-ui/SelectField'; +import MenuItem from 'material-ui/MenuItem'; +import Instance from '../../../../../components/Connection'; + +export default class ContactComponent extends React.Component { + constructor(props) { + super(props); + this.props = props; + this.state = { + buttonValue: '', + openDialog: false, + title: '', + modalStyle: { + width: '100%', + maxWidth: '600px', + }, + divStyle: { + textAlign: 'left', + textTransform: 'none !important', + padding: '0px 5px 0px 0px', + marginTop: -5, + boxShadow: 'none', + color: 'rgba(0, 0, 0, 0.3)', + }, + contactTypeList: [], + selectedContact: { + id: '', + type: { + key: '', + value: '', + }, + contact: '', + name: '', + desc: '', + }, + showDescription: true, + showName: true, + }; + + this.handleOpen = this.handleOpen.bind(this); + this.handleClose = this.handleClose.bind(this); + this.setProps = this.setProps.bind(this); + this.handleSave = this.handleSave.bind(this); + this.handleName = this.handleName.bind(this); + this.handleDesc = this.handleDesc.bind(this); + this.handleType = this.handleType.bind(this); + this.handleContact = this.handleContact.bind(this); + } + + componentDidMount() { + this.setProps(this.props); + + Instance.getRawConn().get('/v1/nemt/users/contacttype').then(res => { + const list = res.data.map(c => { + return (); + }); + + this.setState(Object.assign(this.state, { contactTypeList: list })); + }).catch(console.error); + } + + componentWillReceiveProps(nextProps) { + this.setProps(nextProps); + } + + setProps(propsParam) { + const setProps = { + buttonValue: propsParam.buttonValue, + title: propsParam.title, + showDescription: true, + showName: true, + }; + + if (propsParam.showDescription !== undefined || propsParam.showDescription !== null) { + setProps.showDescription = propsParam.showDescription; + } + + if (propsParam.showName !== undefined || propsParam.showName !== null) { + setProps.showName = propsParam.showName; + } + + this.setState(Object.assign(this.state, setProps)); + } + + handleOpen() { + this.setState(Object.assign(this.state, { + openDialog: true, + selectedContact: { + id: '', + type: { + key: '', + value: '', + }, + contact: '', + name: '', + desc: '', + }, + })); + } + + handleClose() { + this.setState(Object.assign(this.state, { openDialog: false })); + } + + handleSave() { + this.setState(Object.assign(this.state, { openDialog: false })); + if (this.props.onNewContact) { + this.props.onNewContact(this.state.selectedContact); + } else { + console.log(this.state.selectedContact); + } + } + + handleName(e) { + const selectedContact = this.state.selectedContact; + selectedContact.name = e.target.value; + this.setState(Object.assign(this.state, { selectedContact: selectedContact })); + } + + handleContact(e) { + const selectedContact = this.state.selectedContact; + selectedContact.contact = e.target.value; + this.setState(Object.assign(this.state, { selectedContact: selectedContact })); + } + + handleDesc(e) { + const selectedContact = this.state.selectedContact; + selectedContact.desc = e.target.value; + this.setState(Object.assign(this.state, { selectedContact: selectedContact })); + } + + handleType(e, i, v) { + const selectedContact = this.state.selectedContact; + selectedContact.type = v; + this.setState(Object.assign(this.state, { selectedContact: selectedContact })); + } + + render() { + let actions = [ + , + , + ]; + + let nameField = (); + if (!this.state.showName) { + nameField = null; + } + + let descField = (); + if (!this.state.showDescription) { + descField = null; + } + + return ( +
      + + +
      + + + {this.state.contactTypeList} + + + {nameField} + {descField} +
      +
      +
      ); + } +} \ No newline at end of file diff --git a/src/routes/app/routes/organization/components/GoogleAddressComponent.js b/src/routes/app/routes/organization/components/GoogleAddressComponent.js new file mode 100644 index 0000000..eeb31c0 --- /dev/null +++ b/src/routes/app/routes/organization/components/GoogleAddressComponent.js @@ -0,0 +1,200 @@ +import React from 'react'; +import Dialog from 'material-ui/Dialog'; +import { List, ListItem } from 'material-ui/List'; +import TextField from 'material-ui/TextField'; +import RaisedButton from 'material-ui/RaisedButton'; +import FlatButton from 'material-ui/FlatButton'; +import SelectField from 'material-ui/SelectField'; +import MenuItem from 'material-ui/MenuItem'; + +const placeService = new google.maps.places.PlacesService(document.createElement('div')); + +export default class GoogleAddressComponent extends React.Component { + constructor(props) { + super(props); + this.props = props; + this.state = { + buttonValue: '', + openDialog: false, + title: '', + modalStyle: { + width: '100%', + maxWidth: '600px', + }, + divStyle: { + textAlign: 'left', + textTransform: 'none !important', + padding: '0px 5px 0px 0px', + marginTop: -5, + boxShadow: 'none', + color: 'rgba(0, 0, 0, 0.3)', + }, + location: { + lat: 41.819078, + long: -87.623129, + }, + searchAddresses: [], + selectedAddress: { + id: '', + address: '', + lat: 0, + lng: 0, + name: '', + text: '', + }, + showType: false, + addressType: '', + }; + + this.handleOpen = this.handleOpen.bind(this); + this.handleClose = this.handleClose.bind(this); + this.setProps = this.setProps.bind(this); + this.handleSave = this.handleSave.bind(this); + this.handleSearch = this.handleSearch.bind(this); + this.handleName = this.handleName.bind(this); + this.handleAddress = this.handleAddress.bind(this); + this.handleChangeType = this.handleChangeType.bind(this); + } + + componentDidMount() { + this.setProps(this.props); + } + + componentWillReceiveProps(nextProps) { + this.setProps(nextProps); + } + + setProps(propsParam) { + this.setState(Object.assign(this.state, { buttonValue: propsParam.buttonValue, title: propsParam.title, showType: propsParam.showType })); + } + + handleChangeType = (event, key, payload) => { + this.setState(Object.assign(this.state, { addressType: payload })); + } + + handleOpen() { + this.setState(Object.assign(this.state, { openDialog: true })); + } + + handleClose() { + this.setState(Object.assign(this.state, { openDialog: false })); + } + + handleSave() { + this.setState(Object.assign(this.state, { openDialog: false })); + let selectedAddress = this.state.selectedAddress; + if (this.state.showType) { + selectedAddress.address_type = this.state.addressType; + } + + if (this.props.onSelectAddress) { + this.props.onSelectAddress(selectedAddress); + } + } + + handleAddress(e, a) { + this.setState(Object.assign(this.state, { selectedAddress: a })); + } + + handleName(e) { + let selectedAddress = this.state.selectedAddress; + selectedAddress.name = e.target.value; + this.setState(Object.assign(this.state, { selectedAddress: selectedAddress })); + } + + handleSearch(e) { + var location = new google.maps.LatLng(this.state.lat, this.state.long); + var request = { + location: location, + radius: '500', + query: e.target.value, + }; + + let selectedAddress = this.state.selectedAddress; + selectedAddress.text = e.target.value; + this.setState(Object.assign(this.state, { selectedAddress: selectedAddress })); + + const callback = (results, status) => { + if (status == google.maps.places.PlacesServiceStatus.OK) { + const googlePlaces = results.map(place => { + const address = (place.formatted_address ? place.formatted_address : place.vicinity); + place = Object.assign(place, { text: `${address}` }); + const clickResult = { + id: place.id, + address: place.formatted_address ? place.formatted_address : place.vicinity, + lat: place.geometry.location.lat(), + lng: place.geometry.location.lng(), + name: place.name, + text: place.text, + type: 'google', + }; + + return ( this.handleAddress(e, clickResult)} />); + }); + this.setState(Object.assign(this.state, { searchAddresses: googlePlaces })); + } + } + + placeService.textSearch(request, callback); + } + + render() { + + let actions = [ + , + , + ]; + + let addressType = ( + + + + + + ) + + return ( +
      + + +
      + {addressType} + + + + {this.state.searchAddresses} + +
      +
      +
      ); + } +} \ No newline at end of file diff --git a/src/routes/app/routes/organization/components/OrganizationComponent.js b/src/routes/app/routes/organization/components/OrganizationComponent.js new file mode 100644 index 0000000..40941b4 --- /dev/null +++ b/src/routes/app/routes/organization/components/OrganizationComponent.js @@ -0,0 +1,148 @@ +import React from 'react'; +import Dialog from 'material-ui/Dialog'; +import { List, ListItem } from 'material-ui/List'; +import TextField from 'material-ui/TextField'; +import RaisedButton from 'material-ui/RaisedButton'; +import FlatButton from 'material-ui/FlatButton'; +import Instance from '../../../../../components/Connection'; + +export default class OrganizationComponent extends React.Component { + constructor(props) { + super(props); + this.props = props; + this.state = { + buttonValue: '', + openDialog: false, + title: '', + modalStyle: { + width: '100%', + maxWidth: '600px', + }, + divStyle: { + textAlign: 'left', + textTransform: 'none !important', + padding: '0px 5px 0px 0px', + marginTop: -5, + boxShadow: 'none', + color: 'rgba(0, 0, 0, 0.3)', + }, + location: { + lat: 41.819078, + long: -87.623129, + }, + searchValue: '', + searchOrganizations: [], + selectedOrganizations: [], + searchingOrganizations: false, + }; + + this.handleOpen = this.handleOpen.bind(this); + this.handleClose = this.handleClose.bind(this); + this.setProps = this.setProps.bind(this); + this.handleSave = this.handleSave.bind(this); + this.handleSearch = this.handleSearch.bind(this); + this.handleOrganization = this.handleOrganization.bind(this); + } + + componentDidMount() { + this.setProps(this.props); + } + + componentWillReceiveProps(nextProps) { + this.setProps(nextProps); + } + + setProps(propsParam) { + this.setState(Object.assign(this.state, { buttonValue: propsParam.buttonValue, title: propsParam.title })); + } + + handleOpen() { + this.setState(Object.assign(this.state, { openDialog: true })); + } + + handleClose() { + this.setState(Object.assign(this.state, { openDialog: false })); + } + + handleSave() { + this.setState(Object.assign(this.state, { openDialog: false })); + if (this.props.onSelectOrganization) { + this.props.onSelectOrganization(this.state.selectedOrganizations); + } + } + + handleOrganization(e, a) { + let selectedOrganizations = this.state.selectedOrganizations; + selectedOrganizations.push(a); + this.setState(Object.assign(this.state, { + selectedOrganizations: selectedOrganizations, + searchValue: a.name, + })); + } + + handleSearch(e) { + this.setState(Object.assign(this.state, { searchValue: e.target.value })); + if (e.target.value.length >= 3 && !this.state.searchingOrganizations) { + this.setState(Object.assign(this.state, { searchingOrganizations: true })); + let url = '/v1/nemt/organization/name?name=' + encodeURIComponent(e.target.value); + if (this.props.searchType) { + switch (this.props.searchType) { + case 'parent': + case 'child': + url += '&type=' + encodeURIComponent(this.props.searchType); + break; + } + } + + Instance.getRawConn().get(url).then(res => { + const list = res.data.map(p => { + return ( this.handleOrganization(e, p)} />); + }); + this.setState(Object.assign(this.state, { searchOrganizations: list, searchingOrganizations: false })); + }).catch(console.error); + } + } + + render() { + + let actions = [ + , + , + ]; + + return ( +
      + + +
      + + + {this.state.searchOrganizations} + +
      +
      +
      ); + } +} \ No newline at end of file diff --git a/src/routes/app/routes/organization/components/organization.js b/src/routes/app/routes/organization/components/organization.js new file mode 100644 index 0000000..f13b045 --- /dev/null +++ b/src/routes/app/routes/organization/components/organization.js @@ -0,0 +1,629 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import QueueAnim from 'rc-queue-anim'; +import Instance from '../../../../../components/Connection'; +import { + Row, + Col, + Grid, + Table, +} from '@sketchpixy/rubix'; +import moment from 'moment'; +import Delete from 'material-ui/svg-icons/action/delete'; +import IconButton from 'material-ui/IconButton'; + +import GoogleAddressComponent from './GoogleAddressComponent'; +import ContactComponent from './ContactComponent'; +import OrganizationComponent from './OrganizationComponent'; +import ContactOption from '../../../components/ContactOption'; + +const formatTime = function (sec_num) { + var hours = Math.floor(sec_num / 3600); + var minutes = Math.floor((sec_num - (hours * 3600)) / 60); + var seconds = sec_num - (hours * 3600) - (minutes * 60); + + if (hours < 10) { hours = "0" + hours; } + if (minutes < 10) { minutes = "0" + minutes; } + if (seconds < 10) { seconds = "0" + seconds; } + return hours + ':' + minutes + ':' + seconds; +} + +const formatPhoneNumber = function (s) { + var s2 = ("" + s).replace(/\D/g, ''); + var m = s2.match(/^(\d{3})(\d{3})(\d{4})$/); + return (!m) ? null : "(" + m[1] + ") " + m[2] + "-" + m[3]; +} + +const Main = (props) => { + return ( +
      +
      +
      +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      +
      +
      + ) +}; + +const ChildInfo = (props) => { + if (props.organization.childs === null || props.organization.childs === undefined || props.organization.childs.length === 0) { + return null + } else { + const handleChild = (e, p) => { + if (props.onChildClick) { + props.onChildClick(p); + } else { + console.log(p); + } + } + + let list = props.organization.childs.map(c => { + let status = "Active"; + if (!c.active) { + status = "Inactive"; + } + if (c.blocked) { + status = "Blocked"; + } + if (c.suspended) { + status = "Suspended" + } + + return ( + + ); + }) + + return (
      +
      +
      +
      +
      +
      +
      +
      + Child Organization +
      +
      +
      +
      + Name +
      +
      + Type +
      +
      + Status +
      +
      + Created +
      +
      + {list} +
      +
      +
      +
      +
      +
      ) + } +} + +const ParentInfo = (props) => { + if (props.organization.parent === null || props.organization.parent === undefined) { + return null + } else { + const parent = props.organization.parent; + let status = "Active"; + if (!parent.active) { + status = "Inactive"; + } + if (parent.blocked) { + status = "Blocked"; + } + if (parent.suspended) { + status = "Suspended" + } + + const handleParent = (e, p) => { + if (props.onParentClick) { + props.onParentClick(p); + } else { + console.log(p); + } + } + + return ( + ) + } +} + +const Address = (props) => { + let list = []; + let buttonStyle = { + marginTop: -10 + } + + if (props.organization.addresses && props.organization.addresses !== null && props.organization.addresses.length > 0) { + const handleRemoveAddress = (a) => { + if (props.onAddressRemoved) { + props.onAddressRemoved(a); + } + } + + list = props.organization.addresses.map(c => { + return (
      +
      + {c.name} +
      +
      + {c.address} +
      +
      + + handleRemoveAddress(c)} style={buttonStyle}> +
      +
      ); + }); + } + + return ( +
      +
      +
      +
      +
      +
      +
      +
      + Addresses +
      +
      + +
      +
      + +
      +
      + Name +
      +
      + Address +
      +
      + Actions +
      +
      + {list} +
      +
      +
      +
      +
      +
      + ) +}; + +const ContactInfo = (props) => { + let list = []; + let buttonStyle = { + marginTop: -10 + } + + if (props.organization.contacts && props.organization.contacts !== null && props.organization.contacts.length > 0) { + const handleRemoveContact = (c) => { + if (props.onContactRemoved) { + props.onContactRemoved(c); + } + } + + list = props.organization.contacts.map(c => { + let contact = c.contact + switch (c.type.key) { + case "phone": + case "landline": + case "mobile": + case "sms": + case "fax": + contact = contact.replace('+1', ''); + contact = formatPhoneNumber(contact); + break; + } + + return (
      +
      + {c.name} +
      +
      + {contact} +
      +
      + + + +
      +
      ); + }); + } + + return ( +
      +
      +
      +
      +
      +
      +
      +
      + Contact Info +
      +
      + +
      +
      + +
      +
      + Name +
      +
      + Contact +
      +
      + Actions +
      +
      + {list} +
      +
      +
      +
      +
      +
      + ) +}; + +const Header = (props) => { + let profileName = ""; + let organizationName = ""; + let organizationType = ""; + + let status = "Active"; + if (!props.organization.active) { + status = "Inactive"; + } + if (props.organization.blocked) { + status = "Blocked"; + } + if (props.organization.suspended) { + status = "Suspended" + } + + let addParentButton = null; + if (props.organization.parent === null) { + addParentButton = (
      + +
      ); + } + + return ( +
      +
      +
      +
      +
      +
      +
      + +
      + Name + {props.organization.name} +
      + +
      + Type + {props.organization.type.name} +
      + +
      + Status + {status} +
      + +
      + Author + {props.organization.author.name} +
      + + +
      + Last Editor + {props.organization.last_editor.name} +
      + +
      + Created + {moment(props.organization.created).format('MM/DD/YYYY h:mm a')} +
      + +
      + Updated + {moment(props.organization.updated).format('MM/DD/YYYY h:mm a')} +
      + +
      +
      + {addParentButton} +
      + +
      +
      +
      +
      +
      +
      +
      +
      + ) +}; + +class Organization extends React.Component { + constructor(props) { + super(props); + this.props = props; + + this.getOrganization = this.getOrganization.bind(this); + this.handleAddressAdded = this.handleAddressAdded.bind(this); + this.handleAddressRemoved = this.handleAddressRemoved.bind(this); + this.handleContactAdded = this.handleContactAdded.bind(this); + this.handleContactRemoved = this.handleContactRemoved.bind(this); + this.handleParentSelected = this.handleParentSelected.bind(this); + this.handleChildSelected = this.handleChildSelected.bind(this); + this.handleParentClick = this.handleParentClick.bind(this); + this.handleChildClick = this.handleChildClick.bind(this); + } + + state = { + organization: { + "id": "", + "type": { + "name": "", + "key": "" + }, + "name": "", + "main": false, + "created": "", + "updated": "", + "active": true, + "blocked": false, + "suspended": false, + "author": { + "useruuid": "", + "name": "", + }, + "last_editor": { + "useruuid": "", + "name": "", + } + } + } + + componentDidMount() { + const self = this; + const orguuid = this.props.params.org_uuid; + this.getOrganization(orguuid); + } + + getOrganization(orgUUID) { + const self = this; + Instance.getRawConn().get(`/v1/nemt/organization/${orgUUID}`) + .then(res => { + self.setState(Object.assign(self.state, { organization: res.data })); + }) + .catch(err => { + if (err.response.status === 422) { + location.href = '/#/app/table/organizations'; + } else { + console.error(err); + } + }); + } + + handleAddressAdded(address) { + const orguuid = this.props.params.org_uuid; + const self = this; + + const addressObj = { + "internal_id": address.id, + "name": address.name, + "address": address.address, + "lat": address.lat, + "long": address.long, + } + Instance.getRawConn().post(`/v1/nemt/organization/${orguuid}/address`, addressObj) + .then(res => { + self.setState(Object.assign(self.state, { organization: res.data })); + }) + .catch(err => { + if (err.response.status === 422) { + location.href = '/#/app/table/organizations'; + } else { + console.error(err); + } + }); + } + + handleAddressRemoved(address) { + const orguuid = this.props.params.org_uuid; + const self = this; + + Instance.getRawConn().put(`/v1/nemt/organization/${orguuid}/address`, address) + .then(res => { + self.setState(Object.assign(self.state, { organization: res.data })); + }) + .catch(err => { + if (err.response.status === 422) { + location.href = '/#/app/table/organizations'; + } else { + console.error(err); + } + }); + } + + handleContactAdded(contact) { + const orguuid = this.props.params.org_uuid; + const self = this; + + var contactObj = { + "type": contact.type, + "contact": contact.contact, + "name": contact.name, + "desc": contact.desc, + } + + Instance.getRawConn().post(`/v1/nemt/organization/${orguuid}/contact`, contactObj) + .then(res => { + self.setState(Object.assign(self.state, { organization: res.data })); + }) + .catch(err => { + if (err.response.status === 422) { + location.href = '/#/app/table/organizations'; + } else { + console.error(err); + } + }); + } + + handleContactRemoved(contact) { + const orguuid = this.props.params.org_uuid; + const self = this; + + Instance.getRawConn().put(`/v1/nemt/organization/${orguuid}/contact`, contact) + .then(res => { + self.setState(Object.assign(self.state, { organization: res.data })); + }) + .catch(err => { + if (err.response.status === 422) { + location.href = '/#/app/table/organizations'; + } else { + console.error(err); + } + }); + } + + handleParentSelected(organization) { + const org = organization[0]; + const orguuid = this.props.params.org_uuid; + const self = this; + + Instance.getRawConn().post(`/v1/nemt/organization/${orguuid}/parent`, org) + .then(res => { + self.setState(Object.assign(self.state, { organization: res.data })); + }) + .catch(err => { + if (err.response.status === 422) { + location.href = '/#/app/table/organizations'; + } else { + console.error(err); + } + }); + } + + handleChildSelected(organization) { + const org = organization[0]; + const orguuid = this.props.params.org_uuid; + const self = this; + + Instance.getRawConn().post(`/v1/nemt/organization/${orguuid}/child`, org) + .then(res => { + self.setState(Object.assign(self.state, { organization: res.data })); + }) + .catch(err => { + if (err.response.status === 422) { + location.href = '/#/app/table/organizations'; + } else { + console.error(err); + } + }); + } + + handleParentClick(organization) { + this.getOrganization(organization.id); + } + + handleChildClick(organization) { + this.getOrganization(organization.id); + } + + render() { + return ( +
      + +
      + +
      ) + } +} +module.exports = Organization; diff --git a/src/routes/app/routes/organization/index.js b/src/routes/app/routes/organization/index.js new file mode 100644 index 0000000..ba5ee18 --- /dev/null +++ b/src/routes/app/routes/organization/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'organization/:org_uuid', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/organization')); + }); + } +}; diff --git a/src/routes/app/routes/pageLayouts/index.js b/src/routes/app/routes/pageLayouts/index.js new file mode 100644 index 0000000..b288f8f --- /dev/null +++ b/src/routes/app/routes/pageLayouts/index.js @@ -0,0 +1,11 @@ +module.exports = { + path: 'pglayout', + getChildRoutes(partialNextState, cb) { + require.ensure([], (require) => { + cb(null, [ + require('./routes/centered'), + require('./routes/fullWidth'), + ]); + }); + } +}; diff --git a/src/routes/app/routes/pageLayouts/routes/centered/components/Centered.js b/src/routes/app/routes/pageLayouts/routes/centered/components/Centered.js new file mode 100644 index 0000000..00dcb11 --- /dev/null +++ b/src/routes/app/routes/pageLayouts/routes/centered/components/Centered.js @@ -0,0 +1,16 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; + +const Centered = () => ( +
      + +
      +
      +

      Blank

      +
      +
      +
      +
      +); + +module.exports = Centered; diff --git a/src/routes/app/routes/pageLayouts/routes/centered/index.js b/src/routes/app/routes/pageLayouts/routes/centered/index.js new file mode 100644 index 0000000..f606201 --- /dev/null +++ b/src/routes/app/routes/pageLayouts/routes/centered/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'centered', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Centered')); + }); + } +}; diff --git a/src/routes/app/routes/pageLayouts/routes/fullWidth/components/FullWidth.js b/src/routes/app/routes/pageLayouts/routes/fullWidth/components/FullWidth.js new file mode 100644 index 0000000..75e9a8b --- /dev/null +++ b/src/routes/app/routes/pageLayouts/routes/fullWidth/components/FullWidth.js @@ -0,0 +1,20 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; + +const FullWidth = () => ( +
      + + +
      +
      +

      Blank

      +
      +
      +
      +
      +); + +module.exports = FullWidth; diff --git a/src/routes/app/routes/pageLayouts/routes/fullWidth/index.js b/src/routes/app/routes/pageLayouts/routes/fullWidth/index.js new file mode 100644 index 0000000..74f3caf --- /dev/null +++ b/src/routes/app/routes/pageLayouts/routes/fullWidth/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'full-width', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/FullWidth')); + }); + } +}; diff --git a/src/routes/app/routes/pages/index.js b/src/routes/app/routes/pages/index.js new file mode 100644 index 0000000..80cabb5 --- /dev/null +++ b/src/routes/app/routes/pages/index.js @@ -0,0 +1,15 @@ +module.exports = { + path: 'page', + getChildRoutes(partialNextState, cb) { + require.ensure([], (require) => { + cb(null, [ + require('./routes/messages'), + require('./routes/dash'), + require('./routes/profile'), + require('./routes/eligibility'), + require('./routes/map'), + require('./routes/terms'), + ]); + }); + } +}; diff --git a/src/routes/app/routes/pages/routes/dash/components/Careers_copy.js b/src/routes/app/routes/pages/routes/dash/components/Careers_copy.js new file mode 100644 index 0000000..6627250 --- /dev/null +++ b/src/routes/app/routes/pages/routes/dash/components/Careers_copy.js @@ -0,0 +1,625 @@ +import React, { Component } from 'react'; +import RaisedButton from 'material-ui/RaisedButton'; +import Dialog from 'material-ui/Dialog'; +import { deepOrange500 } from 'material-ui/styles/colors'; +import FlatButton from 'material-ui/FlatButton'; +import getMuiTheme from 'material-ui/styles/getMuiTheme'; +import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; +import MenuItem from 'material-ui/MenuItem'; +import { Card, CardActions, CardHeader, CardMedia, CardTitle, CardText } from 'material-ui/Card'; +import APPCONFIG from 'constants/Config'; +import IconButton from 'material-ui/IconButton'; +import PersonAdd from 'material-ui/svg-icons/social/person-add'; +import InfoOutline from 'material-ui/svg-icons/action/info-outline'; + +import Badge from 'material-ui/Badge'; +import DataTables from 'material-ui-datatables'; + +//import contact list examples +import ListExampleSimple from '../../../../ui/routes/lists/components/Simple'; +import ListExampleSelectable from '../../../../ui/routes/lists/components/Selectable'; +import ListExampleMessages from '../../../../ui/routes/lists/components/Messages'; + +//floating actions and "add" button +import ContentAdd from 'material-ui/svg-icons/content/add'; +import FloatingActionButton from 'material-ui/FloatingActionButton'; + +import ActionGrade from 'material-ui/svg-icons/action/grade'; + +import ToolbarSection from '../../../../ui/routes/components/components/Toolbar.js'; +const $ = require('jquery'); +$.DataTable = require('datatables.net'); + + +const IconButtonExampleTouch = () => ( +
      + + delete + + + edit_mode + +
      +); + +const IconButtonExampleTouch2 = () => ( + schedule +); + +const IconButtonExampleTouch3 = () => ( + +); + +const IconButtonExampleTouch4 = () => ( + +); + +const IconButtonExampleTouch5 = () => ( +
      + Michael Weinberg + {/* + phone_android + */} + {/* + sms + */} +
      +); + +const IconButtonExampleTouch6 = () => ( + +); + +const IconButtonExampleTouch8 = () => ( +
      + + phone + +
      +); + + + +// const IconButtonExampleTouch7 = () => ( +// +// phone_android +// +// +// sms +// +// ); + + +// import QueueAnim from 'rc-queue-anim'; +// import RubixTables from 'RubixTables'; + +const styles = { + datatable: { + width: '100%' + }, + container: { + textAlign: 'left', + }, + component: { + margin: '20px 10px', + }, + titleStyle: { + fontSize: 22, + color: deepOrange500, + }, + footerToolbarStyle: { + padding: '0 100px', + }, + tableStyle: { + tableLayout: 'auto', + }, + tableBodyStyle: { + overflowX: 'scroll', + }, + tableWrapperStyle: { + padding: 2, + }, +}; + +const muiTheme = getMuiTheme({ + palette: { + accent1Color: deepOrange500, + }, +}); + +const columns = [ + { + title: 'Day', + data: 'day', + }, + { + title: 'Time', + data: 'time', + }, + { + title: 'Pickup', + data: 'pickup', + }, + { + title: 'Destination', + data: 'destination', + }, + { + title: 'Status', + data: 'status', + }, { + title: 'Details', + data: 'details', + }, +]; + +const TABLE_COLUMNS = [ + { + key: 'sodium', + label: 'Sodium (mg)', + }, { + key: 'calcium', + label: 'Calcium (%)', + }, { + key: 'iron', + label: 'Iron (%)', + }, +]; + +const TABLE_COLUMNS_TOOLTIP = [ + { + key: 'name', + label: 'Dessert (100g serving)', + tooltip: 'Dessert (100g serving)', + }, { + key: 'calories', + label: 'Calories', + tooltip: 'Calories', + }, { + key: 'fat', + label: 'Fat (g)', + tooltip: 'Fat (g)', + }, { + key: 'carbs', + label: 'Carbs (g)', + tooltip: 'Carbs (g)', + }, { + key: 'Member', + label: 'Member (g)', + tooltip: 'Member (g)', + }, { + key: 'sodium', + label: 'Sodium (mg)', + tooltip: 'Sodium (mg)', + }, { + key: 'calcium', + label: 'Calcium (%)', + tooltip: 'Calcium (%)', + }, { + key: 'iron', + label: 'Iron (%)', + tooltip: 'Iron (%)', + }, +]; + +const TABLE_COLUMNS_SORT_STYLE = [ + // { + // key: 'Day', + // label: 'Day', + // tooltip: 'Day', + // className: 'mdl-data-table__cell--non-numeric', + // }, + { + key: 'Time', + label: 'Time', + tooltip: 'Pickup Time', + sortable: true, + style: { + width: 130, + }, + }, + { + key: 'Member', + label: 'Member', + tooltip: 'Name of the Member', + sortable: true, + style: { width: 90, }, + }, + { + key: 'Status', + label: 'Status', + sortable: true, + style: { width: 30, }, + }, + { + key: 'Pickup', + label: 'Pickup', + sortable: true, + tooltip: "Pickup Address", + style: { width: 50, }, + }, + { + key: 'Destination', + label: 'Destination', + tooltip: "Destination Address", + sortable: true, + style: { width: 50, }, + }, + // { + // key: 'Status', + // label: 'Status', + // }, + + // { + // key: 'Details', + // label: 'Details', + // }, + + // { + // key: 'memberPhone', + // label: 'Phone', + // tooltip: 'Mobile phone of the Member', + // sortable: false, + // }, + // { + // key: 'ETA', + // label: 'ETA', + // tooltip: "ETA of Lyft Vehicle", + // sortable: true, + // style: { width: 50 }, + // }, + { + key: 'estimatedDuration', + label: 'Duration', + tooltip: "Estimated Duration", + sortable: true, + style: { width: 20, }, + }, + { + key: 'estimatedMileage', + label: 'Mileage', + tooltip: "Estimated Mileage", + sortable: true, + style: { width: 20, }, + }, + { + key: 'lyftVehicle', + label: 'Vehicle', + tooltip: "Color Make and Model of Lyft Vehicle", + sortable: true, + style: { width: 120, }, + }, + { + key: 'licensePlate', + label: 'Plate', + tooltip: 'License Plate of Lyft Vehicle', + sortable: true, + style: { width: 30, }, + }, + { + key: 'driverPhone', + label: 'Driver', + tooltip: "Driver's (Masked) Phone Number", + sortable: true, + }, + { + key: 'rideID', + label: 'ID', + tooltip: 'Q-Ride ID', + sortable: true, + }, + { + key: 'lyftID', + label: 'Lyft ID', + tooltip: 'Lyft Ride ID', + sortable: true, + }, + { + key: 'Actions', + label: 'Actions', + sortable: false, + }, +]; + +const TABLE_DATA_TABLE = [ + { + day: '8/21/2017', + time: '11:00 AM CST', + pickup: '1800 Hig...', + destination: '2222 S...', + status: 'Scheduled', + details: , + }, + { + day: '8/21/2017', + time: '11:00 AM CST', + pickup: '1800 Hig...', + destination: '2222 S...', + status: 'Scheduled', + details: , + }, + { + day: '8/21/2017', + time: '11:00 AM CST', + pickup: '1800 Hig...', + destination: '2222 S...', + status: 'Scheduled', + details: , + }, + { + day: '8/21/2017', + time: '11:00 AM CST', + pickup: '1800 Hig...', + destination: '2222 S...', + status: 'Scheduled', + details: , + }, + { + day: '8/21/2017', + time: '11:00 AM CST', + pickup: '1800 Hig...', + destination: '2222 S...', + status: 'Scheduled', + details: , + }, + { + day: '8/21/2017', + time: '11:00 AM CST', + pickup: '1800 Hig...', + destination: '2222 S...', + status: 'Scheduled', + details: , + }, + { + day: '8/21/2017', + time: '11:00 AM CST', + pickup: '1800 Hig...', + destination: '2222 S...', + status: 'Scheduled', + details: , + }, + { + day: '8/21/2017', + time: '11:00 AM CST', + pickup: '1800 Hig...', + destination: '2222 S...', + status: 'Scheduled', + details: , + }, + { + day: '8/21/2017', + time: '11:00 AM CST', + pickup: '1800 Hig...', + destination: '2222 S...', + status: 'Scheduled', + details: , + }, + { + day: '8/21/2017', + time: '11:00 AM CST', + pickup: '1800 Hig...', + destination: '2222 S...', + status: 'Scheduled', + details: , + }, +]; + +const TABLE_DATA = [ + { + Member: , + // memberPhone: , + Time: , + Pickup: , + Destination: , + Status: , + ETA: '11:20AM', + estimatedDuration: '11:30', + estimatedMileage: '1.7', + lyftVehicle: 'Red Toyota Primexa', + licensePlate: "IL-343444", + driverPhone: , + lyftID: 'QQ2323W', + rideID: '2323QW', + Actions: , + }, + { + Member: 'Jan Foonie', + Time: , + // memberPhone: , + Pickup: , + Destination: , + Status: , + ETA: '1:20AM', + estimatedDuration: '4:00', + estimatedMileage: '4.1', + lyftVehicle: 'Blue Honda Elan', + licensePlate: "IL-329R44", + driverPhone: '(708)-222-2232', + lyftID: '2323QW', + rideID: 'Z22323W', + Actions: , + }, +]; + + +class Table extends Component { + componentDidMount() { + $('#main').DataTable({ + dom: '<"#data-table-wrapper.box box-default table-box table-responsive mdl-shadow--2dp"t>', + data: TABLE_DATA_TABLE, + columns, + }); + } + shouldComponentUpdate() { + return false; + } + componentWillUnmount() { + $('#data-table-wrapper') + .find('#main') + .DataTable() + .destroy(true); + } + render() { + return ( + +
      +
      + + + + + ); + } +} + +class Main extends Component { + constructor(props, context) { + super(props, context); + this.handleSortOrderChange = this.handleSortOrderChange.bind(this); + this.handleFilterValueChange = this.handleFilterValueChange.bind(this); + this.handleCellClick = this.handleCellClick.bind(this); + this.handleCellDoubleClick = this.handleCellDoubleClick.bind(this); + this.handleRowSelection = this.handleRowSelection.bind(this); + this.handlePreviousPageClick = this.handlePreviousPageClick.bind(this); + this.handleNextPageClick = this.handleNextPageClick.bind(this); + this.handlePersonAddClick = this.handlePersonAddClick.bind(this); + this.handleInfoClick = this.handleInfoClick.bind(this); + + this.state = { + data: TABLE_DATA, + page: 1, + }; + } + + handleSortOrderChange(key, order) { + console.log('key:' + key + ' order: ' + order); + } + + handleFilterValueChange(value) { + console.log('filter value: ' + value); + } + + handleCellClick(rowIndex, columnIndex, row, column) { + console.log('rowIndex: ' + rowIndex + ' columnIndex: ' + columnIndex); + } + + handleCellDoubleClick(rowIndex, columnIndex, row, column) { + console.log('rowIndex: ' + rowIndex + ' columnIndex: ' + columnIndex); + } + + handleRowSelection(selectedRows) { + console.log('selectedRows: ' + selectedRows); + } + + handlePreviousPageClick() { + console.log('handlePreviousPageClick'); + this.setState({ + data: TABLE_DATA, + page: 1, + }); + } + + handleNextPageClick() { + console.log('handleNextPageClick'); + this.setState({ + data: TABLE_DATA_NEXT, + page: 2, + }); + } + + handlePersonAddClick() { + console.log('handlePersonAddClick'); + } + + handleInfoClick() { + console.log('handleInfoClick'); + } + + render() { + return ( + +
      +
      + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Donec mattis pretium massa. + + + + + + +
      +
      +
      + ); + } +} + +export default Main; \ No newline at end of file diff --git a/src/routes/app/routes/pages/routes/dash/components/dash.js b/src/routes/app/routes/pages/routes/dash/components/dash.js new file mode 100644 index 0000000..845af7b --- /dev/null +++ b/src/routes/app/routes/pages/routes/dash/components/dash.js @@ -0,0 +1,197 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; +import AutoComplete from 'material-ui/AutoComplete'; +import { Tabs, Tab } from 'material-ui/Tabs'; +import Slider from 'material-ui/Slider'; +import TimePicker from 'material-ui/TimePicker'; +import DatePicker from 'material-ui/DatePicker'; +import TextField from 'material-ui/TextField'; +import Toggle from 'material-ui/Toggle'; +import Snackbar from 'material-ui/Snackbar'; +import { RadioButton, RadioButtonGroup } from 'material-ui/RadioButton'; +import MenuItem from 'material-ui/MenuItem'; +import DropDownMenu from 'material-ui/DropDownMenu'; +import ListExampleSimple from '../../../../ui/routes/lists/components/Simple'; +import ListExampleMessages from '../../../../ui/routes/lists/components/Messages'; +import Datatable from '../../../../tables/routes/members/components/Datatable'; +import FlatButton from 'material-ui/FlatButton'; +import RaisedButton from 'material-ui/RaisedButton'; +import BottomNavigationExampleSimple from '../../../../ui/routes/components/components/BottomNavigation'; +import IconButton from 'material-ui/IconButton'; +import Dialog from 'material-ui/Dialog'; +import FloatingActionButton from 'material-ui/FloatingActionButton'; +import ContentAdd from 'material-ui/svg-icons/content/add'; + +const style = { + marginRight: 20, +}; + +/** + * Default size and `mini` FABs, in primary (default), `secondary` and `disabled` colors. + */ +const FloatingActionButtonExampleSimple = () => ( +
      + + + +
      +); +export default FloatingActionButtonExampleSimple; + + +/** + * A modal dialog can only be closed by selecting one of the actions. + */ +export class DialogExampleModal extends React.Component { + state = { + open: false, + }; + + handleOpen = () => { + this.setState({ open: true }); + }; + + handleClose = () => { + this.setState({ open: false }); + }; + + render() { + const actions = [ + , + , + ]; + + return ( +
      + + + + + + +
      +
      Pickup
      + edit_location + + {/* schedule */} + +
      +
      +
      + ); + } +} + +const dataSource1 = [ + { + text: 'Mercy Hospital', + value: ( + + ), + }, + { + text: 'Qwest Diagnostics', + value: ( + + ), + }, +]; + +const dataSource2 = [ + { + text: 'Home', + value: ( + + ), + }, + { + text: 'Work', + value: ( + + ), + }, + { + text: '1800 Highland..', + value: ( + + ), + }, +]; + + +const Services = () => ( + +); + +const Page = () => ( +
      + +
      +
      +
      +
      +); + +module.exports = Page; + diff --git a/src/routes/app/routes/pages/routes/dash/index.js b/src/routes/app/routes/pages/routes/dash/index.js new file mode 100644 index 0000000..2f154f3 --- /dev/null +++ b/src/routes/app/routes/pages/routes/dash/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'dash', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/dash')); + }); + } +}; diff --git a/src/routes/app/routes/pages/routes/eligibility/components/eligibility.js b/src/routes/app/routes/pages/routes/eligibility/components/eligibility.js new file mode 100644 index 0000000..f922094 --- /dev/null +++ b/src/routes/app/routes/pages/routes/eligibility/components/eligibility.js @@ -0,0 +1,294 @@ +import React, { Component } from 'react'; +import QueueAnim from 'rc-queue-anim'; +import APPCONFIG from 'constants/Config'; +import TextField from 'material-ui/TextField'; +import AutoComplete from 'material-ui/AutoComplete'; +import MenuItem from 'material-ui/MenuItem'; +import { Tabs, Tab } from 'material-ui/Tabs'; +import Slider from 'material-ui/Slider'; +import TimePicker from 'material-ui/TimePicker'; +import DatePicker from 'material-ui/DatePicker'; +import Toggle from 'material-ui/Toggle'; +import Snackbar from 'material-ui/Snackbar'; +import RaisedButton from 'material-ui/RaisedButton'; +import SelectField from 'material-ui/SelectField'; +import Checkbox from 'material-ui/Checkbox'; +import Instance from '../../../../../../../components/Connection'; + +class SignUp extends React.Component { + constructor(props) { + super(props); + } + + state = { + brand: APPCONFIG.brand, + open: false, + fullname: "", + first: "", + middle: "", + last: "", + email: "", + phonenumber: "", + member: "", + birthdate: null, + gender: null, + agreedTerms: false, + validated: false, + memberType:"S" + } + + componentDidMount = () => { + let user = localStorage.getItem("userData") + if (user && user !== null && user !== '') { + user = JSON.parse(user); + user.birthdate = new Date(user.birthdate); + this.setState(Object.assign(this.state, user)); + } + } + + clickEvent = (event) => { + event.preventDefault(); + const state = this; + state.handleRequestOpen(); + + let user = { + "first": this.state.first, + "last": this.state.last, + "gender": this.state.gender, + "member": this.state.member, + "email": this.state.email, + "phonenumber": this.state.phonenumber, + "birthdate": this.state.birthdate.toISOString() + // "eligibility": { + // "tracking_id": "1234567", + // "payer": { + // "payer_id": "621", + // "payer_name": "blue_cross_blue_shield_il" + // }, + // "provider": { + // "provider_npi": "1699849786", + // "provider_name": "LITHOLINK CORPORATION" + // }, + // "subscriber": { + // "subscriber_id": this.state.member, + // "patient_type": "S", + // "name": { + // "first": this.state.first, + // "last": this.state.last, + // "middle": "" + // }, + // "demographic_info": { + // "date_of_birth": this.state.birthdate.toISOString(), + // "gender": this.state.gender + // } + // }, + // "service_info": { + // "date_of_service": new Date().toISOString(), + // "service_type_codes": ["30"] + // } + // } + } + + Instance.getRawConn().post('/v1/nemt/users/member', user).then(function (res) { + state.handleRequestClose(); + + const eligibility = res.data; + // if (eligibility.results.summary.benefits_found) { + window.location.href = `/#/app/form/steppers/${eligibility.useruuid}`; + // } else { + // alert('NO benefits found for this member'); + // } + }).catch(function (err) { + console.log('Error to get eligibility: ', err); + alert('NO benefits found for this member'); + this.handleRequestClose(); + }); + } + + handleRequestClose = () => { + this.setState(Object.assign(this.state, { open: false })); + }; + + handleRequestOpen = () => { + this.setState(Object.assign(this.state, { open: true })); + }; + + handleChecked = (event, checked) => { + this.setState(Object.assign(this.state, { agreedTerms: checked })); + this.buttonValidated(); + }; + + handleDate = (event, date) => { + this.setState(Object.assign(this.state, { birthdate: date })); + this.buttonValidated(); + }; + + handleMember = (event) => { + this.setState(Object.assign(this.state, { member: event.target.value })); + }; + + handleChange = (event, index, value) => { + this.setState(Object.assign(this.state, { gender: value })); + this.buttonValidated(); + }; + + handleMemberType = (event, index, value) => { + this.setState(Object.assign(this.state, { meberType: value })); + this.buttonValidated(); + }; + + handleFirstName = (event) => { + this.setState(Object.assign(this.state, { first: event.target.value })); + }; + + handleEmail = (event) => { + this.setState(Object.assign(this.state, { email: event.target.value })); + }; + + handleLastName = (event) => { + this.setState(Object.assign(this.state, { last: event.target.value })); + }; + + handlePhone = (event) => { + let phone = event.target.value; + if (phone.indexOf("+1") < 0 && phone.length == 10) { + phone = "+1" + phone; + phone = phone.substring(0, 12); + } + + this.setState(Object.assign(this.state, { phonenumber: phone })); + }; + + buttonValidated = () => { + let validated = true; + if (!this.state.first || this.state.first === null || this.state.first === "") validated = false; + if (!this.state.last || this.state.last === null || this.state.last === "") validated = false; + if (!this.state.gender || this.state.gender === null || this.state.gender === "") validated = false; + if (!this.state.member || this.state.member === null || this.state.member === "") validated = false; + if (!this.state.birthdate || this.state.birthdate === null || isNaN(this.state.birthdate.getTime())) validated = false; + if (!this.state.phonenumber || this.state.phonenumber === null || this.state.phonenumber === "") validated = false; + //if (!this.state.email || this.state.email === null || this.state.email === "") validated = false; + if (!this.state.agreedTerms) validated = false; + + this.setState(Object.assign(this.state, { validated: validated })); + } + + render() { + return ( +
      +
      +
      + +
      +
      + +
      +
      + +
      +
      + + + + + + +
      +
      + + + + + + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      + +
      +
      + +
      + + ); + } +} + +const Page = () => ( +
      +
      +

      Verify Eligibility

      +
      +
      + +
      +
      +
      +
      +); + +module.exports = Page; \ No newline at end of file diff --git a/src/routes/app/routes/pages/routes/eligibility/index.js b/src/routes/app/routes/pages/routes/eligibility/index.js new file mode 100644 index 0000000..7c31b95 --- /dev/null +++ b/src/routes/app/routes/pages/routes/eligibility/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'eligibility', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/eligibility')); + }); + } +}; diff --git a/src/routes/app/routes/pages/routes/geosuggest/components/geosuggest.js b/src/routes/app/routes/pages/routes/geosuggest/components/geosuggest.js new file mode 100644 index 0000000..fb5d4d0 --- /dev/null +++ b/src/routes/app/routes/pages/routes/geosuggest/components/geosuggest.js @@ -0,0 +1,75 @@ +import React, { Component } from 'react'; +import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; +import MuiGeoSuggest from 'material-ui-geosuggest'; +import GooglePlaceAutocomplete from 'material-ui-places'; + +const customContentStyle = { + width: '100%', + maxWidth: 'none', +}; + +class App extends Component { + constructor(props) { + super(props); + this.props = props; + this.state = { + inputValue: '' + } + } + + componentWillReceiveProps = (nextProps) => { + this.setState(Object.assign(this.state, { inputValue: nextProps.inputValue })); + } + + componentDidMount = () => { + this.setState(Object.assign(this.state, { inputValue: this.props.inputValue })); + } + + + static propTypes = { + inputValue: React.PropTypes.object.string, + onPlaceChange: React.PropTypes.function + } + + handlePlaceChanges = (place) => { + if (this.props.onPlaceChange) { + if (place) { + let formattedPlace = { + id: place.id, + address: place.formatted_address, + lat: place.geometry.location.lat(), + lng: place.geometry.location.lng(), + name: place.name, + type: 'google' + } + this.props.onPlaceChange(formattedPlace); + } + } + } + + handleChange(event) { + this.setState({ inputValue: event.target.value }); + } + + render() { + return ( +
      + + this.handleChange.bind(this, e)} + onNewRequest={(r, i) => console.log('New Request', r, i)} + onUpdateInput={(a, b, c) => console.log('Update Input', a, b, c)} + fullWidth={true} + /> + +
      + ); + } +} + +export default App; \ No newline at end of file diff --git a/src/routes/app/routes/pages/routes/map/components/Maps.js b/src/routes/app/routes/pages/routes/map/components/Maps.js new file mode 100644 index 0000000..225f6c7 --- /dev/null +++ b/src/routes/app/routes/pages/routes/map/components/Maps.js @@ -0,0 +1,625 @@ + +/* global google */ + +import { + default as React, + Component, +} from "react"; +import ReactDOM from 'react-dom'; +import Helmet from "react-helmet"; + +import { + withGoogleMap, + GoogleMap, + Marker, + lodash, InfoWindow, TrafficLayer, DirectionsRenderer, SearchBox +} from "react-google-maps"; + +import TimePicker from 'material-ui/TimePicker'; + +import Imgix from 'react-imgix' +import moment from "moment"; + + +const INPUT_STYLE = { + boxSizing: `border-box`, + MozBoxSizing: `border-box`, + border: `1px solid transparent`, + width: `240px`, + height: `32px`, + marginTop: `27px`, + padding: `0 12px`, + borderRadius: `1px`, + boxShadow: `0 2px 6px rgba(0, 0, 0, 0.3)`, + fontSize: `14px`, + outline: `none`, + textOverflow: `ellipses`, +}; + + +const PopUpInfoWindowExampleGoogleMap = withGoogleMap(props => { + return ( + + + {props.markers.map((marker, index) => ( + props.onMarkerClick(marker)} + icon={marker.icon} + showInfo={false} + > + {marker.showInfo && ( + props.onMarkerClose(marker)}> +
      {marker.infoContent}
      +
      + )} + +
      + ))} + {props.directions && } +
      + ) +}); + +/* + * + * Add + * to your HTML to provide google.maps reference + * + * @author: @chiwoojo + */ +export default class PopUpInfoWindowExample extends Component { + + constructor(props) { + super(props); + this.props = props; + + this.state = { + ride: { + "ride_uuid": "", + "user": { + "useruuid": "", + "name": "", + "member": "" + }, + "status": { + "key": "", + "value": "" + }, + "type": { + "key": "", + "value": "" + }, + "notes": "", + "passenger": { + "user_id": "", + "image_url": "", + "first_name": "", + "last_name": "", + "phone_number": "" + }, + "driver": { + "rating": "", + "image_url": "", + "first_name": "", + "phone_number": "" + }, + "vehicle": { + "color": "", + "make": "", + "license_plate": "", + "image_url": "", + "year": 0, + "license_plate_state": "", + "model": "" + }, + "trip_type": { + "key": "", + "value": "", + }, + "route": { + "origin": { + "name": "", + "lat": 0, + "lng": 0, + "address": "" + }, + "destination": { + "name": "", + "lat": 0, + "lng": 0, + "address": "" + }, + "location": { + "bearing": 0, + "lat": 0, + "lng": 0, + }, + "route_kml": "", + "distance": 0, + "duration": 0, + "eta": 0 + }, + "visit_date": new Date(), + "visit_time": new Date(), + "pickup_time": new Date() + }, + bounds: null, + center: { + lat: 41.819078, + lng: -87.623129, + }, + origin: null, + destination: null, + directions: null, + // array of objects of markers + rendererOptions: { + suppressMarkers: true + }, + markers: [ + { + icon: 'https://chart.googleapis.com/chart?chst=d_map_pin_letter&chld=A|FF0000|000000', + position: null, + showInfo: false, + infoContent: ( +
      + +
      Pickup +

      +
      + location_on +
      + ), + }, + { + icon: 'https://chart.googleapis.com/chart?chst=d_map_pin_letter&chld=B|008000|000000', + position: null, + showInfo: false, + infoContent: ( +
      + +
      Destination +

      +
      + local_hospital +
      + ), + }, + ], + } + + if (this.props.data !== null || this.props.data !== undefined) { + this.state.ride = this.props.data; + } + } + + static propTypes = { + data: React.PropTypes.object.isRequired, + } + + componentWillReceiveProps(nextProps) { + let state = this + const routeObj = { + origin: new google.maps.LatLng(nextProps.data.route.origin.lat, nextProps.data.route.origin.lng), + destination: new google.maps.LatLng(nextProps.data.route.destination.lat, nextProps.data.route.destination.lng), + travelMode: google.maps.TravelMode.DRIVING, + }; + state.setState(Object.assign(state.state, { ride: nextProps.data })); + + const DirectionsService = new google.maps.DirectionsService(); + DirectionsService.route(routeObj, (result, status) => { + if (status === google.maps.DirectionsStatus.OK) { + + let pickupMarker = { + icon: '/assets/images/home.png', + position: result.routes[0].legs[0].start_location, + showInfo: false, + infoContent: ( +
      +
      +

      PICK UP at {moment(nextProps.data.pickup_time).format("hh:mm a")}

      {nextProps.data.route.origin.address}

      +
      +
      + ), + }; + let dropOffMarker = { + icon: '/assets/images/provider_pin.png', + position: result.routes[0].legs[0].end_location, + showInfo: false, + infoContent: ( +
      +
      +

      DROP OFF for {moment(nextProps.data.visit_time).format("hh:mm a")} visit.
      {nextProps.data.route.destination.address}

      +
      +
      + ), + }; + + if (nextProps.data.trip_type.key === 'from_visit' || nextProps.data.trip_type.key === 'from_visit_call') { + if (nextProps.data.status.key === 'willCall') { + pickupMarker = { + icon: '/assets/images/provider_pin.png', + position: result.routes[0].legs[0].end_location, + showInfo: false, + infoContent: ( +
      +
      +

      PICK UP Will Call

      {nextProps.data.route.destination.address}

      +
      +
      + ), + }; + } else { + pickupMarker = { + icon: '/assets/images/provider_pin.png', + position: result.routes[0].legs[0].end_location, + showInfo: false, + infoContent: ( +
      +
      +

      PICK UP at {moment(nextProps.data.pickup_time).format("hh:mm a")}

      {nextProps.data.route.destination.address}

      +
      +
      + ), + }; + } + dropOffMarker = { + icon: '/assets/images/home.png', + position: result.routes[0].legs[0].start_location, + showInfo: false, + infoContent: ( +
      +
      +

      DROP OFF
      {nextProps.data.route.origin.address}

      +
      +
      + ), + }; + } + + // let pickupMarker = { + // icon: '/assets/images/home.png', + // // icon: state.state.ride.vehicle.image_url, + // position: result.routes[0].legs[0].start_location, + // showInfo: false, + // infoContent: ( + //
      + // + //
      Pickup + //

      {nextProps.data.route.origin.address}

      + //
      + // location_on + //
      + // ), + // }; + // let dropOffMarker = { + // // icon: state.state.ride.vehicle.image_url, + // icon: '/assets/images/provider_pin.png', + // position: result.routes[0].legs[0].end_location, + // showInfo: false, + // infoContent: ( + //
      + // + //
      Destination + //

      {nextProps.data.route.destination.address}

      + //
      + // local_hospital + //
      + // ), + // } + + // if (nextProps.data.trip_type.key === 'from_visit' || nextProps.data.trip_type.key === 'from_visit_call') { + // pickupMarker = { + // icon: '/assets/images/provider_pin.png', + // // icon: state.state.ride.vehicle.image_url, + // position: result.routes[0].legs[0].end_location, + // showInfo: false, + // infoContent: ( + //
      + // + //
      Pickup + //

      {nextProps.data.route.destination.address}

      + //
      + // local_hospital + //
      + // ), + // }; + // dropOffMarker = { + // // icon: state.state.ride.vehicle.image_url, + // icon: '/assets/images/home.png', + // position: result.routes[0].legs[0].start_location, + // showInfo: false, + // infoContent: ( + //
      + //
      Destination + //

      {nextProps.data.route.origin.address}

      + //
      + // location_on + //
      + // ), + // } + + // if (nextProps.data.status.key === 'willCall') { + // pickupMarker.infoContent = ( + //
      + //
      Pickup + //

      {nextProps.data.route.destination.address}

      + //
      + // local_hospital + //
      ); + + // dropOffMarker.infoContent = ( + //
      + //
      Destination + //

      {nextProps.data.route.origin.address}

      + //
      + // location_on + //
      ) + // } + // } + + let mapState = { + origin: new google.maps.LatLng(nextProps.data.route.origin.lat, nextProps.data.route.origin.lng), + destination: new google.maps.LatLng(nextProps.data.route.destination.lat, nextProps.data.route.destination.lng), + directions: result, + // array of objects of markers + rendererOptions: { + suppressMarkers: true + }, + markers: [ + pickupMarker, + dropOffMarker, + ], + } + + switch (state.state.ride.status.key) { + case "accepted": + case "pickedUp": + case "arrived": + + let scaledImage = ; + + // console.log(scaledImage); + + let carMarker = { + icon: '/assets/images/prius2.png', + + // icon: this.state.ride.vehicle.image_url, + // icon: , + + position: new google.maps.LatLng(state.state.ride.route.location.lat, state.state.ride.route.location.lng), + //position: result.routes[0].legs[0].steps[4].end_location, + showInfo: false, + infoContent: ( +
      +
      {state.state.ride.driver.first_name} +

      {state.state.ride.vehicle.color} {state.state.ride.vehicle.make} {state.state.ride.vehicle.model} ({state.state.ride.vehicle.license_plate})

      +
      + watch_later +
      + ), + }; + mapState.markers.push(carMarker); + break; + default: + console.log('not found'); + } + + state.setState(Object.assign(state.state, mapState)); + } else { + if (result.status !== "ZERO_RESULTS") { + console.error(`error fetching directions ${result}`); + } + } + }); + } + + componentDidMount() { + let data = this.props.data; + this.setState(Object.assign(this.state, { ride: data })); + const DirectionsService = new google.maps.DirectionsService(); + DirectionsService.route({ + origin: new google.maps.LatLng(this.state.ride.route.origin.lat, this.state.ride.route.origin.lng), + destination: new google.maps.LatLng(this.state.ride.route.destination.lat, this.state.ride.route.destination.lng), + travelMode: google.maps.TravelMode.DRIVING, + }, (result, status) => { + if (status === google.maps.DirectionsStatus.OK) { + let mapState = { + origin: new google.maps.LatLng(this.state.ride.route.origin.lat, this.state.ride.route.origin.lng), + destination: new google.maps.LatLng(this.state.ride.route.destination.lat, this.state.ride.route.destination.lng), + directions: result, + // array of objects of markers + rendererOptions: { + suppressMarkers: true + }, + markers: [ + { + // icon: '/assets/images/5_min.png', + icon: state.state.ride.vehicle.image_url, + // icon: state.state.ride.vehicle.image_url, + position: result.routes[0].legs[0].start_location, + showInfo: false, + infoContent: ( +
      + +
      Pickup +

      {this.state.ride.route.origin.address}

      +
      + location_on +
      + ), + }, + { + icon: '/assets/images/provider.png', + position: result.routes[0].legs[0].end_location, + showInfo: false, + infoContent: ( +
      + +
      Destination +

      {this.state.ride.route.destination.address}

      +
      + local_hospital +
      + ), + }, + ], + }; + + + console.log('Current Status Mount: ', state.state.ride.status.key) + switch (this.state.ride.status.key) { + case "accepted": + case "pickepUp": + case "arrived": + let carMarker = { + icon: state.state.ride.vehicle.image_url, + position: new google.maps.LatLng(state.state.ride.route.location.lat, state.state.ride.route.location.lng), + //position: result.routes[0].legs[0].steps[4].end_location, + showInfo: false, + infoContent: ( +
      +
      {this.state.ride.driver.first_name} +

      {this.state.ride.route.vehicle.color} {this.state.ride.route.vehicle.make} {this.state.ride.route.vehicle.model} ({this.state.ride.route.vehicle.license_plate})

      +
      + watch_later +
      + ), + }; + mapState.markers.push(carMarker); + break; + } + this.setState(Object.assign(this.state, mapState)); + } else { + if (result.status !== "ZERO_RESULTS") { + console.error(`error fetching directions ${result}`); + } + } + }); + } + + handleMapMounted = this.handleMapMounted.bind(this); + handleBoundsChanged = this.handleBoundsChanged.bind(this); + handleSearchBoxMounted = this.handleSearchBoxMounted.bind(this); + handlePlacesChanged = this.handlePlacesChanged.bind(this); + + handleMapMounted(map) { + debugger; + this._map = map; + } + + handleBoundsChanged() { + this.setState(Object.assign(this.state, { + bounds: this._map.getBounds(), + center: this._map.getCenter(), + })); + } + + handleSearchBoxMounted(searchBox) { + this._searchBox = searchBox; + } + + handlePlacesChanged() { + const places = this._searchBox.getPlaces(); + + // Add a marker for each place returned from search bar + const markers = places.map(place => ({ + position: place.geometry.location, + })); + + // Set markers; set map center to first search result + const mapCenter = markers.length > 0 ? markers[0].position : this.state.center; + + this.setState(Object.assign(this.state, { + center: mapCenter, + markers, + })); + } + + handleMarkerClick = this.handleMarkerClick.bind(this); + handleMarkerClose = this.handleMarkerClose.bind(this); + + // Toggle to 'true' to show InfoWindow and re-renders component + handleMarkerClick(targetMarker) { + this.setState(Object.assign(this.state, { + markers: this.state.markers.map(marker => { + if (marker === targetMarker) { + return { + ...marker, + showInfo: true, + }; + } + return marker; + }), + })); + } + + handleMarkerClose(targetMarker) { + this.setState(Object.assign(this.state, { + markers: this.state.markers.map(marker => { + if (marker === targetMarker) { + return { + ...marker, + showInfo: false, + }; + } + return marker; + }), + })); + } + + render() { + let maps = ( + } + mapElement={ +
      + } + onMapMounted={this.handleMapMounted} + onBoundsChanged={this.handleBoundsChanged} + onSearchBoxMounted={this.handleSearchBoxMounted} + bounds={this.state.bounds} + onPlacesChanged={this.handlePlacesChanged} + markers={this.state.markers} + onMarkerClick={this.handleMarkerClick} + onMarkerClose={this.handleMarkerClose} + center={this.state.origin} + directions={this.state.directions} + directionsRenderer={this.state.rendererOptions} + zoom={this.state.defaultZoom} + />); + + return maps; + } +} diff --git a/src/routes/app/routes/pages/routes/map/components/Services.js b/src/routes/app/routes/pages/routes/map/components/Services.js new file mode 100644 index 0000000..d290237 --- /dev/null +++ b/src/routes/app/routes/pages/routes/map/components/Services.js @@ -0,0 +1,1119 @@ +import React, { Component } from 'react'; +import QueueAnim from 'rc-queue-anim'; +import AutoComplete from 'material-ui/AutoComplete'; +import { Tabs, Tab } from 'material-ui/Tabs'; +import Slider from 'material-ui/Slider'; +import TimePicker from 'material-ui/TimePicker'; +import DatePicker from 'material-ui/DatePicker'; +import TextField from 'material-ui/TextField'; +import Toggle from 'material-ui/Toggle'; +import Snackbar from 'material-ui/Snackbar'; +import { RadioButton, RadioButtonGroup } from 'material-ui/RadioButton'; +import MenuItem from 'material-ui/MenuItem'; +import SelectField from 'material-ui/SelectField'; +import DropDownMenu from 'material-ui/DropDownMenu'; +import { List, ListItem } from 'material-ui/List'; +import ListExampleSimple from '../../../../ui/routes/lists/components/Simple'; +import ListExampleMessages from '../../../../ui/routes/lists/components/Messages'; +import Dialog from 'material-ui/Dialog'; +import ToolbarSection from '../../../../ui/routes/components/components/Toolbar2.js'; +import BottomNavigationExampleSimple from '../../../../ui/routes/components/components/BottomNavigation'; +import { NEMTLocation } from '../../../../../components/NEMTLocation'; +import RoadTripLink from '../../../../../components/RoadtripLink'; +import GMaps from './Maps' +import Drawer from 'material-ui/Drawer'; +import AppBar from 'material-ui/AppBar'; +import RaisedButton from 'material-ui/RaisedButton'; +import FlatButton from 'material-ui/FlatButton'; +import Divider from 'material-ui/Divider'; +import IconMenu from 'material-ui/IconMenu'; +import IconButton from 'material-ui/IconButton'; +import Download from 'material-ui/svg-icons/file/file-download'; +import ArrowDropRight from 'material-ui/svg-icons/navigation-arrow-drop-right'; +// import MoreVertIcon from 'material-ui/svg-icons/navigation/more-vert'; +import ActionHome from 'material-ui/svg-icons/action/home'; +import ActionWork from 'material-ui/svg-icons/action/work'; +import MapsMyLocation from 'material-ui/svg-icons/maps/my-location'; +import MapsAddLocation from 'material-ui/svg-icons/maps/add-location'; +import MapsNearMe from 'material-ui/svg-icons/maps/near-me'; +import MapsLocalHospital from 'material-ui/svg-icons/maps/local-hospital'; +import MapsLocalPharrmacy from 'material-ui/svg-icons/maps/local-pharmacy'; +import ActionGrade from 'material-ui/svg-icons/action/grade'; +import { fullWhite } from 'material-ui/styles/colors'; +import ActionAndroid from 'material-ui/svg-icons/action/android'; +import FontIcon from 'material-ui/FontIcon'; +import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; +import MuiGeoSuggest from 'material-ui-geosuggest'; +import { orange500, blue500 } from 'material-ui/styles/colors'; +import areIntlLocalesSupported from 'intl-locales-supported'; +import FloatingActionButton from 'material-ui/FloatingActionButton'; +import ContentAdd from 'material-ui/svg-icons/content/add'; +import moment from 'moment'; +import { Card, CardActions, CardHeader, CardMedia, CardTitle, CardText } from 'material-ui/Card'; +import Draggable, { DraggableCore } from 'react-draggable'; // Both at the same time +import Imgix from 'react-imgix' +import Paper from 'material-ui/Paper'; + +import { grey400, darkBlack, lightBlack } from 'material-ui/styles/colors'; + +import MoreHorizIcon from 'material-ui/svg-icons/navigation/more-horiz'; + +import Instance from '../../../../../../../components/Connection'; +import ContactList from '../../../../../../app/components/ContactList'; +let DateTimeFormat; + +if (areIntlLocalesSupported(['fr', 'fa-IR'])) { + DateTimeFormat = global.Intl.DateTimeFormat; +} + + +const styles = { + errorStyle: { + color: orange500, + }, + underlineStyle: { + borderColor: orange500, + }, + floatingLabelStyle: { + color: blue500, + }, + floatingLabelFocusStyle: { + color: blue500, + }, +}; + +const style = { + opacity: '.95', + margin: '3', + padding: '4', + height: '65px' +}; + +const buttonStyle = { + marginTop: 10, +}; + +const getConfirmationData = () => { + let confirmationData = { + rideTypeValue: 0, + providerID: 0, + providerName: '', + visitDate: null, + visitTime: null, + pickupLocation: null, + pickupTime: null, + user: null + }; + + const confirmationStorage = localStorage.getItem("confirmation"); + if (confirmationStorage !== undefined && confirmationStorage !== null && confirmationStorage !== '') { + confirmationData = Object.assign(confirmationData, JSON.parse(confirmationStorage)); + } + + let user = localStorage.getItem("userData") + if (user && user !== null && user !== '') { + user = JSON.parse(user); + confirmationData = Object.assign(confirmationData, { user: user }); + } + + return confirmationData; +}; + +class Services extends React.Component { + constructor(props) { + super(props); + this.props = props; + + this.state = { + stepIndex: 0, + rideTypeValue: 0, + providerID: 0, + providerName: '', + visitDate: null, + visitTime: null, + pickupLocation: null, + pickupTime: null, + origin: {}, + destination: {}, + user: { + first: "", + last: "", + member: "", + phonenumber: "" + }, + eta: { + distance_miles: 0, + duration_seconds: 0, + formatted_time: "" + }, + ride: { + "ride_uuid": "", + "user": { + "useruuid": "", + "name": "", + "member": "" + }, + "status": { + "key": "", + "value": "" + }, + "type": { + "key": "", + "value": "" + }, + "notes": "", + "passenger": { + "user_id": "", + "image_url": "", + "first_name": "", + "last_name": "", + "phone_number": "" + }, + "driver": { + "rating": "", + "image_url": "", + "first_name": "", + "phone_number": "" + }, + "vehicle": { + "color": "", + "make": "", + "license_plate": "", + "image_url": "", + "year": 0, + "license_plate_state": "", + "model": "" + }, + "route": { + "origin": { + "name": "", + "lat": 0, + "lng": 0, + "address": "" + }, + "destination": { + "name": "", + "lat": 0, + "lng": 0, + "address": "" + }, + "location": { + "lat": 0, + "lng": 0, + "bearing": 0 + }, + "route_kml": "", + "distance": 0, + "duration": 0, + "eta": 0, + "eta_formatted": '', + }, + "trip_type": { + "key": "", + "value": "", + }, + "visit": { + "visit_uuid": "", + "visit_external_id": "", + "pickup": { + "id": "", + "name": "" + }, + "destination": { + "id": "", + "name": "" + }, + "provider": { + "provider_uuid": "", + "name": "" + }, + "created_user": { + "useruuid": "", + "name": "" + }, + "trip_type": { + "key": "", + "value": "", + }, + }, + "visit_date": new Date(), + "visit_time": new Date(), + "pickup_time": new Date() + }, + rideInfo: { + "ride_uuid": "", + "user": { + "useruuid": "", + "name": "", + "member": "" + }, + "status": { + "key": "", + "value": "" + }, + "type": { + "key": "", + "value": "" + }, + "route_kml": "", + "notes": "", + "passenger": { + "user_id": "", + "image_url": "", + "first_name": "", + "last_name": "", + "phone_number": "" + }, + "driver": { + "rating": "", + "image_url": "", + "first_name": "", + "phone_number": "" + }, + "vehicle": { + "color": "", + "make": "", + "license_plate": "", + "image_url": "", + "year": 0, + "license_plate_state": "", + "model": "" + }, + "route": { + "origin": { + "name": "", + "lat": 0, + "lng": 0, + "address": "" + }, + "destination": { + "name": "", + "lat": 0, + "lng": 0, + "address": "" + } + } + } + } + this.handleRide = this.handleRide.bind(this); + this.handleCancel = this.handleCancel.bind(this); + this.handleClose = this.handleClose.bind(this); + this.handleYes = this.handleYes.bind(this); + this.handleReady = this.handleReady.bind(this); + this.handleShare = this.handleShare.bind(this); + // this.handleRideChange = this.handleRideChange.bind(this); + + } + + static propTypes = { + data: React.PropTypes.object.isRequired, + params: React.PropTypes.object.isRequired, + } + + componentWillReceiveProps(nextProps) { + let params = nextProps.params; + params.visit_date = new Date(params.visit_date); + params.visit_time = new Date(params.visit_time); + params.pickup_time = new Date(params.pickup_time); + + + if (!params.visit.provider.provider_uuid) params.visit.provider.provider_uuid = ""; + if (!params.visit.pickup.id) params.visit.pickup.id = ""; + if (!params.route.eta) params.route.eta = 0; + + var minutes = Math.floor(params.route.eta / 60); + var seconds = params.route.eta % 60; + var formattedTime = `${minutes} minutes` + if (minutes > 10) { + var t = new Date(); + t.setSeconds(t.getSeconds() + params.route.eta); + formattedTime = moment(t).format("hh:mm a"); + } + + params.route.eta_formatted = formattedTime; + + this.setState(Object.assign(this.state, { ride: params })); + } + + handleETA = (e) => { + e.preventDefault() + const state = this; + if (state.props.data !== undefined) { + state.setState(Object.assign(state.state, state.props.data)); + } + + if (state.state.eta) { + let rideID = state.state.ride.ride_uuid; + let message = 'Estimated Distance : ' + state.state.eta.distance_miles + ' miles\nEstimated Time: ' + state.state.eta.formatted_time + + let url = '/v1/nemt/rides/' + rideID + '/message'; + url = encodeURI(url); + Instance.getRawConn().post(url, { message: message }).then(function (res) { + alert('ETA Sent'); + }).catch(function (err) { + console.error(err); + }); + } + } + + handleReady(e) { + let self = this; + Instance.getRawConn().post(`/v1/nemt/rides/${self.state.ride.ride_uuid}/ready`).then((res) => { + if (self.props.onRideChange) { + self.props.onRideChange(res.data); + } + self.setState(Object.assign(self.state, { dialogMessage: `You ride has been requested`, dialogTitleMessage: 'Return Ride', dialogOpen: true, dialogType: 'OK' })); + }).catch(console.error); + } + + handleClose(e) { + let self = this; + self.setState(Object.assign(self.state, { dialogMessage: `Do you want to cancel the this ride?`, dialogTitleMessage: 'Cancel Ride', dialogOpen: false })); + } + + handleCancel(e) { + let self = this; + self.setState(Object.assign(self.state, { + dialogMessage: `Do you want to cancel the this ride?`, dialogTitleMessage: 'Cancel Ride', dialogOpen: true, dialogType: 'YesNo' + })); + } + + handleYes(e) { + let self = this; + self.setState(Object.assign(self.state, { dialogMessage: `Do you want to cancel the this ride?`, dialogTitleMessage: 'Cancel Ride', dialogOpen: false })); + let url = '/v1/nemt/rides/' + self.state.ride.ride_uuid + '/cancel' + Instance.getRawConn().post(url).then(function (res) { + self.setState(Object.assign(self.state, { dialogMessage: `You ride has been canceled`, dialogTitleMessage: 'Canceled Ride', dialogOpen: true, dialogType: 'OK' })); + }).catch(console.error); + } + + handleShare(e) { + let self = this; + let url = '/v1/nemt/rides/' + self.state.ride.ride_uuid + '/share' + Instance.getRawConn().post(url).then(function (res) { + self.setState(Object.assign(self.state, { dialogMessage: `This ride has been shared with the member`, dialogTitleMessage: 'Shared Ride', dialogOpen: true, dialogType: 'OK' })); + }).catch(console.error); + } + + + handleRideChange(r) { + if (this.props.onRideUpdate) { + this.props.onRideUpdate(r); + } + } + + componentDidMount() { + let data = this.props.data; + data.visitDate = new Date(data.visitDate); + data.visitTime = new Date(data.visitTime); + data.pickupTime = new Date(data.pickupTime); + + this.setState(Object.assign(this.state, data)); + + let params = this.props.params; + params.visit_date = new Date(params.visit_date); + params.visit_time = new Date(params.visit_time); + params.pickup_time = new Date(params.pickup_time); + + if (!params.visit.provider.provider_uuid) params.visit.provider.provider_uuid = ""; + if (!params.visit.pickup.id) params.visit.pickup.id = ""; + if (!params.route.eta) params.route.eta = 0; + + var minutes = Math.floor(params.route.eta / 60); + var seconds = params.route.eta % 60; + var formattedTime = `${minutes} minutes` + if (minutes > 10) { + var t = new Date(); + t.setSeconds(t.getSeconds() + params.route.eta); + formattedTime = moment(t).format("hh:mm a"); + } + + params.route.eta_formatted = formattedTime; + + this.setState(Object.assign(this.state, { ride: params })); + } + + handlePickupChanged(res, state) { + let route = state.state.ride.route; + route.origin = { + name: res.name, + lat: res.lat, + lng: res.lng, + address: res.address + } + + let ride = state.state.ride; + ride.route = route; + + state.setState(Object.assign(state.state, { + ride: ride, + })); + } + + handleProviderChanged(res, state) { + + let route = state.state.ride.route; + route.destination = { + name: res.name, + lat: res.lat, + lng: res.lng, + address: res.address + } + + let ride = state.state.ride; + ride.route = route; + + state.setState(Object.assign(state.state, { + ride: ride, + })); + } + + handleStatusChange(event, index, value, state) { + let self = state; + let ride = this.state.ride; + ride.status.key = value; + ride.status.value = event.target.innerText; + + Instance.getRawConn().get(`/v1/lyfthook/${ride.ride_uuid}/${ride.status.key}`).then(res => { + res.data.visitDate = new Date(res.data.visitDate); + res.data.visitTime = new Date(res.data.visitTime); + res.data.pickupTime = new Date(res.data.pickupTime); + + var minutes = Math.floor(res.data.route.eta / 60); + var seconds = res.data.route.eta % 60; + var formattedTime = `${minutes} minutes` + if (seconds > 0) { + formattedTime += ` ${seconds} seconds` + } + res.data.route.eta_formatted = formattedTime; + + self.setState(Object.assign(self.state, { + ride: res.data, + })) + }).catch(err => { + console.error(err); + }); + } + + handleRide(ride) { + if (this.props.onRideChange) { + this.props.onRideChange(ride); + } + //this.setState(Object.assign(this.state, { ride: ride })); + //location.href = "/#/app/page/map/" + ride.ride_uuid; + } + + render() { + const rightStyle = { + width: '80px', + margin: '0 5px 0 10px' + } + + const imageStyle = { width: "64px", height: "40px" } + const carImageStyle = { width: "50px", height: "22px" } + let data = this.state.ride.route; + + + let rideDetails = ( + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      MemberID + {this.state.ride.user.member} +
      RideID + {this.state.ride.ride_uuid} +
      Status + { this.handleStatusChange(e, i, v, this) }} + > + + + + + + + +
      Distance{this.state.ride.route.distance} miles
      Duration{moment(this.state.ride.route.duration).format("hh:mm")}
      ETA{this.state.ride.route.eta_formatted}
      Provider ID{this.state.ride.visit.provider.provider_uuid}
      Provider{this.state.ride.visit.provider.name}
      Visit ID + {this.state.ride.visit.visit_uuid} +
      Visit External ID{this.state.ride.visit.visit_external_id}
      Notes{this.state.ride.notes}
      Scheduler{this.state.ride.visit.created_user.name}
      + + + + ) + + let scaledImage = (); + + var currentStatus = this.state.ride.status.key; + + let vehicleSummary; + + if (currentStatus !== 'pending' && currentStatus !== 'scheduled' && currentStatus !== 'willCall') { + vehicleSummary = this.state.ride.vehicle.color + ' ' + this.state.ride.vehicle.make + ' ' + this.state.ride.vehicle.model + '(' + this.state.ride.vehicle.license_plate + ')' + } + else { vehicleSummary = 'not assigned' } + + const rideContactList = { + driverMobile: this.state.ride.driver.phone_number, + memberMobile: this.state.ride.driver.phone_number, + + // memberMobile: this.state.ride.passenger.phone_number, + + memberEmail: this.state.ride.user.memberEmail, + // schedulerEmail: this.state.ride.user.created_user.schedulerEmail, + schedulerEmail: "this.state.ride.user.created_user.schedulerEmail", + // this.state.schedulerEmail, + // this.state.schedulerEmail, + schedulerMobile: "this.state.schedulerEmail", + rideID: "w232323232323", + }; + + const iconButtonElement = ( + + + + ); + + let actionsMenu = []; + if (this.state.ride.visit.rides) { + this.state.ride.visit.rides.forEach(r => { + if (r.ride_uuid !== this.state.ride.ride_uuid) { + const url = `/#/app/page/map/${r.ride_uuid}` + let menuItem = ( + { + e.preventDefault(); + if (this.props.onRideChange) { + this.props.onRideChange(r); + } + location.href = url; + return false; + }} > + {r.trip_type.value.replace(' / Will Call', '')} + + ) + + actionsMenu.push(menuItem); + } + }, this); + } + + // actionsMenu.push( + // + // ); + + actionsMenu.push( + { + e.preventDefault(); + this.handleShare(e); + return false; + }}> + Share Ride + ); + + if (this.state.ride.status.key !== 'canceled') { + actionsMenu.push( + { + e.preventDefault(); + this.handleCancel(e); + return false; + }}> + Cancel Ride + ); + } + + if (this.state.ride.status.key === 'willCall') { + actionsMenu.push( + { + e.preventDefault(); + this.handleReady(e); + return false; + }}> + Ready Now + ); + } + + const rightIconMenu = ( + + {actionsMenu} + + ); + + let actions = [] + + if (this.state.dialogType == 'YesNo') { + actions = [ + , + , + ]; + } else { + actions = [ + , + ]; + } + + let actionButtons = []; + if (this.state.ride.status.key !== 'canceled' && this.state.ride.status.key !== 'droppedOff') { + actionButtons = [ + , + + ] + } + + let carInfo = ( + + {this.state.ride.passenger.first_name} {this.state.ride.passenger.last_name} + + {this.state.ride.status.value} + + + + {this.state.ride.trip_type.value.replace(' / Will Call', '')} + + + + {rightIconMenu} + + + + {vehicleSummary} + + + + {this.state.ride.route.eta_formatted} + + + ); + if (this.state.ride.status.key === "pending" || this.state.ride.status.key === "willCall" || this.state.ride.status.key === "scheduled" || this.state.ride.status.key === "canceled") { + carInfo = ( + + {this.state.ride.passenger.first_name} {this.state.ride.passenger.last_name} + + {this.state.ride.status.value} + + + {this.state.ride.trip_type.value.replace(' / Will Call', '')} + + + {rightIconMenu} + + + + ) + } + + let statusSummary = ( + + + + + + + + + + + + + + + + + + {carInfo} + +
      Member StatusTypeActionsVehicleETA
      + +
      + + ) + + let pickupTime = () + if (this.state.ride.status.key === 'willCall') { + pickupTime = (); + } + + let pickupNEMTLocation = ( this.handlePickupChanged(event, this)} textSize={35} locationType={"pickup"} icon={} />) + let destinationNEMTLocation = ( this.handleProviderChanged(event, this)} textSize={25} locationType={"provider"} icon={} />); + let visitTime = () + if (this.state.ride.trip_type.key === 'from_visit' || this.state.ride.trip_type.key === 'from_visit_call') { + visitTime = null; + + pickupNEMTLocation = ( this.handlePickupChanged(event, this)} textSize={35} locationType={"provider"} icon={} />) + destinationNEMTLocation = ( this.handleProviderChanged(event, this)} textSize={25} locationType={"pickup"} icon={} />); + } + + return ( +
      + {statusSummary} + {rideDetails} + +
      + +
      + + {pickupNEMTLocation} +
      +
      + {pickupTime} +
      +
      + + +
      + + {destinationNEMTLocation} +
      + +
      + {visitTime} +
      + +
      + +
      + + {this.state.dialogMessage} + + +
      + ) + } +} + +class Page extends React.Component { + constructor(props) { + super(props); + this.props = props; + this.state = { + timeout: null, + ride: { + "ride_uuid": "", + "user": { + "useruuid": "", + "name": "", + "member": "" + }, + "status": { + "key": "", + "value": "" + }, + "type": { + "key": "", + "value": "" + }, + "notes": "", + "passenger": { + "user_id": "", + "image_url": "", + "first_name": "", + "last_name": "", + "phone_number": "" + }, + "driver": { + "rating": "", + "image_url": "", + "first_name": "", + "phone_number": "" + }, + "vehicle": { + "color": "", + "make": "", + "license_plate": "", + "image_url": "", + "year": 0, + "license_plate_state": "", + "model": "" + }, + "route": { + "origin": { + "name": "", + "lat": 0, + "lng": 0, + "address": "" + }, + "destination": { + "name": "", + "lat": 0, + "lng": 0, + "address": "" + }, + "location": { + "lat": 0, + "lng": 0, + "bearing": 0 + }, + "route_kml": "", + "distance": 0, + "duration": 0, + "eta": 0 + }, + "trip_type": { + "key": "", + "value": "", + }, + "visit": { + "visit_uuid": "", + "visit_external_id": "", + "pickup": { + "id": "", + "name": "" + }, + "destination": { + "id": "", + "name": "" + }, + "provider": { + "provider_uuid": "", + }, + "created_user": { + "useruuid": "", + "name": "" + }, + "trip_type": { + "key": "", + "value": "", + }, + }, + "visit_date": new Date(), + "visit_time": new Date(), + "pickup_time": new Date(), + } + } + + this.handleRide = this.handleRide.bind(this); + + // this.handleCancel = this.handleCancel.bind(this); + // this.handleClose = this.handleClose.bind(this); + // this.handleYes = this.handleYes.bind(this); + // this.handleReady = this.handleReady.bind(this); + // this.handleRideChange = this.handleRideChange.bind(this); + // this.refreshContent = this.refreshContent.bind(this); + } + + componentDidMount() { + this.refreshContent(this.props.params.ride_uuid); + } + + refreshContent(rideID) { + const self = this; + Instance.getRawConn().get('/v1/nemt/rides/' + rideID + '/eta').then((res) => { + self.setState(Object.assign(self.state, { ride: res.data })); + switch (self.state.ride.status.key) { + case "scheduled": + case "accepted": + case "arrived": + case "pickedUp": + case "pending": + + const timeout = setTimeout(function () { + self.refreshContent(rideID); + }.bind(this), 30000); + self.setState(Object.assign(self.state, { timeout: timeout })); + break; + } + }).catch(err => { + console.error('Error to get riders: ', err); + }); + } + + + + handleRide(ride) { + if (this.state.timeout) { + clearTimeout(this.state.timeout); + this.setState(Object.assign(this.state, { timeout: null })); + } + this.refreshContent(ride.ride_uuid); + } + + render() { + console.log('Current state: ', this.state); + return ( +
      + +
      + {/* */} +
      +
      + ); + } +}; + +module.exports = Page; \ No newline at end of file diff --git a/src/routes/app/routes/pages/routes/map/index.js b/src/routes/app/routes/pages/routes/map/index.js new file mode 100644 index 0000000..ba0dd71 --- /dev/null +++ b/src/routes/app/routes/pages/routes/map/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'map/:ride_uuid', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Services')); + }); + } +}; diff --git a/src/routes/app/routes/pages/routes/messages/components/messages.js b/src/routes/app/routes/pages/routes/messages/components/messages.js new file mode 100644 index 0000000..3248d0a --- /dev/null +++ b/src/routes/app/routes/pages/routes/messages/components/messages.js @@ -0,0 +1,83 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; +//import contact list examples +import ListExampleSimple from '../../../../ui/routes/lists/components/Simple'; +import ListExampleSelectable from '../../../../ui/routes/lists/components/Selectable'; +import ListExampleMessages from '../../../../ui/routes/lists/components/Messages'; +// import ListExampleSimple from '../../../../ui/routes/lists/components/Settings'; + + +const Hero = () => ( +
      +
      +
      +

      About Us

      +
      +

      Everything you need to know about Independence Blue Cross & Blue Shield

      +
      +
      +); + +const Info = () => ( +
      +
      +
      +
      +
      + 10 + Years Experience +
      +

      Necessitatibus eaque, deleniti error in quam fuga et nisi facere dolore excepturi accusamus dicta reprehenderit dolor. Quo necessitatibus possimus ipsam, nesciunt aspernatur ex libero asperiores, debitis minus nostrum odio. Sunt dolore, dolorem id, iusto quia est unde a doloribus doloremque quisquam repellat nobis enim ipsam eligendi perspiciatis, provident eos aliquid.

      +
      +
      +
      + 200+ + Satisfied Clients +
      +

      Tempore adipisci ea accusamus odit consequuntur! Quaerat quos nemo qui ipsam accusantium, nostrum error nesciunt quibusdam velit tempore odit deleniti animi laborum sequi saepe minima atque! Nobis repellendus quos voluptatum sapiente, eveniet aliquid ex eum explicabo soluta delectus officia, dolore aspernatur, dicta nam placeat nostrum aliquam magni? Iste, hic, mollitia.

      +
      +
      +
      + 12 + Kinds of Products +
      +

      Nostrum, laudantium minima nam dolorum quasi, ut sunt, dolore ratione suscipit sequi vero ducimus earum praesentium odit aut amet voluptates, sint doloribus omnis. Dignissimos, similique neque praesentium mollitia, libero delectus in adipisci ex nihil laborum iure quaerat magnam obcaecati repellendus exercitationem explicabo! Eum, ut voluptatum sapiente dignissimos unde quae eos quis mollitia, voluptate, dolores excepturi?

      +
      +
      +
      +
      +); + +const Culture = () => ( +
      +
      +
      +
      +

      Messages

      +
      + + {/*
      + +
      + */} +
      + +
      +
      +
      +
      +
      + +
      +); + +const About = () => ( +
      + + +
      +
      +
      +); + +module.exports = About; diff --git a/src/routes/app/routes/pages/routes/messages/index.js b/src/routes/app/routes/pages/routes/messages/index.js new file mode 100644 index 0000000..3531304 --- /dev/null +++ b/src/routes/app/routes/pages/routes/messages/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'messages', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/messages')); + }); + } +}; diff --git a/src/routes/app/routes/pages/routes/profile/components/profile.js b/src/routes/app/routes/pages/routes/profile/components/profile.js new file mode 100644 index 0000000..38fcb5e --- /dev/null +++ b/src/routes/app/routes/pages/routes/profile/components/profile.js @@ -0,0 +1,231 @@ +import React, { Component } from 'react'; +import TextField from 'material-ui/TextField'; +import RaisedButton from 'material-ui/RaisedButton'; +import QueueAnim from 'rc-queue-anim'; +import FloatingActionButton from 'material-ui/FloatingActionButton'; +import ContentAdd from 'material-ui/svg-icons/content/add'; +// import MobileTearSheet from '../../../../MobileTearSheet'; +import { List, ListItem } from 'material-ui/List'; +import ContentInbox from 'material-ui/svg-icons/content/inbox'; +import ContentSend from 'material-ui/svg-icons/content/send'; +import ContentDrafts from 'material-ui/svg-icons/content/drafts'; +import Divider from 'material-ui/Divider'; +import IconMenu from 'material-ui/IconMenu'; +import MenuItem from 'material-ui/MenuItem'; +import IconButton from 'material-ui/IconButton'; +import Download from 'material-ui/svg-icons/file/file-download'; +import ArrowDropRight from 'material-ui/svg-icons/navigation-arrow-drop-right'; +import MoreVertIcon from 'material-ui/svg-icons/navigation/more-vert'; +import ActionHome from 'material-ui/svg-icons/action/home'; +import ActionWork from 'material-ui/svg-icons/action/work'; +import MapsMyLocation from 'material-ui/svg-icons/maps/my-location'; +import MapsAddLocation from 'material-ui/svg-icons/maps/add-location'; +import MapsNearMe from 'material-ui/svg-icons/maps/near-me'; +import MapsLocalHospital from 'material-ui/svg-icons/maps/local-hospital'; +import MapsLocalPharmacy from 'material-ui/svg-icons/maps/local-pharmacy'; +import AutoComplete from 'material-ui/AutoComplete'; + +const locations = [ + '1800 Highland Ave', + 'My Work', +]; + +export default class AutoCompleteExampleControlled extends Component { + state = { + searchText: '', + }; + + handleUpdateInput = (searchText) => { + this.setState({ + searchText: searchText, + }); + }; + + handleNewRequest = () => { + this.setState({ + searchText: '', + }); + }; + + render() { + return ( +
      + (key.indexOf(searchText) !== -1)} + openOnFocus={true} + /> +
      + ); + } +} + +const style = { + marginRight: 20, +}; + +/** + * Default size and `mini` FABs, in primary (default), `secondary` and `disabled` locations. + */ +const FloatingActionButtonExampleSimple = () => ( +
      + + + +
      +); + +const IconMenuExampleNested = () => ( + } + anchorOrigin={{ horizontal: 'left', vertical: 'top' }} + targetOrigin={{ horizontal: 'left', vertical: 'top' }} + > + } + menuItems={[ + , + , + , + , + ]} + /> + + } + menuItems={[ + , + , + , + , + ]} + /> + + } /> + + + + +); + + +const Hero = () => ( +
      +
      +
      +

      How can we help you?

      +
      +

      Feel free to contact us if you have any questions

      +
      +
      +); + + +const Contact = () => ( +
      +

      Pickup Location

      +
      +
      +
      +
      + + +
      + + +
      + + + } /> + + + + + + + } leftIcon={} /> + } leftIcon={} /> + } leftIcon={} /> + + + + } /> + } /> + +
      +
      +
      +

      Get In Touch

      +

      Lorem ipsum dolor sit amet, consectetur adipisicing elit. A consectetur necessitatibus ea possimus est quis cumque vel saepe. Eum, quas, ducimus.

      +
      +

      123 Mountain View
      Santa Clara, C.A.
      USA

      +
      +

      + E: mail@site.com +
      + P: +1 234 56789 +
      + S: www.site.com +

      +
      +
      +
      +
      +
      +
      +

      Contact

      +
      +
      + +
      +
      + +
      +
      + +
      +
      + + +
      +
      +
      +
      +
      +
      +); + + + + +const Page = () => ( +
      + +
      +
      +
      +
      +
      +); + +module.exports = Page; diff --git a/src/routes/app/routes/pages/routes/profile/index.js b/src/routes/app/routes/pages/routes/profile/index.js new file mode 100644 index 0000000..d133c29 --- /dev/null +++ b/src/routes/app/routes/pages/routes/profile/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'profile', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/profile')); + }); + } +}; diff --git a/src/routes/app/routes/pages/routes/services/components/Services.js b/src/routes/app/routes/pages/routes/services/components/Services.js new file mode 100644 index 0000000..3cf91e6 --- /dev/null +++ b/src/routes/app/routes/pages/routes/services/components/Services.js @@ -0,0 +1,799 @@ +import React, { Component } from 'react'; +import QueueAnim from 'rc-queue-anim'; + +import AutoComplete from 'material-ui/AutoComplete'; +import { Tabs, Tab } from 'material-ui/Tabs'; +import Slider from 'material-ui/Slider'; +import TimePicker from 'material-ui/TimePicker'; +import DatePicker from 'material-ui/DatePicker'; +import TextField from 'material-ui/TextField'; +import Toggle from 'material-ui/Toggle'; +import Snackbar from 'material-ui/Snackbar'; +import { RadioButton, RadioButtonGroup } from 'material-ui/RadioButton'; + +import MenuItem from 'material-ui/MenuItem'; +import SelectField from 'material-ui/SelectField'; +import DropDownMenu from 'material-ui/DropDownMenu'; + +import { List, ListItem } from 'material-ui/List'; +import ListExampleSimple from '../../../../ui/routes/lists/components/Simple'; +import ListExampleMessages from '../../../../ui/routes/lists/components/Messages'; + +import Dialog from 'material-ui/Dialog'; +import ToolbarSection from '../../../../ui/routes/components/components/Toolbar2.js'; +import BottomNavigationExampleSimple from '../../../../ui/routes/components/components/BottomNavigation'; +import App from '../../../../pages/routes/geosuggest/components/geosuggest.js'; + +import { NEMTLocation } from '../../../../../components/NEMTLocation'; + +import GMaps from './Maps' + +import Drawer from 'material-ui/Drawer'; +import AppBar from 'material-ui/AppBar'; +import RaisedButton from 'material-ui/RaisedButton'; +import FlatButton from 'material-ui/FlatButton'; +import Divider from 'material-ui/Divider'; + +import IconMenu from 'material-ui/IconMenu'; +import IconButton from 'material-ui/IconButton'; +import Download from 'material-ui/svg-icons/file/file-download'; +import ArrowDropRight from 'material-ui/svg-icons/navigation-arrow-drop-right'; +import MoreVertIcon from 'material-ui/svg-icons/navigation/more-vert'; + +import ActionHome from 'material-ui/svg-icons/action/home'; +import ActionWork from 'material-ui/svg-icons/action/work'; +import MapsMyLocation from 'material-ui/svg-icons/maps/my-location'; +import MapsAddLocation from 'material-ui/svg-icons/maps/add-location'; +import MapsNearMe from 'material-ui/svg-icons/maps/near-me'; +import MapsLocalHospital from 'material-ui/svg-icons/maps/local-hospital'; +import MapsLocalPharrmacy from 'material-ui/svg-icons/maps/local-pharmacy'; + +import { fullWhite } from 'material-ui/styles/colors'; +import ActionAndroid from 'material-ui/svg-icons/action/android'; +import FontIcon from 'material-ui/FontIcon'; + +import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; +import MuiGeoSuggest from 'material-ui-geosuggest'; +import { orange500, blue500 } from 'material-ui/styles/colors'; + +import areIntlLocalesSupported from 'intl-locales-supported'; +import FloatingActionButton from 'material-ui/FloatingActionButton'; +import ContentAdd from 'material-ui/svg-icons/content/add'; +import moment from 'moment'; + +import { Card, CardActions, CardHeader, CardMedia, CardTitle, CardText } from 'material-ui/Card'; + + + +const axios = require('axios'); +const setCookie = function (cname, cvalue, date) { + var d = new Date(date * 1000); + var expires = "expires=" + d.toUTCString(); + document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/"; +} +const getCookie = function (cname) { + console.log('test'); + var name = cname + "="; + var decodedCookie = decodeURIComponent(document.cookie); + var ca = decodedCookie.split(';'); + for (var i = 0; i < ca.length; i++) { + var c = ca[i]; + while (c.charAt(0) == ' ') { + c = c.substring(1); + } + if (c.indexOf(name) == 0) { + return c.substring(name.length, c.length); + } + } + return ""; +} +let instance = {}; +let token = getCookie('token'); +if (!token || token === null || token === undefined || token === '') { + location.href = "/#/login"; +} else { + instance = axios.create({ + baseURL: 'https://portal-api.bcbsinstitute.com', + headers: { App: localStorage.getItem('App'), Token: 'Bearer ' + token }, + }); +} + +let DateTimeFormat; + +// /** +// * Use the native Intl.DateTimeFormat if available, or a polyfill if not. +// */ +if (areIntlLocalesSupported(['fr', 'fa-IR'])) { + DateTimeFormat = global.Intl.DateTimeFormat; +} +// else { +// const IntlPolyfill = require('intl'); +// DateTimeFormat = IntlPolyfill.DateTimeFormat; +// require('intl/locale-data/jsonp/fr'); +// require('intl/locale-data/jsonp/fa-IR'); +// } + + +const styles = { + errorStyle: { + color: orange500, + }, + underlineStyle: { + borderColor: orange500, + }, + floatingLabelStyle: { + color: blue500, + }, + floatingLabelFocusStyle: { + color: blue500, + }, +}; + + +const style = { + margin: 12, +}; + +const buttonStyle = { + marginTop: 10, +}; + +const getConfirmationData = () => { + let confirmationData = { + rideTypeValue: 0, + providerID: 0, + providerName: '', + visitDate: null, + visitTime: null, + pickupLocation: null, + pickupTime: null, + user: null + }; + + const confirmationStorage = localStorage.getItem("confirmation"); + if (confirmationStorage !== undefined && confirmationStorage !== null && confirmationStorage !== '') { + confirmationData = Object.assign(confirmationData, JSON.parse(confirmationStorage)); + } + + let user = localStorage.getItem("userData") + if (user && user !== null && user !== '') { + user = JSON.parse(user); + confirmationData = Object.assign(confirmationData, { user: user }); + } + + return confirmationData; +}; + +class Services extends React.Component { + constructor(props) { + super(props); + this.props = props; + + this.state = { + stepIndex: 0, + rideTypeValue: 0, + providerID: 0, + providerName: '', + visitDate: null, + visitTime: null, + pickupLocation: null, + pickupTime: null, + origin: {}, + destination: {}, + user: { + first: "", + last: "", + member: "", + phonenumber: "" + }, + eta: { + distance_miles: 0, + duration_seconds: 0, + formatted_time: "" + }, + ride: { + "ride_uuid": "", + "user": { + "useruuid": "", + "name": "", + "member": "" + }, + "status": { + "key": "", + "value": "" + }, + "type": { + "key": "", + "value": "" + }, + "notes": "", + "passenger": { + "user_id": "", + "image_url": "", + "first_name": "", + "last_name": "", + "phone_number": "" + }, + "driver": { + "rating": "", + "image_url": "", + "first_name": "", + "phone_number": "" + }, + "vehicle": { + "color": "", + "make": "", + "license_plate": "", + "image_url": "", + "year": 0, + "license_plate_state": "", + "model": "" + }, + "route": { + "origin": { + "name": "", + "lat": 0, + "lng": 0, + "address": "" + }, + "destination": { + "name": "", + "lat": 0, + "lng": 0, + "address": "" + }, + "location": { + "lat": 0, + "lng": 0, + "bearing": 0 + }, + "route_kml": "", + "distance": 0, + "duration": 0, + "eta": 0, + "eta_formatted": '', + }, + "visit": { + "visit_uuid": "", + "visit_external_id": "", + "pickup": { + "id": "", + "name": "" + }, + "destination": { + "id": "", + "name": "" + }, + "created_user": { + "useruuid": "", + "name": "" + } + }, + "visit_date": new Date(), + "visit_time": new Date(), + "pickup_time": new Date() + }, + rideInfo: { + "ride_uuid": "", + "user": { + "useruuid": "", + "name": "", + "member": "" + }, + "status": { + "key": "", + "value": "" + }, + "type": { + "key": "", + "value": "" + }, + "route_kml": "", + "notes": "", + "passenger": { + "user_id": "", + "image_url": "", + "first_name": "", + "last_name": "", + "phone_number": "" + }, + "driver": { + "rating": "", + "image_url": "", + "first_name": "", + "phone_number": "" + }, + "vehicle": { + "color": "", + "make": "", + "license_plate": "", + "image_url": "", + "year": 0, + "license_plate_state": "", + "model": "" + }, + "route": { + "origin": { + "name": "", + "lat": 0, + "lng": 0, + "address": "" + }, + "destination": { + "name": "", + "lat": 0, + "lng": 0, + "address": "" + } + } + } + } + } + + static propTypes = { + data: React.PropTypes.object.isRequired, + params: React.PropTypes.object.isRequired, + } + + componentWillReceiveProps(nextProps) { + let params = nextProps.params; + params.visit_date = new Date(params.visit_date); + params.visit_time = new Date(params.visit_time); + params.pickup_time = new Date(params.pickup_time); + + if (!params.visit.destination.id) params.visit.destination.id = ""; + if (!params.visit.pickup.id) params.visit.pickup.id = ""; + if (!params.route.eta) params.route.eta = 0; + + var minutes = Math.floor(params.route.eta / 60); + var seconds = params.route.eta % 60; + var formattedTime = `${minutes} minutes` + if (minutes > 10) { + var t = new Date(); + t.setSeconds(t.getSeconds() + params.route.eta); + formattedTime = moment(t).format("hh:mm a"); + } + + params.route.eta_formatted = formattedTime; + + this.setState(Object.assign(this.state, { ride: params })); + } + + componentDidMount() { + let data = this.props.data; + data.visitDate = new Date(data.visitDate); + data.visitTime = new Date(data.visitTime); + data.pickupTime = new Date(data.pickupTime); + + this.setState(Object.assign(this.state, data)); + + let params = this.props.params; + params.visit_date = new Date(params.visit_date); + params.visit_time = new Date(params.visit_time); + params.pickup_time = new Date(params.pickup_time); + + if (!params.visit.destination.id) params.visit.destination.id = ""; + if (!params.visit.pickup.id) params.visit.pickup.id = ""; + if (!params.route.eta) params.route.eta = 0; + + var minutes = Math.floor(params.route.eta / 60); + var seconds = params.route.eta % 60; + var formattedTime = `${minutes} minutes` + if (minutes > 10) { + var t = new Date(); + t.setSeconds(t.getSeconds() + params.route.eta); + formattedTime = moment(t).format("hh:mm a"); + } + + params.route.eta_formatted = formattedTime; + + this.setState(Object.assign(this.state, { ride: params })); + } + + handlePickupChanged(res, state) { + let route = state.state.ride.route; + route.origin = { + name: res.name, + lat: res.lat, + lng: res.lng, + address: res.address + } + + let ride = state.state.ride; + ride.route = route; + + state.setState(Object.assign(state.state, { + ride: ride, + })); + } + + handleProviderChanged(res, state) { + debugger; + let route = state.state.ride.route; + route.destination = { + name: res.name, + lat: res.lat, + lng: res.lng, + address: res.address + } + + let ride = state.state.ride; + ride.route = route; + + state.setState(Object.assign(state.state, { + ride: ride, + })); + } + + handleStatusChange(event, index, value, state) { + let self = state; + let ride = this.state.ride; + ride.status.key = value; + ride.status.value = event.target.innerText; + + instance.get(`/v1/lyfthook/${ride.ride_uuid}/${ride.status.key}`).then(res => { + res.data.visitDate = new Date(res.data.visitDate); + res.data.visitTime = new Date(res.data.visitTime); + res.data.pickupTime = new Date(res.data.pickupTime); + + var minutes = Math.floor(res.data.route.eta / 60); + var seconds = res.data.route.eta % 60; + var formattedTime = `${minutes} minutes` + if (seconds > 0) { + formattedTime += ` ${seconds} seconds` + } + res.data.route.eta_formatted = formattedTime; + + self.setState(Object.assign(self.state, { + ride: res.data, + })) + }).catch(err => { + console.error(err); + }); + } + + render() { + const rightStyle = { + width: '80px', + margin: '0 5px 0 10px' + } + + const imageStyle = { width: "64px", height: "40px" } + const carImageStyle = { width: "50px", height: "22px" } + let data = this.state.ride.route; + + let carInfo = ( + + {this.state.ride.passenger.first_name} {this.state.ride.passenger.last_name} + + {this.state.ride.status.value} + + {this.state.ride.route.eta_formatted} + {this.state.ride.vehicle.color} {this.state.ride.vehicle.make} {this.state.ride.vehicle.model} ({this.state.ride.vehicle.license_plate}) + + ); + if (this.state.ride.status.key === "pending") { + carInfo = ( + + {this.state.ride.passenger.first_name} {this.state.ride.passenger.last_name} + + {this.state.ride.status.value} + + + + ) + } + + return ( + +
      + +
      +
      +
      +
      +
      + +
      +
      +
      +
      + + + + + + + + + + + + {carInfo} + +
      PassengerStatusETAVehicle
      +
      + +
      +
      +
      + +
      +
      +
      +
      + + this.handlePickupChanged(event, this)} textSize={15} locationType={"pickup"} type={"primary"} icon={} /> +
      +
      + +
      +
      +
      +
      + +
      +
      +
      +
      + + + + this.handleProviderChanged(event, this)} textSize={15} locationType={"provider"} type={'secondary'} icon={} /> + +
      +
      + +
      +
      +
      +
      + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      PassengerPhoneMemberIDRideIDStatusDistanceDurationETAVehicleDriverDriver PhoneProvider IDProviderVisit IDVisit External IDNotesScheduler
      {this.state.ride.passenger.first_name} {this.state.ride.passenger.last_name}{this.state.ride.passenger.phone_number}{this.state.ride.user.member}{this.state.ride.ride_uuid} + { this.handleStatusChange(e, i, v, this) }} + > + + + + + + + + + {this.state.ride.route.distance} miles{this.state.ride.route.duration} seconds{this.state.ride.route.eta_formatted} {this.state.ride.vehicle.color} {this.state.ride.vehicle.make} {this.state.ride.vehicle.model} | {this.state.ride.vehicle.license_plate_state} | {this.state.ride.vehicle.license_plate} {this.state.ride.driver.first_name} ({this.state.ride.driver.rating} stars){this.state.ride.driver.phone_number} {this.state.ride.visit.destination.id} {this.state.ride.visit.destination.name} {this.state.ride.visit.visit_uuid} {this.state.ride.visit.visit_external_id} {this.state.ride.notes}{this.state.ride.visit.created_user.name}
      +
      +
      +
      + + + +
      + +
      + ) + } +} + +class Page extends React.Component { + constructor(props) { + super(props); + this.props = props; + this.state = { + ride: { + "ride_uuid": "", + "user": { + "useruuid": "", + "name": "", + "member": "" + }, + "status": { + "key": "", + "value": "" + }, + "type": { + "key": "", + "value": "" + }, + "notes": "", + "passenger": { + "user_id": "", + "image_url": "", + "first_name": "", + "last_name": "", + "phone_number": "" + }, + "driver": { + "rating": "", + "image_url": "", + "first_name": "", + "phone_number": "" + }, + "vehicle": { + "color": "", + "make": "", + "license_plate": "", + "image_url": "", + "year": 0, + "license_plate_state": "", + "model": "" + }, + "route": { + "origin": { + "name": "", + "lat": 0, + "lng": 0, + "address": "" + }, + "destination": { + "name": "", + "lat": 0, + "lng": 0, + "address": "" + }, + "location": { + "lat": 0, + "lng": 0, + "bearing": 0 + }, + "route_kml": "", + "distance": 0, + "duration": 0, + "eta": 0 + }, + "visit": { + "visit_uuid": "", + "visit_external_id": "", + "pickup": { + "id": "", + "name": "" + }, + "destination": { + "id": "", + "name": "" + }, + "created_user": { + "useruuid": "", + "name": "" + } + }, + "visit_date": new Date(), + "visit_time": new Date(), + "pickup_time": new Date() + } + } + } + + componentDidMount() { + this.refreshContent(this); + } + + refreshContent(reactState) { + let self = reactState; + instance.get('/v1/nemt/rides/' + self.props.params.ride_uuid + '/eta').then((res) => { + self.setState(Object.assign(self.state, { ride: res.data })); + switch (self.state.ride.status.key) { + case "accepted": + case "arrived": + case "pickedUp": + case "pending": + setTimeout(function () { + this.refreshContent(self); + }.bind(this), 60000); + break; + } + }).catch(err => { + console.error('Error to get riders: ', err); + }); + } + + render() { + return ( +
      + +
      + +
      +
      + ); + } +}; + +module.exports = Page; \ No newline at end of file diff --git a/src/routes/app/routes/pages/routes/terms/components/Terms.js b/src/routes/app/routes/pages/routes/terms/components/Terms.js new file mode 100644 index 0000000..f52f10c --- /dev/null +++ b/src/routes/app/routes/pages/routes/terms/components/Terms.js @@ -0,0 +1,53 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; + +const Hero = () => ( +
      +
      +

      Terms of Service

      +
      +

      Effective Jan. 1st

      +
      +); + + +const Terms = () => ( +
      + +
      + +

      Scope and application

      +

      Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempora consequuntur inventore animi iure ad voluptatem nobis eius odit excepturi nesciunt porro minus molestias provident necessitatibus, quos fuga hic dolorem dolore, autem totam. Quae vero, commodi? Aut, repellendus. Aliquam debitis ipsum nemo aperiam consequatur autem praesentium reiciendis tenetur et possimus architecto eaque, iusto obcaecati pariatur quasi maiores error corporis cumque. Fugit quaerat praesentium error, debitis excepturi porro autem recusandae commodi, est perferendis asperiores ut eum dolores exercitationem beatae facilis. Ipsa fugit modi totam laborum rem error quo aliquam minus eveniet ea! Quae, officiis dignissimos impedit obcaecati corporis odio modi sint!

      + +

      Collection of information

      +

      Iure iste sit, dolor quam quisquam mollitia modi non! Corporis aut modi a fuga veritatis, ducimus assumenda quae distinctio vero amet quas tempora libero, harum. Tenetur eum nam numquam dolorum ipsam rem dolor. Laudantium ipsa earum, officiis, pariatur obcaecati molestiae dolorem ad alias iusto libero sapiente iste placeat quo, voluptates beatae a et. Quasi minus porro, vel dolor accusantium quibusdam ex doloremque cum sed voluptates iusto voluptate, asperiores dolores maiores et sint laudantium blanditiis aut itaque recusandae pariatur! Corporis quae quisquam eligendi cumque corrupti. Natus amet, laboriosam, excepturi error quaerat soluta officiis itaque, dolorem eaque recusandae, incidunt nemo perspiciatis autem eius aut minus! Architecto fugiat provident inventore laudantium sed expedita modi iure dignissimos atque, accusantium reprehenderit voluptatibus esse tenetur, doloribus laborum, dicta voluptates laboriosam, eum delectus? Repudiandae praesentium odio doloremque quos ullam harum sapiente distinctio. Minima, ad ab nobis nihil aut recusandae itaque ipsum, magnam animi repellat nemo vitae harum dignissimos quisquam dicta!

      + +

      Use of information

      +

      Eius, maiores, eum. Quam eos est qui autem mollitia neque, esse quas voluptate ullam, voluptates, aspernatur doloremque harum cumque? Asperiores unde inventore ipsum nesciunt, odio aliquid voluptatum modi fuga molestias voluptatem, expedita veniam quibusdam iste laudantium voluptas molestiae? Similique aspernatur praesentium tempora, sed consequuntur officia quasi placeat adipisci quos fugit accusantium libero debitis sint cupiditate a, perspiciatis modi labore dolore error minus. Qui sequi est adipisci id nesciunt neque repellendus atque pariatur, doloremque quo eligendi, dolores iure impedit necessitatibus laudantium assumenda fugiat eum explicabo perspiciatis tempora corporis quasi.

      +

      A, incidunt, iste inventore consequuntur magnam voluptas quo suscipit excepturi, neque voluptates doloribus quasi ratione animi autem, vitae fugit enim ipsum laudantium? Deleniti facilis, aliquam harum maiores eveniet, modi hic, praesentium quidem ratione eius incidunt eligendi. Quas commodi ratione reiciendis sint temporibus sit placeat totam atque delectus minus quo reprehenderit perspiciatis ex laboriosam, rem dolores! Culpa ipsum commodi ea iure voluptas, nisi maxime inventore, saepe nesciunt nostrum iste quasi aliquid totam! Repudiandae obcaecati nobis unde sapiente reiciendis itaque iste eum dolorem dolores dolor tempora corporis nulla quisquam magnam nemo accusantium vero similique voluptate, ea quibusdam odio quod esse eveniet. Voluptatibus, earum delectus eos veniam magnam asperiores blanditiis. Voluptatum consequuntur voluptatem est facere aut dolorem suscipit similique voluptas labore explicabo sed excepturi, quo tenetur nesciunt maiores aliquid, cum optio obcaecati earum reiciendis, cumque!

      + +

      Sharing of information

      +

      Libero porro, ipsum distinctio pariatur quidem fugiat iste sit natus fuga odit ipsa, facere sequi. Numquam delectus quod sequi beatae illo eos impedit sapiente corporis non possimus doloribus autem ducimus labore enim mollitia ipsa fuga totam modi libero sunt iure reiciendis, repudiandae. Aut est culpa quidem porro, possimus eaque tempora iste, cumque deserunt consequuntur doloribus distinctio quod soluta, natus sequi. Quis numquam at similique harum assumenda velit nostrum. Quas dicta possimus perferendis cum est consectetur ullam eum odit aperiam molestiae quis nihil dolore blanditiis ducimus incidunt temporibus corporis aliquam quod, ab? Obcaecati eveniet ducimus, iusto fugit autem quas consectetur sequi sit eos eius voluptatem in, nulla, cum, unde a earum. Nihil delectus praesentium eum odit aliquam rem consequatur atque maxime neque voluptate at culpa similique iste cupiditate ipsam nisi perferendis animi odio possimus facere, fuga, id cumque? Laudantium, id non?

      +
        +
      • Illo voluptatum voluptatem ullam rem! Possimus, reiciendis, esse!
      • +
      • Ullam, et dolor eligendi. Nostrum explicabo beatae cupiditate qui ut. Expedita hic, enim quos velit inventore saepe, aliquam ratione asperiores nemo veniam beatae.
      • +
      • Quisquam cupiditate optio tenetur, possimus, id placeat atque necessitatibus illum provident dolorum eveniet odio voluptates temporibus.
      • +
      • Accusantium dignissimos, vero iusto similique cum, accusamus enim nisi tempora obcaecati iure!
      • +
      • Et quo, alias nemo maxime fugit quis voluptates architecto, eligendi atque officia corrupti omnis nihil sint cumque.
      • +
      +

      Reprehenderit ipsum obcaecati deserunt ipsa adipisci dolorem vitae, porro cupiditate, praesentium unde tenetur impedit? Modi expedita quos quas ex nemo, assumenda vero velit repellat possimus molestiae tempore voluptatem, incidunt inventore quae? Saepe et pariatur, expedita, ex sit perferendis quasi officiis.

      +
      + +
      +); + +const Page = () => ( +
      + +
      +
      +
      +
      +); + +module.exports = Page; diff --git a/src/routes/app/routes/pages/routes/terms/index.js b/src/routes/app/routes/pages/routes/terms/index.js new file mode 100644 index 0000000..056f5e3 --- /dev/null +++ b/src/routes/app/routes/pages/routes/terms/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'terms', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Terms')); + }); + } +}; diff --git a/src/routes/app/routes/tables/index.js b/src/routes/app/routes/tables/index.js new file mode 100644 index 0000000..f3625fc --- /dev/null +++ b/src/routes/app/routes/tables/index.js @@ -0,0 +1,18 @@ +module.exports = { + path: 'table', + getChildRoutes(partialNextState, cb) { + require.ensure([], (require) => { + cb(null, [ + require('./routes/data'), + require('./routes/static'), + require('./routes/members'), + require('./routes/rides'), + require('./routes/visits'), + require('./routes/users'), + require('./routes/provider'), + require('./routes/message'), + require('./routes/organizations'), + ]); + }); + } +}; diff --git a/src/routes/app/routes/tables/routes/data/components/DataTables.js b/src/routes/app/routes/tables/routes/data/components/DataTables.js new file mode 100644 index 0000000..9074a96 --- /dev/null +++ b/src/routes/app/routes/tables/routes/data/components/DataTables.js @@ -0,0 +1,256 @@ +import React from 'react'; +import { Table, TableBody, TableHeader, TableHeaderColumn, TableRow, TableRowColumn, TableFooter } from 'material-ui/Table'; + +import TextField from 'material-ui/TextField'; +import Toggle from 'material-ui/Toggle'; +import QueueAnim from 'rc-queue-anim'; + +const TableExampleSimple = () => ( +
      +

      Simple Data Table

      + + + + ID + Name + Status + + + + + 1 + John Smith + Employed + + + 2 + Randal White + Unemployed + + + 3 + Stephanie Sanders + Employed + + + 4 + Steve Brown + Employed + + +
      +
      +); + +// Cmplex example +const styles = { + propContainer: { + width: 200, + overflow: 'hidden', + margin: '20px auto 0', + }, + propToggleHeader: { + margin: '20px auto 10px', + }, +}; + +const tableData = [ + { + name: 'John Smith', + status: 'Employed', + selected: true, + }, + { + name: 'Randal White', + status: 'Unemployed', + }, + { + name: 'Stephanie Sanders', + status: 'Employed', + selected: true, + }, + { + name: 'Steve Brown', + status: 'Employed', + }, + { + name: 'Joyce Whitten', + status: 'Employed', + }, + { + name: 'Samuel Roberts', + status: 'Employed', + }, + { + name: 'Adam Moore', + status: 'Employed', + }, +]; + +class TableExampleComplex extends React.Component { + constructor(props) { + super(props); + + this.state = { + fixedHeader: true, + fixedFooter: true, + stripedRows: false, + showRowHover: false, + selectable: true, + multiSelectable: false, + enableSelectAll: false, + deselectOnClickaway: true, + showCheckboxes: true, + height: '300px', + }; + } + + handleToggle = (event, toggled) => { + this.setState({ + [event.target.name]: toggled, + }); + }; + + handleChange = (event) => { + this.setState({ height: event.target.value }); + }; + + render() { + return ( +
      +

      Complex example

      +
      +
      + + + + + Super Header + + + + ID + Name + Status + + + + {tableData.map((row, index) => ( + + {index} + {row.name} + {row.status} + + ))} + + + + ID + Name + Status + + + + Super Footer + + + +
      +
      +
      +
      Table Properties
      + + + + + + +
      TableBody Properties
      + + + +
      Multiple Properties
      + +
      +
      +
      + ); + } +} + +const Page = () => ( +
      + +
      +
      +
      +
      +); + +module.exports = Page; diff --git a/src/routes/app/routes/tables/routes/data/index.js b/src/routes/app/routes/tables/routes/data/index.js new file mode 100644 index 0000000..fffb4ec --- /dev/null +++ b/src/routes/app/routes/tables/routes/data/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'data', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/DataTables')); + }); + } +}; diff --git a/src/routes/app/routes/tables/routes/members/components/Datatable.js b/src/routes/app/routes/tables/routes/members/components/Datatable.js new file mode 100644 index 0000000..4d33a40 --- /dev/null +++ b/src/routes/app/routes/tables/routes/members/components/Datatable.js @@ -0,0 +1,332 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import $ from 'jquery'; +import dt from 'datatables.net'; +import responsive from 'datatables.net-responsive'; +import IconButton from 'material-ui/IconButton'; +import RaisedButton from 'material-ui/RaisedButton'; +import ContentAdd from 'material-ui/svg-icons/content/add'; +import FlatButton from 'material-ui/FlatButton'; + + +import { + Row, + Col, + Grid, + Panel, + Table, + PanelBody, + PanelHeader, + FormControl, + PanelContainer, +} from '@sketchpixy/rubix'; + +import ContactList from '../../../../../components/ContactList'; +import Dialog from 'material-ui/Dialog'; +import Instance from '../../../../../../../components/Connection'; + +dt.responsive = responsive; +$.dataTable = dt; + +function formatPhoneNumber(s) { + var s2 = ("" + s).replace(/\D/g, ''); + var m = s2.match(/^(\d{3})(\d{3})(\d{4})$/); + return (!m) ? null : "(" + m[1] + ") " + m[2] + "-" + m[3]; +} + +const getDTList = function (member) { + let list = []; + + member.forEach((r, i) => { + list.push( + + {r.name} + +
      + | + Book +
      + + + {r.member} + {r.phonenumber} + {/* PLACEHOLDER */} + Highmark + {r.eligible} refresh + {/* PLACEHOLDER */} + Active + {r.rides} + {/* PLACEHOLDER */} + {r.rides} + {r.gender} + {r.birthdate} + {r.created} + {r.updated} + + ); + }, this); + + return list; +} + +class DatatableComponent extends React.Component { + state = { + members: [] + } + + componentDidMount() { + const state = this + Instance.getRawConn().get('/v1/nemt/users/member').then((res) => { + let members = res.data.map(x => { + x.eligible = "Verified"; + + console.log(x); + + // if (!x.phonenumber || x.phonenumber === null || x.phonenumber === "") x.phonenumber = ""; + // if (!x.email || x.email === null || x.email === "") x.email = ""; + // x.phonenumber = x.phonenumber.replace('+1', ''); + // x.phonenumber = formatPhoneNumber(x.phonenumber); + + if (x.addresses && x.addresses.length > 0) { + x.addresses.forEach((a) => { + switch (a.address_type) { + case "home": + x.home = a.address; + break; + case "work": + x.work = a.address; + break; + } + }, this); + } + + if (!x.work || x.work === null || x.work === "") x.work = ""; + if (!x.home || x.home === null || x.home === "") x.home = ""; + + // x.work = ""; + // x.home = ""; + + if (!x.phonenumber || x.phonenumber === null || x.phonenumber === "") x.phonenumber = ""; + if (!x.email || x.email === null || x.email === "") x.email = ""; + x.phonenumber = x.phonenumber.replace('+1', ''); + x.phonenumber = formatPhoneNumber(x.phonenumber); + x.birthdate = new Date(x.birthdate).toLocaleDateString(); + + if (x.gender === "M") x.gender = "Male"; + if (x.gender === "F") x.gender = "Female"; + // if (x.gender === "U") x.gender = "Other"; + + if (x.rides) x.rides = x.rides.length; + else x.rides = 0 + + return x; + }) + + members = getDTList(members); + state.setState(Object.assign(state.state, { members: members })); + $(ReactDOM.findDOMNode(state.example)) + .addClass('nowrap') + .dataTable({ + responsive: true, + dom: 'Bfrtip', + buttons: [ + 'copy', 'pdf' + ], + scrollX: true, + scroller: { + loadingIndicator: true + }, + //  columns: TABLE_COLUMNS_SORT_STYLE, + responsive: true, + "bStateSave": true, + details: { + type: 'inline' + }, + columnDefs: [ + { targets: [-1, -3], className: 'dt-body-right mdl-data-table__cell--non-numeric' } + ] + }); + state.decorateButtons(); + state.decorateSelect(); + state.decorateSearchBar(); + state.decorateColumns(); + }).catch((err) => { console.error(err); }); + } + + + decorateColumns() { + let cols = $('td'); + let colStyle = { + 'font-family': 'Roboto, sans-serif', + 'font-size': '13px', + 'font-weight': '300', + 'text-align': 'left', + }; + cols.css(colStyle); + cols.removeClass('sorting_1'); + + let headers = $('th'); + let headerStyle = { + 'color': 'rgb(158, 158, 158)', + 'text-align': 'left', + 'font-weight': '600', + 'font-size': '12px' + }; + headers.css(headerStyle); + + let oddRows = $('.odd'); + let evenRows = $('.even'); + + let oddStyle = { + 'background': 'rgba(127, 221, 233, 0.4)', + 'text-shadow': 'none', + 'border-bottom': '1px solid rgb(224, 224, 224)', + 'color': 'rgba(0, 0, 0, 0.87)', + 'height': '45px' + }; + oddRows.css(oddStyle); + + let evenStyle = oddStyle; + evenStyle['background'] = '#fff'; + + evenRows.css(evenStyle); + } + + decorateSelect() { + let instance = this; + let selectElement = $('select[class]'); + selectElement.addClass('mdl'); + + selectElement.click(function () { + instance.decorateButtons(); + }); + + let selectLabel = $('#DataTables_Table_0_length > label'); + let style = { + 'color': 'rgb(158, 158, 158)', + 'text-align': 'left', + 'font-weight': '500', + 'font-size': '11px' + }; + selectLabel.css(style); + } + + decorateSearchBar() { + let instance = this; + + let searchbar = $('input[type="search"]'); + searchbar.bind('input', function () { + instance.decorateButtons(); + instance.decorateColumns(); + }); + + searchbar.addClass('mdl-textfield__input'); + searchbar.attr('placeholder', ''); + + let searchLabel = $('#DataTables_Table_0_filter > label'); + searchLabel.css({ 'color': '#fff' }); + searchbar.css({ 'color': 'rgb(158, 158, 158)' }) + + let searchFilter = $('#DataTables_Table_0_filter'); + searchFilter.append(''); + } + + decorateButtons() { + let instance = this; + let paginateButtons = $('a.paginate_button'); + paginateButtons.addClass('mdl-button'); + + let selectedButton = $('a.paginate_button.current'); + selectedButton.addClass('mdl-button mdl-button--raised mdl-button--colored'); + + let style = { + 'background': 'rgb(0, 188, 212)', + 'font-weight': '400', + }; + selectedButton.css(style); + + paginateButtons.click(function () { + instance.decorateButtons(); + instance.decorateColumns(); + }); + + let sortingButtons = $('th.sorting, th.sorting_asc, th.sorting_desc'); + sortingButtons.click(function () { + instance.decorateButtons(); + instance.decorateColumns(); + }); + + let entriesLabel = $('#DataTables_Table_0_info'); + entriesLabel.css({ + 'color': 'rgb(158, 158, 158)', + 'text-align': 'left', + 'font-weight': '400', + 'font-size': '12px' + }); + } + + render() { + return ( + this.example = c} className='display' cellSpacing='0' width='100%'> + + + + + + + + + + + + + + + + + + + {this.state.members} + +
      NameActionSubscriber IDMobilePlanEligibilityStatusRidesVisitsGenderBirth DateCreatedUpdated
      + + ); + + + } +} + +export default class Datatablesjs extends React.Component { + render() { + return ( + + + + + + + + + +
      + +
      +
      +
      +
      +
      + +
      + ); + } +} diff --git a/src/routes/app/routes/tables/routes/members/components/Page.js b/src/routes/app/routes/tables/routes/members/components/Page.js new file mode 100644 index 0000000..2eaf2c0 --- /dev/null +++ b/src/routes/app/routes/tables/routes/members/components/Page.js @@ -0,0 +1,19 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; +import Datatable from './Datatable'; +import FlatButton from 'material-ui/FlatButton'; +import BottomNavigationExampleSimple from '../../../../ui/routes/components/components/BottomNavigation'; +import IconButton from 'material-ui/IconButton'; +import ToolbarSection from '../../../../ui/routes/components/components/Toolbar2.js'; +const Page = () => ( +
      + +

      Manage Members

      + + +
      +
      +
      +); + +module.exports = Page; diff --git a/src/routes/app/routes/tables/routes/members/index.js b/src/routes/app/routes/tables/routes/members/index.js new file mode 100644 index 0000000..4fb569c --- /dev/null +++ b/src/routes/app/routes/tables/routes/members/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'members', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Page')); + }); + } +}; diff --git a/src/routes/app/routes/tables/routes/message/components/Datatable.js b/src/routes/app/routes/tables/routes/message/components/Datatable.js new file mode 100644 index 0000000..64d26a9 --- /dev/null +++ b/src/routes/app/routes/tables/routes/message/components/Datatable.js @@ -0,0 +1,346 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import $ from 'jquery'; +import dt from 'datatables.net'; +import responsive from 'datatables.net-responsive'; +import IconButton from 'material-ui/IconButton'; +import RaisedButton from 'material-ui/RaisedButton'; +import ContentAdd from 'material-ui/svg-icons/content/add'; + +import Instance from '../../../../../../../components/Connection'; + +import { + Row, + Col, + Grid, + Panel, + Table, + PanelBody, + PanelHeader, + FormControl, + PanelContainer, +} from '@sketchpixy/rubix'; + +dt.responsive = responsive; +$.dataTable = dt; + +function formatPhoneNumber(s) { + var s2 = ("" + s).replace(/\D/g, ''); + var m = s2.match(/^(\d{3})(\d{3})(\d{4})$/); + return (!m) ? null : "(" + m[1] + ") " + m[2] + "-" + m[3]; +} + +const getDTList = function (provider) { + let list = []; + + provider.forEach((r, i) => { + list.push( + + email phonesms + 12/17/2018 + 11:14 AM CST + SMS + I need change! + Member + {/* Jane Doe */} + {r.memberName} + Read + Jane Di Spachta + A33333JSJ999AQWS + 33JSJ93333JSJ999AQWS + Rush Memorial Hospital + 93333JSJ999AQWSSSA + {/* {r.name} + {r.member} + {r.eligible} refresh + {r.rides} + {r.home} + {r.work} + {r.phonenumber}phone sms + {r.email}email + {r.gender} + {r.birthdate} */} + + + {/* {r.memberName} + {r.member} + + + phone sms {r.driver_name} | {r.driver_rating} stars + {r.muk_id} + {r.internal_id} + {r.name} + {r.address.street_address_1 + " " + (r.address.street_address_2 || "") + " - " + r.address.city + " - " + r.address.state + " (" + r.address.zipcode + ")"} + {r.address.phone_number} */} + + ); + }, this); + + return list; +} + +class DatatableComponent extends React.Component { + constructor(props) { + super(props); + this.props = props; + } + + state = { + providers: [] + } + + reloadTableData(names) { + const table = $(ReactDOM.findDOMNode(self.example)).DataTable(); + table.clear(); + table.rows.add(names); + table.draw(); + } + + componentWillReceiveProps(nextProps) { + if (nextProps.newProviders && nextProps.newProviders.length > 0) { + const self = this; + Instance.getRawConn().get('/v1/nemt/provider/participating?sort=name').then((res) => { + let providers = res.data; + let newProv = nextProps.newProviders.map(p => { + return [p.muk_id, p.internal_id, p.name, p.address.street_address_1 + " " + (p.address.street_address_2 || "") + " - " + p.address.city + " - " + p.address.state + " (" + p.address.zipcode + ")", p.address.phone_number]; + }); + + const table = $(ReactDOM.findDOMNode(self.example)).DataTable(); + table.rows.add(newProv); + providers = getDTList(providers) + self.setState(Object.assign(self.state, { providers: providers })); + table.draw(true); + + self.decorateButtons(); + self.decorateSelect(); + self.decorateColumns(); + }).catch((err) => { console.error(err); }); + } + } + + componentWillUnmount() { + $(ReactDOM.findDOMNode(this.example)).DataTable().destroy(true); + } + + componentDidMount() { + const state = this; + + Instance.getRawConn().get('/v1/nemt/provider/participating?sort=name').then((res) => { + let providers = res.data; + providers = getDTList(providers); + state.setState(Object.assign(state.state, { providers: providers })); + $(ReactDOM.findDOMNode(state.example)) + .addClass('nowrap') + .dataTable({ + responsive: true, + dom: 'Bfrtip', + buttons: [ + 'copy', 'pdf' + ], + // columns: TABLE_COLUMNS_SORT_STYLE, + responsive: true, + "bStateSave": true, + details: { + type: 'inline' + }, + columnDefs: [ + { targets: [-1, -3], className: 'dt-body-right mdl-data-table__cell--non-numeric' } + ] + }); + state.decorateButtons(); + state.decorateSelect(); + state.decorateSearchBar(); + state.decorateColumns(); + }).catch((err) => { console.error(err); }); + } + + decorateColumns() { + let cols = $('td'); + let colStyle = { + 'font-family': 'Roboto, sans-serif', + 'font-size': '13px', + 'font-weight': '300', + 'text-align': 'left', + }; + cols.css(colStyle); + cols.removeClass('sorting_1'); + + let headers = $('th'); + let headerStyle = { + 'color': 'rgb(158, 158, 158)', + 'text-align': 'left', + 'font-weight': '600', + 'font-size': '12px' + }; + headers.css(headerStyle); + + let oddRows = $('.odd'); + let evenRows = $('.even'); + + let oddStyle = { + 'background': 'rgba(127, 221, 233, 0.4)', + 'text-shadow': 'none', + 'border-bottom': '1px solid rgb(224, 224, 224)', + 'color': 'rgba(0, 0, 0, 0.87)', + 'height': '45px' + }; + oddRows.css(oddStyle); + + let evenStyle = oddStyle; + evenStyle['background'] = '#fff'; + + evenRows.css(evenStyle); + } + + decorateSelect() { + let instance = this; + let selectElement = $('select[class]'); + selectElement.addClass('mdl'); + + selectElement.click(function () { + instance.decorateButtons(); + }); + + let selectLabel = $('#DataTables_Table_0_length > label'); + let style = { + 'color': 'rgb(158, 158, 158)', + 'text-align': 'left', + 'font-weight': '500', + 'font-size': '11px' + }; + selectLabel.css(style); + } + + decorateSearchBar() { + let instance = this; + + let searchbar = $('input[type="search"]'); + searchbar.bind('input', function () { + instance.decorateButtons(); + instance.decorateColumns(); + }); + + searchbar.addClass('mdl-textfield__input'); + searchbar.attr('placeholder', ''); + + let searchLabel = $('#DataTables_Table_0_filter > label'); + searchLabel.css({ 'color': '#fff' }); + searchbar.css({ 'color': 'rgb(158, 158, 158)' }) + + let searchFilter = $('#DataTables_Table_0_filter'); + searchFilter.append(''); + } + + decorateButtons() { + let instance = this; + let paginateButtons = $('a.paginate_button'); + paginateButtons.addClass('mdl-button'); + + let selectedButton = $('a.paginate_button.current'); + selectedButton.addClass('mdl-button mdl-button--raised mdl-button--colored'); + + let style = { + 'background': 'rgb(0, 188, 212)', + 'font-weight': '400', + }; + selectedButton.css(style); + + paginateButtons.click(function () { + instance.decorateButtons(); + instance.decorateColumns(); + }); + + let sortingButtons = $('th.sorting, th.sorting_asc, th.sorting_desc'); + sortingButtons.click(function () { + instance.decorateButtons(); + instance.decorateColumns(); + }); + + let entriesLabel = $('#DataTables_Table_0_info'); + entriesLabel.css({ + 'color': 'rgb(158, 158, 158)', + 'text-align': 'left', + 'font-weight': '400', + 'font-size': '12px' + }); + } + + render() { + return ( + this.example = c} className='display' cellSpacing='0' width='100%'> + + + + + + + + + + + + + + + + {/* + + + + */} + + + + {this.state.providers} + +
      ActionsDateTimeTypeMessageSourceMemberDispatcherStatusVisitRideProviderMessage IDMUKInternal IDNameAddressPhone
      + + ); + + + } +} + +export default class Datatablesjs extends React.Component { + constructor(props) { + super(props); + this.props = props; + } + + state = { + providerChange: [], + } + + componentWillReceiveProps(nextProps) { + let providers = nextProps.providerChange; + this.setState(Object.assign(this.state, { providerChange: providers })); + } + + componentDidMount() { + let providers = this.props.providerChange; + this.setState(Object.assign(this.state, { providerChange: providers })); + } + + render() { + return ( + + + + + + + + + +
      + +
      +
      +
      +
      +
      + +
      + ); + } +} diff --git a/src/routes/app/routes/tables/routes/message/components/MessageSelection.js b/src/routes/app/routes/tables/routes/message/components/MessageSelection.js new file mode 100644 index 0000000..970a130 --- /dev/null +++ b/src/routes/app/routes/tables/routes/message/components/MessageSelection.js @@ -0,0 +1,350 @@ +import React, { Component } from 'react'; +import ReactDOM from 'react-dom'; +import PropTypes from 'prop-types'; +const axios = require('axios'); + +import FlatButton from 'material-ui/FlatButton'; +import Dialog from 'material-ui/Dialog'; +import { List, ListItem, makeSelectable } from 'material-ui/List'; +import RaisedButton from 'material-ui/RaisedButton'; +import TextField from 'material-ui/TextField'; +import Subheader from 'material-ui/Subheader'; +import Divider from 'material-ui/Divider'; +import Checkbox from 'material-ui/Checkbox'; +import MapsLocalHospital from 'material-ui/svg-icons/maps/local-hospital'; +import Instance from '../../../../../../../components/Connection'; + +const customContentStyle = { + width: '100%', + maxWidth: 'none', +}; + +const groupBy = function (array, f) { + var groups = {}; + array.forEach(function (o) { + var group = JSON.stringify(f(o)); + groups[group] = groups[group] || []; + groups[group].push(o); + }); + return Object.keys(groups).map(function (group) { + return groups[group]; + }) +} + + +export default class MessageSelection extends React.Component { + constructor(props) { + super(props); + this.props = props; + } + + state = { + Messages: [], + selectedMessages: [], + open: false, + buttonValue: '', + icon: '', + floatingLabelText: '', + value: '', + geolocation: { + lat: 0, + long: 0 + } + }; + + static propTypes = { + title: React.PropTypes.string, + buttonValue: React.PropTypes.string, + icon: React.PropTypes.string, + onMessagesAdded: React.PropTypes.function + }; + + handleOpen = (e, self) => { + self.setState(Object.assign(self.state, { open: true, Messages: [], selectedMessages: [], value: '' })); + }; + + handleCancel = (e, self) => { + self.setState(Object.assign(self.state, { open: false })); + }; + + handleClose = (e, self) => { + if (self.state.selectedMessages.length > 0) { + let params = [] + + self.state.selectedMessages.forEach(p => { + let result = params.find(pr => p.id === pr.id); + if (result) { + let index = params.indexOf(result); + if (index > -1) { + params.splice(index, 1); + result.raw.fivePartKeyGroups.push(p.raw.fivePartKeyGroups); + params.push(result); + } + } else { + params.push(p); + } + }, this); + + params = params.map(p => { return p.raw; }); + + if (params && params.length > 0) { + let url = `/v1/nemt/Message`; + Instance.getRawConn().post(url, params).then(res => { + if (self.props.onMessagesAdded) { + self.props.onMessagesAdded(res.data); + } + }); + } + } + self.setState(Object.assign(self.state, { open: false })); + }; + + handleRemoveMessage = (event, Message, self) => { + event.preventDefault(); + let selectedMessages = self.state.selectedMessages; + let result = selectedMessages.find(p => p.object_id === Message.object_id); + if (result) { + const index = selectedMessages.indexOf(result); + if (index > -1) { + selectedMessages.splice(index, 1); + } + } + self.setState(Object.assign(self.state, { selectedMessages: selectedMessages })); + } + + handleMessageClick = (event, Message, self) => { + event.preventDefault(); + let selectedMessages = self.state.selectedMessages; + debugger; + let result = selectedMessages.find(p => p.object_id === Message.object_id); + if (result) { + const index = selectedMessages.indexOf(result); + if (index > -1) { + selectedMessages.splice(index, 1); + } + } else { + selectedMessages.push(Message); + } + self.setState(Object.assign(self.state, { selectedMessages: selectedMessages })); + } + + searchMessage(e) { + let MessageName = e.target.value; + this.setState(Object.assign(this.state, { value: MessageName })); + let url = `/v1/nemt/Message?lat=${this.state.geolocation.lat}&long=${this.state.geolocation.long}&limit=20&name=${MessageName}&sortby=distance` + Instance.getRawConn().get(encodeURI(url)).then(res => { + if (res.data.resultStatus === "SUCCESS") { + if (res.data.Messages && res.data.Messages.length > 0) { + var places = []; + res.data.Messages.forEach(p => { + var result = groupBy(p.fivePartKeyGroups, function (item) { + return [item.MessageNum, item.MessageNumSuffix, item.locationSeqNum, item.planCode, item.productId]; + }); + + result = result.map(r => { + let raw = p; + raw.fivePartKeyGroups = r; + + let clickResult = { + id: p.mukId, + address: `${p.streetName_1}, ${p.cityName}, ${p.state} (${p.zipCode})`, + lat: parseFloat(p.latitude), + lng: parseFloat(p.longitude), + name: p.MessageName, + type: "Message", + internal_id: r[0].MessageNum, + internal_id_suffix: r[0].MessageNumSuffix, + location_seq_num: r[0].locationSeqNum, + plan_code: r[0].planCode, + product_id: r[0].productId, + treatment_code: r[0].treatmentCategoryCode, + object_id: p.mukId + '-' + r[0].MessageNum + '-' + r[0].planCode + '-' + r[0].productId, + raw: raw, + text: `${p.MessageName} - ${p.streetName_1}, ${p.cityName}, ${p.state} (${p.zipCode})` + } + + let checked = false; + let Message = this.state.selectedMessages.find(p => p.id === clickResult.id) + if (Message) { + checked = true; + } + + var listItem = ( + } + value={clickResult.object_id} + key={clickResult.object_id} + primaryText={`${clickResult.name} - Plan: ${clickResult.plan_code} Product: ${clickResult.product_id}`} + secondaryText={clickResult.address} + rightIcon={} + onClick={(event) => this.handleMessageClick(event, clickResult, this)} + /> + ) + return listItem; + }); + + places = places.concat(result); + }, this); + this.setState(Object.assign(this.state, { Messages: places })); + + // let places = res.data.Messages.map(p => { + // p.MessageText = `${p.MessageName} - ${p.streetName_1}, ${p.cityName}, ${p.state} (${p.zipCode})` + // let clickResult = { + // id: p.mukId, + // address: `${p.streetName_1}, ${p.cityName}, ${p.state} (${p.zipCode})`, + // lat: parseFloat(p.latitude), + // lng: parseFloat(p.longitude), + // name: p.MessageName, + // type: "Message", + // raw: p + // } + + // let checked = false; + // let Message = this.state.selectedMessages.find(p => p.id === clickResult.id) + // if (Message) { + // checked = true; + // } + + // var listItem = ( + // } + // value={clickResult.id} + // key={clickResult.id} + // primaryText={clickResult.name} + // secondaryText={clickResult.address} + // rightIcon={} + // onClick={(event) => this.handleMessageClick(event, clickResult, this)} + // /> + // ) + // return listItem; + // }); + // this.setState(Object.assign(this.state, { Messages: places })); + } + } + }); + }; + + geoSuccess = (position) => { + let geo = { + lat: position.coords.latitude, + long: position.coords.longitude + } + + geo = { + lat: 41.886406, + long: -87.624225 + } + + this.setState(Object.assign(this.state, { geolocation: geo })); + }; + + noPosition = () => { + this.geoSuccess({ + coords: { + latitude: 41.886406, + longitude: -87.624225 + } + }); + }; + + componentWillReceiveProps(nextProps) { + const self = this; + var objConf = { + open: false, + buttonValue: nextProps.buttonValue, + icon: nextProps.icon, + floatingLabelText: 'Type the Message name' + } + + this.setState(Object.assign(this.state, objConf)); + }; + + componentDidMount() { + const self = this; + var objConf = { + open: false, + buttonValue: this.props.buttonValue, + icon: this.props.icon, + floatingLabelText: 'Type the Message name' + } + + this.setState(Object.assign(this.state, objConf)); + navigator.geolocation.getCurrentPosition(this.geoSuccess, this.noPosition); + }; + + render() { + const self = this; + let actions = [ + this.handleCancel(e, this)} + />, + this.handleClose(e, this)} + />, + ]; + + let button = ( + this.handleOpen(e, this)} + secondary + icon={this.state.icon} + fullWidth={true} + />); + + let selectedMessageList; + if (this.state.selectedMessages.length > 0) { + let items = this.state.selectedMessages.map(p => { + var listItem = ( + } + value={p.id} + key={p.id} + primaryText={`${p.name} - Plan: ${p.plan_code} Product: ${p.product_id}`} + secondaryText={p.address} + rightIcon={} + onClick={(event) => this.handleRemoveMessage(event, p, this)} + /> + ) + return listItem; + }); + + selectedMessageList = ( +
      + + Selected Messages + {items} + + +
      + ) + } + + return ( +
      + {button} + +
      + this.searchMessage(e)} fullWidth={true} floatingLabelText={this.state.floatingLabelText} value={this.state.value} /> + {selectedMessageList} + + {this.state.Messages} + +
      +
      +
      ); + } +} \ No newline at end of file diff --git a/src/routes/app/routes/tables/routes/message/components/Page.js b/src/routes/app/routes/tables/routes/message/components/Page.js new file mode 100644 index 0000000..88b034a --- /dev/null +++ b/src/routes/app/routes/tables/routes/message/components/Page.js @@ -0,0 +1,39 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; +import Datatable from './Datatable'; +import FlatButton from 'material-ui/FlatButton'; +import BottomNavigationExampleSimple from '../../../../ui/routes/components/components/BottomNavigation'; +import IconButton from 'material-ui/IconButton'; +import ToolbarMessageComponent from './Toolbar'; + +export default class Page extends React.Component { + constructor(props) { + super(props); + this.props = props; + } + + state = { + newMessages: [], + } + + handleMessagesReceived = (Messages) => { + if (Messages && Messages.length > 0) { + this.setState(Object.assign(this.state, { newMessages: Messages })); + } + } + + render() { + return ( +
      + +

      Message Center

      + + +
      +
      +
      + ); + } +} + +module.exports = Page; diff --git a/src/routes/app/routes/tables/routes/message/components/Toolbar.js b/src/routes/app/routes/tables/routes/message/components/Toolbar.js new file mode 100644 index 0000000..fe9cdd0 --- /dev/null +++ b/src/routes/app/routes/tables/routes/message/components/Toolbar.js @@ -0,0 +1,68 @@ +import React from 'react'; +import IconMenu from 'material-ui/IconMenu'; +import IconButton from 'material-ui/IconButton'; +import FontIcon from 'material-ui/FontIcon'; +import NavigationExpandMoreIcon from 'material-ui/svg-icons/navigation/expand-more'; +import MenuItem from 'material-ui/MenuItem'; +import DropDownMenu from 'material-ui/DropDownMenu'; +import RaisedButton from 'material-ui/RaisedButton'; +import FlatButton from 'material-ui/FlatButton'; +import ContentAdd from 'material-ui/svg-icons/content/add'; +import { Toolbar, ToolbarGroup, ToolbarSeparator, ToolbarTitle } from 'material-ui/Toolbar'; +import MessageSelection from './MessageSelection.js'; + +class ToolbarMessages extends React.Component { + constructor(props) { + super(props); + this.state = { + value: 1, + }; + } + + handleChange = (event, index, value) => this.setState({ value }); + handleMessagesAdded = (MessageList) => { + if (this.props.onMessagesReceived) { + this.props.onMessagesReceived(MessageList); + } + } + + render() { + return ( + + + + + + + + + + + + + + } onMessagesAdded={this.handleMessagesAdded} /> +
      + + + + + } + > + + + + + + ); + } +} + +const ToolbarMessageComponent = (props) => ( + +); + + +module.exports = ToolbarMessageComponent; diff --git a/src/routes/app/routes/tables/routes/message/index.js b/src/routes/app/routes/tables/routes/message/index.js new file mode 100644 index 0000000..f67c9fc --- /dev/null +++ b/src/routes/app/routes/tables/routes/message/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'message', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Page')); + }); + } +}; diff --git a/src/routes/app/routes/tables/routes/organizations/components/Datatable.js b/src/routes/app/routes/tables/routes/organizations/components/Datatable.js new file mode 100644 index 0000000..9d2413d --- /dev/null +++ b/src/routes/app/routes/tables/routes/organizations/components/Datatable.js @@ -0,0 +1,330 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import $ from 'jquery'; +import dt from 'datatables.net'; +import responsive from 'datatables.net-responsive'; +import buttons from 'datatables.net-buttons'; +import ToolbarSection from '../../../../ui/routes/components/components/Toolbar3.js'; +import IconButton from 'material-ui/IconButton'; +import FlatButton from 'material-ui/FlatButton'; +import { + Row, + Col, + Grid, + Panel, + Table, + PanelBody, + PanelHeader, + FormControl, + PanelContainer, +} from '@sketchpixy/rubix'; +import moment from 'moment'; +import Dialog from 'material-ui/Dialog'; +import Instance from '../../../../../../../components/Connection'; + +dt.responsive = responsive; +$.dataTable = dt; + +// IconButtonExampleTouch2 = () => ( +// schedule +// ); + +const locationModal = () => ( + +); + +const formatTime = function (sec_num) { + var hours = Math.floor(sec_num / 3600); + var minutes = Math.floor((sec_num - (hours * 3600)) / 60); + var seconds = sec_num - (hours * 3600) - (minutes * 60); + + if (hours < 10) { hours = "0" + hours; } + if (minutes < 10) { minutes = "0" + minutes; } + if (seconds < 10) { seconds = "0" + seconds; } + return hours + ':' + minutes + ':' + seconds; +} + +const handleProviderChanged = function (destination) { + console.log(destination); +} + +class DatatableComponent extends React.Component { + constructor(props) { + super(props); + this.props = props; + this.state = { + items: [], + data: [], + list: [], + orgType: {}, + }; + + this.getOrganizations = this.getOrganizations.bind(this); + } + + getDTList(organization) { + return organization.map(o => { + let status = o.active ? 'Active' : 'Inactive'; + status = o.suspended ? 'Suspended' : status; + status = o.blocked ? 'Blocked' : status; + + return ( + {o.name} + {o.type.name} + {status} + {moment(o.created).format('MM/DD/YY - h:mm a')} + {moment(o.updated).format('MM/DD/YY - h:mm a')} + {o.author.name} + {o.last_editor.name} + ) + }); + } + + getOrganizations() { + const self = this; + if (this.state.orgType) { + Instance.getRawConn().get("/v1/nemt/organization").then((res) => { + let list = this.getDTList(res.data); + + $.fn.dataTable.moment = function (format, locale) { + var types = $.fn.dataTable.ext.type; + + // Add type detection + types.detect.unshift(function (d) { + return moment(d, format, locale, true).isValid() ? + 'moment-' + format : + null; + }); + + // Add sorting method - use an integer for the sorting + types.order['moment-' + format + '-pre'] = function (d) { + return moment(d, format, locale, true).unix(); + }; + }; + + $.fn.dataTable.moment('MM/DD/YYYY h:mm a'); + + self.setState(Object.assign(self.state, { list: list })); + + const dt = $(ReactDOM.findDOMNode(self.example)) + .addClass('nowrap') + .dataTable({ + responsive: true, + dom: 'Bfrtip', + buttons: [ + 'copy', 'pdf' + ], + // columns: TABLE_COLUMNS_SORT_STYLE, + responsive: true, + "bStateSave": true, + details: { + type: 'inline' + }, + columnDefs: [ + { targets: [-1, -3], orderable: true, className: 'dt-body-right mdl-data-table__cell--non-numeric' } + ], + order: [[0, 'desc']] + }); + + dt.on('column-visibility.dt', function (e, settings, column, state) { + console.log( + 'Column ' + column + ' has changed to ' + (state ? 'visible' : 'hidden') + ); + }); + + dt.on('responsive-display', function (e, datatable, row, showHide, update) { + console.log('Details for row ' + row.index() + ' ' + (showHide ? 'shown' : 'hidden')); + }); + + this.decorateButtons(); + this.decorateSelect(); + this.decorateSearchBar(); + this.decorateColumns(); + }).catch(console.error); + } + } + + componentWillReceiveProps(nextProps) { + const self = this; + this.setState(Object.assign(this.state, { orgType: nextProps.orgType })); + //this.getOrganizations(); + } + + componentDidMount() { + const self = this; + if (this.props.orgType) { + this.setState(Object.assign(this.state, { orgType: this.props.orgType })); + this.getOrganizations(); + } + } + + decorateColumns() { + let cols = $('td'); + let colStyle = { + 'font-family': 'Roboto, sans-serif', + 'font-size': '13px', + 'font-weight': '300', + 'text-align': 'left', + }; + cols.css(colStyle); + cols.removeClass('sorting_1'); + + let headers = $('th'); + let headerStyle = { + 'color': 'rgb(158, 158, 158)', + 'text-align': 'left', + 'font-weight': '600', + 'font-size': '12px' + }; + headers.css(headerStyle); + + let oddRows = $('.odd'); + let evenRows = $('.even'); + + let oddStyle = { + 'background': 'rgba(127, 221, 233, 0.4)', + 'text-shadow': 'none', + 'border-bottom': '1px solid rgb(224, 224, 224)', + 'color': 'rgba(0, 0, 0, 0.87)', + 'height': '45px' + }; + oddRows.css(oddStyle); + + let evenStyle = oddStyle; + evenStyle['background'] = '#fff'; + + evenRows.css(evenStyle); + } + + decorateSelect() { + let instance = this; + let selectElement = $('select[class]'); + selectElement.addClass('mdl'); + + selectElement.click(function () { + instance.decorateButtons(); + }); + + let selectLabel = $('#DataTables_Table_0_length > label'); + let style = { + 'color': 'rgb(158, 158, 158)', + 'text-align': 'left', + 'font-weight': '500', + 'font-size': '11px' + }; + selectLabel.css(style); + } + + decorateSearchBar() { + let instance = this; + + let searchbar = $('input[type="search"]'); + searchbar.bind('input', function () { + instance.decorateButtons(); + instance.decorateColumns(); + }); + + searchbar.addClass('mdl-textfield__input'); + searchbar.attr('placeholder', ''); + + let searchLabel = $('#DataTables_Table_0_filter > label'); + searchLabel.css({ 'color': '#fff' }); + searchbar.css({ 'color': 'rgb(158, 158, 158)' }) + + let searchFilter = $('#DataTables_Table_0_filter'); + searchFilter.append(''); + } + + decorateButtons() { + let instance = this; + let paginateButtons = $('a.paginate_button'); + paginateButtons.addClass('mdl-button'); + + let selectedButton = $('a.paginate_button.current'); + selectedButton.addClass('mdl-button mdl-button--raised mdl-button--colored'); + + let style = { + 'background': 'rgb(0, 188, 212)', + 'font-weight': '400', + }; + selectedButton.css(style); + + paginateButtons.click(function () { + instance.decorateButtons(); + instance.decorateColumns(); + }); + + let sortingButtons = $('th.sorting, th.sorting_asc, th.sorting_desc'); + sortingButtons.click(function () { + instance.decorateButtons(); + instance.decorateColumns(); + }); + + let entriesLabel = $('#DataTables_Table_0_info'); + entriesLabel.css({ + 'color': 'rgb(158, 158, 158)', + 'text-align': 'left', + 'font-weight': '400', + 'font-size': '12px' + }); + } + + render() { + return ( + this.example = c} className='display' cellSpacing='0' width='100%'> + + + + + + + + + + + + + {this.state.list} + +
      NameTypeStatusCreatedUpdatedAuthorLast Editor
      + ); + } +} + +export default class Datatablesjs extends React.Component { + constructor(props) { + super(props); + this.props = props; + } + + componentDidMount() { + //console.log(this.props); + } + + componentWillReceiveProps(nextProps) { + this.props = nextProps; + } + + render() { + return ( + + + + + + + + + +
      + +
      +
      +
      +
      +
      + +
      + ); + } +} \ No newline at end of file diff --git a/src/routes/app/routes/tables/routes/organizations/components/OrganizationComponent.js b/src/routes/app/routes/tables/routes/organizations/components/OrganizationComponent.js new file mode 100644 index 0000000..f0e3b7c --- /dev/null +++ b/src/routes/app/routes/tables/routes/organizations/components/OrganizationComponent.js @@ -0,0 +1,483 @@ +import React from 'react'; +import Dialog from 'material-ui/Dialog'; +import { List, ListItem } from 'material-ui/List'; +import TextField from 'material-ui/TextField'; +import RaisedButton from 'material-ui/RaisedButton'; +import FlatButton from 'material-ui/FlatButton'; +import SelectField from 'material-ui/SelectField'; +import AutoComplete from 'material-ui/AutoComplete'; +import MenuItem from 'material-ui/MenuItem'; +import Instance from '../../../../../../../components/Connection'; + +const groupBy = function (array, f) { + var groups = {}; + array.forEach(function (o) { + var group = JSON.stringify(f(o)); + groups[group] = groups[group] || []; + groups[group].push(o); + }); + return Object.keys(groups).map(function (group) { + return groups[group]; + }) +} + +const dataSourceConfig = { + text: 'organizationName', + value: 'organizationValue', +}; + +export default class OrganizationComponent extends React.Component { + constructor(props) { + super(props); + this.props = props; + this.state = { + buttonValue: '', + openDialog: false, + title: '', + modalStyle: { + width: '100%', + maxWidth: '600px', + }, + divStyle: { + textAlign: 'left', + textTransform: 'none !important', + padding: '0px 5px 0px 0px', + marginTop: -5, + boxShadow: 'none', + color: 'rgba(0, 0, 0, 0.3)', + }, + location: { + lat: 41.819078, + long: -87.623129, + }, + searchValue: '', + searchProviders: [], + selectedProvider: {}, + organizationFields: { + type: { + key: '', + name: '', + }, + name: '', + desc: '', + parent: {}, + reference: null, + }, + searchingOrganizations: false, + selectedOrganization: {}, + selectedType: {}, + typeList: [], + geolocation: { + lat: 41.819078, + long: -87.623129, + }, + showFields: true, + parentAutocomplete: '', + parentOrganizations: [], + seachingProvider: false, + }; + + this.handleOpen = this.handleOpen.bind(this); + this.handleClose = this.handleClose.bind(this); + this.setProps = this.setProps.bind(this); + this.handleSave = this.handleSave.bind(this); + this.handleOrganization = this.handleOrganization.bind(this); + this.handleType = this.handleType.bind(this); + this.handleNext = this.handleNext.bind(this); + + this.handleSearchRawProvider = this.handleSearchRawProvider.bind(this); + this.handleProviderClick = this.handleProviderClick.bind(this); + + this.handleParentAutocomplete = this.handleParentAutocomplete.bind(this); + this.handleParentSearch = this.handleParentSearch.bind(this); + this.handleOrganizationName = this.handleOrganizationName.bind(this); + this.handleOrganizationDesc = this.handleOrganizationDesc.bind(this); + this.handleButtonSearchRawProvider = this.handleButtonSearchRawProvider.bind(this); + this.handleReset = this.handleReset.bind(this); + } + + componentDidMount() { + const self = this; + this.setProps(this.props); + + Instance.getRawConn().get('/v1/nemt/organization/type').then(res => { + const typeList = res.data.map((v, i) => { + if (v.key === 'provider') { + self.setState(Object.assign(self.state, { selectedType: v, showFields: false })); + } + return (); + }); + + self.setState(Object.assign(self.state, { typeList: typeList })); + }).catch(console.error); + navigator.geolocation.getCurrentPosition(this.geoSuccess, this.noPosition); + } + + componentWillReceiveProps(nextProps) { + this.setProps(nextProps); + } + + setProps(propsParam) { + this.setState(Object.assign(this.state, { buttonValue: propsParam.buttonValue, title: propsParam.title })); + } + + geoSuccess = (position) => { + let geo = { + lat: position.coords.latitude, + long: position.coords.longitude + } + + geo = { + lat: 41.819078, + long: -87.623129, + } + + this.setState(Object.assign(this.state, { geolocation: geo })); + }; + + noPosition = () => { + this.geoSuccess({ + coords: { + latitude: 41.886406, + longitude: -87.624225 + } + }); + }; + + handleOpen() { + this.setState(Object.assign(this.state, { openDialog: true })); + this.handleReset(); + } + + handleClose() { + this.setState(Object.assign(this.state, { openDialog: false })); + this.handleReset(); + } + + handleSave() { + const self = this; + const organizationFields = this.state.organizationFields; + organizationFields.type = this.state.selectedType; + + Instance.getRawConn().post('/v1/nemt/organization', organizationFields).then(res => { + this.setState(Object.assign(this.state, { openDialog: false })); + location.href = '/#/app/organization/' + res.data.id; + + if (this.props.onSelectOrganization) { + this.props.onSelectOrganization(res.data); + } + self.handleReset(); + }).catch(console.error); + } + + handleType(event, index, value) { + let showFields = !(value.key === 'provider'); + this.handleReset(event); + this.setState(Object.assign(this.state, { selectedType: value, showFields: showFields })); + } + + handleOrganization(e, a) { + let selectedOrganizations = this.state.selectedOrganizations; + selectedOrganizations.push(a); + this.setState(Object.assign(this.state, { + selectedOrganizations: selectedOrganizations, + searchValue: a.name, + })); + } + + handleParentAutocomplete = (u) => { + let organizationFields = this.state.organizationFields; + organizationFields.parent = u.organizationValue; + this.setState(Object.assign(this.state, { organizationFields: organizationFields, parentAutocomplete: u.name })); + } + + handleParentFilter = (searchText, key) => { + if (searchText && key) { + return (key.toLowerCase().indexOf(searchText.toLowerCase()) !== -1) + } else { + return false; + } + } + + handleParentSearch = (s) => { + this.setState(Object.assign(this.state, { parentAutocomplete: s })); + if (s.length >= 3 && !this.state.searchingOrganizations) { + this.setState(Object.assign(this.state, { searchingOrganizations: true })); + let url = '/v1/nemt/organization/name?name=' + encodeURIComponent(s); + if (this.props.searchType) { + switch (this.props.searchType) { + case 'parent': + case 'child': + url += '&type=' + encodeURIComponent(this.props.searchType); + break; + } + } + + Instance.getRawConn().get(url).then(res => { + const list = res.data.map(p => { + console.log(p); + return { + organizationName: p.name, + organizationValue: p + }; + }); + this.setState(Object.assign(this.state, { parentOrganizations: list, searchingOrganizations: false })); + }).catch(console.error); + } + } + + handleProviderClick = (e, p) => { + this.setState(Object.assign(this.state, { searchValue: p.completeText, selectedProvider: p })); + } + + handleNext = (e) => { + e.preventDefault(); + const organization = { + type: this.state.selectedType, + name: this.state.selectedProvider.name, + desc: '', + parent: {}, + reference: this.state.selectedProvider.raw, + } + + this.setState(Object.assign(this.state, { showFields: true, organizationFields: organization })); + } + + handleReset = (e) => { + var self = this; + let organization = self.state.organizationFields; + + organization.name = ''; + organization.desc = ''; + organization.parent = {}; + organization.reference = null; + + self.setState(Object.assign(self.state, { searchValue: '', searchProviders: [], organizationFields: organization })); + } + + handleButtonSearchRawProvider = (e) => { + var self = this; + self.setState(Object.assign(self.state, { seachingProvider: true })); + let url = `/v1/nemt/provider?lat=${self.state.geolocation.lat}&long=${self.state.geolocation.long}&limit=50&name=${self.state.searchValue}&sortby=distance`; + + Instance.getRawConn().get(encodeURI(url)).then(res => { + if (res.data.resultStatus === "SUCCESS") { + if (res.data.providers && res.data.providers.length > 0) { + var places = []; + res.data.providers.forEach(p => { + var result = groupBy(p.fivePartKeyGroups, function (item) { + return [item.providerNum, item.providerNumSuffix, item.locationSeqNum, item.planCode, item.productId]; + }); + + result = result.map(r => { + let raw = p; + raw.fivePartKeyGroups = r; + + let clickResult = { + id: p.mukId, + address: `${p.streetName_1}, ${p.cityName}, ${p.state} (${p.zipCode})`, + lat: parseFloat(p.latitude), + lng: parseFloat(p.longitude), + name: p.providerName, + street: p.streetName_1, + city: p.cityName, + state: p.state, + zip_code: p.zipCode, + phone_number: p.phoneNumber, + type: "provider", + internal_id: r[0].providerNum, + internal_id_suffix: r[0].providerNumSuffix, + location_seq_num: r[0].locationSeqNum, + plan_code: r[0].planCode, + product_id: r[0].productId, + treatment_code: r[0].treatmentCategoryCode, + object_id: p.mukId + '-' + r[0].providerNum + '-' + r[0].planCode + '-' + r[0].productId, + raw: raw, + text: `${p.providerName} - ${p.streetName_1}, ${p.cityName}, ${p.state} (${p.zipCode})`, + completeText: `${p.providerName} - Plan: ${r[0].planCode} Product: ${r[0].productId}` + } + + var listItem = ( + self.handleProviderClick(event, clickResult)} + /> + ) + return listItem; + }); + + places = places.concat(result); + }, self); + self.setState(Object.assign(self.state, { searchProviders: places, seachingProvider: false })); + } else { + self.setState(Object.assign(self.state, { searchProviders: [], seachingProvider: false })); + } + } else { + console.error(res.data); + self.setState(Object.assign(self.state, { searchProviders: [], seachingProvider: false })); + } + }).catch(err => { + console.error(err); + self.setState(Object.assign(self.state, { seachingProvider: false })); + }); + } + + handleSearchRawProvider = (e) => { + var self = this; + self.setState(Object.assign(self.state, { searchValue: e.target.value })); + }; + + handleOrganizationName(e) { + let organizationDesc = this.state.organizationFields; + organizationDesc.name = e.target.value; + + this.setState(Object.assign(this.state, { organizationFields: organizationDesc })); + } + + handleOrganizationDesc(e) { + let organizationDesc = this.state.organizationFields; + organizationDesc.desc = e.target.value; + + this.setState(Object.assign(this.state, { organizationFields: organizationDesc })); + } + + render() { + + let actions = [ + , + , + ]; + + let formOrganization = (
      + + + +
      ); + + switch (this.state.selectedType.key) { + case 'provider': + if (!this.state.showFields) { + formOrganization = ( +
      +
      +
      + +
      +
      + + +
      +
      +
      +
      + + {this.state.searchProviders} + +
      +
      +
      + ) + + actions = [ + , + , + ]; + } else { + actions = [ + , + , + , + ]; + } + break; + } + + return ( +
      + + +
      + + {this.state.typeList} + + {formOrganization} +
      +
      +
      ); + } +} \ No newline at end of file diff --git a/src/routes/app/routes/tables/routes/organizations/components/Page.js b/src/routes/app/routes/tables/routes/organizations/components/Page.js new file mode 100644 index 0000000..c2f974e --- /dev/null +++ b/src/routes/app/routes/tables/routes/organizations/components/Page.js @@ -0,0 +1,40 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; +import Datatable from './Datatable'; +import FlatButton from 'material-ui/FlatButton'; +import BottomNavigationExampleSimple from '../../../../ui/routes/components/components/BottomNavigation'; +import IconButton from 'material-ui/IconButton'; +import ToolbarSection from './Toolbar'; + +class Page extends React.Component { + constructor(props) { + super(props); + this.props = props; + this.state = { + organizationType: {} + } + + this.handleChange = this.handleChange.bind(this); + } + + handleChange(value) { + this.setState(Object.assign(this.state, { organizationType: value })); + } + + render() { + return (
      +

      Manage Organizations

      + +
      + +
      +
      + +
      + +
      +
      ) + } +} + +module.exports = Page; diff --git a/src/routes/app/routes/tables/routes/organizations/components/Toolbar.js b/src/routes/app/routes/tables/routes/organizations/components/Toolbar.js new file mode 100644 index 0000000..5f6d921 --- /dev/null +++ b/src/routes/app/routes/tables/routes/organizations/components/Toolbar.js @@ -0,0 +1,92 @@ +import React from 'react'; +import IconMenu from 'material-ui/IconMenu'; +import IconButton from 'material-ui/IconButton'; +import FontIcon from 'material-ui/FontIcon'; +import NavigationExpandMoreIcon from 'material-ui/svg-icons/navigation/expand-more'; +import MenuItem from 'material-ui/MenuItem'; +import DropDownMenu from 'material-ui/DropDownMenu'; +import RaisedButton from 'material-ui/RaisedButton'; +import FlatButton from 'material-ui/FlatButton'; +import ContentAdd from 'material-ui/svg-icons/content/add'; +import { Toolbar, ToolbarGroup, ToolbarSeparator, ToolbarTitle } from 'material-ui/Toolbar'; +import OrganizationComponent from './OrganizationComponent'; +import Instance from '../../../../../../../components/Connection'; + +class ToolbarOrganization extends React.Component { + constructor(props) { + super(props); + this.props = props; + this.state = { + selectedType: { + name: 'All Organizations', + key: '', + desc: '', + }, + typeList: [], + baseSearch: { + name: 'All Organizations', + key: '', + desc: '', + }, + }; + + this.handleChange = this.handleChange.bind(this); + } + + componentDidMount() { + const self = this; + Instance.getRawConn().get('/v1/nemt/organization/type').then(res => { + const typeList = res.data.map((v, i) => { + return (); + }); + + self.setState(Object.assign(self.state, { typeList: typeList, selectedType: self.state.baseSearch })); + console.log(self.state); + if (self.props.onChange) { + self.props.onChange(self.state.selectedType); + } + }).catch(console.error); + } + + handleChange(event, index, value) { + this.setState(Object.assign(this.state, { selectedType: value })); + if (this.props.onChange) { + this.props.onChange(value); + } + } + + render() { + return ( + + + } > + + {this.state.typeList} + + + + + ); + } +} + +class ToolbarSection2 extends React.Component { + constructor(props) { + super(props); + this.props = props; + + this.handleChange = this.handleChange.bind(this); + } + + handleChange(value) { + if (this.props.onChange) { + this.props.onChange(value); + } + } + + render() { + return (); + } +} + +module.exports = ToolbarSection2; diff --git a/src/routes/app/routes/tables/routes/organizations/index.js b/src/routes/app/routes/tables/routes/organizations/index.js new file mode 100644 index 0000000..5ee2510 --- /dev/null +++ b/src/routes/app/routes/tables/routes/organizations/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'organizations', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Page')); + }); + } +}; diff --git a/src/routes/app/routes/tables/routes/provider/components/Datatable.js b/src/routes/app/routes/tables/routes/provider/components/Datatable.js new file mode 100644 index 0000000..82da51f --- /dev/null +++ b/src/routes/app/routes/tables/routes/provider/components/Datatable.js @@ -0,0 +1,301 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import $ from 'jquery'; +import dt from 'datatables.net'; +import responsive from 'datatables.net-responsive'; +import IconButton from 'material-ui/IconButton'; +import RaisedButton from 'material-ui/RaisedButton'; +import ContentAdd from 'material-ui/svg-icons/content/add'; +import Instance from '../../../../../../../components/Connection'; + +import { + Row, + Col, + Grid, + Panel, + Table, + PanelBody, + PanelHeader, + FormControl, + PanelContainer, +} from '@sketchpixy/rubix'; + +dt.responsive = responsive; +$.dataTable = dt; + +function formatPhoneNumber(s) { + var s2 = ("" + s).replace(/\D/g, ''); + var m = s2.match(/^(\d{3})(\d{3})(\d{4})$/); + return (!m) ? null : "(" + m[1] + ") " + m[2] + "-" + m[3]; +} + +const getDTList = function (provider) { + let list = []; + + provider.forEach((r, i) => { + list.push( + + {r.name} + {r.address.street_address_1 + " " + (r.address.street_address_2 || "") + ", " + r.address.city + ", " + r.address.state + " " + r.address.zipcode + ""} + {r.address.phone_number} + {r.muk_id} + {r.internal_id} + + ); + }, this); + + return list; +} + +class DatatableComponent extends React.Component { + constructor(props) { + super(props); + this.props = props; + } + + state = { + providers: [] + } + + reloadTableData(names) { + const table = $(ReactDOM.findDOMNode(self.example)).DataTable(); + table.clear(); + table.rows.add(names); + table.draw(); + } + + componentWillReceiveProps(nextProps) { + if (nextProps.newProviders && nextProps.newProviders.length > 0) { + const self = this; + Instance.getRawConn().get('/v1/nemt/provider/participating?sort=name').then((res) => { + let providers = res.data; + let newProv = nextProps.newProviders.map(p => { + return [p.muk_id, p.internal_id, p.name, p.address.street_address_1 + ", " + (p.address.street_address_2 || "") + ", " + p.address.city + ", " + p.address.state + " " + p.address.zipcode + "", p.address.phone_number]; + }); + + const table = $(ReactDOM.findDOMNode(self.example)).DataTable(); + table.rows.add(newProv); + providers = getDTList(providers) + self.setState(Object.assign(self.state, { providers: providers })); + table.draw(true); + + self.decorateButtons(); + self.decorateSelect(); + self.decorateColumns(); + }).catch((err) => { console.error(err); }); + } + } + + componentWillUnmount() { + $(ReactDOM.findDOMNode(this.example)).DataTable().destroy(true); + } + + componentDidMount() { + const state = this; + + Instance.getRawConn().get('/v1/nemt/provider/participating?sort=name').then((res) => { + let providers = res.data; + providers = getDTList(providers); + state.setState(Object.assign(state.state, { providers: providers })); + $(ReactDOM.findDOMNode(state.example)) + .addClass('nowrap') + .dataTable({ + responsive: true, + dom: 'Bfrtip', + buttons: [ + 'copy', 'pdf' + ], + // columns: TABLE_COLUMNS_SORT_STYLE, + responsive: true, + "bStateSave": true, + details: { + type: 'inline' + }, + columnDefs: [ + { targets: [-1, -3], className: 'dt-body-right mdl-data-table__cell--non-numeric' } + ] + }); + state.decorateButtons(); + state.decorateSelect(); + state.decorateSearchBar(); + state.decorateColumns(); + }).catch((err) => { console.error(err); }); + } + + decorateColumns() { + let cols = $('td'); + let colStyle = { + 'font-family': 'Roboto, sans-serif', + 'font-size': '13px', + 'font-weight': '300', + 'text-align': 'left', + }; + cols.css(colStyle); + cols.removeClass('sorting_1'); + + let headers = $('th'); + let headerStyle = { + 'color': 'rgb(158, 158, 158)', + 'text-align': 'left', + 'font-weight': '600', + 'font-size': '12px' + }; + headers.css(headerStyle); + + let oddRows = $('.odd'); + let evenRows = $('.even'); + + let oddStyle = { + 'background': 'rgba(127, 221, 233, 0.4)', + 'text-shadow': 'none', + 'border-bottom': '1px solid rgb(224, 224, 224)', + 'color': 'rgba(0, 0, 0, 0.87)', + 'height': '45px' + }; + oddRows.css(oddStyle); + + let evenStyle = oddStyle; + evenStyle['background'] = '#fff'; + + evenRows.css(evenStyle); + } + + decorateSelect() { + let instance = this; + let selectElement = $('select[class]'); + selectElement.addClass('mdl'); + + selectElement.click(function () { + instance.decorateButtons(); + }); + + let selectLabel = $('#DataTables_Table_0_length > label'); + let style = { + 'color': 'rgb(158, 158, 158)', + 'text-align': 'left', + 'font-weight': '500', + 'font-size': '11px' + }; + selectLabel.css(style); + } + + decorateSearchBar() { + let instance = this; + + let searchbar = $('input[type="search"]'); + searchbar.bind('input', function () { + instance.decorateButtons(); + instance.decorateColumns(); + }); + + searchbar.addClass('mdl-textfield__input'); + searchbar.attr('placeholder', ''); + + let searchLabel = $('#DataTables_Table_0_filter > label'); + searchLabel.css({ 'color': '#fff' }); + searchbar.css({ 'color': 'rgb(158, 158, 158)' }) + + let searchFilter = $('#DataTables_Table_0_filter'); + searchFilter.append(''); + } + + decorateButtons() { + let instance = this; + let paginateButtons = $('a.paginate_button'); + paginateButtons.addClass('mdl-button'); + + let selectedButton = $('a.paginate_button.current'); + selectedButton.addClass('mdl-button mdl-button--raised mdl-button--colored'); + + let style = { + 'background': 'rgb(0, 188, 212)', + 'font-weight': '400', + }; + selectedButton.css(style); + + paginateButtons.click(function () { + instance.decorateButtons(); + instance.decorateColumns(); + }); + + let sortingButtons = $('th.sorting, th.sorting_asc, th.sorting_desc'); + sortingButtons.click(function () { + instance.decorateButtons(); + instance.decorateColumns(); + }); + + let entriesLabel = $('#DataTables_Table_0_info'); + entriesLabel.css({ + 'color': 'rgb(158, 158, 158)', + 'text-align': 'left', + 'font-weight': '400', + 'font-size': '12px' + }); + } + + render() { + return ( + this.example = c} className='display' cellSpacing='0' width='100%'> + + + + + + + + + + + {this.state.providers} + +
      Organization NameAddressPhoneMUKNPI
      + + ); + + + } +} + +export default class Datatablesjs extends React.Component { + constructor(props) { + super(props); + this.props = props; + } + + state = { + providerChange: [], + } + + componentWillReceiveProps(nextProps) { + let providers = nextProps.providerChange; + this.setState(Object.assign(this.state, { providerChange: providers })); + } + + componentDidMount() { + let providers = this.props.providerChange; + this.setState(Object.assign(this.state, { providerChange: providers })); + } + + render() { + return ( + + + + + + + + + +
      + +
      +
      +
      +
      +
      + +
      + ); + } +} diff --git a/src/routes/app/routes/tables/routes/provider/components/Page.js b/src/routes/app/routes/tables/routes/provider/components/Page.js new file mode 100644 index 0000000..c0aaf8c --- /dev/null +++ b/src/routes/app/routes/tables/routes/provider/components/Page.js @@ -0,0 +1,39 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; +import Datatable from './Datatable'; +import FlatButton from 'material-ui/FlatButton'; +import BottomNavigationExampleSimple from '../../../../ui/routes/components/components/BottomNavigation'; +import IconButton from 'material-ui/IconButton'; +import ToolbarProviderComponent from './Toolbar'; + +export default class Page extends React.Component { + constructor(props) { + super(props); + this.props = props; + } + + state = { + newProviders: [], + } + + handleProvidersReceived = (providers) => { + if (providers && providers.length > 0) { + this.setState(Object.assign(this.state, { newProviders: providers })); + } + } + + render() { + return ( +
      + +

      Participating Providers

      + + +
      +
      +
      + ); + } +} + +module.exports = Page; diff --git a/src/routes/app/routes/tables/routes/provider/components/ProviderSelection.js b/src/routes/app/routes/tables/routes/provider/components/ProviderSelection.js new file mode 100644 index 0000000..b95af7e --- /dev/null +++ b/src/routes/app/routes/tables/routes/provider/components/ProviderSelection.js @@ -0,0 +1,330 @@ +import React, { Component } from 'react'; +import ReactDOM from 'react-dom'; +import PropTypes from 'prop-types'; +const axios = require('axios'); + +import FlatButton from 'material-ui/FlatButton'; +import Dialog from 'material-ui/Dialog'; +import { List, ListItem, makeSelectable } from 'material-ui/List'; +import RaisedButton from 'material-ui/RaisedButton'; +import TextField from 'material-ui/TextField'; +import Subheader from 'material-ui/Subheader'; +import Divider from 'material-ui/Divider'; +import Checkbox from 'material-ui/Checkbox'; +import MapsLocalHospital from 'material-ui/svg-icons/maps/local-hospital'; +import Instance from '../../../../../../../components/Connection'; + +const customContentStyle = { + width: '100%', + maxWidth: 'none', +}; + +const groupBy = function (array, f) { + var groups = {}; + array.forEach(function (o) { + var group = JSON.stringify(f(o)); + groups[group] = groups[group] || []; + groups[group].push(o); + }); + return Object.keys(groups).map(function (group) { + return groups[group]; + }) +} + + +export default class ProviderSelection extends React.Component { + constructor(props) { + super(props); + this.props = props; + this.state = { + providers: [], + selectedProviders: [], + open: false, + buttonValue: '', + icon: '', + floatingLabelText: '', + value: '', + geolocation: { + lat: 0, + long: 0 + } + } + + this.handleOpen = this.handleOpen.bind(this); + this.handleCancel = this.handleCancel.bind(this); + this.handleClose = this.handleClose.bind(this); + this.handleRemoveProvider = this.handleRemoveProvider.bind(this); + this.handleProviderClick = this.handleProviderClick.bind(this); + this.searchProvider = this.searchProvider.bind(this); + this.geoSuccess = this.geoSuccess.bind(this); + this.noPosition = this.noPosition.bind(this); + } + + static propTypes = { + title: React.PropTypes.string, + buttonValue: React.PropTypes.string, + icon: React.PropTypes.string, + onProvidersAdded: React.PropTypes.function + }; + + handleOpen = (e) => { + this.setState(Object.assign(this.state, { open: true, providers: [], selectedProviders: [], value: '' })); + }; + + handleCancel = (e) => { + this.setState(Object.assign(this.state, { open: false })); + }; + + handleClose = (e) => { + if (this.state.selectedProviders.length > 0) { + let params = [] + + this.state.selectedProviders.forEach(p => { + let result = params.find(pr => p.id === pr.id); + if (result) { + let index = params.indexOf(result); + if (index > -1) { + params.splice(index, 1); + result.raw.fivePartKeyGroups.push(p.raw.fivePartKeyGroups); + params.push(result); + } + } else { + params.push(p); + } + }, this); + + params = params.map(p => { return p.raw; }); + + if (params && params.length > 0) { + let url = `/v1/nemt/provider`; + Instance.getRawConn().post(url, params).then(res => { + if (this.props.onProvidersAdded) { + this.props.onProvidersAdded(res.data); + } + }); + } + } + this.setState(Object.assign(this.state, { open: false })); + }; + + handleRemoveProvider = (event, provider) => { + event.preventDefault(); + let selectedProviders = this.state.selectedProviders; + let result = selectedProviders.find(p => p.object_id === provider.object_id); + if (result) { + const index = selectedProviders.indexOf(result); + if (index > -1) { + selectedProviders.splice(index, 1); + } + } + this.setState(Object.assign(this.state, { selectedProviders: selectedProviders })); + } + + handleProviderClick = (event, provider) => { + event.preventDefault(); + let selectedProviders = this.state.selectedProviders; + debugger; + let result = selectedProviders.find(p => p.object_id === provider.object_id); + if (result) { + const index = selectedProviders.indexOf(result); + if (index > -1) { + selectedProviders.splice(index, 1); + } + } else { + selectedProviders.push(provider); + } + this.setState(Object.assign(this.state, { selectedProviders: selectedProviders })); + } + + searchProvider = (e) => { + let providerName = e.target.value; + this.setState(Object.assign(this.state, { value: providerName })); + let url = `/v1/nemt/provider?lat=${this.state.geolocation.lat}&long=${this.state.geolocation.long}&limit=20&name=${providerName}&sortby=distance` + Instance.getRawConn().get(encodeURI(url)).then(res => { + if (res.data.resultStatus === "SUCCESS") { + if (res.data.providers && res.data.providers.length > 0) { + var places = []; + res.data.providers.forEach(p => { + var result = groupBy(p.fivePartKeyGroups, function (item) { + return [item.providerNum, item.providerNumSuffix, item.locationSeqNum, item.planCode, item.productId]; + }); + + result = result.map(r => { + let raw = p; + raw.fivePartKeyGroups = r; + + let clickResult = { + id: p.mukId, + address: `${p.streetName_1}, ${p.cityName}, ${p.state} (${p.zipCode})`, + lat: parseFloat(p.latitude), + lng: parseFloat(p.longitude), + name: p.providerName, + street: p.streetName_1, + city: p.cityName, + state: p.state, + zip_code: p.zipCode, + phone_number: p.phoneNumber, + type: "provider", + internal_id: r[0].providerNum, + internal_id_suffix: r[0].providerNumSuffix, + location_seq_num: r[0].locationSeqNum, + plan_code: r[0].planCode, + product_id: r[0].productId, + treatment_code: r[0].treatmentCategoryCode, + object_id: p.mukId + '-' + r[0].providerNum + '-' + r[0].planCode + '-' + r[0].productId, + raw: raw, + text: `${p.providerName} - ${p.streetName_1}, ${p.cityName}, ${p.state} (${p.zipCode})` + } + + let checked = false; + let provider = this.state.selectedProviders.find(p => p.id === clickResult.id) + if (provider) { + checked = true; + } + + var listItem = ( + } + value={clickResult.object_id} + key={clickResult.object_id} + primaryText={`${clickResult.name} - Plan: ${clickResult.plan_code} Product: ${clickResult.product_id}`} + secondaryText={clickResult.address} + rightIcon={} + onClick={(event) => this.handleProviderClick(event, clickResult, this)} + /> + ) + return listItem; + }); + + places = places.concat(result); + }, this); + this.setState(Object.assign(this.state, { providers: places })); + } + } + }); + }; + + geoSuccess = (position) => { + let geo = { + lat: position.coords.latitude, + long: position.coords.longitude + } + + geo = { + lat: 41.819078, + long: -87.623129, + } + + this.setState(Object.assign(this.state, { geolocation: geo })); + }; + + noPosition = () => { + this.geoSuccess({ + coords: { + latitude: 41.819078, + longitude: -87.623129 + } + }); + }; + + componentWillReceiveProps(nextProps) { + const self = this; + var objConf = { + open: false, + buttonValue: nextProps.buttonValue, + icon: nextProps.icon, + floatingLabelText: 'Type the provider name' + } + + this.setState(Object.assign(this.state, objConf)); + }; + + componentDidMount() { + const self = this; + var objConf = { + open: false, + buttonValue: this.props.buttonValue, + icon: this.props.icon, + floatingLabelText: 'Type the provider name' + } + + this.setState(Object.assign(this.state, objConf)); + navigator.geolocation.getCurrentPosition(this.geoSuccess, this.noPosition); + }; + + render() { + const self = this; + let actions = [ + this.handleCancel(e, this)} + />, + this.handleClose(e, this)} + />, + ]; + + let button = ( + this.handleOpen(e, this)} + secondary + icon={this.state.icon} + fullWidth={true} + />); + + let selectedProviderList; + if (this.state.selectedProviders.length > 0) { + let items = this.state.selectedProviders.map(p => { + var listItem = ( + } + value={p.id} + key={p.id} + primaryText={`${p.name} - Plan: ${p.plan_code} Product: ${p.product_id}`} + secondaryText={p.address} + rightIcon={} + onClick={(event) => this.handleRemoveProvider(event, p, this)} + /> + ) + return listItem; + }); + + selectedProviderList = ( +
      + + Selected Providers + {items} + + +
      + ) + } + + return ( +
      + {button} + +
      + this.searchProvider(e)} fullWidth={true} floatingLabelText={this.state.floatingLabelText} value={this.state.value} /> + {selectedProviderList} + + {this.state.providers} + +
      +
      +
      ); + } +} \ No newline at end of file diff --git a/src/routes/app/routes/tables/routes/provider/components/Toolbar.js b/src/routes/app/routes/tables/routes/provider/components/Toolbar.js new file mode 100644 index 0000000..5fba5dd --- /dev/null +++ b/src/routes/app/routes/tables/routes/provider/components/Toolbar.js @@ -0,0 +1,65 @@ +import React from 'react'; +import IconMenu from 'material-ui/IconMenu'; +import IconButton from 'material-ui/IconButton'; +import FontIcon from 'material-ui/FontIcon'; +import NavigationExpandMoreIcon from 'material-ui/svg-icons/navigation/expand-more'; +import MenuItem from 'material-ui/MenuItem'; +import DropDownMenu from 'material-ui/DropDownMenu'; +import RaisedButton from 'material-ui/RaisedButton'; +import FlatButton from 'material-ui/FlatButton'; +import ContentAdd from 'material-ui/svg-icons/content/add'; +import { Toolbar, ToolbarGroup, ToolbarSeparator, ToolbarTitle } from 'material-ui/Toolbar'; +//import ProviderSelection from './ProviderSelection.js'; +import OrganizationComponent from '../../organizations/components/OrganizationComponent'; + +class ToolbarProviders extends React.Component { + constructor(props) { + super(props); + this.state = { + value: 1, + }; + } + + handleChange = (event, index, value) => this.setState({ value }); + // handleProvidersAdded = (providerList) => { + // if (this.props.onProvidersReceived) { + // this.props.onProvidersReceived(providerList); + // } + // } + + render() { + return ( + + + + + + + + + + +
      + + + + + } + > + + + + + + ); + } +} + +const ToolbarProviderComponent = (props) => ( + +); + + +module.exports = ToolbarProviderComponent; diff --git a/src/routes/app/routes/tables/routes/provider/index.js b/src/routes/app/routes/tables/routes/provider/index.js new file mode 100644 index 0000000..0b13ca2 --- /dev/null +++ b/src/routes/app/routes/tables/routes/provider/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'provider', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Page')); + }); + } +}; diff --git a/src/routes/app/routes/tables/routes/rides/components/Datatable.js b/src/routes/app/routes/tables/routes/rides/components/Datatable.js new file mode 100644 index 0000000..706af00 --- /dev/null +++ b/src/routes/app/routes/tables/routes/rides/components/Datatable.js @@ -0,0 +1,627 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import $ from 'jquery'; +import dt from 'datatables.net'; +import responsive from 'datatables.net-responsive'; +import buttons from 'datatables.net-buttons'; +import ToolbarSection from '../../../../ui/routes/components/components/Toolbar3.js'; +import IconButton from 'material-ui/IconButton'; +import FlatButton from 'material-ui/FlatButton'; +import { +Row, +Col, +Grid, +Panel, +Table, +PanelBody, +PanelHeader, +FormControl, +PanelContainer, +} from '@sketchpixy/rubix'; +import moment from 'moment'; +import { NEMTLocation } from '../../../../../components/NEMTLocation'; +import ContactList from '../../../../../components/ContactList'; +import Dialog from 'material-ui/Dialog'; +import ActionGrade from 'material-ui/svg-icons/action/grade'; +import MenuItem from 'material-ui/MenuItem'; +import MoreHorizIcon from 'material-ui/svg-icons/navigation/more-horiz'; +import IconMenu from 'material-ui/IconMenu'; +import { grey400, darkBlack, lightBlack } from 'material-ui/styles/colors'; +import Instance from '../../../../../../../components/Connection'; + +import ContentAdd from 'material-ui/svg-icons/content/add'; + +// const FloatingActionButtonExampleSimple = () => ( +//
      +// +// +// +//
      +// ) + +dt.responsive = responsive; +$.dataTable = dt; + + +const locationModal = () => ( +// + +); + +const formatTime = function (sec_num) { +var hours = Math.floor(sec_num / 3600); +var minutes = Math.floor((sec_num - (hours * 3600)) / 60); +var seconds = sec_num - (hours * 3600) - (minutes * 60); + +if (hours < 10) { hours = "0" + hours; } +if (minutes < 10) { minutes = "0" + minutes; } +if (seconds < 10) { seconds = "0" + seconds; } +return hours + ':' + minutes + ':' + seconds; +} + +const handleProviderChanged = function (destination) { +console.log(destination); +} + +const getDTList = function (rides) { +let list = []; +rides.forEach((r, i) => { + +var driverVehicle; +if (r.plate == null) { } else { driverVehicle = r.vehicle + ' | ' + r.plate }; + +var driverSummary; +if (r.driver_name == null) { driverSummary = "" } else { driverSummary = r.driver_name + ' | ' + r.driver_rating }; + +const iconButtonElement = ( + + + +); + +const flatButtonElement = ( + + + +); + + + + +let actionsMenu = []; + +actionsMenu.push( + +Ride + +); + +actionsMenu.push( + + Ride Details + +); + +actionsMenu.push( + +Visit + +); + +actionsMenu.push( + { +e.preventDefault(); +this.handleShare(e); +return false; +}}> + Share Ride +); + +if (r.status.key !== 'canceled') { +actionsMenu.push( + + Cancel +); +}; + + + + + +if (r.status.key === 'willCall') { +actionsMenu.push( + { +e.preventDefault(); +this.handleReady(e); +return false; +}}> + Ready Now +); +} + + + actionsMenu.push( + { +e.preventDefault(); +this.handleArchive(e); + return false; + }}> + Archive +); + + +list.push( + +{r.time} +{r.status} + +{/* Ride | + Details | +Visit | */} + + + + +{actionsMenu} + + + + +{r.memberName} +{r.trip_type} +{driverSummary} +{r.eta} +{r.duration} +{r.mileage} +{driverVehicle} +{r.member} + {r.scheduler} +{r.visitExternalID} +{moment(r.created).format('MM/DD/YY, h:mm a')} +{moment(r.updated).format('MM/DD/YY, h:mm a')} +{/* {r.created_user.name} */} + +); +}, this); +return list; +} + +class DatatableComponent extends React.Component { +state = { +items: [], +data: [], +list: [], +open: false, +archive:false, +confirmCancel: false, +message: "Are you sure you want to cancel this ride?" +} + +componentDidMount() { +const state = this; +Instance.getRawConn().get('/v1/nemt/rides').then((res) => { +let riders = res.data.map(v => { +var data = { +open: 'false', +message: "Are you sure you want to Cancel this ride?", +id: v.ride_uuid, +user_id: v.user.useruuid, +memberName: v.user.last + ", " + v.user.first, +member: v.user.member, +time: '', +pickup: '', +destination: '', +status: v.status.value, +eta: '', +duration: 0, +mileage: '0 miles', +vehicle: v.vehicle.color + ' ' + v.vehicle.make + ' ' + v.vehicle.model, +plate: v.vehicle.license_plate, +mobile: v.user.phonenumber, +email: v.user.email, +scheduler_email: v.created_user.email, +scheduler_phone: v.created_user.phonenumber, +driver_name: v.driver.first_name, +driver_rating: v.driver.rating, +driver_phone: v.driver.phone_number, +lyftID: v.internal_id, +rideID: v.ride_uuid, +visitID: v.visit.visit_uuid, +visitExternalID: v.visit.visit_external_id, +action: '', +scheduler: v.created_user.last + ", " + v.created_user.first, +created: v.create_at, +updated: v.update_at, +confirmCancel: false, +trip_type: v.trip_type.value.replace(' / Will Call', ''), +}; + +if (v.pickup_time) data.time = new Date(v.pickup_time); +if (v.route.origin.name && v.route.origin.name !== '') data.pickup = v.route.origin.name; +else data.pickup = v.route.origin.address; + +if (v.route.destination.name && v.route.destination.name !== '') data.destination = v.route.destination.name; +else data.destination = v.route.destination.address; + +if (v.route.distance) data.mileage = v.route.distance + ' miles'; +if (v.route.duration) data.duration = formatTime(v.route.duration); +if (v.route.eta) data.eta = formatTime(v.route.eta); + +if (v.status.key === 'willCall') { +data.time = '' +} else { +data.time = moment(data.time).format('MM/DD/YY, h:mm a') +} +return data; +}); + +let list = getDTList(riders); + +$.fn.dataTable.moment = function (format, locale) { +var types = $.fn.dataTable.ext.type; + +// Add type detection +types.detect.unshift(function (d) { +return moment(d, format, locale, true).isValid() ? +'moment-' + format : +null; +}); + +// Add sorting method - use an integer for the sorting +types.order['moment-' + format + '-pre'] = function (d) { +return moment(d, format, locale, true).unix(); +}; +}; + +$.fn.dataTable.moment('MM/DD/YYYY h:mm a'); + +state.setState(Object.assign(state.state, { list: list })); + +// Delete a record + + + +$(ReactDOM.findDOMNode(state.example)).on('click', 'menuitem.a.cancel_ride', function (e) { +e.preventDefault(); + + +const table = $(ReactDOM.findDOMNode(state.example)).DataTable(); +const obj = table.row($(this).closest('tr')).data(); +state.setState(Object.assign(state.state, { open: true })); +// console.log(obj) +if (state.state.confirmCancel) +// if (true ) +{ +let rideID = obj.lyftID; +let url = '/v1/nemt/rides/' + rideID + '/cancel' +Instance.getRawConn().post(url).then(function (res) { +state.setState(Object.assign(state.state, { message: 'NEMT ride #' + rideID + ' has been cancelled' })); + +console.log(res.data); +}).catch(function (err) { +state.setState(Object.assign(state.state, { message: 'Error: ' + JSON.stringify(res) })); + +// alert('Error: ' + JSON.stringify(res)); +console.error(err); +}); +} +}); + +const dt = $(ReactDOM.findDOMNode(state.example)) +.addClass('nowrap') +.dataTable({ +responsive: true, +dom: 'Bfrtip', +buttons: [ +'copy', 'pdf' +], +// columns: TABLE_COLUMNS_SORT_STYLE, +responsive: true, +"bStateSave": true, +details: { +type: 'inline' +}, +columnDefs: [ +{ targets: [-1, -3], orderable: true, className: 'dt-body-right mdl-data-table__cell--non-numeric' } +], +order: [[0, 'desc']] +}); + +dt.on('column-visibility.dt', function (e, settings, column, state) { +console.log( +'Column ' + column + ' has changed to ' + (state ? 'visible' : 'hidden') +); +}); + +dt.on('responsive-display', function (e, datatable, row, showHide, update) { +console.log('Details for row ' + row.index() + ' ' + (showHide ? 'shown' : 'hidden')); +}); + +this.decorateButtons(); +this.decorateSelect(); +this.decorateSearchBar(); +this.decorateColumns(); +}).catch((err) => { +console.error('Error returned by getRides(): ', err); +}); +} + +decorateColumns() { +let cols = $('td'); +let colStyle = { +'font-family': 'Roboto, sans-serif', +'font-size': '13px', +'font-weight': '300', +'text-align': 'left', +}; +cols.css(colStyle); +cols.removeClass('sorting_1'); + +let headers = $('th'); +let headerStyle = { +'color': 'rgb(158, 158, 158)', +'text-align': 'left', +'font-weight': '600', +'font-size': '12px' +}; +headers.css(headerStyle); + +let oddRows = $('.odd'); +let evenRows = $('.even'); + +let oddStyle = { +'background': 'rgba(127, 221, 233, 0.4)', +'text-shadow': 'none', +'border-bottom': '1px solid rgb(224, 224, 224)', +'color': 'rgba(0, 0, 0, 0.87)', +'height': '45px' +}; +oddRows.css(oddStyle); + +let evenStyle = oddStyle; +evenStyle['background'] = '#fff'; + +evenRows.css(evenStyle); +} + +decorateSelect() { +let instance = this; +let selectElement = $('select[class]'); +selectElement.addClass('mdl'); + +selectElement.click(function () { +instance.decorateButtons(); +}); + +let selectLabel = $('#DataTables_Table_0_length > label'); +let style = { +'color': 'rgb(158, 158, 158)', +'text-align': 'left', +'font-weight': '500', +'font-size': '11px' +}; +selectLabel.css(style); +} + +decorateSearchBar() { +let instance = this; + +let searchbar = $('input[type="search"]'); +searchbar.bind('input', function () { +instance.decorateButtons(); +instance.decorateColumns(); +}); + +searchbar.addClass('mdl-textfield__input'); +searchbar.attr('placeholder', ''); + +let searchLabel = $('#DataTables_Table_0_filter > label'); +searchLabel.css({ 'color': '#fff' }); +searchbar.css({ 'color': 'rgb(158, 158, 158)' }) + +let searchFilter = $('#DataTables_Table_0_filter'); +searchFilter.append(''); +} + +decorateButtons() { +let instance = this; +let paginateButtons = $('a.paginate_button'); +paginateButtons.addClass('mdl-button'); + +let selectedButton = $('a.paginate_button.current'); +selectedButton.addClass('mdl-button mdl-button--raised mdl-button--colored'); + +let style = { +'background': 'rgb(0, 188, 212)', +'font-weight': '400', +}; +selectedButton.css(style); + +paginateButtons.click(function () { +instance.decorateButtons(); +instance.decorateColumns(); +}); + +let sortingButtons = $('th.sorting, th.sorting_asc, th.sorting_desc'); +sortingButtons.click(function () { +instance.decorateButtons(); +instance.decorateColumns(); +}); + +let entriesLabel = $('#DataTables_Table_0_info'); +entriesLabel.css({ +'color': 'rgb(158, 158, 158)', +'text-align': 'left', +'font-weight': '400', +'font-size': '12px' +}); +} + +handleETA = (e) => { +e.preventDefault() +const state = this; +if (state.props.data !== undefined) { +state.setState(Object.assign(state.state, state.props.data)); +} + +if (state.state.eta) { +let rideID = state.state.ride.ride_uuid; +let message = 'Estimated Distance : ' + state.state.eta.distance_miles + ' miles\nEstimated Time: ' + state.state.eta.formatted_time + +let url = '/v1/nemt/rides/' + rideID + '/message'; +url = encodeURI(url); +Instance.getRawConn().post(url, { message: message }).then(function (res) { +alert('ETA Sent'); +}).catch(function (err) { +console.error(err); +}); +} +} + +handleReady(e) { +let self = this; +Instance.getRawConn().post(`/v1/nemt/rides/${self.state.ride.ride_uuid}/ready`).then((res) => { +if (self.props.onRideChange) { +self.props.onRideChange(res.data); +} +self.setState(Object.assign(self.state, { dialogMessage: `You ride has been requested`, dialogTitleMessage: 'Return Ride', dialogOpen: true, dialogType: 'OK' })); +}).catch(console.error); +} + +handleClose(e) { +let self = this; +self.setState(Object.assign(self.state, { dialogMessage: `Do you want to cancel the this ride?`, dialogTitleMessage: 'Cancel Ride', dialogOpen: false })); +} + +handleCancel(e) { +let self = this; +self.setState(Object.assign(self.state, { +dialogMessage: `Do you want to cancel the this ride?`, dialogTitleMessage: 'Cancel Ride', dialogOpen: true, dialogType: 'YesNo' +})); +} + +handleArchive = () => { +this.setState(Object.assign({ archive: true })); +console.log('handleArchive') +}; + +handleOpen = () => { +this.setState(Object.assign({ open: true })); +console.log('handleOpen') +}; + +handleCloseYes = () => { +this.setState(Object.assign({ confirmCancel: true, open: false })); +console.log('handleCloseYes') +}; + +handleClose = () => { +this.setState(Object.assign({ confirmCancel: false, open: false })); +// this.setState({ open: false, confirmCancel:false }); +console.log('handleClose') +}; + +render() { +const actions = [ +, +, +]; + +return ( +
      + +{this.state.message} + +{/* < FloatingActionButtonExampleSimple /> */} + this.example = c} className='display' cellSpacing='0' width='100%'> + + + + + + + + + + +{/* */} + + + + + + + + + + + + + + +{this.state.list} + +
      Pickup TimeStatusActionsOriginDestinationMemberRide TypeDestinationDriverETADurationMileageVehicleMember IDSchedulerExternal IDCreatedUpdated
      +
      +); + +} +} + +export default class Datatablesjs extends React.Component { +render() { +return ( + + + + + + + + + +
      + +
      +
      +
      +
      +
      + +
      +); +} +} \ No newline at end of file diff --git a/src/routes/app/routes/tables/routes/rides/components/Page.js b/src/routes/app/routes/tables/routes/rides/components/Page.js new file mode 100644 index 0000000..75daf75 --- /dev/null +++ b/src/routes/app/routes/tables/routes/rides/components/Page.js @@ -0,0 +1,32 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; +import Datatable from './Datatable'; +import FlatButton from 'material-ui/FlatButton'; +import BottomNavigationExampleSimple from '../../../../ui/routes/components/components/BottomNavigation'; +import IconButton from 'material-ui/IconButton'; +import ToolbarSection from '../../../../ui/routes/components/components/Toolbar3.js'; +import FloatingActionButton from 'material-ui/FloatingActionButton'; +import ContentAdd from 'material-ui/svg-icons/content/add'; + +const FloatingActionButtonExampleSimple = () => ( +
      + + + +
      +) +const Page = () => ( +
      +

      Manage Rides

      + +
      + +
      + +
      + +
      +
      +
      +); +module.exports = Page; diff --git a/src/routes/app/routes/tables/routes/rides/index.js b/src/routes/app/routes/tables/routes/rides/index.js new file mode 100644 index 0000000..feca2f6 --- /dev/null +++ b/src/routes/app/routes/tables/routes/rides/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'rides', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Page')); + }); + } +}; diff --git a/src/routes/app/routes/tables/routes/static/components/RubixTables.js b/src/routes/app/routes/tables/routes/static/components/RubixTables.js new file mode 100644 index 0000000..6646b2a --- /dev/null +++ b/src/routes/app/routes/tables/routes/static/components/RubixTables.js @@ -0,0 +1,426 @@ +import React from 'react'; +import { + Row, + Col, + Grid, + Panel, + Table, + PanelBody, + PanelHeader, + FormControl, + PanelContainer, +} from '@sketchpixy/rubix'; + +const RubixTables = () => ( +
      + + + + + + + + +

      Regular table

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      #First NameLast NameUsername
      1MarkOtto@mdo
      2JacobThornton@fat
      3Larrythe Bird@twitter
      + +
      +
      +
      +
      +
      + + + + + + +

      Bordered table

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      #First NameLast NameUsername
      1MarkOtto@mdo
      MarkOtto@TwBootstrap
      2JacobThornton@fat
      3Larrythe Bird@twitter
      + +
      +
      +
      +
      +
      + + + + + + +

      Condensed table

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      #First NameLast NameUsername
      1MarkOtto@mdo
      2JacobThornton@fat
      3Larrythe Bird@twitter
      + +
      +
      +
      +
      +
      + + + + + + +

      Bordered, striped and condensed table

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      #First NameLast NameUsername
      1MarkOtto@mdo
      2JacobThornton@fat
      3Larrythe Bird@twitter
      + +
      +
      +
      +
      +
      + + + + + + + + +

      Striped table

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      #First NameLast NameUsername
      1MarkOtto@mdo
      2JacobThornton@fat
      3Larrythe Bird@twitter
      + +
      +
      +
      +
      +
      + + + + + + +

      Hover table

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      #First NameLast NameUsername
      1MarkOtto@mdo
      2JacobThornton@fat
      3Larrythe Bird@twitter
      + +
      +
      +
      +
      +
      + + + + + + +

      Striped and colored table

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      #Column headingColumn headingColumn heading
      1Column contentColumn contentColumn content
      2Column contentColumn contentColumn content
      3Column contentColumn contentColumn content
      4Column contentColumn contentColumn content
      5Column contentColumn contentColumn content
      6Column contentColumn contentColumn content
      7Column contentColumn contentColumn content
      8Column contentColumn contentColumn content
      9Column contentColumn contentColumn content
      + +
      +
      +
      +
      +
      + +
      + + + + + + + + +

      Table bordered and responsive

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      #Table headingTable headingTable headingTable headingTable headingTable heading
      1Table cellTable cellTable cellTable cellTable cellTable cell
      2Table cellTable cellTable cellTable cellTable cellTable cell
      3Table cellTable cellTable cellTable cellTable cellTable cell
      + +
      +
      +
      +
      +
      + +
      +
      +); + +module.exports = RubixTables; diff --git a/src/routes/app/routes/tables/routes/static/components/StaticTables.js b/src/routes/app/routes/tables/routes/static/components/StaticTables.js new file mode 100644 index 0000000..62a8551 --- /dev/null +++ b/src/routes/app/routes/tables/routes/static/components/StaticTables.js @@ -0,0 +1,232 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; +import RubixTables from './RubixTables'; + +const MaterialTable = () => ( +
      +

      Material Table

      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      #CodeMaterialQuantityUnit price
      1AZ90Acrylic (Transparent)25$2.90
      2BC30Plywood (Birch)50$1.25
      3DL32Laminate (Gold on Blue)10$2.35
      +
      +
      +); + +const TableStyle = () => ( +
      +

      Table Style

      +
      +
      +
      +
      Basic table
      +
      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      #MaterialQuantityUnit price
      1Acrylic (Transparent)25$2.90
      2Plywood (Birch)50$1.25
      3Laminate (Gold on Blue)10$2.35
      +
      + +
      +
      +
      +
      +
      +
      Striped table
      +
      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      #MaterialQuantityUnit price
      1Acrylic (Transparent)25$2.90
      2Plywood (Birch)50$1.25
      3Laminate (Gold on Blue)10$2.35
      +
      + +
      +
      +
      +
      + +
      +
      +
      +
      Bordered table
      +
      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      #MaterialQuantityUnit price
      1Acrylic (Transparent)25$2.90
      2Plywood (Birch)50$1.25
      3Laminate (Gold on Blue)10$2.35
      +
      + +
      +
      +
      +
      +
      +
      Contextual table
      +
      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      #MaterialQuantityUnit price
      1Acrylic (Transparent)25$2.90
      2Plywood (Birch)50$1.25
      3Laminate (Gold on Blue)10$2.35
      +
      + +
      +
      +
      +
      +
      +); + +const Page = () => ( +
      + +
      +
      +
      +
      +
      +); + +module.exports = Page; diff --git a/src/routes/app/routes/tables/routes/static/index.js b/src/routes/app/routes/tables/routes/static/index.js new file mode 100644 index 0000000..f1552bc --- /dev/null +++ b/src/routes/app/routes/tables/routes/static/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'static', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/StaticTables')); + }); + }, +}; diff --git a/src/routes/app/routes/tables/routes/users/components/Datatable.js b/src/routes/app/routes/tables/routes/users/components/Datatable.js new file mode 100644 index 0000000..2e5581a --- /dev/null +++ b/src/routes/app/routes/tables/routes/users/components/Datatable.js @@ -0,0 +1,283 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import $ from 'jquery'; +import dt from 'datatables.net'; +import responsive from 'datatables.net-responsive'; +import FontIcon from 'material-ui/FontIcon'; +import IconButton from 'material-ui/IconButton'; +import RaisedButton from 'material-ui/RaisedButton'; +import moment from 'moment'; + +// import ContentAdd from 'material-ui/svg-icons/content/add'; + +import { + Row, + Col, + Grid, + Panel, + Table, + PanelBody, + PanelHeader, + FormControl, + PanelContainer, +} from '@sketchpixy/rubix'; + +import ContactList from '../../../../../components/ContactList'; +import Dialog from 'material-ui/Dialog'; +import Instance from '../../../../../../../components/Connection'; + +dt.responsive = responsive; +$.dataTable = dt; + +function formatPhoneNumber(s) { + var s2 = ("" + s).replace(/\D/g, ''); + var m = s2.match(/^(\d{3})(\d{3})(\d{4})$/); + return (!m) ? null : "(" + m[1] + ") " + m[2] + "-" + m[3]; +} + +const getDTList = function (member) { + let list = []; + + member.forEach((r, i) => { + let status = "Active"; + if (!r.active) { + status = "Inactive"; + } + if (r.profiles && r.profiles.length > 0) { + if (!r.profiles[0].active) { + status = "Inactive"; + } + if (r.profiles[0].suspended) { + status = "Suspended"; + } + if (r.profiles[0].blocked) { + status = "Blocked"; + } + } + + list.push( + + {/* . */} + {r.name} + + {r.profiles[0].organization.name} + {r.profiles[0].organization.type.name} + {r.profiles[0].name} + {r.email} + {r.phonenumber} + {status} + {r.profiles[0].name} + {moment(r.create).format('MM/DD/YYYY h:mm a')} + {moment(r.updateat).format('MM/DD/YYYY h:mm a')} + {r.profiles[0].name} + + ); + }, this); + + return list; +} + +class DatatableComponent extends React.Component { + state = { + users: [] + } + + componentDidMount() { + const state = this + Instance.getRawConn().get('/v1/nemt/users/portal').then((res) => { + const users = res.data + console.log(users); + let usersList = getDTList(users); + state.setState(Object.assign(state.state, { users: usersList })); + $(ReactDOM.findDOMNode(state.example)) + .addClass('nowrap') + .dataTable({ + responsive: true, + dom: 'Bfrtip', + buttons: [ + 'copy', 'pdf' + ], + // columns: TABLE_COLUMNS_SORT_STYLE, + responsive: true, + "bStateSave": true, + details: { + type: 'inline' + }, + columnDefs: [ + { targets: [-1, -3], className: 'dt-body-right mdl-data-table__cell--non-numeric' } + ] + }); + state.decorateButtons(); + state.decorateSelect(); + state.decorateSearchBar(); + state.decorateColumns(); + }).catch((err) => { console.error(err); }); + } + + decorateColumns() { + let cols = $('td'); + let colStyle = { + 'font-family': 'Roboto, sans-serif', + 'font-size': '13px', + 'font-weight': '300', + 'text-align': 'left', + }; + cols.css(colStyle); + cols.removeClass('sorting_1'); + + let headers = $('th'); + let headerStyle = { + 'color': 'rgb(158, 158, 158)', + 'text-align': 'left', + 'font-weight': '600', + 'font-size': '12px' + }; + headers.css(headerStyle); + + let oddRows = $('.odd'); + let evenRows = $('.even'); + + let oddStyle = { + 'background': 'rgba(127, 221, 233, 0.4)', + 'text-shadow': 'none', + 'border-bottom': '1px solid rgb(224, 224, 224)', + 'color': 'rgba(0, 0, 0, 0.87)', + 'height': '45px' + }; + oddRows.css(oddStyle); + + let evenStyle = oddStyle; + evenStyle['background'] = '#fff'; + + evenRows.css(evenStyle); + } + + decorateSelect() { + let instance = this; + let selectElement = $('select[class]'); + selectElement.addClass('mdl'); + + selectElement.click(function () { + instance.decorateButtons(); + }); + + let selectLabel = $('#DataTables_Table_0_length > label'); + let style = { + 'color': 'rgb(158, 158, 158)', + 'text-align': 'left', + 'font-weight': '500', + 'font-size': '11px' + }; + selectLabel.css(style); + } + + decorateSearchBar() { + let instance = this; + + let searchbar = $('input[type="search"]'); + searchbar.bind('input', function () { + instance.decorateButtons(); + instance.decorateColumns(); + }); + + searchbar.addClass('mdl-textfield__input'); + searchbar.attr('placeholder', ''); + + let searchLabel = $('#DataTables_Table_0_filter > label'); + searchLabel.css({ 'color': '#fff' }); + searchbar.css({ 'color': 'rgb(158, 158, 158)' }) + + let searchFilter = $('#DataTables_Table_0_filter'); + searchFilter.append(''); + } + + decorateButtons() { + let instance = this; + let paginateButtons = $('a.paginate_button'); + paginateButtons.addClass('mdl-button'); + + let selectedButton = $('a.paginate_button.current'); + selectedButton.addClass('mdl-button mdl-button--raised mdl-button--colored'); + + let style = { + 'background': 'rgb(0, 188, 212)', + 'font-weight': '400', + }; + selectedButton.css(style); + + paginateButtons.click(function () { + instance.decorateButtons(); + instance.decorateColumns(); + }); + + let sortingButtons = $('th.sorting, th.sorting_asc, th.sorting_desc'); + sortingButtons.click(function () { + instance.decorateButtons(); + instance.decorateColumns(); + }); + + let entriesLabel = $('#DataTables_Table_0_info'); + entriesLabel.css({ + 'color': 'rgb(158, 158, 158)', + 'text-align': 'left', + 'font-weight': '400', + 'font-size': '12px' + }); + } + + render() { + return ( + + this.example = c} className='display' cellSpacing='0' width='100%'> + + + + + + + + + + + + + + + + + + {this.state.users} + +
      NameActionsOrganizationTypeRoleEmailMobileStatusCreatorCreatedUpdatedEditor
      + + ); + + + + } +} + +export default class Datatablesjs extends React.Component { + render() { + return ( + + + + + + + + + +
      + +
      +
      +
      +
      +
      + +
      + ); + } +} diff --git a/src/routes/app/routes/tables/routes/users/components/Page.js b/src/routes/app/routes/tables/routes/users/components/Page.js new file mode 100644 index 0000000..8524b51 --- /dev/null +++ b/src/routes/app/routes/tables/routes/users/components/Page.js @@ -0,0 +1,59 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; +import FloatingActionButton from 'material-ui/FloatingActionButton'; +import ContentAdd from 'material-ui/svg-icons/content/add'; + +import { + authorize, + bcbsaScheduler, + bcbsiAdmin, + bcbsiScheduler, + planAdmin, + programsupportSupport, + providerAdmin, + superAdmin, + techsupportAdmin, +} from 'utils/authorization'; + +import Datatable from './Datatable'; + +const style = { + marginRight: 20, float: 'right' +}; + +const FloatingActionButtonExampleSimple = () => ( +
      + + + +
      +); + +const Page = () => ( +
      + + + +
      + +
      + +

      Authorized Users

      + +
      +
      +
      +); + +const authorization = authorize( + bcbsaScheduler, + bcbsiAdmin, + bcbsiScheduler, + planAdmin, + programsupportSupport, + providerAdmin, + superAdmin, + techsupportAdmin, +); + +module.exports = authorization(Page); diff --git a/src/routes/app/routes/tables/routes/users/index.js b/src/routes/app/routes/tables/routes/users/index.js new file mode 100644 index 0000000..a91b497 --- /dev/null +++ b/src/routes/app/routes/tables/routes/users/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'authorizedusers', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Page')); + }); + }, +}; diff --git a/src/routes/app/routes/tables/routes/visits/components/Datatable.js b/src/routes/app/routes/tables/routes/visits/components/Datatable.js new file mode 100644 index 0000000..f658bdc --- /dev/null +++ b/src/routes/app/routes/tables/routes/visits/components/Datatable.js @@ -0,0 +1,281 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import $ from 'jquery'; +import dt from 'datatables.net'; +import responsive from 'datatables.net-responsive'; +import IconButton from 'material-ui/IconButton'; +import RaisedButton from 'material-ui/RaisedButton'; +import ContentAdd from 'material-ui/svg-icons/content/add'; +import RoadTripLink from '../../../../../components/RoadtripLink'; + +import { + Row, + Col, + Grid, + Panel, + Table, + PanelBody, + PanelHeader, + FormControl, + PanelContainer, +} from '@sketchpixy/rubix'; +import Instance from '../../../../../../../components/Connection'; + +dt.responsive = responsive; +$.dataTable = dt; + +function formatPhoneNumber(s) { + var s2 = ("" + s).replace(/\D/g, ''); + var m = s2.match(/^(\d{3})(\d{3})(\d{4})$/); + return (!m) ? null : "(" + m[1] + ") " + m[2] + "-" + m[3]; +} + +const handleRide = function (r) { + location.href = `/#/app/page/map/${r.ride_uuid}`; +} + +const getDTList = function (member) { + let list = []; + + member.forEach((r, i) => { + list.push( + + {moment(r.visit_datetime).format('MM/DD/YYYY - h:mm a')} + {r.provider.name} + {r.user.name} + + {r.user.member} + {/* {r.visit_status.value} */} + {r.provider.id} + {r.visit_uuid} + {r.visit_external_id} + + {r.created_user.name} + {moment(r.created).format('MM/DD/YYYY - h:mm a')} + {moment(r.updated).format('MM/DD/YYYY - h:mm a')} + + ); + }, this); + + return list; +} + +class DatatableComponent extends React.Component { + state = { + visits: [] + } + + componentDidMount() { + const state = this + Instance.getRawConn().get('/v1/nemt/visits/').then((res) => { + let visits = res.data; + + let visitlist = getDTList(visits); + $.fn.dataTable.moment = function (format, locale) { + var types = $.fn.dataTable.ext.type; + + // Add type detection + types.detect.unshift(function (d) { + return moment(d, format, locale, true).isValid() ? + 'moment-' + format : + null; + }); + + // Add sorting method - use an integer for the sorting + types.order['moment-' + format + '-pre'] = function (d) { + return moment(d, format, locale, true).unix(); + }; + }; + + $.fn.dataTable.moment('MM/DD/YYYY - h:mm a'); + + state.setState(Object.assign(state.state, { visits: visitlist })); + $(ReactDOM.findDOMNode(state.example)) + .addClass('nowrap') + .dataTable({ + responsive: true, + dom: 'Bfrtip', + buttons: [ + 'copy', 'pdf' + ], + "bStateSave": true, + details: { + type: 'inline' + }, + columnDefs: [ + { targets: [-1, -3], className: 'dt-body-right mdl-data-table__cell--non-numeric' } + ] + }); + state.decorateButtons(); + state.decorateSelect(); + state.decorateSearchBar(); + state.decorateColumns(); + }).catch((err) => { console.error(err); }); + } + + decorateColumns() { + let cols = $('td'); + let colStyle = { + 'font-family': 'Roboto, sans-serif', + 'font-size': '13px', + 'font-weight': '300', + 'text-align': 'left', + }; + cols.css(colStyle); + cols.removeClass('sorting_1'); + + let headers = $('th'); + let headerStyle = { + 'color': 'rgb(158, 158, 158)', + 'text-align': 'left', + 'font-weight': '600', + 'font-size': '12px' + }; + headers.css(headerStyle); + + let oddRows = $('.odd'); + let evenRows = $('.even'); + + let oddStyle = { + 'background': 'rgba(127, 221, 233, 0.4)', + 'text-shadow': 'none', + 'border-bottom': '1px solid rgb(224, 224, 224)', + 'color': 'rgba(0, 0, 0, 0.87)', + 'height': '45px' + }; + oddRows.css(oddStyle); + + let evenStyle = oddStyle; + evenStyle['background'] = '#fff'; + + evenRows.css(evenStyle); + } + + decorateSelect() { + let instance = this; + let selectElement = $('select[class]'); + selectElement.addClass('mdl'); + + selectElement.click(function () { + instance.decorateButtons(); + }); + + let selectLabel = $('#DataTables_Table_0_length > label'); + let style = { + 'color': 'rgb(158, 158, 158)', + 'text-align': 'left', + 'font-weight': '500', + 'font-size': '11px' + }; + selectLabel.css(style); + } + + decorateSearchBar() { + let instance = this; + + let searchbar = $('input[type="search"]'); + searchbar.bind('input', function () { + instance.decorateButtons(); + instance.decorateColumns(); + }); + + searchbar.addClass('mdl-textfield__input'); + searchbar.attr('placeholder', ''); + + let searchLabel = $('#DataTables_Table_0_filter > label'); + searchLabel.css({ 'color': '#fff' }); + searchbar.css({ 'color': 'rgb(158, 158, 158)' }) + + let searchFilter = $('#DataTables_Table_0_filter'); + searchFilter.append(''); + } + + decorateButtons() { + let instance = this; + let paginateButtons = $('a.paginate_button'); + paginateButtons.addClass('mdl-button'); + + let selectedButton = $('a.paginate_button.current'); + selectedButton.addClass('mdl-button mdl-button--raised mdl-button--colored'); + + let style = { + 'background': 'rgb(0, 188, 212)', + 'font-weight': '400', + }; + selectedButton.css(style); + + paginateButtons.click(function () { + instance.decorateButtons(); + instance.decorateColumns(); + }); + + let sortingButtons = $('th.sorting, th.sorting_asc, th.sorting_desc'); + sortingButtons.click(function () { + instance.decorateButtons(); + instance.decorateColumns(); + }); + + let entriesLabel = $('#DataTables_Table_0_info'); + entriesLabel.css({ + 'color': 'rgb(158, 158, 158)', + 'text-align': 'left', + 'font-weight': '400', + 'font-size': '12px' + }); + } + + render() { + return ( + this.example = c} className='display' cellSpacing='0' width='100%'> + + + + + + + + {/* */} + + + + + + + + + + + {this.state.visits} + +
      Visit TimeProviderMember Rides Subscriber IDStatusProvider IDVisit IDExternal IDSchedulerCreatedUpdated
      + + ); + + + } +} + +export default class Datatablesjs extends React.Component { + render() { + return ( + + + + + + + + + +
      + +
      +
      +
      +
      +
      + +
      + ); + } +} diff --git a/src/routes/app/routes/tables/routes/visits/components/Page.js b/src/routes/app/routes/tables/routes/visits/components/Page.js new file mode 100644 index 0000000..5cbaa39 --- /dev/null +++ b/src/routes/app/routes/tables/routes/visits/components/Page.js @@ -0,0 +1,14 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; +import Datatable from './Datatable'; +const Page = () => ( +
      + +

      Visits

      + +
      +
      +
      +); + +module.exports = Page; diff --git a/src/routes/app/routes/tables/routes/visits/index.js b/src/routes/app/routes/tables/routes/visits/index.js new file mode 100644 index 0000000..c71eb71 --- /dev/null +++ b/src/routes/app/routes/tables/routes/visits/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'visits', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Page')); + }); + } +}; diff --git a/src/routes/app/routes/ui/index.js b/src/routes/app/routes/ui/index.js new file mode 100644 index 0000000..6135f34 --- /dev/null +++ b/src/routes/app/routes/ui/index.js @@ -0,0 +1,23 @@ +module.exports = { + path: 'ui', + getChildRoutes(partialNextState, cb) { + require.ensure([], (require) => { + cb(null, [ + require('./routes/boxes'), + require('./routes/buttons'), + require('./routes/callToActions'), + require('./routes/cards'), + require('./routes/colors'), + require('./routes/components'), + require('./routes/featureCallouts'), + require('./routes/grids'), + require('./routes/hover'), + require('./routes/iconBoxes'), + require('./routes/icons'), + require('./routes/lists'), + require('./routes/menus'), + require('./routes/timeline'), + ]); + }); + } +}; diff --git a/src/routes/app/routes/ui/routes/boxes/components/Boxes.js b/src/routes/app/routes/ui/routes/boxes/components/Boxes.js new file mode 100644 index 0000000..e491fac --- /dev/null +++ b/src/routes/app/routes/ui/routes/boxes/components/Boxes.js @@ -0,0 +1,173 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; + +const BasicBoxes = () => ( +
      +

      Basic Boxes

      +
      +
      +
      +
      Box Header
      +
      + This is the body of box component. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, quasi nam. Nisi assumenda nulla consequatur perferendis, voluptatum, laborum provident eos amet quos, ullam possimus facilis quasi? Magnam optio voluptates ipsam. +
      +
      +
      +
      +
      +
      Box Header
      +
      + This is the body of box component. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, quasi nam. Nisi assumenda nulla consequatur perferendis, voluptatum, laborum provident eos amet quos, ullam possimus facilis quasi? Magnam optio voluptates ipsam. +
      +
      +
      +
      +
      +
      Box Header
      +
      + This is the body of box component. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, quasi nam. Nisi assumenda nulla consequatur perferendis, voluptatum, laborum provident eos amet quos, ullam possimus facilis quasi? Magnam optio voluptates ipsam. +
      +
      +
      +
      +
      +) + +const BoxesWithStyle = () => ( +
      +

      Boxes with Style

      +
      +
      +
      +
      Box with Divider
      +
      +
      + This is the body of box component. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, quasi nam. Nisi assumenda nulla consequatur perferendis, voluptatum, laborum provident eos amet quos, ullam possimus facilis quasi? Magnam optio voluptates ipsam. +
      +
      +
      + +
      +
      +
      No Background Color
      +
      + This is the body of box component. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, quasi nam. Nisi assumenda nulla consequatur perferendis, voluptatum, laborum provident eos amet quos, ullam possimus facilis quasi? Magnam optio voluptates ipsam. +
      +
      +
      + +
      +
      +
      Transparent Box
      +
      + This is the body of box component. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, quasi nam. Nisi assumenda nulla consequatur perferendis, voluptatum, laborum provident eos amet quos, ullam possimus facilis quasi? Magnam optio voluptates ipsam. +
      +
      +
      +
      +
      +) + +const BoxColors = () => ( +
      +

      Box Colors

      +
      +
      +
      +
      Box Header
      +
      + This is the body of box component. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, quasi nam. Nisi assumenda nulla consequatur perferendis, voluptatum, laborum provident eos amet quos, ullam possimus facilis quasi? Magnam optio voluptates ipsam. +
      +
      +
      +
      +
      +
      Box Header
      +
      + This is the body of box component. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, quasi nam. Nisi assumenda nulla consequatur perferendis, voluptatum, laborum provident eos amet quos, ullam possimus facilis quasi? Magnam optio voluptates ipsam. +
      +
      +
      +
      +
      +
      +
      +
      Box Header
      +
      + This is the body of box component. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, quasi nam. Nisi assumenda nulla consequatur perferendis, voluptatum, laborum provident eos amet quos, ullam possimus facilis quasi? Magnam optio voluptates ipsam. +
      +
      +
      +
      +
      +
      Box Header
      +
      + This is the body of box component. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, quasi nam. Nisi assumenda nulla consequatur perferendis, voluptatum, laborum provident eos amet quos, ullam possimus facilis quasi? Magnam optio voluptates ipsam. +
      +
      +
      +
      +
      +
      +
      +
      Box Header
      +
      + This is the body of box component. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, quasi nam. Nisi assumenda nulla consequatur perferendis, voluptatum, laborum provident eos amet quos, ullam possimus facilis quasi? Magnam optio voluptates ipsam. +
      +
      +
      +
      +
      +
      Box Header
      +
      + This is the body of box component. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, quasi nam. Nisi assumenda nulla consequatur perferendis, voluptatum, laborum provident eos amet quos, ullam possimus facilis quasi? Magnam optio voluptates ipsam. +
      +
      +
      +
      +
      +
      +
      +
      Box Header
      +
      +
      + This is the body of box component. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, quasi nam. Nisi assumenda nulla consequatur perferendis, voluptatum, laborum provident eos amet quos, ullam possimus facilis quasi? Magnam optio voluptates ipsam. +
      +
      +
      +
      +
      +
      Box Header
      +
      +
      + This is the body of box component. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, quasi nam. Nisi assumenda nulla consequatur perferendis, voluptatum, laborum provident eos amet quos, ullam possimus facilis quasi? Magnam optio voluptates ipsam. +
      +
      +
      +
      +
      +
      Box Header
      +
      +
      + This is the body of box component. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, quasi nam. Nisi assumenda nulla consequatur perferendis, voluptatum, laborum provident eos amet quos, ullam possimus facilis quasi? Magnam optio voluptates ipsam. +
      +
      +
      +
      +
      +) + + +const Page = () => { + return ( +
      + +
      +
      +
      +
      +
      + ) +} + +module.exports = Page; diff --git a/src/routes/app/routes/ui/routes/boxes/index.js b/src/routes/app/routes/ui/routes/boxes/index.js new file mode 100644 index 0000000..e1ceaf2 --- /dev/null +++ b/src/routes/app/routes/ui/routes/boxes/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'boxes', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Boxes')); + }); + } +}; diff --git a/src/routes/app/routes/ui/routes/buttons/components/Buttons.js b/src/routes/app/routes/ui/routes/buttons/components/Buttons.js new file mode 100644 index 0000000..2526b67 --- /dev/null +++ b/src/routes/app/routes/ui/routes/buttons/components/Buttons.js @@ -0,0 +1,151 @@ +import React from 'react'; +import FlatButton from 'material-ui/FlatButton'; +import RaisedButton from 'material-ui/RaisedButton'; +import FloatingActionButton from 'material-ui/FloatingActionButton'; +import ContentAdd from 'material-ui/svg-icons/content/add'; +import IconButton from 'material-ui/IconButton'; +import QueueAnim from 'rc-queue-anim'; + + +const mWidthStyle = { + minWidth: '135px' +}; + +const FAB = () => ( +
      +
      + +
      +
      FAB
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +
      + +
      +
      + +
      +
      Icon Button
      +
      + + + + + + + + + +
      +
      + +
      +
      +); + +const Raised = () => ( +
      +
      + +
      +
      Raised
      +
      +
      +
      +
      +
      +
      +
      + +
      +
      + +
      +
      Flat
      +
      +
      +
      +
      +
      +
      +
      + +
      +
      +); + +const Raised2 = () => ( +
      +
      + +
      +
      Raised
      +
      + } />
      + } />
      +
      +
      +
      + +
      +
      + +
      +
      Flat
      +
      + } />
      + } />
      +
      +
      +
      + +
      +
      +); + +const Page = () => ( +
      +
      +

      Material Buttons

      + + +
      +
      +
      +
      + +
      +
      +); + +module.exports = Page; diff --git a/src/routes/app/routes/ui/routes/buttons/index.js b/src/routes/app/routes/ui/routes/buttons/index.js new file mode 100644 index 0000000..57a3174 --- /dev/null +++ b/src/routes/app/routes/ui/routes/buttons/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'buttons', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Buttons')); + }); + } +}; diff --git a/src/routes/app/routes/ui/routes/callToActions/components/CallToActions.js b/src/routes/app/routes/ui/routes/callToActions/components/CallToActions.js new file mode 100644 index 0000000..2fb3895 --- /dev/null +++ b/src/routes/app/routes/ui/routes/callToActions/components/CallToActions.js @@ -0,0 +1,102 @@ +import React from 'react'; +import RaisedButton from 'material-ui/RaisedButton'; +import QueueAnim from 'rc-queue-anim'; + +const mWidthStyle = { + minWidth: '135px' +}; + +const Section1 = () => ( +
      +
      +

      Basic

      + +
      +
      +
      +
      + Download it now and get up and running in minutes +
      + +
      +
      +
      +
      +
      +
      +
      +); + +const Section2 = () => ( +
      +
      +
      +

      Full Width (Inline)

      +
      +
      +
      +
      + Download it now and get up and running in minutes +
      + +
      +
      +
      +
      +
      +); + +const Section3 = () => ( +
      +
      +
      +

      Full Width

      +
      +
      +
      +
      + Download it now and get up and running in minutes +
      + +
      +
      No spam! We promise, only the best stuff.
      +
      +
      +
      +
      +); + +const Section4 = () => ( +
      +
      +
      +

      Image Background

      +
      +
      +
      +
      + Download it now and get up and running in minutes +
      + +
      +
      No spam! We promise, only the best stuff.
      +
      +
      +
      +); + + +const CallToActions = () => ( +
      + + +
      +
      +
      +
      +
      + +
      +); + +module.exports = CallToActions; diff --git a/src/routes/app/routes/ui/routes/callToActions/index.js b/src/routes/app/routes/ui/routes/callToActions/index.js new file mode 100644 index 0000000..424a5aa --- /dev/null +++ b/src/routes/app/routes/ui/routes/callToActions/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'call-to-actions', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/CallToActions')); + }); + } +}; diff --git a/src/routes/app/routes/ui/routes/cards/components/Cards.js b/src/routes/app/routes/ui/routes/cards/components/Cards.js new file mode 100644 index 0000000..9e59c88 --- /dev/null +++ b/src/routes/app/routes/ui/routes/cards/components/Cards.js @@ -0,0 +1,200 @@ +import React from 'react'; +import {Card, CardActions, CardHeader, CardMedia, CardTitle, CardText} from 'material-ui/Card'; +import FlatButton from 'material-ui/FlatButton'; +import APPCONFIG from 'constants/Config'; +import QueueAnim from 'rc-queue-anim'; + +const ExpandableCards = () => ( +
      +

      Expandable Card

      + +
      +
      + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Donec mattis pretium massa. Aliquam erat volutpat. Nulla facilisi. + Donec vulputate interdum sollicitudin. Nunc lacinia auctor quam sed pellentesque. + Aliquam dui mauris, mattis quis lacus id, pellentesque lobortis odio. + + + + + + +
      +
      + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Donec mattis pretium massa. Aliquam erat volutpat. Nulla facilisi. + Donec vulputate interdum sollicitudin. Nunc lacinia auctor quam sed pellentesque. + Aliquam dui mauris, mattis quis lacus id, pellentesque lobortis odio. + + + + + + +
      +
      +
      +); + +const MaterialCards = () => ( +
      +

      Simple Card

      +
      +
      +
      +
      + Card Dark +

      Hey there, I am a very simple card. I am good at containing small bits of information. + I am quite convenient because I require little markup to use effectively.

      +
      +
      + A link + A link +
      +
      +
      + +
      +
      +
      + Card Primary +

      Hey there, I am a very simple card. I am good at containing small bits of information. + I am quite convenient because I require little markup to use effectively.

      +
      +
      + A link + A link +
      +
      +
      +
      +
      +
      +
      +
      + Card Accent +

      Hey there, I am a very simple card. I am good at containing small bits of information. + I am quite convenient because I require little markup to use effectively.

      +
      +
      + A link + A link +
      +
      +
      + +
      +
      +
      + Card White +

      Hey there, I am a very simple card. I am good at containing small bits of information. + I am quite convenient because I require little markup to use effectively.

      +
      +
      + A link + A link +
      +
      +
      +
      +
      +); + +const ImageCards = () => ( +
      +

      Image Card

      +
      +
      +
      +
      + + Image Card +
      +
      +

      Hey there, I am a very simple card. I am good at containing small bits of information. + I am quite convenient because I require little markup to use effectively.

      +
      +
      + A link + A link +
      +
      +
      +
      +
      +
      + + Image Card with Pofile +
      +
      + +

      I am a very simple card. I am good at containing small bits of information. + I am convenient because I require little markup to use effectively.

      +
      +
      + A link + A link +
      +
      +
      +
      +
      +
      + + Image Card with Icon Button +
      +
      + + + +

      I am a very simple card. I am good at containing small bits of information. + I am quite convenient because I require little markup to use effectively.

      +
      +
      + A link + A link +
      +
      +
      +
      +
      +); + +const Page = () => ( +
      + +
      +
      +
      +
      +
      +); + +module.exports = Page; + diff --git a/src/routes/app/routes/ui/routes/cards/index.js b/src/routes/app/routes/ui/routes/cards/index.js new file mode 100644 index 0000000..300b4cb --- /dev/null +++ b/src/routes/app/routes/ui/routes/cards/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'cards', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Cards')); + }); + } +}; diff --git a/src/routes/app/routes/ui/routes/colors/components/Colors.js b/src/routes/app/routes/ui/routes/colors/components/Colors.js new file mode 100644 index 0000000..de63b3f --- /dev/null +++ b/src/routes/app/routes/ui/routes/colors/components/Colors.js @@ -0,0 +1,489 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; + +const Colors = () => ( +
      +

      Materail Color palette

      +
      +
      +
        +
      • + Red + 500 + #f44336 +
      • +
      • 50#ffebee
      • +
      • 100#ffcdd2
      • +
      • 200#ef9a9a
      • +
      • 300#e57373
      • +
      • 400#ef5350
      • +
      • 500#f44336
      • +
      • 600#e53935
      • +
      • 700#d32f2f
      • +
      • 800#c62828
      • +
      • 900#b71c1c
      • +
      • A100#ff8a80
      • +
      • A200#ff5252
      • +
      • A400#ff1744
      • +
      • A700#d50000
      • +
      +
      + + +
      +
        +
      • + Pink + 500 + #e91e63 +
      • +
      • 50#fce4ec
      • +
      • 100#f8bbd0
      • +
      • 200#f48fb1
      • +
      • 300#f06292
      • +
      • 400#ec407a
      • +
      • 500#e91e63
      • +
      • 600#d81b60
      • +
      • 700#c2185b
      • +
      • 800#ad1457
      • +
      • 900#880e4f
      • +
      • A100#ff80ab
      • +
      • A200#ff4081
      • +
      • A400#f50057
      • +
      • A700#c51162
      • +
      +
      + + +
      +
        +
      • + Purple + 500 + #9c27b0 +
      • +
      • 50#f3e5f5
      • +
      • 100#e1bee7
      • +
      • 200#ce93d8
      • +
      • 300#ba68c8
      • +
      • 400#ab47bc
      • +
      • 500#9c27b0
      • +
      • 600#8e24aa
      • +
      • 700#7b1fa2
      • +
      • 800#6a1b9a
      • +
      • 900#4a148c
      • +
      • A100#ea80fc
      • +
      • A200#e040fb
      • +
      • A400#d500f9
      • +
      • A700#aa00ff
      • +
      +
      + + +
      +
        +
      • + Deep Purple + 500 + #673ab7 +
      • +
      • 50#ede7f6
      • +
      • 100#d1c4e9
      • +
      • 200#b39ddb
      • +
      • 300#9575cd
      • +
      • 400#7e57c2
      • +
      • 500#673ab7
      • +
      • 600#5e35b1
      • +
      • 700#512da8
      • +
      • 800#4527a0
      • +
      • 900#311b92
      • +
      • A100#b388ff
      • +
      • A200#7c4dff
      • +
      • A400#651fff
      • +
      • A700#6200ea
      • +
      +
      + + +
      +
        +
      • + Indigo + 500 + #3f51b5 +
      • +
      • 50#e8eaf6
      • +
      • 100#c5cae9
      • +
      • 200#9fa8da
      • +
      • 300#7986cb
      • +
      • 400#5c6bc0
      • +
      • 500#3f51b5
      • +
      • 600#3949ab
      • +
      • 700#303f9f
      • +
      • 800#283593
      • +
      • 900#1a237e
      • +
      • A100#8c9eff
      • +
      • A200#536dfe
      • +
      • A400#3d5afe
      • +
      • A700#304ffe
      • +
      +
      + + +
      +
        +
      • + Blue + 500 + #0099CC +
      • +
      • 50#e3f2fd
      • +
      • 100#bbdefb
      • +
      • 200#90caf9
      • +
      • 300#64b5f6
      • +
      • 400#42a5f5
      • +
      • 500#0099CC
      • +
      • 600#1e88e5
      • +
      • 700#1976d2
      • +
      • 800#1565c0
      • +
      • 900#0d47a1
      • +
      • A100#82b1ff
      • +
      • A200#448aff
      • +
      • A400#2979ff
      • +
      • A700#2962ff
      • +
      +
      + + +
      +
        +
      • + Light Blue + 500 + #03a9f4 +
      • +
      • 50#e1f5fe
      • +
      • 100#b3e5fc
      • +
      • 200#81d4fa
      • +
      • 300#4fc3f7
      • +
      • 400#29b6f6
      • +
      • 500#03a9f4
      • +
      • 600#039be5
      • +
      • 700#0288d1
      • +
      • 800#0277bd
      • +
      • 900#01579b
      • +
      • A100#80d8ff
      • +
      • A200#40c4ff
      • +
      • A400#00b0ff
      • +
      • A700#0091ea
      • +
      +
      + + +
      +
        +
      • + Cyan + 500 + #00bcd4 +
      • +
      • 50#e0f7fa
      • +
      • 100#b2ebf2
      • +
      • 200#80deea
      • +
      • 300#4dd0e1
      • +
      • 400#26c6da
      • +
      • 500#00bcd4
      • +
      • 600#00acc1
      • +
      • 700#0097a7
      • +
      • 800#00838f
      • +
      • 900#006064
      • +
      • A100#84ffff
      • +
      • A200#18ffff
      • +
      • A400#00e5ff
      • +
      • A700#00b8d4
      • +
      +
      + + +
      +
        +
      • + Teal + 500 + #009688 +
      • +
      • 50#e0f2f1
      • +
      • 100#b2dfdb
      • +
      • 200#80cbc4
      • +
      • 300#4db6ac
      • +
      • 400#26a69a
      • +
      • 500#009688
      • +
      • 600#00897b
      • +
      • 700#00796b
      • +
      • 800#00695c
      • +
      • 900#004d40
      • +
      • A100#a7ffeb
      • +
      • A200#64ffda
      • +
      • A400#1de9b6
      • +
      • A700#00bfa5
      • +
      +
      + + +
      +
        +
      • + Green + 500 + #4caf50 +
      • +
      • 50#e8f5e9
      • +
      • 100#c8e6c9
      • +
      • 200#a5d6a7
      • +
      • 300#81c784
      • +
      • 400#66bb6a
      • +
      • 500#4caf50
      • +
      • 600#43a047
      • +
      • 700#388e3c
      • +
      • 800#2e7d32
      • +
      • 900#1b5e20
      • +
      • A100#b9f6ca
      • +
      • A200#69f0ae
      • +
      • A400#00e676
      • +
      • A700#00c853
      • +
      +
      + + +
      +
        +
      • + Light Green + 500 + #8bc34a +
      • +
      • 50#f1f8e9
      • +
      • 100#dcedc8
      • +
      • 200#c5e1a5
      • +
      • 300#aed581
      • +
      • 400#9ccc65
      • +
      • 500#8bc34a
      • +
      • 600#7cb342
      • +
      • 700#689f38
      • +
      • 800#558b2f
      • +
      • 900#33691e
      • +
      • A100#ccff90
      • +
      • A200#b2ff59
      • +
      • A400#76ff03
      • +
      • A700#64dd17
      • +
      +
      + + +
      +
        +
      • + Lime + 500 + #cddc39 +
      • +
      • 50#f9fbe7
      • +
      • 100#f0f4c3
      • +
      • 200#e6ee9c
      • +
      • 300#dce775
      • +
      • 400#d4e157
      • +
      • 500#cddc39
      • +
      • 600#c0ca33
      • +
      • 700#afb42b
      • +
      • 800#9e9d24
      • +
      • 900#827717
      • +
      • A100#f4ff81
      • +
      • A200#eeff41
      • +
      • A400#c6ff00
      • +
      • A700#aeea00
      • +
      +
      + + +
      +
        +
      • + Yellow + 500 + #ffeb3b +
      • +
      • 50#fffde7
      • +
      • 100#fff9c4
      • +
      • 200#fff59d
      • +
      • 300#fff176
      • +
      • 400#ffee58
      • +
      • 500#ffeb3b
      • +
      • 600#fdd835
      • +
      • 700#fbc02d
      • +
      • 800#f9a825
      • +
      • 900#f57f17
      • +
      • A100#ffff8d
      • +
      • A200#ffff00
      • +
      • A400#ffea00
      • +
      • A700#ffd600
      • +
      +
      + + +
      +
        +
      • + Amber + 500 + #ffc107 +
      • +
      • 50#fff8e1
      • +
      • 100#ffecb3
      • +
      • 200#ffe082
      • +
      • 300#ffd54f
      • +
      • 400#ffca28
      • +
      • 500#ffc107
      • +
      • 600#ffb300
      • +
      • 700#ffa000
      • +
      • 800#ff8f00
      • +
      • 900#ff6f00
      • +
      • A100#ffe57f
      • +
      • A200#ffd740
      • +
      • A400#ffc400
      • +
      • A700#ffab00
      • +
      +
      + + +
      +
        +
      • + Orange + 500 + #ff9800 +
      • +
      • 50#fff3e0
      • +
      • 100#ffe0b2
      • +
      • 200#ffcc80
      • +
      • 300#ffb74d
      • +
      • 400#ffa726
      • +
      • 500#ff9800
      • +
      • 600#fb8c00
      • +
      • 700#f57c00
      • +
      • 800#ef6c00
      • +
      • 900#e65100
      • +
      • A100#ffd180
      • +
      • A200#ffab40
      • +
      • A400#ff9100
      • +
      • A700#ff6d00
      • +
      +
      + + +
      +
        +
      • + Deep Orange + 500 + #ff5722 +
      • +
      • 50#fbe9e7
      • +
      • 100#ffccbc
      • +
      • 200#ffab91
      • +
      • 300#ff8a65
      • +
      • 400#ff7043
      • +
      • 500#ff5722
      • +
      • 600#f4511e
      • +
      • 700#e64a19
      • +
      • 800#d84315
      • +
      • 900#bf360c
      • +
      • A100#ff9e80
      • +
      • A200#ff6e40
      • +
      • A400#ff3d00
      • +
      • A700#dd2c00
      • +
      +
      + + +
      +
        +
      • + Brown + 500 + #795548 +
      • +
      • 50#efebe9
      • +
      • 100#d7ccc8
      • +
      • 200#bcaaa4
      • +
      • 300#a1887f
      • +
      • 400#8d6e63
      • +
      • 500#795548
      • +
      • 600#6d4c41
      • +
      • 700#5d4037
      • +
      • 800#4e342e
      • +
      • 900#3e2723
      • +
      +
      + + +
      +
        +
      • + Grey + 500 + #9e9e9e +
      • +
      • 50#fafafa
      • +
      • 100#f5f5f5
      • +
      • 200#eeeeee
      • +
      • 300#e0e0e0
      • +
      • 400#bdbdbd
      • +
      • 500#9e9e9e
      • +
      • 600#757575
      • +
      • 700#616161
      • +
      • 800#424242
      • +
      • 900#212121
      • +
      +
      + + +
      +
        +
      • + Blue Grey + 500 + #607d8b +
      • +
      • 50#eceff1
      • +
      • 100#cfd8dc
      • +
      • 200#b0bec5
      • +
      • 300#90a4ae
      • +
      • 400#78909c
      • +
      • 500#607d8b
      • +
      • 600#546e7a
      • +
      • 700#455a64
      • +
      • 800#37474f
      • +
      • 900#263238
      • +
      +
      + +
      +
        +
      • Black#000000
      • +
      • White#ffffff
      • +
      +
      +
      +
      +
      +); + +const Page = () => ( +
      + +
      +
      +
      +); + +module.exports = Page; diff --git a/src/routes/app/routes/ui/routes/colors/index.js b/src/routes/app/routes/ui/routes/colors/index.js new file mode 100644 index 0000000..e68478b --- /dev/null +++ b/src/routes/app/routes/ui/routes/colors/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'colors', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Colors')); + }); + } +}; diff --git a/src/routes/app/routes/ui/routes/components/components/Avatar.js b/src/routes/app/routes/ui/routes/components/components/Avatar.js new file mode 100644 index 0000000..f859b02 --- /dev/null +++ b/src/routes/app/routes/ui/routes/components/components/Avatar.js @@ -0,0 +1,101 @@ +import React from 'react'; +import Avatar from 'material-ui/Avatar'; +import FileFolder from 'material-ui/svg-icons/file/folder'; +import FontIcon from 'material-ui/FontIcon'; +import List from 'material-ui/List/List'; +import ListItem from 'material-ui/List/ListItem'; + +import { + blue300, + indigo900, + orange200, + deepOrange300, + pink400, + purple500, +} from 'material-ui/styles/colors'; +// Replaced FontIcon with local material-design-iconic-font +const AvatarExampleSimple = () => ( + + + } + > + Image Avatar + + camera} /> + } + > + FontIcon Avatar + + camera} + color={blue300} + backgroundColor={indigo900} + /> + } + > + FontIcon Avatar with custom colors + + } /> + } + > + SvgIcon Avatar + + } + color={orange200} + backgroundColor={pink400} + /> + } + > + SvgIcon Avatar with custom colors + + A} + > + Letter Avatar + + + A + + } + > + Letter Avatar with custom colors + + +); + +const AvatarSection = () => ( +
      +

      Material Avatar

      + +
      +
      + +
      +
      +
      +); + +module.exports = AvatarSection; diff --git a/src/routes/app/routes/ui/routes/components/components/Badge.js b/src/routes/app/routes/ui/routes/components/components/Badge.js new file mode 100644 index 0000000..2997052 --- /dev/null +++ b/src/routes/app/routes/ui/routes/components/components/Badge.js @@ -0,0 +1,36 @@ +import React from 'react'; +import Badge from 'material-ui/Badge'; + +const BadgeSection = () => ( +
      +

      Material Badges

      +
      +
      +
      +
      Number and Icon
      +
      + +
      account_box
      +
      +
      account_box
      + +
      +
      +
      +
      +
      +
      Number and Icon
      +
      + + Inbox +
      + Mood + +
      +
      +
      +
      +
      + ); + +module.exports = BadgeSection; diff --git a/src/routes/app/routes/ui/routes/components/components/BottomNavigation.js b/src/routes/app/routes/ui/routes/components/components/BottomNavigation.js new file mode 100644 index 0000000..9920cb6 --- /dev/null +++ b/src/routes/app/routes/ui/routes/components/components/BottomNavigation.js @@ -0,0 +1,268 @@ +import React, { Component } from 'react'; +import FontIcon from 'material-ui/FontIcon'; +import { BottomNavigation, BottomNavigationItem } from 'material-ui/BottomNavigation'; +import Paper from 'material-ui/Paper'; +import IconLocationOn from 'material-ui/svg-icons/communication/location-on'; +import Websocket from 'react-websocket'; +import Dialog from 'material-ui/Dialog'; +import Instance from '../../../../../../../components/Connection'; + +const recentsIcon = mode_edit; +const favoritesIcon = favorite; +const nearbyIcon = sms; +const cancelIcon = cancel; +const locationItem = room; + +/** + * A simple example of `BottomNavigation`, with three labels and icons + * provided. The selected `BottomNavigationItem` is determined by application + * state (for instance, by the URL). + */ +class BottomNavigationExampleSimple extends Component { + constructor(props) { + super(props); + this.props = props; + } + + state = { + stepIndex: 0, + rideTypeValue: 0, + providerID: 0, + providerName: '', + visitDate: null, + visitTime: null, + pickupLocation: null, + pickupTime: null, + origin: {}, + destination: {}, + selectedIndex: 0, + showConfirm: true, + messageNumber: null, + message: '', + ride: {} + }; + + componentWillReceiveProps(nextProps) { + let data = nextProps.data; + data.visitDate = data.visitDate ? new Date(data.visitDate) : new Date(); + data.visitTime = data.visitTime ? new Date(data.visitTime) : new Date(); + data.pickupTime = data.pickupTime ? new Date(data.pickupTime) : new Date(); + data.ride = nextProps.params; + + this.setState(Object.assign(this.state, data)); + } + + componentDidMount() { + let data = this.props.data; + data.visitDate = data.visitDate ? new Date(data.visitDate) : new Date(); + data.visitTime = data.visitTime ? new Date(data.visitTime) : new Date(); + data.pickupTime = data.pickupTime ? new Date(data.pickupTime) : new Date(); + data.ride = this.props.params; + + this.setState(Object.assign(this.state, data)); + } + + select = index => this.setState(Object.assign(this.state, { selectedIndex: index })); + + style = { + position: "absolute", + bottom: "55px", + width: "340px", + opacity: '.85', + borderRadius: '20px' + } + + handleWebsocket(data) { + console.log(data); + } + + handleCancel = (e) => { + e.preventDefault(); + const state = this; + if (state.props.data !== undefined) { + state.setState(Object.assign(state.state, state.props.data)); + } + if (state.state.showConfirm) { + if (confirm('Are you sure you want to Cancel this ride?')) { + state.setState(Object.assign(state.state, { showConfirm: false })); + let rideID = state.state.ride.ride_uuid; + let url = '/v1/nemt/rides/' + rideID + '/cancel' + Instance.getRawConn().post(url).then(function (res) { + state.setState(Object.assign(state.state, { showConfirm: true })); + + alert('NEMT ride #' + state.state.ride.internal_id + ' has been cancelled'); + + window.location.href = '/#/app/table/rides'; + }).catch(function (err) { + state.setState(Object.assign(state.state, { showConfirm: true })); + alert('Error: ' + JSON.stringify(res)); + console.log(err); + }); + } + } + } + + handleETA = (e) => { + e.preventDefault() + const state = this; + if (state.props.data !== undefined) { + state.setState(Object.assign(state.state, state.props.data)); + } + + if (state.state.eta) { + let rideID = state.state.ride.ride_uuid; + let message = 'Estimated Distance : ' + state.state.eta.distance_miles + ' miles\nEstimated Time: ' + state.state.eta.formatted_time + + let url = '/v1/nemt/rides/' + rideID + '/message'; + url = encodeURI(url); + Instance.getRawConn().post(url, { message: message }).then(function (res) { + alert('ETA Sent'); + }).catch(function (err) { + console.error(err); + }); + } + } + + handleMessage = (e) => { + e.preventDefault(); + const state = this; + if (state.props.data !== undefined) { + state.setState(Object.assign(state.state, state.props.data)); + } + + let rideID = state.state.ride.ride_uuid; + let message = prompt('Message to member?'); + if (message && message.length > 0) { + let url = '/v1/nemt/rides/' + rideID + '/message'; + url = encodeURI(url); + Instance.getRawConn().post(url, { message: message }).then(function (res) { + alert('Message sent to member'); + }).catch(function (err) { + console.error(err); + }); + } + } + + render() { + return ( + + +
      + + + import Dialog from 'material-ui/Dialog'; + +
      + + + { + e.preventDefault(); + this.select(2); + this.handleMessage(e); + } + } + /> + { + e.preventDefault(); + this.select(3); + this.handleETA(e); + } + } + /> + { + e.preventDefault(); + this.select(1); + this.handleCancel(e); + } + } + /> + + + {/*
      +
      +
      +
      + + + + + + + + + + + + {this.carInfo} + +
      PassengerStatusVehicle
      +
      + +
      +
      +
      */} +
      + ); + } +} + +class BottomNavigationSection extends React.Component { + constructor(props) { + super(props); + this.props = props; + } + + state = { + stepIndex: 0, + rideTypeValue: 0, + providerID: 0, + providerName: '', + visitDate: null, + visitTime: null, + pickupLocation: null, + pickupTime: null, + origin: {}, + destination: {}, + selectedIndex: 0, + ride: {}, + }; + + componentWillReceiveProps(nextProps) { + let data = nextProps.data; + data.visitDate = data.visitDate ? new Date(data.visitDate) : new Date(); + data.visitTime = data.visitTime ? new Date(data.visitTime) : new Date(); + data.pickupTime = data.pickupTime ? new Date(data.pickupTime) : new Date(); + data.ride = nextProps.params; + + this.setState(Object.assign(this.state, data)); + } + + componentDidMount() { + let data = this.props.data; + data.visitDate = data.visitDate ? new Date(data.visitDate) : new Date(); + data.visitTime = data.visitTime ? new Date(data.visitTime) : new Date(); + data.pickupTime = data.pickupTime ? new Date(data.pickupTime) : new Date(); + data.ride = this.props.params + + this.setState(Object.assign(this.state, data)); + } + + render() { + return () + } +}; + +export default BottomNavigationSection; diff --git a/src/routes/app/routes/ui/routes/components/components/Callout.js b/src/routes/app/routes/ui/routes/components/components/Callout.js new file mode 100644 index 0000000..d297bb1 --- /dev/null +++ b/src/routes/app/routes/ui/routes/components/components/Callout.js @@ -0,0 +1,31 @@ +import React from 'react'; + +const CalloutSection = () => ( +
      +

      Callout

      +
      +
      + +
      +

      Callout heading

      +

      Lorem ipsum dolor sit amet, consectetur adipisicing elit. Assumenda, alias, in accusantium totam adipisci vel et suscipit quidem libero pariatur minus ratione quo doloremque error at nemo incidunt dicta quia?

      +
      +
      +

      Callout heading

      +

      Lorem ipsum dolor sit amet, consectetur adipisicing elit. Assumenda, alias, in accusantium totam adipisci vel et suscipit quidem libero pariatur minus ratione quo doloremque error at nemo incidunt dicta quia?

      +
      +
      +

      Callout heading

      +

      Lorem ipsum dolor sit amet, consectetur adipisicing elit. Assumenda, alias, in accusantium totam adipisci vel et suscipit quidem libero pariatur minus ratione quo doloremque error at nemo incidunt dicta quia?

      +
      +
      +

      Callout heading

      +

      Lorem ipsum dolor sit amet, consectetur adipisicing elit. Assumenda, alias, in accusantium totam adipisci vel et suscipit quidem libero pariatur minus ratione quo doloremque error at nemo incidunt dicta quia?

      +
      + +
      +
      +
      + ); + +module.exports = CalloutSection; diff --git a/src/routes/app/routes/ui/routes/components/components/Components.js b/src/routes/app/routes/ui/routes/components/components/Components.js new file mode 100644 index 0000000..1c16c00 --- /dev/null +++ b/src/routes/app/routes/ui/routes/components/components/Components.js @@ -0,0 +1,39 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; +import Avatar from './Avatar'; +import Badge from './Badge'; +import BottomNavigation from './BottomNavigation'; +import Callout from './Callout'; +import Paper from './Paper'; +import Popover from './Popover'; +import Progress from './Progress'; +import Ribbon from './Ribbon'; +import Snackbar from './Snackbar'; +import Subheader from './Subheader'; +import Tabs from './Tabs'; +import Toolbar from './Toolbar'; + +// Not added: App Bar, Divider, Grid List, Left Nav, Subheader, Toolbar, Menu (it breaks ScrollToTop) +// Lack of: Tooltip, Toast, Accordion + +const Components = () => ( +
      + + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      +); + +module.exports = Components; diff --git a/src/routes/app/routes/ui/routes/components/components/Paper.js b/src/routes/app/routes/ui/routes/components/components/Paper.js new file mode 100644 index 0000000..9ab528c --- /dev/null +++ b/src/routes/app/routes/ui/routes/components/components/Paper.js @@ -0,0 +1,67 @@ +import React from 'react'; +import Paper from 'material-ui/Paper'; + +const style = { + height: 100, + width: 100, + margin: 20, + textAlign: 'center', + display: 'inline-block', +}; + +const PaperExampleSimple = () => ( +
      + + + + + +
      +); + +const PaperExampleRounded = () => ( +
      + + + + + +
      +); + +const PaperExampleCircle = () => ( +
      + + + + + +
      +); + +const PaperSection = () => ( +
      +

      Material Paper

      + +
      +
      Simple example
      +
      + +
      +
      +
      +
      Non-rounded corners
      +
      + +
      +
      +
      +
      Circular Paper
      +
      + +
      +
      +
      + ); + +module.exports = PaperSection; diff --git a/src/routes/app/routes/ui/routes/components/components/Popover.js b/src/routes/app/routes/ui/routes/components/components/Popover.js new file mode 100644 index 0000000..04f5b99 --- /dev/null +++ b/src/routes/app/routes/ui/routes/components/components/Popover.js @@ -0,0 +1,328 @@ +import React from 'react'; +import RaisedButton from 'material-ui/RaisedButton'; +import {Popover, PopoverAnimationVertical} from 'material-ui/Popover'; +import Menu from 'material-ui/Menu'; +import MenuItem from 'material-ui/MenuItem'; + +import RadioButton from 'material-ui/RadioButton'; + +class PopoverExampleSimple extends React.Component { + + constructor(props) { + super(props); + + this.state = { + open: false, + }; + } + + handleTouchTap = (event) => { + // This prevents ghost click. + event.preventDefault(); + + this.setState({ + open: true, + anchorEl: event.currentTarget, + }); + }; + + handleRequestClose = () => { + this.setState({ + open: false, + }); + }; + + render() { + return ( +
      +
      +
      Simple examples
      +
      + + + + + + + + + +
      +
      +
      + ); + } +} + +class PopoverExampleAnimation extends React.Component { + + constructor(props) { + super(props); + + this.state = { + open: false, + }; + } + + handleTouchTap = (event) => { + // This prevents ghost click. + event.preventDefault(); + this.setState({ + open: true, + anchorEl: event.currentTarget, + }); + }; + + handleRequestClose = () => { + this.setState({ + open: false, + }); + }; + + render() { + return ( +
      +
      +
      Animation
      +
      + + + + + + + + + +
      +
      +
      + ); + } +} + +// +const styles = { + h4: { + fontWeight: 400, + }, + block: { + display: 'flex', + }, + block2: { + margin: 10, + }, +}; +class PopoverExampleConfigurable extends React.Component { + + constructor(props) { + super(props); + + this.state = { + open: false, + anchorOrigin: { + horizontal: 'left', + vertical: 'bottom', + }, + targetOrigin: { + horizontal: 'left', + vertical: 'top', + }, + }; + } + + handleTouchTap = (event) => { + // This prevents ghost click. + event.preventDefault(); + this.setState({ + open: true, + anchorEl: event.currentTarget, + }); + }; + + handleRequestClose = () => { + this.setState({ + open: false, + }); + }; + + setAnchor = (positionElement, position) => { + const {anchorOrigin} = this.state; + anchorOrigin[positionElement] = position; + + this.setState({ + anchorOrigin, + }); + }; + + setTarget = (positionElement, position) => { + const {targetOrigin} = this.state; + targetOrigin[positionElement] = position; + + this.setState({ + targetOrigin, + }); + }; + + render() { + return ( +
      +
      + +
      +

      Current Settings

      +
      +

      anchorOrigin: {JSON.stringify(this.state.anchorOrigin)}

      +

      targetOrigin: {JSON.stringify(this.state.targetOrigin)}

      +
      +
      +

      Position Options

      +
      +

      Use the settings to toggle the positioning of the popovers above

      +
      +
      +
      + +
      Anchor Origin
      +
      +
      + Vertical +
      + + + +
      +
      + Horizontal +
      + + + +
      +
      +
      +
      Target Origin
      +
      +
      + Vertical +
      + + + +
      +
      + Horizontal +
      + + + +
      +
      + + + + + + + + + +
      +
      + ); + } +} + +const PopoverSection = () => ( +
      +

      Material Popover

      + +
      +
      +
      +
      +
      + + +
      + +
      +
      +
      Anchor playground
      +
      + +
      +
      +
      +
      +
      +
      +
      + + ); + +module.exports = PopoverSection; diff --git a/src/routes/app/routes/ui/routes/components/components/Progress.js b/src/routes/app/routes/ui/routes/components/components/Progress.js new file mode 100644 index 0000000..abec8b8 --- /dev/null +++ b/src/routes/app/routes/ui/routes/components/components/Progress.js @@ -0,0 +1,136 @@ +import React from 'react'; +import CircularProgress from 'material-ui/CircularProgress'; + +import LinearProgress from 'material-ui/LinearProgress'; + +const CircularProgressExampleSimple = () => ( +
      +
      +
      Indeterminate progress
      +
      + + + +
      +
      +
      +); + +class CircularProgressExampleDeterminate extends React.Component { + constructor(props) { + super(props); + + this.state = { + completed: 0, + }; + } + + componentDidMount() { + this.timer = setTimeout(() => this.progress(5), 1000); + } + + componentWillUnmount() { + clearTimeout(this.timer); + } + + progress(completed) { + if (completed > 100) { + this.setState({completed: 100}); + } else { + this.setState({completed}); + const diff = Math.random() * 10; + this.timer = setTimeout(() => this.progress(completed + diff), 1000); + } + } + + render() { + return ( +
      +
      +
      Determinate progress
      +
      + + + +
      +
      +
      + ); + } +} + +const LinearProgressExampleSimple = () => ( +
      +
      Indeterminate progress
      +
      + +
      +
      +); + +class LinearProgressExampleDeterminate extends React.Component { + + constructor(props) { + super(props); + + this.state = { + completed: 0, + }; + } + + componentDidMount() { + this.timer = setTimeout(() => this.progress(5), 1000); + } + + componentWillUnmount() { + clearTimeout(this.timer); + } + + progress(completed) { + if (completed > 100) { + this.setState({completed: 100}); + } else { + this.setState({completed}); + const diff = Math.random() * 10; + this.timer = setTimeout(() => this.progress(completed + diff), 1000); + } + } + + render() { + return ( +
      +
      Indeterminate progress
      +
      + +
      +
      + ); + } +} + +const ProgressSection = () => ( +
      +

      Material Progress

      + +
      +
      +
      + +
      + + +
      + +
      + + +
      + + +
      +
      +
      +
      + ); + +module.exports = ProgressSection; diff --git a/src/routes/app/routes/ui/routes/components/components/Ribbon.js b/src/routes/app/routes/ui/routes/components/components/Ribbon.js new file mode 100644 index 0000000..3737e26 --- /dev/null +++ b/src/routes/app/routes/ui/routes/components/components/Ribbon.js @@ -0,0 +1,94 @@ +import React from 'react'; + +const RibbonSection = () => ( +
      +

      Ribbons

      + +
      +
      +
      +
      +
      + 30% Off +
      +
      +
      Ribbon
      +
      +

      Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deleniti rerum reprehenderit ipsam natus saepe. Recusandae, itaque nulla in illum dolorum ea eveniet quaerat ipsa placeat magni commodi obcaecati mollitia necessitatibus?

      +
      +
      +
      +
      +
      +
      +
      + 30% Off +
      +
      +
      Ribbon-primary
      +
      +

      Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deleniti rerum reprehenderit ipsam natus saepe. Recusandae, itaque nulla in illum dolorum ea eveniet quaerat ipsa placeat magni commodi obcaecati mollitia necessitatibus?

      +
      +
      +
      +
      +
      +
      +
      + 30% Off +
      +
      +
      Ribbon-success
      +
      +

      Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deleniti rerum reprehenderit ipsam natus saepe. Recusandae, itaque nulla in illum dolorum ea eveniet quaerat ipsa placeat magni commodi obcaecati mollitia necessitatibus?

      +
      +
      +
      +
      + +
      +
      +
      +
      +
      + 30% Off +
      +
      +
      Ribbon-info
      +
      +

      Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deleniti rerum reprehenderit ipsam natus saepe. Recusandae, itaque nulla in illum dolorum ea eveniet quaerat ipsa placeat magni commodi obcaecati mollitia necessitatibus?

      +
      +
      +
      +
      +
      +
      +
      + 30% Off +
      +
      +
      Ribbon-warning
      +
      +

      Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deleniti rerum reprehenderit ipsam natus saepe. Recusandae, itaque nulla in illum dolorum ea eveniet quaerat ipsa placeat magni commodi obcaecati mollitia necessitatibus?

      +
      +
      +
      +
      +
      +
      +
      + 30% Off +
      +
      +
      Ribbon-danger
      +
      +

      Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deleniti rerum reprehenderit ipsam natus saepe. Recusandae, itaque nulla in illum dolorum ea eveniet quaerat ipsa placeat magni commodi obcaecati mollitia necessitatibus?

      +
      +
      +
      +
      + +
      + ); + +module.exports = RibbonSection; diff --git a/src/routes/app/routes/ui/routes/components/components/Snackbar.js b/src/routes/app/routes/ui/routes/components/components/Snackbar.js new file mode 100644 index 0000000..3498228 --- /dev/null +++ b/src/routes/app/routes/ui/routes/components/components/Snackbar.js @@ -0,0 +1,143 @@ +import React from 'react'; +import Snackbar from 'material-ui/Snackbar'; +import RaisedButton from 'material-ui/RaisedButton'; + +import TextField from 'material-ui/TextField'; + +// +class SnackbarExampleSimple extends React.Component { + + constructor(props) { + super(props); + this.state = { + open: false, + }; + } + + handleTouchTap = () => { + this.setState({ + open: true, + }); + }; + + handleRequestClose = () => { + this.setState({ + open: false, + }); + }; + + render() { + return ( +
      +
      +
      Simple examples
      +
      + + +
      +
      +
      + ); + } +} + +// +class SnackbarExampleAction extends React.Component { + + constructor(props) { + super(props); + this.state = { + autoHideDuration: 4000, + message: 'Event added to your calendar', + open: false, + }; + } + + handleTouchTap = () => { + this.setState({ + open: true, + }); + }; + + handleActionTouchTap = () => { + this.setState({ + open: false, + }); + console.log('Event removed from your calendar.'); + }; + + handleChangeDuration = (event) => { + const value = event.target.value; + this.setState({ + autoHideDuration: value.length > 0 ? parseInt(value, 10) : 0, + }); + }; + + handleRequestClose = () => { + this.setState({ + open: false, + }); + }; + + render() { + return ( +
      +
      +
      Example action
      +
      + +
      + + +
      +
      +
      + ); + } +} + +const SnackbarSection = () => ( +
      +

      Material Snackbar

      + +
      +
      +
      + +
      + + +
      +
      +

      Snackbars provide lightweight feedback about an operation by showing a brief message at the bottom of the screen. Snackbars can contain an action.

      +
      + +
      +
      +
      +
      + ); + +module.exports = SnackbarSection; diff --git a/src/routes/app/routes/ui/routes/components/components/Subheader.js b/src/routes/app/routes/ui/routes/components/components/Subheader.js new file mode 100644 index 0000000..1610b84 --- /dev/null +++ b/src/routes/app/routes/ui/routes/components/components/Subheader.js @@ -0,0 +1,41 @@ +import React from 'react'; + +const TmplSection = () => ( +
      +
      +

      Tmpl

      +
      +
      + +
      +
      +
      +

      Basic

      +
      + +
      +

      Advanced

      +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      + +
      +
      + ); + +module.exports = TmplSection; diff --git a/src/routes/app/routes/ui/routes/components/components/Tabs.js b/src/routes/app/routes/ui/routes/components/components/Tabs.js new file mode 100644 index 0000000..9b9c5ca --- /dev/null +++ b/src/routes/app/routes/ui/routes/components/components/Tabs.js @@ -0,0 +1,61 @@ +import React from 'react'; +import {Tabs, Tab} from 'material-ui/Tabs'; +import Slider from 'material-ui/Slider'; + +const styles = { + padding: '12px 18px', + marginBottom: 12, + fontWeight: 400, +}; +function handleActive(tab) { + console.log(`A tab with this route property ${tab.props.route} was activated.`); +} +const TabsExampleSimple = () => ( + + +
      +

      Tab One

      +

      This is an example tab.

      +

      You can put any sort of HTML or react component in here. It even keeps the component state!

      + +
      +
      + +
      +

      Tab Two

      +

      This is another example tab.

      +
      +
      + +
      +

      Tab Three

      +

      This is a third example tab.

      +
      +
      +
      +); + + +const TabsSection = () => ( +
      +

      Material Tabs

      + +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      +); + +module.exports = TabsSection; diff --git a/src/routes/app/routes/ui/routes/components/components/Toolbar.js b/src/routes/app/routes/ui/routes/components/components/Toolbar.js new file mode 100644 index 0000000..61e3d8e --- /dev/null +++ b/src/routes/app/routes/ui/routes/components/components/Toolbar.js @@ -0,0 +1,68 @@ +import React from 'react'; +import IconMenu from 'material-ui/IconMenu'; +import IconButton from 'material-ui/IconButton'; +import FontIcon from 'material-ui/FontIcon'; +import NavigationExpandMoreIcon from 'material-ui/svg-icons/navigation/expand-more'; +import MenuItem from 'material-ui/MenuItem'; +import DropDownMenu from 'material-ui/DropDownMenu'; +import RaisedButton from 'material-ui/RaisedButton'; +import FlatButton from 'material-ui/FlatButton'; +import ContentAdd from 'material-ui/svg-icons/content/add'; + + +import {Toolbar, ToolbarGroup, ToolbarSeparator, ToolbarTitle} from 'material-ui/Toolbar'; + +class ToolbarExamplesSimple extends React.Component { + + constructor(props) { + super(props); + this.state = { + value: 3, + }; + } + + handleChange = (event, index, value) => this.setState({value}); + + render() { + return ( + + + + + + + + + + + + + + + } />
      + + + + + + + + } + > + + + + + + ); + } +} + +const ToolbarSection = () => ( + +); + + +module.exports = ToolbarSection; diff --git a/src/routes/app/routes/ui/routes/components/components/Toolbar2.js b/src/routes/app/routes/ui/routes/components/components/Toolbar2.js new file mode 100644 index 0000000..045ecec --- /dev/null +++ b/src/routes/app/routes/ui/routes/components/components/Toolbar2.js @@ -0,0 +1,66 @@ +import React from 'react'; +import IconMenu from 'material-ui/IconMenu'; +import IconButton from 'material-ui/IconButton'; +import FontIcon from 'material-ui/FontIcon'; +import NavigationExpandMoreIcon from 'material-ui/svg-icons/navigation/expand-more'; +import MenuItem from 'material-ui/MenuItem'; +import DropDownMenu from 'material-ui/DropDownMenu'; +import RaisedButton from 'material-ui/RaisedButton'; +import FlatButton from 'material-ui/FlatButton'; +import ContentAdd from 'material-ui/svg-icons/content/add'; +import {Toolbar, ToolbarGroup, ToolbarSeparator, ToolbarTitle} from 'material-ui/Toolbar'; + +class ToolbarExamplesSimple2 extends React.Component { + + constructor(props) { + super(props); + this.state = { + value: 2, + }; + } + + handleChange = (event, index, value) => this.setState({value}); + + render() { + return ( + + + + + + + + + + + + + + + + } />
      + + + + + + + } + > + + + + + + ); + } +} + +const ToolbarSection2 = () => ( + +); + + +module.exports = ToolbarSection2; diff --git a/src/routes/app/routes/ui/routes/components/components/Toolbar3.js b/src/routes/app/routes/ui/routes/components/components/Toolbar3.js new file mode 100644 index 0000000..df7f1cc --- /dev/null +++ b/src/routes/app/routes/ui/routes/components/components/Toolbar3.js @@ -0,0 +1,75 @@ +import React from 'react'; +import IconMenu from 'material-ui/IconMenu'; +import IconButton from 'material-ui/IconButton'; +import FontIcon from 'material-ui/FontIcon'; +import NavigationExpandMoreIcon from 'material-ui/svg-icons/navigation/expand-more'; +import MenuItem from 'material-ui/MenuItem'; +import DropDownMenu from 'material-ui/DropDownMenu'; +import RaisedButton from 'material-ui/RaisedButton'; +import FlatButton from 'material-ui/FlatButton'; +import ContentAdd from 'material-ui/svg-icons/content/add'; +import { Toolbar, ToolbarGroup, ToolbarSeparator, ToolbarTitle } from 'material-ui/Toolbar'; + +class ToolbarExamplesSimple2 extends React.Component { + + constructor(props) { + super(props); + } + + state = { + value: 2, + user: { + useruuid: '' + } + } + + componentDidMount() { + const user = JSON.parse(localStorage.getItem('loggedUser')); + this.setState(Object.assign(this.state, { user: user })); + } + + handleChange = (event, index, value) => this.setState({ value }); + + render() { + return ( + + + + + + + + + + + + + {/* */} + + + } /> +
      + + + + + + + } + > + + + + + + ); + } +} + +const ToolbarSection2 = () => ( + +); + +module.exports = ToolbarSection2; diff --git a/src/routes/app/routes/ui/routes/components/index.js b/src/routes/app/routes/ui/routes/components/index.js new file mode 100644 index 0000000..82c333f --- /dev/null +++ b/src/routes/app/routes/ui/routes/components/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'components', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Components')); + }); + } +}; diff --git a/src/routes/app/routes/ui/routes/featureCallouts/components/FeatureCallouts.js b/src/routes/app/routes/ui/routes/featureCallouts/components/FeatureCallouts.js new file mode 100644 index 0000000..48605d4 --- /dev/null +++ b/src/routes/app/routes/ui/routes/featureCallouts/components/FeatureCallouts.js @@ -0,0 +1,72 @@ +import React from 'react'; +import RaisedButton from 'material-ui/RaisedButton'; +import QueueAnim from 'rc-queue-anim'; + +const imgLeft = { + backgroundImage: 'url(assets/images-demo/covers/photo-imNop2O1Rit190cSkxXv_1-7069.jpg)', + backgroundPosition: 'center' +}; +const imgRight = { + backgroundImage: 'url(assets/images-demo/covers/photo-1455813870877-04a32045af63.jpg)', + backgroundPosition: 'center' +}; +const imgCenter = { + backgroundImage: 'url(assets/images-demo/covers/photo-1456374407032-6e4baf58fb62.jpg)', + backgroundPosition: 'left center' +}; + +const Section1 = () => ( +
      +
      +
      +
      +

      Architecto odit fuga facere

      +

      Culpa eveniet labore cupiditate at maiores dignissimos, nesciunt quam porro accusantium velit quas? Nam nobis, deleniti inventore consequuntur quos vero voluptatum nostrum error porro mollitia, accusantium distinctio nemo expedita ipsum quisquam laboriosam

      + +
      +
      +
      +
      +
      +); + +const Section2 = () => ( +
      +
      +
      +
      +

      Commodi molestiae, culpa eveniet

      +

      Culpa eveniet labore cupiditate at maiores dignissimos, nesciunt quam porro accusantium velit quas? Nam nobis, deleniti inventore consequuntur quos vero voluptatum nostrum error porro mollitia, accusantium distinctio nemo expedita ipsum quisquam laboriosam

      + +
      +
      +
      +
      +
      +); + +const Section3 = () => ( +
      +
      +
      +
      +

      Culpa distinctio nemo

      +

      Cupiditate at maiores dignissimos, nesciunt quam porro accusantium velit quas? Nam nobis, deleniti inventore consequuntur quos vero voluptatum nostrum error porro mollitia, accusantium distinctio nemo expedita ipsum quisquam laboriosam.

      + +
      +
      +
      +
      +); + +const FeatureCallouts = () => ( +
      + +
      +
      +
      +
      +
      +); + +module.exports = FeatureCallouts; diff --git a/src/routes/app/routes/ui/routes/featureCallouts/index.js b/src/routes/app/routes/ui/routes/featureCallouts/index.js new file mode 100644 index 0000000..d08e56f --- /dev/null +++ b/src/routes/app/routes/ui/routes/featureCallouts/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'feature-callouts', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/FeatureCallouts')); + }); + } +}; diff --git a/src/routes/app/routes/ui/routes/grids/components/Grids.js b/src/routes/app/routes/ui/routes/grids/components/Grids.js new file mode 100644 index 0000000..4e9df01 --- /dev/null +++ b/src/routes/app/routes/ui/routes/grids/components/Grids.js @@ -0,0 +1,271 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; + +const Grids = () => ( +
      +

      Bootstrap Grid options

      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + Extra small
      + <576px +
      + Small
      + ≥576px +
      + Medium
      + ≥768px +
      + Large
      + ≥992px +
      + Extra large
      + ≥1200px +
      Grid behaviorHorizontal at all timesCollapsed to start, horizontal above breakpoints
      Max container widthNone (auto)540px720px960px1140px
      Class prefix.col-.col-sm-.col-md-.col-lg-.col-xl-
      # of columns12
      Gutter width30px (15px on each side of a column)
      NestableYes
      OffsetsYes
      Column orderingYes
      +
      +
      +); + +const Example = () => ( +
      +

      Example

      +
      +
      + +
      +
      +
      +
      + .col-md-12 +
      +
      +
      +
      +
      +
      + .col-md-11 +
      +
      +
      +
      + .col-md-1 +
      +
      +
      +
      +
      +
      + .col-md-10 +
      +
      +
      +
      + .col-md-2 +
      +
      +
      +
      +
      +
      + .col-md-9 +
      +
      +
      +
      + .col-md-3 +
      +
      +
      +
      +
      +
      + .col-md-8 +
      +
      +
      +
      + .col-md-4 +
      +
      +
      +
      +
      +
      + .col-md-7 +
      +
      +
      +
      + .col-md-5 +
      +
      +
      +
      +
      +
      + .col-md-6 +
      +
      +
      +
      + .col-md-6 +
      +
      +
      +
      +
      +
      + .col-md-5 +
      +
      +
      +
      + .col-md-7 +
      +
      +
      +
      +
      +
      + .col-md-4 +
      +
      +
      +
      + .col-md-8 +
      +
      +
      +
      +
      +
      + .col-md-3 +
      +
      +
      +
      + .col-md-9 +
      +
      +
      +
      +
      +
      + .col-md-2 +
      +
      +
      +
      + .col-md-10 +
      +
      +
      +
      +
      +
      + .col-md-1 +
      +
      +
      +
      + .col-md-11 +
      +
      +
      +
      +
      +
      + .col-md-2 +
      +
      +
      +
      + .col-md-3 +
      +
      +
      +
      + .col-md-4 +
      +
      +
      +
      + .col-md-2 +
      +
      +
      +
      + .col-md-1 +
      +
      +
      +
      + +
      +
      +
      +); + +const Page = () => ( +
      + +
      +
      +
      +
      +); + +module.exports = Page; diff --git a/src/routes/app/routes/ui/routes/grids/index.js b/src/routes/app/routes/ui/routes/grids/index.js new file mode 100644 index 0000000..2018849 --- /dev/null +++ b/src/routes/app/routes/ui/routes/grids/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'grids', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Grids')); + }); + } +}; diff --git a/src/routes/app/routes/ui/routes/hover/components/Hover.js b/src/routes/app/routes/ui/routes/hover/components/Hover.js new file mode 100644 index 0000000..1e983b1 --- /dev/null +++ b/src/routes/app/routes/ui/routes/hover/components/Hover.js @@ -0,0 +1,153 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; + +const MaterialHover = () => ( + + ); + +const Classic = () => ( + +); + +const HoverSection = () => ( +
      + +
      +
      +
      +
      +); + +module.exports = HoverSection; diff --git a/src/routes/app/routes/ui/routes/hover/index.js b/src/routes/app/routes/ui/routes/hover/index.js new file mode 100644 index 0000000..0b56f8e --- /dev/null +++ b/src/routes/app/routes/ui/routes/hover/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'hover', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Hover')); + }); + } +}; diff --git a/src/routes/app/routes/ui/routes/iconBoxes/components/IconBoxes.js b/src/routes/app/routes/ui/routes/iconBoxes/components/IconBoxes.js new file mode 100644 index 0000000..60b4d90 --- /dev/null +++ b/src/routes/app/routes/ui/routes/iconBoxes/components/IconBoxes.js @@ -0,0 +1,886 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; + +const IconBoxes = () => ( +
      +

      Icon Boxes

      +
      + +
      +
      +
      + devices +
      +

      Responsive Design

      +

      Responsive design allows your website to fit on any screen and still be readable and usable.

      +
      +
      +
      +
      +
      + settings +
      +

      Easy to Customize

      +

      Customizer make it easy. Build your own style simply by changing a few settings in the customizer

      +
      +
      +
      +
      +
      + code +
      +

      Clean code

      +

      Clean code with popular Style Guide recommend by official team

      +
      +
      + +
      +
      + +
      +
      +
      + devices +
      +

      Responsive Design

      +

      Responsive design allows your website to fit on any screen and still be readable and usable.

      +
      +
      +
      +
      +
      + settings +
      +

      Easy to Customize

      +

      Customizer make it easy. Build your own style simply by changing a few settings in the customizer

      +
      +
      +
      +
      +
      + code +
      +

      Clean code

      +

      Clean code with popular Style Guide recommend by official team

      +
      +
      + +
      +
      + +
      +
      +
      + devices +
      +

      Responsive Design

      +

      Responsive design allows your website to fit on any screen and still be readable and usable.

      +
      +
      +
      +
      +
      + settings +
      +

      Easy to Customize

      +

      Customizer make it easy. Build your own style simply by changing a few settings in the customizer

      +
      +
      +
      +
      +
      + code +
      +

      Clean code

      +

      Clean code with popular Style Guide recommend by official team

      +
      +
      + +
      +
      + +
      +
      +
      + devices +
      +

      Responsive Design

      +

      Responsive design allows your website to fit on any screen and still be readable and usable.

      +
      +
      +
      +
      +
      + settings +
      +

      Easy to Customize

      +

      Customizer make it easy. Build your own style simply by changing a few settings in the customizer

      +
      +
      +
      +
      +
      + code +
      +

      Clean code

      +

      Clean code with popular Style Guide recommend by official team

      +
      +
      + +
      +
      + +
      +
      +
      + devices +
      +

      Responsive Design

      +

      Responsive design allows your website to fit on any screen and still be readable and usable.

      +
      +
      +
      +
      +
      + settings +
      +

      Easy to Customize

      +

      Customizer make it easy. Build your own style simply by changing a few settings in the customizer

      +
      +
      +
      +
      +
      + code +
      +

      Clean code

      +

      Clean code with popular Style Guide recommend by official team

      +
      +
      + +
      + + +
      + +
      +
      +
      + Responsive Layout +
      +

      Responsive Design

      +

      Responsive design allows your website to fit on any screen and still be readable and usable.

      +
      +
      +
      +
      +
      + Retina Graphics +
      +

      Easy to Customize

      +

      Customizer make it easy. Build your own style simply by changing a few settings in the customizer

      +
      +
      +
      +
      +
      + Powerful Performance +
      +

      Clean code

      +

      Clean code with popular Style Guide recommend by official team

      +
      +
      + +
      +
      + +
      +
      +
      + devices +
      +

      Responsive Design

      +

      Responsive design allows your website to fit on any screen and still be readable and usable.

      +
      +
      +
      +
      +
      + settings +
      +

      Easy to Customize

      +

      Customizer make it easy. Build your own style simply by changing a few settings in the customizer

      +
      +
      +
      +
      +
      + code +
      +

      Clean code

      +

      Clean code with popular Style Guide recommend by official team

      +
      +
      + +
      + +
      +
      + +
      +
      +
      +
      +
      + devices +
      +

      Responsive Design

      +

      Responsive design allows your website to fit on any screen and still be readable and usable.

      +
      +
      +
      +
      +
      +
      +
      +
      +
      + settings +
      +

      Easy to Customize

      +

      Customizer make it easy. Build your own style simply by changing a few settings in the customizer

      +
      +
      +
      +
      +
      +
      +
      +
      +
      + code +
      +

      Clean code

      +

      Clean code with popular Style Guide recommend by official team

      +
      +
      +
      +
      + +
      + +
      +); + +const CenteredIconBoxes = () => ( +
      +

      Centered Icon Boxes

      +
      + +
      +
      +
      + devices +
      +

      Responsive Design

      +

      Responsive design allows your website to fit on any screen and still be readable and usable.

      +
      +
      +
      +
      +
      + settings +
      +

      Easy to Customize

      +

      Customizer make it easy. Build your own style simply by changing a few settings in the customizer

      +
      +
      +
      +
      +
      + code +
      +

      Clean code

      +

      Clean code with popular Style Guide recommend by official team

      +
      +
      + +
      +
      + +
      +
      +
      + devices +
      +

      Responsive Design

      +

      Responsive design allows your website to fit on any screen and still be readable and usable.

      +
      +
      +
      +
      +
      + settings +
      +

      Easy to Customize

      +

      Customizer make it easy. Build your own style simply by changing a few settings in the customizer

      +
      +
      +
      +
      +
      + code +
      +

      Clean code

      +

      Clean code with popular Style Guide recommend by official team

      +
      +
      + +
      +
      + +
      +
      +
      + devices +
      +

      Responsive Design

      +

      Responsive design allows your website to fit on any screen and still be readable and usable.

      +
      +
      +
      +
      +
      + settings +
      +

      Easy to Customize

      +

      Customizer make it easy. Build your own style simply by changing a few settings in the customizer

      +
      +
      +
      +
      +
      + code +
      +

      Clean code

      +

      Clean code with popular Style Guide recommend by official team

      +
      +
      + +
      +
      + +
      +
      +
      + devices +
      +

      Responsive Design

      +

      Responsive design allows your website to fit on any screen and still be readable and usable.

      +
      +
      +
      +
      +
      + settings +
      +

      Easy to Customize

      +

      Customizer make it easy. Build your own style simply by changing a few settings in the customizer

      +
      +
      +
      +
      +
      + code +
      +

      Clean code

      +

      Clean code with popular Style Guide recommend by official team

      +
      +
      + +
      +
      + +
      +
      +
      + devices +
      +

      Responsive Design

      +

      Responsive design allows your website to fit on any screen and still be readable and usable.

      +
      +
      +
      +
      +
      + settings +
      +

      Easy to Customize

      +

      Customizer make it easy. Build your own style simply by changing a few settings in the customizer

      +
      +
      +
      +
      +
      + code +
      +

      Clean code

      +

      Clean code with popular Style Guide recommend by official team

      +
      +
      + +
      + +
      +
      + +
      +
      +
      +
      +
      + devices +
      +

      Responsive Design

      +

      Responsive design allows your website to fit on any screen and still be readable and usable.

      +
      +
      +
      +
      +
      +
      +
      +
      +
      + settings +
      +

      Easy to Customize

      +

      Customizer make it easy. Build your own style simply by changing a few settings in the customizer

      +
      +
      +
      +
      +
      +
      +
      +
      +
      + code +
      +

      Clean code

      +

      Clean code with popular Style Guide recommend by official team

      +
      +
      +
      +
      + +
      + +
      +); + +const LargeSize = () => ( +
      +

      Large Size

      +
      + +
      +
      +
      + devices +
      +

      Responsive Design

      +

      Responsive design allows your website to fit on any screen and still be readable and usable.

      +
      +
      +
      +
      +
      + settings +
      +

      Easy to Customize

      +

      Customizer make it easy. Build your own style simply by changing a few settings in the customizer

      +
      +
      +
      +
      +
      + code +
      +

      Clean code

      +

      Clean code with popular Style Guide recommend by official team

      +
      +
      + +
      +
      + +
      +
      +
      + devices +
      +

      Responsive Design

      +

      Responsive design allows your website to fit on any screen and still be readable and usable.

      +
      +
      +
      +
      +
      + settings +
      +

      Easy to Customize

      +

      Customizer make it easy. Build your own style simply by changing a few settings in the customizer

      +
      +
      +
      +
      +
      + code +
      +

      Clean code

      +

      Clean code with popular Style Guide recommend by official team

      +
      +
      + +
      +
      + +
      +
      +
      + devices +
      +

      Responsive Design

      +

      Responsive design allows your website to fit on any screen and still be readable and usable.

      +
      +
      +
      +
      +
      + settings +
      +

      Easy to Customize

      +

      Customizer make it easy. Build your own style simply by changing a few settings in the customizer

      +
      +
      +
      +
      +
      + code +
      +

      Clean code

      +

      Clean code with popular Style Guide recommend by official team

      +
      +
      + +
      +
      + +
      +
      +
      + devices +
      +

      Responsive Design

      +

      Responsive design allows your website to fit on any screen and still be readable and usable.

      +
      +
      +
      +
      +
      + settings +
      +

      Easy to Customize

      +

      Customizer make it easy. Build your own style simply by changing a few settings in the customizer

      +
      +
      +
      +
      +
      + code +
      +

      Clean code

      +

      Clean code with popular Style Guide recommend by official team

      +
      +
      + +
      + +
      + +
      +
      +
      + devices +
      +

      Responsive Design

      +

      Responsive design allows your website to fit on any screen and still be readable and usable.

      +
      +
      +
      +
      +
      + settings +
      +

      Easy to Customize

      +

      Customizer make it easy. Build your own style simply by changing a few settings in the customizer

      +
      +
      +
      +
      +
      + code +
      +

      Clean code

      +

      Clean code with popular Style Guide recommend by official team

      +
      +
      + +
      +
      + +
      +
      +
      + devices +
      +

      Responsive Design

      +

      Responsive design allows your website to fit on any screen and still be readable and usable.

      +
      +
      +
      +
      +
      + settings +
      +

      Easy to Customize

      +

      Customizer make it easy. Build your own style simply by changing a few settings in the customizer

      +
      +
      +
      +
      +
      + code +
      +

      Clean code

      +

      Clean code with popular Style Guide recommend by official team

      +
      +
      + +
      + +
      + +
      +
      +
      + devices +
      +

      Responsive Design

      +

      Responsive design allows your website to fit on any screen and still be readable and usable.

      +
      +
      +
      +
      +
      + settings +
      +

      Easy to Customize

      +

      Customizer make it easy. Build your own style simply by changing a few settings in the customizer

      +
      +
      +
      +
      +
      + code +
      +

      Clean code

      +

      Clean code with popular Style Guide recommend by official team

      +
      +
      + +
      +
      + +
      +
      +
      + devices +
      +

      Responsive Design

      +

      Responsive design allows your website to fit on any screen and still be readable and usable.

      +
      +
      +
      +
      +
      + settings +
      +

      Easy to Customize

      +

      Customizer make it easy. Build your own style simply by changing a few settings in the customizer

      +
      +
      +
      +
      +
      + code +
      +

      Clean code

      +

      Clean code with popular Style Guide recommend by official team

      +
      +
      + +
      +
      + +
      +
      +
      + devices +
      +

      Responsive Design

      +

      Responsive design allows your website to fit on any screen and still be readable and usable.

      +
      +
      +
      +
      +
      + settings +
      +

      Easy to Customize

      +

      Customizer make it easy. Build your own style simply by changing a few settings in the customizer

      +
      +
      +
      +
      +
      + code +
      +

      Clean code

      +

      Clean code with popular Style Guide recommend by official team

      +
      +
      + +
      +
      + +
      +
      +
      + devices +
      +

      Responsive Design

      +

      Responsive design allows your website to fit on any screen and still be readable and usable.

      +
      +
      +
      +
      +
      + settings +
      +

      Easy to Customize

      +

      Customizer make it easy. Build your own style simply by changing a few settings in the customizer

      +
      +
      +
      +
      +
      + code +
      +

      Clean code

      +

      Clean code with popular Style Guide recommend by official team

      +
      +
      + +
      +
      + +
      +
      +
      + devices +
      +

      Responsive Design

      +

      Responsive design allows your website to fit on any screen and still be readable and usable.

      +
      +
      +
      +
      +
      + settings +
      +

      Easy to Customize

      +

      Customizer make it easy. Build your own style simply by changing a few settings in the customizer

      +
      +
      +
      +
      +
      + code +
      +

      Clean code

      +

      Clean code with popular Style Guide recommend by official team

      +
      +
      + +
      + +
      +
      + +
      +
      +
      +
      +
      + devices +
      +

      Responsive Design

      +

      Responsive design allows your website to fit on any screen and still be readable and usable.

      +
      +
      +
      +
      +
      +
      +
      +
      +
      + settings +
      +

      Easy to Customize

      +

      Customizer make it easy. Build your own style simply by changing a few settings in the customizer

      +
      +
      +
      +
      +
      +
      +
      +
      +
      + code +
      +

      Clean code

      +

      Clean code with popular Style Guide recommend by official team

      +
      +
      +
      +
      + +
      +
      +); + +const Page = () => ( +
      + +
      +
      +
      +
      +
      +); + +module.exports = Page; diff --git a/src/routes/app/routes/ui/routes/iconBoxes/index.js b/src/routes/app/routes/ui/routes/iconBoxes/index.js new file mode 100644 index 0000000..76d4df9 --- /dev/null +++ b/src/routes/app/routes/ui/routes/iconBoxes/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'icon-boxes', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/IconBoxes')); + }); + } +}; diff --git a/src/routes/app/routes/ui/routes/icons/components/Icons.js b/src/routes/app/routes/ui/routes/icons/components/Icons.js new file mode 100644 index 0000000..55e0549 --- /dev/null +++ b/src/routes/app/routes/ui/routes/icons/components/Icons.js @@ -0,0 +1,796 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; + +const Icons = () => ( +
      +

      900+ Official Material Design Icons

      +
      + +
      +
      + +

      + slow_motion_video + playlist_add + play_circle_outline + play_circle_filled + play_arrow + pause_circle_outline + pause_circle_filled + pause + note + not_interested + repeat + remove_from_queue + recent_actors + radio + queue_play_next + queue_music + queue + playlist_play + playlist_add_check + assignment_ind + assignment_late + assignment_return + assignment_returned + assignment_turned_in + autorenew + backup + book + bookmark + video_library + video_label + video_call + surround_sound + subtitles + subscriptions + stop + sort_by_alpha + snooze + check_circle + web_asset + web + volume_up + volume_off + volume_mute + volume_down + videocam_off + videocam + delete + delete_forever + description + dns + done + done_all + donut_large + donut_small + eject + dialer_sip + contacts + contact_phone + contact_mail + comment + clear_all + chat_bubble_outline + chat_bubble + chat + call_split + call_received + call_missed_outgoing + call_missed + call_merge + call_made + call_end + call + business + location_on + location_off + live_help + invert_colors_off + import_export + import_contacts + forum + email + dialpad + portable_wifi_off + phonelink_setup + phonelink_ring + phonelink_lock + phonelink_erase + phone + no_sim + message + mail_outline + stay_primary_portrait + stay_primary_landscape + stay_current_portrait + stay_current_landscape + speaker_phone + screen_share + rss_feed + ring_volume + present_to_all + lock + lock_open + lock_outline + loyalty + vpn_key + voicemail + textsms + swap_calls + stop_screen_share + open_in_browser + open_in_new + open_with + pageview + pan_tool + payment + perm_camera_mic + perm_contact_calendar + perm_data_setting + content_copy + clear + block + backspace + archive + add_circle_outline + add_circle + add_box + add + polymer + power_settings_new + pregnant_woman + print + query_builder + question_answer + receipt + record_voice_over + redeem + schedule + rowing + rounded_corner + room + restore_page + restore + report_problem + reorder + remove_shopping_cart + search + settings + settings_applications + settings_backup_restore + settings_bluetooth + settings_brightness + settings_cell + settings_ethernet + settings_input_antenna + settings_input_component + settings_input_composite + settings_input_hdmi + settings_input_svideo + settings_overscan + settings_phone + settings_power + settings_remote + settings_voice + shop + shop_two + shopping_basket + shopping_cart + speaker_notes + speaker_notes_off + spellcheck + stars + store + subject + supervisor_account + swap_horiz + swap_vert + swap_vertical_circle + system_update_alt + tab + tab_unselected + theaters + thumb_down + thumb_up + thumbs_up_down + timeline + toc + today + toll + touch_app + track_changes + translate + trending_down + trending_flat + trending_up + turned_in + turned_in_not + update + verified_user + view_agenda + view_array + view_carousel + view_column + view_day + view_headline + view_list + view_module + view_quilt + view_stream + view_week + visibility + visibility_off + watch_later + work + youtube_searched_for + zoom_in + zoom_out + add_alert + error + error_outline + warning + add_to_queue + airplay + album + art_track + av_timer + branding_watermark + call_to_action + closed_caption + equalizer + explicit + fast_forward + fast_rewind + featured_play_list + featured_video + fiber_dvr + fiber_manual_record + fiber_new + fiber_pin + fiber_smart_record + forward_10 + forward_30 + forward_5 + games + hd + hearing + high_quality + library_add + library_books + library_music + loop + mic + mic_none + mic_off + movie + music_video + new_releases + repeat_one + replay + replay_5 + shuffle + skip_next + skip_previous + schedule + tab_unselected + tab + system_update_alt + swap_vertical_circle + verified_user + update + turned_in_not + turned_in + alarm + add_shopping_cart + account_circle + account_box + account_balance_wallet + account_balance + accessible + accessibility + 3d_rotation + call_to_action + branding_watermark + av_timer + art_track + album + airplay + add_to_queue + explicit + fast_forward + assignment_ind + assignment_late + assignment_return + assignment_returned + assignment_turned_in + autorenew + backup + book + bookmark + euro_symbol + event + event_seat + exit_to_app + explore + extension + face + favorite + favorite_border + bookmark_border + bug_report + build + cached + camera_enhance + card_giftcard + card_membership + card_travel + change_history + delete + delete_forever + description + dns + done + done_all + donut_large + donut_small + eject + g_translate + feedback + find_in_page + find_replace + fingerprint + flight_land + flight_takeoff + flip_to_back + flip_to_front + gavel + get_app + gif + grade + group_work + help + help_outline + highlight_off + history + redeem + record_voice_over + receipt + equalizer + closed_caption + fiber_pin + fiber_new + fiber_manual_record + fiber_dvr + open_in_browser + open_in_new + open_with + pageview + pan_tool + payment + perm_camera_mic + perm_contact_calendar + perm_data_setting + list + line_weight + line_style + lightbulb_outline + launch + language + label_outline + label + invert_colors + input + info_outline + info + important_devices + https + http + hourglass_full + hourglass_empty + home + perm_device_information + perm_identity + perm_media + perm_phone_msg + perm_scan_wifi + pets + picture_in_picture + picture_in_picture_alt + play_for_work + lock + lock_open + lock_outline + loyalty + markunread_mailbox + motorcycle + note_add + offline_pin + opacity + query_builder + print + pregnant_woman + power_settings_new + polymer + add_alert + question_answer + remove_shopping_cart + reorder + report_problem + restore + restore_page + room + rounded_corner + rowing + fast_rewind + featured_play_list + featured_video + settings_voice + settings_remote + settings_power + settings_phone + settings_overscan + settings_input_svideo + settings_input_hdmi + settings_input_composite + settings_input_component + stars + spellcheck + speaker_notes_off + speaker_notes + shopping_cart + shopping_basket + shop_two + shop + settings_input_antenna + settings_ethernet + settings_cell + settings_brightness + settings_bluetooth + settings_backup_restore + settings_applications + settings + search + view_agenda + trending_up + trending_flat + trending_down + translate + track_changes + warning + error_outline + error + touch_app + toll + today + toc + timeline + thumbs_up_down + thumb_up + thumb_down + theaters + swap_vert + swap_horiz + supervisor_account + subject + store + view_day + view_column + view_carousel + view_array + zoom_out + zoom_in + youtube_searched_for + work + watch_later + visibility_off + visibility + view_week + view_stream + view_headline + view_list + view_module + view_quilt + assignment + assessment + aspect_ratio + announcement + android + all_out + alarm_on + alarm_off + alarm_add + check_circle + chrome_reader_mode + class + code + compare_arrows + copyright + credit_card + dashboard + date_range + format_textdirection_l_to_r + format_textdirection_r_to_l + format_underlined + functions + highlight + insert_chart + insert_comment + insert_drive_file + insert_emoticon + multiline_chart + pie_chart + pie_chart_outlined + publish + short_text + show_chart + space_bar + strikethrough_s + text_fields + assignment_ind + assignment_late + assignment_return + assignment_returned + assignment_turned_in + autorenew + backup + book + bookmark + bookmark_border + attachment + cloud + cloud_circle + cloud_done + cloud_download + cloud_off + cloud_queue + cloud_upload + create_new_folder + video_label + video_call + surround_sound + subtitles + subscriptions + stop + sort_by_alpha + snooze + keyboard_backspace + keyboard_arrow_up + keyboard_arrow_right + keyboard_arrow_left + keyboard_arrow_down + keyboard + headset_mic + headset + gamepad + keyboard + headset_mic + headset + gamepad + comment + clear_all + chat_bubble_outline + chat_bubble + chat + file_download + file_upload + folder + folder_open + folder_shared + call_made + call_end + call + business + cast + cast_connected + computer + desktop_mac + desktop_windows + developer_board + device_hub + devices_other + dock + location_on + location_off + live_help + invert_colors_off + import_export + import_contacts + forum + email + dialpad + laptop_windows + laptop_mac + laptop_chromebook + laptop + keyboard_voice + keyboard_tab + keyboard_return + keyboard_hide + keyboard_capslock + keyboard_arrow_down + keyboard_arrow_left + keyboard_arrow_right + keyboard_arrow_up + keyboard_backspace + loyalty + lock_outline + lock_open + lock + perm_data_setting + perm_contact_calendar + perm_camera_mic + payment + pan_tool + pageview + open_with + open_in_new + open_in_browser + add + add_box + add_circle + add_circle_outline + archive + backspace + block + clear + content_copy + content_cut + content_paste + create + delete_sweep + drafts + filter_list + flag + font_download + forward + gesture + inbox + link + low_priority + mail + markunread + move_to_inbox + next_week + redo + remove + remove_circle + remove_circle_outline + reply + reply_all + report + save + select_all + send + sort + border_horizontal + border_inner + border_left + settings_input_component + text_format + unarchive + undo + weekend + signal_wifi_off + storage + usb + wallpaper + widgets + wifi_lock + wifi_tethering + border_clear + border_color + sd_storage + settings_system_daydream + signal_cellular_4_bar + signal_cellular_connected_no_internet_4_bar + signal_cellular_no_sim + signal_cellular_null + signal_cellular_off + signal_wifi_4_bar + signal_wifi_4_bar_lock + battery_full + battery_charging_full + battery_alert + airplanemode_inactive + airplanemode_active + add_alarm + access_time + access_alarms + access_alarm + brightness_low + brightness_high + brightness_auto + bluetooth_searching + bluetooth_disabled + bluetooth_connected + bluetooth + battery_unknown + battery_std + graphic_eq + gps_off + gps_not_fixed + gps_fixed + dvr + devices + developer_mode + data_usage + brightness_medium + screen_rotation + screen_lock_rotation + screen_lock_portrait + screen_lock_landscape + nfc + network_wifi + network_cell + location_searching + location_disabled + border_bottom + border_all + attach_money + attach_file + format_indent_increase + format_indent_decrease + format_color_text + format_color_reset + format_color_fill + format_clear + format_bold + format_align_right + format_align_left + format_align_justify + format_align_center + drag_handle + bubble_chart + border_vertical + border_top + border_style + border_right + border_outer + format_strikethrough + format_size + format_shapes + format_quote + format_paint + format_list_numbered + format_list_bulleted + format_line_spacing + format_italic + money_off + monetization_on + mode_edit + mode_comment + merge_type + linear_scale + insert_photo + insert_link + insert_invitation + repeat_one + replay + replay_10 + replay_30 + wrap_text + vertical_align_top + vertical_align_center + vertical_align_bottom + title +

      +
      + +
      + +
      +
      +); + +const Page = () => ( +
      + +
      +
      +
      +); + +module.exports = Page; diff --git a/src/routes/app/routes/ui/routes/icons/index.js b/src/routes/app/routes/ui/routes/icons/index.js new file mode 100644 index 0000000..32a80b7 --- /dev/null +++ b/src/routes/app/routes/ui/routes/icons/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'icons', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Icons')); + }); + } +}; diff --git a/src/routes/app/routes/ui/routes/lists/components/Chat.js b/src/routes/app/routes/ui/routes/lists/components/Chat.js new file mode 100644 index 0000000..e9c2c2b --- /dev/null +++ b/src/routes/app/routes/ui/routes/lists/components/Chat.js @@ -0,0 +1,59 @@ +import React from 'react'; +// import MobileTearSheet from '../../../MobileTearSheet'; +import Avatar from 'material-ui/Avatar'; +import {List, ListItem} from 'material-ui/List'; +import Subheader from 'material-ui/Subheader'; +import Divider from 'material-ui/Divider'; +import CommunicationChatBubble from 'material-ui/svg-icons/communication/chat-bubble'; + +const ListExampleChat = () => ( +
      +
      Chat list
      +
      + + + Recent chats + } + rightIcon={} + /> + } + rightIcon={} + /> + } + rightIcon={} + /> + } + rightIcon={} + /> + } + rightIcon={} + /> + + + + Previous chats + } + /> + } + /> + + +
      +
      +); + +export default ListExampleChat; diff --git a/src/routes/app/routes/ui/routes/lists/components/Contacts.js b/src/routes/app/routes/ui/routes/lists/components/Contacts.js new file mode 100644 index 0000000..aabebbb --- /dev/null +++ b/src/routes/app/routes/ui/routes/lists/components/Contacts.js @@ -0,0 +1,71 @@ +import React from 'react'; +// import MobileTearSheet from '../../../MobileTearSheet'; +import {List, ListItem} from 'material-ui/List'; +import ActionGrade from 'material-ui/svg-icons/action/grade'; +import Divider from 'material-ui/Divider'; +import Avatar from 'material-ui/Avatar'; +import {pinkA200, transparent} from 'material-ui/styles/colors'; + +const ListExampleSimple = () => ( +
      +
      Contact list
      +
      + + + } + rightAvatar={} + /> + } + /> + } + /> + } + /> + + + + + A + + } + rightAvatar={} + /> + } + /> + } + /> + } + /> + + +
      +
      +); + +export default ListExampleSimple; diff --git a/src/routes/app/routes/ui/routes/lists/components/Folder.js b/src/routes/app/routes/ui/routes/lists/components/Folder.js new file mode 100644 index 0000000..65eb65c --- /dev/null +++ b/src/routes/app/routes/ui/routes/lists/components/Folder.js @@ -0,0 +1,61 @@ +import React from 'react'; +// import MobileTearSheet from '../../../MobileTearSheet'; +import {List, ListItem} from 'material-ui/List'; +import ActionInfo from 'material-ui/svg-icons/action/info'; +import Divider from 'material-ui/Divider'; +import Subheader from 'material-ui/Subheader'; +import Avatar from 'material-ui/Avatar'; +import FileFolder from 'material-ui/svg-icons/file/folder'; +import ActionAssignment from 'material-ui/svg-icons/action/assignment'; +import {blue500, yellow600} from 'material-ui/styles/colors'; +import EditorInsertChart from 'material-ui/svg-icons/editor/insert-chart'; + + +const ListExampleSimple = () => ( +
      +
      Folder list
      +
      + + + Folders + } />} + rightIcon={} + primaryText="Photos" + secondaryText="Jan 9, 2014" + /> + } />} + rightIcon={} + primaryText="Recipes" + secondaryText="Jan 17, 2014" + /> + } />} + rightIcon={} + primaryText="Work" + secondaryText="Jan 28, 2014" + /> + + + + Files + } backgroundColor={blue500} />} + rightIcon={} + primaryText="Vacation itinerary" + secondaryText="Jan 20, 2014" + /> + } backgroundColor={yellow600} />} + rightIcon={} + primaryText="Kitchen remodel" + secondaryText="Jan 10, 2014" + /> + + +
      +
      +); + +export default ListExampleSimple; diff --git a/src/routes/app/routes/ui/routes/lists/components/Lists.js b/src/routes/app/routes/ui/routes/lists/components/Lists.js new file mode 100644 index 0000000..b2e9392 --- /dev/null +++ b/src/routes/app/routes/ui/routes/lists/components/Lists.js @@ -0,0 +1,59 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; +// Material UI +import ListExampleSimple from './Simple'; +import ListExampleChat from './Chat'; +import ListExampleContacts from './Contacts'; +import ListExampleFolder from './Folder'; +import ListExampleNested from './Nested'; +import ListExampleSettings from './Settings'; +import ListExamplePhone from './Phone'; +import ListExampleMessages from './Messages'; +import ListExampleSelectable from './Selectable'; + +const Lists = () => ( +
      + +
      +
      +

      Material Lists

      +
      + +
      + +
      +
      + +
      +
      + +
      + +
      + +
      +
      + +
      +
      + +
      + +
      + +
      +
      + +
      +
      + +
      + +
      +
      +
      +
      +
      + ); + +module.exports = Lists; diff --git a/src/routes/app/routes/ui/routes/lists/components/Messages.js b/src/routes/app/routes/ui/routes/lists/components/Messages.js new file mode 100644 index 0000000..b284e08 --- /dev/null +++ b/src/routes/app/routes/ui/routes/lists/components/Messages.js @@ -0,0 +1,98 @@ +import React from 'react'; +// import MobileTearSheet from '../../../MobileTearSheet'; +import {List, ListItem} from 'material-ui/List'; +import Divider from 'material-ui/Divider'; +import Subheader from 'material-ui/Subheader'; +import Avatar from 'material-ui/Avatar'; +import {grey400, darkBlack, lightBlack} from 'material-ui/styles/colors'; +import IconButton from 'material-ui/IconButton'; +import MoreVertIcon from 'material-ui/svg-icons/navigation/more-vert'; +import IconMenu from 'material-ui/IconMenu'; +import MenuItem from 'material-ui/MenuItem'; +import DropDownMenu from 'material-ui/DropDownMenu'; + + +const iconButtonElement = ( + + + +); + +const rightIconMenu = ( + + Reply + Forward + Archive + +); + +const ListExampleSimple = () => ( +
      + {/*
      Support Requests
      */} +
      + + + + + + + + + + + + + + + + + + + } + rightIconButton={rightIconMenu} + primaryText="" + secondaryText={ +

      + ride #f43564
      + Can't use app.

      + } + secondaryTextLines={2} + /> + + } + rightIconButton={rightIconMenu} + primaryText="" + secondaryText={ +

      + ride #ww3564
      + Driver never showed up. +

      + } + secondaryTextLines={2} + /> + + } + rightIconButton={rightIconMenu} + primaryText="" + secondaryText={ +

      + Ride #WQ564
      + I need a wheelchair. +

      + } + secondaryTextLines={2} + /> + +
      +
      +
      +); + +export default ListExampleSimple; diff --git a/src/routes/app/routes/ui/routes/lists/components/Nested.js b/src/routes/app/routes/ui/routes/lists/components/Nested.js new file mode 100644 index 0000000..861a374 --- /dev/null +++ b/src/routes/app/routes/ui/routes/lists/components/Nested.js @@ -0,0 +1,47 @@ +import React from 'react'; +// import MobileTearSheet from '../../../MobileTearSheet'; +import {List, ListItem} from 'material-ui/List'; +import ActionGrade from 'material-ui/svg-icons/action/grade'; +import ContentInbox from 'material-ui/svg-icons/content/inbox'; +import ContentDrafts from 'material-ui/svg-icons/content/drafts'; +import ContentSend from 'material-ui/svg-icons/content/send'; +import Subheader from 'material-ui/Subheader'; + +const ListExampleSimple = () => ( +
      +
      Nested list
      +
      + + + Nested List Items + } /> + } /> + } + initiallyOpen + primaryTogglesNestedList + nestedItems={[ + } + />, + } + disabled + nestedItems={[ + } />, + ]} + />, + ]} + /> + + +
      +
      +); + +export default ListExampleSimple; diff --git a/src/routes/app/routes/ui/routes/lists/components/Phone.js b/src/routes/app/routes/ui/routes/lists/components/Phone.js new file mode 100644 index 0000000..eae1f43 --- /dev/null +++ b/src/routes/app/routes/ui/routes/lists/components/Phone.js @@ -0,0 +1,47 @@ +import React from 'react'; +// import MobileTearSheet from '../../../MobileTearSheet'; +import {List, ListItem} from 'material-ui/List'; +import Divider from 'material-ui/Divider'; +import CommunicationCall from 'material-ui/svg-icons/communication/call'; +import CommunicationChatBubble from 'material-ui/svg-icons/communication/chat-bubble'; +import {indigo500} from 'material-ui/styles/colors'; +import CommunicationEmail from 'material-ui/svg-icons/communication/email'; + +const ListExampleSimple = () => ( +
      +
      Simple list
      +
      + + + } + rightIcon={} + primaryText="(650) 555 - 1234" + secondaryText="Mobile" + /> + } + primaryText="(323) 555 - 6789" + secondaryText="Work" + /> + + + + } + primaryText="aliconnors@example.com" + secondaryText="Personal" + /> + + + +
      +
      +); + +export default ListExampleSimple; diff --git a/src/routes/app/routes/ui/routes/lists/components/Selectable.js b/src/routes/app/routes/ui/routes/lists/components/Selectable.js new file mode 100644 index 0000000..e908563 --- /dev/null +++ b/src/routes/app/routes/ui/routes/lists/components/Selectable.js @@ -0,0 +1,83 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +// import MobileTearSheet from '../../../MobileTearSheet'; +import {List, ListItem, makeSelectable} from 'material-ui/List'; +import Avatar from 'material-ui/Avatar'; +import Subheader from 'material-ui/Subheader'; + +let SelectableList = makeSelectable(List); + +function wrapState(ComposedComponent) { + return class SelectableList extends React.Component { + static propTypes = { + children: PropTypes.node.isRequired, + defaultValue: PropTypes.number.isRequired, + }; + + componentWillMount() { + this.setState({ + selectedIndex: this.props.defaultValue, + }); + } + + handleRequestChange = (event, index) => { + this.setState({ + selectedIndex: index, + }); + }; + + render() { + return ( + + {this.props.children} + + ); + } + }; +} + +SelectableList = wrapState(SelectableList); + + +const ListExampleSelectable = () => ( +
      +
      Selectable list
      +
      + + Selectable Contacts + } + nestedItems={[ + } + />, + ]} + /> + } + /> + } + /> + } + /> + +
      +
      +); + +export default ListExampleSelectable; diff --git a/src/routes/app/routes/ui/routes/lists/components/Settings.js b/src/routes/app/routes/ui/routes/lists/components/Settings.js new file mode 100644 index 0000000..e7e75b8 --- /dev/null +++ b/src/routes/app/routes/ui/routes/lists/components/Settings.js @@ -0,0 +1,39 @@ +import React from 'react'; +// import MobileTearSheet from '../../../MobileTearSheet'; +import {List, ListItem} from 'material-ui/List'; +import Subheader from 'material-ui/Subheader'; +import Divider from 'material-ui/Divider'; +import Checkbox from 'material-ui/Checkbox'; +import Toggle from 'material-ui/Toggle'; + +const ListExampleSimple = () => ( +
      +
      Settings list
      +
      + + + + + + + Priority Interruptions + } /> + } /> + } /> + + + + Hangout Notifications + } /> + } /> + } /> + + +
      +
      +); + +export default ListExampleSimple; diff --git a/src/routes/app/routes/ui/routes/lists/components/Simple.js b/src/routes/app/routes/ui/routes/lists/components/Simple.js new file mode 100644 index 0000000..45548c9 --- /dev/null +++ b/src/routes/app/routes/ui/routes/lists/components/Simple.js @@ -0,0 +1,31 @@ +import React from 'react'; +// import MobileTearSheet from '../../../MobileTearSheet'; +import {List, ListItem} from 'material-ui/List'; +import ContentInbox from 'material-ui/svg-icons/content/inbox'; +import ActionGrade from 'material-ui/svg-icons/action/grade'; +import ContentSend from 'material-ui/svg-icons/content/send'; +import ContentDrafts from 'material-ui/svg-icons/content/drafts'; +import Divider from 'material-ui/Divider'; +import ActionInfo from 'material-ui/svg-icons/action/info'; + +const ListExampleSimple = () => ( +
      +
      +
      + + + } /> + } /> + } /> + + + + } /> + } /> + + +
      +
      +); + +export default ListExampleSimple; diff --git a/src/routes/app/routes/ui/routes/lists/index.js b/src/routes/app/routes/ui/routes/lists/index.js new file mode 100644 index 0000000..240dc5f --- /dev/null +++ b/src/routes/app/routes/ui/routes/lists/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'lists', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Lists')); + }); + } +}; diff --git a/src/routes/app/routes/ui/routes/menus/components/DropdownMenu.js b/src/routes/app/routes/ui/routes/menus/components/DropdownMenu.js new file mode 100644 index 0000000..2c1809d --- /dev/null +++ b/src/routes/app/routes/ui/routes/menus/components/DropdownMenu.js @@ -0,0 +1,148 @@ +import React from 'react'; +import DropDownMenu from 'material-ui/DropDownMenu'; +import MenuItem from 'material-ui/MenuItem'; + +class DropDownMenuSimpleExample extends React.Component { + + constructor(props) { + super(props); + this.state = {value: 2}; + } + + handleChange = (event, index, value) => this.setState({value}); + + render() { + return ( +
      +
      Simple example
      +
      + + + + + + + +
      +
      + ); + } +} + +// +class DropDownMenuOpenImmediateExample extends React.Component { + + constructor(props) { + super(props); + this.state = {value: 2}; + } + + handleChange = (event, index, value) => this.setState({value}); + + render() { + return ( +
      +
      Open Immediate example
      +
      + + + + + + + +
      +
      + ); + } +} + +// +const items = []; +for (let i = 0; i < 100; i++) { + items.push(); +} + +class DropDownMenuLongMenuExample extends React.Component { + + constructor(props) { + super(props); + this.state = {value: 10}; + } + + handleChange = (event, index, value) => this.setState({value}); + + render() { + return ( +
      +
      Long example
      +
      + + {items} + +
      +
      + ); + } +} + +// +class DropDownMenuLabeledExample extends React.Component { + + constructor(props) { + super(props); + this.state = {value: 2}; + } + + handleChange = (event, index, value) => this.setState({value}); + + render() { + return ( +
      +
      Label example
      +
      + + + + + + +
      +
      + ); + } +} + +const DropdownSection = () => ( +
      +

      Dropdown Menu

      + +
      +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      + +
      +
      + +
      +
      +
      +
      +
      +
      +); + +module.exports = DropdownSection; diff --git a/src/routes/app/routes/ui/routes/menus/components/IconMenu.js b/src/routes/app/routes/ui/routes/menus/components/IconMenu.js new file mode 100644 index 0000000..9280179 --- /dev/null +++ b/src/routes/app/routes/ui/routes/menus/components/IconMenu.js @@ -0,0 +1,148 @@ +import React from 'react'; +import IconMenu from 'material-ui/IconMenu'; +import MenuItem from 'material-ui/MenuItem'; +import IconButton from 'material-ui/IconButton/IconButton'; +import MoreVertIcon from 'material-ui/svg-icons/navigation/more-vert'; + +const AvatarExampleSimple = () => ( +
      + } + anchorOrigin={{horizontal: 'left', vertical: 'top'}} + targetOrigin={{horizontal: 'left', vertical: 'top'}} + > + + + + + + + } + anchorOrigin={{horizontal: 'left', vertical: 'bottom'}} + targetOrigin={{horizontal: 'left', vertical: 'bottom'}} + > + + + + + + + } + anchorOrigin={{horizontal: 'right', vertical: 'bottom'}} + targetOrigin={{horizontal: 'right', vertical: 'bottom'}} + > + + + + + + + } + anchorOrigin={{horizontal: 'right', vertical: 'top'}} + targetOrigin={{horizontal: 'right', vertical: 'top'}} + > + + + + + + +
      +); + +const IconMenuExampleScrollable = () => ( + } + anchorOrigin={{horizontal: 'left', vertical: 'top'}} + targetOrigin={{horizontal: 'left', vertical: 'top'}} + maxHeight={272} + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +); + + +const IconMenuSection = () => ( +
      +

      Icon Menu

      +
      +
      +
      +
      Icon Menu positioning
      +
      + +
      +

      Simple Icon Menus demonstrating some of the layouts possible using the anchorOrigin and targetOrigin properties.

      +
      +
      +
      +
      +
      +
      +
      Scrollable Icon Menu
      +
      + +
      +

      The maxHeight property limits the height of the menu, above which it will be scrollable.

      +
      +
      +
      +
      +
      +
      + ); + +module.exports = IconMenuSection; diff --git a/src/routes/app/routes/ui/routes/menus/components/Menu.js b/src/routes/app/routes/ui/routes/menus/components/Menu.js new file mode 100644 index 0000000..847d4e1 --- /dev/null +++ b/src/routes/app/routes/ui/routes/menus/components/Menu.js @@ -0,0 +1,192 @@ +import React from 'react'; +import Paper from 'material-ui/Paper'; +import Menu from 'material-ui/Menu'; +import MenuItem from 'material-ui/MenuItem'; +import Divider from 'material-ui/Divider'; + +import RemoveRedEye from 'material-ui/svg-icons/image/remove-red-eye'; +import PersonAdd from 'material-ui/svg-icons/social/person-add'; +import ContentLink from 'material-ui/svg-icons/content/link'; +import ContentCopy from 'material-ui/svg-icons/content/content-copy'; +import Download from 'material-ui/svg-icons/file/file-download'; +import Delete from 'material-ui/svg-icons/action/delete'; +import FontIcon from 'material-ui/FontIcon'; + +import ArrowDropRight from 'material-ui/svg-icons/navigation-arrow-drop-right'; + +const style = { + display: 'inline-block', + margin: '16px 32px 16px 0', +}; + +const MenuExampleSimple = () => ( +
      +
      Simple examples
      +
      + + + + + + + + + + + + + + + + +
      +
      +); + +const MenuExampleDisable = () => ( +
      +
      Disabled items
      +
      + + + + + + + + + + + + + + + + + + + + +
      +
      +); + +// +const iconsStyle = { + paper: { + display: 'inline-block', + float: 'left', + margin: '16px 32px 16px 0', + }, + rightIcon: { + textAlign: 'center', + lineHeight: '24px', + }, +}; +const MenuExampleIcons = () => ( +
      +
      Icons example
      +
      + + + } /> + } /> + } /> + + } /> + } /> + + } /> + + + + + + } /> + settings} /> + settings + } + /> + ¶} /> + §} /> + + +
      +
      +); + +// +const secondaryTextStyle = { + display: 'inline-block', + float: 'left', + margin: '16px 32px 16px 0', +}; + +const MenuExampleSecondary = () => ( +
      +
      Secondary text
      +
      + + + + + + + + + + } /> + } /> + } /> + } /> + } /> + + + + + + + + + + + + + + + + + + +
      +
      +); + + +const MenuSection = () => ( +
      +

      Material Menu

      + +
      +
      + +
      +
      + +
      +
      +
      +
      + +
      +
      + +
      +
      +
      +); + +module.exports = MenuSection; diff --git a/src/routes/app/routes/ui/routes/menus/components/Menus.js b/src/routes/app/routes/ui/routes/menus/components/Menus.js new file mode 100644 index 0000000..e981635 --- /dev/null +++ b/src/routes/app/routes/ui/routes/menus/components/Menus.js @@ -0,0 +1,17 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; +import Menu from './Menu'; +import IconMenu from './IconMenu'; +import DropdownMenu from './DropdownMenu'; + +const Menus = () => ( +
      + +
      +
      +
      +
      +
      +); + +module.exports = Menus; diff --git a/src/routes/app/routes/ui/routes/menus/index.js b/src/routes/app/routes/ui/routes/menus/index.js new file mode 100644 index 0000000..076c2ff --- /dev/null +++ b/src/routes/app/routes/ui/routes/menus/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'menus', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Menus')); + }); + } +}; diff --git a/src/routes/app/routes/ui/routes/timeline/components/Timeline.js b/src/routes/app/routes/ui/routes/timeline/components/Timeline.js new file mode 100644 index 0000000..96d76cb --- /dev/null +++ b/src/routes/app/routes/ui/routes/timeline/components/Timeline.js @@ -0,0 +1,170 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; + +export const Timeline = () => ( +
      +
      + + +
      +
      +
      +
      3 min ago
      +
      camera
      +
      +

      Go hiking

      +

      Consectetur adipisicing elit. Error, accusantium debitis voluptatem dolore excepturi ducimus fugiat nulla perspiciatis quo ipsum non eligendi nisi veniam maxime in quas atque omnis cumque!

      +
      +
      +
      +
      + +
      +
      +
      +
      1 hour ago
      +
      shopping_cart
      +
      +

      Buy some toys

      +

      Ullam, commodi, modi, impedit nostrum odio sit odit necessitatibus accusantium enim voluptates culpa cupiditate cum pariatur a recusandae tenetur aspernatur at beatae.

      +
      +
      +
      +
      + +
      +
      +
      +
      3 hours ago
      +
      camera
      +
      +

      Soluta nihil

      +

      Incidunt, molestias odio soluta nihil accusantium sit nostrum doloremque. Recusandae, ullam, odio consequatur facere totam reiciendis similique dicta explicabo!

      +
      +
      +
      +
      + +
      +
      +
      +
      7 hours ago
      +
      check
      +
      +

      Odio sit odit necessitatibus

      +

      Ullam, commodi, modi, impedit nostrum odio sit odit necessitatibus accusantium enim voluptates culpa cupiditate cum pariatur a recusandae tenetur aspernatur at beatae.

      +
      +
      +
      +
      + +
      +
      +
      +
      10 hours ago
      +
      alarm
      +
      +

      Accusantium sint

      +

      Ipsam, minus, quam, sit officiis accusantium sint voluptates voluptatibus minima cum non quos corrupti dolorem eligendi modi eius magnam unde!

      +
      +
      +
      +
      + + + + +
      +
      +
      +
      8:30 PM
      +
      comment
      +
      +

      Enim asperiores facere

      +

      Odit, iusto, dolorem, aut ipsum rem atque enim asperiores facere tempore explicabo omnis corporis hic! Molestias, dolores, iure esse at illo aliquam temporibus in eum cupiditate magni velit eveniet unde facilis quisquam numquam nihil atque tempore vitae porro maxime repellendus quas a sit repellat delectus expedita nam natus fugiat ut ipsam eaque voluptates omnis ratione?

      +
      +
      +
      +
      + +
      +
      +
      +
      7:00 PM
      +
      folder
      +
      +

      Illum veniam atque

      +

      Illum veniam atque iste voluptatem eos saepe quisquam aperiam voluptatum sunt.

      +
      +
      +
      +
      + +
      +
      +
      +
      12:55 PM
      +
      folder
      +
      +

      Voluptas molestias

      +

      At, veniam, officia pariatur voluptas molestias nobis distinctio quo temporibus! Nisi, fugit, ipsum, veritatis, optio consectetur nam molestiae quidem placeat deleniti animi ad nobis iure modi eius recusandae odio adipisci nesciunt.

      +
      +
      +
      +
      + +
      +
      +
      +
      10:13 AM
      +
      email
      +
      +

      Nulla magni sequi

      +

      Laborum, ducimus, perferendis nulla magni sequi cumque nisi eum praesentium omnis voluptas id molestias adipisci accusamus nobis totam. Odit, hic suscipit necessitatibus quos

      +
      +
      +
      +
      + +
      +
      +
      +
      9:10 AM
      +
      card_giftcard
      +
      +

      Sed cumque temporibus

      +

      Deserunt sed cumque temporibus. Doloribus, iste, sit recusandae fugiat assumenda ea magni at doloremque ipsum amet molestias error mollitia maxime ad alias eos id cumque corporis placeat nisi a quaerat nemo magnam ab numquam ratione facere dolorum. Cumque, dolores, sint molestiae eaque quibusdam illo error!

      +
      +
      +
      +
      + +
      +
      +); + +const Page = () => ( +
      + +
      +
      +
      +); + +module.exports = Page; diff --git a/src/routes/app/routes/ui/routes/timeline/index.js b/src/routes/app/routes/ui/routes/timeline/index.js new file mode 100644 index 0000000..3fbba9d --- /dev/null +++ b/src/routes/app/routes/ui/routes/timeline/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'timeline', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Timeline')); + }); + } +}; diff --git a/src/routes/app/routes/users/components/user.js b/src/routes/app/routes/users/components/user.js new file mode 100644 index 0000000..7c8459e --- /dev/null +++ b/src/routes/app/routes/users/components/user.js @@ -0,0 +1,911 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import QueueAnim from 'rc-queue-anim'; +import $ from 'jquery'; +import dt from 'datatables.net'; +import responsive from 'datatables.net-responsive'; +import { + Row, + Col, + Grid, + Table, +} from '@sketchpixy/rubix'; +import moment from 'moment'; +import { NEMTLocation } from '../../../components/NEMTLocation'; +import ContentAdd from 'material-ui/svg-icons/content/add'; +import { Card, CardActions, CardHeader, CardMedia, CardTitle, CardText } from 'material-ui/Card'; +import FlatButton from 'material-ui/FlatButton'; +import RaisedButton from 'material-ui/RaisedButton'; +import GoogleAddressComponent from '../../organization/components/GoogleAddressComponent'; +import Delete from 'material-ui/svg-icons/action/delete'; +import IconButton from 'material-ui/IconButton'; +import ContactComponent from '../../organization/components/ContactComponent'; +import Instance from '../../../../../components/Connection'; + +import { + authorize, + loggedUser, + bcbsaScheduler, + bcbsiAdmin, + bcbsiScheduler, + planAdmin, + programsupportSupport, + providerAdmin, + superAdmin, + techsupportAdmin, +} from 'utils/authorization'; + +dt.responsive = responsive; +$.dataTable = dt; + +const formatTime = function (sec_num) { + var hours = Math.floor(sec_num / 3600); + var minutes = Math.floor((sec_num - (hours * 3600)) / 60); + var seconds = sec_num - (hours * 3600) - (minutes * 60); + + if (hours < 10) { hours = "0" + hours; } + if (minutes < 10) { minutes = "0" + minutes; } + if (seconds < 10) { seconds = "0" + seconds; } + return hours + ':' + minutes + ':' + seconds; +} + +const formatPhoneNumber = function (s) { + var s2 = ("" + s).replace(/\D/g, ''); + var m = s2.match(/^(\d{3})(\d{3})(\d{4})$/); + return (!m) ? null : "(" + m[1] + ") " + m[2] + "-" + m[3]; +} + +const Address = (props) => { + let list = []; + let buttonStyle = { + marginTop: -10 + } + + if (props.addresses && props.addresses !== null && props.addresses.length > 0) { + const handleRemoveAddress = (a) => { + if (props.onAddressRemoved) { + props.onAddressRemoved(a); + } + } + + list = props.addresses.map((c, i) => { + let name = c.name; + switch (c.address_type) { + case "home": + case "work": + name = c.address_type_name; + } + if (i === 0) { + return (
      +
      + Name + {name} +
      +
      + Address + {c.address} +
      +
      + Actions + + {!props.readOnly && + handleRemoveAddress(c)} + style={buttonStyle} + > + + + } + +
      +
      ); + } else { + return (
      +
      + {name} +
      +
      + {c.address} +
      +
      + handleRemoveAddress(c)} style={buttonStyle}> +
      +
      ); + } + }); + } + + return ( +
      +
      +
      +
      +
      +
      + Addresses +
      +
      + {!props.readOnly && + + } +
      +
      + {list} +
      +
      +
      +
      + ) +}; + +const Main = ({ user, onAddressAdded, onAddressRemoved, readOnly }) => { + return ( +
      +
      +
      +
      +
      +
      +
      +
      + +
      +
      + ); +}; + +class DatatableComponent extends React.Component { + constructor(props) { + super(props); + this.props = props; + } + + state = { + items: [], + data: [] + } + + componentWillReceiveProps(nextProps) { + const rides = nextProps.user.rides; + const state = this; + + let list = rides.map(v => { + var data = { + id: v.ride_uuid, + user_id: v.user.useruuid, + memberName: v.passenger.first_name + ' ' + v.passenger.last_name, + time: '', + pickup: '', + destination: '', + status: v.status.value, + eta: 0, + duration: 0, + mileage: '0 miles', + vehicle: v.vehicle.color + ' ' + v.vehicle.make + ' ' + v.vehicle.model, + plate: v.vehicle.license_plate, + mobile: v.passenger.phone_number, + lyftID: v.internal_id, + rideID: v.ride_uuid + }; + + if (v.visit_date) data.time = new Date(v.visit_time); + + if (v.route.origin.name && v.route.origin.name !== '') data.pickup = v.route.origin.name; + else data.pickup = v.route.origin.address; + + if (v.route.destination.name && v.route.destination.name !== '') data.destination = v.route.destination.name; + else data.destination = v.route.destination.address; + + if (v.route.distance) data.mileage = v.route.distance + ' miles'; + if (v.route.duration) data.duration = formatTime(v.route.duration); + + return data; + }) + + $.fn.dataTable.moment = function (format, locale) { + var types = $.fn.dataTable.ext.type; + + // Add type detection + types.detect.unshift(function (d) { + return moment(d, format, locale, true).isValid() ? + 'moment-' + format : + null; + }); + + // Add sorting method - use an integer for the sorting + types.order['moment-' + format + '-pre'] = function (d) { + return moment(d, format, locale, true).unix(); + }; + }; + + $.fn.dataTable.moment('MM/DD/YYYY - h:mm a'); + + state.setState(Object.assign(state.state, { rides: list })); + if (state.state.rides.length > 0) { + $(ReactDOM.findDOMNode(state.example)) + .addClass('nowrap') + .dataTable({ + responsive: true, + data: state.state.rides, + columns: [ + { + data: "time", + fnCreatedCell: function (nTd, sData, oData, iRow, iCol) { + $(nTd).html("" + moment(oData.time).format('MM/DD/YYYY - h:mm a') + ""); + } + }, + { data: "status" }, + { + data: "pickup", + fnCreatedCell: function (nTd, sData, oData, iRow, iCol) { + $(nTd).html("" + oData.pickup + ""); + } + }, + { + data: "destination", + fnCreatedCell: function (nTd, sData, oData, iRow, iCol) { + $(nTd).html("" + oData.destination + ""); + }, + render: function (data, type, row) { + return "" + row.destination + ""; + } + }, + + { data: "eta" }, + { data: "duration" }, + { data: "mileage" }, + { data: "vehicle" }, + { data: "plate" }, + { data: "mobile" }, + { + data: "lyftID", + fnCreatedCell: function (nTd, sData, oData, iRow, iCol) { + $(nTd).html("" + oData.lyftID + ""); + }, + render: function (data, type, row) { + return "" + row.lyftID + ""; + } + }, + { + data: "rideID", + fnCreatedCell: function (nTd, sData, oData, iRow, iCol) { + $(nTd).html("" + oData.rideID + ""); + }, + render: function (data, type, row) { + return "" + row.rideID + ""; + } + } + ], + dom: 'Bfrtip', + buttons: [ + 'copy', 'pdf' + ], + // columns: TABLE_COLUMNS_SORT_STYLE, + responsive: true, + "bStateSave": true, + details: { + type: 'inline' + }, + columnDefs: [ + { targets: [-1, -3], orderable: true, className: 'dt-body-right mdl-data-table__cell--non-numeric' } + ], + order: [[0, 'asc']] + }); + + this.decorateButtons(); + this.decorateSelect(); + this.decorateSearchBar(); + this.decorateColumns(); + } + } + + componentDidMount() { + const rides = this.props.user.rides; + const state = this; + + if (rides.length > 0) { + let list = rides.map(v => { + var data = { + id: v.ride_uuid, + user_id: v.user.useruuid, + memberName: v.passenger.first_name + ' ' + v.passenger.last_name, + time: '', + pickup: '', + destination: '', + status: v.status.value, + eta: 0, + duration: 0, + mileage: '0 miles', + vehicle: v.vehicle.color + ' ' + v.vehicle.make + ' ' + v.vehicle.model, + plate: v.vehicle.license_plate, + mobile: v.passenger.phone_number, + lyftID: v.internal_id, + rideID: v.ride_uuid + }; + + if (v.visit_date) data.time = new Date(v.visit_time); + + if (v.route.origin.name && v.route.origin.name !== '') data.pickup = v.route.origin.name; + else data.pickup = v.route.origin.address; + + if (v.route.destination.name && v.route.destination.name !== '') data.destination = v.route.destination.name; + else data.destination = v.route.destination.address; + + if (v.route.distance) data.mileage = v.route.distance + ' miles'; + if (v.route.duration) data.duration = formatTime(v.route.duration); + + return data; + }) + + $.fn.dataTable.moment = function (format, locale) { + var types = $.fn.dataTable.ext.type; + + // Add type detection + types.detect.unshift(function (d) { + return moment(d, format, locale, true).isValid() ? + 'moment-' + format : + null; + }); + + // Add sorting method - use an integer for the sorting + types.order['moment-' + format + '-pre'] = function (d) { + return moment(d, format, locale, true).unix(); + }; + }; + + $.fn.dataTable.moment('MM/DD/YYYY - h:mm a'); + + state.setState(Object.assign(state.state, { rides: list })); + + $(ReactDOM.findDOMNode(state.example)) + .addClass('nowrap') + .dataTable({ + responsive: true, + data: state.state.rides, + columns: [ + { + data: "time", + fnCreatedCell: function (nTd, sData, oData, iRow, iCol) { + $(nTd).html("" + moment(oData.time).format('MM/DD/YYYY - h:mm a') + ""); + } + }, + { data: "status" }, + { + data: "pickup", + fnCreatedCell: function (nTd, sData, oData, iRow, iCol) { + $(nTd).html("" + oData.pickup + ""); + } + }, + { + data: "destination", + fnCreatedCell: function (nTd, sData, oData, iRow, iCol) { + $(nTd).html("" + oData.destination + ""); + }, + render: function (data, type, row) { + return "" + row.destination + ""; + } + }, + + { data: "eta" }, + { data: "duration" }, + { data: "mileage" }, + { data: "vehicle" }, + { data: "plate" }, + { data: "mobile" }, + { + data: "lyftID", + fnCreatedCell: function (nTd, sData, oData, iRow, iCol) { + $(nTd).html("" + oData.lyftID + ""); + }, + render: function (data, type, row) { + return "" + row.lyftID + ""; + } + }, + { + data: "rideID", + fnCreatedCell: function (nTd, sData, oData, iRow, iCol) { + $(nTd).html("" + oData.rideID + ""); + }, + render: function (data, type, row) { + return "" + row.rideID + ""; + } + } + ], + dom: 'Bfrtip', + buttons: [ + 'copy', 'pdf' + ], + // columns: TABLE_COLUMNS_SORT_STYLE, + responsive: true, + "bStateSave": true, + details: { + type: 'inline' + }, + columnDefs: [ + { targets: [-1, -3], orderable: true, className: 'dt-body-right mdl-data-table__cell--non-numeric' } + ], + order: [[0, 'asc']] + }); + + this.decorateButtons(); + this.decorateSelect(); + this.decorateSearchBar(); + this.decorateColumns(); + } + } + + decorateColumns() { + let cols = $('td'); + let colStyle = { + 'font-family': 'Roboto, sans-serif', + 'font-size': '13px', + 'font-weight': '300', + 'text-align': 'left', + }; + cols.css(colStyle); + cols.removeClass('sorting_1'); + + let headers = $('th'); + let headerStyle = { + 'color': 'rgb(158, 158, 158)', + 'text-align': 'left', + 'font-weight': '600', + 'font-size': '12px' + }; + headers.css(headerStyle); + + let oddRows = $('.odd'); + let evenRows = $('.even'); + + let oddStyle = { + 'background': 'rgba(127, 221, 233, 0.4)', + 'text-shadow': 'none', + 'border-bottom': '1px solid rgb(224, 224, 224)', + 'color': 'rgba(0, 0, 0, 0.87)', + 'height': '45px' + }; + oddRows.css(oddStyle); + + let evenStyle = oddStyle; + evenStyle['background'] = '#fff'; + + evenRows.css(evenStyle); + } + + decorateSelect() { + let instance = this; + let selectElement = $('select[class]'); + selectElement.addClass('mdl'); + + selectElement.click(function () { + instance.decorateButtons(); + }); + + let selectLabel = $('#DataTables_Table_0_length > label'); + let style = { + 'color': 'rgb(158, 158, 158)', + 'text-align': 'left', + 'font-weight': '500', + 'font-size': '11px' + }; + selectLabel.css(style); + } + + decorateSearchBar() { + let instance = this; + + let searchbar = $('input[type="search"]'); + searchbar.bind('input', function () { + instance.decorateButtons(); + instance.decorateColumns(); + }); + + searchbar.addClass('mdl-textfield__input'); + searchbar.attr('placeholder', ''); + + let searchLabel = $('#DataTables_Table_0_filter > label'); + searchLabel.css({ 'color': '#fff' }); + searchbar.css({ 'color': 'rgb(158, 158, 158)' }) + + let searchFilter = $('#DataTables_Table_0_filter'); + searchFilter.append(''); + } + + decorateButtons() { + let instance = this; + let paginateButtons = $('a.paginate_button'); + paginateButtons.addClass('mdl-button'); + + let selectedButton = $('a.paginate_button.current'); + selectedButton.addClass('mdl-button mdl-button--raised mdl-button--colored'); + + let style = { + 'background': 'rgb(0, 188, 212)', + 'font-weight': '400', + }; + selectedButton.css(style); + + paginateButtons.click(function () { + instance.decorateButtons(); + instance.decorateColumns(); + }); + + let sortingButtons = $('th.sorting, th.sorting_asc, th.sorting_desc'); + sortingButtons.click(function () { + instance.decorateButtons(); + instance.decorateColumns(); + }); + + let entriesLabel = $('#DataTables_Table_0_info'); + entriesLabel.css({ + 'color': 'rgb(158, 158, 158)', + 'text-align': 'left', + 'font-weight': '400', + 'font-size': '12px' + }); + } + + render() { + return ( +
      +
      +
      +
      +

      Rides for this Member

      + this.example = c} className='display' cellSpacing='0' width='100%'> + + + + + + + + + + + + + + + + +
      Pickup TimeStatusOriginDestinationETADurationMileageVehiclePlateDriver PhoneLyft IDRide ID
      +
      +
      +
      +
      + ); + } +} + +const Rides = (props) => { + let rides = []; + let list = []; + + if (props.user.rides && props.user.rides !== null && props.user.rides.length > 0) { + rides = props.user.rides; + rides.forEach(c => { + let visit_time = "" + if (c.visit_time) visit_time = moment(new Date(c.visit_time)).format('MM/DD/YYYY - h:mm a'); + list.push( +
      +
      +
      + + +
      + Destination:
      {c.route.destination.name}
      +
      +
      + Date:
      {visit_time}
      +
      +
      + Status:
      {c.status.value}
      +
      +
      +
      +
      ); + }, this); + } + + return ( +
      +
      +
      +
      +
      +
      +
      +
      + Rides +
      +
      + {list} +
      +
      +
      +
      +
      +
      + ) +}; + +const ContactInfo = (props) => { + let contact = []; + let list = []; + let buttonStyle = { + marginTop: -10 + } + if (props.user.contacts && props.user.contacts !== null && props.user.contacts.length > 0) { + contact = props.user.contacts; + contact.forEach(c => { + let contact = c.contact + if (c.type.key === 'phone') { + contact = contact.replace('+1', ''); + contact = formatPhoneNumber(contact); + } + + list.push(
      +
      + {c.type.value}: +
      +
      + {contact} +
      +
      ); + }, this); + } + + return ( +
      +
      +
      +
      +
      +
      + Contact Info +
      +
      + {!props.readOnly && + + } +
      +
      + {list} +
      +
      +
      +
      + ) +}; + +const Header = (props) => { + let phonenumber = ""; + if (props.user.phonenumber && props.user.phonenumber !== null && props.user.phonenumber !== "") { + phonenumber = props.user.phonenumber + phonenumber = phonenumber.replace('+1', ''); + phonenumber = formatPhoneNumber(phonenumber); + } + + let profileName = ""; + let organizationName = ""; + let organizationType = ""; + + let status = "Active"; + if (!props.user.active) { + status = "Inactive"; + } + if (props.user.profiles && props.user.profiles.length > 0) { + profileName = props.user.profiles[0].name; + organizationName = props.user.profiles[0].organization.name; + organizationType = props.user.profiles[0].organization.type.name; + + if (!props.user.profiles[0].active) { + status = "Inactive"; + } + if (props.user.profiles[0].suspended) { + status = "Suspended"; + } + if (props.user.profiles[0].blocked) { + status = "Blocked"; + } + } + + return ( +
      +
      +

      User Details

      +
      +
      +
      +
      +
      + +
      + Full Name + {props.user.name} +
      + +
      + Email + {props.user.email} +
      + +
      + Mobile + {phonenumber} +
      + +
      + Role + {profileName} +
      + + +
      + Organization + {organizationName} +
      + +
      + Organization Type + {organizationType} +
      + +
      + Status + {status} +
      + +
      + Created + {moment(props.user.createat).format('MM/DD/YYYY - h:mm a')} +
      + +
      + Updated + {moment(props.user.updateat).format('MM/DD/YYYY - h:mm a')} +
      + +
      +
      +
      +
      +
      +
      +
      + ) +}; + +class User extends React.Component { + constructor(props) { + super(props); + this.props = props; + this.state = { + user: { + "useruuid": "", + "name": "", + "email": "", + "phonenumber": "", + "profile": "", + "contacts": [], + "role": "Scheduler", + "status": "Active", + "organization": "Mercy Hospital", + "organizationType": "Provider", + "updated": "01/22/2018", + "created": "01/23/2018", + "profiles": [], + "contacts": [], + "rides": [], + "addresses": [], + } + } + + this.getUser = this.getUser.bind(this); + this.handleAddressAdded = this.handleAddressAdded.bind(this); + this.handleAddressRemoved = this.handleAddressRemoved.bind(this); + } + + componentDidMount() { + const self = this; + const useruuid = this.props.params.user_uuid; + this.getUser(useruuid) + } + + getUser(useruuid) { + const self = this; + Instance.getRawConn().get(`/v1/nemt/users/portal/${useruuid}`) + .then(res => { + self.setState(Object.assign(self.state, { user: res.data })); + }) + .catch(console.error); + } + + handleAddressAdded(address) { + const user_uuid = this.props.params.user_uuid; + const self = this; + + const addressObj = { + "id": address.id, + "name": address.name, + "address": address.address, + "address_type": address.address_type, + "lat": address.lat, + "lng": address.lng, + "type": address.type, + "address": address.text, + } + + Instance.getRawConn().post(`/v1/nemt/users/portal/${user_uuid}/address`, addressObj) + .then(res => { + this.getUser(user_uuid); + }) + .catch(console.error); + } + + handleAddressRemoved(address) { + const user_uuid = this.props.params.user_uuid; + const self = this; + + Instance.getRawConn().put(`/v1/nemt/users/portal/${user_uuid}/address/${address.address_uuid}`).then(res => { + this.getUser(user_uuid); + }).catch(console.error); + } + + render() { + const { user } = this.state; + const { router: { params } } = this.props; + + const readOnly = params.user_uuid === loggedUser.useruuid + ? false + : loggedUser.anyOf( + bcbsaScheduler, + bcbsiScheduler, + programsupportSupport, + ); + + return ( +
      + +
      + +
      ) + } +} + +const authorization = authorize( + bcbsaScheduler, + bcbsiAdmin, + bcbsiScheduler, + planAdmin, + programsupportSupport, + providerAdmin, + superAdmin, + techsupportAdmin, +); + +module.exports = authorization(User); diff --git a/src/routes/app/routes/users/index.js b/src/routes/app/routes/users/index.js new file mode 100644 index 0000000..c7a03fe --- /dev/null +++ b/src/routes/app/routes/users/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'authorizedusers/:user_uuid', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/user')); + }); + } +}; diff --git a/src/routes/confirmEmail/components/ConfirmEmail.js b/src/routes/confirmEmail/components/ConfirmEmail.js new file mode 100644 index 0000000..a109c3f --- /dev/null +++ b/src/routes/confirmEmail/components/ConfirmEmail.js @@ -0,0 +1,40 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; + +const ConfirmEmail = () => ( +
      +
      +
      + + +
      +

      mail_outline

      +

      We will email you if your adress is registered and active. +

      +

      Click on the included link to reset your password.

      +
      + +
      +
      +
      + Login +
      +
      +); + +const Page = () => ( +
      +
      + +
      + +
      +
      +
      +
      +); + +module.exports = Page; + diff --git a/src/routes/confirmEmail/index.js b/src/routes/confirmEmail/index.js new file mode 100644 index 0000000..7d644fe --- /dev/null +++ b/src/routes/confirmEmail/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'confirm-email', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/ConfirmEmail')); + }); + } +}; diff --git a/src/routes/forgotPassword/components/ForgotPassword.js b/src/routes/forgotPassword/components/ForgotPassword.js new file mode 100644 index 0000000..13ecee5 --- /dev/null +++ b/src/routes/forgotPassword/components/ForgotPassword.js @@ -0,0 +1,60 @@ +import React from 'react'; +import APPCONFIG from 'constants/Config'; +import TextField from 'material-ui/TextField'; +import QueueAnim from 'rc-queue-anim'; + +class ForgotPassowrd extends React.Component { + constructor() { + super(); + this.state = { + brand: APPCONFIG.brand + }; + } + + render() { + return ( +
      +
      +
      +
      +

      {this.state.brand}

      +
      +
      +
      +
      + +
      +

      Enter the email address for your account.

      +

      We will email your username and a link to reset your password.

      +
      +
      +
      +
      +
      +
      + Reset +
      +
      +
      + ); + } +} + +const Page = () => ( +
      +
      + +
      + +
      +
      +
      +
      +); + +module.exports = Page; + diff --git a/src/routes/forgotPassword/index.js b/src/routes/forgotPassword/index.js new file mode 100644 index 0000000..2878f82 --- /dev/null +++ b/src/routes/forgotPassword/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'forgot-password', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/ForgotPassword')); + }); + } +}; diff --git a/src/routes/fullscreen/components/Fullscreen.js b/src/routes/fullscreen/components/Fullscreen.js new file mode 100644 index 0000000..8cf0f4a --- /dev/null +++ b/src/routes/fullscreen/components/Fullscreen.js @@ -0,0 +1,16 @@ +import React from 'react'; +import QueueAnim from 'rc-queue-anim'; + +const Fullscreen = () => ( +
      + + +
      +
      Blank
      +
      +
      + +
      +); + +module.exports = Fullscreen; diff --git a/src/routes/fullscreen/index.js b/src/routes/fullscreen/index.js new file mode 100644 index 0000000..63e1417 --- /dev/null +++ b/src/routes/fullscreen/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'fullscreen', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Fullscreen')); + }); + } +}; diff --git a/src/routes/lockScreen/components/LockScreen.js b/src/routes/lockScreen/components/LockScreen.js new file mode 100644 index 0000000..e7c5f4a --- /dev/null +++ b/src/routes/lockScreen/components/LockScreen.js @@ -0,0 +1,47 @@ +import React from 'react'; +import APPCONFIG from 'constants/Config'; +import QueueAnim from 'rc-queue-anim'; + +class LockScreen extends React.Component { + constructor() { + super(); + this.state = { + user: APPCONFIG.user + }; + } + + render() { + return ( +
      +
      +
      {this.state.user}
      +
      + +
      +
      + ); + } +} + +const Page = () => ( +
      +
      + +
      + +
      +
      +
      +
      +); + +module.exports = Page; diff --git a/src/routes/lockScreen/index.js b/src/routes/lockScreen/index.js new file mode 100644 index 0000000..9dab98d --- /dev/null +++ b/src/routes/lockScreen/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'lock-screen', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/LockScreen')); + }); + } +}; diff --git a/src/routes/login/components/Login.js b/src/routes/login/components/Login.js new file mode 100644 index 0000000..3c0d438 --- /dev/null +++ b/src/routes/login/components/Login.js @@ -0,0 +1,222 @@ +import React from 'react'; +// import { withFormsy } from 'formsy-react'; +import APPCONFIG from 'constants/Config'; +import FlatButton from 'material-ui/FlatButton'; +import TextField from 'material-ui/TextField'; +import QueueAnim from 'rc-queue-anim'; +import Dialog from 'material-ui/Dialog'; + +import Instance from '../../../components/Connection'; + +class Login extends React.Component { + constructor(props) { + super(props); + this.props = props; + this.setCookie('token', null, 0); + this.state = { + email: '', + pass: '', + message: '', + open: false, + errors: { + email: "", + pass: "" + }, + } + + this.handleOpen = this.handleOpen.bind(this); + this.handleClose = this.handleClose.bind(this); + } + + + setCookie(cname, cvalue, date) { + var d = new Date(date * 1000); + var expires = "expires=" + d.toUTCString(); + document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/"; + } + + componentDidMount() { + this.setState(Object.assign(this.state, { email: '', pass: '' })); + } + + handleLogin(event, state) { + event.preventDefault(); + var newErrors; + var newErrors; + var formIsValid; + + if (this.state.pass === "") { + Object.assign(this.state, { + newErrors: Object.assign(this.state.errors, { pass: "Password is required" }) + } + ); + formIsValid = false; + } + else { + newErrors: Object.assign(this.state.errors, { pass: "" }) + } + + if (this.state.email === "") { + Object.assign(this.state, { + newErrors: Object.assign(this.state.errors, { email: "Email is required" }) + } + ); + formIsValid = false; + } + else { + newErrors: Object.assign(this.state.errors, { email: "" }) + } + + if (formIsValid != false) { + Instance.setToken(null).post('/v1/authenticate/portal', { + email: state.state.email, + pass: state.state.pass, + }).then(function (res) { + let auth = res.data; + state.setCookie('token', auth.token, auth.valid_time); + localStorage.setItem('loggedUser', JSON.stringify(auth.user)); + + Instance.setToken(auth.token); + + location.href = '/#/'; + }).catch(function (err) { + state.setState(Object.assign(state.state, { + message: (err.response.data.message), + open: true, + })); + }); + } + } + + handleEmail(event, state) { + event.preventDefault(); + state.setState(Object.assign(state.state, { email: event.currentTarget.value })); + + if (this.state.email === "") { + // alert('yup') + Object.assign(this.state, { + newErrors: Object.assign(this.state.errors, { email: "Email is required" }) + } + ); + // formIsValid = false; + } + else { + newErrors: Object.assign(this.state.errors, { email: "" }) + } + } + + handlePass(event, state) { + event.preventDefault(); + state.setState(Object.assign(state.state, { pass: btoa(event.currentTarget.value) })); + + var NewErrors; + if (this.state.pass === "") { + // alert('yup') + Object.assign(this.state, { + newErrors: Object.assign(this.state.errors, { pass: "Password is required" }) + } + ); + // formIsValid = false; + } + else { + newErrors: Object.assign(this.state.errors, { pass: "" }) + } + } + + handleOpen = () => { + // this.setState({ open: true }); + + this.setState(Object.assign(this.state, { open: true })); + }; + + handleClose = () => { + this.setState(Object.assign(this.state, { open: false })); + // this.setState({ open: false }); + }; + + render() { + const actions = [ + , + ]; + + return ( +
      +
      +
      + +
      +

      CHM Hub®

      +
      + +
      +
      +
      + this.handleEmail(event, this)} + /> +
      +
      + this.handlePass(event, this)} + /> +
      +
      +
      +
      + +
      + +
      + {/* Sign up + */} + Forgot your password? +
      + + + {this.state.message} + +
      + ); + } +} + +const Page = () => ( +
      +
      + +
      + + +
      +
      +
      +
      +); + +module.exports = Page; diff --git a/src/routes/login/index.js b/src/routes/login/index.js new file mode 100644 index 0000000..b963bb0 --- /dev/null +++ b/src/routes/login/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'login', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Login')); + }); + } +}; diff --git a/src/routes/portal/components/Portal.js b/src/routes/portal/components/Portal.js new file mode 100644 index 0000000..e69de29 diff --git a/src/routes/portal/index.js b/src/routes/portal/index.js new file mode 100644 index 0000000..2ab44c2 --- /dev/null +++ b/src/routes/portal/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'portal', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/Portal')); + }); + } +}; diff --git a/src/routes/ready/components/ridePage.js b/src/routes/ready/components/ridePage.js new file mode 100644 index 0000000..a198275 --- /dev/null +++ b/src/routes/ready/components/ridePage.js @@ -0,0 +1,25 @@ +import React, { Component } from 'react'; +import QueueAnim from 'rc-queue-anim'; +import Instance from '../../../components/Connection'; + +class Page extends React.Component { + constructor(props) { + super(props); + this.props = props; + + Instance.getRawConn().post('/v1/ext/' + this.props.params.ride_uuid + '/' + this.props.params.user_uuid + '/ready').then(res => { + location.href = `/#/ride/${res.data.ride_uuid}/${res.data.user.useruuid}`; + }).catch(console.error); + } + + render() { + return ( +
      + + +
      + ); + } +}; + +module.exports = Page; \ No newline at end of file diff --git a/src/routes/ready/index.js b/src/routes/ready/index.js new file mode 100644 index 0000000..7292ccb --- /dev/null +++ b/src/routes/ready/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'ride/:ride_uuid/:user_uuid/ready', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/ridePage')); + }); + } +}; diff --git a/src/routes/ride/components/GMaps.js b/src/routes/ride/components/GMaps.js new file mode 100644 index 0000000..0c8ee46 --- /dev/null +++ b/src/routes/ride/components/GMaps.js @@ -0,0 +1,503 @@ +/* global google */ + +import { + default as React, + Component, +} from "react"; + +import Helmet from "react-helmet"; + +import { + withGoogleMap, + GoogleMap, + Marker, + lodash, InfoWindow, TrafficLayer, DirectionsRenderer, SearchBox +} from "react-google-maps"; +import moment from "moment"; + +import TimePicker from 'material-ui/TimePicker'; + +const INPUT_STYLE = { + boxSizing: `border-box`, + MozBoxSizing: `border-box`, + border: `1px solid transparent`, + width: `240px`, + height: `32px`, + marginTop: `27px`, + padding: `0 12px`, + borderRadius: `1px`, + boxShadow: `0 2px 6px rgba(0, 0, 0, 0.3)`, + fontSize: `14px`, + outline: `none`, + textOverflow: `ellipses`, +}; + +const PopUpInfoWindowExampleGoogleMap = withGoogleMap(props => { + return ( + + + {props.markers.map((marker, index) => ( + props.onMarkerClick(marker)} + icon={marker.icon} + > + + {marker.showInfo && ( + props.onMarkerClose(marker)}> +
      {marker.infoContent}
      +
      + )} + +
      + ))} + {props.directions && } +
      + ) +}); + +const carImageStyle = { width: "100px", height: "44px" } +const driverImageStyle = { height: "22px" } +/* + * + * Add + * to your HTML to provide google.maps reference + * + * @author: @chiwoojo + */ +export default class PopUpInfoWindowExample extends Component { + constructor(props) { + super(props); + this.props = props; + + this.state = { + ride: { + "ride_uuid": "", + "user": { + "useruuid": "", + "name": "", + "member": "" + }, + "status": { + "key": "", + "value": "" + }, + "type": { + "key": "", + "value": "" + }, + "notes": "", + "passenger": { + "user_id": "", + "image_url": "", + "first_name": "", + "last_name": "", + "phone_number": "" + }, + "driver": { + "rating": "", + "image_url": "/assets/images/g1.jpg", + "first_name": "", + "phone_number": "" + }, + "vehicle": { + "color": "", + "make": "", + "license_plate": "", + "image_url": "", + "year": 0, + "license_plate_state": "", + "model": "" + }, + "route": { + "origin": { + "name": "", + "lat": 0, + "lng": 0, + "address": "" + }, + "destination": { + "name": "", + "lat": 0, + "lng": 0, + "address": "" + }, + "location": { + "bearing": 0, + "lat": 0, + "lng": 0, + }, + "route_kml": "", + "distance": 0, + "duration": 0, + "eta": 0 + }, + "visit_date": new Date(), + "visit_time": new Date(), + "pickup_time": new Date() + }, + bounds: null, + center: { + lat: 41.819078, + long: -87.623129, + }, + origin: null, + destination: null, + directions: null, + // array of objects of markers + rendererOptions: { + suppressMarkers: true + }, + markers: [ + { + icon: '/assets/images/5_min.png', + position: null, + showInfo: false, + infoContent: ( +
      + +
      Pickup +

      +
      + location_on +
      + ), + }, + { + icon: '/assets/images/5_min.png', + position: null, + showInfo: false, + infoContent: ( +
      + +
      Destination +

      +
      + local_hospital +
      + ), + }, + ], + } + + if (this.props.data !== null || this.props.data !== undefined) { + this.state.ride = this.props.data; + } + } + + static propTypes = { + data: React.PropTypes.object.isRequired, + } + + componentWillReceiveProps(nextProps) { + let state = this + const routeObj = { + origin: new google.maps.LatLng(nextProps.data.route.origin.lat, nextProps.data.route.origin.lng), + destination: new google.maps.LatLng(nextProps.data.route.destination.lat, nextProps.data.route.destination.lng), + travelMode: google.maps.TravelMode.DRIVING, + }; + state.setState(Object.assign(state.state, { ride: nextProps.data })); + + + const DirectionsService = new google.maps.DirectionsService(); + DirectionsService.route(routeObj, (result, status) => { + if (status === google.maps.DirectionsStatus.OK) { + let pickupMarker = { + icon: '/assets/images/home.png', + position: result.routes[0].legs[0].start_location, + showInfo: false, + infoContent: ( +
      +
      +

      PICK UP at {moment(nextProps.data.pickup_time).format("hh:mm a")}

      {nextProps.data.route.origin.address}

      +
      +
      + ), + }; + let dropOffMarker = { + icon: '/assets/images/provider_pin.png', + position: result.routes[0].legs[0].end_location, + showInfo: false, + infoContent: ( +
      +
      +

      DROP OFF for {moment(nextProps.data.visit_time).format("hh:mm a")} visit.
      {nextProps.data.route.destination.address}

      +
      +
      + ), + }; + + if (nextProps.data.trip_type.key === 'from_visit' || nextProps.data.trip_type.key === 'from_visit_call') { + if (nextProps.data.status.key === 'willCall') { + pickupMarker = { + icon: '/assets/images/provider_pin.png', + position: result.routes[0].legs[0].end_location, + showInfo: false, + infoContent: ( +
      +
      +

      PICK UP Will Call

      {nextProps.data.route.destination.address}

      +
      +
      + ), + }; + } else { + pickupMarker = { + icon: '/assets/images/provider_pin.png', + position: result.routes[0].legs[0].end_location, + showInfo: false, + infoContent: ( +
      +
      +

      PICK UP at {moment(nextProps.data.pickup_time).format("hh:mm a")}

      {nextProps.data.route.destination.address}

      +
      +
      + ), + }; + } + dropOffMarker = { + icon: '/assets/images/home.png', + position: result.routes[0].legs[0].start_location, + showInfo: false, + infoContent: ( +
      +
      +

      DROP OFF
      {nextProps.data.route.origin.address}

      +
      +
      + ), + }; + } + + let mapState = { + origin: new google.maps.LatLng(nextProps.data.route.origin.lat, nextProps.data.route.origin.lng), + destination: new google.maps.LatLng(nextProps.data.route.destination.lat, nextProps.data.route.destination.lng), + directions: result, + // array of objects of markers + rendererOptions: { + suppressMarkers: true + }, + markers: [ + pickupMarker, + dropOffMarker, + ], + } + + switch (state.state.ride.status.key) { + case "accepted": + case "pickepUp": + case "arrived": + let carMarker = { + icon: '/assets/images/prius2.png', + position: new google.maps.LatLng(state.state.ride.route.location.lat, state.state.ride.route.location.lng), + showInfo: false, + infoContent: ( +
      +
      +

      {state.state.ride.driver.first_name} ({state.state.ride.driver.rating})
      {state.state.ride.vehicle.color} {state.state.ride.vehicle.make} {state.state.ride.vehicle.model} ({state.state.ride.vehicle.license_plate})

      +
      +
      + ), + }; + mapState.markers.push(carMarker); + break; + } + + state.setState(Object.assign(state.state, mapState)); + } else { + try { + if (result.status !== "ZERO_RESULTS") { + console.error(`error fetching directions ${result}`); + } + } catch (err) { + console.error(err); + } + } + }); + } + + componentDidMount() { + let data = this.props.data; + this.setState(Object.assign(this.state, { ride: data })); + + const DirectionsService = new google.maps.DirectionsService(); + DirectionsService.route({ + origin: new google.maps.LatLng(this.state.ride.route.origin.lat, this.state.ride.route.origin.lng), + destination: new google.maps.LatLng(this.state.ride.route.destination.lat, this.state.ride.route.destination.lng), + travelMode: google.maps.TravelMode.DRIVING, + }, (result, status) => { + if (status === google.maps.DirectionsStatus.OK) { + let mapState = { + origin: new google.maps.LatLng(this.state.ride.route.origin.lat, this.state.ride.route.origin.lng), + destination: new google.maps.LatLng(this.state.ride.route.destination.lat, this.state.ride.route.destination.lng), + directions: result, + // array of objects of markers + rendererOptions: { + suppressMarkers: true + }, + markers: [ + { + icon: '/assets/images/home.png', + position: result.routes[0].legs[0].start_location, + showInfo: false, + infoContent: ( +
      + {moment(this.state.ride.pickup_time).format("hh:mm a")} +
      Origin +

      {this.state.ride.route.origin.name}
      {this.state.ride.route.origin.address}

      +
      +
      + ), + }, + { + icon: '/assets/images/provider.png', + position: result.routes[0].legs[0].end_location, + showInfo: false, + infoContent: ( +
      + {moment(this.state.ride.visit_time).format("hh:mm a")} +
      Destination +

      {this.state.ride.destination.name}
      {this.state.ride.destination.address}

      +
      +
      + ), + }, + ], + }; + + switch (this.state.ride.status.key) { + case "accepted": + case "pickepUp": + case "arrived": + let carMarker = { + icon: '/assets/images/prius2.png', + position: new google.maps.LatLng(state.state.ride.route.location.lat, state.state.ride.route.location.lng), + showInfo: false, + infoContent: ( +
      +
      +

      {this.state.ride.driver.first_name} ({this.state.ride.driver.rating})
      {this.state.ride.vehicle.color} {this.state.ride.vehicle.make} {this.state.ride.vehicle.model} ({this.state.ride.vehicle.license_plate})

      +
      +
      + ), + }; + mapState.markers.push(carMarker); + break; + } + this.setState(Object.assign(this.state, mapState)); + } else { + if (result.status !== "ZERO_RESULTS") { + console.error(`error fetching directions ${result}`); + } + } + }); + } + + handleMapMounted = this.handleMapMounted.bind(this); + handleBoundsChanged = this.handleBoundsChanged.bind(this); + handleSearchBoxMounted = this.handleSearchBoxMounted.bind(this); + handlePlacesChanged = this.handlePlacesChanged.bind(this); + + handleMapMounted(map) { + debugger; + this._map = map; + } + + handleBoundsChanged() { + this.setState(Object.assign(this.state, { + bounds: this._map.getBounds(), + center: this._map.getCenter(), + })); + } + + handleSearchBoxMounted(searchBox) { + this._searchBox = searchBox; + } + + handlePlacesChanged() { + const places = this._searchBox.getPlaces(); + + // Add a marker for each place returned from search bar + const markers = places.map(place => ({ + position: place.geometry.location, + })); + + // Set markers; set map center to first search result + const mapCenter = markers.length > 0 ? markers[0].position : this.state.center; + + this.setState(Object.assign(this.state, { + center: mapCenter, + markers, + })); + } + + handleMarkerClick = this.handleMarkerClick.bind(this); + handleMarkerClose = this.handleMarkerClose.bind(this); + + // Toggle to 'true' to show InfoWindow and re-renders component + handleMarkerClick(targetMarker) { + this.setState(Object.assign(this.state, { + markers: this.state.markers.map(marker => { + if (marker === targetMarker) { + return { + ...marker, + showInfo: true, + }; + } + return marker; + }), + })); + } + + handleMarkerClose(targetMarker) { + this.setState(Object.assign(this.state, { + markers: this.state.markers.map(marker => { + if (marker === targetMarker) { + return { + ...marker, + showInfo: false, + }; + } + return marker; + }), + })); + } + + render() { + let maps = ( + } + mapElement={ +
      + } + onMapMounted={this.handleMapMounted} + onBoundsChanged={this.handleBoundsChanged} + onSearchBoxMounted={this.handleSearchBoxMounted} + bounds={this.state.bounds} + onPlacesChanged={this.handlePlacesChanged} + markers={this.state.markers} + onMarkerClick={this.handleMarkerClick} + onMarkerClose={this.handleMarkerClose} + center={this.state.origin} + directions={this.state.directions} + directionsRenderer={this.state.rendererOptions} + zoom={this.state.defaultZoom} + />); + + return maps; + } +} \ No newline at end of file diff --git a/src/routes/ride/components/ridePage.js b/src/routes/ride/components/ridePage.js new file mode 100644 index 0000000..79717bf --- /dev/null +++ b/src/routes/ride/components/ridePage.js @@ -0,0 +1,938 @@ +import React, { Component } from 'react'; +import QueueAnim from 'rc-queue-anim'; +import TextField from 'material-ui/TextField'; +import GMaps from './GMaps' +import RaisedButton from 'material-ui/RaisedButton'; +import Divider from 'material-ui/Divider'; +import IconMenu from 'material-ui/IconMenu'; +import IconButton from 'material-ui/IconButton'; +import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; +import { orange500, blue500 } from 'material-ui/styles/colors'; +import areIntlLocalesSupported from 'intl-locales-supported'; +import moment from "moment"; +import Avatar from 'material-ui/Avatar'; +import Notification from '../../../components/Shared/Notification' +// import Popover from 'material-ui/Popover'; +import FlatButton from 'material-ui/FlatButton'; +import Dialog from 'material-ui/Dialog'; +import Imgix from 'react-imgix' +import Paper from 'material-ui/Paper'; +import RoadTripLink from '../../app/components/RoadtripLink'; +import ContactList from '../../app/components/ContactList'; + +import MoreVertIcon from 'material-ui/svg-icons/navigation/more-vert'; +import MoreHorizIcon from 'material-ui/svg-icons/navigation/more-horiz'; + +import { grey400, darkBlack, lightBlack } from 'material-ui/styles/colors'; +import MenuItem from 'material-ui/MenuItem'; + +import Instance from '../../../components/Connection'; +// const ride = n.content.payload; +// const driverPhoneNumber = (ride.driver && ride.driver.phone_number) ? ride.driver.phone_number : ''; + +// const rideContactList = { +// driverMobile: driverPhoneNumber, +// memberMobile: ride.user.phonenumber, +// memberEmail: ride.user.email, +// schedulerEmail: ride.created_user.email, +// schedulerMobile: ride.created_user.phonenumber, +// rideID: ride.ride_uuid, +// }; + + +// import { Card, CardActions, CardHeader, CardMedia, CardTitle, CardText } from 'material-ui/Card'; + +let DateTimeFormat; + +// /** +// * Use the native Intl.DateTimeFormat if available, or a polyfill if not. +// */ +if (areIntlLocalesSupported(['fr', 'fa-IR'])) { + DateTimeFormat = global.Intl.DateTimeFormat; +} + +const FloatingActionButtonExampleSimple = () => ( +
      + + + +
      +); + +const styles = { + errorStyle: { + color: orange500, + }, + underlineStyle: { + borderColor: orange500, + }, + floatingLabelStyle: { + color: blue500, + }, + floatingLabelFocusStyle: { + color: blue500, + }, +}; + +const style = { + margin: 12, +}; + +const buttonStyle = { + marginTop: 10, +}; + +const getConfirmationData = () => { + let confirmationData = { + rideTypeValue: 0, + providerID: 0, + providerName: '', + visitDate: null, + visitTime: null, + pickupLocation: null, + pickupTime: null, + user: null + }; + + const confirmationStorage = localStorage.getItem("confirmation"); + if (confirmationStorage !== undefined && confirmationStorage !== null && confirmationStorage !== '') { + confirmationData = Object.assign(confirmationData, JSON.parse(confirmationStorage)); + } + + let user = localStorage.getItem("userData") + if (user && user !== null && user !== '') { + user = JSON.parse(user); + confirmationData = Object.assign(confirmationData, { user: user }); + } + + return confirmationData; +}; + +class Services extends React.Component { + constructor(props) { + super(props); + this.props = props; + + this.state = { + stepIndex: 0, + rideTypeValue: 0, + providerID: 0, + providerName: '', + visitDate: null, + visitTime: null, + pickupLocation: null, + pickupTime: null, + origin: {}, + destination: {}, + user: { + first: "", + last: "", + member: "", + phonenumber: "" + }, + eta: { + distance_miles: 0, + duration_seconds: 0, + formatted_time: "" + }, + ride: { + "ride_uuid": "", + "user": { + "useruuid": "", + "name": "", + "member": "" + }, + "trip_type": { + key: "", + value: "" + }, + "status": { + "key": "", + "value": "" + }, + "type": { + "key": "", + "value": "" + }, + "notes": "", + "passenger": { + "user_id": "", + "image_url": "", + "first_name": "", + "last_name": "", + "phone_number": "" + }, + "driver": { + "rating": "", + "image_url": "/assets/images/g1.jpg", + "first_name": "", + "phone_number": "" + }, + "vehicle": { + "color": "", + "make": "", + "license_plate": "", + "image_url": "", + "year": 0, + "license_plate_state": "", + "model": "" + }, + "route": { + "origin": { + "name": "", + "lat": 0, + "lng": 0, + "address": "" + }, + "destination": { + "name": "", + "lat": 0, + "lng": 0, + "address": "" + }, + "location": { + "lat": 0, + "lng": 0, + "bearing": 0 + }, + "route_kml": "", + "distance": 0, + "duration": 0, + "eta": 0, + "eta_formatted": '', + }, + "visit": { + "trip_type": { + key: "", + value: "" + }, + "visit_uuid": "", + "visit_external_id": "", + "pickup": { + "id": "", + "name": "" + }, + "destination": { + "id": "", + "name": "" + }, + "created_user": { + "useruuid": "", + "name": "" + } + }, + "visit_date": new Date(), + "visit_time": new Date(), + "pickup_time": new Date() + }, + rideInfo: { + "ride_uuid": "", + "user": { + "useruuid": "", + "name": "", + "member": "" + }, + "status": { + "key": "", + "value": "" + }, + "type": { + "key": "", + "value": "" + }, + "route_kml": "", + "notes": "", + "passenger": { + "user_id": "", + "image_url": "/assets/images/g1.jpg", + "first_name": "", + "last_name": "", + "phone_number": "" + }, + "driver": { + "rating": "", + "image_url": "", + "first_name": "", + "phone_number": "" + }, + "vehicle": { + "color": "", + "make": "", + "license_plate": "", + "image_url": "", + "year": 0, + "license_plate_state": "", + "model": "" + }, + "route": { + "origin": { + "name": "", + "lat": 0, + "lng": 0, + "address": "" + }, + "destination": { + "name": "", + "lat": 0, + "lng": 0, + "address": "" + } + } + }, + dialogTitleMessage: '', + dialogOpen: false, + dialogMessage: '', + dialogType: 'YesNo', + } + + this.handleCancel = this.handleCancel.bind(this); + this.handleClose = this.handleClose.bind(this); + this.handleYes = this.handleYes.bind(this); + this.handleReady = this.handleReady.bind(this); + this.handleRideChange = this.handleRideChange.bind(this); + } + + static propTypes = { + data: React.PropTypes.object.isRequired, + params: React.PropTypes.object.isRequired, + onRideUpdate: React.PropTypes.func.isRequired, + } + + componentWillReceiveProps(nextProps) { + let params = nextProps.params; + params.visit_date = new Date(params.visit_date); + params.visit_time = new Date(params.visit_time); + params.pickup_time = new Date(params.pickup_time); + + if (params.visit.destination) { + if (!params.visit.destination.id) params.visit.destination.id = ""; + } + + if (params.visit.pickup) { + if (!params.visit.pickup.id) params.visit.pickup.id = ""; + } + + if (!params.route.eta) params.route.eta = 0; + + var minutes = Math.floor(params.route.eta / 60); + var seconds = params.route.eta % 60; + var formattedTime = `${minutes} minutes` + if (minutes > 10) { + var t = new Date(); + t.setSeconds(t.getSeconds() + params.route.eta); + formattedTime = moment(t).format("hh:mm a"); + } + + params.route.eta_formatted = formattedTime; + if (!params.trip_type) { + params.trip_type = { + key: "", + value: "", + } + } + + if (!params.visit.trip_type) { + params.visit.trip_type = { + key: "", + value: "", + } + } + + this.setState(Object.assign(this.state, { ride: params })); + } + + componentDidMount() { + let data = this.props.params; + data.visitDate = new Date(data.visitDate); + data.visitTime = new Date(data.visitTime); + data.pickupTime = new Date(data.pickupTime); + + this.setState(Object.assign(this.state, data)); + + let params = this.props.params; + params.visit_date = new Date(params.visit_date); + params.visit_time = new Date(params.visit_time); + params.pickup_time = new Date(params.pickup_time); + + if (params.visit.destination) { + if (!params.visit.destination.id) params.visit.destination.id = ""; + } + + if (params.visit.pickup) { + if (!params.visit.pickup.id) params.visit.pickup.id = ""; + } + + if (!params.route.eta) params.route.eta = 0; + + var minutes = Math.floor(params.route.eta / 60); + var seconds = params.route.eta % 60; + var formattedTime = `${minutes} minutes` + if (minutes > 10) { + var t = new Date(); + t.setSeconds(t.getSeconds() + params.route.eta); + formattedTime = moment(t).format("hh:mm a"); + } + + params.route.eta_formatted = formattedTime; + if (!params.trip_type) { + params.trip_type = { + key: "", + value: "", + } + } + + if (!params.visit.trip_type) { + params.visit.trip_type = { + key: "", + value: "", + } + } + + this.setState(Object.assign(this.state, { ride: params })); + } + + handleReady(e) { + let self = this; + Instance.setToken(null).post(`/v1/ext/${self.state.ride.ride_uuid}/${self.state.ride.user.useruuid}/ready`).then((res) => { + if (self.props.onRideUpdate) { + self.props.onRideUpdate(res.data); + } + self.setState(Object.assign(self.state, { dialogMessage: `You ride has been requested`, dialogTitleMessage: 'Return Ride', dialogOpen: true, dialogType: 'OK' })); + }).catch(console.error); + } + + handleClose(e) { + let self = this; + self.setState(Object.assign(self.state, { dialogMessage: `Do you want to cancel the this ride?`, dialogTitleMessage: 'Cancel Ride', dialogOpen: false })); + } + + handleCancel(e) { + let self = this; + self.setState(Object.assign(self.state, { + dialogMessage: `Do you want to cancel the this ride?`, dialogTitleMessage: 'Cancel Ride', dialogOpen: true, dialogType: 'YesNo' + })); + } + + handleYes(e) { + let self = this; + self.setState(Object.assign(self.state, { dialogMessage: `Do you want to cancel the this ride?`, dialogTitleMessage: 'Cancel Ride', dialogOpen: false })); + Instance.setToken(null).put(`/v1/ext/${self.state.ride.ride_uuid}/${self.state.ride.user.useruuid}/cancel`).then((res) => { + self.setState(Object.assign(self.state, { dialogMessage: `You ride has been canceled`, dialogTitleMessage: 'Canceled Ride', dialogOpen: true, dialogType: 'OK' })); + }).catch(console.error); + } + + handleRideChange(r) { + if (this.props.onRideUpdate) { + this.props.onRideUpdate(r); + } + } + + render() { + const rightStyle = { + width: '80px', + margin: '0 5px 0 10px' + } + + const imageStyle = { width: "64px", height: "40px" } + const carImageStyle = { width: "70px", height: "32px" } + const driverImageStyle = { height: "22px" } + let data = this.state.ride.route; + + + + // const rideContactList = { + // driverMobile: driverPhoneNumber, + // memberMobile: ride.user.phonenumber, + // memberEmail: ride.user.email, + // schedulerEmail: ride.created_user.email, + // schedulerMobile: ride.created_user.phonenumber, + // rideID: ride.ride_uuid, + // }; + + + const rideContactList = { + driverMobile: this.state.ride.driver.phone_number, + memberMobile: this.state.ride.driver.phone_number, + + // memberMobile: this.state.ride.passenger.phone_number, + + memberEmail: this.state.ride.user.memberEmail, + // schedulerEmail: this.state.ride.user.created_user.schedulerEmail, + schedulerEmail: "this.state.ride.user.created_user.schedulerEmail", + // this.state.schedulerEmail, + // this.state.schedulerEmail, + schedulerMobile: "this.state.schedulerEmail", + rideID: "w232323232323", + }; + + const iconButtonElement = ( + + + + ); + + let actionsMenu = []; + if (this.state.ride.visit.rides) { + this.state.ride.visit.rides.forEach(r => { + if (r.ride_uuid !== this.state.ride.ride_uuid) { + let menuItem = ( + { + e.preventDefault(); + this.handleRideChange(r); + return false; + }} > + {r.trip_type.value.replace(' / Will Call', '')} + + ) + actionsMenu.push(menuItem); + } + }, this); + } + + const rightIconMenu = ( + + {actionsMenu} + + Share + + + + + + ); + + let actions = [] + + if (this.state.dialogType == 'YesNo') { + actions = [ + , + , + ]; + } else { + actions = [ + , + ]; + } + + let actionButtons = []; + if (this.state.ride.status.key !== 'canceled' && this.state.ride.status.key !== 'droppedOff') { + actionButtons = [ + , + + ] + } + let pickupTime = moment(this.state.ride.pickup_time).format('MM/DD/YYYY h:mm a') + let visitTime = (
      + {moment(this.state.ride.visit_time).format('MM/DD/YYYY h:mm a')} +

      +
      ); + + let visitLabel = 'Visit'; + if (this.state.ride.trip_type.key === 'from_visit' || this.state.ride.trip_type.key === 'from_visit_call') { + visitLabel = 'DropOff' + if (this.state.ride.status.key === 'willCall' || this.state.ride.status.key === 'pending' || this.state.ride.status.key === 'scheduled') { + visitTime = ''; + } + } + + if ((this.state.ride.status.key === 'willCall' && this.state.ride.trip_type.key === 'from_visit_call') || + (this.state.ride.status.key === 'droppedOff' && this.state.ride.visit.trip_type.key === 'roundtrip_call' && this.state.ride.trip_type.key === 'to_visit')) { + actionButtons = [ + , + + ] + + if ((this.state.ride.status.key === 'willCall' && this.state.ride.trip_type.key === 'from_visit_call')) { + pickupTime = this.state.ride.status.value + } + } + + var etaSummary; + if (this.state.ride.route.eta_formatted == "0 minutes") { etaSummary = "" } else { etaSummary = this.state.ride.route.eta_formatted }; + var statusSummary; + statusSummary = ( + + Passenger + Status + + Type + Actions + ETA + + ); + + var carInfo; + if (this.state.ride.status.key === "accepted" || this.state.ride.status.key === "droppedOff" || this.state.ride.status.key === "arrived" || this.state.ride.status.key === "pickedUp") { + carInfo = ( + + {this.state.ride.user.name} + + {this.state.ride.status.value} + + + {this.state.ride.trip_type.value.replace(' / Will Call', '')} + + + {rightIconMenu} + + {etaSummary} + + ) + } + else { + carInfo = ( + + {this.state.ride.user.name} + + {this.state.ride.status.value} + + + {this.state.ride.trip_type.value.replace(' / Will Call', '')} + + + {rightIconMenu} + + + + ) + } + + var carInfo2; + if (this.state.ride.status.key === "accepted" || this.state.ride.status.key === "droppedOff" || this.state.ride.status.key === "arrived" || this.state.ride.status.key === "pickedUp") { + carInfo2 = ( +
      +
      +
      {this.state.ride.vehicle.make}{this.state.ride.vehicle.model}
      +
      {this.state.ride.vehicle.license_plate}
      +
      +
      + + +
      + +
      +
      {this.state.ride.driver.first_name}
      +
      {this.state.ride.driver.rating}
      +
      +
      +
      +
      + ) + } + else { + carInfo2 = ( +
      +
      +
      +
      +
      +
      + +
      + +
      +
      +
      +
      +
      +
      +
      + ) + } + + let pickupAddress = ( + + + + {this.state.ride.route.origin.name} +

      + {pickupTime}
      + {this.state.ride.route.origin.address} + + + Pickup + + ) + + let dropOffAddress = ( + + + + {this.state.ride.route.destination.name} +
      + {visitTime} + {this.state.ride.route.destination.address} + + + Drop Off + + ); + if (this.state.ride.trip_type.key !== 'to_visit') { + pickupAddress = ( + + + + {this.state.ride.route.destination.name} +

      + Pickup Time: {pickupTime}
      + {this.state.ride.route.destination.address} + + + Medical Provider + + ) + dropOffAddress = ( + + + + {this.state.ride.route.origin.name} +
      + {visitTime} + Drop off: {this.state.ride.route.origin.address} + + + Member Location + + ); + } + + return ( +
      + + +
      +
      +
      +
      +
      + +
      +
      +
      + +
      + + + + + + + + + {statusSummary} + {carInfo} + + +
      + + + + + + + + +
      + {carInfo2} + {actionButtons} + +
      +
      + +
      + + {pickupAddress} + {dropOffAddress} +
      +
      +
      +
      +
      +
      + + {this.state.dialogMessage} + +
      + ) + } +} + +class Page extends React.Component { + constructor(props) { + super(props); + this.props = props; + this.state = { + timeout: null, + user: { + "useruuid": "", + "name": "", + "member": "" + }, + ride: { + "ride_uuid": "", + "user": { + "useruuid": "", + "name": "", + "member": "" + }, + "status": { + "key": "", + "value": "" + }, + "type": { + "key": "", + "value": "" + }, + "notes": "", + "driver": { + "rating": "", + "image_url": "", + "first_name": "", + "phone_number": "" + }, + "vehicle": { + "color": "", + "make": "", + "license_plate": "", + "image_url": "", + "year": 0, + "license_plate_state": "", + "model": "" + }, + "route": { + "origin": { + "name": "", + "lat": 0, + "lng": 0, + "address": "" + }, + "destination": { + "name": "", + "lat": 0, + "lng": 0, + "address": "" + }, + "location": { + "lat": 0, + "lng": 0, + "bearing": 0 + }, + "route_kml": "", + "distance": 0, + "duration": 0, + "eta": 0 + }, + "visit": { + "visit_external_id": "", + }, + "visit_date": new Date(), + "visit_time": new Date(), + "pickup_time": new Date() + } + } + + this.refreshContent = this.refreshContent.bind(this); + this.rideUpdate = this.rideUpdate.bind(this); + this.rideNotification = this.rideNotification.bind(this); + } + + componentDidMount() { + if (this.state.timeout) { + clearTimeout(this.state.timeout); + } + + this.refreshContent(this.props.params.ride_uuid, this.props.params.user_uuid); + } + + refreshContent(ride_uuid, user_uuid) { + let self = this; + Instance.setToken(null).get('/v1/ext/' + ride_uuid + '/' + user_uuid).then((res) => { + self.setState(Object.assign(self.state, { ride: res.data, user: res.data.user })); + switch (self.state.ride.status.key) { + case "accepted": + case "arrived": + case "pickedUp": + case "pending": + const timeout = setTimeout(function () { + this.refreshContent(ride_uuid, user_uuid); + }.bind(this), 15000); + + self.setState(Object.assign(self.state, { timeout: timeout })); + break; + } + }).catch(err => { + console.error('Error to get riders: ', err); + }); + } + + rideUpdate(ride) { + if (this.state.timeout) { + clearTimeout(this.state.timeout); + } + if (ride) { + this.setState(Object.assign(this.state, { ride: ride, user: ride.user })); + this.refreshContent(ride.ride_uuid, ride.user.useruuid); + } + } + + rideNotification(ride) { + console.log(ride); + } + + render() { + return ( +
      + +
      + +
      +
      + ); + } +}; + +module.exports = Page; \ No newline at end of file diff --git a/src/routes/ride/index.js b/src/routes/ride/index.js new file mode 100644 index 0000000..cf5e20e --- /dev/null +++ b/src/routes/ride/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'ride/:ride_uuid/:user_uuid', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/ridePage')); + }); + } +}; diff --git a/src/routes/signUp/components/SignUp.js b/src/routes/signUp/components/SignUp.js new file mode 100644 index 0000000..a8b0a0c --- /dev/null +++ b/src/routes/signUp/components/SignUp.js @@ -0,0 +1,368 @@ +import React from 'react'; +import { browserHistory, Redirect } from 'react-router'; +import APPCONFIG from 'constants/Config'; +import TextField from 'material-ui/TextField'; +import QueueAnim from 'rc-queue-anim'; + +import AutoComplete from 'material-ui/AutoComplete'; +import MenuItem from 'material-ui/MenuItem'; +import SelectField from 'material-ui/SelectField'; +import { Tabs, Tab } from 'material-ui/Tabs'; +import Slider from 'material-ui/Slider'; +import TimePicker from 'material-ui/TimePicker'; +import DatePicker from 'material-ui/DatePicker'; +import RaisedButton from 'material-ui/RaisedButton'; + +import Toggle from 'material-ui/Toggle'; +import Snackbar from 'material-ui/Snackbar'; +import Instance from '../../../components/Connection'; + +class SignUp extends React.Component { + constructor(props) { + super(props); + this.props = props; + + this.state = { + "name": "", + "first": "", + "last": "", + "gender": "", + "member": "", + "email": "", + "phonenumber": "", + "pass": "", + "birthdate": new Date(), + "validated": false, + "passwordValidated": false, + "passConfirmation": "", + "organizationType": { name: "", key: "provider", desc: "" }, + "planName": { + "id": "", + "type": { + "name": "", + "key": "provider" + }, + "name": "" + }, + "role": { name: "", key: "SP", desc: "" }, + "profiles": [], + "types": [], + "organizations": [] + } + + this.buttonValidated = this.buttonValidated.bind(this); + this.handleFirst = this.handleFirst.bind(this); + this.handleLast = this.handleLast.bind(this); + this.handleEmail = this.handleEmail.bind(this); + this.handlePhone = this.handlePhone.bind(this); + this.handlePass = this.handlePass.bind(this); + this.handleConfirmationPass = this.handleConfirmationPass.bind(this); + this.clickEvent = this.clickEvent.bind(this); + this.handleChangeProfile = this.handleChangeProfile.bind(this); + this.handleChangeType = this.handleChangeType.bind(this); + this.handleChangeOrganization = this.handleChangeOrganization.bind(this); + this.getRoles = this.getRoles.bind(this); + this.getOrganizations = this.getOrganizations.bind(this); + } + + componentDidMount = () => { + const self = this; + Instance.getRawConn().get('/v1/nemt/organization/type').then(function (res) { + const types = res.data.map(p => { + if (p.key === "provider") { + self.setState(Object.assign(self.state, { organizationType: p })); + } + return (); + }); + self.setState(Object.assign(self.state, { types: types })); + let organizations = self.getOrganizations(self.state.organizationType.key); + let roles = self.getRoles(self.state.organizationType.key) + + Promise.all([organizations, roles]).then(console.log).catch(console.error); + }).catch(function (err) { + console.error('Error to get types: ', err); + }); + } + + getRoles = (orgType) => { + const self = this; + return new Promise((resolve, reject) => { + Instance.getRawConn().get(`/v1/nemt/profile/org/${orgType}`).then(function (res) { + const profiles = res.data.map((p, i) => { + if (i === 0) { + self.setState(Object.assign(self.state, { role: p })); + } + return (); + }); + + self.setState(Object.assign(self.state, { profiles: profiles })); + resolve(res.data); + }).catch(function (err) { + console.log('Error to get roles: ', err) + reject(err); + }); + }); + } + + getOrganizations = (orgType) => { + const self = this; + return new Promise((resolve, reject) => { + Instance.getRawConn().get(`/v1/nemt/organization?type=${orgType}`).then(function (res) { + const orgs = res.data.map((p, i) => { + if (i === 0) { + self.setState(Object.assign(self.state, { planName: p })); + } + return (); + }); + + if (orgs.length > 0) { + self.setState(Object.assign(self.state, { organizations: orgs })); + } else { + self.setState(Object.assign(self.state, { organizations: null })); + } + resolve(res.data); + }).catch(function (err) { + console.log('Error to get organizations: ', err) + reject(err); + }); + }); + } + + buttonValidated = () => { + let validated = true; + if (!this.state.first || this.state.first === null || this.state.first === "") validated = false; + if (!this.state.last || this.state.last === null || this.state.last === "") validated = false; + if (!this.state.email || this.state.email === null || this.state.email === "") validated = false; + if (!this.state.phonenumber || this.state.phonenumber === null || this.state.phonenumber === "") validated = false; + if (!this.state.passwordValidated || !this.state.pass || this.state.pass === null || this.state.pass === "") validated = false; + if (!this.state.role || this.state.role === null || this.state.role.key === "") validated = false; + if (!this.state.organizationType || this.state.organizationType === null || this.state.organizationType.key === "") validated = false; + if (!this.state.planName || this.state.planName === null || this.state.planName.id === "") validated = false; + + this.setState(Object.assign(this.state, { validated: validated })); + } + + handleFirst = (event) => { + this.setState(Object.assign(this.state, { first: event.target.value })); + }; + + handleLast = (event) => { + this.setState(Object.assign(this.state, { last: event.target.value })); + }; + + // handleChange = (event, index, value) => { + // this.setState(Object.assign(this.state, { gender: value })); + // this.buttonValidated(); + // }; + + // handleMember = (event) => { + // this.setState(Object.assign(this.state, { member: event.target.value })); + // }; + + handleEmail = (event) => { + this.setState(Object.assign(this.state, { email: event.target.value })); + }; + + handlePhone = (event) => { + let phone = event.target.value; + if (phone.indexOf("+1") < 0 && phone.length == 10) { + phone = "+1" + phone; + phone = phone.substring(0, 12); + } + + this.setState(Object.assign(this.state, { phonenumber: phone })); + }; + + handlePass = (event) => { + this.setState(Object.assign(this.state, { pass: btoa(event.target.value) })); + this.setState(Object.assign(this.state, { passwordValidated: this.state.pass === this.state.passConfirmation })); + }; + + handleConfirmationPass = (event) => { + this.setState(Object.assign(this.state, { passConfirmation: btoa(event.target.value) })); + this.setState(Object.assign(this.state, { passwordValidated: this.state.pass === this.state.passConfirmation })); + }; + + handleChangeProfile = (event, key, payload) => { + this.setState(Object.assign(this.state, { role: payload })); + } + + handleChangeType = (event, key, payload) => { + const self = this; + this.setState(Object.assign(this.state, { organizationType: payload })); + let organizations = this.getOrganizations(payload.key); + let roles = this.getRoles(payload.key); + + Promise.all([organizations, roles]).then(console.log).catch(console.error); + } + + handleChangeOrganization = (event, key, payload) => { + this.setState(Object.assign(this.state, { planName: payload })); + } + + + // handleDate = (event, date) => { + // this.setState(Object.assign(this.state, { birthdate: date })); + // this.buttonValidated(); + // }; + + clickEvent = (event) => { + event.preventDefault(); + const state = this; + + let user = { + "name": this.state.first + ' ' + this.state.last, + "first": this.state.first, + "last": this.state.last, + "email": this.state.email, + "phonenumber": this.state.phonenumber, + "pass": this.state.pass, + "profiles": [this.state.role], + "organizations": [this.state.planName], + "types": [this.state.organizationType], + } + + Instance.getRawConn().post('/v1/nemt/users/portal', user).then(function (res) { + localStorage.removeItem('loggedUser'); + location.href = '/#/login'; + }).catch(function (err) { + alert('Error to log in: ' + err.message); + console.error(err); + }); + } + + render() { + return ( +
      + +
      +
      +
      +

      CHMHub®

      +
      + +
      +
      + +
      + + {this.state.types} + +
      + + +
      + + {this.state.organizations} + +
      + + +
      + + {this.state.profiles} + +
      + + +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + + +
      +
      +
      +

      By clicking on sign up, you agree to terms and privacy policy

      +
      +
      +
      +
      +
      + Login + +
      +
      + +
      + ); + } +} + +const Page = () => ( +
      +
      + +
      + +
      +
      +
      +
      +); + +module.exports = Page; diff --git a/src/routes/signUp/index.js b/src/routes/signUp/index.js new file mode 100644 index 0000000..c9cd403 --- /dev/null +++ b/src/routes/signUp/index.js @@ -0,0 +1,8 @@ +module.exports = { + path: 'sign-up', + getComponent(nextState, cb) { + require.ensure([], (require) => { + cb(null, require('./components/SignUp')); + }); + } +}; diff --git a/src/stores/README.md b/src/stores/README.md new file mode 100644 index 0000000..61c200c --- /dev/null +++ b/src/stores/README.md @@ -0,0 +1,2 @@ +# About this folder +This folder will hold all of your **flux** stores. diff --git a/src/stores/index.js b/src/stores/index.js new file mode 100644 index 0000000..f730ebe --- /dev/null +++ b/src/stores/index.js @@ -0,0 +1,21 @@ +import { createStore } from 'redux'; +import reducers from '../reducers'; + +function reduxStore(initialState) { + const store = createStore(reducers, initialState, + window.devToolsExtension && window.devToolsExtension()); + + if (module.hot) { + // Enable Webpack hot module replacement for reducers + module.hot.accept('../reducers', () => { + // We need to require for hot reloading to work properly. + const nextReducer = require('../reducers'); // eslint-disable-line global-require + + store.replaceReducer(nextReducer); + }); + } + + return store; +} + +export default reduxStore; diff --git a/src/styles/_variables.scss b/src/styles/_variables.scss new file mode 100644 index 0000000..9145486 --- /dev/null +++ b/src/styles/_variables.scss @@ -0,0 +1,8 @@ +// global variables +@import "global/variables-bootstrap"; +@import "global/variables-extra"; +@import "material-design-lite/src/variables"; +@import "material-design-lite/src/mixins"; +@import "layout/variables-layout"; +@import "themes/variables-theme"; +@import "bootstrap/mixins"; diff --git a/src/styles/app.scss b/src/styles/app.scss new file mode 100644 index 0000000..9e043e7 --- /dev/null +++ b/src/styles/app.scss @@ -0,0 +1,18 @@ + +@import "variables"; + +@import "libs/material-ui/material-ui"; +@import "libs/react"; +@import "libs/rc-queue-anim"; + +@import "pages/demo"; +@import "pages/auth"; +@import "pages/error"; +@import "pages/lock-screen"; +@import "pages/profile"; +@import "pages/invoice"; +@import "pages/dashboard"; +@import "pages/maintenance"; +@import "pages/about"; +@import "pages/terms"; + diff --git a/src/styles/bootstrap.scss b/src/styles/bootstrap.scss new file mode 100644 index 0000000..a517941 --- /dev/null +++ b/src/styles/bootstrap.scss @@ -0,0 +1,5 @@ +// The reason for doing so is to solve "relative assets (images, fonts) fail to find" issue +// The only file changed is bootstrap/_bootstrap.scss + +@import "variables"; +@import "bootstrap/bootstrap"; diff --git a/src/styles/bootstrap/.scss-lint.yml b/src/styles/bootstrap/.scss-lint.yml new file mode 100644 index 0000000..9d6e7ec --- /dev/null +++ b/src/styles/bootstrap/.scss-lint.yml @@ -0,0 +1,548 @@ +# Default application configuration that all configurations inherit from. +scss_files: + - "**/*.scss" + - "docs/assets/scss/**/*.scss" + +exclude: + - "scss/_normalize.scss" + +plugin_directories: ['.scss-linters'] + +# List of gem names to load custom linters from (make sure they are already +# installed) +plugin_gems: [] + +# Default severity of all linters. +severity: warning + +linters: + BangFormat: + enabled: true + space_before_bang: true + space_after_bang: false + + BemDepth: + enabled: false + max_elements: 1 + + BorderZero: + enabled: true + convention: zero # or `none` + exclude: + - _normalize.scss + + ChainedClasses: + enabled: false + + ColorKeyword: + enabled: true + + ColorVariable: + enabled: false + + Comment: + enabled: true + exclude: + - _normalize.scss + - bootstrap.scss + style: silent + + DebugStatement: + enabled: true + + DeclarationOrder: + enabled: false + + DisableLinterReason: + enabled: false + + DuplicateProperty: + enabled: true + + ElsePlacement: + enabled: true + style: same_line # or 'new_line' + + EmptyLineBetweenBlocks: + enabled: false + ignore_single_line_blocks: true + + EmptyRule: + enabled: true + + ExtendDirective: + enabled: false + + FinalNewline: + enabled: true + present: true + + HexLength: + enabled: true + style: short # or 'long' + + HexNotation: + enabled: true + style: lowercase # or 'uppercase' + + HexValidation: + enabled: true + + IdSelector: + enabled: true + + ImportantRule: + enabled: false + + ImportPath: + enabled: true + leading_underscore: false + filename_extension: false + + Indentation: + enabled: true + allow_non_nested_indentation: false + character: space # or 'tab' + width: 2 + + LeadingZero: + enabled: true + style: exclude_zero # or 'include_zero' + exclude: + - _normalize.scss + + MergeableSelector: + enabled: false + force_nesting: true + + NameFormat: + enabled: true + allow_leading_underscore: true + convention: hyphenated_lowercase # or 'camel_case', or 'snake_case', or a regex pattern + + NestingDepth: + enabled: true + max_depth: 4 + ignore_parent_selectors: false + + PlaceholderInExtend: + enabled: false + + PropertyCount: + enabled: false + include_nested: false + max_properties: 10 + + PropertySortOrder: + enabled: true + ignore_unspecified: false + min_properties: 2 + separate_groups: false + exclude: + - _normalize.scss + order: + - position + - top + - right + - bottom + - left + - z-index + - -webkit-box-sizing + - -moz-box-sizing + - box-sizing + - display + - flex + - flex-align + - flex-basis + - flex-direction + - flex-wrap + - flex-flow + - flex-grow + - flex-order + - flex-pack + - align-items + - align-self + - justify-content + - float + - width + - min-width + - max-width + - height + - min-height + - max-height + - padding + - padding-top + - padding-right + - padding-bottom + - padding-left + - margin + - margin-top + - margin-right + - margin-bottom + - margin-left + - overflow + - overflow-x + - overflow-y + - -webkit-overflow-scrolling + - -ms-overflow-x + - -ms-overflow-y + - -ms-overflow-style + - clip + - clear + - font + - font-family + - font-size + - font-style + - font-weight + - font-variant + - font-size-adjust + - font-stretch + - font-effect + - font-emphasize + - font-emphasize-position + - font-emphasize-style + - font-smooth + - -webkit-hyphens + - -moz-hyphens + - hyphens + - line-height + - color + - text-align + - -webkit-text-align-last + - -moz-text-align-last + - -ms-text-align-last + - text-align-last + - text-emphasis + - text-emphasis-color + - text-emphasis-style + - text-emphasis-position + - text-decoration + - text-indent + - text-justify + - text-outline + - -ms-text-overflow + - text-overflow + - text-overflow-ellipsis + - text-overflow-mode + - text-shadow + - text-transform + - text-wrap + - -webkit-text-size-adjust + - -ms-text-size-adjust + - letter-spacing + - -ms-word-break + - word-break + - word-spacing + - -ms-word-wrap + - word-wrap + - overflow-wrap + - -moz-tab-size + - -o-tab-size + - tab-size + - white-space + - vertical-align + - list-style + - list-style-position + - list-style-type + - list-style-image + - pointer-events + - -ms-touch-action + - touch-action + - cursor + - visibility + - zoom + - table-layout + - empty-cells + - caption-side + - border-spacing + - border-collapse + - content + - quotes + - counter-reset + - counter-increment + - resize + - -webkit-user-select + - -moz-user-select + - -ms-user-select + - -o-user-select + - user-select + - nav-index + - nav-up + - nav-right + - nav-down + - nav-left + - background + - background-color + - background-image + - -ms-filter:\\'progid:DXImageTransform.Microsoft.gradient + - filter:progid:DXImageTransform.Microsoft.gradient + - filter:progid:DXImageTransform.Microsoft.AlphaImageLoader + - filter + - background-repeat + - background-attachment + - background-position + - background-position-x + - background-position-y + - -webkit-background-clip + - -moz-background-clip + - background-clip + - background-origin + - -webkit-background-size + - -moz-background-size + - -o-background-size + - background-size + - border + - border-color + - border-style + - border-width + - border-top + - border-top-color + - border-top-style + - border-top-width + - border-right + - border-right-color + - border-right-style + - border-right-width + - border-bottom + - border-bottom-color + - border-bottom-style + - border-bottom-width + - border-left + - border-left-color + - border-left-style + - border-left-width + - border-radius + - border-top-left-radius + - border-top-right-radius + - border-bottom-right-radius + - border-bottom-left-radius + - -webkit-border-image + - -moz-border-image + - -o-border-image + - border-image + - -webkit-border-image-source + - -moz-border-image-source + - -o-border-image-source + - border-image-source + - -webkit-border-image-slice + - -moz-border-image-slice + - -o-border-image-slice + - border-image-slice + - -webkit-border-image-width + - -moz-border-image-width + - -o-border-image-width + - border-image-width + - -webkit-border-image-outset + - -moz-border-image-outset + - -o-border-image-outset + - border-image-outset + - -webkit-border-image-repeat + - -moz-border-image-repeat + - -o-border-image-repeat + - border-image-repeat + - outline + - outline-width + - outline-style + - outline-color + - outline-offset + - -webkit-box-shadow + - -moz-box-shadow + - box-shadow + - filter:progid:DXImageTransform.Microsoft.Alpha(Opacity + - -ms-filter:\\'progid:DXImageTransform.Microsoft.Alpha + - opacity + - -ms-interpolation-mode + - -webkit-transition + - -moz-transition + - -ms-transition + - -o-transition + - transition + - -webkit-transition-delay + - -moz-transition-delay + - -ms-transition-delay + - -o-transition-delay + - transition-delay + - -webkit-transition-timing-function + - -moz-transition-timing-function + - -ms-transition-timing-function + - -o-transition-timing-function + - transition-timing-function + - -webkit-transition-duration + - -moz-transition-duration + - -ms-transition-duration + - -o-transition-duration + - transition-duration + - -webkit-transition-property + - -moz-transition-property + - -ms-transition-property + - -o-transition-property + - transition-property + - -webkit-transform + - -moz-transform + - -ms-transform + - -o-transform + - transform + - -webkit-transform-origin + - -moz-transform-origin + - -ms-transform-origin + - -o-transform-origin + - transform-origin + - -webkit-animation + - -moz-animation + - -ms-animation + - -o-animation + - animation + - -webkit-animation-name + - -moz-animation-name + - -ms-animation-name + - -o-animation-name + - animation-name + - -webkit-animation-duration + - -moz-animation-duration + - -ms-animation-duration + - -o-animation-duration + - animation-duration + - -webkit-animation-play-state + - -moz-animation-play-state + - -ms-animation-play-state + - -o-animation-play-state + - animation-play-state + - -webkit-animation-timing-function + - -moz-animation-timing-function + - -ms-animation-timing-function + - -o-animation-timing-function + - animation-timing-function + - -webkit-animation-delay + - -moz-animation-delay + - -ms-animation-delay + - -o-animation-delay + - animation-delay + - -webkit-animation-iteration-count + - -moz-animation-iteration-count + - -ms-animation-iteration-count + - -o-animation-iteration-count + - animation-iteration-count + - -webkit-animation-direction + - -moz-animation-direction + - -ms-animation-direction + - -o-animation-direction + + + PropertySpelling: + enabled: true + extra_properties: [] + disabled_properties: [] + + PropertyUnits: + enabled: true + global: [ + 'ch', 'em', 'ex', 'rem', # Font-relative lengths + 'cm', 'in', 'mm', 'pc', 'pt', 'px', 'q', # Absolute lengths + 'vh', 'vw', 'vmin', 'vmax', # Viewport-percentage lengths + 'deg', 'grad', 'rad', 'turn', # Angle + 'ms', 's', # Duration + 'Hz', 'kHz', # Frequency + 'dpi', 'dpcm', 'dppx', # Resolution + '%'] # Other + properties: {} + + PseudoElement: + enabled: true + + QualifyingElement: + enabled: true + allow_element_with_attribute: false + allow_element_with_class: false + allow_element_with_id: false + + SelectorDepth: + enabled: true + max_depth: 4 + + SelectorFormat: + enabled: false + convention: hyphenated_lowercase # or 'strict_BEM', or 'hyphenated_BEM', or 'snake_case', or 'camel_case', or a regex pattern + + Shorthand: + enabled: true + allowed_shorthands: [1, 2, 3, 4] + + SingleLinePerProperty: + enabled: false + allow_single_line_rule_sets: true + + SingleLinePerSelector: + enabled: false + + SpaceAfterComma: + enabled: false + style: one_space # or 'no_space', or 'at_least_one_space' + + SpaceAfterPropertyColon: + enabled: true + style: at_least_one_space # or 'no_space', or 'at_least_one_space', or 'aligned' + + SpaceAfterPropertyName: + enabled: true + + SpaceAfterVariableName: + enabled: true + + SpaceAroundOperator: + enabled: true + style: one_space # or 'at_least_one_space', or 'no_space' + + SpaceBeforeBrace: + enabled: true + style: space # or 'new_line' + allow_single_line_padding: true + + SpaceBetweenParens: + enabled: true + spaces: 0 + + StringQuotes: + enabled: true + style: double_quotes # or double_quotes + + TrailingSemicolon: + enabled: true + + TrailingWhitespace: + enabled: true + + TrailingZero: + enabled: false + + TransitionAll: + enabled: false + + UnnecessaryMantissa: + enabled: true + + UnnecessaryParentReference: + enabled: true + + UrlFormat: + enabled: true + + UrlQuotes: + enabled: true + + VariableForProperty: + enabled: false + properties: [] + + VendorPrefix: + enabled: true + identifier_list: base + additional_identifiers: [] + excluded_identifiers: [] + exclude: + - _normalize.scss + + ZeroUnit: + enabled: true + + Compass::*: + enabled: false diff --git a/src/styles/bootstrap/_alert.scss b/src/styles/bootstrap/_alert.scss new file mode 100644 index 0000000..d9b4e9b --- /dev/null +++ b/src/styles/bootstrap/_alert.scss @@ -0,0 +1,55 @@ +// +// Base styles +// + +.alert { + padding: $alert-padding-y $alert-padding-x; + margin-bottom: $alert-margin-bottom; + border: $alert-border-width solid transparent; + @include border-radius($alert-border-radius); +} + +// Headings for larger alerts +.alert-heading { + // Specified to prevent conflicts of changing $headings-color + color: inherit; +} + +// Provide class for links that match alerts +.alert-link { + font-weight: $alert-link-font-weight; +} + + +// Dismissible alerts +// +// Expand the right padding and account for the close button's positioning. + +.alert-dismissible { + // Adjust close link position + .close { + position: relative; + top: -$alert-padding-y; + right: -$alert-padding-x; + padding: $alert-padding-y $alert-padding-x; + color: inherit; + } +} + + +// Alternate styles +// +// Generate contextual modifier classes for colorizing the alert. + +.alert-success { + @include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text); +} +.alert-info { + @include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text); +} +.alert-warning { + @include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text); +} +.alert-danger { + @include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text); +} diff --git a/src/styles/bootstrap/_badge.scss b/src/styles/bootstrap/_badge.scss new file mode 100644 index 0000000..e5a3298 --- /dev/null +++ b/src/styles/bootstrap/_badge.scss @@ -0,0 +1,77 @@ +// Base class +// +// Requires one of the contextual, color modifier classes for `color` and +// `background-color`. + +.badge { + display: inline-block; + padding: $badge-padding-y $badge-padding-x; + font-size: $badge-font-size; + font-weight: $badge-font-weight; + line-height: 1; + color: $badge-color; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + @include border-radius(); + + // Empty badges collapse automatically + &:empty { + display: none; + } +} + +// Quick fix for badges in buttons +.btn .badge { + position: relative; + top: -1px; +} + +// scss-lint:disable QualifyingElement +// Add hover effects, but only for links +a.badge { + @include hover-focus { + color: $badge-link-hover-color; + text-decoration: none; + cursor: pointer; + } +} +// scss-lint:enable QualifyingElement + +// Pill badges +// +// Make them extra rounded with a modifier to replace v3's badges. + +.badge-pill { + padding-right: $badge-pill-padding-x; + padding-left: $badge-pill-padding-x; + @include border-radius($badge-pill-border-radius); +} + +// Colors +// +// Contextual variations (linked badges get darker on :hover). + +.badge-default { + @include badge-variant($badge-default-bg); +} + +.badge-primary { + @include badge-variant($badge-primary-bg); +} + +.badge-success { + @include badge-variant($badge-success-bg); +} + +.badge-info { + @include badge-variant($badge-info-bg); +} + +.badge-warning { + @include badge-variant($badge-warning-bg); +} + +.badge-danger { + @include badge-variant($badge-danger-bg); +} diff --git a/src/styles/bootstrap/_bootstrap.scss b/src/styles/bootstrap/_bootstrap.scss new file mode 100644 index 0000000..a1f58e9 --- /dev/null +++ b/src/styles/bootstrap/_bootstrap.scss @@ -0,0 +1,54 @@ +/*! + * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com) + * Copyright 2011-2017 The Bootstrap Authors + * Copyright 2011-2017 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +// Core variables and mixins +// @import "variables"; +// @import "mixins"; +@import "custom"; + +// Reset and dependencies +@import "normalize"; +@import "print"; + +// Core CSS +@import "reboot"; +@import "type"; +@import "images"; +@import "code"; +@import "grid"; +@import "tables"; +@import "forms"; +@import "buttons"; + +// Components +@import "transitions"; +@import "dropdown"; +@import "button-group"; +@import "input-group"; +@import "custom-forms"; +@import "nav"; +@import "navbar"; +@import "card"; +@import "breadcrumb"; +@import "pagination"; +@import "badge"; +@import "jumbotron"; +@import "alert"; +@import "progress"; +@import "media"; +@import "list-group"; +@import "responsive-embed"; +@import "close"; + +// Components w/ JavaScript +// @import "modal"; +// @import "tooltip"; +// @import "popover"; +// @import "carousel"; + +// Utility classes +@import "utilities"; diff --git a/src/styles/bootstrap/_breadcrumb.scss b/src/styles/bootstrap/_breadcrumb.scss new file mode 100644 index 0000000..1a09bba --- /dev/null +++ b/src/styles/bootstrap/_breadcrumb.scss @@ -0,0 +1,38 @@ +.breadcrumb { + padding: $breadcrumb-padding-y $breadcrumb-padding-x; + margin-bottom: $spacer-y; + list-style: none; + background-color: $breadcrumb-bg; + @include border-radius($border-radius); + @include clearfix; +} + +.breadcrumb-item { + float: left; + + // The separator between breadcrumbs (by default, a forward-slash: "/") + + .breadcrumb-item::before { + display: inline-block; // Suppress underlining of the separator in modern browsers + padding-right: $breadcrumb-item-padding; + padding-left: $breadcrumb-item-padding; + color: $breadcrumb-divider-color; + content: "#{$breadcrumb-divider}"; + } + + // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built + // without `