{"version":3,"file":"js/editor.js","sources":["webpack://GUI/webpack/bootstrap","webpack://GUI/./src/components/tw-cloud-variable-badge/cloud-variable-badge.css","webpack://GUI/./src/components/tw-description/description.css","webpack://GUI/./src/components/tw-featured-projects/featured-projects.css","webpack://GUI/./src/components/tw-project-input/project-input.css","webpack://GUI/./src/components/tw-studioview/studioview.css","webpack://GUI/./src/playground/interface.css","webpack://GUI/./src/playground/service-worker.js","webpack://GUI/./node_modules/lodash/_Symbol.js","webpack://GUI/./node_modules/lodash/_arrayMap.js","webpack://GUI/./node_modules/lodash/_arrayPush.js","webpack://GUI/./node_modules/lodash/_baseFlatten.js","webpack://GUI/./node_modules/lodash/_baseGetTag.js","webpack://GUI/./node_modules/lodash/_baseIsArguments.js","webpack://GUI/./node_modules/lodash/_baseIsRegExp.js","webpack://GUI/./node_modules/lodash/_baseToString.js","webpack://GUI/./node_modules/lodash/_baseUnary.js","webpack://GUI/./node_modules/lodash/_freeGlobal.js","webpack://GUI/./node_modules/lodash/_getRawTag.js","webpack://GUI/./node_modules/lodash/_isFlattenable.js","webpack://GUI/./node_modules/lodash/_nodeUtil.js","webpack://GUI/./node_modules/lodash/_objectToString.js","webpack://GUI/./node_modules/lodash/_root.js","webpack://GUI/./node_modules/lodash/escapeRegExp.js","webpack://GUI/./node_modules/lodash/flatten.js","webpack://GUI/./node_modules/lodash/isArguments.js","webpack://GUI/./node_modules/lodash/isArray.js","webpack://GUI/./node_modules/lodash/isObjectLike.js","webpack://GUI/./node_modules/lodash/isRegExp.js","webpack://GUI/./node_modules/lodash/isString.js","webpack://GUI/./node_modules/lodash/isSymbol.js","webpack://GUI/./node_modules/lodash/toString.js","webpack://GUI/./src/lib/tw-theme-dark.css","webpack://GUI/./node_modules/react-string-replace/index.js","webpack://GUI/./src/addons/channels.js","webpack://GUI/./src/components/tw-cloud-variable-badge/cloud-server-button.jsx","webpack://GUI/./src/components/tw-cloud-variable-badge/cloud-variable-badge.css?070b","webpack://GUI/./src/components/tw-cloud-variable-badge/cloud-variable-badge.jsx","webpack://GUI/./src/components/tw-cloud-variable-badge/clouddata.svg","webpack://GUI/./src/components/tw-description/description.css?bbe0","webpack://GUI/./src/components/tw-description/description.jsx","webpack://GUI/./src/components/tw-featured-projects/featured-projects.css?6ddd","webpack://GUI/./src/components/tw-featured-projects/featured-projects.jsx","webpack://GUI/./src/components/tw-project-input/project-input.css?738a","webpack://GUI/./src/components/tw-project-input/project-input.jsx","webpack://GUI/./src/components/tw-studioview/studioview.css?4062","webpack://GUI/./src/components/tw-studioview/studioview.js","webpack://GUI/./src/components/tw-studioview/studioview.jsx","webpack://GUI/./src/containers/tw-cloud-variable-badge.jsx","webpack://GUI/./src/lib/tw-fix-history-api.js","webpack://GUI/./src/lib/tw-packager-integration-hoc.jsx","webpack://GUI/./src/lib/tw-theme-hoc.jsx","webpack://GUI/./src/playground/editor.jsx","webpack://GUI/./src/playground/interface.css?c492","webpack://GUI/./src/playground/load-service-worker.js","webpack://GUI/./src/playground/render-interface.jsx"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"editor\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"js/\" + ({\"addons\":\"addons\",\"iframe-extension-worker\":\"iframe-extension-worker\",\"library-backdrops\":\"library-backdrops\",\"library-costumes\":\"library-costumes\",\"library-sounds\":\"library-sounds\",\"library-sprites\":\"library-sprites\",\"sb\":\"sb\",\"addon-default-entry\":\"addon-default-entry\",\"addon-entry-2d-color-picker\":\"addon-entry-2d-color-picker\",\"addon-entry-better-img-uploads\":\"addon-entry-better-img-uploads\",\"addon-entry-block-count\":\"addon-entry-block-count\",\"addon-entry-block-palette-icons\":\"addon-entry-block-palette-icons\",\"addon-entry-blocks2image\":\"addon-entry-blocks2image\",\"addon-entry-cat-blocks\":\"addon-entry-cat-blocks\",\"addon-entry-clones\":\"addon-entry-clones\",\"addon-entry-columns\":\"addon-entry-columns\",\"addon-entry-custom-block-shape\":\"addon-entry-custom-block-shape\",\"addon-entry-custom-block-text\":\"addon-entry-custom-block-text\",\"addon-entry-custom-zoom\":\"addon-entry-custom-zoom\",\"addon-entry-data-category-tweaks-v2\":\"addon-entry-data-category-tweaks-v2\",\"addon-entry-debugger\":\"addon-entry-debugger\",\"addon-entry-default-costume-editor-color\":\"addon-entry-default-costume-editor-color\",\"addon-entry-disable-paste-offset\":\"addon-entry-disable-paste-offset\",\"addon-entry-disable-stage-drag-select\":\"addon-entry-disable-stage-drag-select\",\"addon-entry-editor-buttons-reverse-order\":\"addon-entry-editor-buttons-reverse-order\",\"addon-entry-editor-colored-context-menus\":\"addon-entry-editor-colored-context-menus\",\"addon-entry-editor-extra-keys\":\"addon-entry-editor-extra-keys\",\"addon-entry-editor-sounds\":\"addon-entry-editor-sounds\",\"addon-entry-editor-stage-left\":\"addon-entry-editor-stage-left\",\"addon-entry-editor-stepping\":\"addon-entry-editor-stepping\",\"addon-entry-editor-theme3\":\"addon-entry-editor-theme3\",\"addon-entry-fullscreen\":\"addon-entry-fullscreen\",\"addon-entry-gamepad\":\"addon-entry-gamepad\",\"addon-entry-hide-delete-button\":\"addon-entry-hide-delete-button\",\"addon-entry-hide-flyout\":\"addon-entry-hide-flyout\",\"addon-entry-hide-new-variables\":\"addon-entry-hide-new-variables\",\"addon-entry-hide-stage\":\"addon-entry-hide-stage\",\"addon-entry-initialise-sprite-position\":\"addon-entry-initialise-sprite-position\",\"addon-entry-load-extensions\":\"addon-entry-load-extensions\",\"addon-entry-mediarecorder\":\"addon-entry-mediarecorder\",\"addon-entry-mouse-pos\":\"addon-entry-mouse-pos\",\"addon-entry-no-script-bumping\":\"addon-entry-no-script-bumping\",\"addon-entry-number-pad\":\"addon-entry-number-pad\",\"addon-entry-paint-by-default\":\"addon-entry-paint-by-default\",\"addon-entry-paint-snap\":\"addon-entry-paint-snap\",\"addon-entry-remove-curved-stage-border\":\"addon-entry-remove-curved-stage-border\",\"addon-entry-remove-sprite-confirm\":\"addon-entry-remove-sprite-confirm\",\"addon-entry-script-snap\":\"addon-entry-script-snap\",\"addon-entry-search-sprites\":\"addon-entry-search-sprites\",\"addon-entry-sprite-properties\":\"addon-entry-sprite-properties\",\"addon-entry-swap-local-global\":\"addon-entry-swap-local-global\",\"addon-entry-transparent-orphans\":\"addon-entry-transparent-orphans\",\"addon-entry-tw-disable-cloud-variables\":\"addon-entry-tw-disable-cloud-variables\",\"addon-entry-tw-disable-compiler\":\"addon-entry-tw-disable-compiler\",\"addon-entry-tw-remove-backpack\":\"addon-entry-tw-remove-backpack\",\"addon-entry-tw-remove-feedback\":\"addon-entry-tw-remove-feedback\",\"addon-entry-tw-straighten-comments\":\"addon-entry-tw-straighten-comments\",\"addon-entry-variable-manager\":\"addon-entry-variable-manager\",\"addon-entry-vol-slider\":\"addon-entry-vol-slider\",\"addon-entry-zebra-striping\":\"addon-entry-zebra-striping\",\"addon-l10n-de\":\"addon-l10n-de\",\"addon-l10n-es\":\"addon-l10n-es\",\"addon-l10n-fr\":\"addon-l10n-fr\",\"addon-l10n-hu\":\"addon-l10n-hu\",\"addon-l10n-it\":\"addon-l10n-it\",\"addon-l10n-ja\":\"addon-l10n-ja\",\"addon-l10n-ko\":\"addon-l10n-ko\",\"addon-l10n-nl\":\"addon-l10n-nl\",\"addon-l10n-pl\":\"addon-l10n-pl\",\"addon-l10n-pt\":\"addon-l10n-pt\",\"addon-l10n-ro\":\"addon-l10n-ro\",\"addon-l10n-ru\":\"addon-l10n-ru\",\"addon-l10n-sl\":\"addon-l10n-sl\",\"addon-l10n-tr\":\"addon-l10n-tr\",\"addon-l10n-zh-tw\":\"addon-l10n-zh-tw\"}[chunkId]||chunkId) + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonpGUI\"] = window[\"webpackJsonpGUI\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([\"./src/playground/editor.jsx\",\"vendors~addon-settings~credits~editor~embed~fullscreen~player\",\"vendors~editor~embed~fullscreen~player\",\"addon-settings~addons~editor~fullscreen~player\",\"editor~embed~fullscreen~player\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","exports = module.exports = require(\"../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \"/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ .cloud-variable-badge_badge_2kZVK {\\n padding: 0.5rem;\\n margin: 5px 0 8px 0;\\n border: 1px solid #b9d6ff;\\n background-color: #dbebff;\\n display: flex;\\n flex-direction: column;\\n gap: 0.5rem;\\n border-radius: 0.5rem;\\n} [theme=\\\"dark\\\"] .cloud-variable-badge_badge_2kZVK {\\n border-color: #203652;\\n background-color: #16202c;\\n} .cloud-variable-badge_title_2xJoL {\\n display: flex;\\n align-items: center;\\n gap: 0.5rem;\\n font-weight: bold;\\n} [theme=\\\"dark\\\"] .cloud-variable-badge_cloud-icon_1JP1e {\\n filter: invert(100%);\\n} .cloud-variable-badge_servers_1fLAL {\\n display: flex;\\n gap: 0.5rem;\\n align-items: center;\\n} .cloud-variable-badge_server_3s9y9 {\\n border: 1px solid var(--ui-black-transparent, hsla(0, 0%, 0%, 0.15));\\n padding: 0.25rem 0.5rem;\\n margin: 0;\\n background: none;\\n border-radius: 1rem;\\n} .cloud-variable-badge_server_3s9y9.cloud-variable-badge_selected_3ZyWW {\\n background-color: hsla(0, 100%, 65%, 1);\\n color: hsla(0, 100%, 100%, 1);\\n}\\n\", \"\"]);\n\n// exports\nexports.locals = {\n\t\"badge\": \"cloud-variable-badge_badge_2kZVK\",\n\t\"title\": \"cloud-variable-badge_title_2xJoL\",\n\t\"cloud-icon\": \"cloud-variable-badge_cloud-icon_1JP1e\",\n\t\"cloudIcon\": \"cloud-variable-badge_cloud-icon_1JP1e\",\n\t\"servers\": \"cloud-variable-badge_servers_1fLAL\",\n\t\"server\": \"cloud-variable-badge_server_3s9y9\",\n\t\"selected\": \"cloud-variable-badge_selected_3ZyWW\"\n};","exports = module.exports = require(\"../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \".description_description_1iyDJ {\\n max-height: 250px;\\n overflow: auto;\\n white-space: pre-line;\\n overflow-wrap: break-word;\\n line-height: 1.5em;\\n padding: 0.5rem;\\n margin: 5px 0 8px 0;\\n border: 1px solid #b9d6ff;\\n background-color: #dbebff;\\n border-radius: 0.5rem;\\n}\\n\\n.description_description_1iyDJ a {\\n font-weight: bold;\\n text-decoration: none;\\n}\\n\\n[theme=\\\"dark\\\"] .description_description_1iyDJ {\\n border-color: #203652;\\n background-color: #16202c;\\n}\\n\\n.description_header_27V8b {\\n font-weight: bold;\\n font-size: 1em;\\n margin: 0;\\n padding: 0;\\n}\\n\\n.description_divider_3z5W7 {\\n margin-top: 8px;\\n}\\n\\n.description_project-link_2-Z1r {\\n margin-bottom: 2px;\\n}\\n\", \"\"]);\n\n// exports\nexports.locals = {\n\t\"description\": \"description_description_1iyDJ\",\n\t\"header\": \"description_header_27V8b\",\n\t\"divider\": \"description_divider_3z5W7\",\n\t\"project-link\": \"description_project-link_2-Z1r\",\n\t\"projectLink\": \"description_project-link_2-Z1r\"\n};","exports = module.exports = require(\"../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \".featured-projects_container_1--ew {\\n margin-bottom: 8px;\\n}\\n\\n.featured-projects_opener-container_1c9_H {\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n cursor: pointer;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n opacity: 0.8;\\n color: #222;\\n}\\n\\n.featured-projects_opener-container_1c9_H:hover {\\n opacity: 1;\\n}\\n\\n.featured-projects_opener-content_1kqev {\\n background-color: white;\\n padding: 4px;\\n border: 1px solid black;\\n box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.25);\\n}\\n\\n.featured-projects_projects_1piAv {\\n position: relative;\\n height: 155px;\\n}\\n\\n.featured-projects_projects_1piAv.featured-projects_transition_3TsdC {\\n transition: .2s height;\\n}\\n\\n.featured-projects_projects_1piAv.featured-projects_opened_eLMQu {\\n height: 310px;\\n}\\n\\n.featured-projects_footer_2fw_5 {\\n \\n}\\n\", \"\"]);\n\n// exports\nexports.locals = {\n\t\"container\": \"featured-projects_container_1--ew\",\n\t\"opener-container\": \"featured-projects_opener-container_1c9_H\",\n\t\"openerContainer\": \"featured-projects_opener-container_1c9_H\",\n\t\"opener-content\": \"featured-projects_opener-content_1kqev\",\n\t\"openerContent\": \"featured-projects_opener-content_1kqev\",\n\t\"projects\": \"featured-projects_projects_1piAv\",\n\t\"transition\": \"featured-projects_transition_3TsdC\",\n\t\"opened\": \"featured-projects_opened_eLMQu\",\n\t\"footer\": \"featured-projects_footer_2fw_5\"\n};","exports = module.exports = require(\"../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \"/* #E5F0FF */ /* #E9F1FC */ /* #D9E3F2 */ /* 90% transparent version of motion-primary */ /* #FFFFFF */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 25% transparent version of ui-white */ /* 15% transparent version of black */ /* #575E75 */ /* 35% transparent version of motion-primary */ /* 15% transparent version of motion-primary */ /* opt-in theme overrides */ /* #FF661A */ /* #E64D00 */ /* #CF63CF */ /* #BD42BD */ /* #FFAB19 */ /* #FF8C1A */ /* #0FBD8C */ /* #0FBD8C */ /* #FF8C1A */ /* #FFB366 */ /* #FF8C1A */ /* 35% transparent version of extensions-primary */ /* opaque version of extensions-transparent, on white bg */ /* lighter than motion-primary */ /*\\n Contains constants for the z-index values of elements that are part of the global stack context.\\n In other words, z-index values that are \\\"inside\\\" a component are not added here.\\n This prevents conflicts between identical z-index values in different components.\\n*/ /* Toolbox z-index: 40; set in scratch-blocks */ /* tooltips should go over add buttons if they overlap */ /* monitors go over add buttons */ /* \\\"ask\\\" block text input goes above monitors */ /* menu-bar should go over monitors, alerts and tutorials */ /* tw: show below menu bar normally */ /* Block drag z-index: 1000; default 50 is overriden in blocks.css */ /* so it is draggable into other panes */ /* in most interfaces, the context menu is always on top */ .project-input_input_1E6Af {\\n border: none;\\n width: 100%;\\n font-size: 23px;\\n line-height: 32px;\\n opacity: 0.5;\\n background-color: transparent;\\n color: inherit;\\n} .project-input_input_1E6Af:focus {\\n opacity: 1;\\n} .project-input_input_1E6Af:disabled {\\n opacity: 0.8;\\n} .project-input_tooltip_3_EoA {\\n opacity: 1 !important;\\n background-color: hsla(10, 85%, 65%, 1) !important;\\n border: 1px solid hsla(0, 0%, 0%, .1) !important;\\n box-shadow: 0 0 .5rem hsla(0, 0%, 0%, .25) !important;\\n font-family: \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif !important;\\n border: 1px solid hsla(0, 0%, 0%, .1) !important;\\n z-index: 491 !important;\\n} .project-input_tooltip_3_EoA:after {\\n border-top-color: hsla(10, 85%, 65%, 1) !important;\\n}\\n\", \"\"]);\n\n// exports\nexports.locals = {\n\t\"input\": \"project-input_input_1E6Af\",\n\t\"tooltip\": \"project-input_tooltip_3_EoA\"\n};","exports = module.exports = require(\"../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \"/*\\nImported from:\\nhttps://github.com/forkphorus/forkphorus/tree/master/studioview\\nWith changes to make it work properly in the scratch-gui environment.\\n*/\\n\\n/* we wrap it in a
*/\\n\\n.studioview_wrapper_1SFBd {\\n height: 100%;\\n}\\n\\n/* fix some styles that can be messed up by scratch-gui */\\n\\n.studioview_studioview-root_1OP-i * {\\n box-sizing: content-box !important;\\n}\\n\\n.studioview_studioview-root_1OP-i {\\n height: 100%;\\n}\\n\\n.studioview_studioview-list_2hIxk {\\n width: 100%;\\n height: 100%;\\n overflow-y: scroll;\\n overflow-anchor: none;\\n}\\n\\n.studioview_studioview-project_IDotv, .studioview_studioview-placeholder_KKHo9 {\\n display: inline-block;\\n width: 144px;\\n padding: 3px;\\n margin-bottom: 1px;\\n margin-right: 1px;\\n}\\n\\n.studioview_studioview-root_1OP-i .studioview_studioview-project_IDotv {\\n color: inherit;\\n position: relative;\\n text-decoration: none;\\n}\\n\\n.studioview_studioview-loaded_3UCil:hover::before, .studioview_studioview-loaded_3UCil:active::before {\\n content: '';\\n pointer-events: none;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n background-color: currentColor;\\n opacity: 0.1;\\n}\\n\\n.studioview_studioview-root_1OP-i .studioview_studioview-loaded_3UCil:active::before {\\n opacity: 0.2;\\n}\\n\\n.studioview_studioview-root_1OP-i .studioview_studioview-title_2ROWB,\\n.studioview_studioview-root_1OP-i .studioview_studioview-author_2P0Hj {\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n overflow: hidden;\\n color: inherit;\\n text-decoration: none;\\n}\\n\\n.studioview_studioview-title_2ROWB {\\n font-size: 0.8em;\\n font-weight: bold;\\n}\\n\\n.studioview_studioview-author_2P0Hj {\\n font-size: 0.75em;\\n}\\n\\n.studioview_studioview-error_3XWai {\\n width: 100%;\\n}\\n\\n.studioview_studioview-thumbnail_1HYJO, .studioview_studioview-placeholder-thumbnail_TUdop {\\n position: relative;\\n width: 144px;\\n height: 108px;\\n}\\n\\n.studioview_studioview-thumbnail_1HYJO::before {\\n content: '';\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n background-color: currentColor;\\n opacity: 0.1;\\n}\\n\\n.studioview_studioview-thumbnail_1HYJO img {\\n width: 100%;\\n height: 100%;\\n}\\n\\n.studioview_studioview-placeholder_KKHo9 .studioview_studioview-thumbnail_1HYJO,\\n.studioview_studioview-placeholder_KKHo9 .studioview_studioview-title_2ROWB,\\n.studioview_studioview-placeholder_KKHo9 .studioview_studioview-author_2P0Hj {\\n background-color: currentColor;\\n opacity: 0.1;\\n}\\n\\n.studioview_studioview-title_2ROWB {\\n height: 20px;\\n margin-top: 2px;\\n}\\n\\n.studioview_studioview-author_2P0Hj {\\n height: 18px;\\n}\\n\\n.studioview_studioview-placeholder_KKHo9 .studioview_studioview-title_2ROWB {\\n border-radius: 2px 2px 2px 0;\\n width: 100%;\\n}\\n\\n.studioview_studioview-placeholder_KKHo9 .studioview_studioview-author_2P0Hj {\\n border-radius: 0 0 2px 2px;\\n width: 50%;\\n}\\n\", \"\"]);\n\n// exports\nexports.locals = {\n\t\"wrapper\": \"studioview_wrapper_1SFBd\",\n\t\"studioview-root\": \"studioview_studioview-root_1OP-i\",\n\t\"studioviewRoot\": \"studioview_studioview-root_1OP-i\",\n\t\"studioview-list\": \"studioview_studioview-list_2hIxk\",\n\t\"studioviewList\": \"studioview_studioview-list_2hIxk\",\n\t\"studioview-project\": \"studioview_studioview-project_IDotv\",\n\t\"studioviewProject\": \"studioview_studioview-project_IDotv\",\n\t\"studioview-placeholder\": \"studioview_studioview-placeholder_KKHo9\",\n\t\"studioviewPlaceholder\": \"studioview_studioview-placeholder_KKHo9\",\n\t\"studioview-loaded\": \"studioview_studioview-loaded_3UCil\",\n\t\"studioviewLoaded\": \"studioview_studioview-loaded_3UCil\",\n\t\"studioview-title\": \"studioview_studioview-title_2ROWB\",\n\t\"studioviewTitle\": \"studioview_studioview-title_2ROWB\",\n\t\"studioview-author\": \"studioview_studioview-author_2P0Hj\",\n\t\"studioviewAuthor\": \"studioview_studioview-author_2P0Hj\",\n\t\"studioview-error\": \"studioview_studioview-error_3XWai\",\n\t\"studioviewError\": \"studioview_studioview-error_3XWai\",\n\t\"studioview-thumbnail\": \"studioview_studioview-thumbnail_1HYJO\",\n\t\"studioviewThumbnail\": \"studioview_studioview-thumbnail_1HYJO\",\n\t\"studioview-placeholder-thumbnail\": \"studioview_studioview-placeholder-thumbnail_TUdop\",\n\t\"studioviewPlaceholderThumbnail\": \"studioview_studioview-placeholder-thumbnail_TUdop\"\n};","exports = module.exports = require(\"../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \"/* Base styles used by Scratch https://github.com/LLK/scratch-www/blob/develop/src/main.scss */\\nh1,\\nh2,\\nh3,\\nh4,\\nh5,\\np {\\n margin: 0;\\n padding: 0;\\n border: 0;\\n}\\nh1,\\nh2,\\nh3,\\nh4,\\nh5 {\\n font-weight: bold;\\n line-height: 1.7em;\\n}\\nh1 {\\n font-weight: 2.5rem;\\n}\\nh2 {\\n font-weight: 2rem;\\n}\\nh3 {\\n font-size: 1.4rem;\\n}\\nh4 {\\n font-size: 1rem;\\n}\\na {\\n color: #25d;\\n cursor: pointer;\\n text-decoration: underline;\\n}\\n.interface_container_2nBns {\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n}\\n.interface_editor_3jGyG {\\n min-width: 1024px;\\n min-height: 640px;\\n height: 100%;\\n}\\n.interface_editor_3jGyG .interface_center_2d9_b {\\n height: 100%;\\n}\\n.interface_player-only_38SyA .interface_center_2d9_b {\\n margin: auto;\\n}\\n.interface_menu_3K-Q2 {\\n margin-bottom: 8px;\\n}\\n.interface_section_3pFkT {\\n margin: 8px 0 8px 0;\\n}\\n.interface_footer_3JeCN {\\n padding: 10px 0;\\n margin-top: 10px;\\n border-top: 2px solid #ddd;\\n}\\n.interface_footer_3JeCN a {\\n font-weight: bold;\\n text-decoration: none;\\n}\\n[theme=\\\"dark\\\"] .interface_footer_3JeCN {\\n border-color: #1a1a1a;\\n}\\n.interface_footer-content_1aIC- {\\n max-width: 600px;\\n margin: auto;\\n}\\n.interface_footer-text_IgwDU {\\n text-align: center;\\n margin: 5px 0 10px 0;\\n}\\n.interface_footer-columns_1SUSg {\\n display: flex;\\n justify-content: center;\\n justify-items: center;\\n flex-wrap: wrap;\\n}\\n.interface_footer-section_11lCO {\\n display: flex;\\n flex-direction: column;\\n width: 200px;\\n margin-bottom: 10px;\\n}\\n.interface_footer-section_11lCO > * {\\n margin-bottom: 10px;\\n}\\n[theme=\\\"dark\\\"] .interface_container_2nBns {\\n background-color: #111;\\n}\\n[theme=\\\"dark\\\"] .interface_player-only_38SyA {\\n color: #ddd;\\n}\\n[theme=\\\"dark\\\"] a {\\n color: #4af;\\n}\\n.interface_infobox_1B2Hp {\\n line-height: 1.5em;\\n padding: 0.5rem;\\n margin: 5px 0 8px 0;\\n border-radius: 0.5rem;\\n border: 1px solid #b9d6ff;\\n background-color: #dbebff;\\n}\\n[theme=\\\"dark\\\"] .interface_infobox_1B2Hp {\\n border-color: #203652;\\n background-color: #16202c;\\n}\\n.interface_infobox_1B2Hp p {\\n margin: 4px 0;\\n}\\n.interface_infobox_1B2Hp a {\\n font-weight: bold;\\n text-decoration: none;\\n}\\n.interface_unshared-update_i7deb {\\n border-color: #ffb9b9;\\n background-color: #ffdbdb;\\n}\\n[theme=\\\"dark\\\"] .interface_unshared-update_i7deb {\\n border-color: #6a2929;\\n background-color: #452222;\\n}\\n\", \"\"]);\n\n// exports\nexports.locals = {\n\t\"container\": \"interface_container_2nBns\",\n\t\"editor\": \"interface_editor_3jGyG\",\n\t\"center\": \"interface_center_2d9_b\",\n\t\"player-only\": \"interface_player-only_38SyA\",\n\t\"playerOnly\": \"interface_player-only_38SyA\",\n\t\"menu\": \"interface_menu_3K-Q2\",\n\t\"section\": \"interface_section_3pFkT\",\n\t\"footer\": \"interface_footer_3JeCN\",\n\t\"footer-content\": \"interface_footer-content_1aIC-\",\n\t\"footerContent\": \"interface_footer-content_1aIC-\",\n\t\"footer-text\": \"interface_footer-text_IgwDU\",\n\t\"footerText\": \"interface_footer-text_IgwDU\",\n\t\"footer-columns\": \"interface_footer-columns_1SUSg\",\n\t\"footerColumns\": \"interface_footer-columns_1SUSg\",\n\t\"footer-section\": \"interface_footer-section_11lCO\",\n\t\"footerSection\": \"interface_footer-section_11lCO\",\n\t\"infobox\": \"interface_infobox_1B2Hp\",\n\t\"unshared-update\": \"interface_unshared-update_i7deb\",\n\t\"unsharedUpdate\": \"interface_unshared-update_i7deb\"\n};","module.exports = __webpack_public_path__ + \"sw.js\";","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n","var arrayPush = require('./_arrayPush'),\n isFlattenable = require('./_isFlattenable');\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n}\n\nmodule.exports = baseFlatten;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar regexpTag = '[object RegExp]';\n\n/**\n * The base implementation of `_.isRegExp` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n */\nfunction baseIsRegExp(value) {\n return isObjectLike(value) && baseGetTag(value) == regexpTag;\n}\n\nmodule.exports = baseIsRegExp;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","var Symbol = require('./_Symbol'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray');\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var toString = require('./toString');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n reHasRegExpChar = RegExp(reRegExpChar.source);\n\n/**\n * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escapeRegExp('[lodash](https://lodash.com/)');\n * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n */\nfunction escapeRegExp(string) {\n string = toString(string);\n return (string && reHasRegExpChar.test(string))\n ? string.replace(reRegExpChar, '\\\\$&')\n : string;\n}\n\nmodule.exports = escapeRegExp;\n","var baseFlatten = require('./_baseFlatten');\n\n/**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\nfunction flatten(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, 1) : [];\n}\n\nmodule.exports = flatten;\n","var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseIsRegExp = require('./_baseIsRegExp'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsRegExp = nodeUtil && nodeUtil.isRegExp;\n\n/**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */\nvar isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\nmodule.exports = isRegExp;\n","var baseGetTag = require('./_baseGetTag'),\n isArray = require('./isArray'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nmodule.exports = isString;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","module.exports = \"/* GUI */\\n:root {\\n background: #111;\\n color: #eee;\\n color-scheme: dark;\\n /* see colors.csss */\\n --ui-primary: rgb(17, 17, 17);\\n --ui-secondary: rgb(30, 30, 30);\\n --ui-tertiary: rgb(46, 46, 46);\\n --ui-modal-overlay: #333a;\\n --ui-black-transparent: rgba(255, 255, 255, 0.15);\\n --text-primary: #eee;\\n /* scratch-paint */\\n --paint-ui-pane-border: var(--ui-black-transparent);\\n --paint-text-primary: #eee;\\n --paint-form-border: var(--ui-black-transparent);\\n}\\n\\n/* Blockly */\\n.blocklySvg {\\n background-color: var(--ui-secondary) !important;\\n color-scheme: light;\\n}\\n[id^=\\\"blocklyGridPattern\\\"] > line {\\n stroke: #484848;\\n}\\n.blocklyFlyoutBackground {\\n fill: #111;\\n}\\n.blocklyFlyoutLabelText {\\n fill: #ccc;\\n}\\n.blocklyFlyoutButton .blocklyText {\\n fill: #ccc;\\n}\\n.blocklyFlyoutButton:hover {\\n fill: #111;\\n}\\n/* blocklyFlyoutCheckboxPath stroke and blocklyFlyoutCheckbox fill must match */\\n.blocklyFlyoutCheckboxPath {\\n stroke: #111;\\n}\\n.blocklyFlyoutCheckbox {\\n fill: #111;\\n}\\n.checked > .blocklyFlyoutCheckbox {\\n stroke: #a1c6fa;\\n}\\n.checked > .blocklyFlyoutCheckboxPath {\\n stroke: white;\\n}\\n.scratchCategoryMenu {\\n color: #ccc;\\n}\\n.blocklyToolboxDiv,\\n.scratchCategoryMenu {\\n background: #111 !important;\\n}\\n.blocklyScrollbarHandle {\\n fill: #666;\\n}\\n.blocklyZoom {\\n filter: invert(100%);\\n}\\n.scratchCategoryMenuItem.categorySelected {\\n background: var(--ui-secondary);\\n}\\n.valueReportBox {\\n color: black;\\n}\\n.blocklyWidgetDiv {\\n color-scheme: light;\\n}\\n.blocklyWidgetDiv .goog-menu {\\n background: var(--ui-primary);\\n border-color: var(--ui-black-transparent);\\n}\\n.blocklyWidgetDiv .goog-menuitem {\\n color: var(--text-primary);\\n}\\n.blocklyWidgetDiv .goog-menuitem-disabled .goog-menuitem-content {\\n color: #666 !important;\\n}\\n.sa-blockly-menu-item-border {\\n border-top-color: var(--ui-black-transparent) !important;\\n}\\n.blocklyWidgetDiv .goog-menuitem.goog-menuitem-highlight {\\n background-color: var(--ui-tertiary);\\n border-color: transparent; /* remove border */\\n}\\n.scratchCommentText {\\n color: black;\\n}\\n.blocklyInsertionMarker > .blocklyPath {\\n fill: #ccc;\\n}\\n\\n/* Other / Multipurpose */\\n.Popover {\\n /* weird Chrome bug displays white bar above popovers with color-scheme: dark */\\n color-scheme: light;\\n}\\n.Popover-body {\\n background: var(--ui-secondary);\\n border-color: var(--ui-black-transparent);\\n color: var(--text-primary);\\n}\\n.Popover-tipShape {\\n fill: var(--ui-secondary);\\n stroke: var(--ui-black-transparent);\\n}\\n\"","/* eslint-disable vars-on-top, no-var, prefer-template */\nvar isRegExp = require('lodash/isRegExp');\nvar escapeRegExp = require('lodash/escapeRegExp');\nvar isString = require('lodash/isString');\nvar flatten = require('lodash/flatten');\n\n/**\n * Given a string, replace every substring that is matched by the `match` regex\n * with the result of calling `fn` on matched substring. The result will be an\n * array with all odd indexed elements containing the replacements. The primary\n * use case is similar to using String.prototype.replace except for React.\n *\n * React will happily render an array as children of a react element, which\n * makes this approach very useful for tasks like surrounding certain text\n * within a string with react elements.\n *\n * Example:\n * matchReplace(\n * 'Emphasize all phone numbers like 884-555-4443.',\n * /([\\d|-]+)/g,\n * (number, i) => {number}\n * );\n * // => ['Emphasize all phone numbers like ', 884-555-4443, '.'\n *\n * @param {string} str\n * @param {regexp|str} match Must contain a matching group\n * @param {function} fn\n * @return {array}\n */\nfunction replaceString(str, match, fn) {\n var curCharStart = 0;\n var curCharLen = 0;\n\n if (str === '') {\n return str;\n } else if (!str || !isString(str)) {\n throw new TypeError('First argument to react-string-replace#replaceString must be a string');\n }\n\n var re = match;\n\n if (!isRegExp(re)) {\n re = new RegExp('(' + escapeRegExp(re) + ')', 'gi');\n }\n\n var result = str.split(re);\n\n // Apply fn to all odd elements\n for (var i = 1, length = result.length; i < length; i += 2) {\n curCharLen = result[i].length;\n curCharStart += result[i - 1].length;\n result[i] = fn(result[i], i, curCharStart);\n curCharStart += curCharLen;\n }\n\n return result;\n}\n\nmodule.exports = function reactStringReplace(source, match, fn) {\n if (!Array.isArray(source)) source = [source];\n\n return flatten(source.map(function(x) {\n return isString(x) ? replaceString(x, match, fn) : x;\n }));\n};\n","let changeChannel;\nlet reloadChannel;\n\nif (typeof BroadcastChannel !== 'undefined') {\n changeChannel = new BroadcastChannel('addons-change');\n reloadChannel = new BroadcastChannel('addons-reload');\n}\n\nexport default {\n changeChannel,\n reloadChannel\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport styles from './cloud-variable-badge.css';\nimport bindAll from 'lodash.bindall';\nimport classNames from 'classnames';\n\nclass CloudServerButton extends React.Component {\n constructor (props) {\n super(props);\n bindAll(this, [\n 'handleClick'\n ]);\n }\n\n handleClick () {\n this.props.onClick(this.props.cloudHost);\n }\n\n render () {\n return (\n \n {this.props.name}\n \n );\n }\n}\n\nCloudServerButton.propTypes = {\n cloudHost: PropTypes.string,\n name: PropTypes.string,\n selected: PropTypes.bool,\n onClick: PropTypes.func\n};\n\nexport default CloudServerButton;\n","\nvar content = require(\"!!../../../node_modules/css-loader/index.js??ref--5-1!../../../node_modules/postcss-loader/src/index.js??postcss!./cloud-variable-badge.css\");\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/index.js??ref--5-1!../../../node_modules/postcss-loader/src/index.js??postcss!./cloud-variable-badge.css\", function() {\n\t\tvar newContent = require(\"!!../../../node_modules/css-loader/index.js??ref--5-1!../../../node_modules/postcss-loader/src/index.js??postcss!./cloud-variable-badge.css\");\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}","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {FormattedMessage} from 'react-intl';\nimport cloudIcon from './clouddata.svg';\nimport CloudServerButton from './cloud-server-button.jsx';\nimport styles from './cloud-variable-badge.css';\nimport {APP_NAME} from '../../lib/brand';\n\nconst hosts = [\n {\n // Provided by GarboMuffin\n name: 'US East',\n cloudHost: 'wss://clouddata.turbowarp.org'\n },\n {\n // Provided by Apricot\n name: 'EU',\n cloudHost: 'wss://clouddata-eu.turbowarp.org'\n }\n];\n\nconst CloudVariableBadge = props => (\n
\n
\n \n \n
\n\n \n \n \n )\n }}\n />\n\n {hosts.some(i => i.cloudHost === props.cloudHost) ? (\n
\n \n {hosts.map(i => (\n \n ))}\n
\n ) : (\n
\n \n
\n )}\n\n \n \n \n
\n);\n\nCloudVariableBadge.propTypes = {\n cloudHost: PropTypes.string,\n onSetCloudHost: PropTypes.func,\n onOpenChangeUsername: PropTypes.func\n};\n\nexport default CloudVariableBadge;\n","module.exports = __webpack_public_path__ + \"static/assets/33b737193edfe1730f38112ad35a84b4.svg\";","\nvar content = require(\"!!../../../node_modules/css-loader/index.js??ref--5-1!../../../node_modules/postcss-loader/src/index.js??postcss!./description.css\");\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/index.js??ref--5-1!../../../node_modules/postcss-loader/src/index.js??postcss!./description.css\", function() {\n\t\tvar newContent = require(\"!!../../../node_modules/css-loader/index.js??ref--5-1!../../../node_modules/postcss-loader/src/index.js??postcss!./description.css\");\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}","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {FormattedMessage} from 'react-intl';\n\nimport styles from './description.css';\nimport reactStringReplace from 'react-string-replace';\n\nconst decorate = text => {\n // https://github.com/LLK/scratch-www/blob/25232a06bcceeaddec8fcb24fb63a44d870cf1cf/src/lib/decorate-text.jsx\n\n // Make @mentions clickable\n text = reactStringReplace(text, /@([\\w-]+)/, (match, i) => (\n {`@${match}`}\n ));\n\n // Make links clickable\n const linkRegex = /(https?:\\/\\/[\\w\\d_\\-.]{1,256}(?:\\/(?:\\S*[\\w:/#[\\]@$&'()*+=])?)?(?![^?!,:;\\w\\s]\\S))/g;\n text = reactStringReplace(text, linkRegex, (match, i) => (\n {match}\n ));\n\n // Make hashtags clickable\n text = reactStringReplace(text, /#([\\w-]+)/g, (match, i) => (\n {`#${match}`}\n ));\n\n return text;\n};\n\nconst Description = ({\n instructions,\n credits,\n projectId\n}) => instructions !== 'unshared' && credits !== 'unshared' && (\n
\n
\n \n \n \n
\n {instructions ? (\n
\n

\n \n

\n {decorate(instructions)}\n
\n ) : null}\n {instructions && credits ? (\n
\n ) : null}\n {credits && (\n
\n

\n \n

\n {decorate(credits)}\n
\n )}\n
\n);\n\nDescription.propTypes = {\n instructions: PropTypes.string,\n credits: PropTypes.string,\n projectId: PropTypes.string\n};\n\nexport default Description;\n","\nvar content = require(\"!!../../../node_modules/css-loader/index.js??ref--5-1!../../../node_modules/postcss-loader/src/index.js??postcss!./featured-projects.css\");\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/index.js??ref--5-1!../../../node_modules/postcss-loader/src/index.js??postcss!./featured-projects.css\", function() {\n\t\tvar newContent = require(\"!!../../../node_modules/css-loader/index.js??ref--5-1!../../../node_modules/postcss-loader/src/index.js??postcss!./featured-projects.css\");\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}","import bindAll from 'lodash.bindall';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {connect} from 'react-redux';\nimport StudioView from '../tw-studioview/studioview.jsx';\nimport styles from './featured-projects.css';\nimport {setProjectId} from '../../lib/tw-navigation-utils.js';\nimport classNames from 'classnames';\n\nclass FeaturedProjects extends React.Component {\n constructor (props) {\n super(props);\n bindAll(this, [\n 'handleSelect',\n 'handleOpenProjects'\n ]);\n this.state = {\n opened: false,\n transition: true\n };\n }\n componentDidUpdate (prevProps) {\n if (this.props.projectId === '0' && prevProps.projectId === null) {\n // eslint-disable-next-line react/no-did-update-set-state\n this.setState({\n opened: true,\n transition: false\n });\n }\n }\n handleSelect (id) {\n this.props.setProjectId(id);\n }\n handleOpenProjects () {\n this.setState({\n opened: true\n });\n }\n render () {\n const opened = this.state.opened;\n return (\n
\n \n \n {opened ? null : (\n \n
\n \n
\n
\n )}\n
\n
\n \n \n \n
\n
\n );\n }\n}\n\nFeaturedProjects.propTypes = {\n setProjectId: PropTypes.func,\n projectId: PropTypes.string,\n studio: PropTypes.string\n};\n\nconst mapStateToProps = state => ({\n projectId: state.scratchGui.projectState.projectId\n});\n\nconst mapDispatchToProps = dispatch => ({\n setProjectId: projectId => setProjectId(dispatch, projectId)\n});\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(FeaturedProjects);\n","\nvar content = require(\"!!../../../node_modules/css-loader/index.js??ref--5-1!../../../node_modules/postcss-loader/src/index.js??postcss!./project-input.css\");\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/index.js??ref--5-1!../../../node_modules/postcss-loader/src/index.js??postcss!./project-input.css\", function() {\n\t\tvar newContent = require(\"!!../../../node_modules/css-loader/index.js??ref--5-1!../../../node_modules/postcss-loader/src/index.js??postcss!./project-input.css\");\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}","import PropTypes from 'prop-types';\nimport React from 'react';\nimport {connect} from 'react-redux';\nimport bindAll from 'lodash.bindall';\nimport ReactTooltip from 'react-tooltip';\nimport {defineMessages, injectIntl, intlShape} from 'react-intl';\nimport {defaultProjectId} from '../../reducers/project-state';\nimport styles from './project-input.css';\nimport {setProjectId} from '../../lib/tw-navigation-utils';\n\nconst PROJECT_BASE = 'https://scratch.mit.edu/projects/';\n\nconst messages = defineMessages({\n tooltip: {\n defaultMessage: 'Copy and paste a Scratch project link here!',\n description: 'Project ID input tooltip',\n id: 'tw.input.tooltip'\n }\n});\n\nclass ProjectInput extends React.Component {\n constructor (props) {\n super(props);\n bindAll(this, [\n 'handleKeyDown',\n 'handleChange',\n 'handleBlur',\n 'handleFocus',\n 'inputRef',\n 'tooltipRef'\n ]);\n this.state = {\n projectId: this.props.projectId\n };\n }\n componentDidUpdate (prevProps) {\n if (this.props.projectId !== prevProps.projectId) {\n if (this.props.projectId === defaultProjectId) {\n this.input.focus();\n this.input.selectionStart = this.input.value.length;\n } else {\n this.input.blur();\n }\n // eslint-disable-next-line react/no-did-update-set-state\n this.setState({\n projectId: this.props.projectId\n });\n }\n }\n extractProjectId (text) {\n const numberMatch = text.match(/\\d+/);\n return numberMatch ? numberMatch[0] : null;\n }\n readProjectId (e) {\n const id = this.extractProjectId(e.target.value);\n return id || defaultProjectId;\n }\n handleKeyDown (e) {\n if (e.key === 'Enter' && this.state.projectId) {\n this.input.blur();\n }\n }\n handleChange (e) {\n this.setState({\n projectId: this.readProjectId(e) || defaultProjectId\n });\n }\n handleBlur () {\n if (this.state.projectId && this.state.projectId !== this.props.projectId) {\n this.props.setProjectId(this.state.projectId);\n }\n ReactTooltip.hide(this.tooltip);\n }\n handleFocus (e) {\n if (this.extractProjectId(e.target.value)) {\n e.target.select();\n }\n ReactTooltip.show(this.tooltip);\n }\n inputRef (el) {\n this.input = el;\n }\n tooltipRef (el) {\n this.tooltip = el;\n }\n render () {\n const projectId = this.state.projectId === defaultProjectId ? '' : this.state.projectId || '';\n return (\n \n \n \n \n );\n }\n}\n\nProjectInput.propTypes = {\n intl: intlShape,\n projectId: PropTypes.string,\n setProjectId: PropTypes.func\n};\n\nconst mapStateToProps = state => ({\n projectId: state.scratchGui.projectState.projectId\n});\n\nconst mapDispatchToProps = dispatch => ({\n setProjectId: projectId => setProjectId(dispatch, projectId)\n});\n\nexport default injectIntl(connect(\n mapStateToProps,\n mapDispatchToProps\n)(ProjectInput));\n","\nvar content = require(\"!!../../../node_modules/css-loader/index.js??ref--5-1!../../../node_modules/postcss-loader/src/index.js??postcss!./studioview.css\");\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/index.js??ref--5-1!../../../node_modules/postcss-loader/src/index.js??postcss!./studioview.css\", function() {\n\t\tvar newContent = require(\"!!../../../node_modules/css-loader/index.js??ref--5-1!../../../node_modules/postcss-loader/src/index.js??postcss!./studioview.css\");\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}","/* eslint-disable */\n// Imported from:\n// https://github.com/forkphorus/forkphorus/tree/master/studioview\n// With changes to make it work properly in the scratch-gui environment.\n// todo: we have to see if we are leaking memory when this is mounted and unmounted, esp. because of event listeners\n// todo: use react-intl for translations\n\nimport styles from './studioview.css';\nimport classNames from 'classnames';\n\n/**\n * @class\n */\nvar StudioView = function (studioId) {\n this.studioId = studioId;\n this.offset = 0;\n this.ended = false;\n this.loadingPage = false;\n this.unusedPlaceholders = [];\n\n this.root = document.createElement('div');\n this.root.className = styles.studioviewRoot;\n this.projectList = document.createElement('div');\n this.projectList.className = styles.studioviewList;\n this.root.appendChild(this.projectList);\n\n if ('IntersectionObserver' in window) {\n this.intersectionObserver = new IntersectionObserver(this.handleIntersection.bind(this), {\n root: this.projectList\n });\n this.loadNextPageObserver = new IntersectionObserver(this.handleLoadNextPageIntersection.bind(this), {\n root: this.projectList\n });\n } else {\n this.intersectionObserver = null;\n this.loadNextPageObserver = null;\n }\n\n // will be filled in by studioview.jsx\n this.messages = {\n AUTHOR_ATTRIBUTION: '',\n PROJECT_HOVER_TEXT: '',\n LOAD_ERROR: ''\n };\n};\n\n/**\n * Add a project to the view.\n * An unused placeholder element may be used, or it may be created.\n */\nStudioView.prototype.addProject = function (details) {\n var el;\n if (this.unusedPlaceholders.length) {\n el = this.unusedPlaceholders.shift();\n } else {\n el = this.createPlaceholder();\n this.projectList.appendChild(el);\n }\n this.placeholderToProject(el, details.id, details.title, details.author);\n};\n\n/**\n * Create an element that will load only when it becomes visible.\n */\nStudioView.prototype.createLazyImage = function (src) {\n var el = document.createElement('img');\n if (this.intersectionObserver) {\n this.intersectionObserver.observe(el);\n el.dataset.src = src;\n } else {\n // then we just won't lazy load it\n el.src = src;\n }\n return el;\n};\n\n/**\n * Create a placeholder or placeholder element.\n */\nStudioView.prototype.createPlaceholder = function () {\n var el = document.createElement('a');\n el.className = classNames(styles.studioviewProject, styles.studioviewPlaceholder);\n\n var thumbnail = document.createElement('div');\n thumbnail.className = styles.studioviewThumbnail;\n\n var title = document.createElement('div');\n title.className = styles.studioviewTitle;\n\n var author = document.createElement('div');\n author.className = styles.studioviewAuthor;\n\n el.thumbnailEl = thumbnail;\n el.titleEl = title;\n el.authorEl = author;\n\n el.appendChild(thumbnail);\n el.appendChild(title);\n el.appendChild(author);\n\n return el;\n};\n\n/**\n * Convert a placeholder element made by createPlaceholder to a project element.\n */\nStudioView.prototype.placeholderToProject = function (el, id, title, author) {\n el.className = classNames(styles.studioviewProject, styles.studioviewLoaded);\n el.dataset.id = id;\n el.dataset.title = title;\n el.dataset.author = author;\n el.title = this.messages.PROJECT_HOVER_TEXT.replace('$author', author).replace('$title', title);\n el.href = StudioView.PROJECT_PAGE.replace('$id', id);\n\n var thumbnailSrc = StudioView.THUMBNAIL_SRC.replace('$id', id);\n var thumbnailImg = this.createLazyImage(thumbnailSrc);\n el.thumbnailEl.appendChild(thumbnailImg);\n\n el.titleEl.innerText = title;\n el.authorEl.innerText = this.messages.AUTHOR_ATTRIBUTION.replace('$author', author);\n\n el.addEventListener('click', this.handleClick.bind(this), true);\n el.addEventListener('keydown', this.handleKeyDown.bind(this), true);\n\n return el;\n};\n\n/**\n * Adds an error message to the list.\n */\nStudioView.prototype.addErrorElement = function () {\n var el = document.createElement('div');\n el.innerText = this.messages.LOAD_ERROR;\n el.className = styles.studioviewError;\n this.projectList.appendChild(el);\n};\n\nStudioView.prototype.handleLoadNextPageIntersection = function (e) {\n for (var i = 0; i < e.length; i++) {\n var intersection = e[i];\n if (intersection.isIntersecting && this.canLoadNext()) {\n this.loadNextPage();\n }\n }\n};\n\n// Click a project element or a child of a project element\nStudioView.prototype.clickProject = function (el) {\n while (!el.classList.contains(styles.studioviewProject)) {\n el = el.parentNode;\n }\n var id = el.dataset.id;\n this.onselect(id, el);\n}\n\n// Called when click is fired on a project element\nStudioView.prototype.handleClick = function (e) {\n e.preventDefault();\n this.clickProject(e.target);\n};\n\n// Called when keydown is fired on a project element\nStudioView.prototype.handleKeyDown = function (e) {\n if (e.keyCode === 13) {\n // treat enter (13) as click\n e.preventDefault();\n this.clickProject(e.target);\n }\n};\n\n// Called by the IntersectionObserver when it sees an intersection\nStudioView.prototype.handleIntersection = function (entries, observer) {\n entries.forEach(function (entry) {\n if (entry.isIntersecting) {\n var target = entry.target;\n target.src = target.dataset.src;\n target.dataset.src = '';\n target.className = '';\n observer.unobserve(target);\n }\n });\n};\n\n/**\n * Determines whether it is safe to attempt to load the next page.\n */\nStudioView.prototype.canLoadNext = function () {\n return !this.loadingPage && !this.ended;\n};\n\n/**\n * Remove all unused placeholder elements.\n */\nStudioView.prototype.cleanupPlaceholders = function () {\n while (this.unusedPlaceholders.length) {\n var el = this.unusedPlaceholders.pop();\n this.projectList.removeChild(el);\n }\n};\n\n/**\n * Add placeholder placeholder elements.\n */\nStudioView.prototype.addPlaceholders = function () {\n for (var i = 0; i < StudioView.PLACEHOLDER_COUNT; i++) {\n var el = this.createPlaceholder();\n this.unusedPlaceholders.push(el);\n this.projectList.appendChild(el);\n }\n};\n\n/**\n * Make changes to the order of projects.\n * Default shuffler does nothing.\n */\nStudioView.prototype.shuffler = function (projects) {\n return projects;\n};\n\n/**\n * Begins loading the next page.\n */\nStudioView.prototype.loadNextPage = function () {\n if (this.loadingPage) {\n throw new Error('Already loading the next page');\n }\n if (this.ended) {\n throw new Error('There are no more pages to load');\n }\n\n if (this.unusedPlaceholders.length === 0) {\n this.addPlaceholders();\n }\n if (this.loadNextPageObserver) {\n this.loadNextPageObserver.disconnect();\n }\n this.root.setAttribute('loading', '');\n this.loadingPage = true;\n\n var xhr = new XMLHttpRequest();\n xhr.responseType = 'json';\n xhr.onload = function () {\n var rawProjects = xhr.response;\n if (!Array.isArray(rawProjects)) {\n xhr.onerror();\n return;\n }\n var projects = [];\n for (var i = 0; i < rawProjects.length; i++) {\n var p = rawProjects[i];\n projects.push({\n id: p.id,\n title: p.title,\n author: p.username,\n });\n }\n projects = this.shuffler(projects);\n for (var i = 0; i < projects.length; i++) {\n this.addProject(projects[i]);\n }\n this.cleanupPlaceholders();\n\n if (rawProjects.length === 40) {\n if (this.loadNextPageObserver) {\n this.loadNextPageObserver.observe(this.projectList.lastChild);\n }\n } else {\n this.ended = true;\n this.onend();\n }\n\n this.offset += projects.length;\n this.loadingPage = false;\n this.root.removeAttribute('loading');\n\n this.onpageload();\n }.bind(this);\n\n xhr.onerror = function () {\n this.root.setAttribute('error', '');\n this.cleanupPlaceholders();\n this.addErrorElement();\n this.ended = true;\n }.bind(this);\n\n var url = StudioView.STUDIO_API\n .replace('$id', this.studioId)\n .replace('$offset', '' + this.offset);\n xhr.open('GET', url);\n xhr.send();\n};\n\nStudioView.prototype.getURL = function () {\n return StudioView.STUDIO_PAGE.replace('$id', this.studioId);\n};\n\nStudioView.prototype.onselect = function (id, el) { };\nStudioView.prototype.onpageload = function () { };\nStudioView.prototype.onend = function () { };\n\nStudioView.STUDIO_API = 'https://trampoline.turbowarp.org/api/studios/$id/projects?offset=$offset';\n\n// The URL to download thumbnails from.\n// $id is replaced with the project's ID.\nStudioView.THUMBNAIL_SRC = 'https://trampoline.turbowarp.org/thumbnails/$id?width=144&height=108';\n\n// The URL for project pages.\n// $id is replaced with the project ID.\nStudioView.PROJECT_PAGE = 'https://turbowarp.org/$id';\n\n// The URL for studio pages.\n// $id is replaced with the studio ID.\nStudioView.STUDIO_PAGE = 'https://scratch.mit.edu/studios/$id/';\n\n// The amount of \"placeholders\" to insert before the next page loads.\nStudioView.PLACEHOLDER_COUNT = 9;\n\nexport default StudioView;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport bindAll from 'lodash.bindall';\nimport classNames from 'classnames';\nimport {defineMessages, injectIntl, intlShape} from 'react-intl';\n\nimport StudioView from './studioview';\nimport styles from './studioview.css';\n\nconst messages = defineMessages({\n authorAttribution: {\n defaultMessage: 'by {author}',\n description: 'Displayed in StudioView under project title to credit creator',\n id: 'tw.studioview.authorAttribution'\n },\n hoverText: {\n defaultMessage: '{title} by {author}',\n description: 'Displayed in StudioView when hovering on a project',\n id: 'tw.studioview.hoverText'\n },\n error: {\n defaultMessage: 'There was an error loading the next page of projects.',\n description: 'Displayed in StudioView when an error occurs',\n id: 'tw.studioview.error'\n }\n});\n\nclass StudioViewComponent extends React.Component {\n constructor (props) {\n super(props);\n bindAll(this, [\n 'handleSelect',\n 'ref'\n ]);\n }\n componentDidMount () {\n this.studioView = new StudioView(this.props.id);\n this.studioView.messages.AUTHOR_ATTRIBUTION = this.props.intl.formatMessage(messages.authorAttribution, {\n // studioview uses $-based variables\n author: '$author'\n });\n this.studioView.messages.PROJECT_HOVER_TEXT = this.props.intl.formatMessage(messages.hoverText, {\n // studioview uses $-based variables\n author: '$author',\n title: '$title'\n });\n this.studioView.messages.LOAD_ERROR = this.props.intl.formatMessage(messages.error);\n if (this.props.placeholder) {\n this.studioView.addPlaceholders();\n } else {\n this.studioView.loadNextPage();\n }\n this.studioView.onselect = this.handleSelect;\n this.el.appendChild(this.studioView.root);\n }\n componentDidUpdate (prevProps) {\n if (prevProps.placeholder && !this.props.placeholder) {\n this.studioView.loadNextPage();\n }\n }\n handleSelect (id) {\n this.props.onSelect(id);\n }\n ref (el) {\n this.el = el;\n }\n render () {\n return (\n \n );\n }\n}\n\nStudioViewComponent.propTypes = {\n id: PropTypes.string.isRequired,\n intl: intlShape.isRequired,\n placeholder: PropTypes.bool,\n onSelect: PropTypes.func.isRequired\n};\n\nexport default injectIntl(StudioViewComponent);\n","import React from 'react';\nimport {connect} from 'react-redux';\nimport PropTypes from 'prop-types';\nimport {setCloudHost} from '../reducers/tw';\nimport CloudVariableBadge from '../components/tw-cloud-variable-badge/cloud-variable-badge.jsx';\nimport bindAll from 'lodash.bindall';\nimport {openUsernameModal} from '../reducers/modals';\n\nclass TWCloudVariableBadge extends React.Component {\n constructor (props) {\n super(props);\n bindAll(this, [\n 'handleChangeCloudHost'\n ]);\n }\n\n handleChangeCloudHost (cloudHost) {\n this.props.onSetCloudHost(cloudHost);\n }\n\n render () {\n return (\n \n );\n }\n}\n\nTWCloudVariableBadge.propTypes = {\n cloudHost: PropTypes.string,\n onSetCloudHost: PropTypes.func,\n onOpenChangeUsername: PropTypes.func\n};\n\nconst mapStateToProps = state => ({\n cloudHost: state.scratchGui.tw.cloudHost\n});\n\nconst mapDispatchToProps = dispatch => ({\n onSetCloudHost: cloudHost => dispatch(setCloudHost(cloudHost)),\n onOpenChangeUsername: () => dispatch(openUsernameModal())\n});\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(TWCloudVariableBadge);\n","import log from './log';\n\nconst originalReplaceState = history.replaceState;\nhistory.replaceState = function (...args) {\n try {\n return originalReplaceState.call(this, ...args);\n } catch (e) {\n log.error(e);\n }\n};\n\nconst originalPushState = history.pushState;\nhistory.pushState = function (...args) {\n try {\n return originalPushState.call(this, ...args);\n } catch (e) {\n log.error(e);\n }\n};\n","import React from 'react';\nimport {connect} from 'react-redux';\nimport PropTypes from 'prop-types';\nimport log from './log';\nimport {getIsShowingProject} from '../reducers/project-state';\n\nconst PACKAGER_URL = 'https://packager.turbowarp.org';\nconst PACKAGER_ORIGIN = PACKAGER_URL;\n\nconst PackagerIntegrationHOC = function (WrappedComponent) {\n class PackagerIntegrationComponent extends React.Component {\n constructor (props) {\n super(props);\n this.handleClickPackager = this.handleClickPackager.bind(this);\n this.handleMessage = this.handleMessage.bind(this);\n }\n componentDidMount () {\n window.addEventListener('message', this.handleMessage);\n }\n componentWillUnmount () {\n window.removeEventListener('message', this.handleMessage);\n }\n handleClickPackager () {\n if (this.props.canOpenPackager) {\n window.open(`${PACKAGER_URL}/?import_from=${location.origin}`);\n }\n }\n handleMessage (e) {\n if (e.origin !== PACKAGER_ORIGIN) {\n return;\n }\n\n if (!this.props.canOpenPackager) {\n return;\n }\n\n const packagerData = e.data.p4;\n if (packagerData.type !== 'ready-for-import') {\n return;\n }\n\n // The packager needs to know that we will be importing something so it can display a loading screen\n e.source.postMessage({\n p4: {\n type: 'start-import'\n }\n }, e.origin);\n\n this.props.vm.saveProjectSb3('arraybuffer')\n .then(buffer => {\n const name = `${this.props.reduxProjectTitle}.sb3`;\n e.source.postMessage({\n p4: {\n type: 'finish-import',\n data: buffer,\n name\n }\n }, e.origin, [buffer]);\n })\n .catch(err => {\n log.error(err);\n e.source.postMessage({\n p4: {\n type: 'cancel-import'\n }\n }, e.origin);\n });\n }\n render () {\n const {\n /* eslint-disable no-unused-vars */\n canOpenPackager,\n /* eslint-enable no-unused-vars */\n ...props\n } = this.props;\n return (\n \n );\n }\n }\n PackagerIntegrationComponent.propTypes = {\n canOpenPackager: PropTypes.bool,\n reduxProjectTitle: PropTypes.string,\n vm: PropTypes.shape({\n saveProjectSb3: PropTypes.func\n })\n };\n const mapStateToProps = state => ({\n canOpenPackager: getIsShowingProject(state.scratchGui.projectState.loadingState),\n reduxProjectTitle: state.scratchGui.projectTitle,\n vm: state.scratchGui.vm\n });\n const mapDispatchToProps = () => ({});\n return connect(\n mapStateToProps,\n mapDispatchToProps\n )(PackagerIntegrationComponent);\n};\n\nexport {\n PackagerIntegrationHOC as default\n};\n","import React from 'react';\nimport darkModeCSS from '!raw-loader!./tw-theme-dark.css';\n\nconst THEME_KEY = 'tw:theme';\n\nconst darkMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\nexport const getInitialDarkMode = () => {\n try {\n const item = localStorage.getItem(THEME_KEY);\n if (item !== null) {\n return item === 'dark';\n }\n } catch (e) {\n // ignore\n }\n return darkMediaQuery.matches;\n};\n\nconst darkModeStylesheet = document.createElement('style');\ndarkModeStylesheet.textContent = darkModeCSS;\n\nconst ThemeHOC = function (WrappedComponent) {\n class ThemeComponent extends React.Component {\n constructor (props) {\n super(props);\n this.handleQueryChange = this.handleQueryChange.bind(this);\n this.handleClickTheme = this.handleClickTheme.bind(this);\n this.state = {\n dark: getInitialDarkMode()\n };\n }\n componentDidMount () {\n // media query does not have listeners in legacy edge\n if (darkMediaQuery.addEventListener) {\n darkMediaQuery.addEventListener('change', this.handleQueryChange);\n }\n this.updateDark();\n }\n componentDidUpdate () {\n try {\n localStorage.setItem(THEME_KEY, this.state.dark ? 'dark' : 'light');\n } catch (e) {\n // ignore\n }\n this.updateDark();\n }\n componentWillUnmount () {\n // media query does not have listeners in legacy edge\n if (darkMediaQuery.removeEventListener) {\n darkMediaQuery.removeEventListener('change', this.handleQueryChange);\n }\n }\n updateDark () {\n const dark = this.state.dark;\n document.body.setAttribute('theme', dark ? 'dark' : 'light');\n if (dark && !darkModeStylesheet.parentNode) {\n // Append at the start of we override scratch-gui styles in \n // but are overridden by addon styles at the end of \n document.body.insertBefore(darkModeStylesheet, document.body.firstChild);\n } else if (!dark && darkModeStylesheet.parentNode) {\n darkModeStylesheet.parentNode.removeChild(darkModeStylesheet);\n }\n }\n handleQueryChange () {\n this.setState({\n dark: darkMediaQuery.matches\n });\n }\n handleClickTheme () {\n this.setState(state => ({\n dark: !state.dark\n }));\n }\n render () {\n return (\n \n );\n }\n }\n return ThemeComponent;\n};\n\nexport {\n ThemeHOC as default\n};\n","/**\n * Copyright (C) 2021 Thomas Weber\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License version 3 as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nimport './import-first';\n\nimport ReactDOM from 'react-dom';\nimport React from 'react';\nimport {setAppElement} from 'react-modal';\n\nimport Interface from './render-interface.jsx';\nimport appTarget from './app-target';\n\nsetAppElement(appTarget);\nReactDOM.render(, appTarget);\n","\nvar content = require(\"!!../../node_modules/css-loader/index.js??ref--5-1!../../node_modules/postcss-loader/src/index.js??postcss!./interface.css\");\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/index.js??ref--5-1!../../node_modules/postcss-loader/src/index.js??postcss!./interface.css\", function() {\n\t\tvar newContent = require(\"!!../../node_modules/css-loader/index.js??ref--5-1!../../node_modules/postcss-loader/src/index.js??postcss!./interface.css\");\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}","import log from '../lib/log';\nimport serviceWorker from '!!file-loader?name=sw.js!./service-worker.js';\n\nlet loaded = false;\nconst actuallyLoadServiceWorker = () => {\n navigator.serviceWorker.register(serviceWorker)\n .catch(err => {\n log.error('sw error', err);\n });\n};\nconst loadServiceWorker = () => {\n if (process.env.ENABLE_SERVICE_WORKER && 'serviceWorker' in navigator && !loaded) {\n loaded = true;\n if (document.readyState === 'complete') {\n actuallyLoadServiceWorker();\n } else {\n window.addEventListener('load', actuallyLoadServiceWorker);\n }\n }\n};\n\nexport {\n loadServiceWorker\n};\n","/**\n * Copyright (C) 2021 Thomas Weber\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License version 3 as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nimport classNames from 'classnames';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {connect} from 'react-redux';\nimport {compose} from 'redux';\nimport {FormattedMessage, defineMessages, injectIntl, intlShape} from 'react-intl';\nimport {getIsLoading} from '../reducers/project-state.js';\nimport DOMElementRenderer from '../containers/dom-element-renderer.jsx';\nimport AppStateHOC from '../lib/app-state-hoc.jsx';\nimport ErrorBoundaryHOC from '../lib/error-boundary-hoc.jsx';\nimport TWProjectMetaFetcherHOC from '../lib/tw-project-meta-fetcher-hoc.jsx';\nimport TWStateManagerHOC from '../lib/tw-state-manager-hoc.jsx';\nimport TWThemeHOC from '../lib/tw-theme-hoc.jsx';\nimport SBFileUploaderHOC from '../lib/sb-file-uploader-hoc.jsx';\nimport TWPackagerIntegrationHOC from '../lib/tw-packager-integration-hoc.jsx';\nimport SettingsStore from '../addons/settings-store-singleton';\nimport '../lib/tw-fix-history-api';\nimport GUI from './render-gui.jsx';\nimport MenuBar from '../components/menu-bar/menu-bar.jsx';\nimport ProjectInput from '../components/tw-project-input/project-input.jsx';\nimport FeaturedProjects from '../components/tw-featured-projects/featured-projects.jsx';\nimport Description from '../components/tw-description/description.jsx';\nimport WebGlModal from '../containers/webgl-modal.jsx';\nimport BrowserModal from '../components/browser-modal/browser-modal.jsx';\nimport CloudVariableBadge from '../containers/tw-cloud-variable-badge.jsx';\nimport {isRendererSupported, isBrowserSupported} from '../lib/tw-environment-support-prober';\nimport AddonChannels from '../addons/channels';\nimport {loadServiceWorker} from './load-service-worker';\nimport runAddons from '../addons/entry';\nimport {APP_NAME} from '../lib/brand';\n\nimport styles from './interface.css';\n\nif (window.parent !== window) {\n // eslint-disable-next-line no-alert\n alert('This page contains an invalid TurboWarp embed. Please read https://docs.turbowarp.org/embedding for instructions to create a working embed.');\n throw new Error('Invalid embed');\n}\n\nlet announcement = null;\nif (process.env.ANNOUNCEMENT) {\n announcement = document.createElement('p');\n // This is safe because process.env.ANNOUNCEMENT is set at build time.\n announcement.innerHTML = process.env.ANNOUNCEMENT;\n}\n\nconst handleClickAddonSettings = () => {\n const path = process.env.ROUTING_STYLE === 'wildcard' ? 'addons' : 'addons.html';\n window.open(`${process.env.ROOT}${path}`);\n};\n\nconst messages = defineMessages({\n defaultTitle: {\n defaultMessage: 'Run Scratch projects faster',\n description: 'Title of homepage',\n id: 'tw.guiDefaultTitle'\n }\n});\n\nconst WrappedMenuBar = compose(\n SBFileUploaderHOC,\n TWPackagerIntegrationHOC\n)(MenuBar);\n\nif (AddonChannels.reloadChannel) {\n AddonChannels.reloadChannel.addEventListener('message', () => {\n location.reload();\n });\n}\n\nif (AddonChannels.changeChannel) {\n AddonChannels.changeChannel.addEventListener('message', e => {\n SettingsStore.setStoreWithVersionCheck(e.data);\n });\n}\n\nrunAddons();\n\nconst Footer = () => (\n \n);\n\nclass Interface extends React.Component {\n constructor (props) {\n super(props);\n this.handleUpdateProjectTitle = this.handleUpdateProjectTitle.bind(this);\n }\n componentDidUpdate (prevProps) {\n if (prevProps.isLoading && !this.props.isLoading) {\n loadServiceWorker();\n }\n }\n handleUpdateProjectTitle (title, isDefault) {\n if (isDefault || !title) {\n document.title = `TurboWarp - ${this.props.intl.formatMessage(messages.defaultTitle)}`;\n } else {\n document.title = `${title} - TurboWarp`;\n }\n }\n render () {\n const {\n /* eslint-disable no-unused-vars */\n intl,\n hasCloudVariables,\n description,\n isFullScreen,\n isLoading,\n isPlayerOnly,\n isRtl,\n onClickTheme,\n projectId,\n /* eslint-enable no-unused-vars */\n ...props\n } = this.props;\n const isHomepage = isPlayerOnly && !isFullScreen;\n const isEditor = !isPlayerOnly;\n return (\n \n {isHomepage ? (\n
\n \n
\n ) : null}\n \n {isHomepage && announcement ? : null}\n \n {isHomepage ? (\n \n {isRendererSupported() ? null : (\n \n )}\n {isBrowserSupported() ? null : (\n \n )}\n
\n \n
\n {(\n // eslint-disable-next-line max-len\n description.instructions === 'unshared' || description.credits === 'unshared'\n ) && (\n
\n

\n \n

\n

\n \n {'https://docs.turbowarp.org/unshared-projects'}\n \n )\n }}\n />\n

\n

\n \n

\n

\n \n

\n
\n )}\n {hasCloudVariables && projectId !== '0' && (\n
\n \n
\n )}\n {description.instructions || description.credits ? (\n
\n \n
\n ) : null}\n
\n

\n \n

\n
\n
\n \n
\n
\n ) : null}\n \n {isHomepage &&