├── .dockerignore ├── .gitignore ├── .travis.yml ├── Dockerfile ├── Gruntfile.js ├── LICENSE ├── Procfile ├── README.md ├── app.js ├── bin └── www ├── lib ├── collection.js ├── express.js ├── history.js ├── node.js └── utils │ ├── config.js │ └── logger.js ├── package.json ├── src-lite ├── css │ ├── animation.css │ ├── bootstrap.min.css │ ├── minimal-icons-codes.css │ ├── minimal-icons-embedded.css │ ├── minimal-icons-ie7-codes.css │ ├── minimal-icons-ie7.css │ ├── minimal-icons.css │ ├── style.css │ └── toastr.min.css ├── fonts │ ├── Simple-Line-Icons.ttf │ ├── minimal-icons.eot │ ├── minimal-icons.svg │ ├── minimal-icons.ttf │ └── minimal-icons.woff ├── images │ ├── favicon.ico │ └── favicon.png ├── js │ ├── app.js │ ├── controllers.js │ ├── directives.js │ ├── filters.js │ ├── lib │ │ ├── angular.js │ │ ├── angular.min.js │ │ ├── angular.min.js.map │ │ ├── bootstrap.min.js │ │ ├── d3.js │ │ ├── d3.min.js │ │ ├── d3.tip.min.js │ │ ├── jquery-1.11.3.js │ │ ├── jquery-1.11.3.min.js │ │ ├── jquery-1.11.3.min.js.map │ │ ├── jquery.sparkline.js │ │ ├── jquery.sparkline.min.js │ │ ├── lodash.js │ │ ├── lodash.min.js │ │ ├── moment.en.min.js │ │ ├── moment.js │ │ ├── moment.min.js │ │ ├── primus.min.js │ │ └── toastr.min.js │ └── script.js └── views │ ├── index.jade │ └── layout.jade ├── src ├── css │ ├── animation.css │ ├── bootstrap.min.css │ ├── minimal-icons-codes.css │ ├── minimal-icons-embedded.css │ ├── minimal-icons-ie7-codes.css │ ├── minimal-icons-ie7.css │ ├── minimal-icons.css │ ├── style.css │ └── toastr.min.css ├── fonts │ ├── Simple-Line-Icons.ttf │ ├── minimal-icons.eot │ ├── minimal-icons.svg │ ├── minimal-icons.ttf │ └── minimal-icons.woff ├── images │ ├── favicon.ico │ ├── favicon.png │ ├── screenshot-v0.0.1.jpg │ ├── screenshot-v0.0.2.jpg │ ├── screenshot-v0.0.5.jpg │ └── screenshot.jpg ├── js │ ├── app.js │ ├── controllers.js │ ├── directives.js │ ├── filters.js │ ├── lib │ │ ├── angular.js │ │ ├── angular.min.js │ │ ├── angular.min.js.map │ │ ├── bootstrap.min.js │ │ ├── d3.js │ │ ├── d3.min.js │ │ ├── d3.tip.min.js │ │ ├── datamaps.min.js │ │ ├── jquery-1.11.3.js │ │ ├── jquery-1.11.3.min.js │ │ ├── jquery-1.11.3.min.js.map │ │ ├── jquery.sparkline.js │ │ ├── jquery.sparkline.min.js │ │ ├── lodash.js │ │ ├── lodash.min.js │ │ ├── moment.en.min.js │ │ ├── moment.js │ │ ├── moment.min.js │ │ ├── ngStorage.min.js │ │ ├── primus.min.js │ │ ├── toastr.min.js │ │ └── topojson.min.js │ └── script.js └── views │ ├── error.jade │ ├── index.jade │ └── layout.jade └── web-app └── .meteor └── local ├── build ├── README ├── main.js ├── programs │ ├── server │ │ ├── assets │ │ │ └── packages │ │ │ │ └── boilerplate-generator │ │ │ │ ├── boilerplate_web.browser.html │ │ │ │ └── boilerplate_web.cordova.html │ │ ├── boot-utils.js │ │ ├── boot.js │ │ ├── config.json │ │ ├── mini-files.js │ │ ├── npm-shrinkwrap.json │ │ ├── package.json │ │ ├── packages │ │ │ ├── autopublish.js │ │ │ ├── autopublish.js.map │ │ │ ├── autoupdate.js │ │ │ ├── autoupdate.js.map │ │ │ ├── base64.js │ │ │ ├── base64.js.map │ │ │ ├── binary-heap.js │ │ │ ├── binary-heap.js.map │ │ │ ├── blaze-tools.js │ │ │ ├── blaze-tools.js.map │ │ │ ├── blaze.js │ │ │ ├── blaze.js.map │ │ │ ├── boilerplate-generator.js │ │ │ ├── boilerplate-generator.js.map │ │ │ ├── callback-hook.js │ │ │ ├── callback-hook.js.map │ │ │ ├── check.js │ │ │ ├── check.js.map │ │ │ ├── d3js_d3.js │ │ │ ├── d3js_d3.js.map │ │ │ ├── ddp.js │ │ │ ├── ddp.js.map │ │ │ ├── deps.js │ │ │ ├── deps.js.map │ │ │ ├── ejson.js │ │ │ ├── ejson.js.map │ │ │ ├── geojson-utils.js │ │ │ ├── geojson-utils.js.map │ │ │ ├── global-imports.js │ │ │ ├── html-tools.js │ │ │ ├── html-tools.js.map │ │ │ ├── htmljs.js │ │ │ ├── htmljs.js.map │ │ │ ├── id-map.js │ │ │ ├── id-map.js.map │ │ │ ├── insecure.js │ │ │ ├── insecure.js.map │ │ │ ├── jquery.js │ │ │ ├── jquery.js.map │ │ │ ├── json.js │ │ │ ├── json.js.map │ │ │ ├── livedata.js │ │ │ ├── livedata.js.map │ │ │ ├── logging.js │ │ │ ├── logging.js.map │ │ │ ├── meteor-platform.js │ │ │ ├── meteor-platform.js.map │ │ │ ├── meteor.js │ │ │ ├── meteor.js.map │ │ │ ├── minimongo.js │ │ │ ├── minimongo.js.map │ │ │ ├── momentjs_moment.js │ │ │ ├── momentjs_moment.js.map │ │ │ ├── mongo.js │ │ │ ├── mongo.js.map │ │ │ ├── mquandalle_jade.js │ │ │ ├── mquandalle_jade.js.map │ │ │ ├── mrt_topojson.js │ │ │ ├── mrt_topojson.js.map │ │ │ ├── numeral_numeral.js │ │ │ ├── numeral_numeral.js.map │ │ │ ├── observe-sequence.js │ │ │ ├── observe-sequence.js.map │ │ │ ├── ordered-dict.js │ │ │ ├── ordered-dict.js.map │ │ │ ├── random.js │ │ │ ├── random.js.map │ │ │ ├── reactive-var.js │ │ │ ├── reactive-var.js.map │ │ │ ├── reload.js │ │ │ ├── reload.js.map │ │ │ ├── retry.js │ │ │ ├── retry.js.map │ │ │ ├── routepolicy.js │ │ │ ├── routepolicy.js.map │ │ │ ├── session.js │ │ │ ├── session.js.map │ │ │ ├── spacebars-compiler.js │ │ │ ├── spacebars-compiler.js.map │ │ │ ├── spacebars.js │ │ │ ├── spacebars.js.map │ │ │ ├── stevezhu_lodash.js │ │ │ ├── stevezhu_lodash.js.map │ │ │ ├── templating.js │ │ │ ├── templating.js.map │ │ │ ├── tracker.js │ │ │ ├── tracker.js.map │ │ │ ├── ui.js │ │ │ ├── ui.js.map │ │ │ ├── underscore.js │ │ │ ├── underscore.js.map │ │ │ ├── webapp-hashing.js │ │ │ ├── webapp-hashing.js.map │ │ │ ├── webapp.js │ │ │ └── webapp.js.map │ │ ├── program.json │ │ └── shell-server.js │ └── web.browser │ │ ├── 76a7bab845d191184a9124b7dd8a3472c9b4aa7e.css │ │ ├── 76a7bab845d191184a9124b7dd8a3472c9b4aa7e.css.map │ │ ├── app │ │ ├── client │ │ │ ├── js │ │ │ │ ├── app.js │ │ │ │ ├── controllers.js │ │ │ │ ├── helperFunctions.js │ │ │ │ ├── lib │ │ │ │ │ ├── bootstrap.min.js │ │ │ │ │ ├── d3.tip.min.js │ │ │ │ │ ├── datamaps.min.js │ │ │ │ │ ├── jquery.sparkline.js │ │ │ │ │ ├── jquery.sparkline.min.js │ │ │ │ │ ├── moment.en.min.js │ │ │ │ │ ├── moment.js │ │ │ │ │ ├── moment.min.js │ │ │ │ │ ├── primus.min.js │ │ │ │ │ └── toastr.min.js │ │ │ │ ├── script.js │ │ │ │ └── templateHelpers.js │ │ │ └── views │ │ │ │ ├── error.jade.js │ │ │ │ ├── index.jade.js │ │ │ │ ├── indexMeteor.js │ │ │ │ ├── template.indexMeteor.js │ │ │ │ └── template.layout.js │ │ ├── fonts │ │ │ ├── Simple-Line-Icons.ttf │ │ │ ├── minimal-icons.eot │ │ │ ├── minimal-icons.svg │ │ │ ├── minimal-icons.ttf │ │ │ └── minimal-icons.woff │ │ └── images │ │ │ ├── favicon.ico │ │ │ ├── favicon.png │ │ │ ├── screenshot-v0.0.1.jpg │ │ │ ├── screenshot-v0.0.2.jpg │ │ │ ├── screenshot-v0.0.5.jpg │ │ │ └── screenshot.jpg │ │ ├── head.html │ │ ├── packages │ │ ├── autopublish.js │ │ ├── autopublish.js.map │ │ ├── autoupdate.js │ │ ├── autoupdate.js.map │ │ ├── base64.js │ │ ├── base64.js.map │ │ ├── blaze.js │ │ ├── blaze.js.map │ │ ├── check.js │ │ ├── check.js.map │ │ ├── d3js_d3.js │ │ ├── d3js_d3.js.map │ │ ├── ddp.js │ │ ├── ddp.js.map │ │ ├── deps.js │ │ ├── deps.js.map │ │ ├── ejson.js │ │ ├── ejson.js.map │ │ ├── geojson-utils.js │ │ ├── geojson-utils.js.map │ │ ├── global-imports.js │ │ ├── htmljs.js │ │ ├── htmljs.js.map │ │ ├── id-map.js │ │ ├── id-map.js.map │ │ ├── insecure.js │ │ ├── insecure.js.map │ │ ├── jquery.js │ │ ├── jquery.js.map │ │ ├── json.js │ │ ├── json.js.map │ │ ├── launch-screen.js │ │ ├── launch-screen.js.map │ │ ├── livedata.js │ │ ├── livedata.js.map │ │ ├── logging.js │ │ ├── logging.js.map │ │ ├── meteor-platform.js │ │ ├── meteor-platform.js.map │ │ ├── meteor.js │ │ ├── meteor.js.map │ │ ├── minimongo.js │ │ ├── minimongo.js.map │ │ ├── momentjs_moment.js │ │ ├── momentjs_moment.js.map │ │ ├── mongo.js │ │ ├── mongo.js.map │ │ ├── mquandalle_jade.js │ │ ├── mquandalle_jade.js.map │ │ ├── mrt_topojson.js │ │ ├── mrt_topojson.js.map │ │ ├── numeral_numeral.js │ │ ├── numeral_numeral.js.map │ │ ├── observe-sequence.js │ │ ├── observe-sequence.js.map │ │ ├── ordered-dict.js │ │ ├── ordered-dict.js.map │ │ ├── random.js │ │ ├── random.js.map │ │ ├── reactive-dict.js │ │ ├── reactive-dict.js.map │ │ ├── reactive-var.js │ │ ├── reactive-var.js.map │ │ ├── reload.js │ │ ├── reload.js.map │ │ ├── retry.js │ │ ├── retry.js.map │ │ ├── session.js │ │ ├── session.js.map │ │ ├── spacebars.js │ │ ├── spacebars.js.map │ │ ├── stevezhu_lodash.js │ │ ├── stevezhu_lodash.js.map │ │ ├── templating.js │ │ ├── templating.js.map │ │ ├── tracker.js │ │ ├── tracker.js.map │ │ ├── ui.js │ │ ├── ui.js.map │ │ ├── underscore.js │ │ ├── underscore.js.map │ │ ├── webapp.js │ │ └── webapp.js.map │ │ └── program.json ├── server │ └── .bundle_version.txt └── star.json ├── db ├── METEOR-PORT ├── local.0 ├── local.1 ├── local.ns └── mongod.lock └── shell └── info.json /.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | README.md 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | */**/.DS_Store 3 | node_modules 4 | dist 5 | dist-lite 6 | npm-debug.log 7 | ansible/venv 8 | config/nodes.js 9 | *~ 10 | *.swp 11 | *.pem 12 | .node-xmlhttprequest-* 13 | ws_secret.json 14 | stats.json -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "0.12" 4 | env: 5 | global: 6 | secure: Qdkmi13nqcXskABBhbuGZmRakh4orOW1dalkSCyUbzGuYf0OdYF8ttNVuJa0WSWI4KhNXhtz2p3I8dM95wL++LCVqXFmIvZtX8Nca36KlNxIPNXPjn0odayh+c4pgrhrbz8TDmDXl9IPuZmNz8HHtN7xmIn6YDcm13wA3gTmfwo= 7 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:alpine 2 | 3 | ADD . /eth-netstats 4 | WORKDIR /eth-netstats 5 | 6 | RUN npm install \ 7 | && npm install -g grunt-cli \ 8 | && grunt 9 | 10 | ENV WS_SECRET="changeme" 11 | EXPOSE 3000 12 | CMD ["npm", "start"] 13 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: node ./bin/www -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Ethereum Network Stats "Classic" 2 | ============ 3 | Eth-Netstats "Classic" is a visual interface for tracking ethereum network status. It uses WebSockets to receive stats from running nodes and output them through an Angular interface. It is the front-end implementation for [eth-net-intelligence-api](https://github.com/ethereum/eth-net-intelligence-api). 4 | 5 | Other implementations of Eth-Netstats can be found at: 6 | - [Alethio EthStats](https://github.com/Alethio/ethstats-network-dashboard) 7 | - [Görli EthStats](https://github.com/goerli/ethstats-server/) 8 | 9 | ![Screenshot](https://raw.githubusercontent.com/ethereum/eth-netstats/master/src/images/screenshot.jpg?v=0.0.6 "Screenshot") 10 | 11 | ## Prerequisite 12 | * node 13 | * npm 14 | 15 | ## Installation 16 | Make sure you have node.js and npm installed. 17 | 18 | Clone the repository and install the dependencies 19 | 20 | ```bash 21 | git clone https://github.com/ethereum/eth-netstats 22 | cd eth-netstats 23 | npm install 24 | sudo npm install -g grunt-cli 25 | ``` 26 | 27 | ## Build the resources 28 | NetStats features two versions: the full version and the lite version. In order to build the static files you have to run grunt tasks which will generate dist or dist-lite directories containing the js and css files, fonts and images. 29 | 30 | 31 | To build the full version run 32 | ```bash 33 | grunt 34 | ``` 35 | 36 | To build the lite version run 37 | ```bash 38 | grunt lite 39 | ``` 40 | 41 | If you want to build both versions run 42 | ```bash 43 | grunt all 44 | ``` 45 | 46 | ## Run 47 | ```bash 48 | npm start 49 | ``` 50 | 51 | see the interface at http://localhost:3000 52 | 53 | In order to receive stats from running nodes the web socket password needs to be provided 54 | 55 | ```bash 56 | WS_SECRET= npm start 57 | ``` 58 | 59 | where `` is the value specified in the *app.json* file in the eth-net-intelligence-api directory. Running these tools concurrently with an etherium node will display the node on the eth-netstats interface. 60 | 61 | ## Receiving Stats From an Ethereum Node 62 | 63 | Follow the instructions for [installing and running The Ethereum Network Intelligence API](https://github.com/ethereum/eth-net-intelligence-api). Make sure to edit the `app.json` file with the appropriate information. In particular: 64 | 65 | - Confirm the correct configuration for the `RPC_PORT` and `CONFIGURATION_PORT`. The defaults are `"8545"` and `"30303"` respectively. 66 | - `INSTANCE_NAME` is the name your Ethereum node appears as in the front end. 67 | - `WS_SERVER` is the IP address and port (3000 is default). 68 | - As mentioned earlier `WS_SECRET` needs to match the environmental variable provided when running `npm start`. 69 | 70 | The Ethereum Network Intelligence API should be run concurrently with the Ethereum client of your choice. More information on running Ethereum node can be found [here](http://www.ethdocs.org/en/latest/ethereum-clients/choosing-a-client.html#sec-clients). 71 | -------------------------------------------------------------------------------- /bin/www: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | var debug = require('debug')('eth-netstats'); 3 | var app = require('../app'); 4 | -------------------------------------------------------------------------------- /lib/express.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var app = express(); 3 | var path = require('path'); 4 | var bodyParser = require('body-parser'); 5 | 6 | // view engine setup 7 | app.set('views', path.join(__dirname, (process.env.LITE === 'true' ? '../src-lite/views' : '../src/views'))); 8 | app.set('view engine', 'jade'); 9 | app.use(bodyParser.json()); 10 | app.use(bodyParser.urlencoded({ extended: false })); 11 | app.use(express.static(path.join(__dirname, (process.env.LITE === 'true' ? '../dist-lite' : '../dist')))); 12 | 13 | app.get('/', function(req, res) { 14 | res.render('index'); 15 | }); 16 | 17 | // catch 404 and forward to error handler 18 | app.use(function(req, res, next) { 19 | var err = new Error('Not Found'); 20 | err.status = 404; 21 | next(err); 22 | }); 23 | 24 | // error handlers 25 | app.use(function(err, req, res, next) { 26 | res.status(err.status || 500); 27 | res.render('error', { 28 | message: err.message, 29 | error: err 30 | }); 31 | }); 32 | 33 | // production error handler 34 | app.use(function(err, req, res, next) { 35 | res.status(err.status || 500); 36 | res.render('error', { 37 | message: err.message, 38 | error: {} 39 | }); 40 | }); 41 | 42 | module.exports = app; -------------------------------------------------------------------------------- /lib/utils/config.js: -------------------------------------------------------------------------------- 1 | var trusted = [ 2 | '52.16.188.185', 3 | '54.94.239.50', 4 | '54.174.74.156', 5 | '54.172.25.93', 6 | '54.174.75.126', 7 | '54.173.232.137', 8 | '52.7.205.180', 9 | '52.7.218.44', 10 | '52.7.205.152', 11 | '52.7.224.174', 12 | '92.51.165.126', 13 | '84.117.82.122', 14 | '73.40.58.88', 15 | '178.19.221.38', 16 | '185.37.145.18', 17 | '172.31.39.87', 18 | '86.120.171.69', 19 | '86.123.155.6', 20 | '188.24.81.133', 21 | '::ffff:127.0.0.1', 22 | ]; 23 | 24 | var banned = [ 25 | // '198.48.150.206' 26 | '88.5.145.53', 27 | '91.126.244.43' 28 | ]; 29 | 30 | module.exports = { 31 | trusted: trusted, 32 | banned: banned, 33 | reserved: [] 34 | }; 35 | -------------------------------------------------------------------------------- /lib/utils/logger.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var util = require('util'); 4 | var chalk = require('chalk'); 5 | 6 | var sections = [ 7 | 'API', 8 | 'COL', 9 | 'SYS' 10 | ]; 11 | 12 | var types = [ 13 | 'CON', 14 | 'CHR', 15 | 'UPD', 16 | 'BLK', 17 | 'TXS', 18 | 'STA', 19 | 'HIS', 20 | 'PIN' 21 | ]; 22 | 23 | var typeColors = { 24 | 'CON': chalk.reset.bold.yellow, 25 | 'CHR': chalk.reset.bold.red, 26 | 'UPD': chalk.reset.bold.green, 27 | 'BLK': chalk.reset.bold.blue, 28 | 'TXS': chalk.reset.bold.cyan, 29 | 'STA': chalk.reset.bold.red, 30 | 'HIS': chalk.reset.bold.magenta, 31 | 'PIN': chalk.reset.bold.yellow, 32 | }; 33 | 34 | var verbosity = [ 35 | [], 36 | ['error'], 37 | ['error', 'warn', 'success'], 38 | ['info', 'error', 'warn', 'success', 'time', 'timeEnd'] 39 | ]; 40 | 41 | var ENV_VERBOSITY = process.env.VERBOSITY || 2; 42 | 43 | [ 44 | { 45 | name: "info", 46 | sign: '=i=', 47 | signColor: chalk.blue, 48 | messageColor: chalk.bold, 49 | formatter: function (sign, message) 50 | { 51 | return [sign, message]; 52 | } 53 | }, 54 | { 55 | name: "success", 56 | inherit: 'log', 57 | sign: '=✓=', 58 | signColor: chalk.green, 59 | messageColor: chalk.bold.green, 60 | formatter: function (sign, message) 61 | { 62 | return [sign, message]; 63 | } 64 | }, 65 | { 66 | name: "warn", 67 | sign: '=!=', 68 | signColor: chalk.yellow, 69 | messageColor: chalk.bold.yellow, 70 | formatter: function (sign, message) 71 | { 72 | return [sign, message]; 73 | } 74 | }, 75 | { 76 | name: "error", 77 | sign: '=✘=', 78 | signColor: chalk.red, 79 | messageColor: chalk.bold.red, 80 | formatter: function (sign, message) 81 | { 82 | return [sign, message]; 83 | } 84 | }, 85 | { 86 | name: "time", 87 | sign: '=T=', 88 | signColor: chalk.cyan, 89 | messageColor: chalk.bold, 90 | formatter: function (sign, message) 91 | { 92 | return [util.format.apply(util, [sign, message])]; 93 | } 94 | }, 95 | { 96 | name: "timeEnd", 97 | sign: '=T=', 98 | signColor: chalk.cyan, 99 | messageColor: chalk.bold, 100 | formatter: function (sign, message) 101 | { 102 | return [util.format.apply(util, [sign, message])]; 103 | } 104 | } 105 | ].forEach( function (item) 106 | { 107 | if(item.inherit !== undefined) 108 | console[item.name] = console[item.inherit]; 109 | 110 | var fn = console[item.name]; 111 | 112 | console[item.name] = function () 113 | { 114 | if(verbosity[ENV_VERBOSITY].indexOf(item.name) === -1) 115 | return false; 116 | 117 | var args = Array.prototype.slice.call(arguments); 118 | var type = null, 119 | sign, 120 | time; 121 | var section = 'API'; 122 | var message = ''; 123 | 124 | if (args[0].indexOf(new Date().getFullYear()) >= 0) 125 | { 126 | time = args.splice(0, 1); 127 | } 128 | 129 | if (sections.indexOf(args[0]) >= 0) 130 | { 131 | section = args.splice(0, 1); 132 | } 133 | 134 | if (types.indexOf(args[0]) >= 0) 135 | { 136 | type = args.splice(0, 1); 137 | } 138 | 139 | sign = item.signColor.bold( '[' ) + chalk.reset.bold.white( section ) + item.signColor.bold( ']' ); 140 | 141 | if(type !== null) 142 | sign = sign + " " + item.signColor.bold( '[' ) + typeColors[type](type) + item.signColor.bold( ']' ); 143 | 144 | if(item.name !== "time" && item.name !== "timeEnd") 145 | { 146 | time = (new Date()).toJSON().replace("T", " ").replace("Z", " "); 147 | } 148 | else 149 | { 150 | time = time.toString().replace("T", " ").replace("Z", ""); 151 | } 152 | 153 | sign = chalk.reset.magenta(time) + sign; 154 | 155 | if (typeof args[0] === 'object') 156 | { 157 | message = util.inspect( args[0], { depth: null, colors: true } ); 158 | } 159 | else { 160 | message = item.messageColor( util.format.apply(util, args) ); 161 | } 162 | 163 | return fn.apply( this, item.formatter(sign, message) ); 164 | } 165 | }); 166 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "eth-netstats", 3 | "description": "Ethereum Network Intelligence dashboard", 4 | "version": "0.0.9", 5 | "private": true, 6 | "engines": { 7 | "node": "0.12.0", 8 | "npm": "2.5.1" 9 | }, 10 | "scripts": { 11 | "start": "node ./bin/www" 12 | }, 13 | "dependencies": { 14 | "body-parser": "1.13.3", 15 | "chalk": "1.1.1", 16 | "d3": "3.5.6", 17 | "debug": "2.2.0", 18 | "express": "4.13.3", 19 | "geoip-lite": "1.1.6", 20 | "grunt": "^0.4.5", 21 | "grunt-contrib-clean": "^0.6.0", 22 | "grunt-contrib-concat": "^0.5.1", 23 | "grunt-contrib-copy": "^0.8.0", 24 | "grunt-contrib-cssmin": "^0.12.3", 25 | "grunt-contrib-jade": "^0.14.1", 26 | "grunt-contrib-uglify": "^0.9.1", 27 | "jade": "1.11.0", 28 | "lodash": "3.10.1", 29 | "primus": "^6.0.5", 30 | "primus-emit": "^1.0.0", 31 | "primus-spark-latency": "^0.1.1", 32 | "ws": "^1.1.1" 33 | }, 34 | "repository": { 35 | "type": "git", 36 | "url": "https://github.com/cubedro/eth-netstats.git" 37 | }, 38 | "homepage": "https://github.com/cubedro/eth-netstats", 39 | "bugs": { 40 | "url": "https://github.com/cubedro/eth-netstats/issues" 41 | }, 42 | "authors": [ 43 | { 44 | "name": "Marian Oancea", 45 | "email": "marian@ethdev.com", 46 | "url": "https://github.com/cubedro" 47 | } 48 | ], 49 | "license": "LGPL-3.0", 50 | "devDependencies": {} 51 | } 52 | -------------------------------------------------------------------------------- /src-lite/css/animation.css: -------------------------------------------------------------------------------- 1 | /* 2 | Animation example, for spinners 3 | */ 4 | .animate-spin { 5 | -moz-animation: spin 2s infinite linear; 6 | -o-animation: spin 2s infinite linear; 7 | -webkit-animation: spin 2s infinite linear; 8 | animation: spin 2s infinite linear; 9 | display: inline-block; 10 | } 11 | @-moz-keyframes spin { 12 | 0% { 13 | -moz-transform: rotate(0deg); 14 | -o-transform: rotate(0deg); 15 | -webkit-transform: rotate(0deg); 16 | transform: rotate(0deg); 17 | } 18 | 19 | 100% { 20 | -moz-transform: rotate(359deg); 21 | -o-transform: rotate(359deg); 22 | -webkit-transform: rotate(359deg); 23 | transform: rotate(359deg); 24 | } 25 | } 26 | @-webkit-keyframes spin { 27 | 0% { 28 | -moz-transform: rotate(0deg); 29 | -o-transform: rotate(0deg); 30 | -webkit-transform: rotate(0deg); 31 | transform: rotate(0deg); 32 | } 33 | 34 | 100% { 35 | -moz-transform: rotate(359deg); 36 | -o-transform: rotate(359deg); 37 | -webkit-transform: rotate(359deg); 38 | transform: rotate(359deg); 39 | } 40 | } 41 | @-o-keyframes spin { 42 | 0% { 43 | -moz-transform: rotate(0deg); 44 | -o-transform: rotate(0deg); 45 | -webkit-transform: rotate(0deg); 46 | transform: rotate(0deg); 47 | } 48 | 49 | 100% { 50 | -moz-transform: rotate(359deg); 51 | -o-transform: rotate(359deg); 52 | -webkit-transform: rotate(359deg); 53 | transform: rotate(359deg); 54 | } 55 | } 56 | @-ms-keyframes spin { 57 | 0% { 58 | -moz-transform: rotate(0deg); 59 | -o-transform: rotate(0deg); 60 | -webkit-transform: rotate(0deg); 61 | transform: rotate(0deg); 62 | } 63 | 64 | 100% { 65 | -moz-transform: rotate(359deg); 66 | -o-transform: rotate(359deg); 67 | -webkit-transform: rotate(359deg); 68 | transform: rotate(359deg); 69 | } 70 | } 71 | @keyframes spin { 72 | 0% { 73 | -moz-transform: rotate(0deg); 74 | -o-transform: rotate(0deg); 75 | -webkit-transform: rotate(0deg); 76 | transform: rotate(0deg); 77 | } 78 | 79 | 100% { 80 | -moz-transform: rotate(359deg); 81 | -o-transform: rotate(359deg); 82 | -webkit-transform: rotate(359deg); 83 | transform: rotate(359deg); 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src-lite/css/minimal-icons-codes.css: -------------------------------------------------------------------------------- 1 | 2 | .icon-truck:before { content: '\e800'; } /* '' */ 3 | .icon-database:before { content: '\e801'; } /* '' */ 4 | .icon-mining:before { content: '\e802'; } /* '' */ 5 | .icon-check:before { content: '\e803'; } /* '' */ 6 | .icon-cancel:before { content: '\e804'; } /* '' */ 7 | .icon-loader:before { content: '\e805'; } /* '' */ 8 | .icon-check-o:before { content: '\e806'; } /* '' */ 9 | .icon-cancel-o:before { content: '\e807'; } /* '' */ 10 | .icon-warning-o:before { content: '\e808'; } /* '' */ 11 | .icon-network:before { content: '\e809'; } /* '' */ 12 | .icon-block:before { content: '\e80a'; } /* '' */ 13 | .icon-bulb:before { content: '\e80b'; } /* '' */ 14 | .icon-node:before { content: '\e80c'; } /* '' */ 15 | .icon-laptop:before { content: '\e80d'; } /* '' */ 16 | .icon-time:before { content: '\e80e'; } /* '' */ 17 | .icon-clock:before { content: '\e80f'; } /* '' */ 18 | .icon-group:before { content: '\e810'; } /* '' */ 19 | .icon-gas:before { content: '\e811'; } /* '' */ 20 | .icon-difficulty:before { content: '\e812'; } /* '' */ 21 | .icon-uncle:before { content: '\e813'; } /* '' */ 22 | .icon-hashrate:before { content: '\e814'; } /* '' */ 23 | .icon-gasprice:before { content: '\e815'; } /* '' */ -------------------------------------------------------------------------------- /src-lite/css/minimal-icons-ie7-codes.css: -------------------------------------------------------------------------------- 1 | 2 | .icon-truck { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 3 | .icon-database { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 4 | .icon-mining { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 5 | .icon-check { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 6 | .icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 7 | .icon-loader { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 8 | .icon-check-o { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 9 | .icon-cancel-o { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 10 | .icon-warning-o { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 11 | .icon-network { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 12 | .icon-block { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 13 | .icon-bulb { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 14 | .icon-node { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 15 | .icon-laptop { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 16 | .icon-time { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 17 | .icon-clock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 18 | .icon-group { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 19 | .icon-gas { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 20 | .icon-difficulty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 21 | .icon-uncle { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 22 | .icon-hashrate { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 23 | .icon-gasprice { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -------------------------------------------------------------------------------- /src-lite/css/minimal-icons-ie7.css: -------------------------------------------------------------------------------- 1 | [class^="icon-"], [class*=" icon-"] { 2 | font-family: 'minimal-icons'; 3 | font-style: normal; 4 | font-weight: normal; 5 | 6 | /* fix buttons height */ 7 | line-height: 1em; 8 | 9 | /* you can be more comfortable with increased icons size */ 10 | /* font-size: 120%; */ 11 | } 12 | 13 | .icon-truck { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 14 | .icon-database { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 15 | .icon-mining { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 16 | .icon-check { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 17 | .icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 18 | .icon-loader { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 19 | .icon-check-o { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 20 | .icon-cancel-o { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 21 | .icon-warning-o { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 22 | .icon-network { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 23 | .icon-block { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 24 | .icon-bulb { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 25 | .icon-node { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 26 | .icon-laptop { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 27 | .icon-time { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 28 | .icon-clock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 29 | .icon-group { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 30 | .icon-gas { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 31 | .icon-difficulty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 32 | .icon-uncle { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 33 | .icon-hashrate { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 34 | .icon-gasprice { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -------------------------------------------------------------------------------- /src-lite/css/minimal-icons.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'minimal-icons'; 3 | src: url('../fonts/minimal-icons.eot?7541141'); 4 | src: url('../fonts/minimal-icons.eot?7541141#iefix') format('embedded-opentype'), 5 | url('../fonts/minimal-icons.woff?7541141') format('woff'), 6 | url('../fonts/minimal-icons.ttf?7541141') format('truetype'), 7 | url('../fonts/minimal-icons.svg?7541141#minimal-icons') format('svg'); 8 | font-weight: normal; 9 | font-style: normal; 10 | } 11 | /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ 12 | /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ 13 | /* 14 | @media screen and (-webkit-min-device-pixel-ratio:0) { 15 | @font-face { 16 | font-family: 'minimal-icons'; 17 | src: url('../fonts/minimal-icons.svg?7541141#minimal-icons') format('svg'); 18 | } 19 | } 20 | */ 21 | 22 | [class^="icon-"]:before, [class*=" icon-"]:before { 23 | font-family: "minimal-icons"; 24 | font-style: normal; 25 | font-weight: normal; 26 | speak: none; 27 | 28 | display: inline-block; 29 | text-decoration: inherit; 30 | width: 1em; 31 | margin-right: .2em; 32 | text-align: center; 33 | /* opacity: .8; */ 34 | 35 | /* For safety - reset parent styles, that can break glyph codes*/ 36 | font-variant: normal; 37 | text-transform: none; 38 | 39 | /* fix buttons height, for twitter bootstrap */ 40 | line-height: 1em; 41 | 42 | /* Animation center compensation - margins should be symmetric */ 43 | /* remove if not needed */ 44 | margin-left: .2em; 45 | 46 | /* you can be more comfortable with increased icons size */ 47 | /* font-size: 120%; */ 48 | 49 | /* Font smoothing. That was taken from TWBS */ 50 | /*-webkit-font-smoothing: antialiased; 51 | -moz-osx-font-smoothing: grayscale;*/ 52 | 53 | /* Uncomment for 3D effect */ 54 | /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ 55 | } 56 | 57 | .icon-truck:before { content: '\e800'; } /* '' */ 58 | .icon-database:before { content: '\e801'; } /* '' */ 59 | .icon-mining:before { content: '\e802'; } /* '' */ 60 | .icon-check:before { content: '\e803'; } /* '' */ 61 | .icon-cancel:before { content: '\e804'; } /* '' */ 62 | .icon-loader:before { content: '\e805'; } /* '' */ 63 | .icon-check-o:before { content: '\e806'; } /* '' */ 64 | .icon-cancel-o:before { content: '\e807'; } /* '' */ 65 | .icon-warning-o:before { content: '\e808'; } /* '' */ 66 | .icon-network:before { content: '\e809'; } /* '' */ 67 | .icon-block:before { content: '\e80a'; } /* '' */ 68 | .icon-bulb:before { content: '\e80b'; } /* '' */ 69 | .icon-node:before { content: '\e80c'; } /* '' */ 70 | .icon-laptop:before { content: '\e80d'; } /* '' */ 71 | .icon-time:before { content: '\e80e'; } /* '' */ 72 | .icon-clock:before { content: '\e80f'; } /* '' */ 73 | .icon-group:before { content: '\e810'; } /* '' */ 74 | .icon-gas:before { content: '\e811'; } /* '' */ 75 | .icon-difficulty:before { content: '\e812'; } /* '' */ 76 | .icon-uncle:before { content: '\e813'; } /* '' */ 77 | .icon-hashrate:before { content: '\e814'; } /* '' */ 78 | .icon-gasprice:before { content: '\e815'; } /* '' */ -------------------------------------------------------------------------------- /src-lite/css/toastr.min.css: -------------------------------------------------------------------------------- 1 | .toast-title{font-weight:700}.toast-message{-ms-word-wrap:break-word;word-wrap:break-word}.toast-message a,.toast-message label{color:#fff}.toast-message a:hover{color:#ccc;text-decoration:none}.toast-close-button{position:relative;right:-.3em;top:-.3em;float:right;font-size:20px;font-weight:700;color:#fff;-webkit-text-shadow:0 1px 0 #fff;text-shadow:0 1px 0 #fff;opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80)}.toast-close-button:focus,.toast-close-button:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;-ms-filter:alpha(Opacity=40);filter:alpha(opacity=40)}button.toast-close-button{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.toast-top-center{top:0;right:0;width:100%}.toast-bottom-center{bottom:0;right:0;width:100%}.toast-top-full-width{top:0;right:0;width:100%}.toast-bottom-full-width{bottom:0;right:0;width:100%}.toast-top-left{top:12px;left:12px}.toast-top-right{top:12px;right:12px}.toast-bottom-right{right:12px;bottom:12px}.toast-bottom-left{bottom:12px;left:12px}#toast-container{position:fixed;z-index:999999}#toast-container *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#toast-container>div{position:relative;overflow:hidden;margin:0 0 6px;padding:15px 15px 15px 50px;width:300px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background-position:15px center;background-repeat:no-repeat;-moz-box-shadow:0 0 12px #999;-webkit-box-shadow:0 0 12px #999;box-shadow:0 0 12px #999;color:#fff;opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80)}#toast-container>:hover{-moz-box-shadow:0 0 12px #000;-webkit-box-shadow:0 0 12px #000;box-shadow:0 0 12px #000;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100);cursor:pointer}#toast-container>.toast-info{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=)!important}#toast-container>.toast-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=)!important}#toast-container>.toast-success{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==)!important}#toast-container>.toast-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=)!important}#toast-container.toast-bottom-center>div,#toast-container.toast-top-center>div{width:300px;margin:auto}#toast-container.toast-bottom-full-width>div,#toast-container.toast-top-full-width>div{width:96%;margin:auto}.toast{background-color:#030303}.toast-success{background-color:#51a351}.toast-error{background-color:#bd362f}.toast-info{background-color:#2f96b4}.toast-warning{background-color:#f89406}.toast-progress{position:absolute;left:0;bottom:0;height:4px;background-color:#000;opacity:.4;-ms-filter:alpha(Opacity=40);filter:alpha(opacity=40)}@media all and (max-width:240px){#toast-container>div{padding:8px 8px 8px 50px;width:11em}#toast-container .toast-close-button{right:-.2em;top:-.2em}}@media all and (min-width:241px) and (max-width:480px){#toast-container>div{padding:8px 8px 8px 50px;width:18em}#toast-container .toast-close-button{right:-.2em;top:-.2em}}@media all and (min-width:481px) and (max-width:768px){#toast-container>div{padding:15px 15px 15px 50px;width:25em}} -------------------------------------------------------------------------------- /src-lite/fonts/Simple-Line-Icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/src-lite/fonts/Simple-Line-Icons.ttf -------------------------------------------------------------------------------- /src-lite/fonts/minimal-icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/src-lite/fonts/minimal-icons.eot -------------------------------------------------------------------------------- /src-lite/fonts/minimal-icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/src-lite/fonts/minimal-icons.ttf -------------------------------------------------------------------------------- /src-lite/fonts/minimal-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/src-lite/fonts/minimal-icons.woff -------------------------------------------------------------------------------- /src-lite/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/src-lite/images/favicon.ico -------------------------------------------------------------------------------- /src-lite/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/src-lite/images/favicon.png -------------------------------------------------------------------------------- /src-lite/js/app.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /* Init Angular App */ 4 | 5 | var netStatsApp = angular.module('netStatsApp', ['netStatsApp.filters', 'netStatsApp.directives']); 6 | 7 | 8 | /* Services */ 9 | 10 | netStatsApp.factory('socket', function ($rootScope) { 11 | var socket = new Primus(); 12 | return socket; 13 | }); 14 | 15 | netStatsApp.factory('toastr', function ($rootScope) { 16 | toastr = window.toastr; 17 | toastr.options = { 18 | "closeButton": false, 19 | "debug": false, 20 | "progressBar": false, 21 | "newestOnTop": true, 22 | "positionClass": "toast-top-right", 23 | "preventDuplicates": false, 24 | "onclick": null, 25 | "showDuration": "300", 26 | "hideDuration": "1000", 27 | "timeOut": "5000", 28 | "extendedTimeOut": "1000", 29 | "showEasing": "swing", 30 | "hideEasing": "linear", 31 | "showMethod": "fadeIn", 32 | "hideMethod": "fadeOut" 33 | }; 34 | return toastr; 35 | }); 36 | 37 | netStatsApp.factory('_', function ($rootScope) { 38 | var lodash = window._; 39 | return lodash; 40 | }); 41 | -------------------------------------------------------------------------------- /src-lite/js/directives.js: -------------------------------------------------------------------------------- 1 | /* Directives */ 2 | 3 | angular.module('netStatsApp.directives', []) 4 | .directive('appVersion', ['version', function (version) { 5 | return function(scope, elm, attrs) { 6 | elm.text(version); 7 | }; 8 | }]); -------------------------------------------------------------------------------- /src-lite/js/lib/d3.tip.min.js: -------------------------------------------------------------------------------- 1 | d3.tip=function(){function t(t){v=d(t),w=v.createSVGPoint(),document.body.appendChild(x)}function e(){return"n"}function n(){return[0,0]}function r(){return" "}function o(){var t=y();return{top:t.n.y-x.offsetHeight,left:t.n.x-x.offsetWidth/2}}function l(){var t=y();return{top:t.s.y,left:t.s.x-x.offsetWidth/2}}function s(){var t=y();return{top:t.e.y-x.offsetHeight/2,left:t.e.x}}function f(){var t=y();return{top:t.w.y-x.offsetHeight/2,left:t.w.x-x.offsetWidth}}function i(){var t=y();return{top:t.nw.y-x.offsetHeight,left:t.nw.x-x.offsetWidth}}function u(){var t=y();return{top:t.ne.y-x.offsetHeight,left:t.ne.x}}function a(){var t=y();return{top:t.sw.y,left:t.sw.x-x.offsetWidth}}function c(){var t=y();return{top:t.se.y,left:t.e.x}}function p(){var t=d3.select(document.createElement("div"));return t.style({position:"absolute",opacity:0,pointerEvents:"none",boxSizing:"border-box"}),t.node()}function d(t){return t=t.node(),"svg"==t.tagName.toLowerCase()?t:t.ownerSVGElement}function y(){var t=T||d3.event.target,e={},n=t.getScreenCTM(),r=t.getBBox(),o=r.width,l=r.height,s=r.x,f=r.y,i=document.documentElement.scrollTop||document.body.scrollTop,u=document.documentElement.scrollLeft||document.body.scrollLeft;return w.x=s+u,w.y=f+i,e.nw=w.matrixTransform(n),w.x+=o,e.ne=w.matrixTransform(n),w.y+=l,e.se=w.matrixTransform(n),w.x-=o,e.sw=w.matrixTransform(n),w.y-=l/2,e.w=w.matrixTransform(n),w.x+=o,e.e=w.matrixTransform(n),w.x-=o/2,w.y-=l/2,e.n=w.matrixTransform(n),w.y+=l,e.s=w.matrixTransform(n),e}var m=e,g=n,h=r,x=p(),v=null,w=null,T=null;t.show=function(){var e=Array.prototype.slice.call(arguments);e[e.length-1]instanceof SVGElement&&(T=e.pop());var n,r=h.apply(this,e),o=g.apply(this,e),l=m.apply(this,e),s=d3.select(x),f=0;for(s.html(r).style({opacity:1,"pointer-events":"all"});f--;)s.classed(E[f],!1);return n=b.get(l).apply(this),s.classed(l,!0).style({top:n.top+o[0]+"px",left:n.left+o[1]+"px"}),t},t.hide=function(){return nodel=d3.select(x),nodel.style({opacity:0,"pointer-events":"none"}),t},t.attr=function(e){if(arguments.length<2&&"string"==typeof e)return d3.select(x).attr(e);var n=Array.prototype.slice.call(arguments);return d3.selection.prototype.attr.apply(d3.select(x),n),t},t.style=function(e){if(arguments.length<2&&"string"==typeof e)return d3.select(x).style(e);var n=Array.prototype.slice.call(arguments);return d3.selection.prototype.style.apply(d3.select(x),n),t},t.direction=function(e){return arguments.length?(m=null==e?e:d3.functor(e),t):m},t.offset=function(e){return arguments.length?(g=null==e?e:d3.functor(e),t):g},t.html=function(e){return arguments.length?(h=null==e?e:d3.functor(e),t):h};var b=d3.map({n:o,s:l,e:s,w:f,nw:i,ne:u,sw:a,se:c}),E=b.keys();return t}; -------------------------------------------------------------------------------- /src-lite/js/lib/moment.en.min.js: -------------------------------------------------------------------------------- 1 | !function(e){"function"==typeof define&&define.amd?define(["moment"],e):"object"==typeof exports?module.exports=e(require("../moment")):e(("undefined"!=typeof global?global:this).moment)}(function(e){return e.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few sec",m:"1 min",mm:"%d min",h:"1 h",hh:"%d h",d:"a day",dd:"%d days",M:"a month",MM:"%d mon",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10,d=1===~~(e%100/10)?"th":1===a?"st":2===a?"nd":3===a?"rd":"th";return e+d},week:{dow:1,doy:4}})}); -------------------------------------------------------------------------------- /src-lite/js/lib/toastr.min.js: -------------------------------------------------------------------------------- 1 | !function(e){e(["jquery"],function(e){return function(){function t(e,t,n){return f({type:O.error,iconClass:g().iconClasses.error,message:e,optionsOverride:n,title:t})}function n(t,n){return t||(t=g()),v=e("#"+t.containerId),v.length?v:(n&&(v=c(t)),v)}function i(e,t,n){return f({type:O.info,iconClass:g().iconClasses.info,message:e,optionsOverride:n,title:t})}function o(e){w=e}function s(e,t,n){return f({type:O.success,iconClass:g().iconClasses.success,message:e,optionsOverride:n,title:t})}function a(e,t,n){return f({type:O.warning,iconClass:g().iconClasses.warning,message:e,optionsOverride:n,title:t})}function r(e){var t=g();v||n(t),l(e,t)||u(t)}function d(t){var i=g();return v||n(i),t&&0===e(":focus",t).length?void h(t):void(v.children().length&&v.remove())}function u(t){for(var n=v.children(),i=n.length-1;i>=0;i--)l(e(n[i]),t)}function l(t,n){return t&&0===e(":focus",t).length?(t[n.hideMethod]({duration:n.hideDuration,easing:n.hideEasing,complete:function(){h(t)}}),!0):!1}function c(t){return v=e("
").attr("id",t.containerId).addClass(t.positionClass).attr("aria-live","polite").attr("role","alert"),v.appendTo(e(t.target)),v}function p(){return{tapToDismiss:!0,toastClass:"toast",containerId:"toast-container",debug:!1,showMethod:"fadeIn",showDuration:300,showEasing:"swing",onShown:void 0,hideMethod:"fadeOut",hideDuration:1e3,hideEasing:"swing",onHidden:void 0,extendedTimeOut:1e3,iconClasses:{error:"toast-error",info:"toast-info",success:"toast-success",warning:"toast-warning"},iconClass:"toast-info",positionClass:"toast-top-right",timeOut:5e3,titleClass:"toast-title",messageClass:"toast-message",target:"body",closeHtml:"",newestOnTop:!0,preventDuplicates:!1,progressBar:!1}}function m(e){w&&w(e)}function f(t){function i(t){return!e(":focus",l).length||t?(clearTimeout(O.intervalId),l[r.hideMethod]({duration:r.hideDuration,easing:r.hideEasing,complete:function(){h(l),r.onHidden&&"hidden"!==b.state&&r.onHidden(),b.state="hidden",b.endTime=new Date,m(b)}})):void 0}function o(){(r.timeOut>0||r.extendedTimeOut>0)&&(u=setTimeout(i,r.extendedTimeOut),O.maxHideTime=parseFloat(r.extendedTimeOut),O.hideEta=(new Date).getTime()+O.maxHideTime)}function s(){clearTimeout(u),O.hideEta=0,l.stop(!0,!0)[r.showMethod]({duration:r.showDuration,easing:r.showEasing})}function a(){var e=(O.hideEta-(new Date).getTime())/O.maxHideTime*100;f.width(e+"%")}var r=g(),d=t.iconClass||r.iconClass;if(r.preventDuplicates){if(t.message===C)return;C=t.message}"undefined"!=typeof t.optionsOverride&&(r=e.extend(r,t.optionsOverride),d=t.optionsOverride.iconClass||d),T++,v=n(r,!0);var u=null,l=e("
"),c=e("
"),p=e("
"),f=e("
"),w=e(r.closeHtml),O={intervalId:null,hideEta:null,maxHideTime:null},b={toastId:T,state:"visible",startTime:new Date,options:r,map:t};return t.iconClass&&l.addClass(r.toastClass).addClass(d),t.title&&(c.append(t.title).addClass(r.titleClass),l.append(c)),t.message&&(p.append(t.message).addClass(r.messageClass),l.append(p)),r.closeButton&&(w.addClass("toast-close-button").attr("role","button"),l.prepend(w)),r.progressBar&&(f.addClass("toast-progress"),l.prepend(f)),l.hide(),r.newestOnTop?v.prepend(l):v.append(l),l[r.showMethod]({duration:r.showDuration,easing:r.showEasing,complete:r.onShown}),r.timeOut>0&&(u=setTimeout(i,r.timeOut),O.maxHideTime=parseFloat(r.timeOut),O.hideEta=(new Date).getTime()+O.maxHideTime,r.progressBar&&(O.intervalId=setInterval(a,10))),l.hover(s,o),!r.onclick&&r.tapToDismiss&&l.click(i),r.closeButton&&w&&w.click(function(e){e.stopPropagation?e.stopPropagation():void 0!==e.cancelBubble&&e.cancelBubble!==!0&&(e.cancelBubble=!0),i(!0)}),r.onclick&&l.click(function(){r.onclick(),i()}),m(b),r.debug&&console&&console.log(b),l}function g(){return e.extend({},p(),b.options)}function h(e){v||(v=n()),e.is(":visible")||(e.remove(),e=null,0===v.children().length&&v.remove())}var v,w,C,T=0,O={error:"error",info:"info",success:"success",warning:"warning"},b={clear:r,remove:d,error:t,getContainer:n,info:i,options:{},subscribe:o,success:s,version:"2.1.0",warning:a};return b}()})}("function"==typeof define&&define.amd?define:function(e,t){"undefined"!=typeof module&&module.exports?module.exports=t(require("jquery")):window.toastr=t(window.jQuery)}); -------------------------------------------------------------------------------- /src-lite/js/script.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | $('body').on('mouseenter', '[data-toggle="tooltip"]', function( event ) { 3 | $(this).tooltip('show'); 4 | }).on('mouseleave', '[data-toggle="tooltip"]', function( event ) { 5 | $(this).tooltip('hide'); 6 | }); 7 | 8 | $.fn.sparkline.defaults.bar.height = 63; 9 | $.fn.sparkline.defaults.bar.barWidth = 6; 10 | $.fn.sparkline.defaults.bar.barSpacing = 1; 11 | $.fn.sparkline.defaults.bar.tooltipClassname = 'jqstooltip'; 12 | $.fn.sparkline.defaults.bar.tooltipOffsetX = 0; 13 | $.fn.sparkline.defaults.bar.tooltipFormat = $.spformat('
{{prefix}}{{value}} {{suffix}}
'); 14 | $.fn.sparkline.defaults.bar.colorMap = $.range_map({ 15 | '0:6': '#10a0de', 16 | '6:12': '#7bcc3a', 17 | '12:20': '#FFD162', 18 | '20:30': '#ff8a00', 19 | '30:': '#F74B4B' 20 | }); 21 | 22 | moment.relativeTimeThreshold('s', 60); 23 | moment.relativeTimeThreshold('m', 60); 24 | moment.relativeTimeThreshold('h', 24); 25 | moment.relativeTimeThreshold('d', 28); 26 | moment.relativeTimeThreshold('M', 12); 27 | 28 | })(); 29 | 30 | (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ 31 | (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), 32 | m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) 33 | })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); 34 | 35 | ga('create', 'UA-63657296-1', 'auto'); 36 | ga('send', 'pageview'); -------------------------------------------------------------------------------- /src-lite/views/layout.jade: -------------------------------------------------------------------------------- 1 | //- layout.jade 2 | doctype html 3 | html 4 | head 5 | meta(name="viewport", content="width=device-width, initial-scale=1.0, maximum-scale=1.0") 6 | title Ethereum Community Status Dashboard 7 | style(type="text/css") [ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak { display: none !important; } 8 | link(rel='stylesheet', href='//fonts.googleapis.com/css?family=Source+Sans+Pro:200,300,400,600,700') 9 | link(rel='stylesheet', href='/css/netstats.min.css') 10 | body(ng-app="netStatsApp") 11 | block content 12 | 13 | script(src="/js/netstats.min.js") -------------------------------------------------------------------------------- /src/css/animation.css: -------------------------------------------------------------------------------- 1 | /* 2 | Animation example, for spinners 3 | */ 4 | .animate-spin { 5 | -moz-animation: spin 2s infinite linear; 6 | -o-animation: spin 2s infinite linear; 7 | -webkit-animation: spin 2s infinite linear; 8 | animation: spin 2s infinite linear; 9 | display: inline-block; 10 | } 11 | @-moz-keyframes spin { 12 | 0% { 13 | -moz-transform: rotate(0deg); 14 | -o-transform: rotate(0deg); 15 | -webkit-transform: rotate(0deg); 16 | transform: rotate(0deg); 17 | } 18 | 19 | 100% { 20 | -moz-transform: rotate(359deg); 21 | -o-transform: rotate(359deg); 22 | -webkit-transform: rotate(359deg); 23 | transform: rotate(359deg); 24 | } 25 | } 26 | @-webkit-keyframes spin { 27 | 0% { 28 | -moz-transform: rotate(0deg); 29 | -o-transform: rotate(0deg); 30 | -webkit-transform: rotate(0deg); 31 | transform: rotate(0deg); 32 | } 33 | 34 | 100% { 35 | -moz-transform: rotate(359deg); 36 | -o-transform: rotate(359deg); 37 | -webkit-transform: rotate(359deg); 38 | transform: rotate(359deg); 39 | } 40 | } 41 | @-o-keyframes spin { 42 | 0% { 43 | -moz-transform: rotate(0deg); 44 | -o-transform: rotate(0deg); 45 | -webkit-transform: rotate(0deg); 46 | transform: rotate(0deg); 47 | } 48 | 49 | 100% { 50 | -moz-transform: rotate(359deg); 51 | -o-transform: rotate(359deg); 52 | -webkit-transform: rotate(359deg); 53 | transform: rotate(359deg); 54 | } 55 | } 56 | @-ms-keyframes spin { 57 | 0% { 58 | -moz-transform: rotate(0deg); 59 | -o-transform: rotate(0deg); 60 | -webkit-transform: rotate(0deg); 61 | transform: rotate(0deg); 62 | } 63 | 64 | 100% { 65 | -moz-transform: rotate(359deg); 66 | -o-transform: rotate(359deg); 67 | -webkit-transform: rotate(359deg); 68 | transform: rotate(359deg); 69 | } 70 | } 71 | @keyframes spin { 72 | 0% { 73 | -moz-transform: rotate(0deg); 74 | -o-transform: rotate(0deg); 75 | -webkit-transform: rotate(0deg); 76 | transform: rotate(0deg); 77 | } 78 | 79 | 100% { 80 | -moz-transform: rotate(359deg); 81 | -o-transform: rotate(359deg); 82 | -webkit-transform: rotate(359deg); 83 | transform: rotate(359deg); 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/css/minimal-icons-codes.css: -------------------------------------------------------------------------------- 1 | 2 | .icon-truck:before { content: '\e800'; } /* '' */ 3 | .icon-database:before { content: '\e801'; } /* '' */ 4 | .icon-mining:before { content: '\e802'; } /* '' */ 5 | .icon-check:before { content: '\e803'; } /* '' */ 6 | .icon-cancel:before { content: '\e804'; } /* '' */ 7 | .icon-loader:before { content: '\e805'; } /* '' */ 8 | .icon-check-o:before { content: '\e806'; } /* '' */ 9 | .icon-cancel-o:before { content: '\e807'; } /* '' */ 10 | .icon-warning-o:before { content: '\e808'; } /* '' */ 11 | .icon-network:before { content: '\e809'; } /* '' */ 12 | .icon-block:before { content: '\e80a'; } /* '' */ 13 | .icon-bulb:before { content: '\e80b'; } /* '' */ 14 | .icon-node:before { content: '\e80c'; } /* '' */ 15 | .icon-laptop:before { content: '\e80d'; } /* '' */ 16 | .icon-time:before { content: '\e80e'; } /* '' */ 17 | .icon-clock:before { content: '\e80f'; } /* '' */ 18 | .icon-group:before { content: '\e810'; } /* '' */ 19 | .icon-gas:before { content: '\e811'; } /* '' */ 20 | .icon-difficulty:before { content: '\e812'; } /* '' */ 21 | .icon-uncle:before { content: '\e813'; } /* '' */ 22 | .icon-hashrate:before { content: '\e814'; } /* '' */ 23 | .icon-gasprice:before { content: '\e815'; } /* '' */ -------------------------------------------------------------------------------- /src/css/minimal-icons-ie7-codes.css: -------------------------------------------------------------------------------- 1 | 2 | .icon-truck { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 3 | .icon-database { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 4 | .icon-mining { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 5 | .icon-check { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 6 | .icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 7 | .icon-loader { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 8 | .icon-check-o { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 9 | .icon-cancel-o { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 10 | .icon-warning-o { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 11 | .icon-network { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 12 | .icon-block { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 13 | .icon-bulb { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 14 | .icon-node { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 15 | .icon-laptop { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 16 | .icon-time { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 17 | .icon-clock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 18 | .icon-group { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 19 | .icon-gas { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 20 | .icon-difficulty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 21 | .icon-uncle { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 22 | .icon-hashrate { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 23 | .icon-gasprice { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -------------------------------------------------------------------------------- /src/css/minimal-icons-ie7.css: -------------------------------------------------------------------------------- 1 | [class^="icon-"], [class*=" icon-"] { 2 | font-family: 'minimal-icons'; 3 | font-style: normal; 4 | font-weight: normal; 5 | 6 | /* fix buttons height */ 7 | line-height: 1em; 8 | 9 | /* you can be more comfortable with increased icons size */ 10 | /* font-size: 120%; */ 11 | } 12 | 13 | .icon-truck { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 14 | .icon-database { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 15 | .icon-mining { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 16 | .icon-check { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 17 | .icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 18 | .icon-loader { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 19 | .icon-check-o { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 20 | .icon-cancel-o { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 21 | .icon-warning-o { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 22 | .icon-network { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 23 | .icon-block { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 24 | .icon-bulb { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 25 | .icon-node { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 26 | .icon-laptop { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 27 | .icon-time { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 28 | .icon-clock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 29 | .icon-group { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 30 | .icon-gas { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 31 | .icon-difficulty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 32 | .icon-uncle { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 33 | .icon-hashrate { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } 34 | .icon-gasprice { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -------------------------------------------------------------------------------- /src/css/minimal-icons.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'minimal-icons'; 3 | src: url('../fonts/minimal-icons.eot?7541141'); 4 | src: url('../fonts/minimal-icons.eot?7541141#iefix') format('embedded-opentype'), 5 | url('../fonts/minimal-icons.woff?7541141') format('woff'), 6 | url('../fonts/minimal-icons.ttf?7541141') format('truetype'), 7 | url('../fonts/minimal-icons.svg?7541141#minimal-icons') format('svg'); 8 | font-weight: normal; 9 | font-style: normal; 10 | } 11 | /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ 12 | /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ 13 | /* 14 | @media screen and (-webkit-min-device-pixel-ratio:0) { 15 | @font-face { 16 | font-family: 'minimal-icons'; 17 | src: url('../fonts/minimal-icons.svg?7541141#minimal-icons') format('svg'); 18 | } 19 | } 20 | */ 21 | 22 | [class^="icon-"]:before, [class*=" icon-"]:before { 23 | font-family: "minimal-icons"; 24 | font-style: normal; 25 | font-weight: normal; 26 | speak: none; 27 | 28 | display: inline-block; 29 | text-decoration: inherit; 30 | width: 1em; 31 | margin-right: .2em; 32 | text-align: center; 33 | /* opacity: .8; */ 34 | 35 | /* For safety - reset parent styles, that can break glyph codes*/ 36 | font-variant: normal; 37 | text-transform: none; 38 | 39 | /* fix buttons height, for twitter bootstrap */ 40 | line-height: 1em; 41 | 42 | /* Animation center compensation - margins should be symmetric */ 43 | /* remove if not needed */ 44 | margin-left: .2em; 45 | 46 | /* you can be more comfortable with increased icons size */ 47 | /* font-size: 120%; */ 48 | 49 | /* Font smoothing. That was taken from TWBS */ 50 | /*-webkit-font-smoothing: antialiased; 51 | -moz-osx-font-smoothing: grayscale;*/ 52 | 53 | /* Uncomment for 3D effect */ 54 | /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ 55 | } 56 | 57 | .icon-truck:before { content: '\e800'; } /* '' */ 58 | .icon-database:before { content: '\e801'; } /* '' */ 59 | .icon-mining:before { content: '\e802'; } /* '' */ 60 | .icon-check:before { content: '\e803'; } /* '' */ 61 | .icon-cancel:before { content: '\e804'; } /* '' */ 62 | .icon-loader:before { content: '\e805'; } /* '' */ 63 | .icon-check-o:before { content: '\e806'; } /* '' */ 64 | .icon-cancel-o:before { content: '\e807'; } /* '' */ 65 | .icon-warning-o:before { content: '\e808'; } /* '' */ 66 | .icon-network:before { content: '\e809'; } /* '' */ 67 | .icon-block:before { content: '\e80a'; } /* '' */ 68 | .icon-bulb:before { content: '\e80b'; } /* '' */ 69 | .icon-node:before { content: '\e80c'; } /* '' */ 70 | .icon-laptop:before { content: '\e80d'; } /* '' */ 71 | .icon-time:before { content: '\e80e'; } /* '' */ 72 | .icon-clock:before { content: '\e80f'; } /* '' */ 73 | .icon-group:before { content: '\e810'; } /* '' */ 74 | .icon-gas:before { content: '\e811'; } /* '' */ 75 | .icon-difficulty:before { content: '\e812'; } /* '' */ 76 | .icon-uncle:before { content: '\e813'; } /* '' */ 77 | .icon-hashrate:before { content: '\e814'; } /* '' */ 78 | .icon-gasprice:before { content: '\e815'; } /* '' */ -------------------------------------------------------------------------------- /src/css/toastr.min.css: -------------------------------------------------------------------------------- 1 | .toast-title{font-weight:700}.toast-message{-ms-word-wrap:break-word;word-wrap:break-word}.toast-message a,.toast-message label{color:#fff}.toast-message a:hover{color:#ccc;text-decoration:none}.toast-close-button{position:relative;right:-.3em;top:-.3em;float:right;font-size:20px;font-weight:700;color:#fff;-webkit-text-shadow:0 1px 0 #fff;text-shadow:0 1px 0 #fff;opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80)}.toast-close-button:focus,.toast-close-button:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;-ms-filter:alpha(Opacity=40);filter:alpha(opacity=40)}button.toast-close-button{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.toast-top-center{top:0;right:0;width:100%}.toast-bottom-center{bottom:0;right:0;width:100%}.toast-top-full-width{top:0;right:0;width:100%}.toast-bottom-full-width{bottom:0;right:0;width:100%}.toast-top-left{top:12px;left:12px}.toast-top-right{top:12px;right:12px}.toast-bottom-right{right:12px;bottom:12px}.toast-bottom-left{bottom:12px;left:12px}#toast-container{position:fixed;z-index:999999}#toast-container *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#toast-container>div{position:relative;overflow:hidden;margin:0 0 6px;padding:15px 15px 15px 50px;width:300px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background-position:15px center;background-repeat:no-repeat;-moz-box-shadow:0 0 12px #999;-webkit-box-shadow:0 0 12px #999;box-shadow:0 0 12px #999;color:#fff;opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80)}#toast-container>:hover{-moz-box-shadow:0 0 12px #000;-webkit-box-shadow:0 0 12px #000;box-shadow:0 0 12px #000;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100);cursor:pointer}#toast-container>.toast-info{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=)!important}#toast-container>.toast-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=)!important}#toast-container>.toast-success{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==)!important}#toast-container>.toast-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=)!important}#toast-container.toast-bottom-center>div,#toast-container.toast-top-center>div{width:300px;margin:auto}#toast-container.toast-bottom-full-width>div,#toast-container.toast-top-full-width>div{width:96%;margin:auto}.toast{background-color:#030303}.toast-success{background-color:#51a351}.toast-error{background-color:#bd362f}.toast-info{background-color:#2f96b4}.toast-warning{background-color:#f89406}.toast-progress{position:absolute;left:0;bottom:0;height:4px;background-color:#000;opacity:.4;-ms-filter:alpha(Opacity=40);filter:alpha(opacity=40)}@media all and (max-width:240px){#toast-container>div{padding:8px 8px 8px 50px;width:11em}#toast-container .toast-close-button{right:-.2em;top:-.2em}}@media all and (min-width:241px) and (max-width:480px){#toast-container>div{padding:8px 8px 8px 50px;width:18em}#toast-container .toast-close-button{right:-.2em;top:-.2em}}@media all and (min-width:481px) and (max-width:768px){#toast-container>div{padding:15px 15px 15px 50px;width:25em}} -------------------------------------------------------------------------------- /src/fonts/Simple-Line-Icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/src/fonts/Simple-Line-Icons.ttf -------------------------------------------------------------------------------- /src/fonts/minimal-icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/src/fonts/minimal-icons.eot -------------------------------------------------------------------------------- /src/fonts/minimal-icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/src/fonts/minimal-icons.ttf -------------------------------------------------------------------------------- /src/fonts/minimal-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/src/fonts/minimal-icons.woff -------------------------------------------------------------------------------- /src/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/src/images/favicon.ico -------------------------------------------------------------------------------- /src/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/src/images/favicon.png -------------------------------------------------------------------------------- /src/images/screenshot-v0.0.1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/src/images/screenshot-v0.0.1.jpg -------------------------------------------------------------------------------- /src/images/screenshot-v0.0.2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/src/images/screenshot-v0.0.2.jpg -------------------------------------------------------------------------------- /src/images/screenshot-v0.0.5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/src/images/screenshot-v0.0.5.jpg -------------------------------------------------------------------------------- /src/images/screenshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/src/images/screenshot.jpg -------------------------------------------------------------------------------- /src/js/app.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /* Init Angular App */ 4 | 5 | var netStatsApp = angular.module('netStatsApp', ['netStatsApp.filters', 'netStatsApp.directives', 'ngStorage']); 6 | 7 | 8 | /* Services */ 9 | 10 | netStatsApp.factory('socket', function ($rootScope) { 11 | var socket = new Primus(); 12 | return socket; 13 | }); 14 | 15 | netStatsApp.factory('toastr', function ($rootScope) { 16 | toastr = window.toastr; 17 | toastr.options = { 18 | "closeButton": false, 19 | "debug": false, 20 | "progressBar": false, 21 | "newestOnTop": true, 22 | "positionClass": "toast-top-right", 23 | "preventDuplicates": false, 24 | "onclick": null, 25 | "showDuration": "300", 26 | "hideDuration": "1000", 27 | "timeOut": "5000", 28 | "extendedTimeOut": "1000", 29 | "showEasing": "swing", 30 | "hideEasing": "linear", 31 | "showMethod": "fadeIn", 32 | "hideMethod": "fadeOut" 33 | }; 34 | return toastr; 35 | }); 36 | 37 | netStatsApp.factory('_', function ($rootScope) { 38 | var lodash = window._; 39 | return lodash; 40 | }); 41 | -------------------------------------------------------------------------------- /src/js/lib/d3.tip.min.js: -------------------------------------------------------------------------------- 1 | d3.tip=function(){function t(t){v=d(t),w=v.createSVGPoint(),document.body.appendChild(x)}function e(){return"n"}function n(){return[0,0]}function r(){return" "}function o(){var t=y();return{top:t.n.y-x.offsetHeight,left:t.n.x-x.offsetWidth/2}}function l(){var t=y();return{top:t.s.y,left:t.s.x-x.offsetWidth/2}}function s(){var t=y();return{top:t.e.y-x.offsetHeight/2,left:t.e.x}}function f(){var t=y();return{top:t.w.y-x.offsetHeight/2,left:t.w.x-x.offsetWidth}}function i(){var t=y();return{top:t.nw.y-x.offsetHeight,left:t.nw.x-x.offsetWidth}}function u(){var t=y();return{top:t.ne.y-x.offsetHeight,left:t.ne.x}}function a(){var t=y();return{top:t.sw.y,left:t.sw.x-x.offsetWidth}}function c(){var t=y();return{top:t.se.y,left:t.e.x}}function p(){var t=d3.select(document.createElement("div"));return t.style({position:"absolute",opacity:0,pointerEvents:"none",boxSizing:"border-box"}),t.node()}function d(t){return t=t.node(),"svg"==t.tagName.toLowerCase()?t:t.ownerSVGElement}function y(){var t=T||d3.event.target,e={},n=t.getScreenCTM(),r=t.getBBox(),o=r.width,l=r.height,s=r.x,f=r.y,i=document.documentElement.scrollTop||document.body.scrollTop,u=document.documentElement.scrollLeft||document.body.scrollLeft;return w.x=s+u,w.y=f+i,e.nw=w.matrixTransform(n),w.x+=o,e.ne=w.matrixTransform(n),w.y+=l,e.se=w.matrixTransform(n),w.x-=o,e.sw=w.matrixTransform(n),w.y-=l/2,e.w=w.matrixTransform(n),w.x+=o,e.e=w.matrixTransform(n),w.x-=o/2,w.y-=l/2,e.n=w.matrixTransform(n),w.y+=l,e.s=w.matrixTransform(n),e}var m=e,g=n,h=r,x=p(),v=null,w=null,T=null;t.show=function(){var e=Array.prototype.slice.call(arguments);e[e.length-1]instanceof SVGElement&&(T=e.pop());var n,r=h.apply(this,e),o=g.apply(this,e),l=m.apply(this,e),s=d3.select(x),f=0;for(s.html(r).style({opacity:1,"pointer-events":"all"});f--;)s.classed(E[f],!1);return n=b.get(l).apply(this),s.classed(l,!0).style({top:n.top+o[0]+"px",left:n.left+o[1]+"px"}),t},t.hide=function(){return nodel=d3.select(x),nodel.style({opacity:0,"pointer-events":"none"}),t},t.attr=function(e){if(arguments.length<2&&"string"==typeof e)return d3.select(x).attr(e);var n=Array.prototype.slice.call(arguments);return d3.selection.prototype.attr.apply(d3.select(x),n),t},t.style=function(e){if(arguments.length<2&&"string"==typeof e)return d3.select(x).style(e);var n=Array.prototype.slice.call(arguments);return d3.selection.prototype.style.apply(d3.select(x),n),t},t.direction=function(e){return arguments.length?(m=null==e?e:d3.functor(e),t):m},t.offset=function(e){return arguments.length?(g=null==e?e:d3.functor(e),t):g},t.html=function(e){return arguments.length?(h=null==e?e:d3.functor(e),t):h};var b=d3.map({n:o,s:l,e:s,w:f,nw:i,ne:u,sw:a,se:c}),E=b.keys();return t}; -------------------------------------------------------------------------------- /src/js/lib/moment.en.min.js: -------------------------------------------------------------------------------- 1 | !function(e){"function"==typeof define&&define.amd?define(["moment"],e):"object"==typeof exports?module.exports=e(require("../moment")):e(("undefined"!=typeof global?global:this).moment)}(function(e){return e.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few sec",m:"1 min",mm:"%d min",h:"1 h",hh:"%d h",d:"a day",dd:"%d days",M:"a month",MM:"%d mon",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10,d=1===~~(e%100/10)?"th":1===a?"st":2===a?"nd":3===a?"rd":"th";return e+d},week:{dow:1,doy:4}})}); -------------------------------------------------------------------------------- /src/js/lib/ngStorage.min.js: -------------------------------------------------------------------------------- 1 | /*! ngstorage 0.3.4 | Copyright (c) 2015 Gias Kay Lee | MIT License */!function(a,b){"use strict";return"function"==typeof define&&define.amd?void define("ngStorage",["angular"],function(a){return b(a)}):b(a)}("undefined"==typeof angular?null:angular,function(a){"use strict";function b(b){return["$rootScope","$window","$log","$timeout",function(c,d,e,f){function g(a){var b=d[a];if(b&&"localStorage"===a){var c="__"+Math.round(1e7*Math.random());try{localStorage.setItem(c,c),localStorage.removeItem(c)}catch(e){b=!1}}return b}var h,i,j=g(b)||(e.warn("This browser does not support Web Storage!"),{setItem:function(){},getItem:function(){}}),k={$default:function(b){for(var c in b)a.isDefined(k[c])||(k[c]=b[c]);return k},$reset:function(a){for(var b in k)"$"===b[0]||delete k[b];return k.$default(a)}};try{j=d[b],j.length}catch(l){e.warn("This browser does not support Web Storage!"),j={}}for(var m,n=0,o=j.length;o>n;n++)(m=j.key(n))&&"ngStorage-"===m.slice(0,10)&&(k[m.slice(10)]=a.fromJson(j.getItem(m)));return h=a.copy(k),c.$watch(function(){var b;i||(i=f(function(){if(i=null,!a.equals(k,h)){b=a.copy(h),a.forEach(k,function(c,d){a.isDefined(c)&&"$"!==d[0]&&j.setItem("ngStorage-"+d,a.toJson(c)),delete b[d]});for(var c in b)j.removeItem("ngStorage-"+c);h=a.copy(k)}},100,!1))}),"localStorage"===b&&d.addEventListener&&d.addEventListener("storage",function(b){"ngStorage-"===b.key.slice(0,10)&&(b.newValue?k[b.key.slice(10)]=a.fromJson(b.newValue):delete k[b.key.slice(10)],h=a.copy(k),c.$apply())}),k}]}a.module("ngStorage",[]).factory("$localStorage",b("localStorage")).factory("$sessionStorage",b("sessionStorage"))}); -------------------------------------------------------------------------------- /src/js/lib/toastr.min.js: -------------------------------------------------------------------------------- 1 | !function(e){e(["jquery"],function(e){return function(){function t(e,t,n){return f({type:O.error,iconClass:g().iconClasses.error,message:e,optionsOverride:n,title:t})}function n(t,n){return t||(t=g()),v=e("#"+t.containerId),v.length?v:(n&&(v=c(t)),v)}function i(e,t,n){return f({type:O.info,iconClass:g().iconClasses.info,message:e,optionsOverride:n,title:t})}function o(e){w=e}function s(e,t,n){return f({type:O.success,iconClass:g().iconClasses.success,message:e,optionsOverride:n,title:t})}function a(e,t,n){return f({type:O.warning,iconClass:g().iconClasses.warning,message:e,optionsOverride:n,title:t})}function r(e){var t=g();v||n(t),l(e,t)||u(t)}function d(t){var i=g();return v||n(i),t&&0===e(":focus",t).length?void h(t):void(v.children().length&&v.remove())}function u(t){for(var n=v.children(),i=n.length-1;i>=0;i--)l(e(n[i]),t)}function l(t,n){return t&&0===e(":focus",t).length?(t[n.hideMethod]({duration:n.hideDuration,easing:n.hideEasing,complete:function(){h(t)}}),!0):!1}function c(t){return v=e("
").attr("id",t.containerId).addClass(t.positionClass).attr("aria-live","polite").attr("role","alert"),v.appendTo(e(t.target)),v}function p(){return{tapToDismiss:!0,toastClass:"toast",containerId:"toast-container",debug:!1,showMethod:"fadeIn",showDuration:300,showEasing:"swing",onShown:void 0,hideMethod:"fadeOut",hideDuration:1e3,hideEasing:"swing",onHidden:void 0,extendedTimeOut:1e3,iconClasses:{error:"toast-error",info:"toast-info",success:"toast-success",warning:"toast-warning"},iconClass:"toast-info",positionClass:"toast-top-right",timeOut:5e3,titleClass:"toast-title",messageClass:"toast-message",target:"body",closeHtml:"",newestOnTop:!0,preventDuplicates:!1,progressBar:!1}}function m(e){w&&w(e)}function f(t){function i(t){return!e(":focus",l).length||t?(clearTimeout(O.intervalId),l[r.hideMethod]({duration:r.hideDuration,easing:r.hideEasing,complete:function(){h(l),r.onHidden&&"hidden"!==b.state&&r.onHidden(),b.state="hidden",b.endTime=new Date,m(b)}})):void 0}function o(){(r.timeOut>0||r.extendedTimeOut>0)&&(u=setTimeout(i,r.extendedTimeOut),O.maxHideTime=parseFloat(r.extendedTimeOut),O.hideEta=(new Date).getTime()+O.maxHideTime)}function s(){clearTimeout(u),O.hideEta=0,l.stop(!0,!0)[r.showMethod]({duration:r.showDuration,easing:r.showEasing})}function a(){var e=(O.hideEta-(new Date).getTime())/O.maxHideTime*100;f.width(e+"%")}var r=g(),d=t.iconClass||r.iconClass;if(r.preventDuplicates){if(t.message===C)return;C=t.message}"undefined"!=typeof t.optionsOverride&&(r=e.extend(r,t.optionsOverride),d=t.optionsOverride.iconClass||d),T++,v=n(r,!0);var u=null,l=e("
"),c=e("
"),p=e("
"),f=e("
"),w=e(r.closeHtml),O={intervalId:null,hideEta:null,maxHideTime:null},b={toastId:T,state:"visible",startTime:new Date,options:r,map:t};return t.iconClass&&l.addClass(r.toastClass).addClass(d),t.title&&(c.append(t.title).addClass(r.titleClass),l.append(c)),t.message&&(p.append(t.message).addClass(r.messageClass),l.append(p)),r.closeButton&&(w.addClass("toast-close-button").attr("role","button"),l.prepend(w)),r.progressBar&&(f.addClass("toast-progress"),l.prepend(f)),l.hide(),r.newestOnTop?v.prepend(l):v.append(l),l[r.showMethod]({duration:r.showDuration,easing:r.showEasing,complete:r.onShown}),r.timeOut>0&&(u=setTimeout(i,r.timeOut),O.maxHideTime=parseFloat(r.timeOut),O.hideEta=(new Date).getTime()+O.maxHideTime,r.progressBar&&(O.intervalId=setInterval(a,10))),l.hover(s,o),!r.onclick&&r.tapToDismiss&&l.click(i),r.closeButton&&w&&w.click(function(e){e.stopPropagation?e.stopPropagation():void 0!==e.cancelBubble&&e.cancelBubble!==!0&&(e.cancelBubble=!0),i(!0)}),r.onclick&&l.click(function(){r.onclick(),i()}),m(b),r.debug&&console&&console.log(b),l}function g(){return e.extend({},p(),b.options)}function h(e){v||(v=n()),e.is(":visible")||(e.remove(),e=null,0===v.children().length&&v.remove())}var v,w,C,T=0,O={error:"error",info:"info",success:"success",warning:"warning"},b={clear:r,remove:d,error:t,getContainer:n,info:i,options:{},subscribe:o,success:s,version:"2.1.0",warning:a};return b}()})}("function"==typeof define&&define.amd?define:function(e,t){"undefined"!=typeof module&&module.exports?module.exports=t(require("jquery")):window.toastr=t(window.jQuery)}); -------------------------------------------------------------------------------- /src/js/lib/topojson.min.js: -------------------------------------------------------------------------------- 1 | !function(){function t(n,t){function r(t){var r,e=n.arcs[0>t?~t:t],o=e[0];return n.transform?(r=[0,0],e.forEach(function(n){r[0]+=n[0],r[1]+=n[1]})):r=e[e.length-1],0>t?[r,o]:[o,r]}function e(n,t){for(var r in n){var e=n[r];delete t[e.start],delete e.start,delete e.end,e.forEach(function(n){o[0>n?~n:n]=1}),f.push(e)}}var o={},i={},u={},f=[],c=-1;return t.forEach(function(r,e){var o,i=n.arcs[0>r?~r:r];i.length<3&&!i[1][0]&&!i[1][1]&&(o=t[++c],t[c]=r,t[e]=o)}),t.forEach(function(n){var t,e,o=r(n),f=o[0],c=o[1];if(t=u[f])if(delete u[t.end],t.push(n),t.end=c,e=i[c]){delete i[e.start];var a=e===t?t:t.concat(e);i[a.start=t.start]=u[a.end=e.end]=a}else i[t.start]=u[t.end]=t;else if(t=i[c])if(delete i[t.start],t.unshift(n),t.start=f,e=u[f]){delete u[e.end];var s=e===t?t:e.concat(t);i[s.start=e.start]=u[s.end=t.end]=s}else i[t.start]=u[t.end]=t;else t=[n],i[t.start=f]=u[t.end=c]=t}),e(u,i),e(i,u),t.forEach(function(n){o[0>n?~n:n]||f.push([n])}),f}function r(n,r,e){function o(n){var t=0>n?~n:n;(s[t]||(s[t]=[])).push({i:n,g:a})}function i(n){n.forEach(o)}function u(n){n.forEach(i)}function f(n){"GeometryCollection"===n.type?n.geometries.forEach(f):n.type in l&&(a=n,l[n.type](n.arcs))}var c=[];if(arguments.length>1){var a,s=[],l={LineString:i,MultiLineString:u,Polygon:u,MultiPolygon:function(n){n.forEach(u)}};f(r),s.forEach(arguments.length<3?function(n){c.push(n[0].i)}:function(n){e(n[0].g,n[n.length-1].g)&&c.push(n[0].i)})}else for(var h=0,p=n.arcs.length;p>h;++h)c.push(h);return{type:"MultiLineString",arcs:t(n,c)}}function e(r,e){function o(n){n.forEach(function(t){t.forEach(function(t){(f[t=0>t?~t:t]||(f[t]=[])).push(n)})}),c.push(n)}function i(n){return l(u(r,{type:"Polygon",arcs:[n]}).coordinates[0])>0}var f={},c=[],a=[];return e.forEach(function(n){"Polygon"===n.type?o(n.arcs):"MultiPolygon"===n.type&&n.arcs.forEach(o)}),c.forEach(function(n){if(!n._){var t=[],r=[n];for(n._=1,a.push(t);n=r.pop();)t.push(n),n.forEach(function(n){n.forEach(function(n){f[0>n?~n:n].forEach(function(n){n._||(n._=1,r.push(n))})})})}}),c.forEach(function(n){delete n._}),{type:"MultiPolygon",arcs:a.map(function(e){var o=[];if(e.forEach(function(n){n.forEach(function(n){n.forEach(function(n){f[0>n?~n:n].length<2&&o.push(n)})})}),o=t(r,o),(n=o.length)>1)for(var u,c=i(e[0][0]),a=0;n>a;++a)if(c===i(o[a])){u=o[0],o[0]=o[a],o[a]=u;break}return o})}}function o(n,t){return"GeometryCollection"===t.type?{type:"FeatureCollection",features:t.geometries.map(function(t){return i(n,t)})}:i(n,t)}function i(n,t){var r={type:"Feature",id:t.id,properties:t.properties||{},geometry:u(n,t)};return null==t.id&&delete r.id,r}function u(n,t){function r(n,t){t.length&&t.pop();for(var r,e=s[0>n?~n:n],o=0,i=e.length;i>o;++o)t.push(r=e[o].slice()),a(r,o);0>n&&f(t,i)}function e(n){return n=n.slice(),a(n,0),n}function o(n){for(var t=[],e=0,o=n.length;o>e;++e)r(n[e],t);return t.length<2&&t.push(t[0].slice()),t}function i(n){for(var t=o(n);t.length<4;)t.push(t[0].slice());return t}function u(n){return n.map(i)}function c(n){var t=n.type;return"GeometryCollection"===t?{type:t,geometries:n.geometries.map(c)}:t in l?{type:t,coordinates:l[t](n)}:null}var a=v(n.transform),s=n.arcs,l={Point:function(n){return e(n.coordinates)},MultiPoint:function(n){return n.coordinates.map(e)},LineString:function(n){return o(n.arcs)},MultiLineString:function(n){return n.arcs.map(o)},Polygon:function(n){return u(n.arcs)},MultiPolygon:function(n){return n.arcs.map(u)}};return c(t)}function f(n,t){for(var r,e=n.length,o=e-t;o<--e;)r=n[o],n[o++]=n[e],n[e]=r}function c(n,t){for(var r=0,e=n.length;e>r;){var o=r+e>>>1;n[o]n&&(n=~n);var r=o[n];r?r.push(t):o[n]=[t]})}function r(n,r){n.forEach(function(n){t(n,r)})}function e(n,t){"GeometryCollection"===n.type?n.geometries.forEach(function(n){e(n,t)}):n.type in u&&u[n.type](n.arcs,t)}var o={},i=n.map(function(){return[]}),u={LineString:t,MultiLineString:r,Polygon:r,MultiPolygon:function(n,t){n.forEach(function(n){r(n,t)})}};n.forEach(e);for(var f in o)for(var a=o[f],s=a.length,l=0;s>l;++l)for(var h=l+1;s>h;++h){var p,g=a[l],v=a[h];(p=i[g])[f=c(p,v)]!==v&&p.splice(f,0,v),(p=i[v])[f=c(p,g)]!==g&&p.splice(f,0,g)}return i}function s(n,t){function r(n){i.remove(n),n[1][2]=t(n),i.push(n)}var e=v(n.transform),o=m(n.transform),i=g();return t||(t=h),n.arcs.forEach(function(n){for(var u,f,c=[],a=0,s=0,l=n.length;l>s;++s)f=n[s],e(n[s]=[f[0],f[1],1/0],s);for(var s=1,l=n.length-1;l>s;++s)u=n.slice(s-1,s+2),u[1][2]=t(u),c.push(u),i.push(u);for(var s=0,l=c.length;l>s;++s)u=c[s],u.previous=c[s-1],u.next=c[s+1];for(;u=i.pop();){var h=u.previous,p=u.next;u[1][2]0;){var r=(t+1>>1)-1,o=e[r];if(p(n,o)>=0)break;e[o._=t]=o,e[n._=t=r]=n}}function t(n,t){for(;;){var r=t+1<<1,i=r-1,u=t,f=e[u];if(o>i&&p(e[i],f)<0&&(f=e[u=i]),o>r&&p(e[r],f)<0&&(f=e[u=r]),u===t)break;e[f._=t]=f,e[n._=t=u]=n}}var r={},e=[],o=0;return r.push=function(t){return n(e[t._=o]=t,o++),o},r.pop=function(){if(!(0>=o)){var n,r=e[0];return--o>0&&(n=e[o],t(e[n._=0]=n,0)),r}},r.remove=function(r){var i,u=r._;if(e[u]===r)return u!==--o&&(i=e[o],(p(i,r)<0?n:t)(e[i._=u]=i,u)),u},r}function v(n){if(!n)return y;var t,r,e=n.scale[0],o=n.scale[1],i=n.translate[0],u=n.translate[1];return function(n,f){f||(t=r=0),n[0]=(t+=n[0])*e+i,n[1]=(r+=n[1])*o+u}}function m(n){if(!n)return y;var t,r,e=n.scale[0],o=n.scale[1],i=n.translate[0],u=n.translate[1];return function(n,f){f||(t=r=0);var c=(n[0]-i)/e|0,a=(n[1]-u)/o|0;n[0]=c-t,n[1]=a-r,t=c,r=a}}function y(){}var d={version:"1.6.18",mesh:function(n){return u(n,r.apply(this,arguments))},meshArcs:r,merge:function(n){return u(n,e.apply(this,arguments))},mergeArcs:e,feature:o,neighbors:a,presimplify:s};"function"==typeof define&&define.amd?define(d):"object"==typeof module&&module.exports?module.exports=d:this.topojson=d}(); -------------------------------------------------------------------------------- /src/js/script.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | $('body').on('mouseenter', '[data-toggle="tooltip"]', function( event ) { 3 | $(this).tooltip('show'); 4 | }).on('mouseleave', '[data-toggle="tooltip"]', function( event ) { 5 | $(this).tooltip('hide'); 6 | }); 7 | 8 | $.fn.sparkline.defaults.bar.height = 63; 9 | $.fn.sparkline.defaults.bar.barWidth = 6; 10 | $.fn.sparkline.defaults.bar.barSpacing = 1; 11 | $.fn.sparkline.defaults.bar.tooltipClassname = 'jqstooltip'; 12 | $.fn.sparkline.defaults.bar.tooltipOffsetX = 0; 13 | $.fn.sparkline.defaults.bar.tooltipFormat = $.spformat('
{{prefix}}{{value}} {{suffix}}
'); 14 | $.fn.sparkline.defaults.bar.colorMap = $.range_map({ 15 | '0:6': '#10a0de', 16 | '6:15': '#7bcc3a', 17 | '15:40': '#FFD162', 18 | '40:60': '#ff8a00', 19 | '60:': '#F74B4B' 20 | }); 21 | 22 | moment.relativeTimeThreshold('s', 60); 23 | moment.relativeTimeThreshold('m', 60); 24 | moment.relativeTimeThreshold('h', 24); 25 | moment.relativeTimeThreshold('d', 28); 26 | moment.relativeTimeThreshold('M', 12); 27 | 28 | })(); 29 | 30 | //(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ 31 | //(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), 32 | //m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) 33 | //})(window,document,'script','//www.google-analytics.com/analytics.js','ga'); 34 | 35 | // ga('create', 'UA-68390837-2', 'auto'); 36 | //ga('create', 'UA-80834434-1', 'auto'); 37 | //ga('send', 'pageview'); 38 | -------------------------------------------------------------------------------- /src/views/error.jade: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | h1= message 5 | h2= error.status 6 | pre #{error.stack} 7 | -------------------------------------------------------------------------------- /src/views/layout.jade: -------------------------------------------------------------------------------- 1 | //- layout.jade 2 | doctype html 3 | html(ng-app="netStatsApp") 4 | head 5 | meta(name="viewport", content="width=device-width, initial-scale=1.0, maximum-scale=1.0") 6 | title Ethereum Network Status 7 | style(type="text/css") [ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak { display: none !important; } 8 | link(rel='stylesheet', href='//fonts.googleapis.com/css?family=Source+Sans+Pro:200,300,400,600,700') 9 | link(rel='stylesheet', href='/css/netstats.min.css') 10 | body 11 | block content 12 | 13 | script(src="/js/netstats.min.js") -------------------------------------------------------------------------------- /web-app/.meteor/local/build/README: -------------------------------------------------------------------------------- 1 | This is a Meteor application bundle. It has only one external dependency: 2 | Node.js 0.10.36 or newer. To run the application: 3 | 4 | $ (cd programs/server && npm install) 5 | $ export MONGO_URL='mongodb://user:password@host:port/databasename' 6 | $ export ROOT_URL='http://example.com' 7 | $ export MAIL_URL='smtp://user:password@mailhost:port/' 8 | $ node main.js 9 | 10 | Use the PORT environment variable to set the port where the 11 | application will listen. The default is 80, but that will require 12 | root on most systems. 13 | 14 | Find out more about Meteor at meteor.com. 15 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/main.js: -------------------------------------------------------------------------------- 1 | 2 | // The debugger pauses here when you run `meteor debug`, because this is 3 | // the very first code to be executed by the server process. If you have 4 | // not already added any `debugger` statements to your code, feel free to 5 | // do so now, wait for the server to restart, then reload this page and 6 | // click the |▶ button to continue. 7 | process.argv.splice(2, 0, 'program.json'); 8 | process.chdir(require('path').join(__dirname, 'programs', 'server')); 9 | require('./programs/server/boot.js'); -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/assets/packages/boilerplate-generator/boilerplate_web.browser.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{#each css}} {{/each}} 4 | 5 | {{#if inlineScriptsAllowed}} 6 | 7 | {{else}} 8 | 9 | {{/if}} 10 | {{#each js}} 11 | {{/each}} 12 | {{#each additionalStaticJs}} 13 | {{#if ../inlineScriptsAllowed}} 14 | 17 | {{else}} 18 | 20 | {{/if}} 21 | {{/each}} 22 | 23 | {{{head}}} 24 | 25 | 26 | {{{body}}} 27 | 28 | 29 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/assets/packages/boilerplate-generator/boilerplate_web.cordova.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | {{#each css}} {{/each}} 9 | 10 | 23 | 24 | 25 | {{#each js}} 26 | {{/each}} 27 | {{#each additionalStaticJs}} 28 | {{#if ../inlineScriptsAllowed}} 29 | 32 | {{else}} 33 | 35 | {{/if}} 36 | {{/each}} 37 | {{{head}}} 38 | 39 | 40 | 41 | {{{body}}} 42 | 43 | 44 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/boot-utils.js: -------------------------------------------------------------------------------- 1 | // Separated from boot.js for testing. 2 | 3 | // Check that we have a pid that looks like an integer (non-decimal 4 | // integer is okay). 5 | exports.validPid = function (pid) { 6 | return ! isNaN(+pid); 7 | }; 8 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "meteorRelease": "METEOR@1.1.0.2", 3 | "clientPaths": { 4 | "web.browser": "../web.browser/program.json" 5 | } 6 | } -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/mini-files.js: -------------------------------------------------------------------------------- 1 | var _ = require("underscore"); 2 | var os = require("os"); 3 | var path = require("path"); 4 | 5 | // All of these functions are attached to files.js for the tool; 6 | // they live here because we need them in boot.js as well to avoid duplicating 7 | // a lot of the code. 8 | // 9 | // Note that this file does NOT contain any of the "perform I/O maybe 10 | // synchronously" functions from files.js; this is intentional, because we want 11 | // to make it very hard to accidentally use fs.*Sync functions in the app server 12 | // after bootup (since they block all concurrency!) 13 | var files = module.exports; 14 | 15 | var toPosixPath = function (p, partialPath) { 16 | // Sometimes, you can have a path like \Users\IEUser on windows, and this 17 | // actually means you want C:\Users\IEUser 18 | if (p[0] === "\\" && (! partialPath)) { 19 | p = process.env.SystemDrive + p; 20 | } 21 | 22 | p = p.replace(/\\/g, '/'); 23 | if (p[1] === ':' && ! partialPath) { 24 | // transform "C:/bla/bla" to "/c/bla/bla" 25 | p = '/' + p[0] + p.slice(2); 26 | } 27 | 28 | return p; 29 | }; 30 | 31 | var toDosPath = function (p, partialPath) { 32 | if (p[0] === '/' && ! partialPath) { 33 | if (! /^\/[A-Za-z](\/|$)/.test(p)) 34 | throw new Error("Surprising path: " + p); 35 | // transform a previously windows path back 36 | // "/C/something" to "c:/something" 37 | p = p[1] + ":" + p.slice(2); 38 | } 39 | 40 | p = p.replace(/\//g, '\\'); 41 | return p; 42 | }; 43 | 44 | 45 | var convertToOSPath = function (standardPath, partialPath) { 46 | if (process.platform === "win32") { 47 | return toDosPath(standardPath, partialPath); 48 | } 49 | 50 | return standardPath; 51 | }; 52 | 53 | var convertToStandardPath = function (osPath, partialPath) { 54 | if (process.platform === "win32") { 55 | return toPosixPath(osPath, partialPath); 56 | } 57 | 58 | return osPath; 59 | } 60 | 61 | var convertToOSLineEndings = function (fileContents) { 62 | return fileContents.replace(/\n/g, os.EOL); 63 | }; 64 | 65 | var convertToStandardLineEndings = function (fileContents) { 66 | // Convert all kinds of end-of-line chars to linuxy "\n". 67 | return fileContents.replace(new RegExp("\r\n", "g"), "\n") 68 | .replace(new RegExp("\r", "g"), "\n"); 69 | }; 70 | 71 | 72 | // wrappings for path functions that always run as they were on unix (using 73 | // forward slashes) 74 | var wrapPathFunction = function (name, partialPaths) { 75 | var f = path[name]; 76 | return function (/* args */) { 77 | if (process.platform === 'win32') { 78 | var args = _.toArray(arguments); 79 | args = _.map(args, function (p, i) { 80 | // if partialPaths is turned on (for path.join mostly) 81 | // forget about conversion of absolute paths for Windows 82 | return toDosPath(p, partialPaths); 83 | }); 84 | return toPosixPath(f.apply(path, args), partialPaths); 85 | } else { 86 | return f.apply(path, arguments); 87 | } 88 | }; 89 | }; 90 | 91 | files.pathJoin = wrapPathFunction("join", true); 92 | files.pathNormalize = wrapPathFunction("normalize"); 93 | files.pathRelative = wrapPathFunction("relative"); 94 | files.pathResolve = wrapPathFunction("resolve"); 95 | files.pathDirname = wrapPathFunction("dirname"); 96 | files.pathBasename = wrapPathFunction("basename"); 97 | files.pathExtname = wrapPathFunction("extname"); 98 | files.pathSep = '/'; 99 | files.pathDelimiter = ':'; 100 | files.pathOsDelimiter = path.delimiter; 101 | 102 | files.convertToStandardPath = convertToStandardPath; 103 | files.convertToOSPath = convertToOSPath; 104 | files.convertToWindowsPath = toDosPath; 105 | files.convertToPosixPath = toPosixPath; 106 | 107 | files.convertToStandardLineEndings = convertToStandardLineEndings; 108 | files.convertToOSLineEndings = convertToOSLineEndings; 109 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/npm-shrinkwrap.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "meteor-dev-bundle", 3 | "version": "0.0.0", 4 | "dependencies": { 5 | "fibers": { 6 | "version": "1.0.5", 7 | "from": "fibers@1.0.5", 8 | "resolved": "https://registry.npmjs.org/fibers/-/fibers-1.0.5.tgz" 9 | }, 10 | "semver": { 11 | "version": "4.1.0", 12 | "from": "semver@4.1.0", 13 | "resolved": "https://registry.npmjs.org/semver/-/semver-4.1.0.tgz" 14 | }, 15 | "source-map-support": { 16 | "version": "0.2.8", 17 | "from": "source-map-support@0.2.8", 18 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.8.tgz", 19 | "dependencies": { 20 | "source-map": { 21 | "version": "0.1.32", 22 | "from": "source-map@0.1.32", 23 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", 24 | "dependencies": { 25 | "amdefine": { 26 | "version": "0.1.0", 27 | "from": "amdefine@>=0.0.4", 28 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.0.tgz" 29 | } 30 | } 31 | } 32 | } 33 | }, 34 | "underscore": { 35 | "version": "1.5.2", 36 | "from": "underscore@1.5.2", 37 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.5.2.tgz" 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "meteor-dev-bundle", 3 | "version": "0.0.0", 4 | "dependencies": { 5 | "fibers": "1.0.5", 6 | "underscore": "1.5.2", 7 | "source-map-support": "0.2.8", 8 | "semver": "4.1.0" 9 | }, 10 | "devDependencies": { 11 | "eachline": "https://github.com/meteor/node-eachline/tarball/ff89722ff94e6b6a08652bf5f44c8fffea8a21da", 12 | "chalk": "0.5.1" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/autopublish.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 3 | /* Imports */ 4 | var Meteor = Package.meteor.Meteor; 5 | 6 | 7 | 8 | /* Exports */ 9 | if (typeof Package === 'undefined') Package = {}; 10 | Package.autopublish = {}; 11 | 12 | })(); 13 | 14 | //# sourceMappingURL=autopublish.js.map 15 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/autopublish.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":[],"names":[],"mappings":";;;;;","file":"/packages/autopublish.js"} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/base64.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["base64/base64.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mB;;AAEA,uF;;AAEA,sB;;AAEA,gD;AACA,4C;AACA,E;;AAEA,Y;;AAEA,kC;;AAEA,kC;AACA,oB;AACA,yC;AACA,0C;AACA,iC;AACA,sB;AACA,wB;AACA,mE;AACA,O;AACA,oB;AACA,K;AACA,G;;AAEA,kB;AACA,e;AACA,e;AACA,e;AACA,e;AACA,0C;AACA,oB;AACA,W;AACA,iC;AACA,iC;AACA,Y;AACA,W;AACA,oC;AACA,gC;AACA,Y;AACA,W;AACA,qC;AACA,0B;AACA,8B;AACA,8B;AACA,8B;AACA,8B;AACA,e;AACA,e;AACA,e;AACA,e;AACA,Y;AACA,K;AACA,G;AACA,kB;AACA,4B;AACA,4B;AACA,kB;AACA,uB;AACA,Q;AACA,8B;AACA,kB;AACA,uB;AACA,G;AACA,yB;AACA,E;;AAEA,8B;AACA,mC;AACA,E;;AAEA,4B;AACA,mB;AACA,c;AACA,G;AACA,0B;AACA,E;;AAEA,oE;AACA,mE;AACA,sE;AACA,qE;AACA,O;AACA,mC;AACA,gF;AACA,iB;AACA,mC;AACA,kB;AACA,K;AACA,mC;AACA,e;AACA,G;AACA,8C;AACA,E;;AAEA,gC;AACA,yC;AACA,0C;AACA,U;AACA,0C;AACA,Y;AACA,G;AACA,kC;;AAEA,iB;AACA,iB;AACA,mB;;AAEA,Y;;AAEA,wC;AACA,0B;AACA,sB;AACA,oB;AACA,W;AACA,gB;AACA,iD;AACA,mB;AACA,Y;AACA,W;AACA,gB;AACA,iD;AACA,2B;AACA,qB;AACA,4B;AACA,Y;AACA,W;AACA,mB;AACA,6B;AACA,uB;AACA,gC;AACA,O;AACA,Y;AACA,W;AACA,mB;AACA,6B;AACA,O;AACA,Y;AACA,K;AACA,G;AACA,a;AACA,E","file":"/packages/base64.js","sourcesContent":["// Base 64 encoding\n\nvar BASE_64_CHARS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\nvar BASE_64_VALS = {};\n\nfor (var i = 0; i < BASE_64_CHARS.length; i++) {\n BASE_64_VALS[BASE_64_CHARS.charAt(i)] = i;\n};\n\nBase64 = {};\n\nBase64.encode = function (array) {\n\n if (typeof array === \"string\") {\n var str = array;\n array = Base64.newBinary(str.length);\n for (var i = 0; i < str.length; i++) {\n var ch = str.charCodeAt(i);\n if (ch > 0xFF) {\n throw new Error(\n \"Not ascii. Base64.encode can only take ascii strings.\");\n }\n array[i] = ch;\n }\n }\n\n var answer = [];\n var a = null;\n var b = null;\n var c = null;\n var d = null;\n for (var i = 0; i < array.length; i++) {\n switch (i % 3) {\n case 0:\n a = (array[i] >> 2) & 0x3F;\n b = (array[i] & 0x03) << 4;\n break;\n case 1:\n b = b | (array[i] >> 4) & 0xF;\n c = (array[i] & 0xF) << 2;\n break;\n case 2:\n c = c | (array[i] >> 6) & 0x03;\n d = array[i] & 0x3F;\n answer.push(getChar(a));\n answer.push(getChar(b));\n answer.push(getChar(c));\n answer.push(getChar(d));\n a = null;\n b = null;\n c = null;\n d = null;\n break;\n }\n }\n if (a != null) {\n answer.push(getChar(a));\n answer.push(getChar(b));\n if (c == null)\n answer.push('=');\n else\n answer.push(getChar(c));\n if (d == null)\n answer.push('=');\n }\n return answer.join(\"\");\n};\n\nvar getChar = function (val) {\n return BASE_64_CHARS.charAt(val);\n};\n\nvar getVal = function (ch) {\n if (ch === '=') {\n return -1;\n }\n return BASE_64_VALS[ch];\n};\n\n// XXX This is a weird place for this to live, but it's used both by\n// this package and 'ejson', and we can't put it in 'ejson' without\n// introducing a circular dependency. It should probably be in its own\n// package or as a helper in a package that both 'base64' and 'ejson'\n// use.\nBase64.newBinary = function (len) {\n if (typeof Uint8Array === 'undefined' || typeof ArrayBuffer === 'undefined') {\n var ret = [];\n for (var i = 0; i < len; i++) {\n ret.push(0);\n }\n ret.$Uint8ArrayPolyfill = true;\n return ret;\n }\n return new Uint8Array(new ArrayBuffer(len));\n};\n\nBase64.decode = function (str) {\n var len = Math.floor((str.length*3)/4);\n if (str.charAt(str.length - 1) == '=') {\n len--;\n if (str.charAt(str.length - 2) == '=')\n len--;\n }\n var arr = Base64.newBinary(len);\n\n var one = null;\n var two = null;\n var three = null;\n\n var j = 0;\n\n for (var i = 0; i < str.length; i++) {\n var c = str.charAt(i);\n var v = getVal(c);\n switch (i % 4) {\n case 0:\n if (v < 0)\n throw new Error('invalid base64 string');\n one = v << 2;\n break;\n case 1:\n if (v < 0)\n throw new Error('invalid base64 string');\n one = one | (v >> 4);\n arr[j++] = one;\n two = (v & 0x0F) << 4;\n break;\n case 2:\n if (v >= 0) {\n two = two | (v >> 2);\n arr[j++] = two;\n three = (v & 0x03) << 6;\n }\n break;\n case 3:\n if (v >= 0) {\n arr[j++] = three | v;\n }\n break;\n }\n }\n return arr;\n};\n"]} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/boilerplate-generator.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["boilerplate-generator/boilerplate-generator.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,2B;AACA,+B;;AAEA,4B;AACA,4C;AACA,yD;AACA,E;;AAEA,kD;AACA,kB;AACA,0B;AACA,qC;AACA,uB;AACA,mB;;AAEA,iD;AACA,a;AACA,kB;AACA,W;AACA,I;AACA,E;;AAEA,sE;AACA,qE;AACA,uE;AACA,mE;AACA,qD;AACA,kB;;AAEA,qC;AACA,kE;;AAEA,+B;AACA,+D;AACA,wC;AACA,E;;AAEA,4E;AACA,2C;AACA,qE;AACA,4E;AACA,gB;AACA,wE;AACA,4D;AACA,iE;AACA,mD;AACA,oB;AACA,qC;AACA,oD;AACA,sD;;AAEA,+B;AACA,c;AACA,a;AACA,e;AACA,e;AACA,8C;AACA,M;;AAEA,uD;AACA,6D;;AAEA,sC;AACA,wC;AACA,qC;;AAEA,2B;AACA,iD;AACA,iC;AACA,8B;AACA,O;;AAEA,2D;AACA,8C;AACA,O;AACA,0D;AACA,6C;AACA,O;AACA,iC;AACA,kC;AACA,kD;AACA,O;AACA,iC;AACA,kC;AACA,kD;AACA,O;AACA,O;AACA,0D;AACA,2C;;AAEA,8E;AACA,0D;AACA,gF;AACA,mB;AACA,mB;AACA,4C;AACA,wC;AACA,E;;AAEA,8C;AACA,iD;AACA,kC;AACA,G","file":"/packages/boilerplate-generator.js","sourcesContent":["var fs = Npm.require('fs');\nvar path = Npm.require('path');\n\n// Copied from webapp_server\nvar readUtf8FileSync = function (filename) {\n return Meteor.wrapAsync(fs.readFile)(filename, 'utf8');\n};\n\nBoilerplate = function (arch, manifest, options) {\n var self = this;\n options = options || {};\n self.template = _getTemplate(arch);\n self.baseData = null;\n self.func = null;\n\n self._generateBoilerplateFromManifestAndSource(\n manifest,\n self.template,\n options\n );\n};\n\n// The 'extraData' argument can be used to extend 'self.baseData'. Its\n// purpose is to allow you to specify data that you might not know at\n// the time that you construct the Boilerplate object. (e.g. it is used\n// by 'webapp' to specify data that is only known at request-time).\nBoilerplate.prototype.toHTML = function (extraData) {\n var self = this;\n\n if (! self.baseData || ! self.func)\n throw new Error('Boilerplate did not instantiate correctly.');\n\n return \"\\n\" +\n Blaze.toHTML(Blaze.With(_.extend(self.baseData, extraData),\n self.func));\n};\n\n// XXX Exported to allow client-side only changes to rebuild the boilerplate\n// without requiring a full server restart.\n// Produces an HTML string with given manifest and boilerplateSource.\n// Optionally takes urlMapper in case urls from manifest need to be prefixed\n// or rewritten.\n// Optionally takes pathMapper for resolving relative file system paths.\n// Optionally allows to override fields of the data context.\nBoilerplate.prototype._generateBoilerplateFromManifestAndSource =\n function (manifest, boilerplateSource, options) {\n var self = this;\n // map to the identity by default\n var urlMapper = options.urlMapper || _.identity;\n var pathMapper = options.pathMapper || _.identity;\n\n var boilerplateBaseData = {\n css: [],\n js: [],\n head: '',\n body: '',\n meteorManifest: JSON.stringify(manifest)\n };\n\n // allow the caller to extend the default base data\n _.extend(boilerplateBaseData, options.baseDataExtension);\n\n _.each(manifest, function (item) {\n var urlPath = urlMapper(item.url);\n var itemObj = { url: urlPath };\n\n if (options.inline) {\n itemObj.scriptContent = readUtf8FileSync(\n pathMapper(item.path));\n itemObj.inline = true;\n }\n\n if (item.type === 'css' && item.where === 'client') {\n boilerplateBaseData.css.push(itemObj);\n }\n if (item.type === 'js' && item.where === 'client') {\n boilerplateBaseData.js.push(itemObj);\n }\n if (item.type === 'head') {\n boilerplateBaseData.head =\n readUtf8FileSync(pathMapper(item.path));\n }\n if (item.type === 'body') {\n boilerplateBaseData.body =\n readUtf8FileSync(pathMapper(item.path));\n }\n });\n var boilerplateRenderCode = SpacebarsCompiler.compile(\n boilerplateSource, { isBody: true });\n\n // Note that we are actually depending on eval's local environment capture\n // so that UI and HTML are visible to the eval'd code.\n // XXX the template we are evaluating relies on the fact that UI is globally\n // available.\n global.UI = UI;\n self.func = eval(boilerplateRenderCode);\n self.baseData = boilerplateBaseData;\n};\n\nvar _getTemplate = _.memoize(function (arch) {\n var filename = 'boilerplate_' + arch + '.html';\n return Assets.getText(filename);\n});\n"]} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/callback-hook.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["callback-hook/hook.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,mE;AACA,mC;AACA,+D;AACA,E;AACA,+D;AACA,E;AACA,qE;AACA,0D;AACA,sE;AACA,kD;AACA,E;AACA,qE;AACA,8D;AACA,2B;AACA,E;AACA,gE;AACA,yC;AACA,E;AACA,oE;AACA,+C;AACA,E;AACA,oE;AACA,mE;AACA,+D;AACA,sE;AACA,kE;AACA,wB;AACA,E;AACA,oE;AACA,qE;AACA,wD;AACA,wD;AACA,E;AACA,oE;AACA,gE;AACA,2D;;AAEA,2B;AACA,kB;AACA,0B;AACA,0B;AACA,sB;;AAEA,+B;AACA,qD;AACA,0C;AACA,mD;AACA,6E;AACA,yD;AACA,G;AACA,E;;AAEA,0B;AACA,iC;AACA,oB;;AAEA,sC;AACA,e;AACA,qD;AACA,+E;AACA,8E;AACA,+E;AACA,wB;AACA,O;AACA,M;;AAEA,mC;AACA,kC;;AAEA,Y;AACA,yB;AACA,kC;AACA,O;AACA,M;AACA,I;;AAEA,oE;AACA,uB;AACA,I;AACA,gE;AACA,mE;AACA,oD;AACA,I;AACA,sE;AACA,kC;AACA,I;AACA,6B;AACA,oB;;AAEA,8E;AACA,6E;AACA,gD;AACA,oC;;AAEA,qC;AACA,4C;AACA,sB;AACA,kE;AACA,sC;AACA,0C;;AAEA,iC;AACA,gB;AACA,O;AACA,K;AACA,G;AACA,G","file":"/packages/callback-hook.js","sourcesContent":["// XXX This pattern is under development. Do not add more callsites\n// using this package for now. See:\n// https://meteor.hackpad.com/Design-proposal-Hooks-YxvgEW06q6f\n//\n// Encapsulates the pattern of registering callbacks on a hook.\n//\n// The `each` method of the hook calls its iterator function argument\n// with each registered callback. This allows the hook to\n// conditionally decide not to call the callback (if, for example, the\n// observed object has been closed or terminated).\n//\n// Callbacks are bound with `Meteor.bindEnvironment`, so they will be\n// called with the Meteor environment of the calling code that\n// registered the callback.\n//\n// Registering a callback returns an object with a single `stop`\n// method which unregisters the callback.\n//\n// The code is careful to allow a callback to be safely unregistered\n// while the callbacks are being iterated over.\n//\n// If the hook is configured with the `exceptionHandler` option, the\n// handler will be called if a called callback throws an exception.\n// By default (if the exception handler doesn't itself throw an\n// exception, or if the iterator function doesn't return a falsy value\n// to terminate the calling of callbacks), the remaining callbacks\n// will still be called.\n//\n// Alternatively, the `debugPrintExceptions` option can be specified\n// as string describing the callback. On an exception the string and\n// the exception will be printed to the console log with\n// `Meteor._debug`, and the exception otherwise ignored.\n//\n// If an exception handler isn't specified, exceptions thrown in the\n// callback will propagate up to the iterator function, and will\n// terminate calling the remaining callbacks if not caught.\n\nHook = function (options) {\n var self = this;\n options = options || {};\n self.nextCallbackId = 0;\n self.callbacks = {};\n\n if (options.exceptionHandler)\n self.exceptionHandler = options.exceptionHandler;\n else if (options.debugPrintExceptions) {\n if (! _.isString(options.debugPrintExceptions))\n throw new Error(\"Hook option debugPrintExceptions should be a string\");\n self.exceptionHandler = options.debugPrintExceptions;\n }\n};\n\n_.extend(Hook.prototype, {\n register: function (callback) {\n var self = this;\n\n callback = Meteor.bindEnvironment(\n callback,\n self.exceptionHandler || function (exception) {\n // Note: this relies on the undocumented fact that if bindEnvironment's\n // onException throws, and you are invoking the callback either in the\n // browser or from within a Fiber in Node, the exception is propagated.\n throw exception;\n }\n );\n\n var id = self.nextCallbackId++;\n self.callbacks[id] = callback;\n\n return {\n stop: function () {\n delete self.callbacks[id];\n }\n };\n },\n\n // For each registered callback, call the passed iterator function\n // with the callback.\n //\n // The iterator function can choose whether or not to call the\n // callback. (For example, it might not call the callback if the\n // observed object has been closed or terminated).\n //\n // The iteration is stopped if the iterator function returns a falsy\n // value or throws an exception.\n //\n each: function (iterator) {\n var self = this;\n\n // Invoking bindEnvironment'd callbacks outside of a Fiber in Node doesn't\n // run them to completion (and exceptions thrown from onException are not\n // propagated), so we need to be in a Fiber.\n Meteor._nodeCodeMustBeInFiber();\n\n var ids = _.keys(self.callbacks);\n for (var i = 0; i < ids.length; ++i) {\n var id = ids[i];\n // check to see if the callback was removed during iteration\n if (_.has(self.callbacks, id)) {\n var callback = self.callbacks[id];\n\n if (! iterator(callback))\n break;\n }\n }\n }\n});\n"]} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/d3js_d3.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 3 | /* Imports */ 4 | var Meteor = Package.meteor.Meteor; 5 | 6 | 7 | 8 | /* Exports */ 9 | if (typeof Package === 'undefined') Package = {}; 10 | Package['d3js:d3'] = {}; 11 | 12 | })(); 13 | 14 | //# sourceMappingURL=d3js_d3.js.map 15 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/d3js_d3.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":[],"names":[],"mappings":";;;;;","file":"/packages/d3js:d3.js"} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/deps.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 3 | /* Imports */ 4 | var Meteor = Package.meteor.Meteor; 5 | var Tracker = Package.tracker.Tracker; 6 | var Deps = Package.tracker.Deps; 7 | 8 | /* Package-scope variables */ 9 | var Tracker, Deps; 10 | 11 | 12 | 13 | /* Exports */ 14 | if (typeof Package === 'undefined') Package = {}; 15 | Package.deps = { 16 | Tracker: Tracker, 17 | Deps: Deps 18 | }; 19 | 20 | })(); 21 | 22 | //# sourceMappingURL=deps.js.map 23 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/deps.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":[],"names":[],"mappings":";;;;;;;;;;","file":"/packages/deps.js"} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/global-imports.js: -------------------------------------------------------------------------------- 1 | /* Imports for global scope */ 2 | 3 | moment = Package['momentjs:moment'].moment; 4 | lodash = Package['stevezhu:lodash'].lodash; 5 | _ = Package.underscore._; 6 | numeral = Package['numeral:numeral'].numeral; 7 | topojson = Package['mrt:topojson'].topojson; 8 | Meteor = Package.meteor.Meteor; 9 | WebApp = Package.webapp.WebApp; 10 | main = Package.webapp.main; 11 | WebAppInternals = Package.webapp.WebAppInternals; 12 | Log = Package.logging.Log; 13 | Tracker = Package.deps.Tracker; 14 | Deps = Package.deps.Deps; 15 | DDP = Package.livedata.DDP; 16 | DDPServer = Package.livedata.DDPServer; 17 | MongoInternals = Package.mongo.MongoInternals; 18 | Mongo = Package.mongo.Mongo; 19 | Blaze = Package.ui.Blaze; 20 | UI = Package.ui.UI; 21 | Handlebars = Package.ui.Handlebars; 22 | Spacebars = Package.spacebars.Spacebars; 23 | check = Package.check.check; 24 | Match = Package.check.Match; 25 | Random = Package.random.Random; 26 | EJSON = Package.ejson.EJSON; 27 | HTML = Package.htmljs.HTML; 28 | 29 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/id-map.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["id-map/id-map.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,yC;AACA,kB;AACA,iB;AACA,oD;AACA,wC;AACA,E;;AAEA,4E;AACA,6E;AACA,6E;AACA,gD;;AAEA,2B;AACA,sB;AACA,oB;AACA,oC;AACA,0B;AACA,I;AACA,6B;AACA,oB;AACA,oC;AACA,2B;AACA,I;AACA,yB;AACA,oB;AACA,oC;AACA,0B;AACA,I;AACA,sB;AACA,oB;AACA,oC;AACA,iC;AACA,I;AACA,sB;AACA,oB;AACA,gC;AACA,I;AACA,sB;AACA,oB;AACA,mB;AACA,I;AACA,0E;AACA,gC;AACA,oB;AACA,0D;AACA,iC;AACA,2C;AACA,gE;AACA,+D;AACA,iC;AACA,e;AACA,K;AACA,I;AACA,qB;AACA,oB;AACA,6B;AACA,I;AACA,kC;AACA,oB;AACA,oC;AACA,8B;AACA,4B;AACA,yB;AACA,e;AACA,I;AACA,6E;AACA,0D;AACA,sB;AACA,oB;AACA,4D;AACA,uC;AACA,wC;AACA,O;AACA,iB;AACA,G;AACA,G","file":"/packages/id-map.js","sourcesContent":["IdMap = function (idStringify, idParse) {\n var self = this;\n self._map = {};\n self._idStringify = idStringify || JSON.stringify;\n self._idParse = idParse || JSON.parse;\n};\n\n// Some of these methods are designed to match methods on OrderedDict, since\n// (eg) ObserveMultiplex and _CachingChangeObserver use them interchangeably.\n// (Conceivably, this should be replaced with \"UnorderedDict\" with a specific\n// set of methods that overlap between the two.)\n\n_.extend(IdMap.prototype, {\n get: function (id) {\n var self = this;\n var key = self._idStringify(id);\n return self._map[key];\n },\n set: function (id, value) {\n var self = this;\n var key = self._idStringify(id);\n self._map[key] = value;\n },\n remove: function (id) {\n var self = this;\n var key = self._idStringify(id);\n delete self._map[key];\n },\n has: function (id) {\n var self = this;\n var key = self._idStringify(id);\n return _.has(self._map, key);\n },\n empty: function () {\n var self = this;\n return _.isEmpty(self._map);\n },\n clear: function () {\n var self = this;\n self._map = {};\n },\n // Iterates over the items in the map. Return `false` to break the loop.\n forEach: function (iterator) {\n var self = this;\n // don't use _.each, because we can't break out of it.\n var keys = _.keys(self._map);\n for (var i = 0; i < keys.length; i++) {\n var breakIfFalse = iterator.call(null, self._map[keys[i]],\n self._idParse(keys[i]));\n if (breakIfFalse === false)\n return;\n }\n },\n size: function () {\n var self = this;\n return _.size(self._map);\n },\n setDefault: function (id, def) {\n var self = this;\n var key = self._idStringify(id);\n if (_.has(self._map, key))\n return self._map[key];\n self._map[key] = def;\n return def;\n },\n // Assumes that values are EJSON-cloneable, and that we don't need to clone\n // IDs (ie, that nobody is going to mutate an ObjectId).\n clone: function () {\n var self = this;\n var clone = new IdMap(self._idStringify, self._idParse);\n self.forEach(function (value, id) {\n clone.set(id, EJSON.clone(value));\n });\n return clone;\n }\n});\n\n"]} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/insecure.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 3 | /* Imports */ 4 | var Meteor = Package.meteor.Meteor; 5 | 6 | 7 | 8 | /* Exports */ 9 | if (typeof Package === 'undefined') Package = {}; 10 | Package.insecure = {}; 11 | 12 | })(); 13 | 14 | //# sourceMappingURL=insecure.js.map 15 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/insecure.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":[],"names":[],"mappings":";;;;;","file":"/packages/insecure.js"} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/jquery.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 3 | /* Imports */ 4 | var Meteor = Package.meteor.Meteor; 5 | 6 | 7 | 8 | /* Exports */ 9 | if (typeof Package === 'undefined') Package = {}; 10 | Package.jquery = {}; 11 | 12 | })(); 13 | 14 | //# sourceMappingURL=jquery.js.map 15 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/jquery.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":[],"names":[],"mappings":";;;;;","file":"/packages/jquery.js"} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/json.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 3 | /* Imports */ 4 | var Meteor = Package.meteor.Meteor; 5 | 6 | 7 | 8 | /* Exports */ 9 | if (typeof Package === 'undefined') Package = {}; 10 | Package.json = {}; 11 | 12 | })(); 13 | 14 | //# sourceMappingURL=json.js.map 15 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/json.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":[],"names":[],"mappings":";;;;;","file":"/packages/json.js"} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/livedata.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 3 | /* Imports */ 4 | var Meteor = Package.meteor.Meteor; 5 | var DDP = Package.ddp.DDP; 6 | var DDPServer = Package.ddp.DDPServer; 7 | 8 | /* Package-scope variables */ 9 | var DDP, DDPServer, LivedataTest; 10 | 11 | 12 | 13 | /* Exports */ 14 | if (typeof Package === 'undefined') Package = {}; 15 | Package.livedata = { 16 | DDP: DDP, 17 | DDPServer: DDPServer, 18 | LivedataTest: LivedataTest 19 | }; 20 | 21 | })(); 22 | 23 | //# sourceMappingURL=livedata.js.map 24 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/livedata.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":[],"names":[],"mappings":";;;;;;;;;;","file":"/packages/livedata.js"} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/meteor-platform.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 3 | /* Imports */ 4 | var Meteor = Package.meteor.Meteor; 5 | var Autoupdate = Package.autoupdate.Autoupdate; 6 | 7 | 8 | 9 | /* Exports */ 10 | if (typeof Package === 'undefined') Package = {}; 11 | Package['meteor-platform'] = {}; 12 | 13 | })(); 14 | 15 | //# sourceMappingURL=meteor-platform.js.map 16 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/meteor-platform.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":[],"names":[],"mappings":";;;;;;","file":"/packages/meteor-platform.js"} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/mquandalle_jade.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 3 | /* Imports */ 4 | var Meteor = Package.meteor.Meteor; 5 | 6 | 7 | 8 | /* Exports */ 9 | if (typeof Package === 'undefined') Package = {}; 10 | Package['mquandalle:jade'] = {}; 11 | 12 | })(); 13 | 14 | //# sourceMappingURL=mquandalle_jade.js.map 15 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/mquandalle_jade.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":[],"names":[],"mappings":";;;;;","file":"/packages/mquandalle_jade.js"} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/mrt_topojson.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 3 | /* Imports */ 4 | var Meteor = Package.meteor.Meteor; 5 | 6 | /* Package-scope variables */ 7 | var topojson; 8 | 9 | (function () { 10 | 11 | /////////////////////////////////////////////////////////////////////// 12 | // // 13 | // packages/mrt:topojson/meteor-topojson.js // 14 | // // 15 | /////////////////////////////////////////////////////////////////////// 16 | // 17 | topojson = Npm.require('topojson'); // 1 18 | // 2 19 | /////////////////////////////////////////////////////////////////////// 20 | 21 | }).call(this); 22 | 23 | 24 | /* Exports */ 25 | if (typeof Package === 'undefined') Package = {}; 26 | Package['mrt:topojson'] = { 27 | topojson: topojson 28 | }; 29 | 30 | })(); 31 | 32 | //# sourceMappingURL=mrt_topojson.js.map 33 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/mrt_topojson.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"/packages/mrt:topojson.js","sources":["mrt:topojson/meteor-topojson.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mC","sourcesContent":["topojson = Npm.require('topojson');\n"]} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/reactive-var.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["reactive-var/reactive-var.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,E;AACA,mD;AACA,E;AACA,8D;AACA,gE;AACA,6D;AACA,gB;AACA,E;AACA,uE;AACA,yE;AACA,sE;AACA,0E;AACA,E;AACA,uE;AACA,wE;AACA,8D;AACA,qE;AACA,kE;AACA,uE;AACA,uE;AACA,yE;AACA,qE;AACA,sC;AACA,E;AACA,qE;AACA,8D;AACA,G;;AAEA,G;AACA,U;AACA,4B;AACA,uF;AACA,gB;AACA,+G;AACA,yU;AACA,G;AACA,mD;AACA,sC;AACA,2B;AACA,qD;;AAEA,+B;AACA,+B;AACA,oC;AACA,E;;AAEA,sD;AACA,iC;AACA,0D;AACA,iD;AACA,c;AACA,iB;AACA,M;AACA,0E;AACA,qC;AACA,E;;AAEA,G;AACA,6F;AACA,gB;AACA,G;AACA,yC;AACA,qB;AACA,sB;;AAEA,uB;AACA,E;;AAEA,G;AACA,qJ;AACA,gB;AACA,wB;AACA,G;AACA,iD;AACA,+B;;AAEA,oE;AACA,iC;AACA,W;;AAEA,2B;AACA,qB;AACA,E;;AAEA,8C;AACA,2C;AACA,E;;AAEA,kD;AACA,wB;AACA,oD;AACA,gB;AACA,0C;AACA,Y;AACA,e;AACA,E","file":"/packages/reactive-var.js","sourcesContent":["/*\n * ## [new] ReactiveVar(initialValue, [equalsFunc])\n *\n * A ReactiveVar holds a single value that can be get and set,\n * such that calling `set` will invalidate any Computations that\n * called `get`, according to the usual contract for reactive\n * data sources.\n *\n * A ReactiveVar is much like a Session variable -- compare `foo.get()`\n * to `Session.get(\"foo\")` -- but it doesn't have a global name and isn't\n * automatically migrated across hot code pushes. Also, while Session\n * variables can only hold JSON or EJSON, ReactiveVars can hold any value.\n *\n * An important property of ReactiveVars, which is sometimes the reason\n * to use one, is that setting the value to the same value as before has\n * no effect, meaning ReactiveVars can be used to absorb extra\n * invalidations that wouldn't serve a purpose. However, by default,\n * ReactiveVars are extremely conservative about what changes they\n * absorb. Calling `set` with an object argument will *always* trigger\n * invalidations, because even if the new value is `===` the old value,\n * the object may have been mutated. You can change the default behavior\n * by passing a function of two arguments, `oldValue` and `newValue`,\n * to the constructor as `equalsFunc`.\n *\n * This class is extremely basic right now, but the idea is to evolve\n * it into the ReactiveVar of Geoff's Lickable Forms proposal.\n */\n\n/**\n * @class \n * @instanceName reactiveVar\n * @summary Constructor for a ReactiveVar, which represents a single reactive variable.\n * @locus Client\n * @param {Any} initialValue The initial value to set. `equalsFunc` is ignored when setting the initial value.\n * @param {Function} [equalsFunc] Optional. A function of two arguments, called on the old value and the new value whenever the ReactiveVar is set. If it returns true, no set is performed. If omitted, the default `equalsFunc` returns true if its arguments are `===` and are of type number, boolean, string, undefined, or null.\n */\nReactiveVar = function (initialValue, equalsFunc) {\n if (! (this instanceof ReactiveVar))\n // called without `new`\n return new ReactiveVar(initialValue, equalsFunc);\n\n this.curValue = initialValue;\n this.equalsFunc = equalsFunc;\n this.dep = new Tracker.Dependency;\n};\n\nReactiveVar._isEqual = function (oldValue, newValue) {\n var a = oldValue, b = newValue;\n // Two values are \"equal\" here if they are `===` and are\n // number, boolean, string, undefined, or null.\n if (a !== b)\n return false;\n else\n return ((!a) || (typeof a === 'number') || (typeof a === 'boolean') ||\n (typeof a === 'string'));\n};\n\n/**\n * @summary Returns the current value of the ReactiveVar, establishing a reactive dependency.\n * @locus Client\n */\nReactiveVar.prototype.get = function () {\n if (Tracker.active)\n this.dep.depend();\n\n return this.curValue;\n};\n\n/**\n * @summary Sets the current value of the ReactiveVar, invalidating the Computations that called `get` if `newValue` is different from the old value.\n * @locus Client\n * @param {Any} newValue\n */\nReactiveVar.prototype.set = function (newValue) {\n var oldValue = this.curValue;\n\n if ((this.equalsFunc || ReactiveVar._isEqual)(oldValue, newValue))\n // value is same as last time\n return;\n\n this.curValue = newValue;\n this.dep.changed();\n};\n\nReactiveVar.prototype.toString = function () {\n return 'ReactiveVar{' + this.get() + '}';\n};\n\nReactiveVar.prototype._numListeners = function() {\n // Tests want to know.\n // Accesses a private field of Tracker.Dependency.\n var count = 0;\n for (var id in this.dep._dependentsById)\n count++;\n return count;\n};\n"]} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/reload.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 3 | /* Imports */ 4 | var Meteor = Package.meteor.Meteor; 5 | 6 | 7 | 8 | /* Exports */ 9 | if (typeof Package === 'undefined') Package = {}; 10 | Package.reload = {}; 11 | 12 | })(); 13 | 14 | //# sourceMappingURL=reload.js.map 15 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/reload.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":[],"names":[],"mappings":";;;;;","file":"/packages/reload.js"} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/retry.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 3 | /* Imports */ 4 | var Meteor = Package.meteor.Meteor; 5 | var _ = Package.underscore._; 6 | var Random = Package.random.Random; 7 | 8 | /* Package-scope variables */ 9 | var Retry; 10 | 11 | (function () { 12 | 13 | ///////////////////////////////////////////////////////////////////////////// 14 | // // 15 | // packages/retry/retry.js // 16 | // // 17 | ///////////////////////////////////////////////////////////////////////////// 18 | // 19 | // Retry logic with an exponential backoff. // 1 20 | // // 2 21 | // options: // 3 22 | // baseTimeout: time for initial reconnect attempt (ms). // 4 23 | // exponent: exponential factor to increase timeout each attempt. // 5 24 | // maxTimeout: maximum time between retries (ms). // 6 25 | // minCount: how many times to reconnect "instantly". // 7 26 | // minTimeout: time to wait for the first `minCount` retries (ms). // 8 27 | // fuzz: factor to randomize retry times by (to avoid retry storms). // 9 28 | // 10 29 | Retry = function (options) { // 11 30 | var self = this; // 12 31 | _.extend(self, _.defaults(_.clone(options || {}), { // 13 32 | baseTimeout: 1000, // 1 second // 14 33 | exponent: 2.2, // 15 34 | // The default is high-ish to ensure a server can recover from a // 16 35 | // failure caused by load. // 17 36 | maxTimeout: 5 * 60000, // 5 minutes // 18 37 | minTimeout: 10, // 19 38 | minCount: 2, // 20 39 | fuzz: 0.5 // +- 25% // 21 40 | })); // 22 41 | self.retryTimer = null; // 23 42 | }; // 24 43 | // 25 44 | _.extend(Retry.prototype, { // 26 45 | // 27 46 | // Reset a pending retry, if any. // 28 47 | clear: function () { // 29 48 | var self = this; // 30 49 | if (self.retryTimer) // 31 50 | clearTimeout(self.retryTimer); // 32 51 | self.retryTimer = null; // 33 52 | }, // 34 53 | // 35 54 | // Calculate how long to wait in milliseconds to retry, based on the // 36 55 | // `count` of which retry this is. // 37 56 | _timeout: function (count) { // 38 57 | var self = this; // 39 58 | // 40 59 | if (count < self.minCount) // 41 60 | return self.minTimeout; // 42 61 | // 43 62 | var timeout = Math.min( // 44 63 | self.maxTimeout, // 45 64 | self.baseTimeout * Math.pow(self.exponent, count)); // 46 65 | // fuzz the timeout randomly, to avoid reconnect storms when a // 47 66 | // server goes down. // 48 67 | timeout = timeout * ((Random.fraction() * self.fuzz) + // 49 68 | (1 - self.fuzz/2)); // 50 69 | return timeout; // 51 70 | }, // 52 71 | // 53 72 | // Call `fn` after a delay, based on the `count` of which retry this is. // 54 73 | retryLater: function (count, fn) { // 55 74 | var self = this; // 56 75 | var timeout = self._timeout(count); // 57 76 | if (self.retryTimer) // 58 77 | clearTimeout(self.retryTimer); // 59 78 | self.retryTimer = Meteor.setTimeout(fn, timeout); // 60 79 | return timeout; // 61 80 | } // 62 81 | // 63 82 | }); // 64 83 | // 65 84 | ///////////////////////////////////////////////////////////////////////////// 85 | 86 | }).call(this); 87 | 88 | 89 | /* Exports */ 90 | if (typeof Package === 'undefined') Package = {}; 91 | Package.retry = { 92 | Retry: Retry 93 | }; 94 | 95 | })(); 96 | 97 | //# sourceMappingURL=retry.js.map 98 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/retry.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["retry/retry.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,2C;AACA,E;AACA,W;AACA,yD;AACA,kE;AACA,kD;AACA,sD;AACA,mE;AACA,qE;;AAEA,4B;AACA,kB;AACA,qD;AACA,kC;AACA,kB;AACA,oE;AACA,8B;AACA,uC;AACA,mB;AACA,gB;AACA,uB;AACA,M;AACA,yB;AACA,E;;AAEA,2B;;AAEA,mC;AACA,sB;AACA,oB;AACA,wB;AACA,oC;AACA,2B;AACA,I;;AAEA,sE;AACA,oC;AACA,8B;AACA,oB;;AAEA,8B;AACA,6B;;AAEA,2B;AACA,sB;AACA,yD;AACA,kE;AACA,wB;AACA,0D;AACA,4C;AACA,mB;AACA,I;;AAEA,0E;AACA,oC;AACA,oB;AACA,uC;AACA,wB;AACA,oC;AACA,qD;AACA,mB;AACA,G;;AAEA,G","file":"/packages/retry.js","sourcesContent":["// Retry logic with an exponential backoff.\n//\n// options:\n// baseTimeout: time for initial reconnect attempt (ms).\n// exponent: exponential factor to increase timeout each attempt.\n// maxTimeout: maximum time between retries (ms).\n// minCount: how many times to reconnect \"instantly\".\n// minTimeout: time to wait for the first `minCount` retries (ms).\n// fuzz: factor to randomize retry times by (to avoid retry storms).\n\nRetry = function (options) {\n var self = this;\n _.extend(self, _.defaults(_.clone(options || {}), {\n baseTimeout: 1000, // 1 second\n exponent: 2.2,\n // The default is high-ish to ensure a server can recover from a\n // failure caused by load.\n maxTimeout: 5 * 60000, // 5 minutes\n minTimeout: 10,\n minCount: 2,\n fuzz: 0.5 // +- 25%\n }));\n self.retryTimer = null;\n};\n\n_.extend(Retry.prototype, {\n\n // Reset a pending retry, if any.\n clear: function () {\n var self = this;\n if (self.retryTimer)\n clearTimeout(self.retryTimer);\n self.retryTimer = null;\n },\n\n // Calculate how long to wait in milliseconds to retry, based on the\n // `count` of which retry this is.\n _timeout: function (count) {\n var self = this;\n\n if (count < self.minCount)\n return self.minTimeout;\n\n var timeout = Math.min(\n self.maxTimeout,\n self.baseTimeout * Math.pow(self.exponent, count));\n // fuzz the timeout randomly, to avoid reconnect storms when a\n // server goes down.\n timeout = timeout * ((Random.fraction() * self.fuzz) +\n (1 - self.fuzz/2));\n return timeout;\n },\n\n // Call `fn` after a delay, based on the `count` of which retry this is.\n retryLater: function (count, fn) {\n var self = this;\n var timeout = self._timeout(count);\n if (self.retryTimer)\n clearTimeout(self.retryTimer);\n self.retryTimer = Meteor.setTimeout(fn, timeout);\n return timeout;\n }\n\n});\n"]} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/routepolicy.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["routepolicy/routepolicy.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,kE;AACA,qE;AACA,mE;AACA,qC;AACA,E;AACA,sE;AACA,mE;AACA,2C;AACA,E;AACA,+E;AACA,E;AACA,qE;AACA,iE;AACA,+D;AACA,E;AACA,sE;AACA,iE;AACA,mE;AACA,sE;AACA,+D;;AAEA,mE;AACA,mE;AACA,iE;AACA,2B;;AAEA,qB;;AAEA,wE;AACA,kB;AACA,2B;AACA,E;;AAEA,4C;;AAEA,+C;AACA,yD;AACA,I;;AAEA,8B;AACA,yD;AACA,mE;AACA,gB;AACA,I;;AAEA,8C;AACA,oB;;AAEA,oC;AACA,0D;;AAEA,0B;AACA,8C;;AAEA,sD;AACA,8C;AACA,8G;;AAEA,gB;AACA,I;;AAEA,yE;AACA,oB;AACA,iC;AACA,kB;AACA,iD;AACA,gD;AACA,+F;AACA,wD;AACA,6D;AACA,2D;AACA,4B;AACA,kB;AACA,K;AACA,mC;AACA,uF;AACA,yD;AACA,2C;AACA,4C;AACA,8D;AACA,O;AACA,iB;AACA,sE;AACA,4C;AACA,Q;AACA,kB;AACA,I;;AAEA,uC;AACA,oB;AACA,yC;AACA,yD;AACA,mE;AACA,gB;AACA,+B;AACA,0D;AACA,0C;AACA,I;;AAEA,8B;AACA,iC;AACA,I;;AAEA,4B;AACA,oB;AACA,8B;AACA,4D;AACA,yE;AACA,iD;AACA,O;AACA,e;AACA,yC;AACA,Q;AACA,kB;AACA,I;;AAEA,mC;AACA,oB;AACA,sB;AACA,2D;AACA,yB;AACA,+B;AACA,O;AACA,2B;AACA,G;AACA,G;;AAEA,2C","file":"/packages/routepolicy.js","sourcesContent":["// In addition to listing specific files to be cached, the browser\n// application cache manifest allows URLs to be designated as NETWORK\n// (always fetched from the Internet) and FALLBACK (which we use to\n// serve app HTML on arbitrary URLs).\n//\n// The limitation of the manifest file format is that the designations\n// are by prefix only: if \"/foo\" is declared NETWORK then \"/foobar\"\n// will also be treated as a network route.\n//\n// RoutePolicy is a low-level API for declaring the route type of URL prefixes:\n//\n// \"network\": for network routes that should not conflict with static\n// resources. (For example, if \"/sockjs/\" is a network route, we\n// shouldn't have \"/sockjs/red-sock.jpg\" as a static resource).\n//\n// \"static-online\": for static resources which should not be cached in\n// the app cache. This is implemented by also adding them to the\n// NETWORK section (as otherwise the browser would receive app HTML\n// for them because of the FALLBACK section), but static-online routes\n// don't need to be checked for conflict with static resources.\n\n// The route policy is a singleton in a running application, but we\n// can't unit test the real singleton because messing with the real\n// routes would break tinytest... so allow policy instances to be\n// constructed for testing.\n\nRoutePolicyTest = {};\n\nvar RoutePolicyConstructor = RoutePolicyTest.Constructor = function () {\n var self = this;\n self.urlPrefixTypes = {};\n};\n\n_.extend(RoutePolicyConstructor.prototype, {\n\n urlPrefixMatches: function (urlPrefix, url) {\n return url.substr(0, urlPrefix.length) === urlPrefix;\n },\n\n checkType: function (type) {\n if (! _.contains(['network', 'static-online'], type))\n return 'the route type must be \"network\" or \"static-online\"';\n return null;\n },\n\n checkUrlPrefix: function (urlPrefix, type) {\n var self = this;\n\n if (urlPrefix.charAt(0) !== '/')\n return 'a route URL prefix must begin with a slash';\n\n if (urlPrefix === '/')\n return 'a route URL prefix cannot be /';\n\n var existingType = self.urlPrefixTypes[urlPrefix];\n if (existingType && existingType !== type)\n return 'the route URL prefix ' + urlPrefix + ' has already been declared to be of type ' + existingType;\n\n return null;\n },\n\n checkForConflictWithStatic: function (urlPrefix, type, _testManifest) {\n var self = this;\n if (type === 'static-online')\n return null;\n if (!Package.webapp || !Package.webapp.WebApp\n || !Package.webapp.WebApp.clientPrograms\n || !Package.webapp.WebApp.clientPrograms[Package.webapp.WebApp.defaultArch].manifest) {\n // Hack: If we don't have a manifest, deal with it\n // gracefully. This lets us load livedata into a nodejs\n // environment that doesn't have a HTTP server (eg, a\n // command-line tool).\n return null;\n }\n var manifest = _testManifest ||\n Package.webapp.WebApp.clientPrograms[Package.webapp.WebApp.defaultArch].manifest;\n var conflict = _.find(manifest, function (resource) {\n return (resource.type === 'static' &&\n resource.where === 'client' &&\n self.urlPrefixMatches(urlPrefix, resource.url));\n });\n if (conflict)\n return ('static resource ' + conflict.url + ' conflicts with ' +\n type + ' route ' + urlPrefix);\n else\n return null;\n },\n\n declare: function (urlPrefix, type) {\n var self = this;\n var problem = self.checkType(type) ||\n self.checkUrlPrefix(urlPrefix, type) ||\n self.checkForConflictWithStatic(urlPrefix, type);\n if (problem)\n throw new Error(problem);\n // TODO overlapping prefixes, e.g. /foo/ and /foo/bar/\n self.urlPrefixTypes[urlPrefix] = type;\n },\n\n isValidUrl: function (url) {\n return url.charAt(0) === '/';\n },\n\n classify: function (url) {\n var self = this;\n if (url.charAt(0) !== '/')\n throw new Error('url must be a relative URL: ' + url);\n var prefix = _.find(_.keys(self.urlPrefixTypes), function (_prefix) {\n return self.urlPrefixMatches(_prefix, url);\n });\n if (prefix)\n return self.urlPrefixTypes[prefix];\n else\n return null;\n },\n\n urlPrefixesFor: function (type) {\n var self = this;\n var prefixes = [];\n _.each(self.urlPrefixTypes, function (_type, _prefix) {\n if (_type === type)\n prefixes.push(_prefix);\n });\n return prefixes.sort();\n }\n});\n\nRoutePolicy = new RoutePolicyConstructor();\n"]} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/session.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 3 | /* Imports */ 4 | var Meteor = Package.meteor.Meteor; 5 | 6 | 7 | 8 | /* Exports */ 9 | if (typeof Package === 'undefined') Package = {}; 10 | Package.session = {}; 11 | 12 | })(); 13 | 14 | //# sourceMappingURL=session.js.map 15 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/session.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":[],"names":[],"mappings":";;;;;","file":"/packages/session.js"} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/stevezhu_lodash.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 3 | /* Imports */ 4 | var Meteor = Package.meteor.Meteor; 5 | 6 | /* Package-scope variables */ 7 | var lodash, _; 8 | 9 | (function () { 10 | 11 | /////////////////////////////////////////////////////////////////////// 12 | // // 13 | // packages/stevezhu:lodash/server.js // 14 | // // 15 | /////////////////////////////////////////////////////////////////////// 16 | // 17 | _ = lodash = Npm.require('lodash'); // 1 18 | // 2 19 | /////////////////////////////////////////////////////////////////////// 20 | 21 | }).call(this); 22 | 23 | 24 | /* Exports */ 25 | if (typeof Package === 'undefined') Package = {}; 26 | Package['stevezhu:lodash'] = { 27 | lodash: lodash, 28 | _: _ 29 | }; 30 | 31 | })(); 32 | 33 | //# sourceMappingURL=stevezhu_lodash.js.map 34 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/stevezhu_lodash.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["stevezhu:lodash/server.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mC","file":"/packages/stevezhu_lodash.js","sourcesContent":["_ = lodash = Npm.require('lodash');\n"]} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/templating.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 3 | /* Imports */ 4 | var Meteor = Package.meteor.Meteor; 5 | var _ = Package.underscore._; 6 | var Blaze = Package.blaze.Blaze; 7 | var UI = Package.blaze.UI; 8 | var Handlebars = Package.blaze.Handlebars; 9 | var HTML = Package.htmljs.HTML; 10 | 11 | 12 | 13 | /* Exports */ 14 | if (typeof Package === 'undefined') Package = {}; 15 | Package.templating = {}; 16 | 17 | })(); 18 | 19 | //# sourceMappingURL=templating.js.map 20 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/templating.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":[],"names":[],"mappings":";;;;;;;;;;","file":"/packages/templating.js"} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/ui.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 3 | /* Imports */ 4 | var Meteor = Package.meteor.Meteor; 5 | var Blaze = Package.blaze.Blaze; 6 | var UI = Package.blaze.UI; 7 | var Handlebars = Package.blaze.Handlebars; 8 | var HTML = Package.htmljs.HTML; 9 | 10 | /* Package-scope variables */ 11 | var Blaze, UI, Handlebars; 12 | 13 | 14 | 15 | /* Exports */ 16 | if (typeof Package === 'undefined') Package = {}; 17 | Package.ui = { 18 | Blaze: Blaze, 19 | UI: UI, 20 | Handlebars: Handlebars 21 | }; 22 | 23 | })(); 24 | 25 | //# sourceMappingURL=ui.js.map 26 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/ui.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":[],"names":[],"mappings":";;;;;;;;;;;;","file":"/packages/ui.js"} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/webapp-hashing.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 3 | /* Imports */ 4 | var Meteor = Package.meteor.Meteor; 5 | var _ = Package.underscore._; 6 | 7 | /* Package-scope variables */ 8 | var WebAppHashing; 9 | 10 | (function () { 11 | 12 | ////////////////////////////////////////////////////////////////////////////// 13 | // // 14 | // packages/webapp-hashing/webapp-hashing.js // 15 | // // 16 | ////////////////////////////////////////////////////////////////////////////// 17 | // 18 | var crypto = Npm.require("crypto"); // 1 19 | // 2 20 | WebAppHashing = {}; // 3 21 | // 4 22 | // Calculate a hash of all the client resources downloaded by the // 5 23 | // browser, including the application HTML, runtime config, code, and // 6 24 | // static files. // 7 25 | // // 8 26 | // This hash *must* change if any resources seen by the browser // 9 27 | // change, and ideally *doesn't* change for any server-only changes // 10 28 | // (but the second is a performance enhancement, not a hard // 11 29 | // requirement). // 12 30 | // 13 31 | WebAppHashing.calculateClientHash = // 14 32 | function (manifest, includeFilter, runtimeConfigOverride) { // 15 33 | var hash = crypto.createHash('sha1'); // 16 34 | // 17 35 | // Omit the old hashed client values in the new hash. These may be // 18 36 | // modified in the new boilerplate. // 19 37 | var runtimeCfg = _.omit(__meteor_runtime_config__, // 20 38 | ['autoupdateVersion', 'autoupdateVersionRefreshable', // 21 39 | 'autoupdateVersionCordova']); // 22 40 | // 23 41 | if (runtimeConfigOverride) { // 24 42 | runtimeCfg = runtimeConfigOverride; // 25 43 | } // 26 44 | // 27 45 | hash.update(JSON.stringify(runtimeCfg, 'utf8')); // 28 46 | // 29 47 | _.each(manifest, function (resource) { // 30 48 | if ((! includeFilter || includeFilter(resource.type)) && // 31 49 | (resource.where === 'client' || resource.where === 'internal')) { // 32 50 | hash.update(resource.path); // 33 51 | hash.update(resource.hash); // 34 52 | } // 35 53 | }); // 36 54 | return hash.digest('hex'); // 37 55 | }; // 38 56 | // 39 57 | // 40 58 | ////////////////////////////////////////////////////////////////////////////// 59 | 60 | }).call(this); 61 | 62 | 63 | /* Exports */ 64 | if (typeof Package === 'undefined') Package = {}; 65 | Package['webapp-hashing'] = { 66 | WebAppHashing: WebAppHashing 67 | }; 68 | 69 | })(); 70 | 71 | //# sourceMappingURL=webapp-hashing.js.map 72 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/server/packages/webapp-hashing.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webapp-hashing/webapp-hashing.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,mC;;AAEA,mB;;AAEA,iE;AACA,qE;AACA,gB;AACA,E;AACA,+D;AACA,mE;AACA,2D;AACA,gB;;AAEA,mC;AACA,6D;AACA,uC;;AAEA,oE;AACA,qC;AACA,oD;AACA,yD;AACA,kC;;AAEA,8B;AACA,uC;AACA,G;;AAEA,kD;;AAEA,wC;AACA,8D;AACA,2E;AACA,iC;AACA,iC;AACA,K;AACA,K;AACA,4B;AACA,E","file":"/packages/webapp-hashing.js","sourcesContent":["var crypto = Npm.require(\"crypto\");\n\nWebAppHashing = {};\n\n// Calculate a hash of all the client resources downloaded by the\n// browser, including the application HTML, runtime config, code, and\n// static files.\n//\n// This hash *must* change if any resources seen by the browser\n// change, and ideally *doesn't* change for any server-only changes\n// (but the second is a performance enhancement, not a hard\n// requirement).\n\nWebAppHashing.calculateClientHash =\n function (manifest, includeFilter, runtimeConfigOverride) {\n var hash = crypto.createHash('sha1');\n\n // Omit the old hashed client values in the new hash. These may be\n // modified in the new boilerplate.\n var runtimeCfg = _.omit(__meteor_runtime_config__,\n ['autoupdateVersion', 'autoupdateVersionRefreshable',\n 'autoupdateVersionCordova']);\n\n if (runtimeConfigOverride) {\n runtimeCfg = runtimeConfigOverride;\n }\n\n hash.update(JSON.stringify(runtimeCfg, 'utf8'));\n\n _.each(manifest, function (resource) {\n if ((! includeFilter || includeFilter(resource.type)) &&\n (resource.where === 'client' || resource.where === 'internal')) {\n hash.update(resource.path);\n hash.update(resource.hash);\n }\n });\n return hash.digest('hex');\n};\n\n"]} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/app/client/js/app.js: -------------------------------------------------------------------------------- 1 | (function(){/* Services */ 2 | 3 | _ = lodash; 4 | 5 | socket = new Primus({url: 'wss://stats.ethdev.com'}); 6 | 7 | toastr = window.toastr; 8 | toastr.options = { 9 | "closeButton": false, 10 | "debug": false, 11 | "progressBar": false, 12 | "newestOnTop": true, 13 | "positionClass": "toast-top-right", 14 | "preventDuplicates": false, 15 | "onclick": null, 16 | "showDuration": "300", 17 | "hideDuration": "1000", 18 | "timeOut": "5000", 19 | "extendedTimeOut": "1000", 20 | "showEasing": "swing", 21 | "hideEasing": "linear", 22 | "showMethod": "fadeIn", 23 | "hideMethod": "fadeOut" 24 | }; 25 | 26 | })(); 27 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/app/client/js/helperFunctions.js: -------------------------------------------------------------------------------- 1 | (function(){mainClass = function(node, bestBlock) 2 | { 3 | 4 | if(!node) 5 | return; 6 | 7 | if( ! node.active) 8 | return 'text-gray'; 9 | 10 | if(node.peers === 0) 11 | return 'text-danger'; 12 | 13 | return peerClass(node.peers, node.active); 14 | } 15 | 16 | peerClass = function(peers, active) 17 | { 18 | if( ! active) 19 | return 'text-gray'; 20 | 21 | return (peers <= 1 ? 'text-danger' : (peers > 1 && peers < 4 ? 'text-warning' : 'text-success')); 22 | } 23 | 24 | })(); 25 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/app/client/js/lib/d3.tip.min.js: -------------------------------------------------------------------------------- 1 | (function(){d3.tip=function(){function t(t){v=d(t),w=v.createSVGPoint(),document.body.appendChild(x)}function e(){return"n"}function n(){return[0,0]}function r(){return" "}function o(){var t=y();return{top:t.n.y-x.offsetHeight,left:t.n.x-x.offsetWidth/2}}function l(){var t=y();return{top:t.s.y,left:t.s.x-x.offsetWidth/2}}function s(){var t=y();return{top:t.e.y-x.offsetHeight/2,left:t.e.x}}function f(){var t=y();return{top:t.w.y-x.offsetHeight/2,left:t.w.x-x.offsetWidth}}function i(){var t=y();return{top:t.nw.y-x.offsetHeight,left:t.nw.x-x.offsetWidth}}function u(){var t=y();return{top:t.ne.y-x.offsetHeight,left:t.ne.x}}function a(){var t=y();return{top:t.sw.y,left:t.sw.x-x.offsetWidth}}function c(){var t=y();return{top:t.se.y,left:t.e.x}}function p(){var t=d3.select(document.createElement("div"));return t.style({position:"absolute",opacity:0,pointerEvents:"none",boxSizing:"border-box"}),t.node()}function d(t){return t=t.node(),"svg"==t.tagName.toLowerCase()?t:t.ownerSVGElement}function y(){var t=T||d3.event.target,e={},n=t.getScreenCTM(),r=t.getBBox(),o=r.width,l=r.height,s=r.x,f=r.y,i=document.documentElement.scrollTop||document.body.scrollTop,u=document.documentElement.scrollLeft||document.body.scrollLeft;return w.x=s+u,w.y=f+i,e.nw=w.matrixTransform(n),w.x+=o,e.ne=w.matrixTransform(n),w.y+=l,e.se=w.matrixTransform(n),w.x-=o,e.sw=w.matrixTransform(n),w.y-=l/2,e.w=w.matrixTransform(n),w.x+=o,e.e=w.matrixTransform(n),w.x-=o/2,w.y-=l/2,e.n=w.matrixTransform(n),w.y+=l,e.s=w.matrixTransform(n),e}var m=e,g=n,h=r,x=p(),v=null,w=null,T=null;t.show=function(){var e=Array.prototype.slice.call(arguments);e[e.length-1]instanceof SVGElement&&(T=e.pop());var n,r=h.apply(this,e),o=g.apply(this,e),l=m.apply(this,e),s=d3.select(x),f=0;for(s.html(r).style({opacity:1,"pointer-events":"all"});f--;)s.classed(E[f],!1);return n=b.get(l).apply(this),s.classed(l,!0).style({top:n.top+o[0]+"px",left:n.left+o[1]+"px"}),t},t.hide=function(){return nodel=d3.select(x),nodel.style({opacity:0,"pointer-events":"none"}),t},t.attr=function(e){if(arguments.length<2&&"string"==typeof e)return d3.select(x).attr(e);var n=Array.prototype.slice.call(arguments);return d3.selection.prototype.attr.apply(d3.select(x),n),t},t.style=function(e){if(arguments.length<2&&"string"==typeof e)return d3.select(x).style(e);var n=Array.prototype.slice.call(arguments);return d3.selection.prototype.style.apply(d3.select(x),n),t},t.direction=function(e){return arguments.length?(m=null==e?e:d3.functor(e),t):m},t.offset=function(e){return arguments.length?(g=null==e?e:d3.functor(e),t):g},t.html=function(e){return arguments.length?(h=null==e?e:d3.functor(e),t):h};var b=d3.map({n:o,s:l,e:s,w:f,nw:i,ne:u,sw:a,se:c}),E=b.keys();return t}; 2 | 3 | })(); 4 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/app/client/js/lib/moment.en.min.js: -------------------------------------------------------------------------------- 1 | (function(){!function(e){"function"==typeof define&&define.amd?define(["moment"],e):"object"==typeof exports?module.exports=e(require("../moment")):e(("undefined"!=typeof global?global:this).moment)}(function(e){return e.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few sec",m:"1 min",mm:"%d min",h:"1 h",hh:"%d h",d:"a day",dd:"%d days",M:"a month",MM:"%d mon",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10,d=1===~~(e%100/10)?"th":1===a?"st":2===a?"nd":3===a?"rd":"th";return e+d},week:{dow:1,doy:4}})}); 2 | 3 | })(); 4 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/app/client/js/lib/toastr.min.js: -------------------------------------------------------------------------------- 1 | (function(){!function(e){e(["jquery"],function(e){return function(){function t(e,t,n){return f({type:O.error,iconClass:g().iconClasses.error,message:e,optionsOverride:n,title:t})}function n(t,n){return t||(t=g()),v=e("#"+t.containerId),v.length?v:(n&&(v=c(t)),v)}function i(e,t,n){return f({type:O.info,iconClass:g().iconClasses.info,message:e,optionsOverride:n,title:t})}function o(e){w=e}function s(e,t,n){return f({type:O.success,iconClass:g().iconClasses.success,message:e,optionsOverride:n,title:t})}function a(e,t,n){return f({type:O.warning,iconClass:g().iconClasses.warning,message:e,optionsOverride:n,title:t})}function r(e){var t=g();v||n(t),l(e,t)||u(t)}function d(t){var i=g();return v||n(i),t&&0===e(":focus",t).length?void h(t):void(v.children().length&&v.remove())}function u(t){for(var n=v.children(),i=n.length-1;i>=0;i--)l(e(n[i]),t)}function l(t,n){return t&&0===e(":focus",t).length?(t[n.hideMethod]({duration:n.hideDuration,easing:n.hideEasing,complete:function(){h(t)}}),!0):!1}function c(t){return v=e("
").attr("id",t.containerId).addClass(t.positionClass).attr("aria-live","polite").attr("role","alert"),v.appendTo(e(t.target)),v}function p(){return{tapToDismiss:!0,toastClass:"toast",containerId:"toast-container",debug:!1,showMethod:"fadeIn",showDuration:300,showEasing:"swing",onShown:void 0,hideMethod:"fadeOut",hideDuration:1e3,hideEasing:"swing",onHidden:void 0,extendedTimeOut:1e3,iconClasses:{error:"toast-error",info:"toast-info",success:"toast-success",warning:"toast-warning"},iconClass:"toast-info",positionClass:"toast-top-right",timeOut:5e3,titleClass:"toast-title",messageClass:"toast-message",target:"body",closeHtml:"",newestOnTop:!0,preventDuplicates:!1,progressBar:!1}}function m(e){w&&w(e)}function f(t){function i(t){return!e(":focus",l).length||t?(clearTimeout(O.intervalId),l[r.hideMethod]({duration:r.hideDuration,easing:r.hideEasing,complete:function(){h(l),r.onHidden&&"hidden"!==b.state&&r.onHidden(),b.state="hidden",b.endTime=new Date,m(b)}})):void 0}function o(){(r.timeOut>0||r.extendedTimeOut>0)&&(u=setTimeout(i,r.extendedTimeOut),O.maxHideTime=parseFloat(r.extendedTimeOut),O.hideEta=(new Date).getTime()+O.maxHideTime)}function s(){clearTimeout(u),O.hideEta=0,l.stop(!0,!0)[r.showMethod]({duration:r.showDuration,easing:r.showEasing})}function a(){var e=(O.hideEta-(new Date).getTime())/O.maxHideTime*100;f.width(e+"%")}var r=g(),d=t.iconClass||r.iconClass;if(r.preventDuplicates){if(t.message===C)return;C=t.message}"undefined"!=typeof t.optionsOverride&&(r=e.extend(r,t.optionsOverride),d=t.optionsOverride.iconClass||d),T++,v=n(r,!0);var u=null,l=e("
"),c=e("
"),p=e("
"),f=e("
"),w=e(r.closeHtml),O={intervalId:null,hideEta:null,maxHideTime:null},b={toastId:T,state:"visible",startTime:new Date,options:r,map:t};return t.iconClass&&l.addClass(r.toastClass).addClass(d),t.title&&(c.append(t.title).addClass(r.titleClass),l.append(c)),t.message&&(p.append(t.message).addClass(r.messageClass),l.append(p)),r.closeButton&&(w.addClass("toast-close-button").attr("role","button"),l.prepend(w)),r.progressBar&&(f.addClass("toast-progress"),l.prepend(f)),l.hide(),r.newestOnTop?v.prepend(l):v.append(l),l[r.showMethod]({duration:r.showDuration,easing:r.showEasing,complete:r.onShown}),r.timeOut>0&&(u=setTimeout(i,r.timeOut),O.maxHideTime=parseFloat(r.timeOut),O.hideEta=(new Date).getTime()+O.maxHideTime,r.progressBar&&(O.intervalId=setInterval(a,10))),l.hover(s,o),!r.onclick&&r.tapToDismiss&&l.click(i),r.closeButton&&w&&w.click(function(e){e.stopPropagation?e.stopPropagation():void 0!==e.cancelBubble&&e.cancelBubble!==!0&&(e.cancelBubble=!0),i(!0)}),r.onclick&&l.click(function(){r.onclick(),i()}),m(b),r.debug&&console&&console.log(b),l}function g(){return e.extend({},p(),b.options)}function h(e){v||(v=n()),e.is(":visible")||(e.remove(),e=null,0===v.children().length&&v.remove())}var v,w,C,T=0,O={error:"error",info:"info",success:"success",warning:"warning"},b={clear:r,remove:d,error:t,getContainer:n,info:i,options:{},subscribe:o,success:s,version:"2.1.0",warning:a};return b}()})}("function"==typeof define&&define.amd?define:function(e,t){"undefined"!=typeof module&&module.exports?module.exports=t(require("jquery")):window.toastr=t(window.jQuery)}); 2 | 3 | })(); 4 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/app/client/js/script.js: -------------------------------------------------------------------------------- 1 | (function(){(function() { 2 | $('body').on('mouseenter', '[data-toggle="tooltip"]', function( event ) { 3 | $(this).tooltip('show'); 4 | }).on('mouseleave', '[data-toggle="tooltip"]', function( event ) { 5 | $(this).tooltip('hide'); 6 | }); 7 | 8 | $.fn.sparkline.defaults.bar.height = 63; 9 | $.fn.sparkline.defaults.bar.barWidth = 6; 10 | $.fn.sparkline.defaults.bar.barSpacing = 1; 11 | $.fn.sparkline.defaults.bar.tooltipClassname = 'jqstooltip'; 12 | $.fn.sparkline.defaults.bar.tooltipOffsetX = 0; 13 | $.fn.sparkline.defaults.bar.tooltipFormat = $.spformat('
{{prefix}}{{value}} {{suffix}}
'); 14 | $.fn.sparkline.defaults.bar.colorMap = $.range_map({ 15 | '0:6': '#10a0de', 16 | '6:13': '#7bcc3a', 17 | '13:20': '#FFD162', 18 | '20:30': '#ff8a00', 19 | '30:': '#F74B4B' 20 | }); 21 | 22 | moment.relativeTimeThreshold('s', 60); 23 | moment.relativeTimeThreshold('m', 60); 24 | moment.relativeTimeThreshold('h', 24); 25 | moment.relativeTimeThreshold('d', 28); 26 | moment.relativeTimeThreshold('M', 12); 27 | 28 | })(); 29 | 30 | (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ 31 | (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), 32 | m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) 33 | })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); 34 | 35 | ga('create', 'UA-63657296-1', 'auto'); 36 | ga('send', 'pageview'); 37 | 38 | })(); 39 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/app/client/views/error.jade.js: -------------------------------------------------------------------------------- 1 | (function(){ 2 | Template.__checkName("error"); 3 | Template["error"] = new Template("Template.error", (function() { 4 | var view = this; 5 | return [ HTML.H1(Blaze.View("lookup:message", function() { 6 | return Spacebars.mustache(view.lookup("message")); 7 | })), HTML.H2(Blaze.View("lookup:error.status", function() { 8 | return Spacebars.mustache(Spacebars.dot(view.lookup("error"), "status")); 9 | })), HTML.PRE(Blaze.View("lookup:error.stack", function() { 10 | return Spacebars.mustache(Spacebars.dot(view.lookup("error"), "stack")); 11 | })) ]; 12 | })); 13 | 14 | })(); 15 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/app/client/views/template.layout.js: -------------------------------------------------------------------------------- 1 | (function(){ 2 | Template.body.addContent((function() { 3 | var view = this; 4 | return [ "\n ", Spacebars.include(view.lookupTemplate("indexMeteor")), "\n " ]; 5 | })); 6 | Meteor.startup(Template.body.renderToDocument); 7 | 8 | })(); 9 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/app/fonts/Simple-Line-Icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/web-app/.meteor/local/build/programs/web.browser/app/fonts/Simple-Line-Icons.ttf -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/app/fonts/minimal-icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/web-app/.meteor/local/build/programs/web.browser/app/fonts/minimal-icons.eot -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/app/fonts/minimal-icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/web-app/.meteor/local/build/programs/web.browser/app/fonts/minimal-icons.ttf -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/app/fonts/minimal-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/web-app/.meteor/local/build/programs/web.browser/app/fonts/minimal-icons.woff -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/app/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/web-app/.meteor/local/build/programs/web.browser/app/images/favicon.ico -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/app/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/web-app/.meteor/local/build/programs/web.browser/app/images/favicon.png -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/app/images/screenshot-v0.0.1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/web-app/.meteor/local/build/programs/web.browser/app/images/screenshot-v0.0.1.jpg -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/app/images/screenshot-v0.0.2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/web-app/.meteor/local/build/programs/web.browser/app/images/screenshot-v0.0.2.jpg -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/app/images/screenshot-v0.0.5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/web-app/.meteor/local/build/programs/web.browser/app/images/screenshot-v0.0.5.jpg -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/app/images/screenshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/web-app/.meteor/local/build/programs/web.browser/app/images/screenshot.jpg -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/head.html: -------------------------------------------------------------------------------- 1 | 2 | Ethereum Network Status 3 | 4 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/packages/autopublish.js: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////// 2 | // // 3 | // This is a generated file. You can view the original // 4 | // source in your browser if your browser supports source maps. // 5 | // // 6 | // If you are using Chrome, open the Developer Tools and click the gear // 7 | // icon in its lower right corner. In the General Settings panel, turn // 8 | // on 'Enable source maps'. // 9 | // // 10 | // If you are using Firefox 23, go to `about:config` and set the // 11 | // `devtools.debugger.source-maps-enabled` preference to true. // 12 | // (The preference should be on by default in Firefox 24; versions // 13 | // older than 23 do not support source maps.) // 14 | // // 15 | ////////////////////////////////////////////////////////////////////////// 16 | 17 | 18 | (function () { 19 | 20 | /* Imports */ 21 | var Meteor = Package.meteor.Meteor; 22 | 23 | 24 | 25 | /* Exports */ 26 | if (typeof Package === 'undefined') Package = {}; 27 | Package.autopublish = {}; 28 | 29 | })(); 30 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/packages/autopublish.js.map: -------------------------------------------------------------------------------- 1 | )]}' 2 | {"version":3,"sources":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;","file":"/packages/autopublish.js"} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/packages/autoupdate.js.map: -------------------------------------------------------------------------------- 1 | )]}' 2 | {"version":3,"sources":["autoupdate/autoupdate_client.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kE;AACA,wD;AACA,E;AACA,sE;AACA,mE;AACA,uE;AACA,uD;AACA,E;AACA,+D;AACA,gE;AACA,2B;AACA,E;AACA,sE;AACA,qE;AACA,mC;AACA,E;AACA,kE;AACA,yE;AACA,c;AACA,E;AACA,oE;AACA,kE;AACA,sC;;AAEA,iE;AACA,W;AACA,iF;AACA,kC;AACA,sE;;AAEA,gD;AACA,0E;;AAEA,gB;;AAEA,6C;AACA,oC;AACA,8B;AACA,sD;AACA,oC;AACA,0C;AACA,+D;AACA,E;;AAEA,oC;;AAEA,uB;AACA,0E;AACA,yE;AACA,qC;AACA,I;AACA,uE;AACA,uE;AACA,mE;AACA,+D;AACA,gD;AACA,wC;AACA,G;AACA,iB;;AAEA,6C;AACA,wD;AACA,+B;AACA,8D;AACA,iB;AACA,8C;AACA,qE;AACA,qE;AACA,wE;AACA,mE;AACA,+D;AACA,wE;AACA,+B;AACA,wC;AACA,S;AACA,M;AACA,0B;AACA,2B;AACA,sD;AACA,0B;AACA,kD;AACA,6D;AACA,uD;AACA,2E;AACA,0F;AACA,iE;AACA,8B;AACA,2E;AACA,wD;AACA,oC;AACA,e;AACA,e;;AAEA,gE;AACA,qD;AACA,yC;AACA,+C;AACA,kC;AACA,gB;AACA,8C;AACA,yD;AACA,mC;AACA,sC;AACA,6C;AACA,mB;AACA,uB;AACA,e;AACA,c;;AAEA,qE;AACA,mD;AACA,wD;AACA,iB;AACA,e;;AAEA,2D;AACA,iF;;AAEA,sD;AACA,uD;AACA,iB;AACA,c;;AAEA,sC;AACA,6C;AACA,6D;AACA,0D;AACA,yD;AACA,gE;AACA,qF;AACA,8C;AACA,iB;AACA,oB;AACA,+B;AACA,a;;AAEA,W;AACA,gF;AACA,oC;AACA,4C;AACA,W;AACA,U;;AAEA,oD;AACA,yC;AACA,0C;AACA,W;AACA,O;AACA,K;AACA,K;AACA,E;AACA,gC","file":"/packages/autoupdate.js","sourcesContent":["// Subscribe to the `meteor_autoupdate_clientVersions` collection,\n// which contains the set of acceptable client versions.\n//\n// A \"hard code push\" occurs when the running client version is not in\n// the set of acceptable client versions (or the server updates the\n// collection, there is a published client version marked `current` and\n// the running client version is no longer in the set).\n//\n// When the `reload` package is loaded, a hard code push causes\n// the browser to reload, so that it will load the latest client\n// version from the server.\n//\n// A \"soft code push\" represents the situation when the running client\n// version is in the set of acceptable versions, but there is a newer\n// version available on the server.\n//\n// `Autoupdate.newClientAvailable` is a reactive data source which\n// becomes `true` if there is a new version of the client is available on\n// the server.\n//\n// This package doesn't implement a soft code reload process itself,\n// but `newClientAvailable` could be used for example to display a\n// \"click to reload\" link to the user.\n\n// The client version of the client code currently running in the\n// browser.\nvar autoupdateVersion = __meteor_runtime_config__.autoupdateVersion || \"unknown\";\nvar autoupdateVersionRefreshable =\n __meteor_runtime_config__.autoupdateVersionRefreshable || \"unknown\";\n\n// The collection of acceptable client versions.\nClientVersions = new Mongo.Collection(\"meteor_autoupdate_clientVersions\");\n\nAutoupdate = {};\n\nAutoupdate.newClientAvailable = function () {\n return !! ClientVersions.findOne({\n _id: \"version\",\n version: {$ne: autoupdateVersion} }) ||\n !! ClientVersions.findOne({\n _id: \"version-refreshable\",\n version: {$ne: autoupdateVersionRefreshable} });\n};\n\nvar knownToSupportCssOnLoad = false;\n\nvar retry = new Retry({\n // Unlike the stream reconnect use of Retry, which we want to be instant\n // in normal operation, this is a wacky failure. We don't want to retry\n // right away, we can start slowly.\n //\n // A better way than timeconstants here might be to use the knowledge\n // of when we reconnect to help trigger these retries. Typically, the\n // server fixing code will result in a restart and reconnect, but\n // potentially the subscription could have a transient error.\n minCount: 0, // don't do any immediate retries\n baseTimeout: 30*1000 // start with 30s\n});\nvar failures = 0;\n\nAutoupdate._retrySubscription = function () {\n Meteor.subscribe(\"meteor_autoupdate_clientVersions\", {\n onError: function (error) {\n Meteor._debug(\"autoupdate subscription failed:\", error);\n failures++;\n retry.retryLater(failures, function () {\n // Just retry making the subscription, don't reload the whole\n // page. While reloading would catch more cases (for example,\n // the server went back a version and is now doing old-style hot\n // code push), it would also be more prone to reload loops,\n // which look really bad to the user. Just retrying the\n // subscription over DDP means it is at least possible to fix by\n // updating the server.\n Autoupdate._retrySubscription();\n });\n },\n onReady: function () {\n if (Package.reload) {\n var checkNewVersionDocument = function (doc) {\n var self = this;\n if (doc._id === 'version-refreshable' &&\n doc.version !== autoupdateVersionRefreshable) {\n autoupdateVersionRefreshable = doc.version;\n // Switch out old css links for the new css links. Inspired by:\n // https://github.com/guard/guard-livereload/blob/master/js/livereload.js#L710\n var newCss = (doc.assets && doc.assets.allCss) || [];\n var oldLinks = [];\n _.each(document.getElementsByTagName('link'), function (link) {\n if (link.className === '__meteor-css__') {\n oldLinks.push(link);\n }\n });\n\n var waitUntilCssLoads = function (link, callback) {\n var executeCallback = _.once(callback);\n link.onload = function () {\n knownToSupportCssOnLoad = true;\n executeCallback();\n };\n if (! knownToSupportCssOnLoad) {\n var id = Meteor.setInterval(function () {\n if (link.sheet) {\n executeCallback();\n Meteor.clearInterval(id);\n }\n }, 50);\n }\n };\n\n var removeOldLinks = _.after(newCss.length, function () {\n _.each(oldLinks, function (oldLink) {\n oldLink.parentNode.removeChild(oldLink);\n });\n });\n\n var attachStylesheetLink = function (newLink) {\n document.getElementsByTagName(\"head\").item(0).appendChild(newLink);\n\n waitUntilCssLoads(newLink, function () {\n Meteor.setTimeout(removeOldLinks, 200);\n });\n };\n\n if (newCss.length !== 0) {\n _.each(newCss, function (css) {\n var newLink = document.createElement(\"link\");\n newLink.setAttribute(\"rel\", \"stylesheet\");\n newLink.setAttribute(\"type\", \"text/css\");\n newLink.setAttribute(\"class\", \"__meteor-css__\");\n newLink.setAttribute(\"href\", Meteor._relativeToSiteRootUrl(css.url));\n attachStylesheetLink(newLink);\n });\n } else {\n removeOldLinks();\n }\n\n }\n else if (doc._id === 'version' && doc.version !== autoupdateVersion) {\n handle && handle.stop();\n Package.reload.Reload._reload();\n }\n };\n\n var handle = ClientVersions.find().observe({\n added: checkNewVersionDocument,\n changed: checkNewVersionDocument\n });\n }\n }\n });\n};\nAutoupdate._retrySubscription();\n"]} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/packages/base64.js.map: -------------------------------------------------------------------------------- 1 | )]}' 2 | {"version":3,"sources":["base64/base64.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mB;;AAEA,uF;;AAEA,sB;;AAEA,gD;AACA,4C;AACA,E;;AAEA,Y;;AAEA,kC;;AAEA,kC;AACA,oB;AACA,yC;AACA,0C;AACA,iC;AACA,sB;AACA,wB;AACA,mE;AACA,O;AACA,oB;AACA,K;AACA,G;;AAEA,kB;AACA,e;AACA,e;AACA,e;AACA,e;AACA,0C;AACA,oB;AACA,W;AACA,iC;AACA,iC;AACA,Y;AACA,W;AACA,oC;AACA,gC;AACA,Y;AACA,W;AACA,qC;AACA,0B;AACA,8B;AACA,8B;AACA,8B;AACA,8B;AACA,e;AACA,e;AACA,e;AACA,e;AACA,Y;AACA,K;AACA,G;AACA,kB;AACA,4B;AACA,4B;AACA,kB;AACA,uB;AACA,Q;AACA,8B;AACA,kB;AACA,uB;AACA,G;AACA,yB;AACA,E;;AAEA,8B;AACA,mC;AACA,E;;AAEA,4B;AACA,mB;AACA,c;AACA,G;AACA,0B;AACA,E;;AAEA,oE;AACA,mE;AACA,sE;AACA,qE;AACA,O;AACA,mC;AACA,gF;AACA,iB;AACA,mC;AACA,kB;AACA,K;AACA,mC;AACA,e;AACA,G;AACA,8C;AACA,E;;AAEA,gC;AACA,yC;AACA,0C;AACA,U;AACA,0C;AACA,Y;AACA,G;AACA,kC;;AAEA,iB;AACA,iB;AACA,mB;;AAEA,Y;;AAEA,wC;AACA,0B;AACA,sB;AACA,oB;AACA,W;AACA,gB;AACA,iD;AACA,mB;AACA,Y;AACA,W;AACA,gB;AACA,iD;AACA,2B;AACA,qB;AACA,4B;AACA,Y;AACA,W;AACA,mB;AACA,6B;AACA,uB;AACA,gC;AACA,O;AACA,Y;AACA,W;AACA,mB;AACA,6B;AACA,O;AACA,Y;AACA,K;AACA,G;AACA,a;AACA,E","file":"/packages/base64.js","sourcesContent":["// Base 64 encoding\n\nvar BASE_64_CHARS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\nvar BASE_64_VALS = {};\n\nfor (var i = 0; i < BASE_64_CHARS.length; i++) {\n BASE_64_VALS[BASE_64_CHARS.charAt(i)] = i;\n};\n\nBase64 = {};\n\nBase64.encode = function (array) {\n\n if (typeof array === \"string\") {\n var str = array;\n array = Base64.newBinary(str.length);\n for (var i = 0; i < str.length; i++) {\n var ch = str.charCodeAt(i);\n if (ch > 0xFF) {\n throw new Error(\n \"Not ascii. Base64.encode can only take ascii strings.\");\n }\n array[i] = ch;\n }\n }\n\n var answer = [];\n var a = null;\n var b = null;\n var c = null;\n var d = null;\n for (var i = 0; i < array.length; i++) {\n switch (i % 3) {\n case 0:\n a = (array[i] >> 2) & 0x3F;\n b = (array[i] & 0x03) << 4;\n break;\n case 1:\n b = b | (array[i] >> 4) & 0xF;\n c = (array[i] & 0xF) << 2;\n break;\n case 2:\n c = c | (array[i] >> 6) & 0x03;\n d = array[i] & 0x3F;\n answer.push(getChar(a));\n answer.push(getChar(b));\n answer.push(getChar(c));\n answer.push(getChar(d));\n a = null;\n b = null;\n c = null;\n d = null;\n break;\n }\n }\n if (a != null) {\n answer.push(getChar(a));\n answer.push(getChar(b));\n if (c == null)\n answer.push('=');\n else\n answer.push(getChar(c));\n if (d == null)\n answer.push('=');\n }\n return answer.join(\"\");\n};\n\nvar getChar = function (val) {\n return BASE_64_CHARS.charAt(val);\n};\n\nvar getVal = function (ch) {\n if (ch === '=') {\n return -1;\n }\n return BASE_64_VALS[ch];\n};\n\n// XXX This is a weird place for this to live, but it's used both by\n// this package and 'ejson', and we can't put it in 'ejson' without\n// introducing a circular dependency. It should probably be in its own\n// package or as a helper in a package that both 'base64' and 'ejson'\n// use.\nBase64.newBinary = function (len) {\n if (typeof Uint8Array === 'undefined' || typeof ArrayBuffer === 'undefined') {\n var ret = [];\n for (var i = 0; i < len; i++) {\n ret.push(0);\n }\n ret.$Uint8ArrayPolyfill = true;\n return ret;\n }\n return new Uint8Array(new ArrayBuffer(len));\n};\n\nBase64.decode = function (str) {\n var len = Math.floor((str.length*3)/4);\n if (str.charAt(str.length - 1) == '=') {\n len--;\n if (str.charAt(str.length - 2) == '=')\n len--;\n }\n var arr = Base64.newBinary(len);\n\n var one = null;\n var two = null;\n var three = null;\n\n var j = 0;\n\n for (var i = 0; i < str.length; i++) {\n var c = str.charAt(i);\n var v = getVal(c);\n switch (i % 4) {\n case 0:\n if (v < 0)\n throw new Error('invalid base64 string');\n one = v << 2;\n break;\n case 1:\n if (v < 0)\n throw new Error('invalid base64 string');\n one = one | (v >> 4);\n arr[j++] = one;\n two = (v & 0x0F) << 4;\n break;\n case 2:\n if (v >= 0) {\n two = two | (v >> 2);\n arr[j++] = two;\n three = (v & 0x03) << 6;\n }\n break;\n case 3:\n if (v >= 0) {\n arr[j++] = three | v;\n }\n break;\n }\n }\n return arr;\n};\n"]} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/packages/deps.js: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////// 2 | // // 3 | // This is a generated file. You can view the original // 4 | // source in your browser if your browser supports source maps. // 5 | // // 6 | // If you are using Chrome, open the Developer Tools and click the gear // 7 | // icon in its lower right corner. In the General Settings panel, turn // 8 | // on 'Enable source maps'. // 9 | // // 10 | // If you are using Firefox 23, go to `about:config` and set the // 11 | // `devtools.debugger.source-maps-enabled` preference to true. // 12 | // (The preference should be on by default in Firefox 24; versions // 13 | // older than 23 do not support source maps.) // 14 | // // 15 | ////////////////////////////////////////////////////////////////////////// 16 | 17 | 18 | (function () { 19 | 20 | /* Imports */ 21 | var Meteor = Package.meteor.Meteor; 22 | var Tracker = Package.tracker.Tracker; 23 | var Deps = Package.tracker.Deps; 24 | 25 | /* Package-scope variables */ 26 | var Tracker, Deps; 27 | 28 | 29 | 30 | /* Exports */ 31 | if (typeof Package === 'undefined') Package = {}; 32 | Package.deps = { 33 | Tracker: Tracker, 34 | Deps: Deps 35 | }; 36 | 37 | })(); 38 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/packages/deps.js.map: -------------------------------------------------------------------------------- 1 | )]}' 2 | {"version":3,"sources":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;","file":"/packages/deps.js"} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/packages/global-imports.js: -------------------------------------------------------------------------------- 1 | /* Imports for global scope */ 2 | 3 | moment = Package['momentjs:moment'].moment; 4 | lodash = Package['stevezhu:lodash'].lodash; 5 | _ = Package.underscore._; 6 | numeral = Package['numeral:numeral'].numeral; 7 | topojson = Package['mrt:topojson'].topojson; 8 | Meteor = Package.meteor.Meteor; 9 | WebApp = Package.webapp.WebApp; 10 | Log = Package.logging.Log; 11 | Tracker = Package.deps.Tracker; 12 | Deps = Package.deps.Deps; 13 | Session = Package.session.Session; 14 | DDP = Package.livedata.DDP; 15 | Mongo = Package.mongo.Mongo; 16 | Blaze = Package.ui.Blaze; 17 | UI = Package.ui.UI; 18 | Handlebars = Package.ui.Handlebars; 19 | Spacebars = Package.spacebars.Spacebars; 20 | Template = Package.templating.Template; 21 | check = Package.check.check; 22 | Match = Package.check.Match; 23 | $ = Package.jquery.$; 24 | jQuery = Package.jquery.jQuery; 25 | Random = Package.random.Random; 26 | EJSON = Package.ejson.EJSON; 27 | LaunchScreen = Package['launch-screen'].LaunchScreen; 28 | HTML = Package.htmljs.HTML; 29 | 30 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/packages/id-map.js.map: -------------------------------------------------------------------------------- 1 | )]}' 2 | {"version":3,"sources":["id-map/id-map.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yC;AACA,kB;AACA,iB;AACA,oD;AACA,wC;AACA,E;;AAEA,4E;AACA,6E;AACA,6E;AACA,gD;;AAEA,2B;AACA,sB;AACA,oB;AACA,oC;AACA,0B;AACA,I;AACA,6B;AACA,oB;AACA,oC;AACA,2B;AACA,I;AACA,yB;AACA,oB;AACA,oC;AACA,0B;AACA,I;AACA,sB;AACA,oB;AACA,oC;AACA,iC;AACA,I;AACA,sB;AACA,oB;AACA,gC;AACA,I;AACA,sB;AACA,oB;AACA,mB;AACA,I;AACA,0E;AACA,gC;AACA,oB;AACA,0D;AACA,iC;AACA,2C;AACA,gE;AACA,+D;AACA,iC;AACA,e;AACA,K;AACA,I;AACA,qB;AACA,oB;AACA,6B;AACA,I;AACA,kC;AACA,oB;AACA,oC;AACA,8B;AACA,4B;AACA,yB;AACA,e;AACA,I;AACA,6E;AACA,0D;AACA,sB;AACA,oB;AACA,4D;AACA,uC;AACA,wC;AACA,O;AACA,iB;AACA,G;AACA,G","file":"/packages/id-map.js","sourcesContent":["IdMap = function (idStringify, idParse) {\n var self = this;\n self._map = {};\n self._idStringify = idStringify || JSON.stringify;\n self._idParse = idParse || JSON.parse;\n};\n\n// Some of these methods are designed to match methods on OrderedDict, since\n// (eg) ObserveMultiplex and _CachingChangeObserver use them interchangeably.\n// (Conceivably, this should be replaced with \"UnorderedDict\" with a specific\n// set of methods that overlap between the two.)\n\n_.extend(IdMap.prototype, {\n get: function (id) {\n var self = this;\n var key = self._idStringify(id);\n return self._map[key];\n },\n set: function (id, value) {\n var self = this;\n var key = self._idStringify(id);\n self._map[key] = value;\n },\n remove: function (id) {\n var self = this;\n var key = self._idStringify(id);\n delete self._map[key];\n },\n has: function (id) {\n var self = this;\n var key = self._idStringify(id);\n return _.has(self._map, key);\n },\n empty: function () {\n var self = this;\n return _.isEmpty(self._map);\n },\n clear: function () {\n var self = this;\n self._map = {};\n },\n // Iterates over the items in the map. Return `false` to break the loop.\n forEach: function (iterator) {\n var self = this;\n // don't use _.each, because we can't break out of it.\n var keys = _.keys(self._map);\n for (var i = 0; i < keys.length; i++) {\n var breakIfFalse = iterator.call(null, self._map[keys[i]],\n self._idParse(keys[i]));\n if (breakIfFalse === false)\n return;\n }\n },\n size: function () {\n var self = this;\n return _.size(self._map);\n },\n setDefault: function (id, def) {\n var self = this;\n var key = self._idStringify(id);\n if (_.has(self._map, key))\n return self._map[key];\n self._map[key] = def;\n return def;\n },\n // Assumes that values are EJSON-cloneable, and that we don't need to clone\n // IDs (ie, that nobody is going to mutate an ObjectId).\n clone: function () {\n var self = this;\n var clone = new IdMap(self._idStringify, self._idParse);\n self.forEach(function (value, id) {\n clone.set(id, EJSON.clone(value));\n });\n return clone;\n }\n});\n\n"]} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/packages/insecure.js: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////// 2 | // // 3 | // This is a generated file. You can view the original // 4 | // source in your browser if your browser supports source maps. // 5 | // // 6 | // If you are using Chrome, open the Developer Tools and click the gear // 7 | // icon in its lower right corner. In the General Settings panel, turn // 8 | // on 'Enable source maps'. // 9 | // // 10 | // If you are using Firefox 23, go to `about:config` and set the // 11 | // `devtools.debugger.source-maps-enabled` preference to true. // 12 | // (The preference should be on by default in Firefox 24; versions // 13 | // older than 23 do not support source maps.) // 14 | // // 15 | ////////////////////////////////////////////////////////////////////////// 16 | 17 | 18 | (function () { 19 | 20 | /* Imports */ 21 | var Meteor = Package.meteor.Meteor; 22 | 23 | 24 | 25 | /* Exports */ 26 | if (typeof Package === 'undefined') Package = {}; 27 | Package.insecure = {}; 28 | 29 | })(); 30 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/packages/insecure.js.map: -------------------------------------------------------------------------------- 1 | )]}' 2 | {"version":3,"sources":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;","file":"/packages/insecure.js"} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/packages/launch-screen.js.map: -------------------------------------------------------------------------------- 1 | )]}' 2 | {"version":3,"sources":["launch-screen/mobile-launch-screen.js","launch-screen/default-behavior.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sE;AACA,iD;;AAEA,kB;AACA,0B;;AAEA,gB;AACA,qB;AACA,6B;AACA,c;AACA,2C;AACA,Q;AACA,K;;AAEA,wB;AACA,mE;AACA,K;;AAEA,gB;;AAEA,yB;AACA,+B;AACA,6B;AACA,e;;AAEA,uB;AACA,oB;AACA,8B;AACA,yE;AACA,+B;AACA,wC;AACA,S;AACA,O;AACA,M;;AAEA,2D;AACA,Y;AACA,sB;AACA,M;AACA,G;AACA,E;;;;;;;;;;;;;;;;;;;ACxCA,qE;AACA,sE;AACA,8D;AACA,W;AACA,iC;;AAEA,iE;;AAEA,4B;AACA,mB;AACA,qB;AACA,sC;AACA,6D;AACA,uD;AACA,0D;AACA,oD;AACA,6D;AACA,uB;AACA,O;AACA,U;AACA,0C;AACA,uB;AACA,O;;AAEA,qE;AACA,+D;AACA,kE;AACA,+D;AACA,uC;AACA,4B;AACA,uB;AACA,a;AACA,G;AACA,G","file":"/packages/launch-screen.js","sourcesContent":["// XXX This currently implements loading screens for mobile apps only,\n// but in the future can be expanded to all apps.\n\nvar holdCount = 0;\nvar alreadyHidden = false;\n\nLaunchScreen = {\n hold: function () {\n if (! Meteor.isCordova) {\n return {\n release: function () { /* noop */ }\n };\n }\n\n if (alreadyHidden) {\n throw new Error(\"Can't show launch screen once it's hidden\");\n }\n\n holdCount++;\n\n var released = false;\n var release = function () {\n if (! Meteor.isCordova)\n return;\n\n if (! released) {\n holdCount--;\n if (holdCount === 0 &&\n typeof navigator !== 'undefined' && navigator.splashscreen) {\n alreadyHidden = true;\n navigator.splashscreen.hide();\n }\n }\n };\n\n // Returns a launch screen handle with a release method\n return {\n release: release\n };\n }\n};\n","// Hold launch screen on app load. This reflects the fact that Meteor\n// mobile apps that use this package always start with a launch screen\n// visible. (see XXX comment at the top of package.js for more\n// details)\nvar handle = LaunchScreen.hold();\n\nvar Template = Package.templating && Package.templating.Template;\n\nMeteor.startup(function () {\n if (! Template) {\n handle.release();\n } else if (Package['iron:router']) {\n // XXX Instead of doing this here, this code should be in\n // iron:router directly. Note that since we're in a\n // `Meteor.startup` block it's ok that we don't have a\n // weak dependency on iron:router in package.js.\n Package['iron:router'].Router.onAfterAction(function () {\n handle.release();\n });\n } else {\n Template.body.onRendered(function () {\n handle.release();\n });\n\n // In case `Template.body` never gets rendered (due to some bug),\n // hide the launch screen after 6 seconds. This matches the\n // observed timeout that Cordova apps on Android (but not iOS)\n // have on hiding the launch screen (even if you don't call\n // `navigator.splashscreen.hide()`)\n setTimeout(function () {\n handle.release();\n }, 6000);\n }\n});\n"]} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/packages/livedata.js: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////// 2 | // // 3 | // This is a generated file. You can view the original // 4 | // source in your browser if your browser supports source maps. // 5 | // // 6 | // If you are using Chrome, open the Developer Tools and click the gear // 7 | // icon in its lower right corner. In the General Settings panel, turn // 8 | // on 'Enable source maps'. // 9 | // // 10 | // If you are using Firefox 23, go to `about:config` and set the // 11 | // `devtools.debugger.source-maps-enabled` preference to true. // 12 | // (The preference should be on by default in Firefox 24; versions // 13 | // older than 23 do not support source maps.) // 14 | // // 15 | ////////////////////////////////////////////////////////////////////////// 16 | 17 | 18 | (function () { 19 | 20 | /* Imports */ 21 | var Meteor = Package.meteor.Meteor; 22 | var DDP = Package.ddp.DDP; 23 | 24 | /* Package-scope variables */ 25 | var DDP, LivedataTest; 26 | 27 | 28 | 29 | /* Exports */ 30 | if (typeof Package === 'undefined') Package = {}; 31 | Package.livedata = { 32 | DDP: DDP, 33 | LivedataTest: LivedataTest 34 | }; 35 | 36 | })(); 37 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/packages/livedata.js.map: -------------------------------------------------------------------------------- 1 | )]}' 2 | {"version":3,"sources":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;","file":"/packages/livedata.js"} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/packages/meteor-platform.js: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////// 2 | // // 3 | // This is a generated file. You can view the original // 4 | // source in your browser if your browser supports source maps. // 5 | // // 6 | // If you are using Chrome, open the Developer Tools and click the gear // 7 | // icon in its lower right corner. In the General Settings panel, turn // 8 | // on 'Enable source maps'. // 9 | // // 10 | // If you are using Firefox 23, go to `about:config` and set the // 11 | // `devtools.debugger.source-maps-enabled` preference to true. // 12 | // (The preference should be on by default in Firefox 24; versions // 13 | // older than 23 do not support source maps.) // 14 | // // 15 | ////////////////////////////////////////////////////////////////////////// 16 | 17 | 18 | (function () { 19 | 20 | /* Imports */ 21 | var Meteor = Package.meteor.Meteor; 22 | var Reload = Package.reload.Reload; 23 | var Autoupdate = Package.autoupdate.Autoupdate; 24 | 25 | 26 | 27 | /* Exports */ 28 | if (typeof Package === 'undefined') Package = {}; 29 | Package['meteor-platform'] = {}; 30 | 31 | })(); 32 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/packages/meteor-platform.js.map: -------------------------------------------------------------------------------- 1 | )]}' 2 | {"version":3,"sources":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;","file":"/packages/meteor-platform.js"} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/packages/mquandalle_jade.js: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////// 2 | // // 3 | // This is a generated file. You can view the original // 4 | // source in your browser if your browser supports source maps. // 5 | // // 6 | // If you are using Chrome, open the Developer Tools and click the gear // 7 | // icon in its lower right corner. In the General Settings panel, turn // 8 | // on 'Enable source maps'. // 9 | // // 10 | // If you are using Firefox 23, go to `about:config` and set the // 11 | // `devtools.debugger.source-maps-enabled` preference to true. // 12 | // (The preference should be on by default in Firefox 24; versions // 13 | // older than 23 do not support source maps.) // 14 | // // 15 | ////////////////////////////////////////////////////////////////////////// 16 | 17 | 18 | (function () { 19 | 20 | /* Imports */ 21 | var Meteor = Package.meteor.Meteor; 22 | 23 | 24 | 25 | /* Exports */ 26 | if (typeof Package === 'undefined') Package = {}; 27 | Package['mquandalle:jade'] = {}; 28 | 29 | })(); 30 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/packages/mquandalle_jade.js.map: -------------------------------------------------------------------------------- 1 | )]}' 2 | {"version":3,"sources":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;","file":"/packages/mquandalle_jade.js"} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/packages/reactive-var.js.map: -------------------------------------------------------------------------------- 1 | )]}' 2 | {"version":3,"sources":["reactive-var/reactive-var.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,E;AACA,mD;AACA,E;AACA,8D;AACA,gE;AACA,6D;AACA,gB;AACA,E;AACA,uE;AACA,yE;AACA,sE;AACA,0E;AACA,E;AACA,uE;AACA,wE;AACA,8D;AACA,qE;AACA,kE;AACA,uE;AACA,uE;AACA,yE;AACA,qE;AACA,sC;AACA,E;AACA,qE;AACA,8D;AACA,G;;AAEA,G;AACA,U;AACA,4B;AACA,uF;AACA,gB;AACA,+G;AACA,yU;AACA,G;AACA,mD;AACA,sC;AACA,2B;AACA,qD;;AAEA,+B;AACA,+B;AACA,oC;AACA,E;;AAEA,sD;AACA,iC;AACA,0D;AACA,iD;AACA,c;AACA,iB;AACA,M;AACA,0E;AACA,qC;AACA,E;;AAEA,G;AACA,6F;AACA,gB;AACA,G;AACA,yC;AACA,qB;AACA,sB;;AAEA,uB;AACA,E;;AAEA,G;AACA,qJ;AACA,gB;AACA,wB;AACA,G;AACA,iD;AACA,+B;;AAEA,oE;AACA,iC;AACA,W;;AAEA,2B;AACA,qB;AACA,E;;AAEA,8C;AACA,2C;AACA,E;;AAEA,kD;AACA,wB;AACA,oD;AACA,gB;AACA,0C;AACA,Y;AACA,e;AACA,E","file":"/packages/reactive-var.js","sourcesContent":["/*\n * ## [new] ReactiveVar(initialValue, [equalsFunc])\n *\n * A ReactiveVar holds a single value that can be get and set,\n * such that calling `set` will invalidate any Computations that\n * called `get`, according to the usual contract for reactive\n * data sources.\n *\n * A ReactiveVar is much like a Session variable -- compare `foo.get()`\n * to `Session.get(\"foo\")` -- but it doesn't have a global name and isn't\n * automatically migrated across hot code pushes. Also, while Session\n * variables can only hold JSON or EJSON, ReactiveVars can hold any value.\n *\n * An important property of ReactiveVars, which is sometimes the reason\n * to use one, is that setting the value to the same value as before has\n * no effect, meaning ReactiveVars can be used to absorb extra\n * invalidations that wouldn't serve a purpose. However, by default,\n * ReactiveVars are extremely conservative about what changes they\n * absorb. Calling `set` with an object argument will *always* trigger\n * invalidations, because even if the new value is `===` the old value,\n * the object may have been mutated. You can change the default behavior\n * by passing a function of two arguments, `oldValue` and `newValue`,\n * to the constructor as `equalsFunc`.\n *\n * This class is extremely basic right now, but the idea is to evolve\n * it into the ReactiveVar of Geoff's Lickable Forms proposal.\n */\n\n/**\n * @class \n * @instanceName reactiveVar\n * @summary Constructor for a ReactiveVar, which represents a single reactive variable.\n * @locus Client\n * @param {Any} initialValue The initial value to set. `equalsFunc` is ignored when setting the initial value.\n * @param {Function} [equalsFunc] Optional. A function of two arguments, called on the old value and the new value whenever the ReactiveVar is set. If it returns true, no set is performed. If omitted, the default `equalsFunc` returns true if its arguments are `===` and are of type number, boolean, string, undefined, or null.\n */\nReactiveVar = function (initialValue, equalsFunc) {\n if (! (this instanceof ReactiveVar))\n // called without `new`\n return new ReactiveVar(initialValue, equalsFunc);\n\n this.curValue = initialValue;\n this.equalsFunc = equalsFunc;\n this.dep = new Tracker.Dependency;\n};\n\nReactiveVar._isEqual = function (oldValue, newValue) {\n var a = oldValue, b = newValue;\n // Two values are \"equal\" here if they are `===` and are\n // number, boolean, string, undefined, or null.\n if (a !== b)\n return false;\n else\n return ((!a) || (typeof a === 'number') || (typeof a === 'boolean') ||\n (typeof a === 'string'));\n};\n\n/**\n * @summary Returns the current value of the ReactiveVar, establishing a reactive dependency.\n * @locus Client\n */\nReactiveVar.prototype.get = function () {\n if (Tracker.active)\n this.dep.depend();\n\n return this.curValue;\n};\n\n/**\n * @summary Sets the current value of the ReactiveVar, invalidating the Computations that called `get` if `newValue` is different from the old value.\n * @locus Client\n * @param {Any} newValue\n */\nReactiveVar.prototype.set = function (newValue) {\n var oldValue = this.curValue;\n\n if ((this.equalsFunc || ReactiveVar._isEqual)(oldValue, newValue))\n // value is same as last time\n return;\n\n this.curValue = newValue;\n this.dep.changed();\n};\n\nReactiveVar.prototype.toString = function () {\n return 'ReactiveVar{' + this.get() + '}';\n};\n\nReactiveVar.prototype._numListeners = function() {\n // Tests want to know.\n // Accesses a private field of Tracker.Dependency.\n var count = 0;\n for (var id in this.dep._dependentsById)\n count++;\n return count;\n};\n"]} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/packages/retry.js.map: -------------------------------------------------------------------------------- 1 | )]}' 2 | {"version":3,"sources":["retry/retry.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2C;AACA,E;AACA,W;AACA,yD;AACA,kE;AACA,kD;AACA,sD;AACA,mE;AACA,qE;;AAEA,4B;AACA,kB;AACA,qD;AACA,kC;AACA,kB;AACA,oE;AACA,8B;AACA,uC;AACA,mB;AACA,gB;AACA,uB;AACA,M;AACA,yB;AACA,E;;AAEA,2B;;AAEA,mC;AACA,sB;AACA,oB;AACA,wB;AACA,oC;AACA,2B;AACA,I;;AAEA,sE;AACA,oC;AACA,8B;AACA,oB;;AAEA,8B;AACA,6B;;AAEA,2B;AACA,sB;AACA,yD;AACA,kE;AACA,wB;AACA,0D;AACA,4C;AACA,mB;AACA,I;;AAEA,0E;AACA,oC;AACA,oB;AACA,uC;AACA,wB;AACA,oC;AACA,qD;AACA,mB;AACA,G;;AAEA,G","file":"/packages/retry.js","sourcesContent":["// Retry logic with an exponential backoff.\n//\n// options:\n// baseTimeout: time for initial reconnect attempt (ms).\n// exponent: exponential factor to increase timeout each attempt.\n// maxTimeout: maximum time between retries (ms).\n// minCount: how many times to reconnect \"instantly\".\n// minTimeout: time to wait for the first `minCount` retries (ms).\n// fuzz: factor to randomize retry times by (to avoid retry storms).\n\nRetry = function (options) {\n var self = this;\n _.extend(self, _.defaults(_.clone(options || {}), {\n baseTimeout: 1000, // 1 second\n exponent: 2.2,\n // The default is high-ish to ensure a server can recover from a\n // failure caused by load.\n maxTimeout: 5 * 60000, // 5 minutes\n minTimeout: 10,\n minCount: 2,\n fuzz: 0.5 // +- 25%\n }));\n self.retryTimer = null;\n};\n\n_.extend(Retry.prototype, {\n\n // Reset a pending retry, if any.\n clear: function () {\n var self = this;\n if (self.retryTimer)\n clearTimeout(self.retryTimer);\n self.retryTimer = null;\n },\n\n // Calculate how long to wait in milliseconds to retry, based on the\n // `count` of which retry this is.\n _timeout: function (count) {\n var self = this;\n\n if (count < self.minCount)\n return self.minTimeout;\n\n var timeout = Math.min(\n self.maxTimeout,\n self.baseTimeout * Math.pow(self.exponent, count));\n // fuzz the timeout randomly, to avoid reconnect storms when a\n // server goes down.\n timeout = timeout * ((Random.fraction() * self.fuzz) +\n (1 - self.fuzz/2));\n return timeout;\n },\n\n // Call `fn` after a delay, based on the `count` of which retry this is.\n retryLater: function (count, fn) {\n var self = this;\n var timeout = self._timeout(count);\n if (self.retryTimer)\n clearTimeout(self.retryTimer);\n self.retryTimer = Meteor.setTimeout(fn, timeout);\n return timeout;\n }\n\n});\n"]} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/packages/session.js: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////// 2 | // // 3 | // This is a generated file. You can view the original // 4 | // source in your browser if your browser supports source maps. // 5 | // // 6 | // If you are using Chrome, open the Developer Tools and click the gear // 7 | // icon in its lower right corner. In the General Settings panel, turn // 8 | // on 'Enable source maps'. // 9 | // // 10 | // If you are using Firefox 23, go to `about:config` and set the // 11 | // `devtools.debugger.source-maps-enabled` preference to true. // 12 | // (The preference should be on by default in Firefox 24; versions // 13 | // older than 23 do not support source maps.) // 14 | // // 15 | ////////////////////////////////////////////////////////////////////////// 16 | 17 | 18 | (function () { 19 | 20 | /* Imports */ 21 | var Meteor = Package.meteor.Meteor; 22 | var _ = Package.underscore._; 23 | var ReactiveDict = Package['reactive-dict'].ReactiveDict; 24 | var EJSON = Package.ejson.EJSON; 25 | 26 | /* Package-scope variables */ 27 | var Session; 28 | 29 | (function () { 30 | 31 | ///////////////////////////////////////////////////////////////////////////////// 32 | // // 33 | // packages/session/session.js // 34 | // // 35 | ///////////////////////////////////////////////////////////////////////////////// 36 | // 37 | Session = new ReactiveDict('session'); // 1 38 | // 2 39 | // Documentation here is really awkward because the methods are defined // 3 40 | // elsewhere // 4 41 | // 5 42 | /** // 6 43 | * @memberOf Session // 7 44 | * @method set // 8 45 | * @summary Set a variable in the session. Notify any listeners that the value // 9 46 | * has changed (eg: redraw templates, and rerun any // 10 47 | * [`Tracker.autorun`](#tracker_autorun) computations, that called // 11 48 | * [`Session.get`](#session_get) on this `key`.) // 12 49 | * @locus Client // 13 50 | * @param {String} key The key to set, eg, `selectedItem` // 14 51 | * @param {EJSONable | undefined} value The new value for `key` // 15 52 | */ // 16 53 | // 17 54 | /** // 18 55 | * @memberOf Session // 19 56 | * @method setDefault // 20 57 | * @summary Set a variable in the session if it hasn't been set before. // 21 58 | * Otherwise works exactly the same as [`Session.set`](#session_set). // 22 59 | * @locus Client // 23 60 | * @param {String} key The key to set, eg, `selectedItem` // 24 61 | * @param {EJSONable | undefined} value The new value for `key` // 25 62 | */ // 26 63 | // 27 64 | /** // 28 65 | * @memberOf Session // 29 66 | * @method get // 30 67 | * @summary Get the value of a session variable. If inside a [reactive // 31 68 | * computation](#reactivity), invalidate the computation the next time the // 32 69 | * value of the variable is changed by [`Session.set`](#session_set). This // 33 70 | * returns a clone of the session value, so if it's an object or an array, // 34 71 | * mutating the returned value has no effect on the value stored in the // 35 72 | * session. // 36 73 | * @locus Client // 37 74 | * @param {String} key The name of the session variable to return // 38 75 | */ // 39 76 | // 40 77 | /** // 41 78 | * @memberOf Session // 42 79 | * @method equals // 43 80 | * @summary Test if a session variable is equal to a value. If inside a // 44 81 | * [reactive computation](#reactivity), invalidate the computation the next // 45 82 | * time the variable changes to or from the value. // 46 83 | * @locus Client // 47 84 | * @param {String} key The name of the session variable to test // 48 85 | * @param {String | Number | Boolean | null | undefined} value The value to // 49 86 | * test against // 50 87 | */ // 51 88 | // 52 89 | ///////////////////////////////////////////////////////////////////////////////// 90 | 91 | }).call(this); 92 | 93 | 94 | /* Exports */ 95 | if (typeof Package === 'undefined') Package = {}; 96 | Package.session = { 97 | Session: Session 98 | }; 99 | 100 | })(); 101 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/packages/session.js.map: -------------------------------------------------------------------------------- 1 | )]}' 2 | {"version":3,"sources":["session/session.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sC;;AAEA,uE;AACA,Y;;AAEA,G;AACA,oB;AACA,c;AACA,8E;AACA,mD;AACA,kE;AACA,gD;AACA,gB;AACA,yD;AACA,+D;AACA,G;;AAEA,G;AACA,oB;AACA,qB;AACA,uE;AACA,qE;AACA,gB;AACA,yD;AACA,+D;AACA,G;;AAEA,G;AACA,oB;AACA,c;AACA,sE;AACA,0E;AACA,0E;AACA,0E;AACA,uE;AACA,W;AACA,gB;AACA,iE;AACA,G;;AAEA,G;AACA,oB;AACA,iB;AACA,uE;AACA,2E;AACA,kD;AACA,gB;AACA,+D;AACA,2E;AACA,e;AACA,G","file":"/packages/session.js","sourcesContent":["Session = new ReactiveDict('session');\n\n// Documentation here is really awkward because the methods are defined\n// elsewhere\n\n/**\n * @memberOf Session\n * @method set\n * @summary Set a variable in the session. Notify any listeners that the value\n * has changed (eg: redraw templates, and rerun any\n * [`Tracker.autorun`](#tracker_autorun) computations, that called\n * [`Session.get`](#session_get) on this `key`.)\n * @locus Client\n * @param {String} key The key to set, eg, `selectedItem`\n * @param {EJSONable | undefined} value The new value for `key`\n */\n\n/**\n * @memberOf Session\n * @method setDefault\n * @summary Set a variable in the session if it hasn't been set before.\n * Otherwise works exactly the same as [`Session.set`](#session_set).\n * @locus Client\n * @param {String} key The key to set, eg, `selectedItem`\n * @param {EJSONable | undefined} value The new value for `key`\n */\n\n/**\n * @memberOf Session\n * @method get\n * @summary Get the value of a session variable. If inside a [reactive\n * computation](#reactivity), invalidate the computation the next time the\n * value of the variable is changed by [`Session.set`](#session_set). This\n * returns a clone of the session value, so if it's an object or an array,\n * mutating the returned value has no effect on the value stored in the\n * session.\n * @locus Client\n * @param {String} key The name of the session variable to return\n */\n\n/**\n * @memberOf Session\n * @method equals\n * @summary Test if a session variable is equal to a value. If inside a\n * [reactive computation](#reactivity), invalidate the computation the next\n * time the variable changes to or from the value.\n * @locus Client\n * @param {String} key The name of the session variable to test\n * @param {String | Number | Boolean | null | undefined} value The value to\n * test against\n */\n"]} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/packages/templating.js.map: -------------------------------------------------------------------------------- 1 | )]}' 2 | {"version":3,"sources":["templating/templating.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,qD;;AAEA,G;AACA,4C;AACA,S;AACA,oC;AACA,G;AACA,0B;;AAEA,0D;;AAEA,wE;AACA,wC;AACA,2D;AACA,qD;AACA,gE;AACA,uD;AACA,sE;AACA,gE;AACA,+G;AACA,+D;AACA,G;AACA,E;;AAEA,wB;AACA,mD;AACA,6B;AACA,gE;AACA,kE;AACA,kE;AACA,sE;AACA,uE;AACA,8D;AACA,iD;AACA,E;;AAEA,qD;AACA,8D;AACA,kD;;AAEA,G;AACA,4E;AACA,O;AACA,gB;AACA,G;AACA,kD;AACA,kB;AACA,kE;AACA,4B;AACA,K;AACA,G;AACA,8D;AACA,0B;;AAEA,kD;AACA,oD;AACA,E;;AAEA,4D;AACA,yD;AACA,8C;AACA,qB;AACA,yB;AACA,W;;AAEA,wD;AACA,4B;AACA,E;;AAEA,wB;AACA,wB;;AAEA,wB;AACA,6C;AACA,kC;AACA,8D;AACA,iE","file":"/packages/templating.js","sourcesContent":["\n// Packages and apps add templates on to this object.\n\n/**\n * @summary The class for defining templates\n * @class\n * @instanceName Template.myTemplate\n */\nTemplate = Blaze.Template;\n\nvar RESERVED_TEMPLATE_NAMES = \"__proto__ name\".split(\" \");\n\n// Check for duplicate template names and illegal names that won't work.\nTemplate.__checkName = function (name) {\n // Some names can't be used for Templates. These include:\n // - Properties Blaze sets on the Template object.\n // - Properties that some browsers don't let the code to set.\n // These are specified in RESERVED_TEMPLATE_NAMES.\n if (name in Template || _.contains(RESERVED_TEMPLATE_NAMES, name)) {\n if ((Template[name] instanceof Template) && name !== \"body\")\n throw new Error(\"There are multiple templates named '\" + name + \"'. Each template needs a unique name.\");\n throw new Error(\"This template name is reserved: \" + name);\n }\n};\n\n// XXX COMPAT WITH 0.8.3\nTemplate.__define__ = function (name, renderFunc) {\n Template.__checkName(name);\n Template[name] = new Template(\"Template.\" + name, renderFunc);\n // Exempt packages built pre-0.9.0 from warnings about using old\n // helper syntax, because we can. It's not very useful to get a\n // warning about someone else's code (like a package on Atmosphere),\n // and this should at least put a bit of a dent in number of warnings\n // that come from packages that haven't been updated lately.\n Template[name]._NOWARN_OLDSTYLE_HELPERS = true;\n};\n\n// Define a template `Template.body` that renders its\n// `contentRenderFuncs`. `` tags (of which there may be\n// multiple) will have their contents added to it.\n\n/**\n * @summary The [template object](#templates_api) representing your ``\n * tag.\n * @locus Client\n */\nTemplate.body = new Template('body', function () {\n var view = this;\n return _.map(Template.body.contentRenderFuncs, function (func) {\n return func.apply(view);\n });\n});\nTemplate.body.contentRenderFuncs = []; // array of Blaze.Views\nTemplate.body.view = null;\n\nTemplate.body.addContent = function (renderFunc) {\n Template.body.contentRenderFuncs.push(renderFunc);\n};\n\n// This function does not use `this` and so it may be called\n// as `Meteor.startup(Template.body.renderIntoDocument)`.\nTemplate.body.renderToDocument = function () {\n // Only do it once.\n if (Template.body.view)\n return;\n\n var view = Blaze.render(Template.body, document.body);\n Template.body.view = view;\n};\n\n// XXX COMPAT WITH 0.9.0\nUI.body = Template.body;\n\n// XXX COMPAT WITH 0.9.0\n// ( tags in packages built with 0.9.0)\nTemplate.__body__ = Template.body;\nTemplate.__body__.__contentParts = Template.body.contentViews;\nTemplate.__body__.__instantiate = Template.body.renderToDocument;\n"]} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/packages/ui.js: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////// 2 | // // 3 | // This is a generated file. You can view the original // 4 | // source in your browser if your browser supports source maps. // 5 | // // 6 | // If you are using Chrome, open the Developer Tools and click the gear // 7 | // icon in its lower right corner. In the General Settings panel, turn // 8 | // on 'Enable source maps'. // 9 | // // 10 | // If you are using Firefox 23, go to `about:config` and set the // 11 | // `devtools.debugger.source-maps-enabled` preference to true. // 12 | // (The preference should be on by default in Firefox 24; versions // 13 | // older than 23 do not support source maps.) // 14 | // // 15 | ////////////////////////////////////////////////////////////////////////// 16 | 17 | 18 | (function () { 19 | 20 | /* Imports */ 21 | var Meteor = Package.meteor.Meteor; 22 | var Blaze = Package.blaze.Blaze; 23 | var UI = Package.blaze.UI; 24 | var Handlebars = Package.blaze.Handlebars; 25 | var HTML = Package.htmljs.HTML; 26 | 27 | /* Package-scope variables */ 28 | var Blaze, UI, Handlebars; 29 | 30 | 31 | 32 | /* Exports */ 33 | if (typeof Package === 'undefined') Package = {}; 34 | Package.ui = { 35 | Blaze: Blaze, 36 | UI: UI, 37 | Handlebars: Handlebars 38 | }; 39 | 40 | })(); 41 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/packages/ui.js.map: -------------------------------------------------------------------------------- 1 | )]}' 2 | {"version":3,"sources":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;","file":"/packages/ui.js"} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/packages/webapp.js: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////// 2 | // // 3 | // This is a generated file. You can view the original // 4 | // source in your browser if your browser supports source maps. // 5 | // // 6 | // If you are using Chrome, open the Developer Tools and click the gear // 7 | // icon in its lower right corner. In the General Settings panel, turn // 8 | // on 'Enable source maps'. // 9 | // // 10 | // If you are using Firefox 23, go to `about:config` and set the // 11 | // `devtools.debugger.source-maps-enabled` preference to true. // 12 | // (The preference should be on by default in Firefox 24; versions // 13 | // older than 23 do not support source maps.) // 14 | // // 15 | ////////////////////////////////////////////////////////////////////////// 16 | 17 | 18 | (function () { 19 | 20 | /* Imports */ 21 | var Meteor = Package.meteor.Meteor; 22 | var _ = Package.underscore._; 23 | 24 | /* Package-scope variables */ 25 | var WebApp; 26 | 27 | (function () { 28 | 29 | /////////////////////////////////////////////////////////////////////// 30 | // // 31 | // packages/webapp/webapp_client.js // 32 | // // 33 | /////////////////////////////////////////////////////////////////////// 34 | // 35 | WebApp = { // 1 36 | // 2 37 | _isCssLoaded: function () { // 3 38 | if (document.styleSheets.length === 0) // 4 39 | return true; // 5 40 | // 6 41 | return _.find(document.styleSheets, function (sheet) { // 7 42 | if (sheet.cssText && !sheet.cssRules) // IE8 // 8 43 | return !sheet.cssText.match(/meteor-css-not-found-error/); // 9 44 | return !_.find(sheet.cssRules, function (rule) { // 10 45 | return rule.selectorText === '.meteor-css-not-found-error'; // 11 46 | }); // 12 47 | }); // 13 48 | } // 14 49 | }; // 15 50 | // 16 51 | /////////////////////////////////////////////////////////////////////// 52 | 53 | }).call(this); 54 | 55 | 56 | /* Exports */ 57 | if (typeof Package === 'undefined') Package = {}; 58 | Package.webapp = { 59 | WebApp: WebApp 60 | }; 61 | 62 | })(); 63 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/programs/web.browser/packages/webapp.js.map: -------------------------------------------------------------------------------- 1 | )]}' 2 | {"version":3,"sources":["webapp/webapp_client.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,U;;AAEA,6B;AACA,0C;AACA,kB;;AAEA,0D;AACA,kD;AACA,kE;AACA,sD;AACA,mE;AACA,S;AACA,O;AACA,G;AACA,E","file":"/packages/webapp.js","sourcesContent":["WebApp = {\n\n _isCssLoaded: function () {\n if (document.styleSheets.length === 0)\n return true;\n\n return _.find(document.styleSheets, function (sheet) {\n if (sheet.cssText && !sheet.cssRules) // IE8\n return !sheet.cssText.match(/meteor-css-not-found-error/);\n return !_.find(sheet.cssRules, function (rule) {\n return rule.selectorText === '.meteor-css-not-found-error';\n });\n });\n }\n};\n"]} -------------------------------------------------------------------------------- /web-app/.meteor/local/build/server/.bundle_version.txt: -------------------------------------------------------------------------------- 1 | 0.4.18 2 | -------------------------------------------------------------------------------- /web-app/.meteor/local/build/star.json: -------------------------------------------------------------------------------- 1 | { 2 | "format": "site-archive-pre1", 3 | "builtBy": "Meteor METEOR@1.1.0.2", 4 | "programs": [ 5 | { 6 | "name": "web.browser", 7 | "arch": "web.browser", 8 | "path": "programs/web.browser/program.json", 9 | "nodePath": [] 10 | }, 11 | { 12 | "name": "server", 13 | "arch": "os.osx.x86_64", 14 | "path": "programs/server/boot.js", 15 | "nodePath": [] 16 | } 17 | ], 18 | "meteorRelease": "METEOR@1.1.0.2" 19 | } -------------------------------------------------------------------------------- /web-app/.meteor/local/db/METEOR-PORT: -------------------------------------------------------------------------------- 1 | 3001 -------------------------------------------------------------------------------- /web-app/.meteor/local/db/local.0: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/web-app/.meteor/local/db/local.0 -------------------------------------------------------------------------------- /web-app/.meteor/local/db/local.1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/web-app/.meteor/local/db/local.1 -------------------------------------------------------------------------------- /web-app/.meteor/local/db/local.ns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/web-app/.meteor/local/db/local.ns -------------------------------------------------------------------------------- /web-app/.meteor/local/db/mongod.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/eth-netstats/f556b55aa848e165a80175fb4af42290275048a1/web-app/.meteor/local/db/mongod.lock -------------------------------------------------------------------------------- /web-app/.meteor/local/shell/info.json: -------------------------------------------------------------------------------- 1 | {"status":"disabled","reason":"Shell server has shut down."} 2 | --------------------------------------------------------------------------------