+
{this.props.artist.summary}
-
diff --git a/app/components/Songs.jsx b/app/components/Songs.jsx
index 536ae08..5d364cf 100644
--- a/app/components/Songs.jsx
+++ b/app/components/Songs.jsx
@@ -50,19 +50,21 @@ export class SongsTable extends Component {
rows.push(
);
});
return (
-
-
-
- |
- Title |
- Artist |
- Album |
- Genre |
- Length |
-
-
- {rows}
-
+
+
+
+
+ |
+ Title |
+ Artist |
+ Album |
+ Genre |
+ Length |
+
+
+ {rows}
+
+
);
}
}
diff --git a/app/dist/fix.ie9.js b/app/dist/fix.ie9.js
index 8af876c..94f5313 100644
--- a/app/dist/fix.ie9.js
+++ b/app/dist/fix.ie9.js
@@ -65,7 +65,7 @@
/******/ }
/******/
/******/ var hotApplyOnUpdate = true;
-/******/ var hotCurrentHash = "3714fc41503d94a2c8bc"; // eslint-disable-line no-unused-vars
+/******/ var hotCurrentHash = "7e07e766a1844626ad6d"; // eslint-disable-line no-unused-vars
/******/ var hotCurrentModuleData = {};
/******/ var hotCurrentParents = []; // eslint-disable-line no-unused-vars
/******/
diff --git a/app/dist/index.js b/app/dist/index.js
index 854837d..c8aa0b4 100644
--- a/app/dist/index.js
+++ b/app/dist/index.js
@@ -65,7 +65,7 @@
/******/ }
/******/
/******/ var hotApplyOnUpdate = true;
-/******/ var hotCurrentHash = "3714fc41503d94a2c8bc"; // eslint-disable-line no-unused-vars
+/******/ var hotCurrentHash = "7e07e766a1844626ad6d"; // eslint-disable-line no-unused-vars
/******/ var hotCurrentModuleData = {};
/******/ var hotCurrentParents = []; // eslint-disable-line no-unused-vars
/******/
@@ -2271,7 +2271,7 @@
/* 283 */
/***/ function(module, exports, __webpack_require__) {
- eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.CALL_API = exports.BASE_API_PATH = exports.API_VERSION = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\n__webpack_require__(284);\n\nvar _isomorphicFetch = __webpack_require__(581);\n\nvar _isomorphicFetch2 = _interopRequireDefault(_isomorphicFetch);\n\nvar _humps = __webpack_require__(583);\n\nvar _humps2 = _interopRequireDefault(_humps);\n\nvar _x2js = __webpack_require__(584);\n\nvar _x2js2 = _interopRequireDefault(_x2js);\n\nvar _utils = __webpack_require__(585);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\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; } // TODO: Refactor using normalizr\n// TODO: https://facebook.github.io/immutable-js/ ?\n\n\nvar API_VERSION = exports.API_VERSION = 350001; /** API version to use. */\nvar BASE_API_PATH = exports.BASE_API_PATH = \"/server/xml.server.php\"; /** Base API path after endpoint. */\n\n// Error class to represents errors from these actions.\n\nvar APIError = function (_Error) {\n _inherits(APIError, _Error);\n\n function APIError() {\n _classCallCheck(this, APIError);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(APIError).apply(this, arguments));\n }\n\n return APIError;\n}(Error);\n\nfunction _checkHTTPStatus(response) {\n if (response.status >= 200 && response.status < 300) {\n return response;\n } else {\n return Promise.reject(response.statusText);\n }\n}\n\nfunction _parseToJSON(responseText) {\n var x2js = new _x2js2.default({\n attributePrefix: \"\",\n keepCData: false\n });\n if (responseText) {\n return x2js.xml_str2json(responseText).root;\n }\n return Promise.reject(\"Invalid response text.\");\n}\n\nfunction _checkAPIErrors(jsonData) {\n if (jsonData.error) {\n return Promise.reject(jsonData.error.cdata + \" (\" + jsonData.error.code + \")\");\n } else if (!jsonData) {\n // No data returned\n return Promise.reject(\"Empty response\");\n }\n return jsonData;\n}\n\nfunction _uglyFixes(endpoint, token) {\n if (typeof _uglyFixes.artistsCount === \"undefined\") {\n _uglyFixes.artistsCount = 0;\n }\n if (typeof _uglyFixes.albumsCount === \"undefined\") {\n _uglyFixes.albumsCount = 0;\n }\n if (typeof _uglyFixes.songsCount === \"undefined\") {\n _uglyFixes.songsCount = 0;\n }\n\n var _uglyFixesSongs = function _uglyFixesSongs(songs) {\n for (var i = 0; i < songs.length; i++) {\n // Fix for name becoming title in songs objects\n songs[i].name = songs[i].title;\n // Fix for length being time in songs objects\n songs[i].length = songs[i].time;\n\n // Fix for cdata left in artist and album\n songs[i].artist.name = songs[i].artist.cdata;\n songs[i].album.name = songs[i].album.cdata;\n }\n return songs;\n };\n\n var _uglyFixesAlbums = function _uglyFixesAlbums(albums) {\n for (var i = 0; i < albums.length; i++) {\n // Fix for absence of distinction between disks in the same album\n if (albums[i].disk > 1) {\n albums[i].name = albums[i].name + \" [Disk \" + albums[i].disk + \"]\";\n }\n\n // Move songs one node top\n if (albums[i].tracks.song) {\n albums[i].tracks = albums[i].tracks.song;\n\n // Ensure tracks is an array\n if (!Array.isArray(albums[i].tracks)) {\n albums[i].tracks = [albums[i].tracks];\n }\n\n // Fix tracks\n albums[i].tracks = _uglyFixesSongs(albums[i].tracks);\n }\n }\n return albums;\n };\n\n return function (jsonData) {\n // Camelize\n jsonData = _humps2.default.camelizeKeys(jsonData);\n\n // Ensure items are always wrapped in an array\n if (jsonData.artist && !Array.isArray(jsonData.artist)) {\n jsonData.artist = [jsonData.artist];\n }\n if (jsonData.album && !Array.isArray(jsonData.album)) {\n jsonData.album = [jsonData.album];\n }\n if (jsonData.song && !Array.isArray(jsonData.song)) {\n jsonData.song = [jsonData.song];\n }\n\n // Keep track of artists count\n if (jsonData.artists) {\n _uglyFixes.artistsCount = parseInt(jsonData.artists);\n }\n // Keep track of albums count\n if (jsonData.albums) {\n _uglyFixes.albumsCount = parseInt(jsonData.albums);\n }\n // Keep track of songs count\n if (jsonData.songs) {\n _uglyFixes.songsCount = parseInt(jsonData.songs);\n }\n\n if (jsonData.artist) {\n for (var i = 0; i < jsonData.artist.length; i++) {\n // Fix for artists art not included\n jsonData.artist[i].art = endpoint.replace(\"/server/xml.server.php\", \"\") + \"/image.php?object_id=\" + jsonData.artist[i].id + \"&object_type=artist&auth=\" + token;\n\n // Move albums one node top\n if (jsonData.artist[i].albums.album) {\n jsonData.artist[i].albums = jsonData.artist[i].albums.album;\n\n // Ensure albums are an array\n if (!Array.isArray(jsonData.artist[i].albums)) {\n jsonData.artist[i].albums = [jsonData.artist[i].albums];\n }\n\n // Fix albums\n jsonData.artist[i].albums = _uglyFixesAlbums(jsonData.artist[i].albums);\n }\n\n // Move songs one node top\n if (jsonData.artist[i].songs.song) {\n jsonData.artist[i].songs = jsonData.artist[i].songs.song;\n\n // Ensure songs are an array\n if (!Array.isArray(jsonData.artist[i].songs)) {\n jsonData.artist[i].songs = [jsonData.artist[i].songs];\n }\n\n // Fix songs\n jsonData.artist[i].songs = _uglyFixesSongs(jsonData.artist[i].songs);\n }\n }\n // Store the total number of items\n jsonData.artists = _uglyFixes.artistsCount;\n }\n if (jsonData.album) {\n // Fix albums\n jsonData.album = _uglyFixesAlbums(jsonData.album);\n // Store the total number of items\n jsonData.albums = _uglyFixes.albumsCount;\n }\n if (jsonData.song) {\n // Fix songs\n jsonData.song = _uglyFixesSongs(jsonData.song);\n // Store the total number of items\n jsonData.songs = _uglyFixes.songsCount;\n }\n\n if (!jsonData.sessionExpire) {\n // Fix for Ampache not returning updated sessionExpire\n jsonData.sessionExpire = new Date(Date.now() + 3600 * 1000).toJSON();\n }\n\n return jsonData;\n };\n}\n\n// Fetches an API response and normalizes the result JSON according to schema.\n// This makes every API response have the same shape, regardless of how nested it was.\nfunction doAPICall(endpoint, action, auth, username, extraParams) {\n var APIAction = extraParams.filter ? action.rstrip(\"s\") : action;\n var baseParams = {\n version: API_VERSION,\n action: APIAction,\n auth: auth,\n user: username\n };\n var params = Object.assign({}, baseParams, extraParams);\n var fullURL = (0, _utils.assembleURLAndParams)(endpoint + BASE_API_PATH, params);\n\n return (0, _isomorphicFetch2.default)(fullURL, {\n method: \"get\"\n }).then(_checkHTTPStatus).then(function (response) {\n return response.text();\n }).then(_parseToJSON).then(_uglyFixes(endpoint, auth)).then(_checkAPIErrors);\n}\n\n// Action key that carries API call info interpreted by this Redux middleware.\nvar CALL_API = exports.CALL_API = \"CALL_API\";\n\n// A Redux middleware that interprets actions with CALL_API info specified.\n// Performs the call and promises when such actions are dispatched.\n\nexports.default = function (store) {\n return function (next) {\n return function (reduxAction) {\n if (reduxAction.type !== CALL_API) {\n // Do not apply on every action\n return next(reduxAction);\n }\n\n var _reduxAction$payload = reduxAction.payload;\n var endpoint = _reduxAction$payload.endpoint;\n var action = _reduxAction$payload.action;\n var auth = _reduxAction$payload.auth;\n var username = _reduxAction$payload.username;\n var dispatch = _reduxAction$payload.dispatch;\n var extraParams = _reduxAction$payload.extraParams;\n\n\n if (!endpoint || typeof endpoint !== \"string\") {\n throw new APIError(\"Specify a string endpoint URL.\");\n }\n if (!action) {\n throw new APIError(\"Specify one of the supported API actions.\");\n }\n if (!auth) {\n throw new APIError(\"Specify an auth token.\");\n }\n if (!username) {\n throw new APIError(\"Specify a username.\");\n }\n if (!Array.isArray(dispatch) || dispatch.length !== 3) {\n throw new APIError(\"Expected an array of three action dispatch.\");\n }\n if (!dispatch.every(function (type) {\n return typeof type === \"function\" || type === null;\n })) {\n throw new APIError(\"Expected action to dispatch to be functions or null.\");\n }\n\n var _dispatch = _slicedToArray(dispatch, 3);\n\n var requestDispatch = _dispatch[0];\n var successDispatch = _dispatch[1];\n var failureDispatch = _dispatch[2];\n\n if (requestDispatch) {\n store.dispatch(requestDispatch());\n }\n\n return doAPICall(endpoint, action, auth, username, extraParams).then(function (response) {\n if (successDispatch) {\n store.dispatch(successDispatch(response));\n }\n }, function (error) {\n if (failureDispatch) {\n store.dispatch(failureDispatch(error.message));\n }\n });\n };\n };\n};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjgzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vL2FwcC9taWRkbGV3YXJlL2FwaS5qcz9kNWY0Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFRPRE86IFJlZmFjdG9yIHVzaW5nIG5vcm1hbGl6clxuLy8gVE9ETzogaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vaW1tdXRhYmxlLWpzLyA/XG5pbXBvcnQgXCJiYWJlbC1wb2x5ZmlsbFwiO1xuaW1wb3J0IGZldGNoIGZyb20gXCJpc29tb3JwaGljLWZldGNoXCI7XG5pbXBvcnQgaHVtcHMgZnJvbSBcImh1bXBzXCI7XG5pbXBvcnQgWDJKUyBmcm9tIFwieDJqc1wiO1xuXG5pbXBvcnQgeyBhc3NlbWJsZVVSTEFuZFBhcmFtcyB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgY29uc3QgQVBJX1ZFUlNJT04gPSAzNTAwMDE7ICAvKiogQVBJIHZlcnNpb24gdG8gdXNlLiAqL1xuZXhwb3J0IGNvbnN0IEJBU0VfQVBJX1BBVEggPSBcIi9zZXJ2ZXIveG1sLnNlcnZlci5waHBcIjsgIC8qKiBCYXNlIEFQSSBwYXRoIGFmdGVyIGVuZHBvaW50LiAqL1xuXG4vLyBFcnJvciBjbGFzcyB0byByZXByZXNlbnRzIGVycm9ycyBmcm9tIHRoZXNlIGFjdGlvbnMuXG5jbGFzcyBBUElFcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbmZ1bmN0aW9uIF9jaGVja0hUVFBTdGF0dXMgKHJlc3BvbnNlKSB7XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA+PSAyMDAgJiYgcmVzcG9uc2Uuc3RhdHVzIDwgMzAwKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBfcGFyc2VUb0pTT04gKHJlc3BvbnNlVGV4dCkge1xuICAgIHZhciB4MmpzID0gbmV3IFgySlMoe1xuICAgICAgICBhdHRyaWJ1dGVQcmVmaXg6IFwiXCIsXG4gICAgICAgIGtlZXBDRGF0YTogZmFsc2VcbiAgICB9KTtcbiAgICBpZiAocmVzcG9uc2VUZXh0KSB7XG4gICAgICAgIHJldHVybiB4MmpzLnhtbF9zdHIyanNvbihyZXNwb25zZVRleHQpLnJvb3Q7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIkludmFsaWQgcmVzcG9uc2UgdGV4dC5cIik7XG59XG5cbmZ1bmN0aW9uIF9jaGVja0FQSUVycm9ycyAoanNvbkRhdGEpIHtcbiAgICBpZiAoanNvbkRhdGEuZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGpzb25EYXRhLmVycm9yLmNkYXRhICsgXCIgKFwiICsganNvbkRhdGEuZXJyb3IuY29kZSArIFwiKVwiKTtcbiAgICB9IGVsc2UgaWYgKCFqc29uRGF0YSkge1xuICAgICAgICAvLyBObyBkYXRhIHJldHVybmVkXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIkVtcHR5IHJlc3BvbnNlXCIpO1xuICAgIH1cbiAgICByZXR1cm4ganNvbkRhdGE7XG59XG5cbmZ1bmN0aW9uIF91Z2x5Rml4ZXMgKGVuZHBvaW50LCB0b2tlbikge1xuICAgIGlmICh0eXBlb2YgX3VnbHlGaXhlcy5hcnRpc3RzQ291bnQgPT09IFwidW5kZWZpbmVkXCIgKSB7XG4gICAgICAgIF91Z2x5Rml4ZXMuYXJ0aXN0c0NvdW50ID0gMDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBfdWdseUZpeGVzLmFsYnVtc0NvdW50ID09PSBcInVuZGVmaW5lZFwiICkge1xuICAgICAgICBfdWdseUZpeGVzLmFsYnVtc0NvdW50ID0gMDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBfdWdseUZpeGVzLnNvbmdzQ291bnQgPT09IFwidW5kZWZpbmVkXCIgKSB7XG4gICAgICAgIF91Z2x5Rml4ZXMuc29uZ3NDb3VudCA9IDA7XG4gICAgfVxuXG4gICAgdmFyIF91Z2x5Rml4ZXNTb25ncyA9IGZ1bmN0aW9uIChzb25ncykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNvbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAvLyBGaXggZm9yIG5hbWUgYmVjb21pbmcgdGl0bGUgaW4gc29uZ3Mgb2JqZWN0c1xuICAgICAgICAgICAgc29uZ3NbaV0ubmFtZSA9IHNvbmdzW2ldLnRpdGxlO1xuICAgICAgICAgICAgLy8gRml4IGZvciBsZW5ndGggYmVpbmcgdGltZSBpbiBzb25ncyBvYmplY3RzXG4gICAgICAgICAgICBzb25nc1tpXS5sZW5ndGggPSBzb25nc1tpXS50aW1lO1xuXG4gICAgICAgICAgICAvLyBGaXggZm9yIGNkYXRhIGxlZnQgaW4gYXJ0aXN0IGFuZCBhbGJ1bVxuICAgICAgICAgICAgc29uZ3NbaV0uYXJ0aXN0Lm5hbWUgPSBzb25nc1tpXS5hcnRpc3QuY2RhdGE7XG4gICAgICAgICAgICBzb25nc1tpXS5hbGJ1bS5uYW1lID0gc29uZ3NbaV0uYWxidW0uY2RhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvbmdzO1xuICAgIH07XG5cbiAgICB2YXIgX3VnbHlGaXhlc0FsYnVtcyA9IGZ1bmN0aW9uIChhbGJ1bXMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGJ1bXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIEZpeCBmb3IgYWJzZW5jZSBvZiBkaXN0aW5jdGlvbiBiZXR3ZWVuIGRpc2tzIGluIHRoZSBzYW1lIGFsYnVtXG4gICAgICAgICAgICBpZiAoYWxidW1zW2ldLmRpc2sgPiAxKSB7XG4gICAgICAgICAgICAgICAgYWxidW1zW2ldLm5hbWUgPSBhbGJ1bXNbaV0ubmFtZSArIFwiIFtEaXNrIFwiICsgYWxidW1zW2ldLmRpc2sgKyBcIl1cIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTW92ZSBzb25ncyBvbmUgbm9kZSB0b3BcbiAgICAgICAgICAgIGlmIChhbGJ1bXNbaV0udHJhY2tzLnNvbmcpIHtcbiAgICAgICAgICAgICAgICBhbGJ1bXNbaV0udHJhY2tzID0gYWxidW1zW2ldLnRyYWNrcy5zb25nO1xuXG4gICAgICAgICAgICAgICAgLy8gRW5zdXJlIHRyYWNrcyBpcyBhbiBhcnJheVxuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhbGJ1bXNbaV0udHJhY2tzKSkge1xuICAgICAgICAgICAgICAgICAgICBhbGJ1bXNbaV0udHJhY2tzID0gW2FsYnVtc1tpXS50cmFja3NdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEZpeCB0cmFja3NcbiAgICAgICAgICAgICAgICBhbGJ1bXNbaV0udHJhY2tzID0gX3VnbHlGaXhlc1NvbmdzKGFsYnVtc1tpXS50cmFja3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhbGJ1bXM7XG4gICAgfTtcblxuICAgIHJldHVybiBqc29uRGF0YSA9PiB7XG4gICAgICAgIC8vIENhbWVsaXplXG4gICAgICAgIGpzb25EYXRhID0gaHVtcHMuY2FtZWxpemVLZXlzKGpzb25EYXRhKTtcblxuICAgICAgICAvLyBFbnN1cmUgaXRlbXMgYXJlIGFsd2F5cyB3cmFwcGVkIGluIGFuIGFycmF5XG4gICAgICAgIGlmIChqc29uRGF0YS5hcnRpc3QgJiYgIUFycmF5LmlzQXJyYXkoanNvbkRhdGEuYXJ0aXN0KSkge1xuICAgICAgICAgICAganNvbkRhdGEuYXJ0aXN0ID0gW2pzb25EYXRhLmFydGlzdF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGpzb25EYXRhLmFsYnVtICYmICFBcnJheS5pc0FycmF5KGpzb25EYXRhLmFsYnVtKSkge1xuICAgICAgICAgICAganNvbkRhdGEuYWxidW0gPSBbanNvbkRhdGEuYWxidW1dO1xuICAgICAgICB9XG4gICAgICAgIGlmIChqc29uRGF0YS5zb25nICYmICFBcnJheS5pc0FycmF5KGpzb25EYXRhLnNvbmcpKSB7XG4gICAgICAgICAgICBqc29uRGF0YS5zb25nID0gW2pzb25EYXRhLnNvbmddO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gS2VlcCB0cmFjayBvZiBhcnRpc3RzIGNvdW50XG4gICAgICAgIGlmIChqc29uRGF0YS5hcnRpc3RzKSB7XG4gICAgICAgICAgICBfdWdseUZpeGVzLmFydGlzdHNDb3VudCA9IHBhcnNlSW50KGpzb25EYXRhLmFydGlzdHMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgYWxidW1zIGNvdW50XG4gICAgICAgIGlmIChqc29uRGF0YS5hbGJ1bXMpIHtcbiAgICAgICAgICAgIF91Z2x5Rml4ZXMuYWxidW1zQ291bnQgPSBwYXJzZUludChqc29uRGF0YS5hbGJ1bXMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEtlZXAgdHJhY2sgb2Ygc29uZ3MgY291bnRcbiAgICAgICAgaWYgKGpzb25EYXRhLnNvbmdzKSB7XG4gICAgICAgICAgICBfdWdseUZpeGVzLnNvbmdzQ291bnQgPSBwYXJzZUludChqc29uRGF0YS5zb25ncyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoanNvbkRhdGEuYXJ0aXN0KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGpzb25EYXRhLmFydGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIEZpeCBmb3IgYXJ0aXN0cyBhcnQgbm90IGluY2x1ZGVkXG4gICAgICAgICAgICAgICAganNvbkRhdGEuYXJ0aXN0W2ldLmFydCA9IGVuZHBvaW50LnJlcGxhY2UoXCIvc2VydmVyL3htbC5zZXJ2ZXIucGhwXCIsIFwiXCIpICsgXCIvaW1hZ2UucGhwP29iamVjdF9pZD1cIiArIGpzb25EYXRhLmFydGlzdFtpXS5pZCArIFwiJm9iamVjdF90eXBlPWFydGlzdCZhdXRoPVwiICsgdG9rZW47XG5cbiAgICAgICAgICAgICAgICAvLyBNb3ZlIGFsYnVtcyBvbmUgbm9kZSB0b3BcbiAgICAgICAgICAgICAgICBpZiAoanNvbkRhdGEuYXJ0aXN0W2ldLmFsYnVtcy5hbGJ1bSkge1xuICAgICAgICAgICAgICAgICAgICBqc29uRGF0YS5hcnRpc3RbaV0uYWxidW1zID0ganNvbkRhdGEuYXJ0aXN0W2ldLmFsYnVtcy5hbGJ1bTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgYWxidW1zIGFyZSBhbiBhcnJheVxuICAgICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoanNvbkRhdGEuYXJ0aXN0W2ldLmFsYnVtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb25EYXRhLmFydGlzdFtpXS5hbGJ1bXMgPSBbanNvbkRhdGEuYXJ0aXN0W2ldLmFsYnVtc107XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBGaXggYWxidW1zXG4gICAgICAgICAgICAgICAgICAgIGpzb25EYXRhLmFydGlzdFtpXS5hbGJ1bXMgPSBfdWdseUZpeGVzQWxidW1zKGpzb25EYXRhLmFydGlzdFtpXS5hbGJ1bXMpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE1vdmUgc29uZ3Mgb25lIG5vZGUgdG9wXG4gICAgICAgICAgICAgICAgaWYgKGpzb25EYXRhLmFydGlzdFtpXS5zb25ncy5zb25nKSB7XG4gICAgICAgICAgICAgICAgICAgIGpzb25EYXRhLmFydGlzdFtpXS5zb25ncyA9IGpzb25EYXRhLmFydGlzdFtpXS5zb25ncy5zb25nO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSBzb25ncyBhcmUgYW4gYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGpzb25EYXRhLmFydGlzdFtpXS5zb25ncykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb25EYXRhLmFydGlzdFtpXS5zb25ncyA9IFtqc29uRGF0YS5hcnRpc3RbaV0uc29uZ3NdO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRml4IHNvbmdzXG4gICAgICAgICAgICAgICAgICAgIGpzb25EYXRhLmFydGlzdFtpXS5zb25ncyA9IF91Z2x5Rml4ZXNTb25ncyhqc29uRGF0YS5hcnRpc3RbaV0uc29uZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFN0b3JlIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXNcbiAgICAgICAgICAgIGpzb25EYXRhLmFydGlzdHMgPSBfdWdseUZpeGVzLmFydGlzdHNDb3VudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoanNvbkRhdGEuYWxidW0pIHtcbiAgICAgICAgICAgIC8vIEZpeCBhbGJ1bXNcbiAgICAgICAgICAgIGpzb25EYXRhLmFsYnVtID0gX3VnbHlGaXhlc0FsYnVtcyhqc29uRGF0YS5hbGJ1bSk7XG4gICAgICAgICAgICAvLyBTdG9yZSB0aGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zXG4gICAgICAgICAgICBqc29uRGF0YS5hbGJ1bXMgPSBfdWdseUZpeGVzLmFsYnVtc0NvdW50O1xuICAgICAgICB9XG4gICAgICAgIGlmIChqc29uRGF0YS5zb25nKSB7XG4gICAgICAgICAgICAvLyBGaXggc29uZ3NcbiAgICAgICAgICAgIGpzb25EYXRhLnNvbmcgPSBfdWdseUZpeGVzU29uZ3MoanNvbkRhdGEuc29uZyk7XG4gICAgICAgICAgICAvLyBTdG9yZSB0aGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zXG4gICAgICAgICAgICBqc29uRGF0YS5zb25ncyA9IF91Z2x5Rml4ZXMuc29uZ3NDb3VudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghanNvbkRhdGEuc2Vzc2lvbkV4cGlyZSkge1xuICAgICAgICAgICAgLy8gRml4IGZvciBBbXBhY2hlIG5vdCByZXR1cm5pbmcgdXBkYXRlZCBzZXNzaW9uRXhwaXJlXG4gICAgICAgICAgICBqc29uRGF0YS5zZXNzaW9uRXhwaXJlID0gKG5ldyBEYXRlKERhdGUubm93KCkgKyAzNjAwICogMTAwMCkpLnRvSlNPTigpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGpzb25EYXRhO1xuICAgIH07XG59XG5cbi8vIEZldGNoZXMgYW4gQVBJIHJlc3BvbnNlIGFuZCBub3JtYWxpemVzIHRoZSByZXN1bHQgSlNPTiBhY2NvcmRpbmcgdG8gc2NoZW1hLlxuLy8gVGhpcyBtYWtlcyBldmVyeSBBUEkgcmVzcG9uc2UgaGF2ZSB0aGUgc2FtZSBzaGFwZSwgcmVnYXJkbGVzcyBvZiBob3cgbmVzdGVkIGl0IHdhcy5cbmZ1bmN0aW9uIGRvQVBJQ2FsbCAoZW5kcG9pbnQsIGFjdGlvbiwgYXV0aCwgdXNlcm5hbWUsIGV4dHJhUGFyYW1zKSB7XG4gICAgY29uc3QgQVBJQWN0aW9uID0gZXh0cmFQYXJhbXMuZmlsdGVyID8gYWN0aW9uLnJzdHJpcChcInNcIikgOiBhY3Rpb247XG4gICAgY29uc3QgYmFzZVBhcmFtcyA9IHtcbiAgICAgICAgdmVyc2lvbjogQVBJX1ZFUlNJT04sXG4gICAgICAgIGFjdGlvbjogQVBJQWN0aW9uLFxuICAgICAgICBhdXRoOiBhdXRoLFxuICAgICAgICB1c2VyOiB1c2VybmFtZVxuICAgIH07XG4gICAgY29uc3QgcGFyYW1zID0gT2JqZWN0LmFzc2lnbih7fSwgYmFzZVBhcmFtcywgZXh0cmFQYXJhbXMpO1xuICAgIGNvbnN0IGZ1bGxVUkwgPSBhc3NlbWJsZVVSTEFuZFBhcmFtcyhlbmRwb2ludCArIEJBU0VfQVBJX1BBVEgsIHBhcmFtcyk7XG5cbiAgICByZXR1cm4gZmV0Y2goZnVsbFVSTCwge1xuICAgICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgfSlcbiAgICAgICAgLnRoZW4oX2NoZWNrSFRUUFN0YXR1cylcbiAgICAgICAgLnRoZW4gKHJlc3BvbnNlID0+IHJlc3BvbnNlLnRleHQoKSlcbiAgICAgICAgLnRoZW4oX3BhcnNlVG9KU09OKVxuICAgICAgICAudGhlbihfdWdseUZpeGVzKGVuZHBvaW50LCBhdXRoKSlcbiAgICAgICAgLnRoZW4oX2NoZWNrQVBJRXJyb3JzKTtcbn1cblxuLy8gQWN0aW9uIGtleSB0aGF0IGNhcnJpZXMgQVBJIGNhbGwgaW5mbyBpbnRlcnByZXRlZCBieSB0aGlzIFJlZHV4IG1pZGRsZXdhcmUuXG5leHBvcnQgY29uc3QgQ0FMTF9BUEkgPSBcIkNBTExfQVBJXCI7XG5cbi8vIEEgUmVkdXggbWlkZGxld2FyZSB0aGF0IGludGVycHJldHMgYWN0aW9ucyB3aXRoIENBTExfQVBJIGluZm8gc3BlY2lmaWVkLlxuLy8gUGVyZm9ybXMgdGhlIGNhbGwgYW5kIHByb21pc2VzIHdoZW4gc3VjaCBhY3Rpb25zIGFyZSBkaXNwYXRjaGVkLlxuZXhwb3J0IGRlZmF1bHQgc3RvcmUgPT4gbmV4dCA9PiByZWR1eEFjdGlvbiA9PiB7XG4gICAgaWYgKHJlZHV4QWN0aW9uLnR5cGUgIT09IENBTExfQVBJKSB7XG4gICAgICAgIC8vIERvIG5vdCBhcHBseSBvbiBldmVyeSBhY3Rpb25cbiAgICAgICAgcmV0dXJuIG5leHQocmVkdXhBY3Rpb24pO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZW5kcG9pbnQsIGFjdGlvbiwgYXV0aCwgdXNlcm5hbWUsIGRpc3BhdGNoLCBleHRyYVBhcmFtcyB9ID0gcmVkdXhBY3Rpb24ucGF5bG9hZDtcblxuICAgIGlmICghZW5kcG9pbnQgfHwgdHlwZW9mIGVuZHBvaW50ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBBUElFcnJvcihcIlNwZWNpZnkgYSBzdHJpbmcgZW5kcG9pbnQgVVJMLlwiKTtcbiAgICB9XG4gICAgaWYgKCFhY3Rpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEFQSUVycm9yKFwiU3BlY2lmeSBvbmUgb2YgdGhlIHN1cHBvcnRlZCBBUEkgYWN0aW9ucy5cIik7XG4gICAgfVxuICAgIGlmICghYXV0aCkge1xuICAgICAgICB0aHJvdyBuZXcgQVBJRXJyb3IoXCJTcGVjaWZ5IGFuIGF1dGggdG9rZW4uXCIpO1xuICAgIH1cbiAgICBpZiAoIXVzZXJuYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBBUElFcnJvcihcIlNwZWNpZnkgYSB1c2VybmFtZS5cIik7XG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheShkaXNwYXRjaCkgfHwgZGlzcGF0Y2gubGVuZ3RoICE9PSAzKSB7XG4gICAgICAgIHRocm93IG5ldyBBUElFcnJvcihcIkV4cGVjdGVkIGFuIGFycmF5IG9mIHRocmVlIGFjdGlvbiBkaXNwYXRjaC5cIik7XG4gICAgfVxuICAgIGlmICghZGlzcGF0Y2guZXZlcnkodHlwZSA9PiB0eXBlb2YgdHlwZSA9PT0gXCJmdW5jdGlvblwiIHx8IHR5cGUgPT09IG51bGwpKSB7XG4gICAgICAgIHRocm93IG5ldyBBUElFcnJvcihcIkV4cGVjdGVkIGFjdGlvbiB0byBkaXNwYXRjaCB0byBiZSBmdW5jdGlvbnMgb3IgbnVsbC5cIik7XG4gICAgfVxuXG4gICAgY29uc3QgWyByZXF1ZXN0RGlzcGF0Y2gsIHN1Y2Nlc3NEaXNwYXRjaCwgZmFpbHVyZURpc3BhdGNoIF0gPSBkaXNwYXRjaDtcbiAgICBpZiAocmVxdWVzdERpc3BhdGNoKSB7XG4gICAgICAgIHN0b3JlLmRpc3BhdGNoKHJlcXVlc3REaXNwYXRjaCgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG9BUElDYWxsKGVuZHBvaW50LCBhY3Rpb24sIGF1dGgsIHVzZXJuYW1lLCBleHRyYVBhcmFtcykudGhlbihcbiAgICAgICAgcmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgaWYgKHN1Y2Nlc3NEaXNwYXRjaCkge1xuICAgICAgICAgICAgICAgIHN0b3JlLmRpc3BhdGNoKHN1Y2Nlc3NEaXNwYXRjaChyZXNwb25zZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvciA9PiB7XG4gICAgICAgICAgICBpZiAoZmFpbHVyZURpc3BhdGNoKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUuZGlzcGF0Y2goZmFpbHVyZURpc3BhdGNoKGVycm9yLm1lc3NhZ2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICk7XG59O1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYXBwL21pZGRsZXdhcmUvYXBpLmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFFQTtBQUNBO0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQ0E7QUFDQTs7Ozs7OztBQVJBO0FBQ0E7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBOzs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUlBO0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQTFCQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUEyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQTVDQTtBQUFBIiwic291cmNlUm9vdCI6IiJ9");
+ eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.CALL_API = exports.BASE_API_PATH = exports.API_VERSION = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\n__webpack_require__(284);\n\nvar _isomorphicFetch = __webpack_require__(581);\n\nvar _isomorphicFetch2 = _interopRequireDefault(_isomorphicFetch);\n\nvar _humps = __webpack_require__(583);\n\nvar _humps2 = _interopRequireDefault(_humps);\n\nvar _x2js = __webpack_require__(584);\n\nvar _x2js2 = _interopRequireDefault(_x2js);\n\nvar _utils = __webpack_require__(585);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\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; } // TODO: Refactor using normalizr\n// TODO: https://facebook.github.io/immutable-js/ ?\n\n\nvar API_VERSION = exports.API_VERSION = 350001; /** API version to use. */\nvar BASE_API_PATH = exports.BASE_API_PATH = \"/server/xml.server.php\"; /** Base API path after endpoint. */\n\n// Error class to represents errors from these actions.\n\nvar APIError = function (_Error) {\n _inherits(APIError, _Error);\n\n function APIError() {\n _classCallCheck(this, APIError);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(APIError).apply(this, arguments));\n }\n\n return APIError;\n}(Error);\n\nfunction _checkHTTPStatus(response) {\n if (response.status >= 200 && response.status < 300) {\n return response;\n } else {\n return Promise.reject(response.statusText);\n }\n}\n\nfunction _parseToJSON(responseText) {\n var x2js = new _x2js2.default({\n attributePrefix: \"\",\n keepCData: false\n });\n if (responseText) {\n return x2js.xml_str2json(responseText).root;\n }\n return Promise.reject(\"Invalid response text.\");\n}\n\nfunction _checkAPIErrors(jsonData) {\n if (jsonData.error) {\n return Promise.reject(jsonData.error.cdata + \" (\" + jsonData.error.code + \")\");\n } else if (!jsonData) {\n // No data returned\n return Promise.reject(\"Empty response\");\n }\n return jsonData;\n}\n\nfunction _uglyFixes(endpoint, token) {\n if (typeof _uglyFixes.artistsCount === \"undefined\") {\n _uglyFixes.artistsCount = 0;\n }\n if (typeof _uglyFixes.albumsCount === \"undefined\") {\n _uglyFixes.albumsCount = 0;\n }\n if (typeof _uglyFixes.songsCount === \"undefined\") {\n _uglyFixes.songsCount = 0;\n }\n\n var _uglyFixesSongs = function _uglyFixesSongs(songs) {\n for (var i = 0; i < songs.length; i++) {\n // Fix for name becoming title in songs objects\n songs[i].name = songs[i].title;\n // Fix for length being time in songs objects\n songs[i].length = songs[i].time;\n\n // Fix for cdata left in artist and album\n songs[i].artist.name = songs[i].artist.cdata;\n songs[i].album.name = songs[i].album.cdata;\n }\n return songs;\n };\n\n var _uglyFixesAlbums = function _uglyFixesAlbums(albums) {\n for (var i = 0; i < albums.length; i++) {\n // Fix for absence of distinction between disks in the same album\n if (albums[i].disk > 1) {\n albums[i].name = albums[i].name + \" [Disk \" + albums[i].disk + \"]\";\n }\n\n // Move songs one node top\n if (albums[i].tracks.song) {\n albums[i].tracks = albums[i].tracks.song;\n\n // Ensure tracks is an array\n if (!Array.isArray(albums[i].tracks)) {\n albums[i].tracks = [albums[i].tracks];\n }\n\n // Fix tracks\n albums[i].tracks = _uglyFixesSongs(albums[i].tracks);\n }\n }\n return albums;\n };\n\n return function (jsonData) {\n // Camelize\n jsonData = _humps2.default.camelizeKeys(jsonData);\n\n // Ensure items are always wrapped in an array\n if (jsonData.artist && !Array.isArray(jsonData.artist)) {\n jsonData.artist = [jsonData.artist];\n }\n if (jsonData.album && !Array.isArray(jsonData.album)) {\n jsonData.album = [jsonData.album];\n }\n if (jsonData.song && !Array.isArray(jsonData.song)) {\n jsonData.song = [jsonData.song];\n }\n\n // Keep track of artists count\n if (jsonData.artists) {\n _uglyFixes.artistsCount = parseInt(jsonData.artists);\n }\n // Keep track of albums count\n if (jsonData.albums) {\n _uglyFixes.albumsCount = parseInt(jsonData.albums);\n }\n // Keep track of songs count\n if (jsonData.songs) {\n _uglyFixes.songsCount = parseInt(jsonData.songs);\n }\n\n if (jsonData.artist) {\n for (var i = 0; i < jsonData.artist.length; i++) {\n // Fix for artists art not included\n jsonData.artist[i].art = endpoint.replace(\"/server/xml.server.php\", \"\") + \"/image.php?object_id=\" + jsonData.artist[i].id + \"&object_type=artist&auth=\" + token;\n\n // Move albums one node top\n if (jsonData.artist[i].albums.album) {\n jsonData.artist[i].albums = jsonData.artist[i].albums.album;\n\n // Ensure albums are an array\n if (!Array.isArray(jsonData.artist[i].albums)) {\n jsonData.artist[i].albums = [jsonData.artist[i].albums];\n }\n\n // Fix albums\n jsonData.artist[i].albums = _uglyFixesAlbums(jsonData.artist[i].albums);\n }\n\n // Move songs one node top\n if (jsonData.artist[i].songs.song) {\n jsonData.artist[i].songs = jsonData.artist[i].songs.song;\n\n // Ensure songs are an array\n if (!Array.isArray(jsonData.artist[i].songs)) {\n jsonData.artist[i].songs = [jsonData.artist[i].songs];\n }\n\n // Fix songs\n jsonData.artist[i].songs = _uglyFixesSongs(jsonData.artist[i].songs);\n }\n }\n // Store the total number of items\n jsonData.artists = _uglyFixes.artistsCount;\n }\n if (jsonData.album) {\n // Fix albums\n jsonData.album = _uglyFixesAlbums(jsonData.album);\n // Store the total number of items\n jsonData.albums = _uglyFixes.albumsCount;\n }\n if (jsonData.song) {\n // Fix songs\n jsonData.song = _uglyFixesSongs(jsonData.song);\n // Store the total number of items\n jsonData.songs = _uglyFixes.songsCount;\n }\n\n if (!jsonData.sessionExpire) {\n // Fix for Ampache not returning updated sessionExpire\n jsonData.sessionExpire = new Date(Date.now() + 3600 * 1000).toJSON();\n }\n\n return jsonData;\n };\n}\n\n// Fetches an API response and normalizes the result JSON according to schema.\n// This makes every API response have the same shape, regardless of how nested it was.\nfunction doAPICall(endpoint, action, auth, username, extraParams) {\n var APIAction = extraParams.filter ? action.rstrip(\"s\") : action;\n var baseParams = {\n version: API_VERSION,\n action: APIAction,\n auth: auth,\n user: username\n };\n var params = Object.assign({}, baseParams, extraParams);\n var fullURL = (0, _utils.assembleURLAndParams)(endpoint + BASE_API_PATH, params);\n\n return (0, _isomorphicFetch2.default)(fullURL, {\n method: \"get\"\n }).then(_checkHTTPStatus).then(function (response) {\n return response.text();\n }).then(_parseToJSON).then(_uglyFixes(endpoint, auth)).then(_checkAPIErrors);\n}\n\n// Action key that carries API call info interpreted by this Redux middleware.\nvar CALL_API = exports.CALL_API = \"CALL_API\";\n\n// A Redux middleware that interprets actions with CALL_API info specified.\n// Performs the call and promises when such actions are dispatched.\n\nexports.default = function (store) {\n return function (next) {\n return function (reduxAction) {\n if (reduxAction.type !== CALL_API) {\n // Do not apply on every action\n return next(reduxAction);\n }\n\n var _reduxAction$payload = reduxAction.payload;\n var endpoint = _reduxAction$payload.endpoint;\n var action = _reduxAction$payload.action;\n var auth = _reduxAction$payload.auth;\n var username = _reduxAction$payload.username;\n var dispatch = _reduxAction$payload.dispatch;\n var extraParams = _reduxAction$payload.extraParams;\n\n\n if (!endpoint || typeof endpoint !== \"string\") {\n throw new APIError(\"Specify a string endpoint URL.\");\n }\n if (!action) {\n throw new APIError(\"Specify one of the supported API actions.\");\n }\n if (!auth) {\n throw new APIError(\"Specify an auth token.\");\n }\n if (!username) {\n throw new APIError(\"Specify a username.\");\n }\n if (!Array.isArray(dispatch) || dispatch.length !== 3) {\n throw new APIError(\"Expected an array of three action dispatch.\");\n }\n if (!dispatch.every(function (type) {\n return typeof type === \"function\" || type === null;\n })) {\n throw new APIError(\"Expected action to dispatch to be functions or null.\");\n }\n\n var _dispatch = _slicedToArray(dispatch, 3);\n\n var requestDispatch = _dispatch[0];\n var successDispatch = _dispatch[1];\n var failureDispatch = _dispatch[2];\n\n if (requestDispatch) {\n store.dispatch(requestDispatch());\n }\n\n return doAPICall(endpoint, action, auth, username, extraParams).then(function (response) {\n if (successDispatch) {\n store.dispatch(successDispatch(response));\n }\n }, function (error) {\n if (failureDispatch) {\n if (typeof error !== \"string\") {\n error = error.message;\n }\n store.dispatch(failureDispatch(error));\n }\n });\n };\n };\n};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjgzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vL2FwcC9taWRkbGV3YXJlL2FwaS5qcz9kNWY0Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFRPRE86IFJlZmFjdG9yIHVzaW5nIG5vcm1hbGl6clxuLy8gVE9ETzogaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vaW1tdXRhYmxlLWpzLyA/XG5pbXBvcnQgXCJiYWJlbC1wb2x5ZmlsbFwiO1xuaW1wb3J0IGZldGNoIGZyb20gXCJpc29tb3JwaGljLWZldGNoXCI7XG5pbXBvcnQgaHVtcHMgZnJvbSBcImh1bXBzXCI7XG5pbXBvcnQgWDJKUyBmcm9tIFwieDJqc1wiO1xuXG5pbXBvcnQgeyBhc3NlbWJsZVVSTEFuZFBhcmFtcyB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgY29uc3QgQVBJX1ZFUlNJT04gPSAzNTAwMDE7ICAvKiogQVBJIHZlcnNpb24gdG8gdXNlLiAqL1xuZXhwb3J0IGNvbnN0IEJBU0VfQVBJX1BBVEggPSBcIi9zZXJ2ZXIveG1sLnNlcnZlci5waHBcIjsgIC8qKiBCYXNlIEFQSSBwYXRoIGFmdGVyIGVuZHBvaW50LiAqL1xuXG4vLyBFcnJvciBjbGFzcyB0byByZXByZXNlbnRzIGVycm9ycyBmcm9tIHRoZXNlIGFjdGlvbnMuXG5jbGFzcyBBUElFcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbmZ1bmN0aW9uIF9jaGVja0hUVFBTdGF0dXMgKHJlc3BvbnNlKSB7XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA+PSAyMDAgJiYgcmVzcG9uc2Uuc3RhdHVzIDwgMzAwKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBfcGFyc2VUb0pTT04gKHJlc3BvbnNlVGV4dCkge1xuICAgIHZhciB4MmpzID0gbmV3IFgySlMoe1xuICAgICAgICBhdHRyaWJ1dGVQcmVmaXg6IFwiXCIsXG4gICAgICAgIGtlZXBDRGF0YTogZmFsc2VcbiAgICB9KTtcbiAgICBpZiAocmVzcG9uc2VUZXh0KSB7XG4gICAgICAgIHJldHVybiB4MmpzLnhtbF9zdHIyanNvbihyZXNwb25zZVRleHQpLnJvb3Q7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIkludmFsaWQgcmVzcG9uc2UgdGV4dC5cIik7XG59XG5cbmZ1bmN0aW9uIF9jaGVja0FQSUVycm9ycyAoanNvbkRhdGEpIHtcbiAgICBpZiAoanNvbkRhdGEuZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGpzb25EYXRhLmVycm9yLmNkYXRhICsgXCIgKFwiICsganNvbkRhdGEuZXJyb3IuY29kZSArIFwiKVwiKTtcbiAgICB9IGVsc2UgaWYgKCFqc29uRGF0YSkge1xuICAgICAgICAvLyBObyBkYXRhIHJldHVybmVkXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIkVtcHR5IHJlc3BvbnNlXCIpO1xuICAgIH1cbiAgICByZXR1cm4ganNvbkRhdGE7XG59XG5cbmZ1bmN0aW9uIF91Z2x5Rml4ZXMgKGVuZHBvaW50LCB0b2tlbikge1xuICAgIGlmICh0eXBlb2YgX3VnbHlGaXhlcy5hcnRpc3RzQ291bnQgPT09IFwidW5kZWZpbmVkXCIgKSB7XG4gICAgICAgIF91Z2x5Rml4ZXMuYXJ0aXN0c0NvdW50ID0gMDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBfdWdseUZpeGVzLmFsYnVtc0NvdW50ID09PSBcInVuZGVmaW5lZFwiICkge1xuICAgICAgICBfdWdseUZpeGVzLmFsYnVtc0NvdW50ID0gMDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBfdWdseUZpeGVzLnNvbmdzQ291bnQgPT09IFwidW5kZWZpbmVkXCIgKSB7XG4gICAgICAgIF91Z2x5Rml4ZXMuc29uZ3NDb3VudCA9IDA7XG4gICAgfVxuXG4gICAgdmFyIF91Z2x5Rml4ZXNTb25ncyA9IGZ1bmN0aW9uIChzb25ncykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNvbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAvLyBGaXggZm9yIG5hbWUgYmVjb21pbmcgdGl0bGUgaW4gc29uZ3Mgb2JqZWN0c1xuICAgICAgICAgICAgc29uZ3NbaV0ubmFtZSA9IHNvbmdzW2ldLnRpdGxlO1xuICAgICAgICAgICAgLy8gRml4IGZvciBsZW5ndGggYmVpbmcgdGltZSBpbiBzb25ncyBvYmplY3RzXG4gICAgICAgICAgICBzb25nc1tpXS5sZW5ndGggPSBzb25nc1tpXS50aW1lO1xuXG4gICAgICAgICAgICAvLyBGaXggZm9yIGNkYXRhIGxlZnQgaW4gYXJ0aXN0IGFuZCBhbGJ1bVxuICAgICAgICAgICAgc29uZ3NbaV0uYXJ0aXN0Lm5hbWUgPSBzb25nc1tpXS5hcnRpc3QuY2RhdGE7XG4gICAgICAgICAgICBzb25nc1tpXS5hbGJ1bS5uYW1lID0gc29uZ3NbaV0uYWxidW0uY2RhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvbmdzO1xuICAgIH07XG5cbiAgICB2YXIgX3VnbHlGaXhlc0FsYnVtcyA9IGZ1bmN0aW9uIChhbGJ1bXMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGJ1bXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIEZpeCBmb3IgYWJzZW5jZSBvZiBkaXN0aW5jdGlvbiBiZXR3ZWVuIGRpc2tzIGluIHRoZSBzYW1lIGFsYnVtXG4gICAgICAgICAgICBpZiAoYWxidW1zW2ldLmRpc2sgPiAxKSB7XG4gICAgICAgICAgICAgICAgYWxidW1zW2ldLm5hbWUgPSBhbGJ1bXNbaV0ubmFtZSArIFwiIFtEaXNrIFwiICsgYWxidW1zW2ldLmRpc2sgKyBcIl1cIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTW92ZSBzb25ncyBvbmUgbm9kZSB0b3BcbiAgICAgICAgICAgIGlmIChhbGJ1bXNbaV0udHJhY2tzLnNvbmcpIHtcbiAgICAgICAgICAgICAgICBhbGJ1bXNbaV0udHJhY2tzID0gYWxidW1zW2ldLnRyYWNrcy5zb25nO1xuXG4gICAgICAgICAgICAgICAgLy8gRW5zdXJlIHRyYWNrcyBpcyBhbiBhcnJheVxuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhbGJ1bXNbaV0udHJhY2tzKSkge1xuICAgICAgICAgICAgICAgICAgICBhbGJ1bXNbaV0udHJhY2tzID0gW2FsYnVtc1tpXS50cmFja3NdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEZpeCB0cmFja3NcbiAgICAgICAgICAgICAgICBhbGJ1bXNbaV0udHJhY2tzID0gX3VnbHlGaXhlc1NvbmdzKGFsYnVtc1tpXS50cmFja3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhbGJ1bXM7XG4gICAgfTtcblxuICAgIHJldHVybiBqc29uRGF0YSA9PiB7XG4gICAgICAgIC8vIENhbWVsaXplXG4gICAgICAgIGpzb25EYXRhID0gaHVtcHMuY2FtZWxpemVLZXlzKGpzb25EYXRhKTtcblxuICAgICAgICAvLyBFbnN1cmUgaXRlbXMgYXJlIGFsd2F5cyB3cmFwcGVkIGluIGFuIGFycmF5XG4gICAgICAgIGlmIChqc29uRGF0YS5hcnRpc3QgJiYgIUFycmF5LmlzQXJyYXkoanNvbkRhdGEuYXJ0aXN0KSkge1xuICAgICAgICAgICAganNvbkRhdGEuYXJ0aXN0ID0gW2pzb25EYXRhLmFydGlzdF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGpzb25EYXRhLmFsYnVtICYmICFBcnJheS5pc0FycmF5KGpzb25EYXRhLmFsYnVtKSkge1xuICAgICAgICAgICAganNvbkRhdGEuYWxidW0gPSBbanNvbkRhdGEuYWxidW1dO1xuICAgICAgICB9XG4gICAgICAgIGlmIChqc29uRGF0YS5zb25nICYmICFBcnJheS5pc0FycmF5KGpzb25EYXRhLnNvbmcpKSB7XG4gICAgICAgICAgICBqc29uRGF0YS5zb25nID0gW2pzb25EYXRhLnNvbmddO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gS2VlcCB0cmFjayBvZiBhcnRpc3RzIGNvdW50XG4gICAgICAgIGlmIChqc29uRGF0YS5hcnRpc3RzKSB7XG4gICAgICAgICAgICBfdWdseUZpeGVzLmFydGlzdHNDb3VudCA9IHBhcnNlSW50KGpzb25EYXRhLmFydGlzdHMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgYWxidW1zIGNvdW50XG4gICAgICAgIGlmIChqc29uRGF0YS5hbGJ1bXMpIHtcbiAgICAgICAgICAgIF91Z2x5Rml4ZXMuYWxidW1zQ291bnQgPSBwYXJzZUludChqc29uRGF0YS5hbGJ1bXMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEtlZXAgdHJhY2sgb2Ygc29uZ3MgY291bnRcbiAgICAgICAgaWYgKGpzb25EYXRhLnNvbmdzKSB7XG4gICAgICAgICAgICBfdWdseUZpeGVzLnNvbmdzQ291bnQgPSBwYXJzZUludChqc29uRGF0YS5zb25ncyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoanNvbkRhdGEuYXJ0aXN0KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGpzb25EYXRhLmFydGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIEZpeCBmb3IgYXJ0aXN0cyBhcnQgbm90IGluY2x1ZGVkXG4gICAgICAgICAgICAgICAganNvbkRhdGEuYXJ0aXN0W2ldLmFydCA9IGVuZHBvaW50LnJlcGxhY2UoXCIvc2VydmVyL3htbC5zZXJ2ZXIucGhwXCIsIFwiXCIpICsgXCIvaW1hZ2UucGhwP29iamVjdF9pZD1cIiArIGpzb25EYXRhLmFydGlzdFtpXS5pZCArIFwiJm9iamVjdF90eXBlPWFydGlzdCZhdXRoPVwiICsgdG9rZW47XG5cbiAgICAgICAgICAgICAgICAvLyBNb3ZlIGFsYnVtcyBvbmUgbm9kZSB0b3BcbiAgICAgICAgICAgICAgICBpZiAoanNvbkRhdGEuYXJ0aXN0W2ldLmFsYnVtcy5hbGJ1bSkge1xuICAgICAgICAgICAgICAgICAgICBqc29uRGF0YS5hcnRpc3RbaV0uYWxidW1zID0ganNvbkRhdGEuYXJ0aXN0W2ldLmFsYnVtcy5hbGJ1bTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgYWxidW1zIGFyZSBhbiBhcnJheVxuICAgICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoanNvbkRhdGEuYXJ0aXN0W2ldLmFsYnVtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb25EYXRhLmFydGlzdFtpXS5hbGJ1bXMgPSBbanNvbkRhdGEuYXJ0aXN0W2ldLmFsYnVtc107XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBGaXggYWxidW1zXG4gICAgICAgICAgICAgICAgICAgIGpzb25EYXRhLmFydGlzdFtpXS5hbGJ1bXMgPSBfdWdseUZpeGVzQWxidW1zKGpzb25EYXRhLmFydGlzdFtpXS5hbGJ1bXMpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE1vdmUgc29uZ3Mgb25lIG5vZGUgdG9wXG4gICAgICAgICAgICAgICAgaWYgKGpzb25EYXRhLmFydGlzdFtpXS5zb25ncy5zb25nKSB7XG4gICAgICAgICAgICAgICAgICAgIGpzb25EYXRhLmFydGlzdFtpXS5zb25ncyA9IGpzb25EYXRhLmFydGlzdFtpXS5zb25ncy5zb25nO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSBzb25ncyBhcmUgYW4gYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGpzb25EYXRhLmFydGlzdFtpXS5zb25ncykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb25EYXRhLmFydGlzdFtpXS5zb25ncyA9IFtqc29uRGF0YS5hcnRpc3RbaV0uc29uZ3NdO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRml4IHNvbmdzXG4gICAgICAgICAgICAgICAgICAgIGpzb25EYXRhLmFydGlzdFtpXS5zb25ncyA9IF91Z2x5Rml4ZXNTb25ncyhqc29uRGF0YS5hcnRpc3RbaV0uc29uZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFN0b3JlIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXNcbiAgICAgICAgICAgIGpzb25EYXRhLmFydGlzdHMgPSBfdWdseUZpeGVzLmFydGlzdHNDb3VudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoanNvbkRhdGEuYWxidW0pIHtcbiAgICAgICAgICAgIC8vIEZpeCBhbGJ1bXNcbiAgICAgICAgICAgIGpzb25EYXRhLmFsYnVtID0gX3VnbHlGaXhlc0FsYnVtcyhqc29uRGF0YS5hbGJ1bSk7XG4gICAgICAgICAgICAvLyBTdG9yZSB0aGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zXG4gICAgICAgICAgICBqc29uRGF0YS5hbGJ1bXMgPSBfdWdseUZpeGVzLmFsYnVtc0NvdW50O1xuICAgICAgICB9XG4gICAgICAgIGlmIChqc29uRGF0YS5zb25nKSB7XG4gICAgICAgICAgICAvLyBGaXggc29uZ3NcbiAgICAgICAgICAgIGpzb25EYXRhLnNvbmcgPSBfdWdseUZpeGVzU29uZ3MoanNvbkRhdGEuc29uZyk7XG4gICAgICAgICAgICAvLyBTdG9yZSB0aGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zXG4gICAgICAgICAgICBqc29uRGF0YS5zb25ncyA9IF91Z2x5Rml4ZXMuc29uZ3NDb3VudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghanNvbkRhdGEuc2Vzc2lvbkV4cGlyZSkge1xuICAgICAgICAgICAgLy8gRml4IGZvciBBbXBhY2hlIG5vdCByZXR1cm5pbmcgdXBkYXRlZCBzZXNzaW9uRXhwaXJlXG4gICAgICAgICAgICBqc29uRGF0YS5zZXNzaW9uRXhwaXJlID0gKG5ldyBEYXRlKERhdGUubm93KCkgKyAzNjAwICogMTAwMCkpLnRvSlNPTigpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGpzb25EYXRhO1xuICAgIH07XG59XG5cbi8vIEZldGNoZXMgYW4gQVBJIHJlc3BvbnNlIGFuZCBub3JtYWxpemVzIHRoZSByZXN1bHQgSlNPTiBhY2NvcmRpbmcgdG8gc2NoZW1hLlxuLy8gVGhpcyBtYWtlcyBldmVyeSBBUEkgcmVzcG9uc2UgaGF2ZSB0aGUgc2FtZSBzaGFwZSwgcmVnYXJkbGVzcyBvZiBob3cgbmVzdGVkIGl0IHdhcy5cbmZ1bmN0aW9uIGRvQVBJQ2FsbCAoZW5kcG9pbnQsIGFjdGlvbiwgYXV0aCwgdXNlcm5hbWUsIGV4dHJhUGFyYW1zKSB7XG4gICAgY29uc3QgQVBJQWN0aW9uID0gZXh0cmFQYXJhbXMuZmlsdGVyID8gYWN0aW9uLnJzdHJpcChcInNcIikgOiBhY3Rpb247XG4gICAgY29uc3QgYmFzZVBhcmFtcyA9IHtcbiAgICAgICAgdmVyc2lvbjogQVBJX1ZFUlNJT04sXG4gICAgICAgIGFjdGlvbjogQVBJQWN0aW9uLFxuICAgICAgICBhdXRoOiBhdXRoLFxuICAgICAgICB1c2VyOiB1c2VybmFtZVxuICAgIH07XG4gICAgY29uc3QgcGFyYW1zID0gT2JqZWN0LmFzc2lnbih7fSwgYmFzZVBhcmFtcywgZXh0cmFQYXJhbXMpO1xuICAgIGNvbnN0IGZ1bGxVUkwgPSBhc3NlbWJsZVVSTEFuZFBhcmFtcyhlbmRwb2ludCArIEJBU0VfQVBJX1BBVEgsIHBhcmFtcyk7XG5cbiAgICByZXR1cm4gZmV0Y2goZnVsbFVSTCwge1xuICAgICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgfSlcbiAgICAgICAgLnRoZW4oX2NoZWNrSFRUUFN0YXR1cylcbiAgICAgICAgLnRoZW4gKHJlc3BvbnNlID0+IHJlc3BvbnNlLnRleHQoKSlcbiAgICAgICAgLnRoZW4oX3BhcnNlVG9KU09OKVxuICAgICAgICAudGhlbihfdWdseUZpeGVzKGVuZHBvaW50LCBhdXRoKSlcbiAgICAgICAgLnRoZW4oX2NoZWNrQVBJRXJyb3JzKTtcbn1cblxuLy8gQWN0aW9uIGtleSB0aGF0IGNhcnJpZXMgQVBJIGNhbGwgaW5mbyBpbnRlcnByZXRlZCBieSB0aGlzIFJlZHV4IG1pZGRsZXdhcmUuXG5leHBvcnQgY29uc3QgQ0FMTF9BUEkgPSBcIkNBTExfQVBJXCI7XG5cbi8vIEEgUmVkdXggbWlkZGxld2FyZSB0aGF0IGludGVycHJldHMgYWN0aW9ucyB3aXRoIENBTExfQVBJIGluZm8gc3BlY2lmaWVkLlxuLy8gUGVyZm9ybXMgdGhlIGNhbGwgYW5kIHByb21pc2VzIHdoZW4gc3VjaCBhY3Rpb25zIGFyZSBkaXNwYXRjaGVkLlxuZXhwb3J0IGRlZmF1bHQgc3RvcmUgPT4gbmV4dCA9PiByZWR1eEFjdGlvbiA9PiB7XG4gICAgaWYgKHJlZHV4QWN0aW9uLnR5cGUgIT09IENBTExfQVBJKSB7XG4gICAgICAgIC8vIERvIG5vdCBhcHBseSBvbiBldmVyeSBhY3Rpb25cbiAgICAgICAgcmV0dXJuIG5leHQocmVkdXhBY3Rpb24pO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZW5kcG9pbnQsIGFjdGlvbiwgYXV0aCwgdXNlcm5hbWUsIGRpc3BhdGNoLCBleHRyYVBhcmFtcyB9ID0gcmVkdXhBY3Rpb24ucGF5bG9hZDtcblxuICAgIGlmICghZW5kcG9pbnQgfHwgdHlwZW9mIGVuZHBvaW50ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBBUElFcnJvcihcIlNwZWNpZnkgYSBzdHJpbmcgZW5kcG9pbnQgVVJMLlwiKTtcbiAgICB9XG4gICAgaWYgKCFhY3Rpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEFQSUVycm9yKFwiU3BlY2lmeSBvbmUgb2YgdGhlIHN1cHBvcnRlZCBBUEkgYWN0aW9ucy5cIik7XG4gICAgfVxuICAgIGlmICghYXV0aCkge1xuICAgICAgICB0aHJvdyBuZXcgQVBJRXJyb3IoXCJTcGVjaWZ5IGFuIGF1dGggdG9rZW4uXCIpO1xuICAgIH1cbiAgICBpZiAoIXVzZXJuYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBBUElFcnJvcihcIlNwZWNpZnkgYSB1c2VybmFtZS5cIik7XG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheShkaXNwYXRjaCkgfHwgZGlzcGF0Y2gubGVuZ3RoICE9PSAzKSB7XG4gICAgICAgIHRocm93IG5ldyBBUElFcnJvcihcIkV4cGVjdGVkIGFuIGFycmF5IG9mIHRocmVlIGFjdGlvbiBkaXNwYXRjaC5cIik7XG4gICAgfVxuICAgIGlmICghZGlzcGF0Y2guZXZlcnkodHlwZSA9PiB0eXBlb2YgdHlwZSA9PT0gXCJmdW5jdGlvblwiIHx8IHR5cGUgPT09IG51bGwpKSB7XG4gICAgICAgIHRocm93IG5ldyBBUElFcnJvcihcIkV4cGVjdGVkIGFjdGlvbiB0byBkaXNwYXRjaCB0byBiZSBmdW5jdGlvbnMgb3IgbnVsbC5cIik7XG4gICAgfVxuXG4gICAgY29uc3QgWyByZXF1ZXN0RGlzcGF0Y2gsIHN1Y2Nlc3NEaXNwYXRjaCwgZmFpbHVyZURpc3BhdGNoIF0gPSBkaXNwYXRjaDtcbiAgICBpZiAocmVxdWVzdERpc3BhdGNoKSB7XG4gICAgICAgIHN0b3JlLmRpc3BhdGNoKHJlcXVlc3REaXNwYXRjaCgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG9BUElDYWxsKGVuZHBvaW50LCBhY3Rpb24sIGF1dGgsIHVzZXJuYW1lLCBleHRyYVBhcmFtcykudGhlbihcbiAgICAgICAgcmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgaWYgKHN1Y2Nlc3NEaXNwYXRjaCkge1xuICAgICAgICAgICAgICAgIHN0b3JlLmRpc3BhdGNoKHN1Y2Nlc3NEaXNwYXRjaChyZXNwb25zZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvciA9PiB7XG4gICAgICAgICAgICBpZiAoZmFpbHVyZURpc3BhdGNoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlcnJvciAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0b3JlLmRpc3BhdGNoKGZhaWx1cmVEaXNwYXRjaChlcnJvcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgKTtcbn07XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhcHAvbWlkZGxld2FyZS9hcGkuanNcbiAqKi8iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUVBO0FBQ0E7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFDQTtBQUNBOzs7Ozs7O0FBUkE7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBSUE7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBMUJBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQTJCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBL0NBO0FBQUEiLCJzb3VyY2VSb290IjoiIn0=");
/***/ },
/* 284 */
@@ -4401,7 +4401,7 @@
/* 638 */
/***/ function(module, exports, __webpack_require__) {
- eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.SongsTable = exports.SongsTableRow = undefined;\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 _react = __webpack_require__(22);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouter = __webpack_require__(192);\n\nvar _fuse = __webpack_require__(626);\n\nvar _fuse2 = _interopRequireDefault(_fuse);\n\nvar _FilterBar = __webpack_require__(629);\n\nvar _FilterBar2 = _interopRequireDefault(_FilterBar);\n\nvar _Pagination = __webpack_require__(630);\n\nvar _Pagination2 = _interopRequireDefault(_Pagination);\n\nvar _utils = __webpack_require__(585);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\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 SongsTableRow = exports.SongsTableRow = function (_Component) {\n _inherits(SongsTableRow, _Component);\n\n function SongsTableRow() {\n _classCallCheck(this, SongsTableRow);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(SongsTableRow).apply(this, arguments));\n }\n\n _createClass(SongsTableRow, [{\n key: \"render\",\n value: function render() {\n var length = (0, _utils.formatLength)(this.props.song.length);\n var linkToArtist = \"/artist/\" + this.props.song.artist.id;\n var linkToAlbum = \"/album/\" + this.props.song.album.id;\n return _react2.default.createElement(\n \"tr\",\n null,\n _react2.default.createElement(\"td\", null),\n _react2.default.createElement(\n \"td\",\n { className: \"title\" },\n this.props.song.name\n ),\n _react2.default.createElement(\n \"td\",\n { className: \"artist\" },\n _react2.default.createElement(\n _reactRouter.Link,\n { to: linkToArtist },\n this.props.song.artist.name\n )\n ),\n _react2.default.createElement(\n \"td\",\n { className: \"artist\" },\n _react2.default.createElement(\n _reactRouter.Link,\n { to: linkToAlbum },\n this.props.song.album.name\n )\n ),\n _react2.default.createElement(\n \"td\",\n { className: \"genre\" },\n this.props.song.genre\n ),\n _react2.default.createElement(\n \"td\",\n { className: \"length\" },\n length\n )\n );\n }\n }]);\n\n return SongsTableRow;\n}(_react.Component);\n\nSongsTableRow.propTypes = {\n song: _react.PropTypes.object.isRequired\n};\n\nvar SongsTable = exports.SongsTable = function (_Component2) {\n _inherits(SongsTable, _Component2);\n\n function SongsTable() {\n _classCallCheck(this, SongsTable);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(SongsTable).apply(this, arguments));\n }\n\n _createClass(SongsTable, [{\n key: \"render\",\n value: function render() {\n var displayedSongs = this.props.songs;\n if (this.props.filterText) {\n // Use Fuse for the filter\n displayedSongs = new _fuse2.default(this.props.songs, {\n \"keys\": [\"name\"],\n \"threshold\": 0.4,\n \"include\": [\"score\"]\n }).search(this.props.filterText);\n // Keep only items in results\n displayedSongs = displayedSongs.map(function (item) {\n return item.item;\n });\n }\n\n var rows = [];\n displayedSongs.forEach(function (song) {\n rows.push(_react2.default.createElement(SongsTableRow, { song: song, key: song.id }));\n });\n return _react2.default.createElement(\n \"table\",\n { className: \"table table-hover songs\" },\n _react2.default.createElement(\n \"thead\",\n null,\n _react2.default.createElement(\n \"tr\",\n null,\n _react2.default.createElement(\"th\", null),\n _react2.default.createElement(\n \"th\",\n null,\n \"Title\"\n ),\n _react2.default.createElement(\n \"th\",\n null,\n \"Artist\"\n ),\n _react2.default.createElement(\n \"th\",\n null,\n \"Album\"\n ),\n _react2.default.createElement(\n \"th\",\n null,\n \"Genre\"\n ),\n _react2.default.createElement(\n \"th\",\n null,\n \"Length\"\n )\n )\n ),\n _react2.default.createElement(\n \"tbody\",\n null,\n rows\n )\n );\n }\n }]);\n\n return SongsTable;\n}(_react.Component);\n\nSongsTable.propTypes = {\n songs: _react.PropTypes.array.isRequired,\n filterText: _react.PropTypes.string\n};\n\nvar FilterablePaginatedSongsTable = function (_Component3) {\n _inherits(FilterablePaginatedSongsTable, _Component3);\n\n function FilterablePaginatedSongsTable(props) {\n _classCallCheck(this, FilterablePaginatedSongsTable);\n\n var _this3 = _possibleConstructorReturn(this, Object.getPrototypeOf(FilterablePaginatedSongsTable).call(this, props));\n\n _this3.state = {\n filterText: \"\"\n };\n\n _this3.handleUserInput = _this3.handleUserInput.bind(_this3);\n return _this3;\n }\n\n _createClass(FilterablePaginatedSongsTable, [{\n key: \"handleUserInput\",\n value: function handleUserInput(filterText) {\n this.setState({\n filterText: filterText.trim()\n });\n }\n }, {\n key: \"render\",\n value: function render() {\n var nPages = Math.ceil(this.props.songsTotalCount / this.props.songsPerPage);\n return _react2.default.createElement(\n \"div\",\n null,\n _react2.default.createElement(_FilterBar2.default, { filterText: this.state.filterText, onUserInput: this.handleUserInput }),\n _react2.default.createElement(SongsTable, { songs: this.props.songs, filterText: this.state.filterText }),\n _react2.default.createElement(_Pagination2.default, { nPages: nPages, currentPage: this.props.currentPage, location: this.props.location })\n );\n }\n }]);\n\n return FilterablePaginatedSongsTable;\n}(_react.Component);\n\nexports.default = FilterablePaginatedSongsTable;\n\n\nFilterablePaginatedSongsTable.propTypes = {\n songs: _react.PropTypes.array.isRequired,\n songsTotalCount: _react.PropTypes.number.isRequired,\n songsPerPage: _react.PropTypes.number.isRequired,\n currentPage: _react.PropTypes.number.isRequired,\n location: _react.PropTypes.object.isRequired\n};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjM4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vL2FwcC9jb21wb25lbnRzL1NvbmdzLmpzeD83ZjJiIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQsIFByb3BUeXBlcyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgTGlua30gZnJvbSBcInJlYWN0LXJvdXRlclwiO1xuaW1wb3J0IEZ1c2UgZnJvbSBcImZ1c2UuanNcIjtcblxuaW1wb3J0IEZpbHRlckJhciBmcm9tIFwiLi9lbGVtZW50cy9GaWx0ZXJCYXJcIjtcbmltcG9ydCBQYWdpbmF0aW9uIGZyb20gXCIuL2VsZW1lbnRzL1BhZ2luYXRpb25cIjtcbmltcG9ydCB7IGZvcm1hdExlbmd0aH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBTb25nc1RhYmxlUm93IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICByZW5kZXIgKCkge1xuICAgICAgICBjb25zdCBsZW5ndGggPSBmb3JtYXRMZW5ndGgodGhpcy5wcm9wcy5zb25nLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGxpbmtUb0FydGlzdCA9IFwiL2FydGlzdC9cIiArIHRoaXMucHJvcHMuc29uZy5hcnRpc3QuaWQ7XG4gICAgICAgIGNvbnN0IGxpbmtUb0FsYnVtID0gXCIvYWxidW0vXCIgKyB0aGlzLnByb3BzLnNvbmcuYWxidW0uaWQ7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cInRpdGxlXCI+e3RoaXMucHJvcHMuc29uZy5uYW1lfTwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cImFydGlzdFwiPjxMaW5rIHRvPXtsaW5rVG9BcnRpc3R9Pnt0aGlzLnByb3BzLnNvbmcuYXJ0aXN0Lm5hbWV9PC9MaW5rPjwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cImFydGlzdFwiPjxMaW5rIHRvPXtsaW5rVG9BbGJ1bX0+e3RoaXMucHJvcHMuc29uZy5hbGJ1bS5uYW1lfTwvTGluaz48L3RkPlxuICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJnZW5yZVwiPnt0aGlzLnByb3BzLnNvbmcuZ2VucmV9PC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPVwibGVuZ3RoXCI+e2xlbmd0aH08L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblNvbmdzVGFibGVSb3cucHJvcFR5cGVzID0ge1xuICAgIHNvbmc6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZFxufTtcblxuXG5leHBvcnQgY2xhc3MgU29uZ3NUYWJsZSBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgcmVuZGVyICgpIHtcbiAgICAgICAgdmFyIGRpc3BsYXllZFNvbmdzID0gdGhpcy5wcm9wcy5zb25ncztcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuZmlsdGVyVGV4dCkge1xuICAgICAgICAgICAgLy8gVXNlIEZ1c2UgZm9yIHRoZSBmaWx0ZXJcbiAgICAgICAgICAgIGRpc3BsYXllZFNvbmdzID0gbmV3IEZ1c2UoXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5zb25ncyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwia2V5c1wiOiBbXCJuYW1lXCJdLFxuICAgICAgICAgICAgICAgICAgICBcInRocmVzaG9sZFwiOiAwLjQsXG4gICAgICAgICAgICAgICAgICAgIFwiaW5jbHVkZVwiOiBbXCJzY29yZVwiXVxuICAgICAgICAgICAgICAgIH0pLnNlYXJjaCh0aGlzLnByb3BzLmZpbHRlclRleHQpO1xuICAgICAgICAgICAgLy8gS2VlcCBvbmx5IGl0ZW1zIGluIHJlc3VsdHNcbiAgICAgICAgICAgIGRpc3BsYXllZFNvbmdzID0gZGlzcGxheWVkU29uZ3MubWFwKGZ1bmN0aW9uIChpdGVtKSB7IHJldHVybiBpdGVtLml0ZW07IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJvd3MgPSBbXTtcbiAgICAgICAgZGlzcGxheWVkU29uZ3MuZm9yRWFjaChmdW5jdGlvbiAoc29uZykge1xuICAgICAgICAgICAgcm93cy5wdXNoKDxTb25nc1RhYmxlUm93IHNvbmc9e3Nvbmd9IGtleT17c29uZy5pZH0gLz4pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDx0YWJsZSBjbGFzc05hbWU9XCJ0YWJsZSB0YWJsZS1ob3ZlciBzb25nc1wiPlxuICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+VGl0bGU8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkFydGlzdDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+QWxidW08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkdlbnJlPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5MZW5ndGg8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRib2R5Pntyb3dzfTwvdGJvZHk+XG4gICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICApO1xuICAgIH1cbn1cblxuU29uZ3NUYWJsZS5wcm9wVHlwZXMgPSB7XG4gICAgc29uZ3M6IFByb3BUeXBlcy5hcnJheS5pc1JlcXVpcmVkLFxuICAgIGZpbHRlclRleHQ6IFByb3BUeXBlcy5zdHJpbmdcbn07XG5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmlsdGVyYWJsZVBhZ2luYXRlZFNvbmdzVGFibGUgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBmaWx0ZXJUZXh0OiBcIlwiXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5oYW5kbGVVc2VySW5wdXQgPSB0aGlzLmhhbmRsZVVzZXJJbnB1dC5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIGhhbmRsZVVzZXJJbnB1dCAoZmlsdGVyVGV4dCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGZpbHRlclRleHQ6IGZpbHRlclRleHQudHJpbSgpXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbmRlciAoKSB7XG4gICAgICAgIGNvbnN0IG5QYWdlcyA9IE1hdGguY2VpbCh0aGlzLnByb3BzLnNvbmdzVG90YWxDb3VudCAvIHRoaXMucHJvcHMuc29uZ3NQZXJQYWdlKTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPEZpbHRlckJhciBmaWx0ZXJUZXh0PXt0aGlzLnN0YXRlLmZpbHRlclRleHR9IG9uVXNlcklucHV0PXt0aGlzLmhhbmRsZVVzZXJJbnB1dH0gLz5cbiAgICAgICAgICAgICAgICA8U29uZ3NUYWJsZSBzb25ncz17dGhpcy5wcm9wcy5zb25nc30gZmlsdGVyVGV4dD17dGhpcy5zdGF0ZS5maWx0ZXJUZXh0fSAvPlxuICAgICAgICAgICAgICAgIDxQYWdpbmF0aW9uIG5QYWdlcz17blBhZ2VzfSBjdXJyZW50UGFnZT17dGhpcy5wcm9wcy5jdXJyZW50UGFnZX0gbG9jYXRpb249e3RoaXMucHJvcHMubG9jYXRpb259IC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbkZpbHRlcmFibGVQYWdpbmF0ZWRTb25nc1RhYmxlLnByb3BUeXBlcyA9IHtcbiAgICBzb25nczogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWQsXG4gICAgc29uZ3NUb3RhbENvdW50OiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gICAgc29uZ3NQZXJQYWdlOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gICAgY3VycmVudFBhZ2U6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgICBsb2NhdGlvbjogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkXG59O1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYXBwL2NvbXBvbmVudHMvU29uZ3MuanN4XG4gKiovIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBO0FBQUE7QUFDQTs7O0FBQ0E7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7Ozs7Ozs7O0FBQ0E7Ozs7Ozs7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU5BO0FBU0E7Ozs7OztBQUdBO0FBQ0E7QUFEQTtBQUNBO0FBSUE7Ozs7Ozs7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTkE7QUFEQTtBQVVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFYQTtBQWNBOzs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUNBO0FBS0E7OztBQUNBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUdBO0FBTkE7QUFPQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTs7Ozs7O0FBekJBO0FBQ0E7QUFDQTtBQTBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQSIsInNvdXJjZVJvb3QiOiIifQ==");
+ eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.SongsTable = exports.SongsTableRow = undefined;\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 _react = __webpack_require__(22);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouter = __webpack_require__(192);\n\nvar _fuse = __webpack_require__(626);\n\nvar _fuse2 = _interopRequireDefault(_fuse);\n\nvar _FilterBar = __webpack_require__(629);\n\nvar _FilterBar2 = _interopRequireDefault(_FilterBar);\n\nvar _Pagination = __webpack_require__(630);\n\nvar _Pagination2 = _interopRequireDefault(_Pagination);\n\nvar _utils = __webpack_require__(585);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\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 SongsTableRow = exports.SongsTableRow = function (_Component) {\n _inherits(SongsTableRow, _Component);\n\n function SongsTableRow() {\n _classCallCheck(this, SongsTableRow);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(SongsTableRow).apply(this, arguments));\n }\n\n _createClass(SongsTableRow, [{\n key: \"render\",\n value: function render() {\n var length = (0, _utils.formatLength)(this.props.song.length);\n var linkToArtist = \"/artist/\" + this.props.song.artist.id;\n var linkToAlbum = \"/album/\" + this.props.song.album.id;\n return _react2.default.createElement(\n \"tr\",\n null,\n _react2.default.createElement(\"td\", null),\n _react2.default.createElement(\n \"td\",\n { className: \"title\" },\n this.props.song.name\n ),\n _react2.default.createElement(\n \"td\",\n { className: \"artist\" },\n _react2.default.createElement(\n _reactRouter.Link,\n { to: linkToArtist },\n this.props.song.artist.name\n )\n ),\n _react2.default.createElement(\n \"td\",\n { className: \"artist\" },\n _react2.default.createElement(\n _reactRouter.Link,\n { to: linkToAlbum },\n this.props.song.album.name\n )\n ),\n _react2.default.createElement(\n \"td\",\n { className: \"genre\" },\n this.props.song.genre\n ),\n _react2.default.createElement(\n \"td\",\n { className: \"length\" },\n length\n )\n );\n }\n }]);\n\n return SongsTableRow;\n}(_react.Component);\n\nSongsTableRow.propTypes = {\n song: _react.PropTypes.object.isRequired\n};\n\nvar SongsTable = exports.SongsTable = function (_Component2) {\n _inherits(SongsTable, _Component2);\n\n function SongsTable() {\n _classCallCheck(this, SongsTable);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(SongsTable).apply(this, arguments));\n }\n\n _createClass(SongsTable, [{\n key: \"render\",\n value: function render() {\n var displayedSongs = this.props.songs;\n if (this.props.filterText) {\n // Use Fuse for the filter\n displayedSongs = new _fuse2.default(this.props.songs, {\n \"keys\": [\"name\"],\n \"threshold\": 0.4,\n \"include\": [\"score\"]\n }).search(this.props.filterText);\n // Keep only items in results\n displayedSongs = displayedSongs.map(function (item) {\n return item.item;\n });\n }\n\n var rows = [];\n displayedSongs.forEach(function (song) {\n rows.push(_react2.default.createElement(SongsTableRow, { song: song, key: song.id }));\n });\n return _react2.default.createElement(\n \"div\",\n { className: \"table-responsive\" },\n _react2.default.createElement(\n \"table\",\n { className: \"table table-hover songs\" },\n _react2.default.createElement(\n \"thead\",\n null,\n _react2.default.createElement(\n \"tr\",\n null,\n _react2.default.createElement(\"th\", null),\n _react2.default.createElement(\n \"th\",\n null,\n \"Title\"\n ),\n _react2.default.createElement(\n \"th\",\n null,\n \"Artist\"\n ),\n _react2.default.createElement(\n \"th\",\n null,\n \"Album\"\n ),\n _react2.default.createElement(\n \"th\",\n null,\n \"Genre\"\n ),\n _react2.default.createElement(\n \"th\",\n null,\n \"Length\"\n )\n )\n ),\n _react2.default.createElement(\n \"tbody\",\n null,\n rows\n )\n )\n );\n }\n }]);\n\n return SongsTable;\n}(_react.Component);\n\nSongsTable.propTypes = {\n songs: _react.PropTypes.array.isRequired,\n filterText: _react.PropTypes.string\n};\n\nvar FilterablePaginatedSongsTable = function (_Component3) {\n _inherits(FilterablePaginatedSongsTable, _Component3);\n\n function FilterablePaginatedSongsTable(props) {\n _classCallCheck(this, FilterablePaginatedSongsTable);\n\n var _this3 = _possibleConstructorReturn(this, Object.getPrototypeOf(FilterablePaginatedSongsTable).call(this, props));\n\n _this3.state = {\n filterText: \"\"\n };\n\n _this3.handleUserInput = _this3.handleUserInput.bind(_this3);\n return _this3;\n }\n\n _createClass(FilterablePaginatedSongsTable, [{\n key: \"handleUserInput\",\n value: function handleUserInput(filterText) {\n this.setState({\n filterText: filterText.trim()\n });\n }\n }, {\n key: \"render\",\n value: function render() {\n var nPages = Math.ceil(this.props.songsTotalCount / this.props.songsPerPage);\n return _react2.default.createElement(\n \"div\",\n null,\n _react2.default.createElement(_FilterBar2.default, { filterText: this.state.filterText, onUserInput: this.handleUserInput }),\n _react2.default.createElement(SongsTable, { songs: this.props.songs, filterText: this.state.filterText }),\n _react2.default.createElement(_Pagination2.default, { nPages: nPages, currentPage: this.props.currentPage, location: this.props.location })\n );\n }\n }]);\n\n return FilterablePaginatedSongsTable;\n}(_react.Component);\n\nexports.default = FilterablePaginatedSongsTable;\n\n\nFilterablePaginatedSongsTable.propTypes = {\n songs: _react.PropTypes.array.isRequired,\n songsTotalCount: _react.PropTypes.number.isRequired,\n songsPerPage: _react.PropTypes.number.isRequired,\n currentPage: _react.PropTypes.number.isRequired,\n location: _react.PropTypes.object.isRequired\n};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjM4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vL2FwcC9jb21wb25lbnRzL1NvbmdzLmpzeD83ZjJiIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQsIFByb3BUeXBlcyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgTGlua30gZnJvbSBcInJlYWN0LXJvdXRlclwiO1xuaW1wb3J0IEZ1c2UgZnJvbSBcImZ1c2UuanNcIjtcblxuaW1wb3J0IEZpbHRlckJhciBmcm9tIFwiLi9lbGVtZW50cy9GaWx0ZXJCYXJcIjtcbmltcG9ydCBQYWdpbmF0aW9uIGZyb20gXCIuL2VsZW1lbnRzL1BhZ2luYXRpb25cIjtcbmltcG9ydCB7IGZvcm1hdExlbmd0aH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBTb25nc1RhYmxlUm93IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICByZW5kZXIgKCkge1xuICAgICAgICBjb25zdCBsZW5ndGggPSBmb3JtYXRMZW5ndGgodGhpcy5wcm9wcy5zb25nLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGxpbmtUb0FydGlzdCA9IFwiL2FydGlzdC9cIiArIHRoaXMucHJvcHMuc29uZy5hcnRpc3QuaWQ7XG4gICAgICAgIGNvbnN0IGxpbmtUb0FsYnVtID0gXCIvYWxidW0vXCIgKyB0aGlzLnByb3BzLnNvbmcuYWxidW0uaWQ7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cInRpdGxlXCI+e3RoaXMucHJvcHMuc29uZy5uYW1lfTwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cImFydGlzdFwiPjxMaW5rIHRvPXtsaW5rVG9BcnRpc3R9Pnt0aGlzLnByb3BzLnNvbmcuYXJ0aXN0Lm5hbWV9PC9MaW5rPjwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cImFydGlzdFwiPjxMaW5rIHRvPXtsaW5rVG9BbGJ1bX0+e3RoaXMucHJvcHMuc29uZy5hbGJ1bS5uYW1lfTwvTGluaz48L3RkPlxuICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJnZW5yZVwiPnt0aGlzLnByb3BzLnNvbmcuZ2VucmV9PC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPVwibGVuZ3RoXCI+e2xlbmd0aH08L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblNvbmdzVGFibGVSb3cucHJvcFR5cGVzID0ge1xuICAgIHNvbmc6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZFxufTtcblxuXG5leHBvcnQgY2xhc3MgU29uZ3NUYWJsZSBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgcmVuZGVyICgpIHtcbiAgICAgICAgdmFyIGRpc3BsYXllZFNvbmdzID0gdGhpcy5wcm9wcy5zb25ncztcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuZmlsdGVyVGV4dCkge1xuICAgICAgICAgICAgLy8gVXNlIEZ1c2UgZm9yIHRoZSBmaWx0ZXJcbiAgICAgICAgICAgIGRpc3BsYXllZFNvbmdzID0gbmV3IEZ1c2UoXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5zb25ncyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwia2V5c1wiOiBbXCJuYW1lXCJdLFxuICAgICAgICAgICAgICAgICAgICBcInRocmVzaG9sZFwiOiAwLjQsXG4gICAgICAgICAgICAgICAgICAgIFwiaW5jbHVkZVwiOiBbXCJzY29yZVwiXVxuICAgICAgICAgICAgICAgIH0pLnNlYXJjaCh0aGlzLnByb3BzLmZpbHRlclRleHQpO1xuICAgICAgICAgICAgLy8gS2VlcCBvbmx5IGl0ZW1zIGluIHJlc3VsdHNcbiAgICAgICAgICAgIGRpc3BsYXllZFNvbmdzID0gZGlzcGxheWVkU29uZ3MubWFwKGZ1bmN0aW9uIChpdGVtKSB7IHJldHVybiBpdGVtLml0ZW07IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJvd3MgPSBbXTtcbiAgICAgICAgZGlzcGxheWVkU29uZ3MuZm9yRWFjaChmdW5jdGlvbiAoc29uZykge1xuICAgICAgICAgICAgcm93cy5wdXNoKDxTb25nc1RhYmxlUm93IHNvbmc9e3Nvbmd9IGtleT17c29uZy5pZH0gLz4pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzc05hbWU9XCJ0YWJsZSB0YWJsZS1ob3ZlciBzb25nc1wiPlxuICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlRpdGxlPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+QXJ0aXN0PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+QWxidW08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5HZW5yZTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkxlbmd0aDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgICAgICA8dGJvZHk+e3Jvd3N9PC90Ym9keT5cbiAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5Tb25nc1RhYmxlLnByb3BUeXBlcyA9IHtcbiAgICBzb25nczogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWQsXG4gICAgZmlsdGVyVGV4dDogUHJvcFR5cGVzLnN0cmluZ1xufTtcblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaWx0ZXJhYmxlUGFnaW5hdGVkU29uZ3NUYWJsZSBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGZpbHRlclRleHQ6IFwiXCJcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmhhbmRsZVVzZXJJbnB1dCA9IHRoaXMuaGFuZGxlVXNlcklucHV0LmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgaGFuZGxlVXNlcklucHV0IChmaWx0ZXJUZXh0KSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgZmlsdGVyVGV4dDogZmlsdGVyVGV4dC50cmltKClcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVuZGVyICgpIHtcbiAgICAgICAgY29uc3QgblBhZ2VzID0gTWF0aC5jZWlsKHRoaXMucHJvcHMuc29uZ3NUb3RhbENvdW50IC8gdGhpcy5wcm9wcy5zb25nc1BlclBhZ2UpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8RmlsdGVyQmFyIGZpbHRlclRleHQ9e3RoaXMuc3RhdGUuZmlsdGVyVGV4dH0gb25Vc2VySW5wdXQ9e3RoaXMuaGFuZGxlVXNlcklucHV0fSAvPlxuICAgICAgICAgICAgICAgIDxTb25nc1RhYmxlIHNvbmdzPXt0aGlzLnByb3BzLnNvbmdzfSBmaWx0ZXJUZXh0PXt0aGlzLnN0YXRlLmZpbHRlclRleHR9IC8+XG4gICAgICAgICAgICAgICAgPFBhZ2luYXRpb24gblBhZ2VzPXtuUGFnZXN9IGN1cnJlbnRQYWdlPXt0aGlzLnByb3BzLmN1cnJlbnRQYWdlfSBsb2NhdGlvbj17dGhpcy5wcm9wcy5sb2NhdGlvbn0gLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuRmlsdGVyYWJsZVBhZ2luYXRlZFNvbmdzVGFibGUucHJvcFR5cGVzID0ge1xuICAgIHNvbmdzOiBQcm9wVHlwZXMuYXJyYXkuaXNSZXF1aXJlZCxcbiAgICBzb25nc1RvdGFsQ291bnQ6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgICBzb25nc1BlclBhZ2U6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgICBjdXJyZW50UGFnZTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICAgIGxvY2F0aW9uOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWRcbn07XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhcHAvY29tcG9uZW50cy9Tb25ncy5qc3hcbiAqKi8iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7QUFBQTtBQUNBOzs7QUFDQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7Ozs7Ozs7QUFDQTs7Ozs7Ozs7Ozs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTkE7QUFTQTs7Ozs7O0FBR0E7QUFDQTtBQURBO0FBQ0E7QUFJQTs7Ozs7Ozs7Ozs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFOQTtBQURBO0FBVUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVhBO0FBREE7QUFnQkE7Ozs7OztBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFLQTs7O0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBR0E7QUFOQTtBQU9BO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQU1BOzs7Ozs7QUF6QkE7QUFDQTtBQUNBO0FBMEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBIiwic291cmNlUm9vdCI6IiJ9");
/***/ },
/* 639 */
@@ -4413,13 +4413,13 @@
/* 640 */
/***/ 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 _react = __webpack_require__(22);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _Album = __webpack_require__(641);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\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 Artist = function (_Component) {\n _inherits(Artist, _Component);\n\n function Artist() {\n _classCallCheck(this, Artist);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(Artist).apply(this, arguments));\n }\n\n _createClass(Artist, [{\n key: \"render\",\n value: function render() {\n var albumsRows = [];\n if (Array.isArray(this.props.artist.albums)) {\n this.props.artist.albums.forEach(function (item) {\n albumsRows.push(_react2.default.createElement(_Album.AlbumRow, { album: item, key: item.id }));\n });\n }\n return _react2.default.createElement(\n \"div\",\n null,\n _react2.default.createElement(\n \"div\",\n { className: \"row\" },\n _react2.default.createElement(\n \"div\",\n { className: \"col-md-9\" },\n _react2.default.createElement(\n \"h1\",\n { className: \"text-right\" },\n this.props.artist.name\n ),\n _react2.default.createElement(\"hr\", null),\n _react2.default.createElement(\n \"p\",\n null,\n this.props.artist.summary\n )\n ),\n _react2.default.createElement(\n \"div\",\n { className: \"col-md-3\" },\n _react2.default.createElement(\n \"p\",\n null,\n _react2.default.createElement(\"img\", { src: this.props.artist.art, width: \"200\", height: \"200\", className: \"img-responsive img-circle art\", alt: this.props.artist.name })\n )\n )\n ),\n albumsRows\n );\n }\n }]);\n\n return Artist;\n}(_react.Component);\n\nexports.default = Artist;\n\n\nArtist.propTypes = {\n artist: _react.PropTypes.object.isRequired\n};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vL2FwcC9jb21wb25lbnRzL0FydGlzdC5qc3g/MzMwNyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50LCBQcm9wVHlwZXMgfSBmcm9tIFwicmVhY3RcIjtcblxuaW1wb3J0IHsgQWxidW1Sb3cgfSBmcm9tIFwiLi9BbGJ1bVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBcnRpc3QgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIHJlbmRlciAoKSB7XG4gICAgICAgIHZhciBhbGJ1bXNSb3dzID0gW107XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMucHJvcHMuYXJ0aXN0LmFsYnVtcykpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMuYXJ0aXN0LmFsYnVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgYWxidW1zUm93cy5wdXNoKDxBbGJ1bVJvdyBhbGJ1bT17aXRlbX0ga2V5PXtpdGVtLmlkfSAvPik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC1tZC05XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwidGV4dC1yaWdodFwiPnt0aGlzLnByb3BzLmFydGlzdC5uYW1lfTwvaDE+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aHIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+e3RoaXMucHJvcHMuYXJ0aXN0LnN1bW1hcnl9PC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtbWQtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+PGltZyBzcmM9e3RoaXMucHJvcHMuYXJ0aXN0LmFydH0gd2lkdGg9XCIyMDBcIiBoZWlnaHQ9XCIyMDBcIiBjbGFzc05hbWU9XCJpbWctcmVzcG9uc2l2ZSBpbWctY2lyY2xlIGFydFwiIGFsdD17dGhpcy5wcm9wcy5hcnRpc3QubmFtZX0vPjwvcD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgeyBhbGJ1bXNSb3dzIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuQXJ0aXN0LnByb3BUeXBlcyA9IHtcbiAgICBhcnRpc3Q6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZFxufTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFwcC9jb21wb25lbnRzL0FydGlzdC5qc3hcbiAqKi8iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTs7O0FBQ0E7QUFDQTs7Ozs7Ozs7O0FBQ0E7Ozs7Ozs7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSEE7QUFLQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBREE7QUFOQTtBQVVBO0FBWEE7QUFjQTs7Ozs7O0FBdkJBO0FBQ0E7QUFDQTtBQXdCQTtBQUNBO0FBREEiLCJzb3VyY2VSb290IjoiIn0=");
+ 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 _react = __webpack_require__(22);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _Album = __webpack_require__(641);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\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 Artist = function (_Component) {\n _inherits(Artist, _Component);\n\n function Artist() {\n _classCallCheck(this, Artist);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(Artist).apply(this, arguments));\n }\n\n _createClass(Artist, [{\n key: \"render\",\n value: function render() {\n var albumsRows = [];\n if (Array.isArray(this.props.artist.albums)) {\n this.props.artist.albums.forEach(function (item) {\n albumsRows.push(_react2.default.createElement(_Album.AlbumRow, { album: item, key: item.id }));\n });\n }\n return _react2.default.createElement(\n \"div\",\n null,\n _react2.default.createElement(\n \"div\",\n { className: \"row artistNameRow\" },\n _react2.default.createElement(\n \"div\",\n { className: \"col-sm-12\" },\n _react2.default.createElement(\n \"h1\",\n null,\n this.props.artist.name\n ),\n _react2.default.createElement(\"hr\", null)\n )\n ),\n _react2.default.createElement(\n \"div\",\n { className: \"row\" },\n _react2.default.createElement(\n \"div\",\n { className: \"col-sm-9\" },\n _react2.default.createElement(\n \"p\",\n null,\n this.props.artist.summary\n )\n ),\n _react2.default.createElement(\n \"div\",\n { className: \"col-sm-3 text-center\" },\n _react2.default.createElement(\n \"p\",\n null,\n _react2.default.createElement(\"img\", { src: this.props.artist.art, width: \"200\", height: \"200\", className: \"img-responsive img-circle art\", alt: this.props.artist.name })\n )\n )\n ),\n albumsRows\n );\n }\n }]);\n\n return Artist;\n}(_react.Component);\n\nexports.default = Artist;\n\n\nArtist.propTypes = {\n artist: _react.PropTypes.object.isRequired\n};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vL2FwcC9jb21wb25lbnRzL0FydGlzdC5qc3g/MzMwNyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50LCBQcm9wVHlwZXMgfSBmcm9tIFwicmVhY3RcIjtcblxuaW1wb3J0IHsgQWxidW1Sb3cgfSBmcm9tIFwiLi9BbGJ1bVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBcnRpc3QgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIHJlbmRlciAoKSB7XG4gICAgICAgIHZhciBhbGJ1bXNSb3dzID0gW107XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMucHJvcHMuYXJ0aXN0LmFsYnVtcykpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMuYXJ0aXN0LmFsYnVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgYWxidW1zUm93cy5wdXNoKDxBbGJ1bVJvdyBhbGJ1bT17aXRlbX0ga2V5PXtpdGVtLmlkfSAvPik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJvdyBhcnRpc3ROYW1lUm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLXNtLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aDE+e3RoaXMucHJvcHMuYXJ0aXN0Lm5hbWV9PC9oMT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoci8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLXNtLTlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwPnt0aGlzLnByb3BzLmFydGlzdC5zdW1tYXJ5fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLXNtLTMgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwPjxpbWcgc3JjPXt0aGlzLnByb3BzLmFydGlzdC5hcnR9IHdpZHRoPVwiMjAwXCIgaGVpZ2h0PVwiMjAwXCIgY2xhc3NOYW1lPVwiaW1nLXJlc3BvbnNpdmUgaW1nLWNpcmNsZSBhcnRcIiBhbHQ9e3RoaXMucHJvcHMuYXJ0aXN0Lm5hbWV9Lz48L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIHsgYWxidW1zUm93cyB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbkFydGlzdC5wcm9wVHlwZXMgPSB7XG4gICAgYXJ0aXN0OiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWRcbn07XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhcHAvY29tcG9uZW50cy9BcnRpc3QuanN4XG4gKiovIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7OztBQUNBO0FBQ0E7Ozs7Ozs7OztBQUNBOzs7Ozs7Ozs7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRkE7QUFEQTtBQU1BO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFEQTtBQUdBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFEQTtBQUpBO0FBUUE7QUFmQTtBQWtCQTs7Ozs7O0FBM0JBO0FBQ0E7QUFDQTtBQTRCQTtBQUNBO0FBREEiLCJzb3VyY2VSb290IjoiIn0=");
/***/ },
/* 641 */
/***/ function(module, exports, __webpack_require__) {
- eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.AlbumRow = exports.AlbumTracksTable = exports.AlbumTrackRow = undefined;\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 _react = __webpack_require__(22);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _utils = __webpack_require__(585);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\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 AlbumTrackRow = exports.AlbumTrackRow = function (_Component) {\n _inherits(AlbumTrackRow, _Component);\n\n function AlbumTrackRow() {\n _classCallCheck(this, AlbumTrackRow);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(AlbumTrackRow).apply(this, arguments));\n }\n\n _createClass(AlbumTrackRow, [{\n key: \"render\",\n value: function render() {\n var length = (0, _utils.formatLength)(this.props.track.length);\n return _react2.default.createElement(\n \"tr\",\n null,\n _react2.default.createElement(\n \"td\",\n null,\n this.props.track.track\n ),\n _react2.default.createElement(\n \"td\",\n null,\n this.props.track.name\n ),\n _react2.default.createElement(\n \"td\",\n null,\n length\n )\n );\n }\n }]);\n\n return AlbumTrackRow;\n}(_react.Component);\n\nAlbumTrackRow.propTypes = {\n track: _react.PropTypes.object.isRequired\n};\n\nvar AlbumTracksTable = exports.AlbumTracksTable = function (_Component2) {\n _inherits(AlbumTracksTable, _Component2);\n\n function AlbumTracksTable() {\n _classCallCheck(this, AlbumTracksTable);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(AlbumTracksTable).apply(this, arguments));\n }\n\n _createClass(AlbumTracksTable, [{\n key: \"render\",\n value: function render() {\n var rows = [];\n this.props.tracks.forEach(function (item) {\n rows.push(_react2.default.createElement(AlbumTrackRow, { track: item, key: item.id }));\n });\n return _react2.default.createElement(\n \"table\",\n { className: \"table table-hover songs\" },\n _react2.default.createElement(\n \"tbody\",\n null,\n rows\n )\n );\n }\n }]);\n\n return AlbumTracksTable;\n}(_react.Component);\n\nAlbumTracksTable.propTypes = {\n tracks: _react.PropTypes.array.isRequired\n};\n\nvar AlbumRow = exports.AlbumRow = function (_Component3) {\n _inherits(AlbumRow, _Component3);\n\n function AlbumRow() {\n _classCallCheck(this, AlbumRow);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(AlbumRow).apply(this, arguments));\n }\n\n _createClass(AlbumRow, [{\n key: \"render\",\n value: function render() {\n return _react2.default.createElement(\n \"div\",\n { className: \"row albumRow\" },\n _react2.default.createElement(\n \"div\",\n { className: \"row\" },\n _react2.default.createElement(\n \"div\",\n { className: \"col-md-offset-2 col-md-10\" },\n _react2.default.createElement(\n \"h2\",\n null,\n this.props.album.name\n )\n )\n ),\n _react2.default.createElement(\n \"div\",\n { className: \"row\" },\n _react2.default.createElement(\n \"div\",\n { className: \"col-md-2\" },\n _react2.default.createElement(\n \"p\",\n { className: \"text-center\" },\n _react2.default.createElement(\"img\", { src: this.props.album.art, width: \"200\", height: \"200\", className: \"img-responsive img-circle art\", alt: this.props.album.name })\n )\n ),\n _react2.default.createElement(\n \"div\",\n { className: \"col-md-10\" },\n _react2.default.createElement(AlbumTracksTable, { tracks: this.props.album.tracks })\n )\n )\n );\n }\n }]);\n\n return AlbumRow;\n}(_react.Component);\n\nAlbumRow.propTypes = {\n album: _react.PropTypes.object.isRequired\n};\n\nvar Album = function (_Component4) {\n _inherits(Album, _Component4);\n\n function Album() {\n _classCallCheck(this, Album);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(Album).apply(this, arguments));\n }\n\n _createClass(Album, [{\n key: \"render\",\n value: function render() {\n return _react2.default.createElement(AlbumRow, { album: this.props.album });\n }\n }]);\n\n return Album;\n}(_react.Component);\n\nexports.default = Album;\n\n\nAlbum.propTypes = {\n album: _react.PropTypes.object.isRequired\n};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vL2FwcC9jb21wb25lbnRzL0FsYnVtLmpzeD9hMzc5Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQsIFByb3BUeXBlcyB9IGZyb20gXCJyZWFjdFwiO1xuXG5pbXBvcnQgeyBmb3JtYXRMZW5ndGggfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuZXhwb3J0IGNsYXNzIEFsYnVtVHJhY2tSb3cgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIHJlbmRlciAoKSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGZvcm1hdExlbmd0aCh0aGlzLnByb3BzLnRyYWNrLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgPHRkPnt0aGlzLnByb3BzLnRyYWNrLnRyYWNrfTwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkPnt0aGlzLnByb3BzLnRyYWNrLm5hbWV9PC90ZD5cbiAgICAgICAgICAgICAgICA8dGQ+e2xlbmd0aH08L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbkFsYnVtVHJhY2tSb3cucHJvcFR5cGVzID0ge1xuICAgIHRyYWNrOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWRcbn07XG5cblxuZXhwb3J0IGNsYXNzIEFsYnVtVHJhY2tzVGFibGUgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIHJlbmRlciAoKSB7XG4gICAgICAgIHZhciByb3dzID0gW107XG4gICAgICAgIHRoaXMucHJvcHMudHJhY2tzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIHJvd3MucHVzaCg8QWxidW1UcmFja1JvdyB0cmFjaz17aXRlbX0ga2V5PXtpdGVtLmlkfSAvPik7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPHRhYmxlIGNsYXNzTmFtZT1cInRhYmxlIHRhYmxlLWhvdmVyIHNvbmdzXCI+XG4gICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICB7cm93c31cbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbkFsYnVtVHJhY2tzVGFibGUucHJvcFR5cGVzID0ge1xuICAgIHRyYWNrczogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWRcbn07XG5cbmV4cG9ydCBjbGFzcyBBbGJ1bVJvdyBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgcmVuZGVyICgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicm93IGFsYnVtUm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtbWQtb2Zmc2V0LTIgY29sLW1kLTEwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aDI+e3RoaXMucHJvcHMuYWxidW0ubmFtZX08L2gyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC1tZC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlclwiPjxpbWcgc3JjPXt0aGlzLnByb3BzLmFsYnVtLmFydH0gd2lkdGg9XCIyMDBcIiBoZWlnaHQ9XCIyMDBcIiBjbGFzc05hbWU9XCJpbWctcmVzcG9uc2l2ZSBpbWctY2lyY2xlIGFydFwiIGFsdD17dGhpcy5wcm9wcy5hbGJ1bS5uYW1lfSAvPjwvcD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLW1kLTEwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8QWxidW1UcmFja3NUYWJsZSB0cmFja3M9e3RoaXMucHJvcHMuYWxidW0udHJhY2tzfSAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuQWxidW1Sb3cucHJvcFR5cGVzID0ge1xuICAgIGFsYnVtOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWRcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFsYnVtIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICByZW5kZXIgKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPEFsYnVtUm93IGFsYnVtPXt0aGlzLnByb3BzLmFsYnVtfSAvPlxuICAgICAgICApO1xuICAgIH1cbn1cblxuQWxidW0ucHJvcFR5cGVzID0ge1xuICAgIGFsYnVtOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWRcbn07XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhcHAvY29tcG9uZW50cy9BbGJ1bS5qc3hcbiAqKi8iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7OztBQUNBO0FBQ0E7Ozs7Ozs7OztBQUNBOzs7Ozs7Ozs7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFIQTtBQU1BOzs7Ozs7QUFHQTtBQUNBO0FBREE7QUFDQTtBQUlBOzs7Ozs7Ozs7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBREE7QUFNQTs7Ozs7O0FBR0E7QUFDQTtBQURBO0FBQ0E7QUFHQTs7Ozs7Ozs7Ozs7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFEQTtBQURBO0FBS0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQURBO0FBR0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUpBO0FBTkE7QUFnQkE7Ozs7OztBQUdBO0FBQ0E7QUFEQTtBQUNBO0FBR0E7Ozs7Ozs7Ozs7O0FBQ0E7QUFDQTtBQUdBOzs7Ozs7QUFMQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBREEiLCJzb3VyY2VSb290IjoiIn0=");
+ eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.AlbumRow = exports.AlbumTracksTable = exports.AlbumTrackRow = undefined;\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 _react = __webpack_require__(22);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _utils = __webpack_require__(585);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\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 AlbumTrackRow = exports.AlbumTrackRow = function (_Component) {\n _inherits(AlbumTrackRow, _Component);\n\n function AlbumTrackRow() {\n _classCallCheck(this, AlbumTrackRow);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(AlbumTrackRow).apply(this, arguments));\n }\n\n _createClass(AlbumTrackRow, [{\n key: \"render\",\n value: function render() {\n var length = (0, _utils.formatLength)(this.props.track.length);\n return _react2.default.createElement(\n \"tr\",\n null,\n _react2.default.createElement(\n \"td\",\n null,\n this.props.track.track\n ),\n _react2.default.createElement(\n \"td\",\n null,\n this.props.track.name\n ),\n _react2.default.createElement(\n \"td\",\n null,\n length\n )\n );\n }\n }]);\n\n return AlbumTrackRow;\n}(_react.Component);\n\nAlbumTrackRow.propTypes = {\n track: _react.PropTypes.object.isRequired\n};\n\nvar AlbumTracksTable = exports.AlbumTracksTable = function (_Component2) {\n _inherits(AlbumTracksTable, _Component2);\n\n function AlbumTracksTable() {\n _classCallCheck(this, AlbumTracksTable);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(AlbumTracksTable).apply(this, arguments));\n }\n\n _createClass(AlbumTracksTable, [{\n key: \"render\",\n value: function render() {\n var rows = [];\n this.props.tracks.forEach(function (item) {\n rows.push(_react2.default.createElement(AlbumTrackRow, { track: item, key: item.id }));\n });\n return _react2.default.createElement(\n \"table\",\n { className: \"table table-hover songs\" },\n _react2.default.createElement(\n \"tbody\",\n null,\n rows\n )\n );\n }\n }]);\n\n return AlbumTracksTable;\n}(_react.Component);\n\nAlbumTracksTable.propTypes = {\n tracks: _react.PropTypes.array.isRequired\n};\n\nvar AlbumRow = exports.AlbumRow = function (_Component3) {\n _inherits(AlbumRow, _Component3);\n\n function AlbumRow() {\n _classCallCheck(this, AlbumRow);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(AlbumRow).apply(this, arguments));\n }\n\n _createClass(AlbumRow, [{\n key: \"render\",\n value: function render() {\n return _react2.default.createElement(\n \"div\",\n { className: \"row albumRow\" },\n _react2.default.createElement(\n \"div\",\n { className: \"col-sm-offset-2 col-xs-10 albumRowName\" },\n _react2.default.createElement(\n \"h2\",\n null,\n this.props.album.name\n )\n ),\n _react2.default.createElement(\n \"div\",\n { className: \"col-xs-2 albumRowArt\" },\n _react2.default.createElement(\n \"p\",\n { className: \"text-center\" },\n _react2.default.createElement(\"img\", { src: this.props.album.art, width: \"200\", height: \"200\", className: \"img-responsive img-circle art\", alt: this.props.album.name })\n )\n ),\n _react2.default.createElement(\n \"div\",\n { className: \"col-sm-10 table-responsive\" },\n _react2.default.createElement(AlbumTracksTable, { tracks: this.props.album.tracks })\n )\n );\n }\n }]);\n\n return AlbumRow;\n}(_react.Component);\n\nAlbumRow.propTypes = {\n album: _react.PropTypes.object.isRequired\n};\n\nvar Album = function (_Component4) {\n _inherits(Album, _Component4);\n\n function Album() {\n _classCallCheck(this, Album);\n\n return _possibleConstructorReturn(this, Object.getPrototypeOf(Album).apply(this, arguments));\n }\n\n _createClass(Album, [{\n key: \"render\",\n value: function render() {\n return _react2.default.createElement(AlbumRow, { album: this.props.album });\n }\n }]);\n\n return Album;\n}(_react.Component);\n\nexports.default = Album;\n\n\nAlbum.propTypes = {\n album: _react.PropTypes.object.isRequired\n};//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vL2FwcC9jb21wb25lbnRzL0FsYnVtLmpzeD9hMzc5Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQsIFByb3BUeXBlcyB9IGZyb20gXCJyZWFjdFwiO1xuXG5pbXBvcnQgeyBmb3JtYXRMZW5ndGggfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuZXhwb3J0IGNsYXNzIEFsYnVtVHJhY2tSb3cgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIHJlbmRlciAoKSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGZvcm1hdExlbmd0aCh0aGlzLnByb3BzLnRyYWNrLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgPHRkPnt0aGlzLnByb3BzLnRyYWNrLnRyYWNrfTwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkPnt0aGlzLnByb3BzLnRyYWNrLm5hbWV9PC90ZD5cbiAgICAgICAgICAgICAgICA8dGQ+e2xlbmd0aH08L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbkFsYnVtVHJhY2tSb3cucHJvcFR5cGVzID0ge1xuICAgIHRyYWNrOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWRcbn07XG5cblxuZXhwb3J0IGNsYXNzIEFsYnVtVHJhY2tzVGFibGUgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIHJlbmRlciAoKSB7XG4gICAgICAgIHZhciByb3dzID0gW107XG4gICAgICAgIHRoaXMucHJvcHMudHJhY2tzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIHJvd3MucHVzaCg8QWxidW1UcmFja1JvdyB0cmFjaz17aXRlbX0ga2V5PXtpdGVtLmlkfSAvPik7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPHRhYmxlIGNsYXNzTmFtZT1cInRhYmxlIHRhYmxlLWhvdmVyIHNvbmdzXCI+XG4gICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICB7cm93c31cbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbkFsYnVtVHJhY2tzVGFibGUucHJvcFR5cGVzID0ge1xuICAgIHRyYWNrczogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWRcbn07XG5cbmV4cG9ydCBjbGFzcyBBbGJ1bVJvdyBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgcmVuZGVyICgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicm93IGFsYnVtUm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtc20tb2Zmc2V0LTIgY29sLXhzLTEwIGFsYnVtUm93TmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICA8aDI+e3RoaXMucHJvcHMuYWxidW0ubmFtZX08L2gyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLXhzLTIgYWxidW1Sb3dBcnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1jZW50ZXJcIj48aW1nIHNyYz17dGhpcy5wcm9wcy5hbGJ1bS5hcnR9IHdpZHRoPVwiMjAwXCIgaGVpZ2h0PVwiMjAwXCIgY2xhc3NOYW1lPVwiaW1nLXJlc3BvbnNpdmUgaW1nLWNpcmNsZSBhcnRcIiBhbHQ9e3RoaXMucHJvcHMuYWxidW0ubmFtZX0gLz48L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtc20tMTAgdGFibGUtcmVzcG9uc2l2ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8QWxidW1UcmFja3NUYWJsZSB0cmFja3M9e3RoaXMucHJvcHMuYWxidW0udHJhY2tzfSAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5BbGJ1bVJvdy5wcm9wVHlwZXMgPSB7XG4gICAgYWxidW06IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWxidW0gZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIHJlbmRlciAoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8QWxidW1Sb3cgYWxidW09e3RoaXMucHJvcHMuYWxidW19IC8+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5BbGJ1bS5wcm9wVHlwZXMgPSB7XG4gICAgYWxidW06IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZFxufTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFwcC9jb21wb25lbnRzL0FsYnVtLmpzeFxuICoqLyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTs7O0FBQ0E7QUFDQTs7Ozs7Ozs7O0FBQ0E7Ozs7Ozs7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUhBO0FBTUE7Ozs7OztBQUdBO0FBQ0E7QUFEQTtBQUNBO0FBSUE7Ozs7Ozs7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFEQTtBQU1BOzs7Ozs7QUFHQTtBQUNBO0FBREE7QUFDQTtBQUdBOzs7Ozs7Ozs7OztBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQURBO0FBR0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQURBO0FBR0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQVBBO0FBWUE7Ozs7OztBQUdBO0FBQ0E7QUFEQTtBQUNBO0FBR0E7Ozs7Ozs7Ozs7O0FBQ0E7QUFDQTtBQUdBOzs7Ozs7QUFMQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBREEiLCJzb3VyY2VSb290IjoiIn0=");
/***/ },
/* 642 */
diff --git a/app/dist/style.css b/app/dist/style.css
index 479faee..bb3db99 100644
--- a/app/dist/style.css
+++ b/app/dist/style.css
@@ -6758,6 +6758,13 @@ button.close {
}
}
/*# sourceMappingURL=bootstrap.css.map */
+/* Firefox hack for responsive table */
+@-moz-document url-prefix() {
+ fieldset {
+ display: table-cell;
+ }
+}
+
/*
* Sidebar
*/
@@ -6948,12 +6955,50 @@ div.filter {
.art {
display: inline-block;
- margin-bottom: 0.5em;
+ margin-bottom: 10px;
width: 75%;
height: auto;
- max-width: 200px;
+
+ /* doiuse-disable viewport-units */
+
+ max-width: 25vw;
+ max-height: 25vw;
+
+ /* doiuse-enable viewport-units */
}
.albumRow {
margin-top: 30px;
}
+
+.artistNameRow h1 {
+ margin-bottom: 0;
+}
+
+.artistNameRow hr {
+ margin-top: 0.5em; /* Default value. */
+}
+
+@media (max-width: 767px) {
+ .table-responsive {
+ border: none;
+ }
+
+ .albumRowName h2 {
+ margin-top: 0;
+ margin-bottom: 0;
+ }
+
+ .albumRowArt p, .albumRowArt img {
+ margin: 0;
+ }
+
+ .albumRowName, .albumRowArt {
+ float: none;
+ display: inline-block;
+ vertical-align: middle;
+ margin-bottom: 10px;
+ }
+}
+
+/* TODO: Use table-condensed if xs screen */
diff --git a/app/styles/ampache.css b/app/styles/ampache.css
index fbdc90c..786f6b8 100644
--- a/app/styles/ampache.css
+++ b/app/styles/ampache.css
@@ -1,3 +1,10 @@
+/* Firefox hack for responsive table */
+@-moz-document url-prefix() {
+ fieldset {
+ display: table-cell;
+ }
+}
+
/*
* Sidebar
*/
@@ -190,12 +197,52 @@ div.filter {
.art {
display: inline-block;
- margin-bottom: 0.5em;
+ margin-bottom: 10px;
width: 75%;
height: auto;
- max-width: 200px;
+
+ /* doiuse-disable viewport-units */
+
+ max-width: 25vw;
+ max-height: 25vw;
+
+ /* doiuse-enable viewport-units */
}
.albumRow {
margin-top: 30px;
}
+
+.artistNameRow h1 {
+ margin-bottom: 0;
+}
+
+.artistNameRow hr {
+ margin-top: 0.5em; /* Default value. */
+}
+
+@media (max-width: 767px) {
+ .table-responsive {
+ border: none;
+ }
+
+ .albumRowName h2 {
+ margin-top: 0;
+ margin-bottom: 0;
+ }
+
+ .albumRowArt p,
+ .albumRowArt img {
+ margin: 0;
+ }
+
+ .albumRowName,
+ .albumRowArt {
+ float: none;
+ display: inline-block;
+ vertical-align: middle;
+ margin-bottom: 10px;
+ }
+}
+
+/* TODO: Use table-condensed if xs screen */