diff --git a/.luacheckrc b/.luacheckrc index a4fc9659..23895768 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -56,7 +56,7 @@ local STD_BASE_CONTROL = 'lua52c+factorio+factorio_control+factorio_defines+fact --[Assume Factorio Control stage as default]-- ------------------------------------------------------------------------------- std = STD_CONTROL -globals = {'math', 'table', '_DEBUG', '_CHEATS', 'MARKET_ITEM'} -- RedMew-specific globals +globals = {'print', 'math', 'table', '_DEBUG', '_CHEATS', 'MARKET_ITEM', 'ServerCommands'} -- RedMew-specific globals max_line_length = LINE_LENGTH not_globals = NOT_GLOBALS @@ -625,7 +625,7 @@ stds.factorio_defines = { "on_gui_closed", "on_gui_value_changed", "on_player_muted", "on_player_unmuted", "on_player_cheat_mode_enabled", "on_player_cheat_mode_disabled", "on_character_corpse_expired", "on_pre_ghost_deconstructed", "on_player_pipette", "on_player_display_resolution_changed", "on_player_display_scale_changed", "on_pre_player_crafted_item", "on_player_cancelled_crafting", "on_chunk_charted", "on_technology_effects_reset", "on_land_mine_armed", "on_forces_merged", - "on_player_trash_inventory_changed", + "on_player_trash_inventory_changed", "on_server_started" }, }, alert_type = { diff --git a/control.lua b/control.lua index d41b1700..1657b6a1 100644 --- a/control.lua +++ b/control.lua @@ -7,6 +7,10 @@ require 'utils.math' require 'map_gen.shared.perlin_noise' require 'map_layout' +-- Specific to RedMew hosts, can be disabled safely if not hosting on RedMew servers +require 'features.server' +require 'features.server_commands' + -- Library modules which, if missing, will cause other feature modules to fail require 'features.base_data' --require 'features.follow' -- Nothing currently uses anything inside follow diff --git a/features/donator_messages.lua b/features/donator_messages.lua index 288448ed..42e9bf43 100644 --- a/features/donator_messages.lua +++ b/features/donator_messages.lua @@ -1,6 +1,6 @@ local Game = require 'utils.game' local Event = require 'utils.event' -local Donators = require 'resources.donators' +local UserGroups = require 'features.user_groups' local function player_joined(event) local player = Game.get_player_by_index(event.player_index) @@ -8,7 +8,7 @@ local function player_joined(event) return end - local message = Donators.welcome_messages[player.name] + local message = UserGroups.get_donator_welcome_message(player.name) if not message then return end diff --git a/features/gui/poll.lua b/features/gui/poll.lua index 71063a7c..ed8c1723 100644 --- a/features/gui/poll.lua +++ b/features/gui/poll.lua @@ -5,6 +5,7 @@ local UserGroups = require 'features.user_groups' local Game = require 'utils.game' local math = require 'utils.math' local Utils = require 'utils.utils' +local Server = require 'features.server' local default_poll_duration = 300 * 60 -- in ticks local duration_max = 3600 -- in seconds @@ -108,6 +109,48 @@ local function do_remaining_time(poll, remaining_time_label) end end +local function send_poll_result_to_discord(poll) + local result = {'Poll #', poll.id} + + local created_by_player = poll.created_by + if created_by_player and created_by_player.valid then + table.insert(result, ' Created by ') + table.insert(result, created_by_player.name) + end + + local edited_by_players = poll.edited_by + if next(edited_by_players) then + table.insert(result, ' Edited by ') + for pi, _ in pairs(edited_by_players) do + local p = game.players[pi] + if p and p.valid then + table.insert(result, p.name) + table.insert(result, ', ') + end + end + table.remove(result) + end + + table.insert(result, '\\n**Question: ') + table.insert(result, poll.question) + table.insert(result, '**\\n') + + local answers = poll.answers + local answers_count = #answers + for i, a in ipairs(answers) do + table.insert(result, '[') + table.insert(result, a.voted_count) + table.insert(result, '] - ') + table.insert(result, a.text) + if i ~= answers_count then + table.insert(result, '\\n') + end + end + + local message = table.concat(result) + Server.to_discord_embed(message) +end + local function redraw_poll_viewer_content(data) local poll_viewer_content = data.poll_viewer_content local remaining_time_label = data.remaining_time_label @@ -657,6 +700,7 @@ local function create_poll(event) table.insert(polls, poll_data) show_new_poll(poll_data) + send_poll_result_to_discord(poll_data) Gui.remove_data_recursivly(frame) frame.destroy() @@ -1199,6 +1243,7 @@ function Class.poll(data) table.insert(polls, poll_data) show_new_poll(poll_data) + send_poll_result_to_discord(poll_data) return true, id end @@ -1273,6 +1318,23 @@ local function poll_result_command(cmd) Game.player_print(result) end +function Class.send_poll_result_to_discord(id) + if type(id) ~= 'number' then + Server.to_discord_embed('poll-id must be a number') + return + end + + for _, poll_data in ipairs(polls) do + if poll_data.id == id then + send_poll_result_to_discord(poll_data) + return + end + end + + local message = table.concat {'poll #', id, ' not found'} + Server.to_discord_embed(message) +end + commands.add_command( 'poll', '<{question = "question", answers = {"answer 1", "answer 2"}, duration = 300 | nil}> - Creates a new poll (Admin and regulars only).', diff --git a/features/server.lua b/features/server.lua new file mode 100644 index 00000000..fe38fba4 --- /dev/null +++ b/features/server.lua @@ -0,0 +1,349 @@ +--- See documentation at https://github.com/Refactorio/RedMew/pull/469 + +local Token = require 'utils.global_token' + +local Public = {} + +local raw_print = print +function print(str) + raw_print('[PRINT] ' .. str) +end + +local discord_tag = '[DISCORD]' +local discord_raw_tag = '[DISCORD-RAW]' +local discord_bold_tag = '[DISCORD-BOLD]' +local discord_admin_tag = '[DISCORD-ADMIN]' +local discord_admin_raw_tag = '[DISCORD-ADMIN-RAW]' +local discord_embed_tag = '[DISCORD-EMBED]' +local discord_embed_raw_tag = '[DISCORD-EMBED-RAW]' +local discord_admin_embed_tag = '[DISCORD-ADMIN-EMBED]' +local discord_admin_embed_raw_tag = '[DISCORD-ADMIN-EMBED-RAW]' +local start_scenario_tag = '[START-SCENARIO]' +local ping_tag = '[PING]' +local data_set_tag = '[DATA-SET]' +local data_get_tag = '[DATA-GET]' +local data_get_all_tag = '[DATA-GET-ALL]' +local data_tracked_tag = '[DATA-TRACKED]' + +Public.raw_print = raw_print + +local data_set_handlers = {} + +--- The event id for the on_server_started event. +-- The event is raised whenever the server goes from the starting state to the running state. +-- It provides a good opportunity to request data from the web server. +-- Note that if the server is stopped then started again, this event will be raised again. +-- @usage +-- Event.add(Server.events.on_server_started, +-- function() +-- Server.try_get_all_data('regulars', callback) +-- end) +Public.events = {on_server_started = script.generate_event_name()} + +--- Sends a message to the linked discord channel. The message is sanitized of markdown server side. +-- @param message message to send. +-- @usage +-- local Server = require 'server' +-- Server.to_discord('Hello from scenario script!') +function Public.to_discord(message) + raw_print(discord_tag .. message) +end + +--- Sends a message to the linked discord channel. The message is not sanitized of markdown. +-- @param message message to send. +function Public.to_discord_raw(message) + raw_print(discord_raw_tag .. message) +end + +--- Sends a message to the linked discord channel. The message is sanitized of markdown server side, then made bold. +-- @param message message to send. +function Public.to_discord_bold(message) + raw_print(discord_bold_tag .. message) +end + +--- Sends a message to the linked admin discord channel. The message is sanitized of markdown server side. +-- @param message message to send. +function Public.to_admin(message) + raw_print(discord_admin_tag .. message) +end + +--- Sends a message to the linked admin discord channel. The message is not sanitized of markdown. +-- @param message message to send. +function Public.to_admin_raw(message) + raw_print(discord_admin_raw_tag .. message) +end + +--- Sends a embed message to the linked discord channel. The message is sanitized of markdown server side. +-- @param message the content of the embed. +function Public.to_discord_embed(message) + raw_print(discord_embed_tag .. message) +end + +--- Sends a embed message to the linked discord channel. The message is not sanitized of markdown. +-- @param message the content of the embed. +function Public.to_discord_embed_raw(message) + raw_print(discord_embed_raw_tag .. message) +end + +--- Sends a embed message to the linked admin discord channel. The message is sanitized of markdown server side. +-- @param message the content of the embed. +function Public.to_admin_embed(message) + raw_print(discord_admin_embed_tag .. message) +end + +--- Sends a embed message to the linked admin discord channel. The message is not sanitized of markdown. +-- @param message the content of the embed. +function Public.to_admin_embed_raw(message) + raw_print(discord_admin_embed_raw_tag .. message) +end + +--- Stops and saves the factorio server and starts the named scenario. +-- @param scenario_name The name of the scenario as appears in the scenario table on http://redmew.com/admin +-- @usage +-- local Server = require 'server' +-- Server.start_scenario('my_scenario_name') +function Public.start_scenario(scenario_name) + if type(scenario_name) ~= 'string' then + game.print('start_scenario - scenario_name ' .. tostring(scenario_name) .. ' must be a string.') + return + end + + local message = start_scenario_tag .. scenario_name + + raw_print(message) +end + +local default_ping_token = + Token.register( + function(sent_tick) + local now = game.tick + local diff = now - sent_tick + + local message = table.concat({'Pong in ', diff, ' tick(s) ', 'sent tick: ', sent_tick, ' received tick: ', now}) + game.print(message) + end +) + +--- Pings the web server. +-- @param func_token The function that is called when the web server replies. +-- The function is passed the tick that the ping was sent. +function Public.ping(func_token) + local message = table.concat({ping_tag, func_token or default_ping_token, ' ', game.tick}) + raw_print(message) +end + +--- Sets the web server's persistent data storage. If you pass nil for the value removes the data. +-- Data set this will by synced in with other server if they choose to. +-- There can only be one key for each data_set. +-- @param data_set +-- @param key +-- @param value Any type that is not a function. set to nil to remove the data. +-- @usage +-- local Server = require 'server' +-- Server.set_data('my data set', 'key 1', 123) +-- Server.set_data('my data set', 'key 2', 'abc') +-- Server.set_data('my data set', 'key 3', {'some', 'data', ['is_set'] = true}) +-- +-- Server.set_data('my data set', 'key 1', nil) -- this will remove 'key 1' +-- Server.set_data('my data set', 'key 2', 'def') -- this will change the value for 'key 2' to 'def' +function Public.set_data(data_set, key, value) + if type(data_set) ~= 'string' then + error('data_set must be a string') + end + if type(key) ~= 'string' then + error('key must be a string') + end + + -- Excessive escaping because the data is serialized twice. + data_set = data_set:gsub('\\', '\\\\\\\\'):gsub('"', '\\\\\\"') + key = key:gsub('\\', '\\\\\\\\'):gsub('"', '\\\\\\"') + + local message + local vt = type(value) + if vt == 'nil' then + message = table.concat({data_set_tag, '{data_set:"', data_set, '",key:"', key, '"}'}) + elseif vt == 'string' then + -- Excessive escaping because the data is serialized twice. + value = value:gsub('\\', '\\\\\\\\'):gsub('"', '\\\\\\"') + + message = table.concat({data_set_tag, '{data_set:"', data_set, '",key:"', key, '",value:"\\"', value, '\\""}'}) + elseif vt == 'number' then + message = table.concat({data_set_tag, '{data_set:"', data_set, '",key:"', key, '",value:"', value, '"}'}) + elseif vt == 'boolean' then + message = + table.concat({data_set_tag, '{data_set:"', data_set, '",key:"', key, '",value:"', tostring(value), '"}'}) + elseif vt == 'function' then + error('value cannot be a function') + else -- table + value = serpent.line(value) + + -- Less escaping than the string case as serpent provides one level of escaping. + -- Need to escape single quotes as serpent uses double quotes for strings. + value = value:gsub('\\', '\\\\'):gsub("'", "\\'") + + message = table.concat({data_set_tag, '{data_set:"', data_set, '",key:"', key, "\",value:'", value, "'}"}) + end + + raw_print(message) +end + +--- Gets data from the web server's persistent data storage. +-- The callback is passed a table {data_set: string, key: string, value: any}. +-- If the value is nil, it means there is no stored data for that data_set key pair. +-- @param data_set +-- @param key +-- @param callback_token +-- @usage +-- local Server = require 'server' +-- local Token = require 'utils.global_token' +-- +-- local callback = +-- Token.register( +-- function(data) +-- local data_set = data.data_set +-- local key = data.key +-- local value = data.value -- will be nil if no data +-- +-- game.print(data_set .. ':' .. key .. ':' .. tostring(value)) +-- end +-- ) +-- +-- Server.try_get_data('my data set', 'key 1', callback) +function Public.try_get_data(data_set, key, callback_token) + if type(data_set) ~= 'string' then + error('data_set must be a string') + end + if type(key) ~= 'string' then + error('key must be a string') + end + if type(callback_token) ~= 'number' then + error('callback_token must be a number') + end + + -- Excessive escaping because the data is serialized twice. + data_set = data_set:gsub('\\', '\\\\\\\\'):gsub('"', '\\\\\\"') + key = key:gsub('\\', '\\\\\\\\'):gsub('"', '\\\\\\"') + + local message = table.concat {data_get_tag, callback_token, ' {', 'data_set:"', data_set, '",key:"', key, '"}'} + raw_print(message) +end + +--- Gets all the data for the data_set from the web server's persistent data storage. +-- The callback is passed a table {data_set: string, entries: {dictionary key -> value}}. +-- If there is no data stored for the data_set entries will be nil. +-- @param data_set +-- @param callback_token +-- @usage +-- local Server = require 'server' +-- local Token = require 'utils.global_token' +-- +-- local callback = +-- Token.register( +-- function(data) +-- local data_set = data.data_set +-- local entries = data.entries -- will be nil if no data +-- local value2 = entries['key 2'] +-- local value3 = entries['key 3'] +-- end +-- ) +-- +-- Server.try_get_all_data('my data set', callback) +function Public.try_get_all_data(data_set, callback_token) + if type(data_set) ~= 'string' then + error('data_set must be a string') + end + if type(callback_token) ~= 'number' then + error('callback_token must be a number') + end + + -- Excessive escaping because the data is serialized twice. + data_set = data_set:gsub('\\', '\\\\\\\\'):gsub('"', '\\\\\\"') + + local message = table.concat {data_get_all_tag, callback_token, ' {', 'data_set:"', data_set, '"}'} + raw_print(message) +end + +local function data_set_changed(data) + local handlers = data_set_handlers[data.data_set] + if handlers == nil then + return + end + + if _DEBUG then + for _, handler in ipairs(handlers) do + local success, err = pcall(handler, data) + if not success then + log(err) + error(err) + end + end + else + for _, handler in ipairs(handlers) do + local success, err = pcall(handler, data) + if not success then + log(err) + end + end + end +end + +--- Register a handler to be called when the data_set changes. +-- The handler is passed a table {data_set:string, key:string, value:any} +-- If value is nil that means the key was removed. +-- The handler may be called even if the value hasn't changed. It's up to the implementer +-- to determine if the value has changed, or not care. +-- To prevent desyncs the same handlers must be registered for all clients. The easiest way to do this +-- is in the control stage, i.e before on_init or on_load would be called. +-- @param data_set +-- @param handler +-- @usage +-- local Server = require 'server' +-- Server.on_data_set_changed( +-- 'my data set', +-- function(data) +-- local data_set = data.data_set +-- local key = data.key +-- local value = data.value -- will be nil if data was removed. +-- end +-- ) +function Public.on_data_set_changed(data_set, handler) + if type(data_set) ~= 'string' then + error('data_set must be a string') + end + + local handlers = data_set_handlers[data_set] + if handlers == nil then + handlers = {handler} + data_set_handlers[data_set] = handlers + else + table.insert(handlers, handler) + end +end + +Public.raise_data_set = data_set_changed + +--- Called by the web server to determine which data_sets are being tracked. +function Public.get_tracked_data_sets() + local message = {data_tracked_tag, '['} + + for k, _ in pairs(data_set_handlers) do + -- Excessive escaping because the data is serialized twice. + k = k:gsub('\\', '\\\\\\\\'):gsub('"', '\\\\\\"') + + table.insert(message, '"') + table.insert(message, k) + table.insert(message, '"') + table.insert(message, ',') + end + + if message[#message] == ',' then + table.remove(message) + end + + table.insert(message, ']') + + message = table.concat(message) + raw_print(message) +end + +return Public diff --git a/features/server_commands.lua b/features/server_commands.lua new file mode 100644 index 00000000..3a34e076 --- /dev/null +++ b/features/server_commands.lua @@ -0,0 +1,28 @@ +local Poll = require 'features.gui.poll' +local UserGroups = require 'features.user_groups' +local Token = require 'utils.global_token' +local Server = require 'features.server' + +--- This module is for the web server to call functions and raise events. +-- Not intended to be called by scripts. +-- Needs to be in the _G table so it can be accessed by the web server. +ServerCommands = {} + +ServerCommands.get_poll_result = Poll.send_poll_result_to_discord + +ServerCommands.regular_sync = UserGroups.sync_regulars +ServerCommands.donator_sync = UserGroups.sync_donators + +function ServerCommands.raise_callback(func_token, data) + local func = Token.get(func_token) + func(data) +end + +ServerCommands.raise_data_set = Server.raise_data_set +ServerCommands.get_tracked_data_sets = Server.get_tracked_data_sets + +function ServerCommands.server_started() + script.raise_event(Server.events.on_server_started, {}) +end + +return ServerCommands diff --git a/features/user_groups.lua b/features/user_groups.lua index 804d8f63..9a7f5796 100644 --- a/features/user_groups.lua +++ b/features/user_groups.lua @@ -1,62 +1,63 @@ -global.regulars = require 'resources.regulars' -local Donators = require 'resources.donators' -global.donators = Donators.donators local Event = require 'utils.event' local Utils = require 'utils.utils' +local Server = require 'features.server' +local Donators = require 'resources.donators' local Game = require 'utils.game' +local Token = require 'utils.global_token' + +global.regulars = {} +global.donators = Donators.donators local Module = {} -local function update_file() - local data = {'{\n'} - for player_name, _ in pairs(global.regulars) do - table.insert(data, "['") - table.insert(data, player_name) - table.insert(data, "''] = true,\n") - end - table.insert(data, '}') - - game.write_file('regulars.lua', table.concat(data), false, 0) -end - Module.is_regular = function(player_name) return Utils.cast_bool(global.regulars[player_name] or global.regulars[player_name:lower()]) --to make it backwards compatible end + Module.add_regular = function(player_name) local actor = Utils.get_actor() - if Module.is_regular(player_name) then + + if (Module.is_regular(player_name)) then Game.player_print(player_name .. ' is already a regular.') else - if game.players[player_name] then - player_name = game.players[player_name].name - game.print(actor .. ' promoted ' .. player_name .. ' to regular.') - global.regulars[player_name] = true - update_file() - else - Game.player_print(player_name .. ' does not exist.') - end + global.regulars[player_name] = true + Server.set_data('regulars', player_name, true) + game.print(actor .. ' promoted ' .. player_name .. ' to regular.') end end -Module.remove_regular = - function(player_name) +Module.remove_regular = function(player_name) local actor = Utils.get_actor() - if game.players[player_name] then - player_name = game.players[player_name].name - if Module.is_regular(player_name) then - game.print(player_name .. ' was demoted from regular by ' .. actor .. '.') - end + + if (Module.is_regular(player_name)) then global.regulars[player_name] = nil - global.regulars[player_name:lower()] = nil --backwards compatible - update_file() + Server.set_data('regulars', player_name, nil) + game.print(player_name .. ' was demoted from regular by ' .. actor .. '.') + else + Game.player_print(player_name .. ' is not a regular.') end end +local sync_regulars_callback = + Token.register( + function(data) + global.regulars = data.entries or {} + end +) + +function Module.sync_regulars() + Server.try_get_all_data('regulars', sync_regulars_callback) +end + Module.print_regulars = function() + local result = {} for k, _ in pairs(global.regulars) do - Game.player_print(k) + table.insert(result, k) end + + result = table.concat(result, ', ') + game.print(result) end function Module.get_rank(player) @@ -70,7 +71,7 @@ function Module.get_rank(player) end function Module.is_donator(player_name) - return global.donators[player_name] + return global.donators[player_name] ~= nil end function Module.player_has_donator_perk(player_name, perk_flag) @@ -79,19 +80,84 @@ function Module.player_has_donator_perk(player_name, perk_flag) return false end - return bit32.band(d, perk_flag) == perk_flag + local flags = d.perk_flags + if not flags then + return false + end + + return bit32.band(flags, perk_flag) == perk_flag +end + +function Module.get_donator_welcome_message(player_name) + local d = global.donators[player_name] + if not d then + return nil + end + + return d.welcome_messages +end + +function Module.set_donator(player_name, data) + global.donators[player_name] = data + Server.set_data('donators', player_name, data) +end + +local sync_donators_callback = + Token.register( + function(data) + global.donators = data.entries or {} + end +) + +function Module.sync_donators() + Server.try_get_all_data('donators', sync_donators_callback) +end + +function Module.print_donators() + local result = {} + + for k, _ in pairs(global.donators) do + table.insert(result, k) + end + + result = table.concat(result, ', ') + game.print(result) end Event.add( defines.events.on_player_joined_game, function(event) local correctCaseName = Game.get_player_by_index(event.player_index).name - if global.regulars[correctCaseName:lower()] and not global.regulars[correctCaseName] then - global.regulars[correctCaseName:lower()] = nil + local lowerCaseName = correctCaseName:lower() + if correctCaseName ~= lowerCaseName and global.regulars[lowerCaseName] then + global.regulars[lowerCaseName] = nil global.regulars[correctCaseName] = true - update_file() + Server.set_data('regulars', lowerCaseName, nil) + Server.set_data('regulars', correctCaseName, true) end end ) +Event.add( + Server.events.on_server_started, + function() + Module.sync_regulars() + Module.sync_donators() + end +) + +Server.on_data_set_changed( + 'regulars', + function(data) + global.regulars[data.key] = data.value + end +) + +Server.on_data_set_changed( + 'donators', + function(data) + global.donators[data.key] = data.value + end +) + return Module diff --git a/resources/donators.lua b/resources/donators.lua index e41adb35..d4f21687 100644 --- a/resources/donators.lua +++ b/resources/donators.lua @@ -5,35 +5,6 @@ Module.donator_perk_flags = { train = 0x2 } -local d = Module.donator_perk_flags - -Module.donators = { - ['aldldl'] = d.rank, - ['Geostyx'] = d.rank, - ['Linaori'] = d.rank, - ['Xertez'] = d.rank, - ['Chevalier1200'] = d.rank + d.train, - ['DraugTheWhopper'] = d.rank + d.train, - ['der-dave.com'] = d.rank + d.train, - ['Jayefuu'] = d.rank, - ['Valansch'] = d.rank, - ['plague006'] = d.rank, - ['chromaddict'] = d.rank, - ['InphinitePhractals'] = d.rank + d.train, - ['shoghicp'] = d.rank + d.train, - ['DuelleuD'] = d.rank + d.train, - ['henrycn1997'] = d.rank + d.train, - ['Raiguard'] = d.rank + d.train, -} - -Module.welcome_messages = { - ['Linaori'] = 'I present to you Linaori of house Refactorio, Lady of the Void, Remover of Spaghetti, Queen of the Endless Nauvis, Breaker of Biters and Mother of Code!', - ['Valansch'] = 'Welcome Valansch, .', - ['der-dave.com'] = "Dave doesn't want a welcome message.", - ['plague006'] = 'plague wrote this dumb message you have to read. If you want your own dumb on-join message be sure to donate on Patreon!', - ['shoghicp'] = 'Need more servers!', - ['aldldl'] = "ALo's Here", - ['Raiguard'] = "I am... was... God. The one you call 'The Almighty'. The creator of Factories. But now, I am dead. The Biters killed me. I am sorry.", -} +Module.donators = {} return Module diff --git a/resources/regulars.lua b/resources/regulars.lua deleted file mode 100644 index 8de4cd03..00000000 --- a/resources/regulars.lua +++ /dev/null @@ -1,1130 +0,0 @@ -return { - ["Aliiien0110"] = true, - ["Altech"] = true, - ["Angus100"] = true, - ["Animal"] = true, - ["Atoms"] = true, - ["Bazul"] = true, - ["Bemm"] = true, - ["Chunhung"] = true, - ["CmdrRat"] = true, - ["Copperbotte"] = true, - ["Drlloyd1337"] = true, - ["Factorian12321"] = true, - ["Fire3231"] = true, - ["Gizan"] = true, - ["Gotze"] = true, - ["Haribo112"] = true, - ["HighInFiberOptics"] = true, - ["JinNJuice"] = true, - ["Kyte"] = true, - ["Maniah"] = true, - ["Mariocraft2001"] = true, - ["Namelesshunter"] = true, - ["NbITUK"] = true, - ["Newcott"] = true, - ["Nexarius"] = true, - ["PogomanD"] = true, - ["Ralp"] = true, - ["Redcrafter100"] = true, - ["Ruslan_kc"] = true, - ["Sangria_louie"] = true, - ["Sholvo"] = true, - ["SimonFlapse"] = true, - ["TheElvenGamer"] = true, - ["TheOrangeAngle"] = true, - ["TheThane"] = true, - ["Tommy17"] = true, - ["VERBUGA"] = true, - ["Zehir"] = true, - ["ZjosH"] = true, - ["_Joe_"] = true, - ["aalexx"] = true, - ["acolyteofcthulu"] = true, - ["adidas"] = true, - ["adlmr"] = true, - ["adobewallhacks"] = true, - ["ajdiller88"] = true, - ["alvinmj"] = true, - ["ansible32"] = true, - ["aplavins"] = true, - ["argetlam_elda"] = true, - ["arnietom"] = true, - ["assemblystorm"] = true, - ["b4x"] = true, - ["ballbuster"] = true, - ["banakeg"] = true, - ["barnaba"] = true, - ["baronting"] = true, - ["bhenoa"] = true, - ["bigglesthepirate"] = true, - ["bighamster"] = true, - ["binzerle"] = true, - ["bissi"] = true, - ["bjhunter"] = true, - ["bloodydevil"] = true, - ["blzz"] = true, - ["boail"] = true, - ["bobbje"] = true, - ["bobucles"] = true, - ["brainclot"] = true, - ["brftjx"] = true, - ["brikir"] = true, - ["brl_chacal"] = true, - ["bufferoverflow"] = true, - ["ccaspanello"] = true, - ["cchpucky"] = true, - ["chessindustries"] = true, - ["chukles"] = true, - ["circit"] = true, - ["cogito123"] = true, - ["collin08"] = true, - ["coogan"] = true, - ["cool"] = true, - ["cpaca0"] = true, - ["cpenguinred"] = true, - ["craigrood"] = true, - ["crusher_sut"] = true, - ["cybernoise"] = true, - ["cydes"] = true, - ["damian0816"] = true, - ["davoud"] = true, - ["delta124"] = true, - ["derdu"] = true, - ["df1229"] = true, - ["dmaonk"] = true, - ["dpoba"] = true, - ["ducktaperules"] = true, - ["eaglesight"] = true, - ["eithel"] = true, - ["empirebuilder1"] = true, - ["esperiom"] = true, - ["everlord"] = true, - ["exp11235"] = true, - ["extraxyz"] = true, - ["fana13"] = true, - ["fish"] = true, - ["flowild"] = true, - ["franc_ist"] = true, - ["fremiamagus"] = true, - ["frissi"] = true, - ["fuzz_pucker"] = true, - ["g-h-o-s-t"] = true, - ["geckozila"] = true, - ["gespenstdermaschine"] = true, - ["grahamm"] = true, - ["grandstore256"] = true, - ["griffinonetwo"] = true, - ["ground_walker"] = true, - ["gynox"] = true, - ["hackguy"] = true, - ["hazelnuthead"] = true, - ["heardofsnails"] = true, - ["heaser"] = true, - ["helpower2"] = true, - ["hunter117x"] = true, - ["i-make-robots"] = true, - ["iexyi"] = true, - ["inator1192"] = true, - ["ireasonless1"] = true, - ["jbc363"] = true, - ["jbev2"] = true, - ["jedifan"] = true, - ["jinnjuice"] = true, - ["joe32"] = true, - ["jono777"] = true, - ["judaires"] = true, - ["junhinhow"] = true, - ["kaig3n"] = true, - ["kev007"] = true, - ["kevinma"] = true, - ["kidflash"] = true, - ["koretego"] = true, - ["kostrahb"] = true, - ["leadhades27"] = true, - ["lejnel"] = true, - ["leviculus"] = true, - ["li7ro"] = true, - ["lillepallt"] = true, - ["lord_kill"] = true, - ["lordxleasy"] = true, - ["luk4kasz"] = true, - ["lunastarwarp"] = true, - ["m_m0"] = true, - ["mafisch3"] = true, - ["marckhardt"] = true, - ["markupolioncz"] = true, - ["marucan"] = true, - ["mauerstein10"] = true, - ["maximuskylus"] = true, - ["maxthespunkymunk"] = true, - ["mcschnee"] = true, - ["medival3"] = true, - ["merssedes"] = true, - ["mh"] = true, - ["mithril_ryder"] = true, - ["mrkoss"] = true, - ["mrsjaakbraak"] = true, - ["nbituk"] = true, - ["neumond"] = true, - ["nibu"] = true, - ["ninjrkillr"] = true, - ["noodletrains"] = true, - ["olexn"] = true, - ["oliveawesomesauz"] = true, - ["palulukan"] = true, - ["passepartout911"] = true, - ["petebra11"] = true, - ["pfg"] = true, - ["philip017"] = true, - ["phountix"] = true, - ["pietloke"] = true, - ["pilypas"] = true, - ["pirion"] = true, - ["procrastinator_diedz"] = true, - ["rafaelvalim"] = true, - ["rascher"] = true, - ["rayijin"] = true, - ["redlabel"] = true, - ["rhobes"] = true, - ["rickeyhb"] = true, - ["rico2403"] = true, - ["rikkert"] = true, - ["rlidwka"] = true, - ["rododendro"] = true, - ["rorror"] = true, - ["rulerofdabacon"] = true, - ["saltlands"] = true, - ["samy_the_samy"] = true, - ["saneman"] = true, - ["selen"] = true, - ["sergeant_steve"] = true, - ["settdigger"] = true, - ["sharpshot2566"] = true, - ["shimmshamm"] = true, - ["sir"] = true, - ["skilledspacepolice"] = true, - ["skykittena"] = true, - ["sl"] = true, - ["slastraf"] = true, - ["snerktk"] = true, - ["sonopard"] = true, - ["sovietdefender"] = true, - ["spatbee"] = true, - ["stat0x00"] = true, - ["steponitnicejob"] = true, - ["stig219"] = true, - ["struppi"] = true, - ["tarpon907"] = true, - ["teondar"] = true, - ["yago2003"] = true, - ["zacman0510"] = true, - ["zila"] = true, - ["zoigo"] = true, - ["Beriev"] = true, - ["Zalmozis"] = true, - ["Farcear"] = true, - ["WD_STEVE2"] = true, - ["erezd"] = true, - ["Rhamuk"] = true, - ["Patton1918"] = true, - ["Zaen"] = true, - ["Kingdud"] = true, - ["Admiral_Ackweed"] = true, - ["StormySkies"] = true, - ["Wadiyatalkinbeet"] = true, - ["megamega"] = true, - ["ZTX"] = true, - ["eiis1000"] = true, - ["UTIDI"] = true, - ["XATEV"] = true, - ["Robobrine"] = true, - ["Rakeplay"] = true, - ["Lucas16"] = true, - ["Factorioio"] = true, - ["VikingCyborg"] = true, - ["Caps_errors"] = true, - ["usgundertaker"] = true, - ["GeneralB.97"] = true, - ["Spechok"] = true, - ["emailkanji"] = true, - ["StarLite"] = true, - ["Velguarder"] = true, - ["VIRUSgamesplay"] = true, - ["fenderpuddy"] = true, - ["DQ_Shell"] = true, - ["JoeGames00"] = true, - ["Sholax"] = true, - ["Darian007"] = true, - ["EmptyRov"] = true, - ["sanders80"] = true, - ["dazonker"] = true, - ["andrewy2k"] = true, - ["DarkRedman"] = true, - ["Builder101"] = true, - ["StandaardStefan"] = true, - ["Liutio"] = true, - ["actorpuss"] = true, - ["TeZwo"] = true, - ["Furancebob"] = true, - ["NathanG"] = true, - ["Jayefuu"] = true, - ["VincentMonster"] = true, - ["Marcuss2"] = true, - ["Some_meme"] = true, - ["Ralozey"] = true, - ["Azer"] = true, - ["ruetama"] = true, - ["invincibl_"] = true, - ["TWLTriston"] = true, - ["GerMic"] = true, - ["ausmister"] = true, - ["rimbas"] = true, - ["ManuelG"] = true, - ["vvictor"] = true, - ["zellking"] = true, - ["GhostThunder"] = true, - ["Melduron"] = true, - ["musa3299"] = true, - ["puycss"] = true, - ["Aronak"] = true, - ["Brathahn"] = true, - ["Bryce940"] = true, - ["kuumottaja"] = true, - ["DrunkBoxer"] = true, - ["Bobbuilder2222d"] = true, - ["tbell91"] = true, - ["Progman"] = true, - ["Andreas133"] = true, - ["Jaertof"] = true, - ["hsxu"] = true, - ["ponderer1"] = true, - ["lone-pine"] = true, - ["LevyTaxes"] = true, - ["50fffff"] = true, - ["Flashbacks"] = true, - ["MrTrainCow"] = true, - ["Akhrem"] = true, - ["YAMATO_Hajime"] = true, - ["Jimarad"] = true, - ["Aerost"] = true, - ["doubleh2"] = true, - ["pY4x3g"] = true, - ["murph_murph"] = true, - ["Epresba"] = true, - ["Paul1998"] = true, - ["TBob"] = true, - ["balintbcs"] = true, - ["Mike-_-"] = true, - ["mexicanninja"] = true, - ["StormMA"] = true, - ["Heretek"] = true, - ["robertkruijt"] = true, - ["Rebel_NL"] = true, - ["saluchru"] = true, - ["flyingARMADILDO"] = true, - ["chicki2"] = true, - ["porelos"] = true, - ["Gundex"] = true, - ["Hyrkoon"] = true, - ["benw91ne"] = true, - ["lintaba"] = true, - ["Morgan3rd"] = true, - ["vlexoo"] = true, - ["Chevalier1200"] = true, - ["Havelyn"] = true, - ["Snowpig7u"] = true, - ["Ynotimagine740"] = true, - ["LupiGaming"] = true, - ["HeyDeath360"] = true, - ["Margin_of_Error"] = true, - ["Chyza"] = true, - ["themostinternet"] = true, - ["Triyan"] = true, - ["plague006"] = true, - ["Corlin"] = true, - ["Schidnsepp"] = true, - ["Trolzrus"] = true, - ["VintageAura"] = true, - ["Recoilless"] = true, - ["SpaceCat-Chan"] = true, - ["Leon55"] = true, - ["tazzyflame"] = true, - ["zbirka"] = true, - ["sadist_hun"] = true, - ["sellarsarem"] = true, - ["tiesvrielink"] = true, - ["elahrairah"] = true, - ["pobiega"] = true, - ["Mr.AsianEngineer"] = true, - ["NekoBaron"] = true, - ["Pallando"] = true, - ["RedDagger"] = true, - ["Sbarando"] = true, - ["pixel-perfect"] = true, - ["Aldnoah5566"] = true, - ["LynDone"] = true, - ["PTP17"] = true, - ["Jouster"] = true, - ["Igie"] = true, - ["Bunchofrocks"] = true, - ["Mattyk87"] = true, - ["Vinerr"] = true, - ["mastah_mind"] = true, - ["Empire232"] = true, - ["Sigma1"] = true, - ["NoGames"] = true, - ["WeirdWhirl"] = true, - ["qlimax93"] = true, - ["soporis"] = true, - ["vedolv"] = true, - ["JonathanAtis"] = true, - ["SmotPokin42000"] = true, - ["Theysaywhatnow"] = true, - ["SwampD0nkey"] = true, - ["Anubi5"] = true, - ["Slas"] = true, - ["McTheDerp"] = true, - ["qwert33"] = true, - ["UA-IX"] = true, - ["Janakas"] = true, - ["Grooohm"] = true, - ["oafthor"] = true, - ["exbboi"] = true, - ["ClassAction"] = true, - ["Zhukovo"] = true, - ["Wolve"] = true, - ["liltaco"] = true, - ["BenSeidel"] = true, - ["kriskill000"] = true, - ["DUDv2"] = true, - ["Peterie"] = true, - ["Tomza"] = true, - ["DoITCreative"] = true, - ["Aspin"] = true, - ["samrrr"] = true, - ["johnm4jc"] = true, - ["Shinhan"] = true, - ["MINIMAN10000"] = true, - ["Latty319"] = true, - ["DoubleDough"] = true, - ["Jenus358"] = true, - ["redkyleb"] = true, - ["RAV416steam"] = true, - ["killer111995"] = true, - ["ichvii"] = true, - ["Artman40"] = true, - ["Arti20"] = true, - ["larshp"] = true, - ["Tafonath"] = true, - ["Zwulf"] = true, - ["ajicurry"] = true, - ["boksiora"] = true, - ["matthew1206"] = true, - ["improvshark"] = true, - ["cedrik1995"] = true, - ["kova66"] = true, - ["TonyTroll"] = true, - ["Amuxix"] = true, - ["360cow"] = true, - ["MangaFairy"] = true, - ["innocen3"] = true, - ["maxflo13"] = true, - ["Arizon"] = true, - ["CrisBK"] = true, - ["podolskydmitr"] = true, - ["RM8"] = true, - ["the1ultimate-t1u"] = true, - ["keita_wi"] = true, - ["Paulot"] = true, - ["Rados"] = true, - ["Sephir"] = true, - ["snowbranch"] = true, - ["ExError"] = true, - ["Outlay"] = true, - ["BigDaddyBongDong"] = true, - ["Mjau"] = true, - ["mobieh22"] = true, - ["zoomy500"] = true, - ["Preizhour"] = true, - ["hasannuh"] = true, - ["Apologet"] = true, - ["viceroypenguin"] = true, - ["Rufa"] = true, - ["nekonyan"] = true, - ["SnowDrifter"] = true, - ["brockmasters"] = true, - ["monkee"] = true, - ["blacksunshine693"] = true, - ["Claude47"] = true, - ["Winged_Shade"] = true, - ["NWABroseidon"] = true, - ["Lusquifer"] = true, - ["Cruelcoder"] = true, - ["Unrealrules"] = true, - ["Lithidoria"] = true, - ["LordElmi"] = true, - ["Kane.Nexus"] = true, - ["OmegaLunch"] = true, - ["korokoroneruneru"] = true, - ["Krengrus"] = true, - ["Rinncar72"] = true, - ["Patti2507"] = true, - ["f198904011"] = true, - ["BTG"] = true, - ["SwaggerC4"] = true, - ["biohaze"] = true, - ["SMikiS"] = true, - ["sejyoo"] = true, - ["Askiph"] = true, - ["undefinable"] = true, - ["snapboogie"] = true, - ["Wesoly1234"] = true, - ["benzoni"] = true, - ["Verlioka"] = true, - ["Ran_Mw"] = true, - ["SPARKZ102"] = true, - ["slowcrazy54"] = true, - ["adam1285"] = true, - ["Breadnought"] = true, - ["Bluev0"] = true, - ["LeCobalt"] = true, - ["Lavacreeper2000"] = true, - ["manowscar1990"] = true, - ["Cytrox"] = true, - ["arty714"] = true, - ["DrkgoonXV"] = true, - ["Roxmuhr"] = true, - ["Asddsa76"] = true, - ["bunny232"] = true, - ["D_Riv"] = true, - ["anonymous12123"] = true, - ["AmarthZ"] = true, - ["numberoverzero"] = true, - ["maxim67899"] = true, - ["sklipnoty"] = true, - ["ThatTallNerd"] = true, - ["Presbo"] = true, - ["Renny"] = true, - ["CapitanSky"] = true, - ["Multifunktionsmixer"] = true, - ["AndreyZakharov"] = true, - ["Ardordo"] = true, - ["CallMeTaste"] = true, - ["Dagol"] = true, - ["Eloras"] = true, - ["Fakamantina"] = true, - ["IEXYI"] = true, - ["Kapy"] = true, - ["Lulaidon"] = true, - ["MrJimmyPenguin"] = true, - ["Nick_Nitro"] = true, - ["Piewdennis"] = true, - ["RattenEros"] = true, - ["Sergeant_Steve"] = true, - ["Spaceballs"] = true, - ["Terarink"] = true, - ["TheWearyGamer"] = true, - ["Thuro"] = true, - ["Whouser"] = true, - ["YMan"] = true, - ["aceforg"] = true, - ["cocoilove"] = true, - ["kvdango"] = true, - ["mikanor99"] = true, - ["ralphmace"] = true, - ["rantell"] = true, - ["real_scnerd"] = true, - ["settan"] = true, - ["thislsamerica"] = true, - ["vesorakia"] = true, - ["wavethrash"] = true, - ["xjohnson"] = true, - ["Ryix"] = true, - ["Mylon"] = true, - ["Terminutter"] = true, - ["Hafgrim"] = true, - ["l3igspeck"] = true, - ["lyman"] = true, - ["zsintai1987"] = true, - ["xubos"] = true, - ["Elsa-Zhou"] = true, - ["SirBlubbalot"] = true, - ["bulb5"] = true, - ["fellan03"] = true, - ["Irx99"] = true, - ["Spocks"] = true, - ["OmniMancer"] = true, - ["TfGuy44"] = true, - ["Krul"] = true, - ["moncada"] = true, - ["Wr1190"] = true, - ["Phoenix27833"] = true, - ["reddutton"] = true, - ["4yDo"] = true, - ["jpszat"] = true, - ["DaHolli"] = true, - ["Blaster"] = true, - ["BluJester"] = true, - ["thisisjack"] = true, - ["Appadeia"] = true, - ["Scuideie-Guy"] = true, - ["drakferion"] = true, - ["thelegendxp"] = true, - ["SteelMK"] = true, - ["Marviniusus"] = true, - ["FrostDestructor"] = true, - ["Gorganus"] = true, - ["Sirnumnum"] = true, - ["telefrog"] = true, - ["wrex82"] = true, - ["fce2"] = true, - ["wampastompa09"] = true, - ["Magic"] = true, - ["ReinekeWF"] = true, - ["JokerOfTheZ"] = true, - ["DOSorDIE"] = true, - ["i9962784"] = true, - ["Shotch"] = true, - ["Hyp3rX"] = true, - ["Didalus"] = true, - ["Olekplane1"] = true, - ["FuryZ"] = true, - ["Upsidedowneye"] = true, - ["LegionMammal978"] = true, - ["judos"] = true, - ["blyck"] = true, - ["MrPiols"] = true, - ["necdet"] = true, - ["penguincc3"] = true, - ["Monkfish"] = true, - ["catalist"] = true, - ["DarkQuantum"] = true, - ["TCP"] = true, - ["Cheeselicker"] = true, - ["Bulkje"] = true, - ["bkerlin"] = true, - ["Altafen"] = true, - ["mar123322"] = true, - ["Zijkhal"] = true, - ["aldldl"] = true, - ["Cooldude2606"] = true, - ["jeemchan"] = true, - ["Patrickle"] = true, - ["eZethNesthrown"] = true, - ["nathanweir"] = true, - ["Novikov"] = true, - ["GoatWizard"] = true, - ["fargas"] = true, - ["wot_tak"] = true, - ["FullFruntall"] = true, - ["strangeloveb52"] = true, - ["Snyp"] = true, - ["arron"] = true, - ["UKWoody"] = true, - ["Schallfalke"] = true, - ["Avelix"] = true, - ["Dichromium"] = true, - ["Dimava"] = true, - ["fantasychef"] = true, - ["siniidrooq"] = true, - ["Harmlessbeltbot"] = true, - ["Meddleman"] = true, - ["hamsterking5"] = true, - ["hasuthika"] = true, - ["wflagg"] = true, - ["abnoeh"] = true, - ["Mimiick"] = true, - ["Default_Sound"] = true, - ["eyemint"] = true, - ["Shaun_das_Schaf"] = true, - ["Fynko"] = true, - ["Apolomir"] = true, - ["Tomy52499"] = true, - ["Coyote101"] = true, - ["safriq"] = true, - ["Collider"] = true, - ["pietruszka123"] = true, - ["DylanJohn129"] = true, - ["MafungoLoud"] = true, - ["inetknght"] = true, - ["Tharax"] = true, - ["Fexx"] = true, - ["kaimix"] = true, - ["mayhem162"] = true, - ["longshot162"] = true, - ["Truenkan"] = true, - ["sonliviy"] = true, - ["squish8294"] = true, - ["Endzone"] = true, - ["Tomymy"] = true, - ["warriordragon25"] = true, - ["mph703"] = true, - ["cqd123123"] = true, - ["benitomakefactory"] = true, - ["Stokmeister"] = true, - ["zookham"] = true, - ["Albombe"] = true, - ["Kushlord"] = true, - ["ActitisHypoleucos"] = true, - ["strutter18"] = true, - ["Minifinger"] = true, - ["Hurley93"] = true, - ["henrycn1997"] = true, - ["iop77"] = true, - ["Hayse"] = true, - ["jasoncubed132"] = true, - ["Farglon"] = true, - ["FTL_Space_Warp"] = true, - ["nicname123"] = true, - ["pyz3n"] = true, - ["raudorn"] = true, - ["jojohnst"] = true, - ["bigyihsuan"] = true, - ["Petrane"] = true, - ["the_bebster"] = true, - ["Irunfold"] = true, - ["Del3ta"] = true, - ["Beelzemon"] = true, - ["polycephaland"] = true, - ["Gadidou"] = true, - ["vorxil"] = true, - ["FIREBUNNIE"] = true, - ["kazmodah"] = true, - ["Kno"] = true, - ["Atoms88"] = true, - ["degard66"] = true, - ["ABambooBilbo"] = true, - ["TuxWhale"] = true, - ["Shucru"] = true, - ["yxlotl"] = true, - ["templarchon"] = true, - ["LeeJando"] = true, - ["natedognatedog10"] = true, - ["manclaouss"] = true, - ["Geostyx"] = true, - ["Vadigix"] = true, - ["sssdsdsdsss"] = true, - ["rusty_au"] = true, - ["joe9go"] = true, - ["The_Pau"] = true, - ["Bobanaut"] = true, - ["Lestibornes"] = true, - ["nelch1"] = true, - ["domii894"] = true, - ["Rixon1967"] = true, - ["Asonael"] = true, - ["DonSeverus"] = true, - ["PhoenixPyro"] = true, - ["dalindes"] = true, - ["COOL-ITEM"] = true, - ["cpy"] = true, - ["VicTicus"] = true, - ["Linaori"] = true, - ["exabyte"] = true, - ["actitishypoleucos"] = true, - ["beelzemon"] = true, - ["firebunnie"] = true, - ["Grufe"] = true, - ["jbro1231"] = true, - ["Tamsay"] = true, - ["donto"] = true, - ["Cheeseftw"] = true, - ["jokerwm"] = true, - ["Sabeth"] = true, - ["sqamsqam"] = true, - ["bobfrankly"] = true, - ["Pentbot"] = true, - ["PandasUnicorn"] = true, - ["Kazakmau5"] = true, - ["best2"] = true, - ["fandoce"] = true, - ["Razaekel"] = true, - ["VladiKoro"] = true, - ["Purgen"] = true, - ["Xtreemecore"] = true, - ["Epskampie"] = true, - ["MdRuz"] = true, - ["WCTech"] = true, - ["jimmyhunter"] = true, - ["Monki"] = true, - ["Dewless"] = true, - ["NumptyToucan"] = true, - ["gmhinch"] = true, - ["Apokalipsion"] = true, - ["Jonah82"] = true, - ["nosman123"] = true, - ["brancanes"] = true, - ["XaLpHa1989"] = true, - ["Lethyes"] = true, - ["Yearupie"] = true, - ["vad7ik"] = true, - ["Ludvik"] = true, - ["Tolip"] = true, - ["supercuteboy123"] = true, - ["Hiji56"] = true, - ["Add3r"] = true, - ["Zardinio"] = true, - ["Ruby_Schnee_nee_Rose"] = true, - ["basepsy"] = true, - ["Xertez"] = true, - ["grufe"] = true, - ["terarink"] = true, - ["xalpha1989"] = true, - ["CandBacon"] = true, - ["snoetje"] = true, - ["markupolionCZ"] = true, - ["everLord"] = true, - ["Pirion"] = true, - ["iSTEVE"] = true, - ["mrhaug"] = true, - ["HydraX26"] = true, - ["Ivan00"] = true, - ["MinestoPix"] = true, - ["Tux0n0"] = true, - ["Twitch93"] = true, - ["itamastericano"] = true, - ["j0nni"] = true, - ["pickles28"] = true, - ["rft50"] = true, - ["ANV1L"] = true, - ["Conor0709"] = true, - ["ZarSama"] = true, - ["captcougar1969"] = true, - ["dmcdouga"] = true, - ["motorsteak"] = true, - ["ultrajer"] = true, - ["zenys19"] = true, - ["soni"] = true, - ["cyberdomus"] = true, - ["AFD"] = true, - ["morokko"] = true, - ["cko6o4ku"] = true, - ["Tamika"] = true, - ["22144418"] = true, - ["Genoone"] = true, - ["wengPC"] = true, - ["nizzy"] = true, - ["nadarith"] = true, - ["SLQ"] = true, - ["Shanchan"] = true, - ["Hempy"] = true, - ["Zonezero"] = true, - ["wotwotvodka"] = true, - ["Turboknot"] = true, - ["SteamEngine"] = true, - ["chrisisthebe"] = true, - ["JohnBosch"] = true, - ["sivael"] = true, - ["DarthLeahcim"] = true, - ["acul009"] = true, - ["moqart"] = true, - ["morbus69"] = true, - ["steelhero"] = true, - ["Achskelmos"] = true, - ["Lucasuper32"] = true, - ["sid123"] = true, - ["SuicideBunny"] = true, - ["Grizmu"] = true, - ["fusionross"] = true, - ["termi56"] = true, - ["Thoren41"] = true, - ["LeBalafrey"] = true, - ["WillyMF1"] = true, - ["Ferefang"] = true, - ["Angrivator"] = true, - ["Subcinericius"] = true, - ["Tallios"] = true, - ["spik3"] = true, - ["aledeludx"] = true, - ["Samuel2507"] = true, - ["QDeathNick"] = true, - ["rafe1"] = true, - ["Bawz"] = true, - ["Zr4g0n"] = true, - ["ro88ie"] = true, - ["antarcus"] = true, - ["skzap"] = true, - ["ImPureGames"] = true, - ["bawz"] = true, - ["terradus"] = true, - ["terz42"] = true, - ["thadius856"] = true, - ["the_ledgendary"] = true, - ["the_squid"] = true, - ["thelaughingcheese"] = true, - ["tickterd"] = true, - ["timmypwn"] = true, - ["toledini"] = true, - ["toof_kitty"] = true, - ["trekie4747"] = true, - ["trevoqr"] = true, - ["tuttifrectte"] = true, - ["tvardero"] = true, - ["twinotter"] = true, - ["vengefulpm"] = true, - ["vonlam999"] = true, - ["wadiyatalkinabeet"] = true, - ["warnotte"] = true, - ["watchinghawk"] = true, - ["wekkka"] = true, - ["wickvitaminc"] = true, - ["williambellwisdo"] = true, - ["wurzeltroll42"] = true, - ["xaddr"] = true, - ["xanting"] = true, - ["xdihe"] = true, - ["xeoxius"] = true, - ["xsidd"] = true, - ["Dominoscraft"] = true, - ["Teondar"] = true, - ["tafyline"] = true, - ["gartenfreund"] = true, - ["LycostA"] = true, - ["Dark1244"] = true, - ["cinzhal"] = true, - ["OECEMESO"] = true, - ["npo6ka"] = true, - ["3061867813"] = true, - ["WorrDogg"] = true, - ["skace"] = true, - ["I_dream_of_corn"] = true, - ["ailishi19"] = true, - ["POzilGeR"] = true, - ["robot3331"] = true, - ["Yoannbla"] = true, - ["smashngrabb"] = true, - ["Slayerfear"] = true, - ["DraugTheWhopper"] = true, - ["Grandma_x"] = true, - ["Factorio401"] = true, - ["Yeke"] = true, - ["IsThisNameTakenAlready"] = true, - ["Westy124444"] = true, - ["Bobthecreepyone"] = true, - ["Fattmann"] = true, - ["Eriksonn"] = true, - ["McAfterburner"] = true, - ["TheWickedMaster"] = true, - ["nofunnyno"] = true, - ["Arfloot"] = true, - ["berkys32"] = true, - ["JB_Delta"] = true, - ["SherlockGY"] = true, - ["Foxer1125"] = true, - [".Shang"] = true, - ["CHAOSGamerBC"] = true, - ["darkestdot"] = true, - ["BigGrant101"] = true, - ["JumboTheSunBro"] = true, - ["KJNine"] = true, - ["wilzek"] = true, - ["JustBull"] = true, - ["camodude387"] = true, - ["Rouden"] = true, - ["Glismod"] = true, - ["Graav"] = true, - ["QuaxzRu"] = true, - ["8mittim8"] = true, - ["opiboble"] = true, - ["floxys"] = true, - ["pepsin92"] = true, - ["BlaQkout"] = true, - ["Narcotic84"] = true, - ["arondir"] = true, - ["ihatehangovers"] = true, - ["Cretlin"] = true, - ["niko8"] = true, - ["neuro666"] = true, - ["kreeg"] = true, - ["Jimbogab"] = true, - ["Medival3"] = true, - ["willzcn"] = true, - ["uranopa3"] = true, - ["JSONROY"] = true, - ["o12eMaRkAbLeo"] = true, - ["VanHate"] = true, - ["RichardMNixon"] = true, - ["Subsup"] = true, - ["Sitrom"] = true, - ["odgaar"] = true, - ["glxl"] = true, - ["Julian1109"] = true, - ["ice9000"] = true, - ["plukona"] = true, - ["Serule"] = true, - ["IDragonfyreI"] = true, - ["jan1412"] = true, - ["ko5h"] = true, - ["DJStrikerLP"] = true, - ["maverick85"] = true, - ["kacperion"] = true, - ["Heinrich0815"] = true, - ["Martox111"] = true, - ["skudd3r"] = true, - ["Ingenieur_quoi"] = true, - ["SumBeam"] = true, - ["ScienceLion"] = true, - ["dimash"] = true, - ["TNT_MAN1111"] = true, - ["crayzz2"] = true, - ["Gerkiz"] = true, - ["piterfersin"] = true, - ["SiMoZ_287"] = true, - ["SSeltmann"] = true, - ["AbsoluteZeroIs0K"] = true, - ["jufacto"] = true, - ["okan009"] = true, - ["CounterfeitThe"] = true, - ["TZsec"] = true, - ["jamesh92"] = true, - ["Flameoguy"] = true, - ["Toledini"] = true, - ["alnmike"] = true, - ["Krzys132"] = true, - ["jrz126"] = true, - ["Rothguard"] = true, - ["Rascher"] = true, - ["XeoXius"] = true, - ["InphinitePhractals"] = true, - ["Breadface"] = true, - ["safariursis"] = true, - ["Marucan"] = true, - ["rykstar"] = true, - ["CommanderFrog"] = true, - ["SchniSchnaSchnuck"] = true, - ["Ronin114"] = true, - ["masoudd"] = true, - ["powder12321"] = true, - ["KipenKnos"] = true, - ["Satyr"] = true, - ["wolfram74"] = true, - ["Husdafacka"] = true, - ["The_Real_Black"] = true, - ["ThatsBuilder"] = true, - ["minipini55"] = true, - ["Wanzek"] = true, - ["thehotcrafter"] = true, - ["Johanna_mo"] = true, - ["Cute_Anime_Loli"] = true, - ["J_B_der_Held"] = true, - ["AKTheKnight"] = true, - ["Orib0ck"] = true, - ["dredonkey"] = true, - ["Karev"] = true, - ["HappyPills"] = true, - ["A-l-a-n"] = true, - ["shadewolf"] = true, - ["rellec"] = true, - ["shoo_be_doo"] = true, - ["MovingMike"] = true, - ["slantedSunlight"] = true, - ["LymBAOBEI"] = true, - ["Forge36"] = true, - ["RoGHurricane"] = true, - ["Pyroguy"] = true, - ["Xeter"] = true, - ["Sebast8714"] = true, - ["AurelienG"] = true, - ["tronas10"] = true, - ["Crivvens"] = true, - ["Plawerth"] = true, - ["makuikui"] = true, - ["mahury"] = true, - ["Alfredoo"] = true, - ["brandon1311"] = true, - ["TrickyVic"] = true, - ["BuzuL"] = true, - ["Tigrium"] = true, - ["flooxy"] = true, - ["halpenny911"] = true, - ["Grumpalo"] = true, - ["chfisher77"] = true, - ["Forlanceabice"] = true, - ["oloklir"] = true, - ["skylarmb"] = true, - ["ThatNateGuy"] = true, - ["ezocker"] = true, - ["omarassi12"] = true, - ["Sjetil"] = true, - ["Jon8RFC"] = true, - ["kalikas"] = true, - ["ichmo"] = true, - ["CrazyStephen"] = true, - ["Refy"] = true, - ["ZachMarquoi"] = true, - ["MeepMerp"] = true, - ["InventorX"] = true, - ["Pandarnash"] = true, - ["Cramly"] = true, - ["DwarvenArmy"] = true, - ["Evandot"] = true, - ["HT1014"] = true, - ["Drastien"] = true, - ["sunseille"] = true, - ["taroxyz"] = true, - ["Strucki"] = true, - ["mzore"] = true, - ["nasmw"] = true, - ["hellden"] = true, - ["Eaggra"] = true, - ["jaxjace"] = true, - ["Proph3t3ss"] = true, - ["Sense545"] = true, - ["blueboyjj"] = true, - ["KingZeothh"] = true, - ["Bricktator"] = true, - ["CptPonk"] = true, - ["Zorzzz"] = true, - ["AIRZYC"] = true, - ["Digzol"] = true, - ["roosterbrewster"] = true, - ["Explodia"] = true, - ["Rvl"] = true, - ["ds227"] = true, - ["chromaddict"] = true, - ["MadPeakyBlinder"] = true, - ["yay2010"] = true, - ["remarkablysilly"] = true, - ["swake"] = true, - ["TheNetworkDoctor"] = true, - ["tria_225"] = true, - ["Mesohorknee"] = true, - ["alyptica"] = true, - ["radred"] = true, - ["DeathSlayer"] = true, - ["Captain_Murder"] = true, - ["RadianRaze"] = true, - ["Aeropar"] = true, - ["Maloy12"] = true, - ["Tatarr"] = true, - ["raskl"] = true, - ["Minidodo"] = true, - ["ghastly_figure"] = true, - ["Biker"] = true, - ["boeljoet"] = true, - ["FreezeHun"] = true, - ["ksb4145"] = true, - ["Acruid"] = true, - ["kabutas"] = true, - ["anb505"] = true, - ["a591281892"] = true, - ["UnfortunatePotato"] = true, - ["galletto"] = true, - ["Cubicgraphics"] = true, - ["Zapdos"] = true, - ["14nickel"] = true, - ["my_saw"] = true, - ["BlueRock"] = true, - ["MooLer"] = true, - ["MachineEmpathist"] = true, - ["Xolas"] = true, - ["Taint_Puncher"] = true, - ["Thorgal"] = true, - ["Jularen"] = true, - ["Raiguard"] = true, - ["muchbetter321"] = true, - ["Skybreaker"] = true, - ["IamTzu"] = true, - ["ETK03"] = true -}