diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index 6a009677e1..4199a28bba 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -109,6 +109,9 @@ //Area flags, possibly more to come #define RAD_SHIELDED 1 //shielded from radiation, clearly +// VOREStation Edit Begin +#define BLUE_SHIELDED 2 // shield from bluespace teleportation (telescience) +// VOREStation Edit End // Custom layer definitions, supplementing the default TURF_LAYER, MOB_LAYER, etc. #define DOOR_OPEN_LAYER 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6 diff --git a/code/__defines/roguemining_vr.dm b/code/__defines/roguemining_vr.dm index ffe55b7485..7a3d5fedd6 100644 --- a/code/__defines/roguemining_vr.dm +++ b/code/__defines/roguemining_vr.dm @@ -4,7 +4,7 @@ #define RM_DIFF_DECAY_TIME 18000 #define RM_DIFF_DECAY_AMT -50 -#define RM_DIFF_VALUE_MOB 10 +#define RM_DIFF_VALUE_MOB 20 #define RM_DIFF_VALUE_MOB_HARD 15 #define RM_DIFF_VALUE_MOB_BOSS 100 -#define RM_DIFF_VALUE_ORE 5 \ No newline at end of file +#define RM_DIFF_VALUE_ORE 10 diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm index 957a690f4f..4e5b6d6dfb 100644 --- a/code/__defines/species_languages.dm +++ b/code/__defines/species_languages.dm @@ -30,7 +30,7 @@ #define LANGUAGE_SOL_COMMON "Sol Common" #define LANGUAGE_UNATHI "Sinta'unathi" #define LANGUAGE_SIIK "Siik" -#define LANGUAGE_SKRELLIAN "Skrellian" +#define LANGUAGE_SKRELLIAN "Common Skrellian" #define LANGUAGE_TRADEBAND "Tradeband" #define LANGUAGE_GUTTER "Gutter" #define LANGUAGE_SIGN "Sign Language" diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index ab98ef8ff1..dc78829439 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -19,7 +19,7 @@ var/global/list/important_items = list( /obj/item/weapon/hand_tele, /obj/item/weapon/card/id/captains_spare, /obj/item/device/aicard, - /obj/item/device/mmi, + /obj/item/device/mmi/digital/posibrain, /obj/item/device/paicard, /obj/item/weapon/gun, /obj/item/weapon/pinpointer, diff --git a/code/_helpers/icons.dm b/code/_helpers/icons.dm index cabf7c04b3..5f10ad623b 100644 --- a/code/_helpers/icons.dm +++ b/code/_helpers/icons.dm @@ -811,8 +811,8 @@ proc // Creates a single icon from a given /atom or /image. Only the first argu /proc/getHologramIcon(icon/A, safety=1)//If safety is on, a new icon is not created. var/icon/flat_icon = safety ? A : new(A)//Has to be a new icon to not constantly change the same icon. - flat_icon.ColorTone(rgb(125,180,225))//Let's make it bluish. - flat_icon.ChangeOpacity(0.5)//Make it half transparent. + //flat_icon.ColorTone(rgb(125,180,225))//Let's make it bluish. //VOREStation Removal for AI Vore effects + //flat_icon.ChangeOpacity(0.5)//Make it half transparent. //VOREStation Removal for AI Vore effects var/icon/alpha_mask = new('icons/effects/effects.dmi', "scanline")//Scanline effect. flat_icon.AddAlphaMask(alpha_mask)//Finally, let's mix in a distortion effect. return flat_icon diff --git a/code/_helpers/icons_vr.dm b/code/_helpers/icons_vr.dm new file mode 100644 index 0000000000..be5de68e82 --- /dev/null +++ b/code/_helpers/icons_vr.dm @@ -0,0 +1,45 @@ +/proc/AverageColor(var/icon/I, var/accurate = 0, var/ignoreGreyscale = 0) +//Accurate: Use more accurate color averaging, usually has better results and prevents muddied or overly dark colors. Mad thanks to wwjnc. +//ignoreGreyscale: Excempts greyscale colors from the color list, useful for filtering outlines or plate overlays. + var/list/colors = ListColors(I, ignoreGreyscale) + if(!colors.len) + return null + + var/list/colorsum = list(0, 0, 0) //Holds the sum of the RGB values to calculate the average + var/list/RGB = list(0, 0, 0) //Temp list for each color + var/total = colors.len + + var/final_average + if (accurate) //keeping it legible + for(var/i = 1 to total) + RGB = ReadRGB(colors[i]) + colorsum[1] += RGB[1]*RGB[1] + colorsum[2] += RGB[2]*RGB[2] + colorsum[3] += RGB[3]*RGB[3] + final_average = rgb(sqrt(colorsum[1]/total), sqrt(colorsum[2]/total), sqrt(colorsum[3]/total)) + else + for(var/i = 1 to total) + RGB = ReadRGB(colors[i]) + colorsum[1] += RGB[1] + colorsum[2] += RGB[2] + colorsum[3] += RGB[3] + final_average = rgb(colorsum[1]/total, colorsum[2]/total, colorsum[3]/total) + return final_average + +/proc/ListColors(var/icon/I, var/ignoreGreyscale = 0) + var/list/colors = list() + for(var/x_pixel = 1 to I.Width()) + for(var/y_pixel = 1 to I.Height()) + var/this_color = I.GetPixel(x_pixel, y_pixel) + if(this_color) + if (ignoreGreyscale && ReadHSV(RGBtoHSV(this_color))[2] == 0) //If saturation is 0, must be greyscale + continue + colors.Add(this_color) + return colors + +/proc/empty_Y_space(var/icon/I) //Returns the amount of lines containing only transparent pixels in an icon, starting from the bottom + for(var/y_pixel = 1 to I.Height()) + for(var/x_pixel = 1 to I.Width()) + if (I.GetPixel(x_pixel, y_pixel)) + return y_pixel - 1 + return null \ No newline at end of file diff --git a/code/controllers/emergency_shuttle_controller.dm b/code/controllers/emergency_shuttle_controller.dm index 38bfc027bd..9f1565a5a0 100644 --- a/code/controllers/emergency_shuttle_controller.dm +++ b/code/controllers/emergency_shuttle_controller.dm @@ -95,6 +95,7 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle shuttle.move_time = SHUTTLE_TRANSIT_DURATION priority_announcement.Announce("The regularly scheduled shuttle to the [dock_name] will arrive in in approximately [round(estimate_arrival_time()/60)] minutes. Those leaving should proceed to docks one and two.") + atc.shift_ending() //VOREStation Add //recalls the shuttle /datum/emergency_shuttle_controller/proc/recall() diff --git a/code/datums/autolathe/engineering.dm b/code/datums/autolathe/engineering.dm index ce6b5f07b5..0921806ac0 100644 --- a/code/datums/autolathe/engineering.dm +++ b/code/datums/autolathe/engineering.dm @@ -58,6 +58,10 @@ name = "fax machine electronics" path =/obj/item/weapon/circuitboard/fax +/datum/category_item/autolathe/engineering/papershredder + name = "paper shredder electronics" + path =/obj/item/weapon/circuitboard/papershredder + /datum/category_item/autolathe/engineering/microwave name = "microwave electronics" path =/obj/item/weapon/circuitboard/microwave diff --git a/code/defines/procs/hud.dm b/code/defines/procs/hud.dm index 4f0aed0d35..d662241c61 100644 --- a/code/defines/procs/hud.dm +++ b/code/defines/procs/hud.dm @@ -18,6 +18,7 @@ proc/process_med_hud(var/mob/M, var/local_scanner, var/mob/Alt) if(local_scanner) P.Client.images += patient.hud_list[HEALTH_HUD] P.Client.images += patient.hud_list[STATUS_HUD] + P.Client.images += patient.hud_list[IMPLOYAL_HUD] //VOREStation Edit - Commandeered to be backup implant indicator else var/sensor_level = getsensorlevel(patient) if(sensor_level >= SUIT_SENSOR_VITAL) diff --git a/code/defines/procs/hud_vr.dm b/code/defines/procs/hud_vr.dm index 62f1b7ab27..63c8fa2706 100644 --- a/code/defines/procs/hud_vr.dm +++ b/code/defines/procs/hud_vr.dm @@ -9,12 +9,11 @@ proc/process_omni_hud(var/mob/M, var/mode, var/mob/Alt) P.Client.images += guy.hud_list[ID_HUD] P.Client.images += guy.hud_list[HEALTH_HUD] + P.Client.images += guy.hud_list[IMPLOYAL_HUD] //if(shades.mode == "med") //Medical advanced version //Nothing special to show, really, just records become available. if(mode == "sec") //Security advanced version P.Client.images += guy.hud_list[WANTED_HUD] - P.Client.images += guy.hud_list[IMPLOYAL_HUD] if(mode == "best") //Command/omni advanced version P.Client.images += guy.hud_list[WANTED_HUD] - P.Client.images += guy.hud_list[IMPLOYAL_HUD] \ No newline at end of file diff --git a/code/game/area/Space Station 13 areas_vr.dm b/code/game/area/Space Station 13 areas_vr.dm index f210187668..476cb6bd61 100644 --- a/code/game/area/Space Station 13 areas_vr.dm +++ b/code/game/area/Space Station 13 areas_vr.dm @@ -1,44 +1,54 @@ /area/crew_quarters/sleep/vistor_room_1 - flags = RAD_SHIELDED + flags = RAD_SHIELDED | BLUE_SHIELDED /area/crew_quarters/sleep/vistor_room_2 - flags = RAD_SHIELDED + flags = RAD_SHIELDED | BLUE_SHIELDED /area/crew_quarters/sleep/vistor_room_3 - flags = RAD_SHIELDED + flags = RAD_SHIELDED | BLUE_SHIELDED /area/crew_quarters/sleep/vistor_room_4 - flags = RAD_SHIELDED + flags = RAD_SHIELDED | BLUE_SHIELDED /area/crew_quarters/sleep/vistor_room_5 - flags = RAD_SHIELDED + flags = RAD_SHIELDED | BLUE_SHIELDED /area/crew_quarters/sleep/vistor_room_6 - flags = RAD_SHIELDED + flags = RAD_SHIELDED | BLUE_SHIELDED /area/crew_quarters/sleep/vistor_room_7 - flags = RAD_SHIELDED + flags = RAD_SHIELDED | BLUE_SHIELDED /area/crew_quarters/sleep/vistor_room_8 - flags = RAD_SHIELDED + flags = RAD_SHIELDED | BLUE_SHIELDED /area/crew_quarters/sleep/vistor_room_9 - flags = RAD_SHIELDED + flags = RAD_SHIELDED | BLUE_SHIELDED /area/crew_quarters/sleep/vistor_room_10 - flags = RAD_SHIELDED + flags = RAD_SHIELDED | BLUE_SHIELDED /area/crew_quarters/sleep/vistor_room_11 - flags = RAD_SHIELDED + flags = RAD_SHIELDED | BLUE_SHIELDED /area/crew_quarters/sleep/vistor_room_12 - flags = RAD_SHIELDED + flags = RAD_SHIELDED | BLUE_SHIELDED /area/teleporter/departing name = "\improper Long-Range Teleporter" icon_state = "teleporter" music = "signal" +// Override telescience shielding on some areas +/area/security/armoury + flags = BLUE_SHIELDED + +/area/security/tactical + flags = BLUE_SHIELDED + +/area/security/nuke_storage + flags = BLUE_SHIELDED + // New shuttles /area/shuttle/administration/transit name = "Deep Space (AS)" @@ -107,4 +117,8 @@ /area/asteroid/rogue/zone4 name = "Asteroid Belt Zone 4" icon_state = "red2" - shuttle_area = /area/shuttle/belter/belt/zone4 \ No newline at end of file + shuttle_area = /area/shuttle/belter/belt/zone4 + +/area/medical/resleeving + name = "Resleeving Lab" + icon_state = "genetics" \ No newline at end of file diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index c503a5d4bd..19af760cc0 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -158,7 +158,7 @@ //Body Scan Console /obj/machinery/body_scanconsole var/obj/machinery/bodyscanner/scanner - var/known_implants = list(/obj/item/weapon/implant/health, /obj/item/weapon/implant/chem, /obj/item/weapon/implant/death_alarm, /obj/item/weapon/implant/loyalty, /obj/item/weapon/implant/tracking, /obj/item/weapon/implant/language, /obj/item/weapon/implant/language/eal) + var/known_implants = list(/obj/item/weapon/implant/health, /obj/item/weapon/implant/chem, /obj/item/weapon/implant/death_alarm, /obj/item/weapon/implant/loyalty, /obj/item/weapon/implant/tracking, /obj/item/weapon/implant/language, /obj/item/weapon/implant/language/eal, /obj/item/weapon/implant/backup) //VOREStation Add - Backup Implant var/delete var/temphtml name = "Body Scanner Console" diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 9ff98b84b4..ed8bbce555 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -34,13 +34,13 @@ var/status_display_freq = "1435" var/stat_msg1 var/stat_msg2 - + var/datum/lore/atc_controller/ATC //VOREStation Add var/datum/announcement/priority/crew_announcement = new /obj/machinery/computer/communications/New() ..() crew_announcement.newscast = 1 - + ATC = atc //VOREStation Add /obj/machinery/computer/communications/process() if(..()) if(state != STATE_STATUSDISPLAY) @@ -130,6 +130,10 @@ if("messagelist") src.currmsg = 0 src.state = STATE_MESSAGELIST + //VOREStation Add for ATC stuff + if("toggleatc") + src.ATC.squelched = !src.ATC.squelched + //VOREStation Add End if("viewmessage") src.state = STATE_VIEWMESSAGE if (!src.currmsg) @@ -311,6 +315,7 @@ else dat += "
\[ Log In \]" dat += "
\[ Message List \]" + dat += "
\[ [ATC.squelched ? "Enable" : "Disable"] ATC Relay \]" //VOREStation Add if(STATE_CALLSHUTTLE) dat += "Are you sure you want to call the shuttle? \[ OK | Cancel \]" if(STATE_CANCELSHUTTLE) @@ -374,6 +379,7 @@ dat += "
\[ Call Emergency Shuttle \]" dat += "
\[ Message List \]" dat += "
\[ Set Status Display \]" + dat += "
\[ [ATC.squelched ? "Enable" : "Disable"] ATC Relay \]" //VOREStation Add if(STATE_CALLSHUTTLE) dat += "Are you sure you want to call the shuttle? \[ OK | Cancel \]" if(STATE_MESSAGELIST) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index bf384a401e..6f490000a7 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -435,6 +435,12 @@ O.owner.current << "You get the feeling your target is no longer within your reach..." qdel(O) + //VOREStation Edit - Resleeving. + if(occupant.mind && (occupant.mind.name in transcore.backed_up)) + var/datum/transhuman/mind_record/MR = transcore.backed_up[occupant.mind.name] + transcore.stop_backup(MR) + //VOREStation Edit End - Resleeving. + //Handle job slot/tater cleanup. var/job = occupant.mind.assigned_role @@ -443,6 +449,7 @@ if(occupant.mind.objectives.len) qdel(occupant.mind.objectives) occupant.mind.special_role = null + //else //if(ticker.mode.name == "AutoTraitor") //var/datum/game_mode/traitor/autotraitor/current_mode = ticker.mode diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 158b718e83..ccdd4db155 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -124,9 +124,9 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ return /obj/machinery/hologram/holopad/proc/create_holo(mob/living/silicon/ai/A, turf/T = loc) - var/obj/effect/overlay/hologram = new(T)//Spawn a blank effect at the location. + var/obj/effect/overlay/aiholo/hologram = new(T)//Spawn a blank effect at the location. //VOREStation Edit to specific type for adding vars hologram.icon = A.holo_icon - hologram.mouse_opacity = 0//So you can't click on it. + //hologram.mouse_opacity = 0//So you can't click on it. //VOREStation Removal hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. hologram.anchored = 1//So space wind cannot drag it. hologram.name = "[A.name] (Hologram)"//If someone decides to right click. @@ -160,10 +160,22 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ /obj/machinery/hologram/holopad/proc/move_hologram(mob/living/silicon/ai/user) if(masters[user]) + /*VOREStation Removal, using our own code step_to(masters[user], user.eyeobj) // So it turns. var/obj/effect/overlay/H = masters[user] H.loc = get_turf(user.eyeobj) masters[user] = H + */ + //VOREStation Add - Solid mass holovore tracking stuff + var/obj/effect/overlay/aiholo/H = masters[user] + if(H.bellied) + walk_to(H, user.eyeobj) //Walk-to respects obstacles + else + walk_towards(H, user.eyeobj) //Walk-towards does not + //Hologram left the screen (got stuck on a wall or something) + if(get_dist(H, user.eyeobj) > world.view) + clear_holo(user) + //VOREStation Add End if((HOLOPAD_MODE == RANGE_BASED && (get_dist(H, src) > holo_range))) clear_holo(user) diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index cd2346a32c..71482abb33 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -49,12 +49,9 @@ datum/track/New(var/title_name, var/audio) /obj/machinery/media/jukebox/New() ..() - component_parts = list() - component_parts += new /obj/item/weapon/stock_parts/capacitor(src) - component_parts += new /obj/item/weapon/stock_parts/console_screen(src) - component_parts += new /obj/item/stack/cable_coil(src, 5) - RefreshParts() + default_apply_parts() wires = new/datum/wires/jukebox(src) + update_icon() /obj/machinery/media/jukebox/Destroy() StopPlaying() @@ -78,6 +75,10 @@ datum/track/New(var/title_name, var/audio) return if(default_deconstruction_crowbar(user, W)) return + if(istype(W, /obj/item/weapon/wirecutters)) + return wires.Interact(user) + if(istype(W, /obj/item/device/multitool)) + return wires.Interact(user) if(istype(W, /obj/item/weapon/wrench)) if(playing) StopPlaying() diff --git a/code/game/machinery/jukebox_vr.dm b/code/game/machinery/jukebox_vr.dm index 0a6fb98891..dd9ddcca88 100644 --- a/code/game/machinery/jukebox_vr.dm +++ b/code/game/machinery/jukebox_vr.dm @@ -1,7 +1,7 @@ // The improved, hackable jukebox for vorestation! /obj/machinery/media/jukebox/vore - icon = 'icons/obj/jukebox_vr.dmi' + circuit = /obj/item/weapon/circuitboard/jukebox/vore secret_tracks = list( new/datum/track("Bandit Radio", 'sound/music/jukebox/bandit_radio.ogg'), new/datum/track("Ghost Fight (Toby Fox)", 'sound/music/jukebox/TobyFoxGhostFight.mid'), diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index d3107869ce..b0946bf347 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -283,6 +283,13 @@ Class Procs: return 1 return 0 +/obj/machinery/proc/default_apply_parts() + var/obj/item/weapon/circuitboard/CB = circuit + if(!istype(CB)) + return + CB.apply_default_parts(src) + RefreshParts() + /obj/machinery/proc/default_part_replacement(var/mob/user, var/obj/item/weapon/storage/part_replacer/R) if(!istype(R)) return 0 diff --git a/code/game/machinery/partslathe_vr.dm b/code/game/machinery/partslathe_vr.dm new file mode 100644 index 0000000000..42fa5b32ae --- /dev/null +++ b/code/game/machinery/partslathe_vr.dm @@ -0,0 +1,384 @@ +/* +** The Parts Lathe! Able to produce all tech level 1 stock parts for building machines! +** +** The idea is that engineering etc should be able to build/repair basic technology machines +** without having to use a protolathe to print what are not prototype technologies. +** Some felt having an autolathe do this might be OP, so its a separate machine. +** +** The other advantage is that this machine, specially focused for helping build stuff, +** actually reads circuit boards, tells you what parts are needed to build them, and +** can automatically queue them up to build! +** +** Leshana says: +** - Phase 1 of this project adds the machine and basic operation. +** - Phase 2 will enhance usability by making & labeling boxes with a set of parts. +** +** TODO - Implement phase 2 by adding cardboard boxes +*/ + +/obj/machinery/partslathe + name = "parts lathe" + icon = 'icons/obj/partslathe_vr.dmi' + icon_state = "partslathe-idle" + circuit = /obj/item/weapon/circuitboard/partslathe + anchored = 1 + density = 1 + use_power = 1 + idle_power_usage = 30 + active_power_usage = 5000 + + // Amount of materials we can store total + var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0) + var/list/storage_capacity = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0) + + var/obj/item/weapon/circuitboard/copy_board // Inserted board + + var/list/datum/category_item/partslathe/queue = list() // Queue of things to build + var/busy = 0 // Currently building stuff y/n + var/progress = 0 // How many machine ticks have we spent building current thing? + var/mat_efficiency = 3 // Material usage efficiency (less efficient than protolathe) + var/speed = 1 // Ticks per tick build speed multiplier + + // Static list of recipies we will lazily generate + // type -> /datum/category_item/partslathe/ + var/static/list/partslathe_recipies + +/obj/machinery/partslathe/New() + ..() + default_apply_parts() + update_icon() + update_recipe_list() + +/obj/machinery/partslathe/proc/getHighestOriginTechLevel(var/obj/item/I) + if(!istype(I) || !I.origin_tech) + return 0 + var/highest = 0 + for(var/tech in I.origin_tech) + highest = max(highest, I.origin_tech[tech]) + return highest + +/obj/machinery/partslathe/RefreshParts() + var/mb_rating = 0 + for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts) + mb_rating += M.rating + storage_capacity[DEFAULT_WALL_MATERIAL] = mb_rating * 16000 + storage_capacity["glass"] = mb_rating * 8000 + var/T = 0 + for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) + T += M.rating + mat_efficiency = 6 / T // Ranges from 3.0 to 1.0 + speed = T / 2 // Ranges from 1.0 to 3.0 + +/obj/machinery/partslathe/dismantle() + for(var/f in materials) + eject_materials(f, -1) + ..() + +/obj/machinery/partslathe/update_icon() + if(panel_open) + icon_state = "partslathe-open" + else if(inoperable()) + icon_state = "partslathe-off" + else if(busy) + icon_state = "partslathe-lidclose" + else + if(icon_state == "partslathe-lidclose") + flick("partslathe-lidopen", src) + icon_state = "partslathe-idle" + +/obj/machinery/partslathe/attackby(var/obj/item/O as obj, var/mob/user as mob) + if(busy) + user << "\The [src] is busy. Please wait for completion of previous operation." + return 1 + if(default_deconstruction_screwdriver(user, O)) + return + if(default_deconstruction_crowbar(user, O)) + return + if(default_part_replacement(user, O)) + return + if(inoperable()) + return + if(panel_open) + user << "You can't load \the [src] while it's opened." + return + if(istype(O, /obj/item/weapon/circuitboard)) + if(copy_board) + user << "There is already a board inserted in \the [src]." + return + if(!user.unEquip(O)) + return + copy_board = O + O.forceMove(src) + user.visible_message("[user] inserts [O] into \the [src]'s circuit reader.", "You insert [O] into \the [src]'s circuit reader.") + updateUsrDialog() + return + if(try_load_materials(user, O)) + return + else + user << "You cannot insert this item into \the [src]!" + return + +// Attept to load materials. Returns 0 if item wasn't a stack of materials, otherwise 1 (even if failed to load) +/obj/machinery/partslathe/proc/try_load_materials(var/mob/user, var/obj/item/stack/material/S) + if(!istype(S)) + return 0 + if(!(S.material.name in materials)) + user << "The [src] doesn't accept [S.material]!" + return 1 + if(S.amount < 1) + return 1 // Does this even happen? Sanity check I guess. + var/max_res_amount = storage_capacity[S.material.name] + if(materials[S.material.name] + S.perunit <= max_res_amount) + var/count = 0 + while(materials[S.material.name] + S.perunit <= max_res_amount && S.amount >= 1) + materials[S.material.name] += S.perunit + S.use(1) + count++ + user.visible_message("[user] inserts [S.name] into \the [src].", "You insert [count] [S.name] into \the [src].") + flick("partslathe-load-[S.material.name]", src) + updateUsrDialog() + else + user << "\The [src] cannot hold more [S.name]." + return 1 + +/obj/machinery/partslathe/process() + ..() + if(stat) + update_icon() + return + if(queue.len == 0) + if (busy) + ping() // Job's done! + busy = 0 + update_icon() + return + var/datum/category_item/partslathe/D = queue[1] + if(canBuild(D)) + busy = 1 + update_use_power(2) + progress += speed + if(progress >= D.time) + build(D) + progress = 0 + removeFromQueue(1) + update_icon() + else if(busy) + visible_message("\icon [src] flashes: insufficient materials: [getLackingMaterials(D)].") + busy = 0 + update_use_power(1) + update_icon() + playsound(src.loc, 'sound/machines/chime.ogg', 50, 0) + +/obj/machinery/partslathe/proc/addToQueue(var/datum/category_item/partslathe/D) + queue += D + return + +/obj/machinery/partslathe/proc/removeFromQueue(var/index) + queue.Cut(index, index + 1) + return + +/obj/machinery/partslathe/proc/canBuild(var/datum/category_item/partslathe/D) + for(var/M in D.resources) + if(materials[M] < Ceiling(D.resources[M] * mat_efficiency)) + return 0 + return 1 + +/obj/machinery/partslathe/proc/getLackingMaterials(var/datum/category_item/partslathe/D) + var/ret = "" + for(var/M in D.resources) + if(materials[M] < Ceiling(D.resources[M] * mat_efficiency)) + if(ret != "") + ret += ", " + ret += "[Ceiling(D.resources[M] * mat_efficiency) - materials[M]] [M]" + return ret + +/obj/machinery/partslathe/proc/build(var/datum/category_item/partslathe/D) + for(var/M in D.resources) + materials[M] = max(0, materials[M] - Ceiling(D.resources[M] * mat_efficiency)) + var/obj/new_item = D.build(loc); + if(new_item) + new_item.loc = loc + if(mat_efficiency < 1) // No matter out of nowhere + if(new_item.matter && new_item.matter.len > 0) + for(var/i in new_item.matter) + new_item.matter[i] = Ceiling(new_item.matter[i] * mat_efficiency) + +// 0 amount = 0 means ejecting a full stack; -1 means eject everything +/obj/machinery/partslathe/proc/eject_materials(var/material, var/amount) + var/recursive = amount == -1 ? 1 : 0 + material = lowertext(material) + var/mattype + switch(material) + if(DEFAULT_WALL_MATERIAL) + mattype = /obj/item/stack/material/steel + if("glass") + mattype = /obj/item/stack/material/glass + else + return + var/obj/item/stack/material/S = new mattype(loc) + if(amount <= 0) + amount = S.max_amount + var/ejected = min(round(materials[material] / S.perunit), amount) + S.amount = min(ejected, amount) + if(S.amount <= 0) + qdel(S) + return + materials[material] -= ejected * S.perunit + if(recursive && materials[material] >= S.perunit) + eject_materials(material, -1) + +/obj/machinery/partslathe/attack_ai(mob/user) + src.attack_hand(user) + +/obj/machinery/partslathe/attack_hand(mob/user) + if(..()) + return + ui_interact(user) + +/obj/machinery/partslathe/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + user.set_machine(src) + + var/data[0] + data["panelOpen"] = panel_open + + var/materials_ui[0] + for(var/M in materials) + materials_ui[++materials_ui.len] = list( + "name" = M, + "display" = material_display_name(M), + "qty" = materials[M], + "max" = storage_capacity[M], + "percent" = (materials[M] / storage_capacity[M] * 100)) + data["materials"] = materials_ui + + if(istype(copy_board)) + data["copyBoard"] = copy_board.name + var/req_components_ui[0] + for(var/CP in (copy_board.req_components || list())) + var/obj/comp_path = CP + var/comp_amt = copy_board.req_components[comp_path] + if(comp_amt && (comp_path in partslathe_recipies)) + req_components_ui[++req_components_ui.len] = list("name" = initial(comp_path.name), "qty" = comp_amt) + data["copyBoardReqComponents"] = req_components_ui + + data["queue"] = list() + for(var/datum/category_item/partslathe/Q in queue) + data["queue"] += Q.name + + if(busy && queue.len > 0) + var/datum/category_item/partslathe/current = queue[1] + data["building"] = current.name + data["buildProgress"] = progress + data["buildTime"] = current.time + data["buildPercent"] = (progress / current.time * 100) + if(queue.len > 0 && !canBuild(queue[1])) + data["error"] = getLackingMaterials(queue[1]) + + var/recipies_ui[0] + for(var/T in partslathe_recipies) + var/datum/category_item/partslathe/R = partslathe_recipies[T] + recipies_ui[++recipies_ui.len] = list("name" = R.name, "type" = "[T]") + data["recipies"] = recipies_ui + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "partslathe.tmpl", "Parts Lathe UI", 500, 450) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(5) + +/obj/machinery/partslathe/Topic(href, href_list) + if(..()) + return 1 + usr.set_machine(src) + add_fingerprint(usr) + + // Queue management can be done even while busy + if(href_list["queue"]) + var/type_to_build = text2path(href_list["queue"]) + var/datum/category_item/partslathe/to_build = partslathe_recipies[type_to_build] + if(to_build) + addToQueue(to_build) + updateUsrDialog() + return + + if(href_list["queueBoard"]) + if(!istype(copy_board) || !copy_board.req_components) + return + for(var/comp_path in copy_board.req_components) + var/comp_amt = copy_board.req_components[comp_path] + if(!comp_amt) + continue + var/datum/category_item/partslathe/to_build = partslathe_recipies[comp_path] + if(!to_build) + continue // We don't support building whatever this is + for(var/i in 1 to comp_amt) + addToQueue(to_build) + return + + if(href_list["cancel"]) + var/index = text2num(href_list["cancel"]) + if(index < 1 || index > queue.len) + return + if(busy && index == 1) + return + removeFromQueue(index) + return + + if(busy) + usr << "\The [src]is busy. Please wait for completion of previous operation." + return + + if(href_list["ejectBoard"]) + if(copy_board) + visible_message("\The [copy_board] is ejected from \the [src]'s circuit reader.") + copy_board.forceMove(src.loc) + copy_board = null + updateUsrDialog() + return + + if(href_list["ejectMaterial"]) + var/matName = href_list["ejectMaterial"] + if(!(matName in materials)) + return + eject_materials(matName, 0) + updateUsrDialog() + return + +/** Build list of recipies to include all tech level 1 stock parts. */ +/obj/machinery/partslathe/proc/update_recipe_list() + if(!partslathe_recipies) + partslathe_recipies = list() + var/list/paths = typesof(/obj/item/weapon/stock_parts)-/obj/item/weapon/stock_parts + for(var/type in paths) + var/obj/item/weapon/stock_parts/I = new type() + if(getHighestOriginTechLevel(I) > 1) + qdel(I) + continue // Ignore high-tech parts + if(!I.matter) + qdel(I) + continue // Ignore parts we can't build + + var/datum/category_item/partslathe/recipie = new() + recipie.name = I.name + recipie.path = type + recipie.resources = list() + for(var/material in I.matter) + recipie.resources[material] = I.matter[material]*1.25 // More expensive to produce than they are to recycle. + partslathe_recipies[type] = recipie + qdel(I) + +/*************************** +* Parts Lathe Recipie Type * +***************************/ + +/datum/category_item/partslathe + var/path + var/list/resources + var/time = 2 // In machine controller ticks, so about 4 seconds. + +/datum/category_item/partslathe/dd_SortValue() + return name + +/datum/category_item/partslathe/proc/build(var/loc) + return new path(loc) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 64fc0c4a8f..bbab86d493 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -854,7 +854,8 @@ /obj/item/weapon/reagent_containers/syringe/antiviral = 4,/obj/item/weapon/reagent_containers/syringe = 12, /obj/item/device/healthanalyzer = 5,/obj/item/weapon/reagent_containers/glass/beaker = 4, /obj/item/weapon/reagent_containers/dropper = 2, /obj/item/stack/medical/advanced/bruise_pack = 3, /obj/item/stack/medical/advanced/ointment = 3, /obj/item/stack/medical/splint = 2, - /obj/item/weapon/storage/box/khcrystal = 4) //VOREStation Add + /obj/item/weapon/storage/box/khcrystal = 4, + /obj/item/weapon/storage/box/backup_kit = 2) //VOREStation Add - khcrystal and backup_kit contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 3,/obj/item/weapon/reagent_containers/pill/stox = 4,/obj/item/weapon/reagent_containers/pill/antitox = 6) idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan. req_log_access = access_cmo diff --git a/code/game/machinery/vending_vr.dm b/code/game/machinery/vending_vr.dm index 203e5c03a4..1b37f51685 100644 --- a/code/game/machinery/vending_vr.dm +++ b/code/game/machinery/vending_vr.dm @@ -21,6 +21,33 @@ /obj/item/device/flashlight/glowstick = 3, /obj/item/device/flashlight/glowstick/red = 3, /obj/item/device/flashlight/glowstick/blue = 3, /obj/item/device/flashlight/glowstick/orange =3, /obj/item/device/flashlight/glowstick/yellow = 3, /obj/item/weapon/reagent_containers/spray/windowsealant = 5) +/obj/machinery/vending/dinnerware + name = "Dinnerware" + desc = "A kitchen and restaurant equipment vendor." + product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..." + icon_state = "dinnerware" + products = list( + /obj/item/weapon/tray = 8, + /obj/item/weapon/material/kitchen/utensil/fork = 6, + /obj/item/weapon/material/kitchen/utensil/knife = 6, + /obj/item/weapon/material/kitchen/utensil/spoon = 6, + /obj/item/weapon/material/knife = 3, + /obj/item/weapon/material/kitchen/rollingpin = 2, + /obj/item/weapon/reagent_containers/food/drinks/glass2/square = 8, + /obj/item/weapon/reagent_containers/food/drinks/glass2/shake = 8, + /obj/item/weapon/glass_extra/stick = 15, + /obj/item/weapon/glass_extra/straw = 15, + /obj/item/clothing/suit/chef/classic = 2, + /obj/item/weapon/storage/toolbox/lunchbox = 3, + /obj/item/weapon/storage/toolbox/lunchbox/heart = 3, + /obj/item/weapon/storage/toolbox/lunchbox/cat = 3, + /obj/item/weapon/storage/toolbox/lunchbox/nt = 3, + /obj/item/weapon/storage/toolbox/lunchbox/mars = 3, + /obj/item/weapon/storage/toolbox/lunchbox/cti = 3, + /obj/item/weapon/storage/toolbox/lunchbox/nymph = 3, + /obj/item/weapon/storage/toolbox/lunchbox/syndicate = 3, + /obj/item/trash/bowl = 30) + contraband = list(/obj/item/weapon/material/knife/butch = 2) /* var/list/log = list() var/req_log_access = access_armory diff --git a/code/game/objects/items/weapons/circuitboards/circuitboard.dm b/code/game/objects/items/weapons/circuitboards/circuitboard.dm index f17ee1c292..d6cb806586 100644 --- a/code/game/objects/items/weapons/circuitboards/circuitboard.dm +++ b/code/game/objects/items/weapons/circuitboards/circuitboard.dm @@ -35,3 +35,22 @@ if(istype(M, build_path)) return 1 return 0 + +//Should be called from the constructor of any machine to automatically populate the default parts +/obj/item/weapon/circuitboard/proc/apply_default_parts(var/obj/machinery/M) + if(!istype(M)) + return + if(!req_components) + return + M.component_parts = list() + for(var/comp_path in req_components) + var/comp_amt = req_components[comp_path] + if(!comp_amt) + continue + + if(ispath(comp_path, /obj/item/stack)) + M.component_parts += new comp_path(contain_parts ? M : null, comp_amt) + else + for(var/i in 1 to comp_amt) + M.component_parts += new comp_path(contain_parts ? M : null) + return diff --git a/code/game/objects/items/weapons/circuitboards/circuitboards_vr.dm b/code/game/objects/items/weapons/circuitboards/circuitboards_vr.dm new file mode 100644 index 0000000000..2f51602746 --- /dev/null +++ b/code/game/objects/items/weapons/circuitboards/circuitboards_vr.dm @@ -0,0 +1,21 @@ +#ifndef T_BOARD +#error T_BOARD macro is not defined but we need it! +#endif + +// VOREStation specific circuit boards! + +// Our own board so deconstructing and reconstructing gets the same machine back... +/obj/item/weapon/circuitboard/jukebox/vore + name = T_BOARD("VORE jukebox") + build_path = /obj/machinery/media/jukebox/vore + +// Board for the parts lathe in partslathe.dm +/obj/item/weapon/circuitboard/partslathe + name = T_BOARD("parts lathe") + build_path = /obj/machinery/partslathe + board_type = new /datum/frame/frame_types/machine + origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2) + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 2, + /obj/item/weapon/stock_parts/manipulator = 2, + /obj/item/weapon/stock_parts/console_screen = 1) diff --git a/code/game/objects/items/weapons/circuitboards/machinery/papershredder.dm b/code/game/objects/items/weapons/circuitboards/machinery/papershredder.dm new file mode 100644 index 0000000000..ef4575bafb --- /dev/null +++ b/code/game/objects/items/weapons/circuitboards/machinery/papershredder.dm @@ -0,0 +1,13 @@ +#ifndef T_BOARD +#error T_BOARD macro is not defined but we need it! +#endif + +/obj/item/weapon/circuitboard/papershredder + name = T_BOARD("papershredder") + build_path = /obj/machinery/papershredder + board_type = new /datum/frame/frame_types/machine + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + req_components = list( + /obj/item/weapon/stock_parts/motor = 1, + /obj/item/weapon/stock_parts/gear = 2, + /obj/item/weapon/stock_parts/micro_laser = 1) diff --git a/code/game/objects/items/weapons/storage/backpack_vr.dm b/code/game/objects/items/weapons/storage/backpack_vr.dm index 76dedd32d5..29e4403c2c 100644 --- a/code/game/objects/items/weapons/storage/backpack_vr.dm +++ b/code/game/objects/items/weapons/storage/backpack_vr.dm @@ -1,13 +1,31 @@ /obj/item/weapon/storage/backpack/saddlebag - name = "Saddlebag" - desc = "A saddle that holds items." + name = "Horse Saddlebags" + desc = "A saddle that holds items. Seems slightly bulky." icon = 'icons/obj/storage_vr.dmi' icon_override = 'icons/mob/back_vr.dmi' item_state = "saddlebag" icon_state = "saddlebag" + max_storage_space = INVENTORY_DUFFLEBAG_SPACE //Saddlebags can hold more, like dufflebags + slowdown = 1 //And are slower, too...Unless you're a macro, that is. + var/taurtype = /datum/sprite_accessory/tail/taur/horse //Acceptable taur type to be wearing this + var/no_message = "You aren't the appropriate taur type to wear this!" + mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) - if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/horse)) - return 1 - else - H << "You need to have a horse half to wear this." - return 0 + if(..()) + if(istype(H) && istype(H.tail_style, taurtype)) + if(H.size_multiplier >= RESIZE_BIG) //Are they a macro? + slowdown = 0 + else + slowdown = initial(slowdown) + return 1 + else + H << "[no_message]" + return 0 + +/* If anyone wants to make some... this is how you would. +/obj/item/weapon/storage/backpack/saddlebag/spider + name = "Drider Saddlebags" + item_state = "saddlebag_drider" + icon_state = "saddlebag_drider" + var/taurtype = /datum/sprite_accessory/tail/taur/spider +*/ diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 4f9a3bd6ef..19cc54de7f 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -57,10 +57,12 @@ new /obj/item/clothing/mask/breath(src) new /obj/item/weapon/tank/emergency/oxygen(src) +//VS Edit /obj/item/weapon/storage/box/vox/New() ..() new /obj/item/clothing/mask/breath(src) - new /obj/item/weapon/tank/emergency/phoron(src) + new /obj/item/weapon/tank/emergency/phoron_double(src) +//End Edit /obj/item/weapon/storage/box/engineer/New() ..() diff --git a/code/game/objects/items/weapons/tanks/tank_types_vr.dm b/code/game/objects/items/weapons/tanks/tank_types_vr.dm new file mode 100644 index 0000000000..3f9b611a9f --- /dev/null +++ b/code/game/objects/items/weapons/tanks/tank_types_vr.dm @@ -0,0 +1,11 @@ +/obj/item/weapon/tank/emergency/phoron_double + name = "double emergency phoron tank" + desc = "An emergency air tank hastily painted red." + icon = 'icons/obj/tank_vr.dmi' + icon_state = "emergency_double_nitrogen" + gauge_icon = "indicator_emergency_double" + volume = 10 + +/obj/item/weapon/tank/emergency/phoron_double/New() + ..() + air_contents.adjust_gas("phoron", (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 17300f2456..7c46385942 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -126,6 +126,12 @@ display_name = holder.fakekey if(mob.stat != DEAD) display_name = mob.name + //VOREStation Add - Resleeving shenanigan prevention + if(ishuman(mob)) + var/mob/living/carbon/human/H = mob + if(H.original_player && H.original_player != H.ckey) //In a body not their own + display_name = "[H.mind.name] (as [H.name])" + //VOREStation Add End // Everyone in normal viewing range of the LOOC for(var/mob/viewer in m_viewers) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index c42c65654d..f0c95e5f8d 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -672,6 +672,8 @@ proc/admin_notice(var/message, var/rights) //This is basically how death alarms do it var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/ert(null) + a.icon = 'icons/obj/radio.dmi' //VOREStation Tweak + a.icon_state = "intercom" //VOREStation Tweak var/channel = input("Channel for message:","Channel", null) as null|anything in (list("Common") + a.keyslot1.channels + a.keyslot2.channels) diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm index 32b0554abc..19ac8cf925 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -38,6 +38,7 @@ proc/createRandomZlevel() admin_notice("\red \b Loading away mission...", R_DEBUG) var/map = pick(potentialRandomZlevels) + world.log << "Away mission picked: [map]" //VOREStation Add for debugging var/file = file(map) if(isfile(file)) maploader.load_map(file) diff --git a/code/modules/busy_space/_defines.dm b/code/modules/busy_space/_defines.dm new file mode 100644 index 0000000000..5a33c2ac0d --- /dev/null +++ b/code/modules/busy_space/_defines.dm @@ -0,0 +1,12 @@ +//Org flags +//Ships you might see +#define ORG_HAS_NAVY 0x1 +#define ORG_HAS_TRADERS 0x2 +#define ORG_HAS_TECH 0x4 +#define ORG_HAS_MERCS 0x8 +#define ORG_HAS_DIPLO 0x10 + +//What they get up to kinda +#define ORG_HAS_SHADY 0x20 +#define ORG_HAS_ENTERTAIN 0x40 +#define ORG_HAS_HUGENESS 0x80 \ No newline at end of file diff --git a/code/modules/busy_space/air_traffic.dm b/code/modules/busy_space/air_traffic.dm new file mode 100644 index 0000000000..a18c3be054 --- /dev/null +++ b/code/modules/busy_space/air_traffic.dm @@ -0,0 +1,128 @@ +//Cactus, Speedbird, Dynasty, oh my + +var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller + +/datum/lore/atc_controller + var/delay_max = 25 MINUTES //How long between ATC traffic, max + var/delay_min = 40 MINUTES //How long between ATC traffic, min + var/backoff_delay = 5 MINUTES //How long to back off if we can't talk and want to + var/next_message //When the next message should happen in world.time + var/force_chatter_type //Force a specific type of messages + + var/squelched = 0 //If ATC is squelched currently + +/datum/lore/atc_controller/New() + spawn(100) //Lots of lag at the start of a shift. + msg("New shift beginning, resuming traffic control.") + next_message = world.time + rand(delay_min,delay_max) + process() + +/datum/lore/atc_controller/proc/process() + if(world.time >= next_message) + if(squelched) + next_message = world.time + backoff_delay + else + next_message = world.time + rand(delay_min,delay_max) + random_convo() + + spawn(1 MINUTE) //We don't really need high-accuracy here. + process() + +/datum/lore/atc_controller/proc/msg(var/message,var/sender) + ASSERT(message) + global_announcer.autosay("[message]", sender ? sender : "Virgo Air/Space Control") + +/datum/lore/atc_controller/proc/reroute_traffic(var/yes = 1) + if(yes) + msg("Rerouting traffic away from NSS Adaphagia.") + squelched = 1 + else + msg("Resuming normal traffic routing around NSS Adaphagia.") + squelched = 0 + +/datum/lore/atc_controller/proc/shift_ending(var/evac = 0) + msg("Automated Shuttle departing NSS Virgo Central Command for NSS Adaphagia on routine transfer route.","NT Automated Shuttle") + sleep(5 SECONDS) + msg("Automated Shuttle, cleared to complete routine transfer from NSS Adaphagia to NSS Virgo Central Command.") + +/datum/lore/atc_controller/proc/random_convo() + var/one = pick(loremaster.orgs) //These will pick an index, not an instance + var/two = pick(loremaster.orgs) + + var/datum/lore/org/source = loremaster.orgs[one] //Resolve to the instances + var/datum/lore/org/dest = loremaster.orgs[two] + + //Let's get some mission parameters + var/owner = source.sname //Use the short name + var/prefix = pick(source.ship_prefixes) //Pick a random prefix + var/mission = source.ship_prefixes[prefix] //The value of the prefix is the mission type that prefix does + var/shipname = pick(source.ship_names) //Pick a random ship name to go with it + var/destname = pick(dest.holding_names) //Pick a random holding from the destination + + var/combined_name = "[owner] [prefix] [shipname]" + var/alt_atc_names = list("Virgo TraCon","Virgo Control","Virgo ATC","Virgo Airspace") + var/wrong_atc_names = list("Sol Command","Polaris TraCon","Orion Control") + var/mission_noun = list("flight","mission","route") + var/request_verb = list("requesting","calling for","asking for") + + //First response is 'yes', second is 'no' + var/requests = list("Virgo transit clearance" = list("permission for transit granted", "permission for transit denied, contact regional on 953.5"), + "planetary flight rules" = list("authorizing planetary flight rules", "denying planetary flight rules right now due to traffic"), + "special flight rules" = list("authorizing special flight rules", "denying special flight rules, not allowed for your traffic class"), + "current solar weather info" = list("sending you the relevant information via tightbeam", "cannot fulfill your request at the moment"), + "nearby traffic info" = list("sending you current traffic info", "no available info in your area"), + "remote telemetry data" = list("sending telemetry now", "no uplink from your ship, recheck your uplink and ask again"), + "refueling information" = list("sending refueling information now", "no fuel for your ship class in this sector"), + "a current system time sync" = list("sending time sync ping to you now", "your ship isn't compatible with our time sync, set time manually"), + "current system starcharts" = list("transmitting current starcharts", "your request is queued, overloaded right now"), + "permission to engage FTL" = list("permission to engage FTL granted, good day", "permission denied, wait for current traffic to pass"), + "permission to transit system" = list("permission to transit granted, good day", "permission denied, wait for current traffic to pass"), + "permission to depart system" = list("permission to depart granted, good day", "permission denied, wait for current traffic to pass"), + "permission to enter system" = list("good day, permission to enter granted", "permission denied, wait for current traffic to pass"), + ) + + //Random chance things for variety + var/chatter_type = "normal" + if(force_chatter_type) + chatter_type = force_chatter_type + else + chatter_type = pick(2;"emerg",5;"wrong_freq","normal") //Be nice to have wrong_lang... + + var/yes = prob(90) //Chance for them to say yes vs no + + var/request = pick(requests) + var/callname = pick(alt_atc_names) + var/response = requests[request][yes ? 1 : 2] //1 is yes, 2 is no + + var/full_request + var/full_response + var/full_closure + + switch(chatter_type) + if("wrong_freq") + callname = pick(wrong_atc_names) + full_request = "[callname], this is [combined_name] on a [mission] [pick(mission_noun)] to [destname], [pick(request_verb)] [request]." + full_response = "[combined_name], this is Virgo TraCon, wrong frequency. Switch to [rand(700,999)].[rand(1,9)]." + full_closure = "Virgo TraCon, understood, apologies." + if("wrong_lang") + //Can't implement this until autosay has language support + if("emerg") + var/problem = pick("hull breaches on multiple decks","unknown life forms on board","a drive about to go critical","asteroids impacting the hull","a total loss of engine power","people trying to board the ship") + full_request = "This is [combined_name] declaring an emergency! We have [problem]!" + full_response = "[combined_name], this is Virgo TraCon, copy. Switch to emergency responder channel [rand(700,999)].[rand(1,9)]." + full_closure = "Virgo TraCon, okay, switching now." + else + full_request = "[callname], this is [combined_name] on a [mission] [pick(mission_noun)] to [destname], [pick(request_verb)] [request]." + full_response = "[combined_name], this is Virgo TraCon, [response]." //Virgo TraCon always calls themselves TraCon + full_closure = "Virgo TraCon, [yes ? "thank you" : "understood"], good day." //They always copy what TraCon called themselves in the end when they realize they said it wrong + + //Ship sends request to ATC + msg(full_request,"[prefix] [shipname]") + sleep(5 SECONDS) + //ATC sends response to ship + msg(full_response) + sleep(5 SECONDS) + //Ship sends response to ATC + msg(full_closure,"[prefix] [shipname]") + + return \ No newline at end of file diff --git a/code/modules/busy_space/loremaster.dm b/code/modules/busy_space/loremaster.dm new file mode 100644 index 0000000000..322fe0574a --- /dev/null +++ b/code/modules/busy_space/loremaster.dm @@ -0,0 +1,14 @@ +//I AM THE LOREMASTER, ARE YOU THE GATEKEEPER? + +var/datum/lore/loremaster/loremaster = new/datum/lore/loremaster + +/datum/lore/loremaster + var/list/orgs = list() + +/datum/lore/loremaster/New() + var/paths //Just reuse this a bunch of times. + + paths = typesof(/datum/lore/org) - /datum/lore/org + for(var/path in paths) + var/datum/lore/org/instance = new path() + orgs[path] = instance diff --git a/code/modules/busy_space/orgs.dm b/code/modules/busy_space/orgs.dm new file mode 100644 index 0000000000..a1066c107e --- /dev/null +++ b/code/modules/busy_space/orgs.dm @@ -0,0 +1,360 @@ +//Datums for different companies that can be used by busy_space +/datum/lore/org + var/name = "" //Organization's name + var/sname = "" //Org's shortname (NanoTrasen for "NanoTrasen Incorporated") + var/desc = "" //Long description of org, but only current stuff, see 'history' + var/history = "" //Historical discription of org's origins + var/work = "" //Short description of their work, eg "an arms manufacturer" + var/headquarters = "" //Location of Org's HQ + var/motto = "" //A motto, if they have one + + var/org_flags = 0 //Flags for the org + + var/list/ship_prefixes = list()//Some might have more than one! Like NanoTrasen. Value is the mission they perform. + var/list/ship_names = list()//Names of spaceships + var/list/holding_names = list()//Names of static holdings (planets, bases) + +////////////////////////////////////////////////////////////////////////////////// + +/datum/lore/org/nanotrasen + name = "NanoTrasen Incorporated" + sname = "NanoTrasen" + desc = "A megacorporation specializing in genetic and phoron research. The founder, Xavier Trasen, set the company \ + up to be a powerhouse of buying up smaller companies, and turning a profit on the backs of it's workers. \ + It's not known to be the most controversy-free company, nor the best to work for, though millions are employed \ + nonetheless by NanoTrasen." + history = "Originally founded on Mars in 23rd Century by a man named Xavier Trasen, NanoTrasen started \ + out as a small company, whose research was mostly based around gene-therapy. After a controversy over \ + cloning, and buying many smaller companies, Xavier Trasen aggressively pursued phoron research \ + as soon as it was discovered, bringing NanoTrasen to the forefront of the field." + work = "mega-conglomerate" + headquarters = "Mars" + motto = "" + + org_flags = ORG_HAS_NAVY|ORG_HAS_TECH|ORG_HAS_HUGENESS + + //Generic ship names! + ship_prefixes = list("NSV" = "exploration", "NTV" = "hauling", "NDV" = "patrol", "NRV" = "emergency response") + ship_names = list("Profit", + "Discovery", + "Endeavour", + "Desire", + "Gains", + "Torch II", + "Columbia", + "Leyte Gulf", + "Exeter", + "Zhukov", + "Xavier", + "Liteon", + "Fanatic", + "Slow Boat", + "Listing", + "Even Faster", + "Likely Story", + "Looking Glass", + "Witchcraft") + holding_names = list("NSS Phi Gamma", + "NSB Adelphia", + "NSS Vertigo", + "NSB Checkmate", + "NSS Lampour", + "NSB Adelade", + "NSS Indiana", + "NSB Memory Alpha", + "NSS Memory Beta") + +/datum/lore/org/federation + name = "United Federation of Planets" + sname = "Federation" + desc = "The United Federation is a federation of planets that have agreed to exist semi-autonomously \ + under a single central hybrid government, sharing the ideals of liberty, equality, and rights \ + for all. It is one of the larger known interstellar powers in known space and is seen as being \ + the fastest building power. The core planet of Gaia is known for having a proud military culture \ + that, ironically, tends to stomp out any idea of warmongering from their cadets due to their \ + scarred history and the Federation's ideals." + history = "Before the United Federation, there was a simple alliance with no name between core planet \ + members. The United Federation itself found its roots in the aftermath of the Bloody \ + Valentine Civil War, a racially motivated war that occurred in 2550 during the last year of \ + the Federation Alliance of Gaia between the Genetically Modified and so-called Naturalists. \ + Neutral nations in Gaia's political sphere, encouraged by alien observers, formed the United \ + Federation when the indiscriminate loss of life became intolerable. 2555 saw the official \ + signing of the Federation Charter between the core planet members." + work = "governing body" + headquarters = "" + motto = "" + + org_flags = ORG_HAS_NAVY|ORG_HAS_TRADERS|ORG_HAS_TECH|ORG_HAS_DIPLO + + //Star Trek ship names! + ship_prefixes = list("SCV" = "military", "STV" = "trading", "SDV" = "diplomatic") + ship_names = list("Kestrel", + "Beacon", + "Signal", + "Flying Freedom", + "Los Canas", + "Ixiom", + "Falken", + "Marigold", + "White Valley", + "Eternal", + "Arkbird", + "Akira", + "Kongou", + "Maki", + "Kagero", + "Nishiki", + "Icarus", + "Yuudachi", + "Tiki", + "Lucina", + "Tenryu", + "Spirit of Koni", + "Lady of Onoilph") + holding_names = list("Ruins of Chani City on Quarri III", + "Ruins of Kreely City on Ocan II", + "Ruins of Mishi City on Lucida IV", + "Ruins of Posloo City on Pi Cephei Prime", + "Molten Plains of Anarakis VII", + "Living City of Shani", + "Floating City of Nuni Vanni", + "Crystalline City of Delve Tile", + "New Iapetus Colony", + "Onul Colony", + "Ahemait Colony", + "New Amasia Colony", + "New Vesta Colony", + "Amaus Research Facility on Azaleh III", + "Living City of Na'me L'Tauri", + "Living City of Fithpa", + "Resource Mines of Lyra III", + "Resource Mines of Chi Cerberi III", + "Ceani Military Outpost on Rily VII", + "Naro Industrial Complex on Scheddi III", + "Mari Industrial Complex on Furlou Prime", + "Runni Crystal Mines of Keid V") + +/datum/lore/org/solgov + name = "Solar Confederate Government" + sname = "SolGov" + desc = "SolGov is the entity in which many human states are members. Though SolGov has a dedicated miltiary force in the UNSC, \ + it also claims the use of the forces of the member states when it needs to affect a \ + military goal. Many if not most human states are members of SolGov, including all entities in Sol." + history = "Originally a military/economic pact between Earth and Mars in the early days of human colonization, \ + the SolGov body of member states has grown over the years to be quite large, and hold a sizable \ + amount of power compared to similar bodies." + work = "government of Sol" + headquarters = "Luna" + motto = "" + + org_flags = ORG_HAS_TRADERS|ORG_HAS_DIPLO + + //Random ship names! + ship_prefixes = list("SOL" = "SolGov") //Don't ask questions! + ship_names = list("Torch", + "Phoenix", + "Majesty", + "Duke", + "King", + "Mandrake", + "Foxglove", + "Prompt", + "Regal", + "Lordship", + "Highness", + "Rapido", + "Paperwork", + "Arthur", + "Durandal", + "Roland") + holding_names = list("San Francisco on Earth", + "SolGov Fleet Academy on Earth", + "Gateway One above Luna", + "SolGov Command on Luna", + "Olympus City on Mars", + "Hermes Naval Shipyard above Mars", + "a settlement on Titan", + "a settlement on Europa", + "Aleph Grande on Ganymede", + "a new colony in Proxima II", + "a new settlement on Ceti IV-B", + "a colony ship around Ceti IV-B", + "a classified location in SolGov territory") + +/datum/lore/org/unsc + name = "United Nations Space Command" + sname = "Navy" //Otherwise they call the ships UNSC UNSC Name + desc = "The dedicated military force of SolGov, formed from the remnants of the United Nations, is the might of SolGov. \ + While it is greater in military strength than most alien polities, it is not by much." + history = "" + work = "" + headquarters = "Earth" + motto = "" + + org_flags = ORG_HAS_NAVY|ORG_HAS_TECH + + //Halo ship names! + ship_prefixes = list("UNSC" = "military") + ship_names = list("Colorado", + "Anjou", + "Shanxi", + "Hammerhead", + "Piranha", + "Barracuda", + "DeGaulle", + "Leonidas", + "Tokugawa", + "Halcyon", + "Bastion", + "Adjudicator", + "Devestator", + "Corsair", + "Herakles", + "Ain't No Sunshine", + "Dust of Snow", + "Finite Hearts") + holding_names = list("San Francisco on Earth", + "SolGov Fleet Academy on Earth", + "Gateway One above Luna", + "SolGov Command on Luna", + "Olympus City on Mars", + "Hermes Naval Shipyard above Mars", + "a settlement on Titan", + "a settlement on Europa", + "Aleph Grande on Ganymede", + "a new colony in Proxima II", + "a new settlement on Ceti IV-B", + "a colony ship around Ceti IV-B", + "a classified location in SolGov territory") + +/datum/lore/org/kitsuhana + name = "Kitsuhana Heavy Industries" + sname = "Kitsuhana" + desc = "A large post-scarcity amalgamation of races, Kitsuhana is no longer a company but rather a loose association of 'members' \ + who only share the KHI name and their ideals in common. Kitsuhana accepts interviews to join their ranks, and though they have no \ + formal structure with regards to government or law, the concept of 'consent' drives most of the large decision making. Kitsuhanans \ + pride themselves on their ability to avoid consequence. Their post-scarcity allows them to rebuild, regrow, and replenish almost any \ + lost asset or resource nearly instantly. It leads to many of the Kitsuhana 'members' treating everything with frivolity, \ + and lends them a care-free demeanor." + history = "Originally a heavy industrial equipment and space mining company. During a forced evacuation of their homeworld, \ + they were they only organization with enough ship capacity to evacuate any of the population, starting with their employees. \ + After the resulting slowship travel to nearby starsystems, most of the population decided to keep the moniker of the \ + company name. Over the years, Kitsuhana developed into a post-scarcity anarchy where virtually nothing has consequences \ + and Kitsuhana 'members' can live their lives as they see fit, often in isolation." + work = "utopian anarchy" + headquarters = "Kitsuhana Prime" + motto = "Do what you want. We know we will." + + org_flags = ORG_HAS_TRADERS|ORG_HAS_TECH|ORG_HAS_MERCS|ORG_HAS_ENTERTAIN + + //Culture ship names! + ship_prefixes = list("KHI" = "personal") //Everybody's out for themselves, yanno. + ship_names = list("Nervous Energy", + "Prosthetic Conscience", + "Revisionist", + "Trade Surplus", + "Flexible Demeanour", + "Just Read The Instructions", + "Limiting Factor", + "Cargo Cult", + "Gunboat Diplomat", + "A Ship With A View", + "Cantankerous", + "I Thought He Was With You", + "Never Talk To Strangers", + "Sacrificial Victim", + "Unwitting Accomplice", + "Bad For Business", + "Just Testing", + "Size Isn't Everything", + "Yawning Angel", + "Liveware Problem", + "Very Little Gravitas Indeed", + "Zero Gravitas", + "Gravitas Free Zone", + "Absolutely No You-Know-What") + holding_names = list("Kitsuhana Prime", + "Kitsuhana Beta", + "Kitsuhana Gamma", + "the Kitsuhana Forge", + "a Kitsuhanan's home", + "a Kitsuhana ringworld in Pleis Ceti V", + "a Kitsuhana ringworld in Lund VI", + "a Kitsuhana ringworld in Dais IX", + "a Kitsuhana ringworld in Leibert II-b") + +/datum/lore/org/ares + name = "Ares Confederation" + sname = "ArCon" + desc = "A rebel faction on the fringes of human space that renounced the government of both SolGov and their corporate overlords. \ + The Confederation has two fleets, a regular United Fleet Host, comprised of professional crewmen and officers and the Free Host of the Confederation, \ + which are privateers, volunteers and former pirates. The Ares Confederation only holds a \ + dozen planets, but are fiercely defending any incursion on their territory." + history = "Originally only a strike of miners on the dusty, arid planet of Ares in the year 2540, \ + the Ares Confederation was quickly established under the leadership of \ + retired UNSC Colonel Rodrick Gellaume, who is now Prime Minister." + work = "rebel fringe government" + headquarters = "Paraiso a Àstrea" + motto = "Liberty to the Stars!" + + org_flags = ORG_HAS_NAVY|ORG_HAS_SHADY + + ship_prefixes = list("UFHV" = "military", "FFHV" = "shady") + ship_names = list("Liberty", + "Charged Negotiation", + "People's Fist", + "Corporation Breaker", + "Laughing Maniac", + "Not Insured", + "Prehensile Ethics", + "Fist of Ares", + "Gellaume", + "Memory of Fallen", + "Star of Tiamat", + "Mostly Harmless", + "Hero of the Revolution", + "Dawnstar", + "Freedom", + "Fiery Justice", + "Bulwark of the Free", + "Pride of Liberty", + "Gauntlet", + "Petrov", + "Miko", + "Mahama", + "Jerome", + "Rodrick", + "Torch", + "Torch of Freedom", + "She Is One Of Ours Sir", + "Fuck The Captain", + "None Of Your Business") + holding_names = list("Drydocks of the Ares Confederation", + "a classified location", + "a Homestead on Paraiso a Àstrea", + "a contested sector of ArCon space", + "one of our free colonies", + "the Gateway 98-C at Arest", + "Sars Mara on Ares", + "Listening Post Maryland-Sigma", + "an emergency nav bouy", + "New Berlin on Nov-Ferrum", + "a settlement needing our help", + "Forward Base Sigma-Alpha in ArCon space") + +/* +/datum/lore/org + name = "" + sname = "" + desc = "" + history = "" + work = "" + headquarters = "" + motto = "" + + org_flags = 0 + + ship_prefixes = list() + ship_names = list() + holding_names = list() +*/ diff --git a/code/modules/client/preference_setup/general/06_flavor.dm b/code/modules/client/preference_setup/general/06_flavor.dm index 94525ee06f..452752cee8 100644 --- a/code/modules/client/preference_setup/general/06_flavor.dm +++ b/code/modules/client/preference_setup/general/06_flavor.dm @@ -47,6 +47,7 @@ character.flavor_texts["hands"] = pref.flavor_texts["hands"] character.flavor_texts["legs"] = pref.flavor_texts["legs"] character.flavor_texts["feet"] = pref.flavor_texts["feet"] + character.ooc_notes = pref.metadata //VOREStation Add /datum/category_item/player_setup_item/general/flavor/content(var/mob/user) . += "Flavor:
" diff --git a/code/modules/client/preference_setup/loadout/loadout_gloves_vr.dm b/code/modules/client/preference_setup/loadout/loadout_gloves_vr.dm index 7e0b35e11d..6ebb5be740 100644 --- a/code/modules/client/preference_setup/loadout/loadout_gloves_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_gloves_vr.dm @@ -6,3 +6,19 @@ display_name = "wedding ring, silver" path = /obj/item/clothing/gloves/weddingring/silver +/datum/gear/gloves/colored + display_name = "gloves, colorable" + path = /obj/item/clothing/gloves/color + +/datum/gear/gloves/colored/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) + + +/datum/gear/gloves/latex/colorable + display_name = "gloves, latex, colorable" + path = /obj/item/clothing/gloves/latex + +/datum/gear/gloves/latex/colorable/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm b/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm new file mode 100644 index 0000000000..b20aebe7f4 --- /dev/null +++ b/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm @@ -0,0 +1,7 @@ +/datum/gear/suit/labcoat_colorable + display_name = "labcoat, colorable" + path = /obj/item/clothing/suit/storage/toggle/labcoat + +/datum/gear/suit/labcoat_colorable/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno_vr.dm b/code/modules/client/preference_setup/loadout/loadout_xeno_vr.dm new file mode 100644 index 0000000000..2c34d13088 --- /dev/null +++ b/code/modules/client/preference_setup/loadout/loadout_xeno_vr.dm @@ -0,0 +1,35 @@ +/datum/gear/uniform/voxcasual + display_name = "casual wear (Vox)" + path = /obj/item/clothing/under/vox/vox_casual + sort_category = "Xenowear" + whitelisted = "Vox" + +/datum/gear/uniform/voxrobes + display_name = "comfy robes (Vox)" + path = /obj/item/clothing/under/vox/vox_robes + sort_category = "Xenowear" + whitelisted = "Vox" + +/datum/gear/accessory/vox + display_name = "storage vest (Vox)" + path = /obj/item/clothing/accessory/storage/vox + sort_category = "Xenowear" + whitelisted = "Vox" + +/datum/gear/gloves/vox + display_name = "insulated gauntlets (Vox)" + path = /obj/item/clothing/gloves/vox + sort_category = "Xenowear" + whitelisted = "Vox" + +/datum/gear/shoes/vox + display_name = "magclaws (Vox)" + path = /obj/item/clothing/shoes/magboots/vox + sort_category = "Xenowear" + whitelisted = "Vox" + +/datum/gear/mask/vox + display_name = "alien mask (Vox)" + path = /obj/item/clothing/mask/gas/swat/vox + sort_category = "Xenowear" + whitelisted = "Vox" \ No newline at end of file diff --git a/code/modules/client/preference_setup/vore/04_resleeving.dm b/code/modules/client/preference_setup/vore/04_resleeving.dm new file mode 100644 index 0000000000..36d82ae0fd --- /dev/null +++ b/code/modules/client/preference_setup/vore/04_resleeving.dm @@ -0,0 +1,43 @@ +// Define a place to save in character setup +/datum/preferences + var/resleeve_lock = 0 // Whether movs should have OOC reslieving protection. Default false. + var/resleeve_scan = 1 // Whether mob should start with a pre-spawn body scan. Default true. + +// Definition of the stuff for Sizing +/datum/category_item/player_setup_item/vore/resleeve + name = "Resleeving" + sort_order = 4 + +/datum/category_item/player_setup_item/vore/resleeve/load_character(var/savefile/S) + S["resleeve_lock"] >> pref.resleeve_lock + S["resleeve_scan"] >> pref.resleeve_scan + + +/datum/category_item/player_setup_item/vore/resleeve/save_character(var/savefile/S) + S["resleeve_lock"] << pref.resleeve_lock + S["resleeve_scan"] << pref.resleeve_scan + +/datum/category_item/player_setup_item/vore/resleeve/sanitize_character() + pref.resleeve_lock = sanitize_integer(pref.resleeve_lock, 0, 1, initial(pref.resleeve_lock)) + pref.resleeve_scan = sanitize_integer(pref.resleeve_scan, 0, 1, initial(pref.resleeve_scan)) + +/datum/category_item/player_setup_item/vore/resleeve/copy_to_mob(var/mob/living/carbon/human/character) + if(character && !istype(character,/mob/living/carbon/human/dummy)) + spawn(50) + new/datum/transhuman/body_record/(character, pref.resleeve_scan, pref.resleeve_lock) //Clearly related to size. + if(pref.resleeve_lock) + character.resleeve_lock = character.ckey + +/datum/category_item/player_setup_item/vore/resleeve/content(var/mob/user) + . += "
" + . += "Start With Body Scan: [pref.resleeve_scan ? "Yes" : "No"]
" + . += "Prevent Body Impersonation: [pref.resleeve_lock ? "Yes" : "No"]
" + +/datum/category_item/player_setup_item/vore/resleeve/OnTopic(var/href, var/list/href_list, var/mob/user) + if(href_list["toggle_resleeve_lock"]) + pref.resleeve_lock = pref.resleeve_lock ? 0 : 1; + return TOPIC_REFRESH + else if(href_list["toggle_resleeve_scan"]) + pref.resleeve_scan = pref.resleeve_scan ? 0 : 1; + return TOPIC_REFRESH + return ..(); diff --git a/code/modules/clothing/gloves/miscellaneous_vr.dm b/code/modules/clothing/gloves/miscellaneous_vr.dm index 8ae935ab5d..aee86bff27 100644 --- a/code/modules/clothing/gloves/miscellaneous_vr.dm +++ b/code/modules/clothing/gloves/miscellaneous_vr.dm @@ -13,4 +13,9 @@ /obj/item/clothing/gloves/weddingring/silver name = "silver wedding ring" icon_state = "wedring_s" - item_state = "wedring_s" \ No newline at end of file + item_state = "wedring_s" + +/obj/item/clothing/gloves/color + desc = "A pair of gloves, they don't look special in any way." + item_state_slots = list(slot_r_hand_str = "white", slot_l_hand_str = "white") + icon_state = "latex" diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm index 11dfbfb961..f25da53b4a 100644 --- a/code/modules/clothing/spacesuits/rig/suits/station.dm +++ b/code/modules/clothing/spacesuits/rig/suits/station.dm @@ -80,8 +80,8 @@ /obj/item/rig_module/device/plasmacutter, /obj/item/rig_module/device/drill, /obj/item/rig_module/device/orescanner, - /obj/item/rig_module/vision/meson - ) + /obj/item/rig_module/vision/meson, + /obj/item/rig_module/maneuvering_jets) //VOREStation Edit - Added maneuvering jets /obj/item/weapon/rig/eva name = "EVA suit control module" diff --git a/code/modules/clothing/under/miscellaneous_vr.dm b/code/modules/clothing/under/miscellaneous_vr.dm index 82266df987..3578d18b99 100644 --- a/code/modules/clothing/under/miscellaneous_vr.dm +++ b/code/modules/clothing/under/miscellaneous_vr.dm @@ -3,6 +3,7 @@ desc = "This permit entitles the bearer to conduct their duties without a uniform. Normally issued to furred crewmembers or those with nothing to hide." icon = 'icons/obj/card.dmi' icon_state = "guest" + body_parts_covered = 0 sprite_sheets = list() diff --git a/code/modules/mob/language/generic.dm b/code/modules/mob/language/generic.dm index 7df164c821..ce0abbb948 100644 --- a/code/modules/mob/language/generic.dm +++ b/code/modules/mob/language/generic.dm @@ -21,12 +21,12 @@ // 'basic' language; spoken by default. /datum/language/common name = LANGUAGE_GALCOM - desc = "The common galactic tongue." + desc = "The common galactic tongue, engineered for cross-species communication." speech_verb = "says" whisper_verb = "whispers" key = "0" flags = RESTRICTED - syllables = list("blah","blah","blah","bleh","meh","neh","nah","wah") + syllables = list("vol", "zum", "coo","zoo","bi","do","ooz","ite","og","re","si","ite","ish","ar","at","on","ee","east","ma","da", "rim") //TODO flag certain languages to use the mob-type specific say_quote and then get rid of these. /datum/language/common/get_spoken_verb(var/msg_end) diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm index b69c9cca5f..8e2f2987c9 100644 --- a/code/modules/mob/language/station.dm +++ b/code/modules/mob/language/station.dm @@ -72,24 +72,25 @@ /datum/language/skrell name = LANGUAGE_SKRELLIAN - desc = "A melodic and complex language spoken by the Skrell of Qerrbalak. Some of the notes are inaudible to humans." + desc = "A set of warbles and hums, the language itself a complex mesh of both melodic and rhythmic components, exceptionally capable of conveying intent and emotion of the speaker." speech_verb = "warbles" ask_verb = "warbles" - exclaim_verb = "warbles" + exclaim_verb = "sings" + whisper_verb = "hums" colour = "skrell" key = "k" + space_chance = 30 flags = WHITELISTED - syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix","*","!") + syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix","*","!", "'") /datum/language/human name = LANGUAGE_SOL_COMMON - desc = "A bastardized hybrid of informal English and elements of Mandarin Chinese; the common language of the Sol system." + desc = "A bastardized hybrid of many languages, including Chinese, English, French, and more; it is the common language of the Sol system." speech_verb = "says" whisper_verb = "whispers" colour = "solcom" key = "1" flags = WHITELISTED - //syllables are at the bottom of the file /datum/language/human/get_spoken_verb(var/msg_end) @@ -118,7 +119,7 @@ colour = "changeling" key = "6" flags = NO_STUTTER - syllables = list("beep","beep","beep","beep","beep","boop","boop","boop","bop","bop","dee","dee","doo","doo","hiss","hss","buzz","buzz","bzz","ksssh","keey","wurr","wahh","tzzz") + syllables = list("beep","beep","beep","beep","beep","boop","boop","boop","bop","bop","dee","dee","doo","doo","hiss","hss","buzz","buzz","bzz","ksssh","keey","wurr","wahh","tzzz","shh","shk") space_chance = 10 /datum/language/machine/can_speak_special(var/mob/speaker) @@ -155,9 +156,13 @@ /* This list really long, mainly because I can't make up my mind about which mandarin syllables should be removed, and the english syllables had to be duplicated so that there is roughly a 50-50 weighting. + The other 3 languages were duplicated just so they could show occasionally. Sources: http://www.sttmedia.com/syllablefrequency-english + http://www.sttmedia.com/syllablefrequency-spanish + http://www.sttmedia.com/syllablefrequency-russian + http://www.sttmedia.com/syllablefrequency-french http://www.chinahighlights.com/travelguide/learning-chinese/pinyin-syllables.htm */ /datum/language/human/syllables = list( @@ -210,4 +215,31 @@ "al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", "le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", "ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", -"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi") +"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi", +"ah", "be", "bo", "eh", "ep", "et", "ka", "ko", "ha", "he", "ho", "ob", "oh", "op", "oc", "ot", "pa", "pe", "ct", "ta", "te", "to", +"vse", "tak", "nak", "no", "epo", "pre", "kan", "dly", "ime", "sha", "kur", "yey", "khi", "yeg", "ne", +"ion", "ne", "nas", "v", +"ah", "be", "bo", "eh", "ep", "et", "ka", "ko", "ha", "he", "ho", "ob", "oh", "op", "oc", "ot", "pa", "pe", "ct", "ta", "te", "to", +"vse", "tak", "nak", "no", "epo", "pre", "kan", "dly", "ime", "sha", "kur", "yey", "khi", "yeg", "ne", +"ion", "ne", "nas", "v", +"ah", "be", "bo", "eh", "ep", "et", "ka", "ko", "ha", "he", "ho", "ob", "oh", "op", "oc", "ot", "pa", "pe", "ct", "ta", "te", "to", +"vse", "tak", "nak", "no", "epo", "pre", "kan", "dly", "ime", "sha", "kur", "yey", "khi", "yeg", "ne", +"ion", "ne", "nas", "v", +"ai", "an", "ar", "au", "ce", "ch", "co", "de", "em", "en", "er", "es", "et", "eu", "il", "in", "is", "la", "le", +"ma", "me", "ne", "ns", "nt", "on", "ou", "pa", "qu", "ra", "re", "se", "te", "ti", "tr", "ue", "ur", "us", "ve", +"tou", "e", "eve", "hen", "son", "non", "not", "le", +"ai", "an", "ar", "au", "ce", "ch", "co", "de", "em", "en", "er", "es", "et", "eu", "il", "in", "is", "la", "le", +"ma", "me", "ne", "ns", "nt", "on", "ou", "pa", "qu", "ra", "re", "se", "te", "ti", "tr", "ue", "ur", "us", "ve", +"tou", "e", "eve", "hen", "son", "non", "not", "le", +"ai", "an", "ar", "au", "ce", "ch", "co", "de", "em", "en", "er", "es", "et", "eu", "il", "in", "is", "la", "le", +"ma", "me", "ne", "ns", "nt", "on", "ou", "pa", "qu", "ra", "re", "se", "te", "ti", "tr", "ue", "ur", "us", "ve", +"tou", "e", "eve", "hen", "son", "non", "not", "le", +"ad", "al", "an", "ar", "as", "ci", "co", "de", "do", "el", "en", "er", "es", "ie", "in", "la", "lo", "me", "na", +"no", "nt", "or", "os", "pa", "qu", "ra", "re", "ro", "se", "st", "ta", "te", "to", "ue", "un", +"tod", "ser", "su", "no", "nue", "el", +"ad", "al", "an", "ar", "as", "ci", "co", "de", "do", "el", "en", "er", "es", "ie", "in", "la", "lo", "me", "na", +"no", "nt", "or", "os", "pa", "qu", "ra", "re", "ro", "se", "st", "ta", "te", "to", "ue", "un", +"tod", "ser", "su", "no", "nue", "el", +"ad", "al", "an", "ar", "as", "ci", "co", "de", "do", "el", "en", "er", "es", "ie", "in", "la", "lo", "me", "na", +"no", "nt", "or", "os", "pa", "qu", "ra", "re", "ro", "se", "st", "ta", "te", "to", "ue", "un", +"tod", "ser", "su", "no", "nue", "el") \ No newline at end of file diff --git a/code/modules/mob/language/station_vr.dm b/code/modules/mob/language/station_vr.dm index fef74710af..6a51cad598 100644 --- a/code/modules/mob/language/station_vr.dm +++ b/code/modules/mob/language/station_vr.dm @@ -62,6 +62,3 @@ flags = 0 /datum/language/gutter flags = WHITELISTED -/datum/language/machine - flags = NO_STUTTER | WHITELISTED - diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index e613397288..f68ad50751 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -438,7 +438,7 @@ if(print_flavor_text()) msg += "[print_flavor_text()]\n" // VOREStation Start - if(config.allow_Metadata && client) + if(ooc_notes) msg += "OOC Notes: \[View\]\n" // VOREStation End msg += "*---------*
" diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index d8af255869..efd0c787a6 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1644,6 +1644,8 @@ holder1.icon_state = "hud_imp_tracking" if(istype(I,/obj/item/weapon/implant/loyalty)) holder2.icon_state = "hud_imp_loyal" + if(istype(I,/obj/item/weapon/implant/backup))//VOREStation Edit - Commandeering this for backup implants + holder2.icon_state = "hud_imp_loyal" //VOREStation Edit if(istype(I,/obj/item/weapon/implant/chem)) holder3.icon_state = "hud_imp_chem" diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 6a3b4c7ad1..93c06a647f 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -187,12 +187,18 @@ return sanitizeName(name) /datum/species/proc/equip_survival_gear(var/mob/living/carbon/human/H,var/extendedtank = 1) + var/boxtype = /obj/item/weapon/storage/box/survival //Default survival box + if(H.isSynthetic()) + boxtype = /obj/item/weapon/storage/box //Empty box for synths + else if(extendedtank) + boxtype = /obj/item/weapon/storage/box/engineer //Special box for engineers + if(H.backbag == 1) - if (extendedtank) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand) - else H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) + if (extendedtank) H.equip_to_slot_or_del(new boxtype(H), slot_r_hand) + else H.equip_to_slot_or_del(new boxtype(H), slot_r_hand) else - if (extendedtank) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H.back), slot_in_backpack) - else H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) + if (extendedtank) H.equip_to_slot_or_del(new boxtype(H.back), slot_in_backpack) + else H.equip_to_slot_or_del(new boxtype(H.back), slot_in_backpack) /datum/species/proc/create_organs(var/mob/living/carbon/human/H) //Handles creation of mob organs. diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 17b9bd3466..e27042b9a1 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -485,15 +485,17 @@ default behaviour is: set name = "Examine Meta-Info (OOC)" set category = "OOC" set src in view() - + //VOREStation Edit Start - Making it so SSD people have prefs with fallback to original style. if(config.allow_Metadata) - if(client) + if(ooc_notes) + usr << "[src]'s Metainfo:
[ooc_notes]" + else if(client) usr << "[src]'s Metainfo:
[client.prefs.metadata]" else usr << "[src] does not have any stored infomation!" else usr << "OOC Metadata is not supported by this server!" - + //VOREStation Edit End - Making it so SSD people have prefs with fallback to original style. return /mob/living/Move(a, b, flag) diff --git a/code/modules/mob/living/living_defines_vr.dm b/code/modules/mob/living/living_defines_vr.dm new file mode 100644 index 0000000000..566c21dad8 --- /dev/null +++ b/code/modules/mob/living/living_defines_vr.dm @@ -0,0 +1,2 @@ +/mob/living + var/ooc_notes = null \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index dbe09db217..1a1af2e300 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -75,7 +75,7 @@ var/list/mob_hat_cache = list() /mob/living/silicon/robot/drone/New() ..() - + verbs += /mob/living/proc/ventcrawl //VOREStation Edit - Rule of fun bruh. verbs += /mob/living/proc/hide remove_language("Robot Talk") add_language("Robot Talk", 0) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_vr.dm b/code/modules/mob/living/silicon/robot/drone/drone_vr.dm new file mode 100644 index 0000000000..77e2a4ed41 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/drone/drone_vr.dm @@ -0,0 +1,9 @@ +/mob/living/silicon/robot/drone + can_enter_vent_with = list( + /obj/item/device/radio/borg, + /obj/machinery/camera, + /obj/item/device/camera/siliconcam/drone_camera, + /obj/item/weapon/robot_module/drone, + /obj/item/weapon/cell, + /obj/screen/movable/ability_master, + /obj/item/weapon/card/id/synthetic) diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index e2810ad641..4b8cf3263c 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -70,7 +70,7 @@ var/obj/machinery/hologram/holopad/T = src.holo if(T && T.masters[src])//If there is a hologram and its master is the user. - + var/obj/effect/overlay/aiholo/hologram = T.masters[src] //VOREStation Add for people in the hologram to hear the messages //Human-like, sorta, heard by those who understand humans. var/rendered_a //Speach distorted, heard by those who do not understand AIs. @@ -85,7 +85,7 @@ rendered_a = "[name] [verb], \"[message]\"" rendered_b = "[voice_name] [verb], \"[message_stars]\"" src << "Holopad transmitted, [real_name] [verb], \"[message]\""//The AI can "hear" its own message. - + if(hologram.bellied) hologram.bellied.show_message(rendered_a, 2) //VOREStation Add so holobellied people can hear for(var/mob/M in hearers(T.loc))//The location is the object, default distance. if(M.say_understands(src))//If they understand AI speak. Humans and the like will be able to. M.show_message(rendered_a, 2) @@ -111,7 +111,8 @@ if(T && T.masters[src]) var/rendered = "[name] [message]" src << "Holopad action relayed, [real_name] [message]" - + var/obj/effect/overlay/aiholo/hologram = T.masters[src] //VOREStation Add for people in the hologram to hear the messages + if(hologram.bellied) hologram.bellied.show_message(rendered, 2) //VOREStation Add so holobellied people can hear for(var/mob/M in viewers(T.loc)) M.show_message(rendered, 2) else //This shouldn't occur, but better safe then sorry. diff --git a/code/modules/mob/living/simple_animal/hostile/vore/alien.dm b/code/modules/mob/living/simple_animal/hostile/vore/alien.dm index aec28d337a..94b95d3a8f 100644 --- a/code/modules/mob/living/simple_animal/hostile/vore/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/vore/alien.dm @@ -3,7 +3,7 @@ desc = "Hiss!" icon_state = "xenohunter" icon_living = "xenohunter" - icon_dead = "xenohunter_dead" + icon_dead = "xenohunter-dead" icon_gib = "gibbed-a" response_help = "pokes" response_disarm = "shoves" @@ -39,7 +39,7 @@ name = "alien drone" icon_state = "xenodrone" icon_living = "xenodrone" - icon_dead = "xenodrone_dead" + icon_dead = "xenodrone-dead" health = 60 melee_damage_lower = 15 melee_damage_upper = 15 @@ -48,7 +48,7 @@ name = "alien sentinel" icon_state = "xenosentinel" icon_living = "xenosentinel" - icon_dead = "xenosentinel_dead" + icon_dead = "xenosentinel-dead" health = 120 melee_damage_lower = 30 // Buffed from 15 since vore doesn't work for ranged mobs. melee_damage_upper = 30 @@ -61,7 +61,7 @@ name = "alien queen" icon_state = "xenoqueen" icon_living = "xenoqueen" - icon_dead = "xenoqueen_dead" + icon_dead = "xenoqueen-dead" maxHealth = 250 melee_damage_lower = 30 // Buffed from 15 since vore doesn't work for ranged mobs. melee_damage_upper = 30 diff --git a/code/modules/paperwork/papershredder.dm b/code/modules/paperwork/papershredder.dm index 48e95071c5..3283e67f7d 100644 --- a/code/modules/paperwork/papershredder.dm +++ b/code/modules/paperwork/papershredder.dm @@ -1,10 +1,19 @@ +// +// Paper Shredder Machine +// /obj/machinery/papershredder name = "paper shredder" desc = "For those documents you don't want seen." - icon = 'icons/obj/bureaucracy.dmi' - icon_state = "papershredder0" + icon = 'icons/obj/papershredder.dmi' + icon_state = "shredder-off" + var/shred_anim = "shredder-shredding" density = 1 anchored = 1 + use_power = 1 + idle_power_usage = 10 + active_power_usage = 200 + power_channel = EQUIP + circuit = /obj/item/weapon/circuitboard/papershredder var/max_paper = 10 var/paperamount = 0 var/list/shred_amounts = list( @@ -16,17 +25,40 @@ /obj/item/weapon/paper_bundle = 3, ) +/obj/machinery/papershredder/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/stock_parts/motor(src) + component_parts += new /obj/item/weapon/stock_parts/gear(src) + component_parts += new /obj/item/weapon/stock_parts/gear(src) + component_parts += new /obj/item/weapon/stock_parts/micro_laser(src) + RefreshParts() + update_icon() + /obj/machinery/papershredder/attackby(var/obj/item/W, var/mob/user) if(istype(W, /obj/item/weapon/storage)) empty_bin(user, W) return + else if(istype(W, /obj/item/weapon/wrench)) + playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) + anchored = !anchored + user << "You [anchored ? "wrench" : "unwrench"] \the [src]." + return + else if(default_part_replacement(user, W)) + return + else if(default_deconstruction_screwdriver(user, W)) + return + else if(default_deconstruction_crowbar(user, W)) + return else var/paper_result for(var/shred_type in shred_amounts) if(istype(W, shred_type)) paper_result = shred_amounts[shred_type] if(paper_result) + if(inoperable()) + return // Need powah! if(paperamount == max_paper) user << "\The [src] is full; please empty it before you continue." return @@ -34,6 +66,7 @@ user.drop_from_inventory(W) qdel(W) playsound(src.loc, 'sound/items/pshred.ogg', 75, 1) + flick(shred_anim, src) if(paperamount > max_paper) user <<"\The [src] was too full, and shredded paper goes everywhere!" for(var/i=(paperamount-max_paper);i>0;i--) @@ -92,8 +125,40 @@ paperamount-- return PoolOrNew(/obj/item/weapon/shreddedp, get_turf(src)) +/obj/machinery/papershredder/power_change() + ..() + spawn(rand(0,15)) + update_icon() + /obj/machinery/papershredder/update_icon() - icon_state = "papershredder[max(0,min(5,Floor(paperamount/2)))]" + overlays.Cut() + if(operable()) + icon_state = "shredder-on" + else + icon_state = "shredder-off" + // Fullness overlay + overlays += "shredder-[max(0,min(5,Floor(paperamount/max_paper*5)))]" + if (panel_open) + overlays += "panel_open" + +// +// Shredded Paper Item +// + +/obj/item/weapon/shreddedp + name = "shredded paper" + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "shredp" + throwforce = 0 + w_class = ITEMSIZE_TINY + throw_range = 3 + throw_speed = 1 + +/obj/item/weapon/shreddedp/New() + ..() + pixel_x = rand(-5,5) + pixel_y = rand(-5,5) + if(prob(65)) color = pick("#BABABA","#7F7F7F") /obj/item/weapon/shreddedp/attackby(var/obj/item/W as obj, var/mob/user) if(istype(W, /obj/item/weapon/flame/lighter)) @@ -122,18 +187,3 @@ M.drop_from_inventory(src) PoolOrNew(/obj/effect/decal/cleanable/ash,get_turf(src)) qdel(src) - -/obj/item/weapon/shreddedp - name = "shredded paper" - icon = 'icons/obj/bureaucracy.dmi' - icon_state = "shredp" - throwforce = 0 - w_class = ITEMSIZE_TINY - throw_range = 3 - throw_speed = 1 - -/obj/item/weapon/shreddedp/New() - ..() - pixel_x = rand(-5,5) - pixel_y = rand(-5,5) - if(prob(65)) color = pick("#BABABA","#7F7F7F") diff --git a/code/modules/projectiles/guns/energy/particle.dm b/code/modules/projectiles/guns/energy/particle.dm index bb50366ec7..ab20585b49 100644 --- a/code/modules/projectiles/guns/energy/particle.dm +++ b/code/modules/projectiles/guns/energy/particle.dm @@ -1,11 +1,20 @@ -/obj/item/weapon/gun/energy/particle - name = "Antiparticle projector gun" +/obj/item/weapon/gun/energy/particle //base gun, similar stats to an egun + name = "Antiparticle projector pistol" icon = 'icons/obj/gun_vr.dmi' - icon_state = "particle" - item_state = "particle" - desc = "An unconventional firearm, APP guns generate attogram-scale quantities of antimatter which are then launched using an electromagnetic field." - force = 5 - fire_sound = 'sound/weapons/Laser.ogg' + icon_state = "ppistol" + item_state = "ppistol_item" + icon_override = 'icons/obj/gun_vr.dmi' + item_icons = null + desc = "A Kawashima Material Technology Model 7 anti-particle projector, housed in a rugged casing." + description_info = "An unconventional weapon, APP guns generate attogram-scale quantities of antimatter which \ + are then launched using an electromagnetic field. They are only suitable for use in depressurised environments, \ + else the antimatter pellet is liable to strike the air before it reaches the target. This can result in catastrophic \ + failure, making them unsuitable as military weapons in practical situations as they are prone to backfiring and \ + jamming, though they perform as adequately as any laser weapon in vacuum. Nonetheless, they have found a niche among \ + miners and salvage crews, as their lack of usefulness as a firearm in habitable areas means most authorities do not \ + classify them as dangerous weapons (at least, not dangerous to whoever they're pointed at) - instead, in most \ + jurisdictions including NT space, APP guns are officially classed as mining equipment rather than firearms." + fire_sound = 'sound/weapons/blaster.ogg' slot_flags = SLOT_BELT w_class = ITEMSIZE_NORMAL projectile_type = /obj/item/projectile/bullet/particle @@ -13,8 +22,45 @@ fire_delay = 10 charge_cost = 240 //same cost as lasers var/safetycatch = 0 //if 1, won't let you fire in pressurised environment, rather than malfunctioning + var/obj/item/pressurelock/attached_safety +/obj/item/weapon/gun/energy/particle/advanced //particle equivalent of AEG + name = "Advanced antiparticle rifle" + icon_state = "particle" + item_state = "particle_item" + desc = "An antiparticle projector gun with an enhanced power-generation unit." + slot_flags = SLOT_BELT + force = 8 //looks heavier than a pistol + w_class = ITEMSIZE_LARGE //bigger than a pistol, too. + fire_delay = 6 //This one's not a handgun, it should have the same fire delay as everything else + self_recharge = 1 + modifystate = null + battery_lock = 1 + recharge_time = 15 // every 15 ticks, recharge 2 shots. Rather slower than AEG. + charge_delay = 20 //Starts recharging faster after firing than an AEG, but much slower recharge rate. Balances out for a full charge. + +/obj/item/weapon/gun/energy/particle/cannon //particle version of laser cannon + name = "Anti-particle cannon" + desc = "A giant beast of an antimatter gun, packed with an internal reactor to allow for extreme longevity on remote mining expeditions." + icon_state = "heavyparticle" + item_state = "heavyparticle_item" + fire_sound = 'sound/weapons/lasercannonfire.ogg' + slot_flags = SLOT_BACK + projectile_type = /obj/item/projectile/bullet/particle/heavy + battery_lock = 1 + fire_delay = 20 + w_class = ITEMSIZE_HUGE // So it can't fit in a backpack. + force = 10 + one_handed_penalty = 6 // The thing's heavy and huge. + accuracy = 3 + charge_cost = 480 // 5 shots + self_recharge = 1 + charge_delay = 20 //won't start charging until it's ready to fire again + recharge_time = 20 //100 ticks after that to refill the whole thing. + +//special behaviours for particle guns below + /obj/item/weapon/gun/energy/particle/special_check(var/mob/user) if (..()) var/turf/T = get_turf(src) @@ -32,56 +78,113 @@ return 0 else if (prob(min(pressure, 100))) //pressure% chance of failing var/severity = rand(pressure) - if (severity <= 10) // just doesn't fire. 10% chance in 100 atmo. - user.visible_message("*click*", "\The [src] jams.") - playsound(src.loc, 'sound/weapons/empty.ogg', 100, 1) - else if (severity <= 60) //50% chance of fizzling and wasting a shot - user.visible_message("\The [user] fires \the [src], but the shot fizzles in the air!", "You fire \the [src], but the shot fizzles in the air!") - power_supply.charge -= charge_cost - playsound(src.loc, fire_sound, 100, 1) - var/datum/effect/effect/system/spark_spread/sparks = PoolOrNew(/datum/effect/effect/system/spark_spread) - sparks.set_up(2, 1, T) - sparks.start() - update_icon() - else if (severity <= 80) //20% chance of shorting out and emptying the cell - user.visible_message("\The [user] pulls the trigger, but \the [src] shorts out!", "You pull the trigger, but \the [src] shorts out!") - power_supply.charge = 0 - var/datum/effect/effect/system/spark_spread/sparks = PoolOrNew(/datum/effect/effect/system/spark_spread) - sparks.set_up(2, 1, T) - sparks.start() - update_icon() - else if (severity <= 90) //10% chance of breaking the gun - user.visible_message("\The [user] pulls the trigger, but \the [src] erupts in a shower of sparks!", "You pull the trigger, but \the [src] bursts into a shower of sparks!") - var/datum/effect/effect/system/spark_spread/sparks = PoolOrNew(/datum/effect/effect/system/spark_spread) - sparks.set_up(2, 1, T) - sparks.start() - power_supply.charge = 0 - power_supply.maxcharge = 0 - power_supply.desc += " It seems to be burnt out!" - desc += " The casing is covered in scorch-marks." - fire_delay += fire_delay // even if you swap out the cell for a good one, the gun's cluckety-clucked. - charge_cost += charge_cost - update_icon() - else if (severity <= 150) // 10% chance of exploding - user << "The [src] explodes!" - explosion(T, -1, -1, 1, 1) - qdel(src) - else //can only possibly happen if you're dumb enough to fire it in an OVER pressure environment, over 150kPa - user << "The [src] explodes catastrophically!" - explosion(T, -1, 1, 2, 2) - qdel(src) + pressuremalfunction(severity, user, T) return 0 return 1 return 0 +/obj/item/weapon/gun/energy/particle/proc/pressuremalfunction(severity, var/mob/user, var/turf/T) + if (severity <= 10) // just doesn't fire. 10% chance in 100 atmo. + user.visible_message("*click*", "\The [src] jams.") + playsound(src.loc, 'sound/weapons/empty.ogg', 100, 1) + else if (severity <= 60) //50% chance of fizzling and wasting a shot + user.visible_message("\The [user] fires \the [src], but the shot fizzles in the air!", "You fire \the [src], but the shot fizzles in the air!") + power_supply.charge -= charge_cost + playsound(src.loc, fire_sound, 100, 1) + var/datum/effect/effect/system/spark_spread/sparks = PoolOrNew(/datum/effect/effect/system/spark_spread) + sparks.set_up(2, 1, T) + sparks.start() + update_icon() + else if (severity <= 80) //20% chance of shorting out and emptying the cell + user.visible_message("\The [user] pulls the trigger, but \the [src] shorts out!", "You pull the trigger, but \the [src] shorts out!") + power_supply.charge = 0 + var/datum/effect/effect/system/spark_spread/sparks = PoolOrNew(/datum/effect/effect/system/spark_spread) + sparks.set_up(2, 1, T) + sparks.start() + update_icon() + else if (severity <= 90) //10% chance of breaking the gun + user.visible_message("\The [user] pulls the trigger, but \the [src] erupts in a shower of sparks!", "You pull the trigger, but \the [src] bursts into a shower of sparks!") + var/datum/effect/effect/system/spark_spread/sparks = PoolOrNew(/datum/effect/effect/system/spark_spread) + sparks.set_up(2, 1, T) + sparks.start() + power_supply.charge = 0 + power_supply.maxcharge = 1 //just to avoid div/0 runtimes + power_supply.desc += " It seems to be burnt out!" + desc += " The casing is covered in scorch-marks." + fire_delay += fire_delay // even if you swap out the cell for a good one, the gun's cluckety-clucked. + charge_cost += charge_cost + update_icon() + else if (severity <= 150) // 10% chance of exploding + user.visible_message("\The [user] pulls the trigger, but \the [src] explodes!", "The [src] explodes!") + log_and_message_admins("blew themself up with a particle gun.", user) + explosion(T, -1, -1, 1, 1) + qdel(src) + else //can only possibly happen if you're dumb enough to fire it in an OVER pressure environment, over 150kPa + user.visible_message("\The [user] pulls the trigger, but \the [src] explodes!", "The [src] explodes catastrophically!") + log_and_message_admins("blew their dumb ass up with a particle gun.", user) + explosion(T, -1, 1, 2, 2) + qdel(src) + +/obj/item/weapon/gun/energy/particle/cannon/pressuremalfunction(severity, user, T) + ..(severity*2, user, T) + + +/obj/item/weapon/gun/energy/particle/attackby(var/obj/item/A as obj, mob/user as mob) + if(istype(A, /obj/item/pressurelock)) + if(safetycatch) + user << "\The [src] already has a [attached_safety]." + return + user << "You insert \the [A] into \the [src]." + user.drop_item() + A.loc = src + attached_safety = A + safetycatch = 1 + return + + if(istype(A, /obj/item/weapon/screwdriver)) + if(safetycatch && attached_safety) + user << "You begin removing \the [attached_safety] from \the [src]." + if(do_after(user, 25)) + user << "You remove \the [attached_safety] from \the [src]." + user.put_in_hands(attached_safety) + safetycatch = 0 + attached_safety = null + return + ..() + + +// accessory + +/obj/item/pressurelock + name = "Pressure interlock" + icon = 'icons/obj/gun_vr.dmi' + icon_state = "pressurelock" + desc = "A safety interlock that can be installed in an antiparticle projector. It prevents the weapon from discharging in pressurised environments." + w_class = ITEMSIZE_TINY + // projectiles below /obj/item/projectile/bullet/particle - name = "particle" + name = "antimatter pellet" icon = 'icons/obj/projectiles_vr.dmi' icon_state = "particle" damage = 40 damage_type = BURN check_armour = "energy" embed_chance = 0 + +/obj/item/projectile/bullet/particle/heavy + name = "antimatter slug" + icon_state = "particle-heavy" + damage = 80 // same as a laser cannon + armor_penetration = 25 //it explodes on the surface of things, so less armor pen than the laser cannon + light_range = 3 + light_power = 1 + light_color = "#CCFFFF" + +/turf/simulated/mineral/bullet_act(var/obj/item/projectile/Proj) + if(istype(Proj, /obj/item/projectile/bullet/particle)) + if(prob(Proj.damage)) + GetDrilled() + diff --git a/code/modules/reagents/reagent_containers/food/z_custom_food_vr.dm b/code/modules/reagents/reagent_containers/food/z_custom_food_vr.dm new file mode 100644 index 0000000000..eeeb9896ef --- /dev/null +++ b/code/modules/reagents/reagent_containers/food/z_custom_food_vr.dm @@ -0,0 +1,279 @@ +// Customizable Foods ////////////////////////////////////////// +var/global/deepFriedEverything = 0 +var/global/deepFriedNutriment = 0 +var/global/foodNesting = 0 +var/global/recursiveFood = 0 +var/global/ingredientLimit = 20 + + +/obj/item/weapon/reagent_containers/food/snacks/customizable + icon = 'icons/obj/food_custom.dmi' + trash = /obj/item/trash/plate + bitesize = 2 + + var/ingMax = 100 + var/list/ingredients = list() + var/stackIngredients = 0 + var/fullyCustom = 0 + var/addTop = 0 + var/image/topping + var/image/filling + +/obj/item/weapon/reagent_containers/food/snacks/customizable/New(loc,ingredient) + . = ..() + topping = image(icon,,"[initial(icon_state)]_top") + filling = image(icon,,"[initial(icon_state)]_filling") + src.reagents.add_reagent("nutriment",3) + src.updateName() + return + +/obj/item/weapon/reagent_containers/food/snacks/customizable/attackby(obj/item/I, mob/user) + if(istype(I,/obj/item/weapon/reagent_containers/food/snacks)) + if((contents.len >= ingMax) || (contents.len >= ingredientLimit)) + to_chat(user, "That's already looking pretty stuffed.") + return + + var/obj/item/weapon/reagent_containers/food/snacks/S = I + if(istype(S,/obj/item/weapon/reagent_containers/food/snacks/customizable)) + var/obj/item/weapon/reagent_containers/food/snacks/customizable/SC = S + if(fullyCustom && SC.fullyCustom) + to_chat(user, "You slap yourself on the back of the head for thinking that stacking plates is an interesting dish.") + return + if(!recursiveFood && istype(I, /obj/item/weapon/reagent_containers/food/snacks/customizable)) + //to_chat(user, "[pick("As uniquely original as that idea is, you can't figure out how to perform it.","That would be a straining topological exercise.","This world just isn't ready for your cooking genius.","It's possible that you may have a problem.","It won't fit.","You don't think that would taste very good.","Quit goofin' around.")]") + to_chat(user, "As uniquely original as that idea is, you can't figure out how to perform it.") + return + /*if(!user.drop_item()) + user << "\The [I] is stuck to your hands!" + return*/ + user.drop_item() + I.forceMove(src) + + S.reagents.trans_to(src,S.reagents.total_volume) + ingredients += S + + if(src.addTop) + overlays -= topping //thank you Comic + if(!fullyCustom && !stackIngredients && overlays.len) + overlays -= filling //we can't directly modify the overlay, so we have to remove it and then add it again + var/newcolor = S.filling_color != "#FFFFFF" ? S.filling_color : AverageColor(getFlatIcon(S, S.dir, 0), 1, 1) + filling.color = BlendRGB(filling.color, newcolor, 1/ingredients.len) + overlays += filling + else + overlays += generateFilling(S) + if(addTop) + drawTopping() + + updateName() + to_chat(user, "You add the [I.name] to the [src.name].") + else + . = ..() + return + +/obj/item/weapon/reagent_containers/food/snacks/customizable/proc/generateFilling(var/obj/item/weapon/reagent_containers/food/snacks/S, params) + var/image/I + if(fullyCustom) + var/icon/C = getFlatIcon(S, S.dir, 0) + I = image(C) + I.pixel_y = 12 * empty_Y_space(C) + else + I = filling + if(istype(S) && S.filling_color != "#FFFFFF") + I.color = S.filling_color + else + I.color = AverageColor(getFlatIcon(S, S.dir, 0), 1, 1) + if(src.stackIngredients) + I.pixel_y = src.ingredients.len * 2 + else + src.overlays.len = 0 + if(src.fullyCustom || src.stackIngredients) + var/clicked_x = text2num(params2list(params)["icon-x"]) + if (isnull(clicked_x)) + I.pixel_x = 0 + else if (clicked_x < 9) + I.pixel_x = -2 //this looks pretty shitty + else if (clicked_x < 14) + I.pixel_x = -1 //but hey + else if (clicked_x < 19) + I.pixel_x = 0 //it works + else if (clicked_x < 25) + I.pixel_x = 1 + else + I.pixel_x = 2 + return I + +/obj/item/weapon/reagent_containers/food/snacks/customizable/proc/updateName() + var/i = 1 + var/new_name + for(var/obj/item/S in ingredients) + if(i == 1) + new_name += "[S.name]" + else if(i == src.ingredients.len) + new_name += " and [S.name]" + else + new_name += ", [S.name]" + i++ + new_name = "[new_name] [initial(name)]" + if(length(new_name) >= 150) + name = "something yummy" + else + name = new_name + return new_name + +/obj/item/weapon/reagent_containers/food/snacks/customizable/Destroy() + for(. in ingredients) qdel(.) + return ..() + +/obj/item/weapon/reagent_containers/food/snacks/customizable/proc/drawTopping() + var/image/I = topping + I.pixel_y = (ingredients.len+1)*2 + overlays += I + + +// Sandwiches ////////////////////////////////////////////////// + +/obj/item/weapon/reagent_containers/food/snacks/customizable/sandwich + name = "sandwich" + desc = "A timeless classic." + icon_state = "c_sandwich" + stackIngredients = 1 + addTop = 0 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/sandwich/attackby(obj/item/I,mob/user) + if(istype(I,/obj/item/weapon/reagent_containers/food/snacks/breadslice) && !addTop) + I.reagents.trans_to(src,I.reagents.total_volume) + qdel(I) + addTop = 1 + src.drawTopping() + else + ..() + +/obj/item/weapon/reagent_containers/food/snacks/customizable/burger + name = "burger" + desc = "The apex of space culinary achievement." + icon_state = "c_burger" + stackIngredients = 1 + addTop = 1 + +// Misc Subtypes /////////////////////////////////////////////// + +/obj/item/weapon/reagent_containers/food/snacks/customizable/fullycustom + name = "on a plate" + desc = "A unique dish." + icon_state = "fullycustom" + fullyCustom = 1 //how the fuck do you forget to add this? + ingMax = 1 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/soup + name = "soup" + desc = "A bowl with liquid and... stuff in it." + icon_state = "soup" + trash = /obj/item/trash/bowl + +/obj/item/weapon/reagent_containers/food/snacks/customizable/pizza + name = "pan pizza" + desc = "A personalized pan pizza meant for only one person." + icon_state = "personal_pizza" + +/obj/item/weapon/reagent_containers/food/snacks/customizable/pasta + name = "spaghetti" + desc = "Noodles. With stuff. Delicious." + icon_state = "pasta_bot" + +// Various Snacks ////////////////////////////////////////////// + +/obj/item/weapon/reagent_containers/food/snacks/breadslice/attackby(obj/item/I,mob/user,params) + if(istype(I,/obj/item/weapon/reagent_containers/food/snacks)) + if(!recursiveFood && istype(I, /obj/item/weapon/reagent_containers/food/snacks/customizable)) + to_chat(user, "Sorry, no recursive food.") + return + var/obj/F = new/obj/item/weapon/reagent_containers/food/snacks/customizable/sandwich(get_turf(src),I) //boy ain't this a mouthful + F.attackby(I, user) + qdel(src) + else + return ..() + +/obj/item/weapon/reagent_containers/food/snacks/bun/attackby(obj/item/I, mob/user) + // Bun + meatball = burger + if(istype(I,/obj/item/weapon/reagent_containers/food/snacks/meatball)) + new /obj/item/weapon/reagent_containers/food/snacks/monkeyburger(src) + to_chat(user, "You make a burger.") + qdel(I) + qdel(src) + + // Bun + cutlet = hamburger + else if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/cutlet)) + new /obj/item/weapon/reagent_containers/food/snacks/monkeyburger(src) + to_chat(user, "You make a burger.") + qdel(I) + qdel(src) + + // Bun + sausage = hotdog + else if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/sausage)) + new /obj/item/weapon/reagent_containers/food/snacks/hotdog(src) + to_chat(user, "You make a hotdog.") + qdel(I) + qdel(src) + + if(istype(I,/obj/item/weapon/reagent_containers/food/snacks)) + if(!recursiveFood && istype(I, /obj/item/weapon/reagent_containers/food/snacks/customizable)) + to_chat(user, "Sorry, no recursive food.") + return + var/obj/F = new/obj/item/weapon/reagent_containers/food/snacks/customizable/burger(get_turf(src),I) + F.attackby(I, user) + qdel(src) + else + return ..() + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/weapon/reagent_containers/food/snacks)) + if(!recursiveFood && istype(I, /obj/item/weapon/reagent_containers/food/snacks/customizable)) + to_chat(user, "Sorry, no recursive food.") + return + var/obj/F = new/obj/item/weapon/reagent_containers/food/snacks/customizable/pizza(get_turf(src),I) + F.attackby(I, user) + qdel(src) + else + return ..() + +/obj/item/weapon/reagent_containers/food/snacks/spagetti/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/weapon/reagent_containers/food/snacks)) + if(!recursiveFood && istype(I, /obj/item/weapon/reagent_containers/food/snacks/customizable)) + to_chat(user, "Sorry, no recursive food.") + return + var/obj/F = new/obj/item/weapon/reagent_containers/food/snacks/customizable/pasta(get_turf(src),I) + F.attackby(I, user) + qdel(src) + else + return ..() + +// Custom Meals //////////////////////////////////////////////// +/* +/obj/item/trash/plate/attackby(obj/item/I, mob/user) + if(istype(I,/obj/item/weapon/reagent_containers/food/snacks)) + if(istype(I,/obj/item/weapon/reagent_containers/food/snacks/customizable/fullycustom)) //no platestacking even with recursive food, for now + to_chat(user, "That's already got a plate!") + return + var/obj/F = new/obj/item/weapon/reagent_containers/food/snacks/customizable/fullycustom(get_turf(src),I) + F.attackby(I, user) + qdel(src) + else + return ..() +*/ + +/obj/item/trash/bowl + name = "bowl" + desc = "An empty bowl. Put some food in it to start making a soup." + icon = 'icons/obj/food_custom.dmi' + icon_state = "soup" + +/obj/item/trash/bowl/attackby(obj/item/I, mob/user) + if(istype(I,/obj/item/weapon/reagent_containers/food/snacks)) + if(!recursiveFood && istype(I, /obj/item/weapon/reagent_containers/food/snacks/customizable)) + to_chat(user, "Sorry, no recursive food.") + return + var/obj/F = new/obj/item/weapon/reagent_containers/food/snacks/customizable/soup(get_turf(src),I) + F.attackby(I, user) + qdel(src) + else + return ..() diff --git a/code/modules/research/designs_vr.dm b/code/modules/research/designs_vr.dm index 4fd5e46a07..017715aa18 100644 --- a/code/modules/research/designs_vr.dm +++ b/code/modules/research/designs_vr.dm @@ -14,6 +14,13 @@ materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 7000, "gold" = 2000, "diamond" = 3000) build_path = /obj/item/weapon/implantcase/vrlanguage +/datum/design/item/implant/backup + name = "backup implant" + id = "implant_backup" + req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 2, TECH_DATA = 4, TECH_ENGINEERING = 2) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 2000) + build_path = /obj/item/weapon/implantcase/backup + /datum/design/item/weapon/sizegun name = "shrink ray" id = "shrinkray" @@ -36,4 +43,41 @@ req_tech = list(TECH_MAGNET = 4, TECH_COMBAT = 3, TECH_BIO = 3) materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 1000) build_path = /obj/item/clothing/glasses/sunglasses/omnihud - sort_string = "GAAFB" \ No newline at end of file + sort_string = "GAAFB" + +// Resleeving Circuitboards + +/datum/design/circuit/comm_server + name = "grower pod" + id = "transhuman_clonepod" + req_tech = list(TECH_DATA = 3, TECH_BIO = 3) + build_path = /obj/item/weapon/circuitboard/transhuman_clonepod + sort_string = "HAADA" + +/datum/design/circuit/transhuman_synthprinter + name = "SynthFab 3000" + id = "transhuman_synthprinter" + req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) + build_path = /obj/item/weapon/circuitboard/transhuman_synthprinter + sort_string = "HAADB" + +/datum/design/circuit/transhuman_resleever + name = "resleeving pod" + id = "transhuman_resleever" + req_tech = list(TECH_ENGINEERING = 4, TECH_BIO = 4) + build_path = /obj/item/weapon/circuitboard/transhuman_resleever + sort_string = "HAADC" + +/datum/design/circuit/resleeving_control + name = "resleeving control console" + id = "resleeving_control" + req_tech = list(TECH_DATA = 5) + build_path = /obj/item/weapon/circuitboard/resleeving_control + sort_string = "HAADE" + +/datum/design/circuit/partslathe + name = "parts lathe" + id = "partslathe" + req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) + build_path = /obj/item/weapon/circuitboard/partslathe + sort_string = "HABAD" diff --git a/code/modules/resleeving/_defines.dm b/code/modules/resleeving/_defines.dm new file mode 100644 index 0000000000..a3cf1fc665 --- /dev/null +++ b/code/modules/resleeving/_defines.dm @@ -0,0 +1,3 @@ +#define MR_NORMAL 0 +#define MR_UNSURE 1 +#define MR_DEAD 2 \ No newline at end of file diff --git a/code/modules/resleeving/circuitboards.dm b/code/modules/resleeving/circuitboards.dm new file mode 100644 index 0000000000..26a02e0430 --- /dev/null +++ b/code/modules/resleeving/circuitboards.dm @@ -0,0 +1,41 @@ +#ifndef T_BOARD +#error T_BOARD macro is not defined but we need it! +#endif + +/obj/item/weapon/circuitboard/transhuman_clonepod + name = T_BOARD("grower pod") + board_type = new /datum/frame/frame_types/machine + build_path = /obj/machinery/clonepod/transhuman + origin_tech = list(TECH_DATA = 3, TECH_BIO = 3) + req_components = list( + /obj/item/stack/cable_coil = 2, + /obj/item/weapon/stock_parts/scanning_module = 2, + /obj/item/weapon/stock_parts/manipulator = 2, + /obj/item/weapon/stock_parts/console_screen = 1) + +/obj/item/weapon/circuitboard/transhuman_synthprinter + name = T_BOARD("SynthFab 3000") + board_type = new /datum/frame/frame_types/machine + build_path = /obj/machinery/transhuman/synthprinter + origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) + req_components = list( + /obj/item/stack/cable_coil = 2, + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/scanning_module = 1, + /obj/item/weapon/stock_parts/manipulator = 2) + +/obj/item/weapon/circuitboard/transhuman_resleever + name = T_BOARD("resleeving pod") + board_type = new /datum/frame/frame_types/machine + build_path = /obj/machinery/transhuman/resleever + origin_tech = list(TECH_ENGINEERING = 4, TECH_BIO = 4) + req_components = list( + /obj/item/stack/cable_coil = 2, + /obj/item/weapon/stock_parts/scanning_module = 2, + /obj/item/weapon/stock_parts/manipulator = 2, + /obj/item/weapon/stock_parts/console_screen = 1) + +/obj/item/weapon/circuitboard/resleeving_control + name = T_BOARD("resleeving control console") + build_path = /obj/machinery/computer/transhuman/resleeving + origin_tech = list(TECH_DATA = 5) diff --git a/code/modules/resleeving/computers.dm b/code/modules/resleeving/computers.dm new file mode 100644 index 0000000000..8516075afb --- /dev/null +++ b/code/modules/resleeving/computers.dm @@ -0,0 +1,376 @@ +/obj/machinery/computer/transhuman/resleeving + name = "resleeving control console" + icon = 'icons/obj/computer.dmi' + icon_keyboard = "med_key" + icon_screen = "dna" + light_color = "#315ab4" + circuit = /obj/item/weapon/circuitboard/resleeving_control + req_access = list(access_heads) //Only used for record deletion right now. + var/list/pods = list() //Linked grower pods. + var/list/spods = list() + var/list/sleevers = list() //Linked resleeving booths. + var/temp = "" + var/menu = 1 //Which menu screen to display + var/datum/transhuman/body_record/active_br = null + var/datum/transhuman/mind_record/active_mr = null + var/datum/transhuman/infocore/TC //Easy debugging access + var/organic_capable = 1 + var/synthetic_capable = 1 + var/obj/item/weapon/disk/transcore/disk + +/obj/machinery/computer/transhuman/resleeving/initialize() + ..() + updatemodules() + TC = transcore + +/obj/machinery/computer/transhuman/resleeving/Destroy() + releasepods() + ..() + +/obj/machinery/computer/transhuman/resleeving/proc/updatemodules() + releasepods() + findpods() + +/obj/machinery/computer/transhuman/resleeving/proc/releasepods() + for(var/obj/machinery/clonepod/transhuman/P in pods) + P.connected = null + P.name = initial(P.name) + pods.Cut() + for(var/obj/machinery/transhuman/synthprinter/P in spods) + P.connected = null + P.name = initial(P.name) + spods.Cut() + for(var/obj/machinery/transhuman/resleever/P in sleevers) + P.connected = null + P.name = initial(P.name) + sleevers.Cut() + +/obj/machinery/computer/transhuman/resleeving/proc/findpods() + var/num = 1 + var/area/A = get_area(src) + for(var/obj/machinery/clonepod/transhuman/P in A.get_contents()) + if(!P.connected) + pods += P + P.connected = src + P.name = "[initial(P.name)] #[num++]" + for(var/obj/machinery/transhuman/synthprinter/P in A.get_contents()) + if(!P.connected) + spods += P + P.connected = src + P.name = "[initial(P.name)] #[num++]" + for(var/obj/machinery/transhuman/resleever/P in A.get_contents()) + if(!P.connected) + sleevers += P + P.connected = src + P.name = "[initial(P.name)] #[num++]" + +/obj/machinery/computer/transhuman/resleeving/attackby(obj/item/W as obj, mob/user as mob) + if(istype(W, /obj/item/device/multitool)) + var/obj/item/device/multitool/M = W + var/obj/machinery/clonepod/transhuman/P = M.connecting + if(P && !(P in pods)) + pods += P + P.connected = src + P.name = "[initial(P.name)] #[pods.len]" + user << "You connect [P] to [src]." + else if(istype(W, /obj/item/weapon/disk/transcore)) + user.unEquip(W) + disk = W + disk.forceMove(src) + user << "You insert \the [W] into \the [src]." + else + ..() + return + +/obj/machinery/computer/transhuman/resleeving/attack_ai(mob/user as mob) + return attack_hand(user) + +/obj/machinery/computer/transhuman/resleeving/attack_hand(mob/user as mob) + user.set_machine(src) + add_fingerprint(user) + + if(stat & (BROKEN|NOPOWER)) + return + + updatemodules() + + ui_interact(user) + +/obj/machinery/computer/transhuman/resleeving/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + user.set_machine(src) + + var/data[0] + + var/bodyrecords_list_ui[0] + for(var/N in TC.body_scans) + var/datum/transhuman/body_record/BR = TC.body_scans[N] + bodyrecords_list_ui[++bodyrecords_list_ui.len] = list("name" = N, "recref" = "\ref[BR]") + + var/mindrecords_list_ui[0] + for(var/N in TC.backed_up) + var/datum/transhuman/mind_record/MR = TC.backed_up[N] + mindrecords_list_ui[++mindrecords_list_ui.len] = list("name" = N, "recref" = "\ref[MR]") + + var/pods_list_ui[0] + for(var/obj/machinery/clonepod/transhuman/pod in pods) + pods_list_ui[++pods_list_ui.len] = list("pod" = pod, "biomass" = pod.biomass) + + var/spods_list_ui[0] + for(var/obj/machinery/transhuman/synthprinter/spod in spods) + spods_list_ui[++spods_list_ui.len] = list("spod" = spod, "steel" = spod.stored_material[DEFAULT_WALL_MATERIAL], "glass" = spod.stored_material["glass"]) + + var/sleevers_list_ui[0] + for(var/obj/machinery/transhuman/resleever/resleever in sleevers) + sleevers_list_ui[++sleevers_list_ui.len] = list("sleever" = resleever, "occupant" = resleever.occupant ? resleever.occupant.real_name : "None") + + if(pods) + data["pods"] = pods_list_ui + else + data["pods"] = null + + if(spods) + data["spods"] = spods_list_ui + else + data["spods"] = null + + if(sleevers) + data["sleevers"] = sleevers_list_ui + else + data["pods"] = null + + if(bodyrecords_list_ui.len) + data["bodyrecords"] = bodyrecords_list_ui + else + data["bodyrecords"] = null + + if(mindrecords_list_ui.len) + data["mindrecords"] = mindrecords_list_ui + else + data["mindrecords"] = null + + + if(active_br) + var/can_grow_active = 1 + if(!synthetic_capable && active_br.synthetic) //Disqualified due to being synthetic in an organic only. + can_grow_active = 0 + else if(!organic_capable && !active_br.synthetic) //Disqualified for the opposite. + can_grow_active = 0 + else if(!synthetic_capable && !organic_capable) //What have you done?? + can_grow_active = 0 + else if(active_br.toocomplex) + can_grow_active = 0 + + data["activeBodyRecord"] = list("real_name" = active_br.mydna.name, \ + "speciesname" = active_br.speciesname ? active_br.speciesname : active_br.mydna.dna.species, \ + "gender" = active_br.bodygender, \ + "synthetic" = active_br.synthetic ? "Yes" : "No", \ + "locked" = active_br.locked ? "Low" : "High", \ + "cando" = can_grow_active) + else + data["activeRecord"] = null + + if(active_mr) + var/can_sleeve_current = 1 + if(!sleevers.len) + can_sleeve_current = 0 + data["activeMindRecord"] = list("charname" = active_mr.mindname, \ + "obviously_dead" = active_mr.dead_state == MR_DEAD ? "Past-due" : "Current", \ + "cando" = can_sleeve_current) + else + data["activeMindRecord"] = null + + + data["menu"] = menu + data["podsLen"] = pods.len + data["spodsLen"] = spods.len + data["sleeversLen"] = sleevers.len + data["temp"] = temp + data["coredumped"] = transcore.core_dumped + data["emergency"] = disk ? 1 : 0 + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "sleever.tmpl", src.name, 400, 450) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(5) + +/obj/machinery/computer/transhuman/resleeving/Topic(href, href_list) + if(..()) + return 1 + + else if (href_list["view_brec"]) + active_br = locate(href_list["view_brec"]) + if(active_br && istype(active_br.mydna)) + menu = 4 + else + active_br = null + temp = "ERROR: Record missing." + + else if (href_list["view_mrec"]) + active_mr = locate(href_list["view_mrec"]) + if(active_mr && istype(active_mr)) + menu = 5 + else + active_mr = null + temp = "ERROR: Record missing." + + else if (href_list["refresh"]) + updateUsrDialog() + + else if (href_list["coredump"]) + if(disk) + transcore.core_dump(disk) + disk.forceMove(get_turf(src)) + disk = null + + else if (href_list["ejectdisk"]) + disk.forceMove(get_turf(src)) + disk = null + + else if (href_list["create"]) + if(istype(active_br)) + //Tried to grow a synth but no synth pods. + if(active_br.synthetic && !spods.len) + temp = "Error: No SynthFabs detected." + //Tried to grow an organic but no growpods. + else if(!active_br.synthetic && !pods.len) + temp = "Error: No growpods detected." + //We have the machines. We can rebuild them. Probably. + else + //We're cloning a synth. + if(active_br.synthetic) + var/obj/machinery/transhuman/synthprinter/spod = spods[1] + if (spods.len > 1) + spod = input(usr,"Select a SynthFab to use", "Printer selection") as anything in spods + + //Already doing someone. + if(spod.busy) + temp = "Error: SynthFab is currently busy." + + //Not enough steel or glass + else if(spod.stored_material[DEFAULT_WALL_MATERIAL] < spod.body_cost) + temp = "Error: Not enough [DEFAULT_WALL_MATERIAL] in SynthFab." + else if(spod.stored_material["glass"] < spod.body_cost) + temp = "Error: Not enough glass in SynthFab." + + //Gross pod (broke mid-cloning or something). + else if(spod.broken) + temp = "Error: SynthFab malfunction." + + //Do the cloning! + else if(spod.print(active_br)) + temp = "Initiating printing cycle..." + menu = 1 + else + temp = "Initiating printing cycle...
Error: Post-initialisation failed. Printing cycle aborted." + + //We're cloning an organic. + else + var/obj/machinery/clonepod/transhuman/pod = pods[1] + if (pods.len > 1) + pod = input(usr,"Select a growing pod to use", "Pod selection") as anything in pods + + //Already doing someone. + if(pod.occupant) + temp = "Error: Growpod is currently occupied." + + //Not enough materials. + else if(pod.biomass < CLONE_BIOMASS) + temp = "Error: Not enough biomass." + + //Gross pod (broke mid-cloning or something). + else if(pod.mess) + temp = "Error: Growpod malfunction." + + //Disabled in config. + else if(!config.revival_cloning) + temp = "Error: Unable to initiate growing cycle." + + //Do the cloning! + else if(pod.growclone(active_br)) + temp = "Initiating growing cycle..." + menu = 1 + else + temp = "Initiating growing cycle...
Error: Post-initialisation failed. Growing cycle aborted." + + //The body record is broken somehow. + else + temp = "Error: Data corruption." + + else if (href_list["sleeve"]) + if(istype(active_mr)) + if(!sleevers.len) + temp = "Error: No sleevers detected." + else + var/obj/machinery/transhuman/resleever/sleever = sleevers[1] + if (sleevers.len > 1) + sleever = input(usr,"Select a resleeving pod to use", "Resleever selection") as anything in sleevers + + //No body to sleeve into. + if(!sleever.occupant) + temp = "Error: Resleeving pod is not occupied." + + //OOC body lock thing. + if(sleever.occupant.resleeve_lock && active_mr.ckey != sleever.occupant.resleeve_lock) + temp = "Error: Mind incompatible with body." + + //Body to sleeve into, but mind is in another living body. + else if(active_mr.mind_ref.current && active_mr.mind_ref.current.stat < DEAD) //Mind is in a body already that's alive + var/answer = alert(active_mr.mind_ref.current,"Someone is attempting to restore a backup of your mind into another body. Do you want to move to that body? You MAY suffer memory loss! (Same rules as CMD apply)","Resleeving","Yes","No") + + //They declined to be moved. + if(answer == "No") + temp = "Initiating resleeving...
Error: Post-initialisation failed. Resleeving cycle aborted." + menu = 1 + + //They approved being moved. + else + sleever.putmind(active_mr) + temp = "Initiating current backup & resleeving..." + menu = 1 + + //They were dead, or otherwise available. + else + sleever.putmind(active_mr) + temp = "Initiating resleeving..." + menu = 1 + + //IDK but it broke somehow. + else + temp = "Error: Data corruption." + + else if (href_list["menu"]) + menu = href_list["menu"] + temp = "" + + nanomanager.update_uis(src) + add_fingerprint(usr) + +// In here because only relevant to computer +/obj/item/weapon/cmo_disk_holder + name = "cmo emergency packet" + desc = "A small paper packet with printing on one side. \"Tear open in case of Code Delta or Emergency Evacuation ONLY. Use in any other case is UNLAWFUL.\"" + icon = 'icons/vore/custom_items_vr.dmi' + icon_state = "cmoemergency" + item_state = "card-id" + +/obj/item/weapon/cmo_disk_holder/attack_self(var/mob/attacker) + playsound(src, 'sound/items/poster_ripped.ogg', 50) + attacker << "You tear open \the [name]." + attacker.unEquip(src) + var/obj/item/weapon/disk/transcore/newdisk = new(get_turf(src)) + attacker.put_in_any_hand_if_possible(newdisk) + qdel(src) + +/obj/item/weapon/disk/transcore + name = "TransCore Dump Disk" + desc = "It has a small label. \n\ + \"1.INSERT DISK INTO RESLEEVING CONSOLE\n\ + 2. BEGIN CORE DUMP PROCEDURE\n\ + 3. ENSURE DISK SAFETY WHEN EJECTED\"" + icon = 'icons/obj/cloning.dmi' + icon_state = "harddisk" + item_state = "card-id" + w_class = ITEMSIZE_SMALL + var/datum/transhuman/mind_record/list/stored = list() diff --git a/code/modules/resleeving/documents.dm b/code/modules/resleeving/documents.dm new file mode 100644 index 0000000000..d9d3c289e4 --- /dev/null +++ b/code/modules/resleeving/documents.dm @@ -0,0 +1,74 @@ +/obj/item/weapon/book/manual/resleeving + name = "Resleeving, the New Cloning?" + icon_state = "stasis" + author = "Dnar Koshi" + title = "Resleeving, the New Cloning?" + dat = {" + + + + + +

Contents

+
    +
  1. Foreword: A Licensed Technology
  2. +
  3. The Mindstate Backup Implant
  4. +
  5. How to Perform Resleeving
  6. +
  7. Special Considerations
  8. +
+
+

Foreword: A Licensed Technology

+ This message must remain attached to all documentation regarding Nanotrasen Resleeving Technology.
+ All Nanotrasen Resleeving Technology (NRT) is licensed to Nanotrasen by Kitsuhana Heavy Industries. It should only be used in the ways set forth in this guide. + Special consideration to the moral and ethical use of this technology should be undertaken before applying it in the field. Make sure you understand the technology fully before using the machinery.
+ Contents + +

The Mindstate Backup Implant

+ Anyone wishing to enjoy the benefits of resleeving must have been implanted with a Mindstate Backup implant. These implants use advanced (licensed) technology to + perform backups of the whole mindstate at periodic intervals. The backups are not constant, however, and being resleeved after death may result in memory loss for + the time since the last backup until the demise of the body. Generally this can encompass anywhere from 5 to 50 minutes, though it has been known to be longer or shorter, depending + on the timing of the backups, when the person expired, and when the resleeving was started.
+ Contents + +

How to Perform Resleeving

+ The Nanotrasen Resleeving Technology consists of four machines: + + Performing resleeving is relatively simple. Nanotrasen maintains body-scan backups of all guests taken when you began your employement, applied for a visa, or at another time. + These scans are stored in a database maintained by Nanotrasen, and are sent to stations where it may become necessary to put them to use. You can view all the current body scans at the + resleeving console. You can also view all current mindstate backups at the console.
+ The process of resleeving is simply: +
    +
  1. Select a body to create from the body records. This should be the person's original body, or a suitable donor body if none is available.
  2. +
  3. Create the body using either the SynthFab or the growpod. Upon completion, correct any issues with the body (typically slight genetic or other damage will have occured).
  4. +
  5. Place the body into the resleeving pod, and select an appropriate mind to sleeve into the body on the console.
  6. +
  7. Sleeve the mind into the body, using the console.
  8. +
+ Being resleeved can be a disorienting and painful process. It is very likely that the person will need to acclimate to their new body, and should be given a place to rest for several minutes while + they get used to their motor functions. Resleeving tends to remap these, so it may take a while for the person to become fully acclimated driving their new body.
+ Contents + +

Special Considerations

+ There are some special considerations to be taken into account while using resleeving technology:
+ + Please keep these in mind while using the Nanotrasen Resleeving Technology.
+ Contents + + + + "} \ No newline at end of file diff --git a/code/modules/resleeving/implant.dm b/code/modules/resleeving/implant.dm new file mode 100644 index 0000000000..cb5f048d4d --- /dev/null +++ b/code/modules/resleeving/implant.dm @@ -0,0 +1,79 @@ +//////////////////////////////// +//// Resleeving implant +//// for both organic and synthetic crew +//////////////////////////////// + +//The backup implant itself +/obj/item/weapon/implant/backup + name = "backup implant" + desc = "A mindstate backup implant that occasionally stores a copy of one's mind on a central server for backup purposes." + var/last_attempt + var/attempt_delay = 5 MINUTES + +/obj/item/weapon/implant/backup/get_data() + var/dat = {" +Implant Specifications:
+Name: [company_name] Employee Backup Implant
+Life: ~8 hours.
+Important Notes: Implant is life-limited due to KHI licensing restrictions. Dissolves into harmless biomaterial after around ~8 hours, the typical work shift.
+
+Implant Details:
+Function: Contains a small swarm of nanobots that perform neuron scanning to create mind-backups.
+Special Features: Will allow restoring of backups during the 8-hour period it is active.
+Integrity: Generally very survivable. Susceptible to being destroyed by acid."} + return dat + +/obj/item/weapon/implant/backup/implanted(var/mob/living/carbon/human/H) + ..() + if(istype(H)) + var/obj/item/weapon/implant/backup/other_imp = locate(/obj/item/weapon/implant/backup,H) + if(other_imp && other_imp.imp_in == H) + qdel(other_imp) //implant fight + + if(H.mind) //One out here just in case they are dead + transcore.m_backup(H.mind) + last_attempt = world.time + + backup() + + return 1 + +/obj/item/weapon/implant/backup/proc/backup() + last_attempt = world.time + var/mob/living/carbon/human/H = loc + + //Okay we're in a human with a mind at least + if(istype(H) && H == imp_in && H.mind && H.stat < DEAD) + transcore.m_backup(H.mind) + + spawn(attempt_delay) + backup() + +//The glass case for the implant +/obj/item/weapon/implantcase/backup + name = "glass case - 'backup'" + desc = "A case containing a backup implant." + icon_state = "implantcase-b" + +/obj/item/weapon/implantcase/backup/New() + src.imp = new /obj/item/weapon/implant/backup(src) + ..() + return + +//The box of backup implants +/obj/item/weapon/storage/box/backup_kit + name = "backup implant kit" + desc = "Box of stuff used to implant backup implants." + icon_state = "implant" + item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit") + +/obj/item/weapon/storage/box/backup_kit/New() + ..() + for(var/i = 1 to 7) + new /obj/item/weapon/implantcase/backup(src) + new /obj/item/weapon/implanter(src) + +//Purely for fluff +/obj/item/weapon/implant/backup/full + name = "khi backup implant" + desc = "A normal KHI wireless cortical stack with neutrino and QE transmission for constant-stream consciousness upload." diff --git a/code/modules/resleeving/infocore.dm b/code/modules/resleeving/infocore.dm new file mode 100644 index 0000000000..396dfbd4b9 --- /dev/null +++ b/code/modules/resleeving/infocore.dm @@ -0,0 +1,227 @@ +//////////////////////////////// +//// Mind/body data storage system +//// for the resleeving tech +//////////////////////////////// + +/mob/living/carbon/human/var/resleeve_lock +/mob/living/carbon/human/var/original_player + +var/datum/transhuman/infocore/transcore = new/datum/transhuman/infocore + +//Mind-backup database +/datum/transhuman/infocore + var/overdue_time = 15 MINUTES + var/process_time = 1 MINUTE + var/core_dumped = 0 + + var/datum/transhuman/mind_record/list/backed_up = list() + var/datum/transhuman/mind_record/list/has_left = list() + var/datum/transhuman/body_record/list/body_scans = list() + +/datum/transhuman/infocore/New() + process() + +/datum/transhuman/infocore/proc/process() + if(core_dumped) return + for(var/N in backed_up) + var/datum/transhuman/mind_record/curr_MR = backed_up[N] + if(!curr_MR) + log_debug("Tried to process [N] in transcore w/o a record!") + continue + + var/since_backup = world.time - curr_MR.last_update + if(since_backup < overdue_time) + curr_MR.dead_state = MR_NORMAL + else + if(curr_MR.dead_state != MR_DEAD) //First time switching to dead + notify(N) + curr_MR.dead_state = MR_DEAD + + spawn(process_time) + process() + +/datum/transhuman/infocore/proc/m_backup(var/datum/mind/mind) + ASSERT(mind) + if(!mind.name || core_dumped) + return 0 + + var/datum/transhuman/mind_record/MR + + if(mind.name in backed_up) + MR = backed_up[mind.name] + MR.last_update = world.time + else + MR = new(mind, mind.current, 1) + + return 1 + +/datum/transhuman/infocore/proc/notify(var/name) + ASSERT(name) + var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null) + a.autosay("[name] is past-due for a mind backup. This will be the only notification.", "TransCore Oversight", "Medical") + qdel(a) + +/datum/transhuman/infocore/proc/add_backup(var/datum/transhuman/mind_record/MR) + ASSERT(MR) + backed_up[MR.mindname] = MR + log_debug("Added [MR.mindname] to transcore DB.") + +/datum/transhuman/infocore/proc/stop_backup(var/datum/transhuman/mind_record/MR) + ASSERT(MR) + has_left[MR.mindname] = MR + backed_up.Remove("[MR.mindname]") + MR.cryo_at = world.time + log_debug("Put [MR.mindname] in transcore suspended DB.") + +/datum/transhuman/infocore/proc/add_body(var/datum/transhuman/body_record/BR) + ASSERT(BR) + body_scans[BR.mydna.name] = BR + log_debug("Added [BR.mydna.name] to transcore body DB.") + +/datum/transhuman/infocore/proc/core_dump(var/obj/item/weapon/disk/transcore/disk) + ASSERT(disk) + var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null) + a.autosay("An emergency core dump has been initiated!", "TransCore Oversight", "Command") + a.autosay("An emergency core dump has been initiated!", "TransCore Oversight", "Medical") + qdel(a) + + disk.stored += backed_up + backed_up.Cut() + core_dumped = 1 + return disk.stored.len + +/////// Mind-backup record /////// +/datum/transhuman/mind_record + //User visible + var/mindname = "!!ERROR!!" + + //0: Normal, 1: Might be dead, 2: Definitely dead, show on console + var/dead_state = 0 + var/last_update = 0 + + //Backend + var/ckey = "" + var/id_gender + var/datum/mind/mind_ref + var/cryo_at + var/languages + var/mind_oocnotes + +/datum/transhuman/mind_record/New(var/datum/mind/mind,var/mob/living/carbon/human/M,var/obj/item/weapon/implant/backup/imp,var/add_to_db = 1) + ASSERT(mind && M && imp) + + if(!istype(M)) + return //Only works with humanoids. + + //The mind! + mind_ref = mind + mindname = mind.name + ckey = ckey(mind.key) + + cryo_at = 0 + + //Mental stuff the game doesn't keep mentally + id_gender = M.identifying_gender + languages = M.languages.Copy() + mind_oocnotes = M.ooc_notes + + last_update = world.time + + if(add_to_db) + transcore.add_backup(src) + +/////// Body Record /////// +/datum/transhuman/body_record + var/datum/dna2/record/mydna + + //These may or may not be set, mostly irrelevant since it's just a body record. + var/ckey + var/locked + var/client/client_ref + var/datum/mind/mind_ref + var/synthetic + var/speciesname + var/bodygender + var/body_oocnotes + var/list/limb_data = list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO) + var/list/organ_data = list(O_HEART, O_EYES, O_LUNGS, O_BRAIN) + var/toocomplex + var/sizemult + +/datum/transhuman/body_record/New(var/mob/living/carbon/human/M,var/add_to_db = 1,var/ckeylock = 0) + ASSERT(M) + + //Person OOCly doesn't want people impersonating them + locked = ckeylock + + //Prevent people from printing restricted and whitelisted species + var/datum/species/S = all_species["[M.dna.species]"] + if(S) + toocomplex = (S.spawn_flags & SPECIES_IS_WHITELISTED) || (S.spawn_flags & SPECIES_IS_RESTRICTED) + + //General stuff about them + synthetic = M.isSynthetic() + speciesname = M.custom_species ? M.custom_species : null + bodygender = M.gender + body_oocnotes = M.ooc_notes + sizemult = M.size_multiplier + + //Probably should + M.dna.check_integrity() + + //The DNA2 stuff + mydna = new () + mydna.dna = M.dna.Clone() + mydna.ckey = M.ckey + mydna.id = copytext(md5(M.real_name), 2, 6) + mydna.name = M.dna.real_name + mydna.types = DNA2_BUF_UI|DNA2_BUF_UE|DNA2_BUF_SE + mydna.flavor = M.flavor_texts.Copy() + + //My stuff + client_ref = M.client + ckey = M.ckey + mind_ref = M.mind + + //External organ status. 0:gone, 1:normal, "string":manufacturer + for(var/limb in limb_data) + var/obj/item/organ/external/O = M.organs_by_name[limb] + + //Missing limb. + if(!O) + limb_data[limb] = 0 + + //Has model set, is pros. + else if(O.model) + limb_data[limb] = O.model + + //Nothing special, present and normal. + else + limb_data[limb] = 1 + + //Internal organ status + for(var/org in organ_data) + var/obj/item/organ/I = M.internal_organs_by_name[org] + + //Who knows? Missing lungs maybe on synths, etc. + if(!I) + continue + + //This needs special handling because brains never think they are 'robotic', even posibrains + if(org == O_BRAIN) + switch(I.type) + if(/obj/item/organ/internal/mmi_holder) //Assisted + organ_data[org] = 1 + if(/obj/item/organ/internal/mmi_holder/posibrain) //Mechanical + organ_data[org] = 2 + if(/obj/item/organ/internal/mmi_holder/robot) //Digital + organ_data[org] = 3 + else //Anything else just give a brain to + organ_data[org] = 0 + continue + + //Just set the data to this. 0:normal, 1:assisted, 2:mechanical, 3:digital + organ_data[org] = I.robotic + + if(add_to_db) + transcore.add_body(src) diff --git a/code/modules/resleeving/machines.dm b/code/modules/resleeving/machines.dm new file mode 100644 index 0000000000..e4ff3654a0 --- /dev/null +++ b/code/modules/resleeving/machines.dm @@ -0,0 +1,529 @@ +//////////////////////////////// +//// Machines required for body printing +//// and decanting into bodies +//////////////////////////////// + +/////// Grower Pod /////// +/obj/machinery/clonepod/transhuman + name = "grower pod" + circuit = /obj/item/weapon/circuitboard/transhuman_clonepod + +/obj/machinery/clonepod/transhuman/growclone(var/datum/transhuman/body_record/current_project) + //Manage machine-specific stuff. + if(mess || attempting) + return 0 + attempting = 1 //One at a time!! + locked = 1 + eject_wait = 1 + spawn(30) + eject_wait = 0 + + //Get the DNA and generate a new mob + var/datum/dna2/record/R = current_project.mydna + var/mob/living/carbon/human/H = new /mob/living/carbon/human(src, R.dna.species) + if(current_project.locked) + H.resleeve_lock = current_project.ckey + + //Fix the external organs + for(var/part in current_project.limb_data) + + var/status = current_project.limb_data[part] + if(status == null) continue //Species doesn't have limb? Child of amputated limb? + + var/obj/item/organ/external/O = H.organs_by_name[part] + if(!O) continue //Not an organ. Perhaps another amputation removed it already. + + if(status == 1) //Normal limbs + continue + else if(status == 0) //Missing limbs + O.remove_rejuv() + else if(status) //Anything else is a manufacturer + O.remove_rejuv() //Don't robotize them, leave them removed so robotics can attach a part. + + //Look, this machine can do this because [reasons] okay?! + for(var/part in current_project.organ_data) + + var/status = current_project.organ_data[part] + if(status == null) continue //Species doesn't have organ? Child of missing part? + + var/obj/item/organ/I = H.internal_organs_by_name[name] + if(!I) continue//Not an organ. Perhaps external conversion changed it already? + + if(status == 0) //Normal organ + continue + else if(status == 1) //Assisted organ + I.mechassist() + else if(status == 2) //Mechanical organ + I.robotize() + else if(status == 3) //Digital organ + I.digitize() + + occupant = H + + //Set the name or generate one + if(!R.dna.real_name) + R.dna.real_name = "clone ([rand(0,999)])" + H.real_name = R.dna.real_name + + //Apply DNA + H.dna = R.dna.Clone() + H.original_player = current_project.ckey + + //Apply damage + H.adjustCloneLoss(150) + H.Paralyse(4) + H.updatehealth() + + //Grower specific mutations + if(heal_level < 60) + randmutb(H) + H.dna.UpdateSE() + H.dna.UpdateUI() + + //Update appearance, remake icons + H.UpdateAppearance() + H.sync_organ_dna() + H.regenerate_icons() + + //Basically all the VORE stuff + H.ooc_notes = current_project.body_oocnotes + H.flavor_texts = current_project.mydna.flavor.Copy() + H.size_multiplier = current_project.sizemult + if(current_project.speciesname) + H.custom_species = current_project.speciesname + + //Suiciding var + H.suiciding = 0 + + //Making double-sure this is not set + H.mind = null + + //Machine specific stuff at the end + update_icon() + attempting = 0 + return 1 + +/obj/machinery/clonepod/transhuman/process() + if(stat & NOPOWER) + if(occupant) + locked = 0 + go_out() + return + + if((occupant) && (occupant.loc == src)) + if(occupant.stat == DEAD) + locked = 0 + go_out() + connected_message("Clone Rejected: Deceased.") + return + + else if(occupant.health < heal_level && occupant.getCloneLoss() > 0) + + //Slowly get that clone healed and finished. + occupant.adjustCloneLoss(-2 * heal_rate) + + //Premature clones may have brain damage. + occupant.adjustBrainLoss(-(ceil(0.5*heal_rate))) + + //So clones don't die of oxyloss in a running pod. + if(occupant.reagents.get_reagent_amount("inaprovaline") < 30) + occupant.reagents.add_reagent("inaprovaline", 60) + + //Also heal some oxyloss ourselves because inaprovaline is so bad at preventing it!! + occupant.adjustOxyLoss(-4) + + use_power(7500) //This might need tweaking. + return + + else if((occupant.health >= heal_level) && (!eject_wait)) + playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) + audible_message("\The [src] signals that the growing process is complete.") + connected_message("Growing Process Complete.") + locked = 0 + go_out() + return + + else if((!occupant) || (occupant.loc != src)) + occupant = null + if(locked) + locked = 0 + return + + return + +//Synthetic version +/obj/machinery/transhuman/synthprinter + name = "SynthFab 3000" + desc = "A rapid fabricator for synthetic bodies." + icon = 'icons/obj/machines/synthpod.dmi' + icon_state = "pod_0" + circuit = /obj/item/weapon/circuitboard/transhuman_synthprinter + density = 1 + anchored = 1 + + var/list/stored_material = list(DEFAULT_WALL_MATERIAL = 30000, "glass" = 30000) + var/connected //What console it's done up with + var/busy = 0 //Busy cloning + var/body_cost = 15000 //Cost of a cloned body (metal and glass ea.) + var/datum/transhuman/body_record/current_project + var/broken = 0 + +/obj/machinery/transhuman/synthprinter/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) + component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/stack/cable_coil(src, 2) + RefreshParts() + update_icon() + +/obj/machinery/transhuman/synthprinter/process() + if(stat & NOPOWER) + if(busy) + busy = 0 + current_project = null + update_icon() + return + + if(busy > 0 && busy <= 95) + busy += 5 + + if(busy >= 100) + make_body() + + return + +/obj/machinery/transhuman/synthprinter/proc/print(var/datum/transhuman/body_record/BR) + if(!istype(BR) || busy) + return 0 + + if(stored_material[DEFAULT_WALL_MATERIAL] < body_cost || stored_material["glass"] < body_cost) + return 0 + + current_project = BR + busy = 5 + update_icon() + + return 1 + +/obj/machinery/transhuman/synthprinter/proc/make_body() + //Manage machine-specific stuff + if(!current_project) + busy = 0 + update_icon() + return + + //Get the DNA and generate a new mob + var/datum/dna2/record/R = current_project.mydna + var/mob/living/carbon/human/H = new /mob/living/carbon/human(src, R.dna.species) + if(current_project.locked) + H.resleeve_lock = current_project.ckey + + //Fix the external organs + for(var/part in current_project.limb_data) + + var/status = current_project.limb_data[part] + if(status == null) continue //Species doesn't have limb? Child of amputated limb? + + var/obj/item/organ/external/O = H.organs_by_name[part] + if(!O) continue //Not an organ. Perhaps another amputation removed it already. + + if(status == 1) //Normal limbs + continue + else if(status == 0) //Missing limbs + O.remove_rejuv() + else if(status) //Anything else is a manufacturer + O.robotize(status) + + //Then the internal organs + for(var/part in current_project.organ_data) + + var/status = current_project.organ_data[part] + if(status == null) continue //Species doesn't have organ? Child of missing part? + + var/obj/item/organ/I = H.internal_organs_by_name[part] + if(!I) continue//Not an organ. Perhaps external conversion changed it already? + + if(status == 0) //Normal organ + continue + else if(status == 1) //Assisted organ + I.mechassist() + else if(status == 2) //Mechanical organ + I.robotize() + else if(status == 3) //Digital organ + I.digitize() + + //Set the name or generate one + if(!R.dna.real_name) + R.dna.real_name = "synth ([rand(0,999)])" + H.real_name = R.dna.real_name + + //Apply DNA + H.dna = R.dna.Clone() + H.original_player = current_project.ckey + + //Apply damage + H.adjustBruteLoss(20) + H.adjustFireLoss(20) + H.updatehealth() + + //Update appearance, remake icons + H.UpdateAppearance() + H.sync_organ_dna() + H.regenerate_icons() + + //Basically all the VORE stuff + H.ooc_notes = current_project.body_oocnotes + H.flavor_texts = current_project.mydna.flavor.Copy() + H.size_multiplier = current_project.sizemult + if(current_project.speciesname) + H.custom_species = current_project.speciesname + + //Suiciding var + H.suiciding = 0 + + //Making double-sure this is not set + H.mind = null + + //Plonk them here. + H.regenerate_icons() + H.loc = get_turf(src) + + //Machine specific stuff at the end + stored_material[DEFAULT_WALL_MATERIAL] -= body_cost + stored_material["glass"] -= body_cost + busy = 0 + update_icon() + + return 1 + +/obj/machinery/transhuman/synthprinter/attack_hand(mob/user as mob) + if((busy == 0) || (stat & NOPOWER)) + return + user << "Current print cycle is [busy]% complete." + return + +/obj/machinery/transhuman/synthprinter/attackby(obj/item/W as obj, mob/user as mob) + src.add_fingerprint(user) + if(busy) + user << "\The [src] is busy. Please wait for completion of previous operation." + return + if(default_deconstruction_screwdriver(user, W)) + return + if(default_deconstruction_crowbar(user, W)) + return + if(default_part_replacement(user, W)) + return + if(panel_open) + user << "You can't load \the [src] while it's opened." + return + if(!istype(W, /obj/item/stack/material)) + user << "You cannot insert this item into \the [src]!" + return + + var/obj/item/stack/material/S = W + if(!(S.material.name in stored_material)) + user << "\the [src] doesn't accept [S.material]!" + return + + var/amnt = S.perunit + var/max_res_amount = 30000 + if(stored_material[S.material.name] + amnt <= max_res_amount) + if(S && S.amount >= 1) + var/count = 0 + while(stored_material[S.material.name] + amnt <= max_res_amount && S.amount >= 1) + stored_material[S.material.name] += amnt + S.use(1) + count++ + user << "You insert [count] [S.name] into \the [src]." + else + user << "\the [src] cannot hold more [S.name]." + + updateUsrDialog() + return + +/obj/machinery/transhuman/synthprinter/update_icon() + ..() + icon_state = "pod_0" + if(busy && !(stat & NOPOWER)) + icon_state = "pod_1" + else if(broken) + icon_state = "pod_g" + +/////// Resleever Pod /////// +/obj/machinery/transhuman/resleever + name = "resleeving pod" + desc = "Used to combine mind and body into one unit." + icon = 'icons/obj/machines/implantchair.dmi' + icon_state = "implantchair" + circuit = /obj/item/weapon/circuitboard/transhuman_resleever + density = 1 + opacity = 0 + anchored = 1 + var/blur_amount + var/confuse_amount + + var/mob/living/carbon/human/occupant = null + var/connected = null + +/obj/machinery/transhuman/resleever/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) + component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/console_screen(src) + component_parts += new /obj/item/stack/cable_coil(src, 2) + RefreshParts() + update_icon() + +/obj/machinery/transhuman/resleever/RefreshParts() + var/scan_rating = 0 + for(var/obj/item/weapon/stock_parts/scanning_module/SM in component_parts) + scan_rating += SM.rating + confuse_amount = (48 - scan_rating * 8) + + var/manip_rating = 0 + for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) + manip_rating += M.rating + blur_amount = (48 - manip_rating * 8) + +/obj/machinery/transhuman/resleever/attack_hand(mob/user as mob) + user.set_machine(src) + var/health_text = "" + var/mind_text = "" + if(src.occupant) + if(src.occupant.stat >= DEAD) + health_text = "DEAD" + else if(src.occupant.health < 0) + health_text = "[round(src.occupant.health,0.1)]" + else + health_text = "[round(src.occupant.health,0.1)]" + + if(src.occupant.mind) + mind_text = "Mind present: [occupant.mind.name]" + else + mind_text = "Mind absent." + + var/dat ="Resleever Status
" + dat +="Current occupant: [src.occupant ? "
Name: [src.occupant]
Health: [health_text]
" : "None"]
" + dat +="Mind status: [mind_text]
" + user.set_machine(src) + user << browse(dat, "window=resleever") + onclose(user, "resleever") + +/obj/machinery/transhuman/resleever/attackby(obj/item/W as obj, mob/user as mob) + src.add_fingerprint(user) + if(default_deconstruction_screwdriver(user, W)) + return + if(default_deconstruction_crowbar(user, W)) + return + if(default_part_replacement(user, W)) + return + if(istype(W, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = W + if(!ismob(G.affecting)) + return + for(var/mob/living/carbon/slime/M in range(1, G.affecting)) + if(M.Victim == G.affecting) + usr << "[G.affecting:name] will not fit into the [src.name] because they have a slime latched onto their head." + return + var/mob/M = G.affecting + if(put_mob(M)) + qdel(G) + src.updateUsrDialog() + return ..() + +/obj/machinery/transhuman/resleever/proc/putmind(var/datum/transhuman/mind_record/MR) + if(!occupant || !istype(occupant) || occupant.stat >= DEAD) + return 0 + + //In case they already had a mind! + occupant << "You feel your mind being overwritten..." + if(occupant.mind) + log_and_message_admins("was resleeve-wiped from their body.",occupant.mind) + occupant.ghostize() + + //Attach as much stuff as possible to the mob. + for(var/datum/language/L in MR.languages) + occupant.add_language(L.name) + MR.mind_ref.active = 1 //Well, it's about to be. + MR.mind_ref.transfer_to(occupant) //Does mind+ckey+client. + occupant.identifying_gender = MR.id_gender + occupant.ooc_notes = MR.mind_oocnotes + occupant.apply_vore_prefs() //Cheap hack for now to give them SOME bellies. + + //Give them a backup implant + var/obj/item/weapon/implant/backup/new_imp = new() + if(new_imp.implanted(occupant)) + new_imp.loc = occupant + new_imp.imp_in = occupant + new_imp.implanted = 1 + //Put it in the head! Makes sense. + var/obj/item/organ/external/affected = occupant.get_organ(BP_HEAD) + affected.implants += new_imp + new_imp.part = affected + + //Inform them and make them a little dizzy. + if(confuse_amount + blur_amount <= 16) + occupant << "You feel a small pain in your head as you're given a new backup implant. Your new body feels comfortable already, however." + else + occupant << "You feel a small pain in your head as you're given a new backup implant. Oh, and a new body. It's disorienting, to say the least." + + occupant.confused = max(occupant.confused, confuse_amount) + occupant.eye_blurry = max(occupant.eye_blurry, blur_amount) + + if(occupant.original_player != occupant.ckey) + log_and_message_admins("is now a cross-sleeved character. Body originally belonged to [occupant.original_player]. Mind is now [occupant.mind.name].",occupant) + + return 1 + +/obj/machinery/transhuman/resleever/proc/go_out(var/mob/M) + if(!( src.occupant )) + return + if (src.occupant.client) + src.occupant.client.eye = src.occupant.client.mob + src.occupant.client.perspective = MOB_PERSPECTIVE + src.occupant.loc = src.loc + src.occupant = null + icon_state = "implantchair" + return + +/obj/machinery/transhuman/resleever/proc/put_mob(mob/living/carbon/human/M as mob) + if(!ishuman(M)) + usr << "\The [src] cannot hold this!" + return + if(src.occupant) + usr << "\The [src] is already occupied!" + return + if(M.client) + M.client.perspective = EYE_PERSPECTIVE + M.client.eye = src + M.stop_pulling() + M.loc = src + src.occupant = M + src.add_fingerprint(usr) + icon_state = "implantchair_on" + return 1 + +/obj/machinery/transhuman/resleever/verb/get_out() + set name = "EJECT Occupant" + set category = "Object" + set src in oview(1) + if(usr.stat != 0) + return + src.go_out(usr) + add_fingerprint(usr) + return + +/obj/machinery/transhuman/resleever/verb/move_inside() + set name = "Move INSIDE" + set category = "Object" + set src in oview(1) + if(usr.stat != 0 || stat & (NOPOWER|BROKEN)) + return + put_mob(usr) + return diff --git a/code/modules/telesci/bscyrstal.dm b/code/modules/telesci/bscyrstal.dm new file mode 100644 index 0000000000..083cf56462 --- /dev/null +++ b/code/modules/telesci/bscyrstal.dm @@ -0,0 +1,46 @@ +// Bluespace crystals, used in telescience and when crushed it will blink you to a random turf. + +/obj/item/weapon/ore/bluespace_crystal + name = "bluespace crystal" + desc = "A glowing bluespace crystal, not much is known about how they work. It looks very delicate." + icon = 'icons/obj/telescience.dmi' + icon_state = "bluespace_crystal" + w_class = ITEMSIZE_TINY + origin_tech = list(TECH_BLUESPACE = 6, TECH_MATERIAL = 3) + var/blink_range = 8 // The teleport range when crushed/thrown at someone. + +/obj/item/weapon/ore/bluespace_crystal/New() + ..() + pixel_x = rand(-5, 5) + pixel_y = rand(-5, 5) + +/obj/item/weapon/ore/bluespace_crystal/attack_self(mob/user) + user.visible_message("[user] crushes [src]!", "You crush [src]!") + var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread) + s.set_up(5, 1, get_turf(src)) + s.start() + blink_mob(user) + user.unEquip(src) + qdel(src) + +/obj/item/weapon/ore/bluespace_crystal/proc/blink_mob(mob/living/L) + do_teleport(L, get_turf(L), blink_range, asoundin = 'sound/effects/phasein.ogg') + +/obj/item/weapon/ore/bluespace_crystal/throw_impact(atom/hit_atom) + if(!..()) // not caught in mid-air + visible_message("[src] fizzles and disappears upon impact!") + var/turf/T = get_turf(hit_atom) + var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread) + s.set_up(5, 1, T) + s.start() + if(isliving(hit_atom)) + blink_mob(hit_atom) + qdel(src) + +// Artifical bluespace crystal, doesn't give you much research. + +/obj/item/weapon/ore/bluespace_crystal/artificial + name = "artificial bluespace crystal" + desc = "An artificially made bluespace crystal, it looks delicate." + origin_tech = list(TECH_BLUESPACE = 3, TECH_PHORON = 4) + blink_range = 4 // Not as good as the organic stuff! diff --git a/code/modules/telesci/construction.dm b/code/modules/telesci/construction.dm new file mode 100644 index 0000000000..ac5d7becd7 --- /dev/null +++ b/code/modules/telesci/construction.dm @@ -0,0 +1,53 @@ +#ifndef T_BOARD +#error T_BOARD macro is not defined but we need it! +#endif + +// The circuit boards + +/obj/item/weapon/circuitboard/telesci_console + name = T_BOARD("Telepad Control Console") + build_path = /obj/machinery/computer/telescience + origin_tech = list(TECH_DATA = 3, TECH_BLUESPACE = 3, TECH_PHORON = 4) + +/obj/item/weapon/circuitboard/telesci_pad + name = T_BOARD("Telepad") + board_type = new /datum/frame/frame_types/machine + build_path = /obj/machinery/telepad + origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4, TECH_PHORON = 4, TECH_BLUESPACE = 5) + req_components = list( + /obj/item/weapon/ore/bluespace_crystal = 1, + /obj/item/weapon/stock_parts/capacitor = 2, + /obj/item/stack/cable_coil = 5, + /obj/item/weapon/stock_parts/console_screen = 1) + +// The Designs + +/datum/design/circuit/telesci_console + name = "Telepad Control Console" + id = "telesci_console" + req_tech = list(TECH_DATA = 3, TECH_BLUESPACE = 3, TECH_PHORON = 4) + build_path = /obj/item/weapon/circuitboard/telesci_console + sort_string = "HAAEA" + +/datum/design/circuit/telesci_pad + name = "Telepad" + id = "telesci_pad" + req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4, TECH_PHORON = 4, TECH_BLUESPACE = 5) + build_path = /obj/item/weapon/circuitboard/telesci_pad + sort_string = "HAAEB" + +/datum/design/item/telesci_gps + name = "GPS device" + id = "telesci_gps" + req_tech = list(TECH_MATERIAL = 2, TECH_BLUESPACE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 1000) + build_path = /obj/item/device/gps/advanced + sort_string = "HAAEB" + +/datum/design/item/bluespace_crystal + name = "Artificial Bluespace Crystal" + id = "bluespace_crystal" + req_tech = list(TECH_BLUESPACE = 3, TECH_PHORON = 4) + materials = list("diamond" = 1500, "phoron" = 1500) + build_path = /obj/item/weapon/ore/bluespace_crystal/artificial + sort_string = "HAAEC" diff --git a/code/modules/telesci/gps_advanced.dm b/code/modules/telesci/gps_advanced.dm new file mode 100644 index 0000000000..7953b674d3 --- /dev/null +++ b/code/modules/telesci/gps_advanced.dm @@ -0,0 +1,78 @@ +var/global/list/GPS_list = list() + +// These are distinguished from the ordinary "Relay Position Devices" that just print your location +// In that they are also all networked with each other to show each other's locations. +/obj/item/device/gps/advanced + name = "global positioning system" + desc = "Helping lost spacemen find their way through the planets since 1995." + icon = 'icons/obj/telescience.dmi' + icon_state = "gps-c" + w_class = ITEMSIZE_SMALL + slot_flags = SLOT_BELT + origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) + var/gpstag = "COM0" + var/emped = 0 + +/obj/item/device/gps/advanced/New() + ..() + GPS_list.Add(src) + name = "global positioning system ([gpstag])" + overlays += "working" + +/obj/item/device/gps/advanced/Del() + GPS_list.Remove(src) + ..() + +/obj/item/device/gps/advanced/emp_act(severity) + emped = 1 + overlays -= "working" + overlays += "emp" + spawn(300) + emped = 0 + overlays -= "emp" + overlays += "working" + +/obj/item/device/gps/advanced/attack_self(mob/user as mob) + + var/obj/item/device/gps/advanced/t = "" + if(emped) + t += "ERROR" + else + t += "
Set Tag " + t += "
Tag: [gpstag]" + + for(var/obj/item/device/gps/advanced/G in GPS_list) + var/turf/pos = get_turf(G) + var/area/gps_area = get_area(G) + var/tracked_gpstag = G.gpstag + if(G.emped == 1) + t += "
[tracked_gpstag]: ERROR" + else + t += "
[tracked_gpstag]: [format_text(gps_area.name)] ([pos.x], [pos.y], [pos.z])" + + var/datum/browser/popup = new(user, "GPS", name, 600, 450) + popup.set_content(t) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + +/obj/item/device/gps/advanced/Topic(href, href_list) + ..() + if(href_list["tag"] ) + var/a = input("Please enter desired tag.", name, gpstag) as text + a = uppertext(copytext(sanitize(a), 1, 5)) + if(src.loc == usr) + gpstag = a + name = "global positioning system ([gpstag])" + attack_self(usr) + +/obj/item/device/gps/advanced/science + icon_state = "gps-s" + gpstag = "SCI0" + +/obj/item/device/gps/advanced/engineering + icon_state = "gps-e" + gpstag = "ENG0" + +/obj/item/device/gps/advanced/security + icon_state = "gps-sec" + gpstag = "SEC0" diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm new file mode 100644 index 0000000000..1440482241 --- /dev/null +++ b/code/modules/telesci/telepad.dm @@ -0,0 +1,47 @@ +///SCI TELEPAD/// +/obj/machinery/telepad + name = "telepad" + desc = "A bluespace telepad used for teleporting objects to and from a location." + icon = 'icons/obj/telescience.dmi' + icon_state = "pad-idle" + anchored = 1 + use_power = 1 + circuit = /obj/item/weapon/circuitboard/telesci_pad + idle_power_usage = 200 + active_power_usage = 5000 + var/efficiency + +/obj/machinery/telepad/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/ore/bluespace_crystal(src) + component_parts += new /obj/item/weapon/stock_parts/capacitor(src) + component_parts += new /obj/item/weapon/stock_parts/capacitor(src) + component_parts += new /obj/item/weapon/stock_parts/console_screen(src) + component_parts += new /obj/item/stack/cable_coil(src, 5) + RefreshParts() + update_icon() + +/obj/machinery/telepad/RefreshParts() + var/E + for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts) + E += C.rating + efficiency = E + +/obj/machinery/telepad/attackby(obj/item/W as obj, mob/user as mob) + src.add_fingerprint(user) + + if(default_deconstruction_screwdriver(user, W)) + return + if(default_deconstruction_crowbar(user, W)) + return + if(default_part_replacement(user, W)) + return + if(panel_open) + if(istype(W, /obj/item/device/multitool)) + var/obj/item/device/multitool/M = W + M.connectable = src + user << "You save the data in the [M.name]'s buffer." + return 1 + + return ..() diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm new file mode 100644 index 0000000000..02179037bb --- /dev/null +++ b/code/modules/telesci/telesci_computer.dm @@ -0,0 +1,384 @@ +/obj/machinery/computer/telescience + name = "\improper Telepad Control Console" + desc = "Used to teleport objects to and from the telescience telepad." + icon_screen = "teleport" + icon_keyboard = "teleport_key" + circuit = /obj/item/weapon/circuitboard/telesci_console + var/sending = 1 + var/obj/machinery/telepad/telepad = null + var/temp_msg = "Telescience control console initialized.
Welcome." + + // VARIABLES // + var/teles_left // How many teleports left until it becomes uncalibrated + var/datum/projectile_data/last_tele_data = null + var/z_co = 1 + var/distance_off + var/rotation_off + var/turf/last_target + + var/rotation = 0 + var/distance = 5 + + // Based on the distance used + var/teleport_cooldown = 0 + var/teleporting = 0 + var/starting_crystals = 2 + var/max_crystals = 4 + // Used to adjust OP-ness: (4 crystals * 6 efficiency * 12.5 coefficient) = 300 range. + var/powerCoefficient = 12.5 + var/list/crystals = list() + var/obj/item/device/gps/inserted_gps + +/obj/machinery/computer/telescience/New() + ..() + recalibrate() + +/obj/machinery/computer/telescience/Destroy() + eject() + if(inserted_gps) + inserted_gps.forceMove(loc) + inserted_gps = null + return ..() + +/obj/machinery/computer/telescience/examine(mob/user) + ..() + user << "There are [crystals.len ? crystals.len : "no"] bluespace crystal\s in the crystal slots." + +/obj/machinery/computer/telescience/initialize() + ..() + for(var/i = 1; i <= starting_crystals; i++) + crystals += new /obj/item/weapon/ore/bluespace_crystal/artificial(src) // starting crystals + +/obj/machinery/computer/telescience/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/weapon/ore/bluespace_crystal)) + if(crystals.len >= max_crystals) + user << "There are not enough crystal slots." + return + if(!user.unEquip(W)) + return + crystals += W + W.forceMove(src) + user.visible_message("[user] inserts [W] into \the [src]'s crystal slot.", "You insert [W] into \the [src]'s crystal slot.") + updateDialog() + else if(istype(W, /obj/item/device/gps)) + if(!inserted_gps) + inserted_gps = W + user.unEquip(W) + W.forceMove(src) + user.visible_message("[user] inserts [W] into \the [src]'s GPS device slot.", "You insert [W] into \the [src]'s GPS device slot.") + else if(istype(W, /obj/item/device/multitool)) + var/obj/item/device/multitool/M = W + if(M.connectable && istype(M.connectable, /obj/machinery/telepad)) + telepad = M.connectable + M.connectable = null + user << "You upload the data from the [W.name]'s buffer." + else + return ..() + +/obj/machinery/computer/telescience/proc/get_max_allowed_distance() + return Floor(crystals.len * telepad.efficiency * powerCoefficient) + +/obj/machinery/computer/telescience/attack_ai(mob/user) + src.attack_hand(user) + +/obj/machinery/computer/telescience/attack_hand(mob/user) + if(..()) + return + ui_interact(user) + +/obj/machinery/computer/telescience/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + user.set_machine(src) + + var/data[0] + if(!telepad) + in_use = 0 //Yeah so if you deconstruct teleporter while its in the process of shooting it wont disable the console + data["noTelepad"] = 1 + else + data["insertedGps"] = inserted_gps + data["rotation"] = rotation + data["currentZ"] = z_co + data["cooldown"] = max(0, min(100, round(teleport_cooldown - world.time) / 10)) + data["crystalCount"] = crystals.len + data["maxCrystals"] = max_crystals + data["maxPossibleDistance"] = Floor(max_crystals * powerCoefficient * 6); // max efficiency is 6 + data["maxAllowedDistance"] = get_max_allowed_distance() + data["distance"] = distance + + data["tempMsg"] = temp_msg + if(telepad.panel_open) + data["tempMsg"] = "Telepad undergoing physical maintenance operations." + + data["sectorOptions"] = list() + for(var/z in config.player_levels) + data["sectorOptions"] += z + + if(last_tele_data) + data["lastTeleData"] = list() + data["lastTeleData"]["src_x"] = last_tele_data.src_x + data["lastTeleData"]["src_y"] = last_tele_data.src_y + data["lastTeleData"]["distance"] = last_tele_data.distance + data["lastTeleData"]["time"] = last_tele_data.time + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "telescience_console.tmpl", src.name, 400, 450) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(5) + +/obj/machinery/computer/telescience/proc/sparks() + if(telepad) + var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread) + s.set_up(5, 1, get_turf(telepad)) + s.start() + else + return + +/obj/machinery/computer/telescience/proc/telefail() + switch(rand(99)) + if(0 to 85) + sparks() + visible_message("The telepad weakly fizzles.") + return + if(86 to 90) + // Irradiate everyone in telescience! + for(var/obj/machinery/telepad/E in machines) + var/L = get_turf(E) + sparks(target = L) + for(var/mob/living/carbon/human/M in viewers(L, null)) + M.apply_effect((rand(10, 20)), IRRADIATE, 0) + to_chat(M, "You feel strange.") + return + if(91 to 98) + // They did the mash! (They did the monster mash!) The monster mash! (It was a graveyard smash!) + sparks() + if(telepad) + var/L = get_turf(telepad) + var/blocked = list(/mob/living/simple_animal/hostile/vore) + var/list/hostiles = typesof(/mob/living/simple_animal/hostile/vore) - blocked + playsound(L, 'sound/effects/phasein.ogg', 100, 1, extrarange = 3, falloff = 5) + for(var/i in 1 to rand(1,4)) + var/chosen = pick(hostiles) + var/mob/living/simple_animal/hostile/H = new chosen + H.forceMove(L) + return + if(99) + sparks() + visible_message("The telepad changes colors rapidly, and opens a portal, and you see what your mind seems to think is the very threads that hold the pattern of the universe together, and a eerie sense of paranoia creeps into you.") + spacevine_infestation() + return + +/obj/machinery/computer/telescience/proc/doteleport(mob/user) + + if(teleport_cooldown > world.time) + return + if(teleporting) + return + + if(telepad) + var/trueDistance = Clamp(distance + distance_off, 1, get_max_allowed_distance()) + var/trueRotation = rotation + rotation_off + + var/datum/projectile_data/proj_data = simple_projectile_trajectory(telepad.x, telepad.y, trueRotation, trueDistance) + last_tele_data = proj_data + + var/trueX = proj_data.dest_x + var/trueY = proj_data.dest_y + if(trueX < 1 || trueX > world.maxx || trueY < 1 || trueY > world.maxy) + telefail() + temp_msg = "ERROR! Target coordinate is outside known time and space!" + return + + var/spawn_time = round(proj_data.time) * 10 + + var/turf/target = locate(trueX, trueY, z_co) + last_target = target + var/area/A = get_area(target) + flick("pad-beam", telepad) + + if(spawn_time > 15) // 1.5 seconds + playsound(telepad.loc, 'sound/weapons/flash.ogg', 50, 1) + // Wait depending on the time the projectile took to get there + teleporting = 1 + temp_msg = "Powering up bluespace crystals.
Please wait." + + spawn(spawn_time) // in deciseconds + if(!telepad) + return + if(telepad.inoperable()) + return + teleporting = 0 + teleport_cooldown = world.time + (spawn_time * 2) + teles_left -= 1 + + // use a lot of power + use_power(trueDistance * 10000) + + var/datum/effect/effect/system/spark_spread/S = PoolOrNew(/datum/effect/effect/system/spark_spread) + S.set_up(5, 1, get_turf(telepad)) + S.start() + + if(!A || (A.flags & BLUE_SHIELDED)) + telefail() + temp_msg = "ERROR!
Target is shielded from bluespace intersection!" + return + + temp_msg = "Teleport successful.
" + if(teles_left < 10) + temp_msg += "Calibration required soon.
" + temp_msg += "Data printed below." + + var/sparks = get_turf(target) + var/datum/effect/effect/system/spark_spread/Y = PoolOrNew(/datum/effect/effect/system/spark_spread) + Y.set_up(5, 1, sparks) + Y.start() + + var/turf/source = target + var/turf/dest = get_turf(telepad) + var/log_msg = "" + log_msg += ": [key_name(user)] has teleported " + + if(sending) + source = dest + dest = target + + flick("pad-beam", telepad) + playsound(telepad.loc, 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5) + for(var/atom/movable/ROI in source) + // if is anchored, don't let through + if(ROI.anchored) + if(isliving(ROI)) + var/mob/living/L = ROI + if(L.buckled) + // TP people on office chairs + if(L.buckled.anchored) + continue + + log_msg += "[key_name(L)] (on a chair), " + else + continue + else if(!isobserver(ROI)) + continue + if(ismob(ROI)) + var/mob/T = ROI + log_msg += "[key_name(T)], " + else + log_msg += "[ROI.name]" + if (istype(ROI, /obj/structure/closet)) + var/obj/structure/closet/C = ROI + log_msg += " (" + for(var/atom/movable/Q as mob|obj in C) + if(ismob(Q)) + log_msg += "[key_name(Q)], " + else + log_msg += "[Q.name], " + if (dd_hassuffix(log_msg, "(")) + log_msg += "empty)" + else + log_msg += ")" + log_msg += ", " + do_teleport(ROI, dest) + + if (!dd_hassuffix(log_msg, ", ")) + log_msg += "nothing" + log_msg += " [sending ? "to" : "from"] [trueX], [trueY], [z_co] ([A ? A.name : "null area"])" + investigate_log(log_msg, "telesci") + updateDialog() + +/obj/machinery/computer/telescience/proc/teleport(mob/user) + distance = Clamp(distance, 0, get_max_allowed_distance()) + if(rotation == null || distance == null || z_co == null) + temp_msg = "ERROR!
Set a distance, rotation and sector." + return + if(distance <= 0) + telefail() + temp_msg = "ERROR!
No distance selected!" + return + if(!(z_co in config.player_levels)) + telefail() + temp_msg = "ERROR! Sector is outside known time and space!" + return + if(teles_left > 0) + doteleport(user) + else + telefail() + temp_msg = "ERROR!
Calibration required." + return + return + +/obj/machinery/computer/telescience/proc/eject() + for(var/obj/item/I in crystals) + I.forceMove(src.loc) + crystals -= I + distance = 0 + +/obj/machinery/computer/telescience/Topic(href, href_list) + if(..()) + return + if(!telepad || telepad.panel_open) + updateDialog() + return + + if(href_list["setrotation"]) + var/new_rot = input("Please input desired bearing in degrees.", name, rotation) as num + if(..()) // Check after we input a value, as they could've moved after they entered something + return + rotation = Clamp(new_rot, -900, 900) + rotation = round(rotation, 0.01) + + if(href_list["setdistance"]) + var/new_pow = input("Please input desired distance in meters.", name, rotation) as num + if(..()) // Check after we input a value, as they could've moved after they entered something + return + distance = Clamp(new_pow, 1, get_max_allowed_distance()) + distance = Floor(distance) + + if(href_list["setz"]) + var/new_z = text2num(href_list["setz"]) + if(new_z in config.player_levels) + z_co = new_z + + if(href_list["ejectGPS"]) + if(inserted_gps) + inserted_gps.forceMove(loc) + inserted_gps = null + + if(href_list["setMemory"]) + if(last_target && inserted_gps) + // TODO - What was this even supposed to do?? + //inserted_gps.locked_location = last_target + temp_msg = "Location saved." + else + temp_msg = "ERROR!
No data was stored." + + if(href_list["send"]) + sending = 1 + teleport(usr) + + if(href_list["receive"]) + sending = 0 + teleport(usr) + + if(href_list["recal"]) + recalibrate() + sparks() + temp_msg = "NOTICE:
Calibration successful." + + if(href_list["eject"]) + eject() + temp_msg = "NOTICE:
Bluespace crystals ejected." + + updateDialog() + +/obj/machinery/computer/telescience/proc/recalibrate() + teles_left = rand(40, 50) + distance_off = rand(-4, 4) + rotation_off = rand(-10, 10) + + +// Procedure that calculates the actual trajectory taken! +/proc/simple_projectile_trajectory(var/src_x, var/src_y, var/rotation, var/distance) + var/time = distance / 10 // 100ms per distance seems fine? + var/dest_x = src_x + distance*sin(rotation); + var/dest_y = src_y + distance*cos(rotation); + return new /datum/projectile_data(src_x, src_y, time, distance, 0, 0, dest_x, dest_y) diff --git a/code/modules/ventcrawl/ventcrawl.dm b/code/modules/ventcrawl/ventcrawl.dm index 5c2db9f3de..c9d08c3385 100644 --- a/code/modules/ventcrawl/ventcrawl.dm +++ b/code/modules/ventcrawl/ventcrawl.dm @@ -45,8 +45,8 @@ var/list/ventcrawl_machinery = list( if(carried_item == ability_master) return 1 for(var/type in can_enter_vent_with) - if(istype(carried_item, can_enter_vent_with)) - return get_inventory_slot(carried_item) == 0 + if(istype(carried_item, type)) //VOREStation Edit - It was a typo before maybe? + return 1 //VOREStation Edit also return 0 /mob/living/carbon/is_allowed_vent_crawl_item(var/obj/item/carried_item) diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm b/code/modules/vore/appearance/sprite_accessories_vr.dm index 4f101c9aa4..9a1cbe6eaa 100644 --- a/code/modules/vore/appearance/sprite_accessories_vr.dm +++ b/code/modules/vore/appearance/sprite_accessories_vr.dm @@ -158,6 +158,11 @@ icon_state = "bunny" do_colouration = 1 +/datum/sprite_accessory/ears/antlers + name = "antlers" + desc = "" + icon_state = "antlers" + // Special snowflake ears go below here. /datum/sprite_accessory/ears/molenar_kitsune diff --git a/code/modules/vore/eating/silicon_vr.dm b/code/modules/vore/eating/silicon_vr.dm new file mode 100644 index 0000000000..17c418fdea --- /dev/null +++ b/code/modules/vore/eating/silicon_vr.dm @@ -0,0 +1,93 @@ +//Dat AI vore yo +#define HOLO_ORIGINAL_COLOR null //This seems to work for some reason? And look better? +#define HOLO_HARDLIGHT_COLOR "#d97de0" +#define HOLO_ORIGINAL_ALPHA 128 +#define HOLO_HARDLIGHT_ALPHA 210 + +/obj/effect/overlay/aiholo + var/mob/living/bellied //Only belly one person at a time. No huge vore-organs setup for AIs. + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE + alpha = HOLO_ORIGINAL_ALPHA //Half alpha here rather than in the icon so we can toggle it easily. + color = HOLO_ORIGINAL_COLOR //This is the blue from icons.dm that it was before. + desc = "A hologram representing an AI persona." + +/obj/effect/overlay/aiholo/proc/get_prey(var/mob/living/prey) + if(bellied) return + playsound('sound/effects/stealthoff.ogg',50,0) + bellied = prey + prey.forceMove(src) + visible_message("[src] entirely engulfs [prey] in hardlight holograms!") + usr << "You completely engulf [prey] in hardlight holograms!" //Can't be part of the above, because the above is from the hologram. + + desc = "[initial(desc)] It seems to have hardlight mode enabled and someone inside." + pass_flags = 0 + color = HOLO_HARDLIGHT_COLOR + alpha = HOLO_HARDLIGHT_ALPHA + +/obj/effect/overlay/aiholo/proc/drop_prey() + if(!bellied) return + playsound('sound/effects/stealthoff.ogg',50,0) + bellied.forceMove(get_turf(src)) + bellied.Weaken(2) + bellied.visible_message("[bellied] flops out of \the [src].","You flop out of \the [src].","You hear a thud.") + bellied = null + + desc = "[initial(desc)]" + pass_flags = initial(pass_flags) + color = initial(color) + alpha = initial(alpha) + +/obj/effect/overlay/aiholo/Destroy() + drop_prey() + ..() + +/mob/living/silicon/ai/verb/holo_nom() + set name = "Hardlight Nom" + set category = "Vore" + set desc = "Wrap up a person in hardlight holograms." + + // Wrong state + if (!eyeobj || !holo) + usr << "You can only use this when holo-projecting!" + return + + //Holopads have this 'masters' list where the keys are AI names and the values are the hologram effects + var/obj/effect/overlay/aiholo/hologram = holo.masters[src] + + //Something wrong on holopad + if(!hologram) + return + + //Already full + if (hologram.bellied) + var/choice = alert("You can only contain one person. [hologram.bellied] is in you.","Already Full","Drop Mob","Cancel") + if(choice == "Drop Mob") + hologram.drop_prey() + return + + var/mob/living/prey = input(src,"Select a mob to eat","Holonoms") as mob in oview(0,eyeobj)|null + if(!prey) + return //Probably cancelled + + if(!istype(prey)) + usr << "Invalid mob choice!" + return + + hologram.visible_message("[hologram] starts engulfing [prey] in hardlight holograms!") + src << "You begin engulfing [prey] in hardlight holograms." //Can't be part of the above, because the above is from the hologram. + if(do_after(user=eyeobj,delay=50,target=prey,needhand=0) && holo && hologram && !hologram.bellied) //Didn't move and still projecting and effect exists and no other bellied people + hologram.get_prey(prey) + +/* Can't, lets them examine things in camera blackout areas +//I basically have to do this, you know? +/mob/living/silicon/ai/examinate(atom/A as mob|obj|turf in view(eyeobj)) + set name = "Examine" + set category = "IC" + + A.examine(src) +*/ + +/mob/living/AIShiftClick(var/mob/user) //Shift-click as AI overridden on mobs to examine. + if(user.client) + src.examine(user) + return diff --git a/code/modules/vore/eating/simple_animal_vr.dm b/code/modules/vore/eating/simple_animal_vr.dm index 867c07aef2..a1a0c2d4a6 100644 --- a/code/modules/vore/eating/simple_animal_vr.dm +++ b/code/modules/vore/eating/simple_animal_vr.dm @@ -27,17 +27,20 @@ set category = "Vore" set src in oview(1) + var/mob/living/carbon/human/user = usr + if(!istype(user) || user.stat) return + var/datum/belly/B = vore_organs[vore_selected] - if(faction != usr.faction) - usr << "This predator isn't friendly, and doesn't give a shit about your opinions of it digesting you." + if(faction != user.faction) + user << "This predator isn't friendly, and doesn't give a shit about your opinions of it digesting you." return if(B.digest_mode == "Hold") - var/confirm = alert(usr, "Enabling digestion on [name] will cause it to digest all stomach contents. Using this to break OOC prefs is against the rules. Digestion will disable itself after 20 minutes.", "Enabling [name]'s Digestion", "Enable", "Cancel") + var/confirm = alert(user, "Enabling digestion on [name] will cause it to digest all stomach contents. Using this to break OOC prefs is against the rules. Digestion will disable itself after 20 minutes.", "Enabling [name]'s Digestion", "Enable", "Cancel") if(confirm == "Enable") B.digest_mode = "Digest" spawn(12000) //12000=20 minutes if(src) B.digest_mode = "Hold" else - var/confirm = alert(usr, "This mob is currently set to digest all stomach contents. Do you want to disable this?", "Disabling [name]'s Digestion", "Disable", "Cancel") + var/confirm = alert(user, "This mob is currently set to digest all stomach contents. Do you want to disable this?", "Disabling [name]'s Digestion", "Disable", "Cancel") if(confirm == "Disable") B.digest_mode = "Hold" diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index 9628c8d513..d3b47d93a6 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -114,7 +114,7 @@ dat += " ([B.internal_contents.len])" - if(user.vore_organs.len < 10) + if(user.vore_organs.len < 20) dat += "
  • New+
  • " dat += "" dat += "
    " @@ -360,7 +360,7 @@ hearer << sound('sound/vore/squish2.ogg',volume=80) if(href_list["newbelly"]) - if(user.vore_organs.len >= 10) + if(user.vore_organs.len >= 20) return 1 var/new_name = html_encode(input(usr,"New belly's name:","New Belly") as text|null) diff --git a/code/modules/vore/fluffstuff/custom_boxes_vr.dm b/code/modules/vore/fluffstuff/custom_boxes_vr.dm index 64d8b843cf..9409370732 100644 --- a/code/modules/vore/fluffstuff/custom_boxes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_boxes_vr.dm @@ -154,8 +154,8 @@ name = "Aronai's Kit" desc = "A kit containing Aronai's equipment." has_items = list( - /obj/item/weapon/storage/backpack/fluff/aronai, - /obj/item/weapon/rig/light/hacker/fluff/aronai, + ///obj/item/weapon/storage/backpack/fluff/aronai, + ///obj/item/weapon/rig/light/hacker/fluff/aronai, /obj/item/clothing/under/rank/khi/fluff/aronai, /obj/item/fluff/permit/aronai_kadigan, /obj/item/weapon/gun/projectile/khi/pistol, diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index 756eb67837..633c8277ad 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -643,7 +643,6 @@ new /obj/item/weapon/wirecutters(src) new /obj/item/device/multitool(src) new /obj/item/stack/cable_coil(src, 30, "red") - new /obj/item/stack/cable_coil(src, 30, "green") // molenar:Giliana Gamish /obj/item/clothing/suit/storage/toggle/labcoat/fluff/molenar @@ -807,6 +806,12 @@ rolled_sleeves = 0 starting_accessories = list(/obj/item/clothing/accessory/black) +//Kisukegema:Kisuke `the nerd` Gema +/obj/item/clothing/glasses/sunglasses/omnihud/kamina + name = "Kamina glasses" + icon_state = "kamina" + desc = "ROW ROW, FIGHT THE POWER." + //Kitsuhana Uniforms /obj/item/clothing/under/rank/khi name = "Delete Me" diff --git a/code/modules/vore/fluffstuff/custom_guns_vr.dm b/code/modules/vore/fluffstuff/custom_guns_vr.dm index 1a97cdf56a..54379d2936 100644 --- a/code/modules/vore/fluffstuff/custom_guns_vr.dm +++ b/code/modules/vore/fluffstuff/custom_guns_vr.dm @@ -39,7 +39,7 @@ icon = 'icons/obj/gun_vr.dmi' icon_state = "battlerifle" icon_override = 'icons/obj/gun_vr.dmi' - item_state = "battlerifle" + item_state = "battlerifle_i" item_icons = null w_class = ITEMSIZE_LARGE recoil = 2 // The battlerifle was known for its nasty recoil. @@ -64,7 +64,7 @@ icon_state = "haloshotgun" icon_override = 'icons/obj/gun_vr.dmi' - item_state = "haloshotgun" + item_state = "haloshotgun_i" item_icons = null ammo_type = /obj/item/ammo_casing/shotgun diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm index 664db6f48f..efb6262048 100644 --- a/code/modules/vore/fluffstuff/custom_items_vr.dm +++ b/code/modules/vore/fluffstuff/custom_items_vr.dm @@ -327,33 +327,37 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie //arokha:Aronai Kadigan - Vials to go with mk2 hypo /obj/item/weapon/reagent_containers/glass/beaker/vial/vr stabilize - name = "vial (1tr1in2tri2dxp)" + name = "vial (stabilize)" + desc = "10 Tricordrazine, 10 Dexalin Plus, 5 Tramadol, 5 Inaprovaline" New() ..() - reagents.add_reagent("tramadol", 5) - reagents.add_reagent("inaprovaline", 5) reagents.add_reagent("tricordrazine", 10) reagents.add_reagent("dexalinp", 10) + reagents.add_reagent("tramadol", 5) + reagents.add_reagent("inaprovaline", 5) bashed - name = "vial (5bi1tri)" + name = "vial (brute)" + desc = "25 Bicaridine, 5 Tricordrazine" New() ..() reagents.add_reagent("bicaridine", 25) reagents.add_reagent("tricordrazine", 5) toasted - name = "vial (3der2kel1tri)" + name = "vial (burn)" + desc = "10 Kelotane, 15 Dermaline, 5 Tricordrazine" New() ..() reagents.add_reagent("kelotane", 10) reagents.add_reagent("dermaline", 15) reagents.add_reagent("tricordrazine", 5) poisoned - name = "vial (4dy1hy1tri)" + name = "vial (toxins)" + desc = "25 Dylovene, 2 Hyronalin, 3 Tricordrazine" New() ..() - reagents.add_reagent("anti_toxin", 20) - reagents.add_reagent("hyronalin", 5) - reagents.add_reagent("tricordrazine", 5) + reagents.add_reagent("anti_toxin", 25) + reagents.add_reagent("hyronalin", 2) + reagents.add_reagent("tricordrazine", 3) //Swat43:Fortune Bloise /obj/item/weapon/storage/backpack/satchel/fluff/swat43bag @@ -566,4 +570,17 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie desc = "A custom-made MKII hypospray belonging to Chakat Tempest. There's small print engraved on the handle: A medicine-cat has no time for doubt. Act now, act swiftly." icon = 'icons/vore/custom_items_vr.dmi' item_state = "temphypo" - icon_state = "temphypo" \ No newline at end of file + icon_state = "temphypo" + +//WickedTempest: Chakat Tempest +/obj/item/weapon/storage/backpack/saddlebag/tempest + name = "Tempest's Saddlebags" + desc = "A custom-made set of saddlebags, tailored to Chakat Tempest's exact dimensions, and taste in color! One one side, there's small print stitched in: ...to carry the weight of any responsibility, burden or task." + icon = 'icons/vore/custom_items_vr.dmi' + icon_override = 'icons/vore/custom_items_vr.dmi' + item_state = "tempestsaddlebag" + icon_state = "tempestbag" + max_storage_space = INVENTORY_DUFFLEBAG_SPACE //Since they play a macro character, no reason to put custom slowdown code on here. + slowdown = 0 + taurtype = /datum/sprite_accessory/tail/taur/feline/tempest + no_message = "These saddlebags seem to be fitted for someone else, and keep slipping off!" diff --git a/code/modules/vore/fluffstuff/custom_permits_vr.dm b/code/modules/vore/fluffstuff/custom_permits_vr.dm index a9f2d1d035..1c3546be27 100644 --- a/code/modules/vore/fluffstuff/custom_permits_vr.dm +++ b/code/modules/vore/fluffstuff/custom_permits_vr.dm @@ -119,3 +119,14 @@ The individual named above is licensed by the Nanotrasen Department of Civil Protection to openly carry a MEUSOC 45. CONDITIONS. This license expires on 31/May/2561 and must be renewed by CentCom prior to this date."} + +// dhaeleena:Dhaeleena M'iar +/obj/item/fluff/permit/dhaeleena_miar + name = "Dhaeleena M'iar's Sidearm Permit" + desc = {" + NAME: Dhaeleena M'iar | RACE: Tajara | HOMEWORLD: Slyria + DOB: 15/Nov/2535 | HEIGHT: 210,3cm | SEX: Female + + The individual named above is licensed by the Nanotrasen Department of Civil Protection + to carry one Mateba Model 6 Unica handgun with stun/rubber/flash ammo. + This license expires on 01/Mar/2562 and must be renewed by CentCom prior to this date."} \ No newline at end of file diff --git a/config/alienwhitelist.txt b/config/alienwhitelist.txt index 616e044914..13b5cc157a 100644 --- a/config/alienwhitelist.txt +++ b/config/alienwhitelist.txt @@ -3,3 +3,5 @@ zekesturm - Xenomorph Hybrid bothnevarbackwards - Diona jemli - Gutterband xioen - Xenomorph Hybrid +sepulchre - Vox +zammyman215 - Vox diff --git a/config/custom_items.txt b/config/custom_items.txt index 4db42a8244..f503ff6c2b 100644 --- a/config/custom_items.txt +++ b/config/custom_items.txt @@ -274,7 +274,7 @@ item_path: /obj/item/device/modkit_conversion/fluff/harmonyspace { ckey: kisukegema character_name: Kisuke 'The Nerd' Gema -item_path: /obj/item/clothing/glasses/sunglasses/fluff/nerdglasses +item_path: /obj/item/clothing/glasses/sunglasses/omnihud/kamina } { @@ -321,6 +321,12 @@ character_name: Kari Akiren item_path: /obj/item/fluff/permit/kari_akiren } +{ +ckey: myryan +character_name: Myryan Karnage-Cunningham +item_path: /obj/item/weapon/storage/belt/utility/fluff/vulpine +} + # ######## N CKEYS # ######## O CKEYS { @@ -492,6 +498,12 @@ character_name: Chakat Tempest item_path: /obj/item/weapon/reagent_containers/hypospray/vr/tempest } +{ +ckey: wickedtemp +character_name: Chakat Tempest +item_path: /obj/item/weapon/storage/backpack/saddlebag/tempest +} + # ######## X CKEYS { diff --git a/icons/mob/vore/ears_vr.dmi b/icons/mob/vore/ears_vr.dmi index 633d84214f..47068be6a5 100644 Binary files a/icons/mob/vore/ears_vr.dmi and b/icons/mob/vore/ears_vr.dmi differ diff --git a/icons/obj/food_custom.dmi b/icons/obj/food_custom.dmi index 39491d65f5..4057be3993 100644 Binary files a/icons/obj/food_custom.dmi and b/icons/obj/food_custom.dmi differ diff --git a/icons/obj/gun_vr.dmi b/icons/obj/gun_vr.dmi index 48dbdeb4af..9d2a07e15b 100644 Binary files a/icons/obj/gun_vr.dmi and b/icons/obj/gun_vr.dmi differ diff --git a/icons/obj/jukebox.dmi b/icons/obj/jukebox.dmi index 9109049704..52386940e9 100644 Binary files a/icons/obj/jukebox.dmi and b/icons/obj/jukebox.dmi differ diff --git a/icons/obj/jukebox_vr.dmi b/icons/obj/jukebox_vr.dmi deleted file mode 100644 index 52386940e9..0000000000 Binary files a/icons/obj/jukebox_vr.dmi and /dev/null differ diff --git a/icons/obj/machines/synthpod.dmi b/icons/obj/machines/synthpod.dmi new file mode 100644 index 0000000000..2684ddcbe5 Binary files /dev/null and b/icons/obj/machines/synthpod.dmi differ diff --git a/icons/obj/papershredder.dmi b/icons/obj/papershredder.dmi new file mode 100644 index 0000000000..36764945df Binary files /dev/null and b/icons/obj/papershredder.dmi differ diff --git a/icons/obj/partslathe_vr.dmi b/icons/obj/partslathe_vr.dmi new file mode 100644 index 0000000000..d4dea2d785 Binary files /dev/null and b/icons/obj/partslathe_vr.dmi differ diff --git a/icons/obj/projectiles_vr.dmi b/icons/obj/projectiles_vr.dmi index e34d3c0c21..0fa44fbec3 100644 Binary files a/icons/obj/projectiles_vr.dmi and b/icons/obj/projectiles_vr.dmi differ diff --git a/icons/obj/tank_vr.dmi b/icons/obj/tank_vr.dmi new file mode 100644 index 0000000000..e533775167 Binary files /dev/null and b/icons/obj/tank_vr.dmi differ diff --git a/icons/obj/telescience.dmi b/icons/obj/telescience.dmi new file mode 100644 index 0000000000..34d42f100f Binary files /dev/null and b/icons/obj/telescience.dmi differ diff --git a/icons/vore/custom_clothes_vr.dmi b/icons/vore/custom_clothes_vr.dmi index 9752dad2ea..978b250ae2 100644 Binary files a/icons/vore/custom_clothes_vr.dmi and b/icons/vore/custom_clothes_vr.dmi differ diff --git a/icons/vore/custom_items_vr.dmi b/icons/vore/custom_items_vr.dmi index 6fbc40bf50..4077cb510b 100644 Binary files a/icons/vore/custom_items_vr.dmi and b/icons/vore/custom_items_vr.dmi differ diff --git a/maps/virgo-1.dmm b/maps/virgo-1.dmm index e28b1cddf8..79d6c00b83 100644 --- a/maps/virgo-1.dmm +++ b/maps/virgo-1.dmm @@ -840,7 +840,7 @@ "aqh" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/hos) "aqi" = (/obj/structure/grille,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/door/firedoor/border_only,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/window/reinforced/polarized{dir = 1},/obj/structure/window/reinforced/polarized{dir = 8},/obj/structure/window/reinforced/polarized{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/heads/hos) "aqj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/red{dir = 9},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/security/main) -"aqk" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/landmark/start{name = "Security Officer"},/obj/structure/disposalpipe/sortjunction/flipped{dir = 1; name = "HoS Office"; sortType = "HoS Office"},/turf/simulated/floor/tiled,/area/security/main) +"aqk" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/landmark/start{name = "Security Officer"},/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"},/turf/simulated/floor/tiled,/area/security/main) "aql" = (/obj/structure/table/standard,/obj/item/weapon/folder/red,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/security/main) "aqm" = (/obj/structure/table/standard,/obj/item/weapon/folder/red,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/security/main) "aqn" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/tiled,/area/security/main) @@ -3340,7 +3340,7 @@ "bml" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/medbreak) "bmm" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/medbreak) "bmn" = (/obj/machinery/door/airlock/glass_medical{name = "Staff Room"; req_access = list(5)},/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) -"bmo" = (/turf/simulated/wall,/area/medical/genetics_cloning) +"bmo" = (/turf/simulated/floor/wood,/area/medical/psych) "bmp" = (/obj/structure/closet/secure_closet/personal/patient,/obj/effect/floor_decal/corner/lime{dir = 9},/turf/simulated/floor/tiled/white,/area/medical/virology) "bmq" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/virology) "bmr" = (/obj/effect/floor_decal/corner/lime{dir = 6},/turf/simulated/floor/tiled/white,/area/medical/virology) @@ -3418,12 +3418,12 @@ "bnL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bnM" = (/obj/effect/floor_decal/corner/paleblue{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bnN" = (/obj/machinery/recharge_station,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/sleeper) -"bnO" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/bodybags{pixel_x = 1; pixel_y = 2},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/effect/floor_decal/corner/mauve{dir = 5},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/machinery/light_switch{pixel_x = -36; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) -"bnP" = (/obj/effect/floor_decal/corner/mauve/full{dir = 1},/obj/machinery/light{dir = 1},/obj/structure/table/standard,/obj/item/weapon/storage/laundry_basket,/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) -"bnQ" = (/obj/structure/window/reinforced{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/medical/genetics_cloning) -"bnR" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/camera/network/medbay{c_tag = "MED - Cloning"; dir = 2},/turf/simulated/floor/tiled,/area/medical/genetics_cloning) -"bnS" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/medical/genetics_cloning) -"bnT" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/medical/genetics_cloning) +"bnO" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/machinery/light_switch{pixel_x = -36; pixel_y = 0},/turf/simulated/floor/wood,/area/medical/psych) +"bnP" = (/obj/machinery/camera/network/medbay{c_tag = "MED - Mental Health"; dir = 2},/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/simulated/floor/carpet/blue,/area/medical/psych) +"bnQ" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/carpet/blue,/area/medical/psych) +"bnR" = (/obj/structure/bookcase,/turf/simulated/floor/carpet/blue,/area/medical/psych) +"bnS" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor/glass,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/medical{id_tag = "mentaldoor"; name = "Mental Health"; req_access = list(64)},/turf/simulated/floor/tiled/white,/area/medical/psych) +"bnT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/medical/psych) "bnU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/virology) "bnV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/medical/virology) "bnW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/medical/virology) @@ -3514,12 +3514,12 @@ "bpD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bpE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bpF" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/junction{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/sleeper) -"bpG" = (/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Cloning Laboratory"; req_access = list(66)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor/glass,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) -"bpH" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) -"bpI" = (/obj/effect/landmark/start{name = "Geneticist"},/obj/effect/floor_decal/corner/mauve{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) -"bpJ" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/medical/genetics_cloning) -"bpK" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/medical/genetics_cloning) -"bpL" = (/obj/structure/window/reinforced,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/medical/genetics_cloning) +"bpG" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/wood,/area/medical/psych) +"bpH" = (/obj/structure/bed/chair/comfy/brown{dir = 4},/turf/simulated/floor/carpet/blue,/area/medical/psych) +"bpI" = (/obj/effect/landmark/start{name = "Psychiatrist"},/obj/structure/bed/chair/office/dark{dir = 8},/turf/simulated/floor/carpet/blue,/area/medical/psych) +"bpJ" = (/obj/machinery/camera/network/medbay{c_tag = "MED - Diagnostics Starboard"; dir = 1},/obj/effect/floor_decal/corner/paleblue{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/sleeper) +"bpK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/wood,/area/medical/psych) +"bpL" = (/obj/structure/table/woodentable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet/blue,/area/medical/psych) "bpM" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled/white,/area/medical/virology) "bpN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/black,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/medical/virology) "bpO" = (/obj/machinery/disease2/isolator,/obj/effect/floor_decal/corner/lime{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/virology) @@ -3573,15 +3573,15 @@ "bqK" = (/obj/machinery/door/firedoor/glass,/obj/effect/floor_decal/corner/paleblue{dir = 2},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bqL" = (/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bqM" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/simulated/floor/tiled/white,/area/medical/sleeper) -"bqN" = (/obj/machinery/camera/network/medbay{c_tag = "MED - Diagnostics Starboard"; dir = 1},/turf/simulated/floor/tiled/white,/area/medical/sleeper) +"bqN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/landmark/start{name = "Psychiatrist"},/turf/simulated/floor/carpet/blue,/area/medical/psych) "bqO" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bqP" = (/obj/effect/floor_decal/corner/paleblue{dir = 2},/obj/machinery/light,/obj/machinery/vending/fitness,/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bqQ" = (/obj/machinery/vending/medical,/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/simulated/floor/tiled/white,/area/medical/sleeper) -"bqR" = (/obj/effect/floor_decal/corner/mauve{dir = 8},/obj/machinery/button/remote/airlock{desc = "A remote control switch for the medbay foyer."; id = "GeneticsDoor"; name = "Door Control"; pixel_x = -26; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) -"bqS" = (/obj/effect/floor_decal/corner/mauve{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) -"bqT" = (/obj/effect/floor_decal/corner/mauve{dir = 5},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) -"bqU" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) -"bqV" = (/obj/effect/floor_decal/corner/mauve/full{dir = 1},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) +"bqR" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/floor/carpet/blue,/area/medical/psych) +"bqS" = (/obj/structure/table/woodentable,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/computer/med_data/laptop,/turf/simulated/floor/carpet/blue,/area/medical/psych) +"bqT" = (/obj/effect/floor_decal/corner/paleblue{dir = 2},/obj/structure/disposalpipe/segment,/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/effect/floor_decal/corner/paleblue,/turf/simulated/floor/tiled/white,/area/medical/sleeper) +"bqU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet/blue,/area/medical/psych) +"bqV" = (/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; dir = 8; frequency = 1487; icon_state = "intercom"; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = -21; pixel_y = 0},/obj/structure/bed/chair/comfy/brown{dir = 4},/turf/simulated/floor/carpet/blue,/area/medical/psych) "bqW" = (/obj/structure/table/standard,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/effect/floor_decal/corner/lime{dir = 9},/obj/machinery/light,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/virology) "bqX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/virology) "bqY" = (/obj/machinery/door/window/westright{name = "Virology Isolation Room One"; req_access = list(39)},/obj/machinery/door/firedoor/glass,/obj/effect/floor_decal/corner/lime{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/virology) @@ -3660,18 +3660,18 @@ "bst" = (/obj/machinery/bodyscanner{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bsu" = (/obj/machinery/body_scanconsole,/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bsv" = (/obj/effect/floor_decal/corner/pink{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/medical/sleeper) -"bsw" = (/obj/effect/floor_decal/corner/paleblue{dir = 2},/obj/structure/disposalpipe/segment,/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/sleeper) +"bsw" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/carpet/blue,/area/medical/psych) "bsx" = (/turf/simulated/wall,/area/crew_quarters/heads/cmo) "bsy" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 1; icon_state = "shutter0"; id = "cmooffice"; name = "CMO Office Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/crew_quarters/heads/cmo) "bsz" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 1; icon_state = "shutter0"; id = "cmooffice"; name = "CMO Office Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/crew_quarters/heads/cmo) "bsA" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 1; icon_state = "shutter0"; id = "cmooffice"; name = "CMO Office Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/crew_quarters/heads/cmo) "bsB" = (/obj/machinery/door/airlock/command{id_tag = null; name = "CMO's Office"; req_access = list(40)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) -"bsC" = (/obj/effect/floor_decal/corner/mauve{dir = 9},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; dir = 8; frequency = 1487; icon_state = "intercom"; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = -21; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) -"bsD" = (/obj/structure/bed/chair/office/dark,/obj/effect/landmark/start{name = "Geneticist"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) -"bsE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) -"bsF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) -"bsG" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) -"bsH" = (/obj/effect/floor_decal/corner/mauve{dir = 6},/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) +"bsC" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/bed/psych,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/carpet/blue,/area/medical/psych) +"bsD" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/item/toy/therapy_blue,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/carpet/blue,/area/medical/psych) +"bsE" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/carpet/blue,/area/medical/psych) +"bsF" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/turf/simulated/floor/carpet/blue,/area/medical/psych) +"bsG" = (/obj/machinery/alarm{dir = 1; pixel_y = -25},/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/turf/simulated/floor/carpet/blue,/area/medical/psych) +"bsH" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{id_tag = "mentaldoor"; name = "Mental Health"; req_access = list(64)},/turf/simulated/floor/tiled,/area/medical/psych) "bsI" = (/obj/item/roller,/obj/effect/floor_decal/corner/lime{dir = 6},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/floor/tiled/white,/area/medical/virology) "bsJ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/medical/virology) "bsK" = (/obj/structure/table/glass,/obj/item/weapon/storage/fancy/vials,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/effect/floor_decal/corner/lime/full{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/virology) @@ -3752,12 +3752,12 @@ "buh" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bui" = (/obj/effect/floor_decal/corner/paleblue{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "buj" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/effect/floor_decal/corner/paleblue/full{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) -"buk" = (/obj/machinery/clonepod{biomass = 600},/obj/effect/floor_decal/corner/mauve/full,/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) -"bul" = (/obj/machinery/computer/cloning,/obj/effect/floor_decal/corner/mauve{dir = 10},/obj/machinery/light,/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) -"bum" = (/obj/machinery/dna_scannernew,/obj/effect/floor_decal/corner/mauve{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) -"bun" = (/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) -"buo" = (/obj/structure/closet/wardrobe/genetics_white,/obj/effect/floor_decal/corner/mauve,/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) -"bup" = (/obj/structure/closet/wardrobe/medic_white,/obj/effect/floor_decal/corner/mauve/full{dir = 4},/obj/machinery/alarm{dir = 1; pixel_y = -25},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) +"buk" = (/obj/item/weapon/stool/padded,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/item/weapon/storage/box/backup_kit,/turf/simulated/floor/tiled/white,/area/medical/reception) +"bul" = (/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/medical/morgue) +"bum" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled,/area/medical/morgue) +"bun" = (/obj/structure/closet/secure_closet{name = "Psychiatrist's Locker"; req_access = list(64)},/obj/item/clothing/suit/straight_jacket{layer = 3},/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/pill/methylphenidate,/obj/item/weapon/reagent_containers/pill/citalopram,/obj/item/weapon/reagent_containers/pill/citalopram,/obj/item/weapon/reagent_containers/pill/methylphenidate,/obj/item/weapon/reagent_containers/syringe,/turf/simulated/floor/tiled,/area/medical/morgue) +"buo" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Morgue"; req_access = list(6)},/turf/simulated/floor/tiled,/area/medical/morgue) +"bup" = (/obj/structure/table/standard,/obj/item/weapon/packageWrap,/obj/item/weapon/hand_labeler,/obj/effect/floor_decal/corner/paleblue{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/medbay_primary_storage) "buq" = (/obj/structure/table/glass,/obj/item/weapon/folder/white,/obj/item/weapon/hand_labeler,/obj/effect/floor_decal/corner/lime/full,/obj/structure/extinguisher_cabinet{pixel_x = -27},/turf/simulated/floor/tiled/white,/area/medical/virology) "bur" = (/obj/structure/table/glass,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 8},/obj/item/device/radio{anchored = 1; broadcasting = 0; canhear_range = 7; frequency = 1487; icon = 'icons/obj/items.dmi'; icon_state = "red_phone"; listening = 1; name = "Virology Emergency Phone"; pixel_x = -6; pixel_y = 8},/obj/item/weapon/reagent_containers/spray/cleaner,/obj/effect/floor_decal/corner/lime{dir = 10},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/medical/virology) "bus" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/obj/effect/floor_decal/corner/lime{dir = 8},/obj/machinery/light,/turf/simulated/floor/tiled/white,/area/medical/virology) @@ -3819,8 +3819,8 @@ "bvw" = (/obj/structure/table/reinforced,/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bvx" = (/obj/structure/table/reinforced,/obj/machinery/computer/skills{pixel_y = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bvy" = (/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) -"bvz" = (/obj/structure/closet/secure_closet/CMO,/obj/effect/floor_decal/corner/paleblue{dir = 6},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/obj/item/clothing/glasses/sunglasses/omnihud/cmo,/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) -"bvA" = (/obj/machinery/door/airlock/medical{name = "Morgue"; req_access = list(6,5)},/obj/machinery/door/firedoor,/turf/simulated/floor/tiled,/area/medical/genetics_cloning) +"bvz" = (/obj/structure/closet/secure_closet/CMO,/obj/effect/floor_decal/corner/paleblue{dir = 6},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/obj/item/clothing/glasses/sunglasses/omnihud/cmo,/obj/item/weapon/cmo_disk_holder,/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) +"bvA" = (/obj/structure/table/steel,/obj/item/weapon/autopsy_scanner,/obj/item/weapon/surgical/scalpel,/obj/machinery/light{dir = 1},/obj/item/weapon/surgical/cautery,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/simulated/floor/tiled,/area/medical/morgue) "bvB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/medical/virology) "bvC" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/medical/virology) "bvD" = (/obj/machinery/door/airlock/glass_medical{name = "Virology Laboratory"; req_access = list(39)},/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/black,/turf/simulated/floor/tiled/white,/area/medical/virology) @@ -3871,7 +3871,7 @@ "bww" = (/obj/effect/floor_decal/corner/paleblue{dir = 6},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/reception) "bwx" = (/obj/structure/table/standard,/obj/structure/window/reinforced{dir = 8},/obj/machinery/button/remote/blast_door{id = "medbayrecquar"; name = "Medbay Entrance Quarantine Shutters Control"; pixel_x = -4; pixel_y = -4; req_access = list(5)},/obj/machinery/button/remote/airlock{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyer"; name = "Medbay Doors Control"; pixel_x = -4; pixel_y = 6},/obj/machinery/button/remote/airlock{desc = "A remote control switch for the medbay foyer."; id = "surgery_observation"; name = "Surgery Door Access"; pixel_x = 8; pixel_y = 0; specialfunctions = 4},/obj/effect/floor_decal/corner/paleblue{dir = 9},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/reception) "bwy" = (/obj/machinery/computer/crew,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/reception) -"bwz" = (/obj/item/weapon/stool/padded,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/reception) +"bwz" = (/obj/effect/floor_decal/corner/paleblue/full{dir = 8},/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor/tiled,/area/medical/morgue) "bwA" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/reception) "bwB" = (/obj/machinery/door/airlock/glass_medical{name = "Medbay Equipment"; req_access = list(5)},/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/medbay_primary_storage) "bwC" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/medbay_primary_storage) @@ -3894,12 +3894,12 @@ "bwT" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bwU" = (/obj/structure/table/reinforced,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/item/device/radio{frequency = 1487; name = "Medbay Emergency Radio Link"},/obj/item/device/megaphone,/obj/effect/floor_decal/corner/paleblue{dir = 6},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bwV" = (/turf/simulated/wall,/area/medical/morgue) -"bwW" = (/obj/structure/table/steel,/obj/item/weapon/autopsy_scanner,/obj/item/weapon/surgical/scalpel,/obj/effect/floor_decal/corner/paleblue/full{dir = 8},/obj/machinery/light{dir = 1},/obj/item/weapon/surgical/cautery,/turf/simulated/floor/tiled,/area/medical/morgue) +"bwW" = (/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/simulated/floor/tiled,/area/medical/morgue) "bwX" = (/obj/structure/table/steel,/obj/item/device/camera{name = "Autopsy Camera"; pixel_x = -2; pixel_y = 7},/obj/item/weapon/paper_bin{pixel_y = -6},/obj/item/weapon/pen/red{pixel_x = -1; pixel_y = -9},/obj/item/weapon/pen/blue{pixel_x = 3; pixel_y = -5},/obj/effect/floor_decal/corner/paleblue{dir = 5},/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; dir = 1; frequency = 1487; icon_state = "intercom"; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/tiled,/area/medical/morgue) -"bwY" = (/obj/machinery/disposal,/obj/effect/floor_decal/corner/paleblue{dir = 1},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/tiled,/area/medical/morgue) +"bwY" = (/obj/effect/floor_decal/corner/paleblue/full{dir = 1},/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/turf/simulated/floor/tiled,/area/medical/morgue) "bwZ" = (/turf/simulated/floor/tiled,/area/medical/morgue) -"bxa" = (/obj/effect/floor_decal/corner/paleblue{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/medical/morgue) -"bxb" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/obj/effect/floor_decal/corner/paleblue/full{dir = 1},/turf/simulated/floor/tiled,/area/medical/morgue) +"bxa" = (/obj/effect/floor_decal/corner/paleblue{dir = 5},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor/tiled,/area/medical/morgue) +"bxb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/medical/morgue) "bxc" = (/obj/structure/closet/l3closet/virology,/obj/item/clothing/mask/gas,/obj/effect/floor_decal/corner/lime{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/virology) "bxd" = (/obj/effect/floor_decal/corner/lime{dir = 5},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/medical/virology) "bxe" = (/obj/effect/floor_decal/corner/lime{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/virology) @@ -3986,9 +3986,9 @@ "byH" = (/obj/structure/table/reinforced,/obj/machinery/computer/med_data/laptop{pixel_x = 3; pixel_y = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "byI" = (/obj/effect/floor_decal/corner/paleblue{dir = 2},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "byJ" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/medical,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/glasses/hud/health,/obj/machinery/requests_console{announcementConsole = 1; department = "Chief Medical Officer's Desk"; departmentType = 5; name = "Chief Medical Officer RC"; pixel_x = 32; pixel_y = -2},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -26},/obj/effect/floor_decal/corner/paleblue/full{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) -"byK" = (/obj/effect/floor_decal/corner/paleblue{dir = 9},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/medical/morgue) -"byL" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/medical/morgue) -"byM" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/medical/morgue) +"byK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/effect/floor_decal/corner/paleblue{dir = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/medical/morgue) +"byL" = (/obj/effect/floor_decal/corner/paleblue{dir = 6},/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/turf/simulated/floor/tiled,/area/medical/morgue) +"byM" = (/obj/effect/floor_decal/corner/paleblue{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "byN" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/obj/effect/floor_decal/corner/paleblue{dir = 6},/turf/simulated/floor/tiled,/area/medical/morgue) "byO" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/medbay_fore) "byP" = (/obj/effect/floor_decal/corner/lime{dir = 10},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/tiled/white,/area/medical/virology) @@ -4081,7 +4081,7 @@ "bAy" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/reception) "bAz" = (/obj/effect/floor_decal/corner/paleblue{dir = 4},/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/floor/tiled/white,/area/medical/reception) "bAA" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/glass/bottle/stoxin{pixel_x = -6; pixel_y = 10},/obj/item/weapon/reagent_containers/glass/bottle/antitoxin{pixel_x = 5; pixel_y = 5},/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline{pixel_x = 1},/obj/random/medical,/obj/effect/floor_decal/corner/paleblue/full,/obj/machinery/light{dir = 8},/obj/item/weapon/storage/firstaid/regular{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/tiled/white,/area/medical/medbay_primary_storage) -"bAB" = (/obj/structure/table/standard,/obj/item/weapon/packageWrap,/obj/item/weapon/hand_labeler,/obj/effect/floor_decal/corner/paleblue{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/medbay_primary_storage) +"bAB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/medical/morgue) "bAC" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/medical/medbay_primary_storage) "bAD" = (/obj/structure/table/rack,/obj/item/device/radio{frequency = 1487; icon_state = "med_walkietalkie"; name = "Medbay Emergency Radio Link"; pixel_x = 2; pixel_y = 2},/obj/item/device/radio{frequency = 1487; icon_state = "med_walkietalkie"; name = "Medbay Emergency Radio Link"},/obj/item/device/radio{frequency = 1487; icon_state = "med_walkietalkie"; name = "Medbay Emergency Radio Link"},/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/simulated/floor/tiled/white,/area/medical/medbay_primary_storage) "bAE" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/emergency,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/simulated/floor/tiled/white,/area/medical/medbay_primary_storage) @@ -4098,9 +4098,9 @@ "bAP" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{department = "CMO's Office"},/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/machinery/light,/obj/machinery/camera/network/medbay{c_tag = "MED - CMO"; dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bAQ" = (/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/machinery/light_switch{pixel_x = -10; pixel_y = -23},/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bAR" = (/obj/machinery/computer/crew,/obj/effect/floor_decal/corner/paleblue/full{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; dir = 2; frequency = 1487; icon_state = "intercom"; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = -21},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) -"bAS" = (/obj/effect/floor_decal/corner/paleblue{dir = 9},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/medical/morgue) +"bAS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bAT" = (/obj/machinery/optable,/turf/simulated/floor/tiled,/area/medical/morgue) -"bAU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/medical/morgue) +"bAU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bAV" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/medical/morgue) "bAW" = (/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "virology_airlock_interior"; locked = 1; name = "Virology Interior Airlock"; req_access = list(39)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/black,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/medical/virology) "bAX" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/wall/r_wall,/area/medical/virology) @@ -4194,9 +4194,9 @@ "bCH" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "cmooffice"; name = "CMO Office Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/crew_quarters/heads/cmo) "bCI" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "cmooffice"; name = "CMO Office Privacy Shutters"; opacity = 0},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/heads/cmo) "bCJ" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/effect/floor_decal/corner/paleblue/full{dir = 8},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/tiled,/area/medical/morgue) -"bCK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/effect/floor_decal/corner/paleblue{dir = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/medical/morgue) -"bCL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/medical/morgue) -"bCM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/tiled,/area/medical/morgue) +"bCK" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/medical/morgue) +"bCL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled,/area/medical/morgue) +"bCM" = (/obj/effect/floor_decal/corner/paleblue,/obj/machinery/light,/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bCN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled,/area/medical/morgue) "bCO" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/structure/closet/wardrobe/virology_white,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "virology_airlock_control"; name = "Virology Access Button"; pixel_x = 8; pixel_y = 28; req_access = list(39)},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/virology) "bCP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 9},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/medical/virology) @@ -4280,15 +4280,15 @@ "bEp" = (/obj/effect/floor_decal/corner/paleblue{dir = 5},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bEq" = (/obj/effect/floor_decal/corner/paleblue{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bEr" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/medical/sleeper) -"bEs" = (/obj/machinery/door/firedoor/glass,/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/sleeper) -"bEt" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/atmospherics/portables_connector,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/medical/sleeper) -"bEu" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/medical/sleeper) -"bEv" = (/obj/machinery/atmospherics/unary/cryo_cell,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/medical/sleeper) +"bEs" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/tiled/white,/area/medical/sleeper) +"bEt" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/structure/sign/goldenplaque{desc = "Done No Harm."; name = "Best Doctor 2552"; pixel_y = -32},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/sleeper) +"bEu" = (/turf/simulated/wall,/area/medical/resleeving) +"bEv" = (/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "psych"; name = "Mental Health Privacy Shutters"; opacity = 0},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced/polarized{dir = 1; id = "resleeve_tint"},/obj/structure/window/reinforced/polarized{id = "resleeve_tint"},/obj/structure/window/reinforced/polarized{dir = 4; id = "resleeve_tint"},/turf/simulated/floor/plating,/area/medical/resleeving) "bEw" = (/obj/structure/table/steel,/obj/item/weapon/storage/box/bodybags,/obj/effect/floor_decal/corner/paleblue/full{dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/item/weapon/storage/box/bodybags,/turf/simulated/floor/tiled,/area/medical/morgue) "bEx" = (/obj/structure/table/steel,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/blue{pixel_x = 3; pixel_y = -5},/obj/item/weapon/pen/red{pixel_x = -1; pixel_y = -9},/obj/effect/floor_decal/corner/paleblue{dir = 5},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled,/area/medical/morgue) "bEy" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/paleblue{dir = 1},/turf/simulated/floor/tiled,/area/medical/morgue) -"bEz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/medical/morgue) -"bEA" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/turf/simulated/floor/tiled,/area/medical/morgue) +"bEz" = (/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "psych"; name = "Mental Health Privacy Shutters"; opacity = 0},/obj/structure/window/reinforced/polarized{id = "resleeve_tint"},/obj/structure/window/reinforced/polarized{dir = 8; id = "resleeve_tint"},/obj/structure/window/reinforced/polarized{dir = 1; id = "resleeve_tint"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/medical/resleeving) +"bEA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/medical{id_tag = "ResleevingDoor"; name = "Resleeving Lab"; req_access = list(5)},/turf/simulated/floor/tiled/white,/area/medical/resleeving) "bEB" = (/obj/structure/morgue,/turf/simulated/floor/tiled,/area/medical/morgue) "bEC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/medical/morgue) "bED" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/structure/closet/l3closet/virology,/obj/machinery/power/apc{cell_type = /obj/item/weapon/cell/super; dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/tiled/white,/area/medical/virology) @@ -4368,9 +4368,9 @@ "bFZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bGa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bGb" = (/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/turf/simulated/floor/tiled/white,/area/medical/sleeper) -"bGc" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/sleeper) -"bGd" = (/obj/machinery/atmospherics/pipe/manifold/visible,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/sleeper) -"bGe" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/sleeper) +"bGc" = (/obj/structure/grille,/obj/structure/window/reinforced/polarized{dir = 4; id = "resleeve_tint"},/obj/structure/window/reinforced/polarized{dir = 8; id = "resleeve_tint"},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced/polarized{dir = 1; id = "resleeve_tint"},/obj/structure/window/reinforced/polarized{id = "resleeve_tint"},/turf/simulated/floor/plating,/area/medical/resleeving) +"bGd" = (/obj/structure/bed/chair,/obj/effect/floor_decal/corner/paleblue{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/resleeving) +"bGe" = (/obj/effect/floor_decal/corner/paleblue/full{dir = 8},/obj/structure/bed/chair,/turf/simulated/floor/tiled/white,/area/medical/resleeving) "bGf" = (/obj/structure/filingcabinet/chestdrawer{desc = "A large drawer filled with autopsy reports."; name = "Autopsy Reports"},/obj/machinery/light_switch{pixel_x = -26; pixel_y = 0},/turf/simulated/floor/tiled,/area/medical/morgue) "bGg" = (/obj/structure/bed/chair/office/dark{dir = 1},/turf/simulated/floor/tiled,/area/medical/morgue) "bGh" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/medical/morgue) @@ -4444,10 +4444,10 @@ "bHx" = (/obj/machinery/door/firedoor/glass,/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bHy" = (/obj/effect/floor_decal/corner/paleblue{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bHz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/medical/sleeper) -"bHA" = (/obj/structure/sign/goldenplaque{desc = "Done No Harm."; name = "Best Doctor 2552"; pixel_y = -32},/obj/effect/floor_decal/corner/paleblue,/turf/simulated/floor/tiled/white,/area/medical/sleeper) +"bHA" = (/obj/effect/floor_decal/corner/paleblue{dir = 4},/obj/machinery/button/remote/airlock{desc = "A remote control switch for the medbay foyer."; id = "ResleevingDoor"; name = "Door Control"; pixel_x = 0; pixel_y = 26},/obj/structure/bed/chair,/obj/machinery/button/windowtint{id = "resleeve_tint"; pixel_x = 5; pixel_y = 35},/obj/machinery/light_switch{pixel_x = -5; pixel_y = 35},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/resleeving) "bHB" = (/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/machinery/camera/network/medbay{c_tag = "MED - Diagnostics Aft"; dir = 1},/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; dir = 2; frequency = 1487; icon_state = "intercom"; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = -21},/turf/simulated/floor/tiled/white,/area/medical/sleeper) -"bHC" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/simulated/floor/tiled/white,/area/medical/sleeper) -"bHD" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/simulated/floor/tiled/white,/area/medical/sleeper) +"bHC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled/white,/area/medical/resleeving) +"bHD" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/atmospherics/portables_connector,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/medical/resleeving) "bHE" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bHF" = (/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/paleblue{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bHG" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/structure/disposalpipe/junction/yjunction,/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled/white,/area/medical/sleeper) @@ -4458,7 +4458,7 @@ "bHL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/paleblue,/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -26},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/medical/morgue) "bHM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/turf/simulated/floor/tiled,/area/medical/morgue) "bHN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/medical/morgue) -"bHO" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/simulated/floor/tiled,/area/medical/morgue) +"bHO" = (/obj/effect/floor_decal/corner/paleblue{dir = 5},/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/light{dir = 1},/obj/structure/bed/chair,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/tiled/white,/area/medical/resleeving) "bHP" = (/obj/structure/morgue,/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/simulated/floor/tiled,/area/medical/morgue) "bHQ" = (/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/machinery/light,/obj/machinery/camera/network/medbay{c_tag = "MED - Morgue"; dir = 1},/turf/simulated/floor/tiled,/area/medical/morgue) "bHR" = (/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/simulated/floor/tiled,/area/medical/morgue) @@ -4522,9 +4522,9 @@ "bIX" = (/obj/structure/sign/nosmoking_1,/turf/simulated/wall,/area/medical/medbay_emt_bay) "bIY" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/medical/medbay_emt_bay) "bIZ" = (/turf/simulated/wall,/area/medical/psych) -"bJa" = (/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "psych"; name = "Mental Health Privacy Shutters"; opacity = 0},/obj/structure/window/reinforced/polarized{id = "psyco_tint"},/obj/structure/window/reinforced/polarized{dir = 8; id = "psyco_tint"},/obj/structure/window/reinforced/polarized{dir = 1; id = "psyco_tint"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/medical/psych) -"bJb" = (/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "psych"; name = "Mental Health Privacy Shutters"; opacity = 0},/obj/structure/window/reinforced/polarized{id = "psyco_tint"},/obj/structure/window/reinforced/polarized{dir = 1; id = "psyco_tint"},/obj/structure/window/reinforced/polarized{dir = 4; id = "psyco_tint"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/medical/psych) -"bJc" = (/obj/machinery/door/airlock/medical{id_tag = "mentaldoor"; name = "Mental Health"; req_access = list(64)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/medical/psych) +"bJa" = (/obj/machinery/atmospherics/unary/cryo_cell,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/medical/resleeving) +"bJb" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/medical/resleeving) +"bJc" = (/obj/structure/grille,/obj/structure/window/reinforced/polarized{dir = 4; id = "resleeve_tint"},/obj/structure/window/reinforced/polarized{dir = 8; id = "resleeve_tint"},/obj/structure/window/reinforced/polarized{dir = 1; id = "resleeve_tint"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/medical/resleeving) "bJd" = (/turf/simulated/wall,/area/medical/patient_a) "bJe" = (/obj/machinery/door/airlock/glass_medical{name = "Patient Ward"},/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/medical/patient_wing) "bJf" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/medical/patient_wing) @@ -4599,14 +4599,14 @@ "bKw" = (/obj/effect/floor_decal/corner/pink{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay) "bKx" = (/turf/simulated/floor,/area/medical/medbay_emt_bay) "bKy" = (/obj/machinery/mech_recharger,/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/medical/medbay_emt_bay) -"bKz" = (/obj/structure/closet/secure_closet{name = "Psychiatrist's Locker"; req_access = list(64)},/obj/item/clothing/suit/straight_jacket{layer = 3},/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/pill/methylphenidate,/obj/item/weapon/reagent_containers/pill/citalopram,/obj/item/weapon/reagent_containers/pill/citalopram,/obj/item/weapon/reagent_containers/pill/methylphenidate,/obj/item/weapon/reagent_containers/syringe,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/wood,/area/medical/psych) -"bKA" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light{dir = 1},/turf/simulated/floor/wood,/area/medical/psych) -"bKB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/wood,/area/medical/psych) -"bKC" = (/obj/structure/bookcase,/turf/simulated/floor/wood,/area/medical/psych) +"bKz" = (/turf/simulated/floor/tiled/white,/area/medical/resleeving) +"bKA" = (/obj/effect/floor_decal/corner/paleblue{dir = 9},/turf/simulated/floor/tiled/white,/area/medical/resleeving) +"bKB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/white,/area/medical/resleeving) +"bKC" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/resleeving) "bKD" = (/obj/effect/floor_decal/corner/pink/full{dir = 8},/obj/machinery/iv_drip,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = -25; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/patient_a) "bKE" = (/obj/effect/floor_decal/corner/pink{dir = 5},/obj/structure/bed/padded,/obj/item/weapon/bedsheet/medical,/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/tiled/white,/area/medical/patient_a) -"bKF" = (/obj/effect/floor_decal/corner/pink{dir = 5},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = 36},/obj/machinery/button/windowtint{id = "pr1_window_tint"; pixel_y = 26},/turf/simulated/floor/tiled/white,/area/medical/patient_a) -"bKG" = (/obj/structure/window/reinforced/polarized{dir = 1; id = "pr1_window_tint"},/obj/structure/grille,/obj/machinery/door/firedoor,/obj/structure/window/reinforced/polarized{dir = 2; id = "pr1_window_tint"},/obj/structure/window/reinforced/polarized{dir = 4; id = "pr1_window_tint"},/obj/structure/window/reinforced/polarized{dir = 8; id = "pr1_window_tint"},/turf/simulated/floor,/area/medical/patient_a) +"bKF" = (/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/turf/simulated/floor/tiled/white,/area/medical/resleeving) +"bKG" = (/obj/effect/floor_decal/corner/paleblue{dir = 6},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/resleeving) "bKH" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/medical/patient_wing) "bKI" = (/obj/machinery/camera/network/medbay{c_tag = "MED - Patient Hallway Fore"; dir = 2},/turf/simulated/floor/tiled/white,/area/medical/patient_wing) "bKJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/white,/area/medical/patient_wing) @@ -4697,15 +4697,15 @@ "bMq" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled/steel,/area/medical/medbay_emt_bay) "bMr" = (/turf/simulated/floor/tiled/steel,/area/medical/medbay_emt_bay) "bMs" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/tiled/steel,/area/medical/medbay_emt_bay) -"bMt" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/wood,/area/medical/psych) -"bMu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/medical/psych) -"bMv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/hologram/holopad,/turf/simulated/floor/wood,/area/medical/psych) -"bMw" = (/obj/structure/bed/chair/comfy/brown,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/wood,/area/medical/psych) -"bMx" = (/obj/effect/floor_decal/corner/pink{dir = 9},/obj/structure/bed/chair/office/light,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/camera/network/medbay{c_tag = "MED - Patient Room A"; dir = 4},/turf/simulated/floor/tiled/white,/area/medical/patient_a) +"bMt" = (/obj/machinery/atmospherics/pipe/manifold/visible,/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/resleeving) +"bMu" = (/obj/structure/grille,/obj/structure/window/reinforced/polarized{dir = 4; id = "resleeve_tint"},/obj/structure/window/reinforced/polarized{dir = 8; id = "resleeve_tint"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/medical/resleeving) +"bMv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled/white,/area/medical/patient_wing) +"bMw" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/effect/floor_decal/corner/paleblue{dir = 9},/turf/simulated/floor/tiled/white,/area/medical/resleeving) +"bMx" = (/obj/effect/floor_decal/corner/paleblue,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled/white,/area/medical/resleeving) "bMy" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/patient_a) "bMz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/patient_a) -"bMA" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Patient Room A"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/patient_a) -"bMB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/medical/patient_wing) +"bMA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled/white,/area/medical/resleeving) +"bMB" = (/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/structure/table/standard,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/book/manual/resleeving,/turf/simulated/floor/tiled/white,/area/medical/resleeving) "bMC" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/patient_wing) "bMD" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/tiled/white,/area/medical/patient_wing) "bME" = (/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/patient_wing) @@ -4801,10 +4801,10 @@ "bOq" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/floor/tiled/steel,/area/medical/medbay_emt_bay) "bOr" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled/steel,/area/medical/medbay_emt_bay) "bOs" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/structure/closet/fireaxecabinet{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled/steel,/area/medical/medbay_emt_bay) -"bOt" = (/obj/structure/bed/psych,/turf/simulated/floor/carpet/blue,/area/medical/psych) +"bOt" = (/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera/network/medbay{c_tag = "MED - Resleeving"; dir = 1},/turf/simulated/floor/tiled/white,/area/medical/resleeving) "bOu" = (/turf/simulated/floor/carpet/blue,/area/medical/psych) -"bOv" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/simulated/floor/carpet/blue,/area/medical/psych) -"bOw" = (/obj/structure/table/woodentable,/obj/machinery/computer/med_data/laptop,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/turf/simulated/floor/carpet/blue,/area/medical/psych) +"bOv" = (/obj/effect/floor_decal/corner/paleblue/full{dir = 4},/obj/structure/table/standard,/obj/item/weapon/storage/box/backup_kit,/obj/item/weapon/storage/box/backup_kit,/turf/simulated/floor/tiled/white,/area/medical/resleeving) +"bOw" = (/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/structure/table/standard,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/resleeving) "bOx" = (/obj/effect/floor_decal/corner/pink/full,/obj/machinery/computer/med_data/laptop,/obj/structure/table/glass,/obj/machinery/light,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/turf/simulated/floor/tiled/white,/area/medical/patient_a) "bOy" = (/obj/effect/floor_decal/corner/pink{dir = 10},/obj/structure/table/glass,/obj/item/weapon/paper_bin,/obj/item/weapon/clipboard,/obj/item/weapon/pen,/turf/simulated/floor/tiled/white,/area/medical/patient_a) "bOz" = (/obj/effect/floor_decal/corner/pink{dir = 10},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor/tiled/white,/area/medical/patient_a) @@ -4908,9 +4908,9 @@ "bQt" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay) "bQu" = (/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay) "bQv" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/table/rack,/obj/machinery/door/window/westright{name = "EVA Suit Storage"; req_access = list(5)},/obj/item/device/suit_cooling_unit,/turf/simulated/floor/tiled/dark,/area/medical/medbay_emt_bay) -"bQw" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; dir = 8; frequency = 1487; icon_state = "intercom"; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = -21; pixel_y = 0},/turf/simulated/floor/carpet/blue,/area/medical/psych) +"bQw" = (/obj/structure/grille,/obj/structure/window/reinforced/polarized{dir = 4; id = "resleeve_tint"},/obj/structure/window/reinforced/polarized{id = "resleeve_tint"},/obj/structure/window/reinforced/polarized{dir = 8; id = "resleeve_tint"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/medical/resleeving) "bQx" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet/blue,/area/medical/psych) -"bQy" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/machinery/light_switch{pixel_x = -25; pixel_y = 8},/obj/machinery/button/windowtint{id = "psyco_tint"; pixel_x = -25},/obj/machinery/button/remote/airlock{desc = "A remote control-switch for the office door."; id = "mentaldoor"; name = "office door control"; pixel_x = -34; pixel_y = 7},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/effect/landmark/start{name = "Psychiatrist"},/turf/simulated/floor/carpet/blue,/area/medical/psych) +"bQy" = (/obj/effect/landmark/start{name = "Geneticist"},/turf/simulated/floor/tiled/white,/area/medical/resleeving) "bQz" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/effect/floor_decal/corner/pink{dir = 9},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/patient_wing) "bQA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/effect/floor_decal/corner/pink{dir = 6},/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/floor/tiled/white,/area/medical/patient_wing) "bQB" = (/turf/simulated/wall,/area/medical/patient_b) @@ -4943,10 +4943,10 @@ "bRc" = (/obj/structure/table/standard,/obj/item/weapon/surgical/circular_saw,/obj/item/weapon/surgical/scalpel{pixel_y = 12},/obj/item/weapon/surgical/hemostat,/obj/item/weapon/surgical/retractor,/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/tiled/white,/area/assembly/robotics) "bRd" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/white,/area/assembly/robotics) "bRe" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/tiled/white,/area/assembly/robotics) -"bRf" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/obj/structure/table/standard,/obj/item/stack/cable_coil,/obj/item/weapon/weldingtool/hugetank,/turf/simulated/floor/tiled/white,/area/assembly/robotics) +"bRf" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor/tiled/white,/area/assembly/robotics) "bRg" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled/white,/area/assembly/robotics) "bRh" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 5},/turf/simulated/floor/tiled/white,/area/assembly/robotics) -"bRi" = (/obj/structure/table/standard,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/camera/network/research{c_tag = "SCI - Robotics Starboard"; dir = 8},/turf/simulated/floor/tiled,/area/assembly/robotics) +"bRi" = (/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; dir = 8; frequency = 1487; icon_state = "intercom"; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = -21; pixel_y = 0},/obj/effect/floor_decal/corner/paleblue{dir = 9},/obj/structure/bed/chair/office/light{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/resleeving) "bRj" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/primary/central_four) "bRk" = (/obj/machinery/door/airlock/command{name = "Head of Personnel"; req_access = list(57)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/wood,/area/crew_quarters/heads/hop) "bRl" = (/obj/effect/floor_decal/corner/blue{dir = 9},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/bridge_hallway) @@ -4981,15 +4981,15 @@ "bRO" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay) "bRP" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay) "bRQ" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/machinery/door/window/westleft{name = "EVA Suit Storage"; req_access = list(5)},/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/void/medical,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/void/medical,/obj/item/weapon/tank/oxygen,/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/floor/tiled/dark,/area/medical/medbay_emt_bay) -"bRR" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/item/toy/therapy_blue,/turf/simulated/floor/carpet/blue,/area/medical/psych) -"bRS" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/carpet/blue,/area/medical/psych) -"bRT" = (/obj/machinery/camera/network/medbay{c_tag = "MED - Mental Health"; dir = 1},/obj/machinery/light,/turf/simulated/floor/carpet/blue,/area/medical/psych) -"bRU" = (/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/carpet/blue,/area/medical/psych) +"bRR" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/effect/floor_decal/corner/paleblue{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/white,/area/medical/resleeving) +"bRS" = (/obj/structure/table/standard,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/tiled,/area/assembly/robotics) +"bRT" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/machinery/clonepod/transhuman,/turf/simulated/floor/tiled/white,/area/medical/resleeving) +"bRU" = (/obj/effect/floor_decal/corner/paleblue/full,/obj/machinery/computer/transhuman/resleeving,/turf/simulated/floor/tiled/white,/area/medical/resleeving) "bRV" = (/turf/simulated/wall,/area/medical/patient_c) "bRW" = (/obj/effect/floor_decal/corner/pink/full{dir = 8},/obj/machinery/iv_drip,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = -25; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/patient_c) "bRX" = (/obj/effect/floor_decal/corner/pink{dir = 5},/obj/structure/bed/padded,/obj/item/weapon/bedsheet/medical,/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/tiled/white,/area/medical/patient_c) -"bRY" = (/obj/effect/floor_decal/corner/pink{dir = 5},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = 36},/obj/machinery/button/windowtint{id = "pr3_window_tint"; pixel_y = 26},/turf/simulated/floor/tiled/white,/area/medical/patient_c) -"bRZ" = (/obj/structure/window/reinforced/polarized{dir = 8; id = "pr3_window_tint"},/obj/structure/window/reinforced/polarized{dir = 4; id = "pr3_window_tint"},/obj/structure/window/reinforced/polarized{dir = 2; id = "pr3_window_tint"},/obj/structure/window/reinforced/polarized{dir = 1; id = "pr3_window_tint"},/obj/structure/grille,/obj/machinery/door/firedoor,/turf/simulated/floor,/area/medical/patient_c) +"bRY" = (/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = 25; pixel_y = 0},/obj/effect/floor_decal/corner/paleblue/full{dir = 4},/obj/structure/closet{name = "spare clothes"},/obj/item/clothing/under/color/black,/obj/item/clothing/under/color/black,/obj/item/clothing/under/color/grey,/obj/item/clothing/under/color/grey,/obj/item/clothing/under/color/white,/obj/item/clothing/under/color/white,/obj/item/clothing/under/color/blue,/obj/item/clothing/under/color/green,/obj/item/clothing/under/color/lightpurple,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/resleeving) +"bRZ" = (/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/machinery/transhuman/resleever,/turf/simulated/floor/tiled/white,/area/medical/resleeving) "bSa" = (/obj/effect/floor_decal/corner/pink{dir = 1},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/medical/patient_wing) "bSb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/pink{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/patient_wing) "bSc" = (/obj/structure/window/reinforced/polarized{dir = 1; id = "pr2_window_tint"},/obj/structure/grille,/obj/machinery/door/firedoor,/obj/structure/window/reinforced/polarized{dir = 2; id = "pr2_window_tint"},/obj/structure/window/reinforced/polarized{dir = 4; id = "pr2_window_tint"},/obj/structure/window/reinforced/polarized{dir = 8; id = "pr2_window_tint"},/turf/simulated/floor,/area/medical/patient_b) @@ -5029,8 +5029,8 @@ "bSK" = (/obj/structure/table/standard,/obj/machinery/light,/obj/structure/closet/secure_closet/medical_wall{name = "anesthetic closet"; pixel_x = -32; req_access = list(29)},/obj/item/weapon/tank/anesthetic,/obj/item/weapon/tank/anesthetic,/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/obj/item/clothing/mask/breath/medical,/obj/item/clothing/mask/breath/medical,/obj/item/weapon/storage/box/gloves,/turf/simulated/floor/tiled/white,/area/assembly/robotics) "bSL" = (/obj/machinery/optable{name = "Robotics Operating Table"},/turf/simulated/floor/tiled/white,/area/assembly/robotics) "bSM" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/computer/operating{name = "Robotics Operating Computer"},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/tiled/white,/area/assembly/robotics) -"bSN" = (/obj/structure/table/standard,/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/item/weapon/screwdriver,/obj/item/weapon/crowbar,/obj/item/weapon/surgical/circular_saw,/obj/item/weapon/surgical/hemostat,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled/white,/area/assembly/robotics) -"bSO" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/light,/obj/machinery/computer/operating{name = "Robotics Operating Computer"},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/tiled/white,/area/assembly/robotics) +"bSN" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/structure/window/reinforced{dir = 8},/obj/machinery/computer/transhuman/resleeving,/obj/item/weapon/book/manual/resleeving,/obj/item/weapon/storage/box/backup_kit,/turf/simulated/floor/tiled/white,/area/assembly/robotics) +"bSO" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/light,/obj/machinery/transhuman/resleever,/turf/simulated/floor/tiled/white,/area/assembly/robotics) "bSP" = (/obj/structure/table/standard,/obj/machinery/newscaster{pixel_x = 28; pixel_y = 1},/obj/machinery/cell_charger,/turf/simulated/floor/tiled,/area/assembly/robotics) "bSQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/hallway/primary/central_four) "bSR" = (/turf/simulated/wall/r_wall,/area/bridge/meeting_room) @@ -5074,7 +5074,7 @@ "bTD" = (/obj/effect/floor_decal/corner/pink{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay) "bTE" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay) "bTF" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/westright{name = "EVA Suit Storage"; req_access = newlist(); req_one_access = list(5,18)},/obj/item/weapon/rig/medical/equipped,/turf/simulated/floor/tiled/dark,/area/medical/medbay_emt_bay) -"bTG" = (/obj/effect/floor_decal/corner/pink{dir = 9},/obj/structure/bed/chair/office/light,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/camera/network/medbay{c_tag = "MED - Patient Room C"; dir = 4},/turf/simulated/floor/tiled/white,/area/medical/patient_c) +"bTG" = (/obj/effect/floor_decal/corner/pink{dir = 5},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = 36},/obj/machinery/button/windowtint{id = "pr3_window_tint"; pixel_y = 26},/turf/simulated/floor/tiled/white,/area/medical/patient_a) "bTH" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/patient_c) "bTI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/patient_c) "bTJ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Patient Room C"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/patient_c) @@ -5173,7 +5173,7 @@ "bVy" = (/obj/structure/closet/crate{icon_state = "crateopen"; name = "Grenade Crate"; opened = 1},/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/turf/simulated/floor/tiled/dark,/area/medical/biostorage) "bVz" = (/obj/structure/table/rack,/obj/item/clothing/suit/radiation,/obj/item/clothing/head/radiation,/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; dir = 2; frequency = 1487; icon_state = "intercom"; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = -21},/obj/item/weapon/storage/box/lights/mixed,/obj/item/device/defib_kit,/obj/item/device/defib_kit,/turf/simulated/floor/tiled/dark,/area/medical/biostorage) "bVA" = (/obj/item/weapon/cane,/obj/item/weapon/cane{pixel_x = -3; pixel_y = 2},/obj/item/weapon/cane{pixel_x = -6; pixel_y = 4},/obj/structure/table/steel,/obj/item/weapon/storage/box/gloves{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/rxglasses,/turf/simulated/floor/tiled/dark,/area/medical/biostorage) -"bVB" = (/obj/item/weapon/storage/box/cdeathalarm_kit,/obj/item/bodybag/cryobag{pixel_x = -3},/obj/item/bodybag/cryobag{pixel_x = -3},/obj/structure/table/steel,/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/floor/tiled/dark,/area/medical/biostorage) +"bVB" = (/obj/structure/window/reinforced/polarized{dir = 8; id = "pr3_window_tint"},/obj/structure/window/reinforced/polarized{dir = 4; id = "pr3_window_tint"},/obj/structure/window/reinforced/polarized{dir = 2; id = "pr3_window_tint"},/obj/structure/window/reinforced/polarized{dir = 1; id = "pr3_window_tint"},/obj/structure/grille,/obj/machinery/door/firedoor,/turf/simulated/floor,/area/medical/patient_a) "bVC" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/maintenance/medbay_aft) "bVD" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/meter,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/medbay_aft) "bVE" = (/obj/machinery/door/airlock/engineering{name = "Medbay Substation"; req_one_access = list(11,24,5)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/turf/simulated/floor,/area/maintenance/substation/medical) @@ -5294,11 +5294,11 @@ "bXP" = (/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"},/turf/simulated/wall,/area/hallway/secondary/medical_emergency_hallway) "bXQ" = (/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "medbayquar"; name = "Medbay Emergency Lockdown Shutters"; opacity = 0},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/medical_emergency_hallway) "bXR" = (/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "medbayquar"; name = "Medbay Emergency Lockdown Shutters"; opacity = 0},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/medical_emergency_hallway) -"bXS" = (/turf/simulated/wall,/area/medical/patient_e) -"bXT" = (/obj/effect/floor_decal/corner/pink/full{dir = 8},/obj/machinery/iv_drip,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = -25; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/patient_e) -"bXU" = (/obj/effect/floor_decal/corner/pink{dir = 5},/obj/structure/bed/padded,/obj/item/weapon/bedsheet/medical,/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/tiled/white,/area/medical/patient_e) -"bXV" = (/obj/effect/floor_decal/corner/pink{dir = 5},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = 36},/obj/machinery/button/windowtint{id = "pr5_window_tint"; pixel_y = 26},/turf/simulated/floor/tiled/white,/area/medical/patient_e) -"bXW" = (/obj/structure/window/reinforced/polarized{dir = 1; id = "pr5_window_tint"},/obj/structure/grille,/obj/machinery/door/firedoor,/obj/structure/window/reinforced/polarized{dir = 2; id = "pr5_window_tint"},/obj/structure/window/reinforced/polarized{dir = 4; id = "pr5_window_tint"},/obj/structure/window/reinforced/polarized{dir = 8; id = "pr5_window_tint"},/turf/simulated/floor,/area/medical/patient_e) +"bXS" = (/obj/effect/floor_decal/corner/pink{dir = 9},/obj/structure/bed/chair/office/light,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/camera/network/medbay{c_tag = "MED - Patient Room C"; dir = 4},/turf/simulated/floor/tiled/white,/area/medical/patient_a) +"bXT" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Patient Room A"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/patient_a) +"bXU" = (/obj/item/weapon/storage/box/cdeathalarm_kit,/obj/item/bodybag/cryobag{pixel_x = -3},/obj/item/bodybag/cryobag{pixel_x = -3},/obj/structure/table/steel,/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/item/weapon/storage/box/backup_kit,/turf/simulated/floor/tiled/dark,/area/medical/biostorage) +"bXV" = (/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/circuitboard/autolathe,/obj/machinery/light/small{dir = 1},/obj/item/weapon/circuitboard/partslathe,/turf/simulated/floor,/area/storage/tech) +"bXW" = (/obj/effect/floor_decal/corner/pink{dir = 5},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = 36},/obj/machinery/button/windowtint{id = "pr5_window_tint"; pixel_y = 26},/turf/simulated/floor/tiled/white,/area/medical/patient_c) "bXX" = (/obj/structure/window/reinforced/polarized{dir = 1; id = "pr4_window_tint"},/obj/structure/grille,/obj/machinery/door/firedoor,/obj/structure/window/reinforced/polarized{dir = 2; id = "pr4_window_tint"},/obj/structure/window/reinforced/polarized{dir = 4; id = "pr4_window_tint"},/obj/structure/window/reinforced/polarized{dir = 8; id = "pr4_window_tint"},/turf/simulated/floor,/area/medical/patient_d) "bXY" = (/obj/machinery/button/windowtint{id = "pr4_window_tint"; pixel_y = 26},/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = 36},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/effect/floor_decal/corner/pink{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/patient_d) "bXZ" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/medical,/obj/effect/floor_decal/corner/pink{dir = 5},/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/tiled/white,/area/medical/patient_d) @@ -5372,10 +5372,9 @@ "bZp" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green,/obj/effect/floor_decal/corner/pink{dir = 6},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/medical_emergency_hallway) "bZq" = (/turf/simulated/wall,/area/hallway/secondary/medical_emergency_hallway) "bZr" = (/obj/random/obstruction,/turf/simulated/floor,/area/maintenance/medbay_aft) -"bZs" = (/obj/effect/floor_decal/corner/pink{dir = 9},/obj/structure/bed/chair/office/light,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/camera/network/medbay{c_tag = "MED - Patient Room E"; dir = 4},/turf/simulated/floor/tiled/white,/area/medical/patient_e) -"bZt" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/patient_e) -"bZu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/patient_e) -"bZv" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Patient Room E"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/patient_e) +"bZs" = (/obj/structure/window/reinforced/polarized{dir = 1; id = "pr5_window_tint"},/obj/structure/grille,/obj/machinery/door/firedoor,/obj/structure/window/reinforced/polarized{dir = 2; id = "pr5_window_tint"},/obj/structure/window/reinforced/polarized{dir = 4; id = "pr5_window_tint"},/obj/structure/window/reinforced/polarized{dir = 8; id = "pr5_window_tint"},/turf/simulated/floor,/area/medical/patient_c) +"bZt" = (/obj/effect/floor_decal/corner/pink{dir = 9},/obj/structure/bed/chair/office/light,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/camera/network/medbay{c_tag = "MED - Patient Room E"; dir = 4},/turf/simulated/floor/tiled/white,/area/medical/patient_c) +"bZu" = (/obj/machinery/transhuman/synthprinter,/turf/simulated/floor/tiled/white,/area/assembly/robotics) "bZw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled/white,/area/medical/patient_wing) "bZx" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/patient_wing) "bZy" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Patient Room D"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/patient_d) @@ -5453,9 +5452,6 @@ "caS" = (/obj/effect/decal/cleanable/cobweb2{tag = "icon-cobweb1"; icon_state = "cobweb1"},/obj/effect/decal/cleanable/cobweb2{icon_state = "spiderling"; name = "dead spider"; tag = "icon-spiderling"},/turf/simulated/floor,/area/maintenance/medbay_aft) "caT" = (/turf/simulated/floor,/area/maintenance/medbay_aft) "caU" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor,/area/maintenance/medbay_aft) -"caV" = (/obj/effect/floor_decal/corner/pink/full,/obj/machinery/computer/med_data/laptop,/obj/structure/table/glass,/obj/machinery/light,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/turf/simulated/floor/tiled/white,/area/medical/patient_e) -"caW" = (/obj/effect/floor_decal/corner/pink{dir = 10},/obj/structure/table/glass,/obj/item/weapon/paper_bin,/obj/item/weapon/clipboard,/obj/item/weapon/pen,/turf/simulated/floor/tiled/white,/area/medical/patient_e) -"caX" = (/obj/effect/floor_decal/corner/pink{dir = 10},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor/tiled/white,/area/medical/patient_e) "caY" = (/turf/simulated/floor/tiled/white,/area/medical/patient_wing) "caZ" = (/obj/effect/floor_decal/corner/pink,/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/obj/machinery/light,/obj/machinery/camera/network/medbay{c_tag = "MED - Patient Hallway Aft"; dir = 1},/turf/simulated/floor/tiled/white,/area/medical/patient_wing) "cba" = (/obj/effect/floor_decal/corner/pink{dir = 10},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor/tiled/white,/area/medical/patient_d) @@ -5909,7 +5905,6 @@ "cjG" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/obj/item/clothing/gloves/yellow,/obj/item/device/t_scanner,/obj/item/clothing/glasses/meson,/obj/item/device/multitool,/turf/simulated/floor/plating,/area/storage/tech) "cjH" = (/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flash,/obj/item/device/flash,/obj/structure/table/steel,/obj/machinery/camera/network/engineering{c_tag = "ENG - Technical Storage"; dir = 2},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/plating,/area/storage/tech) "cjI" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/device/analyzer/plant_analyzer,/obj/item/device/healthanalyzer,/obj/item/device/analyzer,/obj/item/device/analyzer,/turf/simulated/floor/plating,/area/storage/tech) -"cjJ" = (/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/circuitboard/autolathe,/obj/machinery/light/small{dir = 1},/turf/simulated/floor,/area/storage/tech) "cjK" = (/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/primary/central_four) "cjL" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored/upper_level) "cjM" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/primary/central_three) @@ -10104,40 +10099,40 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaX aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabijbikabxabxbilbikbijaafaafaafaafaafaafaUObinaXEbiobrDdIGdICbtbdlbdIBdIAdIHdIDdIJdIIbhcbhdbhebhfbhgbeFbhhbhibhjbhkbeFaafaafaafaaiaaiaaiaaiaaiaaiaWAbhlbhmbhnbeIbbibhobhpbhqbdJbeLbblaafaafaafaafbhrbhrbhrbhrbhsbhrbhrbhrbhraafaafaafaVebhtaVOaVeaaiaZsbeRbeSaYjaYjaYjaYjbeTbhuaXcaXcaXcbhvbeSaYjaYjaYjbhwaYjaYjbhxaVjbhyaUubbyaPRbhzaOKaafbckbhAbhBbhCbckbcsbcsbcsbcsbhDbcsbhEbhFbhGbepbhHbhIbhJbhKbepbhLbhMbhNbhObeqbhPbhQbhRbDWbhTbhUbhVbhWbhXbhYbhZbiabewaWdbibaVnaafaafbdzbdzbdzbdzbicbidbicbdzbicbifbicbdzbdzbdzbdzbigbihbiibdzbdzaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabikbjGbjHbjIbjHbjGbikaaiaafaafbikbikbikbDVbjJaXEbgSbrDdILdIKdINdIMdIPdIOdIQbrDdITbaXbizbiAbiBbiCbiDbeFbiEbiFbiGbiGbeFbiHbiHbiHbiHaaiaaiaaiaaiaaiaXOaXObiIbiJbiKbbkbblbiLbhqbdJbiMbblaafaafaafbhrbhrbhrbhrbiNbiObiNbhrbhrbhrbhraafaafaVeaVeaVOaVeaaiaVPbiPbcdbceaYjbiQaYjaYjaZzbhubiRbhvaYgaYjaYjbiQaYjbiSbiTbiUaVPaVgaOKaVkbiVaVmaOKaOKaafbckbiWbiXbiYbckbiZbjabjbbjcbjdbjebjfbfhbjgbepbepbjhbjibjjbepbjkbjlbjmbjnbeqbjobfsbfrbjpbfrbfrbjqbewbjrbjsbewbjtbewbjuaXCaVnaafbdzbdzbfybjvbicbjwbjxbjybjzbjAbjxbjybjBbdzbjCbjDbjAbjEbjybjFbdzbdzaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabllblmblnblobloblmblpblqbikbikbikblrblsbikbikbltbikbrDbrDbrDbrDbrDbrDbrDbrDbrDdIUbcEbjRbaZbjSbaZbjSbeFbiEbjTbjUbjVbiGbjWbjXbjYbiHbjZbkabkbbiHaaiaaiaVFaVGaZhbeIbbkbkcbkdbkebkfbblbblaafaafaafbhrbhrbkgbkhbkibkjbkkbklbkmbhrbhraafaafaafaVeaVOaVeaaiaVPbknbkobcXaYjbdcbddbkpaYjaYhaYhaYhaYjbkpbcfbcYaYjaYjbkqbkraVPaaiaVWaUuaUvaPRaOKaafaafbckbksbktbkubkvbkwbkxbkybkybkzbkAbkBbkCbkDbkEbepbkFbkGbkHbepbkIbkJbkKbkLbeqbkMbkNbkObkPbfrbkQbkRbewbkSbkTbewbkUbewbkVaXCaVnaafbdzbkWbkXbkYbkZblablbblablcblabldbfAblebdzblfblgblhblibfAbljblkbdzaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabxbjIbmBbmCbmCbjIbmDbmEbmFbmGbmHbmIbmJbmKbmLbmMbmNbmObmPbmQbmRbmSbmTbmSbmUdIEdIVbmXdIFbaZblvblwblxbiGbiGblyblzblAbiGblBblCblCblDblEblFblGbiHaaiaaiaWEaVGaZhblHbbkbkdbkdblIblJbblaafaafaafbhrbhrblKblLblMblNblOblNblPblQblRbhrbhraafaafaVeaVOaVeaaibawbbpbdPbdQaYjaYjbdcbddaYjaYjaYjaYjaYjbbrbcgaYjaYjaYjbciblSbawaaiaXeaYsblTblUaOKaafaafbckbecblVbeeblWblXblYblZbmabmbbmcbembfhbmdbmebepbmfbmgbmfbepbmhbmibmjbmkbeqbdwbmlbmmbmnbmlbmmbmobmobmobmobmobmobmobmoaXCaVnaafbdzbmpbmqbmrbicbmsbjxbmtbmubmvbmwbjEbjybicbjAbjEbmxbmybmsbmzbmAbdzaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXNabxblmbokbmCbmCbolbombonboobopboqborbosbotboubovbowboxboybozboAboBboCboDboEboFdIWbdDbfGbmZbnabnabnabnbbiGbiGbncbiGbiGbndbnebnfbnfbnfbngbnhbiHaaiaaiaWEaVGaZhbcLbbkbblbblbblbblbblaafaafaafbhrbhrbnibnjbnkbnlbnlbnlbnkbnjbnmbhrbhraafaafaVeaVOaVeaaibbobbpbdWbnnaYjbbqaYjbdcbbsaYjaYjaYjbbtbcgaYjbbqaYjbiTbnoblSbboaaiaYraUuaUvaPRbnpaaiaafbckbnqbnrbeebnsbntbnubnvbnvbnwbnxbnybnzbnAbnAbnBbnCbnDbnCbnEbnCbnFbnGbnHbnIbnJbnKbnHbnLbnMbnNbmobnObnPbnQbnRbnSbnTbmoaXCaVnaafbdzbnUbnVbnWbdzbnXbnYbnZbdzboabobbocbocbodboebocbofbogbohbmzboibdzaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaaaaaaaayaazaayaayaayaayaayaayaayaazaayaayaayaazaayaayaayaayaaaaaaaayaayaayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabojaaeaaiabxbjIbpYbmCbmCbjIbpZbqabqbbqcbqdbqebqfbikbikbltbikbfEbfEbfEbfEbfEbfEbfEbfEbfEdITbcEbfGboHboIboJbnaboKbjSboLboMboNboOboPboQboRboSboTboUboVbiHaaiaaiaWEboWboXboYaVFaaiaaiaaiaaiaaiaaiaafaafbhrboZbpabnjbnkbpbbpcbpbbnkbnjbpdbpebhraafaafaVeaVOaVeaaiaZsbpfbpgbdWbnnaYjaYjaYjaYjaYjaYjaYjaYjaYjaYjaYjbiTbdSbphbpiaZsaaiaOKbpjaUvbpkbplaaiaaibckbdhbiXbpmbckbpnbpobppbpqbprbjebpsbptbpubpvbpwbpxbpybpxbpxbpxbpzbpAbpBbpCbpDbpEbpDbpFbpDbpDbpGbpHbpIbpJbpKbpLbpLbmoaXCaVnaafbdzbmpbpMbmrbicbjAbpNbpObpPbpQbjEbjEbpRbicbpSbjEbpTbpUbjAbmzbpVbdzaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaaaaaaaayaaaaaeaaaaaaaaaaaaaaeaaeaaaaaaaaeaaeaaaaaeaaeaaeaaaaaeaaeaaeaaaaayaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpWaaiaaibpXblmblnbrubrvblmbrwblqbikbikbikbrxblqbikbiybvSbjQbfEbgTbgUbgVbgWbgXbgYbgZbfEdIXbcEbqhbaZbqibqjbqkbqkbqlbqmbqnbqoboObqpboQbqqbqrbqsboUbqtbquaaiaaiaWEaVGaZhbeIaWEaaiaaiaaiaaiaaiaaiaafaafbhrbhrbnibnjbqvbnlbqwbnlbnkbnjbnmbhrbhraafaafaVeaVOaVeaaiaVPbawaYebqxbdWbnnbqybcXbqzaYjaYjaYjbqybcXbqzbiTbdSbphaYebawaVPaaiaVWaUubbyaPRbplaaiaaibckbckbqAbckbckbjebjebjebqBbqBbqBbqBbqCbqDbqBbqBbqEbqFbqGbqHbqHbqIbqJbqFbqKbqLbqMbqNbqObqPbqQbmobqRbqSbqTbqUbqTbqVbmoaXCaVnaafbdzbqWbqXbkYbqYblabqZblabrabjEbrbbjEbrcbdzbrdbfCbrebrfbrgbrhbribdzaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaaaaaaaayaaabrjbrkbrlaaabrjbrkbrlaaabrjbrkbrlaaabrjbrkbrlaaabrjbrkbrlaaaaayaaeaaeaaaaaaaaaaaaaaaaaabrmbrnbrobrpaaaaaabrqbrrbrsbrqbrqbrtbjGbjHbjIbjHbjGbikaaiaaiaaiaaiaaiaaibrmbsZbrzbtabfEbipbiqbirbisbitbiubivbiwdIZdIYdJabmZbrEbrFbrGbnabrHbbLbrIbrJbrKbrLbrMbrNbrNbrNbrObrPbrQaaiaaiaWEaVGaZhbeIaWEaaiaaiaaiaaiaaiaafaafaafbhrbhrbrRbrSbrTbnlbnlbnlbrUbrVbrWbhrbhraafaafaVeaVOaVeaaiaaiaYqaXdaYebqxbdWbrXbrYbrZbdabdabdabrXbrYbrZbdSbphaYeaWPaYdaaiaaiaXebaAbaBbsabplaaiaaibsbbscbsdbsebsfbsgbshbsibqBbsjbskbslbsmbsnbsobspbsqbsrbssbstbsubsvbqJbswbsxbsybszbsAbsBbsybsAbmobsCbsDbsEbsFbsGbsHbmoaXCaVnaafbdzbdzbfybsIbicbmsbsJbjEbjxbjEbjEbrhbsKbdzbsLbsMbsNbsObpRbsPbdzbdzaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXDaXDaXDaXDaXDaXDaXDaXDaXDaaaaaaaaaaaaaayaaebrjbsQbrlaaebrjbsQbrlaaebrjbsQbrlaaebrjbsQbrlaaebrjbsQbrlaaeaazaaaaaeaaeaaaaaaaaaaaaaaabrmbrmbsRbsSbrmbsTbsUbsVbsWbsXbsYbikbikabxabxbilbikbikcxVcxVaaiaaiaaiaaibrmbrmbrzbuJbfEbjKbjLbgVbjMbjNbjObjPbfEdJbbtcbtdboHbtebtfbtgbthbmZbtibtjbtkbtlbtmbtnbtobtpbtqbtrbtsbiHaaiaaiaWAaVGbttbeIaWAaaiaaiaaiaafaafaafaafaafaafbhrbhrbtubrSbtvbtwbtxbtybtzbhrbhraafaafaafaVeaVOaVeaaiaaiaaiaYqaVSbaxbdUbdUbtAbtBbtCbtDbtCbtEbtFbdUbdUbtGaVQaYdaaiaaiaaiaYraUubtHaPRbtIaaiaaibtJbtKbsdbtLbtMbtNbtObtPbqBbtQbtRbtSbtTbtTbtUbtVbtWbtXbtYbtZbtZbuabubbucbudbuebufbugbuhbuibujbmobukbulbumbunbuobupbmoaXCaVnaafaafbdzbdzbdzbdzbuqburbusbjxbutbuubuvbdzbdzbiebdzbuxbuybuzbdzbdzaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXDaXDaXDaXDaXDaXDaXDaaaaaaaaaaaaaaaaayaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaaaaeaaaaaaaaeaaeaaaaaaaaaaaabrmbuAbuBbuCbrmbuDbuEbuFbuGbuHbuIdIScxVaaiaaiaaiaaicxVcxVaaiaaiaaiaaiaaiaaibrmbrzdIRbfEbfEbfEbfEbfEbfEbfEbfEbfEdJcbuMbuNbaZbuObuPbuQbuRboHbuSbrIbqhbrKbuTbuUbuVbiHbuWbuXbuWbiHaaibbkbbkbiIbiJbiKaXOaaiaaiaafaafaafaafaafaafaafbhrbhrbhrbuYbuZbvabvbbvcbhrbhrbhraafaafaVeaVeaVOaVeaVeaaiaaiaaiaVPaVQaVRaVSaVPaVPaVQaVRaVSaVPaVPaVQaVRaVSaVPaaiaaiaaiaaiaOKaVkbiVaVmaOKaOKaaibvdbvebvfbtNbvgbvhbvibvjbqBbvkbvlbvmbvnbtTbtTbvobnHbvpbvqbqLbqLbvrbqJbvsbvtbvubvvbvwbvxbvybvzbmobmobmobmobvAbmobmobmoaXCaVnaafaafaafaafaafbdzbvBbvCbdzbvDbdzbvBbvEbdzbvFbvGbdzbvHbvIbdzbdzaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaaaaeaaaaaaaaaaaeaaeaaaaaaaaabrmbvJbvKbvLbrmbvMbvNbvObvPbvQbvRbrqaafaafaafaaiaaiaaiaaiaaiaaiaaiaaiaafaafbrmbvSbuKbuKbvTbvUbvVbvWbvXbvYbvZbuKdJdbwbbwcbaZbwdbwebwfbwgbaZbwhbrIbwibwjbwjbwjbwjbwjbwkbwlbwmbwjbcJbbkbwnaVGaZhbwoaXOaVeaafaafaafaafaafaafaafaafaafbhrbhrbhrbwpbhrbhrbhrbhrbhraafaafaVeaVeaVNaVOaVNaVeaVeaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaVeaOKaUubwqbgibwraOKbwsbwtbwubwvbwwbwxbwybwzbwAbwBbwCbwDbwEbwFbtTbwGbqBcsVbqFbwIbwJbwKbwLbwMbwNbwObwPbwQbwRbwSbwTbwUbwVbwWbwXbwYbwZbxabxbbwVaXCaVnaafaafaafaafaafbdzbxcbxdbxebxfbxgbxhbxibxjbxkbxlbdzbxmbxnbxobdzaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaayaayaaeaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaaaaeaaaaaaaaaaaaaaebxpbxqbxqbxqbxqbxrbrmbrmbrqbxsbxtbxubxvbxwbrqaafaafaafaafaaiaaiaaiaaiaaiaaiaafaafaafbrmbvSbuKbxxbxybxzbxAbxBbxCbxDbxEbxFdJebxHbxIbxJbxKbxLbxMbxNbxObxPbxQbxRbxSbxTbxUbxVbxSbxWbxXbxYbxZbyabybbbiaWBbeHbeIbycaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaafaafbydbyebydbydaVeaVeaVeaVeaVeaVebyfbygbyhbyiaVNaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVebyjbykbylbymaPQbynbyobypbtNbyqbtNbyrbvhbysbytbspbyubyvbywbyxbyybyzbspbyAbyBbnMbyCbyCbyDbqJbyEbudbyFbyGbyHbvybyIbyJbwVbyKbyLbyMbwZbwZbyNbwVbyOaVnaafaafaafaafaafbdzbdzbyPbyQbyRbySbyTbyUbyVbyWbyXbyYbyZbzabzbbdzaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaaaaaeaaaaaaaaebzcaaeaaaaaebzcaaeaaaaaebzcaaeaaaaaebzcaaeaaaaaebzcaaeaaaaaeaaaaaabzdbzebzebzfbzgbzhbzibzjbzkbzlbzmbrqbznbzobzpbzqbzrbrqaafaafaafaafaafaaiaaiaaiaaiaafaafaafaafbrmbvSbuKbzsbxzbztbzubzvbzwbzxbzwbzybzzbzAbzBbzCbhebzDbhebzEbhebhebzFbzGbzHbzIbzJbzKbzLbzMbzNbzObzPbzQbzRbzSbzTbzUbzVbzWbzXbzYbzZbzZbzZbzZbAabzZbAbaVeaVeaVeaVebAcaVeaVeaVebAdbAebAebAebAebAebAfbAgbAhbAibAibAibAibAibAibAibAjbAibAibAibAkbAlbAlbAlbAlbAlbAlbAlbAlbAmbAlbAnbAobApbAqbAraYvbAsbAtbAubAvbAwbtLbAxbtNbAybAzbtVbAAbABbACbADbAEbAFbtVbAGbAHbAIbAJbAJbAKbALbAMbvtbANbAObAPbAQbARbwVbwVbASbATbAUbAVbwZbyNbwVbyOaVnaafaafaafaafaafaafbdzbdzbdzbAWbAXbdzbdzbdzbdzbdzbdzbAYbAZbdzbdzaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaaebBabBbbBbbBbbBcbBbbBbbBbbBcbBbbBbbBbbBcbBbbBbbBbbBcbBbbBbbBbbBcbBbbBbbBbbBbbBdbBebBfbBgbBhbBibBjbBkbBlbBmbBnbBobrqbrqbBpbrqbrqbBqbrqaafaafaafaafaafaafaafaaiaaiaafaafaafaafbrmbvSbuKbBrbBsbBtbBubBvbBwbBxbBybuKbBzbBAbBBbBCbBDbBEbBFbBGbBHbBIbBJbBKbwjbBLbBMbBNbBObBPbBQbxYbxZbyabybbbibbibBRbBSbBTaVebBUbBVbBWbBXbBYbBZbCabCbbCcbCdbCebCfbCgbzZbzZbzZbChaVeaVeaVeaVeaVNbCibCjbCkbClbClbClbClbClbClbClbCmbClbClbClbCnbCobCobCobCobCobCobCobFpbfYbhtaVebCqaUubbybCraQIbCsbCtbCubCvbCwbCxbCybCzbCAbCBbqBbqCbqDbCCbqCbCDbqDbqBbCEbqFbwIbwJbwKbCFbqJbCGbsxbCHbCIbsxbwVbwVbwVbCJbCKbCLbCMbCNbwZbyNbwVbyOaVnaafaafaafaafaafaafaafbdzbCObCPbCQbdzaafaafaafaafbdzbdzbdzbdzaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaaaaaeaaaaaaaaebzcaaeaaaaaebzcaaeaaaaaebzcaaeaaaaaebzcaaeaaaaaebzcaaeaaaaaeaaaaaabzdbzebzebCRbCSbCTbCUbxqbCVbCWbCXbvSbvSbCYbCZbrmbDabrmaafaafaafaafaafaafaafaafaafaafaafaafaafbrmbvSbuKbDbbDcbDdbDebDfbDgbDhbDibuKbDjbcEbDkbDlbDmbDnbDobDpbDlbDqbDrbDqbwjbwjbwjbwjbwjbDsbDtbDubwjbcJbbkbDvbbiaZhbDwaXOaVebDxbDxbDxbDxbDxbDxbDybDzaVebDAbDBbDAaVebDCbDDbDEbDFaVeaafaafaVeaVeaVNaVOaVNbDGbDHbDIbDJbClbDKbDLbDMbDNbDObDPbDQbDRbDSbDTbDSbDUbFIbFHbHlbCobCobCoaOKbDXbeaaPQbDYaOKbwsbwtbDZbyqbEabEbbEcbEdbCvbEebEfbEgbEhbEibEjbEkbElbEmbEnbEobEpbEpbEqbErbqFbEsbEtbEubEvbwVbEwbExbEybEzbEAbEBbECbwZbyNbwVaXCaVnaVnaafaafaafaafaafaafbdzbEDbEEbEFbdzaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaayaayaaeaaebrjbEGbrlaaabrjbEGbrlaaabrjbEGbrlaaabrjbEGbrlaaabrjbEGbrlaaaaaeaaaaaaaaaaaaaaabEHbxqbxqbxqbxqbrmbrmbEIbEJbBnbEKbELbEMbENbrmaafaafaafaafaafaafaafaafaafaafaafaafaafbrmbvSbuKbuKbuKbEObEPbEPbEPbuKbuKbuKbEQbERbwhbESbETbEUbEVbEWbDlbEXbEYbEZbFabFbbFcbFdbFebDqbFfbDqbFeaaibbkbbkbFgaZhbbibFhbFibDxbFjbFkbFlbFmbDxbDxbDxbDxbFnbFobTbbFqbFqbFrbFsbFqbFtaafaafaafaVeaVeaVObClbClbFubFvbFwbClbFxbFybFzbFzbFzbFAbFBbFCbFDbFDbFEbFFbFFbFGbRLcaObVwcbMaOKaVkbiVbFJaOKaOKaaibvdbFKbFLbAvbFMbFNbFObAvbFPbFQbFRbFSbFTbFUbFTbFVbFWbFWbFXbFWbFWbFYbFZbGabGbbGcbGdbGebwVbGfbGgbGhbEzbEAbEBbGibwZbyNbwVbGjbGkaVnaafaafaafaafaafaafbdzbGlbGmbGnbdzaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrjbEGbrlaaabrjbEGbrlaaabrjbEGbrlaaabrjbEGbrlaaabrjbEGbrlaaaaaeaaaaaaaaaaafaafaafaafaafaafaafaafbrmbrmbrmbrmbrmbGobGpbGqbrmaafaafaafaafaafaafaafaafaafaafaafaafaafbrmbvSbuKbGrbEPbEObEPbEPbEPbEPbGsbuKbGtbcEbGubGvbGwbGxbGybGzbDlbGAbGBbGCbGDbGDbGEbGDbGFbGGbGHbGIbGJaaiaaibGKbbibGLbbibGMbFibGNbGObGPbGPbGQbGRbGSbGTbDxbGUbGVbGWbFqbGXbGYbGZbFqaafaafaafaafaVeaVNaVObClbHabHbbHcbHdbClbHebHfbHgbDMbDMbHhbHibHjbHkbHkbHkbHkbHkbFFcbRbHmcebcqHbHnaUubHoaPQbnpaaiaaibsbbtKbtNbtNbHpbHqbtNbtNbHrbHsbHtbHubvqbHvbHwbHxbqLbHybHzbHAbHBbHCbHDbHEbHFbHGbHHbHIbHJbHKbHLbHMbHNbHObHPbHQbHRbHSbwVbdxbdyaVnaafaafaafaafaafaafbdzbdzbHTbHUbdzaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaabrjbEGbrlaaabrjbEGbrlaaabrjbEGbrlaaabrjbEGbrlaaabrjbEGbrlaaaaayaaaaaaaafaafaaiaaiaaiaaiaaiaaiaaiaaiaafaafaafbrmbrmbHVbGqbrmaafaafaafaafaafaafaafaafaafaafaafaafbrmbrmbvSbuKbHWbEPbHXbHYbEPbEPbEPbGsbuKbHZbrCbIabIbbIcbIdbIebIfbDlbFebIgbIhbGDbGDbGDbGDbIibGDbGDbIjbIkaaiaaibIlbbiaZhbbibImbFibInbIobIpbIqbIrbIpbIpbIsbDxbItbIubIvbFqbIwbIxbIybFqaafaafaafaafaVebIzaVObClbHabIAbIBbICbClbIDbIEbIFbDMbIGbIHbIIbIJbHkbHkbHkbHkbHkbFFbIKbILczYcAdbplbIMbwqbINbplaaiaaibtJbIObIPbIPbIQbIRbISbITbIUbIUbWxbIWbIXbIYbIUbIZbJabJbbJcbIZbJdbJdbJdbJdbJdbJebJfbJgbJhbwVbwVbwVbwVbwVbwVbwVbwVbwVbwVbJibJjaVnbJkbJlbJlbJlbJlbJlbJmbJnbJobJpbKZbJlaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaaebrjbEGbrlaaebrjbEGbrlaaebrjbEGbrlaaebrjbEGbrlaaebrjbEGbrlaaeaayaaabJqaafbJrbJrbJsabxabxabxbJtbJrbJraaiaafaafaafbrmbJubGqbrmaafaafaafaafaafaafaafaafaafaafaafaafbrmbJvbvSbuKbJwbJxbJybEPbJzbEPbJAbuKbuKbJBbcEbGubDlbJCbJDbJEbJFbJGbFebJHbJIbJJbGDbGDbGDbIibJJbGDbJKbIkaaiaaibIlbJLbeHbbibImbFibJMbJNbIpbJObJPbJQbJRbJSbJTbJUbJVbJWbJXbJYbJZbKabFqaafaafaafaafaVeaVeaVObClbClbKbbClbClbClbKcbKdbKebKfbIGbKgbKhbKibKjbKkbKlbKmbFFbFFbKnbILcIBcIGbtIbKobeaaPQbtIaaiaaibKpbKqbKrbKsbKtbKpbKpbKpbKpbKubKvbKwbKxbKybKxbIZbKzbKAbKBbKCbJdbKDbKEbKFbKGbKHbKIbKJbKKbKLbKMbKNbKObKPbKQbKRbKSbKTbKUbKVbKWbKXbKYbKZbLabLbbLcbLdbLebLfbLgbLfbLhbJlaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazaaabrjbLibrlaaabrjbLibrlaaabrjbLibrlaaabrjbLibrlaaabrjbLibrlaaaaaeaaebJqaafbJrbLjbLkbLlbLkbLlbLkbLjbJraaiaaiaafaafbrmbLmbGqbrmbrmaafaafaafaafaafaafaafaafaafaafaafbrmbLnbvSbuKbuKbuKbuKbuKbuKbuKbuKbuKbLobLpbcEbwhbESbLqbLrbLsbJFbLtbFebLubLvbLwbLxbLybLzbLAbLwbLBbLCbLDaaiaaibIlbbibBRbBSbImbLEbDxbLFbIpbLGbLHbLIbLJbLKbDxbLLbLMbLNbLObLObLObLObLObLObLObLOaafaafaVeaVObClbLPbLQbLRbLSbLTbDMbDMbLUbDMbLVbClbLWbLXbLYbLZbMabFFbMbbMcbMdbMecQQcQWaOKbMfbbybMgaOKaaiaaibKpbMhbMibMjbMkbMlbMmbMnbMobMpbKvbKwbMqbMrbMsbIZbMtbMubMvbMwbJdbMxbMybMzbMAbMBbMCbMDbMEbMFbMFbMGbMHbMCbMFbMIbMFbMJbMKbMLbMMbMNbMObMPbMQbMQbMRbMQbMSbMTbMUbMVbMWbJlaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaaaaaeaaaaaaaaaaaeaaeaaeaaaaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaeaaaaaeaaeaafaafaafbMXbMYbMZbNabNbbNcbMXbNdaaiaaiaafaafbrmbNebGqbNfbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbNgbNhbNibNjbNkbNlbxKbNmbNnbNobNpbNqbNrbNsbGubGvbGwbNtbNubJFbNvbFebNwbNxbNybNzbNzbNAbNBbNybNCbNDbFeaaiaaibIlbbiaZhbbibNEbFibDxbNFbIpbNGbNHbIpbLJbNIbDxbNJbNKbNLbLObNMbNNbNObNPbLObNQbLObLOaafaVeaVObClbNRbNSbNTbNTbNUbNTbNTbNVbDMbNWbClbNXbNYbNZbOabObbOcbNXbNYbNZbCobNXbNZaOKaVkbiVbFJaOKaOKaaibKpbOfbOgbOhbOibOjbOkbOlbOmbOnbOobOpbOqbOrbOsbIZbOtbOubOvbOwbJdbOxbOybOzbKGbOAbOBbOCbODbOEbOFbOGbOHbOIbOEbOJbOKbOLbOMbKVbONbOObOPbKZbLabOQbORbMVbOSbOTbOUbMVbOVbJlaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaayaayacvacvaazaayaaeaaeaaeaayaaeaaeaaeaaeaaaaaaaaaaaeaaeaaeaazaaeaaaaafaafaafbLlbOWbOXbOYbOYbOZbLlaaiaaiaaiaafaafbrmbPabPbbPcbPcbPcbPdbPcbPcbPcbPcbPcbPcbPcbPcbPcbPcbPebPfbPgbPhbPibPjbPkbPlbPmbPnbPobPpbPqbPrbwhbIbbPsbPtbPubPvbPwbFebPxbNBbNBbNBbNBbNBbNBbNBbNCbPybFeaaiaaibIlbbiaZhbPzbPAbPBbPCbPDbPEbPFbPGbPHbPIbPJbDxbPKbNKbPLbLObPMbPNbPObPObPPbPQbPRbLOaafaVeaVObClbPSbPTbDMbPUbPVbDMbDMbDMbDMbPWbClbPXbPYbPZbQabQbbQcbQbbQcbQdbQebQfbQfbQgbQhbbyaPQbQiaOKaaibKpbQjbQkbQlbMibQmbQnbQobQpbQqbQrbQsbQtbQubQvbIZbQwbOubQxbQybJdbJdbJdbJdbJdbQzbQAbQBbQBbQBbQBbQBbQCbQDbQCbQCbQCbQCbQCbQEbQFbQGbQHbQIbQIbQIbJlbJlbZGbQKbQLbZGbJlbJlaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafbMXbQMbOXbOYbOYbQNbMXbNdaaiaaiaafaafbrmbQObGqbQPbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbQQbQQbQRbQSbQQbQTbQUbQVbQWbQXbQYbQZbRabRbbQXbQXbQXbQXbQXbFebRcbRdbRebNBbNBbRfbRgbRhbNCbRibFeaaiaaibIlbbiaZhbRjaXOaXObDxbDxbDxbDxbDxbRkbDxbDxbDxbRlbRmbRnbLObRobRpbRqbRrbLObRsbRtbLOaafaVeaVObClbDPbRubClbClbRvbRwbRwbRwbRwbClbClbRxbPZbPYbRybRzbPZbPYbPZbRAbRBaPQaPQaPQaPQbRCbRDbREaOKaaibKpbRFbRGbRHbRGbRIbQnbRJbRKcRbbRMbRNbRObRPbRQbIZbRRbRSbRTbRUbRVbRWbRXbRYbRZbSabSbbScbSdbSebSfbQBbSgbShbSibSjbSkbSlbQCbSmbSnbQGbSobSpbSqbQGaafaafbZGbSrbSsbZGaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafbJrbLjbLkbLlbStbLlbLkbLjbJraaiaaiaafaafbrmbrmbGqbrmbrmaafaafaafaafaafaafaafaafaafaafaafaafaafaafbQQbSubSvbSwbSxbQQbSybSzbSzbSAbSBbSCbSDbSEbSFbSGbSHbSIbSJbFebSKbSLbSMbNBbNBbSNbSLbSObNCbSPbFeaaiaaibIlbbiaZhaVGbSQaaibSRbSSbSTbSUbSVbSWbSXbSYbSRbSZbTabTbbLObLObTcbLObLObLObLObLObLOaafaVeaVOaVebTdbTebTfbTgbThbThbThbThbThbTibTjbPZbPYbTkbTlbTmbTnbPZbPYbTobTpaPQaPQbTqbTrbaBaPQbTsaOKaaibKpbTtbTubTvbTwbTxbTybTzbTAbTBbTCbTDbQubTEbTFbIZbIZbIZbIZbIZbRVbTGbTHbTIbTJbTKbTLbTMbTNbTObTPbQBbTQbTRbTSbTTbTTbTUbQCbTVbTWbQGbTXbTYbTZbQGaafaafbZGbUabUbbZGaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafbJrbJsbUcbUdbUebUfbUgbJtbJraaiaafaafaafaafbrmbGqbrmaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbQQbUhbUibUjbUkbUlbUmbUnbUobUpbUqbUrbUsbUtbUubUvbUvbUwbUxbUybUzbUAbUzbUBbUBbUzbUCbUzbUDbUzbUyaaiaaibIlbUEaZhaVGaWEaaibUFbUGbUHbUIbUGbSWbSWbUJbUKbULbUMbTbblubUObUPbUQbuwbUSbUTbQJbLOaafaVebUVbUWbUXbUYbUZbVabVbbVcbVdbVcbVbbVcbUZbPYbPZbVebVfbTlbVgbPYbPZbVhbVibOdbOeaOKbFJbiVbFJaOKaOKaaibKpbVjbVkbKpbVjbVkbKpbKpbKpbIUbVlbVmbVnbIUbIUbIUaafaafaafaafbRVbVobVpbVqbRZbVrbVsbScbVtbVubVvbQBcYzbVxbVybVzbVAbVBbQCbVCbVDbVEbVFbVGbQGbQGaafaafbZGbVHbVIbZGbZGaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaaiaaibVJbVKbVLbVMbVJaaiaaiaaiaafaafaafaafbrmbGqbrmaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbQQbVNbVObVPbVQbVRbVSbVTbVUbVVbVWbVXbVYbVZbWabWbbWcbWdbWebUybWfbWgbWhbWibWibWfbWgbWfbWjbWkbUyaaiaaibIlbWlbeHbWmaWEaaibWnbWobWpbWqbWrbWsbWtbWubSRbWvbWwbWMbWybWybWzbWAbWBbWCbWCbUNbLOaafaVebWEaVebWFbPZbPYbUZbWGbUZbWGbUZbWGbUZbWHbPZbPYbTkbWIbTmbTnbPZbPYbWJbViaaiaaiaOKbWKbbybWLaOKaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaibIUbXAbWNbIUbIUaafaafaafaafaafaafbRVbRVbRVbRVbRVbWObWPbQBbQBbQBbQBbQBbQCbQCbQCbQCbQCbQCbQCbWQbWRbQGbQGbQGbQGaafaafaafbZGbWSbWTbWUbZGaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaibWVbWWbWXbWYbWVaaiaaiaaiaafaafaafaafbrmbWZbrmaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbQQbXabXbbXcbXdbXebXfbWdbXgbXhbXibXjbXkbXhbXgbWdbWdbWdbXlbUybXmbXnbXmbXobWibXmbXnbXmbWjbWkbUyaaiaaibXpbbibBRbXqaWEaaibXrbXsbXtbXubXvbSWbXwbXxbXybWvbXzbYQbXBbXCbXDbXEbXFbXGbXHbXIbLOaafaVebWEaVeaVebPYbPZbPYbPZbPYbPZbPYbPZbPYbPZbXJbPZbPYbXKbRxbXLbPYbPZbRxbXMbXNaaibHnaPQbbyaPQbHnaaibXObXObXObXObXObXObXObXObXOaaibXPbXQbXRbXPaawaawaawaawaawaawaafbXSbXTbXUbXVbXWbSabSbbXXbXYbXZbYabYbaafaafaafaafaafaafbYcbYdbYebYfbYgbYcaafaafaafaafbZGbYhbYibYjbZGaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaibYkbYlbYmbYkbYkaaiaaiaafaafaafaafaafbYnbYobYnaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbQQbYpbYqbYrbYsbQQbYtbYubYubYubYvbYwbYxbYybYubYubYubYzbYAbUybYBbWibWibYCbYDbYEbYEbYEbYFbYGbUyaaiaaibYHbbiaZhaVGbYIaaibYJbUGbYKbYLbYMbSWbYNbYObSRbWvbYPcuebYRbYRbYSbYTbYUbWCbWCbYVbLOaafaVebWEbYWaVebYXbPYbPZbPYbPZbPYbPZbPYbPZbPYbPZbPYbPZbYYbYZbZabZbbZcbZdbZeaaiaaibplaPQbbybZfbplaaibXObZgbZhbZibZjbZkbZlbZmbXOaaibZnbZobZpbZqaawbZrbYcbYcbYcaawaafbXSbZsbZtbZubZvbZwbZxbZybZzbZAbZBbYbaafaafaafaafaafaafbYcbZCbZDbZEbZFbYcaafaafaafaafbZGbZHbZIbZJbZGaafaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaibZKbZLbZMbZNbZKaaiaaiaafaafaafaafaafbYnbYobYnaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbQQbZObZPbZQbZRbQQbZSbZTbZUbZVbZWbZXbZYbZZcaacabcaccadcaebUybXmbXnbXmcafbWibXmbXnbXmcagcahbUycaicajbbkcakcalcambbkaaibSRcanbSWcaocapcaqcarbSRcascatcaucasbLOcavcawcaxcaycazcaAcaBbLOaafaVebWEaVNaVecaCbPZbPYbRybRzbPZbPYbPZcaDbRybPYbPZbPYcaEbRzcaFbPYbPZcaGbZeaaiaaibplcaHbeaaPQbplaaibXOcaIcaJcaKcaLcaMcaNdlXbXOaaicaPcaQcaRbZqaawcaScaTcaUbYcaawaafbXScaVcaWcaXbXWcaYcaZbXXcbacbbcbcbYbaafaafaafaafaafaafbYcbYdbYcbYcbYcbYcaafaafaafaafbZGcbdcbecbfcbgcbhcbiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaaiaaibVJcbjcbkcblbVJaaiaaiaafaafaafbYnbYnbYnbYobYnaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbQQbQQcbmcbnbQQbQQbQXbQXbQXbQXbQXcbobQXbQXbQXcbpcbqcbrbQXbUybWfbWfbWfbWibWibWfbWfbWfcagcbscbtcbubbibbibbiaZhaVGbbkaaibSRbSRbSRbSRbSRbSRbSRbSRcbvcbwcbxcbybLObLOcbzbLObLObLOcbAbURbLOcbCaVecbDaVeaVecbEbPYbTkcbFbTmbTncbGcbHbTmbTlcbIcbJbTkbTlbVfcbKbPZbPYcbLbZeaaiaaibplaPQbbyaPQbtIaaibXOdmTcbNcbOcbPbXOcbQdnPbXOaaicaPcbScbTbZqaawcaTcaTcbUbYcaawaafbXSbXSbXSbXSbXScbVcbWbYbbYbbYbbYbbYbaafaafaafaafaafaafbYcbYdbYcaafaafaafaafaafaafaafbZGcbXcbYcbZccaccbcccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabxbjIbmBbmCbmCbjIbmDbmEbmFbmGbmHbmIbmJbmKbmLbmMbmNbmObmPbmQbmRbmSbmTbmSbmUdIEdIVbmXdIFbaZblvblwblxbiGbiGblyblzblAbiGblBblCblCblDblEblFblGbiHaaiaaiaWEaVGaZhblHbbkbkdbkdblIblJbblaafaafaafbhrbhrblKblLblMblNblOblNblPblQblRbhrbhraafaafaVeaVOaVeaaibawbbpbdPbdQaYjaYjbdcbddaYjaYjaYjaYjaYjbbrbcgaYjaYjaYjbciblSbawaaiaXeaYsblTblUaOKaafaafbckbecblVbeeblWblXblYblZbmabmbbmcbembfhbmdbmebepbmfbmgbmfbepbmhbmibmjbmkbeqbdwbmlbmmbmnbmlbmmbIZbIZbIZbIZbIZbIZbIZbIZaXCaVnaafbdzbmpbmqbmrbicbmsbjxbmtbmubmvbmwbjEbjybicbjAbjEbmxbmybmsbmzbmAbdzaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXNabxblmbokbmCbmCbolbombonboobopboqborbosbotboubovbowboxboybozboAboBboCboDboEboFdIWbdDbfGbmZbnabnabnabnbbiGbiGbncbiGbiGbndbnebnfbnfbnfbngbnhbiHaaiaaiaWEaVGaZhbcLbbkbblbblbblbblbblaafaafaafbhrbhrbnibnjbnkbnlbnlbnlbnkbnjbnmbhrbhraafaafaVeaVOaVeaaibbobbpbdWbnnaYjbbqaYjbdcbbsaYjaYjaYjbbtbcgaYjbbqaYjbiTbnoblSbboaaiaYraUuaUvaPRbnpaaiaafbckbnqbnrbeebnsbntbnubnvbnvbnwbnxbnybnzbnAbnAbnBbnCbnDbnCbnEbnCbnFbnGbnHbnIbnJbnKbnHbnLbnMbnNbIZbnObmobnQbnPbnRbnRbIZaXCaVnaafbdzbnUbnVbnWbdzbnXbnYbnZbdzboabobbocbocbodboebocbofbogbohbmzboibdzaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaaaaaaaayaazaayaayaayaayaayaayaayaazaayaayaayaazaayaayaayaayaaaaaaaayaayaayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabojaaeaaiabxbjIbpYbmCbmCbjIbpZbqabqbbqcbqdbqebqfbikbikbltbikbfEbfEbfEbfEbfEbfEbfEbfEbfEdITbcEbfGboHboIboJbnaboKbjSboLboMboNboOboPboQboRboSboTboUboVbiHaaiaaiaWEboWboXboYaVFaaiaaiaaiaaiaaiaaiaafaafbhrboZbpabnjbnkbpbbpcbpbbnkbnjbpdbpebhraafaafaVeaVOaVeaaiaZsbpfbpgbdWbnnaYjaYjaYjaYjaYjaYjaYjaYjaYjaYjaYjbiTbdSbphbpiaZsaaiaOKbpjaUvbpkbplaaiaaibckbdhbiXbpmbckbpnbpobppbpqbprbjebpsbptbpubpvbpwbpxbpybpxbpxbpxbpzbpAbpBbpCbpDbpEbpDbpFbpDbpDbnSbpGbnTbpHbQxbpIbOubIZaXCaVnaafbdzbmpbpMbmrbicbjAbpNbpObpPbpQbjEbjEbpRbicbpSbjEbpTbpUbjAbmzbpVbdzaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaaaaaaaayaaaaaeaaaaaaaaaaaaaaeaaeaaaaaaaaeaaeaaaaaeaaeaaeaaaaaeaaeaaeaaaaayaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpWaaiaaibpXblmblnbrubrvblmbrwblqbikbikbikbrxblqbikbiybvSbjQbfEbgTbgUbgVbgWbgXbgYbgZbfEdIXbcEbqhbaZbqibqjbqkbqkbqlbqmbqnbqoboObqpboQbqqbqrbqsboUbqtbquaaiaaiaWEaVGaZhbeIaWEaaiaaiaaiaaiaaiaaiaafaafbhrbhrbnibnjbqvbnlbqwbnlbnkbnjbnmbhrbhraafaafaVeaVOaVeaaiaVPbawaYebqxbdWbnnbqybcXbqzaYjaYjaYjbqybcXbqzbiTbdSbphaYebawaVPaaiaVWaUubbyaPRbplaaiaaibckbckbqAbckbckbjebjebjebqBbqBbqBbqBbqCbqDbqBbqBbqEbqFbqGbqHbqHbqIbqJbqFbqKbqLbqMbpJbqObqPbqQbIZbmobpKbqNbpLbqSbqRbIZaXCaVnaafbdzbqWbqXbkYbqYblabqZblabrabjEbrbbjEbrcbdzbrdbfCbrebrfbrgbrhbribdzaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaaaaaaaayaaabrjbrkbrlaaabrjbrkbrlaaabrjbrkbrlaaabrjbrkbrlaaabrjbrkbrlaaaaayaaeaaeaaaaaaaaaaaaaaaaaabrmbrnbrobrpaaaaaabrqbrrbrsbrqbrqbrtbjGbjHbjIbjHbjGbikaaiaaiaaiaaiaaiaaibrmbsZbrzbtabfEbipbiqbirbisbitbiubivbiwdIZdIYdJabmZbrEbrFbrGbnabrHbbLbrIbrJbrKbrLbrMbrNbrNbrNbrObrPbrQaaiaaiaWEaVGaZhbeIaWEaaiaaiaaiaaiaaiaafaafaafbhrbhrbrRbrSbrTbnlbnlbnlbrUbrVbrWbhrbhraafaafaVeaVOaVeaaiaaiaYqaXdaYebqxbdWbrXbrYbrZbdabdabdabrXbrYbrZbdSbphaYeaWPaYdaaiaaiaXebaAbaBbsabplaaiaaibsbbscbsdbsebsfbsgbshbsibqBbsjbskbslbsmbsnbsobspbsqbsrbssbstbsubsvbqJbqTbsxbsybszbsAbsBbsybsAbIZbqVbqUbOubswbOubOubIZaXCaVnaafbdzbdzbfybsIbicbmsbsJbjEbjxbjEbjEbrhbsKbdzbsLbsMbsNbsObpRbsPbdzbdzaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXDaXDaXDaXDaXDaXDaXDaXDaXDaaaaaaaaaaaaaayaaebrjbsQbrlaaebrjbsQbrlaaebrjbsQbrlaaebrjbsQbrlaaebrjbsQbrlaaeaazaaaaaeaaeaaaaaaaaaaaaaaabrmbrmbsRbsSbrmbsTbsUbsVbsWbsXbsYbikbikabxabxbilbikbikcxVcxVaaiaaiaaiaaibrmbrmbrzbuJbfEbjKbjLbgVbjMbjNbjObjPbfEdJbbtcbtdboHbtebtfbtgbthbmZbtibtjbtkbtlbtmbtnbtobtpbtqbtrbtsbiHaaiaaiaWAaVGbttbeIaWAaaiaaiaaiaafaafaafaafaafaafbhrbhrbtubrSbtvbtwbtxbtybtzbhrbhraafaafaafaVeaVOaVeaaiaaiaaiaYqaVSbaxbdUbdUbtAbtBbtCbtDbtCbtEbtFbdUbdUbtGaVQaYdaaiaaiaaiaYraUubtHaPRbtIaaiaaibtJbtKbsdbtLbtMbtNbtObtPbqBbtQbtRbtSbtTbtTbtUbtVbtWbtXbtYbtZbtZbuabubbucbudbuebufbugbuhbuibujbIZbsDbsCbsFbsEbsEbsGbIZaXCaVnaafaafbdzbdzbdzbdzbuqburbusbjxbutbuubuvbdzbdzbiebdzbuxbuybuzbdzbdzaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXDaXDaXDaXDaXDaXDaXDaaaaaaaaaaaaaaaaayaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaaaaeaaaaaaaaeaaeaaaaaaaaaaaabrmbuAbuBbuCbrmbuDbuEbuFbuGbuHbuIdIScxVaaiaaiaaiaaicxVcxVaaiaaiaaiaaiaaiaaibrmbrzdIRbfEbfEbfEbfEbfEbfEbfEbfEbfEdJcbuMbuNbaZbuObuPbuQbuRboHbuSbrIbqhbrKbuTbuUbuVbiHbuWbuXbuWbiHaaibbkbbkbiIbiJbiKaXOaaiaaiaafaafaafaafaafaafaafbhrbhrbhrbuYbuZbvabvbbvcbhrbhrbhraafaafaVeaVeaVOaVeaVeaaiaaiaaiaVPaVQaVRaVSaVPaVPaVQaVRaVSaVPaVPaVQaVRaVSaVPaaiaaiaaiaaiaOKaVkbiVaVmaOKaOKaaibvdbvebvfbtNbvgbvhbvibvjbqBbvkbvlbvmbvnbtTbtTbvobnHbvpbvqbqLbqLbvrbqJbvsbvtbvubvvbvwbvxbvybvzbIZbIZbIZbIZbsHbIZbIZbIZaXCaVnaafaafaafaafaafbdzbvBbvCbdzbvDbdzbvBbvEbdzbvFbvGbdzbvHbvIbdzbdzaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaaaaeaaaaaaaaaaaeaaeaaaaaaaaabrmbvJbvKbvLbrmbvMbvNbvObvPbvQbvRbrqaafaafaafaaiaaiaaiaaiaaiaaiaaiaaiaafaafbrmbvSbuKbuKbvTbvUbvVbvWbvXbvYbvZbuKdJdbwbbwcbaZbwdbwebwfbwgbaZbwhbrIbwibwjbwjbwjbwjbwjbwkbwlbwmbwjbcJbbkbwnaVGaZhbwoaXOaVeaafaafaafaafaafaafaafaafaafbhrbhrbhrbwpbhrbhrbhrbhrbhraafaafaVeaVeaVNaVOaVNaVeaVeaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaVeaOKaUubwqbgibwraOKbwsbwtbwubwvbwwbwxbwybukbwAbwBbwCbwDbwEbwFbtTbwGbqBcsVbqFbwIbwJbwKbwLbwMbwNbwObwPbwQbwRbwSbwTbwUbwVbulbwZbumbwZbwZbunbwVaXCaVnaafaafaafaafaafbdzbxcbxdbxebxfbxgbxhbxibxjbxkbxlbdzbxmbxnbxobdzaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaayaayaaeaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaabrjbsQbrlaaaaaeaaaaaaaaaaaaaaebxpbxqbxqbxqbxqbxrbrmbrmbrqbxsbxtbxubxvbxwbrqaafaafaafaafaaiaaiaaiaaiaaiaaiaafaafaafbrmbvSbuKbxxbxybxzbxAbxBbxCbxDbxEbxFdJebxHbxIbxJbxKbxLbxMbxNbxObxPbxQbxRbxSbxTbxUbxVbxSbxWbxXbxYbxZbyabybbbiaWBbeHbeIbycaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaafaafbydbyebydbydaVeaVeaVeaVeaVeaVebyfbygbyhbyiaVNaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVeaVebyjbykbylbymaPQbynbyobypbtNbyqbtNbyrbvhbysbytbspbyubyvbywbyxbyybyzbspbyAbyBbnMbyCbyCbyDbqJbyEbudbyFbyGbyHbvybyIbyJbwVbwVbwVbwVbuobwVbwVbwVbyOaVnaafaafaafaafaafbdzbdzbyPbyQbyRbySbyTbyUbyVbyWbyXbyYbyZbzabzbbdzaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaaaaaeaaaaaaaaebzcaaeaaaaaebzcaaeaaaaaebzcaaeaaaaaebzcaaeaaaaaebzcaaeaaaaaeaaaaaabzdbzebzebzfbzgbzhbzibzjbzkbzlbzmbrqbznbzobzpbzqbzrbrqaafaafaafaafaafaaiaaiaaiaaiaafaafaafaafbrmbvSbuKbzsbxzbztbzubzvbzwbzxbzwbzybzzbzAbzBbzCbhebzDbhebzEbhebhebzFbzGbzHbzIbzJbzKbzLbzMbzNbzObzPbzQbzRbzSbzTbzUbzVbzWbzXbzYbzZbzZbzZbzZbAabzZbAbaVeaVeaVeaVebAcaVeaVeaVebAdbAebAebAebAebAebAfbAgbAhbAibAibAibAibAibAibAibAjbAibAibAibAkbAlbAlbAlbAlbAlbAlbAlbAlbAmbAlbAnbAobApbAqbAraYvbAsbAtbAubAvbAwbtLbAxbtNbAybAzbtVbAAbupbACbADbAEbAFbtVbAGbAHbAIbAJbAJbAKbALbAMbvtbANbAObAPbAQbARbwVbwVbwzbvAbwXbwWbxabwYbwVbyOaVnaafaafaafaafaafaafbdzbdzbdzbAWbAXbdzbdzbdzbdzbdzbdzbAYbAZbdzbdzaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaaebBabBbbBbbBbbBcbBbbBbbBbbBcbBbbBbbBbbBcbBbbBbbBbbBcbBbbBbbBbbBcbBbbBbbBbbBbbBdbBebBfbBgbBhbBibBjbBkbBlbBmbBnbBobrqbrqbBpbrqbrqbBqbrqaafaafaafaafaafaafaafaaiaaiaafaafaafaafbrmbvSbuKbBrbBsbBtbBubBvbBwbBxbBybuKbBzbBAbBBbBCbBDbBEbBFbBGbBHbBIbBJbBKbwjbBLbBMbBNbBObBPbBQbxYbxZbyabybbbibbibBRbBSbBTaVebBUbBVbBWbBXbBYbBZbCabCbbCcbCdbCebCfbCgbzZbzZbzZbChaVeaVeaVeaVeaVNbCibCjbCkbClbClbClbClbClbClbClbCmbClbClbClbCnbCobCobCobCobCobCobCobFpbfYbhtaVebCqaUubbybCraQIbCsbCtbCubCvbCwbCxbCybCzbCAbCBbqBbqCbqDbCCbqCbCDbqDbqBbCEbqFbwIbwJbwKbCFbqJbCGbsxbCHbCIbsxbwVbwVbwVbCJbyKbxbbxbbCNbwZbyLbwVbyOaVnaafaafaafaafaafaafaafbdzbCObCPbCQbdzaafaafaafaafbdzbdzbdzbdzaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaaaaaeaaaaaaaaebzcaaeaaaaaebzcaaeaaaaaebzcaaeaaaaaebzcaaeaaaaaebzcaaeaaaaaeaaaaaabzdbzebzebCRbCSbCTbCUbxqbCVbCWbCXbvSbvSbCYbCZbrmbDabrmaafaafaafaafaafaafaafaafaafaafaafaafaafbrmbvSbuKbDbbDcbDdbDebDfbDgbDhbDibuKbDjbcEbDkbDlbDmbDnbDobDpbDlbDqbDrbDqbwjbwjbwjbwjbwjbDsbDtbDubwjbcJbbkbDvbbiaZhbDwaXOaVebDxbDxbDxbDxbDxbDxbDybDzaVebDAbDBbDAaVebDCbDDbDEbDFaVeaafaafaVeaVeaVNaVOaVNbDGbDHbDIbDJbClbDKbDLbDMbDNbDObDPbDQbDRbDSbDTbDSbDUbFIbFHbHlbCobCobCoaOKbDXbeaaPQbDYaOKbwsbwtbDZbyqbEabEbbEcbEdbCvbEebEfbEgbEhbEibEjbEkbElbEmbEnbEobEpbEpbEqbErbqFbnIbyCbyCbyMbwVbEwbExbEybABbAVbATbECbwZbyNbwVaXCaVnaVnaafaafaafaafaafaafbdzbEDbEEbEFbdzaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaayaayaaeaaebrjbEGbrlaaabrjbEGbrlaaabrjbEGbrlaaabrjbEGbrlaaabrjbEGbrlaaaaaeaaaaaaaaaaaaaaabEHbxqbxqbxqbxqbrmbrmbEIbEJbBnbEKbELbEMbENbrmaafaafaafaafaafaafaafaafaafaafaafaafaafbrmbvSbuKbuKbuKbEObEPbEPbEPbuKbuKbuKbEQbERbwhbESbETbEUbEVbEWbDlbEXbEYbEZbFabFbbFcbFdbFebDqbFfbDqbFeaaibbkbbkbFgaZhbbibFhbFibDxbFjbFkbFlbFmbDxbDxbDxbDxbFnbFobTbbFqbFqbFrbFsbFqbFtaafaafaafaVeaVeaVObClbClbFubFvbFwbClbFxbFybFzbFzbFzbFAbFBbFCbFDbFDbFEbFFbFFbFGbRLcaObVwcbMaOKaVkbiVbFJaOKaOKaaibvdbFKbFLbAvbFMbFNbFObAvbFPbFQbFRbFSbFTbFUbFTbFVbFWbFWbFXbFWbFWbFYbFZbGabGbbASbFTbAUbwVbGfbGgbGhbCLbCKbEBbGibwZbyNbwVbGjbGkaVnaafaafaafaafaafaafbdzbGlbGmbGnbdzaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrjbEGbrlaaabrjbEGbrlaaabrjbEGbrlaaabrjbEGbrlaaabrjbEGbrlaaaaaeaaaaaaaaaaafaafaafaafaafaafaafaafbrmbrmbrmbrmbrmbGobGpbGqbrmaafaafaafaafaafaafaafaafaafaafaafaafaafbrmbvSbuKbGrbEPbEObEPbEPbEPbEPbGsbuKbGtbcEbGubGvbGwbGxbGybGzbDlbGAbGBbGCbGDbGDbGEbGDbGFbGGbGHbGIbGJaaiaaibGKbbibGLbbibGMbFibGNbGObGPbGPbGQbGRbGSbGTbDxbGUbGVbGWbFqbGXbGYbGZbFqaafaafaafaafaVeaVNaVObClbHabHbbHcbHdbClbHebHfbHgbDMbDMbHhbHibHjbHkbHkbHkbHkbHkbFFcbRbHmcebcqHbHnaUubHoaPQbnpaaiaaibsbbtKbtNbtNbHpbHqbtNbtNbHrbHsbHtbHubvqbHvbHwbHxbqLbHybHzbCMbHBbEsbEtbHEbHFbHGbHHbHIbHJbHKbHLbHMbHNbHRbHPbHQbHRbHSbwVbdxbdyaVnaafaafaafaafaafaafbdzbdzbHTbHUbdzaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaabrjbEGbrlaaabrjbEGbrlaaabrjbEGbrlaaabrjbEGbrlaaabrjbEGbrlaaaaayaaaaaaaafaafaaiaaiaaiaaiaaiaaiaaiaaiaafaafaafbrmbrmbHVbGqbrmaafaafaafaafaafaafaafaafaafaafaafaafbrmbrmbvSbuKbHWbEPbHXbHYbEPbEPbEPbGsbuKbHZbrCbIabIbbIcbIdbIebIfbDlbFebIgbIhbGDbGDbGDbGDbIibGDbGDbIjbIkaaiaaibIlbbiaZhbbibImbFibInbIobIpbIqbIrbIpbIpbIsbDxbItbIubIvbFqbIwbIxbIybFqaafaafaafaafaVebIzaVObClbHabIAbIBbICbClbIDbIEbIFbDMbIGbIHbIIbIJbHkbHkbHkbHkbHkbFFbIKbILczYcAdbplbIMbwqbINbplaaiaaibtJbIObIPbIPbIQbIRbISbITbIUbIUbWxbIWbIXbIYbIUbEubEzbEvbEAbEubEubEubEubEubEubJebJfbJgbJhbwVbwVbwVbwVbwVbwVbwVbwVbwVbwVbJibJjaVnbJkbJlbJlbJlbJlbJlbJmbJnbJobJpbKZbJlaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaaebrjbEGbrlaaebrjbEGbrlaaebrjbEGbrlaaebrjbEGbrlaaebrjbEGbrlaaeaayaaabJqaafbJrbJrbJsabxabxabxbJtbJrbJraaiaafaafaafbrmbJubGqbrmaafaafaafaafaafaafaafaafaafaafaafaafbrmbJvbvSbuKbJwbJxbJybEPbJzbEPbJAbuKbuKbJBbcEbGubDlbJCbJDbJEbJFbJGbFebJHbJIbJJbGDbGDbGDbIibJJbGDbJKbIkaaiaaibIlbJLbeHbbibImbFibJMbJNbIpbJObJPbJQbJRbJSbJTbJUbJVbJWbJXbJYbJZbKabFqaafaafaafaafaVeaVeaVObClbClbKbbClbClbClbKcbKdbKebKfbIGbKgbKhbKibKjbKkbKlbKmbFFbFFbKnbILcIBcIGbtIbKobeaaPQbtIaaiaaibKpbKqbKrbKsbKtbKpbKpbKpbKpbKubKvbKwbKxbKybKxbGcbGebGdbHCbHAbHObHDbJbbJabJcbKHbKIbKJbKKbKLbKMbKNbKObKPbKQbKRbKSbKTbKUbKVbKWbKXbKYbKZbLabLbbLcbLdbLebLfbLgbLfbLhbJlaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazaaabrjbLibrlaaabrjbLibrlaaabrjbLibrlaaabrjbLibrlaaabrjbLibrlaaaaaeaaebJqaafbJrbLjbLkbLlbLkbLlbLkbLjbJraaiaaiaafaafbrmbLmbGqbrmbrmaafaafaafaafaafaafaafaafaafaafaafbrmbLnbvSbuKbuKbuKbuKbuKbuKbuKbuKbuKbLobLpbcEbwhbESbLqbLrbLsbJFbLtbFebLubLvbLwbLxbLybLzbLAbLwbLBbLCbLDaaiaaibIlbbibBRbBSbImbLEbDxbLFbIpbLGbLHbLIbLJbLKbDxbLLbLMbLNbLObLObLObLObLObLObLObLOaafaafaVeaVObClbLPbLQbLRbLSbLTbDMbDMbLUbDMbLVbClbLWbLXbLYbLZbMabFFbMbbMcbMdbMecQQcQWaOKbMfbbybMgaOKaaiaaibKpbMhbMibMjbMkbMlbMmbMnbMobMpbKvbKwbMqbMrbMsbEubKAbKzbKBbKzbKFbKCbMtbKGbMubKHbMvbMDbMEbMFbMFbMGbMHbMCbMFbMIbMFbMJbMKbMLbMMbMNbMObMPbMQbMQbMRbMQbMSbMTbMUbMVbMWbJlaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaaaaaeaaaaaaaaaaaeaaeaaeaaaaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaeaaaaaeaaeaafaafaafbMXbMYbMZbNabNbbNcbMXbNdaaiaaiaafaafbrmbNebGqbNfbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbNgbNhbNibNjbNkbNlbxKbNmbNnbNobNpbNqbNrbNsbGubGvbGwbNtbNubJFbNvbFebNwbNxbNybNzbNzbNAbNBbNybNCbNDbFeaaiaaibIlbbiaZhbbibNEbFibDxbNFbIpbNGbNHbIpbLJbNIbDxbNJbNKbNLbLObNMbNNbNObNPbLObNQbLObLOaafaVeaVObClbNRbNSbNTbNTbNUbNTbNTbNVbDMbNWbClbNXbNYbNZbOabObbOcbNXbNYbNZbCobNXbNZaOKaVkbiVbFJaOKaOKaaibKpbOfbOgbOhbOibOjbOkbOlbOmbOnbOobOpbOqbOrbOsbEubMwbKzbMAbMxbOtbMBbOwbOvbQwbOAbOBbOCbODbOEbOFbOGbOHbOIbOEbOJbOKbOLbOMbKVbONbOObOPbKZbLabOQbORbMVbOSbOTbOUbMVbOVbJlaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaayaayacvacvaazaayaaeaaeaaeaayaaeaaeaaeaaeaaaaaaaaaaaeaaeaaeaazaaeaaaaafaafaafbLlbOWbOXbOYbOYbOZbLlaaiaaiaaiaafaafbrmbPabPbbPcbPcbPcbPdbPcbPcbPcbPcbPcbPcbPcbPcbPcbPcbPebPfbPgbPhbPibPjbPkbPlbPmbPnbPobPpbPqbPrbwhbIbbPsbPtbPubPvbPwbFebPxbNBbNBbNBbNBbNBbNBbNBbNCbPybFeaaiaaibIlbbiaZhbPzbPAbPBbPCbPDbPEbPFbPGbPHbPIbPJbDxbPKbNKbPLbLObPMbPNbPObPObPPbPQbPRbLOaafaVeaVObClbPSbPTbDMbPUbPVbDMbDMbDMbDMbPWbClbPXbPYbPZbQabQbbQcbQbbQcbQdbQebQfbQfbQgbQhbbyaPQbQiaOKaaibKpbQjbQkbQlbMibQmbQnbQobQpbQqbQrbQsbQtbQubQvbEubRibQybKzbRRbEubEubEubEubEubQzbQAbQBbQBbQBbQBbQBbQCbQDbQCbQCbQCbQCbQCbQEbQFbQGbQHbQIbQIbQIbJlbJlbZGbQKbQLbZGbJlbJlaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafbMXbQMbOXbOYbOYbQNbMXbNdaaiaaiaafaafbrmbQObGqbQPbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbQQbQQbQRbQSbQQbQTbQUbQVbQWbQXbQYbQZbRabRbbQXbQXbQXbQXbQXbFebRcbRdbRebNBbNBbRfbRgbRhbNCbRSbFeaaiaaibIlbbiaZhbRjaXOaXObDxbDxbDxbDxbDxbRkbDxbDxbDxbRlbRmbRnbLObRobRpbRqbRrbLObRsbRtbLOaafaVeaVObClbDPbRubClbClbRvbRwbRwbRwbRwbClbClbRxbPZbPYbRybRzbPZbPYbPZbRAbRBaPQaPQaPQaPQbRCbRDbREaOKaaibKpbRFbRGbRHbRGbRIbQnbRJbRKcRbbRMbRNbRObRPbRQbEubRUbRTbRZbRYbEubKDbKEbTGbVBbSabSbbScbSdbSebSfbQBbSgbShbSibSjbSkbSlbQCbSmbSnbQGbSobSpbSqbQGaafaafbZGbSrbSsbZGaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafbJrbLjbLkbLlbStbLlbLkbLjbJraaiaaiaafaafbrmbrmbGqbrmbrmaafaafaafaafaafaafaafaafaafaafaafaafaafaafbQQbSubSvbSwbSxbQQbSybSzbSzbSAbSBbSCbSDbSEbSFbSGbSHbSIbSJbFebSKbSLbSMbNBbNBbSNbZubSObNCbSPbFeaaiaaibIlbbiaZhaVGbSQaaibSRbSSbSTbSUbSVbSWbSXbSYbSRbSZbTabTbbLObLObTcbLObLObLObLObLObLOaafaVeaVOaVebTdbTebTfbTgbThbThbThbThbThbTibTjbPZbPYbTkbTlbTmbTnbPZbPYbTobTpaPQaPQbTqbTrbaBaPQbTsaOKaaibKpbTtbTubTvbTwbTxbTybTzbTAbTBbTCbTDbQubTEbTFbEubEubEubEubEubEubXSbMybMzbXTbTKbTLbTMbTNbTObTPbQBbTQbTRbTSbTTbTTbTUbQCbTVbTWbQGbTXbTYbTZbQGaafaafbZGbUabUbbZGaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafbJrbJsbUcbUdbUebUfbUgbJtbJraaiaafaafaafaafbrmbGqbrmaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbQQbUhbUibUjbUkbUlbUmbUnbUobUpbUqbUrbUsbUtbUubUvbUvbUwbUxbUybUzbUAbUzbUBbUBbUzbUCbUzbUDbUzbUyaaiaaibIlbUEaZhaVGaWEaaibUFbUGbUHbUIbUGbSWbSWbUJbUKbULbUMbTbblubUObUPbUQbuwbUSbUTbQJbLOaafaVebUVbUWbUXbUYbUZbVabVbbVcbVdbVcbVbbVcbUZbPYbPZbVebVfbTlbVgbPYbPZbVhbVibOdbOeaOKbFJbiVbFJaOKaOKaaibKpbVjbVkbKpbVjbVkbKpbKpbKpbIUbVlbVmbVnbIUbIUbIUaafaafaafaafbJdbOxbOybOzbVBbVrbVsbScbVtbVubVvbQBcYzbVxbVybVzbVAbXUbQCbVCbVDbVEbVFbVGbQGbQGaafaafbZGbVHbVIbZGbZGaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaaiaaibVJbVKbVLbVMbVJaaiaaiaaiaafaafaafaafbrmbGqbrmaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbQQbVNbVObVPbVQbVRbVSbVTbVUbVVbVWbVXbVYbVZbWabWbbWcbWdbWebUybWfbWgbWhbWibWibWfbWgbWfbWjbWkbUyaaiaaibIlbWlbeHbWmaWEaaibWnbWobWpbWqbWrbWsbWtbWubSRbWvbWwbWMbWybWybWzbWAbWBbWCbWCbUNbLOaafaVebWEaVebWFbPZbPYbUZbWGbUZbWGbUZbWGbUZbWHbPZbPYbTkbWIbTmbTnbPZbPYbWJbViaaiaaiaOKbWKbbybWLaOKaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaibIUbXAbWNbIUbIUaafaafaafaafaafaafbJdbJdbJdbJdbJdbWObWPbQBbQBbQBbQBbQBbQCbQCbQCbQCbQCbQCbQCbWQbWRbQGbQGbQGbQGaafaafaafbZGbWSbWTbWUbZGaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaibWVbWWbWXbWYbWVaaiaaiaaiaafaafaafaafbrmbWZbrmaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbQQbXabXbbXcbXdbXebXfbWdbXgbXhbXibXjbXkbXhbXgbWdbWdbWdbXlbUybXmbXnbXmbXobWibXmbXnbXmbWjbWkbUyaaiaaibXpbbibBRbXqaWEaaibXrbXsbXtbXubXvbSWbXwbXxbXybWvbXzbYQbXBbXCbXDbXEbXFbXGbXHbXIbLOaafaVebWEaVeaVebPYbPZbPYbPZbPYbPZbPYbPZbPYbPZbXJbPZbPYbXKbRxbXLbPYbPZbRxbXMbXNaaibHnaPQbbyaPQbHnaaibXObXObXObXObXObXObXObXObXOaaibXPbXQbXRbXPaawaawaawaawaawaawaafbRVbRWbRXbXWbZsbSabSbbXXbXYbXZbYabYbaafaafaafaafaafaafbYcbYdbYebYfbYgbYcaafaafaafaafbZGbYhbYibYjbZGaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaibYkbYlbYmbYkbYkaaiaaiaafaafaafaafaafbYnbYobYnaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbQQbYpbYqbYrbYsbQQbYtbYubYubYubYvbYwbYxbYybYubYubYubYzbYAbUybYBbWibWibYCbYDbYEbYEbYEbYFbYGbUyaaiaaibYHbbiaZhaVGbYIaaibYJbUGbYKbYLbYMbSWbYNbYObSRbWvbYPcuebYRbYRbYSbYTbYUbWCbWCbYVbLOaafaVebWEbYWaVebYXbPYbPZbPYbPZbPYbPZbPYbPZbPYbPZbPYbPZbYYbYZbZabZbbZcbZdbZeaaiaaibplaPQbbybZfbplaaibXObZgbZhbZibZjbZkbZlbZmbXOaaibZnbZobZpbZqaawbZrbYcbYcbYcaawaafbRVbZtbTHbTIbTJbZwbZxbZybZzbZAbZBbYbaafaafaafaafaafaafbYcbZCbZDbZEbZFbYcaafaafaafaafbZGbZHbZIbZJbZGaafaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaibZKbZLbZMbZNbZKaaiaaiaafaafaafaafaafbYnbYobYnaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbQQbZObZPbZQbZRbQQbZSbZTbZUbZVbZWbZXbZYbZZcaacabcaccadcaebUybXmbXnbXmcafbWibXmbXnbXmcagcahbUycaicajbbkcakcalcambbkaaibSRcanbSWcaocapcaqcarbSRcascatcaucasbLOcavcawcaxcaycazcaAcaBbLOaafaVebWEaVNaVecaCbPZbPYbRybRzbPZbPYbPZcaDbRybPYbPZbPYcaEbRzcaFbPYbPZcaGbZeaaiaaibplcaHbeaaPQbplaaibXOcaIcaJcaKcaLcaMcaNdlXbXOaaicaPcaQcaRbZqaawcaScaTcaUbYcaawaafbRVbVobVpbVqbZscaYcaZbXXcbacbbcbcbYbaafaafaafaafaafaafbYcbYdbYcbYcbYcbYcaafaafaafaafbZGcbdcbecbfcbgcbhcbiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaaiaaibVJcbjcbkcblbVJaaiaaiaafaafaafbYnbYnbYnbYobYnaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbQQbQQcbmcbnbQQbQQbQXbQXbQXbQXbQXcbobQXbQXbQXcbpcbqcbrbQXbUybWfbWfbWfbWibWibWfbWfbWfcagcbscbtcbubbibbibbiaZhaVGbbkaaibSRbSRbSRbSRbSRbSRbSRbSRcbvcbwcbxcbybLObLOcbzbLObLObLOcbAbURbLOcbCaVecbDaVeaVecbEbPYbTkcbFbTmbTncbGcbHbTmbTlcbIcbJbTkbTlbVfcbKbPZbPYcbLbZeaaiaaibplaPQbbyaPQbtIaaibXOdmTcbNcbOcbPbXOcbQdnPbXOaaicaPcbScbTbZqaawcaTcaTcbUbYcaawaafbRVbRVbRVbRVbRVcbVcbWbYbbYbbYbbYbbYbaafaafaafaafaafaafbYcbYdbYcaafaafaafaafaafaafaafbZGcbXcbYcbZccaccbcccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaaiaaibWVccdcbkccebWVaaiaaiaafaafaafbYnccfccgcchbYnbYnbYnbYnaafaafaafaafaafaafaafaafaafaafaafaafaafbQQbQQbQQbQQaafaafaafaafbYncciccjbYnaaiaaiaaiaaiaaiaaibUycckcclbWibWibWibWiccmbWiccnccocbtcbuccpccqbbiaZhaVGcascascascasccrccscctccuccvccwccxccycczccAccBccCccDccEccFcascascascascasccGccHccIbVibViccJcbHbTmbWIcbIccKbTkbWIbVfbTnccLcbHccMccNccOccPccQccRccSaaiaaibplccTbbyccUaOKbZqbXOccVccWccWccWbXOccXccYbXOaaiccZcdacdbbZqaawcdccddcdebYcaawaafaafaafaafaafbYccdfcdgbYcaafaafaafaafaafaafaafaafaafaafbYcbYdbYcaafaafbZGbZGbZGbZGbZGbZGcdhcdhbZGbZGbZGbZGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbYkbUfbUdbYkcdicbkcdjbYkbUfbUdbYkbYkbYnbYncdkcdlcdmcdncdocdpbYnaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbYncdqcdrcdscdscdscdscdsaaiaaibUybUybUycdtcducducdvbUybUybUybUybUycaicajbbkcdwbhnaVGcdxcdycdzcascdAcdBcdCcdBcdAcdAcdAcbwcbxcdAcdAcdAccDcdDcdEcdFcascdGcdycdHcdIcdJcdKcdLcdMcdNcdOcdPcdQcdNcdRcdNcdScdPcdOcdTcdOcdPcdUcdVbPZbPYcdWbViaaiaaibtIaPQbbyaPQcdXbZqbXOcdYcbNcbPcdZbXOceabXObXObZqbZqceccedbZqbYcceebYcbYcaalaawaafaafaafbYcbYcbYccefcegbYcaafaafaafaafaafaafaafaafaafbYcbYcbYdbYcaafaafbZGcehceiceiceiceicejcejcekceiceicelaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafbYkcemcencemceocepceqcercescetceucevcewcexceycezceAceBceCceDbYnaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbYnceEceFceGceHceIceJcdsaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaXOceKceLceMceNceOcePceQceRceSceTceUceUceUceUceVceWceUceUceUceXceYceSceZcfacfbcfccfdcfecffcfgcfhbRBcfibPYbPZbPYbPZcfjbPZbPYbPZbPYcfkbPYbPZcflbPZbPYbPZcfmbXMaaiaaiaOKcfnbwqcfoaQIcfpcfqcfqcfqcfrcfqdHDcgQcfqcfqcfqcfqcfscftcfubYccdccaTcfvbYcbYcbYcbYcbYcbYccfwcfxcfycfzbYcbYcbYcbYcbYcbYcbYcbYcbYcbYcbYccfAbYdbYcaafaafbZGcfBcfCcfDcfEcfFcfGcfHcfIcfJcfKceicelaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafbYkcfLcfMcfNcbkcfOcbkcbkcfPcbkcfQbYkcfRcfScfRcfTcfUcfVcfWbYnbYnbYnbYnbYnbYnbYnbYnbYnbYnbYnbYnbYnbYnbYnbYnbYnbYnbYnbYnbYnbYnbYnbYncfXcfYcdscfZcgacgbcdsaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaVFcgccgdcgecgfcggcghcascgicgjcgkcglcgmcgncgjcgjcgocgjcgpcgqcgrcgscgjcgtcascghcggcgucgvcgwcdIcdIcgxcgyccQccPccQcgzcgAccPcgBccPccQcgCcgDccPcgEcgFcgGcgHcgIcgJaaiaaibHncgKcgLaYuaYvcgMcgNcgNcgNcgOcgNcgPcigcgNcgNcgNcgNcgRcgScgTcgUcgVcgWcgVcgVcgVcgVcgVcgVcgVcgVcgVcgXcgYcgYcgYcgYcgYcgYcgYcgYcgYcgYcgYcgYcgYcgZbYcaafaafbZGcfBcfCchacfHcfHcfHcfHcfHcfHcfHchbchcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafbYkchdchechfchgchhchichjcbkchkchlbYkchmchnchochnchpchqchrchschschschschschschschtchschschschschschschschschschschschschuchvchschschwchxchychzchAchBcdsaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaWEchCaZhbbicascascascaschDchEchFchGchHchIchJchKchLchMchNchOchPchQchRchScascascascaschTcffchUchVbVibVichWchXchXchXchXchXchXchXchXchXchXchXchXchYbVichWcgJaaiaaiaaibplchZciacibciaciccidcidciecidcidcifdHCcidcidcidciecidcihciibYcbYcbYcbYcbYcbYcbYcbYcbYcbYccijcikcilcimbYcbYcbYcbYcbYcbYcbYcbYcbYcbYcbYcbYcbYcbYcaafaafbZGcfBcfCcinciocipciqcirciscitciuceicivaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafciwciwbYkbYkcixciycizcfOciAciBciBciCbYkbYkciDchnciEchnciFciGciHciIbYnbYnbYnciJciKciLciMciLciNciObYnbYnbYnbYnbYnbYnbYnbYnbYnciPciQciLciLciRciSciTcdscdscdscdsaaiaaiciUciUciUciUciUciUciUaaiaaiaaiaaiaaiaaiaaiaWAchCaZhbbiciVaaiaaicascascasciWciXciYciZciYciYcjaciYciZciYciXcjbcascascasaaiaaicjccjdcjecjfchVaafaafaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaibtIaPQaPQcjgcjhbZqcjicjjcjjcjjcjkcjlcjmcjjcjjcjnbZqcjocjobZqbYcaafaafaafaafaafaafaafaafbYcbYcbYccilcfzbYcaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbZGcjpceiceiceiceiceiceicekceiceicivaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafciwciwcjqcjrciwbUfcjsbUdcjtbUfcjsbUdbYkchncjucjvchncjwchncjxcjycjzciGaafaafcjAcjAcjAcjAcjBcjAcjAcjAcjAaafaafaafaafaafaafaafbYnbYnciQcjCbYncjDcjEbYnaafaaiaaiaaiaaiciUciUcjFcjGcjHcjIcjJciUciUaaiaaiaaiaaiaaiaXOaXOcjKbiJcakaXOaXOaaiaaiaaicjLaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaicjLaaiaaiaaichVchVcjMcffcfgchVchVaafaafaafaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaichVchVcjNcjNcjOchVchVaaiaaiaaiaaicjPcjQcjPaaiaaiaaibZqcjRcjRbZqaafaafaafaafaafaafaafaafaafaafaafbYccilcimbYcaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbZGbZGbZGbZGbZGbZGbZGbZGbZGbZGbZGbZGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafciwciwcjqcjrciwbUfcjsbUdcjtbUfcjsbUdbYkchncjucjvchncjwchncjxcjycjzciGaafaafcjAcjAcjAcjAcjBcjAcjAcjAcjAaafaafaafaafaafaafaafbYnbYnciQcjCbYncjDcjEbYnaafaaiaaiaaiaaiciUciUcjFcjGcjHcjIbXVciUciUaaiaaiaaiaaiaaiaXOaXOcjKbiJcakaXOaXOaaiaaiaaicjLaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaicjLaaiaaiaaichVchVcjMcffcfgchVchVaafaafaafaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaichVchVcjNcjNcjOchVchVaaiaaiaaiaaicjPcjQcjPaaiaaiaaibZqcjRcjRbZqaafaafaafaafaafaafaafaafaafaafaafbYccilcimbYcaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbZGbZGbZGbZGbZGbZGbZGbZGbZGbZGbZGbZGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafciwciwcjScjTcjUcjVcjWcjXcjYcjZckackbckcckdckeckfckgchnckhchnckickjckkciGaafaafcjAcklckmcknckockpckqcklcjAaafaafaafaafaafaafaafaafbYnciQbYnbYnbYnbYnbYnaaiaaickrcksckscktckuckvckvckvckvckvckvciUaaiaaiaaiaaiaXOaXOckwchCaZhbbibBTaXOckxckyckzchVckxckyckyckyckyckyckyckyckyckyckyckzchVckxckyckzchVckAckBckCcfgckDchVchVchVchVchVckxckyckyckyckyckyckyckyckyckyckyckEchVckxckyckEchVckFcfgcfgckGckHchVchVaaickIckIckIckJckIckIckIaafbZqcjRckKbZqaafaafaafaafaafaafaafaafaafaafaafbYccilcsWbYcaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaiaaiaaiaaiaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafciwckMcjTcjUckNckOckPckQckRckSchkckTckUckVckVckWckXckYcjwchnckZclaclbciGaafaafcjAclccldcldcleclfclgclhcjAaafaafaafaafaafaafaafaafbYnciQbYnaafaafaafaafaaiaaiclicljclkcllclmclncloclpclqclrclsciUaaiaaiaaiaaiaVFbeGbbicltcluclvclvclwclxclxclxclyclxclxclxclzclAcfgcfgcfgclBclCclDclEclFclEclEclEclGclHclIclJclEclEclGclEclKclEclLclEclEclMclEclEclEclEclEclNclEclOclEclPclEclMclEclGclEclQclQclRclSclTclUaaickIclVclWclXclYclZckIaafbZqcjRcmabZqaafaafaafaafaafaafaafaafaafaafaafbYccilcmbbYcaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaiaaiaaiaaiaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafciwcmccjUcjUcmdcmecmfbYkbYkcmgbYkbYkchncmhckVcmicmjcmkcmlchnciGciGciGciGaafaafcjAcmmcldcklcmncklcldcmocjAcmpcmpcmpcmpaafaafaafbYnbYnciQbYncmqcmqcmqcmqaaiaaicmrcmscmtcmucmvcmvcmwcmxcmycmvcmzciUaaiaaiaaiaaiaWEbfLbbichCcmAbbibbicmBcfgcfgcfgcfgcmCcmDcmDcmDcmEcmFcmFcmFcmGcmFcmHcmFcmIcmFcmFcmJcmKcmLcmMcmNcmFcmFcmKcmOcmFcmFcmPcmFcmFcmFcmQcmFcmFcmFcmFcmIcmFcmFcmFcmGcmFcmFcmFcmKcmRcmDcmScmTcmUcmVcmWaaickIclWclWcmXclWcmYckIaafbZqcmZcjRbZqaafaafaafaafaafaafaafaafaafaafaafbYccilcnabYcaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaiaaiaaiaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10205,7 +10200,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadyLdy aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadyLdyLdyLdyLdyLdyLdyLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaidEhdBsdEidEidEjdBsdAjdDbdDGdEkdEldEmdEndEodEodEpdEqdErdEsdEtdEudEvdEwdExdEydEzdAjdEAdCsdDedDfdCsdEBaclaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaadiYdECdEDdEEdiYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadjfdEFdEGdEHdjfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadjldEIdEJdEKdjlaaaaaaaaadwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdELdEMdENdEOdEPdjraaiaaiaaidEQdJtdESaaadETdJFdEVaaiaaiaaiaaiaaiaaiabxabxdEWdEXdEWaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduCduCduCduCduCduCduCduCduCduCduCduCduCduCduCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadyLdyLdyLdyLdyLdyLdyLdyLdyLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEYaaaaaadEYaaaaaaaaadEYaaaaaaaaaaaaaaadEYaaaaaaaaadEYaaaaaadEYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaidtIdJidJhdEZdJhdJidAjdDbdDGdFadFbdFcdDbdDbdDbdFddFedFfdFgdFgdFhdFidFjdFkdFldFmdFndFodCtdDgdDddCtdDeaclaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkkdFpdDldFqdkkaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadncdFrdDodFsdncaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnhdFtdDvdFudnhaaaaaaaaadwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdFvdFwdFxdFydFzdnlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaiaaaaaaaaaaaeaaeaaadEWdFAdEWaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduCduCduCduCduCduCduCduCduCduCduCduCduCduCduCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEYdEYdEYdEYaaaaaaaaadEYdEYdEYdEYdEYdEYdEYaaaaaaaaadEYdEYdEYdEYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadFBdtIdEhabxdEhdtIdAjdFCdDGdFDdFEdFFdDbdFGdFHdFIdFJdFKdFLdFMdFNdFOdFPdFQdFRdFSdFTdFodCsdDedDfdCsdEBaclaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadFUdlhdFVdFWdkpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkqdFXdFYdrUdFZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadGadqWdGbdGcdkvaaaaaaaaadwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdqXdqYdGddqYdqYdGeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaadGfdGgdGfaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduCduCduCduCduCduCduCduCduCduCduCduCduCduCduCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEYdEYdEYdEYaaaaaadEYdEYdEYdEYdEYdEYdEYdEYdEYaaaaaadEYdEYdEYdEYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaidGhaaiaaidAjdGidFadGjdGkdGldDbdGmdAjdGndGodGpdAjdGqdGrdGsdGtdGudGvdGwdAjdCrdCsdDgdDddCsdCuaclaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadGxdGxdGxdGxaaaaaaaaaaaadGxdGxdGxdGxdGxaaaaaaaaaaaaaaaaaadGydGydGydGydGydGydGydGydGydGydGydGyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaeaaeaaaaaaaaaaaadGzaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaduCduCduCduCduCduCduCduCduCduCduCduCduCduCduCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEYdEYdEYdEYaaaaaadEYdEYdEYdEYdEYdEYdEYdEYdEYaaaaaadEYdEYdEYdEYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaidGhaaiaaidAjdGidFadGjdGkdGldDbdGmdAjdGndGodGpdAjdGqdGrdGsdGtdGudGvdGwdAjdCrdCsdDgdDddCsdCuaclaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadGxdGxdGxdGxaaaaaaaaaaaadGxdGxdGxdGxdGxaaaaaaaaaaaaaaaaaadGydGydGydGydGydGydGydGydGydGydGydGydGyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaeaaeaaaaaaaaaaaadGzaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaduCduCduCduCduCduCduCduCduCduCduCduCduCduCduCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEYdEYdEYdEYaaaaaadEYdEYdEYdEYdEYdEYdEYdEYdEYaaaaaadEYdEYdEYdEYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclaaaaaidAjdGAdDbdGBdGCdGCdDbdGDdGEdGFdGGdGHdGEdGIdGJdFidFjdGKdGLdGMdAjdDddCtdDedDfdCtdDgaclaaaaaaaaaaaaaaaaaaaaaaaadGxdGxdGxdGxdGxdGxdGxdGxdGxdGxaaaaaaaaaaaaaaadGxdGxdGxdGxdGxdGxaaaaaadGxdGxdGxdGxdGxdGxaaaaaaaaaaaaaaadGydGydGydGydGydGydGydGydGydGydGydGydGydGydGyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaadGNaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaduCduCduCduCduCduCduCduCduCduCduCduCduCduCduCduCduCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclaaaaaadAjdDbdDbdFEdGOdGOdDbdGDdGPdGQdGRdGSdGPdGIdGDdFOdGTdFQdGUdGVdAjdCrdCsdDgdDddCsdCuaclaaaaaaaaaaaaaaaaaaaaadGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxaaaaaaaaadGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxaaaaaaaaaaaadGydGydGydGydGydGydGydGydGydGydGydGydGydGydGydGydGyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclaclacldAmaaeaaeaaeaaedGNaaeaaeaaeaaeaaeaazaclaclaaaaaaaaaaaaaaaaaaduCduCduCduCduCduCduCduCduCduCduCduCduCduCduCduCduCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclaaaaaadAjdAjdDbdGWdGkdGkdGXdGDdGYdGZdHadHbdGYdHcdHddHedHfdHgdHhdAjdAjdEAdCsdDedDfdCsdEBaclaaaaaaaaaaaaaaaaaaaaadGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxaaaaaaaaadGydGydGydGydGydGydGydGydGydGydGydGydGydGydGydGydGydGyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAdwAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclaaaaaeaaaaaeaaaaaaaaadGNaaaaaeaaeaaaaaaaaaaaaaclaaaaaaaaaaaaaaaaaaduCduCduCduCduCduCduCduCduCduCduCduCduCduCduCduCduCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10219,7 +10214,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadyLdyLdyLdyLdyLdyLdy aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclaclaaaaaeaaaaaaaaeaaaaclaaaaaaaaaacldEAdDgdEAdEBdDddEBdEAdDgdEAdEBdEAdEBdEAdEBaclaaadGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxaaaaaaaaaaaaaaadGydGydGydGydGydGydGydGydGydGydGydGydGydGydGydGydGydGyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadwAdwAdwAdwAdwAaaadwAdwAdwAdwAdwAaaadwAdwAdwAdwAdwAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAmaaaaaeaaaaaeaaaaaeaaadGNaaaaaeaaaaaeaaeaaeaaeaclaaaaaaaaaaaaaaaaaaduCduCduCduCduCaaaaaaaaaaaaaaaaaaaaaduCduCduCduCduCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclaclaclaclaclaclaaeaclaaaaaaaaadAmaclaclaclaclaaeaclaclaclaclaclacldAmaclaclaclaaaaaadGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxaaaaaaaaaaaaaaaaaadGydGydGydGydGydGydGydGydGydGydGydGydGydGydGydGydGyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadwAdwAdwAdwAdwAaaadwAdwAdwAdwAdwAaaadwAdwAdwAdwAdwAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclaaadHmdHmdHmdHmdHmaaedGNaaedHmdHmdHmdHmdHmaaeaclaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLdyLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxaaaaaaaaaaaaaaaaaadGydGydGydGydGydGydGydGydGydGydGydGydGydGydGyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadwAdwAdwAdwAdwAaaaaaaaaaaaaaaaaaaaaadwAdwAdwAdwAdwAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclaaedHpdHqdHqdHqdHqdHrdHsdHrdHtdHtdHtdHtdHuaaeaclaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadyLdyLdyLdyLdyLaaadyLdyLdyLdyLdyLaaadyLdyLdyLdyLdyLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxaaaaaaaaaaaaaaaaaadGydGydGydGydGydGydGydGydGydGydGydGyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclaaedHxdHxdHxdHxdHxaaadGNaaedHxdHxdHxdHxdHxaaaaclaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadyLdyLdyLdyLdyLaaadyLdyLdyLdyLdyLaaadyLdyLdyLdyLdyLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYdEYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxaaaaaaaaaaaaaaaaaadGydGydGydGydGydGydGydGydGydGydGydGydGyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclaaedHxdHxdHxdHxdHxaaadGNaaedHxdHxdHxdHxdHxaaaaclaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadyLdyLdyLdyLdyLaaadyLdyLdyLdyLdyLaaadyLdyLdyLdyLdyLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEYdEYdEYdEYdEYdEYdEYdEYdEYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAmaaaaaeaaaaaeaaaaaeaaadGNaaaaaeaaaaaeaaeaaeaaeaclaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadyLdyLdyLdyLdyLaaaaaaaaaaaaaaaaaaaaadyLdyLdyLdyLdyLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEYdEYdEYdEYdEYdEYdEYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclaaadHmdHmdHmdHmdHmaaedGNaaedHmdHmdHmdHmdHmaaeaclaaadHzaaaaaadHzaaaaaaaaadHzaaaaaaaaaaaaaaadHzaaaaaaaaadHzaaaaaadHzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxaaaaaaaaadGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxdGxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclaaedHpdHqdHqdHqdHqdHrdHsdHrdHtdHtdHtdHtdHuaaeaclaaadHzdHzdHzdHzaaaaaaaaadHzdHzdHzdHzdHzdHzdHzaaaaaaaaadHzdHzdHzdHzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/virgo-2.dmm b/maps/virgo-2.dmm index f4365b69ce..4763bdbae8 100644 --- a/maps/virgo-2.dmm +++ b/maps/virgo-2.dmm @@ -1359,8 +1359,8 @@ "aAg" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Brig"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "aAh" = (/obj/machinery/door/window{base_state = "left"; dir = 8; icon_state = "left"; name = "Preparation"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "aAi" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/syndicate{pixel_x = -1; pixel_y = 3},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"aAj" = (/obj/machinery/dna_scannernew,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) -"aAk" = (/obj/machinery/computer/cloning,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) +"aAj" = (/obj/machinery/transhuman/synthprinter,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) +"aAk" = (/obj/machinery/computer/transhuman/resleeving,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) "aAl" = (/obj/machinery/door/window/brigdoor/southright,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/command) "aAm" = (/obj/machinery/door/window/brigdoor/southleft,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/command) "aAn" = (/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/command) @@ -2134,9 +2134,9 @@ "aPb" = (/obj/effect/floor_decal/corner/pink/full{dir = 1},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) "aPc" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 0; pixel_y = 0},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) "aPd" = (/obj/structure/closet/l3closet/virology,/obj/item/clothing/mask/gas,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"aPe" = (/obj/machinery/clonepod,/obj/effect/floor_decal/corner/blue/full,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"aPf" = (/obj/machinery/computer/cloning,/obj/effect/floor_decal/corner/blue{dir = 10},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"aPg" = (/obj/machinery/dna_scannernew,/obj/effect/floor_decal/corner/blue{dir = 10},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"aPe" = (/obj/machinery/light{dir = 1},/obj/machinery/clonepod/transhuman,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) +"aPf" = (/obj/machinery/transhuman/resleever,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) +"aPg" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) "aPh" = (/obj/structure/closet/wardrobe/white,/obj/effect/floor_decal/corner/blue{dir = 10},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) "aPi" = (/obj/structure/table/standard,/obj/item/weapon/book/manual/medical_cloning,/obj/effect/floor_decal/corner/blue{dir = 10},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) "aPj" = (/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/storage/box/bodybags,/obj/structure/table/standard,/obj/effect/floor_decal/corner/blue{dir = 10},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) @@ -2766,8 +2766,8 @@ "bbj" = (/obj/machinery/light,/turf/simulated/floor/wood,/area/shuttle/administration/centcom) "bbk" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/bed/chair/comfy/black{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "bbl" = (/obj/machinery/door/window/brigdoor/westleft,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) -"bbm" = (/obj/machinery/light{dir = 1},/obj/machinery/bodyscanner{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) -"bbn" = (/obj/machinery/clonepod{biomass = 900},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) +"bbm" = (/obj/machinery/bodyscanner{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) +"bbn" = (/obj/effect/floor_decal/corner/blue{dir = 10},/obj/machinery/clonepod/transhuman,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) "bbo" = (/obj/machinery/body_scanconsole,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) "bbp" = (/obj/machinery/computer/shuttle_control/multi/admin,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "bbq" = (/obj/structure/closet/medical_wall{pixel_x = 31},/obj/item/weapon/storage/firstaid/combat,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) @@ -2792,7 +2792,7 @@ "bbJ" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "bbK" = (/obj/structure/bed/double/padded,/obj/item/weapon/bedsheet/captaindouble,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "bbL" = (/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/command) -"bbM" = (/obj/machinery/door/airlock/centcom{name = "Private"; opacity = 1; req_access = list(105)},/turf/unsimulated/wall,/area/centcom/command) +"bbM" = (/obj/machinery/door/airlock/centcom{name = "Private"; opacity = 1; req_access = list(105)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) "bbN" = (/obj/structure/bed/roller,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/command) "bbO" = (/obj/structure/bed,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/command) "bbP" = (/obj/item/weapon/gun/energy/sizegun,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/command) @@ -2846,6 +2846,8 @@ "bcL" = (/turf/simulated/shuttle/wall{dir = 10; icon_state = "wall3_wall"; tag = "icon-swall (NORTHWEST)"},/area/shuttle/administration/centcom) "bcM" = (/turf/simulated/shuttle/wall{tag = "icon-gwall_floor (WEST)"; icon_state = "gwall_floor"; dir = 8},/area/shuttle/administration/centcom) "bcN" = (/turf/simulated/shuttle/wall{dir = 2; icon_state = "wall3_t"},/area/shuttle/administration/centcom) +"bcO" = (/obj/effect/floor_decal/corner/blue/full,/obj/machinery/computer/transhuman/resleeving,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"bcP" = (/obj/effect/floor_decal/corner/blue{dir = 10},/obj/machinery/transhuman/resleever,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) (1,1,1) = {" aaaaabaacaadaaeaafaagaahaaaaaiaajaakaalaamaanaaoaagaafaajaacaadaahaakaaeaamaaiaaoaalaahaajaapaaqaaraasaataauaavaawaaxaayaaaaabaacaadaaeaafaagaahaaaaaiaajaakaalaamaanaaoaagaafaajaacaadaahaakaazaaAaaBaaCaaDaaEaaFaaGaaHaaIaaJaaKaaLaaMaaNaaOaaAaaBaaCaaDaaEaaFaaGaaHaaIaaJaazaaAaaBaaCaaDaaEaaFaaGaaHaaIaaJaaKaaLaaMaaNaaOaaAaaBaaCaaDaaEaaFaaGaaHaaIaaJaazaaAaaBaaCaaDaaEaaFaaGaaHaaIaaJaaKaaLaaMaaNaaOaaAaaBaaCaaDaaEaaFaaGaaHaaIaaJaazaaPaaPaaQaaQaaQaaQaaQaaQaaQaaQaaQaaQaaQaaQaaQaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaRaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaRaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaRaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaRaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaRaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaRaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaRaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaR @@ -2853,7 +2855,7 @@ aajaaTaaUaaVaaWaaXaaYaaZabaabbabcabdabeabfabgabhaaYaaXabcaaUaaVaaZabdaaWabfabbab aamaaWabbabeaaZabgaaUaaYabcaaXabfabaabhaaVabdaaTaaUabgabfabbabeaaYabaaaZaaVaaXaaTabhaaYabfaaeaaraasaataauaavaawabiabNabhabgaaVaaYabfaaXaaTabhabgaaVaaYabfaaXaaTaaTabhabgaaVaaYabfaaXaaTaaTabNaazaaBabkablabqabnaboabpaaqaaraasaasaataauaavabiabjabkablabqabnaboabpaaqaaraaKaazaaBabkablabqabnaboabpaaqaaraasaasaataauaavabiabjabkablabqabnaboabpaaqaaraaKaazaaBabkablabqabnaboabpaaqaaraasaasaataauaavabiabjabkablabqabnaboabpaaqaaraaKaazaaPaaPaaQaaQaaQaaQaaQaaQaaQaaQaaQaaQaaQaaQaaQaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPabtabuabuabuabuabuabuabuabuabOabuabwabPabQabPabQabPabQabPabQabPabQabwabRabRabRabRabRabRabRabRabRabRabwabBabSabTabTabTabTabTabTabTabTabwabEabUabEabEabEabEabEabEabUabEabwabFabFabFabFabFabFabFabFabFabFabwabGabHabIabVabWabWabWabWabWabXabM aadaaZaaXabhaaYabdabbaaUabfaaUaaVabcaaTabeabaaaWabbabdaaVaaXabhaaUabcaaYabeabgaaWaaTaaUaaVaahabiabjabkablabqabnaboabYaaTabdabeaaUaaVabgaaWaaTabdabeaaUaaVabgaaWaaWaaTabdabeaaUaaVabgaaWaaWabYaazaaHaaqaaraasaauaauaavaawabiabjaawabiabjabkaboabpaataaraasaataauaavaawabiaaBaazaaHaaqaaraasaauaauaavaawabiabjaawabiabjabkaboabpaataaraasaataauaavaawabiaaBaazaaHaaqaaraasaauaauaavaawabiabjaawabiabjabkaboabpaataaraasaataauaavaawabiaaBaazaaPaaPaaQabrabsaaQabrabsaaQabrabsaaQabrabsaaQaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPabtabuabOabuabuabuabuabuabuabuabuabwabQabPabZacaacbacaacbaccabQabPabwabRabRabRabRabRabRabRabRabRabRabwabBacdabTabDaceabDabTacfacgachabwabEabEabEabEabEabEabEabEabEabEabwabFabFabFabFabFabFabFabFabFabFabwabGabGaciabVabWabWabWabWabWabXabM aalaaYabgaaTaaUabaaaXabbaaVabbabeabfaaWabhabcaaZaaXabaabeabgaaTabbabfaaUabhabdaaZaaWabbabeaagaboabpaaqaaraasaataauacjabfaaUabaaaTabdaaYaaVabfaaUabaaaTabdaaYaaVaaVaaWaaUabaaaTabdaaYaaVaaVacjaazaaNaawabiabjabkablabqabnaboabpaataauaavaawaauaavaawabiabjabkablabqabnaboaaHaazaaNaawabiabjabkaaDaaEaaFaaGaaHaaLaaMaaNaaOaaMaaNaaOaaAaaBabkablabqabnaboaaHaazaaNaawabiabjabkablabqabnaboabpaataauaavaawaauaavaawabiabjabkablabqabnaboaaHaazaaPaaPaaQaaQaaQaaQaaQaaQaaQaaQaaQaaQaaQaaQaaQaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPabtabuabuabuabuabuabvabuabuabuabuabwabQabPackaclacmacmacnacoacbacaabwacpacpacpacpacpacpacpacpacpacqabwabBacdacracsactacuacvacwacxacyabwabEabEabEabUabEabEabUabEabEabEabwabFabFabFabFabFabFabFabFabFabFabwabGabHabIabVabWabWabWabWabWabXabM -aaoaaUabdaaWabbabcabgaaXabeaaXabhaczacAacBacCabYacDacEacFacGaaWaaXaaVabbaaTabaaaYaaZaaXabhaacabiabjabkablabqabnaboacHabeaaXabfaaZabcabbabhaaVabbabcaaWabaaaUabeabeaaVabbabcaaWabaaaUabeabeacHaazaaHaaqaaraasaataauaavaawabiabjabkablabqabnaboabpaaqaaraasaataauaavaawabiaaBaazaaHaaqaaraasaaLaaMawHaxLaxIaxZaxYaybayaayeaycayrayfaysaaKaaLaaMaavaawabiaaBaazaaHaaqaaraasaataauaavaawabiabjabkablabqabnaboabpaaqaaraasaataauaavaawabiaaBaazaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPabtabuabuabvabuabuabuabvabuabuabuabwabPabQacIacnacJacJacnacnacnacnabwacKacKacLacMacMacMacMacNacKacOabwabBacdacPacQacQacQacRacwacSacTabwabEabEabEabEabEabEabEabEabEabEabwabFabFabFabFabFabFabFabFabFabFabwabGabHabIabVabWabWabWabWabWabXabM +aaoaaUabdaaWabbabcabgaaXabeaaXabhaczacAacBacCabYacDacEacFacGaaWaaXaaVabbaaTabaaaYaaZaaXabhaacabiabjabkablabqabnaboacHabeaaXabfaaZabcabbabhaaVabbabcaaWabaaaUabeabeaaVabbabcaaWabaaaUabeabeacHaazaaHaaqaaraasaataauaavaawabiabjabkablabqabnaboabpaaqaaraasaataauaavaawabiaaBaazaaHaaqaaraasaaLaaMawHaxLaxIaxZaxYaybayaayeaycayrayfaysaytaaLaaMaavaawabiaaBaazaaHaaqaaraasaataauaavaawabiabjabkablabqabnaboabpaaqaaraasaataauaavaawabiaaBaazaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPabtabuabuabvabuabuabuabvabuabuabuabwabPabQacIacnacJacJacnacnacnacnabwacKacKacLacMacMacMacMacNacKacOabwabBacdacPacQacQacQacRacwacSacTabwabEabEabEabEabEabEabEabEabEabEabwabFabFabFabFabFabFabFabFabFabFabwabGabHabIabVabWabWabWabWabWabXabM aababbabaaaZaaXabfabdabgabhabgacCacUacVacVacVacVacVacVacVacFacEaaWabeaaXaaWabcaaUaaYabgaaTaaiaasaataauaavaawabiabjabmabhabgaaVaaYabfaaXaaTabeaaXabfaaZabcabbabhabhabeaaXabfaaZabcabbabhabhabmaazaaCablabqabnaboacWacXacXacYacZacWacXacYacWacXacYacYacYabnaboabpaaqaaraasaaLaazaaCablabqaaFaaGayfaysaysaytayJayfaysaytayfaysaytaytaytayeaycaaHaaIaaraasaaLaazaaCablabqabnaboaaqaaraaraasaataaqaaraasaaqaaraasaasaasabnaboabpaaqaaraasaaLaazaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPabtabuabuabuabuabuabuabuabuabuabuabwabPabQacIacnacJacJacnacnacnacnabwacKacKadaadbadbadbadbadcacKacOabwabBacdaddadeadfadeadgacwacSacTabwabEabEabEabEabEabEabEabEabEabEabwabFabFabFabFabFabFabFabFabFabFabwabGabHabIadhabWabWabWabWabWadiabM aaeaaXabcaaYabgaaVabaabdaaTadjadkacVacVacVacVacVacVacVacVacVacDadlabhabgaaZabfabbaaUabdaaWaafabqabnaboabpaaqaaraasabNaaTabdabeaaUaaVabgaaWaaWabeaaXabfaaZabcabbabhabhaaXabfaaZabcabbabhabhabNaazaaLaauaavaawabiadmadnadnadoadpadqadradsadtaduadvadvacYadmabiabjabkablabqaaFaazaaLaauaaNaaOaxIayaayJayJayKawHaxLaxIaxZaxYaybayaayaaytayaaxIaxZaaCablabqaaFaazaaLaauaavaawabiabqaataataauaavaawabiabjabkablabqabqaasabqabiabjabkablabqaaFaazaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPabtabuabuabuabuabuabOabuabuabuabvabwabQabPackaclacmacmacnadwadxadyabwacKacKadaadbadbadbadbadcacKacOabwabBacdadzadAadfadAadBacwacSacTabwabEabEabEabUabEabEabUabEabEabEabwabFabFabFabFabFabFabFabFabFabFabwabGabHabIadhabWabWabWabWabWadiabM aahabgabfaaUabdabeabcabaaaWaczacVacVacVacVacVacVacVacVacVacVacVabmaaTabdaaYaaVaaXabbabaaaZaanabpaaqaaraasaataauaavabYabfaaUabaaaTabdaaYaaVadCadDadEadFadGadHadIadJadKabgaaVaaYabfaaXaaTaaTabYaazaaOabiabjabkabladLadMadMadNadOadOadnadoadpadradsadsadsadmablabqabnaboabpaaIaazaaOabiaaBaxYaybaxLayfayfaysaytaytayJayKawHaxIaxZaxZaxZayaaybayaaaFaboabpaaIaazaaOabiabjabkablaawaaIaaIaaJaaKaaKaataauaavabiabjabjabjabqablabqabnaboabpaaIaazaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPabtabuabuabOabuabuabuabuabuabuabuabwabQabPadPadyadxadyadxadQabQabPabwacKacKadaadbadbadbadbadcacKacOabwabBadRadSadfadfadfadTacwacSacTabwabEabEabEabEabEabEabEabEabEabEabwabFabFabFabFabFabFabFabFabFabFabwabGabGadUadhabWabWabWabWabWadiabM @@ -2867,7 +2869,7 @@ aaaabhaaYabfaaTabbaaZaaWafJacVacVacVacVacVacVacVacVacVacVacVacVacVacDaaTabcaaUab aajaaTaaUaaVaaWaaXaaYaaZaczacVacVacVacVacVacVacVacVacVacVacVacVacVacGaaWabfabbabhabhaaYabfaaeaawabiabjabkablabqabnabmabcaaYabdabhabgaaZagdaepageaeFaeEaenaemaeCaeFaenagdaaYabdabhabgaaZabfabmaazaaGabpaaqaaradLagfagfagfaggaghaghafLafMafNafPafQafQadmaaraasaataauaavaawaaAaazaaGabpaaIaysaxLayfayfayfaysaytaytayJayKawHaxIaxZaxZayaaysaytayJaaMaavaawaaAaazaaGabpaaqaaraawaaIaaIbclbckbcmaaKaaLaaMaaNaaAaaBaaBabqaaraasaataauaavaawaaAaazaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPabtaePaePaePaePaePaePaePaePaePaePabwaeQaeQaeQagiaeQaeQaeQaeQagiaeQabwagjagkaglaglaglaglaglagmafVafWabwaeTaeUaeVagnagoagoagpagoagoagqabwafaafaafaafaafaafaafaagrafaafaabwafbafcafdagsagtagtagtagtagtaguabwafiafzafYagvagwagxagyagcafzafiabM aamaaWabbabeaaZabgaaUaaYacUacVacVacVacVacVacVacVacVacVacVacVacVacVaaxaaZaaVaaXaaTaaTaaUaaVaahabqabnaboabpaaqaaraasabNabfaaUabaaaTabdaaYagzaeCaeDaebaeaaeFageadYaebaeFagzaaUabaaaTabdaaYaaVabNaazaaLaauaavaawadmafOafOafOafPafQafOafPafQafRagAagBagBaeeaawabiabjabkablabqaaFaazaaLaauaaNaaOayaaxLaxLaxLaxIaxZaxLaxIaxZaxYaycayrayraysaxLaxIaxZaaCablabqaaFaazaaLaauaavaawabqaawaaOaaOaaAaaBaaOabiabjabkaboabpabpaaraawabiabjabkablabqaaFaazaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPabtaePaePaePaePaePaePaePaePaePaePabwaeQaeQaeQaeQaeQaeQaeQaeQaeQaeQabwagjagCagDagDagDagDagDagEafVafWabwaeTaeUaeVagFagGagGagGagGagGagHabwafaafaafaafaafaafaafaafaafaafaabwafbafcafdagIagJagJagJagJagJagKabwafiafzafYagvagLagMagyagcafzafiabM aadaaZaaXabhaaYabdabbaaUacCacVacVacVacVacVacVacVacVacVacVacVacVacVacEaaYabeabgaaWaaWabbabeaagaasaataauaavaawabiabjabYaaVabbabcaaWabaaaUadHadCadDadEadFadGadHadIadJadKadHabbabcaaWabaaaUabeabYaazaaCablabqabnaeqagNagNagNagAagBafLafMafNafOafMafNafNaesabnaboabpaaqaaraasaaLaazaaCablabqaaFaaGayeayeayeaycayrayJayKawHaxLayKawHawHayJayeaycaaHaaIaaraasaaLaazaaCablabqabnaboabnabnabnaboabpaataauaavaawaauaavaavaatabnaboabpaaqaaraasaaLaazaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPabtaePaePaePafnaePaePaePaePafnaePabwaeQaeQaeQaeQafoaeQafUaeQaeQafoabwafVagCagDagDagDagDagDagEafVafWabwaeTaeUaeVagOaftaftaftaftaftagPabwafaafaafaafaafaafaafaafaafaafaabwafbafcafdagQafxafxafxafxafxagRabwafiafzafYagbagSagSagTagcafzafiabM -aalaaYabgaaTaaUabaaaXabbadkacVacVacVacVacVacVacVacVacVacVacVacVacVaeLaaUabhabdaaZaaZaaXabhaacabkablabqabnaboabpaaqacjabeaaXabfaaZabcabbabhabhabeaaXabfaaZabcabbabhabeabeaaXabfaaZabcabbabhacjaazaaJaasaataauaeGaeNafOafOafPafQafRafSafTagNagAagBagBaeHaauaavaawabiabjabkaaDaazaaJaasaataauaaAaaFaxLaxLaxIaxZaxYaybayaayeaycayrayrayeaaMaaNaaOabiabjabkaaDaazaaJaasaataauabiabnaawaawabiabjabkablabqabnaboabpabpabnaauaavaawabiabjabkaaDaazaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPabtaePaePaePaePaePaePaePaePaePaePabwagUaeQaeQaeQaeQagUaeQaeQaeQaeQabwafVagCagDagDagDagDagDagVafVafWabwaeTaeTagWagOaftagXagXagXaftagPabwagYagYagYagYagYagYagYagYagYagYabwafbafbagZagQafxafxafxafxafxagRabwafiafiafiahaahaahaahbafiafiafiabM +aalaaYabgaaTaaUabaaaXabbadkacVacVacVacVacVacVacVacVacVacVacVacVacVaeLaaUabhabdaaZaaZaaXabhaacabkablabqabnaboabpaaqacjabeaaXabfaaZabcabbabhabhabeaaXabfaaZabcabbabhabeabeaaXabfaaZabcabbabhacjaazaaJaasaataauaeGaeNafOafOafPafQafRafSafTagNagAagBagBaeHaauaavaawabiabjabkaaDaazaaJaasaataauaaAaaFaxLaxLaxIaxZaxYaybayaayeaycayrayrayeayKaaNaaOabiabjabkaaDaazaaJaasaataauabiabnaawaawabiabjabkablabqabnaboabpabpabnaauaavaawabiabjabkaaDaazaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPabtaePaePaePaePaePaePaePaePaePaePabwagUaeQaeQaeQaeQagUaeQaeQaeQaeQabwafVagCagDagDagDagDagDagVafVafWabwaeTaeTagWagOaftagXagXagXaftagPabwagYagYagYagYagYagYagYagYagYagYabwafbafbagZagQafxafxafxafxafxagRabwafiafiafiahaahaahaahbafiafiafiabM aaoaaUabdaaWabbabcabgaaXaeKacVacVacVacVacVacVacVacVacVacVacVacVacVaflabbaaTabaaaYaaYabgaaTaaiaauaavaawabiabjabkablacHabhabgaaVaaYabfaaXaaTaaTabhabgaaVaaYabfaaXaaTabhabhabgaaVaaYabfaaXaaTacHaazaaEabnaboabpabqaeqaeqaeqaeOacWacXacYaeqaeOacWacXacXacYabpaaqaaraasaataauaaNaazaaEabnaboabpabqaaGaaGaaGaaHaaIaaJaaKaaGaaHaaIaaJaaJaaKaaHaaqaaraasaataauaaNaazaaEabnaboabpabqaboaboaboabpaaqaaraasaboabpaaqaaraaraasabpaaqaaraasaataauaaNaazaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPabtaePafnaePaePaePaePafnaePaePaePabwaeQagiaeQafUaeQaeQagiaeQafUaeQabwafVahcahdahdahdahdahdaheafVafWabwaeTaeUaeVagOaftagOaftagPaftagPabwahfahfahfahfahfahfahfahfahfahfabwafbafcafdagQafxafxafxafxafxagRabwafiafiafiafzafzafzafiafiafiafiabM aababbabaaaZaaXabfabdabgafkacVacVacVacVacVacVacVacVacVacVacVacVacVahgaaXaaWabcaaUaaUabdaaWaafabpaaqaaraasaataauaavabmaaTabdabeaaUaaVabgaaWaaWaaTabdabeaaUaaVabgaaWaaTaaTabdabeaaUaaVabgaaWabmaazaaOabiabjabkablabqabnaboabpaaqaaraasaataauaavaawabiabjabkablabqabnaboabpaaIaazaaOabiabjabkablabqabnaboabpaaqaaraasaataauaavaawabiabjabkablabqabnaboabpaaIaazaaOabiabjabkablabqabnaboabpaaqaaraasaataauaavaawabiabjabkablabqabnaboabpaaIaazaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPabtaePaePaePaePaePaePaePaePaePaePabwaeQaeQaeQaeQagUaeQaeQaeQaeQagUabwafVafVafVafVafVafVafVafVafVafWabwaeTaeUaeVahhagXahhahiahjagXahjabwahfahfahfahfahfahfahfahfahfahfabwafbafcafdahkahlahlahlahlahlahmabwafiafiafiafiafiafiafiafiahnahnabM aaeaaXabcaaYabgaaVabaabdacBacVacVacVacVacVacVacVacVacVacVacVacVacVacFabgaaZabfabbabbabaaaZaanabnaboabpaaqaaraasaatabNaaWabaabhabbabeabdaaZaaVabfaaUabaaaTabdaaYaaVabfaaWabaabhabbabeabdaaZabNaazaaMaavaawabiabjabkablabqabnaboabpaaqaaraasaataauaavaawabiabjabkablabqabnaaGaazaaMaavaawabiabjabkablabqabnaboabpaaqaaraasaataauaavaawabiabjabkablabqabnaaGaazaaMaavaawabiabjabkablabqabnaboabpaaqaaraasaataauaavaawabiabjabkablabqabnaaGaazaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaRahoahoahoahoahoahoahoahoahoahoaaRahoahoahoahoahoahoahoahoahoahoaaRahoahoahoahoahoahoahoahoahoahoaaRahoahoahoahoahoahoahoahoahoahoaaRahoahoahoahoahoahoahoahoahoahoaaRahoahoahoahoahoahoahoahoahoahoaaRahoahoahoahoahoahoahoahoahoahoaaR @@ -2961,9 +2963,9 @@ aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaa aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaParRaxXaxXarRaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAIaxkaAnazEbcxbbfbaXbaXbaXbaXayOayqayqbcybcqbcqbcqazVazVbcqbczaBgaxkawGazGazHayiazHazIawGaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaqAaqAaaPaaPaaPaaPavdazJavDavDazKavdazLazMavDavdazNazOazPazQavdaruaaParuaaPaaPaaPaaPaqAaqAalxalxalxalxalxalxalxaxDazRazRaxDalxalxalxalxaqAaqA aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaParmaxXaxXarmaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPawGaxkaAnbcBbcAbbibaXbaXbbjbaXbcrayqayqbbkazUazVbcCbbLbbLbbLbbLaxkaxkazWazWazWazWazWazWazWazWazWazWazWaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaqAaqAaaPaaPaaPaaPavdazXavDavDavDazYavDavDavDazZavDavDavDaAaavdashashashashaaPaaPaaPaaPaqAaqAaqAaqAaqAaqAaqAalxaAbaiRaiRaAbalxaqAaqAaqAaqAaqA aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaParmaxXaxXarmaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPawGaxkaAnaAMbcybcqbcqbcqbcqbcqbcDayNayqbblayqazVaBgaxkaxkaxkaxkaxkaxkazWaAdaAdaAdaAdaAdaAdaAdaAdaAdaAeaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaqAaqAaqAaaPaaPaaPaaPavdaAfavDavDavDaAgavDavDavDaAhavDavDavDaAiavdaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaqAaqAaqAaqAalxaAbaiRaiRaAbalxaqAaqAaqAaqAaqA -aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaParmaxXaxXarmaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPawGaxkaAnbcnbcEaAjaAkbbnbbmbbobcrayqayqbbkbbpazVbcFaAcaAcaAcaAcaxkaxkazWaAdaAoaApaApaApaApaApaAqaAdaAeaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaqAaqAaaPaaPaaPaaPauAavdavdavdavdavdavdavDavDavDavdavdavdavdavdavdauEaaPaaPaaPaaPaaPartaaParuaqAaqAaqAaqAaqAaqAalxaAbaiRaiRaAbalxaqAaqAaqAaqAaqA +aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaParmaxXaxXarmaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPawGaxkaAnbcnbcEaAkaAjaPfaPeaPgbcrayqayqbbkbbpazVbcFaAcaAcaAcaAcaxkaxkazWaAdaAoaApaApaApaApaApaAqaAdaAeaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaqAaqAaaPaaPaaPaaPauAavdavdavdavdavdavdavDavDavDavdavdavdavdavdavdauEaaPaaPaaPaaPaaPartaaParuaqAaqAaqAaqAaqAaqAalxaAbaiRaiRaAbalxaqAaqAaqAaqAaqA aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaParmaxXaxXarmaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPawGawGawGawGawGaxkaAnazfbcxaAraAraAraAraArayOayqayqbcGbcqbcqbcqazVazVbcqbcpaBgaxkazWaAdaAsaAtaAtaAtaAtaAtaAsaAdaAeaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaqAaqAaaPaaPaaPaaPavdaAuaAvaAwaAxaAyavdaAzavDaAAavdaABaACaACaADaAEavdaaPaaPaaPaaPaaPartaruaqAaqAaqAaqAaqAaqAaqAalxaAbaiRaiRaAbalxaqAaqAaqAaqAaqA -aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAFaAFaAFaAFaAFaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAFaAFaAFaAFaAFaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAFaAFaAFaAFaAFaAGaAGaAGaAGaAFaAFaAFaAFaAGaAHaAHaAGawGaAIaAIawGawGaAIaAIawGawGaAIaAIaAIaAIawGawGawGawGaAIaAIaAIaAIawGawGawGawGaAIaAIawGawGawGawGawGawGaAJaAJaAKawGaxkaAnazEbcHbcIaAraAraArbbqbcrayNayqayqayqbbrayqayqayqbbsbcraBgaxkazWaAdaAsaAOaAtaAtaAtaAPaAsaAdaAeaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaqAaaPaaPaaPaaPaaPaAQaARaARaARaARaARavdavDavDavDavdaASavDavDavDaATaAUaaPaaPaaPaaPaaPasqaaPaqAaqAaqAaqAaqAaqAaqAalxalxaAVaAWalxalxaqAaqAaqAaqAaqA +aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAFaAFaAFaAFaAFaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAFaAFaAFaAFaAFaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAFaAFaAFaAFaAFaAGaAGaAGaAGaAFaAFaAFaAFaAGaAHaAHaAGawGaAIaAIawGawGaAIaAIawGawGaAIaAIaAIaAIawGawGawGawGaAIaAIaAIaAIawGawGawGawGaAIaAIawGawGawGawGawGawGaAJaAJaAKawGaxkaAnazEbcHbcIaArbbmbbobbqbcrayNayqayqayqbbrayqayqayqbbsbcraBgaxkazWaAdaAsaAOaAtaAtaAtaAPaAsaAdaAeaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaqAaaPaaPaaPaaPaaPaAQaARaARaARaARaARavdavDavDavDavdaASavDavDavDaATaAUaaPaaPaaPaaPaaPasqaaPaqAaqAaqAaqAaqAaqAaqAalxalxaAVaAWalxalxaqAaqAaqAaqAaqA aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAFaAXaAYaAXaAFaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAFaAXaAXaAXaAFaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAFaAFaAZaBaaBaaBaaBaaBaaBaaBaaBaaBaaBaaBaaBaaBaaBaaBbaAIaAJaAJaAJaAJaAJaAJaAIaAJaAJaAJaAJaAJaAJaBcaAJaAJaAJaAJaAJaAJaAJaAJaBcaAJaAJaAJaBdaAJaAJaAJaAJaAJaAJaAJaAJaBeaxkaAnbcBbcJaALaArbbvbbubcKbcybbybbxbcobbxbbzbcLayqayqbbAbcraBgaxkazWaAdaAsaAtaAtaBkaBkaBkaBlaAdaAeaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaaPaaPaaPaaPaaPaaPaBmaBnaBoaARaARaARaBpavDavDavDaBqavDavDavDaBraBsaBtaaPaaPaaPaaPaaPartaruaruaqAaqAaqAaqAaqAaqAaqAalxalxalxalxaqAaqAaqAaqAaqAaqA aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaBuaAFaAFaAFaBuaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaBuaAFaAFaAFaBuaAGaAGaAGaAGaBuaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAFaBaaBaaBaaBaaBaaBaaBaaBaaBaaBaaBaaBaaBaaBaaBaaBaaBaaBvaAJaAJaAJaAJaAJaAJaBvaAJaAJaAJaAJaAJaAJaAJaAJaAJaAJaAJaAJaAJaAJaAJaAJaAJaAJaAJaBdaAJaAJaAJaAJaAJaAJaAJaAJaBeaxkaAnaAMbcBbcJaAraArbbBbbCbcrbbEbbDbcrbbFbbGbcrayqayqbcMbczaBgaxkazWaAdaAsaAtaAtaAtaAtaAtaBxaAdaAeaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaByaARaARaARaARaARaBzavDavDavDaBAavDavDavDavDaBBaBCaaPaaPaaPaaPaaPartaaPaaParuaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqA aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAGaBaaBaaBaaAGaruaruaruaruaaPaaPaaPaaPaaPaaPaaPaaPaaParuaruaruaruaAGaBaaBaaBaaAGaruaruaruaruaruaruaruaruaruaruaruaruaruaruaruaruaaPaAFaBaaBaaBaaBaaBaaBaaBaaBaaBaaBaaBaaBaaBaaBaaBaaBaaBaaBvaAJaAJaAJaAJaAJaAJaBvaAJaAJaAJaAJaAJaAJaAJaAJaAJaAJaAJaAJaAJaAJaAJaAJaAJaAJaAJawGawGawGawGawGawGawGawGawGawGaxkaAnaAMaAMbcBbcJaBDbbHbbIbcrbbKbbJbcrbbJazlbcrazTbcMbczaAMaBgaxkazWaAdaAsaAtaAtaAtaAtaBGaAsaAdaAeaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPavdaBHaARaARaARaBIavdazsaBJazsavdaBKaBLaBMavDaBNavdaaPaaPaaPaaPaaPaaPaaPaaPaaPaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqAaqA @@ -3018,7 +3020,7 @@ aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaa aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAFaBaaBaaBaaAFaAFaAFaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAFaAFaAFaBaaBaaBaaAFaAFaAFaMHaOnaKTaLBaMvaLwaKTaLBaMvaLwaKTaOoaMHaAFaAFaAFaBaaBaaBaaJFaKVaJSaJSaJSaJXaLDaKPaJSaOpaJFaJFaJFaOqaJFaJFaJFaOkaJSaJSaJSaOlaMyaMSaMyaOraOsaOsaOsaOsaOtaMyaMyaMyaMyaMyaMyaMyaMyaOuaMyaMyaMyaMyaMyaMyaMyaMyaMSaMyaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAFaBaaBaaBaaCyaCzaCAaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaCAaCzaCyaBaaBaaBaaMVaCzaMVaMWaKTaKTaKTaKTaKTaKTaKTaKTaKTaKTaKTaMWaMVaCzaMVaBaaBaaBaaJFaKVaJSaJXaLDaOvaJFaJFaOwaJFaJFaOxaOyaJSaNBaOzaJFaOyaJSaJSaJSaOAaMyaMSaMyaOraOsaOsaOsaOsaOtaMyaOBaOCaODaOCaOEaOFaOFaOFaOFaOFaOEaOFaOEaOFaOGaMyaMSaMyaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAFaBaaBaaBaaCyaCzaCAaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaCAaCzaCyaBaaBaaBaaMVaCzaMVaMWaKTaKTaOHaKTaKTaKTaKTaKTaOHaKTaKTaMWaMVaCzaMVaBaaBaaBaaJFaJFaOIaJFaMZaJFaJFaOJaJSaOKaJFaNraJSaJSaJSaJSaOLaJSaJSaOMaJSaONaMyaMSaMyaOOaOsaOsaOsaOsaOPaMyaOFaOQaOQaOQaOQaOQaOFaOFaOFaOQaOQaOQaOQaORaOSaMyaMSaMyaMyaMyaMyaMyaMyaMyaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP -aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAFaBaaBaaBaaAFaAFaAFaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAFaAFaAFaBaaBaaBaaAFaAFaAFaOTaLhaOUaOVaKtaKvaOWaKtaKvaOVaOUaLhaOXaAFaAFaAFaBaaBaaBaaJFaOYaJSaOZaPaaPbaJFaPcaJSaPdaJFaPeaPfaPgaPhaPiaJFaPjaPkaPkaPkaPlaMyaMSaMyaOOaPmaPnaPnaOsaOsaPoaOFaOFaPpaPqaPpaOFaOFaOFaOFaOFaPpaPqaPpaPraOFaMyaMSaMSaMSaMSaMSaMSaMSaMyaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP +aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAFaBaaBaaBaaAFaAFaAFaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAFaAFaAFaBaaBaaBaaAFaAFaAFaOTaLhaOUaOVaKtaKvaOWaKtaKvaOVaOUaLhaOXaAFaAFaAFaBaaBaaBaaJFaOYaJSaOZaPaaPbaJFaPcaJSaPdaJFbcObbnbcPaPhaPiaJFaPjaPkaPkaPkaPlaMyaMSaMyaOOaPmaPnaPnaOsaOsaPoaOFaOFaPpaPqaPpaOFaOFaOFaOFaOFaPpaPqaPpaPraOFaMyaMSaMSaMSaMSaMSaMSaMSaMyaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAGaBaaBaaBaaAGaaPaaPaaParuaruaruaruaruaruaruaruaruaruaruaaPaaPaaPaAGaBaaBaaBaaAGaaPaaPaMHaPsaPtaMHaPuaPvaPwaPxaPyaMHaPzaPAaMHaaPaaPaAGaAHaAHaAHaJFaOYaJSaPBaPCaPDaJFaPEaJSaPFaJFaJFaJFaJFaJFaJFaJFaJFaJFaJFaJFaMyaMyaMSaMyaMyaMyaMyaMyaMyaMyaMyaOFaOQaOQaOQaOQaOQaOFaOFaOFaOQaOQaOQaOQaPGaOFaMyaMyaMyaMyaMyaMyaMyaMSaMyaMyaMyaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAGaBaaBaaBaaAGaruaruaruaruaaPaaPaaPaaPaaPaaPaaPaaPaaParuaruaruaruaAGaBaaBaaBaaAGaruaruaMHaPHaPHaMHaPIaPJaPwaPwaPKaMHaPHaPHaMHaruaruaAGaBaaBaaBaaJFaJFaPLaJFaJHaJHaJFaJFaOwaJFaJFaPMaPNaPOaJHaPPaPQaNnaPRaPRaPSaMyaMSaMSaMyaMyaPTaPTaPTaPTaPTaMyaPUaPUaPUaPUaPUaPUaPUaPUaPUaPUaPUaPUaPUaPVaPUaMyaPWaPWaPWaPWaPWaMyaMSaMSaMSaMyaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaBuaAFaAFaAFaBuaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaBuaAFaAFaAFaBuaaPaaPaMHaPXaPYaMHaPZaPwaQaaQbaQcaMHaQdaQeaMHaaPaaPaBuaBaaBaaBaaJFaQfaJSaOZaQgaQhaJFaKVaJSaJTaNnaJWaJSaJTaJHaJWaJSaJSaJSaJSaKiaMyaMSaMyaMyaMyaQiaQiaQiaQiaQiaMyaQjaQkaQkaQkaQkaQkaQkaQkaQkaQkaQkaQkaQkaQlaQjaMyaQiaQiaQiaQiaQiaMyaMyaMyaMSaMyaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP diff --git a/nano/css/shared.css b/nano/css/shared.css index 8728102b08..dc6089716d 100644 --- a/nano/css/shared.css +++ b/nano/css/shared.css @@ -212,6 +212,10 @@ h4 { font-size: 10px; } +.multiLine { + white-space: pre-wrap; +} + .noticePlaceholder { position: relative; font-size: 12px; diff --git a/nano/templates/pai_medrecords.tmpl b/nano/templates/pai_medrecords.tmpl index 37b1d7061c..89926d3915 100644 --- a/nano/templates/pai_medrecords.tmpl +++ b/nano/templates/pai_medrecords.tmpl @@ -75,7 +75,7 @@ code/modules/mob/living/silicon/pai/software_modules.dm
    Important Notes
    -
    {{:data.medical.notes}}
    +
    {{:data.medical.notes}}
    {{/if}} diff --git a/nano/templates/pai_secrecords.tmpl b/nano/templates/pai_secrecords.tmpl index e139034c0d..51cb45dee2 100644 --- a/nano/templates/pai_secrecords.tmpl +++ b/nano/templates/pai_secrecords.tmpl @@ -65,7 +65,7 @@ code/modules/mob/living/silicon/pai/software_modules.dm
    Important Notes
    -
    {{:data.security.notes}}
    +
    {{:data.security.notes}}
    {{/if}} diff --git a/nano/templates/partslathe.tmpl b/nano/templates/partslathe.tmpl new file mode 100644 index 0000000000..1438e36c02 --- /dev/null +++ b/nano/templates/partslathe.tmpl @@ -0,0 +1,76 @@ + +{{if data.error }} +
    Missing Materials: {{:data.error}}

    +{{/if}} + +

    Materials

    +
    + {{for data.materials }} +
    +
    {{:value.display.toTitleCase()}}
    +
    {{:helper.displayBar(value.percent, 0, 100, + (value.percent < 25) ? 'bad' : (value.percent < 50) ? 'average' : 'good', + value.qty + "/" + value.max )}}
    +
    {{:helper.link("Eject", 'eject', {'ejectMaterial' : value.name })}}
    +
    + {{/for}} +
    + +{{if data.copyBoard }} +

    Circuit Reader

    +
    +
    +
    Loaded Circuit
    +
    {{:data.copyBoard.toTitleCase()}} 
    +
    {{:helper.link("Eject", 'eject', {'ejectBoard' : 1})}}
    +
    + {{if !data.copyBoardReqComponents || data.copyBoardReqComponents.length == 0 }} +
    Board has no required components.
    + {{else}} + {{for data.copyBoardReqComponents }} +
    +
    {{:value.qty}}x
    +
    {{:value.name.toTitleCase()}}
    +
    + {{/for}} +
    {{:helper.link("Build All", 'wrench', {'queueBoard' : 1})}}
    + {{/if}} +
    +{{/if}} + +{{if data.building }} +

    Currently Building

    +
    +
    Currently Building:
    +
    {{:data.building.toTitleCase()}}
    +
    +
    +
    {{:helper.displayBar(data.buildPercent, 0, 100, 'good')}}
    +
    +{{/if}} + +

    Queue

    +
    + {{if data.queue.length == 0}} +
    Queue Empty
    + {{else}} + {{for data.queue}} +
    +
    #{{:index+1}} {{:value.toTitleCase()}}
    + {{if index > 0 || !data.building}} +
    {{:helper.link("Cancel", 'close', {'cancel' : index+1})}}
    + {{/if}} +
    + {{/for}} + {{/if}} +
    + +

    Recipies

    +{{for data.recipies}} +
    + {{:helper.link(value.name.toTitleCase(), 'plus', {'queue' : value.type})}} +
    +{{/for}} diff --git a/nano/templates/pda.tmpl b/nano/templates/pda.tmpl index 396cf8e34f..6cd3004654 100644 --- a/nano/templates/pda.tmpl +++ b/nano/templates/pda.tmpl @@ -591,7 +591,7 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm Details: {{:data.records.medical.alg_d}}

    Current Disease: {{:data.records.medical.cdi}}
    Details: {{:data.records.medical.alg_d}}

    - Important Notes: {{:data.records.medical.notes}} + Important Notes: {{:data.records.medical.notes}} {{else}} Medical Record Lost! @@ -643,7 +643,7 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm Details: {{:data.records.security.mi_crim_d}}

    Major Crimes: {{:data.records.security.ma_crim}}
    Details: {{:data.records.security.ma_crim_d}}

    - Important Notes: {{:data.records.security.notes}} + Important Notes: {{:data.records.security.notes}} {{else}} Security Record Lost!

    diff --git a/nano/templates/sleever.tmpl b/nano/templates/sleever.tmpl new file mode 100644 index 0000000000..58f99cbacd --- /dev/null +++ b/nano/templates/sleever.tmpl @@ -0,0 +1,138 @@ +{{if data.coredumped}} +
    + TransCore dump complete. Disk ejected. +
    +{{else data.emergency}} +
    + !!WARNING!!
    Dump Disk Inserted! This will transfer all minds to the dump disk, and the TransCore will be made unusable until post-shift maintenance! This should only be used in emergencies!

    +
    + {{:helper.link('DUMP CORE', 'radiation', {'coredump' : data.emergency}, null, 'redButton')}} + {{:helper.link('Eject Disk', 'eject', {'ejectdisk' : data.emergency})}} +{{else}} + {{:data.temp}} + + + {{if data.menu == 1}} +

    Resleeving Control

    +
    +
    + +
    + {{if data.podsLen > 0}} + {{:data.podsLen}} growing vats found. + {{/if}} +
    + +
    + {{if data.spodsLen > 0}} + {{:data.spodsLen}} SyntFabs found. + {{/if}} +
    + +
    + {{if data.sleeversLen > 0}} + {{:data.sleeversLen}} resleeving pods found. + {{/if}} +
    + + {{if data.podsLen}} + {{for data.pods}} +
    {{:value.pod}}, biomass: {{:value.biomass}}
    + {{/for}} + {{/if}} + + {{if data.spodsLen}} + {{for data.spods}} +
    {{:value.spod}}, S/G: {{:value.steel}}/{{:value.glass}}
    + {{/for}} + {{/if}} + + {{if data.sleeversLen}} + {{for data.sleevers}} +
    {{:value.sleever}}, occupant: {{:value.occupant}}
    + {{/for}} + {{/if}} + + +

    Database Functions

    +
    + {{:helper.link('View Body Records', 'list', {'menu' : 2})}} +
    +
    + {{:helper.link('View Mind Records', 'list', {'menu' : 3})}} +
    + + + {{else data.menu == 2}} +

    Current body records

    + {{:helper.link('Back', 'arrowreturn-1-w', {'menu' : 1})}} +
    + {{for data.bodyrecords}} + {{:helper.link(value.name, 'document', {'view_brec' : value.recref})}} + {{/for}} +
    + + + {{else data.menu == 3}} +

    Current mind records

    + {{:helper.link('Back', 'arrowreturn-1-w', {'menu' : 1})}} +
    + {{for data.mindrecords}} + {{:helper.link(value.name, 'document', {'view_mrec' : value.recref})}} + {{/for}} +
    + + + {{else data.menu == 4}} +

    Selected Body Record

    +
    {{:helper.link('Back', 'arrowreturn-1-w', {'menu' : 2})}}
    + + {{if data.activeBodyRecord}} +
    +
    Name:
    +
    {{:data.activeBodyRecord.real_name}}
    +
    +
    +
    Species:
    +
    {{:data.activeBodyRecord.speciesname}}
    +
    +
    +
    Bio. Sex:
    +
    {{:data.activeBodyRecord.gender}}
    +
    +
    +
    Mind compat.:
    +
    {{:data.activeBodyRecord.locked}}
    +
    +
    +
    Synthetic:
    +
    {{:data.activeBodyRecord.synthetic}}
    +
    + + {{:helper.link('Create', 'play', {'create' : data.activeBodyRecord.real_name}, data.activeBodyRecord.cando ? null : 'linkOff')}} + + {{else}} +
    ERROR: Record not found.
    + {{/if}} + + + {{else data.menu == 5}} +

    Selected Mind Record

    +
    {{:helper.link('Back', 'arrowreturn-1-w', {'menu' : 3})}}
    + + {{if data.activeMindRecord}} +
    +
    Name:
    +
    {{:data.activeMindRecord.charname}}
    +
    +
    +
    Backup status:
    +
    {{:data.activeMindRecord.obviously_dead}}
    +
    + {{:helper.link('Sleeve', 'play', {'sleeve' : data.activeMindRecord.charname}, data.activeMindRecord.cando ? null : 'linkOff')}} + + {{else}} +
    ERROR: Record not found.
    + {{/if}} + {{/if}} +{{/if}} \ No newline at end of file diff --git a/nano/templates/telescience_console.tmpl b/nano/templates/telescience_console.tmpl index 4f88267510..f5ed9895a9 100644 --- a/nano/templates/telescience_console.tmpl +++ b/nano/templates/telescience_console.tmpl @@ -2,19 +2,59 @@ Title: Telescience Control UI Used In File(s): \code\modules\telesci\telesci_computer.dm --> -
    -
    Coordinates:
    -
    - {{:helper.link('X: ' + data.coordx, 'gear', {'setx': 1})}} - {{:helper.link('Y: ' + data.coordy, 'gear', {'sety': 1})}} - {{:helper.link('Z: ' + data.coordz, 'gear', {'setz': 1})}} +{{if data.noTelepad == 1}} +
    No telepad located.
    Please add telepad data.

    +{{else}} +
    {{:helper.link('Eject GPS', 'eject', {'ejectGPS' : 1}, null, (data.insertedGps ? '' : 'disabled'))}}
    + + {{if data.cooldown}} +
    Telepad is recharging. Please wait {{:helper.round(data.cooldown)}} seconds.
    + {{else}} +
    {{:data.tempMsg}}
    + {{/if}} + +
    +
    Bearing:
    +
    {{:helper.link(data.rotation + '°', 'pencil', {'setrotation' : 1})}}
    -
    -
    -
    Controls:
    -
    - {{:helper.link('Send', 'gear', {'send': 1}, null, (data.coordx != null && data.coordy != null && data.coordz != null) ? '' : 'disabled')}} - {{:helper.link('Receive', 'gear', {'receive': 1}, null, (data.coordx != null && data.coordy != null && data.coordz != null) ? '' : 'disabled')}} - {{:helper.link('Recalibrate', 'gear', {'recal': 1})}} +
    +
    Distance:
    +
    {{:helper.link(data.distance + ' m', 'pencil', {'setdistance' : 1})}}
    -
    +
    +
    Max Distance:
    +
    {{:data.maxAllowedDistance}} m
    +
    +
    +
    Sector:
    +
    + {{for data.sectorOptions}} + {{:helper.link(value, 'gear', {'setz' : value}, null, value == data.currentZ ? 'selected' : null)}} + {{/for}} +
    +
    +
    Controls:
    +
    + {{:helper.link('Send', 'arrowreturnthick-1-n', {'send' : 1})}} + {{:helper.link('Receive', 'arrowreturnthick-1-s', {'receive' : 1})}} + {{:helper.link('Recalibrate', 'gear', {'recal' : 1})}} +
    +
    + + {{if !data.lastTeleData}} +
    No teleport data found.
    + {{else}} +
    +
    Telepad Location:
    +
    {{:data.lastTeleData.src_x}}, {{:data.lastTeleData.src_y}}
    +
    +
    +
    Distance:
    +
    {{:helper.fixed(data.lastTeleData.distance)}}m
    +
    +
    +
    Transit Time:
    +
    {{:helper.fixed(data.lastTeleData.time)}} secs
    +
    + {{/if}} +{{/if}} diff --git a/vorestation.dme b/vorestation.dme index 138eaa6bc7..9a068d9fb7 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -57,6 +57,7 @@ #include "code\_helpers\global_lists.dm" #include "code\_helpers\global_lists_vr.dm" #include "code\_helpers\icons.dm" +#include "code\_helpers\icons_vr.dm" #include "code\_helpers\lists.dm" #include "code\_helpers\logging.dm" #include "code\_helpers\maths.dm" @@ -571,6 +572,7 @@ #include "code\game\machinery\nuclear_bomb.dm" #include "code\game\machinery\OpTable.dm" #include "code\game\machinery\overview.dm" +#include "code\game\machinery\partslathe_vr.dm" #include "code\game\machinery\pda_multicaster.dm" #include "code\game\machinery\portable_turret.dm" #include "code\game\machinery\recharger.dm" @@ -887,6 +889,7 @@ #include "code\game\objects\items\weapons\weldbackpack.dm" #include "code\game\objects\items\weapons\circuitboards\broken.dm" #include "code\game\objects\items\weapons\circuitboards\circuitboard.dm" +#include "code\game\objects\items\weapons\circuitboards\circuitboards_vr.dm" #include "code\game\objects\items\weapons\circuitboards\frame.dm" #include "code\game\objects\items\weapons\circuitboards\mecha.dm" #include "code\game\objects\items\weapons\circuitboards\other.dm" @@ -902,6 +905,7 @@ #include "code\game\objects\items\weapons\circuitboards\machinery\mech_recharger.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\mining_drill.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\pacman.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\papershredder.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\power.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\recharge_station.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\research.dm" @@ -962,6 +966,7 @@ #include "code\game\objects\items\weapons\storage\wallets.dm" #include "code\game\objects\items\weapons\tanks\jetpack.dm" #include "code\game\objects\items\weapons\tanks\tank_types.dm" +#include "code\game\objects\items\weapons\tanks\tank_types_vr.dm" #include "code\game\objects\items\weapons\tanks\tanks.dm" #include "code\game\objects\random\random.dm" #include "code\game\objects\random\random_vr.dm" @@ -1196,6 +1201,10 @@ #include "code\modules\awaymissions\trigger.dm" #include "code\modules\awaymissions\zlevel.dm" #include "code\modules\blob\blob.dm" +#include "code\modules\busy_space\_defines.dm" +#include "code\modules\busy_space\air_traffic.dm" +#include "code\modules\busy_space\loremaster.dm" +#include "code\modules\busy_space\orgs.dm" #include "code\modules\client\client defines.dm" #include "code\modules\client\client procs.dm" #include "code\modules\client\movement.dm" @@ -1242,11 +1251,13 @@ #include "code\modules\client\preference_setup\loadout\loadout_uniform_vr.dm" #include "code\modules\client\preference_setup\loadout\loadout_utility.dm" #include "code\modules\client\preference_setup\loadout\loadout_xeno.dm" +#include "code\modules\client\preference_setup\loadout\loadout_xeno_vr.dm" #include "code\modules\client\preference_setup\occupation\occupation.dm" #include "code\modules\client\preference_setup\skills\skills.dm" #include "code\modules\client\preference_setup\vore\01_ears.dm" #include "code\modules\client\preference_setup\vore\02_size.dm" #include "code\modules\client\preference_setup\vore\03_egg.dm" +#include "code\modules\client\preference_setup\vore\04_resleeving.dm" #include "code\modules\clothing\chameleon.dm" #include "code\modules\clothing\clothing.dm" #include "code\modules\clothing\clothing_accessories.dm" @@ -1594,6 +1605,7 @@ #include "code\modules\mob\living\living.dm" #include "code\modules\mob\living\living_defense.dm" #include "code\modules\mob\living\living_defines.dm" +#include "code\modules\mob\living\living_defines_vr.dm" #include "code\modules\mob\living\living_powers.dm" #include "code\modules\mob\living\login.dm" #include "code\modules\mob\living\logout.dm" @@ -1758,6 +1770,7 @@ #include "code\modules\mob\living\silicon\robot\drone\drone_items.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_manufacturer.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_say.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_vr.dm" #include "code\modules\mob\living\simple_animal\corpse.dm" #include "code\modules\mob\living\simple_animal\fluffy.dm" #include "code\modules\mob\living\simple_animal\parrot.dm" @@ -2067,6 +2080,7 @@ #include "code\modules\reagents\reagent_containers\food\lunch.dm" #include "code\modules\reagents\reagent_containers\food\sandwich.dm" #include "code\modules\reagents\reagent_containers\food\snacks.dm" +#include "code\modules\reagents\reagent_containers\food\z_custom_food_vr.dm" #include "code\modules\reagents\reagent_containers\food\drinks\bottle.dm" #include "code\modules\reagents\reagent_containers\food\drinks\cup.dm" #include "code\modules\reagents\reagent_containers\food\drinks\jar.dm" @@ -2092,6 +2106,13 @@ #include "code\modules\research\rdmachines.dm" #include "code\modules\research\research.dm" #include "code\modules\research\server.dm" +#include "code\modules\resleeving\_defines.dm" +#include "code\modules\resleeving\circuitboards.dm" +#include "code\modules\resleeving\computers.dm" +#include "code\modules\resleeving\documents.dm" +#include "code\modules\resleeving\implant.dm" +#include "code\modules\resleeving\infocore.dm" +#include "code\modules\resleeving\machines.dm" #include "code\modules\rogueminer_vr\asteroid.dm" #include "code\modules\rogueminer_vr\controller.dm" #include "code\modules\rogueminer_vr\debug.dm" @@ -2191,6 +2212,11 @@ #include "code\modules\tables\rack.dm" #include "code\modules\tables\tables.dm" #include "code\modules\tables\update_triggers.dm" +#include "code\modules\telesci\bscyrstal.dm" +#include "code\modules\telesci\construction.dm" +#include "code\modules\telesci\gps_advanced.dm" +#include "code\modules\telesci\telepad.dm" +#include "code\modules\telesci\telesci_computer.dm" #include "code\modules\vehicles\cargo_train.dm" #include "code\modules\vehicles\rover_vr.dm" #include "code\modules\vehicles\train.dm" @@ -2221,6 +2247,7 @@ #include "code\modules\vore\eating\belly_vr.dm" #include "code\modules\vore\eating\bellymodes_vr.dm" #include "code\modules\vore\eating\living_vr.dm" +#include "code\modules\vore\eating\silicon_vr.dm" #include "code\modules\vore\eating\simple_animal_vr.dm" #include "code\modules\vore\eating\vore_vr.dm" #include "code\modules\vore\eating\vorehooks_vr.dm"