diff --git a/client/source/scripts/actions/ClientActions.js b/client/source/scripts/actions/ClientActions.js
index bbee30c7..ae7eace6 100644
--- a/client/source/scripts/actions/ClientActions.js
+++ b/client/source/scripts/actions/ClientActions.js
@@ -4,7 +4,7 @@ import AppDispatcher from '../dispatcher/AppDispatcher';
import ActionTypes from '../constants/ActionTypes';
const ClientActions = {
- fetchTransferData: function() {
+ fetchTransferData: () => {
return axios.get('/client/stats')
.then((json = {}) => {
return json.data;
@@ -27,7 +27,7 @@ const ClientActions = {
});
},
- fetchTransferHistory: function(opts) {
+ fetchTransferHistory: (opts) => {
return axios.get('/client/history', {
params: opts
})
@@ -48,7 +48,7 @@ const ClientActions = {
})
},
- setThrottle: function(direction, throttle) {
+ setThrottle: (direction, throttle) => {
return axios.put('/client/settings/speed-limits', {
direction,
throttle
diff --git a/client/source/scripts/actions/TorrentActions.js b/client/source/scripts/actions/TorrentActions.js
index 974afca9..3d40439d 100644
--- a/client/source/scripts/actions/TorrentActions.js
+++ b/client/source/scripts/actions/TorrentActions.js
@@ -4,11 +4,11 @@ import AppDispatcher from '../dispatcher/AppDispatcher';
import ActionTypes from '../constants/ActionTypes';
const TorrentActions = {
- addTorrentsByUrls: function(urls, destination) {
+ addTorrentsByUrls: (urls, destination) => {
axios.post('/ui/torrent-location', {
destination
})
- .catch(function (error) {
+ .catch((error) => {
console.log(error);
});
return axios.post('/client/add', {
@@ -36,11 +36,11 @@ const TorrentActions = {
});
},
- addTorrentsByFiles: function(filesData, destination) {
+ addTorrentsByFiles: (filesData, destination) => {
axios.post('/ui/torrent-location', {
destination
})
- .catch(function (error) {
+ .catch((error) => {
console.log(error);
});
return axios.post('/client/add-files', filesData)
@@ -65,7 +65,7 @@ const TorrentActions = {
});
},
- deleteTorrents: function(hash) {
+ deleteTorrents: (hash) => {
return axios.post('/client/torrents/delete', {hash})
.then((json = {}) => {
return json.data;
@@ -84,7 +84,7 @@ const TorrentActions = {
});
},
- fetchLatestTorrentLocation: function () {
+ fetchLatestTorrentLocation: () => {
return axios.get('/ui/torrent-location')
.then((json = {}) => {
return json.data;
@@ -103,7 +103,7 @@ const TorrentActions = {
});
},
- fetchTorrents: function () {
+ fetchTorrents: () => {
return axios.get('/client/torrents')
.then((json = {}) => {
return json.data;
@@ -126,7 +126,7 @@ const TorrentActions = {
});
},
- fetchTorrentDetails: function(hash) {
+ fetchTorrentDetails: (hash) => {
return axios.post('/client/torrent-details', {
hash
})
@@ -152,7 +152,7 @@ const TorrentActions = {
});
},
- fetchTorrentStatusCount: function() {
+ fetchTorrentStatusCount: () => {
return axios.get('/client/torrents/status-count')
.then((json = {}) => {
return json.data;
@@ -171,7 +171,7 @@ const TorrentActions = {
});
},
- fetchTorrentTrackerCount: function() {
+ fetchTorrentTrackerCount: () => {
return axios.get('/client/torrents/tracker-count')
.then((json = {}) => {
return json.data;
@@ -190,7 +190,7 @@ const TorrentActions = {
});
},
- moveTorrents: function(hashes, options) {
+ moveTorrents: (hashes, options) => {
let {destination, filenames, sources, moveFiles} = options;
return axios.post('/client/torrents/move',
@@ -212,7 +212,7 @@ const TorrentActions = {
});
},
- pauseTorrents: function(hashes) {
+ pauseTorrents: (hashes) => {
return axios.post('/client/pause', {
hashes
})
@@ -237,7 +237,7 @@ const TorrentActions = {
});
},
- startTorrents: function(hashes) {
+ startTorrents: (hashes) => {
return axios.post('/client/start', {
hashes
})
@@ -262,7 +262,7 @@ const TorrentActions = {
});
},
- stopTorrents: function(hashes) {
+ stopTorrents: (hashes) => {
return axios.post('/client/stop', {
hashes
})
@@ -287,7 +287,7 @@ const TorrentActions = {
});
},
- setPriority: function(hash, priority) {
+ setPriority: (hash, priority) => {
return axios.patch(`/client/torrents/${hash}/priority`, {
hash,
priority
@@ -309,7 +309,7 @@ const TorrentActions = {
});
},
- setFilePriority: function(hash, fileIndices, priority) {
+ setFilePriority: (hash, fileIndices, priority) => {
return axios.patch(`/client/torrents/${hash}/file-priority`, {
hash,
fileIndices,
diff --git a/client/source/scripts/actions/UIActions.js b/client/source/scripts/actions/UIActions.js
index 706b51e1..2d8064bd 100644
--- a/client/source/scripts/actions/UIActions.js
+++ b/client/source/scripts/actions/UIActions.js
@@ -5,35 +5,35 @@ import ActionTypes from '../constants/ActionTypes';
import TorrentStore from '../stores/TorrentStore';
const UIActions = {
- displayContextMenu: function(data) {
+ displayContextMenu: (data) => {
AppDispatcher.dispatchUIAction({
type: ActionTypes.UI_DISPLAY_CONTEXT_MENU,
data
});
},
- displayModal: function(data) {
+ displayModal: (data) => {
AppDispatcher.dispatchUIAction({
type: ActionTypes.UI_DISPLAY_MODAL,
data
});
},
- dismissContextMenu: function() {
+ dismissContextMenu: () => {
AppDispatcher.dispatchUIAction({
type: ActionTypes.UI_DISPLAY_CONTEXT_MENU,
data: null
});
},
- dismissModal: function() {
+ dismissModal: () => {
AppDispatcher.dispatchUIAction({
type: ActionTypes.UI_DISPLAY_MODAL,
data: null
});
},
- fetchSortProps: function() {
+ fetchSortProps: () => {
return axios.get('/ui/sort-props')
.then((json = {}) => {
return json.data;
@@ -52,45 +52,45 @@ const UIActions = {
});
},
- handleDetailsClick: function(data) {
+ handleDetailsClick: (data) => {
AppDispatcher.dispatchUIAction({
type: ActionTypes.UI_CLICK_TORRENT_DETAILS,
data
});
},
- handleTorrentClick: function(data) {
+ handleTorrentClick: (data) => {
AppDispatcher.dispatchUIAction({
type: ActionTypes.UI_CLICK_TORRENT,
data
});
},
- setTorrentStatusFilter: function(data) {
+ setTorrentStatusFilter: (data) => {
AppDispatcher.dispatchUIAction({
type: ActionTypes.UI_SET_TORRENT_STATUS_FILTER,
data
});
},
- setTorrentTrackerFilter: function(data) {
+ setTorrentTrackerFilter: (data) => {
AppDispatcher.dispatchUIAction({
type: ActionTypes.UI_SET_TORRENT_TRACKER_FILTER,
data
});
},
- setTorrentsSearchFilter: function(data) {
+ setTorrentsSearchFilter: (data) => {
AppDispatcher.dispatchUIAction({
type: ActionTypes.UI_SET_TORRENT_SEARCH_FILTER,
data
});
},
- setTorrentsSort: function(data) {
+ setTorrentsSort: (data) => {
axios
.post('/ui/sort-props', data)
- .catch(function (error) {
+ .catch(() => {
console.log(error);
});
diff --git a/client/source/scripts/app.js b/client/source/scripts/app.js
index 8368b1ba..d52e4ec2 100644
--- a/client/source/scripts/app.js
+++ b/client/source/scripts/app.js
@@ -13,7 +13,7 @@ import UIActions from './actions/UIActions';
class FloodApp extends React.Component {
componentDidMount() {
TorrentActions.fetchLatestTorrentLocation();
- window.addEventListener('click', function () {
+ window.addEventListener('click', () => {
UIActions.dismissContextMenu();
});
}
diff --git a/client/source/scripts/components/forms/Dropdown.js b/client/source/scripts/components/forms/Dropdown.js
index e5f84788..9c45fa34 100644
--- a/client/source/scripts/components/forms/Dropdown.js
+++ b/client/source/scripts/components/forms/Dropdown.js
@@ -81,7 +81,7 @@ export default class Dropdown extends React.Component {
}
getDropdownMenu(items) {
- let dropdownLists = items.map(function(itemList, index) {
+ let dropdownLists = items.map((itemList, index) => {
return (
{this.getDropdownMenuItems(itemList)}
@@ -102,7 +102,7 @@ export default class Dropdown extends React.Component {
}
getDropdownMenuItems(listItems) {
- return listItems.map(function(property, index) {
+ return listItems.map((property, index) => {
let classes = classnames('dropdown__item menu__item', property.className, {
'is-selectable': property.selectable !== false,
'is-selected': property.selected
diff --git a/client/source/scripts/components/modals/AddTorrentsByFile.js b/client/source/scripts/components/modals/AddTorrentsByFile.js
index a42f87e2..1f5e51ab 100644
--- a/client/source/scripts/components/modals/AddTorrentsByFile.js
+++ b/client/source/scripts/components/modals/AddTorrentsByFile.js
@@ -136,7 +136,7 @@ export default class AddTorrents extends React.Component {
let fileData = new FormData();
- this.state.files.forEach(function (file) {
+ this.state.files.forEach((file) => {
fileData.append('torrents', file);
});
diff --git a/client/source/scripts/components/sidebar/StatusFilters.js b/client/source/scripts/components/sidebar/StatusFilters.js
index f6b4dae1..4633fca3 100644
--- a/client/source/scripts/components/sidebar/StatusFilters.js
+++ b/client/source/scripts/components/sidebar/StatusFilters.js
@@ -130,16 +130,16 @@ export default class StatusFilters extends React.Component {
let totalStatusCount = 0;
let torrents = TorrentStore.getAllTorrents();
- Object.keys(statusCount).forEach(function(key) {
+ Object.keys(statusCount).forEach((key) => {
statusCount[key] = 0;
});
- Object.keys(torrents).forEach(function(hash) {
+ Object.keys(torrents).forEach((hash) => {
let torrent = torrents[hash];
if (torrent.trackers.indexOf(trackerFilter) > -1) {
totalStatusCount++;
- torrent.status.forEach(function (status) {
+ torrent.status.forEach((status) => {
statusCount[propsMap.serverStatus[status]]++;
});
}
diff --git a/client/source/scripts/components/sidebar/TrackerFilters.js b/client/source/scripts/components/sidebar/TrackerFilters.js
index 3f58e4f1..ffc49c5a 100644
--- a/client/source/scripts/components/sidebar/TrackerFilters.js
+++ b/client/source/scripts/components/sidebar/TrackerFilters.js
@@ -95,16 +95,16 @@ export default class TrackerFilters extends React.Component {
let torrentCount = 0;
let torrents = TorrentStore.getAllTorrents();
- Object.keys(trackerCount).forEach(function(key) {
+ Object.keys(trackerCount).forEach((key) => {
trackerCount[key] = 0;
});
- Object.keys(torrents).forEach(function(hash) {
+ Object.keys(torrents).forEach((hash) => {
let torrent = torrents[hash];
if (torrent.status.indexOf(propsMap.clientStatus[statusFilter]) > -1) {
torrentCount++;
- torrent.trackers.forEach(function (tracker) {
+ torrent.trackers.forEach((tracker) => {
trackerCount[tracker]++;
});
}
diff --git a/client/source/scripts/components/torrent-details/TorrentPeers.js b/client/source/scripts/components/torrent-details/TorrentPeers.js
index a5601aaf..158d748b 100644
--- a/client/source/scripts/components/torrent-details/TorrentPeers.js
+++ b/client/source/scripts/components/torrent-details/TorrentPeers.js
@@ -11,7 +11,7 @@ export default class TorrentPeers extends React.Component {
let peers = this.props.peers;
if (peers) {
- let peerList = peers.map(function(peer, index) {
+ let peerList = peers.map((peer, index) => {
let downloadRate = format.data(peer.downloadRate, '/s');
let uploadRate = format.data(peer.uploadRate, '/s');
return (
diff --git a/client/source/scripts/components/ui/LineChart.js b/client/source/scripts/components/ui/LineChart.js
index f950b3e9..5419df07 100644
--- a/client/source/scripts/components/ui/LineChart.js
+++ b/client/source/scripts/components/ui/LineChart.js
@@ -18,10 +18,10 @@ export default class LineChart extends React.Component {
.linear()
.range([0, width])
.domain([
- d3.min(transferData, function(dataPoint, index) {
+ d3.min(transferData, (dataPoint, index) => {
return index;
}),
- d3.max(transferData, function(dataPoint, index) {
+ d3.max(transferData, (dataPoint, index) => {
return index;
})
]);
@@ -32,7 +32,7 @@ export default class LineChart extends React.Component {
.range([height - margin.top, margin.bottom])
.domain([
0,
- d3.max(transferData, function(dataPoint, index) {
+ d3.max(transferData, (dataPoint, index) => {
if (dataPoint >= transferLimit[index]) {
return dataPoint;
} else {
@@ -41,14 +41,14 @@ export default class LineChart extends React.Component {
})
]);
- let lineFunc = function (interpolation) {
+ let lineFunc = (interpolation) => {
return d3
.svg
.line()
- .x(function(dataPoint, index) {
+ .x((dataPoint, index) => {
return xRange(index);
})
- .y(function(dataPoint) {
+ .y((dataPoint) => {
return yRange(dataPoint);
})
.interpolate(interpolation);
@@ -57,11 +57,11 @@ export default class LineChart extends React.Component {
let areaFunc = d3
.svg
.area()
- .x(function(dataPoint, index) {
+ .x((dataPoint, index) => {
return xRange(index);
})
.y0(height)
- .y1(function(dataPoint) {
+ .y1((dataPoint) => {
return yRange(dataPoint);
})
.interpolate('basis');
diff --git a/client/source/scripts/util/filterTorrents.js b/client/source/scripts/util/filterTorrents.js
index 0e17e342..37cac934 100644
--- a/client/source/scripts/util/filterTorrents.js
+++ b/client/source/scripts/util/filterTorrents.js
@@ -7,13 +7,13 @@ export function filterTorrents(torrentList, opts) {
if (filter !== 'all') {
if (type === 'status') {
let statusFilter = statusMap[filter];
- return torrentList.filter(function(torrent) {
+ return torrentList.filter((torrent) => {
if (torrent.status.indexOf(statusFilter) > -1) {
return torrent;
}
});
} else if (type === 'tracker') {
- return torrentList.filter(function(torrent) {
+ return torrentList.filter((torrent) => {
if (torrent.trackers.indexOf(filter) > -1) {
return torrent;
}
diff --git a/client/source/scripts/util/formatData.js b/client/source/scripts/util/formatData.js
index 43e6a199..8f9564f5 100644
--- a/client/source/scripts/util/formatData.js
+++ b/client/source/scripts/util/formatData.js
@@ -1,7 +1,7 @@
import React from 'react';
const format = {
- eta: function(eta) {
+ eta: (eta) => {
if (eta === 'Infinity') {
return '∞';
} else if (eta.years > 0) {
@@ -68,7 +68,7 @@ const format = {
}
},
- data: function(bytes, extraUnits, precision = 2) {
+ data: (bytes, extraUnits, precision = 2) => {
let kilobyte = 1024,
megabyte = kilobyte * 1024,
gigabyte = megabyte * 1024,
@@ -106,7 +106,7 @@ const format = {
};
},
- ratio: function(ratio) {
+ ratio: (ratio) => {
ratio = ratio / 1000;
let precision = 1;
diff --git a/client/source/scripts/util/selectTorrents.js b/client/source/scripts/util/selectTorrents.js
index 8c1a7d58..b63253f9 100644
--- a/client/source/scripts/util/selectTorrents.js
+++ b/client/source/scripts/util/selectTorrents.js
@@ -8,7 +8,7 @@ export function selectTorrents(options) {
let lastHashIndex;
// get the index of the last selected torrent.
- options.torrentList.some(function(torrent, index) {
+ options.torrentList.some((torrent, index) => {
if (torrent.hash === lastHash) {
lastHashIndex = index;
return true;
@@ -16,7 +16,7 @@ export function selectTorrents(options) {
});
// get the index of the newly selected torrent.
- options.torrentList.some(function(torrent, index) {
+ options.torrentList.some((torrent, index) => {
if (torrent.hash === options.hash) {
currentHashIndex = index;
return true;
diff --git a/client/source/scripts/util/sortTorrents.js b/client/source/scripts/util/sortTorrents.js
index 9ebedc4e..fa9c563e 100644
--- a/client/source/scripts/util/sortTorrents.js
+++ b/client/source/scripts/util/sortTorrents.js
@@ -7,7 +7,7 @@ export function sortTorrents(torrentsHash, sortBy) {
let direction = sortBy.direction;
let property = sortBy.property;
- torrents.sort(function(a, b) {
+ torrents.sort((a, b) => {
let valA = a[property];
let valB = b[property];
diff --git a/client/source/scripts/util/torrentStatusClasses.js b/client/source/scripts/util/torrentStatusClasses.js
index 0bb0a5d6..264cc75f 100644
--- a/client/source/scripts/util/torrentStatusClasses.js
+++ b/client/source/scripts/util/torrentStatusClasses.js
@@ -5,7 +5,7 @@ import propsMap from '../../../../shared/constants/propsMap';
export function torrentStatusClasses(torrent, ...classes) {
let additionalClasses = [];
- classes.forEach(function (className) {
+ classes.forEach((className) => {
if (className) {
additionalClasses.push(className);
}
diff --git a/gulpfile.js b/gulpfile.js
index 4e2a33f1..64f6b856 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -2,7 +2,6 @@
var autoprefixer = require('gulp-autoprefixer');
var browserSync = require('browser-sync');
var cssnano = require('gulp-cssnano');
-var eslint = require('gulp-eslint');
var gulp = require('gulp');
var gulpif = require('gulp-if');
var gutil = require('gulp-util');
@@ -73,7 +72,7 @@ var webpackConfig = {
watch: webpackWatch
};
-gulp.task('browsersync', function () {
+gulp.task('browsersync', () => {
browserSync.init({
online: true,
open: false,
@@ -82,24 +81,15 @@ gulp.task('browsersync', function () {
});
});
-// Create a function so we can use it inside of webpack's watch function.
-function eslintFn () {
- return gulp.src([dirs.js + '/**/*.?(js|jsx)'])
- .pipe(eslint())
- .pipe(eslint.formatEach('stylish', process.stderr));
-};
-
-gulp.task('eslint', eslintFn);
-
-gulp.task('images', function () {
+gulp.task('images', () => {
return gulp.src(dirs.src + '/' + dirs.img + '/**/*.*')
.pipe(gulp.dest(dirs.dist + '/' + dirs.imgDist));
});
-gulp.task('sass', function () {
+gulp.task('sass', () => {
return gulp.src(dirs.src + '/' + dirs.styles + '/' + files.mainStyles + '.scss')
.pipe(gulpif(development, sourcemaps.init()))
- .pipe(sass().on('error', function(error) {
+ .pipe(sass().on('error', () => {
gutil.log(
gutil.colors.green('Sass Error!\n'),
'\n',
@@ -114,13 +104,13 @@ gulp.task('sass', function () {
.pipe(browserSync.stream({match: "**/*.css"}));
});
-gulp.task('minify-css', ['sass'], function () {
+gulp.task('minify-css', ['sass'], () => {
return gulp.src(dirs.dist + '/' + dirs.stylesDist + '/' + files.mainStylesDist + '.css')
.pipe(cssnano())
.pipe(gulp.dest(dirs.dist + '/' + dirs.stylesDist));
});
-gulp.task('minify-js', function () {
+gulp.task('minify-js', () => {
return gulp.src(dirs.dist + '/' + dirs.jsDist + '/' + files.mainJs + '.js')
.pipe(uglify({
mangle: true,
@@ -129,21 +119,21 @@ gulp.task('minify-js', function () {
.pipe(gulp.dest(dirs.dist + '/' + dirs.jsDist));
});
-gulp.task('reload', function () {
+gulp.task('reload', () => {
if (development) {
browserSync.reload();
}
});
-gulp.task('watch', function () {
+gulp.task('watch', () => {
gulp.watch(dirs.src + '/' + dirs.styles + '/**/*.scss', ['sass']);
gulp.watch(dirs.src + '/' + dirs.img + '/**/*', ['images']);
});
-gulp.task('webpack', function (callback) {
+gulp.task('webpack', (callback) => {
var isFirstRun = true;
- webpack(webpackConfig, function (err, stats) {
+ webpack(webpackConfig, (err, stats) => {
if (err) {
throw new gutil.PluginError('webpack', err);
}
@@ -157,12 +147,9 @@ gulp.task('webpack', function (callback) {
}));
if (isFirstRun) {
- // This runs on initial gulp webpack load.
isFirstRun = false;
callback();
} else {
- // This runs after webpack's internal watch rebuild.
- // eslintFn();
if (development) {
browserSync.reload();
}
diff --git a/package.json b/package.json
index 40ddc5aa..04a393d7 100644
--- a/package.json
+++ b/package.json
@@ -55,7 +55,6 @@
"gulp": "^3.9.0",
"gulp-autoprefixer": "^3.0.2",
"gulp-cssnano": "^2.1.1",
- "gulp-eslint": "^1.0.0",
"gulp-if": "^2.0.0",
"gulp-sass": "^2.0.4",
"gulp-sourcemaps": "^1.6.0",
diff --git a/server/app.js b/server/app.js
index a3c7490f..2f170f8a 100644
--- a/server/app.js
+++ b/server/app.js
@@ -23,11 +23,11 @@ app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'assets')));
-app.use(function(req, res, next) {
- req.socket.on("error", function(err) {
+app.use((req, res, next) => {
+ req.socket.on("error", (err) => {
console.log(err);
});
- res.socket.on("error", function(err) {
+ res.socket.on("error", (err) => {
console.log(err);
});
next();
@@ -38,7 +38,7 @@ app.use('/client', clientRoutes);
app.use('/ui', uiRoutes);
// catch 404 and forward to error handler
-app.use(function(req, res, next) {
+app.use((req, res, next) => {
var err = new Error('Not Found');
err.status = 404;
next(err);
@@ -49,7 +49,7 @@ app.use(function(req, res, next) {
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
- app.use(function(err, req, res, next) {
+ app.use((err, req, res, next) => {
res.status(err.status || 500);
res.render('error', {
message: err.message,
@@ -60,7 +60,7 @@ if (app.get('env') === 'development') {
// production error handler
// no stacktraces leaked to user
-app.use(function(err, req, res, next) {
+app.use((err, req, res, next) => {
res.status(err.status || 500);
res.render('error', {
message: err.message,
diff --git a/server/assets/app.js b/server/assets/app.js
index 7e9e5b31..4d9a886d 100644
--- a/server/assets/app.js
+++ b/server/assets/app.js
@@ -1292,7 +1292,7 @@
/* 208 */
/***/ function(module, exports, __webpack_require__) {
- eval("'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _axios = __webpack_require__(187);\n\nvar _axios2 = _interopRequireDefault(_axios);\n\nvar _dispatcherAppDispatcher = __webpack_require__(179);\n\nvar _dispatcherAppDispatcher2 = _interopRequireDefault(_dispatcherAppDispatcher);\n\nvar _constantsActionTypes = __webpack_require__(178);\n\nvar _constantsActionTypes2 = _interopRequireDefault(_constantsActionTypes);\n\nvar _storesTorrentStore = __webpack_require__(201);\n\nvar _storesTorrentStore2 = _interopRequireDefault(_storesTorrentStore);\n\nvar UIActions = {\n displayContextMenu: function displayContextMenu(data) {\n _dispatcherAppDispatcher2['default'].dispatchUIAction({\n type: _constantsActionTypes2['default'].UI_DISPLAY_CONTEXT_MENU,\n data: data\n });\n },\n\n displayModal: function displayModal(data) {\n _dispatcherAppDispatcher2['default'].dispatchUIAction({\n type: _constantsActionTypes2['default'].UI_DISPLAY_MODAL,\n data: data\n });\n },\n\n dismissContextMenu: function dismissContextMenu() {\n _dispatcherAppDispatcher2['default'].dispatchUIAction({\n type: _constantsActionTypes2['default'].UI_DISPLAY_CONTEXT_MENU,\n data: null\n });\n },\n\n dismissModal: function dismissModal() {\n _dispatcherAppDispatcher2['default'].dispatchUIAction({\n type: _constantsActionTypes2['default'].UI_DISPLAY_MODAL,\n data: null\n });\n },\n\n fetchSortProps: function fetchSortProps() {\n return _axios2['default'].get('/ui/sort-props').then(function () {\n var json = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n return json.data;\n }).then(function (data) {\n _dispatcherAppDispatcher2['default'].dispatchServerAction({\n type: _constantsActionTypes2['default'].UI_SORT_PROPS_REQUEST_SUCCESS,\n data: data\n });\n })['catch'](function (error) {\n _dispatcherAppDispatcher2['default'].dispatchServerAction({\n type: _constantsActionTypes2['default'].UI_SORT_PROPS_REQUEST_ERROR,\n error: error\n });\n });\n },\n\n handleDetailsClick: function handleDetailsClick(data) {\n _dispatcherAppDispatcher2['default'].dispatchUIAction({\n type: _constantsActionTypes2['default'].UI_CLICK_TORRENT_DETAILS,\n data: data\n });\n },\n\n handleTorrentClick: function handleTorrentClick(data) {\n _dispatcherAppDispatcher2['default'].dispatchUIAction({\n type: _constantsActionTypes2['default'].UI_CLICK_TORRENT,\n data: data\n });\n },\n\n setTorrentStatusFilter: function setTorrentStatusFilter(data) {\n _dispatcherAppDispatcher2['default'].dispatchUIAction({\n type: _constantsActionTypes2['default'].UI_SET_TORRENT_STATUS_FILTER,\n data: data\n });\n },\n\n setTorrentTrackerFilter: function setTorrentTrackerFilter(data) {\n _dispatcherAppDispatcher2['default'].dispatchUIAction({\n type: _constantsActionTypes2['default'].UI_SET_TORRENT_TRACKER_FILTER,\n data: data\n });\n },\n\n setTorrentsSearchFilter: function setTorrentsSearchFilter(data) {\n _dispatcherAppDispatcher2['default'].dispatchUIAction({\n type: _constantsActionTypes2['default'].UI_SET_TORRENT_SEARCH_FILTER,\n data: data\n });\n },\n\n setTorrentsSort: function setTorrentsSort(data) {\n _axios2['default'].post('/ui/sort-props', data)['catch'](function (error) {\n console.log(error);\n });\n\n _dispatcherAppDispatcher2['default'].dispatchUIAction({\n type: _constantsActionTypes2['default'].UI_SET_TORRENT_SORT,\n data: data\n });\n }\n};\n\nexports['default'] = UIActions;\nmodule.exports = exports['default'];//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jbGllbnQvc291cmNlL3NjcmlwdHMvYWN0aW9ucy9VSUFjdGlvbnMuanM/MjQ4ZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCxzQ0FBc0MsdUNBQXVDLGtCQUFrQjs7QUFFL0Y7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQSx5RUFBeUU7O0FBRXpFO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0EiLCJmaWxlIjoiMjA4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX2F4aW9zID0gcmVxdWlyZSgnYXhpb3MnKTtcblxudmFyIF9heGlvczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9heGlvcyk7XG5cbnZhciBfZGlzcGF0Y2hlckFwcERpc3BhdGNoZXIgPSByZXF1aXJlKCcuLi9kaXNwYXRjaGVyL0FwcERpc3BhdGNoZXInKTtcblxudmFyIF9kaXNwYXRjaGVyQXBwRGlzcGF0Y2hlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kaXNwYXRjaGVyQXBwRGlzcGF0Y2hlcik7XG5cbnZhciBfY29uc3RhbnRzQWN0aW9uVHlwZXMgPSByZXF1aXJlKCcuLi9jb25zdGFudHMvQWN0aW9uVHlwZXMnKTtcblxudmFyIF9jb25zdGFudHNBY3Rpb25UeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb25zdGFudHNBY3Rpb25UeXBlcyk7XG5cbnZhciBfc3RvcmVzVG9ycmVudFN0b3JlID0gcmVxdWlyZSgnLi4vc3RvcmVzL1RvcnJlbnRTdG9yZScpO1xuXG52YXIgX3N0b3Jlc1RvcnJlbnRTdG9yZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zdG9yZXNUb3JyZW50U3RvcmUpO1xuXG52YXIgVUlBY3Rpb25zID0ge1xuICBkaXNwbGF5Q29udGV4dE1lbnU6IGZ1bmN0aW9uIGRpc3BsYXlDb250ZXh0TWVudShkYXRhKSB7XG4gICAgX2Rpc3BhdGNoZXJBcHBEaXNwYXRjaGVyMlsnZGVmYXVsdCddLmRpc3BhdGNoVUlBY3Rpb24oe1xuICAgICAgdHlwZTogX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLlVJX0RJU1BMQVlfQ09OVEVYVF9NRU5VLFxuICAgICAgZGF0YTogZGF0YVxuICAgIH0pO1xuICB9LFxuXG4gIGRpc3BsYXlNb2RhbDogZnVuY3Rpb24gZGlzcGxheU1vZGFsKGRhdGEpIHtcbiAgICBfZGlzcGF0Y2hlckFwcERpc3BhdGNoZXIyWydkZWZhdWx0J10uZGlzcGF0Y2hVSUFjdGlvbih7XG4gICAgICB0eXBlOiBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uVUlfRElTUExBWV9NT0RBTCxcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9KTtcbiAgfSxcblxuICBkaXNtaXNzQ29udGV4dE1lbnU6IGZ1bmN0aW9uIGRpc21pc3NDb250ZXh0TWVudSgpIHtcbiAgICBfZGlzcGF0Y2hlckFwcERpc3BhdGNoZXIyWydkZWZhdWx0J10uZGlzcGF0Y2hVSUFjdGlvbih7XG4gICAgICB0eXBlOiBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uVUlfRElTUExBWV9DT05URVhUX01FTlUsXG4gICAgICBkYXRhOiBudWxsXG4gICAgfSk7XG4gIH0sXG5cbiAgZGlzbWlzc01vZGFsOiBmdW5jdGlvbiBkaXNtaXNzTW9kYWwoKSB7XG4gICAgX2Rpc3BhdGNoZXJBcHBEaXNwYXRjaGVyMlsnZGVmYXVsdCddLmRpc3BhdGNoVUlBY3Rpb24oe1xuICAgICAgdHlwZTogX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLlVJX0RJU1BMQVlfTU9EQUwsXG4gICAgICBkYXRhOiBudWxsXG4gICAgfSk7XG4gIH0sXG5cbiAgZmV0Y2hTb3J0UHJvcHM6IGZ1bmN0aW9uIGZldGNoU29ydFByb3BzKCkge1xuICAgIHJldHVybiBfYXhpb3MyWydkZWZhdWx0J10uZ2V0KCcvdWkvc29ydC1wcm9wcycpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGpzb24gPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1swXTtcblxuICAgICAgcmV0dXJuIGpzb24uZGF0YTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICBfZGlzcGF0Y2hlckFwcERpc3BhdGNoZXIyWydkZWZhdWx0J10uZGlzcGF0Y2hTZXJ2ZXJBY3Rpb24oe1xuICAgICAgICB0eXBlOiBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uVUlfU09SVF9QUk9QU19SRVFVRVNUX1NVQ0NFU1MsXG4gICAgICAgIGRhdGE6IGRhdGFcbiAgICAgIH0pO1xuICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgX2Rpc3BhdGNoZXJBcHBEaXNwYXRjaGVyMlsnZGVmYXVsdCddLmRpc3BhdGNoU2VydmVyQWN0aW9uKHtcbiAgICAgICAgdHlwZTogX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLlVJX1NPUlRfUFJPUFNfUkVRVUVTVF9FUlJPUixcbiAgICAgICAgZXJyb3I6IGVycm9yXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSxcblxuICBoYW5kbGVEZXRhaWxzQ2xpY2s6IGZ1bmN0aW9uIGhhbmRsZURldGFpbHNDbGljayhkYXRhKSB7XG4gICAgX2Rpc3BhdGNoZXJBcHBEaXNwYXRjaGVyMlsnZGVmYXVsdCddLmRpc3BhdGNoVUlBY3Rpb24oe1xuICAgICAgdHlwZTogX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLlVJX0NMSUNLX1RPUlJFTlRfREVUQUlMUyxcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9KTtcbiAgfSxcblxuICBoYW5kbGVUb3JyZW50Q2xpY2s6IGZ1bmN0aW9uIGhhbmRsZVRvcnJlbnRDbGljayhkYXRhKSB7XG4gICAgX2Rpc3BhdGNoZXJBcHBEaXNwYXRjaGVyMlsnZGVmYXVsdCddLmRpc3BhdGNoVUlBY3Rpb24oe1xuICAgICAgdHlwZTogX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLlVJX0NMSUNLX1RPUlJFTlQsXG4gICAgICBkYXRhOiBkYXRhXG4gICAgfSk7XG4gIH0sXG5cbiAgc2V0VG9ycmVudFN0YXR1c0ZpbHRlcjogZnVuY3Rpb24gc2V0VG9ycmVudFN0YXR1c0ZpbHRlcihkYXRhKSB7XG4gICAgX2Rpc3BhdGNoZXJBcHBEaXNwYXRjaGVyMlsnZGVmYXVsdCddLmRpc3BhdGNoVUlBY3Rpb24oe1xuICAgICAgdHlwZTogX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLlVJX1NFVF9UT1JSRU5UX1NUQVRVU19GSUxURVIsXG4gICAgICBkYXRhOiBkYXRhXG4gICAgfSk7XG4gIH0sXG5cbiAgc2V0VG9ycmVudFRyYWNrZXJGaWx0ZXI6IGZ1bmN0aW9uIHNldFRvcnJlbnRUcmFja2VyRmlsdGVyKGRhdGEpIHtcbiAgICBfZGlzcGF0Y2hlckFwcERpc3BhdGNoZXIyWydkZWZhdWx0J10uZGlzcGF0Y2hVSUFjdGlvbih7XG4gICAgICB0eXBlOiBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uVUlfU0VUX1RPUlJFTlRfVFJBQ0tFUl9GSUxURVIsXG4gICAgICBkYXRhOiBkYXRhXG4gICAgfSk7XG4gIH0sXG5cbiAgc2V0VG9ycmVudHNTZWFyY2hGaWx0ZXI6IGZ1bmN0aW9uIHNldFRvcnJlbnRzU2VhcmNoRmlsdGVyKGRhdGEpIHtcbiAgICBfZGlzcGF0Y2hlckFwcERpc3BhdGNoZXIyWydkZWZhdWx0J10uZGlzcGF0Y2hVSUFjdGlvbih7XG4gICAgICB0eXBlOiBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uVUlfU0VUX1RPUlJFTlRfU0VBUkNIX0ZJTFRFUixcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9KTtcbiAgfSxcblxuICBzZXRUb3JyZW50c1NvcnQ6IGZ1bmN0aW9uIHNldFRvcnJlbnRzU29ydChkYXRhKSB7XG4gICAgX2F4aW9zMlsnZGVmYXVsdCddLnBvc3QoJy91aS9zb3J0LXByb3BzJywgZGF0YSlbJ2NhdGNoJ10oZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgfSk7XG5cbiAgICBfZGlzcGF0Y2hlckFwcERpc3BhdGNoZXIyWydkZWZhdWx0J10uZGlzcGF0Y2hVSUFjdGlvbih7XG4gICAgICB0eXBlOiBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uVUlfU0VUX1RPUlJFTlRfU09SVCxcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9KTtcbiAgfVxufTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gVUlBY3Rpb25zO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2NsaWVudC9zb3VyY2Uvc2NyaXB0cy9hY3Rpb25zL1VJQWN0aW9ucy5qc1xuICoqIG1vZHVsZSBpZCA9IDIwOFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
+ eval("'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _axios = __webpack_require__(187);\n\nvar _axios2 = _interopRequireDefault(_axios);\n\nvar _dispatcherAppDispatcher = __webpack_require__(179);\n\nvar _dispatcherAppDispatcher2 = _interopRequireDefault(_dispatcherAppDispatcher);\n\nvar _constantsActionTypes = __webpack_require__(178);\n\nvar _constantsActionTypes2 = _interopRequireDefault(_constantsActionTypes);\n\nvar _storesTorrentStore = __webpack_require__(201);\n\nvar _storesTorrentStore2 = _interopRequireDefault(_storesTorrentStore);\n\nvar UIActions = {\n displayContextMenu: function displayContextMenu(data) {\n _dispatcherAppDispatcher2['default'].dispatchUIAction({\n type: _constantsActionTypes2['default'].UI_DISPLAY_CONTEXT_MENU,\n data: data\n });\n },\n\n displayModal: function displayModal(data) {\n _dispatcherAppDispatcher2['default'].dispatchUIAction({\n type: _constantsActionTypes2['default'].UI_DISPLAY_MODAL,\n data: data\n });\n },\n\n dismissContextMenu: function dismissContextMenu() {\n _dispatcherAppDispatcher2['default'].dispatchUIAction({\n type: _constantsActionTypes2['default'].UI_DISPLAY_CONTEXT_MENU,\n data: null\n });\n },\n\n dismissModal: function dismissModal() {\n _dispatcherAppDispatcher2['default'].dispatchUIAction({\n type: _constantsActionTypes2['default'].UI_DISPLAY_MODAL,\n data: null\n });\n },\n\n fetchSortProps: function fetchSortProps() {\n return _axios2['default'].get('/ui/sort-props').then(function () {\n var json = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n return json.data;\n }).then(function (data) {\n _dispatcherAppDispatcher2['default'].dispatchServerAction({\n type: _constantsActionTypes2['default'].UI_SORT_PROPS_REQUEST_SUCCESS,\n data: data\n });\n })['catch'](function (error) {\n _dispatcherAppDispatcher2['default'].dispatchServerAction({\n type: _constantsActionTypes2['default'].UI_SORT_PROPS_REQUEST_ERROR,\n error: error\n });\n });\n },\n\n handleDetailsClick: function handleDetailsClick(data) {\n _dispatcherAppDispatcher2['default'].dispatchUIAction({\n type: _constantsActionTypes2['default'].UI_CLICK_TORRENT_DETAILS,\n data: data\n });\n },\n\n handleTorrentClick: function handleTorrentClick(data) {\n _dispatcherAppDispatcher2['default'].dispatchUIAction({\n type: _constantsActionTypes2['default'].UI_CLICK_TORRENT,\n data: data\n });\n },\n\n setTorrentStatusFilter: function setTorrentStatusFilter(data) {\n _dispatcherAppDispatcher2['default'].dispatchUIAction({\n type: _constantsActionTypes2['default'].UI_SET_TORRENT_STATUS_FILTER,\n data: data\n });\n },\n\n setTorrentTrackerFilter: function setTorrentTrackerFilter(data) {\n _dispatcherAppDispatcher2['default'].dispatchUIAction({\n type: _constantsActionTypes2['default'].UI_SET_TORRENT_TRACKER_FILTER,\n data: data\n });\n },\n\n setTorrentsSearchFilter: function setTorrentsSearchFilter(data) {\n _dispatcherAppDispatcher2['default'].dispatchUIAction({\n type: _constantsActionTypes2['default'].UI_SET_TORRENT_SEARCH_FILTER,\n data: data\n });\n },\n\n setTorrentsSort: function setTorrentsSort(data) {\n _axios2['default'].post('/ui/sort-props', data)['catch'](function () {\n console.log(error);\n });\n\n _dispatcherAppDispatcher2['default'].dispatchUIAction({\n type: _constantsActionTypes2['default'].UI_SET_TORRENT_SORT,\n data: data\n });\n }\n};\n\nexports['default'] = UIActions;\nmodule.exports = exports['default'];//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jbGllbnQvc291cmNlL3NjcmlwdHMvYWN0aW9ucy9VSUFjdGlvbnMuanM/MjQ4ZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCxzQ0FBc0MsdUNBQXVDLGtCQUFrQjs7QUFFL0Y7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQSx5RUFBeUU7O0FBRXpFO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0EiLCJmaWxlIjoiMjA4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX2F4aW9zID0gcmVxdWlyZSgnYXhpb3MnKTtcblxudmFyIF9heGlvczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9heGlvcyk7XG5cbnZhciBfZGlzcGF0Y2hlckFwcERpc3BhdGNoZXIgPSByZXF1aXJlKCcuLi9kaXNwYXRjaGVyL0FwcERpc3BhdGNoZXInKTtcblxudmFyIF9kaXNwYXRjaGVyQXBwRGlzcGF0Y2hlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kaXNwYXRjaGVyQXBwRGlzcGF0Y2hlcik7XG5cbnZhciBfY29uc3RhbnRzQWN0aW9uVHlwZXMgPSByZXF1aXJlKCcuLi9jb25zdGFudHMvQWN0aW9uVHlwZXMnKTtcblxudmFyIF9jb25zdGFudHNBY3Rpb25UeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb25zdGFudHNBY3Rpb25UeXBlcyk7XG5cbnZhciBfc3RvcmVzVG9ycmVudFN0b3JlID0gcmVxdWlyZSgnLi4vc3RvcmVzL1RvcnJlbnRTdG9yZScpO1xuXG52YXIgX3N0b3Jlc1RvcnJlbnRTdG9yZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zdG9yZXNUb3JyZW50U3RvcmUpO1xuXG52YXIgVUlBY3Rpb25zID0ge1xuICBkaXNwbGF5Q29udGV4dE1lbnU6IGZ1bmN0aW9uIGRpc3BsYXlDb250ZXh0TWVudShkYXRhKSB7XG4gICAgX2Rpc3BhdGNoZXJBcHBEaXNwYXRjaGVyMlsnZGVmYXVsdCddLmRpc3BhdGNoVUlBY3Rpb24oe1xuICAgICAgdHlwZTogX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLlVJX0RJU1BMQVlfQ09OVEVYVF9NRU5VLFxuICAgICAgZGF0YTogZGF0YVxuICAgIH0pO1xuICB9LFxuXG4gIGRpc3BsYXlNb2RhbDogZnVuY3Rpb24gZGlzcGxheU1vZGFsKGRhdGEpIHtcbiAgICBfZGlzcGF0Y2hlckFwcERpc3BhdGNoZXIyWydkZWZhdWx0J10uZGlzcGF0Y2hVSUFjdGlvbih7XG4gICAgICB0eXBlOiBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uVUlfRElTUExBWV9NT0RBTCxcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9KTtcbiAgfSxcblxuICBkaXNtaXNzQ29udGV4dE1lbnU6IGZ1bmN0aW9uIGRpc21pc3NDb250ZXh0TWVudSgpIHtcbiAgICBfZGlzcGF0Y2hlckFwcERpc3BhdGNoZXIyWydkZWZhdWx0J10uZGlzcGF0Y2hVSUFjdGlvbih7XG4gICAgICB0eXBlOiBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uVUlfRElTUExBWV9DT05URVhUX01FTlUsXG4gICAgICBkYXRhOiBudWxsXG4gICAgfSk7XG4gIH0sXG5cbiAgZGlzbWlzc01vZGFsOiBmdW5jdGlvbiBkaXNtaXNzTW9kYWwoKSB7XG4gICAgX2Rpc3BhdGNoZXJBcHBEaXNwYXRjaGVyMlsnZGVmYXVsdCddLmRpc3BhdGNoVUlBY3Rpb24oe1xuICAgICAgdHlwZTogX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLlVJX0RJU1BMQVlfTU9EQUwsXG4gICAgICBkYXRhOiBudWxsXG4gICAgfSk7XG4gIH0sXG5cbiAgZmV0Y2hTb3J0UHJvcHM6IGZ1bmN0aW9uIGZldGNoU29ydFByb3BzKCkge1xuICAgIHJldHVybiBfYXhpb3MyWydkZWZhdWx0J10uZ2V0KCcvdWkvc29ydC1wcm9wcycpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGpzb24gPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1swXTtcblxuICAgICAgcmV0dXJuIGpzb24uZGF0YTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICBfZGlzcGF0Y2hlckFwcERpc3BhdGNoZXIyWydkZWZhdWx0J10uZGlzcGF0Y2hTZXJ2ZXJBY3Rpb24oe1xuICAgICAgICB0eXBlOiBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uVUlfU09SVF9QUk9QU19SRVFVRVNUX1NVQ0NFU1MsXG4gICAgICAgIGRhdGE6IGRhdGFcbiAgICAgIH0pO1xuICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgX2Rpc3BhdGNoZXJBcHBEaXNwYXRjaGVyMlsnZGVmYXVsdCddLmRpc3BhdGNoU2VydmVyQWN0aW9uKHtcbiAgICAgICAgdHlwZTogX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLlVJX1NPUlRfUFJPUFNfUkVRVUVTVF9FUlJPUixcbiAgICAgICAgZXJyb3I6IGVycm9yXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSxcblxuICBoYW5kbGVEZXRhaWxzQ2xpY2s6IGZ1bmN0aW9uIGhhbmRsZURldGFpbHNDbGljayhkYXRhKSB7XG4gICAgX2Rpc3BhdGNoZXJBcHBEaXNwYXRjaGVyMlsnZGVmYXVsdCddLmRpc3BhdGNoVUlBY3Rpb24oe1xuICAgICAgdHlwZTogX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLlVJX0NMSUNLX1RPUlJFTlRfREVUQUlMUyxcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9KTtcbiAgfSxcblxuICBoYW5kbGVUb3JyZW50Q2xpY2s6IGZ1bmN0aW9uIGhhbmRsZVRvcnJlbnRDbGljayhkYXRhKSB7XG4gICAgX2Rpc3BhdGNoZXJBcHBEaXNwYXRjaGVyMlsnZGVmYXVsdCddLmRpc3BhdGNoVUlBY3Rpb24oe1xuICAgICAgdHlwZTogX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLlVJX0NMSUNLX1RPUlJFTlQsXG4gICAgICBkYXRhOiBkYXRhXG4gICAgfSk7XG4gIH0sXG5cbiAgc2V0VG9ycmVudFN0YXR1c0ZpbHRlcjogZnVuY3Rpb24gc2V0VG9ycmVudFN0YXR1c0ZpbHRlcihkYXRhKSB7XG4gICAgX2Rpc3BhdGNoZXJBcHBEaXNwYXRjaGVyMlsnZGVmYXVsdCddLmRpc3BhdGNoVUlBY3Rpb24oe1xuICAgICAgdHlwZTogX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLlVJX1NFVF9UT1JSRU5UX1NUQVRVU19GSUxURVIsXG4gICAgICBkYXRhOiBkYXRhXG4gICAgfSk7XG4gIH0sXG5cbiAgc2V0VG9ycmVudFRyYWNrZXJGaWx0ZXI6IGZ1bmN0aW9uIHNldFRvcnJlbnRUcmFja2VyRmlsdGVyKGRhdGEpIHtcbiAgICBfZGlzcGF0Y2hlckFwcERpc3BhdGNoZXIyWydkZWZhdWx0J10uZGlzcGF0Y2hVSUFjdGlvbih7XG4gICAgICB0eXBlOiBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uVUlfU0VUX1RPUlJFTlRfVFJBQ0tFUl9GSUxURVIsXG4gICAgICBkYXRhOiBkYXRhXG4gICAgfSk7XG4gIH0sXG5cbiAgc2V0VG9ycmVudHNTZWFyY2hGaWx0ZXI6IGZ1bmN0aW9uIHNldFRvcnJlbnRzU2VhcmNoRmlsdGVyKGRhdGEpIHtcbiAgICBfZGlzcGF0Y2hlckFwcERpc3BhdGNoZXIyWydkZWZhdWx0J10uZGlzcGF0Y2hVSUFjdGlvbih7XG4gICAgICB0eXBlOiBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uVUlfU0VUX1RPUlJFTlRfU0VBUkNIX0ZJTFRFUixcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9KTtcbiAgfSxcblxuICBzZXRUb3JyZW50c1NvcnQ6IGZ1bmN0aW9uIHNldFRvcnJlbnRzU29ydChkYXRhKSB7XG4gICAgX2F4aW9zMlsnZGVmYXVsdCddLnBvc3QoJy91aS9zb3J0LXByb3BzJywgZGF0YSlbJ2NhdGNoJ10oZnVuY3Rpb24gKCkge1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgIH0pO1xuXG4gICAgX2Rpc3BhdGNoZXJBcHBEaXNwYXRjaGVyMlsnZGVmYXVsdCddLmRpc3BhdGNoVUlBY3Rpb24oe1xuICAgICAgdHlwZTogX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLlVJX1NFVF9UT1JSRU5UX1NPUlQsXG4gICAgICBkYXRhOiBkYXRhXG4gICAgfSk7XG4gIH1cbn07XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IFVJQWN0aW9ucztcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9jbGllbnQvc291cmNlL3NjcmlwdHMvYWN0aW9ucy9VSUFjdGlvbnMuanNcbiAqKiBtb2R1bGUgaWQgPSAyMDhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
/***/ },
/* 209 */
@@ -1568,7 +1568,7 @@
/* 254 */
/***/ function(module, exports, __webpack_require__) {
- eval("'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _lodash = __webpack_require__(161);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _classnames2 = __webpack_require__(171);\n\nvar _classnames3 = _interopRequireDefault(_classnames2);\n\nvar _reactAddonsCssTransitionGroup = __webpack_require__(163);\n\nvar _reactAddonsCssTransitionGroup2 = _interopRequireDefault(_reactAddonsCssTransitionGroup);\n\nvar _react = __webpack_require__(1);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar METHODS_TO_BIND = ['getDropdownButton', 'getDropdownMenu', 'getDropdownMenuItems', 'handleDropdownBlur', 'handleDropdownClick', 'handleDropdownFocus', 'handleItemSelect', 'handleKeyPress'];\n\nvar Dropdown = (function (_React$Component) {\n _inherits(Dropdown, _React$Component);\n\n function Dropdown() {\n var _this = this;\n\n _classCallCheck(this, Dropdown);\n\n _get(Object.getPrototypeOf(Dropdown.prototype), 'constructor', this).call(this);\n\n this.state = {\n isExpanded: false\n };\n\n METHODS_TO_BIND.forEach(function (method) {\n _this[method] = _this[method].bind(_this);\n });\n\n this.handleKeyPress = _lodash2['default'].throttle(this.handleKeyPress, 1000);\n }\n\n _createClass(Dropdown, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n window.addEventListener('keydown', this.handleKeyPress);\n }\n }, {\n key: 'componentWillUnmount',\n value: function componentWillUnmount() {\n window.removeEventListener('keydown', this.handleKeyPress);\n }\n }, {\n key: 'closeDropdown',\n value: function closeDropdown() {\n this.refs.dropdown.blur();\n }\n }, {\n key: 'handleDropdownBlur',\n value: function handleDropdownBlur() {\n this.setState({\n isExpanded: false\n });\n }\n }, {\n key: 'handleDropdownClick',\n value: function handleDropdownClick() {\n if (this.state.isExpanded) {\n this.closeDropdown();\n } else {\n this.refs.dropdown.focus();\n }\n }\n }, {\n key: 'handleDropdownFocus',\n value: function handleDropdownFocus(event) {\n this.setState({\n isExpanded: true\n });\n }\n }, {\n key: 'handleItemSelect',\n value: function handleItemSelect(item) {\n this.closeDropdown();\n this.props.handleItemSelect(item);\n }\n }, {\n key: 'handleKeyPress',\n value: function handleKeyPress(event) {\n if (this.state.isExpanded && event.keyCode === 27) {\n this.closeDropdown();\n }\n }\n }, {\n key: 'getDropdownButton',\n value: function getDropdownButton() {\n return _react2['default'].createElement(\n 'div',\n { className: this.props.dropdownButtonClass, onClick: this.handleDropdownClick },\n this.props.header\n );\n }\n }, {\n key: 'getDropdownMenu',\n value: function getDropdownMenu(items) {\n var dropdownLists = items.map(function (itemList, index) {\n return _react2['default'].createElement(\n 'div',\n { className: 'dropdown__list', key: index },\n this.getDropdownMenuItems(itemList)\n );\n }, this);\n\n return _react2['default'].createElement(\n 'div',\n { className: 'dropdown__content menu' },\n _react2['default'].createElement(\n 'div',\n { className: 'dropdown__header' },\n this.getDropdownButton()\n ),\n _react2['default'].createElement(\n 'ul',\n { className: 'dropdown__items' },\n dropdownLists\n )\n );\n }\n }, {\n key: 'getDropdownMenuItems',\n value: function getDropdownMenuItems(listItems) {\n return listItems.map(function (property, index) {\n var classes = (0, _classnames3['default'])('dropdown__item menu__item', property.className, {\n 'is-selectable': property.selectable !== false,\n 'is-selected': property.selected\n });\n var clickHandler = null;\n\n if (property.selectable !== false) {\n clickHandler = this.handleItemSelect.bind(this, property);\n }\n\n return _react2['default'].createElement(\n 'li',\n { className: classes, key: index, onClick: clickHandler },\n property.displayName\n );\n }, this);\n }\n }, {\n key: 'render',\n value: function render() {\n var _classnames;\n\n var dropdownWrapperClass = (0, _classnames3['default'])((_classnames = {}, _defineProperty(_classnames, this.props.dropdownWrapperClass, true), _defineProperty(_classnames, 'is-expanded', this.state.isExpanded), _classnames));\n\n var menu = null;\n\n if (this.state.isExpanded) {\n menu = this.getDropdownMenu(this.props.menuItems);\n }\n\n return _react2['default'].createElement(\n 'div',\n { className: dropdownWrapperClass, onFocus: this.handleDropdownFocus, onBlur: this.handleDropdownBlur, ref: 'dropdown', tabIndex: '0' },\n this.getDropdownButton(),\n _react2['default'].createElement(\n _reactAddonsCssTransitionGroup2['default'],\n {\n transitionName: 'dropdown__content',\n transitionEnterTimeout: 250,\n transitionLeaveTimeout: 250 },\n menu\n )\n );\n }\n }]);\n\n return Dropdown;\n})(_react2['default'].Component);\n\nexports['default'] = Dropdown;\n\nDropdown.defaultProps = {\n dropdownWrapperClass: 'dropdown',\n dropdownButtonClass: 'dropdown__trigger'\n};\n\nDropdown.propTypes = {\n menuItems: _react2['default'].PropTypes.arrayOf(_react2['default'].PropTypes.arrayOf(_react2['default'].PropTypes.object)).isRequired\n};\nmodule.exports = exports['default'];//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jbGllbnQvc291cmNlL3NjcmlwdHMvY29tcG9uZW50cy9mb3Jtcy9Ecm9wZG93bi5qcz9mOWZkIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVELGlDQUFpQywyQ0FBMkMsZ0JBQWdCLGtCQUFrQixPQUFPLDJCQUEyQix3REFBd0QsZ0NBQWdDLHVEQUF1RCwyREFBMkQsRUFBRSxFQUFFLHlEQUF5RCxxRUFBcUUsNkRBQTZELG9CQUFvQixHQUFHLEVBQUU7O0FBRWxqQix1Q0FBdUMsbUJBQW1CLDRCQUE0QixpREFBaUQsZ0JBQWdCLGtEQUFrRCw4REFBOEQsMEJBQTBCLDRDQUE0Qyx1QkFBdUIsa0JBQWtCLEVBQUUsT0FBTyxhQUFhLGdCQUFnQixnQkFBZ0IsZUFBZSwyQkFBMkIsb0JBQW9CLEVBQUUsRUFBRSw0QkFBNEIsbUJBQW1CLEVBQUUsT0FBTyx1QkFBdUIsNEJBQTRCLGtCQUFrQixFQUFFLDhCQUE4QixFQUFFLEVBQUU7O0FBRS9vQixzQ0FBc0MsdUNBQXVDLGtCQUFrQjs7QUFFL0YsMkNBQTJDLGtCQUFrQixrQ0FBa0MscUVBQXFFLEVBQUUsRUFBRSxPQUFPLGtCQUFrQixFQUFFLFlBQVk7O0FBRS9NLGlEQUFpRCwwQ0FBMEMsMERBQTBELEVBQUU7O0FBRXZKLDBDQUEwQywrREFBK0QscUdBQXFHLEVBQUUseUVBQXlFLGVBQWUseUVBQXlFLEVBQUUsRUFBRSx1SEFBdUg7O0FBRTVlOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsK0VBQStFO0FBQ3hGO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVywwQ0FBMEM7QUFDckQ7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBLFNBQVMsc0NBQXNDO0FBQy9DO0FBQ0E7QUFDQSxXQUFXLGdDQUFnQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsK0JBQStCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsd0RBQXdEO0FBQ25FO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBLCtFQUErRTs7QUFFL0U7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTLHNJQUFzSTtBQUMvSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIyNTQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgndmFsdWUnIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG52YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeCwgX3gyLCBfeDMpIHsgdmFyIF9hZ2FpbiA9IHRydWU7IF9mdW5jdGlvbjogd2hpbGUgKF9hZ2FpbikgeyB2YXIgb2JqZWN0ID0gX3gsIHByb3BlcnR5ID0gX3gyLCByZWNlaXZlciA9IF94MzsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeCA9IHBhcmVudDsgX3gyID0gcHJvcGVydHk7IF94MyA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBkZXNjID0gcGFyZW50ID0gdW5kZWZpbmVkOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmICgndmFsdWUnIGluIGRlc2MpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9IH07XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsgfSB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICdmdW5jdGlvbicgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICcgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBfbG9kYXNoID0gcmVxdWlyZSgnbG9kYXNoJyk7XG5cbnZhciBfbG9kYXNoMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2xvZGFzaCk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzMik7XG5cbnZhciBfcmVhY3RBZGRvbnNDc3NUcmFuc2l0aW9uR3JvdXAgPSByZXF1aXJlKCdyZWFjdC1hZGRvbnMtY3NzLXRyYW5zaXRpb24tZ3JvdXAnKTtcblxudmFyIF9yZWFjdEFkZG9uc0Nzc1RyYW5zaXRpb25Hcm91cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdEFkZG9uc0Nzc1RyYW5zaXRpb25Hcm91cCk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIE1FVEhPRFNfVE9fQklORCA9IFsnZ2V0RHJvcGRvd25CdXR0b24nLCAnZ2V0RHJvcGRvd25NZW51JywgJ2dldERyb3Bkb3duTWVudUl0ZW1zJywgJ2hhbmRsZURyb3Bkb3duQmx1cicsICdoYW5kbGVEcm9wZG93bkNsaWNrJywgJ2hhbmRsZURyb3Bkb3duRm9jdXMnLCAnaGFuZGxlSXRlbVNlbGVjdCcsICdoYW5kbGVLZXlQcmVzcyddO1xuXG52YXIgRHJvcGRvd24gPSAoZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKERyb3Bkb3duLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBEcm9wZG93bigpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERyb3Bkb3duKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKERyb3Bkb3duLnByb3RvdHlwZSksICdjb25zdHJ1Y3RvcicsIHRoaXMpLmNhbGwodGhpcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaXNFeHBhbmRlZDogZmFsc2VcbiAgICB9O1xuXG4gICAgTUVUSE9EU19UT19CSU5ELmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgX3RoaXNbbWV0aG9kXSA9IF90aGlzW21ldGhvZF0uYmluZChfdGhpcyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmhhbmRsZUtleVByZXNzID0gX2xvZGFzaDJbJ2RlZmF1bHQnXS50aHJvdHRsZSh0aGlzLmhhbmRsZUtleVByZXNzLCAxMDAwKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhEcm9wZG93biwgW3tcbiAgICBrZXk6ICdjb21wb25lbnREaWRNb3VudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleVByZXNzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjb21wb25lbnRXaWxsVW5tb3VudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleVByZXNzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjbG9zZURyb3Bkb3duJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xvc2VEcm9wZG93bigpIHtcbiAgICAgIHRoaXMucmVmcy5kcm9wZG93bi5ibHVyKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaGFuZGxlRHJvcGRvd25CbHVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlRHJvcGRvd25CbHVyKCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzRXhwYW5kZWQ6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdoYW5kbGVEcm9wZG93bkNsaWNrJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlRHJvcGRvd25DbGljaygpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLmlzRXhwYW5kZWQpIHtcbiAgICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlZnMuZHJvcGRvd24uZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdoYW5kbGVEcm9wZG93bkZvY3VzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlRHJvcGRvd25Gb2N1cyhldmVudCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzRXhwYW5kZWQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2hhbmRsZUl0ZW1TZWxlY3QnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVJdGVtU2VsZWN0KGl0ZW0pIHtcbiAgICAgIHRoaXMuY2xvc2VEcm9wZG93bigpO1xuICAgICAgdGhpcy5wcm9wcy5oYW5kbGVJdGVtU2VsZWN0KGl0ZW0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2hhbmRsZUtleVByZXNzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlS2V5UHJlc3MoZXZlbnQpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLmlzRXhwYW5kZWQgJiYgZXZlbnQua2V5Q29kZSA9PT0gMjcpIHtcbiAgICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0RHJvcGRvd25CdXR0b24nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREcm9wZG93bkJ1dHRvbigpIHtcbiAgICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ2RpdicsXG4gICAgICAgIHsgY2xhc3NOYW1lOiB0aGlzLnByb3BzLmRyb3Bkb3duQnV0dG9uQ2xhc3MsIG9uQ2xpY2s6IHRoaXMuaGFuZGxlRHJvcGRvd25DbGljayB9LFxuICAgICAgICB0aGlzLnByb3BzLmhlYWRlclxuICAgICAgKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXREcm9wZG93bk1lbnUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREcm9wZG93bk1lbnUoaXRlbXMpIHtcbiAgICAgIHZhciBkcm9wZG93bkxpc3RzID0gaXRlbXMubWFwKGZ1bmN0aW9uIChpdGVtTGlzdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICdkaXYnLFxuICAgICAgICAgIHsgY2xhc3NOYW1lOiAnZHJvcGRvd25fX2xpc3QnLCBrZXk6IGluZGV4IH0sXG4gICAgICAgICAgdGhpcy5nZXREcm9wZG93bk1lbnVJdGVtcyhpdGVtTGlzdClcbiAgICAgICAgKTtcbiAgICAgIH0sIHRoaXMpO1xuXG4gICAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdkaXYnLFxuICAgICAgICB7IGNsYXNzTmFtZTogJ2Ryb3Bkb3duX19jb250ZW50IG1lbnUnIH0sXG4gICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICdkaXYnLFxuICAgICAgICAgIHsgY2xhc3NOYW1lOiAnZHJvcGRvd25fX2hlYWRlcicgfSxcbiAgICAgICAgICB0aGlzLmdldERyb3Bkb3duQnV0dG9uKClcbiAgICAgICAgKSxcbiAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgJ3VsJyxcbiAgICAgICAgICB7IGNsYXNzTmFtZTogJ2Ryb3Bkb3duX19pdGVtcycgfSxcbiAgICAgICAgICBkcm9wZG93bkxpc3RzXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0RHJvcGRvd25NZW51SXRlbXMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREcm9wZG93bk1lbnVJdGVtcyhsaXN0SXRlbXMpIHtcbiAgICAgIHJldHVybiBsaXN0SXRlbXMubWFwKGZ1bmN0aW9uIChwcm9wZXJ0eSwgaW5kZXgpIHtcbiAgICAgICAgdmFyIGNsYXNzZXMgPSAoMCwgX2NsYXNzbmFtZXMzWydkZWZhdWx0J10pKCdkcm9wZG93bl9faXRlbSBtZW51X19pdGVtJywgcHJvcGVydHkuY2xhc3NOYW1lLCB7XG4gICAgICAgICAgJ2lzLXNlbGVjdGFibGUnOiBwcm9wZXJ0eS5zZWxlY3RhYmxlICE9PSBmYWxzZSxcbiAgICAgICAgICAnaXMtc2VsZWN0ZWQnOiBwcm9wZXJ0eS5zZWxlY3RlZFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGNsaWNrSGFuZGxlciA9IG51bGw7XG5cbiAgICAgICAgaWYgKHByb3BlcnR5LnNlbGVjdGFibGUgIT09IGZhbHNlKSB7XG4gICAgICAgICAgY2xpY2tIYW5kbGVyID0gdGhpcy5oYW5kbGVJdGVtU2VsZWN0LmJpbmQodGhpcywgcHJvcGVydHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICdsaScsXG4gICAgICAgICAgeyBjbGFzc05hbWU6IGNsYXNzZXMsIGtleTogaW5kZXgsIG9uQ2xpY2s6IGNsaWNrSGFuZGxlciB9LFxuICAgICAgICAgIHByb3BlcnR5LmRpc3BsYXlOYW1lXG4gICAgICAgICk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdyZW5kZXInLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX2NsYXNzbmFtZXM7XG5cbiAgICAgIHZhciBkcm9wZG93bldyYXBwZXJDbGFzcyA9ICgwLCBfY2xhc3NuYW1lczNbJ2RlZmF1bHQnXSkoKF9jbGFzc25hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NuYW1lcywgdGhpcy5wcm9wcy5kcm9wZG93bldyYXBwZXJDbGFzcywgdHJ1ZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NuYW1lcywgJ2lzLWV4cGFuZGVkJywgdGhpcy5zdGF0ZS5pc0V4cGFuZGVkKSwgX2NsYXNzbmFtZXMpKTtcblxuICAgICAgdmFyIG1lbnUgPSBudWxsO1xuXG4gICAgICBpZiAodGhpcy5zdGF0ZS5pc0V4cGFuZGVkKSB7XG4gICAgICAgIG1lbnUgPSB0aGlzLmdldERyb3Bkb3duTWVudSh0aGlzLnByb3BzLm1lbnVJdGVtcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ2RpdicsXG4gICAgICAgIHsgY2xhc3NOYW1lOiBkcm9wZG93bldyYXBwZXJDbGFzcywgb25Gb2N1czogdGhpcy5oYW5kbGVEcm9wZG93bkZvY3VzLCBvbkJsdXI6IHRoaXMuaGFuZGxlRHJvcGRvd25CbHVyLCByZWY6ICdkcm9wZG93bicsIHRhYkluZGV4OiAnMCcgfSxcbiAgICAgICAgdGhpcy5nZXREcm9wZG93bkJ1dHRvbigpLFxuICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICBfcmVhY3RBZGRvbnNDc3NUcmFuc2l0aW9uR3JvdXAyWydkZWZhdWx0J10sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHJhbnNpdGlvbk5hbWU6ICdkcm9wZG93bl9fY29udGVudCcsXG4gICAgICAgICAgICB0cmFuc2l0aW9uRW50ZXJUaW1lb3V0OiAyNTAsXG4gICAgICAgICAgICB0cmFuc2l0aW9uTGVhdmVUaW1lb3V0OiAyNTAgfSxcbiAgICAgICAgICBtZW51XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIERyb3Bkb3duO1xufSkoX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IERyb3Bkb3duO1xuXG5Ecm9wZG93bi5kZWZhdWx0UHJvcHMgPSB7XG4gIGRyb3Bkb3duV3JhcHBlckNsYXNzOiAnZHJvcGRvd24nLFxuICBkcm9wZG93bkJ1dHRvbkNsYXNzOiAnZHJvcGRvd25fX3RyaWdnZXInXG59O1xuXG5Ecm9wZG93bi5wcm9wVHlwZXMgPSB7XG4gIG1lbnVJdGVtczogX3JlYWN0MlsnZGVmYXVsdCddLlByb3BUeXBlcy5hcnJheU9mKF9yZWFjdDJbJ2RlZmF1bHQnXS5Qcm9wVHlwZXMuYXJyYXlPZihfcmVhY3QyWydkZWZhdWx0J10uUHJvcFR5cGVzLm9iamVjdCkpLmlzUmVxdWlyZWRcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vY2xpZW50L3NvdXJjZS9zY3JpcHRzL2NvbXBvbmVudHMvZm9ybXMvRHJvcGRvd24uanNcbiAqKiBtb2R1bGUgaWQgPSAyNTRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
+ eval("'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _lodash = __webpack_require__(161);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _classnames2 = __webpack_require__(171);\n\nvar _classnames3 = _interopRequireDefault(_classnames2);\n\nvar _reactAddonsCssTransitionGroup = __webpack_require__(163);\n\nvar _reactAddonsCssTransitionGroup2 = _interopRequireDefault(_reactAddonsCssTransitionGroup);\n\nvar _react = __webpack_require__(1);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar METHODS_TO_BIND = ['getDropdownButton', 'getDropdownMenu', 'getDropdownMenuItems', 'handleDropdownBlur', 'handleDropdownClick', 'handleDropdownFocus', 'handleItemSelect', 'handleKeyPress'];\n\nvar Dropdown = (function (_React$Component) {\n _inherits(Dropdown, _React$Component);\n\n function Dropdown() {\n var _this = this;\n\n _classCallCheck(this, Dropdown);\n\n _get(Object.getPrototypeOf(Dropdown.prototype), 'constructor', this).call(this);\n\n this.state = {\n isExpanded: false\n };\n\n METHODS_TO_BIND.forEach(function (method) {\n _this[method] = _this[method].bind(_this);\n });\n\n this.handleKeyPress = _lodash2['default'].throttle(this.handleKeyPress, 1000);\n }\n\n _createClass(Dropdown, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n window.addEventListener('keydown', this.handleKeyPress);\n }\n }, {\n key: 'componentWillUnmount',\n value: function componentWillUnmount() {\n window.removeEventListener('keydown', this.handleKeyPress);\n }\n }, {\n key: 'closeDropdown',\n value: function closeDropdown() {\n this.refs.dropdown.blur();\n }\n }, {\n key: 'handleDropdownBlur',\n value: function handleDropdownBlur() {\n this.setState({\n isExpanded: false\n });\n }\n }, {\n key: 'handleDropdownClick',\n value: function handleDropdownClick() {\n if (this.state.isExpanded) {\n this.closeDropdown();\n } else {\n this.refs.dropdown.focus();\n }\n }\n }, {\n key: 'handleDropdownFocus',\n value: function handleDropdownFocus(event) {\n this.setState({\n isExpanded: true\n });\n }\n }, {\n key: 'handleItemSelect',\n value: function handleItemSelect(item) {\n this.closeDropdown();\n this.props.handleItemSelect(item);\n }\n }, {\n key: 'handleKeyPress',\n value: function handleKeyPress(event) {\n if (this.state.isExpanded && event.keyCode === 27) {\n this.closeDropdown();\n }\n }\n }, {\n key: 'getDropdownButton',\n value: function getDropdownButton() {\n return _react2['default'].createElement(\n 'div',\n { className: this.props.dropdownButtonClass, onClick: this.handleDropdownClick },\n this.props.header\n );\n }\n }, {\n key: 'getDropdownMenu',\n value: function getDropdownMenu(items) {\n var _this2 = this;\n\n var dropdownLists = items.map(function (itemList, index) {\n return _react2['default'].createElement(\n 'div',\n { className: 'dropdown__list', key: index },\n _this2.getDropdownMenuItems(itemList)\n );\n }, this);\n\n return _react2['default'].createElement(\n 'div',\n { className: 'dropdown__content menu' },\n _react2['default'].createElement(\n 'div',\n { className: 'dropdown__header' },\n this.getDropdownButton()\n ),\n _react2['default'].createElement(\n 'ul',\n { className: 'dropdown__items' },\n dropdownLists\n )\n );\n }\n }, {\n key: 'getDropdownMenuItems',\n value: function getDropdownMenuItems(listItems) {\n var _this3 = this;\n\n return listItems.map(function (property, index) {\n var classes = (0, _classnames3['default'])('dropdown__item menu__item', property.className, {\n 'is-selectable': property.selectable !== false,\n 'is-selected': property.selected\n });\n var clickHandler = null;\n\n if (property.selectable !== false) {\n clickHandler = _this3.handleItemSelect.bind(_this3, property);\n }\n\n return _react2['default'].createElement(\n 'li',\n { className: classes, key: index, onClick: clickHandler },\n property.displayName\n );\n }, this);\n }\n }, {\n key: 'render',\n value: function render() {\n var _classnames;\n\n var dropdownWrapperClass = (0, _classnames3['default'])((_classnames = {}, _defineProperty(_classnames, this.props.dropdownWrapperClass, true), _defineProperty(_classnames, 'is-expanded', this.state.isExpanded), _classnames));\n\n var menu = null;\n\n if (this.state.isExpanded) {\n menu = this.getDropdownMenu(this.props.menuItems);\n }\n\n return _react2['default'].createElement(\n 'div',\n { className: dropdownWrapperClass, onFocus: this.handleDropdownFocus, onBlur: this.handleDropdownBlur, ref: 'dropdown', tabIndex: '0' },\n this.getDropdownButton(),\n _react2['default'].createElement(\n _reactAddonsCssTransitionGroup2['default'],\n {\n transitionName: 'dropdown__content',\n transitionEnterTimeout: 250,\n transitionLeaveTimeout: 250 },\n menu\n )\n );\n }\n }]);\n\n return Dropdown;\n})(_react2['default'].Component);\n\nexports['default'] = Dropdown;\n\nDropdown.defaultProps = {\n dropdownWrapperClass: 'dropdown',\n dropdownButtonClass: 'dropdown__trigger'\n};\n\nDropdown.propTypes = {\n menuItems: _react2['default'].PropTypes.arrayOf(_react2['default'].PropTypes.arrayOf(_react2['default'].PropTypes.object)).isRequired\n};\nmodule.exports = exports['default'];//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jbGllbnQvc291cmNlL3NjcmlwdHMvY29tcG9uZW50cy9mb3Jtcy9Ecm9wZG93bi5qcz9mOWZkIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVELGlDQUFpQywyQ0FBMkMsZ0JBQWdCLGtCQUFrQixPQUFPLDJCQUEyQix3REFBd0QsZ0NBQWdDLHVEQUF1RCwyREFBMkQsRUFBRSxFQUFFLHlEQUF5RCxxRUFBcUUsNkRBQTZELG9CQUFvQixHQUFHLEVBQUU7O0FBRWxqQix1Q0FBdUMsbUJBQW1CLDRCQUE0QixpREFBaUQsZ0JBQWdCLGtEQUFrRCw4REFBOEQsMEJBQTBCLDRDQUE0Qyx1QkFBdUIsa0JBQWtCLEVBQUUsT0FBTyxhQUFhLGdCQUFnQixnQkFBZ0IsZUFBZSwyQkFBMkIsb0JBQW9CLEVBQUUsRUFBRSw0QkFBNEIsbUJBQW1CLEVBQUUsT0FBTyx1QkFBdUIsNEJBQTRCLGtCQUFrQixFQUFFLDhCQUE4QixFQUFFLEVBQUU7O0FBRS9vQixzQ0FBc0MsdUNBQXVDLGtCQUFrQjs7QUFFL0YsMkNBQTJDLGtCQUFrQixrQ0FBa0MscUVBQXFFLEVBQUUsRUFBRSxPQUFPLGtCQUFrQixFQUFFLFlBQVk7O0FBRS9NLGlEQUFpRCwwQ0FBMEMsMERBQTBELEVBQUU7O0FBRXZKLDBDQUEwQywrREFBK0QscUdBQXFHLEVBQUUseUVBQXlFLGVBQWUseUVBQXlFLEVBQUUsRUFBRSx1SEFBdUg7O0FBRTVlOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsK0VBQStFO0FBQ3hGO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVywwQ0FBMEM7QUFDckQ7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBLFNBQVMsc0NBQXNDO0FBQy9DO0FBQ0E7QUFDQSxXQUFXLGdDQUFnQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsK0JBQStCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsd0RBQXdEO0FBQ25FO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBLCtFQUErRTs7QUFFL0U7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTLHNJQUFzSTtBQUMvSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIyNTQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgndmFsdWUnIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG52YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeCwgX3gyLCBfeDMpIHsgdmFyIF9hZ2FpbiA9IHRydWU7IF9mdW5jdGlvbjogd2hpbGUgKF9hZ2FpbikgeyB2YXIgb2JqZWN0ID0gX3gsIHByb3BlcnR5ID0gX3gyLCByZWNlaXZlciA9IF94MzsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeCA9IHBhcmVudDsgX3gyID0gcHJvcGVydHk7IF94MyA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBkZXNjID0gcGFyZW50ID0gdW5kZWZpbmVkOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmICgndmFsdWUnIGluIGRlc2MpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9IH07XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsgfSB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICdmdW5jdGlvbicgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICcgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBfbG9kYXNoID0gcmVxdWlyZSgnbG9kYXNoJyk7XG5cbnZhciBfbG9kYXNoMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2xvZGFzaCk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzMik7XG5cbnZhciBfcmVhY3RBZGRvbnNDc3NUcmFuc2l0aW9uR3JvdXAgPSByZXF1aXJlKCdyZWFjdC1hZGRvbnMtY3NzLXRyYW5zaXRpb24tZ3JvdXAnKTtcblxudmFyIF9yZWFjdEFkZG9uc0Nzc1RyYW5zaXRpb25Hcm91cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdEFkZG9uc0Nzc1RyYW5zaXRpb25Hcm91cCk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIE1FVEhPRFNfVE9fQklORCA9IFsnZ2V0RHJvcGRvd25CdXR0b24nLCAnZ2V0RHJvcGRvd25NZW51JywgJ2dldERyb3Bkb3duTWVudUl0ZW1zJywgJ2hhbmRsZURyb3Bkb3duQmx1cicsICdoYW5kbGVEcm9wZG93bkNsaWNrJywgJ2hhbmRsZURyb3Bkb3duRm9jdXMnLCAnaGFuZGxlSXRlbVNlbGVjdCcsICdoYW5kbGVLZXlQcmVzcyddO1xuXG52YXIgRHJvcGRvd24gPSAoZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKERyb3Bkb3duLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBEcm9wZG93bigpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERyb3Bkb3duKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKERyb3Bkb3duLnByb3RvdHlwZSksICdjb25zdHJ1Y3RvcicsIHRoaXMpLmNhbGwodGhpcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaXNFeHBhbmRlZDogZmFsc2VcbiAgICB9O1xuXG4gICAgTUVUSE9EU19UT19CSU5ELmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgX3RoaXNbbWV0aG9kXSA9IF90aGlzW21ldGhvZF0uYmluZChfdGhpcyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmhhbmRsZUtleVByZXNzID0gX2xvZGFzaDJbJ2RlZmF1bHQnXS50aHJvdHRsZSh0aGlzLmhhbmRsZUtleVByZXNzLCAxMDAwKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhEcm9wZG93biwgW3tcbiAgICBrZXk6ICdjb21wb25lbnREaWRNb3VudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleVByZXNzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjb21wb25lbnRXaWxsVW5tb3VudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleVByZXNzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjbG9zZURyb3Bkb3duJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xvc2VEcm9wZG93bigpIHtcbiAgICAgIHRoaXMucmVmcy5kcm9wZG93bi5ibHVyKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaGFuZGxlRHJvcGRvd25CbHVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlRHJvcGRvd25CbHVyKCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzRXhwYW5kZWQ6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdoYW5kbGVEcm9wZG93bkNsaWNrJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlRHJvcGRvd25DbGljaygpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLmlzRXhwYW5kZWQpIHtcbiAgICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlZnMuZHJvcGRvd24uZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdoYW5kbGVEcm9wZG93bkZvY3VzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlRHJvcGRvd25Gb2N1cyhldmVudCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzRXhwYW5kZWQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2hhbmRsZUl0ZW1TZWxlY3QnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVJdGVtU2VsZWN0KGl0ZW0pIHtcbiAgICAgIHRoaXMuY2xvc2VEcm9wZG93bigpO1xuICAgICAgdGhpcy5wcm9wcy5oYW5kbGVJdGVtU2VsZWN0KGl0ZW0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2hhbmRsZUtleVByZXNzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlS2V5UHJlc3MoZXZlbnQpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLmlzRXhwYW5kZWQgJiYgZXZlbnQua2V5Q29kZSA9PT0gMjcpIHtcbiAgICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0RHJvcGRvd25CdXR0b24nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREcm9wZG93bkJ1dHRvbigpIHtcbiAgICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ2RpdicsXG4gICAgICAgIHsgY2xhc3NOYW1lOiB0aGlzLnByb3BzLmRyb3Bkb3duQnV0dG9uQ2xhc3MsIG9uQ2xpY2s6IHRoaXMuaGFuZGxlRHJvcGRvd25DbGljayB9LFxuICAgICAgICB0aGlzLnByb3BzLmhlYWRlclxuICAgICAgKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXREcm9wZG93bk1lbnUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREcm9wZG93bk1lbnUoaXRlbXMpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgZHJvcGRvd25MaXN0cyA9IGl0ZW1zLm1hcChmdW5jdGlvbiAoaXRlbUxpc3QsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAnZGl2JyxcbiAgICAgICAgICB7IGNsYXNzTmFtZTogJ2Ryb3Bkb3duX19saXN0Jywga2V5OiBpbmRleCB9LFxuICAgICAgICAgIF90aGlzMi5nZXREcm9wZG93bk1lbnVJdGVtcyhpdGVtTGlzdClcbiAgICAgICAgKTtcbiAgICAgIH0sIHRoaXMpO1xuXG4gICAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdkaXYnLFxuICAgICAgICB7IGNsYXNzTmFtZTogJ2Ryb3Bkb3duX19jb250ZW50IG1lbnUnIH0sXG4gICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICdkaXYnLFxuICAgICAgICAgIHsgY2xhc3NOYW1lOiAnZHJvcGRvd25fX2hlYWRlcicgfSxcbiAgICAgICAgICB0aGlzLmdldERyb3Bkb3duQnV0dG9uKClcbiAgICAgICAgKSxcbiAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgJ3VsJyxcbiAgICAgICAgICB7IGNsYXNzTmFtZTogJ2Ryb3Bkb3duX19pdGVtcycgfSxcbiAgICAgICAgICBkcm9wZG93bkxpc3RzXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0RHJvcGRvd25NZW51SXRlbXMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREcm9wZG93bk1lbnVJdGVtcyhsaXN0SXRlbXMpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gbGlzdEl0ZW1zLm1hcChmdW5jdGlvbiAocHJvcGVydHksIGluZGV4KSB7XG4gICAgICAgIHZhciBjbGFzc2VzID0gKDAsIF9jbGFzc25hbWVzM1snZGVmYXVsdCddKSgnZHJvcGRvd25fX2l0ZW0gbWVudV9faXRlbScsIHByb3BlcnR5LmNsYXNzTmFtZSwge1xuICAgICAgICAgICdpcy1zZWxlY3RhYmxlJzogcHJvcGVydHkuc2VsZWN0YWJsZSAhPT0gZmFsc2UsXG4gICAgICAgICAgJ2lzLXNlbGVjdGVkJzogcHJvcGVydHkuc2VsZWN0ZWRcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBjbGlja0hhbmRsZXIgPSBudWxsO1xuXG4gICAgICAgIGlmIChwcm9wZXJ0eS5zZWxlY3RhYmxlICE9PSBmYWxzZSkge1xuICAgICAgICAgIGNsaWNrSGFuZGxlciA9IF90aGlzMy5oYW5kbGVJdGVtU2VsZWN0LmJpbmQoX3RoaXMzLCBwcm9wZXJ0eSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgJ2xpJyxcbiAgICAgICAgICB7IGNsYXNzTmFtZTogY2xhc3Nlcywga2V5OiBpbmRleCwgb25DbGljazogY2xpY2tIYW5kbGVyIH0sXG4gICAgICAgICAgcHJvcGVydHkuZGlzcGxheU5hbWVcbiAgICAgICAgKTtcbiAgICAgIH0sIHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3JlbmRlcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfY2xhc3NuYW1lcztcblxuICAgICAgdmFyIGRyb3Bkb3duV3JhcHBlckNsYXNzID0gKDAsIF9jbGFzc25hbWVzM1snZGVmYXVsdCddKSgoX2NsYXNzbmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc25hbWVzLCB0aGlzLnByb3BzLmRyb3Bkb3duV3JhcHBlckNsYXNzLCB0cnVlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc25hbWVzLCAnaXMtZXhwYW5kZWQnLCB0aGlzLnN0YXRlLmlzRXhwYW5kZWQpLCBfY2xhc3NuYW1lcykpO1xuXG4gICAgICB2YXIgbWVudSA9IG51bGw7XG5cbiAgICAgIGlmICh0aGlzLnN0YXRlLmlzRXhwYW5kZWQpIHtcbiAgICAgICAgbWVudSA9IHRoaXMuZ2V0RHJvcGRvd25NZW51KHRoaXMucHJvcHMubWVudUl0ZW1zKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnZGl2JyxcbiAgICAgICAgeyBjbGFzc05hbWU6IGRyb3Bkb3duV3JhcHBlckNsYXNzLCBvbkZvY3VzOiB0aGlzLmhhbmRsZURyb3Bkb3duRm9jdXMsIG9uQmx1cjogdGhpcy5oYW5kbGVEcm9wZG93bkJsdXIsIHJlZjogJ2Ryb3Bkb3duJywgdGFiSW5kZXg6ICcwJyB9LFxuICAgICAgICB0aGlzLmdldERyb3Bkb3duQnV0dG9uKCksXG4gICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgIF9yZWFjdEFkZG9uc0Nzc1RyYW5zaXRpb25Hcm91cDJbJ2RlZmF1bHQnXSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0cmFuc2l0aW9uTmFtZTogJ2Ryb3Bkb3duX19jb250ZW50JyxcbiAgICAgICAgICAgIHRyYW5zaXRpb25FbnRlclRpbWVvdXQ6IDI1MCxcbiAgICAgICAgICAgIHRyYW5zaXRpb25MZWF2ZVRpbWVvdXQ6IDI1MCB9LFxuICAgICAgICAgIG1lbnVcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRHJvcGRvd247XG59KShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gRHJvcGRvd247XG5cbkRyb3Bkb3duLmRlZmF1bHRQcm9wcyA9IHtcbiAgZHJvcGRvd25XcmFwcGVyQ2xhc3M6ICdkcm9wZG93bicsXG4gIGRyb3Bkb3duQnV0dG9uQ2xhc3M6ICdkcm9wZG93bl9fdHJpZ2dlcidcbn07XG5cbkRyb3Bkb3duLnByb3BUeXBlcyA9IHtcbiAgbWVudUl0ZW1zOiBfcmVhY3QyWydkZWZhdWx0J10uUHJvcFR5cGVzLmFycmF5T2YoX3JlYWN0MlsnZGVmYXVsdCddLlByb3BUeXBlcy5hcnJheU9mKF9yZWFjdDJbJ2RlZmF1bHQnXS5Qcm9wVHlwZXMub2JqZWN0KSkuaXNSZXF1aXJlZFxufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9jbGllbnQvc291cmNlL3NjcmlwdHMvY29tcG9uZW50cy9mb3Jtcy9Ecm9wZG93bi5qc1xuICoqIG1vZHVsZSBpZCA9IDI1NFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
/***/ },
/* 255 */
diff --git a/server/models/ClientRequest.js b/server/models/ClientRequest.js
index 87b65603..900eca50 100644
--- a/server/models/ClientRequest.js
+++ b/server/models/ClientRequest.js
@@ -185,7 +185,7 @@ class ClientRequest {
let sourcePaths = this.getEnsuredArray(options.sourcePaths);
sourcePaths.forEach((source, index) => {
- let callback = function () {};
+ let callback = () => {};
let destination = `${destinationPath}${path.sep}${filenames[index]}`;
let isLastRequest = index + 1 === sourcePaths.length;
diff --git a/server/models/HistoryEra.js b/server/models/HistoryEra.js
index 134b7b6d..0907a1dc 100644
--- a/server/models/HistoryEra.js
+++ b/server/models/HistoryEra.js
@@ -98,7 +98,7 @@ class HistoryEra {
this.db.find({ts: {$gte: minTimestamp}})
.sort({ts: 1})
- .exec(function (err, docs) {
+ .exec((err, docs) => {
if (err) {
callback(null, err);
return;
@@ -112,7 +112,7 @@ class HistoryEra {
hasRequiredFields(opts) {
let requirementsMet = true;
- REQUIRED_FIELDS.forEach(function (field) {
+ REQUIRED_FIELDS.forEach((field) => {
if (opts[field] == null) {
console.error(`HistoryEra requires ${field}`);
requirementsMet = false;
@@ -145,7 +145,7 @@ class HistoryEra {
let lastUpdate = 0;
db.find({}, (err, docs) => {
- docs.forEach(function (doc) {
+ docs.forEach((doc) => {
if (doc.ts > lastUpdate) {
lastUpdate = doc.ts;
}
@@ -182,7 +182,7 @@ class HistoryEra {
let downTotal = 0;
let upTotal = 0;
- docs.forEach(function (doc) {
+ docs.forEach((doc) => {
downTotal += Number(doc.dn);
upTotal += Number(doc.up);
});
diff --git a/server/models/Torrent.js b/server/models/Torrent.js
index fced17fa..1f72ce1b 100644
--- a/server/models/Torrent.js
+++ b/server/models/Torrent.js
@@ -201,7 +201,7 @@ class Torrent {
let trackers = clientData.trackers.split('@!@');
let trackerDomains = [];
- trackers.forEach(function (tracker) {
+ trackers.forEach((tracker) => {
let domain = regEx.domainName.exec(tracker);
if (domain && domain[1]) {
diff --git a/server/models/client.js b/server/models/client.js
index a2f4044d..5d4b5501 100644
--- a/server/models/client.js
+++ b/server/models/client.js
@@ -17,7 +17,7 @@ let _torrentCollection = new TorrentCollection();
let _trackerCount = {};
var client = {
- addFiles: function(req, callback) {
+ addFiles: (req, callback) => {
let files = req.files;
let path = req.body.destination;
let request = new ClientRequest();
@@ -34,7 +34,7 @@ var client = {
// Set the callback for only the last request.
if (index === files.length - 1) {
- fileRequest.onComplete(function (data) {
+ fileRequest.onComplete((data) => {
callback(data);
});
}
@@ -43,7 +43,7 @@ var client = {
});
},
- addUrls: function(data, callback) {
+ addUrls: (data, callback) => {
let urls = data.urls;
let path = data.destination;
let request = new ClientRequest();
@@ -54,7 +54,7 @@ var client = {
request.send();
},
- deleteTorrents: function(hashes, callback) {
+ deleteTorrents: (hashes, callback) => {
let request = new ClientRequest();
request.add('removeTorrents', {hashes});
@@ -62,15 +62,15 @@ var client = {
request.send();
},
- getTorrentStatusCount: function(callback) {
+ getTorrentStatusCount: (callback) => {
callback(_statusCount);
},
- getTorrentTrackerCount: function(callback) {
+ getTorrentTrackerCount: (callback) => {
callback(_trackerCount);
},
- getTorrentDetails: function(hash, callback) {
+ getTorrentDetails: (hash, callback) => {
let request = new ClientRequest();
request.add('getTorrentDetails', {
@@ -84,12 +84,12 @@ var client = {
request.send();
},
- getTorrentList: function(callback) {
+ getTorrentList: (callback) => {
let request = new ClientRequest();
request.add('getTorrentList',
{props: clientUtil.defaults.torrentPropertyMethods});
- request.postProcess(function(data) {
+ request.postProcess((data) => {
// TODO: Remove this nasty nested array business.
_torrentCollection.updateTorrents(data[0][0]);
_statusCount = _torrentCollection.statusCount;
@@ -101,7 +101,7 @@ var client = {
request.send();
},
- listMethods: function(method, args, callback) {
+ listMethods: (method, args, callback) => {
let request = new ClientRequest();
request.add('listMethods', {method, args});
@@ -109,7 +109,7 @@ var client = {
request.send();
},
- moveTorrents: function(data, callback) {
+ moveTorrents: (data, callback) => {
let destinationPath = data.destination;
let hashes = data.hashes;
let filenames = data.filenames;
@@ -117,21 +117,21 @@ var client = {
let sourcePaths = data.sources;
let mainRequest = new ClientRequest();
- let startTorrents = function() {
+ let startTorrents = () => {
let startTorrentsRequest = new ClientRequest();
startTorrentsRequest.add('startTorrents', {hashes});
startTorrentsRequest.onComplete(callback);
startTorrentsRequest.send();
};
- let checkHash = function() {
+ let checkHash = () => {
let checkHashRequest = new ClientRequest();
checkHashRequest.add('checkHash', {hashes});
checkHashRequest.onComplete(afterCheckHash);
checkHashRequest.send();
}
- let moveTorrents = function () {
+ let moveTorrents = () => {
let moveTorrentsRequest = new ClientRequest();
moveTorrentsRequest.onComplete(checkHash);
moveTorrentsRequest.add('moveTorrents',
@@ -151,7 +151,7 @@ var client = {
mainRequest.send();
},
- setFilePriority: function (hashes, data, callback) {
+ setFilePriority: (hashes, data, callback) => {
// TODO Add support for multiple hashes.
let fileIndex = data.fileIndices[0];
let request = new ClientRequest();
@@ -161,7 +161,7 @@ var client = {
request.send();
},
- setPriority: function (hashes, data, callback) {
+ setPriority: (hashes, data, callback) => {
let request = new ClientRequest();
request.add('setPriority', {hashes, priority: data.priority});
@@ -169,7 +169,7 @@ var client = {
request.send();
},
- setSpeedLimits: function(data, callback) {
+ setSpeedLimits: (data, callback) => {
let request = new ClientRequest();
request.add('setThrottle',
@@ -178,7 +178,7 @@ var client = {
request.send();
},
- stopTorrent: function(hashes, callback) {
+ stopTorrent: (hashes, callback) => {
let request = new ClientRequest();
request.add('stopTorrents', {hashes});
@@ -186,7 +186,7 @@ var client = {
request.send();
},
- startTorrent: function(hashes, callback) {
+ startTorrent: (hashes, callback) => {
let request = new ClientRequest();
request.add('startTorrents', {hashes});
@@ -194,7 +194,7 @@ var client = {
request.send();
},
- getTransferStats: function(callback) {
+ getTransferStats: (callback) => {
let request = new ClientRequest();
request.add('getTransferData');
diff --git a/server/models/history.js b/server/models/history.js
index 164266c0..882f35f4 100644
--- a/server/models/history.js
+++ b/server/models/history.js
@@ -60,7 +60,7 @@ let fiveMinSnapshot = new HistoryEra({
nextEra: thirtyMinSnapshot
});
-let processData = function (opts, callback, data, error) {
+let processData = (opts, callback, data, error) => {
if (error) {
callback(null, error);
return;
@@ -71,7 +71,7 @@ let processData = function (opts, callback, data, error) {
let downloadRateHistory = [];
let uploadRateHistory = [];
- data.forEach(function (snapshot) {
+ data.forEach((snapshot) => {
downloadRateHistory.push(snapshot.dn);
uploadRateHistory.push(snapshot.up);
});
@@ -83,7 +83,7 @@ let processData = function (opts, callback, data, error) {
};
let history = {
- get: function (opts, callback) {
+ get: (opts, callback) => {
opts = opts || {};
if (opts.snapshot === 'fiveMin') {
@@ -103,9 +103,9 @@ let history = {
}
},
- startPolling: function () {
- pollInterval = setInterval(function() {
- client.getTransferStats(function (data, err) {
+ startPolling: () => {
+ pollInterval = setInterval(() => {
+ client.getTransferStats((data, err) => {
if (err) {
return;
}
@@ -118,7 +118,7 @@ let history = {
}, 1000 * 5);
},
- stopPolling: function() {
+ stopPolling: () => {
clearInterval(pollInterval);
pollInterval = null;
}
diff --git a/server/routes/index.js b/server/routes/index.js
index b3742132..6c41be99 100644
--- a/server/routes/index.js
+++ b/server/routes/index.js
@@ -9,8 +9,8 @@ var history = require('../models/history');
history.startPolling();
passport.use(new Strategy(
- function(username, password, callback) {
- users.findByUsername(username, function(err, user) {
+ (username, password, callback) => {
+ users.findByUsername(username, (err, user) => {
if (err) { return callback(err); }
if (!user) { return callback(null, false); }
if (user.password != password) { return callback(null, false); }
@@ -20,7 +20,7 @@ passport.use(new Strategy(
));
router.get('/', passport.authenticate('basic', { session: false }),
- function(req, res) {
+ (req, res) => {
res.render('index', { title: 'Flood' });
// res.json({ username: req.user.username, email: req.user.emails[0].value });
}
diff --git a/server/routes/ui.js b/server/routes/ui.js
index 61f08f08..0c13cbf1 100644
--- a/server/routes/ui.js
+++ b/server/routes/ui.js
@@ -9,19 +9,19 @@ let client = require('../models/client');
let history = require('../models/history');
let uiSettings = require('../models/uiSettings');
-router.post('/sort-props', function(req, res, next) {
+router.post('/sort-props', (req, res, next) => {
uiSettings.setSortProps(req.body, ajaxUtil.getResponseFn(res));
});
-router.get('/sort-props', function(req, res, next) {
+router.get('/sort-props', (req, res, next) => {
uiSettings.getSortProps(ajaxUtil.getResponseFn(res));
});
-router.get('/torrent-location', function(req, res, next) {
+router.get('/torrent-location', (req, res, next) => {
uiSettings.getLatestTorrentLocation(ajaxUtil.getResponseFn(res));
});
-router.post('/torrent-location', function(req, res, next) {
+router.post('/torrent-location', (req, res, next) => {
uiSettings.setLatestTorrentLocation(req.body, ajaxUtil.getResponseFn(res));
});
diff --git a/server/util/ajaxUtil.js b/server/util/ajaxUtil.js
index e0691cb4..fe7c2a59 100644
--- a/server/util/ajaxUtil.js
+++ b/server/util/ajaxUtil.js
@@ -1,8 +1,8 @@
'use strict';
let ajaxUtil = {
- getResponseFn: function (res) {
- return function (data, error) {
+ getResponseFn: (res) => {
+ return (data, error) => {
if (error) {
res.status(500).json(error);
return;
diff --git a/server/util/clientResponseUtil.js b/server/util/clientResponseUtil.js
index 01b63bcc..826118ac 100644
--- a/server/util/clientResponseUtil.js
+++ b/server/util/clientResponseUtil.js
@@ -4,7 +4,7 @@ let clientUtil = require('./clientUtil');
let util = require('util');
let clientResponseUtil = {
- processTorrentDetails: function(data) {
+ processTorrentDetails: (data) => {
// TODO: This is ugly.
let peersData = data[0][0] || null;
let filesData = data[1][0] || null;
@@ -26,7 +26,7 @@ let clientResponseUtil = {
filesData
);
- files = files.map(function (file) {
+ files = files.map((file) => {
file.filename = file.pathComponents[file.pathComponents.length - 1];
file.percentComplete = (file.completedChunks / file.sizeChunks * 100).toFixed(0);
delete(file.completedChunks);
@@ -45,7 +45,7 @@ let clientResponseUtil = {
return {peers, files, trackers};
},
- processTransferStats: function(data) {
+ processTransferStats: (data) => {
return clientUtil.mapClientProps(clientUtil.defaults.clientProperties,
data);
}
diff --git a/server/util/clientUtil.js b/server/util/clientUtil.js
index aabd8257..ae153297 100644
--- a/server/util/clientUtil.js
+++ b/server/util/clientUtil.js
@@ -220,7 +220,7 @@ var clientUtil = {
},
// TODO clean this up, write comments...
- mapClientProps: function(props, data, includeIndex) {
+ mapClientProps: (props, data, includeIndex) => {
var index = 0;
var mappedObject = [];
@@ -243,7 +243,7 @@ var clientUtil = {
return mappedObject;
},
- createMulticallRequest: function(methodCalls, params) {
+ createMulticallRequest: (methodCalls, params) => {
params = params || [];
var methodCall = [];
diff --git a/server/util/dateFormatter.js b/server/util/dateFormatter.js
index a11d00fb..cced3fb8 100644
--- a/server/util/dateFormatter.js
+++ b/server/util/dateFormatter.js
@@ -4,7 +4,7 @@
* ISO8601 formatted strings. Accepts formats with and without
* hyphen/colon separators and correctly parses zoning info.
*/
-var DateFormatter = function (opts) {
+var DateFormatter = (opts) => {
this.opts = {}
this.setOpts(opts)
}
@@ -49,11 +49,11 @@ DateFormatter.ISO8601 = new RegExp(
* @param {Boolean} opts.offset - Enable/Disable output of UTC offset
* (default: false)
*/
-DateFormatter.prototype.setOpts = function (opts) {
+DateFormatter.prototype.setOpts = (opts) => {
if (!opts) opts = DateFormatter.DEFAULT_OPTIONS
var ctx = this;
- Object.keys(DateFormatter.DEFAULT_OPTIONS).forEach(function (k) {
+ Object.keys(DateFormatter.DEFAULT_OPTIONS).forEach((k) => {
ctx.opts[k] = opts.hasOwnProperty(k) ?
opts[k] : DateFormatter.DEFAULT_OPTIONS[k]
})
@@ -66,7 +66,7 @@ DateFormatter.prototype.setOpts = function (opts) {
* @param {String} time - String representation of timestamp.
* @return {Date} - Date object from timestamp.
*/
-DateFormatter.prototype.decodeIso8601 = function(time) {
+DateFormatter.prototype.decodeIso8601 = (time) => {
var dateParts = time.toString().match(DateFormatter.ISO8601)
if (!dateParts) {
throw new Error('Expected a ISO8601 datetime but got \'' + time + '\'')
@@ -98,7 +98,7 @@ DateFormatter.prototype.decodeIso8601 = function(time) {
* @param {Date} date - Date object.
* @return {String} - String representation of timestamp.
*/
-DateFormatter.prototype.encodeIso8601 = function(date) {
+DateFormatter.prototype.encodeIso8601 = (date) => {
var parts = this.opts.local ?
DateFormatter.getLocalDateParts(date) :
DateFormatter.getUTCDateParts(date)
@@ -120,7 +120,7 @@ DateFormatter.prototype.encodeIso8601 = function(date) {
* @param {Date} date - Date Object
* @return {String[]}
*/
-DateFormatter.getUTCDateParts = function (date) {
+DateFormatter.getUTCDateParts = (date) => {
return [
date.getUTCFullYear()
, DateFormatter.zeroPad(date.getUTCMonth()+1,2)
@@ -139,7 +139,7 @@ DateFormatter.getUTCDateParts = function (date) {
* @param {Date} date - Date Object
* @return {String[]}
*/
-DateFormatter.getLocalDateParts = function (date) {
+DateFormatter.getLocalDateParts = (date) => {
return [
date.getFullYear()
, DateFormatter.zeroPad(date.getMonth()+1,2)
@@ -159,7 +159,7 @@ DateFormatter.getLocalDateParts = function (date) {
* already length.
* @return {String} - String with the padded digit
*/
-DateFormatter.zeroPad = function (digit, length) {
+DateFormatter.zeroPad = (digit, length) => {
var padded = '' + digit
while (padded.length < length) {
padded = '0' + padded
@@ -174,7 +174,7 @@ DateFormatter.zeroPad = function (digit, length) {
*
* @return {String} - in the format /Z|[+-]\d{2}:\d{2}/
*/
-DateFormatter.formatCurrentOffset = function (d) {
+DateFormatter.formatCurrentOffset = (d) => {
var offset = (d || new Date()).getTimezoneOffset()
return (offset === 0) ? 'Z' : [
(offset < 0) ? '+' : '-'
diff --git a/server/util/formatUtil.js b/server/util/formatUtil.js
index b189ff5a..b0200284 100644
--- a/server/util/formatUtil.js
+++ b/server/util/formatUtil.js
@@ -1,20 +1,20 @@
var util = require('util');
var FormatUtil = {
- percentComplete: function(numerator, denominator) {
+ percentComplete: (numerator, denominator) => {
},
- eta: function(rate, completed, total) {
-
+ eta: (rate, completed, total) => {
+
},
- parsePeers: function(string) {
+ parsePeers: (string) => {
var markerPosition = string.indexOf('@!@');
return string.substr(0, markerPosition);
},
- status: function(isHashChecking, isComplete, isOpen, uploadRate, downloadRate, state, message) {
+ status: (isHashChecking, isComplete, isOpen, uploadRate, downloadRate, state, message) => {
var torrentStatus = [];
if (isHashChecking === '1') {
diff --git a/server/util/scgi.js b/server/util/scgi.js
index 5b0b89a5..9c545dda 100644
--- a/server/util/scgi.js
+++ b/server/util/scgi.js
@@ -8,7 +8,7 @@ let Serializer = require('xmlrpc/lib/serializer');
let config = require('../../config');
let scgi = {
- methodCall: function(methodName, parameters) {
+ methodCall: (methodName, parameters) => {
let deferred = Q.defer();
let deserializer = new Deserializer('utf8');
let headerLength = 0;
@@ -19,7 +19,7 @@ let scgi = {
stream.setEncoding('UTF8');
// TODO: Remove this debugging info.
- stream.on('error', function(error) {
+ stream.on('error', () => {
console.trace(error);
});
@@ -28,19 +28,19 @@ let scgi = {
`SCGI${nullChar}1${nullChar}`
];
- headerItems.forEach(function (item) {
+ headerItems.forEach((item) => {
headerLength += item.length;
});
let header = `${headerLength}:`;
- headerItems.forEach(function(headerItem) {
+ headerItems.forEach((headerItem) => {
header += headerItem;
});
stream.write(`${header},${xml}`);
- deserializer.deserializeMethodResponse(stream, function (error, response) {
+ deserializer.deserializeMethodResponse(stream, (error, response) => {
if (error) {
return deferred.reject(error);
}
diff --git a/shared/util/stringUtil.js b/shared/util/stringUtil.js
index 9124d43f..7d465607 100644
--- a/shared/util/stringUtil.js
+++ b/shared/util/stringUtil.js
@@ -1,11 +1,11 @@
'use strict';
let stringUtil = {
- capitalize: function (string) {
+ capitalize: (string) => {
return string.charAt(0).toUpperCase() + string.slice(1);
},
- pluralize: function (string, count) {
+ pluralize: (string, count) => {
if (count !== 1) {
if (string.charAt(string.length - 1) === 'y') {
return `${string.substring(0, string.length - 1)}ies`;