From 2992efb82395f521009f70275fdc248a1f3c915a Mon Sep 17 00:00:00 2001 From: ShadowLarkens Date: Fri, 17 Jul 2020 22:02:11 -0700 Subject: [PATCH] TGUI v4.0 --- code/__defines/tgui.dm | 21 + code/_helpers/logging.dm | 14 +- code/controllers/subsystems/tgui.dm | 322 ++++++---- code/game/machinery/computer/camera.dm | 4 +- code/game/machinery/computer/crew.dm | 4 +- code/modules/client/client procs.dm | 4 + code/modules/clothing/glasses/hud_vr.dm | 4 +- code/modules/mob/living/silicon/subystems.dm | 4 +- code/modules/nifsoft/software/06_screens.dm | 4 +- code/modules/recycling/disposal.dm | 6 +- code/modules/tgui/external.dm | 106 ++-- code/modules/tgui/modules/camera.dm | 10 +- code/modules/tgui/modules/crew_monitor.dm | 30 +- code/modules/tgui/states.dm | 36 +- code/modules/tgui/tgui.dm | 474 ++++++-------- code/modules/tgui/tgui_window.dm | 203 ++++++ tgui/.eslintrc.yml | 4 +- tgui/.gitattributes | 9 + tgui/README.md | 9 +- tgui/bin/tgui | 8 + tgui/docs/component-reference.md | 4 +- tgui/docs/migration-to-v4-from-v3.md | 91 +++ tgui/docs/tutorial-and-examples.md | 26 +- tgui/package.json | 2 +- tgui/packages/common/perf.js | 44 ++ tgui/packages/common/redux.js | 34 + tgui/packages/common/storage.js | 64 ++ tgui/packages/common/vector.js | 18 +- tgui/packages/tgui/assets.js | 23 + tgui/packages/tgui/backend.js | 226 ++++++- tgui/packages/tgui/byond.js | 88 --- tgui/packages/tgui/components/Button.js | 14 +- tgui/packages/tgui/components/ByondUi.js | 46 +- tgui/packages/tgui/components/Chart.js | 9 +- tgui/packages/tgui/components/Flex.js | 15 +- tgui/packages/tgui/components/Knob.js | 9 +- tgui/packages/tgui/components/NumberInput.js | 9 +- tgui/packages/tgui/components/Section.js | 21 +- tgui/packages/tgui/components/Slider.js | 9 +- tgui/packages/tgui/components/index.js | 1 + .../manually-routed => debug}/KitchenSink.js | 277 ++++++-- tgui/packages/tgui/debug/index.js | 49 ++ tgui/packages/tgui/drag.js | 201 ++++-- tgui/packages/tgui/format.js | 9 + tgui/packages/tgui/global.d.ts | 95 +++ tgui/packages/tgui/hotkeys.js | 111 ++-- tgui/packages/tgui/index.js | 163 +++-- .../packages/tgui/interfaces/CameraConsole.js | 6 +- tgui/packages/tgui/interfaces/CrewMonitor.js | 7 +- tgui/packages/tgui/interfaces/DisposalBin.js | 4 +- .../tgui/interfaces/NtosCameraConsole.js | 5 +- .../tgui/interfaces/NtosCrewMonitor.js | 5 +- tgui/packages/tgui/layouts/Layout.js | 15 +- tgui/packages/tgui/layouts/NtosWindow.js | 16 +- tgui/packages/tgui/layouts/Window.js | 92 ++- tgui/packages/tgui/layouts/index.js | 6 + tgui/packages/tgui/logging.js | 16 +- tgui/packages/tgui/package.json | 8 +- tgui/packages/tgui/public/tgui.bundle.css | 2 +- tgui/packages/tgui/public/tgui.bundle.js | 31 +- tgui/packages/tgui/public/tgui.html | 144 ++++- tgui/packages/tgui/routes.js | 27 +- tgui/packages/tgui/store.js | 39 +- .../packages/tgui/styles/components/Flex.scss | 11 +- .../tgui/styles/components/Section.scss | 15 + tgui/packages/tgui/styles/layouts/Layout.scss | 27 +- .../tgui/styles/layouts/TitleBar.scss | 17 + tgui/packages/tgui/styles/layouts/Window.scss | 20 + .../packages/tgui/styles/themes/abductor.scss | 59 ++ tgui/packages/tgui/styles/themes/paper.scss | 171 +++++ tgui/yarn.lock | 591 +++++++++--------- vorestation.dme | 2 + 72 files changed, 2995 insertions(+), 1275 deletions(-) create mode 100644 code/__defines/tgui.dm create mode 100644 code/modules/tgui/tgui_window.dm create mode 100644 tgui/docs/migration-to-v4-from-v3.md create mode 100644 tgui/packages/common/perf.js create mode 100644 tgui/packages/common/storage.js create mode 100644 tgui/packages/tgui/assets.js delete mode 100644 tgui/packages/tgui/byond.js rename tgui/packages/tgui/{interfaces/manually-routed => debug}/KitchenSink.js (63%) create mode 100644 tgui/packages/tgui/debug/index.js create mode 100644 tgui/packages/tgui/global.d.ts create mode 100644 tgui/packages/tgui/styles/themes/abductor.scss create mode 100644 tgui/packages/tgui/styles/themes/paper.scss diff --git a/code/__defines/tgui.dm b/code/__defines/tgui.dm new file mode 100644 index 0000000000..0cf23d7809 --- /dev/null +++ b/code/__defines/tgui.dm @@ -0,0 +1,21 @@ +/// Maximum number of windows that can be suspended/reused +#define TGUI_WINDOW_SOFT_LIMIT 5 +/// Maximum number of open windows +#define TGUI_WINDOW_HARD_LIMIT 9 + +/// Maximum ping timeout allowed to detect zombie windows +#define TGUI_PING_TIMEOUT 4 SECONDS + +/// Window does not exist +#define TGUI_WINDOW_CLOSED 0 +/// Window was just opened, but is still not ready to be sent data +#define TGUI_WINDOW_LOADING 1 +/// Window is free and ready to receive data +#define TGUI_WINDOW_READY 2 +/// Window is in use by a tgui datum +#define TGUI_WINDOW_ACTIVE 3 + +/// Get a window id based on the provided pool index +#define TGUI_WINDOW_ID(index) "tgui-window-[index]" +/// Get a pool index of the provided window id +#define TGUI_WINDOW_INDEX(window_id) text2num(copytext(window_id, 13)) \ No newline at end of file diff --git a/code/_helpers/logging.dm b/code/_helpers/logging.dm index 2aea0d47d0..deb4c8c670 100644 --- a/code/_helpers/logging.dm +++ b/code/_helpers/logging.dm @@ -176,8 +176,18 @@ /proc/log_unit_test(text) to_world_log("## UNIT_TEST: [text]") -/proc/log_tgui(text) - WRITE_LOG(diary, "\[[time_stamp()]]TGUI: [text]") +/proc/log_tgui(user_or_client, text) + var/entry = "" + if(!user_or_client) + entry += "no user" + else if(istype(user_or_client, /mob)) + var/mob/user = user_or_client + entry += "[user.ckey] (as [user])" + else if(istype(user_or_client, /client)) + var/client/client = user_or_client + entry += "[client.ckey]" + entry += ":\n[text]" + WRITE_LOG(diary, entry) /proc/report_progress(var/progress_message) admin_notice("[progress_message]", R_DEBUG) diff --git a/code/controllers/subsystems/tgui.dm b/code/controllers/subsystems/tgui.dm index d30a47c655..91533a7783 100644 --- a/code/controllers/subsystems/tgui.dm +++ b/code/controllers/subsystems/tgui.dm @@ -12,10 +12,14 @@ SUBSYSTEM_DEF(tgui) priority = FIRE_PRIORITY_TGUI runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT - var/list/currentrun = list() - var/list/open_uis = list() // A list of open UIs, grouped by src_object and ui_key. - var/list/processing_uis = list() // A list of processing UIs, ungrouped. - var/basehtml // The HTML base used for all UIs. + /// A list of UIs scheduled to process + var/list/current_run = list() + /// A list of open UIs + var/list/open_uis = list() + /// A list of open UIs, grouped by src_object and ui_key. + var/list/open_uis_by_src = list() + /// The HTML base used for all UIs. + var/basehtml /datum/controller/subsystem/tgui/PreInit() basehtml = file2text('tgui/packages/tgui/public/tgui.html') @@ -24,24 +28,92 @@ SUBSYSTEM_DEF(tgui) close_all_uis() /datum/controller/subsystem/tgui/stat_entry() - ..("P:[processing_uis.len]") + ..("P:[open_uis.len]") /datum/controller/subsystem/tgui/fire(resumed = 0) - if (!resumed) - src.currentrun = processing_uis.Copy() - //cache for sanic speed (lists are references anyways) - var/list/currentrun = src.currentrun - - while(currentrun.len) - var/datum/tgui/ui = currentrun[currentrun.len] - currentrun.len-- + if(!resumed) + src.current_run = open_uis.Copy() + // Cache for sanic speed (lists are references anyways) + var/list/current_run = src.current_run + while(current_run.len) + var/datum/tgui/ui = current_run[current_run.len] + current_run.len-- + // TODO: Move user/src_object check to process() if(ui && ui.user && ui.src_object) ui.process() else - processing_uis.Remove(ui) - if (MC_TICK_CHECK) + open_uis.Remove(ui) + if(MC_TICK_CHECK) return +/** + * public + * + * Requests a usable tgui window from the pool. + * Returns null if pool was exhausted. + * + * required user mob + * return datum/tgui + */ +/datum/controller/subsystem/tgui/proc/request_pooled_window(mob/user) + if(!user.client) + return null + var/list/windows = user.client.tgui_windows + var/window_id + var/datum/tgui_window/window + var/window_found = FALSE + // Find a usable window + for(var/i in 1 to TGUI_WINDOW_HARD_LIMIT) + window_id = TGUI_WINDOW_ID(i) + window = windows[window_id] + // As we are looping, create missing window datums + if(!window) + window = new(user.client, window_id, pooled = TRUE) + // Skip windows with acquired locks + if(window.locked) + continue + if(window.status == TGUI_WINDOW_READY) + return window + if(window.status == TGUI_WINDOW_CLOSED) + window.status = TGUI_WINDOW_LOADING + window_found = TRUE + break + if(!window_found) + return null + return window + +/** + * public + * + * Force closes all tgui windows. + * + * required user mob + */ +/datum/controller/subsystem/tgui/proc/force_close_all_windows(mob/user) + if(user.client) + user.client.tgui_windows = list() + for(var/i in 1 to TGUI_WINDOW_HARD_LIMIT) + var/window_id = TGUI_WINDOW_ID(i) + user << browse(null, "window=[window_id]") + +/** + * public + * + * Force closes the tgui window by window_id. + * + * required user mob + * required window_id string + */ +/datum/controller/subsystem/tgui/proc/force_close_window(mob/user, window_id) + // Close all tgui datums based on window_id. + for(var/datum/tgui/ui in user.tgui_open_uis) + if(ui.window && ui.window.id == window_id) + ui.close(can_be_suspended = FALSE) + // Unset machine just to be sure. + user.unset_machine() + // Close window directly just to be sure. + user << browse(null, "window=[window_id]") + /** * public * @@ -50,24 +122,28 @@ SUBSYSTEM_DEF(tgui) * required user mob The mob who opened/is using the UI. * required src_object datum The object/datum which owns the UI. * required ui_key string The ui_key of the UI. - * optional ui datum/tgui The UI to be updated, if it exists. - * optional force_open bool If the UI should be re-opened instead of updated. * * return datum/tgui The found UI. **/ -/datum/controller/subsystem/tgui/proc/try_update_ui(mob/user, datum/src_object, ui_key, datum/tgui/ui, force_open = FALSE) - if(isnull(ui)) // No UI was passed, so look for one. - ui = get_open_ui(user, src_object, ui_key) - - if(!isnull(ui)) - var/data = src_object.tgui_data(user) // Get data from the src_object. - if(!force_open) // UI is already open; update it. - ui.push_data(data) - else // Re-open it anyways. - ui.reinitialize(null, data) - return ui // We found the UI, return it. - else - return null // We couldn't find a UI. +/datum/controller/subsystem/tgui/proc/try_update_ui( + mob/user, + datum/src_object, + datum/tgui/ui) + // Look up a UI if it wasn't passed. + if(isnull(ui)) + ui = get_open_ui(user, src_object) + // Couldn't find a UI. + if(isnull(ui)) + return null + ui.process_status() + // UI ended up with the closed status + // or is actively trying to close itself. + // FIXME: Doesn't actually fix the paper bug. + if(ui.status <= STATUS_CLOSE) + ui.close() + return null + ui.send_update() + return ui /** * private @@ -80,17 +156,15 @@ SUBSYSTEM_DEF(tgui) * * return datum/tgui The found UI. **/ -/datum/controller/subsystem/tgui/proc/get_open_ui(mob/user, datum/src_object, ui_key) - var/src_object_key = "\ref[src_object]" - if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) +/datum/controller/subsystem/tgui/proc/get_open_ui(mob/user, datum/src_object) + var/key = "[REF(src_object)]" + // No UIs opened for this src_object + if(isnull(open_uis_by_src[key]) || !istype(open_uis_by_src[key], /list)) return null // No UIs open. - else if(isnull(open_uis[src_object_key][ui_key]) || !istype(open_uis[src_object_key][ui_key], /list)) - return null // No UIs open for this object. - - for(var/datum/tgui/ui in open_uis[src_object_key][ui_key]) // Find UIs for this object. - if(ui.user == user) // Make sure we have the right user + for(var/datum/tgui/ui in open_uis_by_src[key]) // Find UIs for this object. + // Make sure we have the right user + if(ui.user == user) return ui - return null // Couldn't find a UI! /** @@ -103,17 +177,16 @@ SUBSYSTEM_DEF(tgui) * return int The number of UIs updated. **/ /datum/controller/subsystem/tgui/proc/update_uis(datum/src_object) - var/src_object_key = "\ref[src_object]" - if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) - return 0 // Couldn't find any UIs for this object. - - var/update_count = 0 - for(var/ui_key in open_uis[src_object_key]) - for(var/datum/tgui/ui in open_uis[src_object_key][ui_key]) - if(ui && ui.src_object && ui.user && ui.src_object.tgui_host(ui.user)) // Check the UI is valid. - ui.process(force = 1) // Update the UI. - update_count++ // Count each UI we update. - return update_count + var/count = 0 + var/key = "[REF(src_object)]" + if(isnull(open_uis_by_src[key]) || !istype(open_uis_by_src[key], /list)) + return count // Couldn't find any UIs for this object. + for(var/datum/tgui/ui in open_uis_by_src[key]) + // Check the UI is valid. + if(ui && ui.src_object && ui.user && ui.src_object.tgui_host(ui.user)) + ui.process(force = 1) // Update the UI. + count++ // Count each UI we update. + return count /** * private @@ -125,34 +198,32 @@ SUBSYSTEM_DEF(tgui) * return int The number of UIs closed. **/ /datum/controller/subsystem/tgui/proc/close_uis(datum/src_object) - var/src_object_key = "\ref[src_object]" - if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) - return 0 // Couldn't find any UIs for this object. - - var/close_count = 0 - for(var/ui_key in open_uis[src_object_key]) - for(var/datum/tgui/ui in open_uis[src_object_key][ui_key]) - if(ui && ui.src_object && ui.user && ui.src_object.tgui_host(ui.user)) // Check the UI is valid. - ui.close() // Close the UI. - close_count++ // Count each UI we close. - return close_count + var/count = 0 + var/key = "[REF(src_object)]" + // No UIs opened for this src_object + if(isnull(open_uis_by_src[key]) || !istype(open_uis_by_src[key], /list)) + return count + for(var/datum/tgui/ui in open_uis_by_src[key]) + if(ui && ui.src_object && ui.user && ui.src_object.tgui_host(ui.user)) // Check the UI is valid. + ui.close() // Close the UI. + count++ // Count each UI we close. + return count /** * private * - * Close *ALL* UIs + * Close all UIs regardless of their attachment to src_object. * * return int The number of UIs closed. **/ /datum/controller/subsystem/tgui/proc/close_all_uis() - var/close_count = 0 - for(var/src_object_key in open_uis) - for(var/ui_key in open_uis[src_object_key]) - for(var/datum/tgui/ui in open_uis[src_object_key][ui_key]) - if(ui && ui.src_object && ui.user && ui.src_object.tgui_host(ui.user)) // Check the UI is valid. - ui.close() // Close the UI. - close_count++ // Count each UI we close. - return close_count + var/count = 0 + for(var/key in open_uis_by_src) + for(var/datum/tgui/ui in open_uis_by_src[key]) + if(ui && ui.src_object && ui.user && ui.src_object.tgui_host(ui.user)) // Check the UI is valid. + ui.close() // Close the UI. + count++ // Count each UI we close. + return count /** * private @@ -161,20 +232,18 @@ SUBSYSTEM_DEF(tgui) * * required user mob The mob who opened/is using the UI. * optional src_object datum If provided, only update UIs belonging this src_object. - * optional ui_key string If provided, only update UIs with this UI key. * * return int The number of UIs updated. **/ -/datum/controller/subsystem/tgui/proc/update_user_uis(mob/user, datum/src_object = null, ui_key = null) - if(isnull(user.open_tguis) || !istype(user.open_tguis, /list) || open_uis.len == 0) - return 0 // Couldn't find any UIs for this user. - - var/update_count = 0 - for(var/datum/tgui/ui in user.open_tguis) - if((isnull(src_object) || !isnull(src_object) && ui.src_object == src_object) && (isnull(ui_key) || !isnull(ui_key) && ui.ui_key == ui_key)) - ui.process(force = 1) // Update the UI. - update_count++ // Count each UI we upadte. - return update_count +/datum/controller/subsystem/tgui/proc/update_user_uis(mob/user, datum/src_object) + var/count = 0 + if(length(user?.tgui_open_uis) == 0) + return count + for(var/datum/tgui/ui in user.tgui_open_uis) + if(isnull(src_object) || ui.src_object == src_object) + ui.process(force = 1) + count++ + return count /** * private @@ -183,20 +252,18 @@ SUBSYSTEM_DEF(tgui) * * required user mob The mob who opened/is using the UI. * optional src_object datum If provided, only close UIs belonging this src_object. - * optional ui_key string If provided, only close UIs with this UI key. * * return int The number of UIs closed. **/ -/datum/controller/subsystem/tgui/proc/close_user_uis(mob/user, datum/src_object = null, ui_key = null) - if(isnull(user.open_tguis) || !istype(user.open_tguis, /list) || open_uis.len == 0) - return 0 // Couldn't find any UIs for this user. - - var/close_count = 0 - for(var/datum/tgui/ui in user.open_tguis) - if((isnull(src_object) || !isnull(src_object) && ui.src_object == src_object) && (isnull(ui_key) || !isnull(ui_key) && ui.ui_key == ui_key)) - ui.close() // Close the UI. - close_count++ // Count each UI we close. - return close_count +/datum/controller/subsystem/tgui/proc/close_user_uis(mob/user, datum/src_object) + var/count = 0 + if(length(user?.tgui_open_uis) == 0) + return count + for(var/datum/tgui/ui in user.tgui_open_uis) + if(isnull(src_object) || ui.src_object == src_object) + ui.close() + count++ + return count /** * private @@ -206,17 +273,13 @@ SUBSYSTEM_DEF(tgui) * required ui datum/tgui The UI to be added. **/ /datum/controller/subsystem/tgui/proc/on_open(datum/tgui/ui) - var/src_object_key = "\ref[ui.src_object]" - if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) - open_uis[src_object_key] = list(ui.ui_key = list()) // Make a list for the ui_key and src_object. - else if(isnull(open_uis[src_object_key][ui.ui_key]) || !istype(open_uis[src_object_key][ui.ui_key], /list)) - open_uis[src_object_key][ui.ui_key] = list() // Make a list for the ui_key. - - // Append the UI to all the lists. - ui.user.open_tguis |= ui - var/list/uis = open_uis[src_object_key][ui.ui_key] + var/key = "[REF(ui.src_object)]" + if(isnull(open_uis_by_src[key]) || !istype(open_uis_by_src[key], /list)) + open_uis_by_src[key] = list() + ui.user.tgui_open_uis |= ui + var/list/uis = open_uis_by_src[key] uis |= ui - processing_uis |= ui + open_uis |= ui /** * private @@ -228,25 +291,19 @@ SUBSYSTEM_DEF(tgui) * return bool If the UI was removed or not. **/ /datum/controller/subsystem/tgui/proc/on_close(datum/tgui/ui) - var/src_object_key = "\ref[ui.src_object]" - if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) - return FALSE // It wasn't open. - else if(isnull(open_uis[src_object_key][ui.ui_key]) || !istype(open_uis[src_object_key][ui.ui_key], /list)) - return FALSE // It wasn't open. - - processing_uis.Remove(ui) // Remove it from the list of processing UIs. - if(ui.user) // If the user exists, remove it from them too. - ui.user.open_tguis.Remove(ui) - var/Ukey = ui.ui_key - var/list/uis = open_uis[src_object_key][Ukey] // Remove it from the list of open UIs. + var/key = "[REF(ui.src_object)]" + if(isnull(open_uis_by_src[key]) || !istype(open_uis_by_src[key], /list)) + return FALSE + // Remove it from the list of processing UIs. + open_uis.Remove(ui) + // If the user exists, remove it from them too. + if(ui.user) + ui.user.tgui_open_uis.Remove(ui) + var/list/uis = open_uis_by_src[key] uis.Remove(ui) - if(!uis.len) - var/list/uiobj = open_uis[src_object_key] - uiobj.Remove(Ukey) - if(!uiobj.len) - open_uis.Remove(src_object_key) - - return TRUE // Let the caller know we did it. + if(length(uis) == 0) + open_uis_by_src.Remove(key) + return TRUE /** * private @@ -271,15 +328,16 @@ SUBSYSTEM_DEF(tgui) * return bool If the UIs were transferred. **/ /datum/controller/subsystem/tgui/proc/on_transfer(mob/source, mob/target) - if(!source || isnull(source.open_tguis) || !istype(source.open_tguis, /list) || open_uis.len == 0) - return FALSE // The old mob had no open UIs. - - if(isnull(target.open_tguis) || !istype(target.open_tguis, /list)) - target.open_tguis = list() // Create a list for the new mob if needed. - - for(var/datum/tgui/ui in source.open_tguis) - ui.user = target // Inform the UIs of their new owner. - target.open_tguis.Add(ui) // Transfer all the UIs. - - source.open_tguis.Cut() // Clear the old list. - return TRUE // Let the caller know we did it. + // The old mob had no open UIs. + if(length(source?.tgui_open_uis) == 0) + return FALSE + if(isnull(target.tgui_open_uis) || !istype(target.tgui_open_uis, /list)) + target.tgui_open_uis = list() + // Transfer all the UIs. + for(var/datum/tgui/ui in source.tgui_open_uis) + // Inform the UIs of their new owner. + ui.user = target + target.tgui_open_uis.Add(ui) + // Clear the old list. + source.tgui_open_uis.Cut() + return TRUE \ No newline at end of file diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 897db600a7..f87d69a9a7 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -24,8 +24,8 @@ QDEL_NULL(camera) return ..() -/obj/machinery/computer/security/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) - camera.tgui_interact(user, ui_key, ui, force_open, master_ui, state) +/obj/machinery/computer/security/tgui_interact(mob/user, datum/tgui/ui = null) + camera.tgui_interact(user, ui) /obj/machinery/computer/security/attack_hand(mob/user) add_fingerprint(user) diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 03453a8964..1af31afe80 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -28,8 +28,8 @@ return tgui_interact(user) -/obj/machinery/computer/crew/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) - crew_monitor.tgui_interact(user, ui_key, ui, force_open) +/obj/machinery/computer/crew/tgui_interact(mob/user, datum/tgui/ui = null) + crew_monitor.tgui_interact(user, ui) /obj/machinery/computer/crew/interact(mob/user) crew_monitor.tgui_interact(user) diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 36f11e736f..0fe7af5a77 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -46,6 +46,10 @@ //del(usr) return + // Tgui Topic middleware + if(!tgui_Topic(href_list)) + return + //Admin PM if(href_list["priv_msg"]) var/client/C = locate(href_list["priv_msg"]) diff --git a/code/modules/clothing/glasses/hud_vr.dm b/code/modules/clothing/glasses/hud_vr.dm index 2eb45e02ff..ce49c88949 100644 --- a/code/modules/clothing/glasses/hud_vr.dm +++ b/code/modules/clothing/glasses/hud_vr.dm @@ -85,12 +85,12 @@ These have been upgraded with medical records access and virus database integration." mode = "med" action_button_name = "AR Console (Crew Monitor)" - tgarscreen_path = /datum/tgui_module/crew_monitor + tgarscreen_path = /datum/tgui_module/crew_monitor/glasses enables_planes = list(VIS_CH_ID,VIS_CH_HEALTH_VR,VIS_CH_STATUS_R,VIS_CH_BACKUP,VIS_AUGMENTED) ar_interact(var/mob/living/carbon/human/user) if(tgarscreen) - tgarscreen.tgui_interact(user, state = GLOB.tgui_glasses_state) + tgarscreen.tgui_interact(user) return 1 /obj/item/clothing/glasses/omnihud/sec diff --git a/code/modules/mob/living/silicon/subystems.dm b/code/modules/mob/living/silicon/subystems.dm index b498021a16..e5d50d5824 100644 --- a/code/modules/mob/living/silicon/subystems.dm +++ b/code/modules/mob/living/silicon/subystems.dm @@ -2,7 +2,7 @@ var/register_alarms = 1 var/datum/nano_module/alarm_monitor/all/alarm_monitor var/datum/nano_module/atmos_control/atmos_control - var/datum/tgui_module/crew_monitor/crew_monitor + var/datum/tgui_module/crew_monitor/robot/crew_monitor var/datum/nano_module/law_manager/law_manager var/datum/nano_module/power_monitor/power_monitor var/datum/nano_module/rcon/rcon @@ -67,7 +67,7 @@ set category = "Subystems" set name = "Crew Monitor" - crew_monitor.tgui_interact(usr, state = GLOB.tgui_self_state) + crew_monitor.tgui_interact(usr) /**************** * Law Manager * diff --git a/code/modules/nifsoft/software/06_screens.dm b/code/modules/nifsoft/software/06_screens.dm index 85861a52be..64a1faac5c 100644 --- a/code/modules/nifsoft/software/06_screens.dm +++ b/code/modules/nifsoft/software/06_screens.dm @@ -5,7 +5,7 @@ access = access_medical cost = 625 p_drain = 0.025 - var/datum/tgui_module/crew_monitor/arscreen + var/datum/tgui_module/crew_monitor/nif/arscreen New() ..() @@ -17,7 +17,7 @@ activate() if((. = ..())) - arscreen.tgui_interact(nif.human, "main", null, 1, state = GLOB.tgui_nif_state) + arscreen.tgui_interact(nif.human) return TRUE deactivate() diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 5924b22e34..fa19b46e1f 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -242,10 +242,10 @@ return // user interaction -/obj/machinery/disposal/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) +/obj/machinery/disposal/tgui_interact(mob/user, datum/tgui/ui = null) + ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, ui_key, "DisposalBin", name, 300, 250, master_ui, state) + ui = new(user, src, "DisposalBin") ui.open() /obj/machinery/disposal/tgui_data(mob/user) diff --git a/code/modules/tgui/external.dm b/code/modules/tgui/external.dm index c76d28e1d7..7e75f9343c 100644 --- a/code/modules/tgui/external.dm +++ b/code/modules/tgui/external.dm @@ -11,14 +11,10 @@ * If this proc is not implemented properly, the UI will not update correctly. * * required user mob The mob who opened/is using the UI. - * optional ui_key string The ui_key of the UI. * optional ui datum/tgui The UI to be updated, if it exists. - * optional force_open bool If the UI should be re-opened instead of updated. - * optional master_ui datum/tgui The parent UI. - * optional state datum/ui_state The state used to determine status. */ -/datum/proc/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) +/datum/proc/tgui_interact(mob/user, datum/tgui/ui = null) return FALSE // Not implemented. /** @@ -38,10 +34,10 @@ * public * * Static Data to be sent to the UI. - * Static data differs from normal data in that it's large data that should be sent infrequently - * This is implemented optionally for heavy uis that would be sending a lot of redundant data - * frequently. - * Gets squished into one object on the frontend side, but the static part is cached. + * Static data differs from normal data in that it's large data that should be + * sent infrequently. This is implemented optionally for heavy uis that would + * be sending a lot of redundant data frequently. Gets squished into one + * object on the frontend side, but the static part is cached. * * required user mob The mob interacting with the UI. * @@ -53,18 +49,19 @@ /** * public * - * Forces an update on static data. Should be done manually whenever something happens to change static data. + * Forces an update on static data. Should be done manually whenever something + * happens to change static data. * * required user the mob currently interacting with the ui * optional ui ui to be updated - * optional ui_key ui key of ui to be updated */ -/datum/proc/update_tgui_static_data(mob/user, datum/tgui/ui, ui_key = "main") - ui = SStgui.try_update_ui(user, src, ui_key, ui) +/datum/proc/update_tgui_static_data(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) // If there was no ui to update, there's no static data to update either. if(!ui) - return - ui.push_data(null, tgui_static_data(user), TRUE) + ui = SStgui.get_open_ui(user, src) + if(ui) + ui.send_full_update() /** * public @@ -86,17 +83,12 @@ * public * * Called on an object when a tgui object is being created, allowing you to - * customise the html - * For example: inserting a custom stylesheet that you need in the head + * push various assets to tgui, for examples spritesheets. * - * For this purpose, some tags are available in the html, to be parsed out - ^ with replacetext - * (customheadhtml) - Additions to the head tag - * - * required html the html base text + * return list List of asset datums or file paths. */ -/datum/proc/tgui_base_html(html) - return html +/datum/proc/ui_assets(mob/user) + return list() /** * private @@ -108,6 +100,15 @@ /datum/proc/tgui_host(mob/user) return src // Default src. +/** + * private + * + * The UI's state controller to be used for created uis + * This is a proc over a var for memory reasons + */ +/datum/proc/tgui_state(mob/user) + return GLOB.tgui_default_state + /** * global * @@ -120,9 +121,17 @@ /** * global * - * Used to track UIs for a mob. + * Tracks open UIs for a user. */ -/mob/var/list/open_tguis = list() +/mob/var/list/tgui_open_uis = list() + +/** + * global + * + * Tracks open windows for a user. + */ +/client/var/list/tgui_windows = list() + /** * public * @@ -139,17 +148,44 @@ * * required uiref ref The UI that was closed. */ -/client/verb/tguiclose(ref as text) +/client/verb/tguiclose(window_id as text) // Name the verb, and hide it from the user panel. set name = "uiclose" set hidden = TRUE - // Get the UI based on the ref. - var/datum/tgui/ui = locate(ref) + var/mob/user = src && src.mob + if(!user) + return + // Close all tgui datums based on window_id. + SStgui.force_close_window(user, window_id) - // If we found the UI, close it. - if(istype(ui)) - ui.close() - // Unset machine just to be sure. - if(src && src.mob) - src.mob.unset_machine() +/** + * Middleware for /client/Topic. + * + * return bool Whether the topic is passed (TRUE), or cancelled (FALSE). + */ +/proc/tgui_Topic(href_list) + // Skip non-tgui topics + if(!href_list["tgui"]) + return TRUE + var/type = href_list["type"] + // Unconditionally collect tgui logs + if(type == "log") + log_tgui(usr, href_list["message"]) + // Locate window + var/window_id = href_list["window_id"] + var/datum/tgui_window/window + if(window_id) + window = usr.client.tgui_windows[window_id] + if(!window) + log_tgui(usr, "Error: Couldn't find the window datum, force closing.") + SStgui.force_close_window(usr, window_id) + return FALSE + // Decode payload + var/payload + if(href_list["payload"]) + payload = json_decode(href_list["payload"]) + // Pass message to window + if(window) + window.on_message(type, payload, href_list) + return FALSE diff --git a/code/modules/tgui/modules/camera.dm b/code/modules/tgui/modules/camera.dm index 20c6aeb0ef..301d43d9d5 100644 --- a/code/modules/tgui/modules/camera.dm +++ b/code/modules/tgui/modules/camera.dm @@ -76,9 +76,9 @@ qdel(cam_foreground) return ..() -/datum/tgui_module/camera/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) +/datum/tgui_module/camera/tgui_interact(mob/user, datum/tgui/ui = null) // Update UI - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + ui = SStgui.try_update_ui(user, src, ui) // Show static if can't use the camera if(!active_camera?.can_use()) show_camera_static() @@ -99,7 +99,7 @@ user.client.register_map_obj(cam_background) user.client.register_map_obj(cam_foreground) // Open UI - ui = new(user, src, ui_key, tgui_id, name, 870, 708, master_ui, state) + ui = new(user, src, tgui_id, name) ui.open() /datum/tgui_module/camera/tgui_data() @@ -256,8 +256,8 @@ /datum/tgui_module/camera/ntos tgui_id = "NtosCameraConsole" -/datum/tgui_module/camera/ntos/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_ntos_state) - . = ..(user, ui_key, ui, force_open, master_ui, GLOB.tgui_ntos_state) +/datum/tgui_module/camera/ntos/tgui_state() + return GLOB.tgui_ntos_state /datum/tgui_module/camera/ntos/tgui_static_data() . = ..() diff --git a/code/modules/tgui/modules/crew_monitor.dm b/code/modules/tgui/modules/crew_monitor.dm index 5ab6de92a9..4caaf31e8c 100644 --- a/code/modules/tgui/modules/crew_monitor.dm +++ b/code/modules/tgui/modules/crew_monitor.dm @@ -2,7 +2,7 @@ name = "Crew monitor" tgui_id = "CrewMonitor" -/datum/tgui_module/crew_monitor/tgui_act(action, params) +/datum/tgui_module/crew_monitor/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -19,8 +19,11 @@ if(hassensorlevel(H, SUIT_SENSOR_TRACKING)) AI.ai_actual_track(H) return TRUE + if("setZLevel") + ui.set_map_z_level(params["mapZLevel"]) + SStgui.update_uis(src) -/datum/tgui_module/crew_monitor/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) +/datum/tgui_module/crew_monitor/tgui_interact(mob/user, datum/tgui/ui = null) var/z = get_z(user) var/list/map_levels = using_map.get_map_levels(z, TRUE, om_range = DEFAULT_OVERMAP_RANGE) @@ -30,9 +33,9 @@ ui.close() return null - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, ui_key, tgui_id, name, 800, 600, master_ui, state) + ui = new(user, src, tgui_id) ui.autoupdate = TRUE ui.open() @@ -55,8 +58,8 @@ /datum/tgui_module/crew_monitor/ntos tgui_id = "NtosCrewMonitor" -/datum/tgui_module/crew_monitor/ntos/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_ntos_state) - . = ..(user, ui_key, ui, force_open, master_ui, GLOB.tgui_ntos_state) +/datum/tgui_module/crew_monitor/ntos/tgui_state(mob/user) + return GLOB.tgui_ntos_state /datum/tgui_module/crew_monitor/ntos/tgui_static_data() . = ..() @@ -80,3 +83,18 @@ if(action == "PC_minimize") host.computer.minimize_program(usr) return TRUE + +// Subtype for glasses_state +/datum/tgui_module/crew_monitor/glasses +/datum/tgui_module/crew_monitor/glasses/tgui_state(mob/user) + return GLOB.tgui_glasses_state + +// Subtype for self_state +/datum/tgui_module/crew_monitor/robot +/datum/tgui_module/crew_monitor/robot/tgui_state(mob/user) + return GLOB.tgui_self_state + +// Subtype for nif_state +/datum/tgui_module/crew_monitor/nif +/datum/tgui_module/crew_monitor/nif/tgui_state(mob/user) + return GLOB.tgui_nif_state diff --git a/code/modules/tgui/states.dm b/code/modules/tgui/states.dm index a12864ba95..111ee9e30b 100644 --- a/code/modules/tgui/states.dm +++ b/code/modules/tgui/states.dm @@ -1,7 +1,6 @@ /** - * tgui states - * - * Base state and helpers for states. Just does some sanity checks, implement a state for in-depth checks. + * Base state and helpers for states. Just does some sanity checks, + * implement a proper state for in-depth checks. */ /** @@ -26,9 +25,10 @@ // . = max(., STATUS_INTERACTIVE) // Regular ghosts can always at least view if in range. - var/clientviewlist = getviewsize(user.client.view) - if(get_dist(src_object, user) < max(clientviewlist[1],clientviewlist[2])) - . = max(., STATUS_UPDATE) + if(user.client) + var/clientviewlist = getviewsize(user.client.view) + if(get_dist(src_object, user) < max(clientviewlist[1], clientviewlist[2])) + . = max(., STATUS_UPDATE) // Check if the state allows interaction var/result = state.can_use_topic(src_object, user) @@ -46,7 +46,8 @@ * return UI_state The state of the UI. */ /datum/tgui_state/proc/can_use_topic(src_object, mob/user) - return STATUS_CLOSE // Don't allow interaction by default. + // Don't allow interaction by default. + return STATUS_CLOSE /** * public @@ -56,21 +57,26 @@ * return UI_state The state of the UI. */ /mob/proc/shared_tgui_interaction(src_object) - if(!client) // Close UIs if mindless. + // Close UIs if mindless. + if(!client) return STATUS_CLOSE - else if(stat) // Disable UIs if unconcious. + // Disable UIs if unconcious. + else if(stat) return STATUS_DISABLED - else if(incapacitated()) // Update UIs if incapicitated but concious. + // Update UIs if incapicitated but concious. + else if(incapacitated()) return STATUS_UPDATE return STATUS_INTERACTIVE /mob/living/silicon/ai/shared_tgui_interaction(src_object) - if(lacks_power()) // Disable UIs if the AI is unpowered. + // Disable UIs if the AI is unpowered. + if(lacks_power()) return STATUS_DISABLED return ..() /mob/living/silicon/robot/shared_tgui_interaction(src_object) - if(!cell || cell.charge <= 0 || lockcharge) // Disable UIs if the Borg is unpowered or locked. + // Disable UIs if the Borg is unpowered or locked. + if(!cell || cell.charge <= 0 || lockcharge) return STATUS_DISABLED return ..() @@ -87,7 +93,8 @@ * return UI_state The state of the UI. */ /atom/proc/contents_tgui_distance(src_object, mob/living/user) - return user.shared_living_tgui_distance(src_object) // Just call this mob's check. + // Just call this mob's check. + return user.shared_living_tgui_distance(src_object) /** * public @@ -99,7 +106,8 @@ * return UI_state The state of the UI. */ /mob/living/proc/shared_living_tgui_distance(atom/movable/src_object, viewcheck = TRUE) - if(viewcheck && !(src_object in view(src))) // If the object is obscured, close it. + // If the object is obscured, close it. + if(viewcheck && !(src_object in view(src))) return STATUS_CLOSE var/dist = get_dist(src_object, src) diff --git a/code/modules/tgui/tgui.dm b/code/modules/tgui/tgui.dm index 573f8c118d..ee256287cb 100644 --- a/code/modules/tgui/tgui.dm +++ b/code/modules/tgui/tgui.dm @@ -14,34 +14,28 @@ var/datum/src_object /// The title of te UI. var/title - /// The ui_key of the UI. This allows multiple UIs for one src_object. - var/ui_key /// The window_id for browse() and onclose(). - var/window_id - /// The window width. - var/width = 0 - /// The window height - var/height = 0 + var/datum/tgui_window/window + /// Key that is used for remembering the window geometry. + var/window_key + /// Deprecated: Window size. + var/window_size /// The interface (template) to be used for this UI. var/interface /// Update the UI every MC tick. var/autoupdate = TRUE /// If the UI has been initialized yet. var/initialized = FALSE - /// The data (and datastructure) used to initialize the UI. - var/list/initial_data - /// The static data used to initialize the UI. - var/list/initial_static_data - /// Holder for the json string, that is sent during the initial update - var/_initial_update + /// Time of opening the window. + var/opened_at + /// Stops further updates when close() was called. + var/closing = FALSE /// The status/visibility of the UI. var/status = STATUS_INTERACTIVE /// Topic state used to determine status/interactability. var/datum/tgui_state/state = null - /// The parent UI. - var/datum/tgui/master_ui - /// Children of this UI. - var/list/datum/tgui/children = list() + /// Asset data to be sent with every update + var/list/asset_data // The map z-level to display. var/map_z_level = 1 @@ -52,39 +46,24 @@ * * required user mob The mob who opened/is using the UI. * required src_object datum The object or datum which owns the UI. - * required ui_key string The ui_key of the UI. * required interface string The interface used to render the UI. * optional title string The title of the UI. - * optional width int The window width. - * optional height int The window height. - * optional master_ui datum/tgui The parent UI. - * optional state datum/ui_state The state used to determine status. + * optional ui_x int Deprecated: Window width. + * optional ui_y int Deprecated: Window height. * * return datum/tgui The requested UI. */ -/datum/tgui/New(mob/user, datum/src_object, ui_key, interface, title, width = 0, height = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) +/datum/tgui/New(mob/user, datum/src_object, interface, title, ui_x, ui_y) src.user = user src.src_object = src_object - src.ui_key = ui_key - src.window_id = "\ref[src_object]-[ui_key]" + src.window_key = "[REF(src_object)]-main" src.interface = interface - if(title) - src.title = sanitize(title) - if(width) - src.width = width - if(height) - src.height = height - - src.master_ui = master_ui - if(master_ui) - master_ui.children += src - src.state = state - - var/datum/asset/tgui_assets = get_asset_datum(/datum/asset/simple/tgui) - var/datum/asset/fa = get_asset_datum(/datum/asset/simple/fontawesome) - tgui_assets.send(user) - fa.send(user) + src.title = title + src.state = src_object.tgui_state() + // Deprecated + if(ui_x && ui_y) + src.window_size = list(ui_x, ui_y) /** * public @@ -93,84 +72,48 @@ */ /datum/tgui/proc/open() if(!user.client) - return // Bail if there is no client. - - update_status(push = FALSE) // Update the window status. + return null + if(window) + return null + process_status() if(status < STATUS_UPDATE) - return // Bail if we're not supposed to open. - - - - // Build window options - var/window_options = "can_minimize=0;auto_format=0;" - // If we have a width and height, use them. - if(width && height) - window_options += "size=[width]x[height];" - - // Remove titlebar and resize handles for a fancy window - // if(user.client.prefs.nanoui_fancy) - // window_options += "titlebar=0;can_resize=0;" - // else - window_options += "titlebar=1;can_resize=1;" - - // Generate page html - var/html - html = SStgui.basehtml - // Allow the src object to override the html if needed - html = src_object.tgui_base_html(html) - // Replace template tokens with important UI data - html = replacetextEx(html, "\[tgui:ref]", "\ref[src]") - - // Open the window. - user << browse(html, "window=[window_id];[window_options]") - - // Instruct the client to signal UI when the window is closed. - // NOTE: Intentional \ref usage; tgui datums can't/shouldn't - // be tagged, so this is an effective unwrap - winset(user, window_id, "on-close=\"uiclose \ref[src]\"") - - // Pre-fetch initial state while browser is still loading in - // another thread - if(!initial_data) - initial_data = src_object.tgui_data(user) - if(!initial_static_data) - initial_static_data = src_object.tgui_static_data(user) - _initial_update = url_encode(get_json(initial_data, initial_static_data)) - + return null + window = SStgui.request_pooled_window(user) + if(!window) + return null + opened_at = world.time + window.acquire_lock(src) + if(!window.is_ready()) + window.initialize() + else + window.send_message("ping") + for(var/datum/asset/asset in src_object.ui_assets(user)) + send_asset(asset) + window.send_message("update", get_payload( + with_data = TRUE, + with_static_data = TRUE)) SStgui.on_open(src) -/** - * public - * - * Reinitialize the UI. - * (Possibly with a new interface and/or data). - * - * optional template string The name of the new interface. - * optional data list The new initial data. - */ -/datum/tgui/proc/reinitialize(interface, list/data, list/static_data) - if(interface) - src.interface = interface - if(data) - initial_data = data - if(static_data) - initial_static_data = static_data - open() - /** * public * * Close the UI, and all its children. */ -/datum/tgui/proc/close() - user << browse(null, "window=[window_id]") // Close the window. - src_object.tgui_close(user) - SStgui.on_close(src) - for(var/datum/tgui/child in children) // Loop through and close all children. - child.close() - children.Cut() +/datum/tgui/proc/close(can_be_suspended = TRUE) + if(closing) + return + closing = TRUE + // If we don't have window_id, open proc did not have the opportunity + // to finish, therefore it's safe to skip this whole block. + if(window) + // Windows you want to keep are usually blue screens of death + // and we want to keep them around, to allow user to read + // the error message properly. + window.release_lock() + window.close(can_be_suspended) + src_object.tgui_close(user) + SStgui.on_close(src) state = null - master_ui = null qdel(src) /** @@ -178,50 +121,159 @@ * * Enable/disable auto-updating of the UI. * - * required state bool Enable/disable auto-updating. + * required autoupdate bool Enable/disable auto-updating. */ -/datum/tgui/proc/set_autoupdate(state = TRUE) - autoupdate = state +/datum/tgui/proc/set_autoupdate(autoupdate) + src.autoupdate = autoupdate + +/** + * public + * + * Replace current ui.state with a new one. + * + * required state datum/ui_state/state Next state + */ +/datum/tgui/proc/set_state(datum/tgui_state/state) + src.state = state + +/** + * public + * + * Makes an asset available to use in tgui. + * + * required asset datum/asset + */ +/datum/tgui/proc/send_asset(var/datum/asset/asset) + if(!user.client) + return + // if(istype(asset, /datum/asset/spritesheet)) + // var/datum/asset/spritesheet/spritesheet = asset + // LAZYINITLIST(asset_data) + // LAZYADD(asset_data["styles"], list(spritesheet.css_filename())) + asset.send(user) + +/** + * public + * + * Send a full update to the client (includes static data). + * + * optional custom_data list Custom data to send instead of ui_data. + * optional force bool Send an update even if UI is not interactive. + */ +/datum/tgui/proc/send_full_update(custom_data, force) + if(!user.client || !initialized || closing) + return + var/should_update_data = force || status >= STATUS_UPDATE + window.send_message("update", get_payload( + custom_data, + with_data = should_update_data, + with_static_data = TRUE)) + +/** + * public + * + * Send a partial update to the client (excludes static data). + * + * optional custom_data list Custom data to send instead of ui_data. + * optional force bool Send an update even if UI is not interactive. + */ +/datum/tgui/proc/send_update(custom_data, force) + if(!user.client || !initialized || closing) + return + var/should_update_data = force || status >= STATUS_UPDATE + window.send_message("update", get_payload( + custom_data, + with_data = should_update_data)) /** * private * * Package the data to send to the UI, as JSON. - * This includes the UI data and config_data. * - * return string The packaged JSON. + * return list */ -/datum/tgui/proc/get_json(list/data, list/static_data) +/datum/tgui/proc/get_payload(custom_data, with_data, with_static_data) var/list/json_data = list() - json_data["config"] = list( "title" = title, "status" = status, "interface" = interface, - // "fancy" = user.client.prefs.nanoui_fancy, - "observer" = isobserver(user), - "window" = window_id, "map" = (using_map && using_map.path) ? using_map.path : "Unknown", "mapZLevel" = map_z_level, - - "ref" = "\ref[src]" + "window" = list( + "key" = window_key, + "size" = window_size, + "fancy" = FALSE, // user.client.prefs.tgui_fancy, + "locked" = FALSE, // user.client.prefs.tgui_lock, + ), + "user" = list( + "name" = "[user]", + "ckey" = "[user.ckey]", + "observer" = isobserver(user), + ), ) - - if(!isnull(data)) + var/data = custom_data || with_data && src_object.tgui_data(user) + if(data) json_data["data"] = data - if(!isnull(static_data)) + var/static_data = with_static_data && src_object.tgui_static_data(user) + if(static_data) json_data["static_data"] = static_data - - // Send shared states + if(asset_data) + json_data["assets"] = asset_data if(src_object.tgui_shared_states) json_data["shared"] = src_object.tgui_shared_states + return json_data - // Generate the JSON. - var/json = json_encode(json_data) - // Strip #255/improper. - json = replacetext(json, "\proper", "") - json = replacetext(json, "\improper", "") - return json +/** + * private + * + * Run an update cycle for this UI. Called internally by SStgui + * every second or so. + */ +/datum/tgui/process(force = FALSE) + if(closing) + return + var/datum/host = src_object.tgui_host(user) + // If the object or user died (or something else), abort. + if(!src_object || !host || !user || !window) + close(can_be_suspended = FALSE) + return + // Validate ping + if(!initialized && world.time - opened_at > TGUI_PING_TIMEOUT) + log_tgui(user, \ + "Error: Zombie window detected, killing it with fire.\n" \ + + "window_id: [window.id]\n" \ + + "opened_at: [opened_at]\n" \ + + "world.time: [world.time]") + close(can_be_suspended = FALSE) + return + // Update through a normal call to ui_interact + if(status != STATUS_DISABLED && (autoupdate || force)) + src_object.tgui_interact(user, src) + return + // Update status only + var/needs_update = process_status() + if(status <= STATUS_CLOSE) + close() + return + if(needs_update) + window.send_message("update", get_payload()) + +/** + * private + * + * Updates the status, and returns TRUE if status has changed. + */ +/datum/tgui/proc/process_status() + var/prev_status = status + status = src_object.tgui_status(user, state) + return prev_status != status + +/datum/tgui/proc/log_message(message) + log_tgui("[user] ([user.ckey]) using \"[title]\":\n[message]") + +/datum/tgui/proc/set_map_z_level(nz) + map_z_level = nz /** * private @@ -230,144 +282,20 @@ * Call the src_object's ui_act() if status is UI_INTERACTIVE. * If the src_object's ui_act() returns 1, update all UIs attacked to it. */ -/datum/tgui/Topic(href, href_list) - if(user != usr) - return // Something is not right here. - - var/action = href_list["action"] - var/params = href_list; params -= "action" - - switch(action) - if("tgui:initialize") - user << output(_initial_update, "[window_id].browser:update") - initialized = TRUE - if("tgui:setSharedState") - // Update the window state. - update_status(push = FALSE) - // Bail if UI is not interactive or usr calling Topic - // is not the UI user. - if(status != STATUS_INTERACTIVE) - return - var/key = params["key"] - var/value = params["value"] - if(!src_object.tgui_shared_states) - src_object.tgui_shared_states = list() - src_object.tgui_shared_states[key] = value +/datum/tgui/proc/on_message(type, list/payload, list/href_list) + // Pass act type messages to tgui_act + if(type && copytext(type, 1, 5) == "act/") + process_status() + if(src_object.tgui_act(copytext(type, 5), payload, src, state)) SStgui.update_uis(src_object) - // if("tgui:setFancy") - // var/value = text2num(params["value"]) - // user.client.prefs.nanoui_fancy = value - if("tgui:log") - // Force window to show frills on fatal errors - if(params["fatal"]) - winset(user, window_id, "titlebar=1;can-resize=1;size=600x600") - log_message(params["log"]) - if("tgui:link") - user << link(params["url"]) - if("tgui:setZLevel") - set_map_z_level(params["mapZLevel"]) - // Update the window state. - update_status(push = FALSE) - - else - // Update the window state. - update_status(push = FALSE) - // Call tgui_act() on the src_object. - if(src_object.tgui_act(action, params, src, state)) - // Update if the object requested it. - SStgui.update_uis(src_object) - -/** - * private - * - * Update the UI. - * Only updates the data if update is true, otherwise only updates the status. - * - * optional force bool If the UI should be forced to update. - */ -/datum/tgui/process(force = FALSE) - var/datum/host = src_object.tgui_host(user) - if(!src_object || !host || !user) // If the object or user died (or something else), abort. - close() - return - - if(status && (force || autoupdate)) - update() // Update the UI if the status and update settings allow it. - else - update_status(push = TRUE) // Otherwise only update status. - -/** - * private - * - * Push data to an already open UI. - * - * required data list The data to send. - * optional force bool If the update should be sent regardless of state. - */ -/datum/tgui/proc/push_data(data, static_data, force = FALSE) - // Update the window state. - update_status(push = FALSE) - // Cannot update UI if it is not set up yet. - if(!initialized) - return - // Cannot update UI, we have no visibility. - if(status <= STATUS_DISABLED && !force) - return - // Send the new JSON to the update() Javascript function. - user << output( - url_encode(get_json(data, static_data)), - "[window_id].browser:update") - -/** - * private - * - * Updates the UI by interacting with the src_object again, which will hopefully - * call try_ui_update on it. - * - * optional force_open bool If force_open should be passed to ui_interact. - */ -/datum/tgui/proc/update(force_open = FALSE) - src_object.tgui_interact(user, ui_key, src, force_open, master_ui, state) - -/** - * private - * - * Update the status/visibility of the UI for its user. - * - * optional push bool Push an update to the UI (an update is always sent for UI_DISABLED). - */ -/datum/tgui/proc/update_status(push = FALSE) - var/status = src_object.tgui_status(user, state) - if(master_ui) - status = min(status, master_ui.status) - - set_status(status, push) - if(status == STATUS_CLOSE) - close() - -/** - * private - * - * Set the status/visibility of the UI. - * - * required status int The status to set (UI_CLOSE/UI_DISABLED/UI_UPDATE/UI_INTERACTIVE). - * optional push bool Push an update to the UI (an update is always sent for UI_DISABLED). - */ -/datum/tgui/proc/set_status(status, push = FALSE) - // Only update if status has changed. - if(src.status != status) - if(src.status == STATUS_DISABLED) - src.status = status - if(push) - update() - else - src.status = status - // Update if the UI just because disabled, or a push is requested. - if(status == STATUS_DISABLED || push) - push_data(null, force = TRUE) - -/datum/tgui/proc/log_message(message) - log_tgui("[user] ([user.ckey]) using \"[title]\":\n[message]") - -/datum/tgui/proc/set_map_z_level(nz) - map_z_level = nz \ No newline at end of file + return FALSE + switch(type) + if("ready", "pingReady") + initialized = TRUE + if("log") + if(href_list["fatal"]) + close(can_be_suspended = FALSE) + if("setSharedState") + LAZYINITLIST(src_object.tgui_shared_states) + src_object.tgui_shared_states[href_list["key"]] = href_list["value"] + SStgui.update_uis(src_object) \ No newline at end of file diff --git a/code/modules/tgui/tgui_window.dm b/code/modules/tgui/tgui_window.dm new file mode 100644 index 0000000000..4d3265ae29 --- /dev/null +++ b/code/modules/tgui/tgui_window.dm @@ -0,0 +1,203 @@ +/** + * Copyright (c) 2020 Aleksej Komarov + * SPDX-License-Identifier: MIT + */ + +/datum/tgui_window + var/id + var/client/client + var/pooled + var/pool_index + var/status = TGUI_WINDOW_CLOSED + var/locked = FALSE + var/datum/tgui/locked_by + var/fatally_errored = FALSE + var/message_queue + +/** + * public + * + * Create a new tgui window. + * + * required client /client + * required id string A unique window identifier. + */ +/datum/tgui_window/New(client/client, id, pooled = FALSE) + src.id = id + src.client = client + src.pooled = pooled + if(pooled) + client.tgui_windows[id] = src + src.pool_index = TGUI_WINDOW_INDEX(id) + +/** + * public + * + * Initializes the window with a fresh page. Puts window into the "loading" + * state. You can begin sending messages right after initializing. Messages + * will be put into the queue until the window finishes loading. + */ +/datum/tgui_window/proc/initialize() + log_tgui(client, "[id]/initialize") + if(!client) + return + status = TGUI_WINDOW_LOADING + fatally_errored = FALSE + message_queue = null + // Build window options + var/options = "file=[id].html;can_minimize=0;auto_format=0;" + // Remove titlebar and resize handles for a fancy window + // if(client.prefs.tgui_fancy) + // options += "titlebar=0;can_resize=0;" + // else + options += "titlebar=1;can_resize=1;" + // Generate page html + // TODO: Make this static + var/html = SStgui.basehtml + html = replacetextEx(html, "\[tgui:windowId]", id) + // Send required assets + var/datum/asset/asset + asset = get_asset_datum(/datum/asset/simple/tgui) + asset.send(client) + asset = get_asset_datum(/datum/asset/simple/fontawesome) + asset.send(client) + // Open the window + client << browse(html, "window=[id];[options]") + // Instruct the client to signal UI when the window is closed. + winset(client, id, "on-close=\"uiclose [id]\"") + +/** + * public + * + * Checks if the window is ready to receive data. + * + * return bool + */ +/datum/tgui_window/proc/is_ready() + return status == TGUI_WINDOW_READY + +/** + * public + * + * Checks if the window can be sanely suspended. + * + * return bool + */ +/datum/tgui_window/proc/can_be_suspended() + return !fatally_errored \ + && pooled \ + && pool_index > 0 \ + && pool_index <= TGUI_WINDOW_SOFT_LIMIT \ + && status >= TGUI_WINDOW_READY + +/** + * public + * + * Acquire the window lock. Pool will not be able to provide this window + * to other UIs for the duration of the lock. + * + * Can be given an optional tgui datum, which will hook its on_message + * callback into the message stream. + * + * optional ui /datum/tgui + */ +/datum/tgui_window/proc/acquire_lock(datum/tgui/ui) + locked = TRUE + locked_by = ui + +/** + * Release the window lock. + */ +/datum/tgui_window/proc/release_lock() + locked = FALSE + locked_by = null + +/** + * public + * + * Close the UI. + * + * optional can_be_suspended bool + */ +/datum/tgui_window/proc/close(can_be_suspended = TRUE) + if(!client) + return + if(can_be_suspended && can_be_suspended()) + log_tgui(client, "[id]/close: suspending") + status = TGUI_WINDOW_READY + send_message("suspend") + return + log_tgui(client, "[id]/close") + locked = FALSE + locked_by = null + status = TGUI_WINDOW_CLOSED + message_queue = null + // Do not close the window to give user some time + // to read the error message. + if(!fatally_errored) + client << browse(null, "window=[id]") + +/** + * public + * + * Sends a message to tgui window. + * + * required type string Message type + * required payload list Message payload + * optional force bool Send regardless of the ready status. + */ +/datum/tgui_window/proc/send_message(type, list/payload, force) + if(!client) + return + var/message = json_encode(list( + "type" = type, + "payload" = payload, + )) + // Strip #255/improper. + message = replacetext(message, "\proper", "") + message = replacetext(message, "\improper", "") + // Pack for sending via output() + message = url_encode(message) + // Place into queue if window is still loading + if(!force && status == TGUI_WINDOW_LOADING) + if(!message_queue) + message_queue = list() + message_queue += list(message) + return + client << output(message, "[id].browser:update") + +/** + * private + * + * Sends queued messages if the queue wasn't empty. + */ +/datum/tgui_window/proc/flush_message_queue() + if(!client || !message_queue) + return + for(var/message in message_queue) + client << output(message, "[id].browser:update") + message_queue = null + +/** + * private + * + * Callback for handling incoming tgui messages. + */ +/datum/tgui_window/proc/on_message(type, list/payload, list/href_list) + switch(type) + if("ready") + status = TGUI_WINDOW_READY + if("log") + if(href_list["fatal"]) + fatally_errored = TRUE + // Pass message to UI that requested the lock + if(locked && locked_by) + locked_by.on_message(type, payload, href_list) + flush_message_queue() + return + // If not locked, handle these message types + switch(type) + if("suspend") + close(can_be_suspended = TRUE) + if("close") + close(can_be_suspended = FALSE) diff --git a/tgui/.eslintrc.yml b/tgui/.eslintrc.yml index 67e74085c7..9fd4db9fd2 100644 --- a/tgui/.eslintrc.yml +++ b/tgui/.eslintrc.yml @@ -8,6 +8,8 @@ env: es6: true browser: true node: true +globals: + Byond: readonly plugins: - react settings: @@ -388,7 +390,7 @@ rules: ## Enforce a particular style for multiline comments # multiline-comment-style: error ## Enforce newlines between operands of ternary expressions - multiline-ternary: [error, always-multiline] + # multiline-ternary: [error, always-multiline] ## Require constructor names to begin with a capital letter # new-cap: error ## Enforce or disallow parentheses when invoking a constructor with no diff --git a/tgui/.gitattributes b/tgui/.gitattributes index 0016cc3bf6..9382416e69 100644 --- a/tgui/.gitattributes +++ b/tgui/.gitattributes @@ -2,9 +2,18 @@ ## Enforce text mode and LF line breaks *.js text eol=lf +*.jsx text eol=lf +*.ts text eol=lf +*.tsx text eol=lf *.css text eol=lf +*.scss text eol=lf *.html text eol=lf *.json text eol=lf +*.yml text eol=lf +*.md text eol=lf +*.bat text eol=lf +yarn.lock text eol=lf +bin/tgui text eol=lf ## Treat bundles as binary and ignore them during conflicts *.bundle.* binary merge=tgui-merge-bundle diff --git a/tgui/README.md b/tgui/README.md index 5ddeb18fdd..7ae1bddb6a 100644 --- a/tgui/README.md +++ b/tgui/README.md @@ -67,8 +67,9 @@ Run one of the following: game as you code it. Very useful, highly recommended. - In order to use it, you should start the game server first, connect to it and wait until the world has been properly loaded and you are no longer - in the lobby. Start tgui dev server. You'll know that it's hooked correctly - if data gets dumped to the log when tgui windows are opened. + in the lobby. Start tgui dev server, and once it has finished building, + press F5 on any tgui window. You'll know that it's hooked correctly if + you see a green bug icon in titlebar and data gets dumped to the console. - `bin/tgui --dev --reload` - reload byond cache once. - `bin/tgui --dev --debug` - run server with debug logging enabled. - `bin/tgui --dev --no-hot` - disable hot module replacement (helps when @@ -134,11 +135,11 @@ logs and time spent on rendering. Use this information to optimize your code, and try to keep re-renders below 16ms. **Kitchen Sink.** -Press `Ctrl+Alt+=` to open the KitchenSink interface. This interface is a +Press `F12` to open the KitchenSink interface. This interface is a playground to test various tgui components. **Layout Debugger.** -Press `Ctrl+Alt+-` to toggle the *layout debugger*. It will show outlines of +Press `F11` to toggle the *layout debugger*. It will show outlines of all tgui elements, which makes it easy to understand how everything comes together, and can reveal certain layout bugs which are not normally visible. diff --git a/tgui/bin/tgui b/tgui/bin/tgui index eb1f200b31..97a86159e6 100644 --- a/tgui/bin/tgui +++ b/tgui/bin/tgui @@ -52,6 +52,7 @@ task-dev-server() { task-eslint() { cd "${base_dir}" eslint ./packages "${@}" + echo "tgui: eslint check passed" } ## Mr. Proper @@ -153,6 +154,13 @@ if [[ ${1} == '--lint-harder' ]]; then exit 0 fi +if [[ ${1} == '--fix' ]]; then + shift 1 + task-install + task-eslint --fix "${@}" + exit 0 +fi + ## Analyze the bundle if [[ ${1} == '--analyze' ]]; then task-install diff --git a/tgui/docs/component-reference.md b/tgui/docs/component-reference.md index b853fee4de..6c10124049 100644 --- a/tgui/docs/component-reference.md +++ b/tgui/docs/component-reference.md @@ -279,7 +279,7 @@ Example (button): @@ -291,7 +291,6 @@ Example (map): ``` @@ -982,6 +981,7 @@ Example: - `className: string` - Applies a CSS class to the element. - `theme: string` - A name of the theme. - For a list of themes, see `packages/tgui/styles/themes`. +- `title: string` - Window title. - `resizable: boolean` - Controls resizability of the window. - `children: any` - Child elements, which are rendered directly inside the window. If you use a [Dimmer](#dimmer) or [Modal](#modal) in your UI, diff --git a/tgui/docs/migration-to-v4-from-v3.md b/tgui/docs/migration-to-v4-from-v3.md new file mode 100644 index 0000000000..6f047a6cc7 --- /dev/null +++ b/tgui/docs/migration-to-v4-from-v3.md @@ -0,0 +1,91 @@ +# tgui Migration Guide to v4 from v3 + +## The Easy Part + +- Copy and replace the following files in bulk: + - `code/__DEFINES/tgui.dm` + - `code/controllers/subsystem/tgui.dm` + - `code/modules/tgui/**` + - `tgui/**` + - Except: `tgui/packages/tgui/interfaces` + - Manually resolve conflicts for files that were touched outside the + `interfaces` folder. +- Copy the updated `log_tgui` proc from: + - `code/__HELPERS/_logging.dm` + +If you have a dual nano/tgui setup, then make sure to rename all ui procs +on `/datum`, such as `ui_interact` to `tgui_interact`, to avoid namespace +clashing. Usual stuff. + +## Update `ui_interact` proc signatures + +First of all, tgui states need to move from `ui_interact` to `ui_state`. + +One way of doing it, is to just cherry pick those procs from upstream. + +If you want to search and replace manually, search for `state = GLOB`, and +extract those things into `ui_state` procs like so: + +```dm +.../ui_state(mob/user) + return GLOB.default_state +``` + +Then reduce `ui_interact` until you finish with something like this: + +```dm +.../ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "FooBar", "Foo Bar UI", 600, 400) + ui.open() +``` + +## Update asset delivery code + +Remove all asset code that injects stylesheets by modifying tgui's `basehtml`. +You no longer need to do that. + +Find all occurences of `asset.send(user)` in `ui_interact`, and refactor those +snippets to the following proc: + +```dm +.../ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/simple/foobar), + ) +``` + +## Check `ui_act` for new bugs + +Code behind `ui_act` was recently refactored to use JSON-encoded payloads +instead of just strings. Since it can now carry numbers and other complex +types, you should check that the code is type agnostic and does not break +due to an assumption that every parameter is a string. + +One of such offenders is the personal crafting interface, where it needlessly +compares parameters to `""` and `"0"`. You can now replace this code with +simple assignments, because an empty category will now be properly `null` +instead of an empty string. + +## Backend data changes + +Interfaces that relied on `config.window.id`, must now use +`window.__windowId__`, which is a global constant unique for the page +the script is running on (so you can be sure it never changes). + +In case of `ByondUi`, this parameter can be completely omitted, because +parent will always default to the current window id. + +Affected interfaces: + +- `CameraConsole` +- Any interface that uses the `ByondUi` component + +--- + +That's all folks! + +There is a lot of stuff that was refactored under the hood, but normal UI +stuff wouldn't and shouldn't touch it, so you should be good with just +going through the checklist above. diff --git a/tgui/docs/tutorial-and-examples.md b/tgui/docs/tutorial-and-examples.md index 08bb6f9232..00d5546d91 100644 --- a/tgui/docs/tutorial-and-examples.md +++ b/tgui/docs/tutorial-and-examples.md @@ -5,10 +5,10 @@ Basic tgui backend code consists of the following vars and procs: ``` -tgui_interact(mob/user, ui_key, datum/tgui/ui, force_open, - datum/tgui/master_ui, datum/tgui_state/state) +tgui_interact(mob/user, ui_key) tgui_data(mob/user) tgui_act(action, params) +tgui_state() ``` - `src_object` - The atom, which UI corresponds to in the game world. @@ -19,9 +19,9 @@ or set up a new instance of UI by calling the `SStgui` subsystem. has into an associative list, which will then be sent to UI as a JSON string. - `tgui_act` - This proc receives user actions and reacts to them by changing the state of the game. -- `tgui_state` (set in `tgui_interact`) - This var dictates under what conditions -a UI may be interacted with. This may be the standard checks that check if -you are in range and conscious, or more. +- `tgui_state` - This proc dictates under what conditions a UI may be interacted +with. This may be the standard checks that check if you are in range and +conscious, or more. Once backend is complete, you create an new interface component on the frontend, which will receive this JSON data and render it on screen. @@ -37,10 +37,10 @@ powerful interactions for embedded objects or remote access. Let's start with a very basic hello world. ```dm -/obj/machinery/my_machine/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) +/obj/machinery/my_machine/tgui_interact(mob/user, datum/tgui/ui = null) + ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, ui_key, "my_machine", name, 300, 300, master_ui, state) + ui = new(user, src, "MyMachine", name) ui.open() ``` @@ -48,9 +48,7 @@ This is the proc that defines our interface. There's a bit going on here, so let's break it down. First, we override the tgui_interact proc on our object. This will be called by `interact` for you, which is in turn called by `attack_hand` (or `attack_self` for items). `tgui_interact` is also called to update a UI (hence -the `try_update_ui`), so we accept an existing UI to update. The `state` is a -default argument so that a caller can overload it with named arguments -(`tgui_interact(state = overloaded_state)`) if needed. +the `try_update_ui`), so we accept an existing UI to update. Inside the `if(!ui)` block (which means we are creating a new UI), we choose our template, title, and size; we can also set various options like `style` (for @@ -294,10 +292,10 @@ here's what you need (note that you'll probably be forced to clean your shit up upon code review): ```dm -/obj/copypasta/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) // Remember to use the appropriate state. - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) +/obj/copypasta/tgui_interact(mob/user, datum/tgui/ui = null) + ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, ui_key, "copypasta", name, 300, 300, master_ui, state) + ui = new(user, src, "CopyPasta") ui.open() /obj/copypasta/tgui_data(mob/user) diff --git a/tgui/package.json b/tgui/package.json index bfceeec49e..8dd15925b2 100644 --- a/tgui/package.json +++ b/tgui/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "babel-eslint": "^10.0.3", - "eslint": "^6.7.2", + "eslint": "^7.4.0", "eslint-plugin-react": "^7.17.0" } } diff --git a/tgui/packages/common/perf.js b/tgui/packages/common/perf.js new file mode 100644 index 0000000000..319b77cea3 --- /dev/null +++ b/tgui/packages/common/perf.js @@ -0,0 +1,44 @@ +/** + * Ghetto performance measurement tools. + * + * Uses NODE_ENV to redact itself from production bundles. + * + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + +let markersByLabel = {}; + +/** + * Marks a certain spot in the code for later measurements. + */ +const mark = (label, timestamp) => { + if (process.env.NODE_ENV !== 'production') { + markersByLabel[label] = timestamp || Date.now(); + } +}; + +/** + * Calculates and returns the difference between two markers as a string. + * + * Use logger.log() to print the measurement. + */ +const measure = (markerA, markerB) => { + if (process.env.NODE_ENV !== 'production') { + return timeDiff( + markersByLabel[markerA], + markersByLabel[markerB]); + } +}; + +const timeDiff = (startedAt, finishedAt) => { + const diff = Math.abs(finishedAt - startedAt); + const diffFrames = (diff / 16.6667).toFixed(2); + return `${diff}ms (${diffFrames} frames)`; +}; + +export const perf = { + mark, + measure, +}; diff --git a/tgui/packages/common/redux.js b/tgui/packages/common/redux.js index 257a9eebf5..dc486ff7b8 100644 --- a/tgui/packages/common/redux.js +++ b/tgui/packages/common/redux.js @@ -1,3 +1,9 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + import { compose } from './fp'; /** @@ -63,3 +69,31 @@ export const applyMiddleware = (...middlewares) => { }; }; }; + +/** + * Combines reducers by running them in their own object namespaces as + * defined in reducersObj paramter. + * + * Main difference from redux/combineReducers is that it preserves keys + * in the state that are not present in the reducers object. This function + * is also more flexible than the redux counterpart. + */ +export const combineReducers = reducersObj => { + const keys = Object.keys(reducersObj); + let hasChanged = false; + return (prevState, action) => { + const nextState = { ...prevState }; + for (let key of keys) { + const reducer = reducersObj[key]; + const prevDomainState = prevState[key]; + const nextDomainState = reducer(prevDomainState, action); + if (prevDomainState !== nextDomainState) { + hasChanged = true; + nextState[key] = nextDomainState; + } + } + return hasChanged + ? nextState + : prevState; + }; +}; diff --git a/tgui/packages/common/storage.js b/tgui/packages/common/storage.js new file mode 100644 index 0000000000..bcb010e77a --- /dev/null +++ b/tgui/packages/common/storage.js @@ -0,0 +1,64 @@ +/** + * Browser-agnostic abstraction of key-value web storage. + * + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + +export const STORAGE_NONE = 0; +export const STORAGE_LOCAL_STORAGE = 1; +export const STORAGE_INDEXED_DB = 2; + +const createMock = () => { + let storage = {}; + const get = key => storage[key]; + const set = (key, value) => { + storage[key] = value; + }; + const remove = key => { + storage[key] = undefined; + }; + const clear = () => { + // NOTE: On IE8, this will probably leak memory if used often. + storage = {}; + }; + return { + get, + set, + remove, + clear, + engine: STORAGE_NONE, + }; +}; + +const createLocalStorage = () => { + const get = key => { + const value = localStorage.getItem(key); + if (typeof value !== 'string') { + return; + } + return JSON.parse(value); + }; + const set = (key, value) => { + localStorage.setItem(key, JSON.stringify(value)); + }; + const remove = key => { + localStorage.removeItem(key); + }; + const clear = () => { + localStorage.clear(); + }; + return { + get, + set, + remove, + clear, + engine: STORAGE_LOCAL_STORAGE, + }; +}; + +export const storage = ( + window.localStorage && createLocalStorage() + || createMock() +); diff --git a/tgui/packages/common/vector.js b/tgui/packages/common/vector.js index fa98597896..c3ac350a4e 100644 --- a/tgui/packages/common/vector.js +++ b/tgui/packages/common/vector.js @@ -1,14 +1,14 @@ -import { map, reduce, zipWith } from './collections'; - /** - * Creates a vector, with as many dimensions are there are arguments. + * N-dimensional vector manipulation functions. + * + * Vectors are plain number arrays, i.e. [x, y, z]. + * + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT */ -export const vecCreate = (...components) => { - if (Array.isArray(components[0])) { - return [...components[0]]; - } - return components; -}; + +import { map, reduce, zipWith } from './collections'; const ADD = (a, b) => a + b; const SUB = (a, b) => a - b; diff --git a/tgui/packages/tgui/assets.js b/tgui/packages/tgui/assets.js new file mode 100644 index 0000000000..2023a5c884 --- /dev/null +++ b/tgui/packages/tgui/assets.js @@ -0,0 +1,23 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + +import { loadCSS as fgLoadCSS } from 'fg-loadcss'; +import { createLogger } from './logging'; + +const logger = createLogger('assets'); + +const loadedAssets = { + styles: [], +}; + +export const loadCSS = filename => { + if (loadedAssets.styles.includes(filename)) { + return; + } + loadedAssets.styles.push(filename); + logger.log(`loading stylesheet '${filename}'`); + fgLoadCSS(filename); +}; diff --git a/tgui/packages/tgui/backend.js b/tgui/packages/tgui/backend.js index ed0d942862..2c9bd09372 100644 --- a/tgui/packages/tgui/backend.js +++ b/tgui/packages/tgui/backend.js @@ -5,10 +5,18 @@ * Sometimes backend can response without a "data" field, but our final * state will still contain previous "data" because we are merging * the response with already existing state. + * + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT */ +import { perf } from 'common/perf'; import { UI_DISABLED, UI_INTERACTIVE } from './constants'; -import { callByond } from './byond'; +import { releaseHeldKeys } from './hotkeys'; +import { createLogger } from './logging'; + +const logger = createLogger('backend'); export const backendUpdate = state => ({ type: 'backend/update', @@ -20,7 +28,23 @@ export const backendSetSharedState = (key, nextState) => ({ payload: { key, nextState }, }); -export const backendReducer = (state, action) => { +export const backendSuspendStart = () => ({ + type: 'backend/suspendStart', +}); + +export const backendSuspendSuccess = () => ({ + type: 'backend/suspendSuccess', + payload: { + timestamp: Date.now(), + }, +}); + +const initialState = { + config: {}, + data: {}, +}; + +export const backendReducer = (state = initialState, action) => { const { type, payload } = action; if (type === 'backend/update') { @@ -55,10 +79,12 @@ export const backendReducer = (state, action) => { return { ...state, config, + assets: payload.assets || {}, data, shared, visible, interactive, + suspended: false, }; } @@ -73,29 +99,176 @@ export const backendReducer = (state, action) => { }; } + if (type === 'backend/suspendStart') { + return { + ...state, + suspending: true, + }; + } + + if (type === 'backend/suspendSuccess') { + const { timestamp } = payload; + return { + ...state, + data: {}, + shared: {}, + config: { + ...state.config, + title: '', + status: 1, + }, + suspending: false, + suspended: timestamp, + }; + } + return state; }; +export const backendMiddleware = store => { + let fancyState; + let suspendInterval; + + return next => action => { + const { config, suspended } = selectBackend(store.getState()); + const { type, payload } = action; + + if (type === 'backend/suspendStart' && !suspendInterval) { + logger.log(`suspending (${window.__windowId__})`); + // Keep sending suspend messages until it succeeds. + // It may fail multiple times due to topic rate limiting. + const suspendFn = () => sendMessage({ + type: 'suspend', + }); + suspendFn(); + suspendInterval = setInterval(suspendFn, 2000); + } + + if (type === 'backend/suspendSuccess') { + clearInterval(suspendInterval); + suspendInterval = undefined; + releaseHeldKeys(); + Byond.winset(window.__windowId__, { + 'is-visible': false, + }); + } + + if (type === 'backend/update') { + const fancy = payload.config?.window?.fancy; + // Initialize fancy state + if (fancyState === undefined) { + fancyState = fancy; + } + // React to changes in fancy + else if (fancyState !== fancy) { + logger.log('changing fancy mode to', fancy); + fancyState = fancy; + Byond.winset(window.__windowId__, { + titlebar: !fancy, + 'can-resize': !fancy, + }); + } + } + + if (type === 'backend/update' && suspended) { + // We schedule this for the next tick here because resizing and unhiding + // during the same tick will flash with a white background. + setImmediate(() => { + perf.mark('resume/start'); + // Doublecheck if we are not re-suspended. + const { suspended } = selectBackend(store.getState()); + if (suspended) { + return; + } + Byond.winset(window.__windowId__, { + 'is-visible': true, + }); + perf.mark('resume/finish'); + if (process.env.NODE_ENV !== 'production') { + logger.log('visible in', + perf.measure('render/finish', 'resume/finish')); + } + }); + } + + return next(action); + }; +}; + +/** + * Sends a message to /datum/tgui_window. + */ +export const sendMessage = (message = {}) => { + const { payload, ...rest } = message; + const data = { + // Message identifying header + tgui: 1, + window_id: window.__windowId__, + // Message body + ...rest, + }; + // JSON-encode the payload + if (payload !== null && payload !== undefined) { + data.payload = JSON.stringify(payload); + } + Byond.topic(data); +}; + +/** + * Sends an action to `ui_act` on `src_object` that this tgui window + * is associated with. + */ +export const sendAct = (action, payload = {}) => { + // Validate that payload is an object + const isObject = typeof payload === 'object' + && payload !== null + && !Array.isArray(payload); + if (!isObject) { + logger.error(`Payload for act() must be an object, got this:`, payload); + return; + } + sendMessage({ + type: 'act/' + action, + payload, + }); +}; + /** * @typedef BackendState * @type {{ * config: { * title: string, * status: number, - * screen: string, - * style: string, * interface: string, - * fancy: number, - * observer: number, - * window: string, - * ref: string, + * user: { + * name: string, + * ckey: string, + * observer: number, + * }, + * window: { + * key: string, + * size: [number, number], + * fancy: boolean, + * locked: boolean, + * }, * }, * data: any, + * assets: any, + * shared: any, * visible: boolean, * interactive: boolean, + * suspending: boolean, + * suspended: boolean, * }} */ +/** + * Selects a backend-related slice of Redux state + * + * @return {BackendState} + */ +export const selectBackend = state => state.backend || {}; + /** * A React hook (sort of) for getting tgui state and related functions. * @@ -103,21 +276,16 @@ export const backendReducer = (state, action) => { * be used in functional components. * * @return {BackendState & { - * act: (action: string, params?: object) => void, + * act: sendAct, * }} */ export const useBackend = context => { const { store } = context; - const state = store.getState(); - const ref = state.config.ref; - const act = (action, params = {}) => { - callByond('', { - src: ref, - action, - ...params, - }); + const state = selectBackend(store.getState()); + return { + ...state, + act: sendAct, }; - return { ...state, act }; }; /** @@ -135,7 +303,7 @@ export const useBackend = context => { */ export const useLocalState = (context, key, initialState) => { const { store } = context; - const state = store.getState(); + const state = selectBackend(store.getState()); const sharedStates = state.shared ?? {}; const sharedState = (key in sharedStates) ? sharedStates[key] @@ -143,7 +311,11 @@ export const useLocalState = (context, key, initialState) => { return [ sharedState, nextState => { - store.dispatch(backendSetSharedState(key, nextState)); + store.dispatch(backendSetSharedState(key, ( + typeof nextState === 'function' + ? nextState(sharedState) + : nextState + ))); }, ]; }; @@ -164,8 +336,7 @@ export const useLocalState = (context, key, initialState) => { */ export const useSharedState = (context, key, initialState) => { const { store } = context; - const state = store.getState(); - const ref = state.config.ref; + const state = selectBackend(store.getState()); const sharedStates = state.shared ?? {}; const sharedState = (key in sharedStates) ? sharedStates[key] @@ -173,11 +344,14 @@ export const useSharedState = (context, key, initialState) => { return [ sharedState, nextState => { - callByond('', { - src: ref, - action: 'tgui:setSharedState', + sendMessage({ + type: 'setSharedState', key, - value: JSON.stringify(nextState) || '', + value: JSON.stringify( + typeof nextState === 'function' + ? nextState(sharedState) + : nextState + ) || '', }); }, ]; diff --git a/tgui/packages/tgui/byond.js b/tgui/packages/tgui/byond.js deleted file mode 100644 index bd70056613..0000000000 --- a/tgui/packages/tgui/byond.js +++ /dev/null @@ -1,88 +0,0 @@ -// Reference a global Byond object -const { Byond } = window; - -/** - * Version of Trident engine used in Internet Explorer. - * An integer number or `null` if this is not a trident engine. - * - * - IE 8 - Trident 4.0 - * - IE 11 - Trident 7.0 - */ -const tridentVersion = (() => { - const groups = navigator.userAgent.match(/Trident\/(\d+).+?;/i); - if (!groups) { - return null; - } - const majorVersion = groups[1]; - if (!majorVersion) { - return null; - } - return parseInt(majorVersion, 10); -})(); - -/** - * True if browser is an Internet Explorer 8 or lower. - * - * (Actually, no, it also includes IE9 and IE10). - */ -export const IS_IE8 = tridentVersion !== null - && tridentVersion <= 6; - -/** - * Makes a BYOND call. - * - * If path is empty, this will trigger a Topic call. - * You can reference a specific object by setting the "src" parameter. - * - * See: https://secure.byond.com/docs/ref/skinparams.html - */ -export const callByond = (path, params = {}) => { - Byond.call(path, params); -}; - -/** - * A high-level abstraction of BYOND calls. Makes a BYOND call and returns - * a promise, which (if endpoint has a callback parameter) resolves - * with the return value of that call. - */ -export const callByondAsync = (path, params = {}) => { - // Create a callback array if it doesn't exist yet - window.__callbacks__ = window.__callbacks__ || []; - // Create a Promise and push its resolve function into callback array - const callbackIndex = window.__callbacks__.length; - const promise = new Promise(resolve => { - // TODO: Fix a potential memory leak - window.__callbacks__.push(resolve); - }); - // Call BYOND client - Byond.call(path, { - ...params, - callback: `__callbacks__[${callbackIndex}]`, - }); - return promise; -}; - -/** - * Runs a BYOND skin command - * - * See: https://secure.byond.com/docs/ref/skinparams.html - */ -export const runCommand = command => callByond('winset', { command }); - -/** - * Calls 'winget' on a BYOND skin element, retrieving value by the 'key'. - */ -export const winget = async (id, key) => { - const obj = await callByondAsync('winget', { - id, - property: key, - }); - return obj[key]; -}; - -/** - * Calls 'winset' on a BYOND skin element, setting 'key' to 'value'. - */ -export const winset = (id, key, value) => callByond('winset', { - [`${id}.${key}`]: value, -}); diff --git a/tgui/packages/tgui/components/Button.js b/tgui/packages/tgui/components/Button.js index e517245343..bb8b4bcbf0 100644 --- a/tgui/packages/tgui/components/Button.js +++ b/tgui/packages/tgui/components/Button.js @@ -1,6 +1,11 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + import { classes, pureComponentHooks } from 'common/react'; import { Component, createRef } from 'inferno'; -import { IS_IE8 } from '../byond'; import { KEY_ENTER, KEY_ESCAPE, KEY_SPACE } from '../hotkeys'; import { refocusLayout } from '../layouts'; import { createLogger } from '../logging'; @@ -55,7 +60,7 @@ export const Button = props => { className, ])} tabIndex={!disabled && '0'} - unselectable={IS_IE8} + unselectable={Byond.IS_LTE_IE8} onclick={e => { refocusLayout(); if (!disabled && onClick) { @@ -81,7 +86,10 @@ export const Button = props => { }} {...rest}> {icon && ( - + )} {content} {children} diff --git a/tgui/packages/tgui/components/ByondUi.js b/tgui/packages/tgui/components/ByondUi.js index abd60bdcfe..2369cc7993 100644 --- a/tgui/packages/tgui/components/ByondUi.js +++ b/tgui/packages/tgui/components/ByondUi.js @@ -1,7 +1,12 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + import { shallowDiffers } from 'common/react'; import { debounce } from 'common/timer'; import { Component, createRef } from 'inferno'; -import { callByond, IS_IE8 } from '../byond'; import { createLogger } from '../logging'; import { computeBoxProps } from './Box'; @@ -22,16 +27,12 @@ const createByondUiElement = elementId => { render: params => { logger.log(`rendering '${id}'`); byondUiStack[index] = id; - callByond('winset', { - ...params, - id, - }); + Byond.winset(id, params); }, unmount: () => { logger.log(`unmounting '${id}'`); byondUiStack[index] = null; - callByond('winset', { - id, + Byond.winset(id, { parent: '', }); }, @@ -45,8 +46,7 @@ window.addEventListener('beforeunload', () => { if (typeof id === 'string') { logger.log(`unmounting '${id}' (beforeunload)`); byondUiStack[index] = null; - callByond('winset', { - id, + Byond.winset(id, { parent: '', }); } @@ -77,7 +77,7 @@ export class ByondUi extends Component { this.byondUiElement = createByondUiElement(props.params?.id); this.handleResize = debounce(() => { this.forceUpdate(); - }, 500); + }, 100); } shouldComponentUpdate(nextProps) { @@ -95,16 +95,17 @@ export class ByondUi extends Component { componentDidMount() { // IE8: It probably works, but fuck you anyway. - if (IS_IE8) { + if (Byond.IS_LTE_IE10) { return; } window.addEventListener('resize', this.handleResize); - return this.componentDidUpdate(); + this.componentDidUpdate(); + this.handleResize(); } componentDidUpdate() { // IE8: It probably works, but fuck you anyway. - if (IS_IE8) { + if (Byond.IS_LTE_IE10) { return; } const { @@ -113,6 +114,7 @@ export class ByondUi extends Component { const box = getBoundingBox(this.containerRef.current); logger.log('bounding box', box); this.byondUiElement.render({ + parent: window.__windowId__, ...params, pos: box.pos[0] + ',' + box.pos[1], size: box.size[0] + 'x' + box.size[1], @@ -121,7 +123,7 @@ export class ByondUi extends Component { componentWillUnmount() { // IE8: It probably works, but fuck you anyway. - if (IS_IE8) { + if (Byond.IS_LTE_IE10) { return; } window.removeEventListener('resize', this.handleResize); @@ -129,26 +131,16 @@ export class ByondUi extends Component { } render() { - const { - parent, - params, - ...rest - } = this.props; + const { params, ...rest } = this.props; const type = params?.type; const boxProps = computeBoxProps(rest); return (
- {type === 'button' && } + {/* Filler */} +
); } } - -const ButtonMock = () => ( -
-); diff --git a/tgui/packages/tgui/components/Chart.js b/tgui/packages/tgui/components/Chart.js index 2f5ad2aedd..77913779db 100644 --- a/tgui/packages/tgui/components/Chart.js +++ b/tgui/packages/tgui/components/Chart.js @@ -1,7 +1,12 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + import { map, zipWith } from 'common/collections'; import { pureComponentHooks } from 'common/react'; import { Component, createRef } from 'inferno'; -import { IS_IE8 } from '../byond'; import { Box } from './Box'; const normalizeData = (data, scale, rangeX, rangeY) => { @@ -117,5 +122,5 @@ const Stub = props => null; // IE8: No inline svg support export const Chart = { - Line: IS_IE8 ? Stub : LineChart, + Line: Byond.IS_LTE_IE8 ? Stub : LineChart, }; diff --git a/tgui/packages/tgui/components/Flex.js b/tgui/packages/tgui/components/Flex.js index e63051438f..02d2fac314 100644 --- a/tgui/packages/tgui/components/Flex.js +++ b/tgui/packages/tgui/components/Flex.js @@ -1,5 +1,10 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + import { classes, pureComponentHooks } from 'common/react'; -import { IS_IE8 } from '../byond'; import { Box, unit } from './Box'; export const computeFlexProps = props => { @@ -16,10 +21,10 @@ export const computeFlexProps = props => { return { className: classes([ 'Flex', - IS_IE8 && ( + Byond.IS_LTE_IE10 && ( direction === 'column' - ? 'Flex--ie8--column' - : 'Flex--ie8' + ? 'Flex--iefix--column' + : 'Flex--iefix' ), inline && 'Flex--inline', spacing > 0 && 'Flex--spacing--' + spacing, @@ -57,7 +62,7 @@ export const computeFlexItemProps = props => { return { className: classes([ 'Flex__item', - IS_IE8 && 'Flex__item--ie8', + Byond.IS_LTE_IE10 && 'Flex__item--iefix', className, ]), style: { diff --git a/tgui/packages/tgui/components/Knob.js b/tgui/packages/tgui/components/Knob.js index 501308aea8..4861e71bf3 100644 --- a/tgui/packages/tgui/components/Knob.js +++ b/tgui/packages/tgui/components/Knob.js @@ -1,6 +1,11 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + import { keyOfMatchingRange, scale } from 'common/math'; import { classes } from 'common/react'; -import { IS_IE8 } from '../byond'; import { computeBoxClassName, computeBoxProps } from './Box'; import { DraggableControl } from './DraggableControl'; import { NumberInput } from './NumberInput'; @@ -8,7 +13,7 @@ import { NumberInput } from './NumberInput'; export const Knob = props => { // IE8: I don't want to support a yet another component on IE8. // IE8: It also can't handle SVG. - if (IS_IE8) { + if (Byond.IS_LTE_IE8) { return ( ); diff --git a/tgui/packages/tgui/components/NumberInput.js b/tgui/packages/tgui/components/NumberInput.js index 99ad01a747..cba6f5025e 100644 --- a/tgui/packages/tgui/components/NumberInput.js +++ b/tgui/packages/tgui/components/NumberInput.js @@ -1,7 +1,12 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + import { clamp } from 'common/math'; import { classes, pureComponentHooks } from 'common/react'; import { Component, createRef } from 'inferno'; -import { IS_IE8 } from '../byond'; import { AnimatedNumber } from './AnimatedNumber'; import { Box } from './Box'; @@ -162,7 +167,7 @@ export class NumberInput extends Component { const renderContentElement = value => (
+ unselectable={Byond.IS_LTE_IE8}> {value + (unit ? ' ' + unit : '')}
); diff --git a/tgui/packages/tgui/components/Section.js b/tgui/packages/tgui/components/Section.js index a9e60a54d9..af59bc4022 100644 --- a/tgui/packages/tgui/components/Section.js +++ b/tgui/packages/tgui/components/Section.js @@ -1,5 +1,11 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + import { classes, isFalsy, pureComponentHooks } from 'common/react'; -import { Box } from './Box'; +import { computeBoxClassName, computeBoxProps } from './Box'; export const Section = props => { const { @@ -7,20 +13,22 @@ export const Section = props => { title, level = 1, buttons, - content, + fill, children, ...rest } = props; const hasTitle = !isFalsy(title) || !isFalsy(buttons); - const hasContent = !isFalsy(content) || !isFalsy(children); + const hasContent = !isFalsy(children); return ( - + {...computeBoxProps(rest)}> {hasTitle && (
@@ -33,11 +41,10 @@ export const Section = props => { )} {hasContent && (
- {content} {children}
)} - +
); }; diff --git a/tgui/packages/tgui/components/Slider.js b/tgui/packages/tgui/components/Slider.js index 55ae4ba6c1..005e6c1f8f 100644 --- a/tgui/packages/tgui/components/Slider.js +++ b/tgui/packages/tgui/components/Slider.js @@ -1,13 +1,18 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + import { clamp01, keyOfMatchingRange, scale } from 'common/math'; import { classes } from 'common/react'; -import { IS_IE8 } from '../byond'; import { computeBoxClassName, computeBoxProps } from './Box'; import { DraggableControl } from './DraggableControl'; import { NumberInput } from './NumberInput'; export const Slider = props => { // IE8: I don't want to support a yet another component on IE8. - if (IS_IE8) { + if (Byond.IS_LTE_IE8) { return ( ); diff --git a/tgui/packages/tgui/components/index.js b/tgui/packages/tgui/components/index.js index 888c852ca5..0d2b2ddab6 100644 --- a/tgui/packages/tgui/components/index.js +++ b/tgui/packages/tgui/components/index.js @@ -8,6 +8,7 @@ export { Collapsible } from './Collapsible'; export { ColorBox } from './ColorBox'; export { Dimmer } from './Dimmer'; export { Divider } from './Divider'; +export { DraggableControl } from './DraggableControl'; export { Dropdown } from './Dropdown'; export { Flex } from './Flex'; export { Grid } from './Grid'; diff --git a/tgui/packages/tgui/interfaces/manually-routed/KitchenSink.js b/tgui/packages/tgui/debug/KitchenSink.js similarity index 63% rename from tgui/packages/tgui/interfaces/manually-routed/KitchenSink.js rename to tgui/packages/tgui/debug/KitchenSink.js index fcca031fe9..050adcf193 100644 --- a/tgui/packages/tgui/interfaces/manually-routed/KitchenSink.js +++ b/tgui/packages/tgui/debug/KitchenSink.js @@ -1,10 +1,19 @@ -import { Fragment } from 'inferno'; -import { useBackend, useLocalState } from '../../backend'; -import { BlockQuote, Box, Button, ByondUi, Collapsible, Flex, Icon, Input, Knob, LabeledList, NumberInput, ProgressBar, Section, Slider, Tabs, Tooltip } from '../../components'; -import { DraggableControl } from '../../components/DraggableControl'; -import { Window } from '../../layouts'; +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ -const COLORS_ARBITRARY = [ +import { Fragment } from 'inferno'; +import { useBackend, useLocalState } from '../backend'; +import { BlockQuote, Box, Button, ByondUi, Collapsible, DraggableControl, Flex, Icon, Input, Knob, LabeledList, NoticeBox, NumberInput, ProgressBar, Section, Slider, Tabs, Tooltip } from '../components'; +import { formatSiUnit } from '../format'; +import { Window } from '../layouts'; +import { createLogger } from '../logging'; + +const logger = createLogger('KitchenSink'); + +const COLORS_SPECTRUM = [ 'red', 'orange', 'yellow', @@ -36,6 +45,10 @@ const PAGES = [ title: 'Box', component: () => KitchenSinkBox, }, + { + title: 'Flex & Sections', + component: () => KitchenSinkFlexAndSections, + }, { title: 'ProgressBar', component: () => KitchenSinkProgressBar, @@ -68,6 +81,10 @@ const PAGES = [ title: 'Themes', component: () => KitchenSinkThemes, }, + { + title: 'Storage', + component: () => KitchenSinkStorage, + }, ]; export const KitchenSink = (props, context) => { @@ -76,36 +93,41 @@ export const KitchenSink = (props, context) => { const PageComponent = PAGES[pageIndex].component(); return ( - -
- - - - {PAGES.map((page, i) => ( - setPageIndex(i)}> - {page.title} - - ))} - - - - - - -
-
+ + +
+ {PAGES.map((page, i) => ( + + ))} +
+
+ + + + + +
); }; const KitchenSinkButton = props => { return ( - +
); }; const KitchenSinkBox = props => { return ( - +
bold @@ -177,7 +199,74 @@ const KitchenSinkBox = props => { right - +
+ ); +}; + +const KitchenSinkFlexAndSections = (props, context) => { + const [grow, setGrow] = useLocalState( + context, 'fs_grow', 1); + const [direction, setDirection] = useLocalState( + context, 'fs_direction', 'column'); + const [fill, setFill] = useLocalState( + context, 'fs_fill', true); + const [hasTitle, setHasTitle] = useLocalState( + context, 'fs_title', true); + return ( + + +
+ + + + +
+
+ + + +
+ Content +
+
+ +
+ Content +
+
+
+
+
); }; @@ -186,9 +275,8 @@ const KitchenSinkProgressBar = (props, context) => { progress, setProgress, ] = useLocalState(context, 'progress', 0.5); - return ( - +
{ content="+0.1" onClick={() => setProgress(progress + 0.1)} /> - +
); }; @@ -218,7 +306,7 @@ const KitchenSinkTabs = (props, context) => { const [altSelection, setAltSelection] = useLocalState(context, 'tabAlt'); const TAB_RANGE = [1, 2, 3, 4, 5]; return ( - +
{ ))} - +
); }; @@ -256,7 +344,7 @@ const KitchenSinkTooltip = props => { 'bottom-right', ]; return ( - +
Box (hover me). @@ -276,7 +364,7 @@ const KitchenSinkTooltip = props => { content={position} /> ))} - +
); }; @@ -285,14 +373,12 @@ const KitchenSinkInput = (props, context) => { number, setNumber, ] = useLocalState(context, 'number', 0); - const [ text, setText, ] = useLocalState(context, 'text', "Sample text"); - return ( - +
{ - +
); }; const KitchenSinkCollapsible = props => { return ( - - )}> -
+
+ + )}> -
- + +
); }; @@ -416,34 +502,67 @@ const BoxWithSampleText = props => { const KitchenSinkBlockQuote = props => { return ( -
- -
+
+
+ +
+
); }; const KitchenSinkByondUi = (props, context) => { const { config } = useBackend(context); + const [code, setCode] = useLocalState(context, + 'byondUiEvalCode', + `Byond.winset('${window.__windowId__}', {\n 'is-visible': true,\n})`); return ( - -
+ +
- +
setImmediate(() => { + try { + const result = new Function('return (' + code + ')')(); + if (result && result.then) { + logger.log('Promise'); + result.then(logger.log); + } + else { + logger.log(result); + } + } + catch (err) { + logger.log(err); + } + })}> + Evaluate + + )}> + setCode(e.target.value)}> + {code} + +
+
); }; const KitchenSinkThemes = (props, context) => { const [theme, setTheme] = useLocalState(context, 'kitchenSinkTheme'); return ( - +
{ onInput={(e, value) => setTheme(value)} /> - +
+ ); +}; + +const KitchenSinkStorage = (props, context) => { + if (!window.localStorage) { + return ( + + Local storage is not available. + + ); + } + return ( +
{ + localStorage.clear(); + }}> + Clear + + )}> + + + {localStorage.length} + + + {formatSiUnit(localStorage.remainingSpace, 0, 'B')} + + +
); }; diff --git a/tgui/packages/tgui/debug/index.js b/tgui/packages/tgui/debug/index.js new file mode 100644 index 0000000000..83fc136548 --- /dev/null +++ b/tgui/packages/tgui/debug/index.js @@ -0,0 +1,49 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + +import { subscribeToHotKey } from '../hotkeys'; + +export const toggleKitchenSink = () => ({ + type: 'debug/toggleKitchenSink', +}); + +export const toggleDebugLayout = () => ({ + type: 'debug/toggleDebugLayout', +}); + +subscribeToHotKey('F11', () => toggleDebugLayout()); +subscribeToHotKey('F12', () => toggleKitchenSink()); +subscribeToHotKey('Ctrl+Alt+[8]', () => { + // NOTE: We need to call this in a timeout, because we need a clean + // stack in order for this to be a fatal error. + setTimeout(() => { + throw new Error( + 'OOPSIE WOOPSIE!! UwU We made a fucky wucky!! A wittle' + + ' fucko boingo! The code monkeys at our headquarters are' + + ' working VEWY HAWD to fix this!'); + }); +}); + +export const selectDebug = state => state.debug; + +export const useDebug = context => selectDebug(context.store.getState()); + +export const debugReducer = (state = {}, action) => { + const { type, payload } = action; + if (type === 'debug/toggleKitchenSink') { + return { + ...state, + kitchenSink: !state.kitchenSink, + }; + } + if (type === 'debug/toggleDebugLayout') { + return { + ...state, + debugLayout: !state.debugLayout, + }; + } + return state; +}; diff --git a/tgui/packages/tgui/drag.js b/tgui/packages/tgui/drag.js index a29146b796..99db716410 100644 --- a/tgui/packages/tgui/drag.js +++ b/tgui/packages/tgui/drag.js @@ -1,76 +1,174 @@ -import { vecAdd, vecInverse, vecMultiply } from 'common/vector'; -import { winget, winset } from './byond'; +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + +import { storage } from 'common/storage'; +import { vecAdd, vecInverse, vecMultiply, vecScale } from 'common/vector'; import { createLogger } from './logging'; const logger = createLogger('drag'); -let ref; +let windowKey = window.__windowId__; let dragging = false; let resizing = false; let screenOffset = [0, 0]; +let screenOffsetPromise; let dragPointOffset; let resizeMatrix; let initialSize; let size; -const getWindowPosition = ref => { - return winget(ref, 'pos').then(pos => [pos.x, pos.y]); +export const setWindowKey = key => { + windowKey = key; }; -const setWindowPosition = (ref, vec) => { - return winset(ref, 'pos', vec[0] + ',' + vec[1]); +export const getWindowPosition = () => [ + window.screenLeft, + window.screenTop, +]; + +export const getWindowSize = () => [ + window.innerWidth, + window.innerHeight, +]; + +export const setWindowPosition = vec => { + const byondPos = vecAdd(vec, screenOffset); + return Byond.winset(window.__windowId__, { + pos: byondPos[0] + ',' + byondPos[1], + }); }; -const setWindowSize = (ref, vec) => { - return winset(ref, 'size', vec[0] + ',' + vec[1]); +export const setWindowSize = vec => { + return Byond.winset(window.__windowId__, { + size: vec[0] + 'x' + vec[1], + }); }; -export const setupDrag = async state => { - logger.log('setting up'); - ref = state.config.window; - // Calculate offset caused by windows taskbar - const realPosition = await getWindowPosition(ref); - screenOffset = [ - realPosition[0] - window.screenLeft, - realPosition[1] - window.screenTop, - ]; - // Constraint window position - const [relocated, safePosition] = constraintPosition(realPosition); - if (relocated) { - setWindowPosition(ref, safePosition); +export const getScreenPosition = () => [ + 0 - screenOffset[0], + 0 - screenOffset[1], +]; + +export const getScreenSize = () => [ + window.screen.availWidth, + window.screen.availHeight, +]; + +/** + * Moves an item to the top of the recents array, and keeps its length + * limited to the number in `limit` argument. + * + * Uses a strict equality check for comparisons. + * + * Returns new recents and an item which was trimmed. + */ +const touchRecents = (recents, touchedItem, limit = 50) => { + const nextRecents = [touchedItem]; + let trimmedItem; + for (let i = 0; i < recents.length; i++) { + const item = recents[i]; + if (item === touchedItem) { + continue; + } + if (nextRecents.length < limit) { + nextRecents.push(item); + } + else { + trimmedItem = item; + } } - logger.debug('current state', { ref, screenOffset }); + return [nextRecents, trimmedItem]; +}; + +export const storeWindowGeometry = windowKey => { + logger.log('storing geometry'); + const geometry = { + pos: getWindowPosition(), + size: getWindowSize(), + }; + storage.set(windowKey, geometry); + // Update the list of stored geometries + const [geometries, trimmedKey] = touchRecents( + storage.get('geometries') || [], + windowKey); + if (trimmedKey) { + storage.remove(trimmedKey); + } + storage.set('geometries', geometries); +}; + +export const recallWindowGeometry = async (windowKey, options = {}) => { + // Only recall geometry in fancy mode + const geometry = options.fancy && storage.get(windowKey); + if (geometry) { + logger.log('recalled geometry:', geometry); + } + let pos = geometry?.pos || options.pos; + const size = options.size; + // Set window size + if (size) { + setWindowSize(size); + } + // Set window position + if (pos) { + await screenOffsetPromise; + // Constraint window position if monitor lock was set in preferences. + if (size && options.locked) { + pos = constraintPosition(pos, size)[1]; + } + setWindowPosition(pos); + } + // Set window position at the center of the screen. + else if (size) { + await screenOffsetPromise; + const areaAvailable = [ + window.screen.availWidth - Math.abs(screenOffset[0]), + window.screen.availHeight - Math.abs(screenOffset[1]), + ]; + const pos = vecAdd( + vecScale(areaAvailable, 0.5), + vecScale(size, -0.5), + vecScale(screenOffset, -1.0)); + setWindowPosition(pos); + } +}; + +export const setupDrag = async () => { + // Calculate screen offset caused by the windows taskbar + screenOffsetPromise = Byond.winget(window.__windowId__, 'pos') + .then(pos => [ + pos.x - window.screenLeft, + pos.y - window.screenTop, + ]); + screenOffset = await screenOffsetPromise; + logger.debug('screen offset', screenOffset); }; /** * Constraints window position to safe screen area, accounting for safe * margins which could be a system taskbar. */ -const constraintPosition = position => { - let x = position[0]; - let y = position[1]; +const constraintPosition = (pos, size) => { + const screenPos = getScreenPosition(); + const screenSize = getScreenSize(); + const nextPos = [pos[0], pos[1]]; let relocated = false; - // Left - if (x < 0) { - x = 0; - relocated = true; + for (let i = 0; i < 2; i++) { + const leftBoundary = screenPos[i]; + const rightBoundary = screenPos[i] + screenSize[i]; + if (pos[i] < leftBoundary) { + nextPos[i] = leftBoundary; + relocated = true; + } + else if (pos[i] + size[i] > rightBoundary) { + nextPos[i] = rightBoundary - size[i]; + relocated = true; + } } - // Right - else if (x + window.innerWidth > window.screen.availWidth) { - x = window.screen.availWidth - window.innerWidth; - relocated = true; - } - // Top - if (y < 0) { - y = 0; - relocated = true; - } - // Bottom - else if (y + window.innerHeight > window.screen.availHeight) { - y = window.screen.availHeight - window.innerHeight; - relocated = true; - } - return [relocated, [x, y]]; + return [relocated, nextPos]; }; export const dragStartHandler = event => { @@ -91,6 +189,7 @@ const dragEndHandler = event => { document.removeEventListener('mousemove', dragMoveHandler); document.removeEventListener('mouseup', dragEndHandler); dragging = false; + storeWindowGeometry(windowKey); }; const dragMoveHandler = event => { @@ -98,9 +197,8 @@ const dragMoveHandler = event => { return; } event.preventDefault(); - setWindowPosition(ref, vecAdd( + setWindowPosition(vecAdd( [event.screenX, event.screenY], - screenOffset, dragPointOffset)); }; @@ -127,6 +225,7 @@ const resizeEndHandler = event => { document.removeEventListener('mousemove', resizeMoveHandler); document.removeEventListener('mouseup', resizeEndHandler); resizing = false; + storeWindowGeometry(windowKey); }; const resizeMoveHandler = event => { @@ -140,7 +239,7 @@ const resizeMoveHandler = event => { dragPointOffset, [1, 1]))); // Sane window size values - size[0] = Math.max(size[0], 250); - size[1] = Math.max(size[1], 120); - setWindowSize(ref, size); + size[0] = Math.max(size[0], 150); + size[1] = Math.max(size[1], 50); + setWindowSize(size); }; diff --git a/tgui/packages/tgui/format.js b/tgui/packages/tgui/format.js index 38cfaf1292..1f8420860e 100644 --- a/tgui/packages/tgui/format.js +++ b/tgui/packages/tgui/format.js @@ -1,3 +1,9 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + import { clamp, round, toFixed } from 'common/math'; const SI_SYMBOLS = [ @@ -33,6 +39,9 @@ export const formatSiUnit = ( minBase1000 = -SI_BASE_INDEX, unit = '' ) => { + if (typeof value !== 'number' || !Number.isFinite(value)) { + return value; + } const realBase10 = Math.floor(Math.log10(value)); const base10 = Math.floor(Math.max(minBase1000 * 3, realBase10)); const realBase1000 = Math.floor(realBase10 / 3); diff --git a/tgui/packages/tgui/global.d.ts b/tgui/packages/tgui/global.d.ts new file mode 100644 index 0000000000..ab8870f15c --- /dev/null +++ b/tgui/packages/tgui/global.d.ts @@ -0,0 +1,95 @@ +interface ByondType { + /** + * True if javascript is running in BYOND. + */ + IS_BYOND: boolean; + + /** + * True if browser is IE8 or lower. + */ + IS_LTE_IE8: boolean; + + /** + * True if browser is IE9 or lower. + */ + IS_LTE_IE9: boolean; + + /** + * True if browser is IE10 or lower. + */ + IS_LTE_IE10: boolean; + + /** + * True if browser is IE11 or lower. + */ + IS_LTE_IE11: boolean; + + /** + * Makes a BYOND call. + * + * If path is empty, this will trigger a Topic call. + * You can reference a specific object by setting the "src" parameter. + * + * See: https://secure.byond.com/docs/ref/skinparams.html + */ + call(path: string, params: object): void; + + /** + * Makes an asynchronous BYOND call. Returns a promise. + */ + callAsync(path: string, params: object): Promise; + + /** + * Makes a Topic call. + * + * You can reference a specific object by setting the "src" parameter. + */ + topic(params: object): void; + + /** + * Runs a command or a verb. + */ + command(command: string): void; + + /** + * Retrieves all properties of the BYOND skin element. + * + * Returns a promise with a key-value object containing all properties. + */ + winget(id: string): Promise; + + /** + * Retrieves all properties of the BYOND skin element. + * + * Returns a promise with a key-value object containing all properties. + */ + winget(id: string, propName: '*'): Promise; + + /** + * Retrieves an exactly one property of the BYOND skin element, + * as defined in `propName`. + * + * Returns a promise with the value of that property. + */ + winget(id: string, propName: string): Promise; + + /** + * Retrieves multiple properties of the BYOND skin element, + * as listen in the `propNames` array. + * + * Returns a promise with a key-value object containing listed properties. + */ + winget(id: string, propNames: string[]): Promise; + + /** + * Assigns properties to the BYOND skin element. + */ + winset(id: string, props: object): void; + + /** + * Sets a property on the BYOND skin element to a certain value. + */ + winset(id: string, propName: string, propValue: any): void; +}; + +declare const Byond: ByondType; diff --git a/tgui/packages/tgui/hotkeys.js b/tgui/packages/tgui/hotkeys.js index 30c1b910bf..0beff6b028 100644 --- a/tgui/packages/tgui/hotkeys.js +++ b/tgui/packages/tgui/hotkeys.js @@ -1,4 +1,9 @@ -import { callByond, IS_IE8 } from './byond'; +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + import { createLogger } from './logging'; const logger = createLogger('hotkeys'); @@ -48,6 +53,18 @@ export const KEY_W = 87; export const KEY_X = 88; export const KEY_Y = 89; export const KEY_Z = 90; +export const KEY_F1 = 112; +export const KEY_F2 = 113; +export const KEY_F3 = 114; +export const KEY_F4 = 115; +export const KEY_F5 = 116; +export const KEY_F6 = 117; +export const KEY_F7 = 118; +export const KEY_F8 = 119; +export const KEY_F9 = 120; +export const KEY_F10 = 121; +export const KEY_F11 = 122; +export const KEY_F12 = 123; export const KEY_EQUAL = 187; export const KEY_MINUS = 189; @@ -64,6 +81,18 @@ const NO_PASSTHROUGH_KEYS = [ KEY_TAB, KEY_CTRL, KEY_SHIFT, + KEY_F1, + KEY_F2, + KEY_F3, + KEY_F4, + KEY_F5, + KEY_F6, + KEY_F7, + KEY_F8, + KEY_F9, + KEY_F10, + KEY_F11, + KEY_F12, ]; // Tracks the "pressed" state of keys @@ -83,6 +112,9 @@ const createHotkeyString = (ctrlKey, altKey, shiftKey, keyCode) => { if (keyCode >= 48 && keyCode <= 90) { str += String.fromCharCode(keyCode); } + else if (keyCode >= KEY_F1 && keyCode <= KEY_F12) { + str += 'F' + (keyCode - 111); + } else { str += '[' + keyCode + ']'; } @@ -129,11 +161,11 @@ const handlePassthrough = (e, eventType) => { // Send this keypress to BYOND if (eventType === 'keydown' && !keyState[keyCode]) { logger.debug('passthrough', eventType, keyData); - return callByond('', { __keydown: keyCode }); + return Byond.topic({ __keydown: keyCode }); } if (eventType === 'keyup' && keyState[keyCode]) { logger.debug('passthrough', eventType, keyData); - return callByond('', { __keyup: keyCode }); + return Byond.topic({ __keyup: keyCode }); } }; @@ -146,41 +178,45 @@ export const releaseHeldKeys = () => { if (keyState[keyCode]) { logger.log(`releasing [${keyCode}] key`); keyState[keyCode] = false; - callByond('', { __keyup: keyCode }); + Byond.topic({ __keyup: keyCode }); } } }; -const handleHotKey = (e, eventType, dispatch) => { +const hotKeySubscribers = []; + +/** + * Subscribes to a certain hotkey, and dispatches a redux action returned + * by the callback function. + */ +export const subscribeToHotKey = (keyString, fn) => { + hotKeySubscribers.push((store, keyData) => { + if (keyData.keyString === keyString) { + const action = fn(store); + if (action) { + store.dispatch(action); + } + } + }); +}; + +const handleHotKey = (e, eventType, store) => { if (eventType !== 'keyup') { return; } const keyData = getKeyData(e); const { - ctrlKey, - altKey, keyCode, hasModifierKeys, keyString, } = keyData; // Dispatch a detected hotkey as a store action - if (hasModifierKeys && !MODIFIER_KEYS.includes(keyCode)) { + if (hasModifierKeys && !MODIFIER_KEYS.includes(keyCode) + || keyCode >= KEY_F1 && keyCode <= KEY_F12) { logger.log(keyString); - // Fun stuff - if (ctrlKey && altKey && keyCode === KEY_BACKSPACE) { - // NOTE: We need to call this in a timeout, because we need a clean - // stack in order for this to be a fatal error. - setTimeout(() => { - throw new Error( - 'OOPSIE WOOPSIE!! UwU We made a fucky wucky!! A wittle' - + ' fucko boingo! The code monkeys at our headquarters are' - + ' working VEWY HAWD to fix this!'); - }); + for (let subscriberFn of hotKeySubscribers) { + subscriberFn(store, keyData); } - dispatch({ - type: 'hotKey', - payload: keyData, - }); } }; @@ -218,18 +254,17 @@ const subscribeToKeyPresses = listenerFn => { // Middleware export const hotKeyMiddleware = store => { - const { dispatch } = store; // Subscribe to key events subscribeToKeyPresses((e, eventType) => { // IE8: Can't determine the focused element, so by extension it passes // keypresses when inputs are focused. - if (!IS_IE8) { + if (!Byond.IS_LTE_IE8) { handlePassthrough(e, eventType); } - handleHotKey(e, eventType, dispatch); + handleHotKey(e, eventType, store); }); // IE8: focusin/focusout only available on IE9+ - if (!IS_IE8) { + if (!Byond.IS_LTE_IE8) { // Clean up when browser window completely loses focus subscribeToLossOfFocus(() => { releaseHeldKeys(); @@ -238,27 +273,3 @@ export const hotKeyMiddleware = store => { // Pass through store actions (do nothing) return next => action => next(action); }; - -// Reducer -export const hotKeyReducer = (state, action) => { - const { type, payload } = action; - if (type === 'hotKey') { - const { ctrlKey, altKey, keyCode } = payload; - // Toggle kitchen sink mode - if (ctrlKey && altKey && keyCode === KEY_EQUAL) { - return { - ...state, - showKitchenSink: !state.showKitchenSink, - }; - } - // Toggle layout debugger - if (ctrlKey && altKey && keyCode === KEY_MINUS) { - return { - ...state, - debugLayout: !state.debugLayout, - }; - } - return state; - } - return state; -}; diff --git a/tgui/packages/tgui/index.js b/tgui/packages/tgui/index.js index 59199f9edb..0b2f1a652e 100644 --- a/tgui/packages/tgui/index.js +++ b/tgui/packages/tgui/index.js @@ -1,3 +1,9 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + // Polyfills import 'core-js/es'; import 'core-js/web/immediate'; @@ -12,85 +18,86 @@ import './polyfills/inferno'; // Themes import './styles/main.scss'; +import './styles/themes/abductor.scss'; import './styles/themes/cardtable.scss'; +import './styles/themes/hackerman.scss'; import './styles/themes/malfunction.scss'; import './styles/themes/ntos.scss'; -import './styles/themes/hackerman.scss'; +import './styles/themes/paper.scss'; import './styles/themes/retro.scss'; import './styles/themes/syndicate.scss'; -import { loadCSS } from 'fg-loadcss'; +import { perf } from 'common/perf'; import { render } from 'inferno'; import { setupHotReloading } from 'tgui-dev-server/link/client'; -import { backendUpdate } from './backend'; -import { IS_IE8 } from './byond'; +import { loadCSS } from './assets'; +import { backendUpdate, backendSuspendSuccess, selectBackend, sendMessage } from './backend'; import { setupDrag } from './drag'; import { logger } from './logging'; import { createStore, StoreProvider } from './store'; -const enteredBundleAt = Date.now(); +perf.mark('inception', window.__inception__); +perf.mark('init'); + const store = createStore(); let reactRoot; let initialRender = true; const renderLayout = () => { - // Mark the beginning of the render - let startedAt; - if (process.env.NODE_ENV !== 'production') { - startedAt = Date.now(); - } - try { - const state = store.getState(); - // Initial render setup - if (initialRender) { - logger.log('initial render', state); - // Setup dragging - setupDrag(state); + perf.mark('render/start'); + const state = store.getState(); + const { suspended, assets } = selectBackend(state); + // Initial render setup + if (initialRender) { + logger.log('initial render', state); + // Setup dragging + if (initialRender !== 'recycled') { + setupDrag(); } - // Start rendering - const { getRoutedComponent } = require('./routes'); - const Component = getRoutedComponent(state); - const element = ( - - - - ); - if (!reactRoot) { - reactRoot = document.getElementById('react-root'); - } - render(element, reactRoot); } - catch (err) { - logger.error('rendering error', err); - throw err; + // Start rendering + const { getRoutedComponent } = require('./routes'); + const Component = getRoutedComponent(state); + const element = ( + + + + ); + if (!reactRoot) { + reactRoot = document.getElementById('react-root'); } + render(element, reactRoot); + if (suspended) { + return; + } + perf.mark('render/finish'); // Report rendering time if (process.env.NODE_ENV !== 'production') { - const finishedAt = Date.now(); - if (initialRender) { + if (initialRender === 'recycled') { + logger.log('rendered in', + perf.measure('render/start', 'render/finish')); + } + else if (initialRender) { logger.debug('serving from:', location.href); - logger.debug('bundle entered in', timeDiff( - window.__inception__, enteredBundleAt)); - logger.debug('initialized in', timeDiff( - enteredBundleAt, startedAt)); - logger.log('rendered in', timeDiff( - startedAt, finishedAt)); - logger.log('fully loaded in', timeDiff( - window.__inception__, finishedAt)); + logger.debug('bundle entered in', + perf.measure('inception', 'init')); + logger.debug('initialized in', + perf.measure('init', 'render/start')); + logger.log('rendered in', + perf.measure('render/start', 'render/finish')); + logger.log('fully loaded in', + perf.measure('inception', 'render/finish')); } else { - logger.debug('rendered in', timeDiff(startedAt, finishedAt)); + logger.debug('rendered in', + perf.measure('render/start', 'render/finish')); } } if (initialRender) { initialRender = false; } -}; - -const timeDiff = (startedAt, finishedAt) => { - const diff = finishedAt - startedAt; - const diffFrames = (diff / 16.6667).toFixed(2); - return `${diff}ms (${diffFrames} frames)`; + // Load assets + assets?.styles?.forEach(filename => loadCSS(filename)); }; // Parse JSON and report all abnormal JSON strings coming from BYOND @@ -105,7 +112,7 @@ const parseStateJson = json => { }; // IE8: No reviver for you! // See: https://stackoverflow.com/questions/1288962 - if (IS_IE8) { + if (Byond.IS_LTE_IE8) { reviver = undefined; } try { @@ -126,14 +133,36 @@ const setupApp = () => { }); // Subscribe for bankend updates - window.update = stateJson => { - // NOTE: stateJson can be an object only if called manually from console. + window.update = messageJson => { + const { suspended } = selectBackend(store.getState()); + // NOTE: messageJson can be an object only if called manually from console. // This is useful for debugging tgui in external browsers, like Chrome. - const state = typeof stateJson === 'string' - ? parseStateJson(stateJson) - : stateJson; - // Backend update dispatches a store action - store.dispatch(backendUpdate(state)); + const message = typeof messageJson === 'string' + ? parseStateJson(messageJson) + : messageJson; + logger.debug(`received message '${message?.type}'`); + const { type, payload } = message; + if (type === 'update') { + window.__ref__ = payload.config.ref; + if (suspended) { + logger.log('reinitializing to:', payload.config.ref); + initialRender = 'recycled'; + } + // Backend update dispatches a store action + store.dispatch(backendUpdate(payload)); + return; + } + if (type === 'suspend') { + store.dispatch(backendSuspendSuccess()); + return; + } + if (type === 'ping') { + sendMessage({ + type: 'pingReply', + }); + return; + } + logger.log('unhandled message', message); }; // Enable hot module reloading @@ -161,6 +190,26 @@ const setupApp = () => { loadCSS('font-awesome.css'); }; +// Setup a fatal error reporter +window.__logger__ = { + fatal: (error, stack) => { + // Get last state for debugging purposes + const backendState = selectBackend(store.getState()); + const reportedState = { + config: backendState.config, + suspended: backendState.suspended, + suspending: backendState.suspending, + }; + // Send to development server + logger.log('FatalError:', error || stack); + logger.log('State:', reportedState); + // Append this data to the stack + stack += '\nState: ' + JSON.stringify(reportedState); + // Return an updated stack + return stack; + }, +}; + if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', setupApp); } diff --git a/tgui/packages/tgui/interfaces/CameraConsole.js b/tgui/packages/tgui/interfaces/CameraConsole.js index 9e1c77fb2f..b26a6f7d48 100644 --- a/tgui/packages/tgui/interfaces/CameraConsole.js +++ b/tgui/packages/tgui/interfaces/CameraConsole.js @@ -46,7 +46,10 @@ const selectCameras = (cameras, searchText = '', networkFilter = '') => { export const CameraConsole = (props, context) => { return ( - + ); @@ -92,7 +95,6 @@ export const CameraConsoleContent = (props, context) => { className="CameraConsole__map" params={{ id: mapRef, - parent: config.window, type: 'map', }} /> diff --git a/tgui/packages/tgui/interfaces/CrewMonitor.js b/tgui/packages/tgui/interfaces/CrewMonitor.js index 96fd16f4d1..e5d8dff2ba 100644 --- a/tgui/packages/tgui/interfaces/CrewMonitor.js +++ b/tgui/packages/tgui/interfaces/CrewMonitor.js @@ -8,7 +8,10 @@ import { Fragment } from 'inferno'; export const CrewMonitor = () => { return ( - + @@ -121,7 +124,7 @@ export const CrewMonitorContent = (props, context) => { selected={~~level === ~~config.mapZLevel} content={level} onClick={() => { - act("tgui:setZLevel", { "mapZLevel": level }); + act("setZLevel", { "mapZLevel": level }); }} /> ))} diff --git a/tgui/packages/tgui/interfaces/DisposalBin.js b/tgui/packages/tgui/interfaces/DisposalBin.js index 69c62b5655..c8a7bceeb4 100644 --- a/tgui/packages/tgui/interfaces/DisposalBin.js +++ b/tgui/packages/tgui/interfaces/DisposalBin.js @@ -20,7 +20,9 @@ export const DisposalBin = (props, context) => { stateText = "Idle"; } return ( - +
diff --git a/tgui/packages/tgui/interfaces/NtosCameraConsole.js b/tgui/packages/tgui/interfaces/NtosCameraConsole.js index b31e8d522a..12cce62917 100644 --- a/tgui/packages/tgui/interfaces/NtosCameraConsole.js +++ b/tgui/packages/tgui/interfaces/NtosCameraConsole.js @@ -3,7 +3,10 @@ import { CameraConsoleContent } from './CameraConsole'; export const NtosCameraConsole = () => { return ( - + diff --git a/tgui/packages/tgui/interfaces/NtosCrewMonitor.js b/tgui/packages/tgui/interfaces/NtosCrewMonitor.js index a622b14459..185c49f784 100644 --- a/tgui/packages/tgui/interfaces/NtosCrewMonitor.js +++ b/tgui/packages/tgui/interfaces/NtosCrewMonitor.js @@ -3,7 +3,10 @@ import { CrewMonitorContent } from './CrewMonitor'; export const NtosCrewMonitor = () => { return ( - + diff --git a/tgui/packages/tgui/layouts/Layout.js b/tgui/packages/tgui/layouts/Layout.js index 364564f60a..a00115e5f9 100644 --- a/tgui/packages/tgui/layouts/Layout.js +++ b/tgui/packages/tgui/layouts/Layout.js @@ -1,5 +1,11 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + import { classes } from 'common/react'; -import { IS_IE8 } from '../byond'; +import { computeBoxProps, computeBoxClassName } from '../components/Box'; /** * Brings Layout__content DOM element back to focus. @@ -8,7 +14,7 @@ import { IS_IE8 } from '../byond'; */ export const refocusLayout = () => { // IE8: Focus method is seemingly fucked. - if (IS_IE8) { + if (Byond.IS_LTE_IE8) { return; } const element = document.getElementById('Layout__content'); @@ -41,6 +47,7 @@ const LayoutContent = props => { className, scrollable, children, + ...rest } = props; return (
{ 'Layout__content', scrollable && 'Layout__content--scrollable', className, - ])}> + ...computeBoxClassName(rest), + ])} + {...computeBoxProps(rest)}> {children}
); diff --git a/tgui/packages/tgui/layouts/NtosWindow.js b/tgui/packages/tgui/layouts/NtosWindow.js index b3acb7e728..5433b17f2a 100644 --- a/tgui/packages/tgui/layouts/NtosWindow.js +++ b/tgui/packages/tgui/layouts/NtosWindow.js @@ -1,3 +1,9 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + import { useBackend } from '../backend'; import { Box, Button } from '../components'; import { refocusLayout } from './Layout'; @@ -5,12 +11,16 @@ import { Window } from './Window'; export const NtosWindow = (props, context) => { const { + title, + width = 575, + height = 700, resizable, theme = 'ntos', children, } = props; const { act, data } = useBackend(context); const { + PC_device_theme, PC_batteryicon, PC_showbatteryicon, PC_batterypercent, @@ -22,6 +32,9 @@ export const NtosWindow = (props, context) => { } = data; return (
@@ -35,7 +48,8 @@ export const NtosWindow = (props, context) => { {PC_stationtime} - NtOS + {PC_device_theme === 'ntos' && 'NtOS'} + {PC_device_theme === 'syndicate' && 'Syndix'}
diff --git a/tgui/packages/tgui/layouts/Window.js b/tgui/packages/tgui/layouts/Window.js index 2b8fafdf9e..c46a6371e6 100644 --- a/tgui/packages/tgui/layouts/Window.js +++ b/tgui/packages/tgui/layouts/Window.js @@ -1,19 +1,41 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + import { classes } from 'common/react'; import { decodeHtmlEntities, toTitleCase } from 'common/string'; import { Component, Fragment } from 'inferno'; -import { useBackend } from '../backend'; -import { IS_IE8, runCommand, winset } from '../byond'; -import { Box, Icon } from '../components'; +import { backendSuspendStart, useBackend } from '../backend'; +import { Icon } from '../components'; import { UI_DISABLED, UI_INTERACTIVE, UI_UPDATE } from '../constants'; -import { dragStartHandler, resizeStartHandler } from '../drag'; -import { releaseHeldKeys } from '../hotkeys'; +import { toggleKitchenSink, useDebug } from '../debug'; +import { dragStartHandler, recallWindowGeometry, resizeStartHandler, setWindowKey } from '../drag'; import { createLogger } from '../logging'; +import { useDispatch } from '../store'; import { Layout, refocusLayout } from './Layout'; const logger = createLogger('Window'); +const DEFAULT_SIZE = [400, 600]; + export class Window extends Component { componentDidMount() { + const { config, suspended } = useBackend(this.context); + if (suspended) { + return; + } + logger.log('mounting'); + const options = { + size: DEFAULT_SIZE, + ...config.window, + }; + if (this.props.width && this.props.height) { + options.size = [this.props.width, this.props.height]; + } + setWindowKey(config.window.key); + recallWindowGeometry(config.window.key, options); refocusLayout(); } @@ -21,14 +43,18 @@ export class Window extends Component { const { resizable, theme, + title, children, } = this.props; const { config, - debugLayout, + suspended, } = useBackend(this.context); + const { debugLayout } = useDebug(this.context); + const dispatch = useDispatch(this.context); + const fancy = config.window?.fancy; // Determine when to show dimmer - const showDimmer = config.observer + const showDimmer = config.user.observer ? config.status < UI_DISABLED : config.status < UI_INTERACTIVE; return ( @@ -37,27 +63,25 @@ export class Window extends Component { theme={theme}> { logger.log('pressed close'); - releaseHeldKeys(); - winset(config.window, 'is-visible', false); - runCommand(`uiclose ${config.ref}`); + dispatch(backendSuspendStart()); }} />
- {children} + {!suspended && children} {showDimmer && (
)}
- {config.fancy && resizable && ( + {fancy && resizable && (
@@ -73,15 +97,26 @@ export class Window extends Component { } const WindowContent = props => { - const { scrollable, children } = props; + const { + className, + fitted, + children, + ...rest + } = props; // A bit lazy to actually write styles for it, // so we simply include a Box with margins. return ( - - {children} - + className={classes([ + 'Window__content', + className, + ])} + {...rest}> + {fitted && children || ( +
+ {children} +
+ )}
); }; @@ -100,7 +135,7 @@ const statusToColor = status => { } }; -const TitleBar = props => { +const TitleBar = (props, context) => { const { className, title, @@ -109,6 +144,7 @@ const TitleBar = props => { onDragStart, onClose, } = props; + const dispatch = useDispatch(context); return (
{ color={statusToColor(status)} name="eye" />
- {title === title.toLowerCase() - ? toTitleCase(title) - : title} + {typeof title === 'string' + && title === title.toLowerCase() + && toTitleCase(title) + || title}
fancy && onDragStart(e)} /> + {process.env.NODE_ENV !== 'production' && ( +
dispatch(toggleKitchenSink())}> + +
+ )} {!!fancy && (
{ // IE8: Use a plain character instead of a unicode symbol. // eslint-disable-next-line react/no-unknown-property onclick={onClose}> - {IS_IE8 ? 'x' : '×'} + {Byond.IS_LTE_IE8 ? 'x' : '×'}
)}
diff --git a/tgui/packages/tgui/layouts/index.js b/tgui/packages/tgui/layouts/index.js index 13351853bd..57d9f3ef0d 100644 --- a/tgui/packages/tgui/layouts/index.js +++ b/tgui/packages/tgui/layouts/index.js @@ -1,3 +1,9 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + export { Layout, refocusLayout } from './Layout'; export { NtosWindow } from './NtosWindow'; export { Window } from './Window'; diff --git a/tgui/packages/tgui/logging.js b/tgui/packages/tgui/logging.js index 592e10836b..95921b881d 100644 --- a/tgui/packages/tgui/logging.js +++ b/tgui/packages/tgui/logging.js @@ -1,5 +1,10 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + import { sendLogEntry } from 'tgui-dev-server/link/client'; -import { callByond } from './byond'; const LEVEL_DEBUG = 0; const LEVEL_LOG = 1; @@ -27,10 +32,11 @@ const log = (level, ns, ...args) => { .filter(value => value) .join(' ') + '\nUser Agent: ' + navigator.userAgent; - callByond('', { - src: window.__ref__, - action: 'tgui:log', - log: logEntry, + Byond.topic({ + tgui: 1, + window_id: window.__windowId__, + type: 'log', + message: logEntry, }); } }; diff --git a/tgui/packages/tgui/package.json b/tgui/packages/tgui/package.json index fd2d0a0d86..70c0e0c771 100644 --- a/tgui/packages/tgui/package.json +++ b/tgui/packages/tgui/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "tgui", - "version": "3.0.0", + "version": "3.1.0", "dependencies": { "@babel/core": "^7.6.2", "@babel/plugin-transform-jscript": "^7.2.0", @@ -12,16 +12,18 @@ "core-js": "^3.2.1", "css-loader": "^3.2.0", "cssnano": "^4.1.10", + "dompurify": "^2.0.11", "extract-css-chunks-webpack-plugin": "^4.6.0", "fg-loadcss": "^2.1.0", "file-loader": "^6.0.0", "inferno": "^7.3.2", + "marked": "^1.1.0", "optimize-css-assets-webpack-plugin": "^5.0.3", "regenerator-runtime": "^0.13.3", "sass": "^1.22.12", - "sass-loader": "^8.0.0", + "sass-loader": "^9.0.2", "style-loader": "^1.0.0", - "terser-webpack-plugin": "^2.1.0", + "terser-webpack-plugin": "^3.0.6", "url-loader": "^4.1.0", "webpack": "^4.40.2", "webpack-build-notifier": "^2.0.0", diff --git a/tgui/packages/tgui/public/tgui.bundle.css b/tgui/packages/tgui/public/tgui.bundle.css index dd4397e72f..20c41213ea 100644 --- a/tgui/packages/tgui/public/tgui.bundle.css +++ b/tgui/packages/tgui/public/tgui.bundle.css @@ -1 +1 @@ -body,html{box-sizing:border-box;height:100%;margin:0;font-size:12px}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4,h5,h6{display:block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}td,th{vertical-align:baseline;text-align:left}.candystripe:nth-child(odd){background-color:rgba(0,0,0,.25)}.color-black{color:#0d0d0d!important}.color-white{color:#fff!important}.color-red{color:#d33!important}.color-orange{color:#f37827!important}.color-yellow{color:#fbd814!important}.color-olive{color:#c0d919!important}.color-green{color:#22be47!important}.color-teal{color:#00c5bd!important}.color-blue{color:#238cdc!important}.color-violet{color:#6c3fcc!important}.color-purple{color:#a93bcd!important}.color-pink{color:#e2439c!important}.color-brown{color:#af6d43!important}.color-grey{color:#7d7d7d!important}.color-good{color:#62b62a!important}.color-average{color:#f1951d!important}.color-bad{color:#d33!important}.color-label{color:#8496ab!important}.color-bg-black{background-color:#000!important}.color-bg-white{background-color:#d9d9d9!important}.color-bg-red{background-color:#bd2020!important}.color-bg-orange{background-color:#d95e0c!important}.color-bg-yellow{background-color:#d9b804!important}.color-bg-olive{background-color:#9aad14!important}.color-bg-green{background-color:#1b9638!important}.color-bg-teal{background-color:#009a93!important}.color-bg-blue{background-color:#1c71b1!important}.color-bg-violet{background-color:#552dab!important}.color-bg-purple{background-color:#8b2baa!important}.color-bg-pink{background-color:#cf2082!important}.color-bg-brown{background-color:#8c5836!important}.color-bg-grey{background-color:#646464!important}.color-bg-good{background-color:#4d9121!important}.color-bg-average{background-color:#cd7a0d!important}.color-bg-bad{background-color:#bd2020!important}.color-bg-label{background-color:#657a94!important}.debug-layout,.debug-layout :not(g):not(path){color:hsla(0,0%,100%,.9)!important;background:transparent!important;outline:1px solid hsla(0,0%,100%,.5)!important;box-shadow:none!important;filter:none!important}.debug-layout:hover,.debug-layout :not(g):not(path):hover{outline-color:hsla(0,0%,100%,.8)!important}.display-none{display:none}.display-block{display:block}.display-inline{display:inline}.display-inline-block{display:inline-block}.m-0{margin:0}.mx-0{margin-left:0;margin-right:0}.my-0{margin-top:0;margin-bottom:0}.ml-0{margin-left:0}.mt-0{margin-top:0}.mr-0{margin-right:0}.mb-0{margin-bottom:0}.m-1{margin:6px}.mx-1{margin-left:6px;margin-right:6px}.my-1{margin-top:6px;margin-bottom:6px}.ml-1{margin-left:6px}.mt-1{margin-top:6px}.mr-1{margin-right:6px}.mb-1{margin-bottom:6px}.m-2{margin:12px}.mx-2{margin-left:12px;margin-right:12px}.my-2{margin-top:12px;margin-bottom:12px}.ml-2{margin-left:12px}.mt-2{margin-top:12px}.mr-2{margin-right:12px}.mb-2{margin-bottom:12px}.outline-dotted{outline-style:dotted!important;outline-width:2px!important}.outline-dashed{outline-style:dashed!important;outline-width:2px!important}.outline-solid{outline-style:solid!important;outline-width:2px!important}.outline-double{outline-style:double!important;outline-width:2px!important}.outline-groove{outline-style:groove!important;outline-width:2px!important}.outline-ridge{outline-style:ridge!important;outline-width:2px!important}.outline-inset{outline-style:inset!important;outline-width:2px!important}.outline-outset{outline-style:outset!important;outline-width:2px!important}.outline-color-black{outline-color:#0d0d0d!important}.outline-color-white{outline-color:#fff!important}.outline-color-red{outline-color:#d33!important}.outline-color-orange{outline-color:#f37827!important}.outline-color-yellow{outline-color:#fbd814!important}.outline-color-olive{outline-color:#c0d919!important}.outline-color-green{outline-color:#22be47!important}.outline-color-teal{outline-color:#00c5bd!important}.outline-color-blue{outline-color:#238cdc!important}.outline-color-violet{outline-color:#6c3fcc!important}.outline-color-purple{outline-color:#a93bcd!important}.outline-color-pink{outline-color:#e2439c!important}.outline-color-brown{outline-color:#af6d43!important}.outline-color-grey{outline-color:#7d7d7d!important}.outline-color-good{outline-color:#62b62a!important}.outline-color-average{outline-color:#f1951d!important}.outline-color-bad{outline-color:#d33!important}.outline-color-label{outline-color:#8496ab!important}.position-relative{position:relative}.position-absolute{position:absolute}.position-fixed{position:fixed}.position-sticky{position:sticky}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-baseline{text-align:baseline}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-pre{white-space:pre}.text-bold{font-weight:700}.text-italic{font-style:italic}.text-underline{text-decoration:underline}.BlockQuote{color:#8496ab;border-left:2px solid #8496ab;padding-left:6px;margin-bottom:6px}.BlockQuote:last-child{margin-bottom:0}.Button{position:relative;display:inline-block;line-height:20px;padding:0 6px;margin-right:2px;white-space:nowrap;outline:0;border-radius:2px;margin-bottom:2px;user-select:none;-ms-user-select:none}.Button:last-child{margin-right:0}.Button .fa,.Button .far,.Button .fas{margin-left:-3px;margin-right:-3px;min-width:16px;text-align:center}.Button--hasContent .fa,.Button--hasContent .far,.Button--hasContent .fas{margin-right:3px}.Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.Button--fluid{display:block;margin-left:0;margin-right:0}.Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.Button--color--black:hover{transition:color 0ms,background-color 0ms}.Button--color--black:focus{transition:color .1s,background-color .1s}.Button--color--black:focus,.Button--color--black:hover{background-color:#0a0a0a;color:#fff}.Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.Button--color--white:hover{transition:color 0ms,background-color 0ms}.Button--color--white:focus{transition:color .1s,background-color .1s}.Button--color--white:focus,.Button--color--white:hover{background-color:#f3f3f3;color:#000}.Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--red:hover{transition:color 0ms,background-color 0ms}.Button--color--red:focus{transition:color .1s,background-color .1s}.Button--color--red:focus,.Button--color--red:hover{background-color:#d52b2b;color:#fff}.Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.Button--color--orange:hover{transition:color 0ms,background-color 0ms}.Button--color--orange:focus{transition:color .1s,background-color .1s}.Button--color--orange:focus,.Button--color--orange:hover{background-color:#ed6f1d;color:#fff}.Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.Button--color--yellow:focus{transition:color .1s,background-color .1s}.Button--color--yellow:focus,.Button--color--yellow:hover{background-color:#f3d00e;color:#000}.Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.Button--color--olive:hover{transition:color 0ms,background-color 0ms}.Button--color--olive:focus{transition:color .1s,background-color .1s}.Button--color--olive:focus,.Button--color--olive:hover{background-color:#afc41f;color:#fff}.Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--color--green:hover{transition:color 0ms,background-color 0ms}.Button--color--green:focus{transition:color .1s,background-color .1s}.Button--color--green:focus,.Button--color--green:hover{background-color:#27ab46;color:#fff}.Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.Button--color--teal:hover{transition:color 0ms,background-color 0ms}.Button--color--teal:focus{transition:color .1s,background-color .1s}.Button--color--teal:focus,.Button--color--teal:hover{background-color:#0aafa8;color:#fff}.Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.Button--color--blue:hover{transition:color 0ms,background-color 0ms}.Button--color--blue:focus{transition:color .1s,background-color .1s}.Button--color--blue:focus,.Button--color--blue:hover{background-color:#2883c8;color:#fff}.Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.Button--color--violet:hover{transition:color 0ms,background-color 0ms}.Button--color--violet:focus{transition:color .1s,background-color .1s}.Button--color--violet:focus,.Button--color--violet:hover{background-color:#653ac1;color:#fff}.Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.Button--color--purple:hover{transition:color 0ms,background-color 0ms}.Button--color--purple:focus{transition:color .1s,background-color .1s}.Button--color--purple:focus,.Button--color--purple:hover{background-color:#9e38c1;color:#fff}.Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.Button--color--pink:hover{transition:color 0ms,background-color 0ms}.Button--color--pink:focus{transition:color .1s,background-color .1s}.Button--color--pink:focus,.Button--color--pink:hover{background-color:#dd3794;color:#fff}.Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.Button--color--brown:hover{transition:color 0ms,background-color 0ms}.Button--color--brown:focus{transition:color .1s,background-color .1s}.Button--color--brown:focus,.Button--color--brown:hover{background-color:#a06844;color:#fff}.Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.Button--color--grey:hover{transition:color 0ms,background-color 0ms}.Button--color--grey:focus{transition:color .1s,background-color .1s}.Button--color--grey:focus,.Button--color--grey:hover{background-color:#757575;color:#fff}.Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.Button--color--good:hover{transition:color 0ms,background-color 0ms}.Button--color--good:focus{transition:color .1s,background-color .1s}.Button--color--good:focus,.Button--color--good:hover{background-color:#5da52d;color:#fff}.Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.Button--color--average:hover{transition:color 0ms,background-color 0ms}.Button--color--average:focus{transition:color .1s,background-color .1s}.Button--color--average:focus,.Button--color--average:hover{background-color:#e68d18;color:#fff}.Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--bad:hover{transition:color 0ms,background-color 0ms}.Button--color--bad:focus{transition:color .1s,background-color .1s}.Button--color--bad:focus,.Button--color--bad:hover{background-color:#d52b2b;color:#fff}.Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.Button--color--label:hover{transition:color 0ms,background-color 0ms}.Button--color--label:focus{transition:color .1s,background-color .1s}.Button--color--label:focus,.Button--color--label:hover{background-color:#7b8da4;color:#fff}.Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.Button--color--default:hover{transition:color 0ms,background-color 0ms}.Button--color--default:focus{transition:color .1s,background-color .1s}.Button--color--default:focus,.Button--color--default:hover{background-color:#4c729d;color:#fff}.Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--caution:hover{transition:color 0ms,background-color 0ms}.Button--color--caution:focus{transition:color .1s,background-color .1s}.Button--color--caution:focus,.Button--color--caution:hover{background-color:#f3d00e;color:#000}.Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--danger:hover{transition:color 0ms,background-color 0ms}.Button--color--danger:focus{transition:color .1s,background-color .1s}.Button--color--danger:focus,.Button--color--danger:hover{background-color:#d52b2b;color:#fff}.Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#252525;color:#fff;background-color:rgba(37,37,37,0);color:hsla(0,0%,100%,.5)}.Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.Button--color--transparent:focus{transition:color .1s,background-color .1s}.Button--color--transparent:focus,.Button--color--transparent:hover{background-color:#323232;color:#fff}.Button--disabled{background-color:#999!important}.Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--selected:hover{transition:color 0ms,background-color 0ms}.Button--selected:focus{transition:color .1s,background-color .1s}.Button--selected:focus,.Button--selected:hover{background-color:#27ab46;color:#fff}.ColorBox{display:inline-block;width:12px;height:12px;line-height:12px;text-align:center}.Dimmer{display:flex;justify-content:center;align-items:center;position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(0,0,0,.75);z-index:1}.Divider--horizontal{margin:6px 0}.Divider--horizontal:not(.Divider--hidden){border-top:2px solid hsla(0,0%,100%,.1)}.Divider--vertical{height:100%;margin:0 6px}.Divider--vertical:not(.Divider--hidden){border-left:2px solid hsla(0,0%,100%,.1)}.Dropdown{position:relative}.Dropdown__control{position:relative;display:inline-block;font-family:Verdana,sans-serif;font-size:12px;width:100px;line-height:17px;user-select:none}.Dropdown__arrow-button{float:right;padding-left:6px;border-left:1px solid #000;border-left:1px solid rgba(0,0,0,.25)}.Dropdown__menu{overflow-y:auto;overflow-y:scroll}.Dropdown__menu,.Dropdown__menu-noscroll{position:absolute;z-index:5;width:100px;max-height:200px;border-radius:0 0 2px 2px;background-color:#000;background-color:rgba(0,0,0,.75)}.Dropdown__menu-noscroll{overflow-y:auto}.Dropdown__menuentry{padding:2px 4px;font-family:Verdana,sans-serif;font-size:12px;line-height:17px;transition:background-color .1s}.Dropdown__menuentry:hover{background-color:#444;transition:background-color 0ms}.Dropdown__over{top:auto;bottom:100%}.FatalError{display:block!important;position:absolute;top:0;left:0;right:0;bottom:0;padding:12px;font-size:12px;font-family:Consolas,monospace;color:#fff;background-color:#00d;z-index:1000;overflow:hidden;text-align:center}.FatalError__logo{display:inline-block;text-align:left;font-size:10px;line-height:8px;position:relative;margin-top:12px;top:0;left:0;animation:FatalError__rainbow 2s linear infinite alternate,FatalError__shadow 4s linear infinite alternate,FatalError__tfmX 3s infinite alternate,FatalError__tfmY 4s infinite alternate;white-space:pre-wrap;word-break:break-all}.FatalError__header{margin-top:12px}.FatalError__stack{text-align:left;white-space:pre-wrap;word-break:break-all;margin-top:24px;margin-bottom:24px}.FatalError__footer{margin-bottom:24px}@keyframes FatalError__rainbow{0%{color:#ff0}50%{color:#0ff}to{color:#f0f}}@keyframes FatalError__shadow{0%{left:-2px;text-shadow:4px 0 #f0f}50%{left:0;text-shadow:0 0 #0ff}to{left:2px;text-shadow:-4px 0 #ff0}}@keyframes FatalError__tfmX{0%{left:15px}to{left:-15px}}@keyframes FatalError__tfmY{to{top:-15px}}.Flex{display:-ms-flexbox;display:flex}.Flex--inline{display:inline-flex}.Flex--ie8{display:table!important}.Flex--ie8--column{display:block!important}.Flex--ie8--column>.Flex__item{display:block!important;margin-left:6px;margin-right:6px}.Flex__item--ie8{display:table-cell!important}.Flex--spacing--1{margin:0 -3px}.Flex--spacing--1>.Flex__item{margin:0 3px}.Flex--spacing--2{margin:0 -6px}.Flex--spacing--2>.Flex__item{margin:0 6px}.Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto -.2em;cursor:n-resize}.Knob:after{content:".";color:transparent;line-height:2.5em}.Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(180deg,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,0));border-radius:50%;box-shadow:0 .05em .5em 0 rgba(0,0,0,.5)}.Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:hsla(0,0%,100%,.9)}.Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;background-color:#000;transform:translateX(50%);white-space:nowrap}.Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.Knob__ringTrackPivot{transform:rotate(135deg)}.Knob__ringTrack{fill:transparent;stroke:hsla(0,0%,100%,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.Knob__ringFillPivot{transform:rotate(135deg)}.Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.Knob__ringFill{fill:transparent;stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms}.Knob--color--black .Knob__ringFill{stroke:#0d0d0d}.Knob--color--white .Knob__ringFill{stroke:#fff}.Knob--color--red .Knob__ringFill{stroke:#d33}.Knob--color--orange .Knob__ringFill{stroke:#f37827}.Knob--color--yellow .Knob__ringFill{stroke:#fbd814}.Knob--color--olive .Knob__ringFill{stroke:#c0d919}.Knob--color--green .Knob__ringFill{stroke:#22be47}.Knob--color--teal .Knob__ringFill{stroke:#00c5bd}.Knob--color--blue .Knob__ringFill{stroke:#238cdc}.Knob--color--violet .Knob__ringFill{stroke:#6c3fcc}.Knob--color--purple .Knob__ringFill{stroke:#a93bcd}.Knob--color--pink .Knob__ringFill{stroke:#e2439c}.Knob--color--brown .Knob__ringFill{stroke:#af6d43}.Knob--color--grey .Knob__ringFill{stroke:#7d7d7d}.Knob--color--good .Knob__ringFill{stroke:#62b62a}.Knob--color--average .Knob__ringFill{stroke:#f1951d}.Knob--color--bad .Knob__ringFill{stroke:#d33}.Knob--color--label .Knob__ringFill{stroke:#8496ab}.LabeledList{display:table;width:100%;width:calc(100% + 12px);border-collapse:collapse;border-spacing:0;margin:-3px -6px 0;padding:0}.LabeledList__row{display:table-row}.LabeledList__row:last-child .LabeledList__cell{padding-bottom:0}.LabeledList__cell{display:table-cell;margin:0;padding:3px 6px;border:0;text-align:left;vertical-align:baseline}.LabeledList__label{width:1%;white-space:nowrap;min-width:60px}.LabeledList__buttons{width:.1%;white-space:nowrap;text-align:right;padding-top:1px;padding-bottom:0}.Modal{background-color:#252525;max-width:calc(100% - 1rem);padding:1rem}.NanoMap__container{overflow:hidden;width:100%;height:100vh;z-index:1}.NanoMap__marker{z-index:10;padding:0;margin:0}.NoticeBox{padding:4px 6px;margin-bottom:6px;box-shadow:none;font-weight:700;font-style:italic;color:#000;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,transparent,transparent 10px,rgba(0,0,0,.1) 0,rgba(0,0,0,.1) 20px)}.NoticeBox--color--black{color:#fff;background-color:#000}.NoticeBox--color--white{color:#000;background-color:#b3b3b3}.NoticeBox--color--red{color:#fff;background-color:#701f1f}.NoticeBox--color--orange{color:#fff;background-color:#854114}.NoticeBox--color--yellow{color:#000;background-color:#83710d}.NoticeBox--color--olive{color:#000;background-color:#576015}.NoticeBox--color--green{color:#fff;background-color:#174e24}.NoticeBox--color--teal{color:#fff;background-color:#064845}.NoticeBox--color--blue{color:#fff;background-color:#1b4565}.NoticeBox--color--violet{color:#fff;background-color:#3b2864}.NoticeBox--color--purple{color:#fff;background-color:#542663}.NoticeBox--color--pink{color:#fff;background-color:#802257}.NoticeBox--color--brown{color:#fff;background-color:#4c3729}.NoticeBox--color--grey{color:#fff;background-color:#3e3e3e}.NoticeBox--color--good{color:#fff;background-color:#2e4b1a}.NoticeBox--color--average{color:#fff;background-color:#7b4e13}.NoticeBox--color--bad{color:#fff;background-color:#701f1f}.NoticeBox--color--label{color:#fff;background-color:#53565a}.NoticeBox--type--info{color:#fff;background-color:#235982}.NoticeBox--type--success{color:#fff;background-color:#1e662f}.NoticeBox--type--warning{color:#fff;background-color:#a95219}.NoticeBox--type--danger{color:#fff;background-color:#8f2828}.Input{position:relative;display:inline-block;width:120px;border:1px solid #88bfff;border:1px solid rgba(136,191,255,.75);border-radius:2px;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 4px;margin-right:2px;line-height:17px;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:transparent}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:12px;line-height:17px;height:17px;margin:0;padding:0 6px;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:hsla(0,0%,100%,.45)}.NumberInput{position:relative;display:inline-block;border:1px solid #88bfff;border:1px solid rgba(136,191,255,.75);border-radius:2px;color:#88bfff;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 4px;margin-right:2px;line-height:17px;text-align:right;overflow:visible;cursor:n-resize}.NumberInput--fluid{display:block}.NumberInput__content{margin-left:6px}.NumberInput__barContainer{position:absolute;top:2px;bottom:2px;left:2px}.NumberInput__bar{position:absolute;bottom:0;left:0;width:3px;box-sizing:border-box;border-bottom:1px solid #88bfff;background-color:#88bfff}.NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:12px;line-height:17px;height:17px;margin:0;padding:0 6px;font-family:Verdana,sans-serif;background-color:#000;color:#fff;text-align:right}.ProgressBar{display:inline-block;position:relative;width:100%;padding:0 6px;border-radius:2px;background-color:transparent;transition:border-color .5s}.ProgressBar__fill{position:absolute;top:0;left:0;bottom:0}.ProgressBar__fill--animated{transition:background-color .5s,width .5s}.ProgressBar__content{position:relative;line-height:17px;width:100%;text-align:right}.ProgressBar--color--default{border:1px solid #3e6189}.ProgressBar--color--default .ProgressBar__fill{background-color:#3e6189}.ProgressBar--color--black{border:1px solid #000!important}.ProgressBar--color--black .ProgressBar__fill{background-color:#000}.ProgressBar--color--white{border:1px solid #d9d9d9!important}.ProgressBar--color--white .ProgressBar__fill{background-color:#d9d9d9}.ProgressBar--color--red{border:1px solid #bd2020!important}.ProgressBar--color--red .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--orange{border:1px solid #d95e0c!important}.ProgressBar--color--orange .ProgressBar__fill{background-color:#d95e0c}.ProgressBar--color--yellow{border:1px solid #d9b804!important}.ProgressBar--color--yellow .ProgressBar__fill{background-color:#d9b804}.ProgressBar--color--olive{border:1px solid #9aad14!important}.ProgressBar--color--olive .ProgressBar__fill{background-color:#9aad14}.ProgressBar--color--green{border:1px solid #1b9638!important}.ProgressBar--color--green .ProgressBar__fill{background-color:#1b9638}.ProgressBar--color--teal{border:1px solid #009a93!important}.ProgressBar--color--teal .ProgressBar__fill{background-color:#009a93}.ProgressBar--color--blue{border:1px solid #1c71b1!important}.ProgressBar--color--blue .ProgressBar__fill{background-color:#1c71b1}.ProgressBar--color--violet{border:1px solid #552dab!important}.ProgressBar--color--violet .ProgressBar__fill{background-color:#552dab}.ProgressBar--color--purple{border:1px solid #8b2baa!important}.ProgressBar--color--purple .ProgressBar__fill{background-color:#8b2baa}.ProgressBar--color--pink{border:1px solid #cf2082!important}.ProgressBar--color--pink .ProgressBar__fill{background-color:#cf2082}.ProgressBar--color--brown{border:1px solid #8c5836!important}.ProgressBar--color--brown .ProgressBar__fill{background-color:#8c5836}.ProgressBar--color--grey{border:1px solid #646464!important}.ProgressBar--color--grey .ProgressBar__fill{background-color:#646464}.ProgressBar--color--good{border:1px solid #4d9121!important}.ProgressBar--color--good .ProgressBar__fill{background-color:#4d9121}.ProgressBar--color--average{border:1px solid #cd7a0d!important}.ProgressBar--color--average .ProgressBar__fill{background-color:#cd7a0d}.ProgressBar--color--bad{border:1px solid #bd2020!important}.ProgressBar--color--bad .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--label{border:1px solid #657a94!important}.ProgressBar--color--label .ProgressBar__fill{background-color:#657a94}.Section{position:relative;margin-bottom:6px;background-color:#1a1a1a;background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5);box-sizing:border-box}.Section:last-child{margin-bottom:0}.Section__title{position:relative;padding:6px;border-bottom:2px solid #4972a1}.Section__titleText{font-size:14px;font-weight:700}.Section__buttons{position:absolute;display:inline-block;right:6px;margin-top:-1px}.Section__content{padding:8px 6px}.Section--level--1 .Section__titleText{font-size:14px}.Section--level--2 .Section__titleText{font-size:13px}.Section--level--3 .Section__titleText{font-size:12px}.Section--level--2,.Section--level--3{background-color:transparent;box-shadow:none;margin-left:-6px;margin-right:-6px}.Slider{cursor:e-resize}.Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none!important}.Slider__cursor{position:absolute;top:0;right:-1px;bottom:0;width:0;border-left:2px solid #fff}.Slider__pointer{position:absolute;right:-5px;bottom:-4px;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #fff}.Slider__popupValue{position:absolute;right:0;top:-22px;padding:2px 4px;background-color:#000;transform:translateX(50%);white-space:nowrap}.Table{display:table;width:100%;border-collapse:collapse;border-spacing:0;margin:0}.Table--collapsing{width:auto}.Table__row{display:table-row}.Table__cell{display:table-cell;padding:0 3px}.Table__cell:first-child{padding-left:0}.Table__cell:last-child{padding-right:0}.Table__cell--header,.Table__row--header .Table__cell{font-weight:700;padding-bottom:6px}.Table__cell--collapsing{width:1%;white-space:nowrap}.Tabs--horizontal{border-bottom:2px solid hsla(0,0%,100%,.1);margin-bottom:6px}.Tabs--horizontal .Tabs__tab--altSelection:after{content:"";position:absolute;bottom:0;right:0;left:0;height:2px;width:100%;background-color:#fff;border-radius:2px}.Tabs--vertical{margin-right:9px}.Tabs--vertical .Tabs__tabBox{border-right:2px solid hsla(0,0%,100%,.1);vertical-align:top}.Tabs--vertical .Tabs__tab{display:block!important;margin-right:0!important;margin-bottom:0;padding:1px 9px 0 6px;border-bottom:2px solid hsla(0,0%,100%,.1)}.Tabs--vertical .Tabs__tab:last-child{border-bottom:0}.Tabs--vertical .Tabs__tab--altSelection:after{content:"";position:absolute;top:0;bottom:0;right:0;height:100%;width:3px;background-color:#fff;border-radius:2px}.Tooltip{position:absolute;top:0;left:0;right:0;bottom:0;font-style:normal;font-weight:400}.Tooltip:after{position:absolute;display:block;white-space:nowrap;z-index:2;padding:6px 10px;transform:translateX(-50%);pointer-events:none;visibility:hidden;opacity:0;text-align:left;content:attr(data-tooltip);transition:all .15s;background-color:#000;box-shadow:1px 1px 15px -1px rgba(0,0,0,.5);border-radius:2px}.Tooltip:hover:after{transition:all 70ms;pointer-events:none;visibility:visible;opacity:1}.Tooltip--long:after{width:250px;white-space:normal}.Tooltip--top:after{bottom:100%;left:50%;transform:translateX(-50%) translateY(8px)}.Tooltip--bottom:after,.Tooltip--top:hover:after{transform:translateX(-50%) translateY(-8px)}.Tooltip--bottom:after{top:100%;left:50%}.Tooltip--bottom:hover:after{transform:translateX(-50%) translateY(8px)}.Tooltip--bottom-left:after{top:100%;right:50%;transform:translateX(12px) translateY(-8px)}.Tooltip--bottom-left:hover:after{transform:translateX(12px) translateY(8px)}.Tooltip--bottom-right:after{top:100%;left:50%;transform:translateX(-12px) translateY(-8px)}.Tooltip--bottom-right:hover:after{transform:translateX(-12px) translateY(8px)}.Tooltip--left:after{top:50%;right:100%;transform:translateX(8px) translateY(-50%)}.Tooltip--left:hover:after,.Tooltip--right:after{transform:translateX(-8px) translateY(-50%)}.Tooltip--right:after{top:50%;left:100%}.Tooltip--right:hover:after{transform:translateX(8px) translateY(-50%)}.CameraConsole__left{position:absolute;top:0;bottom:0;left:0;width:220px}.CameraConsole__right{position:absolute;top:0;bottom:0;left:220px;right:0;background-color:rgba(0,0,0,.33)}.CameraConsole__toolbar{left:0;margin:3px 12px 0}.CameraConsole__toolbar,.CameraConsole__toolbarRight{position:absolute;top:0;right:0;height:24px;line-height:24px}.CameraConsole__toolbarRight{margin:4px 6px 0}.CameraConsole__map{position:absolute;top:26px;bottom:0;left:0;right:0;margin:6px;text-align:center}.CameraConsole__map .NoticeBox{margin-top:calc(50% - 24px)}.NuclearBomb__displayBox{background-color:#002003;border:4px inset #e8e4c9;color:#03e017;font-size:24px;font-family:monospace;padding:6px}.NuclearBomb__Button--keypad{background-color:#e8e4c9;border-color:#e8e4c9}.NuclearBomb__Button--keypad:hover{background-color:#f7f6ee!important;border-color:#f7f6ee!important}.NuclearBomb__Button--1{background-color:#d3cfb7!important;border-color:#d3cfb7!important;color:#a9a692!important}.NuclearBomb__Button--E{background-color:#d9b804!important;border-color:#d9b804!important}.NuclearBomb__Button--E:hover{background-color:#f3d00e!important;border-color:#f3d00e!important}.NuclearBomb__Button--C{background-color:#bd2020!important;border-color:#bd2020!important}.NuclearBomb__Button--C:hover{background-color:#d52b2b!important;border-color:#d52b2b!important}.NuclearBomb__NTIcon{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMCIgdmlld0JveD0iMCAwIDQyNSAyMDAiIG9wYWNpdHk9Ii4zMyI+PHBhdGggZD0iTTE3OC4wMDQuMDM5SDEwNi44YTYuNzYxIDYuMDI2IDAgMDAtNi43NjEgNi4wMjV2MTg3Ljg3MmE2Ljc2MSA2LjAyNiAwIDAwNi43NjEgNi4wMjVoNTMuMTA3YTYuNzYxIDYuMDI2IDAgMDA2Ljc2Mi02LjAyNVY5Mi4zOTJsNzIuMjE2IDEwNC43YTYuNzYxIDYuMDI2IDAgMDA1Ljc2IDIuODdIMzE4LjJhNi43NjEgNi4wMjYgMCAwMDYuNzYxLTYuMDI2VjYuMDY0QTYuNzYxIDYuMDI2IDAgMDAzMTguMi4wNGgtNTQuNzE3YTYuNzYxIDYuMDI2IDAgMDAtNi43NiA2LjAyNXYxMDIuNjJMMTgzLjc2MyAyLjkwOWE2Ljc2MSA2LjAyNiAwIDAwLTUuNzYtMi44N3pNNC44NDUgMjIuMTA5QTEzLjQxMiAxMi41MDIgMCAwMTEzLjQ3OC4wMzloNjYuMTE4QTUuMzY1IDUgMCAwMTg0Ljk2IDUuMDR2NzkuODh6TTQyMC4xNTUgMTc3Ljg5MWExMy40MTIgMTIuNTAyIDAgMDEtOC42MzMgMjIuMDdoLTY2LjExOGE1LjM2NSA1IDAgMDEtNS4zNjUtNS4wMDF2LTc5Ljg4eiIvPjwvc3ZnPg==);background-size:70%;background-position:50%;background-repeat:no-repeat}.Roulette{font-family:Palatino}.Roulette__board{display:table;width:100%;border-collapse:collapse;border:2px solid #fff;margin:0}.Roulette__board-row{padding:0;margin:0}.Roulette__board-cell{display:table-cell;padding:0;margin:0;border:2px solid #fff;font-family:Palatino}.Roulette__board-cell:first-child{padding-left:0}.Roulette__board-cell:last-child{padding-right:0}.Roulette__board-extrabutton{text-align:center;font-size:20px;font-weight:700;height:28px;border:none!important;margin:0!important;padding-top:4px!important;color:#fff!important}.Roulette__lowertable{margin-top:8px;margin-left:80px;margin-right:80px;border-collapse:collapse;border:2px solid #fff;border-spacing:0}.Roulette__lowertable--cell{border:2px solid #fff;padding:0;margin:0}.Roulette__lowertable--betscell{vertical-align:top}.Roulette__lowertable--spinresult{text-align:center;font-size:100px;font-weight:700;vertical-align:middle}.Roulette__lowertable--spinresult-black{background-color:#000}.Roulette__lowertable--spinresult-red{background-color:#db2828}.Roulette__lowertable--spinresult-green{background-color:#20b142}.Roulette__lowertable--spinbutton{margin:0!important;border:none!important;font-size:50px;line-height:60px!important;text-align:center;font-weight:700}.Roulette__lowertable--header{width:1%;text-align:center;font-size:20px;font-weight:700}.Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden;margin-bottom:-6px;scrollbar-base-color:#1c1c1c;scrollbar-face-color:#3b3b3b;scrollbar-3dlight-color:#252525;scrollbar-highlight-color:#252525;scrollbar-track-color:#1c1c1c;scrollbar-arrow-color:#929292;scrollbar-shadow-color:#3b3b3b}.Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.NtosHeader__left{position:absolute;left:12px}.NtosHeader__right{position:absolute;right:12px}.NtosHeader__icon{margin-top:-9px;margin-bottom:-6px;vertical-align:middle}.NtosWindow__header{position:absolute;top:0;left:0;right:0;height:28px;line-height:27px;background-color:rgba(0,0,0,.5);font-family:Consolas,monospace;font-size:14px;user-select:none;-ms-user-select:none}.NtosWindow__content>.Layout__content{margin-top:28px;font-family:Consolas,monospace;font-size:14px}.TitleBar{background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.TitleBar__clickable{color:hsla(0,0%,100%,.5);background-color:#363636;transition:color .25s,background-color .25s}.TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.TitleBar__title{position:absolute;top:0;left:46px;color:hsla(0,0%,100%,.75);font-size:14px;line-height:31px;white-space:nowrap}.TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px}.TitleBar__statusIcon{position:absolute;top:0;left:12px;transition:color .5s;font-size:20px;line-height:32px!important}.TitleBar__minimize{position:absolute;top:6px;right:46px}.TitleBar__close{position:absolute;top:-1px;right:0;width:45px;height:32px;font-size:20px;line-height:31px;text-align:center}.Window{bottom:0;right:0;color:#fff;background-color:#252525;background-image:linear-gradient(180deg,#2a2a2a 0,#202020)}.Window,.Window__titleBar{position:fixed;top:0;left:0}.Window__titleBar{z-index:1;width:100%;height:32px}.Window__rest{top:32px}.Window__dimmer,.Window__rest{position:fixed;bottom:0;left:0;right:0}.Window__dimmer{top:0;background-color:rgba(62,62,62,.25);pointer-events:none}.Window__toast{position:fixed;bottom:0;left:0;right:0;font-size:12px;height:40px;line-height:39px;padding:0 12px;background-color:#131313;color:hsla(0,0%,100%,.8)}.Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;height:20px;cursor:se-resize}.Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;cursor:s-resize}.Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;cursor:e-resize}.Layout__content{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMCIgdmlld0JveD0iMCAwIDQyNSAyMDAiIG9wYWNpdHk9Ii4zMyI+PHBhdGggZD0iTTE3OC4wMDQuMDM5SDEwNi44YTYuNzYxIDYuMDI2IDAgMDAtNi43NjEgNi4wMjV2MTg3Ljg3MmE2Ljc2MSA2LjAyNiAwIDAwNi43NjEgNi4wMjVoNTMuMTA3YTYuNzYxIDYuMDI2IDAgMDA2Ljc2Mi02LjAyNVY5Mi4zOTJsNzIuMjE2IDEwNC43YTYuNzYxIDYuMDI2IDAgMDA1Ljc2IDIuODdIMzE4LjJhNi43NjEgNi4wMjYgMCAwMDYuNzYxLTYuMDI2VjYuMDY0QTYuNzYxIDYuMDI2IDAgMDAzMTguMi4wNGgtNTQuNzE3YTYuNzYxIDYuMDI2IDAgMDAtNi43NiA2LjAyNXYxMDIuNjJMMTgzLjc2MyAyLjkwOWE2Ljc2MSA2LjAyNiAwIDAwLTUuNzYtMi44N3pNNC44NDUgMjIuMTA5QTEzLjQxMiAxMi41MDIgMCAwMTEzLjQ3OC4wMzloNjYuMTE4QTUuMzY1IDUgMCAwMTg0Ljk2IDUuMDR2NzkuODh6TTQyMC4xNTUgMTc3Ljg5MWExMy40MTIgMTIuNTAyIDAgMDEtOC42MzMgMjIuMDdoLTY2LjExOGE1LjM2NSA1IDAgMDEtNS4zNjUtNS4wMDF2LTc5Ljg4eiIvPjwvc3ZnPg==);background-size:70%;background-position:50%;background-repeat:no-repeat}.theme-cardtable .Button{position:relative;display:inline-block;line-height:20px;padding:0 6px;margin-right:2px;white-space:nowrap;outline:0;border-radius:0;margin-bottom:2px;user-select:none;-ms-user-select:none}.theme-cardtable .Button:last-child{margin-right:0}.theme-cardtable .Button .fa,.theme-cardtable .Button .far,.theme-cardtable .Button .fas{margin-left:-3px;margin-right:-3px;min-width:16px;text-align:center}.theme-cardtable .Button--hasContent .fa,.theme-cardtable .Button--hasContent .far,.theme-cardtable .Button--hasContent .fas{margin-right:3px}.theme-cardtable .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-cardtable .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-cardtable .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#117039;color:#fff}.theme-cardtable .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-cardtable .Button--color--default:focus{transition:color .1s,background-color .1s}.theme-cardtable .Button--color--default:focus,.theme-cardtable .Button--color--default:hover{background-color:#1c8247;color:#fff}.theme-cardtable .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#be6209;color:#fff}.theme-cardtable .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-cardtable .Button--color--caution:focus{transition:color .1s,background-color .1s}.theme-cardtable .Button--color--caution:focus,.theme-cardtable .Button--color--caution:hover{background-color:#d67313;color:#fff}.theme-cardtable .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-cardtable .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-cardtable .Button--color--danger:focus{transition:color .1s,background-color .1s}.theme-cardtable .Button--color--danger:focus,.theme-cardtable .Button--color--danger:hover{background-color:#afb30a;color:#fff}.theme-cardtable .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#117039;color:#fff;background-color:rgba(17,112,57,0);color:hsla(0,0%,100%,.5)}.theme-cardtable .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-cardtable .Button--color--transparent:focus{transition:color .1s,background-color .1s}.theme-cardtable .Button--color--transparent:focus,.theme-cardtable .Button--color--transparent:hover{background-color:#1c8247;color:#fff}.theme-cardtable .Button--disabled{background-color:#363636!important}.theme-cardtable .Button--selected{transition:color 50ms,background-color 50ms;background-color:#9d0808;color:#fff}.theme-cardtable .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-cardtable .Button--selected:focus{transition:color .1s,background-color .1s}.theme-cardtable .Button--selected:focus,.theme-cardtable .Button--selected:hover{background-color:#b31212;color:#fff}.theme-cardtable .Input{position:relative;display:inline-block;width:120px;border:1px solid #88bfff;border:1px solid rgba(136,191,255,.75);border-radius:0;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 4px;margin-right:2px;line-height:17px;overflow:visible}.theme-cardtable .Input--fluid{display:block;width:auto}.theme-cardtable .Input__baseline{display:inline-block;color:transparent}.theme-cardtable .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:12px;line-height:17px;height:17px;margin:0;padding:0 6px;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.theme-cardtable .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:hsla(0,0%,100%,.45)}.theme-cardtable .NumberInput{position:relative;display:inline-block;border:1px solid #fff;border:1px solid hsla(0,0%,100%,.75);border-radius:0;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 4px;margin-right:2px;line-height:17px;text-align:right;overflow:visible;cursor:n-resize}.theme-cardtable .NumberInput--fluid{display:block}.theme-cardtable .NumberInput__content{margin-left:6px}.theme-cardtable .NumberInput__barContainer{position:absolute;top:2px;bottom:2px;left:2px}.theme-cardtable .NumberInput__bar{position:absolute;bottom:0;left:0;width:3px;box-sizing:border-box;border-bottom:1px solid #fff;background-color:#fff}.theme-cardtable .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:12px;line-height:17px;height:17px;margin:0;padding:0 6px;font-family:Verdana,sans-serif;background-color:#000;color:#fff;text-align:right}.theme-cardtable .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 6px;border-radius:0;background-color:rgba(0,0,0,.5);transition:border-color .5s}.theme-cardtable .ProgressBar__fill{position:absolute;top:0;left:0;bottom:0}.theme-cardtable .ProgressBar__fill--animated{transition:background-color .5s,width .5s}.theme-cardtable .ProgressBar__content{position:relative;line-height:17px;width:100%;text-align:right}.theme-cardtable .ProgressBar--color--default{border:1px solid #000}.theme-cardtable .ProgressBar--color--default .ProgressBar__fill{background-color:#000}.theme-cardtable .Section{position:relative;margin-bottom:6px;background-color:#1a1a1a;background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5);box-sizing:border-box}.theme-cardtable .Section:last-child{margin-bottom:0}.theme-cardtable .Section__title{position:relative;padding:6px;border-bottom:2px solid #000}.theme-cardtable .Section__titleText{font-size:14px;font-weight:700}.theme-cardtable .Section__buttons{position:absolute;display:inline-block;right:6px;margin-top:-1px}.theme-cardtable .Section__content{padding:8px 6px}.theme-cardtable .Section--level--1 .Section__titleText{font-size:14px}.theme-cardtable .Section--level--2 .Section__titleText{font-size:13px}.theme-cardtable .Section--level--3 .Section__titleText{font-size:12px}.theme-cardtable .Section--level--2,.theme-cardtable .Section--level--3{background-color:transparent;box-shadow:none;margin-left:-6px;margin-right:-6px}.theme-cardtable .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden;margin-bottom:-6px;scrollbar-base-color:#0d542b;scrollbar-face-color:#16914a;scrollbar-3dlight-color:#117039;scrollbar-highlight-color:#117039;scrollbar-track-color:#0d542b;scrollbar-arrow-color:#5ae695;scrollbar-shadow-color:#16914a}.theme-cardtable .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-cardtable .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#117039;background-image:linear-gradient(180deg,#117039 0,#117039)}.theme-cardtable .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px}.theme-cardtable .Window__rest{position:fixed;top:32px;bottom:0;left:0;right:0}.theme-cardtable .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(39,148,85,.25);pointer-events:none}.theme-cardtable .Window__toast{position:fixed;bottom:0;left:0;right:0;font-size:12px;height:40px;line-height:39px;padding:0 12px;background-color:#09381d;color:hsla(0,0%,100%,.8)}.theme-cardtable .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;height:20px;cursor:se-resize}.theme-cardtable .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;cursor:s-resize}.theme-cardtable .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;cursor:e-resize}.theme-cardtable .TitleBar{background-color:#381608;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-cardtable .TitleBar__clickable{color:hsla(0,0%,100%,.5);background-color:#381608;transition:color .25s,background-color .25s}.theme-cardtable .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-cardtable .TitleBar__title{position:absolute;top:0;left:46px;color:hsla(0,0%,100%,.75);font-size:14px;line-height:31px;white-space:nowrap}.theme-cardtable .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px}.theme-cardtable .TitleBar__statusIcon{position:absolute;top:0;left:12px;transition:color .5s;font-size:20px;line-height:32px!important}.theme-cardtable .TitleBar__minimize{position:absolute;top:6px;right:46px}.theme-cardtable .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;height:32px;font-size:20px;line-height:31px;text-align:center}.theme-cardtable .Button{border:2px solid #fff}.theme-malfunction .Button{position:relative;display:inline-block;line-height:20px;padding:0 6px;margin-right:2px;white-space:nowrap;outline:0;border-radius:2px;margin-bottom:2px;user-select:none;-ms-user-select:none}.theme-malfunction .Button:last-child{margin-right:0}.theme-malfunction .Button .fa,.theme-malfunction .Button .far,.theme-malfunction .Button .fas{margin-left:-3px;margin-right:-3px;min-width:16px;text-align:center}.theme-malfunction .Button--hasContent .fa,.theme-malfunction .Button--hasContent .far,.theme-malfunction .Button--hasContent .fas{margin-right:3px}.theme-malfunction .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-malfunction .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-malfunction .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#910101;color:#fff}.theme-malfunction .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-malfunction .Button--color--default:focus{transition:color .1s,background-color .1s}.theme-malfunction .Button--color--default:focus,.theme-malfunction .Button--color--default:hover{background-color:#a60b0b;color:#fff}.theme-malfunction .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#be6209;color:#fff}.theme-malfunction .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-malfunction .Button--color--caution:focus{transition:color .1s,background-color .1s}.theme-malfunction .Button--color--caution:focus,.theme-malfunction .Button--color--caution:hover{background-color:#d67313;color:#fff}.theme-malfunction .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-malfunction .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-malfunction .Button--color--danger:focus{transition:color .1s,background-color .1s}.theme-malfunction .Button--color--danger:focus,.theme-malfunction .Button--color--danger:hover{background-color:#afb30a;color:#fff}.theme-malfunction .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#1b3443;color:#fff;background-color:rgba(27,52,67,0);color:hsla(0,0%,100%,.5)}.theme-malfunction .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-malfunction .Button--color--transparent:focus{transition:color .1s,background-color .1s}.theme-malfunction .Button--color--transparent:focus,.theme-malfunction .Button--color--transparent:hover{background-color:#274252;color:#fff}.theme-malfunction .Button--disabled{background-color:#363636!important}.theme-malfunction .Button--selected{transition:color 50ms,background-color 50ms;background-color:#1e5881;color:#fff}.theme-malfunction .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-malfunction .Button--selected:focus{transition:color .1s,background-color .1s}.theme-malfunction .Button--selected:focus,.theme-malfunction .Button--selected:hover{background-color:#2a6894;color:#fff}.theme-malfunction .NoticeBox{padding:4px 6px;margin-bottom:6px;box-shadow:none;font-weight:700;font-style:italic;color:#fff;background-color:#1a3f57;background-image:repeating-linear-gradient(-45deg,transparent,transparent 10px,rgba(0,0,0,.1) 0,rgba(0,0,0,.1) 20px)}.theme-malfunction .NoticeBox--type--info{color:#fff;background-color:#235982}.theme-malfunction .NoticeBox--type--success{color:#fff;background-color:#1e662f}.theme-malfunction .NoticeBox--type--warning{color:#fff;background-color:#a95219}.theme-malfunction .NoticeBox--type--danger{color:#fff;background-color:#8f2828}.theme-malfunction .Input{position:relative;display:inline-block;width:120px;border:1px solid #910101;border:1px solid rgba(145,1,1,.75);border-radius:2px;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 4px;margin-right:2px;line-height:17px;overflow:visible}.theme-malfunction .Input--fluid{display:block;width:auto}.theme-malfunction .Input__baseline{display:inline-block;color:transparent}.theme-malfunction .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:12px;line-height:17px;height:17px;margin:0;padding:0 6px;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.theme-malfunction .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:hsla(0,0%,100%,.45)}.theme-malfunction .NumberInput{position:relative;display:inline-block;border:1px solid #910101;border:1px solid rgba(145,1,1,.75);border-radius:2px;color:#910101;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 4px;margin-right:2px;line-height:17px;text-align:right;overflow:visible;cursor:n-resize}.theme-malfunction .NumberInput--fluid{display:block}.theme-malfunction .NumberInput__content{margin-left:6px}.theme-malfunction .NumberInput__barContainer{position:absolute;top:2px;bottom:2px;left:2px}.theme-malfunction .NumberInput__bar{position:absolute;bottom:0;left:0;width:3px;box-sizing:border-box;border-bottom:1px solid #910101;background-color:#910101}.theme-malfunction .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:12px;line-height:17px;height:17px;margin:0;padding:0 6px;font-family:Verdana,sans-serif;background-color:#000;color:#fff;text-align:right}.theme-malfunction .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 6px;border-radius:2px;background-color:rgba(0,0,0,.5);transition:border-color .5s}.theme-malfunction .ProgressBar__fill{position:absolute;top:0;left:0;bottom:0}.theme-malfunction .ProgressBar__fill--animated{transition:background-color .5s,width .5s}.theme-malfunction .ProgressBar__content{position:relative;line-height:17px;width:100%;text-align:right}.theme-malfunction .ProgressBar--color--default{border:1px solid #7b0101}.theme-malfunction .ProgressBar--color--default .ProgressBar__fill{background-color:#7b0101}.theme-malfunction .Section{position:relative;margin-bottom:6px;background-color:#1a1a1a;background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5);box-sizing:border-box}.theme-malfunction .Section:last-child{margin-bottom:0}.theme-malfunction .Section__title{position:relative;padding:6px;border-bottom:2px solid #910101}.theme-malfunction .Section__titleText{font-size:14px;font-weight:700}.theme-malfunction .Section__buttons{position:absolute;display:inline-block;right:6px;margin-top:-1px}.theme-malfunction .Section__content{padding:8px 6px}.theme-malfunction .Section--level--1 .Section__titleText{font-size:14px}.theme-malfunction .Section--level--2 .Section__titleText{font-size:13px}.theme-malfunction .Section--level--3 .Section__titleText{font-size:12px}.theme-malfunction .Section--level--2,.theme-malfunction .Section--level--3{background-color:transparent;box-shadow:none;margin-left:-6px;margin-right:-6px}.theme-malfunction .Tooltip{position:absolute;top:0;left:0;right:0;bottom:0;font-style:normal;font-weight:400}.theme-malfunction .Tooltip:after{position:absolute;display:block;white-space:nowrap;z-index:2;padding:6px 10px;transform:translateX(-50%);pointer-events:none;visibility:hidden;opacity:0;text-align:left;content:attr(data-tooltip);transition:all .15s;background-color:#235577;box-shadow:1px 1px 15px -1px rgba(0,0,0,.5);border-radius:2px}.theme-malfunction .Tooltip:hover:after{transition:all 70ms;pointer-events:none;visibility:visible;opacity:1}.theme-malfunction .Tooltip--long:after{width:250px;white-space:normal}.theme-malfunction .Tooltip--top:after{bottom:100%;left:50%;transform:translateX(-50%) translateY(8px)}.theme-malfunction .Tooltip--bottom:after,.theme-malfunction .Tooltip--top:hover:after{transform:translateX(-50%) translateY(-8px)}.theme-malfunction .Tooltip--bottom:after{top:100%;left:50%}.theme-malfunction .Tooltip--bottom:hover:after{transform:translateX(-50%) translateY(8px)}.theme-malfunction .Tooltip--bottom-left:after{top:100%;right:50%;transform:translateX(12px) translateY(-8px)}.theme-malfunction .Tooltip--bottom-left:hover:after{transform:translateX(12px) translateY(8px)}.theme-malfunction .Tooltip--bottom-right:after{top:100%;left:50%;transform:translateX(-12px) translateY(-8px)}.theme-malfunction .Tooltip--bottom-right:hover:after{transform:translateX(-12px) translateY(8px)}.theme-malfunction .Tooltip--left:after{top:50%;right:100%;transform:translateX(8px) translateY(-50%)}.theme-malfunction .Tooltip--left:hover:after,.theme-malfunction .Tooltip--right:after{transform:translateX(-8px) translateY(-50%)}.theme-malfunction .Tooltip--right:after{top:50%;left:100%}.theme-malfunction .Tooltip--right:hover:after{transform:translateX(8px) translateY(-50%)}.theme-malfunction .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden;margin-bottom:-6px;scrollbar-base-color:#142732;scrollbar-face-color:#274b61;scrollbar-3dlight-color:#1b3443;scrollbar-highlight-color:#1b3443;scrollbar-track-color:#142732;scrollbar-arrow-color:#6ba2c3;scrollbar-shadow-color:#274b61}.theme-malfunction .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-malfunction .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#1b3443;background-image:linear-gradient(180deg,#244559 0,#12232d)}.theme-malfunction .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px}.theme-malfunction .Window__rest{position:fixed;top:32px;bottom:0;left:0;right:0}.theme-malfunction .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(50,79,96,.25);pointer-events:none}.theme-malfunction .Window__toast{position:fixed;bottom:0;left:0;right:0;font-size:12px;height:40px;line-height:39px;padding:0 12px;background-color:#0e1a22;color:hsla(0,0%,100%,.8)}.theme-malfunction .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;height:20px;cursor:se-resize}.theme-malfunction .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;cursor:s-resize}.theme-malfunction .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;cursor:e-resize}.theme-malfunction .TitleBar{background-color:#1a3f57;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-malfunction .TitleBar__clickable{color:hsla(0,0%,100%,.5);background-color:#1a3f57;transition:color .25s,background-color .25s}.theme-malfunction .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-malfunction .TitleBar__title{position:absolute;top:0;left:46px;color:hsla(0,0%,100%,.75);font-size:14px;line-height:31px;white-space:nowrap}.theme-malfunction .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px}.theme-malfunction .TitleBar__statusIcon{position:absolute;top:0;left:12px;transition:color .5s;font-size:20px;line-height:32px!important}.theme-malfunction .TitleBar__minimize{position:absolute;top:6px;right:46px}.theme-malfunction .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;height:32px;font-size:20px;line-height:31px;text-align:center}.theme-malfunction .Layout__content{background-image:none}.theme-ntos .Button{position:relative;display:inline-block;line-height:20px;padding:0 6px;margin-right:2px;white-space:nowrap;outline:0;border-radius:2px;margin-bottom:2px;user-select:none;-ms-user-select:none}.theme-ntos .Button:last-child{margin-right:0}.theme-ntos .Button .fa,.theme-ntos .Button .far,.theme-ntos .Button .fas{margin-left:-3px;margin-right:-3px;min-width:16px;text-align:center}.theme-ntos .Button--hasContent .fa,.theme-ntos .Button--hasContent .far,.theme-ntos .Button--hasContent .fas{margin-right:3px}.theme-ntos .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-ntos .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-ntos .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#384e68;color:#fff}.theme-ntos .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-ntos .Button--color--default:focus{transition:color .1s,background-color .1s}.theme-ntos .Button--color--default:focus,.theme-ntos .Button--color--default:hover{background-color:#465e7a;color:#fff}.theme-ntos .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.theme-ntos .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-ntos .Button--color--caution:focus{transition:color .1s,background-color .1s}.theme-ntos .Button--color--caution:focus,.theme-ntos .Button--color--caution:hover{background-color:#f3d00e;color:#000}.theme-ntos .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.theme-ntos .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-ntos .Button--color--danger:focus{transition:color .1s,background-color .1s}.theme-ntos .Button--color--danger:focus,.theme-ntos .Button--color--danger:hover{background-color:#d52b2b;color:#fff}.theme-ntos .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#1f2b39;color:#fff;background-color:rgba(31,43,57,0);color:rgba(227,240,255,.75)}.theme-ntos .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-ntos .Button--color--transparent:focus{transition:color .1s,background-color .1s}.theme-ntos .Button--color--transparent:focus,.theme-ntos .Button--color--transparent:hover{background-color:#2b3847;color:#fff}.theme-ntos .Button--disabled{background-color:#999!important}.theme-ntos .Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.theme-ntos .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-ntos .Button--selected:focus{transition:color .1s,background-color .1s}.theme-ntos .Button--selected:focus,.theme-ntos .Button--selected:hover{background-color:#27ab46;color:#fff}.theme-ntos .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 6px;border-radius:2px;background-color:rgba(0,0,0,.5);transition:border-color .5s}.theme-ntos .ProgressBar__fill{position:absolute;top:0;left:0;bottom:0}.theme-ntos .ProgressBar__fill--animated{transition:background-color .5s,width .5s}.theme-ntos .ProgressBar__content{position:relative;line-height:17px;width:100%;text-align:right}.theme-ntos .ProgressBar--color--default{border:1px solid #384e68}.theme-ntos .ProgressBar--color--default .ProgressBar__fill{background-color:#384e68}.theme-ntos .Section{position:relative;margin-bottom:6px;background-color:#1a1a1a;background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5);box-sizing:border-box}.theme-ntos .Section:last-child{margin-bottom:0}.theme-ntos .Section__title{position:relative;padding:6px;border-bottom:2px solid #4972a1}.theme-ntos .Section__titleText{font-size:14px;font-weight:700}.theme-ntos .Section__buttons{position:absolute;display:inline-block;right:6px;margin-top:-1px}.theme-ntos .Section__content{padding:8px 6px}.theme-ntos .Section--level--1 .Section__titleText{font-size:14px}.theme-ntos .Section--level--2 .Section__titleText{font-size:13px}.theme-ntos .Section--level--3 .Section__titleText{font-size:12px}.theme-ntos .Section--level--2,.theme-ntos .Section--level--3{background-color:transparent;box-shadow:none;margin-left:-6px;margin-right:-6px}.theme-ntos .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden;margin-bottom:-6px;scrollbar-base-color:#17202b;scrollbar-face-color:#2e3f55;scrollbar-3dlight-color:#1f2b39;scrollbar-highlight-color:#1f2b39;scrollbar-track-color:#17202b;scrollbar-arrow-color:#7693b5;scrollbar-shadow-color:#2e3f55}.theme-ntos .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-ntos .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#1f2b39;background-image:linear-gradient(180deg,#223040 0,#1b2633)}.theme-ntos .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px}.theme-ntos .Window__rest{position:fixed;top:32px;bottom:0;left:0;right:0}.theme-ntos .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(55,69,85,.25);pointer-events:none}.theme-ntos .Window__toast{position:fixed;bottom:0;left:0;right:0;font-size:12px;height:40px;line-height:39px;padding:0 12px;background-color:#0f151d;color:hsla(0,0%,100%,.8)}.theme-ntos .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;height:20px;cursor:se-resize}.theme-ntos .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;cursor:s-resize}.theme-ntos .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;cursor:e-resize}.theme-ntos .TitleBar{background-color:#2a3b4e;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-ntos .TitleBar__clickable{color:hsla(0,0%,100%,.5);background-color:#2a3b4e;transition:color .25s,background-color .25s}.theme-ntos .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-ntos .TitleBar__title{position:absolute;top:0;left:46px;color:hsla(0,0%,100%,.75);font-size:14px;line-height:31px;white-space:nowrap}.theme-ntos .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px}.theme-ntos .TitleBar__statusIcon{position:absolute;top:0;left:12px;transition:color .5s;font-size:20px;line-height:32px!important}.theme-ntos .TitleBar__minimize{position:absolute;top:6px;right:46px}.theme-ntos .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;height:32px;font-size:20px;line-height:31px;text-align:center}.theme-hackerman .Button{position:relative;display:inline-block;line-height:20px;padding:0 6px;margin-right:2px;white-space:nowrap;outline:0;border-radius:2px;margin-bottom:2px;user-select:none;-ms-user-select:none}.theme-hackerman .Button:last-child{margin-right:0}.theme-hackerman .Button .fa,.theme-hackerman .Button .far,.theme-hackerman .Button .fas{margin-left:-3px;margin-right:-3px;min-width:16px;text-align:center}.theme-hackerman .Button--hasContent .fa,.theme-hackerman .Button--hasContent .far,.theme-hackerman .Button--hasContent .fas{margin-right:3px}.theme-hackerman .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-hackerman .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-hackerman .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#0f0;color:#000}.theme-hackerman .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-hackerman .Button--color--default:focus{transition:color .1s,background-color .1s}.theme-hackerman .Button--color--default:focus,.theme-hackerman .Button--color--default:hover{background-color:#26ff26;color:#000}.theme-hackerman .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.theme-hackerman .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-hackerman .Button--color--caution:focus{transition:color .1s,background-color .1s}.theme-hackerman .Button--color--caution:focus,.theme-hackerman .Button--color--caution:hover{background-color:#f3d00e;color:#000}.theme-hackerman .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.theme-hackerman .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-hackerman .Button--color--danger:focus{transition:color .1s,background-color .1s}.theme-hackerman .Button--color--danger:focus,.theme-hackerman .Button--color--danger:hover{background-color:#d52b2b;color:#fff}.theme-hackerman .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#121b12;color:#fff;background-color:rgba(18,27,18,0);color:hsla(0,0%,100%,.5)}.theme-hackerman .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-hackerman .Button--color--transparent:focus{transition:color .1s,background-color .1s}.theme-hackerman .Button--color--transparent:focus,.theme-hackerman .Button--color--transparent:hover{background-color:#1d271d;color:#fff}.theme-hackerman .Button--disabled{background-color:#4a6a4a!important}.theme-hackerman .Button--selected{transition:color 50ms,background-color 50ms;background-color:#0f0;color:#000}.theme-hackerman .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-hackerman .Button--selected:focus{transition:color .1s,background-color .1s}.theme-hackerman .Button--selected:focus,.theme-hackerman .Button--selected:hover{background-color:#26ff26;color:#000}.theme-hackerman .Input{position:relative;display:inline-block;width:120px;border:1px solid #0f0;border:1px solid rgba(0,255,0,.75);border-radius:2px;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 4px;margin-right:2px;line-height:17px;overflow:visible}.theme-hackerman .Input--fluid{display:block;width:auto}.theme-hackerman .Input__baseline{display:inline-block;color:transparent}.theme-hackerman .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:12px;line-height:17px;height:17px;margin:0;padding:0 6px;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.theme-hackerman .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:hsla(0,0%,100%,.45)}.theme-hackerman .Modal{background-color:#121b12;max-width:calc(100% - 1rem);padding:1rem}.theme-hackerman .Section{position:relative;margin-bottom:6px;background-color:#1a1a1a;background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5);box-sizing:border-box}.theme-hackerman .Section:last-child{margin-bottom:0}.theme-hackerman .Section__title{position:relative;padding:6px;border-bottom:2px solid #0f0}.theme-hackerman .Section__titleText{font-size:14px;font-weight:700}.theme-hackerman .Section__buttons{position:absolute;display:inline-block;right:6px;margin-top:-1px}.theme-hackerman .Section__content{padding:8px 6px}.theme-hackerman .Section--level--1 .Section__titleText{font-size:14px}.theme-hackerman .Section--level--2 .Section__titleText{font-size:13px}.theme-hackerman .Section--level--3 .Section__titleText{font-size:12px}.theme-hackerman .Section--level--2,.theme-hackerman .Section--level--3{background-color:transparent;box-shadow:none;margin-left:-6px;margin-right:-6px}.theme-hackerman .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden;margin-bottom:-6px;scrollbar-base-color:#0e140e;scrollbar-face-color:#253725;scrollbar-3dlight-color:#121b12;scrollbar-highlight-color:#121b12;scrollbar-track-color:#0e140e;scrollbar-arrow-color:#74a274;scrollbar-shadow-color:#253725}.theme-hackerman .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-hackerman .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#121b12;background-image:linear-gradient(180deg,#121b12 0,#121b12)}.theme-hackerman .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px}.theme-hackerman .Window__rest{position:fixed;top:32px;bottom:0;left:0;right:0}.theme-hackerman .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(40,50,40,.25);pointer-events:none}.theme-hackerman .Window__toast{position:fixed;bottom:0;left:0;right:0;font-size:12px;height:40px;line-height:39px;padding:0 12px;background-color:#090e09;color:hsla(0,0%,100%,.8)}.theme-hackerman .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;height:20px;cursor:se-resize}.theme-hackerman .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;cursor:s-resize}.theme-hackerman .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;cursor:e-resize}.theme-hackerman .TitleBar{background-color:#223d22;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-hackerman .TitleBar__clickable{color:hsla(0,0%,100%,.5);background-color:#223d22;transition:color .25s,background-color .25s}.theme-hackerman .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-hackerman .TitleBar__title{position:absolute;top:0;left:46px;color:hsla(0,0%,100%,.75);font-size:14px;line-height:31px;white-space:nowrap}.theme-hackerman .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px}.theme-hackerman .TitleBar__statusIcon{position:absolute;top:0;left:12px;transition:color .5s;font-size:20px;line-height:32px!important}.theme-hackerman .TitleBar__minimize{position:absolute;top:6px;right:46px}.theme-hackerman .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;height:32px;font-size:20px;line-height:31px;text-align:center}.theme-hackerman .Layout__content{background-image:none}.theme-hackerman .Button{font-family:monospace;border:2px outset #0a0;outline:1px solid #007a00}.theme-hackerman .candystripe:nth-child(odd){background-color:rgba(0,100,0,.5)}.theme-retro .Button{position:relative;display:inline-block;line-height:20px;padding:0 6px;margin-right:2px;white-space:nowrap;outline:0;border-radius:0;margin-bottom:2px;user-select:none;-ms-user-select:none}.theme-retro .Button:last-child{margin-right:0}.theme-retro .Button .fa,.theme-retro .Button .far,.theme-retro .Button .fas{margin-left:-3px;margin-right:-3px;min-width:16px;text-align:center}.theme-retro .Button--hasContent .fa,.theme-retro .Button--hasContent .far,.theme-retro .Button--hasContent .fas{margin-right:3px}.theme-retro .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-retro .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-retro .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#e8e4c9;color:#000}.theme-retro .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-retro .Button--color--default:focus{transition:color .1s,background-color .1s}.theme-retro .Button--color--default:focus,.theme-retro .Button--color--default:hover{background-color:#f7f6ee;color:#000}.theme-retro .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#be6209;color:#fff}.theme-retro .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-retro .Button--color--caution:focus{transition:color .1s,background-color .1s}.theme-retro .Button--color--caution:focus,.theme-retro .Button--color--caution:hover{background-color:#d67313;color:#fff}.theme-retro .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-retro .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-retro .Button--color--danger:focus{transition:color .1s,background-color .1s}.theme-retro .Button--color--danger:focus,.theme-retro .Button--color--danger:hover{background-color:#afb30a;color:#fff}.theme-retro .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#e8e4c9;color:#000;background-color:rgba(232,228,201,0);color:hsla(0,0%,100%,.5)}.theme-retro .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-retro .Button--color--transparent:focus{transition:color .1s,background-color .1s}.theme-retro .Button--color--transparent:focus,.theme-retro .Button--color--transparent:hover{background-color:#f7f6ee;color:#000}.theme-retro .Button--disabled{background-color:#363636!important}.theme-retro .Button--selected{transition:color 50ms,background-color 50ms;background-color:#9d0808;color:#fff}.theme-retro .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-retro .Button--selected:focus{transition:color .1s,background-color .1s}.theme-retro .Button--selected:focus,.theme-retro .Button--selected:hover{background-color:#b31212;color:#fff}.theme-retro .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 6px;border-radius:0;background-color:rgba(0,0,0,.5);transition:border-color .5s}.theme-retro .ProgressBar__fill{position:absolute;top:0;left:0;bottom:0}.theme-retro .ProgressBar__fill--animated{transition:background-color .5s,width .5s}.theme-retro .ProgressBar__content{position:relative;line-height:17px;width:100%;text-align:right}.theme-retro .ProgressBar--color--default{border:1px solid #000}.theme-retro .ProgressBar--color--default .ProgressBar__fill{background-color:#000}.theme-retro .Section{position:relative;margin-bottom:6px;background-color:#1a1a1a;background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5);box-sizing:border-box}.theme-retro .Section:last-child{margin-bottom:0}.theme-retro .Section__title{position:relative;padding:6px;border-bottom:2px solid #000}.theme-retro .Section__titleText{font-size:14px;font-weight:700}.theme-retro .Section__buttons{position:absolute;display:inline-block;right:6px;margin-top:-1px}.theme-retro .Section__content{padding:8px 6px}.theme-retro .Section--level--1 .Section__titleText{font-size:14px}.theme-retro .Section--level--2 .Section__titleText{font-size:13px}.theme-retro .Section--level--3 .Section__titleText{font-size:12px}.theme-retro .Section--level--2,.theme-retro .Section--level--3{background-color:transparent;box-shadow:none;margin-left:-6px;margin-right:-6px}.theme-retro .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden;margin-bottom:-6px;scrollbar-base-color:#c8be7d;scrollbar-face-color:#eae7ce;scrollbar-3dlight-color:#e8e4c9;scrollbar-highlight-color:#e8e4c9;scrollbar-track-color:#c8be7d;scrollbar-arrow-color:#f4f2e4;scrollbar-shadow-color:#eae7ce}.theme-retro .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-retro .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#e8e4c9;background-image:linear-gradient(180deg,#e8e4c9 0,#e8e4c9)}.theme-retro .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px}.theme-retro .Window__rest{position:fixed;top:32px;bottom:0;left:0;right:0}.theme-retro .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(251,250,246,.25);pointer-events:none}.theme-retro .Window__toast{position:fixed;bottom:0;left:0;right:0;font-size:12px;height:40px;line-height:39px;padding:0 12px;background-color:#988d41;color:hsla(0,0%,100%,.8)}.theme-retro .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;height:20px;cursor:se-resize}.theme-retro .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;cursor:s-resize}.theme-retro .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;cursor:e-resize}.theme-retro .TitleBar{background-color:#585337;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-retro .TitleBar__clickable{color:hsla(0,0%,100%,.5);background-color:#585337;transition:color .25s,background-color .25s}.theme-retro .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-retro .TitleBar__title{position:absolute;top:0;left:46px;color:hsla(0,0%,100%,.75);font-size:14px;line-height:31px;white-space:nowrap}.theme-retro .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px}.theme-retro .TitleBar__statusIcon{position:absolute;top:0;left:12px;transition:color .5s;font-size:20px;line-height:32px!important}.theme-retro .TitleBar__minimize{position:absolute;top:6px;right:46px}.theme-retro .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;height:32px;font-size:20px;line-height:31px;text-align:center}.theme-retro .Button{font-family:monospace;color:#161613;border:8px outset #e8e4c9;outline:3px solid #161613}.theme-retro .Layout__content{background-image:none}.theme-syndicate .Button{position:relative;display:inline-block;line-height:20px;padding:0 6px;margin-right:2px;white-space:nowrap;outline:0;border-radius:2px;margin-bottom:2px;user-select:none;-ms-user-select:none}.theme-syndicate .Button:last-child{margin-right:0}.theme-syndicate .Button .fa,.theme-syndicate .Button .far,.theme-syndicate .Button .fas{margin-left:-3px;margin-right:-3px;min-width:16px;text-align:center}.theme-syndicate .Button--hasContent .fa,.theme-syndicate .Button--hasContent .far,.theme-syndicate .Button--hasContent .fas{margin-right:3px}.theme-syndicate .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-syndicate .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-syndicate .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#397439;color:#fff}.theme-syndicate .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-syndicate .Button--color--default:focus{transition:color .1s,background-color .1s}.theme-syndicate .Button--color--default:focus,.theme-syndicate .Button--color--default:hover{background-color:#478647;color:#fff}.theme-syndicate .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#be6209;color:#fff}.theme-syndicate .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-syndicate .Button--color--caution:focus{transition:color .1s,background-color .1s}.theme-syndicate .Button--color--caution:focus,.theme-syndicate .Button--color--caution:hover{background-color:#d67313;color:#fff}.theme-syndicate .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-syndicate .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-syndicate .Button--color--danger:focus{transition:color .1s,background-color .1s}.theme-syndicate .Button--color--danger:focus,.theme-syndicate .Button--color--danger:hover{background-color:#afb30a;color:#fff}.theme-syndicate .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#550202;color:#fff;background-color:rgba(85,2,2,0);color:hsla(0,0%,100%,.5)}.theme-syndicate .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-syndicate .Button--color--transparent:focus{transition:color .1s,background-color .1s}.theme-syndicate .Button--color--transparent:focus,.theme-syndicate .Button--color--transparent:hover{background-color:#650c0c;color:#fff}.theme-syndicate .Button--disabled{background-color:#363636!important}.theme-syndicate .Button--selected{transition:color 50ms,background-color 50ms;background-color:#9d0808;color:#fff}.theme-syndicate .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-syndicate .Button--selected:focus{transition:color .1s,background-color .1s}.theme-syndicate .Button--selected:focus,.theme-syndicate .Button--selected:hover{background-color:#b31212;color:#fff}.theme-syndicate .NoticeBox{padding:4px 6px;margin-bottom:6px;box-shadow:none;font-weight:700;font-style:italic;color:#fff;background-color:#910101;background-image:repeating-linear-gradient(-45deg,transparent,transparent 10px,rgba(0,0,0,.1) 0,rgba(0,0,0,.1) 20px)}.theme-syndicate .NoticeBox--type--info{color:#fff;background-color:#235982}.theme-syndicate .NoticeBox--type--success{color:#fff;background-color:#1e662f}.theme-syndicate .NoticeBox--type--warning{color:#fff;background-color:#a95219}.theme-syndicate .NoticeBox--type--danger{color:#fff;background-color:#8f2828}.theme-syndicate .Input{position:relative;display:inline-block;width:120px;border:1px solid #87ce87;border:1px solid rgba(135,206,135,.75);border-radius:2px;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 4px;margin-right:2px;line-height:17px;overflow:visible}.theme-syndicate .Input--fluid{display:block;width:auto}.theme-syndicate .Input__baseline{display:inline-block;color:transparent}.theme-syndicate .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:12px;line-height:17px;height:17px;margin:0;padding:0 6px;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.theme-syndicate .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:hsla(0,0%,100%,.45)}.theme-syndicate .NumberInput{position:relative;display:inline-block;border:1px solid #87ce87;border:1px solid rgba(135,206,135,.75);border-radius:2px;color:#87ce87;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 4px;margin-right:2px;line-height:17px;text-align:right;overflow:visible;cursor:n-resize}.theme-syndicate .NumberInput--fluid{display:block}.theme-syndicate .NumberInput__content{margin-left:6px}.theme-syndicate .NumberInput__barContainer{position:absolute;top:2px;bottom:2px;left:2px}.theme-syndicate .NumberInput__bar{position:absolute;bottom:0;left:0;width:3px;box-sizing:border-box;border-bottom:1px solid #87ce87;background-color:#87ce87}.theme-syndicate .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:12px;line-height:17px;height:17px;margin:0;padding:0 6px;font-family:Verdana,sans-serif;background-color:#000;color:#fff;text-align:right}.theme-syndicate .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 6px;border-radius:2px;background-color:rgba(0,0,0,.5);transition:border-color .5s}.theme-syndicate .ProgressBar__fill{position:absolute;top:0;left:0;bottom:0}.theme-syndicate .ProgressBar__fill--animated{transition:background-color .5s,width .5s}.theme-syndicate .ProgressBar__content{position:relative;line-height:17px;width:100%;text-align:right}.theme-syndicate .ProgressBar--color--default{border:1px solid #306330}.theme-syndicate .ProgressBar--color--default .ProgressBar__fill{background-color:#306330}.theme-syndicate .Section{position:relative;margin-bottom:6px;background-color:#1a1a1a;background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5);box-sizing:border-box}.theme-syndicate .Section:last-child{margin-bottom:0}.theme-syndicate .Section__title{position:relative;padding:6px;border-bottom:2px solid #397439}.theme-syndicate .Section__titleText{font-size:14px;font-weight:700}.theme-syndicate .Section__buttons{position:absolute;display:inline-block;right:6px;margin-top:-1px}.theme-syndicate .Section__content{padding:8px 6px}.theme-syndicate .Section--level--1 .Section__titleText{font-size:14px}.theme-syndicate .Section--level--2 .Section__titleText{font-size:13px}.theme-syndicate .Section--level--3 .Section__titleText{font-size:12px}.theme-syndicate .Section--level--2,.theme-syndicate .Section--level--3{background-color:transparent;box-shadow:none;margin-left:-6px;margin-right:-6px}.theme-syndicate .Tooltip{position:absolute;top:0;left:0;right:0;bottom:0;font-style:normal;font-weight:400}.theme-syndicate .Tooltip:after{position:absolute;display:block;white-space:nowrap;z-index:2;padding:6px 10px;transform:translateX(-50%);pointer-events:none;visibility:hidden;opacity:0;text-align:left;content:attr(data-tooltip);transition:all .15s;background-color:#4a0202;box-shadow:1px 1px 15px -1px rgba(0,0,0,.5);border-radius:2px}.theme-syndicate .Tooltip:hover:after{transition:all 70ms;pointer-events:none;visibility:visible;opacity:1}.theme-syndicate .Tooltip--long:after{width:250px;white-space:normal}.theme-syndicate .Tooltip--top:after{bottom:100%;left:50%;transform:translateX(-50%) translateY(8px)}.theme-syndicate .Tooltip--bottom:after,.theme-syndicate .Tooltip--top:hover:after{transform:translateX(-50%) translateY(-8px)}.theme-syndicate .Tooltip--bottom:after{top:100%;left:50%}.theme-syndicate .Tooltip--bottom:hover:after{transform:translateX(-50%) translateY(8px)}.theme-syndicate .Tooltip--bottom-left:after{top:100%;right:50%;transform:translateX(12px) translateY(-8px)}.theme-syndicate .Tooltip--bottom-left:hover:after{transform:translateX(12px) translateY(8px)}.theme-syndicate .Tooltip--bottom-right:after{top:100%;left:50%;transform:translateX(-12px) translateY(-8px)}.theme-syndicate .Tooltip--bottom-right:hover:after{transform:translateX(-12px) translateY(8px)}.theme-syndicate .Tooltip--left:after{top:50%;right:100%;transform:translateX(8px) translateY(-50%)}.theme-syndicate .Tooltip--left:hover:after,.theme-syndicate .Tooltip--right:after{transform:translateX(-8px) translateY(-50%)}.theme-syndicate .Tooltip--right:after{top:50%;left:100%}.theme-syndicate .Tooltip--right:hover:after{transform:translateX(8px) translateY(-50%)}.theme-syndicate .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden;margin-bottom:-6px;scrollbar-base-color:#400202;scrollbar-face-color:#7e0303;scrollbar-3dlight-color:#550202;scrollbar-highlight-color:#550202;scrollbar-track-color:#400202;scrollbar-arrow-color:#fa3030;scrollbar-shadow-color:#7e0303}.theme-syndicate .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-syndicate .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#550202;background-image:linear-gradient(180deg,#730303 0,#370101)}.theme-syndicate .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px}.theme-syndicate .Window__rest{position:fixed;top:32px;bottom:0;left:0;right:0}.theme-syndicate .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(117,22,22,.25);pointer-events:none}.theme-syndicate .Window__toast{position:fixed;bottom:0;left:0;right:0;font-size:12px;height:40px;line-height:39px;padding:0 12px;background-color:#2b0101;color:hsla(0,0%,100%,.8)}.theme-syndicate .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;height:20px;cursor:se-resize}.theme-syndicate .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;cursor:s-resize}.theme-syndicate .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;cursor:e-resize}.theme-syndicate .TitleBar{background-color:#910101;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-syndicate .TitleBar__clickable{color:hsla(0,0%,100%,.5);background-color:#910101;transition:color .25s,background-color .25s}.theme-syndicate .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-syndicate .TitleBar__title{position:absolute;top:0;left:46px;color:hsla(0,0%,100%,.75);font-size:14px;line-height:31px;white-space:nowrap}.theme-syndicate .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px}.theme-syndicate .TitleBar__statusIcon{position:absolute;top:0;left:12px;transition:color .5s;font-size:20px;line-height:32px!important}.theme-syndicate .TitleBar__minimize{position:absolute;top:6px;right:46px}.theme-syndicate .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;height:32px;font-size:20px;line-height:31px;text-align:center}.theme-syndicate .Layout__content{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMCIgdmlld0JveD0iMCAwIDIwMCAyODkuNzQyIiBvcGFjaXR5PSIuMzMiPjxwYXRoIGQ9Ik05My41MzggMGMtMTguMTEzIDAtMzQuMjIgMy4xMTItNDguMzI0IDkuMzM0LTEzLjk2NSA2LjIyMi0yNC42MTIgMTUuMDcyLTMxLjk0IDI2LjU0N0M2LjA4NCA0Ny4yMiAyLjk3MiA2MC42MzEgMi45NzIgNzYuMTE2YzAgMTAuNjQ3IDIuNzI1IDIwLjQ2NSA4LjE3NSAyOS40NTMgNS42MTYgOC45ODcgMTQuMDM5IDE3LjM1MiAyNS4yNyAyNS4wOTQgMTEuMjMgNy42MDYgMjYuNTA3IDE1LjQxOSA0NS44MyAyMy40MzggMTkuOTg0IDguMjk2IDM0Ljg0OSAxNS41NTUgNDQuNTkzIDIxLjc3NiA5Ljc0NCA2LjIyMyAxNi43NjEgMTIuODU5IDIxLjA1NSAxOS45MSA0LjI5NSA3LjA1MiA2LjQ0MiAxNS43NjQgNi40NDIgMjYuMTM0IDAgMTYuMTc4LTUuMjAyIDI4LjQ4My0xNS42MDYgMzYuOTE3LTEwLjI0IDguNDM1LTI1LjAyMiAxMi42NTMtNDQuMzQ1IDEyLjY1My0xNC4wMzkgMC0yNS41MTYtMS42Ni0zNC40MzQtNC45NzgtOC45MTgtMy40NTctMTYuMTg2LTguNzExLTIxLjgtMTUuNzYzLTUuNjE2LTcuMDUyLTEwLjA3Ni0xNi42NjEtMTMuMzc5LTI4LjgyOUgwdjU2LjgyN2MzMy44NTcgNy4zMjggNjMuNzQ5IDEwLjk5NCA4OS42NzggMTAuOTk0IDE2LjAyIDAgMzAuNzItMS4zODMgNDQuMDk4LTQuMTQ4IDEzLjU0Mi0yLjkwNCAyNS4xMDQtNy40NjcgMzQuNjgzLTEzLjY5IDkuNzQ0LTYuMzU5IDE3LjM0LTE0LjUxOSAyMi43OS0yNC40NzQgNS40NS0xMC4wOTMgOC4xNzUtMjIuNCA4LjE3NS0zNi45MTcgMC0xMi45OTctMy4zMDItMjQuMzM1LTkuOTA4LTM0LjAxNC02LjQ0LTkuODE4LTE1LjUyNS0xOC41MjctMjcuMjUxLTI2LjEzMi0xMS41NjEtNy42MDQtMjcuOTExLTE1LjgzMS00OS4wNTEtMjQuNjgtMTcuNTA2LTcuMTktMzAuNzItMTMuNjktMzkuNjM4LTE5LjQ5N1M1NC45NjkgOTMuNzU2IDQ5LjQ3OSA4Ny4zMTZjLTUuNDI2LTYuMzY2LTkuNjU4LTE1LjA3LTkuNjU4LTI0Ljg4NyAwLTkuMjY0IDIuMDc1LTE3LjIxNCA2LjIyMy0yMy44NUM1Ny4xNDIgMjQuMTggODcuMzMxIDM2Ljc4MiA5MS4xMiA2Mi45MjVjNC44NCA2Ljc3NSA4Ljg1IDE2LjI0NyAxMi4wMyAyOC40MTVoMjAuNTMydi01NmMtNC40NzktNS45MjQtOS45NTUtMTAuNjMxLTE1LjkwOS0xNC4zNzMgMS42NC40NzkgMy4xOSAxLjAyMyA0LjYzOSAxLjY0IDYuNDk4IDIuNjI2IDEyLjE2OCA3LjMyNyAxNy4wMDcgMTQuMTAzIDQuODQgNi43NzUgOC44NSAxNi4yNDYgMTIuMDMgMjguNDE0IDAgMCA4LjQ4LS4xMjkgOC40OS0uMDAyLjQxNyA2LjQxNS0xLjc1NCA5LjQ1My00LjEyNCAxMi41NjEtMi40MTcgMy4xNy01LjE0NSA2Ljc5LTQuMDAzIDEzLjAwMyAxLjUwOCA4LjIwMyAxMC4xODQgMTAuNTk3IDE0LjYyMiA5LjMxMi0zLjMxOC0uNS01LjMxOC0xLjc1LTUuMzE4LTEuNzVzMS44NzYuOTk5IDUuNjUtMS4zNmMtMy4yNzYuOTU2LTEwLjcwNC0uNzk3LTExLjgtNi43NjMtLjk1OC01LjIwOC45NDYtNy4yOTUgMy40LTEwLjUxNCAyLjQ1NS0zLjIyIDUuMjg1LTYuOTU5IDQuNjg1LTE0LjQ4OWwuMDAzLjAwMmg4LjkyN3YtNTZjLTE1LjA3Mi0zLjg3MS0yNy42NTMtNi4zNi0zNy43NDctNy40NjVDMTE0LjI3OS41NTIgMTA0LjA0NiAwIDkzLjUzNyAwem03MC4zMjEgMTcuMzA5bC4yMzggNDAuMzA1YzEuMzE4IDEuMjI2IDIuNDQgMi4yNzggMy4zNDEgMy4xMDYgNC44NCA2Ljc3NSA4Ljg1IDE2LjI0NiAxMi4wMyAyOC40MTRIMjAwdi01NmMtNi42NzctNC41OTQtMTkuODM2LTEwLjQ3My0zNi4xNC0xNS44MjV6bS0yOC4xMiA1LjYwNWw4LjU2NSAxNy43MTdjLTExLjk3LTYuNDY3LTEzLjg0Ny05LjcxNy04LjU2NS0xNy43MTd6bTIyLjc5NyAwYzIuNzcxIDggMS43ODcgMTEuMjUtNC40OTQgMTcuNzE3bDQuNDk0LTE3LjcxN3ptMTUuMjIyIDI0LjAwOWw4LjU2NSAxNy43MTZjLTExLjk3LTYuNDY2LTEzLjg0Ny05LjcxNy04LjU2NS0xNy43MTZ6bTIyLjc5NyAwYzIuNzcxIDggMS43ODcgMTEuMjUtNC40OTQgMTcuNzE2bDQuNDk0LTE3LjcxNnpNOTcuNDQgNDkuMTNsOC41NjUgMTcuNzE2Yy0xMS45Ny02LjQ2Ny0xMy44NDctOS43MTctOC41NjUtMTcuNzE2em0yMi43OTUgMGMyLjc3MiA3Ljk5OSAxLjc4OCAxMS4yNS00LjQ5MyAxNy43MTZsNC40OTMtMTcuNzE2eiIvPjwvc3ZnPg==)} \ No newline at end of file +body,html{box-sizing:border-box;height:100%;margin:0;font-size:12px}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4,h5,h6{display:block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}td,th{vertical-align:baseline;text-align:left}.candystripe:nth-child(odd){background-color:rgba(0,0,0,.25)}.color-black{color:#0d0d0d!important}.color-white{color:#fff!important}.color-red{color:#d33!important}.color-orange{color:#f37827!important}.color-yellow{color:#fbd814!important}.color-olive{color:#c0d919!important}.color-green{color:#22be47!important}.color-teal{color:#00c5bd!important}.color-blue{color:#238cdc!important}.color-violet{color:#6c3fcc!important}.color-purple{color:#a93bcd!important}.color-pink{color:#e2439c!important}.color-brown{color:#af6d43!important}.color-grey{color:#7d7d7d!important}.color-good{color:#62b62a!important}.color-average{color:#f1951d!important}.color-bad{color:#d33!important}.color-label{color:#8496ab!important}.color-bg-black{background-color:#000!important}.color-bg-white{background-color:#d9d9d9!important}.color-bg-red{background-color:#bd2020!important}.color-bg-orange{background-color:#d95e0c!important}.color-bg-yellow{background-color:#d9b804!important}.color-bg-olive{background-color:#9aad14!important}.color-bg-green{background-color:#1b9638!important}.color-bg-teal{background-color:#009a93!important}.color-bg-blue{background-color:#1c71b1!important}.color-bg-violet{background-color:#552dab!important}.color-bg-purple{background-color:#8b2baa!important}.color-bg-pink{background-color:#cf2082!important}.color-bg-brown{background-color:#8c5836!important}.color-bg-grey{background-color:#646464!important}.color-bg-good{background-color:#4d9121!important}.color-bg-average{background-color:#cd7a0d!important}.color-bg-bad{background-color:#bd2020!important}.color-bg-label{background-color:#657a94!important}.debug-layout,.debug-layout :not(g):not(path){color:hsla(0,0%,100%,.9)!important;background:transparent!important;outline:1px solid hsla(0,0%,100%,.5)!important;box-shadow:none!important;filter:none!important}.debug-layout:hover,.debug-layout :not(g):not(path):hover{outline-color:hsla(0,0%,100%,.8)!important}.display-none{display:none}.display-block{display:block}.display-inline{display:inline}.display-inline-block{display:inline-block}.m-0{margin:0}.mx-0{margin-left:0;margin-right:0}.my-0{margin-top:0;margin-bottom:0}.ml-0{margin-left:0}.mt-0{margin-top:0}.mr-0{margin-right:0}.mb-0{margin-bottom:0}.m-1{margin:6px}.mx-1{margin-left:6px;margin-right:6px}.my-1{margin-top:6px;margin-bottom:6px}.ml-1{margin-left:6px}.mt-1{margin-top:6px}.mr-1{margin-right:6px}.mb-1{margin-bottom:6px}.m-2{margin:12px}.mx-2{margin-left:12px;margin-right:12px}.my-2{margin-top:12px;margin-bottom:12px}.ml-2{margin-left:12px}.mt-2{margin-top:12px}.mr-2{margin-right:12px}.mb-2{margin-bottom:12px}.outline-dotted{outline-style:dotted!important;outline-width:2px!important}.outline-dashed{outline-style:dashed!important;outline-width:2px!important}.outline-solid{outline-style:solid!important;outline-width:2px!important}.outline-double{outline-style:double!important;outline-width:2px!important}.outline-groove{outline-style:groove!important;outline-width:2px!important}.outline-ridge{outline-style:ridge!important;outline-width:2px!important}.outline-inset{outline-style:inset!important;outline-width:2px!important}.outline-outset{outline-style:outset!important;outline-width:2px!important}.outline-color-black{outline-color:#0d0d0d!important}.outline-color-white{outline-color:#fff!important}.outline-color-red{outline-color:#d33!important}.outline-color-orange{outline-color:#f37827!important}.outline-color-yellow{outline-color:#fbd814!important}.outline-color-olive{outline-color:#c0d919!important}.outline-color-green{outline-color:#22be47!important}.outline-color-teal{outline-color:#00c5bd!important}.outline-color-blue{outline-color:#238cdc!important}.outline-color-violet{outline-color:#6c3fcc!important}.outline-color-purple{outline-color:#a93bcd!important}.outline-color-pink{outline-color:#e2439c!important}.outline-color-brown{outline-color:#af6d43!important}.outline-color-grey{outline-color:#7d7d7d!important}.outline-color-good{outline-color:#62b62a!important}.outline-color-average{outline-color:#f1951d!important}.outline-color-bad{outline-color:#d33!important}.outline-color-label{outline-color:#8496ab!important}.position-relative{position:relative}.position-absolute{position:absolute}.position-fixed{position:fixed}.position-sticky{position:sticky}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-baseline{text-align:baseline}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-pre{white-space:pre}.text-bold{font-weight:700}.text-italic{font-style:italic}.text-underline{text-decoration:underline}.BlockQuote{color:#8496ab;border-left:2px solid #8496ab;padding-left:6px;margin-bottom:6px}.BlockQuote:last-child{margin-bottom:0}.Button{position:relative;display:inline-block;line-height:20px;padding:0 6px;margin-right:2px;white-space:nowrap;outline:0;border-radius:2px;margin-bottom:2px;user-select:none;-ms-user-select:none}.Button:last-child{margin-right:0}.Button .fa,.Button .far,.Button .fas{margin-left:-3px;margin-right:-3px;min-width:16px;text-align:center}.Button--hasContent .fa,.Button--hasContent .far,.Button--hasContent .fas{margin-right:3px}.Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.Button--fluid{display:block;margin-left:0;margin-right:0}.Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.Button--color--black:hover{transition:color 0ms,background-color 0ms}.Button--color--black:focus{transition:color .1s,background-color .1s}.Button--color--black:focus,.Button--color--black:hover{background-color:#0a0a0a;color:#fff}.Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.Button--color--white:hover{transition:color 0ms,background-color 0ms}.Button--color--white:focus{transition:color .1s,background-color .1s}.Button--color--white:focus,.Button--color--white:hover{background-color:#f3f3f3;color:#000}.Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--red:hover{transition:color 0ms,background-color 0ms}.Button--color--red:focus{transition:color .1s,background-color .1s}.Button--color--red:focus,.Button--color--red:hover{background-color:#d52b2b;color:#fff}.Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.Button--color--orange:hover{transition:color 0ms,background-color 0ms}.Button--color--orange:focus{transition:color .1s,background-color .1s}.Button--color--orange:focus,.Button--color--orange:hover{background-color:#ed6f1d;color:#fff}.Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.Button--color--yellow:focus{transition:color .1s,background-color .1s}.Button--color--yellow:focus,.Button--color--yellow:hover{background-color:#f3d00e;color:#000}.Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.Button--color--olive:hover{transition:color 0ms,background-color 0ms}.Button--color--olive:focus{transition:color .1s,background-color .1s}.Button--color--olive:focus,.Button--color--olive:hover{background-color:#afc41f;color:#fff}.Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--color--green:hover{transition:color 0ms,background-color 0ms}.Button--color--green:focus{transition:color .1s,background-color .1s}.Button--color--green:focus,.Button--color--green:hover{background-color:#27ab46;color:#fff}.Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.Button--color--teal:hover{transition:color 0ms,background-color 0ms}.Button--color--teal:focus{transition:color .1s,background-color .1s}.Button--color--teal:focus,.Button--color--teal:hover{background-color:#0aafa8;color:#fff}.Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.Button--color--blue:hover{transition:color 0ms,background-color 0ms}.Button--color--blue:focus{transition:color .1s,background-color .1s}.Button--color--blue:focus,.Button--color--blue:hover{background-color:#2883c8;color:#fff}.Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.Button--color--violet:hover{transition:color 0ms,background-color 0ms}.Button--color--violet:focus{transition:color .1s,background-color .1s}.Button--color--violet:focus,.Button--color--violet:hover{background-color:#653ac1;color:#fff}.Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.Button--color--purple:hover{transition:color 0ms,background-color 0ms}.Button--color--purple:focus{transition:color .1s,background-color .1s}.Button--color--purple:focus,.Button--color--purple:hover{background-color:#9e38c1;color:#fff}.Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.Button--color--pink:hover{transition:color 0ms,background-color 0ms}.Button--color--pink:focus{transition:color .1s,background-color .1s}.Button--color--pink:focus,.Button--color--pink:hover{background-color:#dd3794;color:#fff}.Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.Button--color--brown:hover{transition:color 0ms,background-color 0ms}.Button--color--brown:focus{transition:color .1s,background-color .1s}.Button--color--brown:focus,.Button--color--brown:hover{background-color:#a06844;color:#fff}.Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.Button--color--grey:hover{transition:color 0ms,background-color 0ms}.Button--color--grey:focus{transition:color .1s,background-color .1s}.Button--color--grey:focus,.Button--color--grey:hover{background-color:#757575;color:#fff}.Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.Button--color--good:hover{transition:color 0ms,background-color 0ms}.Button--color--good:focus{transition:color .1s,background-color .1s}.Button--color--good:focus,.Button--color--good:hover{background-color:#5da52d;color:#fff}.Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.Button--color--average:hover{transition:color 0ms,background-color 0ms}.Button--color--average:focus{transition:color .1s,background-color .1s}.Button--color--average:focus,.Button--color--average:hover{background-color:#e68d18;color:#fff}.Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--bad:hover{transition:color 0ms,background-color 0ms}.Button--color--bad:focus{transition:color .1s,background-color .1s}.Button--color--bad:focus,.Button--color--bad:hover{background-color:#d52b2b;color:#fff}.Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.Button--color--label:hover{transition:color 0ms,background-color 0ms}.Button--color--label:focus{transition:color .1s,background-color .1s}.Button--color--label:focus,.Button--color--label:hover{background-color:#7b8da4;color:#fff}.Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.Button--color--default:hover{transition:color 0ms,background-color 0ms}.Button--color--default:focus{transition:color .1s,background-color .1s}.Button--color--default:focus,.Button--color--default:hover{background-color:#4c729d;color:#fff}.Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--caution:hover{transition:color 0ms,background-color 0ms}.Button--color--caution:focus{transition:color .1s,background-color .1s}.Button--color--caution:focus,.Button--color--caution:hover{background-color:#f3d00e;color:#000}.Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--danger:hover{transition:color 0ms,background-color 0ms}.Button--color--danger:focus{transition:color .1s,background-color .1s}.Button--color--danger:focus,.Button--color--danger:hover{background-color:#d52b2b;color:#fff}.Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#252525;color:#fff;background-color:rgba(37,37,37,0);color:hsla(0,0%,100%,.5)}.Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.Button--color--transparent:focus{transition:color .1s,background-color .1s}.Button--color--transparent:focus,.Button--color--transparent:hover{background-color:#323232;color:#fff}.Button--disabled{background-color:#999!important}.Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--selected:hover{transition:color 0ms,background-color 0ms}.Button--selected:focus{transition:color .1s,background-color .1s}.Button--selected:focus,.Button--selected:hover{background-color:#27ab46;color:#fff}.ColorBox{display:inline-block;width:12px;height:12px;line-height:12px;text-align:center}.Dimmer{display:flex;justify-content:center;align-items:center;position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(0,0,0,.75);z-index:1}.Divider--horizontal{margin:6px 0}.Divider--horizontal:not(.Divider--hidden){border-top:2px solid hsla(0,0%,100%,.1)}.Divider--vertical{height:100%;margin:0 6px}.Divider--vertical:not(.Divider--hidden){border-left:2px solid hsla(0,0%,100%,.1)}.Dropdown{position:relative}.Dropdown__control{position:relative;display:inline-block;font-family:Verdana,sans-serif;font-size:12px;width:100px;line-height:17px;user-select:none}.Dropdown__arrow-button{float:right;padding-left:6px;border-left:1px solid #000;border-left:1px solid rgba(0,0,0,.25)}.Dropdown__menu{overflow-y:auto;overflow-y:scroll}.Dropdown__menu,.Dropdown__menu-noscroll{position:absolute;z-index:5;width:100px;max-height:200px;border-radius:0 0 2px 2px;background-color:#000;background-color:rgba(0,0,0,.75)}.Dropdown__menu-noscroll{overflow-y:auto}.Dropdown__menuentry{padding:2px 4px;font-family:Verdana,sans-serif;font-size:12px;line-height:17px;transition:background-color .1s}.Dropdown__menuentry:hover{background-color:#444;transition:background-color 0ms}.Dropdown__over{top:auto;bottom:100%}.FatalError{display:block!important;position:absolute;top:0;left:0;right:0;bottom:0;padding:12px;font-size:12px;font-family:Consolas,monospace;color:#fff;background-color:#00d;z-index:1000;overflow:hidden;text-align:center}.FatalError__logo{display:inline-block;text-align:left;font-size:10px;line-height:8px;position:relative;margin-top:12px;top:0;left:0;animation:FatalError__rainbow 2s linear infinite alternate,FatalError__shadow 4s linear infinite alternate,FatalError__tfmX 3s infinite alternate,FatalError__tfmY 4s infinite alternate;white-space:pre-wrap;word-break:break-all}.FatalError__header{margin-top:12px}.FatalError__stack{text-align:left;white-space:pre-wrap;word-break:break-all;margin-top:24px;margin-bottom:24px}.FatalError__footer{margin-bottom:24px}@keyframes FatalError__rainbow{0%{color:#ff0}50%{color:#0ff}to{color:#f0f}}@keyframes FatalError__shadow{0%{left:-2px;text-shadow:4px 0 #f0f}50%{left:0;text-shadow:0 0 #0ff}to{left:2px;text-shadow:-4px 0 #ff0}}@keyframes FatalError__tfmX{0%{left:15px}to{left:-15px}}@keyframes FatalError__tfmY{to{top:-15px}}.Flex{display:-ms-flexbox;display:flex}.Flex--inline{display:inline-flex}.Flex--iefix{display:table!important}.Flex--iefix--column{display:block!important}.Flex--iefix--column>.Flex__item{display:block!important;margin-left:6px;margin-right:6px}.Flex__item--iefix{display:table-cell!important}.Flex--spacing--1{margin:0 -3px}.Flex--spacing--1>.Flex__item{margin:0 3px}.Flex--spacing--2{margin:0 -6px}.Flex--spacing--2>.Flex__item{margin:0 6px}.Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto -.2em;cursor:n-resize}.Knob:after{content:".";color:transparent;line-height:2.5em}.Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(180deg,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,0));border-radius:50%;box-shadow:0 .05em .5em 0 rgba(0,0,0,.5)}.Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:hsla(0,0%,100%,.9)}.Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;background-color:#000;transform:translateX(50%);white-space:nowrap}.Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.Knob__ringTrackPivot{transform:rotate(135deg)}.Knob__ringTrack{fill:transparent;stroke:hsla(0,0%,100%,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.Knob__ringFillPivot{transform:rotate(135deg)}.Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.Knob__ringFill{fill:transparent;stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms}.Knob--color--black .Knob__ringFill{stroke:#0d0d0d}.Knob--color--white .Knob__ringFill{stroke:#fff}.Knob--color--red .Knob__ringFill{stroke:#d33}.Knob--color--orange .Knob__ringFill{stroke:#f37827}.Knob--color--yellow .Knob__ringFill{stroke:#fbd814}.Knob--color--olive .Knob__ringFill{stroke:#c0d919}.Knob--color--green .Knob__ringFill{stroke:#22be47}.Knob--color--teal .Knob__ringFill{stroke:#00c5bd}.Knob--color--blue .Knob__ringFill{stroke:#238cdc}.Knob--color--violet .Knob__ringFill{stroke:#6c3fcc}.Knob--color--purple .Knob__ringFill{stroke:#a93bcd}.Knob--color--pink .Knob__ringFill{stroke:#e2439c}.Knob--color--brown .Knob__ringFill{stroke:#af6d43}.Knob--color--grey .Knob__ringFill{stroke:#7d7d7d}.Knob--color--good .Knob__ringFill{stroke:#62b62a}.Knob--color--average .Knob__ringFill{stroke:#f1951d}.Knob--color--bad .Knob__ringFill{stroke:#d33}.Knob--color--label .Knob__ringFill{stroke:#8496ab}.LabeledList{display:table;width:100%;width:calc(100% + 12px);border-collapse:collapse;border-spacing:0;margin:-3px -6px 0;padding:0}.LabeledList__row{display:table-row}.LabeledList__row:last-child .LabeledList__cell{padding-bottom:0}.LabeledList__cell{display:table-cell;margin:0;padding:3px 6px;border:0;text-align:left;vertical-align:baseline}.LabeledList__label{width:1%;white-space:nowrap;min-width:60px}.LabeledList__buttons{width:.1%;white-space:nowrap;text-align:right;padding-top:1px;padding-bottom:0}.Modal{background-color:#252525;max-width:calc(100% - 1rem);padding:1rem}.NanoMap__container{overflow:hidden;width:100%;height:100vh;z-index:1}.NanoMap__marker{z-index:10;padding:0;margin:0}.NoticeBox{padding:4px 6px;margin-bottom:6px;box-shadow:none;font-weight:700;font-style:italic;color:#000;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,transparent,transparent 10px,rgba(0,0,0,.1) 0,rgba(0,0,0,.1) 20px)}.NoticeBox--color--black{color:#fff;background-color:#000}.NoticeBox--color--white{color:#000;background-color:#b3b3b3}.NoticeBox--color--red{color:#fff;background-color:#701f1f}.NoticeBox--color--orange{color:#fff;background-color:#854114}.NoticeBox--color--yellow{color:#000;background-color:#83710d}.NoticeBox--color--olive{color:#000;background-color:#576015}.NoticeBox--color--green{color:#fff;background-color:#174e24}.NoticeBox--color--teal{color:#fff;background-color:#064845}.NoticeBox--color--blue{color:#fff;background-color:#1b4565}.NoticeBox--color--violet{color:#fff;background-color:#3b2864}.NoticeBox--color--purple{color:#fff;background-color:#542663}.NoticeBox--color--pink{color:#fff;background-color:#802257}.NoticeBox--color--brown{color:#fff;background-color:#4c3729}.NoticeBox--color--grey{color:#fff;background-color:#3e3e3e}.NoticeBox--color--good{color:#fff;background-color:#2e4b1a}.NoticeBox--color--average{color:#fff;background-color:#7b4e13}.NoticeBox--color--bad{color:#fff;background-color:#701f1f}.NoticeBox--color--label{color:#fff;background-color:#53565a}.NoticeBox--type--info{color:#fff;background-color:#235982}.NoticeBox--type--success{color:#fff;background-color:#1e662f}.NoticeBox--type--warning{color:#fff;background-color:#a95219}.NoticeBox--type--danger{color:#fff;background-color:#8f2828}.Input{position:relative;display:inline-block;width:120px;border:1px solid #88bfff;border:1px solid rgba(136,191,255,.75);border-radius:2px;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 4px;margin-right:2px;line-height:17px;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:transparent}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:12px;line-height:17px;height:17px;margin:0;padding:0 6px;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:hsla(0,0%,100%,.45)}.NumberInput{position:relative;display:inline-block;border:1px solid #88bfff;border:1px solid rgba(136,191,255,.75);border-radius:2px;color:#88bfff;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 4px;margin-right:2px;line-height:17px;text-align:right;overflow:visible;cursor:n-resize}.NumberInput--fluid{display:block}.NumberInput__content{margin-left:6px}.NumberInput__barContainer{position:absolute;top:2px;bottom:2px;left:2px}.NumberInput__bar{position:absolute;bottom:0;left:0;width:3px;box-sizing:border-box;border-bottom:1px solid #88bfff;background-color:#88bfff}.NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:12px;line-height:17px;height:17px;margin:0;padding:0 6px;font-family:Verdana,sans-serif;background-color:#000;color:#fff;text-align:right}.ProgressBar{display:inline-block;position:relative;width:100%;padding:0 6px;border-radius:2px;background-color:transparent;transition:border-color .5s}.ProgressBar__fill{position:absolute;top:0;left:0;bottom:0}.ProgressBar__fill--animated{transition:background-color .5s,width .5s}.ProgressBar__content{position:relative;line-height:17px;width:100%;text-align:right}.ProgressBar--color--default{border:1px solid #3e6189}.ProgressBar--color--default .ProgressBar__fill{background-color:#3e6189}.ProgressBar--color--black{border:1px solid #000!important}.ProgressBar--color--black .ProgressBar__fill{background-color:#000}.ProgressBar--color--white{border:1px solid #d9d9d9!important}.ProgressBar--color--white .ProgressBar__fill{background-color:#d9d9d9}.ProgressBar--color--red{border:1px solid #bd2020!important}.ProgressBar--color--red .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--orange{border:1px solid #d95e0c!important}.ProgressBar--color--orange .ProgressBar__fill{background-color:#d95e0c}.ProgressBar--color--yellow{border:1px solid #d9b804!important}.ProgressBar--color--yellow .ProgressBar__fill{background-color:#d9b804}.ProgressBar--color--olive{border:1px solid #9aad14!important}.ProgressBar--color--olive .ProgressBar__fill{background-color:#9aad14}.ProgressBar--color--green{border:1px solid #1b9638!important}.ProgressBar--color--green .ProgressBar__fill{background-color:#1b9638}.ProgressBar--color--teal{border:1px solid #009a93!important}.ProgressBar--color--teal .ProgressBar__fill{background-color:#009a93}.ProgressBar--color--blue{border:1px solid #1c71b1!important}.ProgressBar--color--blue .ProgressBar__fill{background-color:#1c71b1}.ProgressBar--color--violet{border:1px solid #552dab!important}.ProgressBar--color--violet .ProgressBar__fill{background-color:#552dab}.ProgressBar--color--purple{border:1px solid #8b2baa!important}.ProgressBar--color--purple .ProgressBar__fill{background-color:#8b2baa}.ProgressBar--color--pink{border:1px solid #cf2082!important}.ProgressBar--color--pink .ProgressBar__fill{background-color:#cf2082}.ProgressBar--color--brown{border:1px solid #8c5836!important}.ProgressBar--color--brown .ProgressBar__fill{background-color:#8c5836}.ProgressBar--color--grey{border:1px solid #646464!important}.ProgressBar--color--grey .ProgressBar__fill{background-color:#646464}.ProgressBar--color--good{border:1px solid #4d9121!important}.ProgressBar--color--good .ProgressBar__fill{background-color:#4d9121}.ProgressBar--color--average{border:1px solid #cd7a0d!important}.ProgressBar--color--average .ProgressBar__fill{background-color:#cd7a0d}.ProgressBar--color--bad{border:1px solid #bd2020!important}.ProgressBar--color--bad .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--label{border:1px solid #657a94!important}.ProgressBar--color--label .ProgressBar__fill{background-color:#657a94}.Section{position:relative;margin-bottom:6px;background-color:#1a1a1a;background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5);box-sizing:border-box}.Section:last-child{margin-bottom:0}.Section__title{position:relative;padding:6px;border-bottom:2px solid #4972a1}.Section__titleText{font-size:14px;font-weight:700}.Section__buttons{position:absolute;display:inline-block;right:6px;margin-top:-1px}.Section__content{padding:8px 6px}.Section--fill{display:flex;flex-direction:column;height:100%}.Section--fill .Section__content{flex-grow:1}.Section--level--1 .Section__titleText{font-size:14px}.Section--level--2 .Section__titleText{font-size:13px}.Section--level--3 .Section__titleText{font-size:12px}.Section--level--2,.Section--level--3{background-color:transparent;box-shadow:none;margin-left:-6px;margin-right:-6px}.Slider{cursor:e-resize}.Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none!important}.Slider__cursor{position:absolute;top:0;right:-1px;bottom:0;width:0;border-left:2px solid #fff}.Slider__pointer{position:absolute;right:-5px;bottom:-4px;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #fff}.Slider__popupValue{position:absolute;right:0;top:-22px;padding:2px 4px;background-color:#000;transform:translateX(50%);white-space:nowrap}.Table{display:table;width:100%;border-collapse:collapse;border-spacing:0;margin:0}.Table--collapsing{width:auto}.Table__row{display:table-row}.Table__cell{display:table-cell;padding:0 3px}.Table__cell:first-child{padding-left:0}.Table__cell:last-child{padding-right:0}.Table__cell--header,.Table__row--header .Table__cell{font-weight:700;padding-bottom:6px}.Table__cell--collapsing{width:1%;white-space:nowrap}.Tabs--horizontal{border-bottom:2px solid hsla(0,0%,100%,.1);margin-bottom:6px}.Tabs--horizontal .Tabs__tab--altSelection:after{content:"";position:absolute;bottom:0;right:0;left:0;height:2px;width:100%;background-color:#fff;border-radius:2px}.Tabs--vertical{margin-right:9px}.Tabs--vertical .Tabs__tabBox{border-right:2px solid hsla(0,0%,100%,.1);vertical-align:top}.Tabs--vertical .Tabs__tab{display:block!important;margin-right:0!important;margin-bottom:0;padding:1px 9px 0 6px;border-bottom:2px solid hsla(0,0%,100%,.1)}.Tabs--vertical .Tabs__tab:last-child{border-bottom:0}.Tabs--vertical .Tabs__tab--altSelection:after{content:"";position:absolute;top:0;bottom:0;right:0;height:100%;width:3px;background-color:#fff;border-radius:2px}.Tooltip{position:absolute;top:0;left:0;right:0;bottom:0;font-style:normal;font-weight:400}.Tooltip:after{position:absolute;display:block;white-space:nowrap;z-index:2;padding:6px 10px;transform:translateX(-50%);pointer-events:none;visibility:hidden;opacity:0;text-align:left;content:attr(data-tooltip);transition:all .15s;background-color:#000;box-shadow:1px 1px 15px -1px rgba(0,0,0,.5);border-radius:2px}.Tooltip:hover:after{transition:all 70ms;pointer-events:none;visibility:visible;opacity:1}.Tooltip--long:after{width:250px;white-space:normal}.Tooltip--top:after{bottom:100%;left:50%;transform:translateX(-50%) translateY(8px)}.Tooltip--bottom:after,.Tooltip--top:hover:after{transform:translateX(-50%) translateY(-8px)}.Tooltip--bottom:after{top:100%;left:50%}.Tooltip--bottom:hover:after{transform:translateX(-50%) translateY(8px)}.Tooltip--bottom-left:after{top:100%;right:50%;transform:translateX(12px) translateY(-8px)}.Tooltip--bottom-left:hover:after{transform:translateX(12px) translateY(8px)}.Tooltip--bottom-right:after{top:100%;left:50%;transform:translateX(-12px) translateY(-8px)}.Tooltip--bottom-right:hover:after{transform:translateX(-12px) translateY(8px)}.Tooltip--left:after{top:50%;right:100%;transform:translateX(8px) translateY(-50%)}.Tooltip--left:hover:after,.Tooltip--right:after{transform:translateX(-8px) translateY(-50%)}.Tooltip--right:after{top:50%;left:100%}.Tooltip--right:hover:after{transform:translateX(8px) translateY(-50%)}.CameraConsole__left{position:absolute;top:0;bottom:0;left:0;width:220px}.CameraConsole__right{position:absolute;top:0;bottom:0;left:220px;right:0;background-color:rgba(0,0,0,.33)}.CameraConsole__toolbar{left:0;margin:3px 12px 0}.CameraConsole__toolbar,.CameraConsole__toolbarRight{position:absolute;top:0;right:0;height:24px;line-height:24px}.CameraConsole__toolbarRight{margin:4px 6px 0}.CameraConsole__map{position:absolute;top:26px;bottom:0;left:0;right:0;margin:6px;text-align:center}.CameraConsole__map .NoticeBox{margin-top:calc(50% - 24px)}.NuclearBomb__displayBox{background-color:#002003;border:4px inset #e8e4c9;color:#03e017;font-size:24px;font-family:monospace;padding:6px}.NuclearBomb__Button--keypad{background-color:#e8e4c9;border-color:#e8e4c9}.NuclearBomb__Button--keypad:hover{background-color:#f7f6ee!important;border-color:#f7f6ee!important}.NuclearBomb__Button--1{background-color:#d3cfb7!important;border-color:#d3cfb7!important;color:#a9a692!important}.NuclearBomb__Button--E{background-color:#d9b804!important;border-color:#d9b804!important}.NuclearBomb__Button--E:hover{background-color:#f3d00e!important;border-color:#f3d00e!important}.NuclearBomb__Button--C{background-color:#bd2020!important;border-color:#bd2020!important}.NuclearBomb__Button--C:hover{background-color:#d52b2b!important;border-color:#d52b2b!important}.NuclearBomb__NTIcon{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMCIgdmlld0JveD0iMCAwIDQyNSAyMDAiIG9wYWNpdHk9Ii4zMyI+PHBhdGggZD0iTTE3OC4wMDQuMDM5SDEwNi44YTYuNzYxIDYuMDI2IDAgMDAtNi43NjEgNi4wMjV2MTg3Ljg3MmE2Ljc2MSA2LjAyNiAwIDAwNi43NjEgNi4wMjVoNTMuMTA3YTYuNzYxIDYuMDI2IDAgMDA2Ljc2Mi02LjAyNVY5Mi4zOTJsNzIuMjE2IDEwNC43YTYuNzYxIDYuMDI2IDAgMDA1Ljc2IDIuODdIMzE4LjJhNi43NjEgNi4wMjYgMCAwMDYuNzYxLTYuMDI2VjYuMDY0QTYuNzYxIDYuMDI2IDAgMDAzMTguMi4wNGgtNTQuNzE3YTYuNzYxIDYuMDI2IDAgMDAtNi43NiA2LjAyNXYxMDIuNjJMMTgzLjc2MyAyLjkwOWE2Ljc2MSA2LjAyNiAwIDAwLTUuNzYtMi44N3pNNC44NDUgMjIuMTA5QTEzLjQxMiAxMi41MDIgMCAwMTEzLjQ3OC4wMzloNjYuMTE4QTUuMzY1IDUgMCAwMTg0Ljk2IDUuMDR2NzkuODh6TTQyMC4xNTUgMTc3Ljg5MWExMy40MTIgMTIuNTAyIDAgMDEtOC42MzMgMjIuMDdoLTY2LjExOGE1LjM2NSA1IDAgMDEtNS4zNjUtNS4wMDF2LTc5Ljg4eiIvPjwvc3ZnPg==);background-size:70%;background-position:50%;background-repeat:no-repeat}.Roulette{font-family:Palatino}.Roulette__board{display:table;width:100%;border-collapse:collapse;border:2px solid #fff;margin:0}.Roulette__board-row{padding:0;margin:0}.Roulette__board-cell{display:table-cell;padding:0;margin:0;border:2px solid #fff;font-family:Palatino}.Roulette__board-cell:first-child{padding-left:0}.Roulette__board-cell:last-child{padding-right:0}.Roulette__board-extrabutton{text-align:center;font-size:20px;font-weight:700;height:28px;border:none!important;margin:0!important;padding-top:4px!important;color:#fff!important}.Roulette__lowertable{margin-top:8px;margin-left:80px;margin-right:80px;border-collapse:collapse;border:2px solid #fff;border-spacing:0}.Roulette__lowertable--cell{border:2px solid #fff;padding:0;margin:0}.Roulette__lowertable--betscell{vertical-align:top}.Roulette__lowertable--spinresult{text-align:center;font-size:100px;font-weight:700;vertical-align:middle}.Roulette__lowertable--spinresult-black{background-color:#000}.Roulette__lowertable--spinresult-red{background-color:#db2828}.Roulette__lowertable--spinresult-green{background-color:#20b142}.Roulette__lowertable--spinbutton{margin:0!important;border:none!important;font-size:50px;line-height:60px!important;text-align:center;font-weight:700}.Roulette__lowertable--header{width:1%;text-align:center;font-size:20px;font-weight:700}.Layout,.Layout *{scrollbar-base-color:#1c1c1c;scrollbar-face-color:#3b3b3b;scrollbar-3dlight-color:#252525;scrollbar-highlight-color:#252525;scrollbar-track-color:#1c1c1c;scrollbar-arrow-color:#929292;scrollbar-shadow-color:#3b3b3b}.Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.NtosHeader__left{position:absolute;left:12px}.NtosHeader__right{position:absolute;right:12px}.NtosHeader__icon{margin-top:-9px;margin-bottom:-6px;vertical-align:middle}.NtosWindow__header{position:absolute;top:0;left:0;right:0;height:28px;line-height:27px;background-color:rgba(0,0,0,.5);font-family:Consolas,monospace;font-size:14px;user-select:none;-ms-user-select:none}.NtosWindow__content>.Layout__content{margin-top:28px;font-family:Consolas,monospace;font-size:14px}.TitleBar{background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.TitleBar__clickable{color:hsla(0,0%,100%,.5);background-color:#363636;transition:color .25s,background-color .25s}.TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.TitleBar__title{position:absolute;top:0;left:46px;color:hsla(0,0%,100%,.75);font-size:14px;line-height:31px;white-space:nowrap}.TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px}.TitleBar__statusIcon{position:absolute;top:0;left:12px;transition:color .5s;font-size:20px;line-height:32px!important}.TitleBar__minimize{position:absolute;top:6px;right:46px}.TitleBar__close{position:absolute;top:-1px;right:0;width:45px;height:32px;font-size:20px;line-height:31px;text-align:center}.TitleBar__devBuildIndicator{position:absolute;top:6px;right:52px;min-width:20px;padding:2px 4px;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.Window{bottom:0;right:0;color:#fff;background-color:#252525;background-image:linear-gradient(180deg,#2a2a2a 0,#202020)}.Window,.Window__titleBar{position:fixed;top:0;left:0}.Window__titleBar{z-index:1;width:100%;height:32px}.Window__rest{position:fixed;top:32px;bottom:0;left:0;right:0}.Window__contentPadding{margin:6px;height:calc(100% - 12px)}.Window__contentPadding:after{height:0}.Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:6px}.Window__dimmer{top:0;background-color:rgba(62,62,62,.25);pointer-events:none}.Window__dimmer,.Window__toast{position:fixed;bottom:0;left:0;right:0}.Window__toast{font-size:12px;height:40px;line-height:39px;padding:0 12px;background-color:#131313;color:hsla(0,0%,100%,.8)}.Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;height:20px;cursor:se-resize}.Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;cursor:s-resize}.Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;cursor:e-resize}.Layout__content{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMCIgdmlld0JveD0iMCAwIDQyNSAyMDAiIG9wYWNpdHk9Ii4zMyI+PHBhdGggZD0iTTE3OC4wMDQuMDM5SDEwNi44YTYuNzYxIDYuMDI2IDAgMDAtNi43NjEgNi4wMjV2MTg3Ljg3MmE2Ljc2MSA2LjAyNiAwIDAwNi43NjEgNi4wMjVoNTMuMTA3YTYuNzYxIDYuMDI2IDAgMDA2Ljc2Mi02LjAyNVY5Mi4zOTJsNzIuMjE2IDEwNC43YTYuNzYxIDYuMDI2IDAgMDA1Ljc2IDIuODdIMzE4LjJhNi43NjEgNi4wMjYgMCAwMDYuNzYxLTYuMDI2VjYuMDY0QTYuNzYxIDYuMDI2IDAgMDAzMTguMi4wNGgtNTQuNzE3YTYuNzYxIDYuMDI2IDAgMDAtNi43NiA2LjAyNXYxMDIuNjJMMTgzLjc2MyAyLjkwOWE2Ljc2MSA2LjAyNiAwIDAwLTUuNzYtMi44N3pNNC44NDUgMjIuMTA5QTEzLjQxMiAxMi41MDIgMCAwMTEzLjQ3OC4wMzloNjYuMTE4QTUuMzY1IDUgMCAwMTg0Ljk2IDUuMDR2NzkuODh6TTQyMC4xNTUgMTc3Ljg5MWExMy40MTIgMTIuNTAyIDAgMDEtOC42MzMgMjIuMDdoLTY2LjExOGE1LjM2NSA1IDAgMDEtNS4zNjUtNS4wMDF2LTc5Ljg4eiIvPjwvc3ZnPg==);background-size:70%;background-position:50%;background-repeat:no-repeat}.theme-abductor .Button{position:relative;display:inline-block;line-height:20px;padding:0 6px;margin-right:2px;white-space:nowrap;outline:0;border-radius:2px;margin-bottom:2px;user-select:none;-ms-user-select:none}.theme-abductor .Button:last-child{margin-right:0}.theme-abductor .Button .fa,.theme-abductor .Button .far,.theme-abductor .Button .fas{margin-left:-3px;margin-right:-3px;min-width:16px;text-align:center}.theme-abductor .Button--hasContent .fa,.theme-abductor .Button--hasContent .far,.theme-abductor .Button--hasContent .fas{margin-right:3px}.theme-abductor .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-abductor .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-abductor .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#ad2350;color:#fff}.theme-abductor .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-abductor .Button--color--default:focus{transition:color .1s,background-color .1s}.theme-abductor .Button--color--default:focus,.theme-abductor .Button--color--default:hover{background-color:#c42f60;color:#fff}.theme-abductor .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#be6209;color:#fff}.theme-abductor .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-abductor .Button--color--caution:focus{transition:color .1s,background-color .1s}.theme-abductor .Button--color--caution:focus,.theme-abductor .Button--color--caution:hover{background-color:#d67313;color:#fff}.theme-abductor .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-abductor .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-abductor .Button--color--danger:focus{transition:color .1s,background-color .1s}.theme-abductor .Button--color--danger:focus,.theme-abductor .Button--color--danger:hover{background-color:#afb30a;color:#fff}.theme-abductor .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#2a314a;color:#fff;background-color:rgba(42,49,74,0);color:hsla(0,0%,100%,.5)}.theme-abductor .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-abductor .Button--color--transparent:focus{transition:color .1s,background-color .1s}.theme-abductor .Button--color--transparent:focus,.theme-abductor .Button--color--transparent:hover{background-color:#373e59;color:#fff}.theme-abductor .Button--disabled{background-color:#363636!important}.theme-abductor .Button--selected{transition:color 50ms,background-color 50ms;background-color:#465899;color:#fff}.theme-abductor .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-abductor .Button--selected:focus{transition:color .1s,background-color .1s}.theme-abductor .Button--selected:focus,.theme-abductor .Button--selected:hover{background-color:#5569ad;color:#fff}.theme-abductor .NoticeBox{padding:4px 6px;margin-bottom:6px;box-shadow:none;font-weight:700;font-style:italic;color:#fff;background-color:#a82d55;background-image:repeating-linear-gradient(-45deg,transparent,transparent 10px,rgba(0,0,0,.1) 0,rgba(0,0,0,.1) 20px)}.theme-abductor .NoticeBox--type--info{color:#fff;background-color:#235982}.theme-abductor .NoticeBox--type--success{color:#fff;background-color:#1e662f}.theme-abductor .NoticeBox--type--warning{color:#fff;background-color:#a95219}.theme-abductor .NoticeBox--type--danger{color:#fff;background-color:#8f2828}.theme-abductor .Input{position:relative;display:inline-block;width:120px;border:1px solid #404b6e;border:1px solid rgba(64,75,110,.75);border-radius:2px;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 4px;margin-right:2px;line-height:17px;overflow:visible}.theme-abductor .Input--fluid{display:block;width:auto}.theme-abductor .Input__baseline{display:inline-block;color:transparent}.theme-abductor .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:12px;line-height:17px;height:17px;margin:0;padding:0 6px;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.theme-abductor .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:hsla(0,0%,100%,.45)}.theme-abductor .NumberInput{position:relative;display:inline-block;border:1px solid #404b6e;border:1px solid rgba(64,75,110,.75);border-radius:2px;color:#404b6e;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 4px;margin-right:2px;line-height:17px;text-align:right;overflow:visible;cursor:n-resize}.theme-abductor .NumberInput--fluid{display:block}.theme-abductor .NumberInput__content{margin-left:6px}.theme-abductor .NumberInput__barContainer{position:absolute;top:2px;bottom:2px;left:2px}.theme-abductor .NumberInput__bar{position:absolute;bottom:0;left:0;width:3px;box-sizing:border-box;border-bottom:1px solid #404b6e;background-color:#404b6e}.theme-abductor .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:12px;line-height:17px;height:17px;margin:0;padding:0 6px;font-family:Verdana,sans-serif;background-color:#000;color:#fff;text-align:right}.theme-abductor .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 6px;border-radius:2px;background-color:rgba(0,0,0,.5);transition:border-color .5s}.theme-abductor .ProgressBar__fill{position:absolute;top:0;left:0;bottom:0}.theme-abductor .ProgressBar__fill--animated{transition:background-color .5s,width .5s}.theme-abductor .ProgressBar__content{position:relative;line-height:17px;width:100%;text-align:right}.theme-abductor .ProgressBar--color--default{border:1px solid #931e44}.theme-abductor .ProgressBar--color--default .ProgressBar__fill{background-color:#931e44}.theme-abductor .Section{position:relative;margin-bottom:6px;background-color:#1a1a1a;background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5);box-sizing:border-box}.theme-abductor .Section:last-child{margin-bottom:0}.theme-abductor .Section__title{position:relative;padding:6px;border-bottom:2px solid #ad2350}.theme-abductor .Section__titleText{font-size:14px;font-weight:700}.theme-abductor .Section__buttons{position:absolute;display:inline-block;right:6px;margin-top:-1px}.theme-abductor .Section__content{padding:8px 6px}.theme-abductor .Section--fill{display:flex;flex-direction:column;height:100%}.theme-abductor .Section--fill .Section__content{flex-grow:1}.theme-abductor .Section--level--1 .Section__titleText{font-size:14px}.theme-abductor .Section--level--2 .Section__titleText{font-size:13px}.theme-abductor .Section--level--3 .Section__titleText{font-size:12px}.theme-abductor .Section--level--2,.theme-abductor .Section--level--3{background-color:transparent;box-shadow:none;margin-left:-6px;margin-right:-6px}.theme-abductor .Tooltip{position:absolute;top:0;left:0;right:0;bottom:0;font-style:normal;font-weight:400}.theme-abductor .Tooltip:after{position:absolute;display:block;white-space:nowrap;z-index:2;padding:6px 10px;transform:translateX(-50%);pointer-events:none;visibility:hidden;opacity:0;text-align:left;content:attr(data-tooltip);transition:all .15s;background-color:#a82d55;box-shadow:1px 1px 15px -1px rgba(0,0,0,.5);border-radius:2px}.theme-abductor .Tooltip:hover:after{transition:all 70ms;pointer-events:none;visibility:visible;opacity:1}.theme-abductor .Tooltip--long:after{width:250px;white-space:normal}.theme-abductor .Tooltip--top:after{bottom:100%;left:50%;transform:translateX(-50%) translateY(8px)}.theme-abductor .Tooltip--bottom:after,.theme-abductor .Tooltip--top:hover:after{transform:translateX(-50%) translateY(-8px)}.theme-abductor .Tooltip--bottom:after{top:100%;left:50%}.theme-abductor .Tooltip--bottom:hover:after{transform:translateX(-50%) translateY(8px)}.theme-abductor .Tooltip--bottom-left:after{top:100%;right:50%;transform:translateX(12px) translateY(-8px)}.theme-abductor .Tooltip--bottom-left:hover:after{transform:translateX(12px) translateY(8px)}.theme-abductor .Tooltip--bottom-right:after{top:100%;left:50%;transform:translateX(-12px) translateY(-8px)}.theme-abductor .Tooltip--bottom-right:hover:after{transform:translateX(-12px) translateY(8px)}.theme-abductor .Tooltip--left:after{top:50%;right:100%;transform:translateX(8px) translateY(-50%)}.theme-abductor .Tooltip--left:hover:after,.theme-abductor .Tooltip--right:after{transform:translateX(-8px) translateY(-50%)}.theme-abductor .Tooltip--right:after{top:50%;left:100%}.theme-abductor .Tooltip--right:hover:after{transform:translateX(8px) translateY(-50%)}.theme-abductor .Layout,.theme-abductor .Layout *{scrollbar-base-color:#202538;scrollbar-face-color:#384263;scrollbar-3dlight-color:#2a314a;scrollbar-highlight-color:#2a314a;scrollbar-track-color:#202538;scrollbar-arrow-color:#818db8;scrollbar-shadow-color:#384263}.theme-abductor .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-abductor .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-abductor .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#2a314a;background-image:linear-gradient(180deg,#353e5e 0,#1f2436)}.theme-abductor .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px}.theme-abductor .Window__rest{position:fixed;top:32px;bottom:0;left:0;right:0}.theme-abductor .Window__contentPadding{margin:6px;height:calc(100% - 12px)}.theme-abductor .Window__contentPadding:after{height:0}.theme-abductor .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:6px}.theme-abductor .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(68,76,104,.25);pointer-events:none}.theme-abductor .Window__toast{position:fixed;bottom:0;left:0;right:0;font-size:12px;height:40px;line-height:39px;padding:0 12px;background-color:#151925;color:hsla(0,0%,100%,.8)}.theme-abductor .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;height:20px;cursor:se-resize}.theme-abductor .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;cursor:s-resize}.theme-abductor .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;cursor:e-resize}.theme-abductor .TitleBar{background-color:#9e1b46;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-abductor .TitleBar__clickable{color:hsla(0,0%,100%,.5);background-color:#9e1b46;transition:color .25s,background-color .25s}.theme-abductor .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-abductor .TitleBar__title{position:absolute;top:0;left:46px;color:hsla(0,0%,100%,.75);font-size:14px;line-height:31px;white-space:nowrap}.theme-abductor .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px}.theme-abductor .TitleBar__statusIcon{position:absolute;top:0;left:12px;transition:color .5s;font-size:20px;line-height:32px!important}.theme-abductor .TitleBar__minimize{position:absolute;top:6px;right:46px}.theme-abductor .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;height:32px;font-size:20px;line-height:31px;text-align:center}.theme-abductor .TitleBar__devBuildIndicator{position:absolute;top:6px;right:52px;min-width:20px;padding:2px 4px;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-abductor .Layout__content{background-image:none}.theme-cardtable .Button{position:relative;display:inline-block;line-height:20px;padding:0 6px;margin-right:2px;white-space:nowrap;outline:0;border-radius:0;margin-bottom:2px;user-select:none;-ms-user-select:none}.theme-cardtable .Button:last-child{margin-right:0}.theme-cardtable .Button .fa,.theme-cardtable .Button .far,.theme-cardtable .Button .fas{margin-left:-3px;margin-right:-3px;min-width:16px;text-align:center}.theme-cardtable .Button--hasContent .fa,.theme-cardtable .Button--hasContent .far,.theme-cardtable .Button--hasContent .fas{margin-right:3px}.theme-cardtable .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-cardtable .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-cardtable .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#117039;color:#fff}.theme-cardtable .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-cardtable .Button--color--default:focus{transition:color .1s,background-color .1s}.theme-cardtable .Button--color--default:focus,.theme-cardtable .Button--color--default:hover{background-color:#1c8247;color:#fff}.theme-cardtable .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#be6209;color:#fff}.theme-cardtable .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-cardtable .Button--color--caution:focus{transition:color .1s,background-color .1s}.theme-cardtable .Button--color--caution:focus,.theme-cardtable .Button--color--caution:hover{background-color:#d67313;color:#fff}.theme-cardtable .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-cardtable .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-cardtable .Button--color--danger:focus{transition:color .1s,background-color .1s}.theme-cardtable .Button--color--danger:focus,.theme-cardtable .Button--color--danger:hover{background-color:#afb30a;color:#fff}.theme-cardtable .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#117039;color:#fff;background-color:rgba(17,112,57,0);color:hsla(0,0%,100%,.5)}.theme-cardtable .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-cardtable .Button--color--transparent:focus{transition:color .1s,background-color .1s}.theme-cardtable .Button--color--transparent:focus,.theme-cardtable .Button--color--transparent:hover{background-color:#1c8247;color:#fff}.theme-cardtable .Button--disabled{background-color:#363636!important}.theme-cardtable .Button--selected{transition:color 50ms,background-color 50ms;background-color:#9d0808;color:#fff}.theme-cardtable .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-cardtable .Button--selected:focus{transition:color .1s,background-color .1s}.theme-cardtable .Button--selected:focus,.theme-cardtable .Button--selected:hover{background-color:#b31212;color:#fff}.theme-cardtable .Input{position:relative;display:inline-block;width:120px;border:1px solid #88bfff;border:1px solid rgba(136,191,255,.75);border-radius:0;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 4px;margin-right:2px;line-height:17px;overflow:visible}.theme-cardtable .Input--fluid{display:block;width:auto}.theme-cardtable .Input__baseline{display:inline-block;color:transparent}.theme-cardtable .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:12px;line-height:17px;height:17px;margin:0;padding:0 6px;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.theme-cardtable .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:hsla(0,0%,100%,.45)}.theme-cardtable .NumberInput{position:relative;display:inline-block;border:1px solid #fff;border:1px solid hsla(0,0%,100%,.75);border-radius:0;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 4px;margin-right:2px;line-height:17px;text-align:right;overflow:visible;cursor:n-resize}.theme-cardtable .NumberInput--fluid{display:block}.theme-cardtable .NumberInput__content{margin-left:6px}.theme-cardtable .NumberInput__barContainer{position:absolute;top:2px;bottom:2px;left:2px}.theme-cardtable .NumberInput__bar{position:absolute;bottom:0;left:0;width:3px;box-sizing:border-box;border-bottom:1px solid #fff;background-color:#fff}.theme-cardtable .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:12px;line-height:17px;height:17px;margin:0;padding:0 6px;font-family:Verdana,sans-serif;background-color:#000;color:#fff;text-align:right}.theme-cardtable .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 6px;border-radius:0;background-color:rgba(0,0,0,.5);transition:border-color .5s}.theme-cardtable .ProgressBar__fill{position:absolute;top:0;left:0;bottom:0}.theme-cardtable .ProgressBar__fill--animated{transition:background-color .5s,width .5s}.theme-cardtable .ProgressBar__content{position:relative;line-height:17px;width:100%;text-align:right}.theme-cardtable .ProgressBar--color--default{border:1px solid #000}.theme-cardtable .ProgressBar--color--default .ProgressBar__fill{background-color:#000}.theme-cardtable .Section{position:relative;margin-bottom:6px;background-color:#1a1a1a;background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5);box-sizing:border-box}.theme-cardtable .Section:last-child{margin-bottom:0}.theme-cardtable .Section__title{position:relative;padding:6px;border-bottom:2px solid #000}.theme-cardtable .Section__titleText{font-size:14px;font-weight:700}.theme-cardtable .Section__buttons{position:absolute;display:inline-block;right:6px;margin-top:-1px}.theme-cardtable .Section__content{padding:8px 6px}.theme-cardtable .Section--fill{display:flex;flex-direction:column;height:100%}.theme-cardtable .Section--fill .Section__content{flex-grow:1}.theme-cardtable .Section--level--1 .Section__titleText{font-size:14px}.theme-cardtable .Section--level--2 .Section__titleText{font-size:13px}.theme-cardtable .Section--level--3 .Section__titleText{font-size:12px}.theme-cardtable .Section--level--2,.theme-cardtable .Section--level--3{background-color:transparent;box-shadow:none;margin-left:-6px;margin-right:-6px}.theme-cardtable .Layout,.theme-cardtable .Layout *{scrollbar-base-color:#0d542b;scrollbar-face-color:#16914a;scrollbar-3dlight-color:#117039;scrollbar-highlight-color:#117039;scrollbar-track-color:#0d542b;scrollbar-arrow-color:#5ae695;scrollbar-shadow-color:#16914a}.theme-cardtable .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-cardtable .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-cardtable .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#117039;background-image:linear-gradient(180deg,#117039 0,#117039)}.theme-cardtable .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px}.theme-cardtable .Window__rest{position:fixed;top:32px;bottom:0;left:0;right:0}.theme-cardtable .Window__contentPadding{margin:6px;height:calc(100% - 12px)}.theme-cardtable .Window__contentPadding:after{height:0}.theme-cardtable .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:6px}.theme-cardtable .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(39,148,85,.25);pointer-events:none}.theme-cardtable .Window__toast{position:fixed;bottom:0;left:0;right:0;font-size:12px;height:40px;line-height:39px;padding:0 12px;background-color:#09381d;color:hsla(0,0%,100%,.8)}.theme-cardtable .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;height:20px;cursor:se-resize}.theme-cardtable .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;cursor:s-resize}.theme-cardtable .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;cursor:e-resize}.theme-cardtable .TitleBar{background-color:#381608;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-cardtable .TitleBar__clickable{color:hsla(0,0%,100%,.5);background-color:#381608;transition:color .25s,background-color .25s}.theme-cardtable .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-cardtable .TitleBar__title{position:absolute;top:0;left:46px;color:hsla(0,0%,100%,.75);font-size:14px;line-height:31px;white-space:nowrap}.theme-cardtable .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px}.theme-cardtable .TitleBar__statusIcon{position:absolute;top:0;left:12px;transition:color .5s;font-size:20px;line-height:32px!important}.theme-cardtable .TitleBar__minimize{position:absolute;top:6px;right:46px}.theme-cardtable .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;height:32px;font-size:20px;line-height:31px;text-align:center}.theme-cardtable .TitleBar__devBuildIndicator{position:absolute;top:6px;right:52px;min-width:20px;padding:2px 4px;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-cardtable .Button{border:2px solid #fff}.theme-hackerman .Button{position:relative;display:inline-block;line-height:20px;padding:0 6px;margin-right:2px;white-space:nowrap;outline:0;border-radius:2px;margin-bottom:2px;user-select:none;-ms-user-select:none}.theme-hackerman .Button:last-child{margin-right:0}.theme-hackerman .Button .fa,.theme-hackerman .Button .far,.theme-hackerman .Button .fas{margin-left:-3px;margin-right:-3px;min-width:16px;text-align:center}.theme-hackerman .Button--hasContent .fa,.theme-hackerman .Button--hasContent .far,.theme-hackerman .Button--hasContent .fas{margin-right:3px}.theme-hackerman .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-hackerman .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-hackerman .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#0f0;color:#000}.theme-hackerman .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-hackerman .Button--color--default:focus{transition:color .1s,background-color .1s}.theme-hackerman .Button--color--default:focus,.theme-hackerman .Button--color--default:hover{background-color:#26ff26;color:#000}.theme-hackerman .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.theme-hackerman .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-hackerman .Button--color--caution:focus{transition:color .1s,background-color .1s}.theme-hackerman .Button--color--caution:focus,.theme-hackerman .Button--color--caution:hover{background-color:#f3d00e;color:#000}.theme-hackerman .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.theme-hackerman .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-hackerman .Button--color--danger:focus{transition:color .1s,background-color .1s}.theme-hackerman .Button--color--danger:focus,.theme-hackerman .Button--color--danger:hover{background-color:#d52b2b;color:#fff}.theme-hackerman .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#121b12;color:#fff;background-color:rgba(18,27,18,0);color:hsla(0,0%,100%,.5)}.theme-hackerman .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-hackerman .Button--color--transparent:focus{transition:color .1s,background-color .1s}.theme-hackerman .Button--color--transparent:focus,.theme-hackerman .Button--color--transparent:hover{background-color:#1d271d;color:#fff}.theme-hackerman .Button--disabled{background-color:#4a6a4a!important}.theme-hackerman .Button--selected{transition:color 50ms,background-color 50ms;background-color:#0f0;color:#000}.theme-hackerman .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-hackerman .Button--selected:focus{transition:color .1s,background-color .1s}.theme-hackerman .Button--selected:focus,.theme-hackerman .Button--selected:hover{background-color:#26ff26;color:#000}.theme-hackerman .Input{position:relative;display:inline-block;width:120px;border:1px solid #0f0;border:1px solid rgba(0,255,0,.75);border-radius:2px;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 4px;margin-right:2px;line-height:17px;overflow:visible}.theme-hackerman .Input--fluid{display:block;width:auto}.theme-hackerman .Input__baseline{display:inline-block;color:transparent}.theme-hackerman .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:12px;line-height:17px;height:17px;margin:0;padding:0 6px;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.theme-hackerman .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:hsla(0,0%,100%,.45)}.theme-hackerman .Modal{background-color:#121b12;max-width:calc(100% - 1rem);padding:1rem}.theme-hackerman .Section{position:relative;margin-bottom:6px;background-color:#1a1a1a;background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5);box-sizing:border-box}.theme-hackerman .Section:last-child{margin-bottom:0}.theme-hackerman .Section__title{position:relative;padding:6px;border-bottom:2px solid #0f0}.theme-hackerman .Section__titleText{font-size:14px;font-weight:700}.theme-hackerman .Section__buttons{position:absolute;display:inline-block;right:6px;margin-top:-1px}.theme-hackerman .Section__content{padding:8px 6px}.theme-hackerman .Section--fill{display:flex;flex-direction:column;height:100%}.theme-hackerman .Section--fill .Section__content{flex-grow:1}.theme-hackerman .Section--level--1 .Section__titleText{font-size:14px}.theme-hackerman .Section--level--2 .Section__titleText{font-size:13px}.theme-hackerman .Section--level--3 .Section__titleText{font-size:12px}.theme-hackerman .Section--level--2,.theme-hackerman .Section--level--3{background-color:transparent;box-shadow:none;margin-left:-6px;margin-right:-6px}.theme-hackerman .Layout,.theme-hackerman .Layout *{scrollbar-base-color:#0e140e;scrollbar-face-color:#253725;scrollbar-3dlight-color:#121b12;scrollbar-highlight-color:#121b12;scrollbar-track-color:#0e140e;scrollbar-arrow-color:#74a274;scrollbar-shadow-color:#253725}.theme-hackerman .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-hackerman .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-hackerman .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#121b12;background-image:linear-gradient(180deg,#121b12 0,#121b12)}.theme-hackerman .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px}.theme-hackerman .Window__rest{position:fixed;top:32px;bottom:0;left:0;right:0}.theme-hackerman .Window__contentPadding{margin:6px;height:calc(100% - 12px)}.theme-hackerman .Window__contentPadding:after{height:0}.theme-hackerman .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:6px}.theme-hackerman .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(40,50,40,.25);pointer-events:none}.theme-hackerman .Window__toast{position:fixed;bottom:0;left:0;right:0;font-size:12px;height:40px;line-height:39px;padding:0 12px;background-color:#090e09;color:hsla(0,0%,100%,.8)}.theme-hackerman .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;height:20px;cursor:se-resize}.theme-hackerman .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;cursor:s-resize}.theme-hackerman .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;cursor:e-resize}.theme-hackerman .TitleBar{background-color:#223d22;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-hackerman .TitleBar__clickable{color:hsla(0,0%,100%,.5);background-color:#223d22;transition:color .25s,background-color .25s}.theme-hackerman .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-hackerman .TitleBar__title{position:absolute;top:0;left:46px;color:hsla(0,0%,100%,.75);font-size:14px;line-height:31px;white-space:nowrap}.theme-hackerman .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px}.theme-hackerman .TitleBar__statusIcon{position:absolute;top:0;left:12px;transition:color .5s;font-size:20px;line-height:32px!important}.theme-hackerman .TitleBar__minimize{position:absolute;top:6px;right:46px}.theme-hackerman .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;height:32px;font-size:20px;line-height:31px;text-align:center}.theme-hackerman .TitleBar__devBuildIndicator{position:absolute;top:6px;right:52px;min-width:20px;padding:2px 4px;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-hackerman .Layout__content{background-image:none}.theme-hackerman .Button{font-family:monospace;border:2px outset #0a0;outline:1px solid #007a00}.theme-hackerman .candystripe:nth-child(odd){background-color:rgba(0,100,0,.5)}.theme-malfunction .Button{position:relative;display:inline-block;line-height:20px;padding:0 6px;margin-right:2px;white-space:nowrap;outline:0;border-radius:2px;margin-bottom:2px;user-select:none;-ms-user-select:none}.theme-malfunction .Button:last-child{margin-right:0}.theme-malfunction .Button .fa,.theme-malfunction .Button .far,.theme-malfunction .Button .fas{margin-left:-3px;margin-right:-3px;min-width:16px;text-align:center}.theme-malfunction .Button--hasContent .fa,.theme-malfunction .Button--hasContent .far,.theme-malfunction .Button--hasContent .fas{margin-right:3px}.theme-malfunction .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-malfunction .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-malfunction .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#910101;color:#fff}.theme-malfunction .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-malfunction .Button--color--default:focus{transition:color .1s,background-color .1s}.theme-malfunction .Button--color--default:focus,.theme-malfunction .Button--color--default:hover{background-color:#a60b0b;color:#fff}.theme-malfunction .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#be6209;color:#fff}.theme-malfunction .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-malfunction .Button--color--caution:focus{transition:color .1s,background-color .1s}.theme-malfunction .Button--color--caution:focus,.theme-malfunction .Button--color--caution:hover{background-color:#d67313;color:#fff}.theme-malfunction .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-malfunction .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-malfunction .Button--color--danger:focus{transition:color .1s,background-color .1s}.theme-malfunction .Button--color--danger:focus,.theme-malfunction .Button--color--danger:hover{background-color:#afb30a;color:#fff}.theme-malfunction .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#1b3443;color:#fff;background-color:rgba(27,52,67,0);color:hsla(0,0%,100%,.5)}.theme-malfunction .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-malfunction .Button--color--transparent:focus{transition:color .1s,background-color .1s}.theme-malfunction .Button--color--transparent:focus,.theme-malfunction .Button--color--transparent:hover{background-color:#274252;color:#fff}.theme-malfunction .Button--disabled{background-color:#363636!important}.theme-malfunction .Button--selected{transition:color 50ms,background-color 50ms;background-color:#1e5881;color:#fff}.theme-malfunction .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-malfunction .Button--selected:focus{transition:color .1s,background-color .1s}.theme-malfunction .Button--selected:focus,.theme-malfunction .Button--selected:hover{background-color:#2a6894;color:#fff}.theme-malfunction .NoticeBox{padding:4px 6px;margin-bottom:6px;box-shadow:none;font-weight:700;font-style:italic;color:#fff;background-color:#1a3f57;background-image:repeating-linear-gradient(-45deg,transparent,transparent 10px,rgba(0,0,0,.1) 0,rgba(0,0,0,.1) 20px)}.theme-malfunction .NoticeBox--type--info{color:#fff;background-color:#235982}.theme-malfunction .NoticeBox--type--success{color:#fff;background-color:#1e662f}.theme-malfunction .NoticeBox--type--warning{color:#fff;background-color:#a95219}.theme-malfunction .NoticeBox--type--danger{color:#fff;background-color:#8f2828}.theme-malfunction .Input{position:relative;display:inline-block;width:120px;border:1px solid #910101;border:1px solid rgba(145,1,1,.75);border-radius:2px;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 4px;margin-right:2px;line-height:17px;overflow:visible}.theme-malfunction .Input--fluid{display:block;width:auto}.theme-malfunction .Input__baseline{display:inline-block;color:transparent}.theme-malfunction .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:12px;line-height:17px;height:17px;margin:0;padding:0 6px;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.theme-malfunction .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:hsla(0,0%,100%,.45)}.theme-malfunction .NumberInput{position:relative;display:inline-block;border:1px solid #910101;border:1px solid rgba(145,1,1,.75);border-radius:2px;color:#910101;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 4px;margin-right:2px;line-height:17px;text-align:right;overflow:visible;cursor:n-resize}.theme-malfunction .NumberInput--fluid{display:block}.theme-malfunction .NumberInput__content{margin-left:6px}.theme-malfunction .NumberInput__barContainer{position:absolute;top:2px;bottom:2px;left:2px}.theme-malfunction .NumberInput__bar{position:absolute;bottom:0;left:0;width:3px;box-sizing:border-box;border-bottom:1px solid #910101;background-color:#910101}.theme-malfunction .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:12px;line-height:17px;height:17px;margin:0;padding:0 6px;font-family:Verdana,sans-serif;background-color:#000;color:#fff;text-align:right}.theme-malfunction .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 6px;border-radius:2px;background-color:rgba(0,0,0,.5);transition:border-color .5s}.theme-malfunction .ProgressBar__fill{position:absolute;top:0;left:0;bottom:0}.theme-malfunction .ProgressBar__fill--animated{transition:background-color .5s,width .5s}.theme-malfunction .ProgressBar__content{position:relative;line-height:17px;width:100%;text-align:right}.theme-malfunction .ProgressBar--color--default{border:1px solid #7b0101}.theme-malfunction .ProgressBar--color--default .ProgressBar__fill{background-color:#7b0101}.theme-malfunction .Section{position:relative;margin-bottom:6px;background-color:#1a1a1a;background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5);box-sizing:border-box}.theme-malfunction .Section:last-child{margin-bottom:0}.theme-malfunction .Section__title{position:relative;padding:6px;border-bottom:2px solid #910101}.theme-malfunction .Section__titleText{font-size:14px;font-weight:700}.theme-malfunction .Section__buttons{position:absolute;display:inline-block;right:6px;margin-top:-1px}.theme-malfunction .Section__content{padding:8px 6px}.theme-malfunction .Section--fill{display:flex;flex-direction:column;height:100%}.theme-malfunction .Section--fill .Section__content{flex-grow:1}.theme-malfunction .Section--level--1 .Section__titleText{font-size:14px}.theme-malfunction .Section--level--2 .Section__titleText{font-size:13px}.theme-malfunction .Section--level--3 .Section__titleText{font-size:12px}.theme-malfunction .Section--level--2,.theme-malfunction .Section--level--3{background-color:transparent;box-shadow:none;margin-left:-6px;margin-right:-6px}.theme-malfunction .Tooltip{position:absolute;top:0;left:0;right:0;bottom:0;font-style:normal;font-weight:400}.theme-malfunction .Tooltip:after{position:absolute;display:block;white-space:nowrap;z-index:2;padding:6px 10px;transform:translateX(-50%);pointer-events:none;visibility:hidden;opacity:0;text-align:left;content:attr(data-tooltip);transition:all .15s;background-color:#235577;box-shadow:1px 1px 15px -1px rgba(0,0,0,.5);border-radius:2px}.theme-malfunction .Tooltip:hover:after{transition:all 70ms;pointer-events:none;visibility:visible;opacity:1}.theme-malfunction .Tooltip--long:after{width:250px;white-space:normal}.theme-malfunction .Tooltip--top:after{bottom:100%;left:50%;transform:translateX(-50%) translateY(8px)}.theme-malfunction .Tooltip--bottom:after,.theme-malfunction .Tooltip--top:hover:after{transform:translateX(-50%) translateY(-8px)}.theme-malfunction .Tooltip--bottom:after{top:100%;left:50%}.theme-malfunction .Tooltip--bottom:hover:after{transform:translateX(-50%) translateY(8px)}.theme-malfunction .Tooltip--bottom-left:after{top:100%;right:50%;transform:translateX(12px) translateY(-8px)}.theme-malfunction .Tooltip--bottom-left:hover:after{transform:translateX(12px) translateY(8px)}.theme-malfunction .Tooltip--bottom-right:after{top:100%;left:50%;transform:translateX(-12px) translateY(-8px)}.theme-malfunction .Tooltip--bottom-right:hover:after{transform:translateX(-12px) translateY(8px)}.theme-malfunction .Tooltip--left:after{top:50%;right:100%;transform:translateX(8px) translateY(-50%)}.theme-malfunction .Tooltip--left:hover:after,.theme-malfunction .Tooltip--right:after{transform:translateX(-8px) translateY(-50%)}.theme-malfunction .Tooltip--right:after{top:50%;left:100%}.theme-malfunction .Tooltip--right:hover:after{transform:translateX(8px) translateY(-50%)}.theme-malfunction .Layout,.theme-malfunction .Layout *{scrollbar-base-color:#142732;scrollbar-face-color:#274b61;scrollbar-3dlight-color:#1b3443;scrollbar-highlight-color:#1b3443;scrollbar-track-color:#142732;scrollbar-arrow-color:#6ba2c3;scrollbar-shadow-color:#274b61}.theme-malfunction .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-malfunction .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-malfunction .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#1b3443;background-image:linear-gradient(180deg,#244559 0,#12232d)}.theme-malfunction .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px}.theme-malfunction .Window__rest{position:fixed;top:32px;bottom:0;left:0;right:0}.theme-malfunction .Window__contentPadding{margin:6px;height:calc(100% - 12px)}.theme-malfunction .Window__contentPadding:after{height:0}.theme-malfunction .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:6px}.theme-malfunction .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(50,79,96,.25);pointer-events:none}.theme-malfunction .Window__toast{position:fixed;bottom:0;left:0;right:0;font-size:12px;height:40px;line-height:39px;padding:0 12px;background-color:#0e1a22;color:hsla(0,0%,100%,.8)}.theme-malfunction .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;height:20px;cursor:se-resize}.theme-malfunction .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;cursor:s-resize}.theme-malfunction .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;cursor:e-resize}.theme-malfunction .TitleBar{background-color:#1a3f57;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-malfunction .TitleBar__clickable{color:hsla(0,0%,100%,.5);background-color:#1a3f57;transition:color .25s,background-color .25s}.theme-malfunction .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-malfunction .TitleBar__title{position:absolute;top:0;left:46px;color:hsla(0,0%,100%,.75);font-size:14px;line-height:31px;white-space:nowrap}.theme-malfunction .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px}.theme-malfunction .TitleBar__statusIcon{position:absolute;top:0;left:12px;transition:color .5s;font-size:20px;line-height:32px!important}.theme-malfunction .TitleBar__minimize{position:absolute;top:6px;right:46px}.theme-malfunction .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;height:32px;font-size:20px;line-height:31px;text-align:center}.theme-malfunction .TitleBar__devBuildIndicator{position:absolute;top:6px;right:52px;min-width:20px;padding:2px 4px;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-malfunction .Layout__content{background-image:none}.theme-ntos .Button{position:relative;display:inline-block;line-height:20px;padding:0 6px;margin-right:2px;white-space:nowrap;outline:0;border-radius:2px;margin-bottom:2px;user-select:none;-ms-user-select:none}.theme-ntos .Button:last-child{margin-right:0}.theme-ntos .Button .fa,.theme-ntos .Button .far,.theme-ntos .Button .fas{margin-left:-3px;margin-right:-3px;min-width:16px;text-align:center}.theme-ntos .Button--hasContent .fa,.theme-ntos .Button--hasContent .far,.theme-ntos .Button--hasContent .fas{margin-right:3px}.theme-ntos .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-ntos .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-ntos .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#384e68;color:#fff}.theme-ntos .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-ntos .Button--color--default:focus{transition:color .1s,background-color .1s}.theme-ntos .Button--color--default:focus,.theme-ntos .Button--color--default:hover{background-color:#465e7a;color:#fff}.theme-ntos .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.theme-ntos .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-ntos .Button--color--caution:focus{transition:color .1s,background-color .1s}.theme-ntos .Button--color--caution:focus,.theme-ntos .Button--color--caution:hover{background-color:#f3d00e;color:#000}.theme-ntos .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.theme-ntos .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-ntos .Button--color--danger:focus{transition:color .1s,background-color .1s}.theme-ntos .Button--color--danger:focus,.theme-ntos .Button--color--danger:hover{background-color:#d52b2b;color:#fff}.theme-ntos .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#1f2b39;color:#fff;background-color:rgba(31,43,57,0);color:rgba(227,240,255,.75)}.theme-ntos .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-ntos .Button--color--transparent:focus{transition:color .1s,background-color .1s}.theme-ntos .Button--color--transparent:focus,.theme-ntos .Button--color--transparent:hover{background-color:#2b3847;color:#fff}.theme-ntos .Button--disabled{background-color:#999!important}.theme-ntos .Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.theme-ntos .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-ntos .Button--selected:focus{transition:color .1s,background-color .1s}.theme-ntos .Button--selected:focus,.theme-ntos .Button--selected:hover{background-color:#27ab46;color:#fff}.theme-ntos .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 6px;border-radius:2px;background-color:rgba(0,0,0,.5);transition:border-color .5s}.theme-ntos .ProgressBar__fill{position:absolute;top:0;left:0;bottom:0}.theme-ntos .ProgressBar__fill--animated{transition:background-color .5s,width .5s}.theme-ntos .ProgressBar__content{position:relative;line-height:17px;width:100%;text-align:right}.theme-ntos .ProgressBar--color--default{border:1px solid #384e68}.theme-ntos .ProgressBar--color--default .ProgressBar__fill{background-color:#384e68}.theme-ntos .Section{position:relative;margin-bottom:6px;background-color:#1a1a1a;background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5);box-sizing:border-box}.theme-ntos .Section:last-child{margin-bottom:0}.theme-ntos .Section__title{position:relative;padding:6px;border-bottom:2px solid #4972a1}.theme-ntos .Section__titleText{font-size:14px;font-weight:700}.theme-ntos .Section__buttons{position:absolute;display:inline-block;right:6px;margin-top:-1px}.theme-ntos .Section__content{padding:8px 6px}.theme-ntos .Section--fill{display:flex;flex-direction:column;height:100%}.theme-ntos .Section--fill .Section__content{flex-grow:1}.theme-ntos .Section--level--1 .Section__titleText{font-size:14px}.theme-ntos .Section--level--2 .Section__titleText{font-size:13px}.theme-ntos .Section--level--3 .Section__titleText{font-size:12px}.theme-ntos .Section--level--2,.theme-ntos .Section--level--3{background-color:transparent;box-shadow:none;margin-left:-6px;margin-right:-6px}.theme-ntos .Layout,.theme-ntos .Layout *{scrollbar-base-color:#17202b;scrollbar-face-color:#2e3f55;scrollbar-3dlight-color:#1f2b39;scrollbar-highlight-color:#1f2b39;scrollbar-track-color:#17202b;scrollbar-arrow-color:#7693b5;scrollbar-shadow-color:#2e3f55}.theme-ntos .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-ntos .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-ntos .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#1f2b39;background-image:linear-gradient(180deg,#223040 0,#1b2633)}.theme-ntos .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px}.theme-ntos .Window__rest{position:fixed;top:32px;bottom:0;left:0;right:0}.theme-ntos .Window__contentPadding{margin:6px;height:calc(100% - 12px)}.theme-ntos .Window__contentPadding:after{height:0}.theme-ntos .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:6px}.theme-ntos .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(55,69,85,.25);pointer-events:none}.theme-ntos .Window__toast{position:fixed;bottom:0;left:0;right:0;font-size:12px;height:40px;line-height:39px;padding:0 12px;background-color:#0f151d;color:hsla(0,0%,100%,.8)}.theme-ntos .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;height:20px;cursor:se-resize}.theme-ntos .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;cursor:s-resize}.theme-ntos .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;cursor:e-resize}.theme-ntos .TitleBar{background-color:#2a3b4e;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-ntos .TitleBar__clickable{color:hsla(0,0%,100%,.5);background-color:#2a3b4e;transition:color .25s,background-color .25s}.theme-ntos .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-ntos .TitleBar__title{position:absolute;top:0;left:46px;color:hsla(0,0%,100%,.75);font-size:14px;line-height:31px;white-space:nowrap}.theme-ntos .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px}.theme-ntos .TitleBar__statusIcon{position:absolute;top:0;left:12px;transition:color .5s;font-size:20px;line-height:32px!important}.theme-ntos .TitleBar__minimize{position:absolute;top:6px;right:46px}.theme-ntos .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;height:32px;font-size:20px;line-height:31px;text-align:center}.theme-ntos .TitleBar__devBuildIndicator{position:absolute;top:6px;right:52px;min-width:20px;padding:2px 4px;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-paper .Tabs--horizontal{border-bottom:2px solid hsla(0,0%,100%,.1);margin-bottom:6px}.theme-paper .Tabs--horizontal .Tabs__tab--altSelection:after{content:"";position:absolute;bottom:0;right:0;left:0;height:2px;width:100%;background-color:#fff;border-radius:2px}.theme-paper .Tabs--vertical{margin-right:9px}.theme-paper .Tabs--vertical .Tabs__tabBox{border-right:2px solid hsla(0,0%,100%,.1);vertical-align:top}.theme-paper .Tabs--vertical .Tabs__tab{display:block!important;margin-right:0!important;margin-bottom:0;padding:1px 9px 0 6px;border-bottom:2px solid hsla(0,0%,100%,.1)}.theme-paper .Tabs--vertical .Tabs__tab:last-child{border-bottom:0}.theme-paper .Tabs--vertical .Tabs__tab--altSelection:after{content:"";position:absolute;top:0;bottom:0;right:0;height:100%;width:3px;background-color:#fff;border-radius:2px}.theme-paper .Section{position:relative;margin-bottom:6px;background-color:#1a1a1a;background-color:rgba(0,0,0,.1);box-shadow:inset 0 0 5px rgba(0,0,0,.2);box-sizing:border-box}.theme-paper .Section:last-child{margin-bottom:0}.theme-paper .Section__title{position:relative;padding:6px;border-bottom:2px solid #fff}.theme-paper .Section__titleText{font-size:14px;font-weight:700}.theme-paper .Section__buttons{position:absolute;display:inline-block;right:6px;margin-top:-1px}.theme-paper .Section__content{padding:8px 6px}.theme-paper .Section--fill{display:flex;flex-direction:column;height:100%}.theme-paper .Section--fill .Section__content{flex-grow:1}.theme-paper .Section--level--1 .Section__titleText{font-size:14px}.theme-paper .Section--level--2 .Section__titleText{font-size:13px}.theme-paper .Section--level--3 .Section__titleText{font-size:12px}.theme-paper .Section--level--2,.theme-paper .Section--level--3{background-color:transparent;box-shadow:none;margin-left:-6px;margin-right:-6px}.theme-paper .Button{position:relative;display:inline-block;line-height:20px;padding:0 6px;margin-right:2px;white-space:nowrap;outline:0;border-radius:2px;margin-bottom:2px;user-select:none;-ms-user-select:none}.theme-paper .Button:last-child{margin-right:0}.theme-paper .Button .fa,.theme-paper .Button .far,.theme-paper .Button .fas{margin-left:-3px;margin-right:-3px;min-width:16px;text-align:center}.theme-paper .Button--hasContent .fa,.theme-paper .Button--hasContent .far,.theme-paper .Button--hasContent .fas{margin-right:3px}.theme-paper .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-paper .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-paper .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#e8e4c9;color:#000}.theme-paper .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--default:focus{transition:color .1s,background-color .1s}.theme-paper .Button--color--default:focus,.theme-paper .Button--color--default:hover{background-color:#f7f6ee;color:#000}.theme-paper .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#be6209;color:#fff}.theme-paper .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--caution:focus{transition:color .1s,background-color .1s}.theme-paper .Button--color--caution:focus,.theme-paper .Button--color--caution:hover{background-color:#d67313;color:#fff}.theme-paper .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-paper .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--danger:focus{transition:color .1s,background-color .1s}.theme-paper .Button--color--danger:focus,.theme-paper .Button--color--danger:hover{background-color:#afb30a;color:#fff}.theme-paper .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#fff;color:#000;background-color:hsla(0,0%,100%,0);color:rgba(0,0,0,.5)}.theme-paper .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--color--transparent:focus{transition:color .1s,background-color .1s}.theme-paper .Button--color--transparent:focus,.theme-paper .Button--color--transparent:hover{background-color:#fff;color:#000}.theme-paper .Button--disabled{background-color:#363636!important}.theme-paper .Button--selected{transition:color 50ms,background-color 50ms;background-color:#9d0808;color:#fff}.theme-paper .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-paper .Button--selected:focus{transition:color .1s,background-color .1s}.theme-paper .Button--selected:focus,.theme-paper .Button--selected:hover{background-color:#b31212;color:#fff}.theme-paper .Layout,.theme-paper .Layout *{scrollbar-base-color:#bfbfbf;scrollbar-face-color:#fff;scrollbar-3dlight-color:#fff;scrollbar-highlight-color:#fff;scrollbar-track-color:#bfbfbf;scrollbar-arrow-color:#fff;scrollbar-shadow-color:#fff}.theme-paper .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-paper .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-paper .Window{position:fixed;top:0;bottom:0;left:0;right:0;background-color:#fff;background-image:linear-gradient(180deg,#fff 0,#fff)}.theme-paper .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px}.theme-paper .Window__rest{position:fixed;top:32px;bottom:0;left:0;right:0}.theme-paper .Window__contentPadding{margin:6px;height:calc(100% - 12px)}.theme-paper .Window__contentPadding:after{height:0}.theme-paper .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:6px}.theme-paper .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:hsla(0,0%,100%,.25);pointer-events:none}.theme-paper .Window__toast{position:fixed;bottom:0;left:0;right:0;font-size:12px;height:40px;line-height:39px;padding:0 12px;background-color:grey;color:hsla(0,0%,100%,.8)}.theme-paper .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;height:20px;cursor:se-resize}.theme-paper .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;cursor:s-resize}.theme-paper .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;cursor:e-resize}.theme-paper .TitleBar{background-color:#fff;border-bottom:1px solid rgba(0,0,0,.25);box-shadow:0 2px 2px rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-paper .TitleBar__clickable{color:rgba(0,0,0,.5);background-color:#fff;transition:color .25s,background-color .25s}.theme-paper .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-paper .TitleBar__title{position:absolute;top:0;left:46px;color:rgba(0,0,0,.75);font-size:14px;line-height:31px;white-space:nowrap}.theme-paper .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px}.theme-paper .TitleBar__statusIcon{position:absolute;top:0;left:12px;transition:color .5s;font-size:20px;line-height:32px!important}.theme-paper .TitleBar__minimize{position:absolute;top:6px;right:46px}.theme-paper .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;height:32px;font-size:20px;line-height:31px;text-align:center}.theme-paper .TitleBar__devBuildIndicator{position:absolute;top:6px;right:52px;min-width:20px;padding:2px 4px;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-paper .PaperInput{position:relative;display:inline-block;width:120px;background:transparent;border:none;border-bottom:1px solid #000;outline:none;background-color:rgba(255,255,62,.8);padding:0 4px;margin-right:2px;line-height:17px;overflow:visible}.theme-paper .PaperInput__baseline{display:inline-block;color:transparent}.theme-paper .PaperInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:12px;line-height:17px;height:17px;margin:0;padding:0 6px;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.theme-paper .PaperInput__input:-ms-input-placeholder{font-style:italic;color:#777;color:hsla(0,0%,100%,.45)}.theme-paper .Layout__content,.theme-paper .Window{background-image:none}.theme-paper .Window{color:#000}.theme-paper .paper-field,.theme-paper .paper-field input:disabled,.theme-paper .paper-text input,.theme-paper .paper-text input:disabled{position:relative;display:inline-block;background:transparent;border:none;border-bottom:1px solid #000;outline:none;background-color:rgba(255,255,62,.8);padding:0 4px;margin-right:2px;line-height:17px;overflow:visible}.theme-retro .Button{position:relative;display:inline-block;line-height:20px;padding:0 6px;margin-right:2px;white-space:nowrap;outline:0;border-radius:0;margin-bottom:2px;user-select:none;-ms-user-select:none}.theme-retro .Button:last-child{margin-right:0}.theme-retro .Button .fa,.theme-retro .Button .far,.theme-retro .Button .fas{margin-left:-3px;margin-right:-3px;min-width:16px;text-align:center}.theme-retro .Button--hasContent .fa,.theme-retro .Button--hasContent .far,.theme-retro .Button--hasContent .fas{margin-right:3px}.theme-retro .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-retro .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-retro .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#e8e4c9;color:#000}.theme-retro .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-retro .Button--color--default:focus{transition:color .1s,background-color .1s}.theme-retro .Button--color--default:focus,.theme-retro .Button--color--default:hover{background-color:#f7f6ee;color:#000}.theme-retro .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#be6209;color:#fff}.theme-retro .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-retro .Button--color--caution:focus{transition:color .1s,background-color .1s}.theme-retro .Button--color--caution:focus,.theme-retro .Button--color--caution:hover{background-color:#d67313;color:#fff}.theme-retro .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-retro .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-retro .Button--color--danger:focus{transition:color .1s,background-color .1s}.theme-retro .Button--color--danger:focus,.theme-retro .Button--color--danger:hover{background-color:#afb30a;color:#fff}.theme-retro .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#e8e4c9;color:#000;background-color:rgba(232,228,201,0);color:hsla(0,0%,100%,.5)}.theme-retro .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-retro .Button--color--transparent:focus{transition:color .1s,background-color .1s}.theme-retro .Button--color--transparent:focus,.theme-retro .Button--color--transparent:hover{background-color:#f7f6ee;color:#000}.theme-retro .Button--disabled{background-color:#363636!important}.theme-retro .Button--selected{transition:color 50ms,background-color 50ms;background-color:#9d0808;color:#fff}.theme-retro .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-retro .Button--selected:focus{transition:color .1s,background-color .1s}.theme-retro .Button--selected:focus,.theme-retro .Button--selected:hover{background-color:#b31212;color:#fff}.theme-retro .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 6px;border-radius:0;background-color:rgba(0,0,0,.5);transition:border-color .5s}.theme-retro .ProgressBar__fill{position:absolute;top:0;left:0;bottom:0}.theme-retro .ProgressBar__fill--animated{transition:background-color .5s,width .5s}.theme-retro .ProgressBar__content{position:relative;line-height:17px;width:100%;text-align:right}.theme-retro .ProgressBar--color--default{border:1px solid #000}.theme-retro .ProgressBar--color--default .ProgressBar__fill{background-color:#000}.theme-retro .Section{position:relative;margin-bottom:6px;background-color:#1a1a1a;background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5);box-sizing:border-box}.theme-retro .Section:last-child{margin-bottom:0}.theme-retro .Section__title{position:relative;padding:6px;border-bottom:2px solid #000}.theme-retro .Section__titleText{font-size:14px;font-weight:700}.theme-retro .Section__buttons{position:absolute;display:inline-block;right:6px;margin-top:-1px}.theme-retro .Section__content{padding:8px 6px}.theme-retro .Section--fill{display:flex;flex-direction:column;height:100%}.theme-retro .Section--fill .Section__content{flex-grow:1}.theme-retro .Section--level--1 .Section__titleText{font-size:14px}.theme-retro .Section--level--2 .Section__titleText{font-size:13px}.theme-retro .Section--level--3 .Section__titleText{font-size:12px}.theme-retro .Section--level--2,.theme-retro .Section--level--3{background-color:transparent;box-shadow:none;margin-left:-6px;margin-right:-6px}.theme-retro .Layout,.theme-retro .Layout *{scrollbar-base-color:#c8be7d;scrollbar-face-color:#eae7ce;scrollbar-3dlight-color:#e8e4c9;scrollbar-highlight-color:#e8e4c9;scrollbar-track-color:#c8be7d;scrollbar-arrow-color:#f4f2e4;scrollbar-shadow-color:#eae7ce}.theme-retro .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-retro .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-retro .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#e8e4c9;background-image:linear-gradient(180deg,#e8e4c9 0,#e8e4c9)}.theme-retro .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px}.theme-retro .Window__rest{position:fixed;top:32px;bottom:0;left:0;right:0}.theme-retro .Window__contentPadding{margin:6px;height:calc(100% - 12px)}.theme-retro .Window__contentPadding:after{height:0}.theme-retro .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:6px}.theme-retro .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(251,250,246,.25);pointer-events:none}.theme-retro .Window__toast{position:fixed;bottom:0;left:0;right:0;font-size:12px;height:40px;line-height:39px;padding:0 12px;background-color:#988d41;color:hsla(0,0%,100%,.8)}.theme-retro .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;height:20px;cursor:se-resize}.theme-retro .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;cursor:s-resize}.theme-retro .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;cursor:e-resize}.theme-retro .TitleBar{background-color:#585337;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-retro .TitleBar__clickable{color:hsla(0,0%,100%,.5);background-color:#585337;transition:color .25s,background-color .25s}.theme-retro .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-retro .TitleBar__title{position:absolute;top:0;left:46px;color:hsla(0,0%,100%,.75);font-size:14px;line-height:31px;white-space:nowrap}.theme-retro .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px}.theme-retro .TitleBar__statusIcon{position:absolute;top:0;left:12px;transition:color .5s;font-size:20px;line-height:32px!important}.theme-retro .TitleBar__minimize{position:absolute;top:6px;right:46px}.theme-retro .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;height:32px;font-size:20px;line-height:31px;text-align:center}.theme-retro .TitleBar__devBuildIndicator{position:absolute;top:6px;right:52px;min-width:20px;padding:2px 4px;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-retro .Button{font-family:monospace;color:#161613;border:8px outset #e8e4c9;outline:3px solid #161613}.theme-retro .Layout__content{background-image:none}.theme-syndicate .Button{position:relative;display:inline-block;line-height:20px;padding:0 6px;margin-right:2px;white-space:nowrap;outline:0;border-radius:2px;margin-bottom:2px;user-select:none;-ms-user-select:none}.theme-syndicate .Button:last-child{margin-right:0}.theme-syndicate .Button .fa,.theme-syndicate .Button .far,.theme-syndicate .Button .fas{margin-left:-3px;margin-right:-3px;min-width:16px;text-align:center}.theme-syndicate .Button--hasContent .fa,.theme-syndicate .Button--hasContent .far,.theme-syndicate .Button--hasContent .fas{margin-right:3px}.theme-syndicate .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-syndicate .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-syndicate .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#397439;color:#fff}.theme-syndicate .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-syndicate .Button--color--default:focus{transition:color .1s,background-color .1s}.theme-syndicate .Button--color--default:focus,.theme-syndicate .Button--color--default:hover{background-color:#478647;color:#fff}.theme-syndicate .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#be6209;color:#fff}.theme-syndicate .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-syndicate .Button--color--caution:focus{transition:color .1s,background-color .1s}.theme-syndicate .Button--color--caution:focus,.theme-syndicate .Button--color--caution:hover{background-color:#d67313;color:#fff}.theme-syndicate .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-syndicate .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-syndicate .Button--color--danger:focus{transition:color .1s,background-color .1s}.theme-syndicate .Button--color--danger:focus,.theme-syndicate .Button--color--danger:hover{background-color:#afb30a;color:#fff}.theme-syndicate .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#550202;color:#fff;background-color:rgba(85,2,2,0);color:hsla(0,0%,100%,.5)}.theme-syndicate .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-syndicate .Button--color--transparent:focus{transition:color .1s,background-color .1s}.theme-syndicate .Button--color--transparent:focus,.theme-syndicate .Button--color--transparent:hover{background-color:#650c0c;color:#fff}.theme-syndicate .Button--disabled{background-color:#363636!important}.theme-syndicate .Button--selected{transition:color 50ms,background-color 50ms;background-color:#9d0808;color:#fff}.theme-syndicate .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-syndicate .Button--selected:focus{transition:color .1s,background-color .1s}.theme-syndicate .Button--selected:focus,.theme-syndicate .Button--selected:hover{background-color:#b31212;color:#fff}.theme-syndicate .NoticeBox{padding:4px 6px;margin-bottom:6px;box-shadow:none;font-weight:700;font-style:italic;color:#fff;background-color:#910101;background-image:repeating-linear-gradient(-45deg,transparent,transparent 10px,rgba(0,0,0,.1) 0,rgba(0,0,0,.1) 20px)}.theme-syndicate .NoticeBox--type--info{color:#fff;background-color:#235982}.theme-syndicate .NoticeBox--type--success{color:#fff;background-color:#1e662f}.theme-syndicate .NoticeBox--type--warning{color:#fff;background-color:#a95219}.theme-syndicate .NoticeBox--type--danger{color:#fff;background-color:#8f2828}.theme-syndicate .Input{position:relative;display:inline-block;width:120px;border:1px solid #87ce87;border:1px solid rgba(135,206,135,.75);border-radius:2px;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 4px;margin-right:2px;line-height:17px;overflow:visible}.theme-syndicate .Input--fluid{display:block;width:auto}.theme-syndicate .Input__baseline{display:inline-block;color:transparent}.theme-syndicate .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:12px;line-height:17px;height:17px;margin:0;padding:0 6px;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.theme-syndicate .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:hsla(0,0%,100%,.45)}.theme-syndicate .NumberInput{position:relative;display:inline-block;border:1px solid #87ce87;border:1px solid rgba(135,206,135,.75);border-radius:2px;color:#87ce87;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 4px;margin-right:2px;line-height:17px;text-align:right;overflow:visible;cursor:n-resize}.theme-syndicate .NumberInput--fluid{display:block}.theme-syndicate .NumberInput__content{margin-left:6px}.theme-syndicate .NumberInput__barContainer{position:absolute;top:2px;bottom:2px;left:2px}.theme-syndicate .NumberInput__bar{position:absolute;bottom:0;left:0;width:3px;box-sizing:border-box;border-bottom:1px solid #87ce87;background-color:#87ce87}.theme-syndicate .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:12px;line-height:17px;height:17px;margin:0;padding:0 6px;font-family:Verdana,sans-serif;background-color:#000;color:#fff;text-align:right}.theme-syndicate .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 6px;border-radius:2px;background-color:rgba(0,0,0,.5);transition:border-color .5s}.theme-syndicate .ProgressBar__fill{position:absolute;top:0;left:0;bottom:0}.theme-syndicate .ProgressBar__fill--animated{transition:background-color .5s,width .5s}.theme-syndicate .ProgressBar__content{position:relative;line-height:17px;width:100%;text-align:right}.theme-syndicate .ProgressBar--color--default{border:1px solid #306330}.theme-syndicate .ProgressBar--color--default .ProgressBar__fill{background-color:#306330}.theme-syndicate .Section{position:relative;margin-bottom:6px;background-color:#1a1a1a;background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5);box-sizing:border-box}.theme-syndicate .Section:last-child{margin-bottom:0}.theme-syndicate .Section__title{position:relative;padding:6px;border-bottom:2px solid #397439}.theme-syndicate .Section__titleText{font-size:14px;font-weight:700}.theme-syndicate .Section__buttons{position:absolute;display:inline-block;right:6px;margin-top:-1px}.theme-syndicate .Section__content{padding:8px 6px}.theme-syndicate .Section--fill{display:flex;flex-direction:column;height:100%}.theme-syndicate .Section--fill .Section__content{flex-grow:1}.theme-syndicate .Section--level--1 .Section__titleText{font-size:14px}.theme-syndicate .Section--level--2 .Section__titleText{font-size:13px}.theme-syndicate .Section--level--3 .Section__titleText{font-size:12px}.theme-syndicate .Section--level--2,.theme-syndicate .Section--level--3{background-color:transparent;box-shadow:none;margin-left:-6px;margin-right:-6px}.theme-syndicate .Tooltip{position:absolute;top:0;left:0;right:0;bottom:0;font-style:normal;font-weight:400}.theme-syndicate .Tooltip:after{position:absolute;display:block;white-space:nowrap;z-index:2;padding:6px 10px;transform:translateX(-50%);pointer-events:none;visibility:hidden;opacity:0;text-align:left;content:attr(data-tooltip);transition:all .15s;background-color:#4a0202;box-shadow:1px 1px 15px -1px rgba(0,0,0,.5);border-radius:2px}.theme-syndicate .Tooltip:hover:after{transition:all 70ms;pointer-events:none;visibility:visible;opacity:1}.theme-syndicate .Tooltip--long:after{width:250px;white-space:normal}.theme-syndicate .Tooltip--top:after{bottom:100%;left:50%;transform:translateX(-50%) translateY(8px)}.theme-syndicate .Tooltip--bottom:after,.theme-syndicate .Tooltip--top:hover:after{transform:translateX(-50%) translateY(-8px)}.theme-syndicate .Tooltip--bottom:after{top:100%;left:50%}.theme-syndicate .Tooltip--bottom:hover:after{transform:translateX(-50%) translateY(8px)}.theme-syndicate .Tooltip--bottom-left:after{top:100%;right:50%;transform:translateX(12px) translateY(-8px)}.theme-syndicate .Tooltip--bottom-left:hover:after{transform:translateX(12px) translateY(8px)}.theme-syndicate .Tooltip--bottom-right:after{top:100%;left:50%;transform:translateX(-12px) translateY(-8px)}.theme-syndicate .Tooltip--bottom-right:hover:after{transform:translateX(-12px) translateY(8px)}.theme-syndicate .Tooltip--left:after{top:50%;right:100%;transform:translateX(8px) translateY(-50%)}.theme-syndicate .Tooltip--left:hover:after,.theme-syndicate .Tooltip--right:after{transform:translateX(-8px) translateY(-50%)}.theme-syndicate .Tooltip--right:after{top:50%;left:100%}.theme-syndicate .Tooltip--right:hover:after{transform:translateX(8px) translateY(-50%)}.theme-syndicate .Layout,.theme-syndicate .Layout *{scrollbar-base-color:#400202;scrollbar-face-color:#7e0303;scrollbar-3dlight-color:#550202;scrollbar-highlight-color:#550202;scrollbar-track-color:#400202;scrollbar-arrow-color:#fa3030;scrollbar-shadow-color:#7e0303}.theme-syndicate .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-syndicate .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-syndicate .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#550202;background-image:linear-gradient(180deg,#730303 0,#370101)}.theme-syndicate .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px}.theme-syndicate .Window__rest{position:fixed;top:32px;bottom:0;left:0;right:0}.theme-syndicate .Window__contentPadding{margin:6px;height:calc(100% - 12px)}.theme-syndicate .Window__contentPadding:after{height:0}.theme-syndicate .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:6px}.theme-syndicate .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(117,22,22,.25);pointer-events:none}.theme-syndicate .Window__toast{position:fixed;bottom:0;left:0;right:0;font-size:12px;height:40px;line-height:39px;padding:0 12px;background-color:#2b0101;color:hsla(0,0%,100%,.8)}.theme-syndicate .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;height:20px;cursor:se-resize}.theme-syndicate .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;cursor:s-resize}.theme-syndicate .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;cursor:e-resize}.theme-syndicate .TitleBar{background-color:#910101;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-syndicate .TitleBar__clickable{color:hsla(0,0%,100%,.5);background-color:#910101;transition:color .25s,background-color .25s}.theme-syndicate .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-syndicate .TitleBar__title{position:absolute;top:0;left:46px;color:hsla(0,0%,100%,.75);font-size:14px;line-height:31px;white-space:nowrap}.theme-syndicate .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px}.theme-syndicate .TitleBar__statusIcon{position:absolute;top:0;left:12px;transition:color .5s;font-size:20px;line-height:32px!important}.theme-syndicate .TitleBar__minimize{position:absolute;top:6px;right:46px}.theme-syndicate .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;height:32px;font-size:20px;line-height:31px;text-align:center}.theme-syndicate .TitleBar__devBuildIndicator{position:absolute;top:6px;right:52px;min-width:20px;padding:2px 4px;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-syndicate .Layout__content{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMCIgdmlld0JveD0iMCAwIDIwMCAyODkuNzQyIiBvcGFjaXR5PSIuMzMiPjxwYXRoIGQ9Ik05My41MzggMGMtMTguMTEzIDAtMzQuMjIgMy4xMTItNDguMzI0IDkuMzM0LTEzLjk2NSA2LjIyMi0yNC42MTIgMTUuMDcyLTMxLjk0IDI2LjU0N0M2LjA4NCA0Ny4yMiAyLjk3MiA2MC42MzEgMi45NzIgNzYuMTE2YzAgMTAuNjQ3IDIuNzI1IDIwLjQ2NSA4LjE3NSAyOS40NTMgNS42MTYgOC45ODcgMTQuMDM5IDE3LjM1MiAyNS4yNyAyNS4wOTQgMTEuMjMgNy42MDYgMjYuNTA3IDE1LjQxOSA0NS44MyAyMy40MzggMTkuOTg0IDguMjk2IDM0Ljg0OSAxNS41NTUgNDQuNTkzIDIxLjc3NiA5Ljc0NCA2LjIyMyAxNi43NjEgMTIuODU5IDIxLjA1NSAxOS45MSA0LjI5NSA3LjA1MiA2LjQ0MiAxNS43NjQgNi40NDIgMjYuMTM0IDAgMTYuMTc4LTUuMjAyIDI4LjQ4My0xNS42MDYgMzYuOTE3LTEwLjI0IDguNDM1LTI1LjAyMiAxMi42NTMtNDQuMzQ1IDEyLjY1My0xNC4wMzkgMC0yNS41MTYtMS42Ni0zNC40MzQtNC45NzgtOC45MTgtMy40NTctMTYuMTg2LTguNzExLTIxLjgtMTUuNzYzLTUuNjE2LTcuMDUyLTEwLjA3Ni0xNi42NjEtMTMuMzc5LTI4LjgyOUgwdjU2LjgyN2MzMy44NTcgNy4zMjggNjMuNzQ5IDEwLjk5NCA4OS42NzggMTAuOTk0IDE2LjAyIDAgMzAuNzItMS4zODMgNDQuMDk4LTQuMTQ4IDEzLjU0Mi0yLjkwNCAyNS4xMDQtNy40NjcgMzQuNjgzLTEzLjY5IDkuNzQ0LTYuMzU5IDE3LjM0LTE0LjUxOSAyMi43OS0yNC40NzQgNS40NS0xMC4wOTMgOC4xNzUtMjIuNCA4LjE3NS0zNi45MTcgMC0xMi45OTctMy4zMDItMjQuMzM1LTkuOTA4LTM0LjAxNC02LjQ0LTkuODE4LTE1LjUyNS0xOC41MjctMjcuMjUxLTI2LjEzMi0xMS41NjEtNy42MDQtMjcuOTExLTE1LjgzMS00OS4wNTEtMjQuNjgtMTcuNTA2LTcuMTktMzAuNzItMTMuNjktMzkuNjM4LTE5LjQ5N1M1NC45NjkgOTMuNzU2IDQ5LjQ3OSA4Ny4zMTZjLTUuNDI2LTYuMzY2LTkuNjU4LTE1LjA3LTkuNjU4LTI0Ljg4NyAwLTkuMjY0IDIuMDc1LTE3LjIxNCA2LjIyMy0yMy44NUM1Ny4xNDIgMjQuMTggODcuMzMxIDM2Ljc4MiA5MS4xMiA2Mi45MjVjNC44NCA2Ljc3NSA4Ljg1IDE2LjI0NyAxMi4wMyAyOC40MTVoMjAuNTMydi01NmMtNC40NzktNS45MjQtOS45NTUtMTAuNjMxLTE1LjkwOS0xNC4zNzMgMS42NC40NzkgMy4xOSAxLjAyMyA0LjYzOSAxLjY0IDYuNDk4IDIuNjI2IDEyLjE2OCA3LjMyNyAxNy4wMDcgMTQuMTAzIDQuODQgNi43NzUgOC44NSAxNi4yNDYgMTIuMDMgMjguNDE0IDAgMCA4LjQ4LS4xMjkgOC40OS0uMDAyLjQxNyA2LjQxNS0xLjc1NCA5LjQ1My00LjEyNCAxMi41NjEtMi40MTcgMy4xNy01LjE0NSA2Ljc5LTQuMDAzIDEzLjAwMyAxLjUwOCA4LjIwMyAxMC4xODQgMTAuNTk3IDE0LjYyMiA5LjMxMi0zLjMxOC0uNS01LjMxOC0xLjc1LTUuMzE4LTEuNzVzMS44NzYuOTk5IDUuNjUtMS4zNmMtMy4yNzYuOTU2LTEwLjcwNC0uNzk3LTExLjgtNi43NjMtLjk1OC01LjIwOC45NDYtNy4yOTUgMy40LTEwLjUxNCAyLjQ1NS0zLjIyIDUuMjg1LTYuOTU5IDQuNjg1LTE0LjQ4OWwuMDAzLjAwMmg4LjkyN3YtNTZjLTE1LjA3Mi0zLjg3MS0yNy42NTMtNi4zNi0zNy43NDctNy40NjVDMTE0LjI3OS41NTIgMTA0LjA0NiAwIDkzLjUzNyAwem03MC4zMjEgMTcuMzA5bC4yMzggNDAuMzA1YzEuMzE4IDEuMjI2IDIuNDQgMi4yNzggMy4zNDEgMy4xMDYgNC44NCA2Ljc3NSA4Ljg1IDE2LjI0NiAxMi4wMyAyOC40MTRIMjAwdi01NmMtNi42NzctNC41OTQtMTkuODM2LTEwLjQ3My0zNi4xNC0xNS44MjV6bS0yOC4xMiA1LjYwNWw4LjU2NSAxNy43MTdjLTExLjk3LTYuNDY3LTEzLjg0Ny05LjcxNy04LjU2NS0xNy43MTd6bTIyLjc5NyAwYzIuNzcxIDggMS43ODcgMTEuMjUtNC40OTQgMTcuNzE3bDQuNDk0LTE3LjcxN3ptMTUuMjIyIDI0LjAwOWw4LjU2NSAxNy43MTZjLTExLjk3LTYuNDY2LTEzLjg0Ny05LjcxNy04LjU2NS0xNy43MTZ6bTIyLjc5NyAwYzIuNzcxIDggMS43ODcgMTEuMjUtNC40OTQgMTcuNzE2bDQuNDk0LTE3LjcxNnpNOTcuNDQgNDkuMTNsOC41NjUgMTcuNzE2Yy0xMS45Ny02LjQ2Ny0xMy44NDctOS43MTctOC41NjUtMTcuNzE2em0yMi43OTUgMGMyLjc3MiA3Ljk5OSAxLjc4OCAxMS4yNS00LjQ5MyAxNy43MTZsNC40OTMtMTcuNzE2eiIvPjwvc3ZnPg==)} \ No newline at end of file diff --git a/tgui/packages/tgui/public/tgui.bundle.js b/tgui/packages/tgui/public/tgui.bundle.js index d7f0698bd7..dc90502312 100644 --- a/tgui/packages/tgui/public/tgui.bundle.js +++ b/tgui/packages/tgui/public/tgui.bundle.js @@ -1,5 +1,30 @@ -!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=170)}([function(e,t,n){"use strict";var r=n(3),o=n(16).f,i=n(25),a=n(18),c=n(87),u=n(126),s=n(60);e.exports=function(e,t){var n,l,f,d,p,h=e.target,v=e.global,g=e.stat;if(n=v?r:g?r[h]||c(h,{}):(r[h]||{}).prototype)for(l in t){if(d=t[l],f=e.noTargetGet?(p=o(n,l))&&p.value:n[l],!s(v?l:h+(g?".":"#")+l,e.forced)&&f!==undefined){if(typeof d==typeof f)continue;u(d,f)}(e.sham||f&&f.sham)&&i(d,"sham",!0),a(n,l,d,e)}}},function(e,t,n){"use strict";e.exports=function(e){try{return!!e()}catch(t){return!0}}},function(e,t,n){"use strict";t.__esModule=!0;var r=n(385);Object.keys(r).forEach((function(e){"default"!==e&&"__esModule"!==e&&(t[e]=r[e])}))},function(e,t,n){"use strict";(function(t){var n=function(e){return e&&e.Math==Math&&e};e.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof t&&t)||Function("return this")()}).call(this,n(122))},function(e,t,n){"use strict";e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t,n){"use strict";var r=n(1);e.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},function(e,t,n){"use strict";var r=n(4);e.exports=function(e){if(!r(e))throw TypeError(String(e)+" is not an object");return e}},function(e,t,n){"use strict";var r,o=n(101),i=n(5),a=n(3),c=n(4),u=n(14),s=n(71),l=n(25),f=n(18),d=n(11).f,p=n(31),h=n(46),v=n(10),g=n(57),m=a.Int8Array,y=m&&m.prototype,b=a.Uint8ClampedArray,_=b&&b.prototype,w=m&&p(m),x=y&&p(y),E=Object.prototype,C=E.isPrototypeOf,N=v("toStringTag"),S=g("TYPED_ARRAY_TAG"),k=o&&!!h&&"Opera"!==s(a.opera),O=!1,A={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},I=function(e){var t=s(e);return"DataView"===t||u(A,t)},T=function(e){return c(e)&&u(A,s(e))};for(r in A)a[r]||(k=!1);if((!k||"function"!=typeof w||w===Function.prototype)&&(w=function(){throw TypeError("Incorrect invocation")},k))for(r in A)a[r]&&h(a[r],w);if((!k||!x||x===E)&&(x=w.prototype,k))for(r in A)a[r]&&h(a[r].prototype,x);if(k&&p(_)!==x&&h(_,x),i&&!u(x,N))for(r in O=!0,d(x,N,{get:function(){return c(this)?this[S]:undefined}}),A)a[r]&&l(a[r],S,r);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:k,TYPED_ARRAY_TAG:O&&S,aTypedArray:function(e){if(T(e))return e;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(e){if(h){if(C.call(w,e))return e}else for(var t in A)if(u(A,r)){var n=a[t];if(n&&(e===n||C.call(n,e)))return e}throw TypeError("Target is not a typed array constructor")},exportTypedArrayMethod:function(e,t,n){if(i){if(n)for(var r in A){var o=a[r];o&&u(o.prototype,e)&&delete o.prototype[e]}x[e]&&!n||f(x,e,n?t:k&&y[e]||t)}},exportTypedArrayStaticMethod:function(e,t,n){var r,o;if(i){if(h){if(n)for(r in A)(o=a[r])&&u(o,e)&&delete o[e];if(w[e]&&!n)return;try{return f(w,e,n?t:k&&m[e]||t)}catch(c){}}for(r in A)!(o=a[r])||o[e]&&!n||f(o,e,t)}},isView:I,isTypedArray:T,TypedArray:w,TypedArrayPrototype:x}},function(e,t,n){"use strict";var r=n(26),o=Math.min;e.exports=function(e){return e>0?o(r(e),9007199254740991):0}},function(e,t,n){"use strict";t.__esModule=!0,t.isFalsy=t.pureComponentHooks=t.shallowDiffers=t.normalizeChildren=t.classes=void 0;t.classes=function(e){for(var t="",n=0;n0&&(t.style=u),t};t.computeBoxProps=g;var m=function(e){var t=e.textColor||e.color,n=e.backgroundColor;return(0,r.classes)([s(t)&&"color-"+t,s(n)&&"color-bg-"+n])};t.computeBoxClassName=m;var y=function(e){var t=e.as,n=void 0===t?"div":t,r=e.className,a=e.children,c=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(e,["as","className","children"]);if("function"==typeof a)return a(g(e));var u="string"==typeof r?r+" "+m(c):m(c),s=g(c);return(0,o.createVNode)(i.VNodeFlags.HtmlElement,n,u,a,i.ChildFlags.UnknownChildren,s)};t.Box=y,y.defaultHooks=r.pureComponentHooks},function(e,t,n){"use strict";var r={}.hasOwnProperty;e.exports=function(e,t){return r.call(e,t)}},function(e,t,n){"use strict";var r=n(44),o=n(56),i=n(12),a=n(8),c=n(62),u=[].push,s=function(e){var t=1==e,n=2==e,s=3==e,l=4==e,f=6==e,d=5==e||f;return function(p,h,v,g){for(var m,y,b=i(p),_=o(b),w=r(h,v,3),x=a(_.length),E=0,C=g||c,N=t?C(p,x):n?C(p,0):undefined;x>E;E++)if((d||E in _)&&(y=w(m=_[E],E,b),e))if(t)N[E]=y;else if(y)switch(e){case 3:return!0;case 5:return m;case 6:return E;case 2:u.call(N,m)}else if(l)return!1;return f?-1:s||l?l:N}};e.exports={forEach:s(0),map:s(1),filter:s(2),some:s(3),every:s(4),find:s(5),findIndex:s(6)}},function(e,t,n){"use strict";var r=n(5),o=n(68),i=n(42),a=n(21),c=n(29),u=n(14),s=n(123),l=Object.getOwnPropertyDescriptor;t.f=r?l:function(e,t){if(e=a(e),t=c(t,!0),s)try{return l(e,t)}catch(n){}if(u(e,t))return i(!o.f.call(e,t),e[t])}},function(e,t,n){"use strict";e.exports=function(e){if(e==undefined)throw TypeError("Can't call method on "+e);return e}},function(e,t,n){"use strict";var r=n(3),o=n(25),i=n(14),a=n(87),c=n(88),u=n(30),s=u.get,l=u.enforce,f=String(String).split("String");(e.exports=function(e,t,n,c){var u=!!c&&!!c.unsafe,s=!!c&&!!c.enumerable,d=!!c&&!!c.noTargetGet;"function"==typeof n&&("string"!=typeof t||i(n,"name")||o(n,"name",t),l(n).source=f.join("string"==typeof t?t:"")),e!==r?(u?!d&&e[t]&&(s=!0):delete e[t],s?e[t]=n:o(e,t,n)):s?e[t]=n:a(t,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&s(this).source||c(this)}))},function(e,t,n){"use strict";var r=n(5),o=n(1),i=n(14),a=Object.defineProperty,c={},u=function(e){throw e};e.exports=function(e,t){if(i(c,e))return c[e];t||(t={});var n=[][e],s=!!i(t,"ACCESSORS")&&t.ACCESSORS,l=i(t,0)?t[0]:u,f=i(t,1)?t[1]:undefined;return c[e]=!!n&&!o((function(){if(s&&!r)return!0;var e={length:-1};s?a(e,1,{enumerable:!0,get:u}):e[1]=1,n.call(e,l,f)}))}},function(e,t,n){"use strict";function r(e,t,n,r,o,i,a){try{var c=e[i](a),u=c.value}catch(s){return void n(s)}c.done?t(u):Promise.resolve(u).then(r,o)}t.__esModule=!0,t.winset=t.winget=t.runCommand=t.callByondAsync=t.callByond=t.IS_IE8=void 0;var o=window.Byond,i=function(){var e=navigator.userAgent.match(/Trident\/(\d+).+?;/i);if(!e)return null;var t=e[1];return t?parseInt(t,10):null}(),a=null!==i&&i<=6;t.IS_IE8=a;var c=function(e,t){void 0===t&&(t={}),o.call(e,t)};t.callByond=c;var u=function(e,t){void 0===t&&(t={}),window.__callbacks__=window.__callbacks__||[];var n=window.__callbacks__.length,r=new Promise((function(e){window.__callbacks__.push(e)}));return o.call(e,Object.assign({},t,{callback:"__callbacks__["+n+"]"})),r};t.callByondAsync=u;t.runCommand=function(e){return c("winset",{command:e})};var s=function(){var e,t=(e=regeneratorRuntime.mark((function n(e,t){var r;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,u("winget",{id:e,property:t});case 2:return r=n.sent,n.abrupt("return",r[t]);case 4:case"end":return n.stop()}}),n)})),function(){var t=this,n=arguments;return new Promise((function(o,i){var a=e.apply(t,n);function c(e){r(a,o,i,c,u,"next",e)}function u(e){r(a,o,i,c,u,"throw",e)}c(undefined)}))});return function(e,n){return t.apply(this,arguments)}}();t.winget=s;t.winset=function(e,t,n){var r;return c("winset",((r={})[e+"."+t]=n,r))}},function(e,t,n){"use strict";var r=n(56),o=n(17);e.exports=function(e){return r(o(e))}},function(e,t,n){"use strict";var r=n(127),o=n(14),i=n(133),a=n(11).f;e.exports=function(e){var t=r.Symbol||(r.Symbol={});o(t,e)||a(t,e,{value:i.f(e)})}},function(e,t,n){"use strict";var r=n(17),o=/"/g;e.exports=function(e,t,n,i){var a=String(r(e)),c="<"+t;return""!==n&&(c+=" "+n+'="'+String(i).replace(o,""")+'"'),c+">"+a+""}},function(e,t,n){"use strict";var r=n(1);e.exports=function(e){return r((function(){var t=""[e]('"');return t!==t.toLowerCase()||t.split('"').length>3}))}},function(e,t,n){"use strict";var r=n(5),o=n(11),i=n(42);e.exports=r?function(e,t,n){return o.f(e,t,i(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){"use strict";var r=Math.ceil,o=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?o:r)(e)}},function(e,t,n){"use strict";e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},function(e,t,n){"use strict";var r={}.toString;e.exports=function(e){return r.call(e).slice(8,-1)}},function(e,t,n){"use strict";var r=n(4);e.exports=function(e,t){if(!r(e))return e;var n,o;if(t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;if("function"==typeof(n=e.valueOf)&&!r(o=n.call(e)))return o;if(!t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;throw TypeError("Can't convert object to primitive value")}},function(e,t,n){"use strict";var r,o,i,a=n(125),c=n(3),u=n(4),s=n(25),l=n(14),f=n(69),d=n(58),p=c.WeakMap;if(a){var h=new p,v=h.get,g=h.has,m=h.set;r=function(e,t){return m.call(h,e,t),t},o=function(e){return v.call(h,e)||{}},i=function(e){return g.call(h,e)}}else{var y=f("state");d[y]=!0,r=function(e,t){return s(e,y,t),t},o=function(e){return l(e,y)?e[y]:{}},i=function(e){return l(e,y)}}e.exports={set:r,get:o,has:i,enforce:function(e){return i(e)?o(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!u(t)||(n=o(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}}},function(e,t,n){"use strict";var r=n(14),o=n(12),i=n(69),a=n(100),c=i("IE_PROTO"),u=Object.prototype;e.exports=a?Object.getPrototypeOf:function(e){return e=o(e),r(e,c)?e[c]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?u:null}},function(e,t,n){"use strict";var r=n(127),o=n(3),i=function(e){return"function"==typeof e?e:undefined};e.exports=function(e,t){return arguments.length<2?i(r[e])||i(o[e]):r[e]&&r[e][t]||o[e]&&o[e][t]}},function(e,t,n){"use strict";e.exports=!1},function(e,t,n){"use strict";var r=n(1);e.exports=function(e,t){var n=[][e];return!!n&&r((function(){n.call(null,t||function(){throw 1},1)}))}},function(e,t,n){"use strict";var r=n(0),o=n(3),i=n(5),a=n(113),c=n(7),u=n(74),s=n(51),l=n(42),f=n(25),d=n(8),p=n(141),h=n(156),v=n(29),g=n(14),m=n(71),y=n(4),b=n(37),_=n(46),w=n(43).f,x=n(157),E=n(15).forEach,C=n(50),N=n(11),S=n(16),k=n(30),O=n(76),A=k.get,I=k.set,T=N.f,M=S.f,V=Math.round,L=o.RangeError,P=u.ArrayBuffer,j=u.DataView,B=c.NATIVE_ARRAY_BUFFER_VIEWS,R=c.TYPED_ARRAY_TAG,F=c.TypedArray,D=c.TypedArrayPrototype,K=c.aTypedArrayConstructor,z=c.isTypedArray,U=function(e,t){for(var n=0,r=t.length,o=new(K(e))(r);r>n;)o[n]=t[n++];return o},Y=function(e,t){T(e,t,{get:function(){return A(this)[t]}})},H=function(e){var t;return e instanceof P||"ArrayBuffer"==(t=m(e))||"SharedArrayBuffer"==t},W=function(e,t){return z(e)&&"symbol"!=typeof t&&t in e&&String(+t)==String(t)},$=function(e,t){return W(e,t=v(t,!0))?l(2,e[t]):M(e,t)},G=function(e,t,n){return!(W(e,t=v(t,!0))&&y(n)&&g(n,"value"))||g(n,"get")||g(n,"set")||n.configurable||g(n,"writable")&&!n.writable||g(n,"enumerable")&&!n.enumerable?T(e,t,n):(e[t]=n.value,e)};i?(B||(S.f=$,N.f=G,Y(D,"buffer"),Y(D,"byteOffset"),Y(D,"byteLength"),Y(D,"length")),r({target:"Object",stat:!0,forced:!B},{getOwnPropertyDescriptor:$,defineProperty:G}),e.exports=function(e,t,n){var i=e.match(/\d+$/)[0]/8,c=e+(n?"Clamped":"")+"Array",u="get"+e,l="set"+e,v=o[c],g=v,m=g&&g.prototype,N={},S=function(e,t){T(e,t,{get:function(){return function(e,t){var n=A(e);return n.view[u](t*i+n.byteOffset,!0)}(this,t)},set:function(e){return function(e,t,r){var o=A(e);n&&(r=(r=V(r))<0?0:r>255?255:255&r),o.view[l](t*i+o.byteOffset,r,!0)}(this,t,e)},enumerable:!0})};B?a&&(g=t((function(e,t,n,r){return s(e,g,c),O(y(t)?H(t)?r!==undefined?new v(t,h(n,i),r):n!==undefined?new v(t,h(n,i)):new v(t):z(t)?U(g,t):x.call(g,t):new v(p(t)),e,g)})),_&&_(g,F),E(w(v),(function(e){e in g||f(g,e,v[e])})),g.prototype=m):(g=t((function(e,t,n,r){s(e,g,c);var o,a,u,l=0,f=0;if(y(t)){if(!H(t))return z(t)?U(g,t):x.call(g,t);o=t,f=h(n,i);var v=t.byteLength;if(r===undefined){if(v%i)throw L("Wrong length");if((a=v-f)<0)throw L("Wrong length")}else if((a=d(r)*i)+f>v)throw L("Wrong length");u=a/i}else u=p(t),o=new P(a=u*i);for(I(e,{buffer:o,byteOffset:f,byteLength:a,length:u,view:new j(o)});l"+e+"<\/script>"},h=function(){try{r=document.domain&&new ActiveXObject("htmlfile")}catch(o){}var e,t;h=r?function(e){e.write(p("")),e.close();var t=e.parentWindow.Object;return e=null,t}(r):((t=s("iframe")).style.display="none",u.appendChild(t),t.src=String("javascript:"),(e=t.contentWindow.document).open(),e.write(p("document.F=Object")),e.close(),e.F);for(var n=a.length;n--;)delete h.prototype[a[n]];return h()};c[f]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(d.prototype=o(e),n=new d,d.prototype=null,n[f]=e):n=h(),t===undefined?n:i(n,t)}},function(e,t,n){"use strict";var r=n(11).f,o=n(14),i=n(10)("toStringTag");e.exports=function(e,t,n){e&&!o(e=n?e:e.prototype,i)&&r(e,i,{configurable:!0,value:t})}},function(e,t,n){"use strict";var r=n(10),o=n(37),i=n(11),a=r("unscopables"),c=Array.prototype;c[a]==undefined&&i.f(c,a,{configurable:!0,value:o(null)}),e.exports=function(e){c[a][e]=!0}},function(e,t,n){"use strict";var r=n(6),o=n(27),i=n(10)("species");e.exports=function(e,t){var n,a=r(e).constructor;return a===undefined||(n=r(a)[i])==undefined?t:o(n)}},function(e,t,n){"use strict";t.__esModule=!0,t.useSharedState=t.useLocalState=t.useBackend=t.backendReducer=t.backendSetSharedState=t.backendUpdate=void 0;var r=n(84),o=n(20);t.backendUpdate=function(e){return{type:"backend/update",payload:e}};var i=function(e,t){return{type:"backend/setSharedState",payload:{key:e,nextState:t}}};t.backendSetSharedState=i;t.backendReducer=function(e,t){var n=t.type,o=t.payload;if("backend/update"===n){var i=Object.assign({},e.config,{},o.config),a=Object.assign({},e.data,{},o.static_data,{},o.data),c=Object.assign({},e.shared);if(o.shared)for(var u=0,s=Object.keys(o.shared);u2?n-2:0),i=2;i=a){var c=[t].concat(o).map((function(e){return"string"==typeof e?e:e instanceof Error?e.stack||String(e):JSON.stringify(e)})).filter((function(e){return e})).join(" ")+"\nUser Agent: "+navigator.userAgent;(0,r.callByond)("",{src:window.__ref__,action:"tgui:log",log:c})}},l=function(e){return{debug:function(){for(var t=arguments.length,n=new Array(t),r=0;rn?n:e};t.clamp01=function(e){return e<0?0:e>1?1:e};t.scale=function(e,t,n){return(e-t)/(n-t)};t.round=function(e,t){return!e||isNaN(e)?e:(t|=0,i=(e*=n=Math.pow(10,t))>0|-(e<0),o=Math.abs(e%1)>=.4999999999854481,r=Math.floor(e),o&&(e=r+(i>0)),(o?e:Math.round(e))/n);var n,r,o,i};t.toFixed=function(e,t){return void 0===t&&(t=0),Number(e).toFixed(Math.max(t,0))};var r=function(e,t){return t&&e>=t[0]&&e<=t[1]};t.inRange=r;t.keyOfMatchingRange=function(e,t){for(var n=0,o=Object.keys(t);nl;)if((c=u[l++])!=c)return!0}else for(;s>l;l++)if((e||l in u)&&u[l]===n)return e||l||0;return!e&&-1}};e.exports={includes:a(!0),indexOf:a(!1)}},function(e,t,n){"use strict";var r=n(1),o=/#|\.prototype\./,i=function(e,t){var n=c[a(e)];return n==s||n!=u&&("function"==typeof t?r(t):!!t)},a=i.normalize=function(e){return String(e).replace(o,".").toLowerCase()},c=i.data={},u=i.NATIVE="N",s=i.POLYFILL="P";e.exports=i},function(e,t,n){"use strict";var r=n(128),o=n(91);e.exports=Object.keys||function(e){return r(e,o)}},function(e,t,n){"use strict";var r=n(4),o=n(49),i=n(10)("species");e.exports=function(e,t){var n;return o(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!o(n.prototype)?r(n)&&null===(n=n[i])&&(n=undefined):n=undefined),new(n===undefined?Array:n)(0===t?0:t)}},function(e,t,n){"use strict";var r=n(1),o=n(10),i=n(94),a=o("species");e.exports=function(e){return i>=51||!r((function(){var t=[];return(t.constructor={})[a]=function(){return{foo:1}},1!==t[e](Boolean).foo}))}},function(e,t,n){"use strict";e.exports={}},function(e,t,n){"use strict";var r=n(18);e.exports=function(e,t,n){for(var o in t)r(e,o,t[o],n);return e}},function(e,t,n){"use strict";var r=n(1);e.exports=!r((function(){return Object.isExtensible(Object.preventExtensions({}))}))},function(e,t,n){"use strict";var r=n(6),o=n(96),i=n(8),a=n(44),c=n(97),u=n(136),s=function(e,t){this.stopped=e,this.result=t};(e.exports=function(e,t,n,l,f){var d,p,h,v,g,m,y,b=a(t,n,l?2:1);if(f)d=e;else{if("function"!=typeof(p=c(e)))throw TypeError("Target is not iterable");if(o(p)){for(h=0,v=i(e.length);v>h;h++)if((g=l?b(r(y=e[h])[0],y[1]):b(e[h]))&&g instanceof s)return g;return new s(!1)}d=p.call(e)}for(m=d.next;!(y=m.call(d)).done;)if("object"==typeof(g=u(d,b,y.value,l))&&g&&g instanceof s)return g;return new s(!1)}).stop=function(e){return new s(!0,e)}},function(e,t,n){"use strict";var r={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,i=o&&!r.call({1:2},1);t.f=i?function(e){var t=o(this,e);return!!t&&t.enumerable}:r},function(e,t,n){"use strict";var r=n(89),o=n(57),i=r("keys");e.exports=function(e){return i[e]||(i[e]=o(e))}},function(e,t,n){"use strict";var r=n(32);e.exports=r("navigator","userAgent")||""},function(e,t,n){"use strict";var r=n(98),o=n(28),i=n(10)("toStringTag"),a="Arguments"==o(function(){return arguments}());e.exports=r?o:function(e){var t,n,r;return e===undefined?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(n){}}(t=Object(e),i))?n:a?o(t):"Object"==(r=o(t))&&"function"==typeof t.callee?"Arguments":r}},function(e,t,n){"use strict";var r=n(10)("iterator"),o=!1;try{var i=0,a={next:function(){return{done:!!i++}},"return":function(){o=!0}};a[r]=function(){return this},Array.from(a,(function(){throw 2}))}catch(c){}e.exports=function(e,t){if(!t&&!o)return!1;var n=!1;try{var i={};i[r]=function(){return{next:function(){return{done:n=!0}}}},e(i)}catch(c){}return n}},function(e,t,n){"use strict";var r=n(27),o=n(12),i=n(56),a=n(8),c=function(e){return function(t,n,c,u){r(n);var s=o(t),l=i(s),f=a(s.length),d=e?f-1:0,p=e?-1:1;if(c<2)for(;;){if(d in l){u=l[d],d+=p;break}if(d+=p,e?d<0:f<=d)throw TypeError("Reduce of empty array with no initial value")}for(;e?d>=0:f>d;d+=p)d in l&&(u=n(u,l[d],d,s));return u}};e.exports={left:c(!1),right:c(!0)}},function(e,t,n){"use strict";var r=n(3),o=n(5),i=n(101),a=n(25),c=n(65),u=n(1),s=n(51),l=n(26),f=n(8),d=n(141),p=n(217),h=n(31),v=n(46),g=n(43).f,m=n(11).f,y=n(95),b=n(38),_=n(30),w=_.get,x=_.set,E=r.ArrayBuffer,C=E,N=r.DataView,S=N&&N.prototype,k=Object.prototype,O=r.RangeError,A=p.pack,I=p.unpack,T=function(e){return[255&e]},M=function(e){return[255&e,e>>8&255]},V=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},L=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},P=function(e){return A(e,23,4)},j=function(e){return A(e,52,8)},B=function(e,t){m(e.prototype,t,{get:function(){return w(this)[t]}})},R=function(e,t,n,r){var o=d(n),i=w(e);if(o+t>i.byteLength)throw O("Wrong index");var a=w(i.buffer).bytes,c=o+i.byteOffset,u=a.slice(c,c+t);return r?u:u.reverse()},F=function(e,t,n,r,o,i){var a=d(n),c=w(e);if(a+t>c.byteLength)throw O("Wrong index");for(var u=w(c.buffer).bytes,s=a+c.byteOffset,l=r(+o),f=0;fU;)(D=z[U++])in C||a(C,D,E[D]);K.constructor=C}v&&h(S)!==k&&v(S,k);var Y=new N(new C(2)),H=S.setInt8;Y.setInt8(0,2147483648),Y.setInt8(1,2147483649),!Y.getInt8(0)&&Y.getInt8(1)||c(S,{setInt8:function(e,t){H.call(this,e,t<<24>>24)},setUint8:function(e,t){H.call(this,e,t<<24>>24)}},{unsafe:!0})}else C=function(e){s(this,C,"ArrayBuffer");var t=d(e);x(this,{bytes:y.call(new Array(t),0),byteLength:t}),o||(this.byteLength=t)},N=function(e,t,n){s(this,N,"DataView"),s(e,C,"DataView");var r=w(e).byteLength,i=l(t);if(i<0||i>r)throw O("Wrong offset");if(i+(n=n===undefined?r-i:f(n))>r)throw O("Wrong length");x(this,{buffer:e,byteLength:n,byteOffset:i}),o||(this.buffer=e,this.byteLength=n,this.byteOffset=i)},o&&(B(C,"byteLength"),B(N,"buffer"),B(N,"byteLength"),B(N,"byteOffset")),c(N.prototype,{getInt8:function(e){return R(this,1,e)[0]<<24>>24},getUint8:function(e){return R(this,1,e)[0]},getInt16:function(e){var t=R(this,2,e,arguments.length>1?arguments[1]:undefined);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=R(this,2,e,arguments.length>1?arguments[1]:undefined);return t[1]<<8|t[0]},getInt32:function(e){return L(R(this,4,e,arguments.length>1?arguments[1]:undefined))},getUint32:function(e){return L(R(this,4,e,arguments.length>1?arguments[1]:undefined))>>>0},getFloat32:function(e){return I(R(this,4,e,arguments.length>1?arguments[1]:undefined),23)},getFloat64:function(e){return I(R(this,8,e,arguments.length>1?arguments[1]:undefined),52)},setInt8:function(e,t){F(this,1,e,T,t)},setUint8:function(e,t){F(this,1,e,T,t)},setInt16:function(e,t){F(this,2,e,M,t,arguments.length>2?arguments[2]:undefined)},setUint16:function(e,t){F(this,2,e,M,t,arguments.length>2?arguments[2]:undefined)},setInt32:function(e,t){F(this,4,e,V,t,arguments.length>2?arguments[2]:undefined)},setUint32:function(e,t){F(this,4,e,V,t,arguments.length>2?arguments[2]:undefined)},setFloat32:function(e,t){F(this,4,e,P,t,arguments.length>2?arguments[2]:undefined)},setFloat64:function(e,t){F(this,8,e,j,t,arguments.length>2?arguments[2]:undefined)}});b(C,"ArrayBuffer"),b(N,"DataView"),e.exports={ArrayBuffer:C,DataView:N}},function(e,t,n){"use strict";var r=n(0),o=n(3),i=n(60),a=n(18),c=n(47),u=n(67),s=n(51),l=n(4),f=n(1),d=n(72),p=n(38),h=n(76);e.exports=function(e,t,n){var v=-1!==e.indexOf("Map"),g=-1!==e.indexOf("Weak"),m=v?"set":"add",y=o[e],b=y&&y.prototype,_=y,w={},x=function(e){var t=b[e];a(b,e,"add"==e?function(e){return t.call(this,0===e?0:e),this}:"delete"==e?function(e){return!(g&&!l(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return g&&!l(e)?undefined:t.call(this,0===e?0:e)}:"has"==e?function(e){return!(g&&!l(e))&&t.call(this,0===e?0:e)}:function(e,n){return t.call(this,0===e?0:e,n),this})};if(i(e,"function"!=typeof y||!(g||b.forEach&&!f((function(){(new y).entries().next()})))))_=n.getConstructor(t,e,v,m),c.REQUIRED=!0;else if(i(e,!0)){var E=new _,C=E[m](g?{}:-0,1)!=E,N=f((function(){E.has(1)})),S=d((function(e){new y(e)})),k=!g&&f((function(){for(var e=new y,t=5;t--;)e[m](t,t);return!e.has(-0)}));S||((_=t((function(t,n){s(t,_,e);var r=h(new y,t,_);return n!=undefined&&u(n,r[m],r,v),r}))).prototype=b,b.constructor=_),(N||k)&&(x("delete"),x("has"),v&&x("get")),(k||C)&&x(m),g&&b.clear&&delete b.clear}return w[e]=_,r({global:!0,forced:_!=y},w),p(_,e),g||n.setStrong(_,e,v),_}},function(e,t,n){"use strict";var r=n(4),o=n(46);e.exports=function(e,t,n){var i,a;return o&&"function"==typeof(i=t.constructor)&&i!==n&&r(a=i.prototype)&&a!==n.prototype&&o(e,a),e}},function(e,t,n){"use strict";var r=Math.expm1,o=Math.exp;e.exports=!r||r(10)>22025.465794806718||r(10)<22025.465794806718||-2e-17!=r(-2e-17)?function(e){return 0==(e=+e)?e:e>-1e-6&&e<1e-6?e+e*e/2:o(e)-1}:r},function(e,t,n){"use strict";e.exports="\t\n\x0B\f\r \xa0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029\ufeff"},function(e,t,n){"use strict";var r=n(33),o=n(3),i=n(1);e.exports=r||!i((function(){var e=Math.random();__defineSetter__.call(null,e,(function(){})),delete o[e]}))},function(e,t,n){"use strict";var r=n(6);e.exports=function(){var e=r(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}},function(e,t,n){"use strict";var r,o,i=n(80),a=n(107),c=RegExp.prototype.exec,u=String.prototype.replace,s=c,l=(r=/a/,o=/b*/g,c.call(r,"a"),c.call(o,"a"),0!==r.lastIndex||0!==o.lastIndex),f=a.UNSUPPORTED_Y||a.BROKEN_CARET,d=/()??/.exec("")[1]!==undefined;(l||d||f)&&(s=function(e){var t,n,r,o,a=this,s=f&&a.sticky,p=i.call(a),h=a.source,v=0,g=e;return s&&(-1===(p=p.replace("y","")).indexOf("g")&&(p+="g"),g=String(e).slice(a.lastIndex),a.lastIndex>0&&(!a.multiline||a.multiline&&"\n"!==e[a.lastIndex-1])&&(h="(?: "+h+")",g=" "+g,v++),n=new RegExp("^(?:"+h+")",p)),d&&(n=new RegExp("^"+h+"$(?!\\s)",p)),l&&(t=a.lastIndex),r=c.call(s?n:a,g),s?r?(r.input=r.input.slice(v),r[0]=r[0].slice(v),r.index=a.lastIndex,a.lastIndex+=r[0].length):a.lastIndex=0:l&&r&&(a.lastIndex=a.global?r.index+r[0].length:t),d&&r&&r.length>1&&u.call(r[0],n,(function(){for(o=1;o")})),l="$0"==="a".replace(/./,"$0"),f=i("replace"),d=!!/./[f]&&""===/./[f]("a","$0"),p=!o((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]}));e.exports=function(e,t,n,f){var h=i(e),v=!o((function(){var t={};return t[h]=function(){return 7},7!=""[e](t)})),g=v&&!o((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[u]=function(){return n},n.flags="",n[h]=/./[h]),n.exec=function(){return t=!0,null},n[h](""),!t}));if(!v||!g||"replace"===e&&(!s||!l||d)||"split"===e&&!p){var m=/./[h],y=n(h,""[e],(function(e,t,n,r,o){return t.exec===a?v&&!o?{done:!0,value:m.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}}),{REPLACE_KEEPS_$0:l,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:d}),b=y[0],_=y[1];r(String.prototype,e,b),r(RegExp.prototype,h,2==t?function(e,t){return _.call(e,this,t)}:function(e){return _.call(e,this)})}f&&c(RegExp.prototype[h],"sham",!0)}},function(e,t,n){"use strict";var r=n(28),o=n(81);e.exports=function(e,t){var n=e.exec;if("function"==typeof n){var i=n.call(e,t);if("object"!=typeof i)throw TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==r(e))throw TypeError("RegExp#exec called on incompatible receiver");return o.call(e,t)}},function(e,t,n){"use strict";t.__esModule=!0,t.getGasColor=t.getGasLabel=t.RADIO_CHANNELS=t.CSS_COLORS=t.COLORS=t.UI_CLOSE=t.UI_DISABLED=t.UI_UPDATE=t.UI_INTERACTIVE=void 0;t.UI_INTERACTIVE=2;t.UI_UPDATE=1;t.UI_DISABLED=0;t.UI_CLOSE=-1;t.COLORS={department:{captain:"#c06616",security:"#e74c3c",medbay:"#3498db",science:"#9b59b6",engineering:"#f1c40f",cargo:"#f39c12",centcom:"#00c100",other:"#c38312"},damageType:{oxy:"#3498db",toxin:"#2ecc71",burn:"#e67e22",brute:"#e74c3c"}};t.CSS_COLORS=["black","white","red","orange","yellow","olive","green","teal","blue","violet","purple","pink","brown","grey","good","average","bad","label"];t.RADIO_CHANNELS=[{name:"Syndicate",freq:1213,color:"#a52a2a"},{name:"Red Team",freq:1215,color:"#ff4444"},{name:"Blue Team",freq:1217,color:"#3434fd"},{name:"CentCom",freq:1337,color:"#2681a5"},{name:"Supply",freq:1347,color:"#b88646"},{name:"Service",freq:1349,color:"#6ca729"},{name:"Science",freq:1351,color:"#c68cfa"},{name:"Command",freq:1353,color:"#5177ff"},{name:"Medical",freq:1355,color:"#57b8f0"},{name:"Engineering",freq:1357,color:"#f37746"},{name:"Security",freq:1359,color:"#dd3535"},{name:"AI Private",freq:1447,color:"#d65d95"},{name:"Common",freq:1459,color:"#1ecc43"}];var r=[{id:"o2",name:"Oxygen",label:"O\u2082",color:"blue"},{id:"n2",name:"Nitrogen",label:"N\u2082",color:"red"},{id:"co2",name:"Carbon Dioxide",label:"CO\u2082",color:"grey"},{id:"plasma",name:"Plasma",label:"Plasma",color:"pink"},{id:"water_vapor",name:"Water Vapor",label:"H\u2082O",color:"grey"},{id:"nob",name:"Hyper-noblium",label:"Hyper-nob",color:"teal"},{id:"n2o",name:"Nitrous Oxide",label:"N\u2082O",color:"red"},{id:"no2",name:"Nitryl",label:"NO\u2082",color:"brown"},{id:"tritium",name:"Tritium",label:"Tritium",color:"green"},{id:"bz",name:"BZ",label:"BZ",color:"purple"},{id:"stim",name:"Stimulum",label:"Stimulum",color:"purple"},{id:"pluox",name:"Pluoxium",label:"Pluoxium",color:"blue"},{id:"miasma",name:"Miasma",label:"Miasma",color:"olive"},{id:"hydrogen",name:"Hydrogen",label:"H\u2082",color:"white"}];t.getGasLabel=function(e,t){var n=String(e).toLowerCase(),o=r.find((function(e){return e.id===n||e.name.toLowerCase()===n}));return o&&o.label||t||e};t.getGasColor=function(e){var t=String(e).toLowerCase(),n=r.find((function(e){return e.id===t||e.name.toLowerCase()===t}));return n&&n.color}},function(e,t,n){"use strict";t.__esModule=!0,t.zipWith=t.zip=t.uniqBy=t.reduce=t.sortBy=t.map=t.filter=t.toKeyedArray=t.toArray=void 0;t.toArray=function(e){if(Array.isArray(e))return e;if("object"==typeof e){var t=Object.prototype.hasOwnProperty,n=[];for(var r in e)t.call(e,r)&&n.push(e[r]);return n}return[]};t.toKeyedArray=function(e,t){return void 0===t&&(t="key"),r((function(e,n){var r;return Object.assign(((r={})[t]=n,r),e)}))(e)};t.filter=function(e){return function(t){if(null===t&&t===undefined)return t;if(Array.isArray(t)){for(var n=[],r=0;rc)return 1}return 0};t.sortBy=function(){for(var e=arguments.length,t=new Array(e),n=0;n=74)&&(r=a.match(/Chrome\/(\d+)/))&&(o=r[1]),e.exports=o&&+o},function(e,t,n){"use strict";var r=n(12),o=n(36),i=n(8);e.exports=function(e){for(var t=r(this),n=i(t.length),a=arguments.length,c=o(a>1?arguments[1]:undefined,n),u=a>2?arguments[2]:undefined,s=u===undefined?n:o(u,n);s>c;)t[c++]=e;return t}},function(e,t,n){"use strict";var r=n(10),o=n(64),i=r("iterator"),a=Array.prototype;e.exports=function(e){return e!==undefined&&(o.Array===e||a[i]===e)}},function(e,t,n){"use strict";var r=n(71),o=n(64),i=n(10)("iterator");e.exports=function(e){if(e!=undefined)return e[i]||e["@@iterator"]||o[r(e)]}},function(e,t,n){"use strict";var r={};r[n(10)("toStringTag")]="z",e.exports="[object z]"===String(r)},function(e,t,n){"use strict";var r=n(0),o=n(202),i=n(31),a=n(46),c=n(38),u=n(25),s=n(18),l=n(10),f=n(33),d=n(64),p=n(138),h=p.IteratorPrototype,v=p.BUGGY_SAFARI_ITERATORS,g=l("iterator"),m=function(){return this};e.exports=function(e,t,n,l,p,y,b){o(n,t,l);var _,w,x,E=function(e){if(e===p&&O)return O;if(!v&&e in S)return S[e];switch(e){case"keys":case"values":case"entries":return function(){return new n(this,e)}}return function(){return new n(this)}},C=t+" Iterator",N=!1,S=e.prototype,k=S[g]||S["@@iterator"]||p&&S[p],O=!v&&k||E(p),A="Array"==t&&S.entries||k;if(A&&(_=i(A.call(new e)),h!==Object.prototype&&_.next&&(f||i(_)===h||(a?a(_,h):"function"!=typeof _[g]&&u(_,g,m)),c(_,C,!0,!0),f&&(d[C]=m))),"values"==p&&k&&"values"!==k.name&&(N=!0,O=function(){return k.call(this)}),f&&!b||S[g]===O||u(S,g,O),d[t]=O,p)if(w={values:E("values"),keys:y?O:E("keys"),entries:E("entries")},b)for(x in w)(v||N||!(x in S))&&s(S,x,w[x]);else r({target:t,proto:!0,forced:v||N},w);return w}},function(e,t,n){"use strict";var r=n(1);e.exports=!r((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},function(e,t,n){"use strict";e.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},function(e,t,n){"use strict";var r=n(8),o=n(103),i=n(17),a=Math.ceil,c=function(e){return function(t,n,c){var u,s,l=String(i(t)),f=l.length,d=c===undefined?" ":String(c),p=r(n);return p<=f||""==d?l:(u=p-f,(s=o.call(d,a(u/d.length))).length>u&&(s=s.slice(0,u)),e?l+s:s+l)}};e.exports={start:c(!1),end:c(!0)}},function(e,t,n){"use strict";var r=n(26),o=n(17);e.exports="".repeat||function(e){var t=String(o(this)),n="",i=r(e);if(i<0||i==Infinity)throw RangeError("Wrong number of repetitions");for(;i>0;(i>>>=1)&&(t+=t))1&i&&(n+=t);return n}},function(e,t,n){"use strict";e.exports=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1}},function(e,t,n){"use strict";var r,o,i,a=n(3),c=n(1),u=n(28),s=n(44),l=n(131),f=n(86),d=n(150),p=a.location,h=a.setImmediate,v=a.clearImmediate,g=a.process,m=a.MessageChannel,y=a.Dispatch,b=0,_={},w=function(e){if(_.hasOwnProperty(e)){var t=_[e];delete _[e],t()}},x=function(e){return function(){w(e)}},E=function(e){w(e.data)},C=function(e){a.postMessage(e+"",p.protocol+"//"+p.host)};h&&v||(h=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return _[++b]=function(){("function"==typeof e?e:Function(e)).apply(undefined,t)},r(b),b},v=function(e){delete _[e]},"process"==u(g)?r=function(e){g.nextTick(x(e))}:y&&y.now?r=function(e){y.now(x(e))}:m&&!d?(i=(o=new m).port2,o.port1.onmessage=E,r=s(i.postMessage,i,1)):!a.addEventListener||"function"!=typeof postMessage||a.importScripts||c(C)||"file:"===p.protocol?r="onreadystatechange"in f("script")?function(e){l.appendChild(f("script")).onreadystatechange=function(){l.removeChild(this),w(e)}}:function(e){setTimeout(x(e),0)}:(r=C,a.addEventListener("message",E,!1))),e.exports={set:h,clear:v}},function(e,t,n){"use strict";var r=n(4),o=n(28),i=n(10)("match");e.exports=function(e){var t;return r(e)&&((t=e[i])!==undefined?!!t:"RegExp"==o(e))}},function(e,t,n){"use strict";var r=n(1);function o(e,t){return RegExp(e,t)}t.UNSUPPORTED_Y=r((function(){var e=o("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),t.BROKEN_CARET=r((function(){var e=o("^r","gy");return e.lastIndex=2,null!=e.exec("str")}))},function(e,t,n){"use strict";var r=n(26),o=n(17),i=function(e){return function(t,n){var i,a,c=String(o(t)),u=r(n),s=c.length;return u<0||u>=s?e?"":undefined:(i=c.charCodeAt(u))<55296||i>56319||u+1===s||(a=c.charCodeAt(u+1))<56320||a>57343?e?c.charAt(u):i:e?c.slice(u,u+2):a-56320+(i-55296<<10)+65536}};e.exports={codeAt:i(!1),charAt:i(!0)}},function(e,t,n){"use strict";var r=n(106);e.exports=function(e){if(r(e))throw TypeError("The method doesn't accept regular expressions");return e}},function(e,t,n){"use strict";var r=n(10)("match");e.exports=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[r]=!1,"/./"[e](t)}catch(o){}}return!1}},function(e,t,n){"use strict";var r=n(108).charAt;e.exports=function(e,t,n){return t+(n?r(e,t).length:1)}},function(e,t,n){"use strict";var r=n(1),o=n(78);e.exports=function(e){return r((function(){return!!o[e]()||"\u200b\x85\u180e"!="\u200b\x85\u180e"[e]()||o[e].name!==e}))}},function(e,t,n){"use strict";var r=n(3),o=n(1),i=n(72),a=n(7).NATIVE_ARRAY_BUFFER_VIEWS,c=r.ArrayBuffer,u=r.Int8Array;e.exports=!a||!o((function(){u(1)}))||!o((function(){new u(-1)}))||!i((function(e){new u,new u(null),new u(1.5),new u(e)}),!0)||o((function(){return 1!==new u(new c(2),1,undefined).length}))},function(e,t,n){"use strict";function r(e){var t=0;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(e=function(e,t){if(!e)return;if("string"==typeof e)return o(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return o(e,t)}(e)))return function(){return t>=e.length?{done:!0}:{done:!1,value:e[t++]}};throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(t=e[Symbol.iterator]()).next.bind(t)}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n1?o-1:0),c=1;c1?r-1:0),i=1;i=48&&r<=90?String.fromCharCode(r):"["+r+"]"},s=function(e){var t=window.event?e.which:e.keyCode,n=e.ctrlKey,r=e.altKey,o=e.shiftKey;return{keyCode:t,ctrlKey:n,altKey:r,shiftKey:o,hasModifierKeys:n||r||o,keyString:u(n,r,o,t)}},l=function(){for(var e=0,t=Object.keys(c);e=0||(o[n]=e[n]);return o}var h=(0,u.createLogger)("Button"),v=function(e){var t=e.className,n=e.fluid,u=e.icon,d=e.color,v=e.disabled,g=e.selected,m=e.tooltip,y=e.tooltipPosition,b=e.ellipsis,_=e.content,w=e.iconRotation,x=e.iconSpin,E=e.children,C=e.onclick,N=e.onClick,S=p(e,["className","fluid","icon","color","disabled","selected","tooltip","tooltipPosition","ellipsis","content","iconRotation","iconSpin","children","onclick","onClick"]),k=!(!_&&!E);return C&&h.warn("Lowercase 'onclick' is not supported on Button and lowercase prop names are discouraged in general. Please use a camelCase'onClick' instead and read: https://infernojs.org/docs/guides/event-handling"),(0,r.normalizeProps)((0,r.createComponentVNode)(2,s.Box,Object.assign({className:(0,o.classes)(["Button",n&&"Button--fluid",v&&"Button--disabled",g&&"Button--selected",k&&"Button--hasContent",b&&"Button--ellipsis",d&&"string"==typeof d?"Button--color--"+d:"Button--color--default",t]),tabIndex:!v&&"0",unselectable:i.IS_IE8,onclick:function(e){(0,c.refocusLayout)(),!v&&N&&N(e)},onKeyDown:function(e){var t=window.event?e.which:e.keyCode;return t===a.KEY_SPACE||t===a.KEY_ENTER?(e.preventDefault(),void(!v&&N&&N(e))):t===a.KEY_ESCAPE?(e.preventDefault(),void(0,c.refocusLayout)()):void 0}},S,{children:[u&&(0,r.createComponentVNode)(2,l.Icon,{name:u,rotation:w,spin:x}),_,E,m&&(0,r.createComponentVNode)(2,f.Tooltip,{content:m,position:y})]})))};t.Button=v,v.defaultHooks=o.pureComponentHooks;var g=function(e){var t=e.checked,n=p(e,["checked"]);return(0,r.normalizeProps)((0,r.createComponentVNode)(2,v,Object.assign({color:"transparent",icon:t?"check-square-o":"square-o",selected:t},n)))};t.ButtonCheckbox=g,v.Checkbox=g;var m=function(e){function t(){var t;return(t=e.call(this)||this).state={clickedOnce:!1},t.handleClick=function(){t.state.clickedOnce&&t.setClickedOnce(!1)},t}d(t,e);var n=t.prototype;return n.setClickedOnce=function(e){var t=this;this.setState({clickedOnce:e}),e?setTimeout((function(){return window.addEventListener("click",t.handleClick)})):window.removeEventListener("click",this.handleClick)},n.render=function(){var e=this,t=this.props,n=t.confirmContent,o=void 0===n?"Confirm?":n,i=t.confirmColor,a=void 0===i?"bad":i,c=t.confirmIcon,u=t.icon,s=t.color,l=t.content,f=t.onClick,d=p(t,["confirmContent","confirmColor","confirmIcon","icon","color","content","onClick"]);return(0,r.normalizeProps)((0,r.createComponentVNode)(2,v,Object.assign({content:this.state.clickedOnce?o:l,icon:this.state.clickedOnce?c:u,color:this.state.clickedOnce?a:s,onClick:function(){return e.state.clickedOnce?f():e.setClickedOnce(!0)}},d)))},t}(r.Component);t.ButtonConfirm=m,v.Confirm=m;var y=function(e){function t(){var t;return(t=e.call(this)||this).inputRef=(0,r.createRef)(),t.state={inInput:!1},t}d(t,e);var n=t.prototype;return n.setInInput=function(e){if(this.setState({inInput:e}),this.inputRef){var t=this.inputRef.current;if(e){t.value=this.props.currentValue||"";try{t.focus(),t.select()}catch(n){}}}},n.commitResult=function(e){if(this.inputRef){var t=this.inputRef.current;if(""!==t.value)return void this.props.onCommit(e,t.value);if(!this.props.defaultValue)return;this.props.onCommit(e,this.props.defaultValue)}},n.render=function(){var e=this,t=this.props,n=t.fluid,i=t.content,c=t.icon,u=t.iconRotation,d=t.iconSpin,h=t.tooltip,v=t.tooltipPosition,g=t.color,m=void 0===g?"default":g,y=(t.placeholder,t.maxLength,p(t,["fluid","content","icon","iconRotation","iconSpin","tooltip","tooltipPosition","color","placeholder","maxLength"]));return(0,r.normalizeProps)((0,r.createComponentVNode)(2,s.Box,Object.assign({className:(0,o.classes)(["Button",n&&"Button--fluid","Button--color--"+m])},y,{onClick:function(){return e.setInInput(!0)},children:[c&&(0,r.createComponentVNode)(2,l.Icon,{name:c,rotation:u,spin:d}),(0,r.createVNode)(1,"div",null,i,0),(0,r.createVNode)(64,"input","NumberInput__input",null,1,{style:{display:this.state.inInput?undefined:"none","text-align":"left"},onBlur:function(t){e.state.inInput&&(e.setInInput(!1),e.commitResult(t))},onKeyDown:function(t){if(t.keyCode===a.KEY_ENTER)return e.setInInput(!1),void e.commitResult(t);t.keyCode===a.KEY_ESCAPE&&e.setInInput(!1)}},null,this.inputRef),h&&(0,r.createComponentVNode)(2,f.Tooltip,{content:h,position:v})]})))},t}(r.Component);t.ButtonInput=y,v.Input=y},function(e,t,n){"use strict";t.__esModule=!0,t.Icon=void 0;var r=n(2),o=n(9),i=n(13);var a=/-o$/,c=function(e){var t=e.name,n=e.size,c=e.spin,u=e.className,s=e.style,l=void 0===s?{}:s,f=e.rotation,d=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(e,["name","size","spin","className","style","rotation"]);n&&(l["font-size"]=100*n+"%"),"number"==typeof f&&(l.transform="rotate("+f+"deg)");var p=a.test(t),h=t.replace(a,"");return(0,r.normalizeProps)((0,r.createComponentVNode)(2,i.Box,Object.assign({as:"i",className:(0,o.classes)([u,p?"far":"fas","fa-"+h,c&&"fa-spin"]),style:l},d)))};t.Icon=c,c.defaultHooks=o.pureComponentHooks},function(e,t,n){"use strict";t.__esModule=!0,t.TableCell=t.TableRow=t.Table=void 0;var r=n(2),o=n(9),i=n(13);function a(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}var c=function(e){var t=e.className,n=e.collapsing,c=e.children,u=a(e,["className","collapsing","children"]);return(0,r.normalizeProps)((0,r.createVNode)(1,"table",(0,o.classes)(["Table",n&&"Table--collapsing",t,(0,i.computeBoxClassName)(u)]),(0,r.createVNode)(1,"tbody",null,c,0),2,Object.assign({},(0,i.computeBoxProps)(u))))};t.Table=c,c.defaultHooks=o.pureComponentHooks;var u=function(e){var t=e.className,n=e.header,c=a(e,["className","header"]);return(0,r.normalizeProps)((0,r.createVNode)(1,"tr",(0,o.classes)(["Table__row",n&&"Table__row--header",t,(0,i.computeBoxClassName)(e)]),null,1,Object.assign({},(0,i.computeBoxProps)(c))))};t.TableRow=u,u.defaultHooks=o.pureComponentHooks;var s=function(e){var t=e.className,n=e.collapsing,c=e.header,u=a(e,["className","collapsing","header"]);return(0,r.normalizeProps)((0,r.createVNode)(1,"td",(0,o.classes)(["Table__cell",n&&"Table__cell--collapsing",c&&"Table__cell--header",t,(0,i.computeBoxClassName)(e)]),null,1,Object.assign({},(0,i.computeBoxProps)(u))))};t.TableCell=s,s.defaultHooks=o.pureComponentHooks,c.Row=u,c.Cell=s},function(e,t,n){"use strict";t.__esModule=!0,t.NumberInput=void 0;var r=n(2),o=n(55),i=n(9),a=n(20),c=n(117),u=n(13);var s=function(e){var t,n;function s(t){var n;n=e.call(this,t)||this;var i=t.value;return n.inputRef=(0,r.createRef)(),n.state={value:i,dragging:!1,editing:!1,internalValue:null,origin:null,suppressingFlicker:!1},n.flickerTimer=null,n.suppressFlicker=function(){var e=n.props.suppressFlicker;e>0&&(n.setState({suppressingFlicker:!0}),clearTimeout(n.flickerTimer),n.flickerTimer=setTimeout((function(){return n.setState({suppressingFlicker:!1})}),e))},n.handleDragStart=function(e){var t=n.props.value;n.state.editing||(document.body.style["pointer-events"]="none",n.ref=e.target,n.setState({dragging:!1,origin:e.screenY,value:t,internalValue:t}),n.timer=setTimeout((function(){n.setState({dragging:!0})}),250),n.dragInterval=setInterval((function(){var t=n.state,r=t.dragging,o=t.value,i=n.props.onDrag;r&&i&&i(e,o)}),500),document.addEventListener("mousemove",n.handleDragMove),document.addEventListener("mouseup",n.handleDragEnd))},n.handleDragMove=function(e){var t=n.props,r=t.minValue,i=t.maxValue,a=t.step,c=t.stepPixelSize;n.setState((function(t){var n=Object.assign({},t),u=n.origin-e.screenY;if(t.dragging){var s=Number.isFinite(r)?r%a:0;n.internalValue=(0,o.clamp)(n.internalValue+u*a/c,r-a,i+a),n.value=(0,o.clamp)(n.internalValue-n.internalValue%a+s,r,i),n.origin=e.screenY}else Math.abs(u)>4&&(n.dragging=!0);return n}))},n.handleDragEnd=function(e){var t=n.props,r=t.onChange,o=t.onDrag,i=n.state,a=i.dragging,c=i.value,u=i.internalValue;if(document.body.style["pointer-events"]="auto",clearTimeout(n.timer),clearInterval(n.dragInterval),n.setState({dragging:!1,editing:!a,origin:null}),document.removeEventListener("mousemove",n.handleDragMove),document.removeEventListener("mouseup",n.handleDragEnd),a)n.suppressFlicker(),r&&r(e,c),o&&o(e,c);else if(n.inputRef){var s=n.inputRef.current;s.value=u;try{s.focus(),s.select()}catch(l){}}},n}return n=e,(t=s).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n,s.prototype.render=function(){var e=this,t=this.state,n=t.dragging,s=t.editing,l=t.value,f=t.suppressingFlicker,d=this.props,p=d.className,h=d.fluid,v=d.animated,g=d.value,m=d.unit,y=d.minValue,b=d.maxValue,_=d.height,w=d.width,x=d.lineHeight,E=d.fontSize,C=d.format,N=d.onChange,S=d.onDrag,k=g;(n||f)&&(k=l);var O=function(e){return(0,r.createVNode)(1,"div","NumberInput__content",e+(m?" "+m:""),0,{unselectable:a.IS_IE8})},A=v&&!n&&!f&&(0,r.createComponentVNode)(2,c.AnimatedNumber,{value:k,format:C,children:O})||O(C?C(k):k);return(0,r.createComponentVNode)(2,u.Box,{className:(0,i.classes)(["NumberInput",h&&"NumberInput--fluid",p]),minWidth:w,minHeight:_,lineHeight:x,fontSize:E,onMouseDown:this.handleDragStart,children:[(0,r.createVNode)(1,"div","NumberInput__barContainer",(0,r.createVNode)(1,"div","NumberInput__bar",null,1,{style:{height:(0,o.clamp)((k-y)/(b-y)*100,0,100)+"%"}}),2),A,(0,r.createVNode)(64,"input","NumberInput__input",null,1,{style:{display:s?undefined:"none",height:_,"line-height":x,"font-size":E},onBlur:function(t){if(s){var n=(0,o.clamp)(t.target.value,y,b);e.setState({editing:!1,value:n}),e.suppressFlicker(),N&&N(t,n),S&&S(t,n)}},onKeyDown:function(t){if(13===t.keyCode){var n=(0,o.clamp)(t.target.value,y,b);return e.setState({editing:!1,value:n}),e.suppressFlicker(),N&&N(t,n),void(S&&S(t,n))}27!==t.keyCode||e.setState({editing:!1})}},null,this.inputRef)]})},s}(r.Component);t.NumberInput=s,s.defaultHooks=i.pureComponentHooks,s.defaultProps={minValue:-Infinity,maxValue:+Infinity,step:1,stepPixelSize:1,suppressFlicker:50}},function(e,t,n){"use strict";var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(o){"object"==typeof window&&(r=window)}e.exports=r},function(e,t,n){"use strict";var r=n(5),o=n(1),i=n(86);e.exports=!r&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},function(e,t,n){"use strict";var r=n(3),o=n(87),i=r["__core-js_shared__"]||o("__core-js_shared__",{});e.exports=i},function(e,t,n){"use strict";var r=n(3),o=n(88),i=r.WeakMap;e.exports="function"==typeof i&&/native code/.test(o(i))},function(e,t,n){"use strict";var r=n(14),o=n(90),i=n(16),a=n(11);e.exports=function(e,t){for(var n=o(t),c=a.f,u=i.f,s=0;su;)r(c,n=t[u++])&&(~i(s,n)||s.push(n));return s}},function(e,t,n){"use strict";var r=n(93);e.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},function(e,t,n){"use strict";var r=n(5),o=n(11),i=n(6),a=n(61);e.exports=r?Object.defineProperties:function(e,t){i(e);for(var n,r=a(t),c=r.length,u=0;c>u;)o.f(e,n=r[u++],t[n]);return e}},function(e,t,n){"use strict";var r=n(32);e.exports=r("document","documentElement")},function(e,t,n){"use strict";var r=n(21),o=n(43).f,i={}.toString,a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return a&&"[object Window]"==i.call(e)?function(e){try{return o(e)}catch(t){return a.slice()}}(e):o(r(e))}},function(e,t,n){"use strict";var r=n(10);t.f=r},function(e,t,n){"use strict";var r=n(12),o=n(36),i=n(8),a=Math.min;e.exports=[].copyWithin||function(e,t){var n=r(this),c=i(n.length),u=o(e,c),s=o(t,c),l=arguments.length>2?arguments[2]:undefined,f=a((l===undefined?c:o(l,c))-s,c-u),d=1;for(s0;)s in n?n[u]=n[s]:delete n[u],u+=d,s+=d;return n}},function(e,t,n){"use strict";var r=n(49),o=n(8),i=n(44);e.exports=function a(e,t,n,c,u,s,l,f){for(var d,p=u,h=0,v=!!l&&i(l,f,3);h0&&r(d))p=a(e,t,d,o(d.length),p,s-1)-1;else{if(p>=9007199254740991)throw TypeError("Exceed the acceptable array length");e[p]=d}p++}h++}return p}},function(e,t,n){"use strict";var r=n(6);e.exports=function(e,t,n,o){try{return o?t(r(n)[0],n[1]):t(n)}catch(a){var i=e["return"];throw i!==undefined&&r(i.call(e)),a}}},function(e,t,n){"use strict";var r=n(21),o=n(39),i=n(64),a=n(30),c=n(99),u=a.set,s=a.getterFor("Array Iterator");e.exports=c(Array,"Array",(function(e,t){u(this,{type:"Array Iterator",target:r(e),index:0,kind:t})}),(function(){var e=s(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=undefined,{value:undefined,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}}),"values"),i.Arguments=i.Array,o("keys"),o("values"),o("entries")},function(e,t,n){"use strict";var r,o,i,a=n(31),c=n(25),u=n(14),s=n(10),l=n(33),f=s("iterator"),d=!1;[].keys&&("next"in(i=[].keys())?(o=a(a(i)))!==Object.prototype&&(r=o):d=!0),r==undefined&&(r={}),l||u(r,f)||c(r,f,(function(){return this})),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:d}},function(e,t,n){"use strict";var r=n(4);e.exports=function(e){if(!r(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},function(e,t,n){"use strict";var r=n(21),o=n(26),i=n(8),a=n(34),c=n(19),u=Math.min,s=[].lastIndexOf,l=!!s&&1/[1].lastIndexOf(1,-0)<0,f=a("lastIndexOf"),d=c("indexOf",{ACCESSORS:!0,1:0}),p=l||!f||!d;e.exports=p?function(e){if(l)return s.apply(this,arguments)||0;var t=r(this),n=i(t.length),a=n-1;for(arguments.length>1&&(a=u(a,o(arguments[1]))),a<0&&(a=n+a);a>=0;a--)if(a in t&&t[a]===e)return a||0;return-1}:s},function(e,t,n){"use strict";var r=n(26),o=n(8);e.exports=function(e){if(e===undefined)return 0;var t=r(e),n=o(t);if(t!==n)throw RangeError("Wrong length or index");return n}},function(e,t,n){"use strict";var r=n(27),o=n(4),i=[].slice,a={},c=function(e,t,n){if(!(t in a)){for(var r=[],o=0;o1?arguments[1]:undefined,3);t=t?t.next:n.first;)for(r(t.value,t.key,this);t&&t.removed;)t=t.previous},has:function(e){return!!m(this,e)}}),i(l.prototype,n?{get:function(e){var t=m(this,e);return t&&t.value},set:function(e,t){return g(this,0===e?0:e,t)}}:{add:function(e){return g(this,e=0===e?0:e,e)}}),f&&r(l.prototype,"size",{get:function(){return p(this).size}}),l},setStrong:function(e,t,n){var r=t+" Iterator",o=v(t),i=v(r);s(e,t,(function(e,t){h(this,{type:r,target:e,state:o(e),kind:t,last:undefined})}),(function(){for(var e=i(this),t=e.kind,n=e.last;n&&n.removed;)n=n.previous;return e.target&&(e.last=n=n?n.next:e.state.first)?"keys"==t?{value:n.key,done:!1}:"values"==t?{value:n.value,done:!1}:{value:[n.key,n.value],done:!1}:(e.target=undefined,{value:undefined,done:!0})}),n?"entries":"values",!n,!0),l(t)}}},function(e,t,n){"use strict";var r=Math.log;e.exports=Math.log1p||function(e){return(e=+e)>-1e-8&&e<1e-8?e-e*e/2:r(1+e)}},function(e,t,n){"use strict";var r=n(4),o=Math.floor;e.exports=function(e){return!r(e)&&isFinite(e)&&o(e)===e}},function(e,t,n){"use strict";var r=n(3),o=n(52).trim,i=n(78),a=r.parseInt,c=/^[+-]?0[Xx]/,u=8!==a(i+"08")||22!==a(i+"0x16");e.exports=u?function(e,t){var n=o(String(e));return a(n,t>>>0||(c.test(n)?16:10))}:a},function(e,t,n){"use strict";var r=n(5),o=n(61),i=n(21),a=n(68).f,c=function(e){return function(t){for(var n,c=i(t),u=o(c),s=u.length,l=0,f=[];s>l;)n=u[l++],r&&!a.call(c,n)||f.push(e?[n,c[n]]:c[n]);return f}};e.exports={entries:c(!0),values:c(!1)}},function(e,t,n){"use strict";e.exports=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}},function(e,t,n){"use strict";var r=n(3);e.exports=r.Promise},function(e,t,n){"use strict";var r=n(70);e.exports=/(iphone|ipod|ipad).*applewebkit/i.test(r)},function(e,t,n){"use strict";var r,o,i,a,c,u,s,l,f=n(3),d=n(16).f,p=n(28),h=n(105).set,v=n(150),g=f.MutationObserver||f.WebKitMutationObserver,m=f.process,y=f.Promise,b="process"==p(m),_=d(f,"queueMicrotask"),w=_&&_.value;w||(r=function(){var e,t;for(b&&(e=m.domain)&&e.exit();o;){t=o.fn,o=o.next;try{t()}catch(n){throw o?a():i=undefined,n}}i=undefined,e&&e.enter()},b?a=function(){m.nextTick(r)}:g&&!v?(c=!0,u=document.createTextNode(""),new g(r).observe(u,{characterData:!0}),a=function(){u.data=c=!c}):y&&y.resolve?(s=y.resolve(undefined),l=s.then,a=function(){l.call(s,r)}):a=function(){h.call(f,r)}),e.exports=w||function(e){var t={fn:e,next:undefined};i&&(i.next=t),o||(o=t,a()),i=t}},function(e,t,n){"use strict";var r=n(6),o=n(4),i=n(153);e.exports=function(e,t){if(r(e),o(t)&&t.constructor===e)return t;var n=i.f(e);return(0,n.resolve)(t),n.promise}},function(e,t,n){"use strict";var r=n(27),o=function(e){var t,n;this.promise=new e((function(e,r){if(t!==undefined||n!==undefined)throw TypeError("Bad Promise constructor");t=e,n=r})),this.resolve=r(t),this.reject=r(n)};e.exports.f=function(e){return new o(e)}},function(e,t,n){"use strict";var r=n(0),o=n(81);r({target:"RegExp",proto:!0,forced:/./.exec!==o},{exec:o})},function(e,t,n){"use strict";var r=n(70);e.exports=/Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(r)},function(e,t,n){"use strict";var r=n(346);e.exports=function(e,t){var n=r(e);if(n%t)throw RangeError("Wrong offset");return n}},function(e,t,n){"use strict";var r=n(12),o=n(8),i=n(97),a=n(96),c=n(44),u=n(7).aTypedArrayConstructor;e.exports=function(e){var t,n,s,l,f,d,p=r(e),h=arguments.length,v=h>1?arguments[1]:undefined,g=v!==undefined,m=i(p);if(m!=undefined&&!a(m))for(d=(f=m.call(p)).next,p=[];!(l=d.call(f)).done;)p.push(l.value);for(g&&h>2&&(v=c(v,arguments[2],2)),n=o(p.length),s=new(u(this))(n),t=0;n>t;t++)s[t]=g?v(p[t],t):p[t];return s}},function(e,t,n){"use strict";var r=n(65),o=n(47).getWeakData,i=n(6),a=n(4),c=n(51),u=n(67),s=n(15),l=n(14),f=n(30),d=f.set,p=f.getterFor,h=s.find,v=s.findIndex,g=0,m=function(e){return e.frozen||(e.frozen=new y)},y=function(){this.entries=[]},b=function(e,t){return h(e.entries,(function(e){return e[0]===t}))};y.prototype={get:function(e){var t=b(this,e);if(t)return t[1]},has:function(e){return!!b(this,e)},set:function(e,t){var n=b(this,e);n?n[1]=t:this.entries.push([e,t])},"delete":function(e){var t=v(this.entries,(function(t){return t[0]===e}));return~t&&this.entries.splice(t,1),!!~t}},e.exports={getConstructor:function(e,t,n,s){var f=e((function(e,r){c(e,f,t),d(e,{type:t,id:g++,frozen:undefined}),r!=undefined&&u(r,e[s],e,n)})),h=p(t),v=function(e,t,n){var r=h(e),a=o(i(t),!0);return!0===a?m(r).set(t,n):a[r.id]=n,e};return r(f.prototype,{"delete":function(e){var t=h(this);if(!a(e))return!1;var n=o(e);return!0===n?m(t)["delete"](e):n&&l(n,t.id)&&delete n[t.id]},has:function(e){var t=h(this);if(!a(e))return!1;var n=o(e);return!0===n?m(t).has(e):n&&l(n,t.id)}}),r(f.prototype,n?{get:function(e){var t=h(this);if(a(e)){var n=o(e);return!0===n?m(t).get(e):n?n[t.id]:undefined}},set:function(e,t){return v(this,e,t)}}:{add:function(e){return v(this,e,!0)}}),f}}},function(e,t,n){"use strict";t.__esModule=!0,t.setupHotReloading=t.sendLogEntry=void 0;t.sendLogEntry=function(e,t){};t.setupHotReloading=function(){0}},function(e,t,n){"use strict";t.__esModule=!0,t.resizeStartHandler=t.dragStartHandler=t.setupDrag=void 0;var r=n(400),o=n(20);function i(e,t,n,r,o,i,a){try{var c=e[i](a),u=c.value}catch(s){return void n(s)}c.done?t(u):Promise.resolve(u).then(r,o)}var a,c,u,s,l,f=(0,n(53).createLogger)("drag"),d=!1,p=!1,h=[0,0],v=function(e){return(0,o.winget)(e,"pos").then((function(e){return[e.x,e.y]}))},g=function(e,t){return(0,o.winset)(e,"pos",t[0]+","+t[1])},m=function(){var e,t=(e=regeneratorRuntime.mark((function n(e){var t,r,o,i;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return f.log("setting up"),a=e.config.window,n.next=4,v(a);case 4:t=n.sent,h=[t[0]-window.screenLeft,t[1]-window.screenTop],r=y(t),o=r[0],i=r[1],o&&g(a,i),f.debug("current state",{ref:a,screenOffset:h});case 9:case"end":return n.stop()}}),n)})),function(){var t=this,n=arguments;return new Promise((function(r,o){var a=e.apply(t,n);function c(e){i(a,r,o,c,u,"next",e)}function u(e){i(a,r,o,c,u,"throw",e)}c(undefined)}))});return function(e){return t.apply(this,arguments)}}();t.setupDrag=m;var y=function(e){var t=e[0],n=e[1],r=!1;return t<0?(t=0,r=!0):t+window.innerWidth>window.screen.availWidth&&(t=window.screen.availWidth-window.innerWidth,r=!0),n<0?(n=0,r=!0):n+window.innerHeight>window.screen.availHeight&&(n=window.screen.availHeight-window.innerHeight,r=!0),[r,[t,n]]};t.dragStartHandler=function(e){f.log("drag start"),d=!0,c=[window.screenLeft-e.screenX,window.screenTop-e.screenY],document.addEventListener("mousemove",_),document.addEventListener("mouseup",b),_(e)};var b=function E(e){f.log("drag end"),_(e),document.removeEventListener("mousemove",_),document.removeEventListener("mouseup",E),d=!1},_=function(e){d&&(e.preventDefault(),g(a,(0,r.vecAdd)([e.screenX,e.screenY],h,c)))};t.resizeStartHandler=function(e,t){return function(n){u=[e,t],f.log("resize start",u),p=!0,c=[window.screenLeft-n.screenX,window.screenTop-n.screenY],s=[window.innerWidth,window.innerHeight],document.addEventListener("mousemove",x),document.addEventListener("mouseup",w),x(n)}};var w=function C(e){f.log("resize end",l),x(e),document.removeEventListener("mousemove",x),document.removeEventListener("mouseup",C),p=!1},x=function(e){p&&(e.preventDefault(),(l=(0,r.vecAdd)(s,(0,r.vecMultiply)(u,(0,r.vecAdd)([e.screenX,e.screenY],(0,r.vecInverse)([window.screenLeft,window.screenTop]),c,[1,1]))))[0]=Math.max(l[0],250),l[1]=Math.max(l[1],120),function(e,t){(0,o.winset)(e,"size",t[0]+","+t[1])}(a,l))}},function(e,t,n){"use strict";t.__esModule=!0,t.Tooltip=void 0;var r=n(2),o=n(9);t.Tooltip=function(e){var t=e.content,n=e.position,i=void 0===n?"bottom":n,a="string"==typeof t&&t.length>35;return(0,r.createVNode)(1,"div",(0,o.classes)(["Tooltip",a&&"Tooltip--long",i&&"Tooltip--"+i]),null,1,{"data-tooltip":t})}},function(e,t,n){"use strict";t.__esModule=!0,t.Dimmer=void 0;var r=n(2),o=n(9),i=n(13);t.Dimmer=function(e){var t=e.className,n=e.children,a=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(e,["className","children"]);return(0,r.normalizeProps)((0,r.createComponentVNode)(2,i.Box,Object.assign({className:(0,o.classes)(["Dimmer"].concat(t))},a,{children:(0,r.createVNode)(1,"div","Dimmer__inner",n,0)})))}},function(e,t,n){"use strict";t.__esModule=!0,t.Divider=void 0;var r=n(2),o=n(9);t.Divider=function(e){var t=e.vertical,n=e.hidden;return(0,r.createVNode)(1,"div",(0,o.classes)(["Divider",n&&"Divider--hidden",t?"Divider--vertical":"Divider--horizontal"]))}},function(e,t,n){"use strict";t.__esModule=!0,t.FlexItem=t.computeFlexItemProps=t.Flex=t.computeFlexProps=void 0;var r=n(2),o=n(9),i=n(20),a=n(13);function c(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}var u=function(e){var t=e.className,n=e.direction,r=e.wrap,a=e.align,u=e.justify,s=e.inline,l=e.spacing,f=void 0===l?0:l,d=c(e,["className","direction","wrap","align","justify","inline","spacing"]);return Object.assign({className:(0,o.classes)(["Flex",i.IS_IE8&&("column"===n?"Flex--ie8--column":"Flex--ie8"),s&&"Flex--inline",f>0&&"Flex--spacing--"+f,t]),style:Object.assign({},d.style,{"flex-direction":n,"flex-wrap":r,"align-items":a,"justify-content":u})},d)};t.computeFlexProps=u;var s=function(e){return(0,r.normalizeProps)((0,r.createComponentVNode)(2,a.Box,Object.assign({},u(e))))};t.Flex=s,s.defaultHooks=o.pureComponentHooks;var l=function(e){var t=e.className,n=e.grow,r=e.order,u=e.shrink,s=e.basis,l=void 0===s?e.width:s,f=e.align,d=c(e,["className","grow","order","shrink","basis","align"]);return Object.assign({className:(0,o.classes)(["Flex__item",i.IS_IE8&&"Flex__item--ie8",t]),style:Object.assign({},d.style,{"flex-grow":n,"flex-shrink":u,"flex-basis":(0,a.unit)(l),order:r,"align-self":f})},d)};t.computeFlexItemProps=l;var f=function(e){return(0,r.normalizeProps)((0,r.createComponentVNode)(2,a.Box,Object.assign({},l(e))))};t.FlexItem=f,f.defaultHooks=o.pureComponentHooks,s.Item=f},function(e,t,n){"use strict";t.__esModule=!0,t.DraggableControl=void 0;var r=n(2),o=n(55),i=n(9),a=n(117);var c=function(e,t){return e.screenX*t[0]+e.screenY*t[1]},u=function(e){var t,n;function i(t){var n;return(n=e.call(this,t)||this).inputRef=(0,r.createRef)(),n.state={value:t.value,dragging:!1,editing:!1,internalValue:null,origin:null,suppressingFlicker:!1},n.flickerTimer=null,n.suppressFlicker=function(){var e=n.props.suppressFlicker;e>0&&(n.setState({suppressingFlicker:!0}),clearTimeout(n.flickerTimer),n.flickerTimer=setTimeout((function(){return n.setState({suppressingFlicker:!1})}),e))},n.handleDragStart=function(e){var t=n.props,r=t.value,o=t.dragMatrix;n.state.editing||(document.body.style["pointer-events"]="none",n.ref=e.target,n.setState({dragging:!1,origin:c(e,o),value:r,internalValue:r}),n.timer=setTimeout((function(){n.setState({dragging:!0})}),250),n.dragInterval=setInterval((function(){var t=n.state,r=t.dragging,o=t.value,i=n.props.onDrag;r&&i&&i(e,o)}),500),document.addEventListener("mousemove",n.handleDragMove),document.addEventListener("mouseup",n.handleDragEnd))},n.handleDragMove=function(e){var t=n.props,r=t.minValue,i=t.maxValue,a=t.step,u=t.stepPixelSize,s=t.dragMatrix;n.setState((function(t){var n=Object.assign({},t),l=c(e,s)-n.origin;if(t.dragging){var f=Number.isFinite(r)?r%a:0;n.internalValue=(0,o.clamp)(n.internalValue+l*a/u,r-a,i+a),n.value=(0,o.clamp)(n.internalValue-n.internalValue%a+f,r,i),n.origin=c(e,s)}else Math.abs(l)>4&&(n.dragging=!0);return n}))},n.handleDragEnd=function(e){var t=n.props,r=t.onChange,o=t.onDrag,i=n.state,a=i.dragging,c=i.value,u=i.internalValue;if(document.body.style["pointer-events"]="auto",clearTimeout(n.timer),clearInterval(n.dragInterval),n.setState({dragging:!1,editing:!a,origin:null}),document.removeEventListener("mousemove",n.handleDragMove),document.removeEventListener("mouseup",n.handleDragEnd),a)n.suppressFlicker(),r&&r(e,c),o&&o(e,c);else if(n.inputRef){var s=n.inputRef.current;s.value=u;try{s.focus(),s.select()}catch(l){}}},n}return n=e,(t=i).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n,i.prototype.render=function(){var e=this,t=this.state,n=t.dragging,i=t.editing,c=t.value,u=t.suppressingFlicker,s=this.props,l=s.animated,f=s.value,d=s.unit,p=s.minValue,h=s.maxValue,v=s.format,g=s.onChange,m=s.onDrag,y=s.children,b=s.height,_=s.lineHeight,w=s.fontSize,x=f;(n||u)&&(x=c);var E=function(e){return e+(d?" "+d:"")},C=l&&!n&&!u&&(0,r.createComponentVNode)(2,a.AnimatedNumber,{value:x,format:v,children:E})||E(v?v(x):x),N=(0,r.createVNode)(64,"input","NumberInput__input",null,1,{style:{display:i?undefined:"none",height:b,"line-height":_,"font-size":w},onBlur:function(t){if(i){var n=(0,o.clamp)(t.target.value,p,h);e.setState({editing:!1,value:n}),e.suppressFlicker(),g&&g(t,n),m&&m(t,n)}},onKeyDown:function(t){if(13===t.keyCode){var n=(0,o.clamp)(t.target.value,p,h);return e.setState({editing:!1,value:n}),e.suppressFlicker(),g&&g(t,n),void(m&&m(t,n))}27!==t.keyCode||e.setState({editing:!1})}},null,this.inputRef);return y({dragging:n,editing:i,value:f,displayValue:x,displayElement:C,inputElement:N,handleDragStart:this.handleDragStart})},i}(r.Component);t.DraggableControl=u,u.defaultHooks=i.pureComponentHooks,u.defaultProps={minValue:-Infinity,maxValue:+Infinity,step:1,stepPixelSize:1,suppressFlicker:50,dragMatrix:[1,0]}},function(e,t,n){"use strict";t.__esModule=!0,t.Window=void 0;var r=n(2),o=n(9),i=n(167),a=n(41),c=n(20),u=n(54),s=n(84),l=n(160),f=n(115),d=n(53),p=n(116);var h=(0,d.createLogger)("Window"),v=function(e){var t,n;function u(){return e.apply(this,arguments)||this}n=e,(t=u).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var d=u.prototype;return d.componentDidMount=function(){(0,p.refocusLayout)()},d.render=function(){var e=this.props,t=e.resizable,n=e.theme,u=e.children,d=(0,a.useBackend)(this.context),v=d.config,g=d.debugLayout,y=v.observer?v.status=e.length?{done:!0}:{done:!1,value:e[t++]}};throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(t=e[Symbol.iterator]()).next.bind(t)}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n",apos:"'"};return e.replace(/
/gi,"\n").replace(/<\/?[a-z0-9-_]+[^>]*>/gi,"").replace(/&(nbsp|amp|quot|lt|gt|apos);/g,(function(e,n){return t[n]})).replace(/&#?([0-9]+);/gi,(function(e,t){var n=parseInt(t,10);return String.fromCharCode(n)})).replace(/&#x?([0-9a-f]+);/gi,(function(e,t){var n=parseInt(t,16);return String.fromCharCode(n)}))};t.buildQueryString=function(e){return Object.keys(e).map((function(t){return encodeURIComponent(t)+"="+encodeURIComponent(e[t])})).join("&")}},function(e,t,n){"use strict";t.__esModule=!0,t.CameraConsoleSearch=t.CameraConsoleContent=t.CameraConsole=void 0;var r=n(2),o=n(85),i=n(114),a=n(9),c=n(167),u=n(41),s=n(54),l=n(48),f=function(e,t,n){void 0===t&&(t=""),void 0===n&&(n="");var r=(0,c.createSearch)(t,(function(e){return e.name}));return(0,i.flow)([(0,o.filter)((function(e){return null==e?void 0:e.name})),t&&(0,o.filter)(r),n&&(0,o.filter)((function(e){return e.networks.includes(n)})),(0,o.sortBy)((function(e){return e.name}))])(e)};t.CameraConsole=function(e,t){return(0,r.createComponentVNode)(2,l.Window,{resizable:!0,children:(0,r.createComponentVNode)(2,d)})};var d=function(e,t){var n=(0,u.useBackend)(t),o=n.act,i=n.data,a=n.config,c=i.mapRef,d=i.activeCamera,h=function(e,t){var n,r;if(!t)return[];var o=e.findIndex((function(e){return e.name===t.name}));return[null==(n=e[o-1])?void 0:n.name,null==(r=e[o+1])?void 0:r.name]}(f(i.cameras),d),v=h[0],g=h[1];return(0,r.createFragment)([(0,r.createVNode)(1,"div","CameraConsole__left",(0,r.createComponentVNode)(2,l.Window.Content,{scrollable:!0,children:(0,r.createComponentVNode)(2,p)}),2),(0,r.createVNode)(1,"div","CameraConsole__right",[(0,r.createVNode)(1,"div","CameraConsole__toolbar",[(0,r.createVNode)(1,"b",null,"Camera: ",16),d&&d.name||"\u2014"],0),(0,r.createVNode)(1,"div","CameraConsole__toolbarRight",[(0,r.createComponentVNode)(2,s.Button,{icon:"chevron-left",disabled:!v,onClick:function(){return o("switch_camera",{name:v})}}),(0,r.createComponentVNode)(2,s.Button,{icon:"chevron-right",disabled:!g,onClick:function(){return o("switch_camera",{name:g})}})],4),(0,r.createComponentVNode)(2,s.ByondUi,{className:"CameraConsole__map",params:{id:c,parent:a.window,type:"map"}})],4)],4)};t.CameraConsoleContent=d;var p=function(e,t){var n=(0,u.useBackend)(t),o=n.act,i=n.data,c=(0,u.useLocalState)(t,"searchText",""),d=c[0],p=c[1],h=(0,u.useLocalState)(t,"networkFilter",""),v=h[0],g=h[1],m=i.activeCamera,y=i.allNetworks;y.sort();var b=f(i.cameras,d,v);return(0,r.createFragment)([(0,r.createComponentVNode)(2,s.Input,{fluid:!0,mb:1,placeholder:"Search for a camera",onInput:function(e,t){return p(t)}}),(0,r.createComponentVNode)(2,s.Dropdown,{mb:1,width:"189px",options:y,placeholder:"No Filter",onSelected:function(e){return g(e)}}),(0,r.createComponentVNode)(2,s.Section,{children:b.map((function(e){return(0,r.createVNode)(1,"div",(0,a.classes)(["Button","Button--fluid","Button--color--transparent","Button--ellipsis",m&&e.name===m.name&&"Button--selected"]),e.name,0,{title:e.name,onClick:function(){(0,l.refocusLayout)(),o("switch_camera",{name:e.name})}},e.name)}))})],4)};t.CameraConsoleSearch=p},function(e,t,n){"use strict";t.__esModule=!0,t.CrewMonitorContent=t.CrewMonitor=void 0;var r=n(2),o=n(85),i=n(41),a=n(48),c=n(54),u=n(120);n(84);t.CrewMonitor=function(){return(0,r.createComponentVNode)(2,a.Window,{resizable:!0,children:(0,r.createComponentVNode)(2,a.Window.Content,{children:(0,r.createComponentVNode)(2,s)})})};var s=function(e,t){var n,a=(0,i.useBackend)(t),s=a.act,l=a.data,f=a.config,d=(0,i.useLocalState)(t,"tabIndex",0),p=d[0],h=d[1],v=(0,o.sortBy)((function(e){return e.name}))(l.crewmembers||[]),g=(0,i.useLocalState)(t,"number",1),m=g[0],y=g[1];return n=0===p?(0,r.createComponentVNode)(2,c.Table,{children:[(0,r.createComponentVNode)(2,c.Table.Row,{header:!0,children:[(0,r.createComponentVNode)(2,c.Table.Cell,{children:"Name"}),(0,r.createComponentVNode)(2,c.Table.Cell,{children:"Status"}),(0,r.createComponentVNode)(2,c.Table.Cell,{children:"Location"})]}),v.map((function(e){return(0,r.createComponentVNode)(2,c.Table.Row,{children:[(0,r.createComponentVNode)(2,u.TableCell,{children:[e.name," (",e.assignment,")"]}),(0,r.createComponentVNode)(2,u.TableCell,{children:[(0,r.createComponentVNode)(2,c.Box,{inline:!0,color:e.dead?"red":"green",children:e.dead?"Deceased":"Living"}),e.sensor_type>=2?(0,r.createComponentVNode)(2,c.Box,{inline:!0,children:["(",(0,r.createComponentVNode)(2,c.Box,{inline:!0,color:"red",children:e.brute}),"|",(0,r.createComponentVNode)(2,c.Box,{inline:!0,color:"orange",children:e.fire}),"|",(0,r.createComponentVNode)(2,c.Box,{inline:!0,color:"green",children:e.tox}),"|",(0,r.createComponentVNode)(2,c.Box,{inline:!0,color:"blue",children:e.oxy}),")"]}):null]}),(0,r.createComponentVNode)(2,u.TableCell,{children:3===e.sensor_type?l.isAI?(0,r.createComponentVNode)(2,c.Button,{fluid:!0,icon:"location-arrow",content:e.area+" ("+e.x+", "+e.y+")",onClick:function(){return s("track",{track:e.ref})}}):e.area+" ("+e.x+", "+e.y+", "+e.z+")":"Not Available"})]},e.name)}))]}):1===p?(0,r.createComponentVNode)(2,c.Box,{textAlign:"center",children:["Zoom Level:",(0,r.createComponentVNode)(2,c.NumberInput,{animated:!0,width:"40px",step:.5,stepPixelSize:"5",value:m,minValue:1,maxValue:8,onChange:function(e,t){return y(t)}}),"Z-Level:",l.map_levels.sort((function(e,t){return Number(e)-Number(t)})).map((function(e){return(0,r.createComponentVNode)(2,c.Button,{selected:~~e==~~f.mapZLevel,content:e,onClick:function(){s("tgui:setZLevel",{mapZLevel:e})}},e)})),(0,r.createComponentVNode)(2,c.NanoMap,{zoom:m,children:v.filter((function(e){return 3===e.sensor_type&&~~e.realZ==~~f.mapZLevel})).map((function(e){return(0,r.createComponentVNode)(2,c.NanoMap.Marker,{x:e.x,y:e.y,zoom:m,icon:"circle",tooltip:e.name,color:e.dead?"red":"green"},e.ref)}))})]}):"ERROR",(0,r.createFragment)([(0,r.createComponentVNode)(2,c.Tabs,{children:[(0,r.createComponentVNode)(2,c.Tabs.Tab,{selected:0===p,onClick:function(){return h(0)},children:[(0,r.createComponentVNode)(2,c.Icon,{name:"table"})," Data View"]},"DataView"),(0,r.createComponentVNode)(2,c.Tabs.Tab,{selected:1===p,onClick:function(){return h(1)},children:[(0,r.createComponentVNode)(2,c.Icon,{name:"map-marked-alt"})," Map View"]},"MapView")]}),(0,r.createComponentVNode)(2,c.Box,{m:2,children:n})],4)};t.CrewMonitorContent=s},function(e,t,n){e.exports=n(171)},function(e,t,n){"use strict";n(172),n(173),n(174),n(175),n(176),n(177),n(178),n(179),n(180),n(181),n(182),n(183),n(184),n(185),n(186),n(187),n(188),n(189),n(190),n(191),n(192),n(193),n(194),n(195),n(197),n(199),n(200),n(201),n(137),n(203),n(204),n(205),n(206),n(207),n(208),n(209),n(210),n(211),n(212),n(213),n(214),n(215),n(216),n(218),n(219),n(220),n(221),n(222),n(224),n(225),n(227),n(228),n(229),n(230),n(231),n(232),n(233),n(234),n(235),n(236),n(237),n(238),n(239),n(240),n(242),n(243),n(244),n(245),n(246),n(247),n(248),n(249),n(250),n(251),n(252),n(253),n(254),n(256),n(257),n(258),n(259),n(260),n(261),n(263),n(264),n(266),n(268),n(269),n(270),n(271),n(272),n(273),n(274),n(275),n(276),n(277),n(278),n(279),n(280),n(281),n(282),n(283),n(284),n(285),n(286),n(287),n(288),n(289),n(290),n(292),n(293),n(294),n(297),n(298),n(299),n(300),n(301),n(302),n(303),n(304),n(305),n(306),n(307),n(308),n(309),n(310),n(311),n(154),n(312),n(313),n(314),n(315),n(316),n(317),n(318),n(319),n(320),n(321),n(322),n(323),n(324),n(325),n(326),n(327),n(328),n(329),n(330),n(331),n(332),n(333),n(334),n(335),n(336),n(337),n(338),n(339),n(340),n(341),n(342),n(343),n(344),n(345),n(347),n(348),n(349),n(350),n(351),n(352),n(353),n(354),n(355),n(356),n(357),n(358),n(359),n(360),n(361),n(362),n(363),n(364),n(365),n(366),n(367),n(368),n(369),n(370),n(371),n(372),n(373),n(374),n(375),n(376),n(377),n(378),n(379),n(380),n(381),n(382),n(383),n(384);var r=n(2);n(386),n(387),n(388),n(389),n(390),n(391),n(392),n(393),n(394),n(395),n(396),n(397),n(398);var o,i=n(399),a=(n(159),n(41)),c=n(20),u=n(160),s=n(53),l=n(401),f=(Date.now(),(0,l.createStore)()),d=!0,p=function(){for(f.subscribe((function(){!function(){try{var e=f.getState();d&&(s.logger.log("initial render",e),(0,u.setupDrag)(e));var t=(0,n(403).getRoutedComponent)(e),i=(0,r.createComponentVNode)(2,l.StoreProvider,{store:f,children:(0,r.createComponentVNode)(2,t)});o||(o=document.getElementById("react-root")),(0,r.render)(i,o)}catch(a){throw s.logger.error("rendering error",a),a}d&&(d=!1)}()})),window.update=function(e){var t="string"==typeof e?function(e){var t=function(e,t){return"object"==typeof t&&null!==t&&t.__number__?parseFloat(t.__number__):t};c.IS_IE8&&(t=undefined);try{return JSON.parse(e,t)}catch(r){s.logger.log(r),s.logger.log("What we got:",e);var n=r&&r.message;throw new Error("JSON parsing error: "+n)}}(e):e;f.dispatch((0,a.backendUpdate)(t))};;){var e=window.__updateQueue__.shift();if(!e)break;window.update(e)}(0,i.loadCSS)("font-awesome.css")};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",p):p()},function(e,t,n){"use strict";var r=n(0),o=n(3),i=n(32),a=n(33),c=n(5),u=n(93),s=n(129),l=n(1),f=n(14),d=n(49),p=n(4),h=n(6),v=n(12),g=n(21),m=n(29),y=n(42),b=n(37),_=n(61),w=n(43),x=n(132),E=n(92),C=n(16),N=n(11),S=n(68),k=n(25),O=n(18),A=n(89),I=n(69),T=n(58),M=n(57),V=n(10),L=n(133),P=n(22),j=n(38),B=n(30),R=n(15).forEach,F=I("hidden"),D=V("toPrimitive"),K=B.set,z=B.getterFor("Symbol"),U=Object.prototype,Y=o.Symbol,H=i("JSON","stringify"),W=C.f,$=N.f,G=x.f,q=S.f,X=A("symbols"),Q=A("op-symbols"),J=A("string-to-symbol-registry"),Z=A("symbol-to-string-registry"),ee=A("wks"),te=o.QObject,ne=!te||!te.prototype||!te.prototype.findChild,re=c&&l((function(){return 7!=b($({},"a",{get:function(){return $(this,"a",{value:7}).a}})).a}))?function(e,t,n){var r=W(U,t);r&&delete U[t],$(e,t,n),r&&e!==U&&$(U,t,r)}:$,oe=function(e,t){var n=X[e]=b(Y.prototype);return K(n,{type:"Symbol",tag:e,description:t}),c||(n.description=t),n},ie=s?function(e){return"symbol"==typeof e}:function(e){return Object(e)instanceof Y},ae=function(e,t,n){e===U&&ae(Q,t,n),h(e);var r=m(t,!0);return h(n),f(X,r)?(n.enumerable?(f(e,F)&&e[F][r]&&(e[F][r]=!1),n=b(n,{enumerable:y(0,!1)})):(f(e,F)||$(e,F,y(1,{})),e[F][r]=!0),re(e,r,n)):$(e,r,n)},ce=function(e,t){h(e);var n=g(t),r=_(n).concat(de(n));return R(r,(function(t){c&&!se.call(n,t)||ae(e,t,n[t])})),e},ue=function(e,t){return t===undefined?b(e):ce(b(e),t)},se=function(e){var t=m(e,!0),n=q.call(this,t);return!(this===U&&f(X,t)&&!f(Q,t))&&(!(n||!f(this,t)||!f(X,t)||f(this,F)&&this[F][t])||n)},le=function(e,t){var n=g(e),r=m(t,!0);if(n!==U||!f(X,r)||f(Q,r)){var o=W(n,r);return!o||!f(X,r)||f(n,F)&&n[F][r]||(o.enumerable=!0),o}},fe=function(e){var t=G(g(e)),n=[];return R(t,(function(e){f(X,e)||f(T,e)||n.push(e)})),n},de=function(e){var t=e===U,n=G(t?Q:g(e)),r=[];return R(n,(function(e){!f(X,e)||t&&!f(U,e)||r.push(X[e])})),r};(u||(O((Y=function(){if(this instanceof Y)throw TypeError("Symbol is not a constructor");var e=arguments.length&&arguments[0]!==undefined?String(arguments[0]):undefined,t=M(e),n=function r(e){this===U&&r.call(Q,e),f(this,F)&&f(this[F],t)&&(this[F][t]=!1),re(this,t,y(1,e))};return c&&ne&&re(U,t,{configurable:!0,set:n}),oe(t,e)}).prototype,"toString",(function(){return z(this).tag})),O(Y,"withoutSetter",(function(e){return oe(M(e),e)})),S.f=se,N.f=ae,C.f=le,w.f=x.f=fe,E.f=de,L.f=function(e){return oe(V(e),e)},c&&($(Y.prototype,"description",{configurable:!0,get:function(){return z(this).description}}),a||O(U,"propertyIsEnumerable",se,{unsafe:!0}))),r({global:!0,wrap:!0,forced:!u,sham:!u},{Symbol:Y}),R(_(ee),(function(e){P(e)})),r({target:"Symbol",stat:!0,forced:!u},{"for":function(e){var t=String(e);if(f(J,t))return J[t];var n=Y(t);return J[t]=n,Z[n]=t,n},keyFor:function(e){if(!ie(e))throw TypeError(e+" is not a symbol");if(f(Z,e))return Z[e]},useSetter:function(){ne=!0},useSimple:function(){ne=!1}}),r({target:"Object",stat:!0,forced:!u,sham:!c},{create:ue,defineProperty:ae,defineProperties:ce,getOwnPropertyDescriptor:le}),r({target:"Object",stat:!0,forced:!u},{getOwnPropertyNames:fe,getOwnPropertySymbols:de}),r({target:"Object",stat:!0,forced:l((function(){E.f(1)}))},{getOwnPropertySymbols:function(e){return E.f(v(e))}}),H)&&r({target:"JSON",stat:!0,forced:!u||l((function(){var e=Y();return"[null]"!=H([e])||"{}"!=H({a:e})||"{}"!=H(Object(e))}))},{stringify:function(e,t,n){for(var r,o=[e],i=1;arguments.length>i;)o.push(arguments[i++]);if(r=t,(p(t)||e!==undefined)&&!ie(e))return d(t)||(t=function(e,t){if("function"==typeof r&&(t=r.call(this,e,t)),!ie(t))return t}),o[1]=t,H.apply(null,o)}});Y.prototype[D]||k(Y.prototype,D,Y.prototype.valueOf),j(Y,"Symbol"),T[F]=!0},function(e,t,n){"use strict";var r=n(0),o=n(5),i=n(3),a=n(14),c=n(4),u=n(11).f,s=n(126),l=i.Symbol;if(o&&"function"==typeof l&&(!("description"in l.prototype)||l().description!==undefined)){var f={},d=function(){var e=arguments.length<1||arguments[0]===undefined?undefined:String(arguments[0]),t=this instanceof d?new l(e):e===undefined?l():l(e);return""===e&&(f[t]=!0),t};s(d,l);var p=d.prototype=l.prototype;p.constructor=d;var h=p.toString,v="Symbol(test)"==String(l("test")),g=/^Symbol\((.*)\)[^)]+$/;u(p,"description",{configurable:!0,get:function(){var e=c(this)?this.valueOf():this,t=h.call(e);if(a(f,e))return"";var n=v?t.slice(7,-1):t.replace(g,"$1");return""===n?undefined:n}}),r({global:!0,forced:!0},{Symbol:d})}},function(e,t,n){"use strict";n(22)("asyncIterator")},function(e,t,n){"use strict";n(22)("hasInstance")},function(e,t,n){"use strict";n(22)("isConcatSpreadable")},function(e,t,n){"use strict";n(22)("iterator")},function(e,t,n){"use strict";n(22)("match")},function(e,t,n){"use strict";n(22)("replace")},function(e,t,n){"use strict";n(22)("search")},function(e,t,n){"use strict";n(22)("species")},function(e,t,n){"use strict";n(22)("split")},function(e,t,n){"use strict";n(22)("toPrimitive")},function(e,t,n){"use strict";n(22)("toStringTag")},function(e,t,n){"use strict";n(22)("unscopables")},function(e,t,n){"use strict";var r=n(0),o=n(1),i=n(49),a=n(4),c=n(12),u=n(8),s=n(45),l=n(62),f=n(63),d=n(10),p=n(94),h=d("isConcatSpreadable"),v=p>=51||!o((function(){var e=[];return e[h]=!1,e.concat()[0]!==e})),g=f("concat"),m=function(e){if(!a(e))return!1;var t=e[h];return t!==undefined?!!t:i(e)};r({target:"Array",proto:!0,forced:!v||!g},{concat:function(e){var t,n,r,o,i,a=c(this),f=l(a,0),d=0;for(t=-1,r=arguments.length;t9007199254740991)throw TypeError("Maximum allowed index exceeded");for(n=0;n=9007199254740991)throw TypeError("Maximum allowed index exceeded");s(f,d++,i)}return f.length=d,f}})},function(e,t,n){"use strict";var r=n(0),o=n(134),i=n(39);r({target:"Array",proto:!0},{copyWithin:o}),i("copyWithin")},function(e,t,n){"use strict";var r=n(0),o=n(15).every,i=n(34),a=n(19),c=i("every"),u=a("every");r({target:"Array",proto:!0,forced:!c||!u},{every:function(e){return o(this,e,arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var r=n(0),o=n(95),i=n(39);r({target:"Array",proto:!0},{fill:o}),i("fill")},function(e,t,n){"use strict";var r=n(0),o=n(15).filter,i=n(63),a=n(19),c=i("filter"),u=a("filter");r({target:"Array",proto:!0,forced:!c||!u},{filter:function(e){return o(this,e,arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var r=n(0),o=n(15).find,i=n(39),a=n(19),c=!0,u=a("find");"find"in[]&&Array(1).find((function(){c=!1})),r({target:"Array",proto:!0,forced:c||!u},{find:function(e){return o(this,e,arguments.length>1?arguments[1]:undefined)}}),i("find")},function(e,t,n){"use strict";var r=n(0),o=n(15).findIndex,i=n(39),a=n(19),c=!0,u=a("findIndex");"findIndex"in[]&&Array(1).findIndex((function(){c=!1})),r({target:"Array",proto:!0,forced:c||!u},{findIndex:function(e){return o(this,e,arguments.length>1?arguments[1]:undefined)}}),i("findIndex")},function(e,t,n){"use strict";var r=n(0),o=n(135),i=n(12),a=n(8),c=n(26),u=n(62);r({target:"Array",proto:!0},{flat:function(){var e=arguments.length?arguments[0]:undefined,t=i(this),n=a(t.length),r=u(t,0);return r.length=o(r,t,t,n,0,e===undefined?1:c(e)),r}})},function(e,t,n){"use strict";var r=n(0),o=n(135),i=n(12),a=n(8),c=n(27),u=n(62);r({target:"Array",proto:!0},{flatMap:function(e){var t,n=i(this),r=a(n.length);return c(e),(t=u(n,0)).length=o(t,n,n,r,0,1,e,arguments.length>1?arguments[1]:undefined),t}})},function(e,t,n){"use strict";var r=n(0),o=n(196);r({target:"Array",proto:!0,forced:[].forEach!=o},{forEach:o})},function(e,t,n){"use strict";var r=n(15).forEach,o=n(34),i=n(19),a=o("forEach"),c=i("forEach");e.exports=a&&c?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}},function(e,t,n){"use strict";var r=n(0),o=n(198);r({target:"Array",stat:!0,forced:!n(72)((function(e){Array.from(e)}))},{from:o})},function(e,t,n){"use strict";var r=n(44),o=n(12),i=n(136),a=n(96),c=n(8),u=n(45),s=n(97);e.exports=function(e){var t,n,l,f,d,p,h=o(e),v="function"==typeof this?this:Array,g=arguments.length,m=g>1?arguments[1]:undefined,y=m!==undefined,b=s(h),_=0;if(y&&(m=r(m,g>2?arguments[2]:undefined,2)),b==undefined||v==Array&&a(b))for(n=new v(t=c(h.length));t>_;_++)p=y?m(h[_],_):h[_],u(n,_,p);else for(d=(f=b.call(h)).next,n=new v;!(l=d.call(f)).done;_++)p=y?i(f,m,[l.value,_],!0):l.value,u(n,_,p);return n.length=_,n}},function(e,t,n){"use strict";var r=n(0),o=n(59).includes,i=n(39);r({target:"Array",proto:!0,forced:!n(19)("indexOf",{ACCESSORS:!0,1:0})},{includes:function(e){return o(this,e,arguments.length>1?arguments[1]:undefined)}}),i("includes")},function(e,t,n){"use strict";var r=n(0),o=n(59).indexOf,i=n(34),a=n(19),c=[].indexOf,u=!!c&&1/[1].indexOf(1,-0)<0,s=i("indexOf"),l=a("indexOf",{ACCESSORS:!0,1:0});r({target:"Array",proto:!0,forced:u||!s||!l},{indexOf:function(e){return u?c.apply(this,arguments)||0:o(this,e,arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";n(0)({target:"Array",stat:!0},{isArray:n(49)})},function(e,t,n){"use strict";var r=n(138).IteratorPrototype,o=n(37),i=n(42),a=n(38),c=n(64),u=function(){return this};e.exports=function(e,t,n){var s=t+" Iterator";return e.prototype=o(r,{next:i(1,n)}),a(e,s,!1,!0),c[s]=u,e}},function(e,t,n){"use strict";var r=n(0),o=n(56),i=n(21),a=n(34),c=[].join,u=o!=Object,s=a("join",",");r({target:"Array",proto:!0,forced:u||!s},{join:function(e){return c.call(i(this),e===undefined?",":e)}})},function(e,t,n){"use strict";var r=n(0),o=n(140);r({target:"Array",proto:!0,forced:o!==[].lastIndexOf},{lastIndexOf:o})},function(e,t,n){"use strict";var r=n(0),o=n(15).map,i=n(63),a=n(19),c=i("map"),u=a("map");r({target:"Array",proto:!0,forced:!c||!u},{map:function(e){return o(this,e,arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var r=n(0),o=n(1),i=n(45);r({target:"Array",stat:!0,forced:o((function(){function e(){}return!(Array.of.call(e)instanceof e)}))},{of:function(){for(var e=0,t=arguments.length,n=new("function"==typeof this?this:Array)(t);t>e;)i(n,e,arguments[e++]);return n.length=t,n}})},function(e,t,n){"use strict";var r=n(0),o=n(73).left,i=n(34),a=n(19),c=i("reduce"),u=a("reduce",{1:0});r({target:"Array",proto:!0,forced:!c||!u},{reduce:function(e){return o(this,e,arguments.length,arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var r=n(0),o=n(73).right,i=n(34),a=n(19),c=i("reduceRight"),u=a("reduce",{1:0});r({target:"Array",proto:!0,forced:!c||!u},{reduceRight:function(e){return o(this,e,arguments.length,arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var r=n(0),o=n(4),i=n(49),a=n(36),c=n(8),u=n(21),s=n(45),l=n(10),f=n(63),d=n(19),p=f("slice"),h=d("slice",{ACCESSORS:!0,0:0,1:2}),v=l("species"),g=[].slice,m=Math.max;r({target:"Array",proto:!0,forced:!p||!h},{slice:function(e,t){var n,r,l,f=u(this),d=c(f.length),p=a(e,d),h=a(t===undefined?d:t,d);if(i(f)&&("function"!=typeof(n=f.constructor)||n!==Array&&!i(n.prototype)?o(n)&&null===(n=n[v])&&(n=undefined):n=undefined,n===Array||n===undefined))return g.call(f,p,h);for(r=new(n===undefined?Array:n)(m(h-p,0)),l=0;p1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var r=n(0),o=n(27),i=n(12),a=n(1),c=n(34),u=[],s=u.sort,l=a((function(){u.sort(undefined)})),f=a((function(){u.sort(null)})),d=c("sort");r({target:"Array",proto:!0,forced:l||!f||!d},{sort:function(e){return e===undefined?s.call(i(this)):s.call(i(this),o(e))}})},function(e,t,n){"use strict";n(50)("Array")},function(e,t,n){"use strict";var r=n(0),o=n(36),i=n(26),a=n(8),c=n(12),u=n(62),s=n(45),l=n(63),f=n(19),d=l("splice"),p=f("splice",{ACCESSORS:!0,0:0,1:2}),h=Math.max,v=Math.min;r({target:"Array",proto:!0,forced:!d||!p},{splice:function(e,t){var n,r,l,f,d,p,g=c(this),m=a(g.length),y=o(e,m),b=arguments.length;if(0===b?n=r=0:1===b?(n=0,r=m-y):(n=b-2,r=v(h(i(t),0),m-y)),m+n-r>9007199254740991)throw TypeError("Maximum allowed length exceeded");for(l=u(g,r),f=0;fm-r+n;f--)delete g[f-1]}else if(n>r)for(f=m-r;f>y;f--)p=f+n-1,(d=f+r-1)in g?g[p]=g[d]:delete g[p];for(f=0;f>1,v=23===t?o(2,-24)-o(2,-77):0,g=e<0||0===e&&1/e<0?1:0,m=0;for((e=r(e))!=e||e===1/0?(s=e!=e?1:0,u=p):(u=i(a(e)/c),e*(l=o(2,-u))<1&&(u--,l*=2),(e+=u+h>=1?v/l:v*o(2,1-h))*l>=2&&(u++,l/=2),u+h>=p?(s=0,u=p):u+h>=1?(s=(e*l-1)*o(2,t),u+=h):(s=e*o(2,h-1)*o(2,t),u=0));t>=8;f[m++]=255&s,s/=256,t-=8);for(u=u<0;f[m++]=255&u,u/=256,d-=8);return f[--m]|=128*g,f},unpack:function(e,t){var n,r=e.length,i=8*r-t-1,a=(1<>1,u=i-7,s=r-1,l=e[s--],f=127&l;for(l>>=7;u>0;f=256*f+e[s],s--,u-=8);for(n=f&(1<<-u)-1,f>>=-u,u+=t;u>0;n=256*n+e[s],s--,u-=8);if(0===f)f=1-c;else{if(f===a)return n?NaN:l?-1/0:1/0;n+=o(2,t),f-=c}return(l?-1:1)*n*o(2,f-t)}}},function(e,t,n){"use strict";var r=n(0),o=n(7);r({target:"ArrayBuffer",stat:!0,forced:!o.NATIVE_ARRAY_BUFFER_VIEWS},{isView:o.isView})},function(e,t,n){"use strict";var r=n(0),o=n(1),i=n(74),a=n(6),c=n(36),u=n(8),s=n(40),l=i.ArrayBuffer,f=i.DataView,d=l.prototype.slice;r({target:"ArrayBuffer",proto:!0,unsafe:!0,forced:o((function(){return!new l(2).slice(1,undefined).byteLength}))},{slice:function(e,t){if(d!==undefined&&t===undefined)return d.call(a(this),e);for(var n=a(this).byteLength,r=c(e,n),o=c(t===undefined?n:t,n),i=new(s(this,l))(u(o-r)),p=new f(this),h=new f(i),v=0;r9999?"+":"";return n+o(i(e),n?6:4,0)+"-"+o(this.getUTCMonth()+1,2,0)+"-"+o(this.getUTCDate(),2,0)+"T"+o(this.getUTCHours(),2,0)+":"+o(this.getUTCMinutes(),2,0)+":"+o(this.getUTCSeconds(),2,0)+"."+o(t,3,0)+"Z"}:u},function(e,t,n){"use strict";var r=n(0),o=n(1),i=n(12),a=n(29);r({target:"Date",proto:!0,forced:o((function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})}))},{toJSON:function(e){var t=i(this),n=a(t);return"number"!=typeof n||isFinite(n)?t.toISOString():null}})},function(e,t,n){"use strict";var r=n(25),o=n(226),i=n(10)("toPrimitive"),a=Date.prototype;i in a||r(a,i,o)},function(e,t,n){"use strict";var r=n(6),o=n(29);e.exports=function(e){if("string"!==e&&"number"!==e&&"default"!==e)throw TypeError("Incorrect hint");return o(r(this),"number"!==e)}},function(e,t,n){"use strict";var r=n(18),o=Date.prototype,i=o.toString,a=o.getTime;new Date(NaN)+""!="Invalid Date"&&r(o,"toString",(function(){var e=a.call(this);return e==e?i.call(this):"Invalid Date"}))},function(e,t,n){"use strict";n(0)({target:"Function",proto:!0},{bind:n(142)})},function(e,t,n){"use strict";var r=n(4),o=n(11),i=n(31),a=n(10)("hasInstance"),c=Function.prototype;a in c||o.f(c,a,{value:function(e){if("function"!=typeof this||!r(e))return!1;if(!r(this.prototype))return e instanceof this;for(;e=i(e);)if(this.prototype===e)return!0;return!1}})},function(e,t,n){"use strict";var r=n(5),o=n(11).f,i=Function.prototype,a=i.toString,c=/^\s*function ([^ (]*)/;r&&!("name"in i)&&o(i,"name",{configurable:!0,get:function(){try{return a.call(this).match(c)[1]}catch(e){return""}}})},function(e,t,n){"use strict";var r=n(3);n(38)(r.JSON,"JSON",!0)},function(e,t,n){"use strict";var r=n(75),o=n(143);e.exports=r("Map",(function(e){return function(){return e(this,arguments.length?arguments[0]:undefined)}}),o)},function(e,t,n){"use strict";var r=n(0),o=n(144),i=Math.acosh,a=Math.log,c=Math.sqrt,u=Math.LN2;r({target:"Math",stat:!0,forced:!i||710!=Math.floor(i(Number.MAX_VALUE))||i(Infinity)!=Infinity},{acosh:function(e){return(e=+e)<1?NaN:e>94906265.62425156?a(e)+u:o(e-1+c(e-1)*c(e+1))}})},function(e,t,n){"use strict";var r=n(0),o=Math.asinh,i=Math.log,a=Math.sqrt;r({target:"Math",stat:!0,forced:!(o&&1/o(0)>0)},{asinh:function c(e){return isFinite(e=+e)&&0!=e?e<0?-c(-e):i(e+a(e*e+1)):e}})},function(e,t,n){"use strict";var r=n(0),o=Math.atanh,i=Math.log;r({target:"Math",stat:!0,forced:!(o&&1/o(-0)<0)},{atanh:function(e){return 0==(e=+e)?e:i((1+e)/(1-e))/2}})},function(e,t,n){"use strict";var r=n(0),o=n(104),i=Math.abs,a=Math.pow;r({target:"Math",stat:!0},{cbrt:function(e){return o(e=+e)*a(i(e),1/3)}})},function(e,t,n){"use strict";var r=n(0),o=Math.floor,i=Math.log,a=Math.LOG2E;r({target:"Math",stat:!0},{clz32:function(e){return(e>>>=0)?31-o(i(e+.5)*a):32}})},function(e,t,n){"use strict";var r=n(0),o=n(77),i=Math.cosh,a=Math.abs,c=Math.E;r({target:"Math",stat:!0,forced:!i||i(710)===Infinity},{cosh:function(e){var t=o(a(e)-1)+1;return(t+1/(t*c*c))*(c/2)}})},function(e,t,n){"use strict";var r=n(0),o=n(77);r({target:"Math",stat:!0,forced:o!=Math.expm1},{expm1:o})},function(e,t,n){"use strict";n(0)({target:"Math",stat:!0},{fround:n(241)})},function(e,t,n){"use strict";var r=n(104),o=Math.abs,i=Math.pow,a=i(2,-52),c=i(2,-23),u=i(2,127)*(2-c),s=i(2,-126);e.exports=Math.fround||function(e){var t,n,i=o(e),l=r(e);return iu||n!=n?l*Infinity:l*n}},function(e,t,n){"use strict";var r=n(0),o=Math.hypot,i=Math.abs,a=Math.sqrt;r({target:"Math",stat:!0,forced:!!o&&o(Infinity,NaN)!==Infinity},{hypot:function(e,t){for(var n,r,o=0,c=0,u=arguments.length,s=0;c0?(r=n/s)*r:n;return s===Infinity?Infinity:s*a(o)}})},function(e,t,n){"use strict";var r=n(0),o=n(1),i=Math.imul;r({target:"Math",stat:!0,forced:o((function(){return-5!=i(4294967295,5)||2!=i.length}))},{imul:function(e,t){var n=+e,r=+t,o=65535&n,i=65535&r;return 0|o*i+((65535&n>>>16)*i+o*(65535&r>>>16)<<16>>>0)}})},function(e,t,n){"use strict";var r=n(0),o=Math.log,i=Math.LOG10E;r({target:"Math",stat:!0},{log10:function(e){return o(e)*i}})},function(e,t,n){"use strict";n(0)({target:"Math",stat:!0},{log1p:n(144)})},function(e,t,n){"use strict";var r=n(0),o=Math.log,i=Math.LN2;r({target:"Math",stat:!0},{log2:function(e){return o(e)/i}})},function(e,t,n){"use strict";n(0)({target:"Math",stat:!0},{sign:n(104)})},function(e,t,n){"use strict";var r=n(0),o=n(1),i=n(77),a=Math.abs,c=Math.exp,u=Math.E;r({target:"Math",stat:!0,forced:o((function(){return-2e-17!=Math.sinh(-2e-17)}))},{sinh:function(e){return a(e=+e)<1?(i(e)-i(-e))/2:(c(e-1)-c(-e-1))*(u/2)}})},function(e,t,n){"use strict";var r=n(0),o=n(77),i=Math.exp;r({target:"Math",stat:!0},{tanh:function(e){var t=o(e=+e),n=o(-e);return t==Infinity?1:n==Infinity?-1:(t-n)/(i(e)+i(-e))}})},function(e,t,n){"use strict";n(38)(Math,"Math",!0)},function(e,t,n){"use strict";var r=n(0),o=Math.ceil,i=Math.floor;r({target:"Math",stat:!0},{trunc:function(e){return(e>0?i:o)(e)}})},function(e,t,n){"use strict";var r=n(5),o=n(3),i=n(60),a=n(18),c=n(14),u=n(28),s=n(76),l=n(29),f=n(1),d=n(37),p=n(43).f,h=n(16).f,v=n(11).f,g=n(52).trim,m=o.Number,y=m.prototype,b="Number"==u(d(y)),_=function(e){var t,n,r,o,i,a,c,u,s=l(e,!1);if("string"==typeof s&&s.length>2)if(43===(t=(s=g(s)).charCodeAt(0))||45===t){if(88===(n=s.charCodeAt(2))||120===n)return NaN}else if(48===t){switch(s.charCodeAt(1)){case 66:case 98:r=2,o=49;break;case 79:case 111:r=8,o=55;break;default:return+s}for(a=(i=s.slice(2)).length,c=0;co)return NaN;return parseInt(i,r)}return+s};if(i("Number",!m(" 0o1")||!m("0b1")||m("+0x1"))){for(var w,x=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof x&&(b?f((function(){y.valueOf.call(n)})):"Number"!=u(n))?s(new m(_(t)),n,x):_(t)},E=r?p(m):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),C=0;E.length>C;C++)c(m,w=E[C])&&!c(x,w)&&v(x,w,h(m,w));x.prototype=y,y.constructor=x,a(o,"Number",x)}},function(e,t,n){"use strict";n(0)({target:"Number",stat:!0},{EPSILON:Math.pow(2,-52)})},function(e,t,n){"use strict";n(0)({target:"Number",stat:!0},{isFinite:n(255)})},function(e,t,n){"use strict";var r=n(3).isFinite;e.exports=Number.isFinite||function(e){return"number"==typeof e&&r(e)}},function(e,t,n){"use strict";n(0)({target:"Number",stat:!0},{isInteger:n(145)})},function(e,t,n){"use strict";n(0)({target:"Number",stat:!0},{isNaN:function(e){return e!=e}})},function(e,t,n){"use strict";var r=n(0),o=n(145),i=Math.abs;r({target:"Number",stat:!0},{isSafeInteger:function(e){return o(e)&&i(e)<=9007199254740991}})},function(e,t,n){"use strict";n(0)({target:"Number",stat:!0},{MAX_SAFE_INTEGER:9007199254740991})},function(e,t,n){"use strict";n(0)({target:"Number",stat:!0},{MIN_SAFE_INTEGER:-9007199254740991})},function(e,t,n){"use strict";var r=n(0),o=n(262);r({target:"Number",stat:!0,forced:Number.parseFloat!=o},{parseFloat:o})},function(e,t,n){"use strict";var r=n(3),o=n(52).trim,i=n(78),a=r.parseFloat,c=1/a(i+"-0")!=-Infinity;e.exports=c?function(e){var t=o(String(e)),n=a(t);return 0===n&&"-"==t.charAt(0)?-0:n}:a},function(e,t,n){"use strict";var r=n(0),o=n(146);r({target:"Number",stat:!0,forced:Number.parseInt!=o},{parseInt:o})},function(e,t,n){"use strict";var r=n(0),o=n(26),i=n(265),a=n(103),c=n(1),u=1..toFixed,s=Math.floor,l=function f(e,t,n){return 0===t?n:t%2==1?f(e,t-1,n*e):f(e*e,t/2,n)};r({target:"Number",proto:!0,forced:u&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!c((function(){u.call({})}))},{toFixed:function(e){var t,n,r,c,u=i(this),f=o(e),d=[0,0,0,0,0,0],p="",h="0",v=function(e,t){for(var n=-1,r=t;++n<6;)r+=e*d[n],d[n]=r%1e7,r=s(r/1e7)},g=function(e){for(var t=6,n=0;--t>=0;)n+=d[t],d[t]=s(n/e),n=n%e*1e7},m=function(){for(var e=6,t="";--e>=0;)if(""!==t||0===e||0!==d[e]){var n=String(d[e]);t=""===t?n:t+a.call("0",7-n.length)+n}return t};if(f<0||f>20)throw RangeError("Incorrect fraction digits");if(u!=u)return"NaN";if(u<=-1e21||u>=1e21)return String(u);if(u<0&&(p="-",u=-u),u>1e-21)if(n=(t=function(e){for(var t=0,n=e;n>=4096;)t+=12,n/=4096;for(;n>=2;)t+=1,n/=2;return t}(u*l(2,69,1))-69)<0?u*l(2,-t,1):u/l(2,t,1),n*=4503599627370496,(t=52-t)>0){for(v(0,n),r=f;r>=7;)v(1e7,0),r-=7;for(v(l(10,r,1),0),r=t-1;r>=23;)g(1<<23),r-=23;g(1<0?p+((c=h.length)<=f?"0."+a.call("0",f-c)+h:h.slice(0,c-f)+"."+h.slice(c-f)):p+h}})},function(e,t,n){"use strict";var r=n(28);e.exports=function(e){if("number"!=typeof e&&"Number"!=r(e))throw TypeError("Incorrect invocation");return+e}},function(e,t,n){"use strict";var r=n(0),o=n(267);r({target:"Object",stat:!0,forced:Object.assign!==o},{assign:o})},function(e,t,n){"use strict";var r=n(5),o=n(1),i=n(61),a=n(92),c=n(68),u=n(12),s=n(56),l=Object.assign,f=Object.defineProperty;e.exports=!l||o((function(){if(r&&1!==l({b:1},l(f({},"a",{enumerable:!0,get:function(){f(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol();return e[n]=7,"abcdefghijklmnopqrst".split("").forEach((function(e){t[e]=e})),7!=l({},e)[n]||"abcdefghijklmnopqrst"!=i(l({},t)).join("")}))?function(e,t){for(var n=u(e),o=arguments.length,l=1,f=a.f,d=c.f;o>l;)for(var p,h=s(arguments[l++]),v=f?i(h).concat(f(h)):i(h),g=v.length,m=0;g>m;)p=v[m++],r&&!d.call(h,p)||(n[p]=h[p]);return n}:l},function(e,t,n){"use strict";n(0)({target:"Object",stat:!0,sham:!n(5)},{create:n(37)})},function(e,t,n){"use strict";var r=n(0),o=n(5),i=n(79),a=n(12),c=n(27),u=n(11);o&&r({target:"Object",proto:!0,forced:i},{__defineGetter__:function(e,t){u.f(a(this),e,{get:c(t),enumerable:!0,configurable:!0})}})},function(e,t,n){"use strict";var r=n(0),o=n(5);r({target:"Object",stat:!0,forced:!o,sham:!o},{defineProperties:n(130)})},function(e,t,n){"use strict";var r=n(0),o=n(5);r({target:"Object",stat:!0,forced:!o,sham:!o},{defineProperty:n(11).f})},function(e,t,n){"use strict";var r=n(0),o=n(5),i=n(79),a=n(12),c=n(27),u=n(11);o&&r({target:"Object",proto:!0,forced:i},{__defineSetter__:function(e,t){u.f(a(this),e,{set:c(t),enumerable:!0,configurable:!0})}})},function(e,t,n){"use strict";var r=n(0),o=n(147).entries;r({target:"Object",stat:!0},{entries:function(e){return o(e)}})},function(e,t,n){"use strict";var r=n(0),o=n(66),i=n(1),a=n(4),c=n(47).onFreeze,u=Object.freeze;r({target:"Object",stat:!0,forced:i((function(){u(1)})),sham:!o},{freeze:function(e){return u&&a(e)?u(c(e)):e}})},function(e,t,n){"use strict";var r=n(0),o=n(67),i=n(45);r({target:"Object",stat:!0},{fromEntries:function(e){var t={};return o(e,(function(e,n){i(t,e,n)}),undefined,!0),t}})},function(e,t,n){"use strict";var r=n(0),o=n(1),i=n(21),a=n(16).f,c=n(5),u=o((function(){a(1)}));r({target:"Object",stat:!0,forced:!c||u,sham:!c},{getOwnPropertyDescriptor:function(e,t){return a(i(e),t)}})},function(e,t,n){"use strict";var r=n(0),o=n(5),i=n(90),a=n(21),c=n(16),u=n(45);r({target:"Object",stat:!0,sham:!o},{getOwnPropertyDescriptors:function(e){for(var t,n,r=a(e),o=c.f,s=i(r),l={},f=0;s.length>f;)(n=o(r,t=s[f++]))!==undefined&&u(l,t,n);return l}})},function(e,t,n){"use strict";var r=n(0),o=n(1),i=n(132).f;r({target:"Object",stat:!0,forced:o((function(){return!Object.getOwnPropertyNames(1)}))},{getOwnPropertyNames:i})},function(e,t,n){"use strict";var r=n(0),o=n(1),i=n(12),a=n(31),c=n(100);r({target:"Object",stat:!0,forced:o((function(){a(1)})),sham:!c},{getPrototypeOf:function(e){return a(i(e))}})},function(e,t,n){"use strict";n(0)({target:"Object",stat:!0},{is:n(148)})},function(e,t,n){"use strict";var r=n(0),o=n(1),i=n(4),a=Object.isExtensible;r({target:"Object",stat:!0,forced:o((function(){a(1)}))},{isExtensible:function(e){return!!i(e)&&(!a||a(e))}})},function(e,t,n){"use strict";var r=n(0),o=n(1),i=n(4),a=Object.isFrozen;r({target:"Object",stat:!0,forced:o((function(){a(1)}))},{isFrozen:function(e){return!i(e)||!!a&&a(e)}})},function(e,t,n){"use strict";var r=n(0),o=n(1),i=n(4),a=Object.isSealed;r({target:"Object",stat:!0,forced:o((function(){a(1)}))},{isSealed:function(e){return!i(e)||!!a&&a(e)}})},function(e,t,n){"use strict";var r=n(0),o=n(12),i=n(61);r({target:"Object",stat:!0,forced:n(1)((function(){i(1)}))},{keys:function(e){return i(o(e))}})},function(e,t,n){"use strict";var r=n(0),o=n(5),i=n(79),a=n(12),c=n(29),u=n(31),s=n(16).f;o&&r({target:"Object",proto:!0,forced:i},{__lookupGetter__:function(e){var t,n=a(this),r=c(e,!0);do{if(t=s(n,r))return t.get}while(n=u(n))}})},function(e,t,n){"use strict";var r=n(0),o=n(5),i=n(79),a=n(12),c=n(29),u=n(31),s=n(16).f;o&&r({target:"Object",proto:!0,forced:i},{__lookupSetter__:function(e){var t,n=a(this),r=c(e,!0);do{if(t=s(n,r))return t.set}while(n=u(n))}})},function(e,t,n){"use strict";var r=n(0),o=n(4),i=n(47).onFreeze,a=n(66),c=n(1),u=Object.preventExtensions;r({target:"Object",stat:!0,forced:c((function(){u(1)})),sham:!a},{preventExtensions:function(e){return u&&o(e)?u(i(e)):e}})},function(e,t,n){"use strict";var r=n(0),o=n(4),i=n(47).onFreeze,a=n(66),c=n(1),u=Object.seal;r({target:"Object",stat:!0,forced:c((function(){u(1)})),sham:!a},{seal:function(e){return u&&o(e)?u(i(e)):e}})},function(e,t,n){"use strict";n(0)({target:"Object",stat:!0},{setPrototypeOf:n(46)})},function(e,t,n){"use strict";var r=n(98),o=n(18),i=n(291);r||o(Object.prototype,"toString",i,{unsafe:!0})},function(e,t,n){"use strict";var r=n(98),o=n(71);e.exports=r?{}.toString:function(){return"[object "+o(this)+"]"}},function(e,t,n){"use strict";var r=n(0),o=n(147).values;r({target:"Object",stat:!0},{values:function(e){return o(e)}})},function(e,t,n){"use strict";var r=n(0),o=n(146);r({global:!0,forced:parseInt!=o},{parseInt:o})},function(e,t,n){"use strict";var r,o,i,a,c=n(0),u=n(33),s=n(3),l=n(32),f=n(149),d=n(18),p=n(65),h=n(38),v=n(50),g=n(4),m=n(27),y=n(51),b=n(28),_=n(88),w=n(67),x=n(72),E=n(40),C=n(105).set,N=n(151),S=n(152),k=n(295),O=n(153),A=n(296),I=n(30),T=n(60),M=n(10),V=n(94),L=M("species"),P="Promise",j=I.get,B=I.set,R=I.getterFor(P),F=f,D=s.TypeError,K=s.document,z=s.process,U=l("fetch"),Y=O.f,H=Y,W="process"==b(z),$=!!(K&&K.createEvent&&s.dispatchEvent),G=T(P,(function(){if(!(_(F)!==String(F))){if(66===V)return!0;if(!W&&"function"!=typeof PromiseRejectionEvent)return!0}if(u&&!F.prototype["finally"])return!0;if(V>=51&&/native code/.test(F))return!1;var e=F.resolve(1),t=function(e){e((function(){}),(function(){}))};return(e.constructor={})[L]=t,!(e.then((function(){}))instanceof t)})),q=G||!x((function(e){F.all(e)["catch"]((function(){}))})),X=function(e){var t;return!(!g(e)||"function"!=typeof(t=e.then))&&t},Q=function(e,t,n){if(!t.notified){t.notified=!0;var r=t.reactions;N((function(){for(var o=t.value,i=1==t.state,a=0;r.length>a;){var c,u,s,l=r[a++],f=i?l.ok:l.fail,d=l.resolve,p=l.reject,h=l.domain;try{f?(i||(2===t.rejection&&te(e,t),t.rejection=1),!0===f?c=o:(h&&h.enter(),c=f(o),h&&(h.exit(),s=!0)),c===l.promise?p(D("Promise-chain cycle")):(u=X(c))?u.call(c,d,p):d(c)):p(o)}catch(v){h&&!s&&h.exit(),p(v)}}t.reactions=[],t.notified=!1,n&&!t.rejection&&Z(e,t)}))}},J=function(e,t,n){var r,o;$?((r=K.createEvent("Event")).promise=t,r.reason=n,r.initEvent(e,!1,!0),s.dispatchEvent(r)):r={promise:t,reason:n},(o=s["on"+e])?o(r):"unhandledrejection"===e&&k("Unhandled promise rejection",n)},Z=function(e,t){C.call(s,(function(){var n,r=t.value;if(ee(t)&&(n=A((function(){W?z.emit("unhandledRejection",r,e):J("unhandledrejection",e,r)})),t.rejection=W||ee(t)?2:1,n.error))throw n.value}))},ee=function(e){return 1!==e.rejection&&!e.parent},te=function(e,t){C.call(s,(function(){W?z.emit("rejectionHandled",e):J("rejectionhandled",e,t.value)}))},ne=function(e,t,n,r){return function(o){e(t,n,o,r)}},re=function(e,t,n,r){t.done||(t.done=!0,r&&(t=r),t.value=n,t.state=2,Q(e,t,!0))},oe=function ie(e,t,n,r){if(!t.done){t.done=!0,r&&(t=r);try{if(e===n)throw D("Promise can't be resolved itself");var o=X(n);o?N((function(){var r={done:!1};try{o.call(n,ne(ie,e,r,t),ne(re,e,r,t))}catch(i){re(e,r,i,t)}})):(t.value=n,t.state=1,Q(e,t,!1))}catch(i){re(e,{done:!1},i,t)}}};G&&(F=function(e){y(this,F,P),m(e),r.call(this);var t=j(this);try{e(ne(oe,this,t),ne(re,this,t))}catch(n){re(this,t,n)}},(r=function(e){B(this,{type:P,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:undefined})}).prototype=p(F.prototype,{then:function(e,t){var n=R(this),r=Y(E(this,F));return r.ok="function"!=typeof e||e,r.fail="function"==typeof t&&t,r.domain=W?z.domain:undefined,n.parent=!0,n.reactions.push(r),0!=n.state&&Q(this,n,!1),r.promise},"catch":function(e){return this.then(undefined,e)}}),o=function(){var e=new r,t=j(e);this.promise=e,this.resolve=ne(oe,e,t),this.reject=ne(re,e,t)},O.f=Y=function(e){return e===F||e===i?new o(e):H(e)},u||"function"!=typeof f||(a=f.prototype.then,d(f.prototype,"then",(function(e,t){var n=this;return new F((function(e,t){a.call(n,e,t)})).then(e,t)}),{unsafe:!0}),"function"==typeof U&&c({global:!0,enumerable:!0,forced:!0},{fetch:function(e){return S(F,U.apply(s,arguments))}}))),c({global:!0,wrap:!0,forced:G},{Promise:F}),h(F,P,!1,!0),v(P),i=l(P),c({target:P,stat:!0,forced:G},{reject:function(e){var t=Y(this);return t.reject.call(undefined,e),t.promise}}),c({target:P,stat:!0,forced:u||G},{resolve:function(e){return S(u&&this===i?F:this,e)}}),c({target:P,stat:!0,forced:q},{all:function(e){var t=this,n=Y(t),r=n.resolve,o=n.reject,i=A((function(){var n=m(t.resolve),i=[],a=0,c=1;w(e,(function(e){var u=a++,s=!1;i.push(undefined),c++,n.call(t,e).then((function(e){s||(s=!0,i[u]=e,--c||r(i))}),o)})),--c||r(i)}));return i.error&&o(i.value),n.promise},race:function(e){var t=this,n=Y(t),r=n.reject,o=A((function(){var o=m(t.resolve);w(e,(function(e){o.call(t,e).then(n.resolve,r)}))}));return o.error&&r(o.value),n.promise}})},function(e,t,n){"use strict";var r=n(3);e.exports=function(e,t){var n=r.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))}},function(e,t,n){"use strict";e.exports=function(e){try{return{error:!1,value:e()}}catch(t){return{error:!0,value:t}}}},function(e,t,n){"use strict";var r=n(0),o=n(33),i=n(149),a=n(1),c=n(32),u=n(40),s=n(152),l=n(18);r({target:"Promise",proto:!0,real:!0,forced:!!i&&a((function(){i.prototype["finally"].call({then:function(){}},(function(){}))}))},{"finally":function(e){var t=u(this,c("Promise")),n="function"==typeof e;return this.then(n?function(n){return s(t,e()).then((function(){return n}))}:e,n?function(n){return s(t,e()).then((function(){throw n}))}:e)}}),o||"function"!=typeof i||i.prototype["finally"]||l(i.prototype,"finally",c("Promise").prototype["finally"])},function(e,t,n){"use strict";var r=n(0),o=n(32),i=n(27),a=n(6),c=n(1),u=o("Reflect","apply"),s=Function.apply;r({target:"Reflect",stat:!0,forced:!c((function(){u((function(){}))}))},{apply:function(e,t,n){return i(e),a(n),u?u(e,t,n):s.call(e,t,n)}})},function(e,t,n){"use strict";var r=n(0),o=n(32),i=n(27),a=n(6),c=n(4),u=n(37),s=n(142),l=n(1),f=o("Reflect","construct"),d=l((function(){function e(){}return!(f((function(){}),[],e)instanceof e)})),p=!l((function(){f((function(){}))})),h=d||p;r({target:"Reflect",stat:!0,forced:h,sham:h},{construct:function(e,t){i(e),a(t);var n=arguments.length<3?e:i(arguments[2]);if(p&&!d)return f(e,t,n);if(e==n){switch(t.length){case 0:return new e;case 1:return new e(t[0]);case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[1],t[2]);case 4:return new e(t[0],t[1],t[2],t[3])}var r=[null];return r.push.apply(r,t),new(s.apply(e,r))}var o=n.prototype,l=u(c(o)?o:Object.prototype),h=Function.apply.call(e,l,t);return c(h)?h:l}})},function(e,t,n){"use strict";var r=n(0),o=n(5),i=n(6),a=n(29),c=n(11);r({target:"Reflect",stat:!0,forced:n(1)((function(){Reflect.defineProperty(c.f({},1,{value:1}),1,{value:2})})),sham:!o},{defineProperty:function(e,t,n){i(e);var r=a(t,!0);i(n);try{return c.f(e,r,n),!0}catch(o){return!1}}})},function(e,t,n){"use strict";var r=n(0),o=n(6),i=n(16).f;r({target:"Reflect",stat:!0},{deleteProperty:function(e,t){var n=i(o(e),t);return!(n&&!n.configurable)&&delete e[t]}})},function(e,t,n){"use strict";var r=n(0),o=n(4),i=n(6),a=n(14),c=n(16),u=n(31);r({target:"Reflect",stat:!0},{get:function s(e,t){var n,r,l=arguments.length<3?e:arguments[2];return i(e)===l?e[t]:(n=c.f(e,t))?a(n,"value")?n.value:n.get===undefined?undefined:n.get.call(l):o(r=u(e))?s(r,t,l):void 0}})},function(e,t,n){"use strict";var r=n(0),o=n(5),i=n(6),a=n(16);r({target:"Reflect",stat:!0,sham:!o},{getOwnPropertyDescriptor:function(e,t){return a.f(i(e),t)}})},function(e,t,n){"use strict";var r=n(0),o=n(6),i=n(31);r({target:"Reflect",stat:!0,sham:!n(100)},{getPrototypeOf:function(e){return i(o(e))}})},function(e,t,n){"use strict";n(0)({target:"Reflect",stat:!0},{has:function(e,t){return t in e}})},function(e,t,n){"use strict";var r=n(0),o=n(6),i=Object.isExtensible;r({target:"Reflect",stat:!0},{isExtensible:function(e){return o(e),!i||i(e)}})},function(e,t,n){"use strict";n(0)({target:"Reflect",stat:!0},{ownKeys:n(90)})},function(e,t,n){"use strict";var r=n(0),o=n(32),i=n(6);r({target:"Reflect",stat:!0,sham:!n(66)},{preventExtensions:function(e){i(e);try{var t=o("Object","preventExtensions");return t&&t(e),!0}catch(n){return!1}}})},function(e,t,n){"use strict";var r=n(0),o=n(6),i=n(4),a=n(14),c=n(1),u=n(11),s=n(16),l=n(31),f=n(42);r({target:"Reflect",stat:!0,forced:c((function(){var e=u.f({},"a",{configurable:!0});return!1!==Reflect.set(l(e),"a",1,e)}))},{set:function d(e,t,n){var r,c,p=arguments.length<4?e:arguments[3],h=s.f(o(e),t);if(!h){if(i(c=l(e)))return d(c,t,n,p);h=f(0)}if(a(h,"value")){if(!1===h.writable||!i(p))return!1;if(r=s.f(p,t)){if(r.get||r.set||!1===r.writable)return!1;r.value=n,u.f(p,t,r)}else u.f(p,t,f(0,n));return!0}return h.set!==undefined&&(h.set.call(p,n),!0)}})},function(e,t,n){"use strict";var r=n(0),o=n(6),i=n(139),a=n(46);a&&r({target:"Reflect",stat:!0},{setPrototypeOf:function(e,t){o(e),i(t);try{return a(e,t),!0}catch(n){return!1}}})},function(e,t,n){"use strict";var r=n(5),o=n(3),i=n(60),a=n(76),c=n(11).f,u=n(43).f,s=n(106),l=n(80),f=n(107),d=n(18),p=n(1),h=n(30).set,v=n(50),g=n(10)("match"),m=o.RegExp,y=m.prototype,b=/a/g,_=/a/g,w=new m(b)!==b,x=f.UNSUPPORTED_Y;if(r&&i("RegExp",!w||x||p((function(){return _[g]=!1,m(b)!=b||m(_)==_||"/a/i"!=m(b,"i")})))){for(var E=function(e,t){var n,r=this instanceof E,o=s(e),i=t===undefined;if(!r&&o&&e.constructor===E&&i)return e;w?o&&!i&&(e=e.source):e instanceof E&&(i&&(t=l.call(e)),e=e.source),x&&(n=!!t&&t.indexOf("y")>-1)&&(t=t.replace(/y/g,""));var c=a(w?new m(e,t):m(e,t),r?this:y,E);return x&&n&&h(c,{sticky:n}),c},C=function(e){e in E||c(E,e,{configurable:!0,get:function(){return m[e]},set:function(t){m[e]=t}})},N=u(m),S=0;N.length>S;)C(N[S++]);y.constructor=E,E.prototype=y,d(o,"RegExp",E)}v("RegExp")},function(e,t,n){"use strict";var r=n(5),o=n(11),i=n(80),a=n(107).UNSUPPORTED_Y;r&&("g"!=/./g.flags||a)&&o.f(RegExp.prototype,"flags",{configurable:!0,get:i})},function(e,t,n){"use strict";var r=n(18),o=n(6),i=n(1),a=n(80),c=RegExp.prototype,u=c.toString,s=i((function(){return"/a/b"!=u.call({source:"a",flags:"b"})})),l="toString"!=u.name;(s||l)&&r(RegExp.prototype,"toString",(function(){var e=o(this),t=String(e.source),n=e.flags;return"/"+t+"/"+String(n===undefined&&e instanceof RegExp&&!("flags"in c)?a.call(e):n)}),{unsafe:!0})},function(e,t,n){"use strict";var r=n(75),o=n(143);e.exports=r("Set",(function(e){return function(){return e(this,arguments.length?arguments[0]:undefined)}}),o)},function(e,t,n){"use strict";var r=n(0),o=n(108).codeAt;r({target:"String",proto:!0},{codePointAt:function(e){return o(this,e)}})},function(e,t,n){"use strict";var r,o=n(0),i=n(16).f,a=n(8),c=n(109),u=n(17),s=n(110),l=n(33),f="".endsWith,d=Math.min,p=s("endsWith");o({target:"String",proto:!0,forced:!!(l||p||(r=i(String.prototype,"endsWith"),!r||r.writable))&&!p},{endsWith:function(e){var t=String(u(this));c(e);var n=arguments.length>1?arguments[1]:undefined,r=a(t.length),o=n===undefined?r:d(a(n),r),i=String(e);return f?f.call(t,i,o):t.slice(o-i.length,o)===i}})},function(e,t,n){"use strict";var r=n(0),o=n(36),i=String.fromCharCode,a=String.fromCodePoint;r({target:"String",stat:!0,forced:!!a&&1!=a.length},{fromCodePoint:function(e){for(var t,n=[],r=arguments.length,a=0;r>a;){if(t=+arguments[a++],o(t,1114111)!==t)throw RangeError(t+" is not a valid code point");n.push(t<65536?i(t):i(55296+((t-=65536)>>10),t%1024+56320))}return n.join("")}})},function(e,t,n){"use strict";var r=n(0),o=n(109),i=n(17);r({target:"String",proto:!0,forced:!n(110)("includes")},{includes:function(e){return!!~String(i(this)).indexOf(o(e),arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var r=n(108).charAt,o=n(30),i=n(99),a=o.set,c=o.getterFor("String Iterator");i(String,"String",(function(e){a(this,{type:"String Iterator",string:String(e),index:0})}),(function(){var e,t=c(this),n=t.string,o=t.index;return o>=n.length?{value:undefined,done:!0}:(e=r(n,o),t.index+=e.length,{value:e,done:!1})}))},function(e,t,n){"use strict";var r=n(82),o=n(6),i=n(8),a=n(17),c=n(111),u=n(83);r("match",1,(function(e,t,n){return[function(t){var n=a(this),r=t==undefined?undefined:t[e];return r!==undefined?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var a=o(e),s=String(this);if(!a.global)return u(a,s);var l=a.unicode;a.lastIndex=0;for(var f,d=[],p=0;null!==(f=u(a,s));){var h=String(f[0]);d[p]=h,""===h&&(a.lastIndex=c(s,i(a.lastIndex),l)),p++}return 0===p?null:d}]}))},function(e,t,n){"use strict";var r=n(0),o=n(102).end;r({target:"String",proto:!0,forced:n(155)},{padEnd:function(e){return o(this,e,arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var r=n(0),o=n(102).start;r({target:"String",proto:!0,forced:n(155)},{padStart:function(e){return o(this,e,arguments.length>1?arguments[1]:undefined)}})},function(e,t,n){"use strict";var r=n(0),o=n(21),i=n(8);r({target:"String",stat:!0},{raw:function(e){for(var t=o(e.raw),n=i(t.length),r=arguments.length,a=[],c=0;n>c;)a.push(String(t[c++])),c]*>)/g,v=/\$([$&'`]|\d\d?)/g;r("replace",2,(function(e,t,n,r){var g=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,m=r.REPLACE_KEEPS_$0,y=g?"$":"$0";return[function(n,r){var o=u(this),i=n==undefined?undefined:n[e];return i!==undefined?i.call(n,o,r):t.call(String(o),n,r)},function(e,r){if(!g&&m||"string"==typeof r&&-1===r.indexOf(y)){var i=n(t,e,this,r);if(i.done)return i.value}var u=o(e),p=String(this),h="function"==typeof r;h||(r=String(r));var v=u.global;if(v){var _=u.unicode;u.lastIndex=0}for(var w=[];;){var x=l(u,p);if(null===x)break;if(w.push(x),!v)break;""===String(x[0])&&(u.lastIndex=s(p,a(u.lastIndex),_))}for(var E,C="",N=0,S=0;S=N&&(C+=p.slice(N,O)+V,N=O+k.length)}return C+p.slice(N)}];function b(e,n,r,o,a,c){var u=r+e.length,s=o.length,l=v;return a!==undefined&&(a=i(a),l=h),t.call(c,l,(function(t,i){var c;switch(i.charAt(0)){case"$":return"$";case"&":return e;case"`":return n.slice(0,r);case"'":return n.slice(u);case"<":c=a[i.slice(1,-1)];break;default:var l=+i;if(0===l)return t;if(l>s){var f=p(l/10);return 0===f?t:f<=s?o[f-1]===undefined?i.charAt(1):o[f-1]+i.charAt(1):t}c=o[l-1]}return c===undefined?"":c}))}}))},function(e,t,n){"use strict";var r=n(82),o=n(6),i=n(17),a=n(148),c=n(83);r("search",1,(function(e,t,n){return[function(t){var n=i(this),r=t==undefined?undefined:t[e];return r!==undefined?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var i=o(e),u=String(this),s=i.lastIndex;a(s,0)||(i.lastIndex=0);var l=c(i,u);return a(i.lastIndex,s)||(i.lastIndex=s),null===l?-1:l.index}]}))},function(e,t,n){"use strict";var r=n(82),o=n(106),i=n(6),a=n(17),c=n(40),u=n(111),s=n(8),l=n(83),f=n(81),d=n(1),p=[].push,h=Math.min,v=!d((function(){return!RegExp(4294967295,"y")}));r("split",2,(function(e,t,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var r=String(a(this)),i=n===undefined?4294967295:n>>>0;if(0===i)return[];if(e===undefined)return[r];if(!o(e))return t.call(r,e,i);for(var c,u,s,l=[],d=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),h=0,v=new RegExp(e.source,d+"g");(c=f.call(v,r))&&!((u=v.lastIndex)>h&&(l.push(r.slice(h,c.index)),c.length>1&&c.index=i));)v.lastIndex===c.index&&v.lastIndex++;return h===r.length?!s&&v.test("")||l.push(""):l.push(r.slice(h)),l.length>i?l.slice(0,i):l}:"0".split(undefined,0).length?function(e,n){return e===undefined&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var o=a(this),i=t==undefined?undefined:t[e];return i!==undefined?i.call(t,o,n):r.call(String(o),t,n)},function(e,o){var a=n(r,e,this,o,r!==t);if(a.done)return a.value;var f=i(e),d=String(this),p=c(f,RegExp),g=f.unicode,m=(f.ignoreCase?"i":"")+(f.multiline?"m":"")+(f.unicode?"u":"")+(v?"y":"g"),y=new p(v?f:"^(?:"+f.source+")",m),b=o===undefined?4294967295:o>>>0;if(0===b)return[];if(0===d.length)return null===l(y,d)?[d]:[];for(var _=0,w=0,x=[];w1?arguments[1]:undefined,t.length)),r=String(e);return f?f.call(t,r,n):t.slice(n,n+r.length)===r}})},function(e,t,n){"use strict";var r=n(0),o=n(52).trim;r({target:"String",proto:!0,forced:n(112)("trim")},{trim:function(){return o(this)}})},function(e,t,n){"use strict";var r=n(0),o=n(52).end,i=n(112)("trimEnd"),a=i?function(){return o(this)}:"".trimEnd;r({target:"String",proto:!0,forced:i},{trimEnd:a,trimRight:a})},function(e,t,n){"use strict";var r=n(0),o=n(52).start,i=n(112)("trimStart"),a=i?function(){return o(this)}:"".trimStart;r({target:"String",proto:!0,forced:i},{trimStart:a,trimLeft:a})},function(e,t,n){"use strict";var r=n(0),o=n(23);r({target:"String",proto:!0,forced:n(24)("anchor")},{anchor:function(e){return o(this,"a","name",e)}})},function(e,t,n){"use strict";var r=n(0),o=n(23);r({target:"String",proto:!0,forced:n(24)("big")},{big:function(){return o(this,"big","","")}})},function(e,t,n){"use strict";var r=n(0),o=n(23);r({target:"String",proto:!0,forced:n(24)("blink")},{blink:function(){return o(this,"blink","","")}})},function(e,t,n){"use strict";var r=n(0),o=n(23);r({target:"String",proto:!0,forced:n(24)("bold")},{bold:function(){return o(this,"b","","")}})},function(e,t,n){"use strict";var r=n(0),o=n(23);r({target:"String",proto:!0,forced:n(24)("fixed")},{fixed:function(){return o(this,"tt","","")}})},function(e,t,n){"use strict";var r=n(0),o=n(23);r({target:"String",proto:!0,forced:n(24)("fontcolor")},{fontcolor:function(e){return o(this,"font","color",e)}})},function(e,t,n){"use strict";var r=n(0),o=n(23);r({target:"String",proto:!0,forced:n(24)("fontsize")},{fontsize:function(e){return o(this,"font","size",e)}})},function(e,t,n){"use strict";var r=n(0),o=n(23);r({target:"String",proto:!0,forced:n(24)("italics")},{italics:function(){return o(this,"i","","")}})},function(e,t,n){"use strict";var r=n(0),o=n(23);r({target:"String",proto:!0,forced:n(24)("link")},{link:function(e){return o(this,"a","href",e)}})},function(e,t,n){"use strict";var r=n(0),o=n(23);r({target:"String",proto:!0,forced:n(24)("small")},{small:function(){return o(this,"small","","")}})},function(e,t,n){"use strict";var r=n(0),o=n(23);r({target:"String",proto:!0,forced:n(24)("strike")},{strike:function(){return o(this,"strike","","")}})},function(e,t,n){"use strict";var r=n(0),o=n(23);r({target:"String",proto:!0,forced:n(24)("sub")},{sub:function(){return o(this,"sub","","")}})},function(e,t,n){"use strict";var r=n(0),o=n(23);r({target:"String",proto:!0,forced:n(24)("sup")},{sup:function(){return o(this,"sup","","")}})},function(e,t,n){"use strict";n(35)("Float32",(function(e){return function(t,n,r){return e(this,t,n,r)}}))},function(e,t,n){"use strict";var r=n(26);e.exports=function(e){var t=r(e);if(t<0)throw RangeError("The argument can't be less than 0");return t}},function(e,t,n){"use strict";n(35)("Float64",(function(e){return function(t,n,r){return e(this,t,n,r)}}))},function(e,t,n){"use strict";n(35)("Int8",(function(e){return function(t,n,r){return e(this,t,n,r)}}))},function(e,t,n){"use strict";n(35)("Int16",(function(e){return function(t,n,r){return e(this,t,n,r)}}))},function(e,t,n){"use strict";n(35)("Int32",(function(e){return function(t,n,r){return e(this,t,n,r)}}))},function(e,t,n){"use strict";n(35)("Uint8",(function(e){return function(t,n,r){return e(this,t,n,r)}}))},function(e,t,n){"use strict";n(35)("Uint8",(function(e){return function(t,n,r){return e(this,t,n,r)}}),!0)},function(e,t,n){"use strict";n(35)("Uint16",(function(e){return function(t,n,r){return e(this,t,n,r)}}))},function(e,t,n){"use strict";n(35)("Uint32",(function(e){return function(t,n,r){return e(this,t,n,r)}}))},function(e,t,n){"use strict";var r=n(7),o=n(134),i=r.aTypedArray;(0,r.exportTypedArrayMethod)("copyWithin",(function(e,t){return o.call(i(this),e,t,arguments.length>2?arguments[2]:undefined)}))},function(e,t,n){"use strict";var r=n(7),o=n(15).every,i=r.aTypedArray;(0,r.exportTypedArrayMethod)("every",(function(e){return o(i(this),e,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var r=n(7),o=n(95),i=r.aTypedArray;(0,r.exportTypedArrayMethod)("fill",(function(e){return o.apply(i(this),arguments)}))},function(e,t,n){"use strict";var r=n(7),o=n(15).filter,i=n(40),a=r.aTypedArray,c=r.aTypedArrayConstructor;(0,r.exportTypedArrayMethod)("filter",(function(e){for(var t=o(a(this),e,arguments.length>1?arguments[1]:undefined),n=i(this,this.constructor),r=0,u=t.length,s=new(c(n))(u);u>r;)s[r]=t[r++];return s}))},function(e,t,n){"use strict";var r=n(7),o=n(15).find,i=r.aTypedArray;(0,r.exportTypedArrayMethod)("find",(function(e){return o(i(this),e,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var r=n(7),o=n(15).findIndex,i=r.aTypedArray;(0,r.exportTypedArrayMethod)("findIndex",(function(e){return o(i(this),e,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var r=n(7),o=n(15).forEach,i=r.aTypedArray;(0,r.exportTypedArrayMethod)("forEach",(function(e){o(i(this),e,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var r=n(113);(0,n(7).exportTypedArrayStaticMethod)("from",n(157),r)},function(e,t,n){"use strict";var r=n(7),o=n(59).includes,i=r.aTypedArray;(0,r.exportTypedArrayMethod)("includes",(function(e){return o(i(this),e,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var r=n(7),o=n(59).indexOf,i=r.aTypedArray;(0,r.exportTypedArrayMethod)("indexOf",(function(e){return o(i(this),e,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var r=n(3),o=n(7),i=n(137),a=n(10)("iterator"),c=r.Uint8Array,u=i.values,s=i.keys,l=i.entries,f=o.aTypedArray,d=o.exportTypedArrayMethod,p=c&&c.prototype[a],h=!!p&&("values"==p.name||p.name==undefined),v=function(){return u.call(f(this))};d("entries",(function(){return l.call(f(this))})),d("keys",(function(){return s.call(f(this))})),d("values",v,!h),d(a,v,!h)},function(e,t,n){"use strict";var r=n(7),o=r.aTypedArray,i=r.exportTypedArrayMethod,a=[].join;i("join",(function(e){return a.apply(o(this),arguments)}))},function(e,t,n){"use strict";var r=n(7),o=n(140),i=r.aTypedArray;(0,r.exportTypedArrayMethod)("lastIndexOf",(function(e){return o.apply(i(this),arguments)}))},function(e,t,n){"use strict";var r=n(7),o=n(15).map,i=n(40),a=r.aTypedArray,c=r.aTypedArrayConstructor;(0,r.exportTypedArrayMethod)("map",(function(e){return o(a(this),e,arguments.length>1?arguments[1]:undefined,(function(e,t){return new(c(i(e,e.constructor)))(t)}))}))},function(e,t,n){"use strict";var r=n(7),o=n(113),i=r.aTypedArrayConstructor;(0,r.exportTypedArrayStaticMethod)("of",(function(){for(var e=0,t=arguments.length,n=new(i(this))(t);t>e;)n[e]=arguments[e++];return n}),o)},function(e,t,n){"use strict";var r=n(7),o=n(73).left,i=r.aTypedArray;(0,r.exportTypedArrayMethod)("reduce",(function(e){return o(i(this),e,arguments.length,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var r=n(7),o=n(73).right,i=r.aTypedArray;(0,r.exportTypedArrayMethod)("reduceRight",(function(e){return o(i(this),e,arguments.length,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var r=n(7),o=r.aTypedArray,i=r.exportTypedArrayMethod,a=Math.floor;i("reverse",(function(){for(var e,t=o(this).length,n=a(t/2),r=0;r1?arguments[1]:undefined,1),n=this.length,r=a(e),c=o(r.length),s=0;if(c+t>n)throw RangeError("Wrong length");for(;si;)l[i]=n[i++];return l}),i((function(){new Int8Array(1).slice()})))},function(e,t,n){"use strict";var r=n(7),o=n(15).some,i=r.aTypedArray;(0,r.exportTypedArrayMethod)("some",(function(e){return o(i(this),e,arguments.length>1?arguments[1]:undefined)}))},function(e,t,n){"use strict";var r=n(7),o=r.aTypedArray,i=r.exportTypedArrayMethod,a=[].sort;i("sort",(function(e){return a.call(o(this),e)}))},function(e,t,n){"use strict";var r=n(7),o=n(8),i=n(36),a=n(40),c=r.aTypedArray;(0,r.exportTypedArrayMethod)("subarray",(function(e,t){var n=c(this),r=n.length,u=i(e,r);return new(a(n,n.constructor))(n.buffer,n.byteOffset+u*n.BYTES_PER_ELEMENT,o((t===undefined?r:i(t,r))-u))}))},function(e,t,n){"use strict";var r=n(3),o=n(7),i=n(1),a=r.Int8Array,c=o.aTypedArray,u=o.exportTypedArrayMethod,s=[].toLocaleString,l=[].slice,f=!!a&&i((function(){s.call(new a(1))}));u("toLocaleString",(function(){return s.apply(f?l.call(c(this)):c(this),arguments)}),i((function(){return[1,2].toLocaleString()!=new a([1,2]).toLocaleString()}))||!i((function(){a.prototype.toLocaleString.call([1,2])})))},function(e,t,n){"use strict";var r=n(7).exportTypedArrayMethod,o=n(1),i=n(3).Uint8Array,a=i&&i.prototype||{},c=[].toString,u=[].join;o((function(){c.call({})}))&&(c=function(){return u.call(this)});var s=a.toString!=c;r("toString",c,s)},function(e,t,n){"use strict";var r,o=n(3),i=n(65),a=n(47),c=n(75),u=n(158),s=n(4),l=n(30).enforce,f=n(125),d=!o.ActiveXObject&&"ActiveXObject"in o,p=Object.isExtensible,h=function(e){return function(){return e(this,arguments.length?arguments[0]:undefined)}},v=e.exports=c("WeakMap",h,u);if(f&&d){r=u.getConstructor(h,"WeakMap",!0),a.REQUIRED=!0;var g=v.prototype,m=g["delete"],y=g.has,b=g.get,_=g.set;i(g,{"delete":function(e){if(s(e)&&!p(e)){var t=l(this);return t.frozen||(t.frozen=new r),m.call(this,e)||t.frozen["delete"](e)}return m.call(this,e)},has:function(e){if(s(e)&&!p(e)){var t=l(this);return t.frozen||(t.frozen=new r),y.call(this,e)||t.frozen.has(e)}return y.call(this,e)},get:function(e){if(s(e)&&!p(e)){var t=l(this);return t.frozen||(t.frozen=new r),y.call(this,e)?b.call(this,e):t.frozen.get(e)}return b.call(this,e)},set:function(e,t){if(s(e)&&!p(e)){var n=l(this);n.frozen||(n.frozen=new r),y.call(this,e)?_.call(this,e,t):n.frozen.set(e,t)}else _.call(this,e,t);return this}})}},function(e,t,n){"use strict";n(75)("WeakSet",(function(e){return function(){return e(this,arguments.length?arguments[0]:undefined)}}),n(158))},function(e,t,n){"use strict";var r=n(0),o=n(3),i=n(105);r({global:!0,bind:!0,enumerable:!0,forced:!o.setImmediate||!o.clearImmediate},{setImmediate:i.set,clearImmediate:i.clear})},function(e,t,n){"use strict";var r=n(0),o=n(3),i=n(151),a=n(28),c=o.process,u="process"==a(c);r({global:!0,enumerable:!0,noTargetGet:!0},{queueMicrotask:function(e){var t=u&&c.domain;i(t?t.bind(e):e)}})},function(e,t,n){"use strict";var r=n(0),o=n(3),i=n(70),a=[].slice,c=function(e){return function(t,n){var r=arguments.length>2,o=r?a.call(arguments,2):undefined;return e(r?function(){("function"==typeof t?t:Function(t)).apply(this,o)}:t,n)}};r({global:!0,bind:!0,forced:/MSIE .\./.test(i)},{setTimeout:c(o.setTimeout),setInterval:c(o.setInterval)})},function(e,t,n){"use strict";t.__esModule=!0,t._CI=Oe,t._HI=B,t._M=Ae,t._MCCC=Ve,t._ME=Te,t._MFCC=Le,t._MP=Se,t._MR=ye,t.__render=Fe,t.createComponentVNode=function(e,t,n,r,o){var a=new A(1,null,null,e=function(e,t){if(12&e)return e;if(t.prototype&&t.prototype.render)return 4;if(t.render)return 32776;return 8}(e,t),r,function(e,t,n){var r=(32768&e?t.render:t).defaultProps;if(i(r))return n;if(i(n))return l(r,null);return k(n,r)}(e,t,n),function(e,t,n){if(4&e)return n;var r=(32768&e?t.render:t).defaultHooks;if(i(r))return n;if(i(n))return r;return k(n,r)}(e,t,o),t);C.createVNode&&C.createVNode(a);return a},t.createFragment=M,t.createPortal=function(e,t){var n=B(e);return I(1024,1024,null,n,0,null,n.key,t)},t.createRef=function(){return{current:null}},t.createRenderer=function(e){return function(t,n,r,o){e||(e=t),De(n,e,r,o)}},t.createTextVNode=T,t.createVNode=I,t.directClone=V,t.findDOMfromVNode=b,t.forwardRef=function(e){return{render:e}},t.getFlagsForElementVnode=function(e){switch(e){case"svg":return 32;case"input":return 64;case"select":return 256;case"textarea":return 128;case"$F":return 8192;default:return 1}},t.linkEvent=function(e,t){if(c(t))return{data:e,event:t};return null},t.normalizeProps=function(e){var t=e.props;if(t){var n=e.flags;481&n&&(void 0!==t.children&&i(e.children)&&j(e,t.children),void 0!==t.className&&(e.className=t.className||null,t.className=undefined)),void 0!==t.key&&(e.key=t.key,t.key=undefined),void 0!==t.ref&&(e.ref=8&n?l(e.ref,t.ref):t.ref,t.ref=undefined)}return e},t.render=De,t.rerender=We,t.version=t.options=t.Fragment=t.EMPTY_OBJ=t.Component=void 0;var r=Array.isArray;function o(e){var t=typeof e;return"string"===t||"number"===t}function i(e){return null==e}function a(e){return null===e||!1===e||!0===e||void 0===e}function c(e){return"function"==typeof e}function u(e){return"string"==typeof e}function s(e){return null===e}function l(e,t){var n={};if(e)for(var r in e)n[r]=e[r];if(t)for(var o in t)n[o]=t[o];return n}function f(e){return!s(e)&&"object"==typeof e}var d={};t.EMPTY_OBJ=d;function p(e){return e.substr(2).toLowerCase()}function h(e,t){e.appendChild(t)}function v(e,t,n){s(n)?h(e,t):e.insertBefore(t,n)}function g(e,t){e.removeChild(t)}function m(e){for(var t=0;t0,h=s(d),v=u(d)&&"$"===d[0];p||h||v?(n=n||t.slice(0,l),(p||v)&&(f=V(f)),(h||v)&&(f.key="$"+l),n.push(f)):n&&n.push(f),f.flags|=65536}}i=0===(n=n||t).length?1:8}else(n=t).flags|=65536,81920&t.flags&&(n=V(t)),i=2;return e.children=n,e.childFlags=i,e}function B(e){return a(e)||o(e)?T(e,null):r(e)?M(e,0,null):16384&e.flags?V(e):e}var R="http://www.w3.org/1999/xlink",F="http://www.w3.org/XML/1998/namespace",D={"xlink:actuate":R,"xlink:arcrole":R,"xlink:href":R,"xlink:role":R,"xlink:show":R,"xlink:title":R,"xlink:type":R,"xml:base":F,"xml:lang":F,"xml:space":F};function K(e){return{onClick:e,onDblClick:e,onFocusIn:e,onFocusOut:e,onKeyDown:e,onKeyPress:e,onKeyUp:e,onMouseDown:e,onMouseMove:e,onMouseUp:e,onTouchEnd:e,onTouchMove:e,onTouchStart:e}}var z=K(0),U=K(null),Y=K(!0);function H(e,t){var n=t.$EV;return n||(n=t.$EV=K(null)),n[e]||1==++z[e]&&(U[e]=function(e){var t="onClick"===e||"onDblClick"===e?function(e){return function(t){0===t.button?$(t,!0,e,Q(t)):t.stopPropagation()}}(e):function(e){return function(t){$(t,!1,e,Q(t))}}(e);return document.addEventListener(p(e),t),t}(e)),n}function W(e,t){var n=t.$EV;n&&n[e]&&(0==--z[e]&&(document.removeEventListener(p(e),U[e]),U[e]=null),n[e]=null)}function $(e,t,n,r){var o=function(e){return c(e.composedPath)?e.composedPath()[0]:e.target}(e);do{if(t&&o.disabled)return;var i=o.$EV;if(i){var a=i[n];if(a&&(r.dom=o,a.event?a.event(a.data,e):a(e),e.cancelBubble))return}o=o.parentNode}while(!s(o))}function G(){this.cancelBubble=!0,this.immediatePropagationStopped||this.stopImmediatePropagation()}function q(){return this.defaultPrevented}function X(){return this.cancelBubble}function Q(e){var t={dom:document};return e.isDefaultPrevented=q,e.isPropagationStopped=X,e.stopPropagation=G,Object.defineProperty(e,"currentTarget",{configurable:!0,get:function(){return t.dom}}),t}function J(e,t,n){if(e[t]){var r=e[t];r.event?r.event(r.data,n):r(n)}else{var o=t.toLowerCase();e[o]&&e[o](n)}}function Z(e,t){var n=function(n){var r=this.$V;if(r){var o=r.props||d,i=r.dom;if(u(e))J(o,e,n);else for(var a=0;a-1&&t.options[a]&&(c=t.options[a].value),n&&i(c)&&(c=e.defaultValue),ae(r,c)}}var se,le,fe=Z("onInput",pe),de=Z("onChange");function pe(e,t,n){var r=e.value,o=t.value;if(i(r)){if(n){var a=e.defaultValue;i(a)||a===o||(t.defaultValue=a,t.value=a)}}else o!==r&&(t.defaultValue=r,t.value=r)}function he(e,t,n,r,o,i){64&e?ie(r,n):256&e?ue(r,n,o,t):128&e&&pe(r,n,o),i&&(n.$V=t)}function ve(e,t,n){64&e?function(e,t){te(t.type)?(ee(e,"change",re),ee(e,"click",oe)):ee(e,"input",ne)}(t,n):256&e?function(e){ee(e,"change",ce)}(t):128&e&&function(e,t){ee(e,"input",fe),t.onChange&&ee(e,"change",de)}(t,n)}function ge(e){return e.type&&te(e.type)?!i(e.checked):!i(e.value)}function me(e){e&&!O(e,null)&&e.current&&(e.current=null)}function ye(e,t,n){e&&(c(e)||void 0!==e.current)&&n.push((function(){O(e,t)||void 0===e.current||(e.current=t)}))}function be(e,t){_e(e),_(e,t)}function _e(e){var t,n=e.flags,r=e.children;if(481&n){t=e.ref;var o=e.props;me(t);var a=e.childFlags;if(!s(o))for(var u=Object.keys(o),l=0,f=u.length;l0;for(var c in a&&(i=ge(n))&&ve(t,r,n),n)Ne(c,null,n[c],r,o,i,null);a&&he(t,e,r,n,!0,i)}function ke(e,t,n){var r=B(e.render(t,e.state,n)),o=n;return c(e.getChildContext)&&(o=l(n,e.getChildContext())),e.$CX=o,r}function Oe(e,t,n,r,o,i){var a=new t(n,r),u=a.$N=Boolean(t.getDerivedStateFromProps||a.getSnapshotBeforeUpdate);if(a.$SVG=o,a.$L=i,e.children=a,a.$BS=!1,a.context=r,a.props===d&&(a.props=n),u)a.state=x(a,n,a.state);else if(c(a.componentWillMount)){a.$BR=!0,a.componentWillMount();var l=a.$PS;if(!s(l)){var f=a.state;if(s(f))a.state=l;else for(var p in l)f[p]=l[p];a.$PS=null}a.$BR=!1}return a.$LI=ke(a,n,r),a}function Ae(e,t,n,r,o,i){var a=e.flags|=16384;481&a?Te(e,t,n,r,o,i):4&a?function(e,t,n,r,o,i){var a=Oe(e,e.type,e.props||d,n,r,i);Ae(a.$LI,t,a.$CX,r,o,i),Ve(e.ref,a,i)}(e,t,n,r,o,i):8&a?(!function(e,t,n,r,o,i){Ae(e.children=B(function(e,t){return 32768&e.flags?e.type.render(e.props||d,e.ref,t):e.type(e.props||d,t)}(e,n)),t,n,r,o,i)}(e,t,n,r,o,i),Le(e,i)):512&a||16&a?Ie(e,t,o):8192&a?function(e,t,n,r,o,i){var a=e.children,c=e.childFlags;12&c&&0===a.length&&(c=e.childFlags=2,a=e.children=L());2===c?Ae(a,n,o,r,o,i):Me(a,n,t,r,o,i)}(e,n,t,r,o,i):1024&a&&function(e,t,n,r,o){Ae(e.children,e.ref,t,!1,null,o);var i=L();Ie(i,n,r),e.dom=i.dom}(e,n,t,o,i)}function Ie(e,t,n){var r=e.dom=document.createTextNode(e.children);s(t)||v(t,r,n)}function Te(e,t,n,r,o,a){var c=e.flags,u=e.props,l=e.className,f=e.children,d=e.childFlags,p=e.dom=function(e,t){return t?document.createElementNS("http://www.w3.org/2000/svg",e):document.createElement(e)}(e.type,r=r||(32&c)>0);if(i(l)||""===l||(r?p.setAttribute("class",l):p.className=l),16===d)N(p,f);else if(1!==d){var h=r&&"foreignObject"!==e.type;2===d?(16384&f.flags&&(e.children=f=V(f)),Ae(f,p,n,h,null,a)):8!==d&&4!==d||Me(f,p,n,h,null,a)}s(t)||v(t,p,o),s(u)||Se(e,c,u,p,r),ye(e.ref,p,a)}function Me(e,t,n,r,o,i){for(var a=0;a0,s!==l){var h=s||d;if((c=l||d)!==d)for(var v in(f=(448&o)>0)&&(p=ge(c)),c){var g=h[v],m=c[v];g!==m&&Ne(v,g,m,u,r,p,e)}if(h!==d)for(var y in h)i(c[y])&&!i(h[y])&&Ne(y,h[y],null,u,r,p,e)}var b=t.children,_=t.className;e.className!==_&&(i(_)?u.removeAttribute("class"):r?u.setAttribute("class",_):u.className=_);4096&o?function(e,t){e.textContent!==t&&(e.textContent=t)}(u,b):je(e.childFlags,t.childFlags,e.children,b,u,n,r&&"foreignObject"!==t.type,null,e,a);f&&he(o,t,u,c,!1,p);var w=t.ref,x=e.ref;x!==w&&(me(x),ye(w,u,a))}(e,t,r,o,p,f):4&p?function(e,t,n,r,o,i,a){var u=t.children=e.children;if(s(u))return;u.$L=a;var f=t.props||d,p=t.ref,h=e.ref,v=u.state;if(!u.$N){if(c(u.componentWillReceiveProps)){if(u.$BR=!0,u.componentWillReceiveProps(f,r),u.$UN)return;u.$BR=!1}s(u.$PS)||(v=l(v,u.$PS),u.$PS=null)}Be(u,v,f,n,r,o,!1,i,a),h!==p&&(me(h),ye(p,u,a))}(e,t,n,r,o,u,f):8&p?function(e,t,n,r,o,a,u){var s=!0,l=t.props||d,f=t.ref,p=e.props,h=!i(f),v=e.children;h&&c(f.onComponentShouldUpdate)&&(s=f.onComponentShouldUpdate(p,l));if(!1!==s){h&&c(f.onComponentWillUpdate)&&f.onComponentWillUpdate(p,l);var g=t.type,m=B(32768&t.flags?g.render(l,f,r):g(l,r));Pe(v,m,n,r,o,a,u),t.children=m,h&&c(f.onComponentDidUpdate)&&f.onComponentDidUpdate(p,l)}else t.children=v}(e,t,n,r,o,u,f):16&p?function(e,t){var n=t.children,r=t.dom=e.dom;n!==e.children&&(r.nodeValue=n)}(e,t):512&p?t.dom=e.dom:8192&p?function(e,t,n,r,o,i){var a=e.children,c=t.children,u=e.childFlags,s=t.childFlags,l=null;12&s&&0===c.length&&(s=t.childFlags=2,c=t.children=L());var f=0!=(2&s);if(12&u){var d=a.length;(8&u&&8&s||f||!f&&c.length>d)&&(l=b(a[d-1],!1).nextSibling)}je(u,s,a,c,n,r,o,l,e,i)}(e,t,n,r,o,f):function(e,t,n,r){var o=e.ref,i=t.ref,c=t.children;if(je(e.childFlags,t.childFlags,e.children,c,o,n,!1,null,e,r),t.dom=e.dom,o!==i&&!a(c)){var u=c.dom;g(o,u),h(i,u)}}(e,t,r,f)}function je(e,t,n,r,o,i,a,c,u,s){switch(e){case 2:switch(t){case 2:Pe(n,r,o,i,a,c,s);break;case 1:be(n,o);break;case 16:_e(n),N(o,r);break;default:!function(e,t,n,r,o,i){_e(e),Me(t,n,r,o,b(e,!0),i),_(e,n)}(n,r,o,i,a,s)}break;case 1:switch(t){case 2:Ae(r,o,i,a,c,s);break;case 1:break;case 16:N(o,r);break;default:Me(r,o,i,a,c,s)}break;case 16:switch(t){case 16:!function(e,t,n){e!==t&&(""!==e?n.firstChild.nodeValue=t:N(n,t))}(n,r,o);break;case 2:xe(o),Ae(r,o,i,a,c,s);break;case 1:xe(o);break;default:xe(o),Me(r,o,i,a,c,s)}break;default:switch(t){case 16:we(n),N(o,r);break;case 2:Ee(o,u,n),Ae(r,o,i,a,c,s);break;case 1:Ee(o,u,n);break;default:var l=0|n.length,f=0|r.length;0===l?f>0&&Me(r,o,i,a,c,s):0===f?Ee(o,u,n):8===t&&8===e?function(e,t,n,r,o,i,a,c,u,s){var l,f,d=i-1,p=a-1,h=0,v=e[h],g=t[h];e:{for(;v.key===g.key;){if(16384&g.flags&&(t[h]=g=V(g)),Pe(v,g,n,r,o,c,s),e[h]=g,++h>d||h>p)break e;v=e[h],g=t[h]}for(v=e[d],g=t[p];v.key===g.key;){if(16384&g.flags&&(t[p]=g=V(g)),Pe(v,g,n,r,o,c,s),e[d]=g,d--,p--,h>d||h>p)break e;v=e[d],g=t[p]}}if(h>d){if(h<=p)for(f=(l=p+1)p)for(;h<=d;)be(e[h++],n);else!function(e,t,n,r,o,i,a,c,u,s,l,f,d){var p,h,v,g=0,m=c,y=c,_=i-c+1,x=a-c+1,E=new Int32Array(x+1),C=_===r,N=!1,S=0,k=0;if(o<4||(_|x)<32)for(g=m;g<=i;++g)if(p=e[g],kc?N=!0:S=c,16384&h.flags&&(t[c]=h=V(h)),Pe(p,h,u,n,s,l,d),++k;break}!C&&c>a&&be(p,u)}else C||be(p,u);else{var O={};for(g=y;g<=a;++g)O[t[g].key]=g;for(g=m;g<=i;++g)if(p=e[g],km;)be(e[m++],u);E[c-y]=g+1,S>c?N=!0:S=c,16384&(h=t[c]).flags&&(t[c]=h=V(h)),Pe(p,h,u,n,s,l,d),++k}else C||be(p,u);else C||be(p,u)}if(C)Ee(u,f,e),Me(t,u,n,s,l,d);else if(N){var A=function(e){var t=0,n=0,r=0,o=0,i=0,a=0,c=0,u=e.length;u>Re&&(Re=u,se=new Int32Array(u),le=new Int32Array(u));for(;n>1]]0&&(le[n]=se[i-1]),se[i]=n)}i=o+1;var s=new Int32Array(i);a=se[i-1];for(;i-- >0;)s[i]=a,a=le[a],se[i]=0;return s}(E);for(c=A.length-1,g=x-1;g>=0;g--)0===E[g]?(16384&(h=t[S=g+y]).flags&&(t[S]=h=V(h)),Ae(h,u,n,s,(v=S+1)=0;g--)0===E[g]&&(16384&(h=t[S=g+y]).flags&&(t[S]=h=V(h)),Ae(h,u,n,s,(v=S+1)a?a:i,d=0;da)for(d=f;d=0;--o){var i=this.tryEntries[o],a=i.completion;if("root"===i.tryLoc)return r("end");if(i.tryLoc<=this.prev){var c=n.call(i,"catchLoc"),u=n.call(i,"finallyLoc");if(c&&u){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),w(n),s}},"catch":function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var o=r.arg;w(n)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:E(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),s}},e}(e.exports);try{regeneratorRuntime=r}catch(o){Function("r","regeneratorRuntime = r")(r)}},function(e,t,n){"use strict";!function(t,n){var r,o,i=t.html5||{},a=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,c=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,u=0,s={};function l(){var e=h.elements;return"string"==typeof e?e.split(" "):e}function f(e){var t=s[e._html5shiv];return t||(t={},u++,e._html5shiv=u,s[u]=t),t}function d(e,t,r){return t||(t=n),o?t.createElement(e):(r||(r=f(t)),!(i=r.cache[e]?r.cache[e].cloneNode():c.test(e)?(r.cache[e]=r.createElem(e)).cloneNode():r.createElem(e)).canHaveChildren||a.test(e)||i.tagUrn?i:r.frag.appendChild(i));var i}function p(e){e||(e=n);var t=f(e);return!h.shivCSS||r||t.hasCSS||(t.hasCSS=!!function(e,t){var n=e.createElement("p"),r=e.getElementsByTagName("head")[0]||e.documentElement;return n.innerHTML="x",r.insertBefore(n.lastChild,r.firstChild)}(e,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),o||function(e,t){t.cache||(t.cache={},t.createElem=e.createElement,t.createFrag=e.createDocumentFragment,t.frag=t.createFrag()),e.createElement=function(n){return h.shivMethods?d(n,e,t):t.createElem(n)},e.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+l().join().replace(/[\w\-:]+/g,(function(e){return t.createElem(e),t.frag.createElement(e),'c("'+e+'")'}))+");return n}")(h,t.frag)}(e,t),e}!function(){try{var e=n.createElement("a");e.innerHTML="",r="hidden"in e,o=1==e.childNodes.length||function(){n.createElement("a");var e=n.createDocumentFragment();return"undefined"==typeof e.cloneNode||"undefined"==typeof e.createDocumentFragment||"undefined"==typeof e.createElement}()}catch(t){r=!0,o=!0}}();var h={elements:i.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:"3.7.3",shivCSS:!1!==i.shivCSS,supportsUnknownElements:o,shivMethods:!1!==i.shivMethods,type:"default",shivDocument:p,createElement:d,createDocumentFragment:function(e,t){if(e||(e=n),o)return e.createDocumentFragment();for(var r=(t=t||f(e)).frag.cloneNode(),i=0,a=l(),c=a.length;i0?o(r(e),9007199254740991):0}},function(e,t,n){"use strict";t.__esModule=!0,t.isFalsy=t.pureComponentHooks=t.shallowDiffers=t.normalizeChildren=t.classes=void 0;t.classes=function(e){for(var t="",n=0;n0&&(t.style=c),t};t.computeBoxProps=g;var m=function(e){var t=e.textColor||e.color,n=e.backgroundColor;return(0,r.classes)([s(t)&&"color-"+t,s(n)&&"color-bg-"+n])};t.computeBoxClassName=m;var y=function(e){var t=e.as,n=void 0===t?"div":t,r=e.className,a=e.children,u=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(e,["as","className","children"]);if("function"==typeof a)return a(g(e));var c="string"==typeof r?r+" "+m(u):m(u),s=g(u);return(0,o.createVNode)(i.VNodeFlags.HtmlElement,n,c,a,i.ChildFlags.UnknownChildren,s)};t.Box=y,y.defaultHooks=r.pureComponentHooks},function(e,t,n){"use strict";var r={}.hasOwnProperty;e.exports=function(e,t){return r.call(e,t)}},function(e,t,n){"use strict";var r=n(44),o=n(55),i=n(12),a=n(8),u=n(61),c=[].push,s=function(e){var t=1==e,n=2==e,s=3==e,l=4==e,f=6==e,d=5==e||f;return function(p,h,v,g){for(var m,y,b=i(p),_=o(b),w=r(h,v,3),x=a(_.length),E=0,C=g||u,S=t?C(p,x):n?C(p,0):undefined;x>E;E++)if((d||E in _)&&(y=w(m=_[E],E,b),e))if(t)S[E]=y;else if(y)switch(e){case 3:return!0;case 5:return m;case 6:return E;case 2:c.call(S,m)}else if(l)return!1;return f?-1:s||l?l:S}};e.exports={forEach:s(0),map:s(1),filter:s(2),some:s(3),every:s(4),find:s(5),findIndex:s(6)}},function(e,t,n){"use strict";var r=n(5),o=n(68),i=n(42),a=n(20),u=n(28),c=n(14),s=n(124),l=Object.getOwnPropertyDescriptor;t.f=r?l:function(e,t){if(e=a(e),t=u(t,!0),s)try{return l(e,t)}catch(n){}if(c(e,t))return i(!o.f.call(e,t),e[t])}},function(e,t,n){"use strict";e.exports=function(e){if(e==undefined)throw TypeError("Can't call method on "+e);return e}},function(e,t,n){"use strict";var r=n(3),o=n(24),i=n(14),a=n(88),u=n(89),c=n(29),s=c.get,l=c.enforce,f=String(String).split("String");(e.exports=function(e,t,n,u){var c=!!u&&!!u.unsafe,s=!!u&&!!u.enumerable,d=!!u&&!!u.noTargetGet;"function"==typeof n&&("string"!=typeof t||i(n,"name")||o(n,"name",t),l(n).source=f.join("string"==typeof t?t:"")),e!==r?(c?!d&&e[t]&&(s=!0):delete e[t],s?e[t]=n:o(e,t,n)):s?e[t]=n:a(t,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&s(this).source||u(this)}))},function(e,t,n){"use strict";var r=n(5),o=n(1),i=n(14),a=Object.defineProperty,u={},c=function(e){throw e};e.exports=function(e,t){if(i(u,e))return u[e];t||(t={});var n=[][e],s=!!i(t,"ACCESSORS")&&t.ACCESSORS,l=i(t,0)?t[0]:c,f=i(t,1)?t[1]:undefined;return u[e]=!!n&&!o((function(){if(s&&!r)return!0;var e={length:-1};s?a(e,1,{enumerable:!0,get:c}):e[1]=1,n.call(e,l,f)}))}},function(e,t,n){"use strict";var r=n(55),o=n(17);e.exports=function(e){return r(o(e))}},function(e,t,n){"use strict";var r=n(128),o=n(14),i=n(134),a=n(11).f;e.exports=function(e){var t=r.Symbol||(r.Symbol={});o(t,e)||a(t,e,{value:i.f(e)})}},function(e,t,n){"use strict";var r=n(17),o=/"/g;e.exports=function(e,t,n,i){var a=String(r(e)),u="<"+t;return""!==n&&(u+=" "+n+'="'+String(i).replace(o,""")+'"'),u+">"+a+""}},function(e,t,n){"use strict";var r=n(1);e.exports=function(e){return r((function(){var t=""[e]('"');return t!==t.toLowerCase()||t.split('"').length>3}))}},function(e,t,n){"use strict";var r=n(5),o=n(11),i=n(42);e.exports=r?function(e,t,n){return o.f(e,t,i(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){"use strict";var r=Math.ceil,o=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?o:r)(e)}},function(e,t,n){"use strict";e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},function(e,t,n){"use strict";var r={}.toString;e.exports=function(e){return r.call(e).slice(8,-1)}},function(e,t,n){"use strict";var r=n(4);e.exports=function(e,t){if(!r(e))return e;var n,o;if(t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;if("function"==typeof(n=e.valueOf)&&!r(o=n.call(e)))return o;if(!t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;throw TypeError("Can't convert object to primitive value")}},function(e,t,n){"use strict";var r,o,i,a=n(126),u=n(3),c=n(4),s=n(24),l=n(14),f=n(69),d=n(57),p=u.WeakMap;if(a){var h=new p,v=h.get,g=h.has,m=h.set;r=function(e,t){return m.call(h,e,t),t},o=function(e){return v.call(h,e)||{}},i=function(e){return g.call(h,e)}}else{var y=f("state");d[y]=!0,r=function(e,t){return s(e,y,t),t},o=function(e){return l(e,y)?e[y]:{}},i=function(e){return l(e,y)}}e.exports={set:r,get:o,has:i,enforce:function(e){return i(e)?o(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!c(t)||(n=o(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}}},function(e,t,n){"use strict";var r=n(14),o=n(12),i=n(69),a=n(101),u=i("IE_PROTO"),c=Object.prototype;e.exports=a?Object.getPrototypeOf:function(e){return e=o(e),r(e,u)?e[u]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?c:null}},function(e,t,n){"use strict";var r=n(128),o=n(3),i=function(e){return"function"==typeof e?e:undefined};e.exports=function(e,t){return arguments.length<2?i(r[e])||i(o[e]):r[e]&&r[e][t]||o[e]&&o[e][t]}},function(e,t,n){"use strict";e.exports=!1},function(e,t,n){"use strict";var r=n(1);e.exports=function(e,t){var n=[][e];return!!n&&r((function(){n.call(null,t||function(){throw 1},1)}))}},function(e,t,n){"use strict";var r=n(0),o=n(3),i=n(5),a=n(114),u=n(7),c=n(74),s=n(51),l=n(42),f=n(24),d=n(8),p=n(142),h=n(157),v=n(28),g=n(14),m=n(71),y=n(4),b=n(38),_=n(46),w=n(43).f,x=n(158),E=n(15).forEach,C=n(50),S=n(11),N=n(16),k=n(29),O=n(76),T=k.get,I=k.set,A=S.f,M=N.f,V=Math.round,L=o.RangeError,j=c.ArrayBuffer,P=c.DataView,B=u.NATIVE_ARRAY_BUFFER_VIEWS,F=u.TYPED_ARRAY_TAG,D=u.TypedArray,R=u.TypedArrayPrototype,K=u.aTypedArrayConstructor,z=u.isTypedArray,Y=function(e,t){for(var n=0,r=t.length,o=new(K(e))(r);r>n;)o[n]=t[n++];return o},U=function(e,t){A(e,t,{get:function(){return T(this)[t]}})},W=function(e){var t;return e instanceof j||"ArrayBuffer"==(t=m(e))||"SharedArrayBuffer"==t},H=function(e,t){return z(e)&&"symbol"!=typeof t&&t in e&&String(+t)==String(t)},$=function(e,t){return H(e,t=v(t,!0))?l(2,e[t]):M(e,t)},G=function(e,t,n){return!(H(e,t=v(t,!0))&&y(n)&&g(n,"value"))||g(n,"get")||g(n,"set")||n.configurable||g(n,"writable")&&!n.writable||g(n,"enumerable")&&!n.enumerable?A(e,t,n):(e[t]=n.value,e)};i?(B||(N.f=$,S.f=G,U(R,"buffer"),U(R,"byteOffset"),U(R,"byteLength"),U(R,"length")),r({target:"Object",stat:!0,forced:!B},{getOwnPropertyDescriptor:$,defineProperty:G}),e.exports=function(e,t,n){var i=e.match(/\d+$/)[0]/8,u=e+(n?"Clamped":"")+"Array",c="get"+e,l="set"+e,v=o[u],g=v,m=g&&g.prototype,S={},N=function(e,t){A(e,t,{get:function(){return function(e,t){var n=T(e);return n.view[c](t*i+n.byteOffset,!0)}(this,t)},set:function(e){return function(e,t,r){var o=T(e);n&&(r=(r=V(r))<0?0:r>255?255:255&r),o.view[l](t*i+o.byteOffset,r,!0)}(this,t,e)},enumerable:!0})};B?a&&(g=t((function(e,t,n,r){return s(e,g,u),O(y(t)?W(t)?r!==undefined?new v(t,h(n,i),r):n!==undefined?new v(t,h(n,i)):new v(t):z(t)?Y(g,t):x.call(g,t):new v(p(t)),e,g)})),_&&_(g,D),E(w(v),(function(e){e in g||f(g,e,v[e])})),g.prototype=m):(g=t((function(e,t,n,r){s(e,g,u);var o,a,c,l=0,f=0;if(y(t)){if(!W(t))return z(t)?Y(g,t):x.call(g,t);o=t,f=h(n,i);var v=t.byteLength;if(r===undefined){if(v%i)throw L("Wrong length");if((a=v-f)<0)throw L("Wrong length")}else if((a=d(r)*i)+f>v)throw L("Wrong length");c=a/i}else c=p(t),o=new j(a=c*i);for(I(e,{buffer:o,byteOffset:f,byteLength:a,length:c,view:new P(o)});l2?n-2:0),o=2;o=i){var a=[t].concat(r).map((function(e){return"string"==typeof e?e:e instanceof Error?e.stack||String(e):JSON.stringify(e)})).filter((function(e){return e})).join(" ")+"\nUser Agent: "+navigator.userAgent;Byond.topic({tgui:1,window_id:window.__windowId__,type:"log",message:a})}},s=function(e){return{debug:function(){for(var t=arguments.length,n=new Array(t),o=0;o=0||(o[n]=e[n]);return o}(t,["payload"]),o=Object.assign({tgui:1,window_id:window.__windowId__},r);null!==n&&n!==undefined&&(o.payload=JSON.stringify(n)),Byond.topic(o)};t.sendMessage=s;var l=function(e,t){void 0===t&&(t={}),"object"!=typeof t||null===t||Array.isArray(t)?a.error("Payload for act() must be an object, got this:",t):s({type:"act/"+e,payload:t})};t.sendAct=l;var f=function(e){return e.backend||{}};t.selectBackend=f;t.useBackend=function(e){var t=e.store,n=f(t.getState());return Object.assign({},n,{act:l})};t.useLocalState=function(e,t,n){var r,o=e.store,i=null!=(r=f(o.getState()).shared)?r:{},a=t in i?i[t]:n;return[a,function(e){o.dispatch(u(t,"function"==typeof e?e(a):e))}]};t.useSharedState=function(e,t,n){var r,o=e.store,i=null!=(r=f(o.getState()).shared)?r:{},a=t in i?i[t]:n;return[a,function(e){s({type:"setSharedState",key:t,value:JSON.stringify("function"==typeof e?e(a):e)||""})}]}}).call(this,n(405).setImmediate)},function(e,t,n){"use strict";var r=n(25),o=Math.max,i=Math.min;e.exports=function(e,t){var n=r(e);return n<0?o(n+t,0):i(n,t)}},function(e,t,n){"use strict";var r,o=n(6),i=n(131),a=n(92),u=n(57),c=n(132),s=n(87),l=n(69),f=l("IE_PROTO"),d=function(){},p=function(e){return" @@ -161,7 +263,7 @@ A fatal exception has occurred at 002B:C562F1B7 in TGUI. The current application will be terminated. Please remain calm. Get to the nearest NTNet workstation and send the copy of the following stack trace to: -https://github.com/ParadiseSS13/Paradise. Thank you for your cooperation. +www.github.com/tgstation/tgstation. Thank you for your cooperation.