{"version":3,"sources":["webpack:///./src/components/parts/ratioSlider.less?2b72","components/parts/ratioSlider.less","webpack:///./src/components/shared/logoHeading.less?904a","components/shared/logoHeading.less","webpack:///./src/components/parts/helpInfo.less?b104","components/parts/helpInfo.less","webpack:///./src/components/parts/bottomNav.less?7c37","components/parts/bottomNav.less","webpack:///./src/components/parts/sideMenu.less?f9e9","components/parts/sideMenu.less","webpack:///./src/components/whiteSkyHeader.less?3d15","components/whiteSkyHeader.less","components/Loader.tsx","components/parts/RatioSlider.tsx","data/spreadsheetData.ts","helpers.ts","components/pages/Breakdown.tsx","components/pages/Outcomes.tsx","paths.ts","components/shared/profitpoint_logo_FA.svg","components/shared/LogoHeading.tsx","components/parts/HelpInfo.tsx","components/pages/Splash.tsx","components/parts/NumberInput.tsx","components/pages/What.tsx","components/pages/Who.tsx","components/parts/BottomNav.tsx","components/parts/PageHeader.tsx","components/parts/ScreenSmall.tsx","components/parts/SideMenu.tsx","components/WhiteSkyHeader.tsx","data/brain.ts","data/dataStore.ts","data/ppuRatesLoader.ts","utils/googleAnalytics.ts","App.tsx","serviceWorker.ts","index.tsx","webpack:///./src/app.less?5a81","app.less"],"names":["content","__webpack_require__","module","i","options","hmr","transform","insertInto","undefined","locals","exports","push","WaitLoader","props","size","react","style","fontSize","src","WaitLoaderFullScreen","position","left","top","right","bottom","width","height","display","justifyContent","alignItems","zIndex","backgroundColor","dark","flexDirection","Loader_WaitLoader","message","marginTop","PercentSlider","_useState","useState","defaultRatio","_useState2","Object","slicedToArray","sliderRatio","setSliderRatio","useEffect","v","Math","min","max","js_default","a","maxValue","minValue","value","onChange","onChangeComplete","formatLabel","genres","split","map","g","trim","spreadsheetGenreMixes","filter","length","genre","streaming","parseFloat","trackVsAlbum","digitalVsPhysical","spreadsheetGenreMixesLookup","Map","forEach","set","formats","physicals","giveCommas","s","replace","numberWithCommas","decimals","arguments","toFixed","currencyFormat","useNegativeSign","useBrackets","rawMoneyFormat","abs","concat","formatPercent","ratio","percentDisplay","getGenreBasedMixes","newMixes","get","streamingRatio","trackVsAlbumsRatio","digitalVsPhysicalRatio","Breakdown","data","onChanged","brain","renderSlidyForm","title","subTitle","total","fun","className","RatioSlider_PercentSlider","d","objectSpread","getStreamingUnits","m","getTrackDownloadUnits","getAlbumDownloadUnits","getPhysicalAlbumUnits","textAlign","onClick","e","info","Chart","defaults","global","defaultFontFamily","successRateGrid","toConsumableArray","Outcomes","incomes","getStreamingIncome","getTrackDownloadIncome","getAlbumDownloadIncome","getPhysicalAlbumIncome","chartDataSetData","c","column","row","reduce","b","chartData","labels","ss","toUpperCase","datasets","es","plugins","ChartDataLabels","responsive","maintainAspectRatio","tooltips","enabled","datalabels","color","formatter","context","chart","dataIndex","round","scales","yAxes","scaleLabel","ticks","beginAtZero","callback","label","index","xAxes","autoSkip","maxRotation","minRotation","legend","redraw","NavPath","_extends","assign","target","source","key","prototype","hasOwnProperty","call","apply","this","_objectWithoutProperties","excluded","sourceKeys","keys","indexOf","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","_ref2","react_default","createElement","type","_ref3","x","y","profitpoint_logo_FA_SvgProfitpointLogoFa","_ref","svgRef","id","viewBox","enableBackground","xmlSpace","ref","ForwardRef","forwardRef","p","LogoHeading","react_router_dom","to","subHeading","HelpInfo","show","setShow","rates","cdAlbumPrice","vinylAlbumPrice","digitalAlbumPrice","digitalTrackPrice","perStreamRate","href","Splash","redirect","setRedirect","react_router","LogoHeading_LogoHeading","HelpInfo_HelpInfo","CurrencyInput","numberMask","createNumberMask","prefix","suffix","reactTextMask_default","maxLength","mask","console","log","onValueChange","What","renderFieldRow","NumberInput_CurrencyInput","dd","recording","marketing","manufacturing","admin","other","getTotalSpend","SelectOption","Who","artistName","Who_SelectOption","format","doingPhysical","releaseName","BottomNav","path","exact","PageHeader","ScreenSmall","padding","ResultSection","heading","subDetail","detail","MoneyResultSection","amount","SideMenu_ResultSection","count","SideMenu","_props$brain$data","spend","breakEven","SideMenu_MoneyResultSection","WhiteSkyHeader","objectDestructuringEmpty","TheBrain","_this","classCallCheck","E7","E8","E20","E25","I25","K25","J25","E32","I32","K32","J32","E35","I35","K35","J35","E38","I38","K38","J38","I6","L32","L35","M35","M38","M6","getGenreMix","defaultStore","loadRates","asyncToGenerator","regenerator_default","mark","_callee","response","html","infoList","wrap","_context","prev","next","axios","method","url","responseType","sent","document","createRange","createContextualFragment","Array","from","querySelectorAll","values","innerText","abrupt","stop","isDevMode","window","location","startsWith","lastPath","trackCurrentPath","pathname","ReactGA","App","setData","_useState3","_useState4","loading","setLoading","history","useRef","createBrowserHistory","current","listen","action","load","WhiteSkyHeader_WhiteSkyHeader","Splash_Splash","Fragment","ScreenSmall_ScreenSmall","SideMenu_SideMenu","PageHeader_PageHeader","Who_Who","newData","What_What","Breakdown_Breakdown","Outcomes_Outcomes","BottomNav_BottomNav","Loader_WaitLoaderFullScreen","Boolean","hostname","match","ReactDOM","render","src_App","getElementById","navigator","serviceWorker","ready","then","registration","unregister"],"mappings":"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","file":"static/js/main.f06024b3.chunk.js","sourcesContent":["\nvar content = require(\"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/less-loader/dist/cjs.js!./ratioSlider.less\");\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = require(\"!../../../node_modules/style-loader/lib/addStyles.js\")(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(module.hot) {\n\tmodule.hot.accept(\"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/less-loader/dist/cjs.js!./ratioSlider.less\", function() {\n\t\tvar newContent = require(\"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/less-loader/dist/cjs.js!./ratioSlider.less\");\n\n\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\n\t\tvar locals = (function(a, b) {\n\t\t\tvar key, idx = 0;\n\n\t\t\tfor(key in a) {\n\t\t\t\tif(!b || a[key] !== b[key]) return false;\n\t\t\t\tidx++;\n\t\t\t}\n\n\t\t\tfor(key in b) idx--;\n\n\t\t\treturn idx === 0;\n\t\t}(content.locals, newContent.locals));\n\n\t\tif(!locals) throw new Error('Aborting CSS HMR due to changed css-modules locals.');\n\n\t\tupdate(newContent);\n\t});\n\n\tmodule.hot.dispose(function() { update(); });\n}","exports = module.exports = require(\"../../../node_modules/css-loader/dist/runtime/api.js\")(false);\n// Module\nexports.push([module.id, \"\", \"\"]);\n\n","\nvar content = require(\"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/less-loader/dist/cjs.js!./logoHeading.less\");\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = require(\"!../../../node_modules/style-loader/lib/addStyles.js\")(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(module.hot) {\n\tmodule.hot.accept(\"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/less-loader/dist/cjs.js!./logoHeading.less\", function() {\n\t\tvar newContent = require(\"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/less-loader/dist/cjs.js!./logoHeading.less\");\n\n\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\n\t\tvar locals = (function(a, b) {\n\t\t\tvar key, idx = 0;\n\n\t\t\tfor(key in a) {\n\t\t\t\tif(!b || a[key] !== b[key]) return false;\n\t\t\t\tidx++;\n\t\t\t}\n\n\t\t\tfor(key in b) idx--;\n\n\t\t\treturn idx === 0;\n\t\t}(content.locals, newContent.locals));\n\n\t\tif(!locals) throw new Error('Aborting CSS HMR due to changed css-modules locals.');\n\n\t\tupdate(newContent);\n\t});\n\n\tmodule.hot.dispose(function() { update(); });\n}","exports = module.exports = require(\"../../../node_modules/css-loader/dist/runtime/api.js\")(false);\n// Module\nexports.push([module.id, \".the-header {\\n font-size: 40px;\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n}\\n.the-header .top {\\n text-align: center;\\n width: 450px;\\n margin-left: 80px;\\n}\\n.the-header .presents {\\n text-align: left;\\n color: #81c5ed;\\n font-size: 0.35em;\\n}\\n.the-header .presents .ws {\\n letter-spacing: 4px;\\n}\\n.the-header .main-heading {\\n text-align: left;\\n color: #1d8bcc;\\n}\\n.the-header .sub-heading {\\n margin-top: 5px;\\n color: #000;\\n font-size: 0.6em;\\n}\\n\", \"\"]);\n\n","\nvar content = require(\"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/less-loader/dist/cjs.js!./helpInfo.less\");\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = require(\"!../../../node_modules/style-loader/lib/addStyles.js\")(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(module.hot) {\n\tmodule.hot.accept(\"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/less-loader/dist/cjs.js!./helpInfo.less\", function() {\n\t\tvar newContent = require(\"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/less-loader/dist/cjs.js!./helpInfo.less\");\n\n\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\n\t\tvar locals = (function(a, b) {\n\t\t\tvar key, idx = 0;\n\n\t\t\tfor(key in a) {\n\t\t\t\tif(!b || a[key] !== b[key]) return false;\n\t\t\t\tidx++;\n\t\t\t}\n\n\t\t\tfor(key in b) idx--;\n\n\t\t\treturn idx === 0;\n\t\t}(content.locals, newContent.locals));\n\n\t\tif(!locals) throw new Error('Aborting CSS HMR due to changed css-modules locals.');\n\n\t\tupdate(newContent);\n\t});\n\n\tmodule.hot.dispose(function() { update(); });\n}","exports = module.exports = require(\"../../../node_modules/css-loader/dist/runtime/api.js\")(false);\n// Module\nexports.push([module.id, \".help-info-wrap .about {\\n margin: 30px;\\n}\\n.help-info-wrap .about.click {\\n text-decoration: underline;\\n}\\n.help-info-wrap .help-info {\\n max-width: 535px;\\n margin: 30px;\\n text-align: justify;\\n border: 1px solid #eee;\\n border-radius: 10px;\\n padding: 20px;\\n transition: visibility 0s linear 0.33s, opacity 0.33s linear;\\n}\\n.help-info-wrap .help-info p {\\n margin-bottom: 20px;\\n}\\n.help-info-wrap .help-info p .head {\\n font-weight: 800;\\n display: block;\\n margin: 10px 0;\\n}\\n.fadeIn {\\n -webkit-animation-name: fadeIn;\\n animation-name: fadeIn;\\n}\\n\", \"\"]);\n\n","\nvar content = require(\"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/less-loader/dist/cjs.js!./bottomNav.less\");\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = require(\"!../../../node_modules/style-loader/lib/addStyles.js\")(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(module.hot) {\n\tmodule.hot.accept(\"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/less-loader/dist/cjs.js!./bottomNav.less\", function() {\n\t\tvar newContent = require(\"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/less-loader/dist/cjs.js!./bottomNav.less\");\n\n\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\n\t\tvar locals = (function(a, b) {\n\t\t\tvar key, idx = 0;\n\n\t\t\tfor(key in a) {\n\t\t\t\tif(!b || a[key] !== b[key]) return false;\n\t\t\t\tidx++;\n\t\t\t}\n\n\t\t\tfor(key in b) idx--;\n\n\t\t\treturn idx === 0;\n\t\t}(content.locals, newContent.locals));\n\n\t\tif(!locals) throw new Error('Aborting CSS HMR due to changed css-modules locals.');\n\n\t\tupdate(newContent);\n\t});\n\n\tmodule.hot.dispose(function() { update(); });\n}","exports = module.exports = require(\"../../../node_modules/css-loader/dist/runtime/api.js\")(false);\n// Module\nexports.push([module.id, \".bottom-nav {\\n display: flex;\\n flex-direction: row;\\n justify-content: space-between;\\n}\\n.bottom-nav a {\\n background-color: #aaa;\\n padding: 10px;\\n border-radius: 5px;\\n font-size: 15px;\\n text-decoration: none;\\n text-transform: uppercase;\\n color: #fff;\\n}\\n.bottom-nav a:hover {\\n background-color: #c3c3c3;\\n}\\n\", \"\"]);\n\n","\nvar content = require(\"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/less-loader/dist/cjs.js!./sideMenu.less\");\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = require(\"!../../../node_modules/style-loader/lib/addStyles.js\")(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(module.hot) {\n\tmodule.hot.accept(\"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/less-loader/dist/cjs.js!./sideMenu.less\", function() {\n\t\tvar newContent = require(\"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/less-loader/dist/cjs.js!./sideMenu.less\");\n\n\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\n\t\tvar locals = (function(a, b) {\n\t\t\tvar key, idx = 0;\n\n\t\t\tfor(key in a) {\n\t\t\t\tif(!b || a[key] !== b[key]) return false;\n\t\t\t\tidx++;\n\t\t\t}\n\n\t\t\tfor(key in b) idx--;\n\n\t\t\treturn idx === 0;\n\t\t}(content.locals, newContent.locals));\n\n\t\tif(!locals) throw new Error('Aborting CSS HMR due to changed css-modules locals.');\n\n\t\tupdate(newContent);\n\t});\n\n\tmodule.hot.dispose(function() { update(); });\n}","exports = module.exports = require(\"../../../node_modules/css-loader/dist/runtime/api.js\")(false);\n// Module\nexports.push([module.id, \".side-menu .results-head {\\n font-size: 28px;\\n margin-bottom: 20px;\\n color: #666;\\n}\\n.side-menu .result-section {\\n width: 100%;\\n margin: 40px 0;\\n font-size: 0.8em;\\n}\\n.side-menu .result-section table {\\n width: 100%;\\n}\\n.side-menu .result-section .heading {\\n text-transform: uppercase;\\n}\\n.side-menu .result-section .data td {\\n padding: 8px;\\n}\\n.side-menu .result-section .data .title {\\n width: 100px;\\n color: #1d8bcc;\\n}\\n.side-menu .result-section .data .title.total {\\n padding-left: 20px;\\n}\\n.side-menu .result-section .data .subdetail {\\n text-align: right;\\n}\\n.side-menu .result-section .data .info {\\n color: #aaa;\\n text-align: right;\\n}\\n.side-menu .result-section .data .info.total {\\n color: #666;\\n}\\n\", \"\"]);\n\n","\nvar content = require(\"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/less-loader/dist/cjs.js!./whiteSkyHeader.less\");\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = require(\"!../../node_modules/style-loader/lib/addStyles.js\")(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(module.hot) {\n\tmodule.hot.accept(\"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/less-loader/dist/cjs.js!./whiteSkyHeader.less\", function() {\n\t\tvar newContent = require(\"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/less-loader/dist/cjs.js!./whiteSkyHeader.less\");\n\n\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\n\t\tvar locals = (function(a, b) {\n\t\t\tvar key, idx = 0;\n\n\t\t\tfor(key in a) {\n\t\t\t\tif(!b || a[key] !== b[key]) return false;\n\t\t\t\tidx++;\n\t\t\t}\n\n\t\t\tfor(key in b) idx--;\n\n\t\t\treturn idx === 0;\n\t\t}(content.locals, newContent.locals));\n\n\t\tif(!locals) throw new Error('Aborting CSS HMR due to changed css-modules locals.');\n\n\t\tupdate(newContent);\n\t});\n\n\tmodule.hot.dispose(function() { update(); });\n}","exports = module.exports = require(\"../../node_modules/css-loader/dist/runtime/api.js\")(false);\n// Module\nexports.push([module.id, \".white-sky-header {\\n background: #1d8bcc;\\n padding: 20px;\\n width: 100%;\\n padding-right: 100px;\\n display: flex;\\n flex-direction: row;\\n justify-content: space-between;\\n}\\n.white-sky-header img {\\n height: 48px;\\n}\\n.white-sky-header .menu-box {\\n vertical-align: middle;\\n text-align: right;\\n color: #646464;\\n font-size: 12px;\\n font: 12px/1.5 'Arial';\\n display: flex;\\n align-items: center;\\n}\\n.white-sky-header .menu-box .primary-menu,\\n.white-sky-header .menu-box .primary-menu ul {\\n list-style: none;\\n padding: 0;\\n margin: 0;\\n cursor: default;\\n}\\n.white-sky-header .menu-box .primary-menu {\\n display: inline-block;\\n vertical-align: middle;\\n}\\n.white-sky-header .menu-box .primary-menu li {\\n position: relative;\\n}\\n.white-sky-header .menu-box .primary-menu > li {\\n float: left;\\n padding-right: 30px;\\n}\\n.white-sky-header .menu-box .primary-menu > li > a {\\n border-bottom: none !important;\\n}\\n.white-sky-header .menu-box .primary-menu > li > a {\\n font-size: 12px;\\n font-weight: 700;\\n letter-spacing: 1px;\\n color: #fff;\\n text-decoration: none;\\n}\\n\", \"\"]);\n\n","import * as React from \"react\";\r\n\r\nexport const WaitLoader = (props: { size?: number }) => {\r\n const size = (props.size ? props.size : 50);\r\n\r\n // http://samherbert.net/svg-loaders/\r\n // https://mhnpd.github.io/react-loader-spinner/\r\n\r\n // const [count, setCount] = React.useState(0);\r\n\r\n return
\r\n \r\n
\r\n\r\n // return \r\n\r\n}\r\n\r\n\r\nexport const WaitLoaderFullScreen = (props: {\r\n dark?: boolean,\r\n message?: string,\r\n}) =>\r\n
\r\n
\r\n \r\n {!!props.message &&
{props.message}
}\r\n
\r\n
\r\n","import * as React from 'react';\r\n// import Slider from 'react-rangeslider'\r\nimport InputRange from 'react-input-range';\r\nimport \"react-input-range/lib/css/index.css\"\r\nimport \"./ratioSlider.less\";\r\nimport { useState, useEffect } from 'react';\r\n\r\nexport interface PercentSliderProps {\r\n onChange: (ratio: number) => void,\r\n defaultRatio: number;\r\n}\r\n\r\nexport const PercentSlider = (props: PercentSliderProps) => {\r\n\r\n // const { ratio } = props;\r\n\r\n const [sliderRatio, setSliderRatio] = useState(props.defaultRatio);\r\n useEffect(() => { setSliderRatio(props.defaultRatio) }, [props.defaultRatio])\r\n // debugger; \r\n\r\n const v = Math.min(Math.max(sliderRatio * 100, 0), 100);\r\n return setSliderRatio((v as number) / 100)}\r\n onChangeComplete={v => {\r\n // debugger;\r\n props.onChange((v as number) / 100)\r\n }}\r\n formatLabel={v => \"\"}\r\n />\r\n\r\n // `${v}%`}\r\n // // handleLabel={horizontal}\r\n // onChange={this.handleChangeHorizontal}\r\n // />\r\n\r\n}","\r\nexport const genres =\r\n `Pop\r\nRock\r\nPunk\r\nIndie\r\nHip Hop\r\nEDM\r\nCountry\r\nJazz\r\nClassical\r\nRoots`.split(\"\\n\").map(g => g.trim())\r\n\r\n// copied directly out of the spreadsheet\r\n// these match up to the genres above exctly in the right order\r\nconst spreadsheetGenreMixesRaw = `\r\n80.00 \t 80.00 \t 90.00 \r\n70.00 \t 60.00 \t 75.00 \r\n40.00 \t 45.00 \t 30.00 \r\n80.00 \t 70.00 \t 75.00 \r\n80.00 \t 80.00 \t 90.00 \r\n95.00 \t 95.00 \t 95.00 \r\n20.00 \t 20.00 \t 20.00 \r\n50.00 \t 50.00 \t 50.00 \r\n30.00 \t 10.00 \t 20.00 \r\n75.00 \t 75.00 \t 60.00 \r\n`;\r\n\r\n//debugger;\r\n\r\nconst spreadsheetGenreMixes = spreadsheetGenreMixesRaw\r\n .split(\"\\n\").map(g => g.trim()) // split lines\r\n .map(g => g.split(\"\\t\").map(g => g.trim())).filter(g => g.length == 3) // split each number\r\n .map((g, i) => ({\r\n genre: genres[i],\r\n streaming: parseFloat(g[0]),\r\n trackVsAlbum: parseFloat(g[1]),\r\n digitalVsPhysical: parseFloat(g[2]),\r\n }))\r\n\r\n// export const spreadsheetGenreMixesLookup = makeLookup2(spreadsheetGenreMixes, g => g.genre, g => g);\r\nexport const spreadsheetGenreMixesLookup = new Map();\r\nspreadsheetGenreMixes.forEach(g => spreadsheetGenreMixesLookup.set(g.genre, g));\r\n\r\n// export const marketShareRatios = {\r\n// spotify: 0.80,\r\n// apple: 0.15,\r\n// google: 0.3,\r\n// others: 0.2,\r\n// }\r\n\r\nexport const formats = [\"Single\", \"Album\"];\r\nexport const physicals = [\"Yep, vinyl\", \"Yep, CDs\", \"A bit of both\", \"Nah\"];\r\n\r\n\r\n","import { BreakEvenAmountsModel } from \"./data/dataStore\";\r\nimport { spreadsheetGenreMixesLookup } from \"./data/spreadsheetData\";\r\n\r\nconst giveCommas = (s: string) => s.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n\r\nexport const numberWithCommas = (value: number, decimals: number = 2) => giveCommas(value.toFixed(decimals));\r\nexport const rawMoneyFormat = (value: number) => giveCommas(value.toFixed(2));\r\nexport const currencyFormat = (value: number, useNegativeSign: boolean = false) => {\r\n const symbol = \"$\"; // for now since we will only have $$ for a while\r\n if (value == undefined) return \"-\";\r\n const isNegative = value < 0;\r\n const useBrackets = !useNegativeSign && isNegative;\r\n const v = symbol + rawMoneyFormat(useBrackets ? Math.abs(value) : value);\r\n // surround negative numbers in brackets unless specified otherwise\r\n return useBrackets ? `(${v})` : v;\r\n}\r\n\r\n\r\n\r\nexport const percentDisplay = (ratio: number, decimals: number) => giveCommas((ratio * 100).toFixed(decimals)) + \"%\";\r\nexport const formatPercent = (ratio: number, decimals: number) => {\r\n return !!ratio\r\n ? percentDisplay(ratio, decimals)\r\n : \"-\"\r\n}\r\n\r\nexport const makeLookup2 = (list: TInput[], idFun: (o: TInput) => string, valueFun: (o: TInput) => TValue) => {\r\n const lookup = new Map();\r\n list.forEach(c => lookup.set(idFun(c), valueFun(c)));\r\n return lookup;\r\n}\r\n\r\n\r\n\r\nexport const getGenreBasedMixes = (genre: string): BreakEvenAmountsModel => {\r\n const newMixes = spreadsheetGenreMixesLookup.get(genre);\r\n\r\n return (!!newMixes)\r\n ? {\r\n streamingRatio: newMixes.streaming / 100,\r\n trackVsAlbumsRatio: newMixes.trackVsAlbum / 100,\r\n digitalVsPhysicalRatio: newMixes.digitalVsPhysical / 100,\r\n }\r\n : {\r\n streamingRatio: 0,\r\n trackVsAlbumsRatio: 0,\r\n digitalVsPhysicalRatio: 0,\r\n }\r\n\r\n\r\n}","import * as React from 'react';\r\nimport { PercentSlider } from '../parts/RatioSlider';\r\nimport { BreakEvenAmountsModel, defaultStore } from '../../data/dataStore';\r\nimport { formatPercent, currencyFormat, numberWithCommas, getGenreBasedMixes } from '../../helpers';\r\nimport { TheBrain } from '../../data/brain';\r\n\r\nexport interface BreakdownProps {\r\n data: BreakEvenAmountsModel;\r\n onChanged: (m: BreakEvenAmountsModel) => void;\r\n brain: TheBrain;\r\n}\r\n\r\n\r\n\r\n\r\n\r\nexport const Breakdown = (props: BreakdownProps) => {\r\n\r\n const { data, onChanged, brain } = props;\r\n\r\n const renderSlidyForm = (title: string, subTitle: any, ratio: number, total: number, fun: (m: BreakEvenAmountsModel, v: number) => void) => {\r\n return
\r\n \r\n {title}\r\n {numberWithCommas(total, 0)}\r\n \r\n {subTitle}\r\n \r\n \r\n {\r\n const d = { ...data };\r\n const vv = fun(d, v);\r\n onChanged(d);\r\n }}\r\n />\r\n \r\n {formatPercent(ratio, 1)}\r\n \r\n
\r\n }\r\n\r\n\r\n\r\n\r\n return
\r\n {renderSlidyForm(\r\n \"Streaming\",\r\n Mix of streaming income vs other income,\r\n data.streamingRatio,\r\n brain.getStreamingUnits(),\r\n (m, v) => m.streamingRatio = v\r\n )}\r\n\r\n {renderSlidyForm(\r\n \"Track Downloads\",\r\n Mix of track income vs album income,\r\n data.trackVsAlbumsRatio,\r\n brain.getTrackDownloadUnits(),\r\n (m, v) => m.trackVsAlbumsRatio = v\r\n )}\r\n\r\n {renderSlidyForm(\r\n \"Album Downloads\",\r\n Mix of digital album income vs physical album income,\r\n data.digitalVsPhysicalRatio,\r\n brain.getAlbumDownloadUnits(),\r\n (m, v) => m.digitalVsPhysicalRatio = v\r\n )}\r\n\r\n
\r\n \r\n Physical Albums\r\n {numberWithCommas(brain.getPhysicalAlbumUnits(), 0)}\r\n \r\n
\r\n\r\n
\r\n onChanged(getGenreBasedMixes(brain.data.info.genre))}>\r\n Reset Mix\r\n \r\n
\r\n\r\n
\r\n\r\n}","import * as React from 'react';\r\nimport ChartComponent, { Bar } from 'react-chartjs-2';\r\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\r\nimport { numberWithCommas, currencyFormat } from '../../helpers';\r\nimport { TheBrain } from '../../data/brain';\r\n\r\n\r\ndeclare var Chart: any;\r\nChart.defaults.global.defaultFontFamily = \"'Bitter', serif\";\r\n// https://chartjs-plugin-datalabels.netlify.com/guide/getting-started.html#configuration\r\n// Chart.helpers.merge(Chart.defaults.global.plugins.datalabels, {\r\n// color: '#FFF'\r\n// });\r\n\r\n\r\nconst successRateGridFromOutputSpreadsheet = `\r\n0.5\t1\t1\t0.5\t2\t1\r\n1\t1\t0.5\t1\t1\t2\r\n1\t0.5\t1\t2\t0.5\t1\r\n1\t0.5\t1\t2\t0.5\t1\r\n`;\r\n\r\nconst successRateGrid = successRateGridFromOutputSpreadsheet\r\n .split(\"\\n\").map(g => g.trim()) // split lines\r\n .map(g => g.split(\"\\t\").map(g => parseFloat(g.trim())))\r\n .map(g => [1, ...g]) // note, adding 1 to first column so the maths works out for the total column\r\n .filter(g => g.length == 7) // split each number\r\n ;\r\n\r\nexport interface OutcomesProps {\r\n brain: TheBrain;\r\n}\r\n\r\nexport const Outcomes = (props: OutcomesProps) => {\r\n\r\n const darkBlue = \"#1d8bcc\";\r\n const lightBlue = \"#7ac1ec\";\r\n\r\n const { brain } = props;\r\n\r\n const incomes = [brain.getStreamingIncome(), brain.getTrackDownloadIncome(), brain.getAlbumDownloadIncome(), brain.getPhysicalAlbumIncome()];\r\n\r\n // successRateGrid\r\n\r\n const getTotal = (column: number) =>\r\n incomes\r\n .map((a, row) => incomes[row] * successRateGrid[row][column])\r\n .reduce((a, b) => a + b, 0);\r\n\r\n const chartDataSetData = [0, 1, 2, 3, 4, 5, 6].map(c => getTotal(c));\r\n\r\n const chartData = {\r\n labels: [\r\n [\"Target\"],\r\n [\"Half as good\", \"on the streams\"],\r\n [\"Half as good on\", \"the albums\"],\r\n [\"Half as good on\", \"the tracks\"],\r\n [\"Half as good on\", \"the streams but\", \"twice as good on\", \"the albums\"],\r\n [\"Twice as good on\", \"the streams and\", \"half as good on\", \"the albums\"],\r\n [\"Twice as good on\", \"the track\", \"downloads\"]\r\n ].map(s => s.map(ss => ss.toUpperCase())),\r\n datasets: [\r\n {\r\n // label: \"blaaa\",\r\n backgroundColor: [darkBlue, lightBlue, lightBlue, lightBlue, lightBlue, lightBlue, lightBlue],\r\n data: chartDataSetData,\r\n },\r\n ]\r\n }\r\n // debugger;\r\n\r\n\r\n return
\r\n
\r\n {\r\n return numberWithCommas(Math.round(label as number));\r\n }\r\n // callback: function (label, index, labels) {\r\n // return numberWithCommas(label as number);\r\n // },\r\n // suggestedMax: options.max\r\n },\r\n }],\r\n xAxes: [{\r\n ticks: {\r\n autoSkip: false,\r\n maxRotation: 0, // makes the text horizontal\r\n minRotation: 0,\r\n // callback: (x: any, y: any, z: any) => {\r\n // debugger;\r\n // }\r\n }\r\n }]\r\n\r\n },\r\n legend: {\r\n display: false,\r\n },\r\n // animation: {\r\n // duration: options.disableAnimations ? 0 : 1000,\r\n // }\r\n\r\n }}\r\n redraw={false}\r\n width={950}\r\n height={400}\r\n\r\n />\r\n
\r\n
\r\n\r\n}","export const NavPath = {\r\n splash: \"/\",\r\n who: \"/who\",\r\n what: \"/what\",\r\n breakdown: \"/breakdown\",\r\n outcomes: \"/outcomes\",\r\n}","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport React from \"react\";\n\nvar _ref2 =\n/*#__PURE__*/\nReact.createElement(\"style\", {\n type: \"text/css\"\n}, \"\\n\\t.st0{fill:#595959;}\\n\\t.st1{fill:#158CD6;}\\n\");\n\nvar _ref3 =\n/*#__PURE__*/\nReact.createElement(\"g\", null, React.createElement(\"path\", {\n className: \"st0\",\n d: \"M150.5,57.1c-4.4,0-8.7,1.4-13,4.1c-4.3,2.7-7.6,6.3-10.1,10.7h-1.4l-4.5-13.3h-21.4v83.5h28.8v-41 c0-5.4,1.4-9.5,4.3-12.4c2.8-2.9,7.4-4.3,13.7-4.3c4.2,0,7.4,0.3,9.8,0.9l2.6-27.2l-1.6-0.3C155.4,57.3,153,57.1,150.5,57.1z\"\n}), React.createElement(\"path\", {\n className: \"st0\",\n d: \"M56,57.1c-9.4,0-16.8,4-22.2,12.1h-1.3l-4.1-10.6H5v119.7h28.8v-33.5c0-1.4-0.4-5.1-1.3-10.9h1.3 c3.3,3.6,6.6,6.2,9.9,7.6c3.3,1.4,7.1,2.1,11.3,2.1c9.4,0,16.8-3.9,22.3-11.6c5.5-7.7,8.2-18.3,8.2-31.8c0-13.4-2.6-23.9-7.9-31.5 C72.4,61,65.2,57.1,56,57.1z M53.8,115.6c-1.7,3.2-4.3,4.8-8,4.8c-4.1,0-7.1-1.6-9.1-4.8c-1.9-3.2-2.9-8.4-2.9-15.5v-2.3 c0.1-5.9,1.1-10.4,2.8-13.4c1.7-3,4.7-4.5,8.9-4.5c3.9,0,6.7,1.6,8.3,4.7c1.7,3.1,2.5,8.3,2.5,15.4 C56.3,107.2,55.4,112.4,53.8,115.6z\"\n}), React.createElement(\"path\", {\n className: \"st0\",\n d: \"M228.3,62.4c-6.3-3.5-13.5-5.2-21.7-5.2c-13.3,0-23.6,3.8-30.9,11.3c-7.3,7.5-11,18.1-11,31.7 c0,13.3,3.7,23.9,11.2,31.7c7.5,7.8,17.6,11.7,30.2,11.7c13.2,0,23.5-3.8,30.8-11.5c7.3-7.6,11-18.3,11-31.9 c0-8.7-1.7-16.3-5.1-22.8C239.4,70.9,234.5,65.9,228.3,62.4z M215.9,116.6c-1.8,3.8-5,5.6-9.5,5.6c-4.5,0-7.7-1.9-9.7-5.6 c-1.9-3.8-2.9-9.2-2.9-16.4c0-7.2,1-12.6,2.9-16.2c1.9-3.6,5.1-5.4,9.5-5.4c4.5,0,7.7,1.8,9.6,5.5c1.9,3.6,2.8,9,2.8,16.1 C218.6,107.3,217.7,112.8,215.9,116.6z\"\n}), React.createElement(\"path\", {\n className: \"st0\",\n d: \"M296.4,49.8c1-1.3,2.6-2,4.8-2c3.4,0,6.9,0.5,10.4,1.5l6.2-18.6c-4.5-1.5-8.5-2.5-11.9-3.1 c-3.4-0.6-7-0.9-10.9-0.9c-9.9,0-17.1,2.4-21.6,7.2c-4.5,4.8-6.7,12.7-6.7,23.7V59L255,66.1v14.1h11v61.9h28.8V80.2h17.8V58.6 h-17.8v-2.2C294.9,53.4,295.4,51.2,296.4,49.8z\"\n}), React.createElement(\"rect\", {\n x: 327.5,\n y: 58.6,\n className: \"st0\",\n width: 28.8,\n height: 83.5\n}), React.createElement(\"path\", {\n className: \"st0\",\n d: \"M341.9,23.4c-8,0-14.4,6.4-14.4,14.4c0,8,6.4,14.4,14.4,14.4c8,0,14.4-6.4,14.4-14.4 C356.3,29.8,349.8,23.4,341.9,23.4z\"\n}), React.createElement(\"path\", {\n className: \"st0\",\n d: \"M405.7,112.7V80.2h20.5V58.6h-20.5V37.8h-18.9l-7.4,21.7l-12.8,9.1v11.7h10.1v34.4c0,9.8,2.1,17.1,6.4,21.8 c4.3,4.7,11.2,7.1,20.9,7.1c4.7,0,8.8-0.4,12.3-1.1c3.5-0.7,7.2-1.9,11.1-3.6v-21c-5.4,1.9-10,2.9-13.9,2.9 C408.3,120.8,405.7,118.1,405.7,112.7z\"\n}), React.createElement(\"path\", {\n className: \"st1\",\n d: \"M494.7,57.1c-9.4,0-16.8,4-22.2,12.1h-1.3l-4.1-10.6h-23.4v119.7h28.8v-33.5c0-1.4-0.4-5.1-1.3-10.9h1.3 c3.3,3.6,6.6,6.2,9.9,7.6c3.3,1.4,7.1,2.1,11.3,2.1c9.4,0,16.8-3.9,22.3-11.6c5.5-7.7,8.2-18.3,8.2-31.8c0-13.4-2.6-23.9-7.9-31.5 C511.2,61,503.9,57.1,494.7,57.1z M492.5,115.6c-1.7,3.2-4.3,4.8-8,4.8c-4.1,0-7.1-1.6-9.1-4.8c-1.9-3.2-2.9-8.4-2.9-15.5v-2.3 c0.1-5.9,1.1-10.4,2.8-13.4c1.7-3,4.7-4.5,8.9-4.5c3.9,0,6.7,1.6,8.3,4.7c1.7,3.1,2.5,8.3,2.5,15.4 C495,107.2,494.1,112.4,492.5,115.6z\"\n}), React.createElement(\"path\", {\n className: \"st1\",\n d: \"M598.8,62.4c-6.3-3.5-13.5-5.2-21.7-5.2c-13.3,0-23.6,3.8-30.9,11.3c-7.3,7.5-11,18.1-11,31.7 c0,13.3,3.7,23.9,11.2,31.7c7.5,7.8,17.6,11.7,30.2,11.7c13.2,0,23.5-3.8,30.8-11.5c7.3-7.6,11-18.3,11-31.9 c0-8.7-1.7-16.3-5.1-22.8C609.9,70.9,605,65.9,598.8,62.4z M586.3,116.6c-1.8,3.8-5,5.6-9.5,5.6c-4.5,0-7.7-1.9-9.7-5.6 c-1.9-3.8-2.9-9.2-2.9-16.4c0-7.2,1-12.6,2.9-16.2c1.9-3.6,5.1-5.4,9.5-5.4c4.5,0,7.7,1.8,9.6,5.5c1.9,3.6,2.8,9,2.8,16.1 C589.1,107.3,588.2,112.8,586.3,116.6z\"\n}), React.createElement(\"rect\", {\n x: 631.8,\n y: 58.6,\n className: \"st1\",\n width: 28.8,\n height: 83.5\n}), React.createElement(\"path\", {\n className: \"st1\",\n d: \"M705.2,105.5c0-9.4,1.1-16.1,3.2-20c2.2-3.9,5.7-5.8,10.5-5.8c3.5,0,6.1,1.4,7.7,4.2c1.6,2.8,2.4,7,2.4,12.6 v45.5h28.8V87.8c0-9.7-2.6-17.3-7.7-22.6c-5.1-5.4-12.3-8-21.5-8c-5.6,0-10.6,1-15,2.9c-4.3,2-7.7,4.9-10.2,8.8h-1.7l-3.6-10.3 h-21.7v83.5h28.8V105.5z\"\n}), React.createElement(\"path\", {\n className: \"st1\",\n d: \"M829.5,117.6c-5.3,2.1-11.3,3.2-14.7,3.2c-5.2,0-7.8-2.7-7.8-8.1V80.2h20.5V58.6H807V37.8h-18.9l-7.4,21.7 l-12.8,9.1v11.7H778v34.4c0,9.8,2.1,17.1,6.4,21.8c4.3,4.7,11.2,7.1,20.9,7.1c4.7,0,8.8-0.4,12.3-1.1c3.5-0.7,8.2-2.4,12.1-4.1 c-0.9-2.6-1.5-5.2-1.7-8.1C827.6,125.9,828.2,121.6,829.5,117.6z\"\n}), React.createElement(\"path\", {\n className: \"st1\",\n d: \"M995,2.4l-77.9,34.3c-0.6,0.2-0.4,1.1,0.2,1.1l33-0.2c0.2,0.5,0.2,0.5,0.4,1c-20.5,18.1-50,44.1-71.6,63.2 c3.2,2.4,6,5.3,8.2,8.7c20.8-20.3,48.5-47.1,68.2-66.2c0.4-0.4,1-0.1,1,0.4l-0.3,30.5c0,0.6,0.8,0.8,1.1,0.3 C963.6,63.2,995,2.4,995,2.4C995,2.4,995,2.4,995,2.4z\"\n}), React.createElement(\"path\", {\n className: \"st0\",\n d: \"M831.9,143.3l-70.6,62.2c-0.2,0.2-0.6,0.2-0.8,0L719,163c-0.2-0.2-0.6-0.2-0.8,0l-78.9,78.7 c-0.5,0.5,0.2,1.3,0.8,0.9l76.5-60.6c0.2-0.2,0.6-0.2,0.8,0.1l41.9,50.8c0.2,0.3,0.6,0.3,0.8,0l82.1-78.3 C837.9,151.6,834.4,147.8,831.9,143.3z\"\n}), React.createElement(\"path\", {\n className: \"st1\",\n d: \"M858.9,112.4c-8.5,0.7-14.8,8.1-14.1,16.6c0.7,8.5,8.1,14.8,16.6,14.1c8.5-0.7,14.8-8.1,14.1-16.6 C874.8,118,867.4,111.7,858.9,112.4z\"\n}), React.createElement(\"path\", {\n className: \"st1\",\n d: \"M646.2,52.2c8,0,14.4-6.4,14.4-14.4c0-8-6.4-14.4-14.4-14.4c-8,0-14.4,6.4-14.4,14.4 C631.8,45.7,638.2,52.2,646.2,52.2z\"\n}));\n\nvar SvgProfitpointLogoFa = function SvgProfitpointLogoFa(_ref) {\n var svgRef = _ref.svgRef,\n props = _objectWithoutProperties(_ref, [\"svgRef\"]);\n\n return React.createElement(\"svg\", _extends({\n id: \"artwork\",\n x: \"0px\",\n y: \"0px\",\n viewBox: \"0 0 1000 245\",\n style: {\n enableBackground: \"new 0 0 1000 245\"\n },\n xmlSpace: \"preserve\",\n ref: svgRef\n }, props), _ref2, _ref3);\n};\n\nvar ForwardRef = React.forwardRef(function (props, ref) {\n return React.createElement(SvgProfitpointLogoFa, _extends({\n svgRef: ref\n }, props));\n});\nexport default __webpack_public_path__ + \"static/media/profitpoint_logo_FA.175935ad.svg\";\nexport { ForwardRef as ReactComponent };","import * as React from 'react';\r\nimport \"./logoHeading.less\";\r\nimport { ReactComponent as Logo } from './profitpoint_logo_FA.svg';\r\nimport { NavLink } from 'react-router-dom';\r\n\r\nexport interface LogoHeadingProps {\r\n subHeading: string;\r\n}\r\n\r\nexport const LogoHeading = (props: LogoHeadingProps) => {\r\n\r\n\r\n return
\r\n
\r\n \r\n \r\n \r\n
\r\n
{props.subHeading}
\r\n
\r\n\r\n}","import * as React from 'react';\r\nimport \"./helpInfo.less\";\r\nimport { useState, useEffect } from 'react';\r\nimport { currencyFormat } from '../../helpers';\r\nimport { PricePerUnitRate } from '../../data/dataStore';\r\n\r\n// declare var GSheetReader: any;\r\n\r\nexport interface HelpInfoProps {\r\n rates: PricePerUnitRate;\r\n}\r\n\r\nexport const HelpInfo = (props: HelpInfoProps) => {\r\n\r\n const [show, setShow] = useState(false);\r\n\r\n const { rates } = props;\r\n\r\n\r\n return
\r\n {!show &&\r\n
setShow(true)}>About
\r\n }\r\n {show &&\r\n
\r\n

\r\n WHAT IS THIS?\r\n It's a tool to help you answer the eternal question, \"what do I need to sell or stream to cover my release costs?\" … or …. \"What is my ProfitPoint?\"\r\n

\r\n

\r\n HOW DO I USE IT?\r\n Enter a few details about your release and your expenses, and the tool will give you sales targets across a range of format types.\r\n

\r\n

\r\n THOSE TARGETS LOOK WAY OUT OF WHACK!\r\n Does the streaming target look a bit too high? No way that you'll sell that many albums? Drag the sliders around to change the sales mix and we'll automagically adjust the other formats so you always hit your ProfitPoint. Play around till you get a good, achievable set of targets for your release.\r\n

\r\n

\r\n WHAT ARE YOU BASING THESE NUMBERS ON?\r\n We've based all our figures on the real artist income that we've reviewed and analysed over the last few years. There's no way to predict the future and the \"price per unit\" for streams and sales is constantly in flux, but this should hopefully get you off to a good start. The price per unit for each format is:\r\n

\r\n {/* note: need all the decimal places so don't display as money */}\r\n
    \r\n
  • AU${rates.cdAlbumPrice} – CD
  • \r\n
  • AU${rates.vinylAlbumPrice} – LP
  • \r\n
  • AU${rates.digitalAlbumPrice} – Album download
  • \r\n
  • AU${rates.digitalTrackPrice} – Track Download
  • \r\n
  • AU${rates.perStreamRate} – Stream
  • \r\n
\r\n

\r\n
\r\n We will be updating these figures as we receive more data over time.\r\n

\r\n

\r\n ANYTHING ELSE?\r\n Yeah, just that this is a fun little tool and not meant to produce rock solid figures for your budget. Have a play around to get some rough ideas but always feel free to get in touch with us directly if you want to get into some real number crunching!.\r\n

\r\n

\r\n HIT US UP\r\n info@whitesky.com.au\r\n

\r\n
\r\n }\r\n
\r\n\r\n}","import * as React from 'react';\r\nimport { BrowserRouter as Router, Route, Link, Redirect } from \"react-router-dom\";\r\nimport { useState } from 'react';\r\nimport { NavPath } from '../../paths';\r\nimport { LogoHeading } from '../shared/LogoHeading';\r\nimport { HelpInfo } from '../parts/HelpInfo';\r\nimport { PricePerUnitRate } from '../../data/dataStore';\r\n\r\nexport interface SplashProps {\r\n rates: PricePerUnitRate;\r\n}\r\n\r\nexport const Splash = (props: SplashProps) => {\r\n\r\n const [redirect, setRedirect] = useState(false);\r\n\r\n if (redirect) return \r\n\r\n return
\r\n
setRedirect(true)}>\r\n \r\n
\r\n \r\n
\r\n\r\n}","import * as React from 'react';\r\nimport MaskedInput, { MaskedInputProps } from 'react-text-mask'\r\nimport createNumberMask from 'text-mask-addons/dist/createNumberMask'\r\n\r\n// export interface NumberInputProps {\r\n// }\r\n\r\nconst currencySymbol = \"$\";\r\n\r\nexport const CurrencyInput = (props: { value: number, onValueChange: (v: number) => void }) => {\r\n\r\n const numberMask = createNumberMask({\r\n prefix: currencySymbol,\r\n suffix: ''\r\n })\r\n\r\n return props.onValueChange(0)}\r\n onChange={e => {\r\n console.log(\">>>\", e.target.value);\r\n const s = e.target.value\r\n .replace(/,/g, \"\")\r\n .replace(currencySymbol, \"\")\r\n .replace(\"%\", \"\")\r\n ;\r\n const v = parseFloat(s) || 0;\r\n props.onValueChange(v);\r\n }}\r\n\r\n />\r\n\r\n}","import * as React from 'react';\r\nimport { CurrencyInput } from '../parts/NumberInput';\r\nimport { SpendAmountsModel } from '../../data/dataStore';\r\nimport { TheBrain } from '../../data/brain';\r\nimport { currencyFormat } from '../../helpers';\r\n\r\nexport interface WhatProps {\r\n data: SpendAmountsModel;\r\n onChanged: (m: SpendAmountsModel) => void;\r\n brain: TheBrain;\r\n}\r\n\r\n\r\nexport const What = (props: WhatProps) => {\r\n\r\n const { data, onChanged, brain } = props;\r\n\r\n const renderFieldRow = (title: string, v: number, fun: (p: SpendAmountsModel, v: number) => void) =>\r\n <>\r\n \r\n {\r\n const dd = { ...data };\r\n const vv = v;\r\n fun(dd, vv);\r\n onChanged(dd);\r\n }}\r\n // x={44}\r\n />\r\n \r\n\r\n\r\n\r\n return
\r\n
\r\n {renderFieldRow(\"Recording\", data.recording, (p, v) => p.recording = v)}\r\n {renderFieldRow(\"Marketing/Promo\", data.marketing, (p, v) => p.marketing = v)}\r\n {renderFieldRow(\"Manufacturing\", data.manufacturing, (p, v) => p.manufacturing = v)}\r\n {renderFieldRow(\"Admin\", data.admin, (p, v) => p.admin = v)}\r\n {renderFieldRow(\"Anything else?\", data.other, (p, v) => p.other = v)}\r\n {/*
*/}\r\n
{/* spacer */}\r\n
{/* spacer */}\r\n TOTAL\r\n {currencyFormat(brain.getTotalSpend())}\r\n {/*
*/}\r\n
\r\n
\r\n\r\n}","import * as React from 'react';\r\nimport { InfoModel } from '../../data/dataStore';\r\nimport { genres, formats, physicals } from '../../data/spreadsheetData';\r\n\r\n\r\n\r\n\r\n\r\nexport interface WhoProps {\r\n data: InfoModel;\r\n onChanged: (m: InfoModel) => void;\r\n}\r\n\r\nconst SelectOption = () => \r\n\r\nexport const Who = (props: WhoProps) => {\r\n\r\n const { data, onChanged } = props;\r\n\r\n return
\r\n
\r\n \r\n {\r\n onChanged({\r\n ...data,\r\n artistName: e.target.value || \"\",\r\n })\r\n }}\r\n />\r\n\r\n \r\n {\r\n onChanged({\r\n ...data,\r\n genre: e.target.value || \"\",\r\n })\r\n }}\r\n >\r\n \r\n {genres.map(g =>\r\n {g}\r\n )}\r\n \r\n\r\n \r\n {\r\n onChanged({\r\n ...data,\r\n format: e.target.value || \"\",\r\n })\r\n }}\r\n >\r\n \r\n {formats.map(g =>\r\n {g}\r\n )}\r\n \r\n\r\n \r\n {\r\n onChanged({\r\n ...data,\r\n doingPhysical: e.target.value,\r\n })\r\n }}\r\n >\r\n \r\n {physicals.map(g =>\r\n {g}\r\n )}\r\n \r\n\r\n \r\n {\r\n onChanged({\r\n ...data,\r\n releaseName: e.target.value || \"\",\r\n })\r\n }}\r\n />\r\n\r\n
\r\n
\r\n\r\n}","import * as React from 'react';\r\nimport { BrowserRouter as Router, Route, Link, Switch } from \"react-router-dom\";\r\nimport { NavPath } from '../../paths';\r\nimport \"./bottomNav.less\";\r\n\r\nexport interface BottomNavProps {\r\n}\r\n\r\nexport const BottomNav = (props: BottomNavProps) => {\r\n\r\n\r\n return
\r\n \r\n \r\n \r\n To Budget\r\n \r\n \r\n Change Info\r\n View Targets\r\n \r\n \r\n Change Budget\r\n View Outcomes\r\n \r\n \r\n Back to Targets\r\n {/* Export PDF */}\r\n \r\n \r\n \r\n\r\n
\r\n\r\n}","import * as React from 'react';\r\nimport { NavPath } from '../../paths';\r\nimport { Switch, Route } from 'react-router';\r\nimport { LogoHeading } from '../shared/LogoHeading';\r\nimport { NavLink } from 'react-router-dom';\r\n\r\nexport interface PageHeaderProps {\r\n}\r\n\r\nexport const PageHeader = (props: PageHeaderProps) => {\r\n\r\n\r\n return
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n}","import * as React from 'react';\r\n// import \"./.less\";\r\n\r\nexport interface ScreenSmallProps {\r\n}\r\n\r\nexport const ScreenSmall = (props: ScreenSmallProps) =>\r\n
\r\n \r\n
\r\n
\r\n Your screen is too small, ProfitPoint is best used on a larger screen.\r\n
\r\n
\r\n Please increase the size of your window, or change to a different device\r\n
","import * as React from 'react';\r\nimport \"./sideMenu.less\";\r\nimport { BEOMStore } from '../../data/dataStore';\r\nimport { currencyFormat, numberWithCommas } from '../../helpers';\r\nimport { TheBrain } from '../../data/brain';\r\n\r\nexport interface MenuProps {\r\n brain: TheBrain;\r\n}\r\n\r\n\r\n\r\n\r\nconst ResultSection = (props: {\r\n heading: string,\r\n data: { title: string, subDetail?: string, detail: string }[],\r\n total?: string,\r\n}) =>\r\n
\r\n
{props.heading}
\r\n \r\n \r\n {props.data.map(d =>\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {!!props.total &&\r\n \r\n \r\n \r\n \r\n \r\n }\r\n \r\n
{d.title}{d.subDetail}{d.detail}
TOTAL{props.total}
\r\n
\r\n\r\nconst MoneyResultSection = (props: {\r\n heading: string,\r\n data: { title: string, count?: number, amount: number }[],\r\n total?: string,\r\n}) => {\r\n const total = props.data\r\n .map(d => d.amount)\r\n .reduce((a, b) => a + b, 0);\r\n\r\n return ({\r\n title: d.title,\r\n subDetail: !!d.count ? numberWithCommas(d.count, 0) : \"\",\r\n detail: !!d.amount ? currencyFormat(d.amount) : \"\",\r\n }))}\r\n total={!!total ? currencyFormat(total) : \"\"}\r\n />\r\n}\r\n\r\nexport const SideMenu = (props: MenuProps) => {\r\n\r\n const { brain, brain: { data: { info, spend, breakEven } } } = props;\r\n\r\n return
\r\n
Results
\r\n \r\n \r\n \r\n\r\n
\r\n\r\n}","import * as React from 'react';\r\nimport \"./whiteSkyHeader.less\";\r\n\r\nexport interface WhiteSkyHeaderProps {\r\n}\r\n\r\nexport const WhiteSkyHeader = (props: WhiteSkyHeaderProps) => {\r\n\r\n\r\n const { } = props;\r\n\r\n\r\n return
\r\n \r\n {/* */}\r\n \r\n \r\n\r\n {/* taken from whitesky website */}\r\n
\r\n {/* */}\r\n
\r\n\r\n\r\n\r\n\r\n
\r\n\r\n}","import { BEOMStore } from \"./dataStore\";\r\nimport { spreadsheetGenreMixesLookup } from \"./spreadsheetData\";\r\n\r\nexport class TheBrain {\r\n\r\n constructor(public data: BEOMStore) {\r\n\r\n }\r\n\r\n\r\n\r\n\r\n // getStreamingMix = () => {\r\n // const genre = this.getGenreMix();\r\n // if (!genre) return 0;\r\n // return genre.streaming;\r\n // }\r\n\r\n // getTrackVsAlbumMix = () => {\r\n // const genre = this.getGenreMix();\r\n // if (!genre) return 0;\r\n // return genre.trackVsAlbum;\r\n // }\r\n\r\n // getDigitalVsPhysicalMix = () => {\r\n // const genre = this.getGenreMix();\r\n // if (!genre) return 0;\r\n // return genre.digitalVsPhysical;\r\n // }\r\n\r\n getTotalSpend = () => {\r\n const d = this.data.spend;\r\n return d.admin + d.manufacturing + d.marketing + d.other + d.recording;\r\n }\r\n\r\n\r\n E7 = () => this.data.info.format;\r\n E8 = () => this.data.info.doingPhysical;\r\n E20 = () => this.getTotalSpend();\r\n E25 = () => this.I25() == 0 ? 0 : this.K25() / this.J25();\r\n E32 = () => this.I32() == 0 ? 0 : this.K32() / this.J32();\r\n E35 = () => this.I35() == 0 ? 0 : Math.round(this.K35() / this.J35());\r\n E38 = () => this.I38() == 0 ? 0 : Math.round(this.K38() / this.J38());\r\n I6 = () => this.data.breakEven.streamingRatio * 100;\r\n I25 = () => this.I6();\r\n I32 = () => this.E7() == \"Album\" ? (100 - this.I25()) * this.L32() / 100 : (100 - this.I25()); // =IF(E7=\"Album\",(100-I25)*L32/100,(100-I25))\r\n I35 = () => (this.I25() + this.I32() == 100)\r\n ? 0\r\n : (this.E7() == \"Album\" && this.E8() == \"Nah\")\r\n ? (100 - this.I25()) * this.L35() / 100\r\n : (100 - this.I25()) * this.L35() / 100 * this.M35() / 100\r\n ;\r\n I38 = () => this.E8() == \"Nah\"\r\n ? 0\r\n : this.E7() == \"Album\"\r\n ? (100 - this.I25()) * this.L35() / 100 * this.M38() / 100\r\n : 0;\r\n J25 = () => this.data.rates.perStreamRate;\r\n J38 = () => this.E8() == \"Yep, vinyl\"\r\n ? this.data.rates.vinylAlbumPrice\r\n : this.E8() == \"Yep, CDs\"\r\n ? this.data.rates.cdAlbumPrice\r\n : this.E8() == \"A bit of both\"\r\n ? (this.data.rates.vinylAlbumPrice + this.data.rates.cdAlbumPrice) * 0.5\r\n : 0\r\n J32 = () => this.data.rates.digitalTrackPrice;\r\n J35 = () => this.data.rates.digitalAlbumPrice;\r\n K25 = () => (this.E20() * this.I25()) / 100;\r\n K32 = () => this.E20() * this.I32() / 100; //$E$20*I32/100;\r\n K35 = () => this.E20() * this.I35() / 100;\r\n K38 = () => this.E20() * this.I38() / 100\r\n L32 = () => {\r\n return this.data.breakEven.trackVsAlbumsRatio * 100;\r\n }\r\n L35 = () => 100 - this.L32();\r\n M6 = () => this.data.breakEven.digitalVsPhysicalRatio * 100;\r\n M35 = () => this.M6()\r\n M38 = () => 100 - this.M35();\r\n\r\n\r\n getStreamingUnits = () => {\r\n // debugger;\r\n return Math.round(this.E25());\r\n }\r\n getStreamingIncome = () => this.K25();\r\n\r\n getTrackDownloadUnits = () => Math.round(this.E32());\r\n getTrackDownloadIncome = () => this.K32();\r\n\r\n getAlbumDownloadUnits = () => Math.round(this.E35());\r\n getAlbumDownloadIncome = () => this.K35();\r\n\r\n // =IF(I38<>0,ROUND(K38/J38,0),0)\r\n getPhysicalAlbumUnits = () => Math.round(this.E38());\r\n getPhysicalAlbumIncome = () => this.K38();\r\n\r\n getGenreMix = () => spreadsheetGenreMixesLookup.get(this.data.info.genre);\r\n\r\n // target = {\r\n // streams\r\n // trackDownloads\r\n // albumDownloads\r\n // physicalAlbums\r\n // total\r\n // }\r\n\r\n\r\n}","\r\nexport interface BreakEvenAmountsModel {\r\n streamingRatio: number;\r\n trackVsAlbumsRatio: number;\r\n digitalVsPhysicalRatio: number;\r\n // physicalAlbums: number;\r\n}\r\n\r\nexport interface SpendAmountsModel {\r\n recording: number;\r\n marketing: number;\r\n manufacturing: number;\r\n admin: number;\r\n other: number;\r\n}\r\n\r\nexport interface InfoModel {\r\n artistName: string;\r\n genre: string;\r\n format: string;\r\n doingPhysical: string;\r\n releaseName: string;\r\n\r\n}\r\n\r\nexport interface BEOMStore {\r\n info: InfoModel;\r\n spend: SpendAmountsModel;\r\n breakEven: BreakEvenAmountsModel;\r\n rates: PricePerUnitRate,\r\n}\r\n\r\nexport interface PricePerUnitRate {\r\n perStreamRate: number;\r\n digitalTrackPrice: number;\r\n digitalAlbumPrice: number;\r\n vinylAlbumPrice: number;\r\n cdAlbumPrice: number;\r\n}\r\n\r\n\r\nconst emptyStore: BEOMStore = {\r\n info: {\r\n artistName: \"\",\r\n genre: \"\",\r\n format: \"\",\r\n doingPhysical: \"\",\r\n releaseName: \"\",\r\n },\r\n spend: {\r\n recording: 0,\r\n marketing: 0,\r\n manufacturing: 0,\r\n admin: 0,\r\n other: 0,\r\n },\r\n breakEven: {\r\n streamingRatio: 0,\r\n trackVsAlbumsRatio: 0,\r\n digitalVsPhysicalRatio: 0,\r\n // physicalAlbums: 0,\r\n },\r\n // defaults for now.. these will be loaded dynamically\r\n rates: {\r\n perStreamRate: 0.0062,\r\n digitalTrackPrice: 0.99,\r\n digitalAlbumPrice: 10.99,\r\n vinylAlbumPrice: 29.99,\r\n cdAlbumPrice: 12.99,\r\n },\r\n\r\n}\r\n\r\nexport const testStore: BEOMStore = {\r\n info: {\r\n artistName: \"test artist\",\r\n genre: \"EDM\",\r\n format: \"Single\",\r\n doingPhysical: \"Yep, vinyl\",\r\n releaseName: \"Testing 1234\",\r\n },\r\n spend: {\r\n recording: 25000,\r\n marketing: 2400,\r\n manufacturing: 2500,\r\n admin: 1300,\r\n other: 11,\r\n },\r\n breakEven: {\r\n streamingRatio: 0.8,\r\n trackVsAlbumsRatio: 0.15,\r\n digitalVsPhysicalRatio: 0.03,\r\n // physicalAlbums: 0.02,\r\n },\r\n rates: {\r\n perStreamRate: 0.0062,\r\n digitalTrackPrice: 0.99,\r\n digitalAlbumPrice: 10.99,\r\n vinylAlbumPrice: 29.99,\r\n cdAlbumPrice: 12.99,\r\n }\r\n}\r\n\r\nexport const defaultStore: BEOMStore = emptyStore;\r\n","import axios from \"axios\";\r\n\r\nexport const loadRates = async () => {\r\n\r\n // editable version\r\n // https://docs.google.com/spreadsheets/d/1gxkKNHeNbFAbLqnwn-Vt2d6K9KkNm5HYJwXCnK5Z8KA/edit#gid=0\r\n\r\n // published version\r\n // https://docs.google.com/spreadsheets/d/e/2PACX-1vTRFFS_bd9stss1Uh1k8PbEK4zd3iGQPSa8Ogn82gQD6t05DPxcSe4jIfE2pXZTbbig4tcQ_ZyYIn86/pubhtml\r\n\r\n // we aren't doing any clever reading of the spreadsheet here since this\r\n // takes way too much security and isn't worth the effort\r\n // let's just read the published html version of the spreadsheet and parse\r\n\r\n const url = \"https://docs.google.com/spreadsheets/d/e/2PACX-1vTRFFS_bd9stss1Uh1k8PbEK4zd3iGQPSa8Ogn82gQD6t05DPxcSe4jIfE2pXZTbbig4tcQ_ZyYIn86/pubhtml\"\r\n const response = await axios({ method: 'get', url, responseType: 'text' });\r\n const html = document.createRange().createContextualFragment(response.data);\r\n const infoList = Array.from(html.querySelectorAll(\"td\").values()).map(v => v.innerText);\r\n\r\n let perStreamRate = 0,\r\n digitalTrackPrice = 0,\r\n digitalAlbumPrice = 0,\r\n vinylAlbumPrice = 0,\r\n cdAlbumPrice = 0;\r\n\r\n for (let i = 0; i < infoList.length; i++) {\r\n const s = infoList[i];\r\n if (s === \"Per Stream Rate\") perStreamRate = +infoList[i + 1]\r\n if (s === \"Digital Track Price\") digitalTrackPrice = +infoList[i + 1]\r\n if (s === \"Digital Album Price\") digitalAlbumPrice = +infoList[i + 1]\r\n if (s === \"Vinyl Album Price\") vinylAlbumPrice = +infoList[i + 1]\r\n if (s === \"CD Album Price\") cdAlbumPrice = +infoList[i + 1]\r\n }\r\n\r\n return {\r\n perStreamRate,\r\n digitalTrackPrice,\r\n digitalAlbumPrice,\r\n vinylAlbumPrice,\r\n cdAlbumPrice,\r\n }\r\n\r\n\r\n}","import * as ReactGA from 'react-ga';\r\n\r\nconst isDevMode = () => window.location.href.startsWith(\"http://localhost:\");\r\n// const isDevMode = () => false;\r\n\r\nlet lastPath = \"\"\r\n\r\nexport const initialiseGA = () => {\r\n if (isDevMode()) return;\r\n\r\n const gaId = \"UA-145863763-1\"\r\n ReactGA.initialize(gaId);\r\n trackCurrentPath();\r\n}\r\n\r\nexport const trackCurrentPath = () => {\r\n if (isDevMode()) return;\r\n\r\n // google analytics\r\n const url = document.location.pathname;\r\n if (url != lastPath) {\r\n ReactGA.pageview(url);\r\n console.log(url);\r\n }\r\n lastPath = url;\r\n\r\n}\r\n","import { createBrowserHistory } from 'history';\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { Route, Router, Switch } from \"react-router-dom\";\r\nimport './app.less';\r\nimport { WaitLoaderFullScreen } from './components/Loader';\r\nimport { Breakdown } from './components/pages/Breakdown';\r\nimport { Outcomes } from './components/pages/Outcomes';\r\nimport { Splash } from './components/pages/Splash';\r\nimport { What } from './components/pages/What';\r\nimport { Who } from './components/pages/Who';\r\nimport { BottomNav } from './components/parts/BottomNav';\r\nimport { PageHeader } from './components/parts/PageHeader';\r\nimport { ScreenSmall } from './components/parts/ScreenSmall';\r\nimport { SideMenu } from './components/parts/SideMenu';\r\nimport { WhiteSkyHeader } from './components/WhiteSkyHeader';\r\nimport { TheBrain } from './data/brain';\r\nimport { defaultStore } from './data/dataStore';\r\nimport { loadRates } from './data/ppuRatesLoader';\r\nimport { getGenreBasedMixes } from './helpers';\r\nimport { NavPath } from './paths';\r\nimport { initialiseGA, trackCurrentPath } from './utils/googleAnalytics';\r\n\r\nconst App: React.FC = () => {\r\n\r\n const [data, setData] = useState(defaultStore);\r\n // const [data, setData] = useState(testStore);\r\n\r\n\r\n const [loading, setLoading] = useState(true);\r\n\r\n const history = useRef(createBrowserHistory());\r\n\r\n useEffect(() => {\r\n // initialise google analytics\r\n initialiseGA();\r\n\r\n // track page changes\r\n history.current.listen((location, action) => {\r\n trackCurrentPath();\r\n })\r\n }, [])\r\n\r\n\r\n\r\n\r\n const load = async () => {\r\n const rates = await loadRates();\r\n console.log({ rates });\r\n\r\n setData({\r\n ...data,\r\n rates: rates,\r\n });\r\n\r\n setLoading(false);\r\n }\r\n\r\n useEffect(() => { load() }, []);\r\n\r\n const brain = new TheBrain(data);\r\n\r\n return
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <>\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n {/* */}\r\n \r\n {\r\n const newData = { ...data };\r\n if (data.info.genre != d.genre) {\r\n // genre has changed... update the defaults\r\n newData.breakEven = getGenreBasedMixes(d.genre)\r\n }\r\n\r\n setData({\r\n ...newData,\r\n info: d\r\n })\r\n\r\n }}\r\n />\r\n \r\n \r\n setData({\r\n ...data,\r\n spend: d\r\n })}\r\n brain={brain}\r\n />\r\n \r\n \r\n setData({\r\n ...data,\r\n breakEven: d\r\n })}\r\n brain={brain}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n {loading && }\r\n \r\n
\r\n
\r\n
\r\n
\r\n}\r\n\r\nexport default App;\r\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(\n (process as { env: { [key: string]: string } }).env.PUBLIC_URL,\n window.location.href\n );\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n","\nvar content = require(\"!!../node_modules/css-loader/dist/cjs.js!../node_modules/less-loader/dist/cjs.js!./app.less\");\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = require(\"!../node_modules/style-loader/lib/addStyles.js\")(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(module.hot) {\n\tmodule.hot.accept(\"!!../node_modules/css-loader/dist/cjs.js!../node_modules/less-loader/dist/cjs.js!./app.less\", function() {\n\t\tvar newContent = require(\"!!../node_modules/css-loader/dist/cjs.js!../node_modules/less-loader/dist/cjs.js!./app.less\");\n\n\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\n\t\tvar locals = (function(a, b) {\n\t\t\tvar key, idx = 0;\n\n\t\t\tfor(key in a) {\n\t\t\t\tif(!b || a[key] !== b[key]) return false;\n\t\t\t\tidx++;\n\t\t\t}\n\n\t\t\tfor(key in b) idx--;\n\n\t\t\treturn idx === 0;\n\t\t}(content.locals, newContent.locals));\n\n\t\tif(!locals) throw new Error('Aborting CSS HMR due to changed css-modules locals.');\n\n\t\tupdate(newContent);\n\t});\n\n\tmodule.hot.dispose(function() { update(); });\n}","exports = module.exports = require(\"../node_modules/css-loader/dist/runtime/api.js\")(false);\n// Module\nexports.push([module.id, \"body {\\n /* font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\\n sans-serif; */\\n /* font-family: BentonSans-Light; */\\n font-family: 'Open Sans', sans-serif;\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n background-color: white;\\n padding: 0;\\n margin: 0;\\n font-size: 14px;\\n}\\n@media only screen and (max-width: 1240px) {\\n .hide-small-screen {\\n display: none !important;\\n }\\n}\\n@media only screen and (min-width: 1240px) {\\n .show-small-screen {\\n display: none !important;\\n }\\n}\\n.click {\\n cursor: pointer;\\n}\\n.white-sky-header {\\n box-sizing: border-box;\\n height: 88px;\\n}\\n.splash {\\n height: calc(100vh - 88px);\\n width: 100vw;\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n justify-content: center;\\n}\\n.beom-app {\\n display: flex;\\n flex-direction: row;\\n height: calc(100vh - 88px);\\n}\\n.beom-app .beom-sidemenu {\\n width: 350px;\\n background-color: #eee;\\n overflow: auto;\\n padding: 20px 20px;\\n}\\n.beom-app .beom-content {\\n display: flex;\\n flex-direction: column;\\n justify-content: space-between;\\n padding: 40px;\\n padding-top: 20px;\\n width: calc(1250px - 350px);\\n}\\n.beom-app .beom-content .beom-header {\\n display: flex;\\n justify-items: center;\\n margin-top: 0;\\n justify-content: center;\\n}\\n.beom-app .beom-content .beom-info {\\n margin-top: 70px;\\n display: flex;\\n justify-content: center;\\n}\\nbutton.blue-button {\\n background-color: #1d8bcc;\\n padding: 10px;\\n border-radius: 5px;\\n text-decoration: none;\\n text-transform: uppercase;\\n color: #fff;\\n outline: none;\\n border: none;\\n}\\nbutton.blue-button:hover {\\n background-color: #39a4e3;\\n}\\n.beeom-form-label-base {\\n color: #1d8bcc;\\n font-size: 1.5em;\\n}\\n.beeom-form {\\n display: grid;\\n grid-template-columns: 1fr 300px;\\n grid-gap: 15px;\\n align-items: center;\\n}\\n.beeom-form label {\\n color: #1d8bcc;\\n font-size: 1.5em;\\n}\\n.beeom-form input,\\n.beeom-form select {\\n background-color: #eee;\\n border: none;\\n border-radius: 5px;\\n height: 40px;\\n padding: 0 15px;\\n font-size: 1.2em;\\n box-sizing: border-box;\\n color: #666;\\n}\\n.beeom-form input:focus,\\n.beeom-form select:focus {\\n outline: none;\\n}\\n.beeom-form .header {\\n color: #1d8bcc;\\n font-size: 1.5em;\\n}\\n.beeom-form .total {\\n color: #1d8bcc;\\n font-size: 1.5em;\\n color: #000;\\n text-align: right;\\n}\\n.beeom-slider-form {\\n width: 500px;\\n margin-bottom: 35px;\\n}\\n.beeom-slider-form .subletext-base {\\n font-size: 0.9em;\\n color: #ccc;\\n}\\n.beeom-slider-form .top-row {\\n display: flex;\\n flex-direction: row;\\n justify-content: space-between;\\n margin-bottom: 15px;\\n}\\n.beeom-slider-form .top-row .title {\\n color: #1d8bcc;\\n font-size: 1.5em;\\n}\\n.beeom-slider-form .top-row .total {\\n font-size: 1.5em;\\n text-align: right;\\n}\\n.beeom-slider-form .subtitle {\\n display: block;\\n font-style: italic;\\n margin-bottom: 15px;\\n font-size: 0.9em;\\n color: #ccc;\\n}\\n.beeom-slider-form .subtitle strong {\\n font-weight: 900;\\n}\\n.beeom-slider-form .slider-row {\\n display: flex;\\n flex-direction: row;\\n}\\n.beeom-slider-form .slider-row .slider {\\n width: 70%;\\n margin-right: 15px;\\n}\\n.beeom-slider-form .slider-row .slider .input-range__slider {\\n background-color: #1d8bcc;\\n border-color: #1d8bcc;\\n}\\n.beeom-slider-form .slider-row .slider .input-range__track .input-range__track--active {\\n background-color: #1d8bcc;\\n}\\n.beeom-slider-form .slider-row .percent {\\n font-size: 0.9em;\\n color: #ccc;\\n}\\n\", \"\"]);\n\n"],"sourceRoot":""}