diff --git a/.gitignore b/.gitignore
index e2764155..ccc6d15f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,4 +18,6 @@ logs/server.log
.goreleaser.yml
config.toml.backup
/public/static/js/kickwebsocket.js.backup
+/public/static/js/kickwebsocket-generated.js
+clientAuth.txt
dist
\ No newline at end of file
diff --git a/README.md b/README.md
index a82e6459..1a67b46c 100644
--- a/README.md
+++ b/README.md
@@ -38,6 +38,12 @@ Image of the frontend UI
- [X] Global Rate Limiting for Upload/Download Speed
- [X] Add torrents from watch folder (cron job every 5 minutes)
+
+ - [X] Authentication from client to server (done via JWT, will add functionality for 3rd party clients later)
+
+ - [X] Reverse Proxy Support with SSL upgrade added (with provided config for nginx)
+
+ - [X] Mostly generated client config from toml.config on first run
- [ ] Unit testing completed for a large portion of the package
@@ -49,7 +55,6 @@ Image of the frontend UI
- [ ] Ability to view TOML settings from WebUI (and perhaps change a few as well)
- - [ ] Authentication from client to server
- Late 2018
diff --git a/config.toml b/config.toml
index 72bcdb96..3fc5d9d0 100644
--- a/config.toml
+++ b/config.toml
@@ -1,12 +1,12 @@
-
[serverConfig]
ServerPort = ":8000" #leave format as is it expects a string with colon
ServerAddr = "" #blank will bind to default IP address, usually fine to leave be
- LogLevel = "Warn" # Options = Debug, Info, Warn, Error, Fatal, Panic
- LogOutput = "file" #Options = file, stdout #file will print it to logs/server.log
+ LogLevel = "Debug" # Options = Debug, Info, Warn, Error, Fatal, Panic
+ LogOutput = "stdout" #Options = file, stdout #file will print it to logs/server.log
SeedRatioStop = 1.50 #automatically stops the torrent after it reaches this seeding ratio
+
#Relative or absolute path accepted, the server will convert any relative path to an absolute path.
DefaultMoveFolder = 'downloaded' #default path that a finished torrent is symlinked to after completion. Torrents added via RSS will default here
TorrentWatchFolder = 'torrentUpload' #folder path that is watched for .torrent files and adds them automatically every 5 minutes
@@ -17,18 +17,30 @@
DownloadRateLimit = "Unlimited"
+
[notifications]
PushBulletToken = "" #add your pushbullet api token here to notify of torrent completion to pushbullet
+[goTorrentWebUI]
+ #Here you can set a basic HTTP login set of credentials
+ WebUIAuth = true # bool, if false no authentication is required for the webUI
+ WebUIUser = "admin"
+ WebUIPassword = "Password"
+
+
+[reverseProxy]
+ #This is for setting up goTorrent behind a reverse Proxy (with SSL, reverse proxy with no SSL will require editing the WSS connection to a WS connection manually)
+ ProxyEnabled = false #bool, either false or true
+ BaseURL = "yoursubdomain.domain.org/subroute/" # MUST be in the format (if you have a subdomain, and must have trailing slash) "yoursubdomain.domain.org/subroute/"
+
[EncryptionPolicy]
DisableEncryption = false
ForceEncryption = false
PreferNoEncryption = true
-
[torrentClientConfig]
DownloadDir = 'downloading' #the full OR relative path where the torrent server stores in-progress torrents
@@ -37,6 +49,9 @@
# Never send chunks to peers.
NoUpload = false #boolean
+ #User-provided Client peer ID. If not present, one is generated automatically.
+ PeerID = "" #string
+
#The address to listen for new uTP and TCP bittorrent protocol connections. DHT shares a UDP socket with uTP unless configured otherwise.
ListenAddr = "" #Leave Blank for default, syntax "HOST:PORT"
@@ -48,9 +63,6 @@
# Don't create a DHT.
NoDHT = false #boolean
- #User-provided Client peer ID. If not present, one is generated automatically.
- PeerID = "" #string
-
#For the bittorrent protocol.
DisableUTP = false #bool
diff --git a/dist-specific-files/Linux-systemd/ReverseProxy/nginx.conf b/dist-specific-files/Linux-systemd/ReverseProxy/nginx.conf
new file mode 100644
index 00000000..fc83cf38
--- /dev/null
+++ b/dist-specific-files/Linux-systemd/ReverseProxy/nginx.conf
@@ -0,0 +1,12 @@
+location ^~ /gotorrent/ {
+ proxy_pass http://192.168.1.100:8000/;
+ proxy_redirect http:// https://;
+ proxy_pass_header Server;
+ proxy_set_header Host $http_host;
+ proxy_set_header X-Real-IP $http_address;
+ proxy_set_header X-Scheme $scheme;
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "Upgrade";
+
+}
diff --git a/engine/authentication_helper.go b/engine/authentication_helper.go
new file mode 100644
index 00000000..a39b1889
--- /dev/null
+++ b/engine/authentication_helper.go
@@ -0,0 +1,60 @@
+package engine
+
+import (
+ "crypto/rand"
+ "math/big"
+
+ "github.com/dgrijalva/jwt-go"
+ "github.com/sirupsen/logrus"
+)
+
+type AuthRequest struct {
+ MessageType string `json:"MessageType"`
+ AuthString string `json:"AuthString"`
+}
+
+//GoTorrentClaims stores the name of the client (usually user entered) and any standard jwt claims we want to define
+type GoTorrentClaims struct {
+ ClientName string `json:"clientName"`
+ jwt.StandardClaims
+}
+
+//GenerateToken creates a signed token for a client to use to communicate with the server
+func GenerateToken(claims GoTorrentClaims, signingKey []byte) string {
+ token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
+ signedString, err := token.SignedString(signingKey)
+ if err != nil {
+ Logger.WithFields(logrus.Fields{"error": err}).Fatal("Error signing authentication Token!")
+ }
+ return signedString
+
+}
+
+//GenerateSigningKey creates a random key that will be used for JSON Web Token authentication
+func GenerateSigningKey() []byte {
+ keyString, err := generateRandomASCIIString(24)
+ key := []byte(keyString)
+ if err != nil {
+ Logger.WithFields(logrus.Fields{"error": err}).Fatal("Error generating signing key!")
+ }
+ return key
+}
+
+func generateRandomASCIIString(length int) (string, error) {
+ result := ""
+ for {
+ if len(result) >= length {
+ return result, nil
+ }
+ num, err := rand.Int(rand.Reader, big.NewInt(int64(127)))
+ if err != nil {
+ return "", err
+ }
+ n := num.Int64()
+ // Make sure that the number/byte/letter is inside
+ // the range of printable ASCII characters (excluding space and DEL)
+ if n > 32 && n < 127 {
+ result += string(n)
+ }
+ }
+}
diff --git a/engine/clientConnectGenerate.go b/engine/clientConnectGenerate.go
new file mode 100644
index 00000000..db7870fa
--- /dev/null
+++ b/engine/clientConnectGenerate.go
@@ -0,0 +1,50 @@
+package engine
+
+import (
+ "io/ioutil"
+ "os"
+)
+
+var (
+ baseFile = `
+ var authMessage = {
+ MessageType: "authRequest",
+ Payload: [ClientAuthString]
+ }
+
+ var kickStart = {
+ MessageType: "torrentListRequest"
+ }
+
+ ws.onopen = function()
+ {
+ ws.send(JSON.stringify(authMessage));
+ console.log("Sending authentication message...", JSON.stringify(authMessage))
+ ws.send(JSON.stringify(kickStart)); //sending out the first ping
+ console.log("Kicking off websocket to server.....", JSON.stringify(kickStart))
+ };`
+)
+
+//GenerateClientConfigFile runs at first run (no db client detected) to generate a js file for connecting
+func GenerateClientConfigFile(config FullClientSettings, authString string) {
+ os.Remove("public/static/js/kickwebsocket-generated.js")
+ var clientFile string
+ if config.UseProxy {
+ clientFile = `
+ ClientAuthString = "` + authString + `"
+
+ var ws = new WebSocket("wss://` + config.BaseURL + `websocket")
+ ` + baseFile
+ } else {
+ clientFile = `
+ IP = "` + config.HTTPAddrIP + `"
+ Port = "` + config.WebsocketClientPort + `"
+ ClientAuthString = "` + authString + `"
+
+ var ws = new WebSocket(` + "`" + `ws://${IP}:${Port}/websocket` + "`" + `); //creating websocket
+ ` + baseFile
+
+ }
+ clientFileBytes := []byte(clientFile)
+ ioutil.WriteFile("public/static/js/kickwebsocket-generated.js", clientFileBytes, 0755)
+}
diff --git a/engine/clientStructs.go b/engine/clientStructs.go
index 60c3b2e0..1c87a0df 100644
--- a/engine/clientStructs.go
+++ b/engine/clientStructs.go
@@ -41,7 +41,7 @@ type RSSFeedsNames struct {
}
//TorrentList struct contains the torrent list that is sent to the client
-type TorrentList struct { //helps create the JSON structure that react expects to recieve
+type TorrentList struct { //helps create the JSON structure that react expects to receive
MessageType string `json:"MessageType"`
Totaltorrents int `json:"total"`
ClientDBstruct []ClientDB `json:"data"`
diff --git a/engine/settings.go b/engine/settings.go
index f87b8c85..38371c6b 100644
--- a/engine/settings.go
+++ b/engine/settings.go
@@ -3,6 +3,7 @@ package engine
import (
"fmt"
"path/filepath"
+ "strings"
"golang.org/x/time/rate"
@@ -14,16 +15,20 @@ import (
//FullClientSettings contains all of the settings for our entire application
type FullClientSettings struct {
- LoggingLevel logrus.Level
- LoggingOutput string
- HTTPAddr string
- Version int
- TorrentConfig torrent.Config
- TFileUploadFolder string
- SeedRatioStop float64
- PushBulletToken string
- DefaultMoveFolder string
- TorrentWatchFolder string
+ LoggingLevel logrus.Level
+ LoggingOutput string
+ HTTPAddr string
+ HTTPAddrIP string
+ UseProxy bool
+ WebsocketClientPort string
+ BaseURL string
+ Version int
+ TorrentConfig torrent.Config
+ TFileUploadFolder string
+ SeedRatioStop float64
+ PushBulletToken string
+ DefaultMoveFolder string
+ TorrentWatchFolder string
}
//default is called if there is a parsing error
@@ -98,9 +103,17 @@ func FullClientSettingsNew() FullClientSettings {
}
var httpAddr string
+ var baseURL string
+ var websocketClientPort string
httpAddrIP := viper.GetString("serverConfig.ServerAddr")
httpAddrPort := viper.GetString("serverConfig.ServerPort")
+ proxySet := viper.GetBool("reverseProxy.ProxyEnabled")
+ websocketClientPort = strings.TrimLeft(viper.GetString("serverConfig.ServerPort"), ":") //Trimming off the colon in front of the port
+ if proxySet {
+ baseURL = viper.GetString("reverseProxy.BaseURL")
+ fmt.Println("WebsocketClientPort", viper.GetString("serverConfig.ServerPort"))
+ }
seedRatioStop := viper.GetFloat64("serverConfig.SeedRatioStop")
httpAddr = httpAddrIP + httpAddrPort
pushBulletToken := viper.GetString("notifications.PushBulletToken")
@@ -192,15 +205,19 @@ func FullClientSettingsNew() FullClientSettings {
}
Config := FullClientSettings{
- LoggingLevel: logLevel,
- LoggingOutput: logOutput,
- SeedRatioStop: seedRatioStop,
- HTTPAddr: httpAddr,
- TorrentConfig: tConfig,
- TFileUploadFolder: "uploadedTorrents",
- PushBulletToken: pushBulletToken,
- DefaultMoveFolder: defaultMoveFolderAbs,
- TorrentWatchFolder: torrentWatchFolderAbs,
+ LoggingLevel: logLevel,
+ LoggingOutput: logOutput,
+ SeedRatioStop: seedRatioStop,
+ HTTPAddr: httpAddr,
+ HTTPAddrIP: httpAddrIP,
+ UseProxy: proxySet,
+ WebsocketClientPort: websocketClientPort,
+ TorrentConfig: tConfig,
+ BaseURL: baseURL,
+ TFileUploadFolder: "uploadedTorrents",
+ PushBulletToken: pushBulletToken,
+ DefaultMoveFolder: defaultMoveFolderAbs,
+ TorrentWatchFolder: torrentWatchFolderAbs,
}
return Config
diff --git a/goTorrentWebUI/src/app.jsx b/goTorrentWebUI/src/app.jsx
index e87885a9..fc6b9b9a 100644
--- a/goTorrentWebUI/src/app.jsx
+++ b/goTorrentWebUI/src/app.jsx
@@ -18,6 +18,8 @@ import LeftMenu from './leftMenu/leftMenu';
import TorrentList from './torrentlist';
//Notification Element
import Notifications from './notifications';
+//Login Box
+import Login from './login';
@@ -65,6 +67,7 @@ class BasicLayout extends React.PureComponent {
render() {
return [
+ ,
,
diff --git a/goTorrentWebUI/src/login.js b/goTorrentWebUI/src/login.js
new file mode 100644
index 00000000..a28ad67a
--- /dev/null
+++ b/goTorrentWebUI/src/login.js
@@ -0,0 +1,113 @@
+import React from 'react';
+import ReactDOM from 'react-dom';
+import Button from 'material-ui/Button';
+import TextField from 'material-ui/TextField';
+import { withStyles } from 'material-ui/styles';
+import PropTypes from 'prop-types';
+import Dialog, {
+ DialogActions,
+ DialogContent,
+ DialogContentText,
+ DialogTitle,
+} from 'material-ui/Dialog';
+import InsertLinkIcon from 'material-ui-icons/Link';
+import ReactTooltip from 'react-tooltip'
+import Icon from 'material-ui/Icon';
+import IconButton from 'material-ui/IconButton';
+
+
+let Loggedin = false
+
+const button = {
+ fontSize: '60px',
+ marginRight: '20px',
+}
+
+const inlineStyle = {
+ display: 'inline-block',
+ backdrop: 'static',
+}
+
+const errorStyle = {
+ color: 'red',
+}
+
+export default class Login extends React.Component {
+
+ state = {
+ open: false,
+ username: "",
+ password: "",
+ wrongPasswordMessage: "",
+
+ };
+
+
+ componentWillMount = () => {
+ if ((LoginRequired) && (Loggedin == false)) {
+ this.setState({open: true})
+ Loggedin = true
+ }
+ }
+
+ handleSubmit = () => {
+ //this.setState({ open: false });
+ //let magnetLinkSubmit = this.state.textValue;
+ console.log("Attempting authentication")
+ if ((this.state.username == ClientUsername) && (this.state.password == ClientPassword)) {
+ this.setState({ open: false, username: "", password: "" });
+ } else {
+ this.setState({wrongPasswordMessage: "Wrong Username/Password!", username: "", password: "" })
+ }
+ //this.setState({magnetLinkValue: ""}, {torrentLabel: ""}, {storageValue: ``})
+ }
+
+ handleRequestClose = () => {
+ ws.close()
+ }
+
+ setUserNameValue = (event) => {
+ this.setState({username: event.target.value});
+ }
+
+ setPasswordValue = (event) => {
+ this.setState({password: event.target.value})
+ }
+
+ render() {
+ const { classes, onRequestClose, handleRequestClose, handleSubmit } = this.props;
+ return (
+
+ );
+ }
+};
diff --git a/main.go b/main.go
index c8c88800..ac68ae74 100644
--- a/main.go
+++ b/main.go
@@ -6,7 +6,6 @@ import (
"fmt"
"html/template"
"io/ioutil"
-
"net/http"
"os"
"path/filepath"
@@ -18,6 +17,8 @@ import (
"github.com/asdine/storm"
Engine "github.com/deranjer/goTorrent/engine"
Storage "github.com/deranjer/goTorrent/storage"
+ jwt "github.com/dgrijalva/jwt-go"
+ "github.com/gorilla/handlers"
"github.com/gorilla/mux"
"github.com/gorilla/websocket"
"github.com/mmcdole/gofeed"
@@ -35,8 +36,9 @@ type SingleRSSFeedMessage struct { //TODO had issues with getting this to work w
var (
//Logger does logging for the entire project
- Logger = logrus.New()
- APP_ID = os.Getenv("APP_ID")
+ Logger = logrus.New()
+ Authenticated = false //to verify if user is authenticated, this is stored here
+ APP_ID = os.Getenv("APP_ID")
)
var upgrader = websocket.Upgrader{
@@ -49,6 +51,34 @@ func serveHome(w http.ResponseWriter, r *http.Request) {
s1.ExecuteTemplate(w, "base", map[string]string{"APP_ID": APP_ID})
}
+func handleAuthentication(conn *websocket.Conn, db *storm.DB) {
+ msg := Engine.Message{}
+ err := conn.ReadJSON(&msg)
+ if err != nil {
+ Logger.WithFields(logrus.Fields{"error": err, "SuppliedToken": msg.Payload[0]}).Error("Unable to read authentication message")
+ }
+ authString := msg.Payload[0] //First element will be the auth request
+ fmt.Println("Authstring", authString)
+ signingKeyStruct := Storage.FetchJWTTokens(db)
+ singingKey := signingKeyStruct.SigningKey
+ token, err := jwt.Parse(authString, func(token *jwt.Token) (interface{}, error) {
+ if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
+ return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
+ }
+ return singingKey, nil
+ })
+ if err != nil {
+ Logger.WithFields(logrus.Fields{"error": err, "SuppliedToken": token}).Error("Unable to parse token!")
+ conn.Close()
+ }
+ if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
+ fmt.Println("Claims", claims["ClientName"], claims["Issuer"])
+ Authenticated = true
+ } else {
+ Logger.WithFields(logrus.Fields{"error": err}).Error("Authentication Error occured, cannot complete!")
+ }
+}
+
func main() {
Engine.Logger = Logger //Injecting the logger into all the packages
Storage.Logger = Logger
@@ -92,6 +122,34 @@ func main() {
}
defer db.Close() //defering closing the database until the program closes
+ tokens := Storage.IssuedTokensList{} //if first run setting up the authentication tokens
+ err = db.One("ID", 3, &tokens)
+ if err != nil {
+ Logger.WithFields(logrus.Fields{"RSSFeedStore": tokens, "error": err}).Info("No Tokens database found, assuming first run, generating token...")
+ fmt.Println("Error", err)
+ fmt.Println("MAIN TOKEN: %+v\n", tokens)
+ tokens.ID = 3 //creating the initial store
+ claims := Engine.GoTorrentClaims{
+ "goTorrentWebUI",
+ jwt.StandardClaims{
+ Issuer: "goTorrentServer",
+ },
+ }
+ signingkey := Engine.GenerateSigningKey() //Running this will invalidate any certs you already issued!!
+ fmt.Println("SigningKey", signingkey)
+ authString := Engine.GenerateToken(claims, signingkey)
+ tokens.SigningKey = signingkey
+ fmt.Println("ClientToken: ", authString)
+ Engine.GenerateClientConfigFile(Config, authString) //if first run generate the client config file
+
+ tokens.TokenNames = append(tokens.TokenNames, Storage.SingleToken{"firstClient"})
+ err := ioutil.WriteFile("clientAuth.txt", []byte(authString), 0755)
+ if err != nil {
+ Logger.WithFields(logrus.Fields{"error": err}).Warn("Unable to write client auth to file..")
+ }
+ db.Save(&tokens) //Writing all of that to the database
+ }
+
cronEngine := Engine.InitializeCronEngine() //Starting the cron engine for tasks
Logger.Debug("Cron Engine Initialized...")
@@ -112,11 +170,13 @@ func main() {
Engine.CheckTorrentWatchFolder(cronEngine, db, tclient, torrentLocalStorage, Config)
Engine.RefreshRSSCron(cronEngine, db, tclient, torrentLocalStorage, Config) // Refresing the RSS feeds on an hourly basis to add torrents that show up in the RSS feed
- router := mux.NewRouter() //setting up the handler for the web backend
+ router := mux.NewRouter() //setting up the handler for the web backend
+ //reverseProxy := handlers.ProxyHeaders(router) //handlers.ProxyHeaders(router) //TODO pull this from the config file
router.HandleFunc("/", serveHome) //Serving the main page for our SPA
- http.Handle("/static/", http.FileServer(http.Dir("public")))
+ //http.Handle("/static/", http.FileServer(http.Dir("public")))
+ router.PathPrefix("/static/").Handler(http.FileServer(http.Dir("public")))
http.Handle("/", router)
- http.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) { //exposing the data to the
+ router.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) { //exposing the data to the
TorrentLocalArray = Storage.FetchAllStoredTorrents(db)
RunningTorrentArray = Engine.CreateRunningTorrentArray(tclient, TorrentLocalArray, PreviousTorrentArray, Config, db) //Updates the RunningTorrentArray with the current client data as well
var torrentlistArray = new(Engine.TorrentList)
@@ -127,15 +187,21 @@ func main() {
w.Header().Set("Content-Type", "application/json")
w.Write(torrentlistArrayJSON)
})
- http.HandleFunc("/websocket", func(w http.ResponseWriter, r *http.Request) { //websocket is the main data pipe to the frontend
+
+ router.HandleFunc("/websocket", func(w http.ResponseWriter, r *http.Request) { //websocket is the main data pipe to the frontend
conn, err := upgrader.Upgrade(w, r, nil)
defer conn.Close() //defer closing the websocket until done.
if err != nil {
Logger.WithFields(logrus.Fields{"error": err}).Fatal("Unable to create websocket!")
return
}
- Engine.Conn = conn //Injecting the conn variable into the other packages
- Storage.Conn = conn
+ if Authenticated != true {
+ handleAuthentication(conn, db)
+ } else { //If we are authenticated inject the connection into the other packages
+ fmt.Println("Authenticated... continue")
+ Engine.Conn = conn
+ Storage.Conn = conn
+ }
MessageLoop: //Tagging this so we can continue out of it with any errors we encounter that are failing
for {
runningTorrents := tclient.Torrents() //getting running torrents here since multiple cases ask for the running torrents
@@ -148,6 +214,13 @@ func main() {
}
Logger.WithFields(logrus.Fields{"message": msg}).Debug("Message From Client")
switch msg.MessageType { //first handling data requests
+ case "authRequest":
+ if Authenticated {
+ Logger.WithFields(logrus.Fields{"message": msg}).Debug("Client already authenticated... skipping authentication method")
+ } else {
+ handleAuthentication(conn, db)
+ }
+
case "torrentListRequest":
Logger.WithFields(logrus.Fields{"message": msg}).Debug("Client Requested TorrentList Update")
TorrentLocalArray = Storage.FetchAllStoredTorrents(db) //Required to re-read th database since we write to the DB and this will pull the changes from it
@@ -491,9 +564,15 @@ func main() {
}
})
- if err := http.ListenAndServe(httpAddr, nil); err != nil {
- Logger.WithFields(logrus.Fields{"error": err}).Fatal("Unable to listen on the http Server!")
+ if Config.UseProxy {
+ err := http.ListenAndServe(httpAddr, handlers.ProxyHeaders(router))
+ if err != nil {
+ Logger.WithFields(logrus.Fields{"error": err}).Fatal("Unable to listen on the http Server!")
+ }
} else {
- fmt.Println("Server started on:", httpAddr)
+ err := http.ListenAndServe(httpAddr, nil) //Can't send proxy headers if not used since that can be a security issue
+ if err != nil {
+ Logger.WithFields(logrus.Fields{"error": err}).Fatal("Unable to listen on the http Server with no proxy headers!")
+ }
}
}
diff --git a/public/static/js/bundle.js b/public/static/js/bundle.js
index 10538700..8ea8a00e 100644
--- a/public/static/js/bundle.js
+++ b/public/static/js/bundle.js
@@ -365,7 +365,7 @@ Object.defineProperty(exports, "__esModule", {
});
exports.sheetsManager = undefined;
-var _keys = __webpack_require__(32);
+var _keys = __webpack_require__(34);
var _keys2 = _interopRequireDefault(_keys);
@@ -433,7 +433,7 @@ var _contextTypes = __webpack_require__(486);
var _contextTypes2 = _interopRequireDefault(_contextTypes);
-var _jss = __webpack_require__(131);
+var _jss = __webpack_require__(132);
var _jssPresetDefault = __webpack_require__(250);
@@ -443,11 +443,11 @@ var _ns = __webpack_require__(251);
var ns = _interopRequireWildcard(_ns);
-var _createMuiTheme = __webpack_require__(137);
+var _createMuiTheme = __webpack_require__(138);
var _createMuiTheme2 = _interopRequireDefault(_createMuiTheme);
-var _themeListener = __webpack_require__(130);
+var _themeListener = __webpack_require__(131);
var _themeListener2 = _interopRequireDefault(_themeListener);
@@ -792,7 +792,7 @@ exports.default = withStyles;
exports.__esModule = true;
-var _defineProperty = __webpack_require__(120);
+var _defineProperty = __webpack_require__(121);
var _defineProperty2 = _interopRequireDefault(_defineProperty);
@@ -944,7 +944,7 @@ exports.default = function (instance, Constructor) {
exports.__esModule = true;
-var _defineProperty = __webpack_require__(120);
+var _defineProperty = __webpack_require__(121);
var _defineProperty2 = _interopRequireDefault(_defineProperty);
@@ -1377,6 +1377,55 @@ var WEBSOCKET_STATE = exports.WEBSOCKET_STATE = 'WEBSOCKET_STATE';
/***/ }),
/* 22 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _MuiThemeProvider = __webpack_require__(426);
+
+Object.defineProperty(exports, 'MuiThemeProvider', {
+ enumerable: true,
+ get: function get() {
+ return _interopRequireDefault(_MuiThemeProvider).default;
+ }
+});
+
+var _withStyles = __webpack_require__(5);
+
+Object.defineProperty(exports, 'withStyles', {
+ enumerable: true,
+ get: function get() {
+ return _interopRequireDefault(_withStyles).default;
+ }
+});
+
+var _withTheme = __webpack_require__(68);
+
+Object.defineProperty(exports, 'withTheme', {
+ enumerable: true,
+ get: function get() {
+ return _interopRequireDefault(_withTheme).default;
+ }
+});
+
+var _createMuiTheme = __webpack_require__(138);
+
+Object.defineProperty(exports, 'createMuiTheme', {
+ enumerable: true,
+ get: function get() {
+ return _interopRequireDefault(_createMuiTheme).default;
+ }
+});
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/***/ }),
+/* 23 */
/***/ (function(module, exports) {
var core = module.exports = { version: '2.5.1' };
@@ -1384,7 +1433,7 @@ if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
/***/ }),
-/* 23 */
+/* 24 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -1398,7 +1447,7 @@ var _typeof2 = __webpack_require__(80);
var _typeof3 = _interopRequireDefault(_typeof2);
-var _keys = __webpack_require__(32);
+var _keys = __webpack_require__(34);
var _keys2 = _interopRequireDefault(_keys);
@@ -1479,7 +1528,7 @@ function createChainedFunction() {
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))
/***/ }),
-/* 24 */
+/* 25 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -1501,63 +1550,49 @@ var babelPluginFlowReactPropTypes_proptype_TransitionClasses = {
exitActive: __webpack_require__(0).string
};
-/***/ }),
-/* 25 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-
-var _MuiThemeProvider = __webpack_require__(426);
-
-Object.defineProperty(exports, 'MuiThemeProvider', {
- enumerable: true,
- get: function get() {
- return _interopRequireDefault(_MuiThemeProvider).default;
- }
-});
-
-var _withStyles = __webpack_require__(5);
-
-Object.defineProperty(exports, 'withStyles', {
- enumerable: true,
- get: function get() {
- return _interopRequireDefault(_withStyles).default;
- }
-});
-
-var _withTheme = __webpack_require__(68);
-
-Object.defineProperty(exports, 'withTheme', {
- enumerable: true,
- get: function get() {
- return _interopRequireDefault(_withTheme).default;
- }
-});
-
-var _createMuiTheme = __webpack_require__(137);
-
-Object.defineProperty(exports, 'createMuiTheme', {
- enumerable: true,
- get: function get() {
- return _interopRequireDefault(_createMuiTheme).default;
- }
-});
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
/***/ }),
/* 26 */
/***/ (function(module, exports, __webpack_require__) {
+/* WEBPACK VAR INJECTION */(function(process) {/**
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+if (process.env.NODE_ENV !== 'production') {
+ var REACT_ELEMENT_TYPE = (typeof Symbol === 'function' &&
+ Symbol.for &&
+ Symbol.for('react.element')) ||
+ 0xeac7;
+
+ var isValidElement = function(object) {
+ return typeof object === 'object' &&
+ object !== null &&
+ object.$$typeof === REACT_ELEMENT_TYPE;
+ };
+
+ // By explicitly using `prop-types` you are opting into new development behavior.
+ // http://fb.me/prop-types-in-prod
+ var throwOnDirectAccess = true;
+ module.exports = __webpack_require__(357)(isValidElement, throwOnDirectAccess);
+} else {
+ // By explicitly using `prop-types` you are opting into new production behavior.
+ // http://fb.me/prop-types-in-prod
+ module.exports = __webpack_require__(360)();
+}
+
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))
+
+/***/ }),
+/* 27 */
+/***/ (function(module, exports, __webpack_require__) {
+
var global = __webpack_require__(36);
-var core = __webpack_require__(22);
+var core = __webpack_require__(23);
var ctx = __webpack_require__(49);
-var hide = __webpack_require__(45);
+var hide = __webpack_require__(46);
var PROTOTYPE = 'prototype';
var $export = function (type, name, source) {
@@ -1618,7 +1653,7 @@ module.exports = $export;
/***/ }),
-/* 27 */
+/* 28 */
/***/ (function(module, exports, __webpack_require__) {
var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
@@ -1672,62 +1707,10 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
}());
-/***/ }),
-/* 28 */
-/***/ (function(module, exports, __webpack_require__) {
-
-/* WEBPACK VAR INJECTION */(function(process) {/**
- * Copyright (c) 2013-present, Facebook, Inc.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-if (process.env.NODE_ENV !== 'production') {
- var REACT_ELEMENT_TYPE = (typeof Symbol === 'function' &&
- Symbol.for &&
- Symbol.for('react.element')) ||
- 0xeac7;
-
- var isValidElement = function(object) {
- return typeof object === 'object' &&
- object !== null &&
- object.$$typeof === REACT_ELEMENT_TYPE;
- };
-
- // By explicitly using `prop-types` you are opting into new development behavior.
- // http://fb.me/prop-types-in-prod
- var throwOnDirectAccess = true;
- module.exports = __webpack_require__(357)(isValidElement, throwOnDirectAccess);
-} else {
- // By explicitly using `prop-types` you are opting into new production behavior.
- // http://fb.me/prop-types-in-prod
- module.exports = __webpack_require__(360)();
-}
-
-/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))
-
/***/ }),
/* 29 */
/***/ (function(module, exports, __webpack_require__) {
-var store = __webpack_require__(117)('wks');
-var uid = __webpack_require__(78);
-var Symbol = __webpack_require__(36).Symbol;
-var USE_SYMBOL = typeof Symbol == 'function';
-
-var $exports = module.exports = function (name) {
- return store[name] || (store[name] =
- USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
-};
-
-$exports.store = store;
-
-
-/***/ }),
-/* 30 */
-/***/ (function(module, exports, __webpack_require__) {
-
"use strict";
@@ -1747,35 +1730,24 @@ Object.defineProperty(exports, 'default', {
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/***/ }),
-/* 31 */
+/* 30 */
/***/ (function(module, exports, __webpack_require__) {
-var anObject = __webpack_require__(50);
-var IE8_DOM_DEFINE = __webpack_require__(217);
-var toPrimitive = __webpack_require__(111);
-var dP = Object.defineProperty;
+var store = __webpack_require__(118)('wks');
+var uid = __webpack_require__(78);
+var Symbol = __webpack_require__(36).Symbol;
+var USE_SYMBOL = typeof Symbol == 'function';
-exports.f = __webpack_require__(37) ? Object.defineProperty : function defineProperty(O, P, Attributes) {
- anObject(O);
- P = toPrimitive(P, true);
- anObject(Attributes);
- if (IE8_DOM_DEFINE) try {
- return dP(O, P, Attributes);
- } catch (e) { /* empty */ }
- if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
- if ('value' in Attributes) O[P] = Attributes.value;
- return O;
+var $exports = module.exports = function (name) {
+ return store[name] || (store[name] =
+ USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
};
+$exports.store = store;
+
/***/ }),
-/* 32 */
-/***/ (function(module, exports, __webpack_require__) {
-
-module.exports = { "default": __webpack_require__(464), __esModule: true };
-
-/***/ }),
-/* 33 */
+/* 31 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -1797,7 +1769,7 @@ Object.defineProperty(exports, 'default', {
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/***/ }),
-/* 34 */
+/* 32 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -1818,6 +1790,34 @@ Object.defineProperty(exports, 'default', {
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+/***/ }),
+/* 33 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var anObject = __webpack_require__(50);
+var IE8_DOM_DEFINE = __webpack_require__(217);
+var toPrimitive = __webpack_require__(112);
+var dP = Object.defineProperty;
+
+exports.f = __webpack_require__(37) ? Object.defineProperty : function defineProperty(O, P, Attributes) {
+ anObject(O);
+ P = toPrimitive(P, true);
+ anObject(Attributes);
+ if (IE8_DOM_DEFINE) try {
+ return dP(O, P, Attributes);
+ } catch (e) { /* empty */ }
+ if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
+ if ('value' in Attributes) O[P] = Attributes.value;
+ return O;
+};
+
+
+/***/ }),
+/* 34 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = { "default": __webpack_require__(464), __esModule: true };
+
/***/ }),
/* 35 */
/***/ (function(module, exports, __webpack_require__) {
@@ -1837,7 +1837,7 @@ var _Const = __webpack_require__(18);
var _Const2 = _interopRequireDefault(_Const);
-var _classnames = __webpack_require__(27);
+var _classnames = __webpack_require__(28);
var _classnames2 = _interopRequireDefault(_classnames);
@@ -2003,6 +2003,28 @@ module.exports = !__webpack_require__(51)(function () {
/* 38 */
/***/ (function(module, exports, __webpack_require__) {
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _TextField = __webpack_require__(540);
+
+Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _interopRequireDefault(_TextField).default;
+ }
+});
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/***/ }),
+/* 39 */
+/***/ (function(module, exports, __webpack_require__) {
+
"use strict";
/* WEBPACK VAR INJECTION */(function(process) {
@@ -2041,98 +2063,6 @@ var pure = function pure(BaseComponent) {
exports.default = pure;
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))
-/***/ }),
-/* 39 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.keys = undefined;
-
-var _extends2 = __webpack_require__(3);
-
-var _extends3 = _interopRequireDefault(_extends2);
-
-var _objectWithoutProperties2 = __webpack_require__(4);
-
-var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
-
-exports.default = createBreakpoints;
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var babelPluginFlowReactPropTypes_proptype_Breakpoint = __webpack_require__(0).oneOf(['xs', 'sm', 'md', 'lg', 'xl']);
-
-// Sorted ASC by size. That's important.
-// It can't be configured as it's used statically for propTypes.
-var keys = exports.keys = ['xs', 'sm', 'md', 'lg', 'xl'];
-
-// Keep in mind that @media is inclusive by the CSS specification.
-function createBreakpoints(breakpoints) {
- var _breakpoints$values = breakpoints.values,
- values = _breakpoints$values === undefined ? {
- xs: 360,
- sm: 600,
- md: 960,
- lg: 1280,
- xl: 1920
- } : _breakpoints$values,
- _breakpoints$unit = breakpoints.unit,
- unit = _breakpoints$unit === undefined ? 'px' : _breakpoints$unit,
- _breakpoints$step = breakpoints.step,
- step = _breakpoints$step === undefined ? 5 : _breakpoints$step,
- other = (0, _objectWithoutProperties3.default)(breakpoints, ['values', 'unit', 'step']);
-
-
- function up(key) {
- var value = void 0;
- // min-width of xs starts at 0
- if (key === 'xs') {
- value = 0;
- } else {
- value = values[key] || key;
- }
- return '@media (min-width:' + value + unit + ')';
- }
-
- function down(key) {
- var value = values[key] || key;
- return '@media (max-width:' + (value - step / 100) + unit + ')';
- }
-
- function between(start, end) {
- var startIndex = keys.indexOf(start);
- var endIndex = keys.indexOf(end);
- return '@media (min-width:' + values[keys[startIndex]] + unit + ') and ' + ('(max-width:' + (values[keys[endIndex + 1]] - step / 100) + unit + ')');
- }
-
- function only(key) {
- var keyIndex = keys.indexOf(key);
- if (keyIndex === keys.length - 1) {
- return up(key);
- }
- return between(key, key);
- }
-
- function width(key) {
- return values[key];
- }
-
- return (0, _extends3.default)({
- keys: keys,
- values: values,
- up: up,
- down: down,
- between: between,
- only: only,
- width: width
- }, other);
-}
-
/***/ }),
/* 40 */
/***/ (function(module, exports, __webpack_require__) {
@@ -2140,301 +2070,6 @@ function createBreakpoints(breakpoints) {
"use strict";
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-
-var _TextField = __webpack_require__(540);
-
-Object.defineProperty(exports, 'default', {
- enumerable: true,
- get: function get() {
- return _interopRequireDefault(_TextField).default;
- }
-});
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/***/ }),
-/* 41 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-/* WEBPACK VAR INJECTION */(function(process) {
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-
-var _getPrototypeOf = __webpack_require__(9);
-
-var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
-
-var _classCallCheck2 = __webpack_require__(10);
-
-var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
-
-var _createClass2 = __webpack_require__(11);
-
-var _createClass3 = _interopRequireDefault(_createClass2);
-
-var _possibleConstructorReturn2 = __webpack_require__(12);
-
-var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
-
-var _inherits2 = __webpack_require__(13);
-
-var _inherits3 = _interopRequireDefault(_inherits2);
-
-var _typeof2 = __webpack_require__(80);
-
-var _typeof3 = _interopRequireDefault(_typeof2);
-
-var _keys = __webpack_require__(32);
-
-var _keys2 = _interopRequireDefault(_keys);
-
-var _objectWithoutProperties2 = __webpack_require__(4);
-
-var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
-
-var _assign = __webpack_require__(215);
-
-var _assign2 = _interopRequireDefault(_assign);
-
-exports.withOptions = withOptions;
-
-var _react = __webpack_require__(1);
-
-var _propTypes = __webpack_require__(0);
-
-var _propTypes2 = _interopRequireDefault(_propTypes);
-
-var _shallowEqual = __webpack_require__(261);
-
-var _shallowEqual2 = _interopRequireDefault(_shallowEqual);
-
-var _warning = __webpack_require__(16);
-
-var _warning2 = _interopRequireDefault(_warning);
-
-var _supports = __webpack_require__(550);
-
-var supports = _interopRequireWildcard(_supports);
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var defaultEventOptions = {
- capture: false,
- passive: false
-};
-/* eslint-disable prefer-spread */
-
-function mergeDefaultEventOptions(options) {
- return (0, _assign2.default)({}, defaultEventOptions, options);
-}
-
-function getEventListenerArgs(eventName, callback, options) {
- var args = [eventName, callback];
- args.push(supports.passiveOption ? options : options.capture);
- return args;
-}
-
-function on(target, eventName, callback, options) {
- if (supports.addEventListener) {
- target.addEventListener.apply(target, getEventListenerArgs(eventName, callback, options));
- } else if (supports.attachEvent) {
- // IE8+ Support
- target.attachEvent('on' + eventName, function () {
- callback.call(target);
- });
- }
-}
-
-function off(target, eventName, callback, options) {
- if (supports.removeEventListener) {
- target.removeEventListener.apply(target, getEventListenerArgs(eventName, callback, options));
- } else if (supports.detachEvent) {
- // IE8+ Support
- target.detachEvent('on' + eventName, callback);
- }
-}
-
-function forEachListener(props, iteratee) {
- var children = props.children,
- target = props.target,
- eventProps = (0, _objectWithoutProperties3.default)(props, ['children', 'target']);
-
-
- (0, _keys2.default)(eventProps).forEach(function (name) {
- if (name.substring(0, 2) !== 'on') {
- return;
- }
-
- var prop = eventProps[name];
- var type = typeof prop === 'undefined' ? 'undefined' : (0, _typeof3.default)(prop);
- var isObject = type === 'object';
- var isFunction = type === 'function';
-
- if (!isObject && !isFunction) {
- return;
- }
-
- var capture = name.substr(-7).toLowerCase() === 'capture';
- var eventName = name.substring(2).toLowerCase();
- eventName = capture ? eventName.substring(0, eventName.length - 7) : eventName;
-
- if (isObject) {
- iteratee(eventName, prop.handler, prop.options);
- } else {
- iteratee(eventName, prop, mergeDefaultEventOptions({ capture: capture }));
- }
- });
-}
-
-function withOptions(handler, options) {
- process.env.NODE_ENV !== "production" ? (0, _warning2.default)(options, 'react-event-listener: Should be specified options in withOptions.') : void 0;
-
- return {
- handler: handler,
- options: mergeDefaultEventOptions(options)
- };
-}
-
-var EventListener = function (_Component) {
- (0, _inherits3.default)(EventListener, _Component);
-
- function EventListener() {
- (0, _classCallCheck3.default)(this, EventListener);
- return (0, _possibleConstructorReturn3.default)(this, (EventListener.__proto__ || (0, _getPrototypeOf2.default)(EventListener)).apply(this, arguments));
- }
-
- (0, _createClass3.default)(EventListener, [{
- key: 'componentDidMount',
- value: function componentDidMount() {
- this.addListeners();
- }
- }, {
- key: 'shouldComponentUpdate',
- value: function shouldComponentUpdate(nextProps) {
- return !(0, _shallowEqual2.default)(this.props, nextProps);
- }
- }, {
- key: 'componentWillUpdate',
- value: function componentWillUpdate() {
- this.removeListeners();
- }
- }, {
- key: 'componentDidUpdate',
- value: function componentDidUpdate() {
- this.addListeners();
- }
- }, {
- key: 'componentWillUnmount',
- value: function componentWillUnmount() {
- this.removeListeners();
- }
- }, {
- key: 'addListeners',
- value: function addListeners() {
- this.applyListeners(on);
- }
- }, {
- key: 'removeListeners',
- value: function removeListeners() {
- this.applyListeners(off);
- }
- }, {
- key: 'applyListeners',
- value: function applyListeners(onOrOff) {
- var target = this.props.target;
-
-
- if (target) {
- var element = target;
-
- if (typeof target === 'string') {
- element = window[target];
- }
-
- forEachListener(this.props, onOrOff.bind(null, element));
- }
- }
- }, {
- key: 'render',
- value: function render() {
- return this.props.children || null;
- }
- }]);
- return EventListener;
-}(_react.Component);
-
-EventListener.propTypes = process.env.NODE_ENV !== "production" ? {
- /**
- * You can provide a single child too.
- */
- children: _propTypes2.default.element,
- /**
- * The DOM target to listen to.
- */
- target: _propTypes2.default.oneOfType([_propTypes2.default.object, _propTypes2.default.string]).isRequired
-} : {};
-exports.default = EventListener;
-/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))
-
-/***/ }),
-/* 42 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-
-var _Typography = __webpack_require__(553);
-
-Object.defineProperty(exports, 'default', {
- enumerable: true,
- get: function get() {
- return _interopRequireDefault(_Typography).default;
- }
-});
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/***/ }),
-/* 43 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-
-var _Paper = __webpack_require__(569);
-
-Object.defineProperty(exports, 'default', {
- enumerable: true,
- get: function get() {
- return _interopRequireDefault(_Paper).default;
- }
-});
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/***/ }),
-/* 44 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _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; }; }();
@@ -3029,30 +2664,328 @@ var ReactTooltip = (0, _staticMethods2.default)(_class = (0, _windowListener2.de
module.exports = ReactTooltip;
/***/ }),
-/* 45 */
+/* 41 */
/***/ (function(module, exports, __webpack_require__) {
-var dP = __webpack_require__(31);
-var createDesc = __webpack_require__(65);
-module.exports = __webpack_require__(37) ? function (object, key, value) {
- return dP.f(object, key, createDesc(1, value));
-} : function (object, key, value) {
- object[key] = value;
- return object;
-};
+"use strict";
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.keys = undefined;
+
+var _extends2 = __webpack_require__(3);
+
+var _extends3 = _interopRequireDefault(_extends2);
+
+var _objectWithoutProperties2 = __webpack_require__(4);
+
+var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
+
+exports.default = createBreakpoints;
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var babelPluginFlowReactPropTypes_proptype_Breakpoint = __webpack_require__(0).oneOf(['xs', 'sm', 'md', 'lg', 'xl']);
+
+// Sorted ASC by size. That's important.
+// It can't be configured as it's used statically for propTypes.
+var keys = exports.keys = ['xs', 'sm', 'md', 'lg', 'xl'];
+
+// Keep in mind that @media is inclusive by the CSS specification.
+function createBreakpoints(breakpoints) {
+ var _breakpoints$values = breakpoints.values,
+ values = _breakpoints$values === undefined ? {
+ xs: 360,
+ sm: 600,
+ md: 960,
+ lg: 1280,
+ xl: 1920
+ } : _breakpoints$values,
+ _breakpoints$unit = breakpoints.unit,
+ unit = _breakpoints$unit === undefined ? 'px' : _breakpoints$unit,
+ _breakpoints$step = breakpoints.step,
+ step = _breakpoints$step === undefined ? 5 : _breakpoints$step,
+ other = (0, _objectWithoutProperties3.default)(breakpoints, ['values', 'unit', 'step']);
+
+
+ function up(key) {
+ var value = void 0;
+ // min-width of xs starts at 0
+ if (key === 'xs') {
+ value = 0;
+ } else {
+ value = values[key] || key;
+ }
+ return '@media (min-width:' + value + unit + ')';
+ }
+
+ function down(key) {
+ var value = values[key] || key;
+ return '@media (max-width:' + (value - step / 100) + unit + ')';
+ }
+
+ function between(start, end) {
+ var startIndex = keys.indexOf(start);
+ var endIndex = keys.indexOf(end);
+ return '@media (min-width:' + values[keys[startIndex]] + unit + ') and ' + ('(max-width:' + (values[keys[endIndex + 1]] - step / 100) + unit + ')');
+ }
+
+ function only(key) {
+ var keyIndex = keys.indexOf(key);
+ if (keyIndex === keys.length - 1) {
+ return up(key);
+ }
+ return between(key, key);
+ }
+
+ function width(key) {
+ return values[key];
+ }
+
+ return (0, _extends3.default)({
+ keys: keys,
+ values: values,
+ up: up,
+ down: down,
+ between: between,
+ only: only,
+ width: width
+ }, other);
+}
+
/***/ }),
-/* 46 */
-/***/ (function(module, exports) {
+/* 42 */
+/***/ (function(module, exports, __webpack_require__) {
-module.exports = function (it) {
- return typeof it === 'object' ? it !== null : typeof it === 'function';
+"use strict";
+/* WEBPACK VAR INJECTION */(function(process) {
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _getPrototypeOf = __webpack_require__(9);
+
+var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
+
+var _classCallCheck2 = __webpack_require__(10);
+
+var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
+
+var _createClass2 = __webpack_require__(11);
+
+var _createClass3 = _interopRequireDefault(_createClass2);
+
+var _possibleConstructorReturn2 = __webpack_require__(12);
+
+var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
+
+var _inherits2 = __webpack_require__(13);
+
+var _inherits3 = _interopRequireDefault(_inherits2);
+
+var _typeof2 = __webpack_require__(80);
+
+var _typeof3 = _interopRequireDefault(_typeof2);
+
+var _keys = __webpack_require__(34);
+
+var _keys2 = _interopRequireDefault(_keys);
+
+var _objectWithoutProperties2 = __webpack_require__(4);
+
+var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
+
+var _assign = __webpack_require__(215);
+
+var _assign2 = _interopRequireDefault(_assign);
+
+exports.withOptions = withOptions;
+
+var _react = __webpack_require__(1);
+
+var _propTypes = __webpack_require__(0);
+
+var _propTypes2 = _interopRequireDefault(_propTypes);
+
+var _shallowEqual = __webpack_require__(261);
+
+var _shallowEqual2 = _interopRequireDefault(_shallowEqual);
+
+var _warning = __webpack_require__(16);
+
+var _warning2 = _interopRequireDefault(_warning);
+
+var _supports = __webpack_require__(550);
+
+var supports = _interopRequireWildcard(_supports);
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var defaultEventOptions = {
+ capture: false,
+ passive: false
};
+/* eslint-disable prefer-spread */
+function mergeDefaultEventOptions(options) {
+ return (0, _assign2.default)({}, defaultEventOptions, options);
+}
+
+function getEventListenerArgs(eventName, callback, options) {
+ var args = [eventName, callback];
+ args.push(supports.passiveOption ? options : options.capture);
+ return args;
+}
+
+function on(target, eventName, callback, options) {
+ if (supports.addEventListener) {
+ target.addEventListener.apply(target, getEventListenerArgs(eventName, callback, options));
+ } else if (supports.attachEvent) {
+ // IE8+ Support
+ target.attachEvent('on' + eventName, function () {
+ callback.call(target);
+ });
+ }
+}
+
+function off(target, eventName, callback, options) {
+ if (supports.removeEventListener) {
+ target.removeEventListener.apply(target, getEventListenerArgs(eventName, callback, options));
+ } else if (supports.detachEvent) {
+ // IE8+ Support
+ target.detachEvent('on' + eventName, callback);
+ }
+}
+
+function forEachListener(props, iteratee) {
+ var children = props.children,
+ target = props.target,
+ eventProps = (0, _objectWithoutProperties3.default)(props, ['children', 'target']);
+
+
+ (0, _keys2.default)(eventProps).forEach(function (name) {
+ if (name.substring(0, 2) !== 'on') {
+ return;
+ }
+
+ var prop = eventProps[name];
+ var type = typeof prop === 'undefined' ? 'undefined' : (0, _typeof3.default)(prop);
+ var isObject = type === 'object';
+ var isFunction = type === 'function';
+
+ if (!isObject && !isFunction) {
+ return;
+ }
+
+ var capture = name.substr(-7).toLowerCase() === 'capture';
+ var eventName = name.substring(2).toLowerCase();
+ eventName = capture ? eventName.substring(0, eventName.length - 7) : eventName;
+
+ if (isObject) {
+ iteratee(eventName, prop.handler, prop.options);
+ } else {
+ iteratee(eventName, prop, mergeDefaultEventOptions({ capture: capture }));
+ }
+ });
+}
+
+function withOptions(handler, options) {
+ process.env.NODE_ENV !== "production" ? (0, _warning2.default)(options, 'react-event-listener: Should be specified options in withOptions.') : void 0;
+
+ return {
+ handler: handler,
+ options: mergeDefaultEventOptions(options)
+ };
+}
+
+var EventListener = function (_Component) {
+ (0, _inherits3.default)(EventListener, _Component);
+
+ function EventListener() {
+ (0, _classCallCheck3.default)(this, EventListener);
+ return (0, _possibleConstructorReturn3.default)(this, (EventListener.__proto__ || (0, _getPrototypeOf2.default)(EventListener)).apply(this, arguments));
+ }
+
+ (0, _createClass3.default)(EventListener, [{
+ key: 'componentDidMount',
+ value: function componentDidMount() {
+ this.addListeners();
+ }
+ }, {
+ key: 'shouldComponentUpdate',
+ value: function shouldComponentUpdate(nextProps) {
+ return !(0, _shallowEqual2.default)(this.props, nextProps);
+ }
+ }, {
+ key: 'componentWillUpdate',
+ value: function componentWillUpdate() {
+ this.removeListeners();
+ }
+ }, {
+ key: 'componentDidUpdate',
+ value: function componentDidUpdate() {
+ this.addListeners();
+ }
+ }, {
+ key: 'componentWillUnmount',
+ value: function componentWillUnmount() {
+ this.removeListeners();
+ }
+ }, {
+ key: 'addListeners',
+ value: function addListeners() {
+ this.applyListeners(on);
+ }
+ }, {
+ key: 'removeListeners',
+ value: function removeListeners() {
+ this.applyListeners(off);
+ }
+ }, {
+ key: 'applyListeners',
+ value: function applyListeners(onOrOff) {
+ var target = this.props.target;
+
+
+ if (target) {
+ var element = target;
+
+ if (typeof target === 'string') {
+ element = window[target];
+ }
+
+ forEachListener(this.props, onOrOff.bind(null, element));
+ }
+ }
+ }, {
+ key: 'render',
+ value: function render() {
+ return this.props.children || null;
+ }
+ }]);
+ return EventListener;
+}(_react.Component);
+
+EventListener.propTypes = process.env.NODE_ENV !== "production" ? {
+ /**
+ * You can provide a single child too.
+ */
+ children: _propTypes2.default.element,
+ /**
+ * The DOM target to listen to.
+ */
+ target: _propTypes2.default.oneOfType([_propTypes2.default.object, _propTypes2.default.string]).isRequired
+} : {};
+exports.default = EventListener;
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))
/***/ }),
-/* 47 */
+/* 43 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -3062,19 +2995,41 @@ Object.defineProperty(exports, "__esModule", {
value: true
});
-var _ButtonBase = __webpack_require__(523);
+var _Typography = __webpack_require__(553);
Object.defineProperty(exports, 'default', {
enumerable: true,
get: function get() {
- return _interopRequireDefault(_ButtonBase).default;
+ return _interopRequireDefault(_Typography).default;
}
});
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/***/ }),
-/* 48 */
+/* 44 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _Paper = __webpack_require__(569);
+
+Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _interopRequireDefault(_Paper).default;
+ }
+});
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/***/ }),
+/* 45 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -3140,6 +3095,51 @@ Object.defineProperty(exports, 'withMobileDialog', {
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+/***/ }),
+/* 46 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dP = __webpack_require__(33);
+var createDesc = __webpack_require__(65);
+module.exports = __webpack_require__(37) ? function (object, key, value) {
+ return dP.f(object, key, createDesc(1, value));
+} : function (object, key, value) {
+ object[key] = value;
+ return object;
+};
+
+
+/***/ }),
+/* 47 */
+/***/ (function(module, exports) {
+
+module.exports = function (it) {
+ return typeof it === 'object' ? it !== null : typeof it === 'function';
+};
+
+
+/***/ }),
+/* 48 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _ButtonBase = __webpack_require__(523);
+
+Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function get() {
+ return _interopRequireDefault(_ButtonBase).default;
+ }
+});
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
/***/ }),
/* 49 */
/***/ (function(module, exports, __webpack_require__) {
@@ -3170,7 +3170,7 @@ module.exports = function (fn, that, length) {
/* 50 */
/***/ (function(module, exports, __webpack_require__) {
-var isObject = __webpack_require__(46);
+var isObject = __webpack_require__(47);
module.exports = function (it) {
if (!isObject(it)) throw TypeError(it + ' is not an object!');
return it;
@@ -3217,7 +3217,7 @@ module.exports = exports['default'];
/* 54 */
/***/ (function(module, exports, __webpack_require__) {
-var isObject = __webpack_require__(142),
+var isObject = __webpack_require__(143),
now = __webpack_require__(542),
toNumber = __webpack_require__(544);
@@ -3482,8 +3482,8 @@ if (process.env.NODE_ENV !== 'production') {
/***/ (function(module, exports, __webpack_require__) {
// to indexed object, toObject with fallback for non-array-like ES3 strings
-var IObject = __webpack_require__(112);
-var defined = __webpack_require__(114);
+var IObject = __webpack_require__(113);
+var defined = __webpack_require__(115);
module.exports = function (it) {
return IObject(defined(it));
};
@@ -3494,7 +3494,7 @@ module.exports = function (it) {
/***/ (function(module, exports, __webpack_require__) {
// 7.1.13 ToObject(argument)
-var defined = __webpack_require__(114);
+var defined = __webpack_require__(115);
module.exports = function (it) {
return Object(defined(it));
};
@@ -3533,7 +3533,7 @@ Object.defineProperty(exports, "__esModule", {
});
exports.isNumber = exports.isString = exports.formatMs = exports.duration = exports.easing = undefined;
-var _keys = __webpack_require__(32);
+var _keys = __webpack_require__(34);
var _keys2 = _interopRequireDefault(_keys);
@@ -3938,7 +3938,7 @@ exports.synchronizeLayoutWithChildren = synchronizeLayoutWithChildren;
exports.validateLayout = validateLayout;
exports.autoBindHandlers = autoBindHandlers;
-var _lodash = __webpack_require__(101);
+var _lodash = __webpack_require__(102);
var _lodash2 = _interopRequireDefault(_lodash);
@@ -4441,7 +4441,7 @@ module.exports = function (bitmap, value) {
// 19.1.2.14 / 15.2.3.14 Object.keys(O)
var $keys = __webpack_require__(219);
-var enumBugKeys = __webpack_require__(118);
+var enumBugKeys = __webpack_require__(119);
module.exports = Object.keys || function keys(O) {
return $keys(O, enumBugKeys);
@@ -4498,11 +4498,11 @@ var _wrapDisplayName = __webpack_require__(59);
var _wrapDisplayName2 = _interopRequireDefault(_wrapDisplayName);
-var _createMuiTheme = __webpack_require__(137);
+var _createMuiTheme = __webpack_require__(138);
var _createMuiTheme2 = _interopRequireDefault(_createMuiTheme);
-var _themeListener = __webpack_require__(130);
+var _themeListener = __webpack_require__(131);
var _themeListener2 = _interopRequireDefault(_themeListener);
@@ -4600,7 +4600,7 @@ Object.defineProperty(exports, "__esModule", {
value: true
});
-var _Input = __webpack_require__(141);
+var _Input = __webpack_require__(142);
Object.defineProperty(exports, 'default', {
enumerable: true,
@@ -9346,7 +9346,7 @@ exports.placeholder = placeholder;
exports.cssFor = cssFor;
exports.attribsFor = attribsFor;
-var _objectAssign = __webpack_require__(95);
+var _objectAssign = __webpack_require__(96);
var _objectAssign2 = _interopRequireDefault(_objectAssign);
@@ -10842,7 +10842,7 @@ function updateLink (link, options, obj) {
/***/ (function(module, exports, __webpack_require__) {
// 7.1.15 ToLength
-var toInteger = __webpack_require__(115);
+var toInteger = __webpack_require__(116);
var min = Math.min;
module.exports = function (it) {
return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
@@ -10901,8 +10901,8 @@ exports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.d
// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
var anObject = __webpack_require__(50);
var dPs = __webpack_require__(440);
-var enumBugKeys = __webpack_require__(118);
-var IE_PROTO = __webpack_require__(116)('IE_PROTO');
+var enumBugKeys = __webpack_require__(119);
+var IE_PROTO = __webpack_require__(117)('IE_PROTO');
var Empty = function () { /* empty */ };
var PROTOTYPE = 'prototype';
@@ -10945,9 +10945,9 @@ module.exports = Object.create || function create(O, Properties) {
/* 82 */
/***/ (function(module, exports, __webpack_require__) {
-var def = __webpack_require__(31).f;
+var def = __webpack_require__(33).f;
var has = __webpack_require__(52);
-var TAG = __webpack_require__(29)('toStringTag');
+var TAG = __webpack_require__(30)('toStringTag');
module.exports = function (it, tag, stat) {
if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });
@@ -11012,7 +11012,7 @@ var _linkRule = __webpack_require__(243);
var _linkRule2 = _interopRequireDefault(_linkRule);
-var _StyleRule = __webpack_require__(132);
+var _StyleRule = __webpack_require__(133);
var _StyleRule2 = _interopRequireDefault(_StyleRule);
@@ -12223,6 +12223,49 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
var SvgIconCustom = global.__MUI_SvgIcon__ || _SvgIcon2.default;
+var _ref = _react2.default.createElement('path', { d: 'M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z' });
+
+var Link = function Link(props) {
+ return _react2.default.createElement(
+ SvgIconCustom,
+ props,
+ _ref
+ );
+};
+
+Link = (0, _pure2.default)(Link);
+Link.muiName = 'SvgIcon';
+
+exports.default = Link;
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17)))
+
+/***/ }),
+/* 93 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function(global) {
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _react = __webpack_require__(1);
+
+var _react2 = _interopRequireDefault(_react);
+
+var _pure = __webpack_require__(19);
+
+var _pure2 = _interopRequireDefault(_pure);
+
+var _SvgIcon = __webpack_require__(15);
+
+var _SvgIcon2 = _interopRequireDefault(_SvgIcon);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var SvgIconCustom = global.__MUI_SvgIcon__ || _SvgIcon2.default;
+
var _ref = _react2.default.createElement('circle', { cx: '6.18', cy: '17.82', r: '2.18' });
var _ref2 = _react2.default.createElement('path', { d: 'M4 4.44v2.83c7.03 0 12.73 5.7 12.73 12.73h2.83c0-8.59-6.97-15.56-15.56-15.56zm0 5.66v2.83c3.9 0 7.07 3.17 7.07 7.07h2.83c0-5.47-4.43-9.9-9.9-9.9z' });
@@ -12243,7 +12286,7 @@ exports.default = RssFeed;
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17)))
/***/ }),
-/* 93 */
+/* 94 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
@@ -12270,7 +12313,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(634);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__devexpress_dx_react_grid__ = __webpack_require__(70);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_material_ui_styles__ = __webpack_require__(25);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_material_ui_styles__ = __webpack_require__(22);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_material_ui_styles___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_material_ui_styles__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_material_ui__ = __webpack_require__(285);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_material_ui_List__ = __webpack_require__(63);
@@ -12295,13 +12338,13 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15_material_ui_icons_List___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_15_material_ui_icons_List__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16_material_ui_icons_ExpandMore__ = __webpack_require__(728);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16_material_ui_icons_ExpandMore___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_16_material_ui_icons_ExpandMore__);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17_material_ui_IconButton__ = __webpack_require__(30);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17_material_ui_IconButton__ = __webpack_require__(29);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17_material_ui_IconButton___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_17_material_ui_IconButton__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18_material_ui_Table__ = __webpack_require__(297);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18_material_ui_Table___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_18_material_ui_Table__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19_material_ui_Toolbar__ = __webpack_require__(168);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19_material_ui_Toolbar___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_19_material_ui_Toolbar__);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20_material_ui_Typography__ = __webpack_require__(42);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20_material_ui_Typography__ = __webpack_require__(43);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20_material_ui_Typography___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_20_material_ui_Typography__);
/**
* Bundle of @devexpress/dx-react-grid-material-ui
@@ -15538,7 +15581,7 @@ var TableColumnResizing$1 = function (_React$PureComponent) {
/***/ }),
-/* 94 */
+/* 95 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -15607,7 +15650,7 @@ module.exports = warning;
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))
/***/ }),
-/* 95 */
+/* 96 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -15704,7 +15747,7 @@ module.exports = shouldUseNative() ? Object.assign : function (target, source) {
/***/ }),
-/* 96 */
+/* 97 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -15759,48 +15802,6 @@ function defineStyle(props) {
exports.default = style;
-/***/ }),
-/* 97 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-/**
- * Copyright (c) 2013-present, Facebook, Inc.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- *
- *
- */
-
-function makeEmptyFunction(arg) {
- return function () {
- return arg;
- };
-}
-
-/**
- * This function accepts and discards inputs; it has no side effects. This is
- * primarily useful idiomatically for overridable function endpoints which
- * always need to be callable, since JS lacks a null-call idiom ala Cocoa.
- */
-var emptyFunction = function emptyFunction() {};
-
-emptyFunction.thatReturns = makeEmptyFunction;
-emptyFunction.thatReturnsFalse = makeEmptyFunction(false);
-emptyFunction.thatReturnsTrue = makeEmptyFunction(true);
-emptyFunction.thatReturnsNull = makeEmptyFunction(null);
-emptyFunction.thatReturnsThis = function () {
- return this;
-};
-emptyFunction.thatReturnsArgument = function (arg) {
- return arg;
-};
-
-module.exports = emptyFunction;
-
/***/ }),
/* 98 */
/***/ (function(module, exports, __webpack_require__) {
@@ -15847,6 +15848,48 @@ module.exports = emptyFunction;
/* 99 */
/***/ (function(module, exports, __webpack_require__) {
+"use strict";
+
+
+/**
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ *
+ */
+
+function makeEmptyFunction(arg) {
+ return function () {
+ return arg;
+ };
+}
+
+/**
+ * This function accepts and discards inputs; it has no side effects. This is
+ * primarily useful idiomatically for overridable function endpoints which
+ * always need to be callable, since JS lacks a null-call idiom ala Cocoa.
+ */
+var emptyFunction = function emptyFunction() {};
+
+emptyFunction.thatReturns = makeEmptyFunction;
+emptyFunction.thatReturnsFalse = makeEmptyFunction(false);
+emptyFunction.thatReturnsTrue = makeEmptyFunction(true);
+emptyFunction.thatReturnsNull = makeEmptyFunction(null);
+emptyFunction.thatReturnsThis = function () {
+ return this;
+};
+emptyFunction.thatReturnsArgument = function (arg) {
+ return arg;
+};
+
+module.exports = emptyFunction;
+
+/***/ }),
+/* 100 */
+/***/ (function(module, exports, __webpack_require__) {
+
"use strict";
/* WEBPACK VAR INJECTION */(function(process) {/**
* Copyright (c) 2013-present, Facebook, Inc.
@@ -15904,7 +15947,7 @@ module.exports = invariant;
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))
/***/ }),
-/* 100 */
+/* 101 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -15923,7 +15966,7 @@ module.exports = ReactPropTypesSecret;
/***/ }),
-/* 101 */
+/* 102 */
/***/ (function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(global, module) {/**
@@ -17775,10 +17818,10 @@ function stubFalse() {
module.exports = isEqual;
-/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17), __webpack_require__(102)(module)))
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17), __webpack_require__(103)(module)))
/***/ }),
-/* 102 */
+/* 103 */
/***/ (function(module, exports) {
module.exports = function(module) {
@@ -17806,7 +17849,7 @@ module.exports = function(module) {
/***/ }),
-/* 103 */
+/* 104 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -17847,70 +17890,70 @@ emptyFunction.thatReturnsArgument = function (arg) {
module.exports = emptyFunction;
-/***/ }),
-/* 104 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-/* WEBPACK VAR INJECTION */(function(process) {/**
- * Copyright (c) 2013-present, Facebook, Inc.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- *
- */
-
-
-
-/**
- * Use invariant() to assert state which your program assumes to be true.
- *
- * Provide sprintf-style format (only %s is supported) and arguments
- * to provide information about what broke and what you were
- * expecting.
- *
- * The invariant message will be stripped in production, but the invariant
- * will remain to ensure logic does not differ in production.
- */
-
-var validateFormat = function validateFormat(format) {};
-
-if (process.env.NODE_ENV !== 'production') {
- validateFormat = function validateFormat(format) {
- if (format === undefined) {
- throw new Error('invariant requires an error message argument');
- }
- };
-}
-
-function invariant(condition, format, a, b, c, d, e, f) {
- validateFormat(format);
-
- if (!condition) {
- var error;
- if (format === undefined) {
- error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');
- } else {
- var args = [a, b, c, d, e, f];
- var argIndex = 0;
- error = new Error(format.replace(/%s/g, function () {
- return args[argIndex++];
- }));
- error.name = 'Invariant Violation';
- }
-
- error.framesToPop = 1; // we don't care about invariant's own frame
- throw error;
- }
-}
-
-module.exports = invariant;
-/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))
-
/***/ }),
/* 105 */
/***/ (function(module, exports, __webpack_require__) {
+"use strict";
+/* WEBPACK VAR INJECTION */(function(process) {/**
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ */
+
+
+
+/**
+ * Use invariant() to assert state which your program assumes to be true.
+ *
+ * Provide sprintf-style format (only %s is supported) and arguments
+ * to provide information about what broke and what you were
+ * expecting.
+ *
+ * The invariant message will be stripped in production, but the invariant
+ * will remain to ensure logic does not differ in production.
+ */
+
+var validateFormat = function validateFormat(format) {};
+
+if (process.env.NODE_ENV !== 'production') {
+ validateFormat = function validateFormat(format) {
+ if (format === undefined) {
+ throw new Error('invariant requires an error message argument');
+ }
+ };
+}
+
+function invariant(condition, format, a, b, c, d, e, f) {
+ validateFormat(format);
+
+ if (!condition) {
+ var error;
+ if (format === undefined) {
+ error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');
+ } else {
+ var args = [a, b, c, d, e, f];
+ var argIndex = 0;
+ error = new Error(format.replace(/%s/g, function () {
+ return args[argIndex++];
+ }));
+ error.name = 'Invariant Violation';
+ }
+
+ error.framesToPop = 1; // we don't care about invariant's own frame
+ throw error;
+ }
+}
+
+module.exports = invariant;
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))
+
+/***/ }),
+/* 106 */
+/***/ (function(module, exports, __webpack_require__) {
+
"use strict";
/**
* Copyright (c) 2013-present, Facebook, Inc.
@@ -17927,7 +17970,7 @@ module.exports = ReactPropTypesSecret;
/***/ }),
-/* 106 */
+/* 107 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -17969,7 +18012,7 @@ emptyFunction.thatReturnsArgument = function (arg) {
module.exports = emptyFunction;
/***/ }),
-/* 107 */
+/* 108 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -18029,7 +18072,7 @@ module.exports = invariant;
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))
/***/ }),
-/* 108 */
+/* 109 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -18048,7 +18091,7 @@ module.exports = ReactPropTypesSecret;
/***/ }),
-/* 109 */
+/* 110 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
@@ -18076,7 +18119,7 @@ function warning(message) {
}
/***/ }),
-/* 110 */
+/* 111 */
/***/ (function(module, exports, __webpack_require__) {
// style-loader: Adds some css to the DOM by adding a